403Webshell
Server IP : 46.105.57.169  /  Your IP : 216.73.217.35
Web Server : Apache
System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User : verseaumee ( 152031)
PHP Version : 8.5.7
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/verseaumee/123click/assets/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/verseaumee/123click/assets/woocommerce-tm-extra-product-options.tar
languages/woocommerce-tm-extra-product-options-zh_CN.po000064400001026550150755142440017316 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:54+0200\n"
"PO-Revision-Date: 2024-03-07 11:54+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "额外的产品选项"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "额外的产品选择费用"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "查看其他产品选项设置"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "设置"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Extra Product Options & Add-Ons for WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "关于%s的更多信息"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "查看详情"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "查看其他产品选项文档"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "文档"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "访问高级客户支持"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "高级支持"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(复制)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "%2$s 的变量 #%1$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "目前还没有保存的变量。"

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "你不能添加任何额外的选项。"

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "你确定你想要删除这个选项吗?"

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"在添加Extra Product Options之前,添加并保存一些属性在<ph id=\"mtc_1\" equiv-"
"text=\"base64:Jmx0O3N0cm9uZyZndDs=\"/>Attributes<ph id=\"mtc_2\" equiv-text="
"\"base64:Jmx0Oy9zdHJvbmcmZ3Q7\"/> tab."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "固定金额"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "原价的百分比"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "错误"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "无效的请求!"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "你确定要删除这个文件夹和它的所有内容吗?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "你确定要删除这个文件吗?"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "是否确实要重置设置?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "是"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
#, fuzzy
msgid "No"
msgstr "否"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "取消"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
#, fuzzy
msgid "Close"
msgstr "关闭"

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr "常数名称"

#: admin/class-themecomplete-epo-admin-base.php:1285
#, fuzzy
msgid "Constant value"
msgstr "常量值"

#: admin/class-themecomplete-epo-admin-base.php:1286
#, fuzzy
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr "请选中同意复选框以授予将数据发送到服务器的权限,然后重试。"

#: admin/class-themecomplete-epo-admin-base.php:1287
#, fuzzy
msgid "Connecting to activation server ..."
msgstr "正在连接到激活服务器..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, fuzzy, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "额外产品选项 #%1$s of %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "无法在数据库中更新post"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "启用点显示?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr "这允许您沿着范围选择器生成点。"

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "积分数量"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "请输入要显示多少个值的点。"

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "提示"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "左边"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "右边"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr "工具提示在左边"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr "工具提示在右边"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr "显示值在"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr "选择如何显示范围选择器的值。"

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "步进值"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "请输入次此处理器的步进值."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "没有验证"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
#, fuzzy
msgid "Email"
msgstr "邮箱"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "网址"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "数量"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "位数"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "仅字母"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr "仅字母或空格"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "字母数字"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "字母数字Unicode"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "字母数字Unicode或空格"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr "验证为"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr "选择是否根据所选方法验证该字段。"

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
#, fuzzy
msgid "Required"
msgstr "必需"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr "选择用户是否必须填写这一字段。"

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "启用"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr "选择是否启用了该选项。"

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr "请输入该字段的价格,否则将空无价格。"

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "销售价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr "输入此字段的售价,或使用默认价格保留该字段。"

#: admin/class-themecomplete-epo-admin-builder-base.php:566
msgid "Text after Price"
msgstr "价格后面显示的文本"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr "在此字段的价格之后输入要显示的文本,或将其留空无文本。"

#: admin/class-themecomplete-epo-admin-builder-base.php:593
msgid "Text before Price"
msgstr "价格之前的文本"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr "请在此字段的价格前输入要显示的文本,或将其留空以不显示文本。"

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr "原价的百分比加上选项"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr "每字价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr "每个单词原始价格的百分比"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "每个字的价格(没有第n个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr "每个单词原始价格的百分比(没有第n个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
msgid "Price per character"
msgstr "每个角色的价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "每个字符原始价格的百分比"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "每个字符的价格(无第一个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "每个字符的价格(无第 n 个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "每个字符的价格(没有第 n 个字符,没有空格)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "每个字符的原始价格的百分比(无第一个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr "每个字符的原始价格的百分比(无第 n 个字符)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr "每个字符的原始价格的百分比(没有第 n 个字符,也没有空格)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "每个字符的价格(无空格)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
msgid "Price per row"
msgstr "每行的价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr "数学公式"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
msgid "Fixed amount + options"
msgstr "固定金额和选项"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "查找表"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "价格类型"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "数量"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr "当前值"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
msgid "Step * price"
msgstr "阶梯*价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
msgid "Price per Interval"
msgstr "每间隔价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
#| msgid "Section type"
msgid "Calculation type"
msgstr "章节类型类型"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "无"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "x 的元素 ID"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr "输入要用于 x 列的元素 ID。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "y 的元素 ID"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr "输入要用于 y 列的元素 ID。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
msgid "Set to Fee"
msgstr "设置为收费"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr "将价格附加到订单上,使其独立于产品数量。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "免费角色"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "输入免费字符数。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "最小值"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr "输入最小值。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "最大值"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr "输入的最大值。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "日/月/年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
msgid "Month / Day / Year"
msgstr "月/日/年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "日.月.年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
msgid "Month . Day . Year"
msgstr "月.日.年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "日-月-年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
msgid "Month - Day - Year"
msgstr "月-日-年"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr "年 /月 /日"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr "年 /日/月"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr "年. 月.日"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr "年. 日. 月"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr "年 - 月 - 日"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr "份 - 日 - 月"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "日期格式"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "HH:毫米"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr "H:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr "HH:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr "HH:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
msgid "hh:m:ss"
msgstr "hh:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr "hh:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr "h:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "时间格式"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr "自定义时间格式"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr "这将覆盖上述时间格式。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
msgid "Start year"
msgstr "开始年份"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr "输入起始年。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr "结束年份"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr "输入终止年。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr "使用链接替换"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "如果选项为“单击”,请选择是否重定向到URL。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr "填充选项"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr "双击单选按钮以删除它所选的属性。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr "变异的选择"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
msgid "Image swatches"
msgstr "图像样本"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
msgid "Color swatches"
msgstr "设置颜色样本的半径/大小"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
msgid "Text swatches"
msgstr "文本色板"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
msgid "Replacement mode"
msgstr "更换模式"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
msgid "Select how to display the element."
msgstr "选择如何显示元素。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr "开始标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "居中"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
msgid "End of the label"
msgstr "结束标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr "色板位置"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
msgid "Choose how the swatch will be displayed."
msgstr "选择色板的显示方式。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
msgid "Use image lightbox"
msgstr "使用lightbox图像"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "选择是否启用缩略图上的lightbox。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr "使用图像替换"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr "使用自定义图片"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "更改产品图像"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr "选择是否改变产品图片。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "显示标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "显示描述"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr "显示标签和描述"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "显示图像"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr "显示图片和标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
msgid "Show image and description"
msgstr "显示图片和描述"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr "显示图像,标签和描述"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "显示工具条"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr "启用此选项将在选项上显示工具提示。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr "启用明确选项按钮"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr "这将添加一个按钮来清除所选选项。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
msgid "Show responsive values"
msgstr "显示响应值"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "自动"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr "每行项目(台式机和笔记本电脑)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"使用此字段来进行网格显示。输入网格的每一行有多少项,或留空以正常显示。。"

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr "每行项目(平板电脑景观)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr "每行项目(平板电脑的肖像)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr "每行项目(智能手机)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
msgid "Items per row (iPhone 5)"
msgstr "每行项目(iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr "每行项目(iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr "每行项目(iPhone 6+)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "每行项目 (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "每行项目(三星Galaxy平板電腦橫向)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "限制选择"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr "输入大于0的数字以限制复选框的选择,或者默认行为留空。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
msgid "Exact selection"
msgstr "准确的选择"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr "输入一个大于0的数字,让用户选择复选框的确切数量,或者为默认行为留空。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "最低的选择"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr "输入一个大于0的数字,让用户至少选择复选框的数量,或者为默认行为留空。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr "标准的浏览器按钮"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "按钮的风格"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr "上传按钮样式"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "日期字段"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "日期选择器"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr "日期字段和选择器"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr "日期选择风格"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "隐藏价格"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr "选择是否隐藏价格。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "禁用"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "右侧"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "左侧"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "顶部"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "底部"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr "数量选择器"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr "这个选项将显示一个数量选择器。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "数量最小值"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr "数量最大值"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "步进"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr "输入数量级。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
msgid "Quantity Default value"
msgstr "数量默认值"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr "输入要自动应用到数量字段的值。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "占位符"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "最小字符数"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr "用户必须输入的最小字符数。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "最大字符数"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr "请输入一个数字来限制用户的最大可输入字符数。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "默认值"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr "输入要自动应用于该字段的值。"

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "大小"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "减小宽度"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
msgid "Increase Width"
msgstr "增加宽度"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "编辑元素"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "复制元素"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(无标题)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "编辑部分"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "复制章节"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "部分"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "添加元素"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr "选择要使用的图像代替单选按钮。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
msgid "Remove the image."
msgstr "删除图片。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr "选择图像以替换产品图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
msgid "Select boxes"
msgstr "选择框"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "单选按钮"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr "标签开始时的单选按钮和图像"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
msgid "Radio buttons and image at end of the label"
msgstr "标签上的单选按钮和图像"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "显示为"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
msgid "Select the display type of this attribute."
msgstr "选择该属性的显示类型。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "属性标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
msgid "Leave blank to use the original attribute label."
msgstr "保留空白,使用原始属性标签。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "启用"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "显示重置按钮"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "允许为该属性显示复位按钮。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
msgid "Attribute element class name"
msgstr "属性元素类名"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr "输入一个额外的类名,以添加到这个属性"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "宽度"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr "输入显示项的宽度,或留空为自动宽度。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "高度"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr "输入显示项的高度,或留空为自动高度。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "隐藏"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "显示"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
msgid "Show attribute name"
msgstr "显示属性名称"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr "选择是否显示或隐藏属性名。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "颜色"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "选择要使用的颜色。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
msgid "Image replacement"
msgstr "图像替换"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr "为这一项选择一个图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
msgid "Product Image replacement"
msgstr "产品图片替换"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr "选择图像以替换产品图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
msgid "No saved variations found."
msgstr "未发现保存的变化。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr "选择要代替复选框使用的图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr "选中单选按钮时,请选择要用来代替单选按钮的图像."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr "选中复选框时,请选择要用于替换复选框的图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
msgid "Choose the image for the lightbox."
msgstr "为lightbox选择图像。"

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "删除所有选项"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "检查"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "默认"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
msgid "Choice label"
msgstr "选择标签"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "价格类型"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "描述"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
#, fuzzy
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "添加项目"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "添加分隔符"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
msgid "Mass add"
msgstr "批量添加"

#: admin/class-themecomplete-epo-admin-csv.php:41
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"导入和导出CSV文件需要php函数mb_detect_encoding和mb_convert_encoding。请咨询您"
"的托管提供商启用此功能。"

#: admin/class-themecomplete-epo-admin-csv.php:289
msgid "Invalid CSV file."
msgstr "无效的CSV文件。"

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr "上传的文件超过了php.ini中的upload_max_filesize指令限制。"

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr "上载的文件超出了HTML表单中指定的MAX_FILE_SIZE指令。"

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "上传的文件仅部分上传。"

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "没有上传文件。"

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "缺少临时文件夹。"

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "无法将文件写入磁盘。"

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "文件由于扩展名限制而上传停止。"

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr "抱歉,出于安全原因,不允许使用此文件类型."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "未找到文件。"

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr "使用的导入方法无效。"

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "文件导入。"

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "CSV 文件无效!"

#: admin/class-themecomplete-epo-admin-csv.php:552
msgid "Invalid CSV file!"
msgstr "无效的CSV文件!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "试图上传大于%s的文件是不允许的!"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "使用新表导入的文件。"

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "导入 CSV 文件时出错。"

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr "保存 csv 数据时出错。请检查您的csv文件的编码!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr "表名不同。是否要覆盖这些表?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr "无效数据!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
msgid "Something went wrong with the request!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "选项已保存!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "包括其他全球形式"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(无标题)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "清除所有额外的全局表单"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "禁用从全局选项中排除"

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr "启用从全局选项排除"

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr "删除产品上的所有选项"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "在您的服务器上不支持文件管理器。"

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "您的设置已成功重置."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "保存设置时出错。"

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "你的设置已保存。"

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "克隆模板"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "复制表单"

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr "导出表单"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr "额外的产品选项"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "标题"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "优先级"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "应用于"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "类别"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "产品"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr "排除产品"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "所有产品"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "禁用"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "产品和类别"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "自定义代码"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "所有类别"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
#| msgid "CSS Settings"
msgid "Form settings"
msgstr "CSS 设置"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "发布"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "角色"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "不包括的商品"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr "此说明将显示在标题下。"

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr "此表单的启用角色"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr "为此表单的禁用角色"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr "从表单中排除产品"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "搜索产品&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "选择产品以应用选项"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
msgid "Meta data not correctly saved. Please save the product!"
msgstr "元数据未正确保存。请保存产品!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "添加部分"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr "风格变化"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "保存"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "导入CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "导出CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr "全尺寸"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr "请在导入选项之前保存表格!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr "请在导入选项之前保存产品!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr "未找到任何元素!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr "开始添加元素"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "在新节中添加元素"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "永久删除"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "移到回收站"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "更新"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
#| msgid "Self mode"
msgid "Apply mode"
msgstr "自动模式"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "所有产品"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "自定义价格"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr "WordPress出了问题。"

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce未启用!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Cheatin&#8217; uh?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr "您无权将此项目移至垃圾桶。"

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "移至垃圾桶时发生错误。"

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "从垃圾箱恢复时出错。"

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "您不能删除此项目。"

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "删除时出错。"

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr "你想要搬到垃圾的物品已经不复存在了。"

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "未知的文章类型。"

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr "你不能把这东西搬到垃圾里去。% s目前编辑。"

#: admin/class-themecomplete-epo-admin-global-base.php:2222
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr "你试图从垃圾中恢复的物品已经不复存在了。"

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr "这个条目已经被删除了。"

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr "你试图编辑一个不存在的条目。也许是删除吗?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "您不能编辑此项目。"

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr "你可以不编辑这一项,因为它在垃圾桶里。请恢复它,再试一次。"

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "所选表单不包含任何部分"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "显示过滤器"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "隐藏过滤器"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "过滤"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
#, fuzzy
msgctxt "Google font: on or off"
msgid "on"
msgstr "开启"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "你确定要删除这个项目吗?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr "你确定你想要复制这个项目吗?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "编辑设置"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "元素ID"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "部分ID"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "是"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "不是"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "是空的"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "不是空的"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "开始于"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "结束于"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "大于"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "小于"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr "大于或等于"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr "小于或等于"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"无法对这个元素或选项应用规则,因为在其他选项没有任何值配置的元素,或者没有找"
"到其他的模块选项。"

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr "发生错误!无法对此元素应用条件!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "填充"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "无效的文件扩展名"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr "导入csv……"

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr "保存……请稍等。"

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "导入数据"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "编辑价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
msgid "Edit tab"
msgstr "编辑 标签"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr "覆盖现有的元素"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr "添加新元素"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "表单被应用于所有产品"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "表单没有被应用到任何产品上"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "载入中..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "产品变量"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
#| msgid "Global variables"
msgid "Special variables"
msgstr "全局变量"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr "全局变量"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "显示选项合计"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Options Total"
msgstr "改变原来的产品价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Cumulative Total"
msgstr "改变原来的产品价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "产品数量"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr "改变原来的产品价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
#| msgid "Original product price"
msgid "Dynamic product price"
msgstr "改变原来的产品价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr "当前元素"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr "此元素的值"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr "该元素的值长度"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr "用户选择的选项数"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr "此元素的总量"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr "此元素的数量"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr "其他元素"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "目标元素的价格"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
#, fuzzy
msgid "Value"
msgstr "值"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "转换为浮点数的目标元素的值"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "文本"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "目标元素的原始值"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
msgid "Text length"
msgstr "文本长度"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "目标元素的文本长度"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "目标元素的总量"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "计数"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr "用户在目标元素上选择的选项数"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "所有"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "复制"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "无效的 CSV 表!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "发生了错误!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "覆盖现有表"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "查找表"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "未找到 CSV 表!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "单击下面的按钮导入一个。"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "表格名称"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "表索引"

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr "EPO 控制面板"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "额外的产品选项设置"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "重新设置"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "保存更改"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "任意"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "点击切换"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "属性:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "类型:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "复选框"

#: admin/views/html-tm-epo-admin.php:57
#, fuzzy
msgid "Select"
msgstr "选择"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "设置:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "变化:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "价格:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "自定义价格(必需)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "自定义价格"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "属性失踪。请删除这个额外的选项:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
#, fuzzy
msgid "Percent of the origιnal price"
msgstr "原始价格的百分比"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "表格更新。"

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "表单已从 %s 还原为修订版"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "表单已发布。"

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "表单已保存。"

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "表单已提交。"

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr "预定表格:%s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "表格草稿已更新。"

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "在这里输入标题"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "撤销"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "选项"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "费用"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "数量"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "总计"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "税"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "编辑项目"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "删除项目"

#: admin/views/html-tm-epo.php:29
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr "在添加额外选项之前,在\"属性\"选项卡上添加和保存某些属性。"

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "展开全部"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "关闭所有"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "添加额外选项"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "生成器"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "正常"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr "要为本地选项翻译字符串,请使用WPML接口。"

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "从"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "范围"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "价格显示覆盖"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr "这将替换商店/存档/产品循环页面上显示的产品价格。"

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "常规"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "到"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "促销"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr "您选择的表单将与产品已有的表单一起显示。"

#: admin/views/html-tm-global-epo.php:206
msgid "Exclude from"
msgstr "排除"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr "这将排除分配给该产品的任何全局表单,除了前面设置的那些。"

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "覆盖产品价格"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr "如果总期权价格大于零,这将会覆盖产品价格。"

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr "覆盖全局显示"

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr "这将仅覆盖该产品的显示方法。"

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "使用全局设置"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "总是显示"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "仅使用操作挂钩显示"

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr "覆盖最后合计框"

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr "这将覆盖仅用于该产品的总数框显示。"

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
#| msgid "Hide Final total box if Options total is zero"
msgid "Disable if Options total is zero"
msgstr "如果选项总计为零,则隐藏“最终总计”框"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
#| msgid "Hide Final total box if total is zero"
msgid "Disable if total is zero"
msgstr "如果合计为零,则隐藏“最终合计”框"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "显示选项合计"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr "这将仅覆盖该产品的显示方法。"

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "当总数大于零时显示"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "显示最终总数"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid "This will Show Final Total setting only for this product."
msgstr "这将仅覆盖该产品的显示方法。"

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
msgid "Override enabled roles for this product"
msgstr "这个产品启用角色覆盖"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
msgid "This will override which roles can see the options for this product."
msgstr "这将覆盖哪些角色可以看到该产品的选项。"

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "禁止克隆。"

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "反序列化此类的实例是被禁止的。"

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "免费!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "选择选项"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "添加到购物车"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
msgid "Product element is not supported for components!"
msgstr "组件不支持产品元素!"

#: includes/class-themecomplete-extra-product-options.php:4984
msgid "Product element is not supported within another product element!"
msgstr "另一个产品元素不支持产品元素!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "复选框"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "颜色选择器"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "日期"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "星期日"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "星期一"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "星期二"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "星期三"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "星期四"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "星期五"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "星期六"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr "一月 "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "二月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "三月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "四月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "五月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "六月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "七月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "八月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "九月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "十月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "十一月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "十二月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"根据选定的日期格式,输入要自动应用于字段的值。(两位数表示日,两位数表示月,"
"四位数表示年)。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr "最低可选择的日期"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "从今天开始的日期天数。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr "最多可选择的日期"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "禁用日期"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"逗号分隔日期,根据您选择的日期格式。(一天两位数,一个月两位数,一年四位数)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
msgid "Enabled dates"
msgstr "启用日期"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"逗号分隔日期,根据您选择的日期格式。(一天两位数,一个月两位数,一年四位数)。"
"请注意,这将覆盖任何其他设置!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr "白"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr "Epo黑色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "主题"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "选择日期选择器的主题。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "小"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "中"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
#, fuzzy
msgid "Large"
msgstr "大"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr "屏幕的顶部"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr "屏幕底部"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
msgid "Exclude disabled"
msgstr "排除这些"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr "启用此功能将使“最小”和“最大”可选日期不计入所选的禁用工作日。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr "禁用工作日"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr "这允许您禁用所有选择的工作日。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr "禁用月份"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr "允许您禁用所有选定的月份。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "翻译"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "天"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "月"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "年"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "分隔线"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "常规选项"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "条件逻辑"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr "CSS 设置"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr "元素类名称"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr "输入额外的类名称以添加到此元素"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "覆盖产品价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "更改产品图像"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "部分ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr "在此元素上选择费用类型的税级。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
#| msgid "Math formula"
msgid "Formula"
msgstr "数学公式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "请输入次此处理器的步进值."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "显示为"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
#| msgid "Enter a text to replace the Close button text on the calendar."
msgid "Enter the text to show next to the calculation result on the page."
msgstr "输入文本来替换日历上的关闭按钮文本。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
#| msgid "Text before Price"
msgid "Text before result"
msgstr "价格之前的文本"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
#| msgid ""
#| "Enter a text to display before the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr "请在此字段的价格前输入要显示的文本,或将其留空以不显示文本。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
#| msgid "Text after Price"
msgid "Text after result"
msgstr "价格后面显示的文本"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
#| msgid ""
#| "Enter a text to display after the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr "在此字段的价格之后输入要显示的文本,或将其留空无文本。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "标题"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "跨度"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "页眉类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "页眉标题"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the Content"
msgstr "字段显示在左侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the Content"
msgstr "字段显示在右侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "页眉位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "标题颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr "留空则使用默认值"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "内容"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "内容颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
#| msgid "Above field"
msgid "Above Header"
msgstr "字段显示在上方"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr "提示图标在左侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr "提示图标在右侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "内容位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
#| msgid "Multi-Select Field"
msgid "Multiple Upload"
msgstr "选择多个框"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "产品"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "单品"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr "选择模式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr "是否包括特定产品或类别。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
msgid "Search for a category ..."
msgstr "在分类中搜索..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "选择类别"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr "添加类别以包括其所相关产品。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "搜索产品..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "选择产品"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr "分别添加产品。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr "选择值"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "基本价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "名称"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "菜单顺序"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "随机"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "排序"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr "选择将对产品进行排序的参数。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "升序"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "降序"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
#, fuzzy
msgid "Order"
msgstr "排序"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr "选择产品的排序顺序。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "选择一个产品"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr "默认产品"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr "选择将被预选的产品。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "下拉"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "缩略图"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
msgid "Thumbnails multiple"
msgstr "多个缩略图"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "布局模式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr "选择产品的展示方式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr "下拉占位符"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr "输入下拉的占位符。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "最小数量"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "最大数量"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr "单独发货"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr "如果启用此功能,则包含的产品不会随主产品一起提供。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr "保持重量"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr "如果启用此功能,随附的产品将为其重量添加到主产品。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr "单独定价"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr "如果启用此功能,包含的产品将维持自己的价格。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "百分比"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "折扣类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"选择折扣类型。折扣适用于最终产品价格。如果产品具有更多选项,则折扣适用于将选"
"项添加到产品价格后的金额。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "折扣"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr "输入折扣金额。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "禁用插件"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr "如果启用此功能,则不会显示关联产品所包含的插件。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "从折扣中排除插件价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr "如果启用此功能,则折扣将不会应用于产品插件。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "购物车"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "结帐"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "订单和电子邮件"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "将产品隐藏在"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "选择隐藏产品的位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr "启用以显示关联产品的图像。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "显示标题"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr "启用以显示关联产品的标题。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "显示标题"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
#| msgid "Enable to show the title of the associated product."
msgid "Enable to have the title link to the associated product."
msgstr "启用以显示关联产品的标题。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "显示价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr "启用以显示关联产品的价格。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr "启用以显示关联产品的描述。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr "显示元素数据"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
msgid "Enable to show the meta of the associated product."
msgstr "启用以显示关联产品的meta。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "高级选项"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr "范围选择"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "标题选项"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr "标准(清晰)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "盒子"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr "展开和折叠(开始打开)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr "展开和折叠(开始关闭)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "折叠"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr "选项风格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr "选择此项的显示风格。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr "背景颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
msgid "Section label background color"
msgstr "标签背景颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
msgid "Section subtitle background color"
msgstr "副标题背景颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr "本地选项之前"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr "本地选项之后"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr "选项定位"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
msgid "Select where this section will appear compared to local Options."
msgstr "选择与本地选项相比较的区域。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "弹出"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr "滑块(向导)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr "章节类型类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr "选择此项的显示类型。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "文本链接"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
#, fuzzy
msgid "Button"
msgstr "按钮"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
msgid "Button Alt"
msgstr "按钮Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
msgid "Section pop up button style"
msgstr "部分弹出按钮样式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
msgid "Select this section's pop up button style."
msgstr "选择此部分的弹出按钮样式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
msgid "Section pop up button text"
msgstr "部分弹出按钮文本"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr "输入文本以替换默认弹出按钮文本。这将覆盖全局值。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr "章节类名称"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr "输入一个额外的类名,以添加到该项"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
msgid "Section Conditional Logic"
msgstr "选项条件逻辑"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr "启用条件逻辑来显示或隐藏这一项。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "选择框"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr "如果元素是必需的,则此值将计为空值。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
msgid "Multi-Select Field"
msgstr "选择多个框"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "模板"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
msgid "Select a template ..."
msgstr "选择一个模板..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "选择模板"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
msgid "Add the template you want to display."
msgstr "添加要显示的模板。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "文本区域"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "文本字段"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
#| msgid "Enter the quantity step."
msgid "Enter the step."
msgstr "输入数量级。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "时间"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr "系统风格"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "自定义样式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr "时间选择器样式"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
msgid "Minimum selectable time"
msgstr "最小可选择的时间"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr "输入以下格式: 8:00 am"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
msgid "Maximum selectable time"
msgstr "最大可选择的时间"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr "请选择时间选择器的样式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr "请选择时间选择器的大小。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
msgid "Select the position of the timepicker."
msgstr "请选择时间选择器的位置。"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "小时"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "分钟"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
#, fuzzy
msgid "Second"
msgstr "秒"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "上传"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "变化"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr "元素条件逻辑"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
msgid "Enable conditional logic for showing or hiding this element."
msgstr "启用条件逻辑来显示或隐藏该元素。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "标签类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
#| msgid "Select mode"
msgid "Label view mode"
msgstr "选择模式"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
#| msgid "Above field"
msgid "Above the fields"
msgstr "字段显示在上方"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr "字段显示在上方"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the fields"
msgstr "字段显示在左侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr "字段显示在左侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the fields"
msgstr "字段显示在右侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the field"
msgstr "字段显示在右侧"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "标签位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "标签颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "副标题"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
#| msgid "Below field"
msgid "Below the fields"
msgstr "字段显示在下方"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr "字段显示在下方"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr "字幕位置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "副标题颜色"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr "水平规则"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "内边距"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr "分隔线类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "标签选项"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr "元素容器id"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr "请输入元素容器id。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
msgid "Inherit product setting"
msgstr "继承产品设置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr "含税价格类型"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr "选择是否在该元素上包括税费价格类型。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr "按收费价格类型征税"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr "在此元素上选择费用类型的税级。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr "隐藏元素标签在购物车"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr "选择是否在购物车中隐藏元素标签。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr "不,但隐藏价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
msgid "Yes, but show price"
msgstr "是的,但是显示价格"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr "在购物车中隐藏元素值"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr "选择是否隐藏购物车中的元素值。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "在订单中隐藏元素标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr "选择是否在订单中隐藏元素标签。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "隐藏元素值在订单中"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr "选择是否在订单中隐藏元素值。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "隐藏浮动总计框中的元素标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr "选择是否在浮动总计框中隐藏元素标签。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr "在“浮动总计”框中隐藏元素值"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr "选择是否在浮动总计框中隐藏元素值。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "WooCommerce设置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
msgid "Enable repeater"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
msgid "This will make this element repeatable."
msgstr "这将使此元素可重复。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
msgid "Bind repeater with product quantity"
msgstr "绑定中继器与产品数量"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
msgid "This will make this element repeatable based on the product quantity."
msgstr "这将使此元素可根据产品数量重复。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
msgid "Repeater minimum limit"
msgstr "中继器最小限制"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr "设置用户可以为中继器字段添加的最小行数。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
msgid "Repeater maximum limit"
msgstr "中继器最大限制"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr "设置用户可以为中继器字段添加的最大行数。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
msgid "Repeater Button Label"
msgstr "中继器按钮标签"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
msgid "Leave this blank for the default label."
msgstr "留空为默认标签。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "单选按钮连接器 ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr "输入自定义 ID 以连接不同的单选按钮元素。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
msgid "Repeater Settings"
msgstr "中继器设置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, fuzzy, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "所有“%s”方法实例"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "“%1$s”(实例 ID:%2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
msgid "Flat Rates (Legacy)"
msgstr "统一费率(旧版)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr "(Legacy)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "选择运输方式..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "启用配送方式"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "选择要启用的运输方式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "启用配送方式条件"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"根据当前字段的值指定启用装运方式的条件。如果满足条件,则所选的运输方式将可供"
"客户在结账时选择。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
msgid "Disable Shipping Methods"
msgstr "禁用送货方式"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "选择要禁用的运输方式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "禁用运输方式条件"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"根据当前字段的值指定禁用装运方式的条件。如果满足条件,则客户在结账时将无法选"
"择所选的运输方式。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "操作"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "常规设置"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr "继承产品税类"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "标准"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "将其留空,以便从 %s 价格自动计算"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr "将其留空,以便从 %s 销售价格自动计算"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "如果满足以下条件,则此部分。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "如果满足以下条件,则此字段。"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "添加新条件组"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "“ %1$s”的数量不能小于%2$d。"

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "“%1$s”的数量不能高于%2$d。"

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr "“%1$s”的数量必须以%2$d的倍数输入。"

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s 及其所有相关产品一起删除!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr "商品%s已从购物车中删除,因为它在添加后已更改。"

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr "您不能将负价产品添加到购物车。"

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
msgid "You cannot add zero priced products to the cart."
msgstr "您不能将零价商品添加到购物车。"

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "附加选项"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "“%s”是一个必需的字段。"

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"由于已对%1$s进行了修改,因此已将其从购物车中删除。您可以将其添加回购物"
"车%2$s。"

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "这里"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr "额外费用"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "清空购物车"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "编辑选项"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "更新购物车"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] ""

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "查看购物车"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr "WooCommerce 的额外产品选项和附加组件需要 WordPress %s或更高版本。"

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"WooCommerce 的额外产品选项和附加组件需要 WooCommerce 额外结帐选项 %s 或更高版"
"本!"

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
msgid "The installed version is"
msgstr "当前版本"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s重要提示: %2$s不支持您的WooCommerce额外结帐选项版本。请更新到最新版本。"

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s重要提示:WooCommerce的%2$s额外产品选项和附加组件已被停用,因为它与当前版"
"本的额外结帐选项不兼容。"

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s重要提示:WooCommerce的%2$s额外产品选项和附加组件已被停用,因为它与当前版"
"本的额外结帐选项不兼容。"

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s重要提示:%2$s 在使用 WooCommerce 的额外产品选项和附加组件之前,请运行 "
"WooCommerce 更新程序。"

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s重要提示:WooCommerce %2$s额外产品选项和附加组件需要 %3$sWooCommerce%4$s "
"%5$s 或更高版本。"

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "运行更新程序"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s重要提示:%2$s WooCommerce 的额外产品选项和附加组件需要 WordPress %3$s或"
"更高版本。"

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s重要提示:%2$s WooCommerce 的额外产品选项和附加组件需要 PHP %3$s 或更高版"
"本。"

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "文件名"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "删除"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "额外产品选项"

#: includes/classes/class-themecomplete-epo-post-types.php:101
msgid "Global Forms"
msgstr "全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:102
msgid "Global Form"
msgstr "全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:103
msgctxt "post type general name"
msgid "Global Forms"
msgstr "全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr "添加全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr "添加新的全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "编辑"

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr "编辑全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr "新的全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr "查看全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr "搜索全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr "暂无全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "回收站中没有全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:114
msgid "Parent Global Form"
msgstr "父级全局表单"

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr "在这里,您可以向商店添加新的全局选项。"

#: includes/classes/class-themecomplete-epo-post-types.php:156
msgid "Option Templates"
msgstr "选项模板"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "选项模板"

#: includes/classes/class-themecomplete-epo-post-types.php:158
msgctxt "post type general name"
msgid "Option Templates"
msgstr "选项模板"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "添加模板"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "添加新模板"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "编辑模板"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "新模板"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "查看模板"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "搜索模板"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "未找到模板"

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr "回收站中未找到模版"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "父級模板"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "您可以在此处添加新的全局模板选项。"

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "添加查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "添加新的查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "编辑查阅表格"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "新建查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "查看查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "搜索查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "未找到查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "在废纸篓中找不到查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "父查找表"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "您可以在此处添加新的查找表。"

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "单价"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "选项金额"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "期权增值税金额"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "费用金额"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "总计"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "上一页"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
#, fuzzy
msgid "Next"
msgstr "下一个"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "剩余字符"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr "上传文件"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
msgid "Your files are being uploaded"
msgstr "您的文件正在上传"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "文件"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "文件"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "这是必填栏。"

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "请输入有效的电子邮件地址。"

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "请输入有效网址。"

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "请输入有效的号码。"

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "请只输入数字。"

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "请输入小于或等于{0}的值。"

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "请输入大于或等于{0}的值。"

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr "请输入不超过{0}字符。"

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "请输入不超过{0}个字符。"

#: includes/classes/class-themecomplete-epo-scripts.php:584
msgid "Please enter at least {0} character."
msgstr "请输入至少{0}个字符."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "请输入至少{0}个字符。"

#: includes/classes/class-themecomplete-epo-scripts.php:586
msgid "Please select up to {0} choice."
msgstr "请选择最多{0}选择。"

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "最多可选择 {0}个选项。"

#: includes/classes/class-themecomplete-epo-scripts.php:588
msgid "Please select exactly {0} choice."
msgstr "请准确选择{0}选项。"

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "请选择 {0}个选项。"

#: includes/classes/class-themecomplete-epo-scripts.php:590
msgid "Please select at least {0} choice."
msgstr "请至少选择{0}选项。"

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "至少应选择 {0}个选项。"

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr "请输入{0}的倍数。"

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr "请只输入字母。"

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr "请只输入字母或空格。"

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr "请只输入字母、数字或下划线。"

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr "请只输入统一码字母和数字。"

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "请只输入统一码字母、数字或空格。"

#: includes/classes/class-themecomplete-epo-scripts.php:598
msgid "Minimum number of rows is {0}"
msgstr "最小行数为{0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
msgid "Maximum number of rows is {0}"
msgstr "最大行数"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "完成"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "今天"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "常规"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "字符串"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "样式"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "全局"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr "上传管理"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "自定义代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "数学公式常量"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "许可证"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "店铺订单"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "店铺订单"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr "初始化"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr "总计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "各种"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
#| msgid "Enable front-end for roles"
msgid "Enable Frontend Access for Selected Roles"
msgstr "启用前端角色"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
msgid "Select the roles that will have access to the extra options."
msgstr "选择能够访问额外选项的角色。"

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
#| msgid "Disable front-end for roles"
msgid "Disable Frontend Access for Selected Roles"
msgstr "禁用前端角色"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr "选择无法访问额外选项的角色。"

#: includes/classes/class-themecomplete-epo-settings-base.php:271
msgid "Enable translations"
msgstr "启用翻译"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr "这将启用使用 pot 文件的默认插件翻译。"

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "柱式挂钩优先级"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"除非您知道它将如何影响您的网站,否则不要更改此设置!这是插件加载帖子类型的优"
"先级。"

#: includes/classes/class-themecomplete-epo-settings-base.php:282
msgid "Default value is 100"
msgstr "默认值为 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
#| msgid "Select the parameter which the products will be sorted by."
msgid "Specify the areas where the plugin will be activated."
msgstr "选择将对产品进行排序的参数。"

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "所有人"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "产品和类别"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "产品变量"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "产品页面"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
#, fuzzy
#| msgid "Final total box"
msgid "Final Total Box"
msgstr "总计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"启用此设置可在产品页面上显示最终总计,从而允许客户查看其订单的总成本,或禁用"
"它以简化产品页面。"

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "显示选项合计"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr "启用此选项可专门显示所选产品选项的总计。"

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "显示最终总数"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr "能够显示全面的产品总数,为客户提供总体成本的清晰概览。"

#: includes/classes/class-themecomplete-epo-settings-base.php:353
msgid "Enable Final total box for all products"
msgstr "为所有产品启用最终合计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
msgid "Show the Final total box even when the product has no extra options"
msgstr "即使产品没有额外选项,也显示最终总计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr "启用原始最终总显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr "选中以显示未折扣的最终总计"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "启用选项增值税显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr "选中以在选项总数上方显示选项增值税金额"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
msgid "Show Unit price on totals box"
msgstr "在总计框中显示单价"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
msgid "Enable this to display the unit price when the totals box is visible"
msgstr "启用此选项可在“总计”框可见时显示单价"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr "包括单价中的费用"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
msgid "Enable this to add any Fees to the unit price"
msgstr "启用此选项可将任何费用添加到单价中"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
msgid "Total price as Unit Price"
msgstr "作为单价的总价"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr "使总价格不乘以产品数量"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "隐藏“最终总计”框,直到选择元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr "选中此选项以仅在至少填写一个选项时显示“最终总计”框。"

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr "隐藏“最终总计”框,直到选择所有必需的元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr "选中此选项以仅在填充所有必需的可见选项时显示“最终总计”框。"

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr "隐藏“最终总计”框,直到选择所有元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr "选中此选项可仅在填充所有可见选项时显示“最终总计”框。"

#: includes/classes/class-themecomplete-epo-settings-base.php:426
msgid "Disable lazy load images"
msgstr "禁用延迟加载图片"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
msgid "Enable this to disable lazy loading images."
msgstr "启用此选项可禁用延迟加载图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:434
msgid "Preload lightbox images"
msgstr "预加载灯箱图片"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
msgid "Enable this to preload the image when using the lightbox feature."
msgstr "启用此选项可在使用灯箱功能时预加载图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:442
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "支持用于WooCommerce短码的插件"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr "启用这一功能将把插件文件加载到所有WordPress页面。谨慎使用。"

#: includes/classes/class-themecomplete-epo-settings-base.php:450
msgid "Enable shortcodes in options strings"
msgstr "在选项字符串中启用短代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr "启用此功能将允许在选项标签和描述文本中使用短代码和 HTML 代码。"

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "放置"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
msgid "Floating Totals box"
msgstr "浮动总计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "添加到购物车按钮"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "动画"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"这可以控制前端显示字段的显示方式。如果您选择\"使用操作挂钩显示\",则必须手动"
"将代码写入主题或插件以显示字段,而下面的位置设置将不起作用。如果您使用复合产"
"品扩展,您必须将此设置保留为\"正常\",否则复合产品包上无法显示额外的选项。有"
"关文档,请参阅更多。"

#: includes/classes/class-themecomplete-epo-settings-base.php:497
msgid "Show using action hooks"
msgstr "使用action hook 显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
msgid "Extra Options placement"
msgstr "额外选项的位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
msgid "Select where you want the extra options to appear."
msgstr "选择你想要额外选项出现在哪里。"

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "加入购物车 按钮之前"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "加入购物车 按钮之后"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
msgid "Before cart form"
msgstr "购物车表单之前"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
msgid "After cart form"
msgstr "购物车表单后"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "产品之前"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "产品之后"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr "产品总结前"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "产品简述后"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
msgid "After product image"
msgstr "产品图片后"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
msgid "Custom hook"
msgstr "自定义勾子"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
msgid "Extra Options placement custom hook"
msgstr "额外选项位置自定义勾子"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
msgid "Extra Options placement hook priority"
msgstr "额外选项位置勾子优先值"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
msgid "Select the Extra Options placement hook priority"
msgstr "选择附加选项放置挂钩优先级"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
msgid "Totals box placement"
msgstr "合计框位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
msgid "Select where you want the Totals box to appear."
msgstr "选择你想要合计框出现在哪里。"

#: includes/classes/class-themecomplete-epo-settings-base.php:569
msgid "Totals box placement custom hook"
msgstr "合计框位置自定义勾子"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
msgid "Totals box placement hook priority"
msgstr "合计框位置勾子优先值"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
msgid "Select the Totals box placement hook priority"
msgstr "选择总计框放置挂钩优先级"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
msgid "This will enable a floating box to display your totals box."
msgstr "将启用一个浮动框显示合计框。"

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "右下角"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "左下角"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "右上"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "左上角"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
msgid "Floating Totals box visibility"
msgstr "浮动合计框可见性"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
msgid "This determines the floating totals box visibility."
msgstr "这确定了浮动总计框的可见性。"

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "始终可见"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "在滚动页面之后可见"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
msgid "Hide after scrolling the page"
msgstr "滚动页面后隐藏"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
msgid "Pixels amount needed to scroll"
msgstr "滚动所需的像素量"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr "选择页面需要滚动的像素数,以便显示浮动总数。"

#: includes/classes/class-themecomplete-epo-settings-base.php:623
msgid "Add to cart button on floating totals box"
msgstr "添加到购物车按钮在浮动合计框中"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
msgid "Display the add to cart button on floating box."
msgstr "显示添加到购物车按钮在浮动合计框。"

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr "改变原来的产品价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr "当价格变化时,覆盖原始的产品价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:639
msgid "Change variation price"
msgstr "改变变动的价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
msgid "Check to overwrite the variation price when the price is changing."
msgstr "当价格变化时,覆盖变化价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr "强制选择"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"当产品有额外的产品选项时,这将更改“购物车”和“存档”页面上的“添加到购物车”按钮"
"以显示“选择”选项。启用此选项将删除ajax功能。"

#: includes/classes/class-themecomplete-epo-settings-base.php:657
msgid "Enable extra options in shop and category view"
msgstr "在商店和类别视图中启用额外选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"在商店页面和类别视图中显示额外的选项。这个设置是与主题相关的,一些方面可能不"
"能如预期的那样工作。"

#: includes/classes/class-themecomplete-epo-settings-base.php:665
msgid "Remove Free price label"
msgstr "删除免费的价格标签"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
msgid "Check to remove Free price label when product has extra options"
msgstr "当产品有额外选项是,删除免费标签"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
msgid "Use progressive display on options"
msgstr "在选项上使用渐进式显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"启用此选项将隐藏产品页面上的选项,直到初始化JavaScript。 这是一个故障安全设"
"置,我们建议您保持活动状态。"

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "动画延迟"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
msgid "How long the animation will take in milliseconds"
msgstr "动画需要多长时间(以毫秒为单位)"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
msgid "Start Animation delay"
msgstr "开始动画延迟"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
msgid "The delay until the animation starts in milliseconds"
msgstr "动画开始之前的延迟(以毫秒为单位)"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
msgid "Show quantity selector only for elements with a value"
msgstr "仅显示具有值的元素的数量选择器"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
msgid "Check show quantity selector only for elements with a value."
msgstr "选中“仅显示具有值的元素的数量选择器”。"

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr "隐藏添加到购物车按钮,直到选择元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr "选中此项仅当至少有一个选项被填充时才显示“添加到购物车”按钮。"

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr "隐藏添加到购物车按钮,直到选择所有必需的元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr "选中此选项以仅在填写所有必需的可见选项时显示添加到购物车按钮。"

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr "隐藏添加到购物车按钮,直到选择所有元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr "选中此选项以仅在填写所有可见选项时显示添加到购物车按钮。"

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "显示元素的全宽标签。"

#: includes/classes/class-themecomplete-epo-settings-base.php:730
msgid "Check this to force elements to be full width instead of auto."
msgstr "选中此选项可强制元素为全宽而不是自动。"

#: includes/classes/class-themecomplete-epo-settings-base.php:737
msgid "Show choice description inline."
msgstr "内联显示选择描述。"

#: includes/classes/class-themecomplete-epo-settings-base.php:738
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr "检查此以禁用显示描述为图利皮普,并显示其内联。"

#: includes/classes/class-themecomplete-epo-settings-base.php:745
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr "使用单选按钮和复选框的显示工具提示设置时隐藏选项标签"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr "选中此选项可在使用单选按钮和复选框的“显示工具提示”设置时隐藏选项标签。"

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "如果为零自动隐藏的价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
msgid "Check this to globally hide the price display if it is zero."
msgstr "如果价格是0,就在全局范围内隐藏。"

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "将价格中的零点修剪"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"选中此项以在全局范围内将价格削减为零。这也将应用于原生 WooCommerce 价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:769
msgid "Hide element price html when hide price setting is enabled"
msgstr "启用隐藏价格设置时隐藏元素价格html"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"如果您使用Google商家中心,请选中此项。当您启用隐藏其价格设置时,它将隐藏元素"
"的价格html。"

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr "如果可能,尝试在后台订单中显示翻译后的值"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"请注意,如果订单上的选项发生变化或被删除,您将通过启用此功能获得错误的结果!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
msgid "Include option pricing in product price"
msgstr "包含期权定价的产品价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
msgid "Check this to include the pricing of the options to the product price."
msgstr "包括产品价格的期权定价。"

#: includes/classes/class-themecomplete-epo-settings-base.php:797
msgid "Check for empty product price"
msgstr "检查空产品价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr "选中此选项可将插件设置为空时将产品价格设为零。"

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr "在显示的产品价格上使用“From”字符串"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr "当产品有额外的价格时,改变产品的价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:813
msgid "Alter generated product structured data"
msgstr "改变生成的产品结构化数据"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"更改生成的产品结构化数据。 如果选项使用条件逻辑,这可能会产生错误的结果!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "响应式选项结构"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
msgid "Enable this if you want the options to have responsive display."
msgstr "如果您希望选项具有响应式显示,请启用此选项。"

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr "关闭持久性购物车"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr "如果产品有很多选项,请启用此选项。"

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr "清空购物车按钮"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr "启用或禁用清除购物车按钮"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
msgid "Cart Field Display"
msgstr "购物车栏位显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
msgid "Select how to display your fields in the cart"
msgstr "选择如何在购物车中显示您的字段"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr "常规显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "显示一个弹出链接"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr "高级显示"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr "在购物车中隐藏其他选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr "启用或禁用购物车中选项的显示。"

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
#| msgid "Hide upload file URL in cart and checkout"
msgid "Hide extra addon prices in cart and checkout"
msgstr "隐藏购物车中的上传文件网址并签出"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
#| msgid "Enables or disables the display of options in the cart."
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "启用或禁用购物车中选项的显示。"

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr "防止负定价产品"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr "防止添加购物车负价产品。"

#: includes/classes/class-themecomplete-epo-settings-base.php:905
msgid "Prevent zero priced products"
msgstr "防止零价产品"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
msgid "Prevent adding to the cart zero priced products."
msgstr "防止增加购物车零价产品。"

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr "隐藏复选框元素的平均价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
msgid "This will hide the average price display on the cart for checkboxes."
msgstr "这将隐藏购物车上复选框的平均价格显示。"

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr "在购物车中显示图像替换和结帐"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr "启用此选项将显示具有图像替换的元素的图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:926
msgid "Hide upload file URL in cart and checkout"
msgstr "隐藏购物车中的上传文件网址并签出"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr "启用此选项将在购物车和结帐时隐藏所有上载文件的URL。"

#: includes/classes/class-themecomplete-epo-settings-base.php:933
msgid "Show uploaded image in cart and checkout"
msgstr "在购物车和结帐中显示上传的图片"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr "启用此选项将在购物车和结帐中显示上传的图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "最大图像宽度"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr "设置购物车上显示的图像的最大宽度。"

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "最大图像高度"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
msgid "Set the maximum height of the images that appear on cart."
msgstr "设置显示在购物车中的图像的最大高度。"

#: includes/classes/class-themecomplete-epo-settings-base.php:954
msgid "Always use unique values on cart for elements"
msgstr "始终在购物车上为元素使用唯一值"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr "启用此选项将分隔逗号分隔的元素值。 这主要用于多个复选框选择。"

#: includes/classes/class-themecomplete-epo-settings-base.php:984
msgid "Post types to show the saved options"
msgstr "文章类型显示保存的选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"选择插件将修改编辑顺序屏幕以显示已保存选项的帖子类型。您可以输入自定义帖子类"
"型。"

#: includes/classes/class-themecomplete-epo-settings-base.php:995
msgid "Strip html from emails"
msgstr "尝试过滤email中的html标签"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
msgid "Check to strip the html tags from emails"
msgstr "检查以去除电子邮件中的html标签"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
msgid "Legacy meta data"
msgstr "旧版元数据"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
msgid "Check to enable legacy meta data functionality."
msgstr "检查以启用旧元数据功能。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
msgid "Unique meta values"
msgstr "唯一元值"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
msgid "Check to split items with multiple values to unique lines."
msgstr "选中此项可将具有多个值的项拆分为唯一行。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr "阻止将选项发送到电子邮件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr "选中以禁止将选项发送到电子邮件。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
msgid "Disable sending the options upon saving the order"
msgstr "保存订单后禁用发送选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr "如果您在在结帐中尝试完成订单时出现 500 错误,请启用此选项。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
msgid "Attach upload files to emails"
msgstr "将上传文件附加到电子邮件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
msgid "Check to Attach upload files to emails."
msgstr "检查以将上传文件附加到电子邮件."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
msgid "Disable Options on Order status change"
msgstr "禁用订单状态更改选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
msgid "Check this only if you are getting server errors on checkout."
msgstr "只有在结账时收到服务器错误时才检查此项。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr "按顺序隐藏上传文件URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr "启用此功能将按顺序隐藏任何上传文件的URL。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
#| msgid "Show uploaded image in cart and checkout"
msgid "Show uploaded image in order"
msgstr "在购物车和结帐中显示上传的图片"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
#| msgid "Enabling this will show the uploaded images in cart and checkout."
msgid "Enabling this will show the uploaded images in order."
msgstr "启用此选项将在购物车和结帐中显示上传的图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "字段标签/值分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr "输入将用于将字段标签与购物车和订单中的字段值分开的字符。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "多字段值分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr "输入将用于分隔允许在购物车和订单中进行多项选择的字段的多个值的字符串。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
msgid "Update cart text"
msgstr "更新购物车"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
msgid "Enter the Update cart text when you edit a product."
msgstr "编辑产品时输入更新购物车文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr "编辑选项的文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr "输入文本以替换购物车中的编辑选项文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr "附加选项文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr "当在购物车中使用弹出的设置时,输入一个文本来替换额外的选项文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr "关闭按钮的文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr "当在购物车中使用弹出的设置时,输入文本来替换关闭按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "空的购物车文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr "输入一个文本来替换空的购物车按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "总计文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr "输入最后的合计文本,或默认为空。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
msgid "Unit price text"
msgstr "单价"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
msgid "Enter the Unit price text or leave blank for default."
msgstr "输入单价格文本或默认为空白。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr "选项合计文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
msgid "Enter the Options total text or leave blank for default."
msgstr "输入选项合计文本,或默认为空。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "选项增值税总文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr "输入“选项增值税总额”文本,或默认留空。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr "费用总计文字"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
msgid "Enter the Fees total text or leave blank for default."
msgstr "输入选项合计文本,或默认为空。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr "免费价格文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr "当产品有额外的选项时,输入一个文本来替换免费价格标签。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr "强制选择选项的文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr "在使用Force select选项时,输入一个文本以替换add to cart按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr "无零价格产品文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr "在尝试将零价格产品添加到其他购物车时,请输入文本替换消息。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr "无负价格产品文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr "输入文本以在尝试将负价产品添加到购物车时替换消息。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
msgid "Popup section button text replacement"
msgstr "弹出部分按钮文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"输入文本以替换充值部分按钮文本。将此设置为 %s 将使按钮文本具有部分标题。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "打开"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr "重置选项文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr "当使用自定义变量时,输入一个文本来替换重置选项文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "重置选项"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr "日历关闭按钮文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr "输入文本来替换日历上的关闭按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr "日历今日按钮文本替换"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr "输入文本以替换日历上的“今天”按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr "上一个文本滑块"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr "输入一个文本,以替换先前的按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr "下一个文本滑块"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr "输入一个文本来替换滑块的下一个按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr "这个字段是必需的文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
msgid "Enter a text to indicate that a field is required."
msgstr "输入文本以指示需要字段。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "剩余字符文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr "当在文本字段或文本区域中使用最大字符时,输入文本来替换字符剩余的文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr "上传文件文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"在有上传字段时单击 添加到购物车 按钮后,输入一个文本来替换弹出框中使用的上传"
"文件文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr "上传消息文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr "在有上传字段时单击 添加到购物车 按钮后,输入要在弹出框中使用的消息。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr "选择文件文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr "输入文本以替换样式上传按钮中使用的“选择文件文本”。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "选择文件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "单个文件文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr "输入文本以替换样式上传按钮中使用的文件文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "多文件文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr "输入文本以替换样式上传按钮中使用的文件文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
msgid "Add button text on associated products"
msgstr "在相关产品上添加按钮文字"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
msgid "Enter a text to replace the add button text on associated products."
msgstr "输入文本替换关联产品上的添加按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "添加"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
msgid "Remove button text on associated products"
msgstr "删除相关产品的按钮文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr "输入文本以替换关联产品上的删除按钮文本。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "删除"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
msgid "Repeater add text"
msgstr "重复器添加文本"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
msgid "Enter a text to replace the add text button for repeater fields."
msgstr "输入文本以替换中继器字段的添加文本按钮。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr "启用复选框和单选样式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr "为复选框和单选按钮启用或禁用额外的样式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
msgid "Select a style for the checkboxes and radio buttons"
msgstr "选中复选框和单选按钮的样式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "圆形"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "圆形 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "方形"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "方形 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
#| msgid "Select item border type"
msgid "Swatch border type"
msgstr "选择项目边框类型"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr "使用图像替换或样本时为选定边框选择样式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "阴影"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr "细线"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
#| msgid "Choose whether to hide the price or not."
msgid "Choose the border width for image or color swatches."
msgstr "选择是否隐藏价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr "使用图像替换或样本时为选定边框选择样式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr "使用图像替换或样本时为选定边框选择样式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "视觉"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "产品页面"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "本地化"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr "启用验证"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr "选中以启用生成器元素的验证功能"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
msgid "Disable error scrolling"
msgstr "禁用错误滚动"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr "选中此项可禁用滚动到出现错误的元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
msgid "Error label placement"
msgstr "错误标签放置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
msgid "Set the placement for the validation error notification label"
msgstr "设置验证错误通知标签的位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
msgid "After the element"
msgstr "元素之后"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
msgid "Before the element"
msgstr "在元素之前"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
msgid "Use options cache"
msgstr "使用选项缓存"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr "使用缓存选项以提高性能。如果您有共享相同唯一 ID 的选项,则禁用。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
msgid "Javascript and CSS inclusion mode"
msgstr "Javascript和CSS包含模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
msgid "Select how to include JS and CSS files"
msgstr "选择如何包括 JS 和 CSS 文件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
msgid "Single minified file"
msgstr "单个缩小的文件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
msgid "Multiple minified files"
msgstr "中多个压缩文件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
msgid "DEV - multiple files"
msgstr "发展多个文件"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
msgid "Disable PNG convert security"
msgstr "禁用PNG转换安全性"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
msgid "Check to disable the conversion to png for image uploads."
msgstr "选中此选项可禁用图像上传到png的转换。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr "如果总期权价格大于零,这将全局覆盖产品价格和期权价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr "在每个产品上使用设置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "期权价格模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "选择选项的价格模式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "使用促销价"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
msgid "Use regular price"
msgstr "使用正常价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "价格计算的最大组合数"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"此设置控制插件将用于计算最低和最高价格的最大组合数。组合数量越多,价格就越准"
"确,但计算它们也需要更长的时间。对于可以有多种选择组合的产品,建议设置较少的"
"组合数量以提高性能。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "默认值为 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr "在将产品添加到购物车后重新设置选项值"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr "这将在将产品添加到购物车后将选项值还原为默认值"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "在购物车和结账时使用加号和减号"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr "选择您希望如何在购物车和结帐中显示期权价格的标志。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
msgid "Display both signs"
msgstr "显示两个标志"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
msgid "Display only minus sign"
msgstr "仅显示减号"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
msgid "Use plus and minus signs on option prices"
msgstr "选项价格使用加号和减号"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr "选择您希望如何在产品页面上显示选项价格的标志。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr "输入十进制分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
msgid "Choose how to determine the decimal separator for user inputs"
msgstr "选择如何确定用户输入的小数分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "使用 WooCommerce 值"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr "探测浏览器的本地化设置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr "显示十进制分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
msgid "Choose which decimal separator to display on currency prices"
msgstr "选择显示在货币价格上的小数点分隔符"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "Date 元素的时区覆盖"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr "选择日期元素将在后端计算中使用哪种%s,或为服务器时区留空。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr "时区"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr "必须状态指示器"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr "输入一个字符串来表示字段的所需状态。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr "必须状态指示器位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
msgid "Select the placement of the Required state indicator"
msgstr "选择所需状态指示器的位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr "标签左侧"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr "标签右侧"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr "包含税字符在合计框"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr "启用此选项可在总计框中添加WooCommerce税后缀"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr "在汇总框中包括WooCommerce价格显示后缀"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr "启用此选项可在总计框中添加 WooCommerce 价格显示后缀。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
msgid "jQuery selector for main product image"
msgstr "jQuery 主产品图象选择器"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
msgid "This is used to change the product image."
msgstr "这是用来改变产品形象的。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
msgid "Product image replacement mode"
msgstr "产品形象替换模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr "Self 模式将替换实际图像,而 Inline 模式会附加新的图像元素。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
msgid "Self mode"
msgstr "自动模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
msgid "Inline mode"
msgstr "内联模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
msgid "Move out of stock message"
msgstr "脱销信息"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr "当样式变体在其下方使用时,这会移动缺货消息。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
msgid "Use internal variation price"
msgstr "使用内部变动价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"如果您的可变产品有很多选项可以提高性能,请启用此选项。请注意,这可能会导致折"
"扣或货币插件出现问题。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "启用插件后端接口"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"在编辑产品页面上选择有权访问插件设置和插件界面的角色。管理员角色始终具有访问"
"权限。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
msgid "Hide override settings on products"
msgstr "在首页隐藏产品滑块部分"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr "启用此选项可隐藏产品编辑屏幕上的设置选项卡"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
msgid "Hide Builder mode on products"
msgstr "在产品上隐藏构建模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr "启用此选项可隐藏产品编辑屏幕上的构建器选项卡"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
msgid "Hide Normal mode on products"
msgstr "在产品上隐藏标准模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr "启用此选项可隐藏产品编辑屏幕上的常规选项卡"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "启用 WP Rocket CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr "如果 WP Rocket cdn 处于活动状态,请检查以启用对插件图像的使用。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "启用 Jetpack CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"如果 Jetpack cdn 处于活动状态,请检查以允许对插件映像使用 Jetpack cdn。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "选择框"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "日期选择器"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
msgid "Set the max width of the tooltip that appears on the elements."
msgstr "设置出现在元素上的工具提示的最大宽度。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr "图片模式"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr "设置将用于各种图像相关功能的图像模式。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr "绝对网址"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
msgid "Relative URL"
msgstr "相对网址"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "更改时重新计算图像"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"这在动态更改图像 html 的多个库解决方案上是必需的,或者如果要动态控制图像。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
msgid "Retrieve image sizes for image replacements"
msgstr "检索图像替换的图像大小"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr "对于速度较慢的服务器或大量图像,请禁用此功能。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "显示数量 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr "启用此选项可显示数量字符串,即使数量为 1 且启用了数量选择器。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
msgid "Show prices inside select box choices"
msgstr "在选择框内显示价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr "如果价格类型是固定的,则选中此项可显示“选择框”选项的价格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr "即使价格被隐藏,也会在选择框内显示价格"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"如果价格类型是固定的,即使元素隐藏价格,也请选中此选项以显示选择框选项的价"
"格。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr "将选择框选项内的价格与其数量选择器相乘"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr "选中此选项可将选择框选项的价格乘以其数量选择器(如果有)。"

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr "单选按钮取消按钮"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
msgid "Globally override the undo button for radio buttons"
msgstr "全局覆盖单选按钮的撤消按钮"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr "使用字段值"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "日期选择器主题"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "日期选择器尺寸"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "日期选择器的位置"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
msgid "Minimum characters for text-field and text-areas"
msgstr "文本字段和文本区域的最小字符"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
msgid "Maximum characters for text-field and text-areas"
msgstr "文本字段和文本区域的最大字符"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
msgid "Upload element inline Image preview"
msgstr "上传元素内联图像预览"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
msgid "Enable inline preview of the image that will be uploaded."
msgstr "启用要上载的图像的内联预览。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
msgid "Scroll to the product element upon selection"
msgstr "选择后滚动到产品元素"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
msgid "Enable to scroll the viewport to the product element."
msgstr "启用以将视口滚动到产品元素。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
msgid "Product element scroll offset"
msgstr "产品元素滚动偏移"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr "输入滚动偏移值,然后选择产品元素的选项。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
msgid "Sync associated product quantity with main product quantity"
msgstr "将相关产品数量与主要产品数量同步"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr "使关联产品的数量为主要产品数量的倍数。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "用户名"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr "您的Envato用户名。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
msgid "Envato Personal Token"
msgstr "Envato个人代币"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "您可以通过以下方式生成Envato个人代币%s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "点击此链接"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "购买代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "要了解如何访问您的购买代码,您可以 %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr "单击此链接"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "停用许可证"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "激活许可证"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "许可证已激活。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "同意"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr "我同意将许可证数据传输到许可证服务器。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
msgid "Use allowed file types from WordPress"
msgstr "使用 WordPress 中允许的文件类型"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
msgid "Enable File manager"
msgstr "启用文件管理器"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "上传文件夹"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "更改此设置只会影响将来的上传。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
msgid "Enable pop-up message on uploads"
msgstr "在上传时启用弹出消息"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
msgid "Enables a pop-up when uploads are made."
msgstr "在上传时启用弹出窗口。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
msgid "Enable upload success message"
msgstr "启用上传成功消息"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
msgid "Indicates if the upload was successful with a message."
msgstr "表示上传是否成功的消息。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "允许的文件类型"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
msgid "Select which file types the user will be allowed to upload."
msgstr "选择允许用户上传的文件类型。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
msgid "Select file types"
msgstr "选择文件类型"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
msgid "Custom types"
msgstr "自定义类型"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr "选择允许用户以逗号分隔的自定义文件类型。"

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr "文件管理"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr "CSS代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
msgid "Only enter pure CSS code without and style tags"
msgstr "只输入没有和样式标签的纯CSS代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr "JavaScript代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
msgid "Only enter pure JavaScript code without and script tags"
msgstr "仅输入不带脚本标签的纯JavaScript代码"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
msgid "Add Constant"
msgstr "添加常量"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr "连接服务器错误!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr "从服务器获取数据时出错!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
msgid "License activated!"
msgstr "许可证激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr "许可证失效!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "无效的操作。"

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
msgid "Please fill all fields before trying to activate."
msgstr "请在尝试激活前填写所有字段。"

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr "尝试从插件界面外部激活是不允许的!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr "连接到Envato API时出错。 请稍后再试。"

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr "尝试使用无效的代码购买代码激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
msgid "Envato rate limit exceeded! Please try again later."
msgstr "超过Envato速率限制!请稍后再试。"

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr "该用户名对该商品的购买代码无效。请确保输入正确的用户名(区分大小写)。"

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "尝试从无效域激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
msgid "Trying to activate from an invalid IP address!"
msgstr "试图从无效的IP地址激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "购买代码已经激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr "购买代码已在另一个域上激活!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr "您已经在另一个域上激活了该购买代码!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "购买代码已激活!请购买有效的许可证!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr "您已经激活了您的购买代码!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr "已停用,但由于某些原因未激活购买代码!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr "无法停用。购买代码对您保存的许可证密钥无效!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr "无法完成请求!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr "从Envato市场下载软件包..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "错误! 无法连接到文件系统"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "To receive automatic updates license activation is required."
msgstr "要接收自动更新,需要激活许可证。"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "请激活额外产品选项。"

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr "错误!Envato API错误"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr "解压缩包时出错"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "Download new version from CodeCanyon"
msgstr "从 CodeCanyon 下载新版本"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr "或注册插件以接收自动更新。"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "添加翻译 %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "编辑 %s 翻译"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "语言"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, php-format
msgid "Language of this %s"
msgstr "此 %s 语言"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
msgid "This is a translation of"
msgstr "这是翻译后的值"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
msgid "Enable discounts on extra options"
msgstr "启用额外的选项优惠"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr "基本原价类型根据"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "设置为其原始价格所依据的价格类型。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "不做变更"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr "未打折产品价格"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr "启用定价表的更改"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr "选中此选项可将选项价格包含在定价表中。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr "前缀标签"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr "在产品详情页显示一个前缀标签."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "后缀标签"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr "在产品详情页显示一个后缀标签."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr "标签 CSS 选择器"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr "输入CSS选择器以覆盖将显示折扣字符串的默认标签。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr "折扣字符串放置"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr "选择折扣字符串相对于标签的位置。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "之后"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "之前"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
msgid "Enable showing option prices in the Order"
msgstr "启用在订单中显示选项价格"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr "启用此功能需要您自担风险,因为无法在“订购”页面上计算选项折扣。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce预订"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "按人数计算成本"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr "启用此功能会将选项价格乘以人数。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
msgid "Using booking setting"
msgstr "使用预订设置"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "按块数乘以成本"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr "启用此选项将使选项价格乘以块计数。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
msgid "Add option cost to booking display price"
msgstr "将期权成本添加到预订显示价格"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr "启用此功能将添加到计算的预订成本中的期权价格。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr "动态折扣"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr "启用此功能也会将产品折扣应用于额外选项。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "Woomerce轻松预订"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
msgid "WooCommerce Measurement Calculator"
msgstr "Woomerce测量计算器"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr "按区域乘以选项成本"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
msgid "Enabling this will multiply the options price by the calculated area."
msgstr "启用此选项将使选项价格乘以计算区域。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
msgid "Divide price with measurement"
msgstr "将价格与测量分开"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr "这会将原始价格除以所需的度量。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "WooCommerce订阅"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "再次在订单中包含插件"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr "启用此选项将在手动使用再次订购功能时将保存的插件添加到订阅中。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr "注册费用"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
#, fuzzy
msgid "sign-up fee"
msgstr "注册费"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr "和一个"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
msgid "Subscription sign up fee text"
msgstr "订阅注册费用文本"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr "输入订阅注册费文本或默认为空。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
msgid "Sign up fee text"
msgstr "注册费用"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
msgid "Enter the Sign up fee text or leave blank for default."
msgstr "输入订阅的费用文本或留空为默认。"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr "订阅注册费"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr "选择订阅费用"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "“%1$s”的数量必须大于 %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr "\"%s\"的数量必须大于 0 才能添加到购物车中。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "您最多只能为%2$s选择%1$s个选项。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "您最多只能为%2$s选择%1$s个选项。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "您必须为%2$s准确选择%1$s选项。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "您必须为%2$s准确选择%1$s个选项。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "您必须至少为%2$s选择%1$s选项。"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "您必须为%2$s至少选择%1$s个选项。"

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr "日期输入错误!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "无效的数据提交!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr "输入了无效的年份!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr "您不能选择那个日期!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(最大文件大小%s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr "%s不是一个有效的图像文件!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "上传成功"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "您必须为“%2$s”输入至少%1$s个字符。"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "“%2$s”输入的字符不能超过 %1$s 个。"

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "所有人"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "登录用户"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr "回显自定义操作"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr "EPO 自定义action"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "标题:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr "自定义操作:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s 不存在。"

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "等待产品图片"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "清除"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "数量"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "选择一个选项"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#~ msgid "Hide extra options prices in cart"
#~ msgstr "在购物车里隐藏额外选项价格"

#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr "启用或禁用购物车中选项的价格显示。"

#~ msgid "Show bottom"
#~ msgstr "在底部显示"

#~ msgid "Show inside"
#~ msgstr "在里面显示"

#~ msgid "Disable categories"
#~ msgstr "禁用类别"

#~ msgid "Submit for Review"
#~ msgstr "提交审核"

#~ msgid "Show Both Final and Options total box"
#~ msgstr "显示最终选项和选项总框"

#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "显示“最终”框,如果为零则隐藏“选项”"

#~ msgid "Hide Final total box"
#~ msgstr "最后总计框"

#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "总是只显示最后的总数 (价格 x 数量)"

#~ msgid "Disable but change product prices"
#~ msgstr "禁用但更改产品价格"

#~ msgid "Select when to show the final total box"
#~ msgstr "选中何时显示最终价格"

#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "显示最终总计,如果为零则隐藏选项总计"
languages/woocommerce-tm-extra-product-options-pt_BR.mo000064400000210712150755142440017312 0ustar00��m���68I9ISIeI�I*�I�I8�I\J:sJB�J"�J5KJKQK
ZKeK
xK�K�K�K�K�K	�K�K�K�K�K
LL1LBL8OL�L�L�L�L
�L�L�L�LM#(MLM_MpM�M�M�M
�M�M�M#�MNN N5NSN_NnN	�N�N�N
�N�N*�ND�N*$O,OO,|O	�OL�OP
P4PPPWPoP%�P
�P�P�P�P]�PXKQ�Q�Q�Q�Q�Q�Q�QRRRRR+R&4R&[R�R�R
�R�R�R�R.�RSSY0S3�S7�S;�SD2T7wT�T
�T�T�T�T3�TDU1^UH�U5�U8VFHV,�V8�V+�V7!W<YWK�W=�W< XK]X=�X(�X;Y2LYY!�Y�Y�Y
�Y�Y�Y	�Y�YZZ�+Z��Zg[#y[�[
�[�[�[
�[�[�[�[�[%\5\
;\I\\\k\w\�\�\�\
�\�\�\�\�\
�\]](]9]=]P]c]v]E�]�]�]�]
�]�]^^!+^M^
Y^d^p^�^�^#�^�^�^�^�^�^

__ _'6_'^_
�_�_�_�_�_�_?�_``*`<`N`j`|`�`�`�`�`�`�`
�`	�`	a
a
!a/a8aPaja}a
�a�a�a
�a�a�a"�a"�a b5b<Qb#�b�b0�b��bq�cFd9`d3�d3�d3e6eHeCPe)�e7�e9�eA0fBrfN�fg_
gsmg\�g9>hUxh^�h>-iXli:�iLjLMj>�jW�j31k8ek<�k=�k@l�Zl7�lA6m:xm0�m0�m-nCnVn6kn�nF�noo26o'io>�o�o�o,pD5pzp	�p	�p�p7�p�p#�pq0qJq"iq�q �q�q�q
�q"�q"r
*r"5rXr/nr�r	�r�r�r�r�rs-s!@sbs	ksus�s�s�s�s�s�s�s!t$t0tHt
Xtft�t�t�t�t�t�t�t�t�t�t�t�t�t�t�tuuuuu u'u/u5uBuRu_ukusuzuu�u�u)�u�uv2v
?vJvZv_vbvtvM�vP�vD&w
kwvw�w�w'�w�wxx*x
BxPxfx}x�x$�x$�x(�xy<y!Xy zy�y�y�y�y�y�y�y�y
zz%z
4z?zHzNzZz>xzC�z�z{	{{){?{G{Z{o{{�{�{�{�{A�{||	||1|E|V|n|r|
y|	�|�|�|�|�|�|�|�|}}
&}4}Q}o}s}�}�}�}�}�}	�}�}�}�}
~~0~5~<~K~a~p~y~�~�~�~�~�~�~�~�~�~�~�~$=Ult�'�&�5�'�
F�Q�	]�hg�Ѐ�#
�.�2K�/~�%��(ԁ)��'�$A�2f���.��5�o�.��1��#�"� 1�R�Y�b�s�|�����4�� ӄ)��
$�/�>�&\�$��
������΅օ߅����&�
.�<�@�I�\�o�
����
��-��������
��!/�Q�:p�
����ȇ·
��������
�%�.�3�@�S�c�|���������
Ԉ߈
����
��Q/���
������*ɉ1�&�2�A�Q�*a������3q�:��D�&%�-L�@z�"��"ތ)�$+�$P�$u�#��	��ȍ	эۍ�
����&�7�
D�O�+d�!��
����	؎
��
��
�
�(%�N�Z�i�n�~�����<��������
)�4�<�
B�P�Y�h�u�|���
����������	��
Ő	А{ڐ,V�)��,��]ڑ+8�9d�'��CƒE
�<P�;��ɓ/�"�Z9�G��.ܔ �,�F�"L�'o�	��/��1ѕ:�>�K�g�;�4��B�@3�it�<ޗu�)��@��3��
0�;�D�I�U�g�
m�{���7��I���
��+�B�T�X�
a�	o�y��*��D������#�'�B�
G�3R���������
��›ԛ؛���$�17�i�s��2��+�4�@�F�^�
p�
{���(��#��۝
�	����1�P�	W�3a�������ʞߞ����-�@�S�f�y���(��&��7�3�8L�O��[ՠ&1�4X�@��Ρ.��0�O�n�t�y�������"��	آ��������#�,�/�8�?�L�	R�4\���/��MãO�Sa�����ƤҤ�ۤ#����̧�(��("�?K�h��G�?<�)|�8��ߩ�
���
�-�I�Z�i�u�	������	����ƪ!���C,�p�&������˫%߫��:�.W�
��������Ȭ&߬��;�.A�p�
���� ��ѭ��
��!�*�6�/<�Dl�,��3ޮ7�
J�XU���	��9ʯ�(�4�*Q�|�����%��cʰd.�����ͱݱ���� �
&�1�8�<�S�7_�5��Ͳֲ
߲�$��00�a�v�l��F��>=�C|�P��H�Z�c�w�	���9��M׵:%�K`�8��N�D4�+y�8��.޷4
�DB�R��AڸB�P_�?��#�C�8X���,��źܺ���#�(/�X�\��r����*��
*�8�G�	W�a�r�����&��-������5�K�`�~���
������˾۾����(�E�I�Z�k�~�F��ؿ��
����(�!>�`�m�y�����	��,���
����"�@�
Q�\�6r�(�������
��;"�^�m��������������&�*@�k�
z�����
����������
�"�<�	K�U�\�k�	��%��+����#��B �+c���.�����l��V�Cr�C��C��C>�����S��/��8&�>_�N��O��K=�
��d�����n��C��g4�c��H�iI�D��Y��rR�D��u
�=��R��T�Df�G�����<��P��I?�=��<��.�3�F�;^���P����80�#i�E��"��$��,�TH���	��
����@��� )�J�Z�x�:����&�����
&�%4�$Z��&����=��$�
&�#1�	U�
_�j�}�<��9����(�:�G�\�i�5��#����*��#�6�U�j�"�����������������������
�
���� �%�,�5�<�D�J�\�t���
������)��&��(�31�$e�#����������������[�Zr�M���(�!9�![�1}�"��������0�J�i�����$��,��!�$�%B�$h�������������������+�@�Q�X�_�q�;��H����
4�
B�P�j�s�������������
��N��D�K�
[�f�|���������
��
�������,�H�O�o�w�|���6��/����"�+�0�'P�x���!���������&�-�4�D�_�q�z��������������������"�2�C�b���
������)��,�;3�o�������z��0�!K�0m�$��%��/��!�.;�j�#��!��.�� ��(�3H�~|�:��66�,m�-��(�������	�$�5�E�?N�%��1��������$
�2�D�T�c�k���
�����������������
��(�=�S�d�~�4��
��	��������� �-1�0_�Q��������+�	8�B�J�R�i�n�t������������������7�Q�Y�n�}�
������Y��%�A�T�j�/~�7��������01�b���;O�7��I�%
�83�Ml�"��"�,�#-�#Q�1u�+���������#�7�N�a�
q��8��%����&�3�B�Z�i�v�(��������
� �O(�x�
������������
���� �(�<�N�]�b�j�q�w���
�����'F�3n�5��Y�/2�8b�&��N�N�>`�>���2��!-�[O�E��)�%AX"]-�
�<�G�J>
���7�@HG:���KMw�.I@<�
�����3<0AJr�����
"9FL2X?������#@4	u�������%4HO���LF	�	�	�	�	�	�	�	�	0
8
S
o
|
�
�
#�
�
�
6�
&;Ut"�������%0CDt3�8�G&
in
1�
I
PT%�)��'"9\af{������	�������'	0B:}I�W�Y=���
�s*:�L4�����rW�KU~szuvwx�G^N���qQ���;�q]Z���t�a��S!^I7�^b���5�:��Jn[&TA�PCfa5CA?J��2Q\z���M{|�@����F�T�\M��Bcau���j�#xN;��P���V�[�%��}H���c:��QB��>o�k�hKg�
m�<���I�X0gE���>9j!�6l2&����k�.H���&dS�����@ �C1�K%�����IH.���]$iJ��mye�p)�����\	}�����-���U��Y�4��"��+��E
�*��b���	;�U���25"S��1�<e�Of�=:��P�O�?R�`2l�_R�1PbDD/3����{o�k����bg�[���40f��V��O��w�G���(��7L�
�Wp���H@������T
l\r&���=���A�[>j
G�=�W%��*dNW�- v�i0a��h9�`�����Y��/��3X�Z���/5��#	���X�e3Bc��)Xy��@)Egdn7��{��~_m�����1�,��h�]�U
���M�-`����D��_6�#J����-�}+��#�?����M�p�8��_�G�D��� ������F�,]
���wZ�B�9��q+�(6���h8��$LT��/� �)�t�
�4$�!�~���(�<�Zc��;������*�?='�3�m���ku�NS�6�'V�^n�.�$FI�Y�|��ds�,�y'+�fi%Y��|Rr8�j�K��('��������z�����Q"t�`�����>O������i8Le�l0����,�!���Rv	����7�9��EF�o���".A���x<�CV��"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%s does not exist.%s has been updated.%s have been updated.%s is not a valid image file!%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.%s removed along with all of its associated products!(Copy)(Legacy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAbove fieldAbsolute URLAccordionActionsActivate LicenseAddAdd Extra OptionAdd Global FormAdd New Global FormAdd New TemplateAdd TemplateAdd categories to include all their associated products.Add elementAdd element in a new sectionAdd itemAdd sectionAdd separatorAdd the products individually.Add to cartAdd to cart buttonAdd translation to %sAdditional Options text replacementAdditional optionsAdvanced displayAdvanced optionsAfterAfter Local OptionsAfter add to cart buttonAfter productAfter product summaryAllAll &quot;%s&quot; Method InstancesAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAlways showAlways visibleAn error has occurred!AnimationAnimation delayAnyApplied onAprilAre you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttach the price to the order making it independent of the product quantity.Attribute LabelAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase original price type according toBase priceBeforeBefore Local OptionsBefore add to cart buttonBefore adding Extra Options in this mode, add and save some attributes on the Attributes tab.Before adding Extra Product Options, add and save some attributes on the Attributes tab.Before productBefore product summaryBelow fieldBottomBottom leftBottom of screenBottom rightBoxBuilderButtonCDNCSS SettingsCSS codeCalendar close button text replacementCalendar today button text replacementCancelCartCategoriesCenterChange original product priceChanges product imageChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?Check this to alter the price display of a product when it has extra options with prices.Check to disable options from being sent to emails.Check to disable scrolling to the element with an errorCheck to enable the display of the undiscounted final totalCheck to enable the inclusion of option prices to the pricing table.Check to enable validation feature for builder elementsCheckboxCheckboxesCheckedCheckoutChoose an optionChoose the image to replace the product image with.Choose the image to use in place of the checkbox when it is checked.Choose the image to use in place of the checkbox.Choose the image to use in place of the radio button when it is checked.Choose the image to use in place of the radio button.Choose the tax class for Fee price type on this element.Choose whether the field will be validated against the choosen method.Choose whether the option is enabled or not.Choose whether the user must fill out this field or not.Choose whether to change the product image.Choose whether to enable the lightbox on the thumbnail.Choose whether to hide the element label in the cart or not.Choose whether to hide the element label in the floating totals box or not.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the cart or not.Choose whether to hide the element value in the floating totals box or not.Choose whether to hide the element value in the order or not.Choose whether to hide the price or not.Choose whether to redirect to a URL if the option is click.Choose whether to show or hide the attribute name.ClearClear all additional Global formsClear cart buttonClick to toggleClone formCloning is forbidden.CloseClose allClose button text replacementColorColor pickerComma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!Conditional LogicConnecting to activation server ...ConsentConstant nameConstant valueContentContent colorContent positionCopyCostCould not complete request!Could not update post in the databaseCountCurrent valueCustom Time formatCustom action:Custom codeCustom priceCustom price (required)Custom styleDateDate fieldDate field and pickerDate formatDate pickerDate picker styleDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDeactivated, but the purchase code was not activated for some reason!DecemberDefaultDefault productDefault valueDeleteDelete PermanentlyDelete all optionsDelete all options on the productDelete itemDescendingDescriptionDetermine by browser localDigitsDisableDisable Exclude from Global OptionsDisable weekdaysDisabledDisabled datesDiscountDiscount string placementDiscount typeDisplayDisplay a pop-up linkDisplay a prefix label on product page.Display a suffix label on product page.Display asDisplayed decimal separatorDividerDivider typeDocsDoneDouble click the radio button to remove its selected attribute.DropdownDropdown PlaceholderDuplicate ElementDuplicate SectionDynamic Pricing & DiscountsEPO Control PanelEPO custom actionEcho a custom actionEditEdit ElementEdit Global FormEdit Options text replacementEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit tabEdit the %s translationElement Conditional LogicElement class nameElement container idElement idElementsEmailEmpty cartEmpty cart textEnableEnable Exclude from Global OptionsEnable alteration of pricing tableEnable checkbox and radio stylesEnable clear options buttonEnable conditional logic for showing or hiding this section.Enable original final total displayEnable points display?Enable this if the product has a lot of options.Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.Enable to show the description of the associated product.Enable to show the image of the associated product.Enable to show the price of the associated product.Enable to show the title of the associated product.Enable validationEnabledEnables or disables extra styling for checkboxes and radio buttons.Enables or disables the clear cart buttonEnables or disables the display of options in the cart.Enables the display of a reset button for this attribute.Enabling this will multiply the options price by the block count.Enabling this will multiply the options price by the person count.Enabling this will show the images of elements that have an image replacement.End yearEnter a CSS selector to override the default label where the discount string will be displayed.Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.Enter a string to indicate the required state of a field.Enter a text to display after the price for this field or leave it blank for no text.Enter a text to replace the Additional options text when using the pop up setting on the cart.Enter a text to replace the Close button text on the calendar.Enter a text to replace the Close button text when using the pop up setting on the cart.Enter a text to replace the Edit options text on the cart.Enter a text to replace the Free price label when product has extra options.Enter a text to replace the Reset options text when using custom variations.Enter a text to replace the Today button text on the calendar.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the empty cart button text.Enter a text to replace the next button text for slider.Enter a text to replace the previous button text for slider.Enter a value for the minimum characters the user must enter.Enter a value to be applied to the Quantity field automatically.Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).Enter a value to be applied to the field automatically.Enter a value to limit the maximum characters the user can enter.Enter an extra class name to add to this attribute elementEnter an extra class name to add to this elementEnter an extra class name to add to this sectionEnter an id for the container of the element.Enter ending year.Enter starting year.Enter the Final total text or leave blank for default.Enter the discount amount.Enter the height of the displayed item or leave blank for auto height.Enter the maximum value.Enter the minimum value.Enter the number of values for the points display.Enter the placeholder for the dropdown.Enter the price for this field or leave it blank for no price.Enter the quantity step.Enter the step for the handle.Enter the time the following format: 8:00 amEnter the width of the displayed item or leave blank for auto width.Enter title hereEpo BlackEpo WhiteErrorError connecting to Envato API. Please try again later.Error connecting to server!Error getting data from the server!Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error! Can't connect to filesystemEveryoneExclude Product(s) from the formExclude ProductsExcluded ProductsExpand allExpand and Collapse (start closed)Expand and Collapse (start opened)Export CSVExtra Product Option #%1$s of %2$sExtra Product OptionsExtra Product Options & Add-Ons for WooCommerceExtra Product Options FeesExtra feeFailed to write file to disk.FebruaryFees amountFile imported.File managerFile manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal Total BoxFinal totalFinal total textFixed amountForce Select OptionsForce Select options textForm draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %s.Form submitted.Form updated.Free Price text replacementFree!FridayFromGeneralGeneral OptionsGeneral SettingsGlobalGlobal variablesGoogle font: on or offonH1H2H3H4H5H6H:mH:m:ssH:mmH:mm:sH:mm:ssHH:m:sHH:m:ssHH:mmHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide element label in cartHide element label in orderHide element value in cartHide element value in floating totals boxHide element value in orderHide extra options in cartHide filtersHide priceHorizontal ruleHourIDIcon tooltip leftIcon tooltip rightIf this is enabled the included product is not shipped with the main product.If this is enabled the included product will add its weight to the main product.If this is enabled the included product will maintain its own price.Import CSVImporting dataInclude Fees on unit priceInclude additional Global formsInclude tax string suffix on totals boxInherit product tax classInput decimal separatorInvalid action.Invalid data submitted!Invalid data!Invalid date entered!Invalid file extensionInvalid request!Invalid year date entered!Item name in quotes&ldquo;%s&rdquo;Items per row (Desktops and laptops)Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)Items per row (Smartphones)Items per row (Tablets landscape)Items per row (Tablets portrait)Items per row (iPhone 6 +)Items per row (iPhone 6)January JavaScript codeJulyJuneLabelLabel CSS selectorLabel OptionsLabel colorLabel positionLabel typeLanguageLargeLayout modeLeave empty for default valueLeave it blank to calculate it automatically from the %s priceLeave it blank to calculate it automatically from the %s sale priceLeftLeft of the labelLeft sideLetters onlyLetters or Space onlyLicenseLicense activated.License deactivated!Limit selectionLoading ...LocaleLogged in usersM j, Y @ H:iMaintain weightMake the total price not being multiplied by the product quantityMarchMath formulaMax valueMaximum charactersMaximum image widthMaximum quantityMaximum selectable dateMayMediumMenu OrderMin valueMinimum charactersMinimum quantityMinimum selectable dateMinimum selectionMinuteMissing a temporary folder.MondayMonthMore information about %sMove to TrashMultiply cost by block countMultiply cost by person countN/ANew TemplateNextNoNo Global Form foundNo Global Form found in trashNo Template foundNo changeNo elements found!No file found.No file was uploaded.No validationNo, but hide priceNoneNormalNormal (clear)Normal browser buttonNormal displayNovemberNumberNumber of pointsOctoberOpenOptionOptions Subscription feeOptions amountOptions saved!Options total textOrderOrder byOriginal product priceOther elementsOverride Final total boxOverride global displayOverride product pricePaddingParent TemplatePercent of the original pricePercent of the original price + optionsPercent of the original price per wordPercent of the original price per word (no n-th char)Percent of the origιnal pricePercentagePlaceholderPlacementPlease check the consent checkbox to give your permission to send your data to the server and try again.Please enter a multiple of {0}.Please enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} characters.Please enter no more than {0} character.Please enter no more than {0} characters.Please enter only digits.Please enter only letters or spaces.Please enter only letters, numbers or underscores.Please enter only letters.Please enter only unicode letters and numbers.Please enter only unicode letters, numbers or spaces.Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!Please save the form before importing options!Please save the product before importing options!Please select at least {0} choices.Please select exactly {0} choices.Please select up to {0} choices.Pop upPopulatePopulate optionsPositionPrefix labelPremium SupportPrevPrevent adding to the cart negative priced products.Prevent negative priced productsPrevent options from being sent to emailsPricePrice TypePrice per wordPrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:Priced individuallyPricingPriorityProductProduct pageProduct quantityProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity max valueQuantity min valueQuantity selectorQuantity stepRadio button undo buttonRadio buttonsRadio buttons and image at start of the labelRandomRangeRange pickerRegularRemoveRequiredRequired state indicatorRequired state indicator positionReset Options text replacementReset option values after the product is added to the cartReset optionsReset settingsRightRight of the labelRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSearch Global FormSearch TemplateSearch for a product ...Search for a product&hellip;SecondSectionSection background colorSection class nameSection idSection placementSection styleSection typeSelectSelect BoxSelect a productSelect a style for the selected border when using image replacements or swatches.Select an image for this term.Select boxSelect categoriesSelect fileSelect how the products will be presented.Select how to show the value of the range picker.Select modeSelect optionsSelect productsSelect templateSelect the Product(s) to apply the optionsSelect the color to use.Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.Select the image to replace the product image with.Select the parameter which the products will be sorted by.Select the placement of the discounted string compared to the label.Select the position of the datepicker.Select the product that will be pre-selected.Select the roles that will not have access to the extra options.Select the size of the datepicker.Select the size of the timepicker.Select the sorting order of the products.Select the theme for the datepicker.Select the theme for the timepicker.Select this section's display style.Select this section's display type.SeptemberSettingsSettings:ShadowShipped individuallyShop orderShow Final TotalShow Options TotalShow descriptionShow filtersShow imageShow image and labelShow image replacement in cart and checkoutShow image, label and descriptionShow labelShow label and descriptionShow metaShow priceShow reset buttonShow titleShow tooltipShow value onShow when the total is greater than zeroSign up feeSingle ProductSizeSlider (wizard)Slider next textSlider previous textSmallSorry, this file type is not permitted for security reasons.SquareSquare 2StandardStart adding elementsStart of the labelStep valueStringsStyleStyled buttonSubtitleSubtitle colorSuffix labelSundaySwatch positionSystem styleTable nameTabsTaxTemplateTextText AreaText FieldText linkThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The description will appear under the title.The form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The number of options the user has selectedThe purchase code is already activated on another domain!The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity for "%s" must be greater than 0 to be added to the cart.The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The quantity of this elementThe selected form does not contain any sectionsThe total quantity of this elementThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.The value length of this elementThe value of this elementThemeThere are no saved variations yet.There was an error saving the settings.Thin lineThis allows you to disable all selected months.This allows you to disable all selected weekdays.This allows you to generate points along the range picker.This elementThis field is required textThis field is required.This is where you can add new global options to your store.This will add a button to clear the selected option.This will count as an empty value in case the element is required.This will divide the original price with the needed measurement.This will exclude any global forms assigned to this product except those defined in the previous setting.This will override the display method only for this product.This will override the product price with the price from the options if the total options price is greater then zero.This will override the time format above.This will override the totals box display only for this product.This will show a quantity selector for this option.ThumbnailsThursdayTimeTime formatTime picker styleTitleTitle optionsTitle:ToTo find out how to access your purchase code you can %sTo translate the strings for the local options please use WPML interface.TodayTooltipTooltip and Left sideTooltip and Right sideTooltip max widthTopTop leftTop of screenTop rightTotalTranslationsTrying to activate from an invalid domain!Trying to activate from outside the plugin interface is not allowed!TuesdayTurn off persistent cartType:URLUndiscounted product priceUndoUnit priceUnserializing instances of this class is forbidden.UpdateUpdate cartUploadUpload button styleUpload folderUpload successfulUrlUse URL replacementsUse WooCommerce valueUse custom imageUse field valueUse global settingUse the "From" string on displayed product pricesUse the image replacementsUse this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.Use translated values when possible on admin OrderUsernameValidate asValueVariation #%1$s of %2$sVariation optionsVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView Global FormView TemplateView cartView detailsVisble after scrolling the pageVisit premium customer supportVisualWednesdayWhether to include specific products or categories.WidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYear - Day - MonthYear - Month - DayYear . Day . MonthYear . Month . DayYear / Day / MonthYear / Month / DayYesYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item out of the Trash.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot add negative priced products to the cart.You cannot move this item to the Trash. %s is currently editing.You cannot select that date!You have already activated your purchase code!Your Envato username.Your settings have been reset.Your settings have been saved.and aautocharacters remainingclick this linkclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thangreater than or equal toh:mmherehh:mmhh:mm:ssisis emptyis notis not emptylabelless thanor register the plugin to receive automatic updates.ppost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>postsMine <span class="count">(%s)</span>Mine <span class="count">(%s)</span>postsSticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>sign-up feespanstarts withtimezoneProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:54+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: pt_BR
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n > 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
“% s” é um campo obrigatório.%1$s &ndash; %2$s%1$s / %2$s%1$s a cada %2$s%s não existe.%s foi Atualizado.%s foram atualizados.%s não é um arquivo de imagem válido!%s post movido para a lixeira.%s posts movidos para a lixeira.%s post não atualizado, alguém o está editando.%s posts não atualizados, alguém os está editando.%s post excluído permanentemente.%s posts excluídos permanentemente.%s post restaurado da lixeira.%s posts restaurados da lixeira.%s post atualizado.%s posts atualizados.%s removido junto com todos os seus produtos associados!(Copiar)(Legado)(Sem título)(tamanho máximo de arquivo %s)(sem título)Um número de dias de hoje.TODAS categoriasTODOS produtosCampo acimaURL absolutaAcordeãoAçõesAtivar LicençaAdicionarAdicionar opção extraAdicionar Formulário GlobalAdicionar novo formulário globalAdicionar novo modeloAdicionar ModeloAdicione categorias para incluir todos os seus produtos associados.Adicionar elementoAdicionar elemento em uma nova seçãoAdicionar itemAdicionar seçãoAdicionar separadorAdicione os produtos individualmente.Adicionar ao carrinhoBotão "Adicionar ao carrinho"Adicionar tradução para %sSubstituição de texto de Opções AdicionaisMais opçõesVisualização avançadaOpções AvançadasDepoisDepois Opções locaisDepois do botão Adicionar ao carrinhoApós a meta do produtoApós Descrição do ProdutoTodosTodos os &quot;%s&quot; Instâncias de métodoTipos de arquivo permitidosAlfanuméricoUnicode alfanuméricoUnicode ou espaço alfanuméricoMostrar sempreSempre visívelOcorreu um erro!AnimaçãoAtraso de animaçãoQualquerAplicado emAbrilTem certeza de que deseja excluir este arquivo?Tem certeza de que deseja excluir esta pasta e todo o seu conteúdo?Tem certeza de que deseja excluir este item?Você tem certeza de que quer remover esta opção?Tem certeza de que deseja redefinir as configurações?AscendenteVerifique para tornar o preço total não sendo multiplicado pela quantidade do produto.Etiqueta atributoAtributo:Atributos faltando. Por favor, apague essa opção extra:AgostoOcultar automaticamente o preço se zeroAguardando imagem do produtoTipo de preço base original de acordo comPreço baseAntesAntes Opções locaisAntes do botão Adicionar ao CarrinhoAntes de adicionar opções extras neste modo, adicione e salve alguns atributos na guia Atributos.Antes de adicionar Opções de Produtos Extras, adicione e salve alguns atributos na guia Atributos.Antes da grade do produtoAntes da Descrição do ProdutoAbaixo do campoInferiorInferior esquerdoParte inferior da telaInferior DireitoCaixaConstrutorBotãoCDNConfigurações de CSSCódigo CSSSubstituição de texto do botão Fechar do CalendárioSubstituição de texto do botão Hoje do calendárioCancelarCarrinhoCategoriasCentroAlterar o preço do produto originalMudar a imagem do produtoMudar isso só vai afetar futuros carregamentos.Caracteres restantesCheatin&#8217; uh?Verificar isto para alterar a exibição de preço de um produto quando ele tem opções extras com preços.Seleção para desabilitar as opções de serem enviados para e-mails.Verifique para desativar a rolagem para o elemento com um erroVerificar para permitir a exibição do total final não descontadoVerifique para permitir a inclusão de preços de opções na tabela de preços.Verifique para ativar o recurso de validação para elementos construtorCheckboxCaixas de SeleçãoMarcadoFinalizarEscolha uma opçãoEscolha a imagem para substituir a imagem do produto com.Escolha a imagem para usar no lugar da caixa de seleção quando selecionada.Escolha a imagem para usar no lugar da caixa de seleção.Escolha a imagem para usar no lugar do botão de rádio quando selecionado.Escolha a imagem para usar no lugar do botão de rádio.Escolha se deseja incluir impostos para o tipo de preço, taxa neste elemento.Escolha se o campo será validado em relação ao método escolhido.Escolha se a opção está ativada ou não.Escolha se o usuário deve preencher este campo ou não.Escolha se deseja alterar a imagem do produto.Escolha se deseja ativar a mesa de luz na miniatura.Escolha se deseja ocultar o rótulo de elemento no carrinho ou não.Escolha se deseja ocultar o rótulo de elemento na caixa flutuante totais ou não.Escolha se deseja ocultar o rótulo de elemento na ordem ou não.Escolha se deseja ocultar o valor do elemento no carrinho ou não.Escolha se deseja ocultar o valor de elemento na caixa flutuante totais ou não.Escolha se deseja ocultar o valor de elemento na ordem ou não.Optar por ocultar o preço ou não.Escolha quando redirecionar a uma URL quando a opção é um click.Escolha se deseja mostrar ou ocultar o nome do atributo.LimparLimpar todos formulários globais adicionaisBotão Limpar carrinhoClique para alternarClonar FormulárioA clonagem é proibida.FecharFechar tudoSubstituição de texto do botão FecharCorSelecionador de coresSeparados por vírgula datas de acordo com o formato da data seleccionada. (Dois dígitos para o dia, dois dígitos para mês e quatro dígitos para o ano)Datas separadas por vírgulas de acordo com o formato da data selecionada. (Dois dígitos por dia, dois dígitos por mês e quatro dígitos por ano). Por favor note que isso irá substituir qualquer outra configuração!Lógica condicionalConectando-se ao servidor de ativação...ConsentimentoNome constanteValor constanteConteúdoCor do conteúdoPosição do conteúdoCopiarCustoNão foi possível concluir do pedido!Não foi possível atualizar o banco de dadosContagemValor atualFormato do tempo personalizadoAção personalizada:Código PersonalizadoPreço PersonalizadoPreço padrão (obrigatório)Estilo personalizadoDataCampo dataCampo de data e seletorFormato de dataSeletor de DataEstilo de selecionador de dataDatasPosição datepickerDatepicker tamanhoTema de selecionador de dataDiaDia - Mês - AnoDia . Mês . AnoDay - Month - YearDesativar LicençaDesativado, mas o código de compra não foi ativado por algum motivo!DezembroPadrãoAntes do ProdutoValor padrãoExcluirExcluir PermanentementeOpções para DeletarDeletar todas opções do produtoExcluir itemDescendenteDescriçãoDetermine pelo navegador localDígitosDesativarExcluir de Opções Extra de produtos globalSemana desativarDesativadoDatas desabilitadasDescontoColocação de cordas com descontoTipo de descontoExibiçãoExibir um link pop-upMostrar uma etiqueta de prefixo na página do produto.Mostrar um sufixo na página do produto.Mostrar comoExibido separador decimalDivisorTipo de DivisorDocumentosFeitoClick duplo no botão rádio remove o atributo selecionado.Lista suspensaEspaço reservadoDuplicar ElementoDuplicar SeçãoPreços & Descontos DinâmicosPainel de controle EPOAção personalizada EPOEcho uma ação personalizadaEditarEditar ElementoEditar formulário globalEditar Opções de substituição de textoEditar seçãoEditar ModeloEditar itemEditar opçõesEditar PreçoEditar ConfiguraçõesEditar GuiaEditar a tradução de %sElemento condicional LogicNome da classe elementoId de elemento contêinerId do elementoElementosE-mailCarrinho VazioTexto Carrinho vazioHabilitarAtivar exclusão das opções globaisPermitir a alteração da tabela de preçosAtivar estilos checkbox e radioHabilitar botão de limpar opçõesActivar lógica condicional para mostrar ou ocultar esta secção.Habilitar a exibição total final originalAtivar pontos de exibição?Ative isto se o produto tiver muitas opções.Habilite essa configuração para exibir uma Caixa Total Final na página do produto, permitindo que os clientes visualizem o custo total de seu pedido, ou desabilite-a para uma página simplificada do produto.Permite exibir o total abrangente do produto, fornecendo aos clientes uma visão geral clara do custo geral.Habilite para exibir o total especificamente para as opções de produto selecionadas.Marque isto para incluir o valor das opções ao preço do produto.Marque isto para incluir o valor das opções ao preço do produto.Marque isto para incluir o valor das opções ao preço do produto.Marque isto para incluir o valor das opções ao preço do produto.Habilitar a validaçãoAtivadoHabilita ou desabilita o estilo extra para caixas de seleção e botões de rádio.Habilita ou desabilita o botão limpar carrinhoAtiva ou desativa a exibição das opções no carrinho.Permite a exibição de um botão de reset para este atributo.Permitir que isto vai multiplicar o preço de opções pela contagem de bloco.Permitir que isto vai multiplicar o preço de opções pela contagem de pessoa.Ativar isso mostrará as imagens de produtos que tem substitutos de imagem.Fim de AnoInsira um seletor de CSS para substituir a etiqueta padrão onde a cadeia de desconto será exibida.Insira um número superior a 0 para que o usuário selecione o número exato de caixas ou deixe em branco para o comportamento padrão.Insira um número superior a 0 para limitar a seleção caixa ou deixe em branco para o comportamento padrão.Introduza uma cadeia para indicar o estado necessário de um campo.Insira um texto a ser exibido depois que o preço para este campo ou deixe em branco para nenhum texto.Insira um texto para substituir o texto opções adicionais ao usar o pop-up de ajuste no carrinho.Insira um texto para substituir o texto do botão Fechar no calentário.Insira um texto para substituir o texto do botão Fechar ao usar o pop-up de configurações no carrinho.Insira um texto para substituir o texto Editar opções no carrinho.Insira um texto para substituir o rótulo Grátis quando o produto tiver opções extras.Insira um texto para substituir as opções de Reiniciar texto quando estiver utilizando variações específicas.Insira um texto para substituir o botão texto Hoje  no calendário.Insira um texto para substituir o suplemento ao carrinho texto do botão quando utilizar o selecione a opção Force.Insira um texto para substituir o texto tecla do carro vazio.Insira um texto para substituir o seguinte texto do botão de controle deslizante.Insira um texto para substituir o texto do botão anterior para controle deslizante.Digite um valor para os personagens mínimos o usuário deve entrar.Introduzir um valor a ser aplicada ao campo Quantidade automaticamente.Insira um valor para ser aplicado ao campo automaticamente de acordo com seu formato de data selecionada. (Dois dígitos para o dia, dois dígitos para o mês e quatro dígitos para o ano).Introduzir um valor a ser aplicada ao campo automaticamente.Insira um valor para limitar o máximo de caracteres que o usuário pode entrar.Digite um nome de classe extra para adicionar a este elemento de atributoDigite um nome de classe extra para adicionar a este elementoDigite um nome de classe extra para adicionar a esta seçãoIntroduza um id para o recipiente do elemento.Entre o ano Final.Entre o ano de começo.Digite o texto Final total ou deixar em branco por padrão.Entre o valor mínimo.Introduza a altura do item exibido ou deixe em branco para a altura automática.Entre o valor máximo.Entre o valor mínimo.Insira o número de valores para a exibição de pontos.Entre o incremento para o manuseio.Digite o preço para este campo ou deixe em branco por nenhum preço.Insira o incremento de Quantidade.Digite o passo para o identificador.Introduza o tempo no seguinte formato: 08:00Introduza a largura do item exibido ou deixe em branco para a largura do automóvel.Digite o título aquiEpo pretoEpo BrancoErroErro ao ligar ao Envato API. Por favor tente de novo mais tarde.Erro ao conectar servidor!Erro ao obter dados do servidor!Erro ao apagar.Erro em mover para a lixeira.Erro ao restaurar da lixeira.Erro! Não é possível se conectar ao sistema de arquivosTodosHabilitar regras para este formulárioProdutos excluídosProdutos ExcluídosExpandir tudoExpandir e recolher (iniciar fechado)Expandir e recolher (iniciar aberto)Exportar CSVOpção de Produto Extra #%1$s de %2$sOpções ExtrasOpções de produtos extras e complementos para o WooCommerceTaxas extras de opções de produtosTaxa extraFalha ao gravar o arquivo em disco.FevereiroValor fixoArquivo importado.Gerenciador de arquivosO Gerenciador de arquivos não é suportado no seu servidor.O carregamento do arquivo foi interrompido por extensão.Nome do arquivoFiltrar porCaixa Total FinalPreço FinalTexto de total finalQuantia fixaForçar opções de seleçãoForçar a Seleção das Opções Extras (acréscimos)Rascunho do formulário atualizado.Formulário publicado.Formulário restaurado para revisão de %sFormulário salvo.Formulário agendado para: %s.Formulário enviado.Formulário atualizado.Substituição de texto de GrátisGrátis!SextaDeGeralOpções GeraisConfigurações GeraisGlobalVariáveis globaisemH1H2H3H4H5H6H (m)H:m:SSH:mmH:mm:sH:mm: SSHH:m:sHH:m:SSHH:mmCor do cabeçalhoPosição do cabeçalhoTítulo do CabeçalhoTipo de cabeçalhoCabeçalhoAlturaOcultarOcultar o rótulo do elemento no carrinhoOcultar o rótulo do elemento em ordemEsconder o valor do elemento no carrinhoEsconder o valor elemento flutuante totais de caixaOcultar o valor de elemento em ordemOcultar opções extras no carrinhoEsconder filtrosEsconder preçoRegra horizontalHoraIDÍcone dica esquerdaO ícone direito da dicaSe isso estiver habilitado, o produto incluído não será enviado com o produto principal.Se isso estiver habilitado, o produto incluído adicionará seu peso ao produto principal.Se isso estiver habilitado, o produto incluído manterá seu próprio preço.Importar CSVImportando dadosIncluir Taxas no preço unitárioIncluem formas globais adicionaisIncluir sufixo cadeia tributária na caixa totaisHerdar a configuração do produtoSeparador decimal de entradaAção invalida.Dados inválidos apresentado!Dados inválidos!Data inválida informada!Extensão de arquivo inválidaSolicitação Inválida!Data inválido inserido ano!&ldquo;%s&rdquo;Itens por linha (Desktops e laptops)Itens por linha (paisagem de Tablets Galaxy)Itens por linha (Samnsung Galaxy)Itens por linha (Smartphones)Itens por linha (paisagem de Tablets)Itens por linha (retrato em tablets)Itens por linha (iPhone 6 +)Itens por linha (iPhone 6)Janeiro Código JavaScriptJulhoJunhoRótuloEtiqueta seletora CSSOpções RótuloCor do rótuloPosição da rótuloTipo de EtiquetaIdiomaGrandeModo de layoutDeixe em branco para ID padrãoDeixe em branco para calcular automaticamente do  %s preçoDeixe em branco para calcular automaticamente do %s preço de promoçãoEsquerdaEsquerda da etiquetaLado EsquerdoApenas letrasSomente letras ou espaçoLicençaLicença ativada.Licença desativado!Limitar seleçãoCarregando ...Idioma localUsuários logadosM j, Y @ H:iManter o pesoFaça com que o preço total não seja multiplicado pela quantidade do produtoMarçoFormato de DataValor máxMáximo de caracteresLargura máxima de imagemQuantidade máximaData selecionável máximaMaioMédioOrdem do menuValor mínCaracteres mínimosQuantidade mínimaData mínima seleccionávelQtde. Mínima de SeleçõesMinutoFaltando uma pasta temporária.SegundaMêsMais informações sobre %sMover para LixeiraReservas: Multiplicar o custo pela contagem por  blocoReservas: Multiplique custo por contagem pessoaN/DNovo ModeloPróximoNãoNenhuma forma global encontradoNenhuma forma global encontrada no lixoNenhum modelo encontradoNenhuma mudançaNão foram encontrados elementos!Nenhum arquivo encontrado.Nenhum arquivo foi enviado.Sem ValidaçãoNão, mas ocultar o preçoNenhumNormalNormal (limpar)Botão normal do navegadorExibição normalNovembroNúmeroNúmero de pontosOutubroAbrirOpçãoOpções da Taxa de InscriçãoSubtotalOpções salvas!Texto de Opções totalPedidoOrdenar porMudar o preço original do produtoOutros ElementosSubstituir a caixa Total finalSubstituir exibição mundialSubstituir o preço do produtoPreenchimentoModelo PrincipalPorcentagem do preço inicialPorcentagem do preço original + opçõesPorcentagem do preço original por caracterePorcentagem do preço original por caractere (no n-th char)Porcentagem do Preço OriginalPorcentagemPlaceholderPosicionamentoMarque a caixa de seleção de consentimento para dar sua permissão para enviar seus dados ao servidor e tente novamente.Insira um múltiplo de {0}Por favor, insira um URL válido.Por favor insira um endereço de e-mail válido.Por favor insira um número válido.Digite um valor maior ou igual a {0}.Por favor insira um valor menor ou igual a {0}.Digite pelo menos {0} caracteres.Por favor não digite mais que {0} caracteres.Digite mais de {0} caracteres.Por favor, indique apenas dígitos.Digite apenas letras ou espaços.Digite apenas letras, números ou sublinhados.Por favor, insira apenas letras.Digite apenas letras e números unicode.Digite apenas letras, números ou espaços unicode.Por favor, note que, se as opções na alterar a ordem ou ficar excluído você vai obter resultados errados ao permitir isso!Por favor, salve o formulário antes de importar opções!Por favor, salve o produto antes de importar opções!Por favor selecione pelo menos {0} opções.Por favor, selecione exatamente {0} escolhas.Por favor, selecionar até {0} escolhas.Pop upCriar em massaPreencher opçõesPosiçãoEtiqueta prefixoSuporte PremiumAnteriorImpedir adição ao carrinho de produtos com preços negativos.Impede produtos com preços negativosEvitar as opções de serem enviados para e-mailsPreçoTipo de PreçoPreço por linhaPreço por caractere  (no n-th char)%1$s &ndash; %2$s%1$s&ndash;%2$sTipo de preçoPreço:Preço individualmentePreçosPrioridadeProdutoPágina do produtoQuantidade do produtoProdutosProdutos e CategoriasPublicarCódigo de CompraQtdQuantidadeValor máximo QuantidadeQuantidade min valorSeletor de quantidadeEtapa QuantidadeRádio botão botão undoBotão de seleção únicaTeclas e imagem de rádio na extremidade da etiquetaAleatórioIntervaloRaio do SeletorRegularRemoverObrigatórioIndicador de estado obrigatórioPosição do indicador de estado necessáriasSubstituição de texto de Reiniciar as opçõesRedefinir os valores de opção depois que o produto é adicionado ao carrinho deRedefinir opçõesRedefinir ConfiguraçõesDireitaDireita da etiquetaLado direitoFunçõesRedondoRound 2Executar AtualizaçãoSKU:VendaPreço de VendaSábadoSalvarSalvar alteraçõesFormulário de pesquisa globalPesquisar templateProcure um produto ...Procure por um produto&hellip;SegundoSeçãoCor de Fundo da SeçãoNome da classe de seçãoSeçãoColocação secçãoEstilo seçãoTipo de seçãoSelecionarCaixa de SeleçãoSelecionar um produtoEscolha um estilo para a borda selecionada ao usar substituições de imagem ou amostras.Selecione uma imagem para este termo.Caixa de seleçãoSelecionar categoriasSelecione o arquivoSelecione como os produtos serão apresentados.Selecione como mostrar o valor do seletor de intervalo.Selecione o ModoSelecionar opçõesSelecionar produtosSelecionar modeloSelecione o produto (s) para aplicar as opçõesSelecione a cor a ser usada.Selecione o tipo de desconto. O desconto se aplica ao preço final do produto. Se o produto tiver opções extras, o desconto se aplica ao valor após as opções terem sido adicionadas ao preço do produto.Selecione a imagem para substituir a imagem do produto com.Selecione a imagem para substituir a imagem do produto.Selecione a colocação do fio descontado em comparação com a etiqueta.Seleccione a posição do datepicker.Selecione usuários que terão acesso a opções extras.Selecione as funções administrativas que terão acesso às opções extras.Selecione o tamanho do datepicker.Selecione o tamanho do timepicker.Selecione o tamanho do Selecionador de Data.Selecione o tema para o datepicker.Selecione o tema para o timepicker.Escolha o estilo de apresentação desta seção.Selecione tipo de exibição deste seção.SetembroConfiguraçõesConfigurações:SombraEnviado individualmentePedidoMostrar Total FinalMostrar opções TotalExibir descriçãoMostrar filtrosExibir ImagemMostrar imagem e etiquetaMostrar substituição de imagem no carrinho e check-outMostrar imagem, rótulo e descriçãoExibir etiquetaMostrar rótulo e descriçãoMostrar metaMostrar preçoMostrar botão de resetExibir títuloMostrar DicaMostrar valor emMostrar quando o total é maior que zeroTaxa de inscrição (%s)Produto ÚnicoTamanhoSlider (assistente)Slider próximo textoSlider texto anteriorPequenoDesculpe, mas este tipo de arquivo não é permitido por razões de segurança.QuadradoQuadrado 2PadrãoInicie adicionando elementosInício do rótuloValor do passoCordasEstiloBotão estilizadoSubtítuloCor do SubtítuloEtiqueta sufixoDomingoPosição de SwatchEstilo da seçãoNome da tabelaAbasImpostoModeloTextoÁrea de textoCampo de textoLink do TextoEste nome de usuário não é válido para este código de compra item. Por favor, certifique-se de que você inseriu o nome de usuário correto (case sensitive).A descrição aparecerá sob o título.O formulário está sendo aplicado a todos produtosEste formulário não está aplicado a nenhum produtoAs formas que você escolher serão exibidas ao lado com as formas que o produto já tem.O número de opções que o usuário selecionouO código de compra já está ativado em outro domínio!O código de compra já está ativado!O código de compra já está ativado! Por favor, compre uma licença válida!A quantidade de "%s" deve ser maior que 0 para ser adicionado para o carrinho.A Quantidade de &quot;%1$s&quot; não pode ser maior que %2$d.A Quantidade de &quot;%1$s&quot; não pode ser menor que %2$d.A quantidade deste elementoO formulário selecionado não tem nenhuma seçãoA quantidade total deste elementoO arquivo enviado excede a diretiva MAX_FILE_SIZE que foi especificada no formulário HTML.O arquivo carregado excede a diretriz upload_max_filesize em php.ini.O arquivo só foi parcialmente carregado.O comprimento do valor deste elementoO valor deste elementoTemaAinda não há variações salvas.Houve um erro ao salvar suas configurações.Linha finaIsto permite que você desative dias da semana selecionados.Isso permite que você desabilite todos os dias da semana selecionados.Isso permite que você para gerar pontos ao longo do seletor de intervalo.Este elementoEste campo é obrigatórioEste campo é obrigatório.Aqui você pode adicionar novos produtos para sua loja.Isto irá adicionar um botão para apagar a opção selecionada.Isso contará como um valor vazio no caso de o elemento ser necessário.Isto dividirá o preço original com a medida necessária.Isto irá excluir quaisquer formulários globais atribuídos a este produto, exceto aqueles definidos na configuração anterior.Isto irá substituir o método de visualização somente para este produto.Isto irá substituir o preço do produto com o preço das opções, se o preço total de opções é maior então zero.Isso irá substituir o formato do tempo acima.Isto substituirá a exibição de caixa totais somente para este produto.Isto irá mostrar o seletor de quantidade para esta opção.MiniaturasQuintaTempoFormato da HoraEstilo do Selecionador de DataTítuloOpções de Título EleganteTítulo:ParaPara acessar o código de compra para um item %sPara traduzir as cordas para as opções locais utilize interface de WPML.HojeTooltipDica e esquerdoTooltip e do lado direitoLargura máxima da TooltipTopoTopo esquerdoParte superior da telaTopo direitoTotalTraduçõesTentando ativar a partir de um domínio inválido!Tentando ativar fora da interface do plug-in não é permitido!TerçaDesativar carrinho persistenteTipo:URLPreço do produto sem descontoDesfazerPreço unitárioAs instâncias de desserialização dessa Classe são proibidas.AtualizarAtualizar carrinhoUploadEstilo de botão UploadPasta de AmostrasEnviado com SucessoUrlUse substituições de URLUse valor WooCommerceUse imagem personalizadaValor do campoUsar configuração globalUse a seqüência de caracteres "De" sobre os preços do produto exibidoUse substituições imagemUtilize este campo para fazer uma exibição de grade. Digite o número de itens por linha para a grade ou deixe em branco para exibição normal.Utilize informações traduzidas quando possível no pedido do AdministradorNome de usuárioValidar comoValorVariação #%1$s de %2$sOpções de variaçãoVariação:VariaçõesVáriosVer documentação de Opções Extras do ProdutoOpções Extras do ProdutoVista de formulário globalVer TemplateVer carrinhoVer detalhesVisível após rolar a páginaVisite o Suporte ao Cliente PremiumVisualQuartaSeja para incluir produtos ou categorias específicas.LarguraWooCommerce BookingsWooCommerce Easy BookingsConfigurações do WooCommerceAssinaturas WooCommerceWooCommerce não está habilitado!AnoDia - Mês - AnoDia - Mês - AnoDia . Mês . AnoDia . Mês . AnoDia / Mês / AnoDia / Mês / AnoSimSem permissão para apagar este item.Você não tem permissão para editar este item.Você não tem permissão para mover este item para fora da Lixeira.Sem permissão para mover este item para a Lixeira.Não tem permissão para restaurar este item da lixeira.Você tentou editar um item que não existe. Talvez tenha sido apagado?Você pode & #8217; t editar este item porque ele está no lixo. Por favor, restaure-o e tente novamente.Você não pode acrescentar mais opções extras.Você não pode adicionar produtos com preços negativos para o carrinho.Não é possível mover este item para a lixeira.  %s está editando no momento.Você não pode selecionar essa data!Você já ativou o seu código de compra!Nome de usuário do Envato.Suas configurações foram reiniciadas.Suas configurações foram salvas.e umautocaracteres restantesclique nesse linkclicando neste linkdivQtdtermina comarquivoarquivosmaior quemelhor que ou igual ah:mmaquihh:mmhh:mm:sséestá vazionão énão está vazioetiquetamenor queou registar-se o plug-in para receber atualizações automáticas.pOpções Extras de ProdutosTudo <span class="count">(%s)</span>Tudo <span class="count">(%s)</span>Meu < span classe = "count" > ( %s) </span>Meu < span classe = "count" > ( %s) </span>Fixo < span classe = "count" > ( %s) </span>Fixo < span classe = "count" > ( %s) </span>taxa de Inscriçãospancomeça comfuso horáriolanguages/woocommerce-tm-extra-product-options-nl_NL.mo000064400000066023150755142440017312 0ustar00����w�h'i'�'�'�'8�'\�':Z(B�("�(�(
)
)
 )	+)5)=)N)R)c)p)|)�)
�)�)�)�)�)�)�)�)*-*1*D*Q*]*l*	�*�*
�*�**�**�*	�*+
++$+
;+F+M+g+n+z+�+�+�+�+�+�+
�+�+�+�+�+
�+�+,
,,&,!7,Y,
i,t,�,	�,�,�,�,�,�,
�,�,�,�,�,�,
--$-
)-4-@-
L-W-[-n-�-�-�-
�-�-�-�-�-
�-.
..#.@.O.X.g.
p.~.
�.�.�.�.�.�.�.�.�.
�.	�.�.
/
/ /8/A/
G/R/b/�i/q0F�0�09�0101A1G1Z1t1�1"�1�1�1�1
2
22%2;2Z2x2�2!�2�2	�2�2�2�2�2�23
3)3/363;3C3S3d3k3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3

444
4
(434C4[4$l4�4�4�4
�4�4�4
�4�4�4�4�4	�4�455 5'575D5	J5T5g5|5�5�5�5
�5	�5�5�5�5�5�56!6'6
A6O6S6X6h6u6z6}6	�6�6
�6�6�6�6�6�6�6�6�6777&7.7
>7I7	U7_7#y7�72�7/�7%8)C8m8#�8"�8 �8�8�8�899
9&%9$L9
q9|9�9�9�9�9�9�9�9
�9�9�9
�9�9�9:	::
:':6:
<:G:M:S:c:h:
m:x:�:�:�:�:�:�:�:�:
�:�:
;;(;4;C;S;*c;�;	�;�;	�;�;
�;�;�;�;�;<
<
(<
3<
><I<(V<<�<�<<�<�<�<�<
�<�<=
===.=@=M=
T=_=d=h=q=	v=
�=	�={�='>C9><}>;�>Z�>GQ?.�?�?1�?@
@#@,@1@=@C@J@M@S@[@_@	h@r@x@*�@�@�@�@�@
�@�@3�@A A,A
3AAASAcAgApAvA
�A
�A�A
�A	�A�A�A�A	�ABBB1BKBPB(TB&}B3�B8�BOC[aC@�C�CD"D7DJD"ND	qD{D�D�D�D�D�D�D�D�D�D�D�D�D�D	�D�DE/EM2EO�ES�E$F)F�5F�H
II:IUKIy�ICJU_J,�J�J�J�JK	K(K/K	AKKKdKwK
�K�K�K�K!�K�K
LL.L!1LSLgLlL�L�L�L�L�L�L�L�L0�L-'MUM^MnMzM�M�M�M'�M	�M
�M�M�M�MNN	NN"N/N6NRN
iNwN�N	�N�N�N�N+�N�NOO0O
8OFOLOXOlOxOO�O	�O�O�O�O�O�O�O	�O
�OPPPP2PEPXP	lPvP�P�P�P�P�P�P�P�P*�P%Q
:QHQ\QdQqQ
zQ�Q�Q�Q�Q�Q�Q�Q�Q�QRRR.RDR	aRkRrR�R�R��R�|S]TcT<pT"�T�T�T�T.U@4UuU3�U�U�U�U�UVV+V!@V(bV�V�V2�V�V	�V�VWWW<WRWgW}W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W
XX&X2X6X=XEX
UXcXgX
jX
uX�X!�X�X�X�X�X�X�X�X
Y
YY"Y(Y5Y
;YFY[YdYuY|Y�Y�Y�Y�Y�Y"�Y	ZZ!Z
(Z6ZFZ\ZkZ}Z �Z�Z�Z�Z�Z�Z�Z�Z[[![-%[S[d[
�[�[�[�[�[�[�[�[
�[�[
�[
�[�[\
\ \	,\6\N\n\-�\5�\�\!	]+] B]c] {]�]�]�]�]�]
�]�]�]
�]^^
^^
"^0^	A^
K^V^c^j^
q^^�^	�^�^	�^�^�^�^�^�^�^�^____'_/_
C_Q_j_�_�_	�_�_�_
�_�_�_�_``7.` f`	�`�`
�`�`
�`�`�`�`�`aa
%a
0a;aKa.Xa
�a�a�aA�a�a
�a	�a
bbb!b
0b;bJbdbxb
b	�b�b�b�b�b	�b
�b��b'^cC�c3�c=�cg<dS�d0�d)e9/eie
�e	�e�e�e�e�e�e�e�e�e
�e�e�e�e.�e$f,f2f6f	EfOf@ef	�f�f�f�f�f�fggg"g	=g	GgQgYgig|g �g�g�g�g�g�g�g
hh.h+DhAphD�hN�hmFi5�i �ijj)jFjJjQj]j	ej
ojzj�j�j�j�j�j�j�j�j�j�j�j�j�j�jckIkkM�kl
l������H��<;:��>*�W�6
�gy�����G*����P�A$���/������b����U|m�K[�j9\�E�+&	|sx�1�8��������[w���
��"�5����xcab�>�~-q�?_�=�F%��!?�5r�����.�vP`~h�Jt��zY(�=+(���lW���_�kI�@2�B�i}RS3���j�`�G��NLAk���eU�MB{7�'0Ju� �CdK	�9���T�
����d�����&^/O������u1I���$��De���Xo��D�w4�"Z�SOH����������]fZc�4���nm;s�^
pf7�a����R�Y���Q!8�')��)�QVr�.z-0��y�M�:p��63�o{���E\���l]��F�%�@iT��2�v#���<��,������LN}Ct��X�n��g������q������V ��h#,��"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%s does not exist.%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.(Copy)(No title)(max file size %s)(no title)AccordionActionsActivate LicenseAddAdd New TemplateAdd TemplateAdd elementAdd itemAdd sectionAdd separatorAdd to cartAdd to cart buttonAdd translation to %sAdditional optionsAdvanced optionsAfterAfter add to cart buttonAfter product summaryAllAllowed file typesAlphanumericAlways showAlways visibleAn error has occurred!AnimationAnyApplied onAprilAre you sure you want to delete this file?Are you sure you want to delete this item?AscendingAttribute LabelAttribute:AugustAwaiting product imageBase priceBeforeBefore add to cart buttonBottomBottom leftBottom rightBoxBuilderButtonCDNCancelCartCategoriesCenterChanges product imageCheatin&#8217; uh?CheckboxCheckboxesCheckedCheckoutChoice labelChoose a valueChoose an optionClear all additional Global formsClick to toggleClone formCloning is forbidden.CloseClose allColorColor pickerConditional LogicConsentContentContent colorContent positionCopyCostCountCustom codeCustom priceCustom styleDateDate fieldDate formatDate pickerDatepickerDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDefaultDefault valueDeleteDelete PermanentlyDelete all optionsDelete itemDescendingDescriptionDigitsDisableDisable Exclude from Global OptionsDisable monthsDisabledDisabled datesDiscountDiscount typeDisplayDisplay asDividerDocsDoneDropdownDuplicate ElementDuplicate SectionEditEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit the %s translationElementsEmailEmpty cartEmpty cart textEnableEnable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.EnabledEnables the display of a reset button for this attribute.Enter the step for the handle.Enter title hereErrorError in deleting.Error in moving to Trash.Error in restoring from Trash.Error on unzipping packageError! Can't connect to filesystemError! Envato API errorEveryoneExclude ProductsExpand allExport CSVExport formExtra Product OptionsExtra Product Options SettingsFailed to write file to disk.FebruaryFees amountFile upload stopped by extension.FilenameFilter byFinal Total BoxFinal totalFixed amountForm draft updated.Form saved.Form submitted.Form updated.Free!FridayFromGeneralGeneral OptionsGeneral SettingsGlobalGoogle font: on or offonH1H2H3H4H5H6H:m:sH:mm:sHH:m:sHH:mm:sHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide filtersHide priceHourIDImage modeImport CSVInvalid action.Invalid data submitted!Invalid request!Item name in quotes&ldquo;%s&rdquo;JulyJuneLabelLabel OptionsLabel colorLabel positionLabel typeLanguageLargeLayout modeLeftLeft sideLetters onlyLicenseLoading ...LocaleLogged in usersM j, Y @ H:iMarchMax valueMaximum charactersMaximum image heightMaximum image widthMaximum quantityMayMediumMenu OrderMin valueMinimum charactersMinimum quantityMinimum selectionMinuteMissing a temporary folder.MondayMonthMore information about %sMove to TrashN/ANameNew Global FormNew TemplateNextNoNo Global Form found in trashNo changeNo file was uploaded.No validationNoneNormalNovemberNumberOctoberOpenOptionOptions amountOptions saved!OrderOrder byPaddingParent TemplatePercentagePlaceholderPlacementPlease enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} characters.Please enter no more than {0} characters.Please enter only digits.Please select at least {0} choices.Please select exactly {0} choices.Please select up to {0} choices.Pop upPositionPremium SupportPrevPricePrice TypePrice range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:PricingPriorityProductProduct pageProduct quantityProductsPublishPurchase codeQtyQuantityRadio buttonsRandomRangeRegularRemoveRequiredReset optionsReset settingsRightRight sideRolesRoundRun the updaterSKU:SaleSale PriceSaturdaySaveSave changesSearch TemplateSearch for a product ...Search for a product&hellip;SecondSectionSelectSelect BoxSelect a productSelect boxSelect categoriesSelect fileSelect optionsSelect productsSelect templateSelect the Product(s) to apply the optionsSelect the color to use.SeptemberSettingsSettings:ShadowShop orderShowShow Final TotalShow Options TotalShow descriptionShow filtersShow imageShow labelShow priceShow titleShow tooltipShow when the total is greater than zeroSingle ProductSizeSmallSorry, this file type is not permitted for security reasons.SquareSquare 2StandardStep valueStringsStyleStyled buttonSubtitleSubtitle colorSubtitle positionSuffix labelSundayTable nameTabsTaxTemplateTextText AreaText FieldText linkThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.ThemeThis allows you to disable all selected weekdays.This field is required.ThumbnailsThursdayTimeTime formatTitleTitle:ToTodayTooltipTopTop leftTop rightTotalTranslationsTrying to activate from an invalid domain!TuesdayType:URLUndoUnit priceUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUploadUpload folderUpload successfulUploading filesUrlUsernameValueVariation #%1$s of %2$sVariation:VariationsVariousView TemplateView cartView detailsVisit premium customer supportVisualWednesdayWidthWooCommerce BookingsWooCommerce SettingsWooCommerce SubscriptionsYearYesYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You have already activated that purchase code on another domain!Your settings have been saved.autocharacters remainingclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thanh:m:sh:mm:sherehh:m:shh:mmhh:mm:sisis emptyis notis not emptylabelless thanless than or equal toppost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>postsMine <span class="count">(%s)</span>Mine <span class="count">(%s)</span>postsSticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>spanstarts withProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:53+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: nl_NL
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n != 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
"%s" is een verplicht veld.%1$s &ndash; %2$s%1$s / %2$s%1$s elke %2$s%s bestaat niet.%s bericht naar de prullenbak verplaatst.%s berichten naar de prullenbak verplaatst.%s bericht niet bijgewerkt, iemand is deze aan het bewerken.%s berichten niet bijgewerkt, iemand is ze aan het bewerken.%s bericht permanent verwijderd.%s berichten permanent verwijderd.%s bericht hersteld vanuit de prullenbak.%s berichten hersteld vanuit de prullenbak.%s post bijgewerkt.%s berichten bijgewerkt.(Kopie)(Geen titel)(max. bestandsgrootte %s)(geen titel)AccordeonActiesActiveer licentieToevoegenNieuw sjabloon toevoegenSjabloon toevoegenElement toevoegenVoeg item toeSectie toevoegenVoeg scheidingsteken toeIn winkelwagenToevoegen aan winkelwagentje knopVertaling aan %s toevoegenExtra optiesGeavanceerde optiesNaNu toevoegen aan het winkelmandjeNa productoverzichtAlleToegestane bestandstypenAlfanumeriekAltijd laten zienAltijd zichtbaarEr is een fout opgetreden!AnimatieElkeGesolliciteerd opAprilWeet u zeker dat u dit bestand wilt verwijderen?Weet u zeker dat u dit item wilt verwijderen?OplopendAttribuut LabelEigenschap:AugustusWacht op productafbeeldingBasis prijsVoorVoor de Knop: toevoegen aan winkelwagenOnderkantLinksonderRechtsonderBoxBouwerKnopCDNAnnulerenWinkelwagenCategorieënMiddenVerander product afbeeldingValsspelen&#8217; hé?SelectievakjeKeuzevakjesGeselecteerdAfrekenenKeuze labelKies een waardeKies een optieAlle aanvullende globale formulieren wissenKlik om te wisselenFormulier KopiërenActie niet toegestaan.SluitenAlles sluitenKleurKleurkiezerConditionele logicaToestemmingInhoudKleur inhoudInhoud positieKopiërenKostenAantalAangepaste codeAangepaste prijsAangepaste stijlDatumDatumveldDatumweergaveDatumkiezerDatumkiezerDagDag - Maand - JaarDag . Maand . JaarDag / Maand / JaarDeactiveer licentieStandaardStandaardwaardeVerwijderenPermanent verwijderenAlle opties verwijderenVerwijder itemAflopendOmschrijvingCijfersUitschakelenUitsluiten van globale opties uitschakelenUitschakelen maandenUitgeschakeldUitgeschakelde dataKortingKortingstypeWeergaveWeergeven alsScheidingslijnDocumentatieKlaarDropdownElement kopierenSectie duplicerenBewerkenBewerk OnderdeelBewerk templateBewerk itemUw keuze wijzigenTarief bewerkenInstellingen bewerkenDe vertaling van %s bewerkenElementenE-mailLege winkelwagenHele winkelmand legenInschakelenSchakel deze instelling in om een eindtotaalvak weer te geven op de productpagina, zodat klanten de totale kosten van hun bestelling kunnen bekijken, of schakel deze optie uit voor een vereenvoudigde productpagina.Maak het mogelijk om het uitgebreide producttotaal weer te geven, waardoor klanten een duidelijk overzicht krijgen van de totale kosten.Schakel deze optie in om het totaal specifiek voor geselecteerde productopties weer te geven.IngeschakeldSchakelt de weergave in van een reset-knop voor dit kenmerk.Voer de stap in voor de handeling.Voer hier de titel inFoutFout bij het verwijderen.Er is een fout opgetreden bij het verwijderen.Er is iets fout gegaan bij het terugzetten vanuit de prullenbak.Fout in uitpakken pakketFout! Kan geen verbinding maken met bestandssysteemFout! Envato API foutIedereenProducten uitsluitenAlles uitklappenCSV exporterenFormulier ExporterenExtra Product OptiesInstellingen Extra Product OptiesHet schrijven naar de schijf is mislukt.FebruariKosten van extra optiesUploaden van het bestand gestopt door de extensie.BestandsnaamFilter opEindtotaal DoosTotaalbedragVast bedragFormulierconcept bijgewerkt.Formulier opgeslagen.Formulier ingediend.Formulier bijgewerkt.Gratis!VrijdagVanAlgemeenAlgemene optiesAlgemene instellingenAlgemeenaanH1H2H3H4H5H6H:m:sH:mm:sHH:m:sHH:mm:sKleur koptekstPositie headerHeader titelHeader typeKopHoogteVerbergVerberg filtersVerberg prijsUurIDBeeldmodusImporteer CSVOngeldige actie.Ongeldige importmethode gebruikt!Ongeldige aanvraag!&ldquo;%s&rdquo;JuliJuniLabelLabel optiesLabel kleurLabel positieLabel typeTaalGrootLayout modusLinksLinkerkantAlleen letters (A-Z)LicentieAan het laden...LocaleIngelogde deelnemersM j, Y @ H:iMaartMaximale waardeMaximaal aantal tekensMaximale afbeeldingshoogteMaximale breedte van de afbeeldingMaximum hoeveelheidMeiMediumMenu volgordeMinimale waardeMinimum aantal tekensMinimum aantalMinimale selectieMinuutEr ontbreekt een tijdelijke map.MaandagMaandMeer informatie over %sVerplaats naar prullenmandN/ANaamNieuwe globale formulierNieuwe TemplateVolgendeNeeGeen globale formulier gevonden in PrullenbakGeen wijzigingenEr is geen bestand geüploadet.Geen controleGeenNormaalNovemberNummerOktoberOpenOptieKosten versieWijzigingen opgeslagen!BestellingSorteer opPaddingHoofd TemplatePercentagePlaceholderPlaatsingVul een geldige URL in.Voer een geldig e-mailadres in.Vul een geldig nummer in.Vul een waarde groter dan of gelijk aan {0} .Gelieve een waarde van minder dan of gelijk aan {0} .Voer minstens {0} tekens in.Voer niet meer dan {0} tekens in.Voer enkel cijfers in.Selecteer minimaal {0} optie(s).Selecteer {0} optie(s).Selecteer maximaal {0} optie(s).Pop upPositiePremium SupportVorigePrijsPrijs Type%1$s &ndash; %2$s%1$s&ndash;%2$sPrijs typePrijs:PrijzenPrioriteitProductProductpaginaAantal productenProductenPublicerenAankoop CodeAantalAantalRadio buttonsWillekeurigReeksStandaardVerwijderenVerplichtReset OptiesInstellingen resettenRechtsRechterkantRollenRondVoer de updater uitSKU:SaleVerkoopprijsZaterdagOpslaanWijzigingen opslaanZoek TemplateZoek naar een product...Zoek naar een product&hellip;TweedeSectieSelecteerSelectie boxSelecteer een productSelect boxSelecteer CategorieënSelecteer bestandSelecteer optiesSelecteer productenKies het sjabloonSelecteer het/de product(en) om de opties toe te passenSelecteer de te gebruiken kleur.SeptemberInstellingenInstellingen:SchaduwBestellingToonEindtotaal weergevenToon opties TotaalBeschrijving weergevenToon filtersAfbeelding weergevenToon labelToon prijsLaat titel zienToon tooltipWeergeven wanneer het totaal groter is dan nulEnkel ProductGrootteKleinSorry, dit bestandstype is om veiligheidsredenen niet toegestaan.VierkantVierkant 2StandaardStapwaardeTekenreeksenStijlGestijlde knopOndertitelSubtitel kleurPositie van de ondertitelAchtervoegsel labelZondagTabel naamTabbladenBTWSjabloonTekstTekstgebiedTekstveldTekst LinkDeze gebruikersnaam is niet geldig voor deze aankoop Artikelcode. Controleer of dat u de juiste gebruikersnaam (hoofdlettergevoelig) in hebt gevoerd.De activatie code is reeds geactiveerd!De activatie code is reeds geactiveerd! Schaf een geldige licentie!De hoeveelheid "%1$s" kan niet hoger zijn dan %2$d.Het aantal van &quot;%1$s&quot; mag niet lager zijn dan %2$d.Het geüploade bestand overschrijdt het voorschrift MAX_FILE_SIZE gespecificeerd in het HTML-formulier.Het geüploade bestand overschrijdt het voorschrift upload_max_filesize in php.ini.Het bestand is slechts gedeeltelijk geüploadet.ThemaHiermee kunt u alle geselecteerde weekdagen uitschakelen.Dit veld is verplicht.MiniaturenDonderdagTijdTijdnotatieTitelTitel:TotVandaagTooltipTopLinksbovenRechtsbovenTotaalVertalingenProbeert te activeren van een ongeldig domain!DinsdagType:URLOngedaan makenStukprijsOnbekend Berichttype.Het is niet toegestaan exemplaren van deze klasse te incasseren.BijwerkenWinkelwagen bijwerkenUploadenMap uploadenUpload succesvolBestanden aan het uploadenUrlGebruikersnaamWaardeVariatie nr. %1$s van %2$sVariatie:VariatiesDiverseBekijk TemplateBekijk winkelwagenBekijk detailsBezoek de premium klantenserviceVisueelWoensdagBreedteWooCommerce BookingsWooCommerce instellingenWooCommerce SubscriptionsJaarJaU hebt niet het recht dit item te verwijderen.U hebt niet het recht dit item te bewerken.U hebt niet het recht dit item naar de prullenbak te verplaatsen.U hebt niet het recht dit item terug te zetten vanuit de prullenbak.U probeert een item te bewerken dat niet bestaat. Is het misschien verwijderd?U kunt dit item niet bewerken omdat het in de prullenbak staat. Gelieve te herstellen en probeer het opnieuw.Activatie code reeds geactiveerd op een ander domain!Je instellingen zijn opgeslagen.automatischresterende tekensdoor op deze link te klikkendivAantaleindigt metbestandbestandengroter danh:m:sh:mm:shierhh:m:suu:mmhh:mm:sisis leegis nietis niet leeglabelkleiner danminder dan of gelijk aanpTM Extra Product OptionsAlle <span class="screen-reader-text">(%s)</span>Alle <span class="screen-reader-text">(%s)</span>Mijn <span class="count">(%s)</span>Mijn <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>spanbegint metlanguages/woocommerce-tm-extra-product-options-de_DE.mo000064400000426370150755142440017255 0ustar00����,slY8w9wSwewo�w��wn�xf	ydpyo�y|Ez�z*�z{8{\W{:�{B�{"2|5U|$�|�|�|
�|�|
�|�|}}"}.}	;}E}M}^}b}o}�}�}�}�}�}�}&�}8~H~T~q~z~(�~�~
�~�~%�~&)9c#y�������
�#�7�M�_�#c���������'ڀr�u�-������?Ձ	��/�3�
G�R�)X�*��D��*�,�,J�	w�L��΃���
�4$�Y�`�x�%��
����DŽ܄]��XT�����ͅ���#�'�.�:�K�X�\�d�
k�v�z���&��&��ކ��It���Ç
և����.3�b�|���<����=k�Y��R�>V�<��fҊM9�i��F�^8�Y��P�OB�\��S�RC�z��R�'d�3��7��9��?2�/r����;>�Dz�M��O
�7]�I��Bߒ?"�:b�(��Ɠ
ϓړ�����(�=A�S�TӔ"(�3K�D�1ĕH��5?�8u�F��,��8"�+[�7��<��K��=H�<��KØ=�(M�Av�;��2�i'�<��Κ!Ԛ���
�#�2�H�	N�X�v�|��������Ԝ#�
�
� �/�
7�E�V�[�`�%|���
����ɝ؝�����"�/�D�
I�T�j�v���
������ÞԞ؞����E$�j�s�{�
������Ÿɟܟ!��
�(�4�O�V�^�#m�&����ՠ"��)�B�1Q�9����Ρס���
&�4�<�'R�'z�
������/آ�$�B�J��W�ܣ�?�$&�)K�u�~�������Ӥ������/�A�_�
l�	z���
��
������˥�����
/�:�C�
I�T�d�"k���'��ʦݦ!���",� O�p�<��<ɧ!�.(�9W���#��Ш(�� 0�Q�$a�)��f��0�]H�?�����}�-*�JX�?��+�D�>T�=��?ѭA�qS�FŮg�5t�9��3�2�3K�i�3��1�O�a�
i�w�'��C��)��7)�9a�H��n�gS�L��P�DY����R2�y��A��EA�B��sʶ2>�Nq�A����_�=|�l��w'�s��\�9p�U��V�2W�^��r�>\�X��:�L/�L|�Nɽ>��W�C�@$�We�\��3�GN�H��]�Y=�8��<�F
��T�=��T�@m����7R�A��:��0�08�-i�����5��6��<,�8i�6��C��5�3S�g����-
�-8�Ff�����$��2�'7�>_���N����%�,��D���*�3@�	t�	~���7����#����3�R�h�"�������� ����	��'�%9�
_�"j�"��
������#��%�")�L�/b�i��O��L�"g���	�������������1�@�-M�!{���	���������������%�9�X�m�����!��������
��+�;�A�H�M�V�^�n��������3���������
�
����!�&�-�5�:�A�I�O�W�`�m�}�����������2��;��/7�g�5��>��2��,�#J�Vn���)��
�:&�a�)|�������"��

��)(�R�p���0��H������J'�Xr�M��P�Dj�
������
��(��� �/�J�j�'����'��:��2�6A�x���������������$�
<�J�`�w�����$��$��(	�2�R�!n� �����������!�9�>�C�I�
\�j�v�
����������0����>�CM�'��������	������
� �(�;�N�c�s����
����
������A���$�-�D�	Q�[�0n�����5�����-�E�]�a�
h�7s�	����0�����(�@�X�j�q���������������
��(�H�\�t�����D�����+�<�I�N�Q�e�z���������	����&� <�]�
x���������������������/�7O�������������������(�;�A�R�[�r���'��������
�'�/�B�V�f�'��+��;��H�:]�&��5����
��>�	J�&T�h{����#�B�2_�/��$��%��(
�)6�`�$z�2����.��5�1R�o��.��1#�"U�#x�!��"���� �"�)�2�%C�i�r�$����������4��0� O�)p�����
��������#�0*�"[�~�
������&��$�
%�0�7�K�S�\�d�0~�@�����-�:�K�]�f�~�
��������������
�����
1�+?�-k���������������)�;�M�c�u���������!�
�:)�
d�r���+�����
����
��%�*�
/�:�C�H�U�,l���������� �'�/�I�b�
u��������
�!���%�
,�7�3H�Q|���
���P-�~�����*��"�-��&)�1P����������0�*
�-5�c��|�*H�3s�_��:�4B�Dw�&��&��
&�-�<��'@�'
&2"Y"|)�$�$�$#8*\@� �/�2;L	�J�	�M�>59tE�8�E-=s
�:��	

&16GZx���#�
��+)!U
w�	��
�%�C�:	5J	�	�	C�	
�	�	(
.

F
(T
}
�
�
�
�
�
�
�
�

$&5<\���pB
I
R
[
q
�

�
�

�
�
�
�
�

�
8APbov;���
�>�%*.KT	Y
cn�	�
�{�14J,)�,�]aPz>�C
+NCz��!b9�'�C�1*E\<�;�Fb%/�'�*�"(ZKG�.� 6>u�"�*�S�'7	_/i1�:����3i������)};�6�,#GTkt�45Bj@�;�D* io ~� DX!E�!'�!<"uH")�"@�"D)#Qn#[�#3$
P$[$o$x$}$�$"�$�$
�$�$�$7�$<%IQ%�%�%�%�%�%�%�%
�%	&
&&-& B&"c&�&�&.�&*�&D'@G'5�'�'�'�'�'�'(	(
('(7(3J(~(�(�(�(�(#�(
�(�(�() )5)L)P)e)%{)�)�)�)�)�)*h*)�*7�*"�*++&+1B+t+s�+2,6,?,U,a,g,,
�,
�,�,(�,#�,�,
-
-	--7-D-d-�-	�-3�-�-�-�-"�- .5.O.k.p.�.�.�.�.�.�.�.(�.&#/7J/3�/8�/O�//?0/o00�0[�0&,14S10�16�1@�112@N2.�23�2.�2/!3-Q3.3�3�3�34 4&4+4@4P4c4"g4	�4�4�4�4�4�4�4�4�4�4�4�4�4�4�45	5555&5-5&:5a5	g5q54�5�5#�5$�5'6//6M_6O�6S�6Q7]7b7/n71�7�7��7�:�:�:t�:�Q;|�;xv<r�<�b=��=�>5�>"�>S�>�C?A�?c@3t@6�@#�@AAA'ABA#OAsA
�A�A�A	�A�A�A�A�A�AB2BQB#iB�B�B<�BF�B>C,RCC!�C2�C�C�C&D8>DwD �D3�D�D �DE3EFEZE_EuE�E�E�E�E�E�E%�EF5FDF)]F'�F��F4G>CG�G�G[�G		HH.H3HMH\H*bH8�HP�H:I:RIC�I�IW�I)5J_JuJ
�J3�J�J �J�JK
$K/K6KKK�_K��K�L�L�L�L�L,�LMM#M:MGMKM
SM
aMlMpM�M$�M!�M	�M��M^�N	�N�N	O	O%(ONO]O?tO�O�O�O:P�<PE�Pu<Ql�QeRS�Rp�R`JS��STST�T�(U��U~AV��V�TWj�W�DXp�X9ZY>�YS�YO'ZtwZR�Z�?[Z\gw\X�\Z8]A�]Q�]D'^Nl^^�^>_Y_b_t_�_�_�_�_8�_J�_fH`h�`'a5@advaK�a]'b]�bM�bG1c8yc9�c5�ct"dO�d_�dTGeV�eY�eNMf=�ff�fQAgK�g��gRrh�h/�h�hi2iGiSi
hisi�i�i�i�i��i�Ij"k61k
hksk�k�k�k�k�k�k#�k,�k"l)l8lWlrl�l�l�l�l�l�lm
m#m9m
FmTm
hm
vm�m�m�m�m�m�m�mK�mEnNnWngntn
�n�n�n�n"�n�n
oo!o;oCoPo0do7�o�o�o"�op5pLpI`pQ�p�pq q(;qdqkq	q�q�q8�q7�qr*rBrG\r�r�r�r�r��r	�s�sT�s)t#1tUt^tst�t�t�t�t"�t
uu!u>u\uru�u�u�u�u�u�u#v$v@vRvdvxv
�v�v�v�v�v
�v.�vw'wFw]w uw�w#�w#�w#�w:xTVx4�xB�xK#y*oy/�y'�y-�y z'3z[z-pzI�zr�z9[{u�{g|�s|�A}G~sb~S�~R*b}Q�Q2�V��Vۀ�2�f��o�S��V߂N6�N��Oԃ�$�O����"�8�	O�Y�&r�4��G΅@�AW�A��jۆ�F���Pc�n��b#����_,����O"�Xr�Fˋ��G��L�G9��������[&����������D�UȐa�`��D��&����KM�v��\�mm��۔wb�Qڕ�,�o�f[��—�V�?�w �q���
����O�Th�n���,�Q�k5�T�����N��`�If�J��P��6L�����T��^�`s�Sԡ_(�_��K�R4����
�J*�Ju�a��"�A�,`�:��5ȥK��+J�lv�)��
�6��o�Y�q�O��	ۨ	��T��%K�*q���*��0ݩ(�!7�8Y�������)�����*�%C�i�6y�4�����:*�*e�)����9׬w�I��+ӭ9��/9�
i�+w���
����'ή$���3�:@�H{�	įίۯ���
�
 �.�E�X� x�������۰.��$�1�L�c�z�����������	����ұ����D#�h�k�n�q�t�w�z�}���������������������IJͲ޲	�
���
�
�H�Gg�V��>�<E�X��g۴@C�&��1��ݵ+]�2��'��\�A�,^�!��-��۷`�N�_�=u�"��ָ�/�Z�y�|���Y��t��er�bغT;�	��
��	����EŻ��.�(I�%r�.��-ǼC��W9���;�����-�:�T�j�������Ⱦھ��#�3�G�d�(u�.��(Ϳ��'�%>�d��������!�������
!�/�B�Q�b�j�|���C��!�C��K9�9������������
��.�5�G�Y�m�����+�����������W�o�v���������3����8$�+]�������������E��(�4�1N�)������������,��*�1�7�J�]�p�$���� ��#���-�0J�({�+��V��'�+�0�H�`�m�t�y���-��!��/�5�$L�q���������3���-� L�m�s�z�������������5��=
�H�N�U�e�x�������������
��.�=�S�e�6��&����"��"�A�!N�!p���#��.��E��EB�Y��D��,'�;T�����"������/���$���&��1�)@�Aj�@��+��+�'E�/m� ��4��=��$1�6V�D��E����A��<��!6�9X���6����7�<�	C�M�9g�����7�����1�A�XI�C����4�$6�[�	a� k���'��'��<��&-�$T�y���������	��������
���<,�Ti���4����,�=�F�^�
o�}���������
��
������
�'�)>�	h�r�z�"��������	��!��7�9�P�p���!��������$��*�H�Mc�
������-��$�+�;�L�Y�`�e�l����
����	������+���)�	=�#G�k�!����	��!�������+�H�"\�(���/����
��
��	�=!�]_� ��)����%�n;�������=��7$�6\�6��E����.�B�^�Fo�4��@��6,��c�0<�5m�s��L�6d�I��)��(��8�1
�??�O����V��4��>/�*n�'��0��.��*!�7L�+��?��P��8A�@z�G��B�F�SR�	��\��R
�P`�h��Q�fl�M��!�O9�
��������
��������.�5�$L�q���5��
������-�,G�t�&��
�����/�3�N�1_�����c��$�3�9D� ~�
��4������+�H�P�c�}���!��(��O��9��2��	'�1�:�Z�w�	���������������
5�@�X�k����>�����M��M�R�#Y�}�����������
�	������=��0�.�4@�ju��_��T]Y�9NF��g<�#�G�1+R]?�A�M2��,�� %@EX�/�=.l�7�:�n�<m�C�=�39�m�[	A�
 /Mi��6>V;�6�'
j0
��
M9T�M�A*Ll���IX�H.)w>���1bE�L�S'w{,� /
JU
Ze+u�
���F�RbZ�����
 6BI%e:�*��B:aR�K�9;u~�����
��6
R`x	��"����4OSe/}����3�F7�?.N}�0�B�$�AC�A!Np��
��
�1�8 E ` | � � "� � � � L!P!W!m!�!�!�! �!�!�!"")"<"O"b"e"4~";�"f�"JV#P�#g�#7Z$9�$G�$%>�%G�%A&=]&`�&+�&E('+n'9�'9�'G(4V(B�(�(�())&2)Y)a)m)�)�)�)�)	�)�)�)�)�)�)�)�)*
****#***2*8*@*I*M*	V*`*/o*�*�*�*F�*++!+5+H+Ih+Y�+Y,f,u,z,:�,-�,�,��&N���
�{��7����"!t���}�����J���$�����f�D�UJfa��$�t9��yzs����:�����@/!}'nD���m�����W������h%x���=��o�t��.>����&�� gK�\wX���:e��v�U��:j0�6��8��l�fjS�������`�������pY_u�BzR���K�I���A���a���|���{�*��.�*��K��r��<
�u=����2�X�����������93�G�k���B|����T�Br
���mpy���_F+[����4�;j]�Q������wN���y�LQ!���C���	��'�=hNO6�;���!;�I_a�D4 >K/�3i���W�
]��e��u�Z[]|:��}g���?+'��`2z0Q����[!����=tz��72U�~?&1�lc���e`a�T��'���v�+�Dz�lM����&�d�?�yl
UL�o*�����M�1Q���v��5�������|�g$���b�`�Rf�~<N"Y��W���M3g�kW�,�,�J74F������L�4~�M�)��h�x�d���%)qrSvw���50B-W.�b�2��5�g-�<����\1�^�����> <��#�wOh4����J����o9*x�V�FlR�J�ncdu)�#���v���O�+B�)�C��X.���Nr"(�T�Jk^5�7#�F�d/q@�|2p���^ �����0s�x��q�Iaa��O� .����/�,$�$�HG���8
<�=�g��9GlKLrm�n��V��]�A�\Gp�#>����x�B	Y�D�S^01eA�_�P���A?
�8Dy��+�,A#����L@"-E��q�����o1PQRSZf��,�6�{ETA�CX	���~�TV��6>�u4m	}K9kIs��%��3�ro�-�V
���+��u[t[����*{�|`.�8G:�sC
-�]����b0QqS�'`h(1�P��/��5�V�mt�&X����,�R�����b/����<L���������7��H_q:��OjE��Z=C��H	b�����bZ[���U	�H_����*�C�������Y2���iP�)^�;f��6MU�$�wj(3�d7��cI�cG������iFV������n��s;�p
E�h�i-
��\�k��Y��6(]�}{���N�?�Z���9!�{��Zi�w&��Y���>�jd��#���������E%3��nOy"�%���5��i����nx?�Eo�����I�����e���~����H�'�W��^�8����@
c������k�����~�%;\�\P�����������c���T�(SeR�����P�@}�z�Fsmv�MX��p����(�� @�8��H")�"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%1$s has been removed from your cart because it has since been modified. You can add it back to your cart %2$s.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been deactivated because it is not compatible with the current version of Extra Checkout Options.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires %3$sWooCommerce%4$s %5$s or later.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires PHP version %3$s or later.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires WordPress %3$s or later.%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product Options & Add-Ons for WooCommerce.%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please update to the latest version.%s does not exist.%s has been updated.%s have been updated.%s is not a valid image file!%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.%s removed along with all of its associated products!&quot;%1$s&quot; (Instance ID: %2$s)(Copy)(Legacy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAbove fieldAbsolute URLAccordionActionsActivate LicenseAddAdd ConstantAdd Extra OptionAdd Global FormAdd Lookup tableAdd New Global FormAdd New Lookup tableAdd New TemplateAdd TemplateAdd button text on associated productsAdd categories to include all their associated products.Add elementAdd element in a new sectionAdd itemAdd new condition groupAdd option cost to booking display priceAdd sectionAdd separatorAdd the products individually.Add the template you want to display.Add to cartAdd to cart buttonAdd to cart button on floating totals boxAdd translation to %sAdditional Options text replacementAdditional optionsAdvanced displayAdvanced optionsAfterAfter Local OptionsAfter add to cart buttonAfter cart formAfter productAfter product imageAfter product summaryAfter the elementAllAll &quot;%s&quot; Method InstancesAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAlter generated product structured dataAlters the generated product structured data. This may produce wrong results if the options use conditional logic!Always showAlways use unique values on cart for elementsAlways visibleAn error has occurred!An error has occurred! Cannot apply conditions on this element!AnimationAnimation delayAnyAppend new elementsApplied onAprilAre you sure you want to clone this item?Are you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttach the price to the order making it independent of the product quantity.Attach upload files to emailsAttribute LabelAttribute element class nameAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase original price type according toBase priceBeforeBefore Local OptionsBefore add to cart buttonBefore adding Extra Options in this mode, add and save some attributes on the Attributes tab.Before adding Extra Product Options, add and save some attributes on the Attributes tab.Before cart formBefore productBefore product summaryBefore the elementBelow fieldBind repeater with product quantityBottomBottom leftBottom of screenBottom rightBoxBuilderButtonButton AltCDNCSS SettingsCSS codeCalendar close button text replacementCalendar today button text replacementCancelCannot apply rules on this element or section since there are not any value configured elements on other sections, or no other sections found.Cannot deactivate. Purchase code is not valid for your saved license key!CartCart Field DisplayCategoriesCenterChange original product priceChange variation priceChanges product imageChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?Check for empty product priceCheck show quantity selector only for elements with a value.Check this if you use Google Merchant Center. It will hide the price html of the element when you enable its hide price setting.Check this only if you are getting server errors on checkout.Check this to alter the price display of a product when it has extra options with prices.Check this to disable showing description as a tooltip and show it inline instead.Check this to force elements to be full width instead of auto.Check this to globally hide the price display if it is zero.Check this to globally trim zero in prices. This will be applied to native WooCommerce prices as well.Check this to have the plugin set to zero the product price when it is empty.Check this to hide the choice label when using the Show tooltip setting for radio buttons and checkboxes.Check this to include the pricing of the options to the product price.Check this to multiply the prices of the select box options with its quantity selector if any.Check this to show the Final total box only when all required visible options are filled.Check this to show the Final total box only when all visible options are filled.Check this to show the Final total box only when at least one option is filled.Check this to show the add to cart button only when all required visible options are filled.Check this to show the add to cart button only when all visible options are filled.Check this to show the add to cart button only when at least one option is filled.Check this to show the price of the select box options if the price type is fixed and even if the element hides the price.Check this to show the price of the select box options if the price type is fixed.Check to Attach upload files to emails.Check to disable options from being sent to emails.Check to disable scrolling to the element with an errorCheck to disable the conversion to png for image uploads.Check to display the options VAT amount above the options totalCheck to enable legacy meta data functionality.Check to enable the display of extra options on the shop page and category view. This setting is theme dependent and some aspects may not work as expected.Check to enable the display of the undiscounted final totalCheck to enable the inclusion of option prices to the pricing table.Check to enable the use of Jetpack cdn for the plugin images if it is active.Check to enable the use of WP Rocket cdn for the plugin images if it is active.Check to enable validation feature for builder elementsCheck to overwrite the original product price when the price is changing.Check to overwrite the variation price when the price is changing.Check to remove Free price label when product has extra optionsCheck to split items with multiple values to unique lines.Check to strip the html tags from emailsCheckboxCheckboxesCheckedCheckoutChoice labelChoose a valueChoose an optionChoose how the swatch will be displayed.Choose how to determine the decimal separator for user inputsChoose how you want the sign of options prices to be displayed at the product page.Choose how you want the sign of options prices to be displayed in cart and checkout.Choose the image for the lightbox.Choose the image to replace the product image with.Choose the image to use in place of the checkbox when it is checked.Choose the image to use in place of the checkbox.Choose the image to use in place of the radio button when it is checked.Choose the image to use in place of the radio button.Choose the tax class for Fee price type on this element.Choose whether the field will be validated against the choosen method.Choose whether the option is enabled or not.Choose whether the user must fill out this field or not.Choose whether to change the product image.Choose whether to enable the lightbox on the thumbnail.Choose whether to hide the element label in the cart or not.Choose whether to hide the element label in the floating totals box or not.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the cart or not.Choose whether to hide the element value in the floating totals box or not.Choose whether to hide the element value in the order or not.Choose whether to hide the price or not.Choose whether to include tax for Fee price type on this element.Choose whether to redirect to a URL if the option is click.Choose whether to show or hide the attribute name.Choose which %s the date element will use on the backend calculations or leave blank for server timezone.Choose which decimal separator to display on currency pricesClearClear all additional Global formsClear cart buttonClick to toggleClone formClone templateCloning is forbidden.CloseClose allClose button text replacementColorColor pickerColor swatchesComma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!Conditional LogicConnecting to activation server ...ConsentConstant nameConstant valueContentContent colorContent positionCopyCostCould not complete request!Could not update post in the databaseCountCurrent valueCustom Time formatCustom action:Custom codeCustom hookCustom priceCustom price (required)Custom styleCustom typesDEV - multiple filesDateDate fieldDate field and pickerDate formatDate pickerDate picker styleDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDeactivated, but the purchase code was not activated for some reason!DecemberDefaultDefault productDefault valueDefault value is 10Default value is 100DeleteDelete PermanentlyDelete all optionsDelete all options on the productDelete itemDescendingDescriptionDetermine by browser localDigitsDisableDisable AddonsDisable Exclude from Global OptionsDisable Options on Order status changeDisable PNG convert securityDisable Shipping MethodsDisable Shipping Methods ConditionDisable error scrollingDisable lazy load imagesDisable monthsDisable sending the options upon saving the orderDisable this for slow servers or large amounts of images.Disable weekdaysDisabledDisabled datesDisabled roles for this formDiscountDiscount string placementDiscount typeDisplayDisplay a pop-up linkDisplay a prefix label on product page.Display a suffix label on product page.Display asDisplay both signsDisplay only minus signDisplay the add to cart button on floating box.Displayed decimal separatorDivide price with measurementDividerDivider typeDo not change this unless you know how it will affect your site! This is the priority which the post types are loaded by the plugin.DocsDoneDouble click the radio button to remove its selected attribute.Download new version from CodeCanyonDownloading package from Envato market...DropdownDropdown PlaceholderDuplicate ElementDuplicate SectionDynamic Pricing & DiscountsEPO Control PanelEPO custom actionEcho a custom actionEditEdit ElementEdit Global FormEdit Lookup tableEdit Options text replacementEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit tabEdit the %s translationElement Conditional LogicElement ID for xElement ID for yElement class nameElement container idElement idElementsEmailEmpty cartEmpty cart textEnableEnable Exclude from Global OptionsEnable File managerEnable Final total box for all productsEnable Jetpack CDNEnable Shipping MethodsEnable Shipping Methods ConditionEnable WP Rocket CDNEnable alteration of pricing tableEnable checkbox and radio stylesEnable clear options buttonEnable conditional logic for showing or hiding this element.Enable conditional logic for showing or hiding this section.Enable discounts on extra optionsEnable extra options in shop and category viewEnable inline preview of the image that will be uploaded.Enable options VAT displayEnable original final total displayEnable plugin backend interfaceEnable plugin for WooCommerce shortcodesEnable points display?Enable pop-up message on uploadsEnable repeaterEnable shortcodes in options stringsEnable showing option prices in the OrderEnable this at your own risk since it is not possible to calculate option discounts on the Order page.Enable this if the product has a lot of options.Enable this if you are getting a 500 error when trying to complete the order in the checkout.Enable this if you want the options to have responsive display.Enable this if your variable products have a lot of options to improve performance. Note that this may cause issues with discount or currency plugins.Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable this to add any Fees to the unit priceEnable this to add the WooCommerce Price display suffix on the totals box.Enable this to add the WooCommerce tax suffix on the totals boxEnable this to disable lazy loading images.Enable this to display the unit price when the totals box is visibleEnable this to hide the builder tab on the product edit screenEnable this to hide the normal tab on the product edit screenEnable this to hide the settings tab on the product edit screenEnable this to preload the image when using the lightbox feature.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.Enable to have the quantities of the associated products to be a multiple of the main product quantity.Enable to scroll the viewport to the product element.Enable to show the description of the associated product.Enable to show the image of the associated product.Enable to show the meta of the associated product.Enable to show the price of the associated product.Enable to show the quantity string even when the quantity is 1 and when the quantity selector is enabled.Enable to show the title of the associated product.Enable translationsEnable upload success messageEnable validationEnabledEnabled datesEnabled roles for this formEnables a pop-up when uploads are made.Enables or disables extra styling for checkboxes and radio buttons.Enables or disables the clear cart buttonEnables or disables the display of options in the cart.Enables the display of a reset button for this attribute.Enabling this will add the option prices to the calculated booking cost.Enabling this will add the saved addons to the subscription when using the order again functionality manually.Enabling this will allow the use of shortcodes and HTML code in the options label and description text.Enabling this will apply the product discounts to the extra options as well.Enabling this will hide the URL of any uploaded file while in cart and checkout.Enabling this will hide the URL of any uploaded file while in order.Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-safe setting and we recommend to be active.Enabling this will load the plugin files to all WordPress pages. Use with caution.Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected disabled weekdays.Enabling this will multiply the options price by the block count.Enabling this will multiply the options price by the calculated area.Enabling this will multiply the options price by the person count.Enabling this will separate comma separated values for elements. This is mainly used for multiple checkbox choices.Enabling this will show a tooltip over the choice.Enabling this will show the images of elements that have an image replacement.Enabling this will show the uploaded images in cart and checkout.End of the labelEnd yearEnter a CSS selector to override the default label where the discount string will be displayed.Enter a custom id to connect different radio button elements.Enter a message to be used in the pop-up after clicking the add to cart button when there are upload fields.Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for default behaviour.Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.Enter a string to indicate the required state of a field.Enter a text to display after the price for this field or leave it blank for no text.Enter a text to display before the price for this field or leave it blank for no text.Enter a text to indicate that a field is required.Enter a text to replace the Additional options text when using the pop up setting on the cart.Enter a text to replace the Characters remaining text when using maximum characters on a text field or a textarea.Enter a text to replace the Close button text on the calendar.Enter a text to replace the Close button text when using the pop up setting on the cart.Enter a text to replace the Edit options text on the cart.Enter a text to replace the Free price label when product has extra options.Enter a text to replace the Reset options text when using custom variations.Enter a text to replace the Select file text used in the styled upload button.Enter a text to replace the Today button text on the calendar.Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart button  when there are upload fields.Enter a text to replace the add button text on associated products.Enter a text to replace the add text button for repeater fields.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the default pop up button text. This will override the global value.Enter a text to replace the empty cart button text.Enter a text to replace the file text used in the styled upload button.Enter a text to replace the files text used in the styled upload button.Enter a text to replace the message when trying to add a negative priced product to the cart.Enter a text to replace the message when trying to add a zero priced product to the cart.Enter a text to replace the next button text for slider.Enter a text to replace the previous button text for slider.Enter a text to replace the remove button text on associated products.Enter a text to replace the topup section button text. Setting this to %s will make it so that the button text has the section title.Enter a value for the minimum characters the user must enter.Enter a value for the scroll offset when selecting a choice for the product element.Enter a value to be applied to the Quantity field automatically.Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).Enter a value to be applied to the field automatically.Enter a value to limit the maximum characters the user can enter.Enter an extra class name to add to this attribute elementEnter an extra class name to add to this elementEnter an extra class name to add to this sectionEnter an id for the container of the element.Enter ending year.Enter starting year.Enter the Fees total text or leave blank for default.Enter the Final total text or leave blank for default.Enter the Options VAT total text or leave blank for default.Enter the Options total text or leave blank for default.Enter the Sign up fee text or leave blank for default.Enter the Subscription sign up fee text or leave blank for default.Enter the Unit price text or leave blank for default.Enter the Update cart text when you edit a product.Enter the character that will be used to separate field labels from field values in the cart and order.Enter the discount amount.Enter the element id to use for the x column.Enter the element id to use for the y column.Enter the height of the displayed item or leave blank for auto height.Enter the maximum value.Enter the minimum value.Enter the number of Free characters.Enter the number of values for the points display.Enter the placeholder for the dropdown.Enter the price for this field or leave it blank for no price.Enter the quantity step.Enter the sale price for this field or leave it blankto use the default price.Enter the step for the handle.Enter the string that will be used to separate multiple values for a field that allows multiple selections in the cart and order.Enter the time the following format: 8:00 amEnter the width of the displayed item or leave blank for auto width.Enter title hereEnvato Personal TokenEnvato rate limit exceeded! Please try again later.Epo BlackEpo WhiteErrorError connecting to Envato API. Please try again later.Error connecting to server!Error getting data from the server!Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error label placementError on unzipping packageError! Can't connect to filesystemError! Envato API errorEveryoneExact selectionExclude Product(s) from the formExclude ProductsExclude disabledExclude fromExcluded ProductsExlude Addon prices from the discountExpand allExpand and Collapse (start closed)Expand and Collapse (start opened)Export CSVExport formExtra Options placementExtra Options placement custom hookExtra Options placement hook priorityExtra Product Option #%1$s of %2$sExtra Product OptionsExtra Product Options & Add-Ons for WooCommerceExtra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra Checkout Options %s or later!.Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or later.Extra Product Options FeesExtra Product Options Form BuilderExtra Product Options SettingsExtra feeFailed to write file to disk.FebruaryFees amountFees total textField Label/value separatorFile imported with new tables.File imported.File managerFile manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal Total BoxFinal totalFinal total boxFinal total textFixed amountFixed amount + optionsFlat Rates (Legacy)Floating Totals boxFloating Totals box visibilityForce Select OptionsForce Select options textForm draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %s.Form submitted.Form updated.Free Price text replacementFree charactersFree!FridayFromFullsizeGeneralGeneral OptionsGeneral SettingsGlobalGlobal FormGlobal FormsGlobal variablesGlobally override the undo button for radio buttonsGoogle font: on or offonH1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide Builder mode on productsHide Final total box until all elements are chosenHide Final total box until all required elements are chosenHide Final total box until an element is chosenHide Normal mode on productsHide add-to-cart button until all elements are chosenHide add-to-cart button until all required elements are chosenHide add-to-cart button until an element is chosenHide after scrolling the pageHide checkbox element average priceHide choice label when using the Show tooltip setting for radio buttons and checkboxesHide element label in cartHide element label in floating totals boxHide element label in orderHide element price html when hide price setting is enabledHide element value in cartHide element value in floating totals boxHide element value in orderHide extra options in cartHide filtersHide override settings on productsHide priceHide product inHide upload file URL in cart and checkoutHide upload file URL in orderHorizontal ruleHourHow long the animation will take in millisecondsI agree that the license data will be transmitted to the license server.IDIcon tooltip leftIcon tooltip rightIf this is enabled the discount will not be applied to the product addons.If this is enabled the included addons the associated product has will not be displayed.If this is enabled the included product is not shipped with the main product.If this is enabled the included product will add its weight to the main product.If this is enabled the included product will maintain its own price.Image modeImage replacementImage swatchesImport CSVImport one by clicking the button below.Importing csv...Importing dataInclude Fees on unit priceInclude additional Global formsInclude addons on order againInclude option pricing in product priceInclude tax for Fee price typeInclude tax string suffix on totals boxInclude the WooCommerce Price display suffix on totals boxIncrease WidthIndicates if the upload was successful with a message.Inherit product settingInherit product tax classInitializationInline modeInput decimal separatorInvalid CSV file!Invalid CSV file.Invalid CSV table!Invalid action.Invalid data submitted!Invalid data!Invalid date entered!Invalid file extensionInvalid import method used.Invalid request!Invalid year date entered!Item name in quotes&ldquo;%s&rdquo;Items per row (Desktops and laptops)Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)Items per row (Smartphones)Items per row (Tablets landscape)Items per row (Tablets portrait)Items per row (iPhone 5)Items per row (iPhone 6 +)Items per row (iPhone 6)January JavaScript codeJavascript and CSS inclusion modeJulyJuneLabelLabel CSS selectorLabel OptionsLabel colorLabel positionLabel typeLanguageLanguage of this %sLargeLayout modeLeave blank to use the original attribute label.Leave empty for default valueLeave it blank to calculate it automatically from the %s priceLeave it blank to calculate it automatically from the %s sale priceLeave this blank for the default label.LeftLeft of the fieldLeft of the labelLeft sideLegacy meta dataLetters onlyLetters or Space onlyLicenseLicense activated!License activated.License deactivated!Limit selectionLoading ...LocaleLogged in usersLook up tableLookup tableLookup tablesM j, Y @ H:iMaintain weightMake the total price not being multiplied by the product quantityMarchMass addMath Formula ConstantsMath formulaMax valueMaximum charactersMaximum characters for text-field and text-areasMaximum image heightMaximum image widthMaximum number of combinations for price calcualtionsMaximum number of rows is {0}Maximum quantityMaximum selectable dateMaximum selectable timeMayMediumMenu OrderMeta data not correctly saved. Please save the product!Min valueMinimum charactersMinimum characters for text-field and text-areasMinimum number of rows is {0}Minimum quantityMinimum selectable dateMinimum selectable timeMinimum selectionMinuteMissing a temporary folder.MondayMonthMonth - Day - YearMonth . Day . YearMonth / Day / YearMore information about %sMove out of stock messageMove to TrashMulti-Select FieldMultiple field values separatorMultiple files textMultiple minified filesMultiply cost by block countMultiply cost by person countMultiply options cost by areaMultiply prices inside select box choices with its quantity selectorN/ANameNew Global FormNew Lookup tableNew TemplateNextNoNo CSV table found!No Global Form foundNo Global Form found in trashNo Lookup table foundNo Lookup table found in trashNo Template foundNo Template found in trashNo changeNo elements found!No file found.No file was uploaded.No negative priced products textNo saved variations found.No validationNo zero priced products textNo, but hide priceNoneNormalNormal (clear)Normal browser buttonNormal displayNovemberNumberNumber of pointsOctoberOnly enter pure CSS code without and style tagsOnly enter pure JavaScript code without and script tagsOpenOptionOption TemplateOption TemplatesOptions Subscription feeOptions VAT amountOptions VAT total textOptions amountOptions price modeOptions saved!Options total textOrderOrder and EmailsOrder byOriginal product priceOther elementsOverride Final total boxOverride enabled roles for this productOverride global displayOverride product priceOverwrite existing elementsOverwrite existing tablesPaddingParent Global FormParent Lookup tableParent TemplatePercent of the original pricePercent of the original price + optionsPercent of the original price per characterPercent of the original price per character (no first char)Percent of the original price per character (no n-th char and no spaces)Percent of the original price per character (no n-th char)Percent of the original price per wordPercent of the original price per word (no n-th char)Percent of the origιnal pricePercentagePixels amount needed to scrollPlaceholderPlacementPlease activate Extra Product Options.Please check the consent checkbox to give your permission to send your data to the server and try again.Please enter a multiple of {0}.Please enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} character.Please enter at least {0} characters.Please enter no more than {0} character.Please enter no more than {0} characters.Please enter only digits.Please enter only letters or spaces.Please enter only letters, numbers or underscores.Please enter only letters.Please enter only unicode letters and numbers.Please enter only unicode letters, numbers or spaces.Please fill all fields before trying to activate.Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!Please save the form before importing options!Please save the product before importing options!Please select at least {0} choice.Please select at least {0} choices.Please select exactly {0} choice.Please select exactly {0} choices.Please select up to {0} choice.Please select up to {0} choices.Pop upPopulatePopulate optionsPopup section button text replacementPositionPost type hook priorityPost types to show the saved optionsPrefix labelPreload lightbox imagesPremium SupportPrevPrevent adding to the cart negative priced products.Prevent adding to the cart zero priced products.Prevent negative priced productsPrevent options from being sent to emailsPrevent zero priced productsPricePrice TypePrice display overridePrice per IntervalPrice per characterPrice per character (no first char)Price per character (no n-th char and no spaces)Price per character (no n-th char)Price per character (no spaces)Price per rowPrice per wordPrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:Priced individuallyPricingPriorityProductProduct Image replacementProduct element is not supported for components!Product element is not supported within another product element!Product element scroll offsetProduct image replacement modeProduct pageProduct quantityProduct variablesProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity Default valueQuantity max valueQuantity min valueQuantity selectorQuantity stepRadio Button Connector IDRadio button undo buttonRadio buttonsRadio buttons and image at end of the labelRadio buttons and image at start of the labelRandomRangeRange pickerRecalculate image on changesReduce WidthRegularRelative URLRemoveRemove Free price labelRemove button text on associated productsRemove the image.Repeater Button LabelRepeater SettingsRepeater add textRepeater maximum limitRepeater minimum limitReplacement modeRequiredRequired state indicatorRequired state indicator positionReset Options text replacementReset option values after the product is added to the cartReset optionsReset settingsResponsive options structureRetrieve image sizes for image replacementsRightRight of the fieldRight of the labelRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSaving... Please wait.Scroll to the product element upon selectionSearch Global FormSearch Lookup tableSearch TemplateSearch for a category ...Search for a product ...Search for a product&hellip;SecondSectionSection Conditional LogicSection background colorSection class nameSection idSection label background colorSection placementSection pop up button styleSection pop up button textSection styleSection subtitle background colorSection typeSelectSelect BoxSelect a productSelect a style for the checkboxes and radio buttonsSelect a style for the selected border when using image replacements or swatches.Select a template ...Select an image for this term.Select boxSelect boxesSelect categoriesSelect custom file types the user will be allowed to upload separated by commas.Select fileSelect file textSelect file typesSelect how the products will be presented.Select how to display the element.Select how to display your fields in the cartSelect how to include JS and CSS filesSelect how to show the value of the range picker.Select modeSelect optionsSelect productsSelect shipping methods ...Select templateSelect the Extra Options placement hook prioritySelect the Product(s) to apply the optionsSelect the Totals box placement hook prioritySelect the color to use.Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.Select the display type of this attribute.Select the image to replace the product image with.Select the number of pixels the page needs to scroll for the floating totals to become visible.Select the parameter which the products will be sorted by.Select the placement of the Required state indicatorSelect the placement of the discounted string compared to the label.Select the position of the datepicker.Select the position of the timepicker.Select the post types where the plugin will modify the edit order screen to show the saved options. You can type in your custom post type.Select the price mode for the options.Select the product that will be pre-selected.Select the roles that will have access to the extra options.Select the roles that will have access to the plugin settings and the plugin interface while on the edit product page. The Admininstrator role always has access.Select the roles that will not have access to the extra options.Select the shipping methods to disable.Select the shipping methods to enable.Select the size of the datepicker.Select the size of the timepicker.Select the sorting order of the products.Select the theme for the datepicker.Select the theme for the timepicker.Select this section's display style.Select this section's display type.Select this section's pop up button style.Select where this section will appear compared to local Options.Select where to hide the productSelect where you want the Totals box to appear.Select where you want the extra options to appear.Select which file types the user will be allowed to upload.Self modeSelf mode replaces the actual image and Inline appends new image elements.SeptemberSet the image mode that will be used for various image related functionality.Set the max width of the tooltip that appears on the elements.Set the maximum height of the images that appear on cart.Set the maximum number of rows a user can add for the repeater field.Set the maximum width of the images that appear on cart.Set the minimum number of rows a user can add for the repeater field.Set the placement for the validation error notification labelSet to FeeSet to what price types will base their original price on.SettingsSettings:ShadowShipped individuallyShop orderShowShow Final TotalShow Options TotalShow Unit price on totals boxShow attribute nameShow choice description inline.Show descriptionShow filtersShow full width label for elements.Show imageShow image and descriptionShow image and labelShow image replacement in cart and checkoutShow image, label and descriptionShow labelShow label and descriptionShow metaShow only with an action hookShow priceShow prices inside select box choicesShow prices inside select box choices even if the prices are hiddenShow quantity 1Show quantity selector only for elements with a valueShow reset buttonShow responsive valuesShow the Final total box even when the product has no extra optionsShow titleShow tooltipShow uploaded image in cart and checkoutShow using action hooksShow value onShow when the total is greater than zeroSign up feeSign up fee textSingle ProductSingle file textSingle minified fileSizeSlider (wizard)Slider next textSlider previous textSmallSomething went wrong with WordPress.Something went wrong with the request!Sorry, this file type is not permitted for security reasons.Specify the conditions for disabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will not be available for customers to choose during checkout.Specify the conditions for enabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will be available for customers to choose during checkout.SquareSquare 2StandardStart Animation delayStart adding elementsStart of the labelStart yearStep * priceStep valueStringsStrip html from emailsStyleStyle variationsStyled buttonSubscription sign up feeSubscription sign up fee textSubtitleSubtitle colorSubtitle positionSuffix labelSundaySwatch positionSync associated product quantity with main product quantitySystem styleTable indexTable nameTable names are different. Do you want to override the tables?TabsTaxTax class for Fee price typeTemplateTextText AreaText FieldText after PriceText before PriceText lengthText linkText swatchesThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The CSV file is invalid!The delay until the animation starts in millisecondsThe description will appear under the title.The form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The installed version isThe item %s was removed from the cart because it had changed since it was added.The item you are trying to move to the Trash no longer exists.The item you are trying to restore from the Trash no longer exists.The number of options the user has selectedThe number of options the user has selected on the targeted elementThe php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. Please ask your hosting provider to enable this function.The price of the targeted elementThe purchase code is already activated on another domain!The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity for "%1$s" must be greater than %2$sThe quantity for "%s" must be greater than 0 to be added to the cart.The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d.The quantity of this elementThe raw value of the targeted elementThe selected form does not contain any sectionsThe text length of the targeted elementThe total quantity of the targeted elementThe total quantity of this elementThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.The value length of this elementThe value of the targeted element converted to a floatThe value of this elementThemeThere are no saved variations yet.There was an error importing the CSV file.There was an error saving the csv data. Please check the encoding of your csv file!There was an error saving the settings.Thin lineThis allows you to disable all selected months.This allows you to disable all selected weekdays.This allows you to generate points along the range picker.This changes the add to cart button on shop and archive pages to display select options when the product has extra product options. Enabling this will remove the ajax functionality.This controls how your fields are displayed on the front-end. If you choose "Show using action hooks" you have to manually write the code to your theme or plugin to display the fields and the placement settings below will not work. If you use the Composite Products extension you must leave this setting to "Normal" otherwise the extra options cannot be displayed on the composite product bundles. See more at the documentation.This determines the floating totals box visibility.This elementThis field is required textThis field is required.This is a translation ofThis is required on several gallery solutions that change the image html dynamically or if you want to control the image dynamically.This is used to change the product image.This is where you can add new global options to your store.This is where you can add new global template options.This is where you can add new lookup tables.This item has already been deleted.This moves the out of stock message when styled variations are used just below them.This setting controls the maximum number of combinations that the plugin will use to calculate minimum and maximum prices. A higher number of combinations will result in more accurate prices, but it will also take longer to calculate them. For products that can have many choice combinations, it is recommended to set a lower number of combinations to improve performance.This will add a button to clear the selected option.This will count as an empty value in case the element is required.This will divide the original price with the needed measurement.This will enable a floating box to display your totals box.This will enable the default plugin translation using the pot files.This will exclude any global forms assigned to this product except those defined in the previous setting.This will globally override the product price with the price from the options if the total options price is greater then zero.This will hide the average price display on the cart for checkboxes.This will make this element repeatable based on the product quantity.This will make this element repeatable.This will override the display method only for this product.This will override the product price with the price from the options if the total options price is greater then zero.This will override the time format above.This will override the totals box display only for this product.This will override which roles can see the options for this product.This will replace the displayed product price on shop/archive/product loop pages.This will revert the option values to the default ones after adding the product to the cartThis will show a quantity selector for this option.ThumbnailsThumbnails multipleThursdayTimeTime formatTime picker styleTimezone override for Date elementTitleTitle optionsTitle:ToTo find out how to access your purchase code you can %sTo receive automatic updates license activation is required.To translate the strings for the local options please use WPML interface.TodayTooltipTooltip and Left sideTooltip and Right sideTooltip max widthTopTop leftTop of screenTop rightTotalTotal price as Unit PriceTotals box placementTotals box placement custom hookTotals box placement hook priorityTranslationsTrim zeros in pricesTrying to activate from an invalid IP address!Trying to activate from an invalid domain!Trying to activate from outside the plugin interface is not allowed!Trying to activate with an invalid purchase code for your token!Trying to upload files larger than %s is not allowed!TuesdayTurn off persistent cartType:URLUndiscounted product priceUndoUnique meta valuesUnit priceUnit price textUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUpdate cart textUploadUpload button styleUpload element inline Image previewUpload folderUpload managerUpload successfulUploading filesUploading files textUploading message textUrlUse URL replacementsUse WooCommerce valueUse allowed file types from WordPressUse custom imageUse field valueUse global settingUse image lightboxUse internal variation priceUse options cacheUse options caching for boosting performance. Disable if you have options that share the same unique ID.Use plus and minus signs on option pricesUse plus and minus signs on prices in cart and checkoutUse progressive display on optionsUse regular priceUse sale priceUse setting on each productUse the "From" string on displayed product pricesUse the image replacementsUse this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.Use translated values when possible on admin OrderUsernameUsing booking settingValidate asValueVariation #%1$s of %2$sVariation optionsVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView Global FormView Lookup tableView TemplateView cartView detailsVisble after scrolling the pageVisit premium customer supportVisualWednesdayWhether to include specific products or categories.WidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce Measurement CalculatorWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYear - Day - MonthYear - Month - DayYear . Day . MonthYear . Month . DayYear / Day / MonthYear / Month / DayYesYes, but show priceYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item out of the Trash.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can generate an Envato Personal Token by %sYou can only select up to %1$s choice for %2$s.You can only select up to %1$s choices for %2$s.You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot add negative priced products to the cart.You cannot add zero priced products to the cart.You cannot enter more than %1$s characters for "%2$s".You cannot move this item to the Trash. %s is currently editing.You cannot select that date!You have already activated that purchase code on another domain!You have already activated your purchase code!You must enter at least %1$s characters for "%2$s".You must select at least %1$s choice for %2$s.You must select at least %1$s choices for %2$s.You must select exactly %1$s choice for %2$s.You must select exactly %1$s choices for %2$s.Your Envato username.Your files are being uploadedYour settings have been reset.Your settings have been saved.and aautocharacters remainingclick this linkclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thangreater than or equal toh:mh:m:sh:m:ssh:mmh:mm:sh:mm:ssherehh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssisis emptyis notis not emptyjQuery selector for main product imagelabelless thanless than or equal toor register the plugin to receive automatic updates.ppost type general nameGlobal Formspost type general nameLookup tablespost type general nameOption Templatespost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>postsMine <span class="count">(%s)</span>Mine <span class="count">(%s)</span>postsSticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>sign-up feespanstarts withthis field if the following conditions are met.this section if the following conditions are met.timezoneProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:51+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: de_DE
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n != 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
"%s" ist ein Pflichtfeld.%1$s &ndash; %2$s%1$s / %2$s%1$s alle %2$s%1$s wurde aus Ihrem Warenkorb entfernt, da es geändert wurde. Sie können es wieder in Ihren Warenkorb legen %2$s.%1$s Wichtig: %2$s Extra Product Options & Add-Ons für WooCommerce wurde deaktiviert, da es nicht mit der aktuellen Version von Extra Checkout Options kompatibel ist.%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce erfordert %3$sWooCommerce%4$s %5$s oder höher.%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce erfordert die PHP-Version %3$s oder höher.%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce erfordert WordPress %3$s oder höher.%1$s Wichtig:%2$s Bitte führen Sie den WooCommerce-Updater aus, bevor Sie zusätzliche Produktoptionen und Add-Ons für WooCommerce verwenden.%1$s Wichtig:%2$s Ihre Version von WooCommerce Extra Checkout Options wird nicht unterstützt. Bitte aktualisieren Sie auf die neueste Version.%s existiert nicht.Die %s wurde aktualisiert.%s Beiträge aktualisiert.%s ist keine gültige Image-Datei!%s Beitrag in den Papierkorb verschoben.%s Beiträge in den Papierkorb verschoben.%s Beitrag nicht aktualisiert, da er von jemandem bearbeitet wird.%s Beiträge nicht aktualisiert, da sie von jemandem bearbeitet werden.%s Beitrag dauerhaft gelöscht.%s Beiträge dauerhaft gelöscht.%s Beitrag aus dem Papierkorb wiederhergestellt.%s Beiträge aus dem Papierkorb wiederhergestellt.%s Beitrag aktualisiert.%s Beiträge aktualisiert.%s zusammen mit allen zugehörigen Produkten entfernt!&quot;%1$s&quot; (Instanz-ID: %2$s)(Kopie)(Vermächtnis)(kein Titel)(maximale Dateigröße %s)(kein Titel)Eine Anzahl von Tagen -  von heute.ALLE KategorienALLE ProdukteÜber dem FeldAbsolute URLAkkordeonAktionenLizenz aktivierenHinzufügenKonstante hinzufügenZusätzliche Option hinzufügenGlobales Formular hinzufügenNachschlagetabelle hinzufügenNeues globales FormularNeue Nachschlagetabelle hinzufügenNeue Vorlage hinzufügenVorlage hinzufügenHinzufügen von Schaltflächentext zu zugehörigen ProduktenFügen Sie Kategorien hinzu, die alle zugehörigen Produkte enthalten.Element hinzufügenElement in einem neuen Abschnitt hinzufügenFüge Element hinzuNeue Bedingungsgruppe hinzufügenOptionskosten zum Buchungsanzeigepreis hinzufügenAbschnitt hinzufügenTrennzeichen hinzufügenFügen Sie die Produkte einzeln hinzu.Fügen Sie die Vorlage hinzu, die Sie anzeigen möchten.In den WarenkorbZum Warenkorb hinzufügen ButtonIn den Warenkorb-Knopf auf schwimmenden TotalkartonÜbersetzung hinzufügen zu %sZusätzliche Optionen TextersatzZusätzliche OptionenErweiterte AnzeigeErweiterte OptionenNachNach lokalen OptionenNach dem Kauf-ButtonNach dem Warenkorb-FormularNach dem ProduktNach ProduktbildNach der ProduktübersichtNach dem ElementAlleAlle &quot;%s&quot;-MethodeninstanzenZulässige DateitypenAlphanumerischAlphanumerischer UnicodeAlphanumerischer Unicode oder LeerzeichenGenerierte Produktstrukturdaten ändernÄndert die generierten Produktstrukturdaten. Dies kann zu falschen Ergebnissen führen, wenn die Optionen bedingte Logik verwendet!Immer anzeigenGebruik altijd unieke waarden op de winkelwagen voor elementenImmer sichtbarEin Fehler ist aufgetreten!Ein Fehler ist aufgetreten! Auf dieses Element können keine Bedingungen angewendet werden!AnimationAnimationsverzögerung (s)AlleNeue Elemente hinzufügenAngewendet aufAprilWollen Sie diesen Artikel wirklich klonen?Sind Sie sicher, dass Sie diese Datei löschen möchten?Sind Sie sicher, dass Sie diesen Ordner und all seinen Inhalt löschen möchten?Sind Sie sicher, dass Sie diesen Inhalt löschen möchten?Sind Sie sicher, dass Sie diese Option entfernen möchten?Sind Sie sicher, dass Sie die Einstellungen zurücksetzen möchten?AufsteigendFügen Sie den Preis an den Auftrag an, sodass er unabhängig von der Produktmenge ist.Hochgeladene Dateien an E-Mails anhängenAttribut BeschriftungAttribut CSS-KlasseAttribute:Attribute fehlen. Bitte LÖSCHE diese Extra-Option:AugustAuto verstecken Preis, wenn NullWarte auf ProduktbildBasis Original Preis Typ nachBasispreisVorherVor lokalen OptionenVor dem Kauf-ButtonFügen Sie vor dem Hinzufügen zusätzlicher Optionen in diesem Modus einige Attribute auf der Registerkarte Attribute hinzu und speichern Sie sie.Fügen Sie vor dem Hinzufügen zusätzlicher Produktoptionen einige Attribute auf der Registerkarte „Attribute“ hinzu und speichern Sie sie.Vor dem Warenkorb-FormularVor ProduktVor der ProduktübersichtVor dem ElementUnter dem FeldBinden Sie den Repeater mit der ProduktmengeUntenUnten linksUnterer BildschirmrandUnten rechtsBoxBuilderSchaltflächeButton AltCDNCSS-EinstellungenCSS CodeKalender schließen Knopf Textersatz„Kalendar: Heute“-Button-TextAbbrechenDie Regeln sind für dieses Element oder den Abschnitt nicht anwendbar, da mit keinen Wert konfigurierte Elemente auf andere Sektionen oder auf keine anderen Sektionen anwendbar ist.Kann nicht deaktivieren. Kaufcode ist nicht gültig für Ihren gespeicherten Lizenzschlüssel!WarenkorbWarenkorb Field DisplayKategorieZentriertUrrsprünglichen Produktpreis ändernVariationskursProduktbild verändertEine Änderung wird sich nur auf zukünftige Uploads auswirken.Zeichen bleiben TextNa - schummelt da wer ?Auf leeren Produktpreis prüfenCheck Show Mengenauswahl nur für Elemente mit einem Wert.Überprüfen Sie diese Option, wenn Sie das Google Merchant Center verwenden. Es blendet den Preis-HTML des Elements aus, wenn Sie die Einstellung zum Ausblenden des Preises aktivieren.Aktivieren Sie dies nur, wenn Sie Serverfehler an der Kasse erhalten.Überprüfen Sie dies, um die Preisanzeige eines Produktes zu ändern, wenn es zusätzliche Optionen mit Preisen hat.Überprüfen Sie dies, um die Descirption als Tooltip zu deaktivieren und zeigen Sie sie stattdessen inline.Aktivieren Sie diese Option, um zu erzwingen, dass Elemente die volle Breite anstelle von auto haben.Überprüfen Sie dies, um die Preisanzeige global zu verstecken, wenn sie null ist.Überprüfen Sie dies, um die Preise weltweit auf Null zu senken. Dies gilt auch für native WooCommerce-Preise.Aktivieren Sie diese Option, damit das Plugin den Produktpreis auf Null setzt, wenn es leer ist.Aktivieren Sie diese Option, um die Auswahlbeschriftung auszublenden, wenn Sie die Einstellung "QuickInfo anzeigen" für Optionsfelder und Kontrollkästchen verwenden.Überprüfen Sie dies, um die Preise der Optionen auf den Produktpreis zu enthalten.Überprüfen Sie dies, um die Preise der ausgewählten Box-Optionen mit ihrem Mengenwähler zu multiplizieren, falls vorhanden.Aktivieren Sie diese Option, um das Kontrollkästchen Endgültige Summe nur anzuzeigen, wenn alle erforderlichen sichtbaren Optionen ausgefüllt sind.Aktivieren Sie diese Option, um das Kontrollkästchen Endergebnis nur anzuzeigen, wenn alle sichtbaren Optionen ausgefüllt sind.Aktivieren Sie diese Option, um das Kontrollkästchen Endergebnis nur anzuzeigen, wenn mindestens eine Option ausgefüllt ist.Aktivieren Sie diese Option, um die Schaltfläche "In den Warenkorb" nur anzuzeigen, wenn alle erforderlichen sichtbaren Optionen ausgefüllt sind.Aktivieren Sie diese Option, um die Schaltfläche "In den Warenkorb" nur anzuzeigen, wenn alle sichtbaren Optionen ausgefüllt sind.Überprüfen Sie dies, um den Knopf zum Warenkorb anzuzeigen, wenn mindestens eine Option ausgefüllt ist.Überprüfen Sie dies, um den Preis für die ausgewählten Box-Optionen anzuzeigen, wenn der Preistyp festgelegt ist und sogar, wenn das Element den Preis verbirgt.Überprüfen Sie dies, um den Preis der ausgewählten Box-Optionen anzuzeigen, wenn der Preistyp festgelegt ist.Aktivieren um hochgeladene Dateien an Emails anzuhängen.Überprüfen Sie, ob Sie die Optionen nicht an E-Mails senden.Überprüfen Sie, ob Sie das Scrollen auf das Element mit einem Fehler deaktivierenAktivieren wenn Sie alle Bilder beim Upload ins PNG-Format konvertieren wollen.Aktivieren Sie diese Option, um den Mehrwertsteuerbetrag der Optionen über dem Gesamtbetrag der Optionen anzuzeigenAktivieren Sie diese Option, um die Legacy-Metadatenfunktionalität zu aktivieren.Überprüfen Sie, ob Sie die zusätzlichen Optionen auf der Shop-Seite und der Kategorienansicht anzeigen lassen. Diese Einstellung ist thematisch abhängig und einige Aspekte funktionieren vielleicht nicht wie erwartet.Aktivieren Sie diese Option, um die Anzeige der nicht diskontierten Endsumme zu aktivierenAktivieren Sie diese Option, um die Einbeziehung von Optionspreisen in die Preistabelle zu aktivieren..Aktivieren Sie die Verwendung von Jetpack cdn für die Plugin-Bilder, wenn es aktiv ist.Aktivieren Sie die Verwendung von WP Rocket cdn für die Plugin-Bilder, wenn es aktiv ist.Überprüfen, um die Validierung von Bauelementen zu ermöglichenÜberschreiben Sie den ursprünglichen Produktpreis, wenn sich der Preis ändert.Überschreiben Sie den Variationspreis, wenn sich der Preis ändert.Entfernt die Kostenlos Beschriftung wenn eine zusätzliche Option gewählt istAktivieren Sie diese Option, um Elemente mit mehreren Werten in eindeutige Zeilen aufzuteilen.Überprüfen Sie, ob die HTML-Tags aus E-Mails entfernt werdenCheckboxKontrollkästchenAusgewähltKasseAuswahllabelWählen Sie ein WertWählen Sie eine Option ausWählen Sie aus, wie das Farbfeld angezeigt werden soll.Wählen Sie, wie Sie den Dezimalseparator für Benutzereingänge bestimmenWählen Sie, wie Sie möchten, dass das Zeichen der Optionspreise auf der Produktseite angezeigt wird.Wählen Sie, wie Sie möchten, dass das Zeichen der Optionspreise in Warenkorb und Kasse angezeigt wird.Wählen Sie das Bild für die Lightbox.Wählen Sie das Bild, um das Produktbild zu ersetzen.Wählen Sie das Bild aus, das anstelle des Kontrollkästchens verwendet wird, wenn es aktiviert ist.Wählen Sie das Bild, das anstelle des Auswahlfeldes verwendet werden soll.Wählen Sie das Bild aus, das anstelle des Funkknopfes verwendet wird, wenn es aktiviert ist.Wählen Sie das Bild aus, das anstelle des Funkknopfes verwendet wird, wenn es aktiviert ist.Wählen Sie für dieses Element die Steuerklasse für die Gebührenpreis Typ.Wählen Sie aus, ob das Feld mit der gewählten Methode validiert wird.Wählen Sie aus, ob die Option aktiviert ist oder nicht.Wählen Sie, ob der Benutzer dieses Feld ausfüllen muss.Wählen Sie, ob Sie das Produktbild ändern möchten.Wählen Sie, ob beim Klick auf die Miniaturansicht das Bild in voller Größe in der Lightbox angezeigt werden soll.Wählen Sie, ob die Bezeichnung im Warenkorb verborgen oder sichtbar sein soll.Wählen Sie, ob die Bezeichnung in der „Gesamtsumme“-Box verborgen oder sichtbar sein soll.Wählen Sie, ob die Bezeichnung in der Bestellung verborgen oder sichtbar sein soll.Wählen Sie, ob der Preis des Elements im Warenkorb verborgen oder sichtbar sein soll.Wählen Sie, ob der Preis in der „Gesamtsumme“-Box verborgen oder sichtbar sein soll.Wählen Sie, ob der Preis in der Bestellung verborgen oder sichtbar sein soll.Wählen Sie, ob Sie den Preis verstecken möchten oder nicht.Wählen Sie aus, ob für dieses Element eine Steuer für die Gebührenpreis Typ angegeben werden soll.Wählen Sie, ob Sie auf eine URL umleiten möchten, wenn die Option klicken wird.Wählen Sie, ob Sie die den Attributname anzeigen oder ausblenden möchten.Wählen Sie aus, welche %s das Datumselement für die Backend Berechnungen verwenden soll, oder lassen Sie das Feld für die Server Zeitzone leer.Wählen Sie, welcher Dezimalseparator auf den Devisenpreisen angezeigt werden sollLöschenAlle zusätzlichen globalen Formulare entfernenWarenkorb leeren ButtonZum Aus-/Einklappen klickenFormular duplizierenKlonvorlageKlonen ist verboten.SchließenAlle schließen"Schließen"-Button TextFarbeFarbauswahlFarbtubeKomma getrennte Daten nach Ihrem gewählten Datumsformat. (Zwei Ziffern für den Tag, zwei Ziffern für den Monat und vier Ziffern für das Jahr)Komma getrennte Daten nach Ihrem gewählten Datumsformat. (Zwei Ziffern für den Tag, zwei Ziffern für den Monat und vier Ziffern für Jahr). Bitte beachten Sie, dass dies jede andere Einstellung außer Kraft setzt!Bedingte LogikVerbindung zum Aktivierungsserver wird hergestellt ...ZustimmungName einer KonstanteWert einer KonstanteInhaltFarbe InhaltInhalt PositionKopierenKostenKonnte Anfrage nicht fertigstellen!Der Beitrag konnte nicht aktualisiert werdenAnzahlAktueller WertBenutzerdefiniertes ZeitformatBenutzerdefinierte Aktion:Benutzerdefinierter CodeBenutzerdefinierter HookSonderpreisSonderpreis (erforderlich)Benutzerdefinierter StyleBenutzerdefinierte TypenDEV-mehrere DateienDatumDatumsfeldDatumsfeld und PickerDatumsformatDatumsauswahlDatumsauswahl StyleDatumsauswahlDatumsauswahlDatepicker GrößeDatepicker ThemaTagTag - Monat - JahrTag . Monat . JahrTag / Monat / JahrLizenz deaktivierenDeaktiviert, aber der Kaufcode wurde aus irgendeinem Grund nicht aktiviert!DezemberStandardStandardproduktStandardwertDer Standardwert ist 10Standard: 100LöschenDauerhaft löschenAlle Optionen löschenAlle Optionen vom Produkt löschenArtikel löschenAbsteigendBeschreibungBestimmen Sie per Browser vor OrtZiffernDeaktivierenAddons deaktivierenAusschließen von globalen Optionen deaktivierenOptionen zur Änderung des Auftragszustands ausschaltenPNG DeaktivierenVersandarten deaktivierenVersandartenbedingung deaktivierenFehlerscrollen abschaltenLazy load deaktivierenMonate deaktivierenDeaktivieren Sie das Versenden der Optionen beim Speichern der BestellungDeaktivieren Sie diese Option für langsame Server oder große Mengen an Bildern.Wochentage deaktivierenDeaktiviertDeaktivierte Daten (Datum)Rollen für dieses Formular deaktivierenRabattSektionsplatzierungRabattartAnzeigeEinen Pop-up-Link anzeigenEine Präfix-Beschriftung auf der Produktseite anzeigen.Eine Suffix-Beschriftung auf der Produktseite anzeigen.Anzeigen alsBeide Schilder anzeigenNur Minuszeichen anzeigenZeigt die Schaltfläche "in den Warenkorb" auf der schwimmenden Box an.Angezeigter Dezimal-SeparatorPreis mit Messung teilenTrennerTrennbalken TypÄndern Sie dies nicht, es sei denn, Sie wissen, wie es sich auf Ihre Website auswirken wird! Dies ist die Priorität, mit der die Beitragstypen vom Plugin geladen werden.DokumenteErledigtDoppelklicken Sie auf den Radio Button, um sein ausgewähltes Attribut zu entfernen.Neue Version von CodeCanyon herunterladenDownload-Paket von Envato Markt ...DropdownDropdown-PlatzhalterElement duplizierenSection duplizierenDynamische Preise & RabatteEPO-BedienfeldBenutzerdefinierte AktionEine eigene Aktion ausgeben lassenBearbeitenElement bearbeitenGlobales Formular bearbeitenNachschlagetabelle bearbeitenTextersatz bearbeitenAbschnitt bearbeitenVorlage bearbeitenElement bearbeitenOptionen ändernPreis eintragenEinstellungen bearbeitenRegisterkarte BearbeitenBearbeiten Sie die %s -ÜbersetzungElement Konditionelle LogikElement-ID für xElement-ID für yAttribut CSS-KlasseElement Container IDElement-IDElementeE-MailWarenkorb leerenText leeren WagensAktivierenAusschließen von globalen Optionen aktivierenDateimanager aktivierenGesamtsumme für alle Produkte anzeigenJetpack CDN aktivierenVersandarten aktivierenVersandartenbedingung aktivierenWP Rocket CDN aktivierenÄnderung der Preistabelle möglichAktivieren der Kästchenfeld-StylesKlarsicht-Optionen-Taste aktivierenBedingte Logik zum anzeigen oder ausblenden des Elementes.Aktivieren Sie die bedingte Logik, um diesen Abschnitt zu zeigen oder zu verstecken.Ermöglichung von Rabatten auf zusätzliche OptionenZusätzliche Optionen in der Shop-und Kategorienansicht aktivierenAktivieren Sie die Inline Vorschau des Bildes, das hochgeladen werden soll.Optionen für die MwSt.-Anzeige aktivierenAktivieren Sie die ursprüngliche GesamtanzeigePlugin-Backend-Schnittstelle aktivierenPlugin für WooCommerce-Shortcodes aktivierenPunkte aktivieren?Pop-up-Nachricht auf Uploads aktivierenRepeater einschaltenShortcodes in Optionszeichenfolgen aktivierenDeaktivieren Sie das Versenden der Optionen beim Speichern der BestellungAktivieren Sie dies auf eigene Gefahr, da es nicht möglich ist, Optionsrabatte auf der Bestellseite zu berechnen.Aktivieren Sie dies, wenn das Produkt viele Optionen hat.Aktivieren Sie dies, wenn Sie einen 500-Fehler haben, wenn Sie versuchen, die Bestellung in der Kasse abzuschließen.Aktivieren Sie diese Option, wenn Sie möchten, dass die Optionen eine reaktionsschnelle Anzeige haben.Aktivieren Sie diese Option, wenn Ihre variablen Produkte über viele Optionen zur Verbesserung der Leistung verfügen. Beachten Sie, dass dies zu Problemen mit Rabatt- oder Währungs-Plugins führen kann.Aktivieren Sie diese Einstellung, um auf der Produktseite eine Endsummenbox anzuzeigen, in der Kunden die Gesamtkosten ihrer Bestellung einsehen können, oder deaktivieren Sie sie für eine vereinfachte Produktseite.Aktivieren Sie diese Option, um dem Stückpreis Gebühren hinzuzufügenAktivieren Sie diese Option, um das Suffix für die Anzeige des WooCommerce-Preises im Feld "Summen" hinzuzufügen.Aktivieren Sie dies, um das WooCommerce-Steuersuffix in der Summenbox hinzuzufügenAktivieren Sie diese Option, um das verzögerte Laden von Bildern zu deaktivieren.Aktivieren Sie diese Option, um den Stückpreis anzuzeigen, wenn die Gesamtbetrag Box sichtbar istSchakel dit in om het tabblad builder op het productbewerkingsscherm te verbergenSchakel dit in om het normale tabblad op het productbewerkingsscherm te verbergenSchakel dit in om het tabblad Instellingen op het productbewerkingsscherm te verbergenAktivieren Sie dies, um das Bild vorzuladen, wenn Sie die Lightbox-Funktion verwenden.Ermöglichen Sie die Anzeige der umfassenden Produktsumme, um den Kunden einen klaren Überblick über die Gesamtkosten zu geben.Aktivieren Sie diese Option, um die Gesamtsumme speziell für ausgewählte Produktoptionen anzuzeigen.Aktivieren Sie die Option, dass die Mengen der zugeordneten Produkte ein Vielfaches der Hauptproduktmenge sind.Aktivieren Sie diese Option, um das Ansichtsfenster zum Produktelement zu scrollen.Aktivieren Sie diese Option, um die Beschreibung des zugehörigen Produkts anzuzeigen.Aktivieren Sie diese Option, um das Bild des zugehörigen Produkts anzuzeigen.Aktivieren Sie diese Option, um den Meta des zugehörigen Produkts anzuzeigen.Aktivieren Sie diese Option, um den Preis des zugehörigen Produkts anzuzeigen.Aktivieren Sie diese Option, um die Mengenzeichenfolge auch dann anzuzeigen, wenn die Menge 1 ist und die Mengenauswahl aktiviert ist.Aktivieren Sie diese Option, um den Titel des zugehörigen Produkts anzuzeigen.Übersetzungen aktivierenUpload-Erfolgsnachricht aktivierenValidierung aktivierenAktiviertAktivierte Daten (Datum)Rollen für dieses Formular aktivierenErmöglicht ein Pop-up, wenn Uploads gemacht werden.Aktiviert oder deaktiviert den Style für Auswahl- und Schaltkästchen.Aktiviert oder deaktiviert den übersichtlichen Warenkorb-ButtonAktiviert oder deaktiviert die Anzeige von Optionen im Warenkorb.Ermöglicht die Anzeige eines Reset-Buttons für dieses Attribut.Wenn Sie diese Option aktivieren, werden die Optionspreise zu den berechneten Buchungskosten hinzugefügt.Wenn Sie diese Option aktivieren, werden die gespeicherten Addons dem Abonnement hinzugefügt, wenn Sie die Funktion "Erneut bestellen" manuell verwenden.Wenn Sie dies aktivieren, können Shortcodes und HTML-Codes in den Optionsbezeichnungen und Beschreibungstexten verwendet werden.Wenn aktiv, gelten die Produktrabatte ebenfalls für die zusätzlichen Optionen.Wenn Sie dies aktivieren, wird die URL aller hochgeladenen Dateien im Warenkorb und an der Kasse ausgeblendet.Wenn Sie dies aktivieren, wird die URL aller hochgeladenen Dateien in der Bestellung ausgeblendet.Damit verbergen sich die Optionen auf der Produktseite, bis JavaScript initialisiert ist. Dies ist eine ausfallsichere Einstellung, und wir empfehlen, aktiv zu sein.Aktiviert dies wird die Plugin-Dateien auf alle WordPress-Seiten laden. Mit Vorsicht verwenden.Wenn Sie dies aktivieren, wird die setzbare Anzahl der ausgewählten deaktivierten Wochentage durch das Datum "Minimum" und "Maximum" nicht gezählt.Aktiviert wird der Optionen-Preis durch die Anzahl der Personen multiplizieren.Um dies zu ermöglichen, multiplizieren Sie den Optionspreis um den berechneten Bereich.Dies wird den Optionen-Preis mit der Anzahl der Person multiplizieren.Wenn Sie dies aktivieren, werden durch Kommas getrennte Werte für Elemente getrennt. Dies wird hauptsächlich für mehrere Checkboxen verwendet.Wenn Sie dies aktivieren, wird ein Tooltip über der Auswahl angezeigt.Damit werden die Bilder von Elementen angezeigt, die einen Bildersatz haben.Damit werden die hochgeladenen Bilder in Warenkorb und Kasse angezeigt.Ende der BeschriftungEndjahrGeben Sie eine CSS-Selektor-Auswahl ein, um die Standardbeschriftung zu überschreiben, auf der die Rabattzeichenfolge angezeigt wird.Geben Sie eine benutzerdefinierte ID ein, um verschiedene Optionsfeldelemente zu verbinden.Geben Sie eine Nachricht ein, die im Pop-up verwendet werden soll, nachdem Sie auf den Knopf "Zum Warenkorb" geklickt haben, wenn es Upload-Felder gibt.Geben Sie eine Zahl über 0 ein, damit der Benutzer mindestens diese Anzahl von Checkboxen aktiviert, oder lassen Sie das Standardverhalten leer.Geben Sie eine Nummer über 0 ein, um den Benutzer die genaue Anzahl der Checkboxen wählen zu lassen oder für das Standardverhalten leer zu bleiben.Geben Sie eine Nummer über 0 ein, um die Auswahl des Kästchens zu begrenzen, oder lassen Sie sie für das Standardverhalten leer.Geben Sie eine Zeichenkette ein, um den gewünschten Zustand eines Feldes anzuzeigen.Text eingeben der nach dem Preis angezeigt werden soll oder für keinen Text einfach Leer lassen.Text eingeben der vor dem Preis angezeigt werden soll oder für keinen Text einfach Leer lassen.Geben Sie einen Text ein, der anzeigt, dass ein Feld benötigt wird.Geben Sie einen Text ein, um den Text der zusätzlichen Optionen zu ersetzen, wenn Sie die Pop-up-Einstellung auf dem Warenkorb verwenden.Geben Sie einen Text ein, um den verbleibenden Text der Zeichen zu ersetzen, wenn Sie maximale Zeichen auf einem Textfeld oder einem Textbereich verwenden.Geben Sie einen Text ein, um den Text "Schließen" im Kalender zu ersetzen.Geben Sie einen Text ein, um den Knopffetext zu ersetzen, wenn Sie die Pop-Up-Einstellung auf dem Warenkorb verwenden.Geben Sie einen Text ein, um den Text der Optionen Bearbeiten auf dem Warenkorb zu ersetzen.Geben Sie einen Text ein, um das Gratis-Preisetikett zu ersetzen, wenn das Produkt zusätzliche Optionen hat.Geben Sie hier den Text an, um den „Optionen zurücksetzten“-Text zu ersetzen, wenn benutzerdefinierte Variationen benutzt werden.Geben Sie einen Text ein, der den Text "Dateien auswählen" ersetzt, der in der gestylten Upload-Button verwendet wird.Geben Sie einen Text ein, um den „Heute“-Button-Text im Kalender zu ersetzen.Geben Sie einen Text ein, um den Text des Upload-Dateien zu ersetzen, der im Pop-up verwendet wird, nachdem Sie auf den Knopf "Hinzufügen" zum Warenkorb klicken, wenn es Upload-Felder gibt.Geben Sie einen Text ein, der den Text der Schaltfläche "Hinzufügen" für verknüpfte Produkte ersetzen soll.Geben Sie einen Text ein, der die Schaltfläche "Text hinzufügen" für Repeater-Felder ersetzen soll.Geben Sie einen Text ein, um den Text, der in den Warenkorb-Knopf aufgenommen wird, zu ersetzen, wenn Sie die Option "Auswahl verwenden" verwenden.Geben Sie einen Text ein, der den standardmäßigen Popup-Schaltflächentext ersetzen soll. Dadurch wird der globale Wert überschrieben.Geben Sie einen Text ein, um den leeren Warenknopf zu ersetzen.Geben Sie einen Text ein, der den Text "Dateien auswählen" ersetzt, der in der gestylten Upload-Button verwendet wird.Geben Sie einen Text ein, der den Dateitext ersetzt, der in der formatierten Upload-Schaltfläche verwendet wird.Geben Sie einen Text ein, ersetzen Sie die Nachricht, wenn Sie versuchen, dem Warenkorb ein Produkt zum negativen Preis hinzuzufügen.Geben Sie einen Text ein, ersetzen Sie die Nachricht, wenn Sie versuchen, dem Warenkorb ein Produkt mit einem Nullpreis hinzuzufügen.Geben Sie einen Text an, um den Button-Text für den nächsten Slider ersetzen.Geben Sie einen Text ein, um den Button-Text für den vorherigen Slider zu ersetzen.Geben Sie einen Text ein, der den Text der Schaltfläche "Entfernen" bei zugeordneten Produkten ersetzen soll.Geben Sie einen Text ein, der den Schaltflächentext für den Aufladebereich ersetzen soll. Wenn Sie dies auf %s setzen, wird der Schaltflächentext mit dem Abschnittstitel versehen.Geben Sie einen Wert für die Mindestzeichen ein, die der Benutzer eingeben muss.Geben Sie einen Wert für den Scroll-Versatz ein, wenn Sie eine Auswahl für das Produktelement auswählen.Geben Sie einen Wert ein, der automatisch auf das Menge Feld angewendet werden soll.Gebe einen Wert ein, der entsprechend dem gewählten Datumsformat automatisch auf das Feld angewendet werden soll. (Zwei Ziffern für Tag, zwei Ziffern für Monat und vier Ziffern für Jahr).Geben Sie automatisch einen Wert ein, der auf das Feld angewendet werden soll.Geben Sie einen Wert ein, um die maximalen Zeichen zu begrenzen, die der Benutzer eingeben kann.Geben Sie einen zusätzlichen Class Namen für dieses Attributelement einGeben Sie einen Namen der Extraklasse ein, um dieses Element hinzuzufügenGeben Sie einen Namen der Extraklasse ein, um sie diesem Abschnitt hinzuzufügenGeben Sie eine ID für den Container des Elements ein.Geben Sie das Ende des Jahres.Geben Sie das Startjahr ein.Geben Sie den Gesamttext der Gebühren ein oder lassen Sie sie standardmäßig leer.Geben Sie den Final-Gesamttext ein oder lassen Sie den Text für die Standardeinstellung leer.Geben Sie den Text Optionen MwSt.-Gesamtbetrag ein, oder lassen Sie das Feld für Standard leer.Geben Sie den Gesamttext der Optionen ein oder lassen Sie sie standardmäßig leer.Geben Sie den Text für die Anmeldegebühr ein, oder lassen Sie sie für den Standardwert leer.Geben Sie den Gebührentext für das Abonnement ein oder lassen Sie ihn für den Standard leer.Geben Sie den Text der Einheit und lassen Sie die Standardeinstellung leer.Geben Sie den Text "Warenkorb aktualisieren" ein, wenn Sie ein Produkt bearbeiten.Geben Sie das Zeichen ein, das verwendet wird, um Feldbeschriftungen von Feldwerten im Warenkorb und in der Bestellung zu trennen.Geben Sie den Rabattbetrag ein.Geben Sie die Element-ID ein, die für die x-Spalte verwendet werden soll.Geben Sie die Element-ID ein, die für die Y-Spalte verwendet werden soll.Geben Sie die Höhe des angezeigten Gegenstandes ein oder lassen Sie die automatische Höhe leer.Geben Sie den Maximalwert ein.Geben Sie den Mindestwert ein.Geben Sie die Anzahl der Gratis-Zeichen ein.Geben Sie die Anzahl der Werte für die Punkteanzeige ein.Geben Sie den Platzhalter für die Dropdownliste ein.Geben Sie den Preis für dieses Feld ein oder lassen Sie es kostenlos leer.Geben Sie die Menge für einen Schritt ein.Geben Sie den Verkaufspreis für dieses Feld ein oder lassen Sie es leer, um den Standardpreis zu verwenden.Geben Sie den Schritt für den Griff ein.Geben Sie die Zeichenfolge ein, die verwendet wird, um mehrere Werte für ein Feld zu trennen, das eine Mehrfachauswahl im Warenkorb und in der Bestellung zulässt.Geben Sie die Uhrzeit in folgendem Format ein: 8:00 amGeben Sie die Breite des angezeigten Gegenstandes ein oder lassen Sie Leerzeichen für die automatische Breite.Geben Sie den Titel einIhr Envato Personal TokenEnvato-Szins-Grenze überschritten! Bitte versuchen Sie es später noch einmal.Epo BlackEpo WhiteFehlerFehler bei der Verbindung zu Envato API. Bitte versuchen Sie es später noch einmal.Fehler bei der Verbindung zum Server!Fehler beim Erhalten von Daten vom Server!Fehler beim Löschen.Fehler beim Verschieben in den Papierkorb.Fehler beim Wiederherstellen aus dem Papierkorb.Fehler bei der Platzierung von EtikettenFehler beim Auspacken des ArchivsFehler! Kann keine Verbindung zum Dateisystem herstellenFehler! Envato API FehlerJederExakte AuswahlProdukt(e) aus dem Formular ausschließenProdukte ausschliessenAusgeschlossen deaktiviertVon globalenAusgeschlossene ProdukteAddon-Preise vom Rabatt ausschließenAlle aufklappenErweitern und Reduzieren (standardmäßig geschlossen)Erweitern und Reduzieren (standardmäßig geöffnet)Exportiere CSVDieses Formular exportierenExtra-Options-PlatzierungZusätzliche Optionen Platzierung benutzerdefinierter HookExtra-Optionen Platzierung Hook-PrioritätZusätzliche Produktoption #%1$s von %2$sZusätzliche ProduktoptionenZusätzliche Produktoptionen und Add-Ons für WooCommerceZusätzliche Produktoptionen und Add-Ons für WooCommerce erfordern WooCommerce Extra Checkout Options %s oder höher!.WooCommerce TM Extra-Produktoptionen erfordert WordPress %s oder später.Gebühren für zusätzliche ProduktoptionenFormular-Tool zum Erstellen zusätzlicher ProduktoptionenEinstellungen für zusätzliche ProduktoptionenZusatzgebührDas Speichern der Datei ist fehlgeschlagen.FebruarFester BetragGebühren GesamttextTrennzeichen für Feldbeschriftung/WertDatei mit neuen Tabellen importiert.Datei wurde importiert.DateimanagerDer Dateimanager wird auf Ihrem Server nicht unterstützt.Das Hochladen der Datei wurde aufgrund der Dateierweiterung abgebrochen.DateinameFiltern nachEndgültige GesamtboxGesamtsummeGesamtsumme-Box"Gesamtsumme" TextFester BetragFeste Menge + OptionenFlatrates (Legacy)„Gesamtsumme“-Box fließendFloating Totals Box SichtbarkeitJetzt GestaltenOptionen aktivierenFormularentwurf aktualisiert.Formular veröffentlicht.Formular wiederhergestellt zur Revision von %sGespeichert.Formular geplant für: %s.Formular übermittelt.Formular aktualisiert."Kostenlos" TextGratischarsGratis!FreitagVonFullsizeAllgemeinAllgemeine OptionenAllgemeine EinstellungenGlobalGlobales FormularGlobal FormsGlobale VariablenÜberschreiben Sie global den Rückgängig Button für Radio ButtonsanH1H2H3H4H5H6H:iH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssKopfzeilen FarbeKopfpositionKopftitelHeader-TypÜberschriftHöheVersteckenDen "Formular-Builder"-Modus auf Produktseiten nicht anzeigen/versteckenBlenden Sie das Feld "Endsumme" aus, bis alle Elemente ausgewählt sindBlenden Sie das Feld "Endsumme" aus, bis alle erforderlichen Elemente ausgewählt sindFeld "Endergebnis" ausblenden, bis ein Element ausgewählt istDen "normalen Modus" auf Produkten nicht anzeigen/versteckenBlenden Sie die Schaltfläche "In den Warenkorb" aus, bis alle Elemente ausgewählt sindBlenden Sie die Schaltfläche "In den Warenkorb" aus, bis alle erforderlichen Elemente ausgewählt sindÖffnen Sie den Add-to-Cart-Button, bis eine Option gewählt istAusblenden nach dem Scrollen der SeiteVerstecken Sie das Kästchen "Durchschnittspreis"Ausblenden der Auswahlbeschriftung bei Verwendung der Einstellung "QuickInfo anzeigen" für Optionsfelder und KontrollkästchenElement Beschriftung im Warenkorb verbergenBezeichnung in der „Gesamtsumme“-Box verbergenBezeichnung in der Bestellung verbergenElement price html ausblenden, wenn die Einstellung zum Ausblenden des Preises aktiviert istPreis im Warenkorb verbergenPreis in der „Gesamtsumme“-Box verbergenPreis in der Bestellung verbergenZusätzlichen Optione im Warenkorb versteckenFilter ausblendenDie Einstellungen zum "Override" (Überschreiben der Einstellungen) auf Produktseiten versteckenPreis ausblendenProdukt ausblenden inURL der Upload-Datei im Warenkorb und an der Kasse ausblendenHochgeladenen Dateipfad versteckenHorizontal RegelStundeWie lange die Animation in Millisekunden dauertIch bin damit einverstanden, dass die Lizenzdaten an den Lizenzserver übermittelt werden.IDIcon-Tooltip linksIcon-Tooltip rechtsWenn diese Option aktiviert ist, wird der Rabatt nicht auf die Produkt-Addons angewendet.Wenn diese Option aktiviert ist, werden die mitgelieferten Addons, die das zugehörige Produkt hat, nicht angezeigt.Wenn diese Option aktiviert ist, wird das mitgelieferte Produkt nicht mit dem Hauptprodukt geliefert.Wenn dies aktiviert ist, wird das mitgelieferte Produkt dem Hauptprodukt sein Gewicht hinzufügen.Wenn dies aktiviert ist, behält das mitgelieferte Produkt seinen eigenen Preis bei.BildmodusBildersatzBildtuareCSV-Datei importierenImportieren Sie einen, indem Sie auf die Schaltfläche unten klicken.Importiere csv...Importiere DatenGebühren für StückpreisZusätzliche globale Formulare einbindenAddons auf Bestellung wieder beilegenOptionspreis in den Produktpreis einschließenSteuern für Gebührenpreis Typ einschließenFügt einen „inkl. MwSt“-Suffix der „Gesamtsumme“-Box hinzuFügen Sie das Suffix für die Anzeige des WooCommerce-Preises in das Feld "Summen" einErhöhen Sie die BreiteGibt an, ob der Upload mit einer Nachricht erfolgreich war.Produkteinstellungen vererbenProduktsteuerklasse erbenInitialisierungInline-ModusEingangsdezimalabscheiderUngültige CSV-Datei!Ungültige CSV-Datei.Ungültige CSV-Tabelle!Aktion ungültig.Ungültige Daten eingereicht!Ungültige Daten!Ungültiges Datum eingegeben!Ungültige DateiendungUngültige Importmethode verwendet.Ungültige Anfrage!Ungültiges Jahr eingegeben!&ldquo;%s&rdquo;Artikel pro Reihe (Desktops und Laptops)Elemente pro Zeile (Galaxy Tablets Querformat)Gegenstände pro Reihe (Samnsung Galaxy)Artikel pro Reihe (Smartphones)Elemente pro Zeile (Tablets Querformat)Elemente pro Zeile (Tablets Porträt)Artikel pro Reihe (iPhone 5)Artikel pro Reihe (iPhone 6 +)Artikel pro Reihe (iPhone 6)Januar JavaScript CodeJavaScript und CSS Aufnahme ModusJuliJuniBeschriftungBeschriftungsfarbeLabeloptionenBeschriftungsfarbeLabel PositionBeschriftung TypSpracheSprache dieser %sGroßLayout ModusFreilassen, um die urspüngliche Attribut-Bezeichnung zu verwenden.Für den Standardwert leer lassenLassen Sie es leer, um es automatisch aus dem %s Preis zu berechnenLassen Sie es leer, um es automatisch aus dem %s Verkaufspreis zu berechnenLassen Sie dieses Feld für die Standardbezeichnung leer.LinksLinks des FeldesLinks vom LabelLinke SeiteLegacy-MetadatenNur BriefeNur Buchstaben oder LeerzeichenLizenzLizenz aktiviert!Lizenz aktiviert.Lizenz deaktiviert!Auswahl einschränkenWird geladen ...LokalInhalt verfügbar für angemeldete BenutzerTabelle nachschlagenSuchtabelleNachschlagetabellenM j, Y @ H:iGewicht haltenStellen Sie sicher, dass der Gesamtbetrag nicht mit der Produktmenge multipliziert wirdMartieMassenzugabeMathematische FormelkonstantenMathematische FormelMaximum WertMax. ZeichenMaximale Zeichenzahl für Textfeld und TextbereicheMax. BildhöheMax. BildbreiteMaximale Anzahl von Kombinationen für PreisberechnungenDie maximale Anzahl von Zeilen beträgt {0}MaximummengeMaximal wählbares DatumMax. auswählbare ZeitMaiMittelMenüreihenfolgeMetadaten nicht korrekt gespeichert. Bitte speichern Sie das Produkt!MinimalwertMindestanzahl von ZeichenMindestzeichenzahl für Textfeld und TextbereicheDie Mindestanzahl der Zeilen beträgt {0}MindestmengeMin. auswählbares DatumMin. auswählbare ZeitMindestauswahlMinuteEin temporärer Ordner wurde nicht gefunden.MontagMonatMonat - Tag - JahrMonat . Tag . JahrMonat / Tag / JahrWeitere Informationen zu %sVerschiebe die "Ausverkauft"-MeldungIn den Papierkorb verschiebenWählen Sie das Feld Mehrere ausTrennzeichen für mehrere FeldwerteText in mehreren DateienMehrere minifizierte DateienKosten mit Anzahl der Zeiträumen multiplizierenKosten mit Personenanzahl multiplizierenMultiplizierte Optionen kosten nach FlächeMultiplizieren Sie Preise innerhalb der Auswahl der Box mit seiner Quantität SelektorN/ANameNeues globales FormularNeue NachschlagetabelleNeue VorlageWeiterNeinKeine CSV-Tabelle gefunden!Kein globales Formular gefundenKein globales Formular im Papierkorb gefundenKeine Nachschlagetabelle gefundenKeine Nachschlagetabelle im Papierkorb gefundenKeine Vorlage gefundenKeine Vorlage im Papierkorb gefundenKeine ÄnderungKeine Elemente gefunden!Keine Datei gefunden.Keine Datei wurde geladen.Negative Preise verhindernEs wurden keine gespeicherten Variationen gefunden.Keine BestätigungKeine Null Produkt Preise TextAuto verstecken Preis, wenn NullKeineNormalNormalNormaler Browser-ButtonNormales DisplayNovemberNummerAnzahl der PunkteOktoberGeben Sie nur reinen CSS-Code ohne und Style-Tags einGeben Sie nur reinen JavaScript-Code ohne und Skript-Tags einOffenOptionOptions-VorlageOptionen TemplatesAbonnement-GebührOptionen MwSt.-BetragOptionen MwSt.-GesamttextZusatzoptionenOptionspreis-ModusOptionen gespeichert!„Optionensumme“-TextBestellungBestellung und E-MailsSortieren nachOriginal-ProduktpreisSonstige ElementeÜbersteuerung Endsumme BoxÜberschreiben ermöglichte Rollen für dieses ProduktÜberschreiben Sie die globale AnzeigeProduktpreis überschreibenBestehende Elemente überschreibenVorhandene Tabellen überschreibenInnenabstandÜbergeordnetes globales FormularÜbergeordnete NachschlagetabelleÜbergeordnete VorlageProzent des ursprünglichen PreisesProzent des ursprünglichen Preises + OptionenProzent des ursprünglichen Preises pro Zeichen (kein erstes Zeichen)Prozent des ursprünglichen Preises pro Zeichen (kein erstes Zeichen)Prozent des ursprünglichen Preises pro Zeichen (kein n-tes Zeichen und ohne Leerzeichen)Prozent des ursprünglichen Preises pro Zeichen (kein n-tes Zeichen)Prozent des ursprünglichen Preises pro WortProzent des ursprünglichen Preises pro Wort (no n-th char)Prozent des Original-PreisesProzentsatzZum Scrollen benötigte PixelmengePlatzhalterPlatzierungBitte aktivieren Sie die Extra Produktoptionen.Bitte aktivieren Sie das Kontrollkästchen für die Einwilligung, um Ihre Einwilligung zum Senden Ihrer Daten an den Server zu erteilen, und versuchen Sie es erneut.Bitte mehr eingeben als {0}.Bitte geben Sie eine gültige URL ein.Bitte geben Sie eine gültige E-Mail-Adresse ein.Bitte geben Sie eine gültige Nummer ein.Bitte geben Sie einen Wert ein, der größer oder gleich {0} ist.Bitte geben Sie einen Wert ein, der kleiner oder gleich {0} ist.Bitte geben Sie mindestens {0} Zeichen ein.Bitte geben Sie mindestens {0} Zeichen ein.Bitte geben Sie nicht mehr als {0} ein.Bitte geben Sie nicht mehr als {0} Zeichen ein.Bitte geben Sie nur Ziffern ein.Bitte geben Sie nur Buchstaben oder Leerzeichen ein.Bitte geben Sie nur Buchstaben, Zahlen oder Unterstriche ein.Bitte geben Sie nur Buchstaben  ein.Bitte geben Sie nur Unicode Buchstaben und Zahlen ein.Bitte geben Sie nur Unicode-Buchstaben, Zahlen oder Leerzeichen ein.Bitte füllen Sie alle Felder aus, bevor Sie versuchen zu aktivieren.Bitte beachten Sie, dass Sie, wenn sich die Optionen auf der Bestellung ändern oder gelöscht werden, falsche Ergebnisse erzielen, indem Sie dies aktivieren!Bitte speichern Sie das Formular, bevor Sie Optionen importieren!Bitte speichern Sie das Produkt vor dem Import von Optionen!Bitte wählen Sie mindestens {0}.Bitte wählen Sie mehr als {0} Auswahlmöglichkeiten aus.Bitte wählen Sie genau {0}.Bitte wählen Sie exakt {0} Auswahlmöglichkeiten aus.Bitte wählen Sie bis zu {0}.Bitte wählen Sie bis zu {0} Auswahlmöglichkeiten aus.Pop-UpBefüllenOptionen veröffentlichenTextersetzung für die Schaltfläche des Popup-AbschnittsPositionPriorität des BeitragstypsBeitragstypen, um die gespeicherten Optionen anzuzeigenPräfix-BeschriftungVorladen von Lightbox-BildernPremium-SupportZurückVerhindern Sie, dass Waren mit negativen Preisen in den Warenkorb gelegt werden können.Verhindern, dassProdukte mit "Null-Preis"  in den Warenkorb kommen.Negative Preise verhindernVerhindern, dass Optionen an E-Mails gesendet werdenProdukte mit "Null-Preis" verhindernPreisPreis TypÜberschreibung der PreisanzeigePreis pro IntervallPreis pro Zeichen (kein erstes Zeichen)Preis pro Zeichen (kein erstes Zeichen)Preis pro Zeichen (kein n-tes Zeichen und keine Leerzeichen)Preis pro Zeichen (kein n-tes Zeichen)Preis pro Zeichen (ohne Leerzeichen)Preis pro ReihePreis pro WortPreis pro Wort (no n-th char)%1$s &ndash; %2$s%1$s&ndash;%2$sPreis-TypPreis:Preislich individuellPreisePrioritätProduktProduktbild ErsatzDas Produktelement wird für Komponenten nicht unterstützt!Das Element Produkt wird innerhalb eines anderen Element Produkt nicht unterstützt!Produktelement BildlaufversatzMit diesem Modus kann das Produktbild ersetzt werdenProduktseiteProduktmengeProduktvariablenProdukteProdukte und KategorienVeröffentlichenLizenz - CodeMengeMengeMenge Standard WertMenge max WertMenge min WertMengenauswahlMengenschrittOptionsfeld-Konnektor-IDAuswahlknopf Undo-KnopfRadio ButtonsFunkknöpfe und Bild am Ende des LabelsFunktasten und Bild beim Start des LabelsZufälligBereichBereichsauswahlBild bei Änderungen neu berechnenBreite reduzierenRegulärRelative URLEntfernenKostenloses Preisschild entfernenSchaltflächentext auf zugehörigen Produkten entfernenDieses Bild entfernen.Beschriftung der Repeater-TasteRepeater-EinstellungenRepeater Text hinzufügenMaximale Grenzwerte für RepeaterMindestgrenze für RepeaterErsatzmodusErforderlichErforderlicher staatlicher IndikatorErforderliche staatliche IndikatorpositionOptionen Textersatz setzenOptionswerte zurücksetzen, nachdem das Produkt in den Warenkorb gelegt wurdeZurücksetzenEinstellungen zurücksetzenResponsive OptionsstrukturAbrufen von Bildgrößen für BildersetzungenRechtsRechts vom FeldRechts vom LabelRechte SeiteRollenRundRund 2Updater ausführenArtikelnummer:SaleAngebotspreisSamstagSpeichernÄnderungen speichernSpeichern… Bitte warten.Scrollen Sie bei Auswahl zum ProduktelementGlobales Formular suchenSuch-Lookup-TabelleSuchseiteSuchen Sie nach einer Kategorie ...Suche nach einem Produkt ...Nach einem Produkt suchen&hellip;SekundeAbschnittBedingungslogik dieses SbschnittsBereich-HintergrundfarbeName der SektionsklasseAbschnitt IDHintergrundfarbe der AbschnittsbeschriftungSektionsplatzierungAbschnitt Popup-Schaltfläche StilPopup-Schaltflächentext für AbschnitteAbschnitt-StilHintergrundfarbe des Untertitels des AbschnittsSektionstypAuswählenAuswahlboxWählen Sie ein ProduktSelecteer een stijl voor de selectievakjes en de keuzerondjesWählen Sie einen Stil für den Rahmen, bei Verwendung des Bildaustausches oder Bild-Feldern.Wählen Sie eine Vorlage aus ...Wählen Sie ein Bild für diesen Begriff.Auswahl BoxBoxen auswählenKategorien auswählenWählen Sie benutzerdefinierte Dateitypen aus, die der Benutzer für den Upload durch Kommas freigesetzt wird.Datei auswählenDatei Text auswählenDatei Typ auswählenWählen Sie aus, wie die Produkte präsentiert werden sollen.Wählen Sie aus, wie das Element angezeigt werden soll.Wählen Sie, wie Sie Ihre Felder im Warenkorb anzeigenWählen Sie, wie JS und CSS-Dateien aufgenommen werdenWählen Sie, wie der Wert des Bereich-Wählers angezeigt werden soll.AuswahlmodusOptionen wählenProdukte auswählenVersandarten auswählen ...Template wählenWählen Sie die Platzierung Hook Priorität für zusätzliche OptionenWählen Sie die Produkte, um die Optionen anzuwendenWählen Sie die Gesamtbetrag Box Platzierung Hook Priorität ausWählen Sie die Farbe aus, die Sie verwenden möchten.Wählen Sie den Rabatt Typ. Der Rabatt gilt für den Endproduktpreis. Wenn das Produkt über zusätzliche Optionen verfügt, gilt der Rabatt für den Betrag, nachdem die Optionen zum Produktpreis hinzugefügt wurden.Wählen Sie den Anzeigetyp dieses Attributs aus.Wählen Sie das Bild, um das Produktbild zu ersetzen.Wählen Sie die Anzahl der Pixel aus, die die Seite scrollen muss, damit der schwebende Gesamtbetrag sichtbar wird.Wählen Sie den Parameter aus, nach dem die Produkte sortiert werden sollen.Selecteer de plaats van de vereiste toestandsindicatorSelecteer de plaats van de afgeprijsde string ten opzichte van het label.Wählen Sie die Position des DatePickers.Wählen Sie die Position des Timeickers.Wählen Sie die Beitragstypen aus, bei denen das Plugin den Bildschirm zum Bearbeiten der Reihenfolge ändert, um die gespeicherten Optionen anzuzeigen. Sie können Ihren benutzerdefinierten Beitragstyp eingeben.Wählen Sie den Preismodus für die Optionen aus.Wählen Sie das Produkt aus, das vorab ausgewählt werden soll.Wählen Sie die Berechtigungsgruppen aus, die Zugriff auf diese Optionen haben.Wählen Sie die Rollen aus, die Zugriff auf die Plugin-Einstellungen und die Plugin-Oberfläche haben, während Sie sich auf der Seite "Produkt bearbeiten" befinden. Die Rolle "Admininstrator" hat immer Zugriff.Wählen Sie die Berechtigungsgruppen aus, die keinen Zugriff auf diese Optionen haben.Wählen Sie die zu deaktivierenden Versandarten aus.Wählen Sie die Versandarten aus, die Sie aktivieren möchten.Wählen Sie die Größe der Datumsanzeige.Wählen Sie die Größe des Timeickers.Wählen Sie die Sortierreihenfolge der Produkte.Wählen Sie ein Design für den Datumswähler.Wählen Sie das Thema für den Timepicker.Wählen Sie den Darstellungsstil dieses Abschnitts aus.Wählen Sie den Anzeigetyp dieses Bereichs.Wählen Sie den Popup-Schaltflächenstil dieses Abschnitts aus.Wählen Sie aus, wo dieser Abschnitt im Vergleich zu lokalen Optionen erscheint.Wählen Sie aus, wo das Produkt ausgeblendet werden sollWählen Sie, wo die „Gesamtsumme“-Box angezeigt werden soll.Wählen Sie aus, wo die zusätzlichen Optionen angezeigt werden sollen.Wählen Sie aus, welche Dateitypen der Benutzer zum Hochladen hat.SelbstmodusDer Selbstmodus ersetzt das aktuelle Bild und fügt Inline neue Bildelemente hinzu.SeptemberStellen Sie den Bildmodus ein, der für verschiedene bildbezogene Funktionen verwendet wird.Legen Sie die max. Breite des Tooltips fest, die auf den Elementen angezeigt wird.Legen Sie die maximale Höhe der Bilder fest, die im Warenkorb angezeigt werden.Legen Sie die maximale Anzahl von Zeilen fest, die ein Benutzer für das Repeater-Feld hinzufügen kann.Legen Sie die maximale Breite der Bilder fest, die im Warenkorb angezeigt werden.Legen Sie die Mindestanzahl von Zeilen fest, die ein Benutzer für das Repeater-Feld hinzufügen kann.Legen Sie die Platzierung für das Etikett der Validierungsfehlermeldung festAuf Gebühr eingestelltStellen Sie ein, worauf diese Preis Typen ihren ursprünglichen Preis basieren.EinstellungenEinstellungen:SchattenEinzeln versendetBestellungAnzeigenGesamtsumme anzeigenOptionen insgesamt anzeigenZeigen Sie den Einheitspreis auf der GesamtboxAttribut-Name anzeigenAuswahlbeschreibung inline anzeigen.Beschreibung anzeigenFilter anzeigenBeschriftung für Elemente in voller Breite anzeigen.Bild anzeigenBild und Beschreibung anzeigenBild und Beschriftung anzeigenZeigen Sie Bildwechsel in Warenkorb und KasseBild, Beschriftung und Beschreibung anzeigenBeschriftung anzeigenBeschriftung und Beschreibung anzeigenMeta anzeigenZeige nur mit "Action Hook"Preis anzeigenPreise innerhalb der ausgewählten Box anzeigenZeigen Sie die Preise innerhalb der Auswahl der BoxMenge anzeigen 1Mengenauswahl nur für Elemente mit Wert anzeigenReset-Taste anzeigenResponsive Werte anzeigenZeigen Sie den endgültigen Gesamtbetrag an, auch wenn das Produkt keine zusätzlichen Optionen hatTitel anzeigenTooltip anzeigenHochgeladenes Bild im Warenkorb und an der Kasse anzeigenAktion-Hooks Verwendung anzeigenWert anzeigenWird angezeigt, wenn die Summe größer als Null istAnmeldegebührAnmeldegebühr TextEinzelnes ProduktEinzelner DateitextEinzelne, einheitliche DateiGrößeSlider (Assistent)Slider: „Weiter“-TextSlider: „Zurück“-TextKleinDa lief was falsch mit Wordpress.Mit der Bitte ist etwas schief gelaufen!Entschuldigung, aber dieser Dateityp ist aus Sicherheitsgründen nicht erlaubt.Geben Sie die Bedingungen für die Deaktivierung von Versandmethoden basierend auf dem Wert des aktuellen Felds an. Wenn die Bedingungen erfüllt sind, stehen die ausgewählten Versandarten den Kunden während des Bestellvorgangs nicht zur Auswahl.Geben Sie die Bedingungen für die Aktivierung von Versandmethoden basierend auf dem Wert des aktuellen Felds an. Wenn die Bedingungen erfüllt sind, können Kunden die ausgewählten Versandarten während des Bestellvorgangs auswählen.QuadratQuadrat 2StandardStart Animation verzögert sichFügen Sie ein Element hinzuStart der BeschriftungStartjahrSchritt * PreisSchritt-WertZeichenHTML aus E-Mails entfernenStilStyle-VariationenStilvolle SchaltflächeGebührentext anmeldenGebührentext anmeldenUntertitelUntertitel SchriftfarbeUntertitelpositionSuffix-BeschriftungSonntagSwatch-PositionZugeordnete Produktmenge mit Hauptproduktmenge synchronisierenSystem StyleTabellen-IndexTabellennameTabellennamen sind unterschiedlich. Möchten Sie die Tabellen überschreiben?TabsSteuerSteuerklasse für GebührenpreistypVorlageTextTextbereichTextfeldText nach PreisText vor dem PreisTextlängeText-LinkTextfarbfelderDieser Benutzername gilt nicht für diesen Artikel-Kaufcode. Bitte stellen Sie sicher, dass Sie den richtigen Benutzernamen (case sensitive) eingegeben haben.Die CSV-Datei ist ungültig!Die Verzögerung bis zum Start der Animation in MillisekundenDie Beschreibung wird unter dem Titel angezeigt.Die Vorlage wurde auf alle Produkte angewendetDie Vorlage wurde nicht auf alle Produkte angewendetDie Formulare, die Sie wählen, werden zusammen mit den Formularen angezeigt, die das Produkt bereits hat.Die installierte Version istDer Artikel %s wurde aus dem Warenkorb entfernt, da er sich seit dem Hinzufügen geändert hat.Der Gegenstand, den Sie versuchen, in den Papierkorb zu legen, existiert nicht mehr.Der Gegenstand, den Sie aus dem Papierkorb wiederherstellen wollen, existiert nicht mehr.Die Anzahl der Optionen, die der Benutzer ausgewählt hatDie Anzahl der Optionen, die der Benutzer für das Zielelement ausgewählt hatDie PHP-Funktionen mb_detect_encoding und mb_convert_encoding sind erforderlich um CSV Dateien zu importieren und exportieren. Bitte wenden Sie sich zur Aktivierung dieser Funktionen an Ihren Hosting-Provider.Der Preis des ZielelementsDer Kaufcode ist bereits auf einer anderen Domain aktiviert!Der Kaufcode ist bereits aktiviert!Der Kaufcode ist bereits belegt! Bitte kaufen Sie eine gültige Lizenz!Die Menge für "%1$s" muss größer als %2$s seinDie Menge für "%s" muss größer als 0 sein um in den Warenkorb gelegt zu werden.Die Menge von &quot;%1$s&quot; darf nicht höher sein als %2$d.Die Menge von &quot;%1$s&quot; darf nicht geringer sein als %2$d.Die Menge von &quot;%1$s&quot; muss in Vielfachen von %2$d eingegeben werden.Die Menge dieses ElementsDer Rohwert des ZielelementsDie gewählte Form enthält keine AbschnitteDie Textlänge des ZielelementsDie Gesamtmenge des ZielelementsDie Gesamtmenge dieses ElementsDie hochgeladene Datei überschreitet die maximale Dateigröße.Die hochgeladene Datei überschreitet die upload_max_filesize Begrenzung in der php.ini.Die geladene Datei wurde nur teilweise geladen.Die Wertlänge dieses ElementsDer Wert des Zielelements, konvertiert in eine GleitkommazahlDer Wert dieses ElementsThemeEs sind noch keine gespeicherten Variationen vorhanden.Beim Importieren der CSV-Datei ist ein Fehler aufgetreten.Beim Speichern der CSV-Daten ist ein Fehler aufgetreten. Bitte überprüfen Sie die Kodierung Ihrer CSV-Datei!Beim Speichern der Einstellungen ist ein Fehler aufgetreten.Dünne LinieAuf diese Weise können Sie alle ausgewählten Monate deaktivieren.Damit können Sie alle ausgewählten Wochentage deaktivieren.Hier können Sie Punkte im Bereich-Werkzeug setzen.Dadurch ändert sich der Text der Schaltfläche In den Einkaufswagen in ausgewählte Optionen auf Shop- und Archivseiten, wenn das Produkt zusätzliche Produktoptionen hat.Wenn Sie dies aktivieren, wird die Ajax-Funktionalität entfernt.Wenn Sie "Mit Hilfe von Action-Hooks" wählen, müssen Sie den Code manuell auf Ihr Thema oder Plugin schreiben, um die Felder anzuzeigen, und die Einstellungen unten funktionieren nicht. Wenn Sie Composite Products Extension verwenden, müssen Sie diese Einstellung auf "Normal" lassen, sonst können die zusätzlichen Optionen nicht auf den Composite-Produktbündeln angezeigt werden.Dies bestimmt die schwimmenden Gesamtmengen der Box Sichtbarkeit.Dieses ElementDies ist ein Pflichtfeld TextDieses Feld wird benötigt.Dies ist eine Übersetzung vonDies ist für mehrere Galerielösungen erforderlich, die den HTML-Code des Bildes dynamisch ändern oder wenn Sie das Bild dynamisch steuern möchten.Dies wird verwendet, um das Produktbild zu verändern.Hier können Sie Ihrem Shop neue globale Optionen hinzufügen.Hier können Sie neue globale Vorlagenoptionen hinzufügen.Hier können Sie neue Nachschlagetabellen hinzufügen.Dieser Artikel wurde bereits gelöscht.Dies verschiebt die "Ausverkauft"-Nachricht, falls gestylte Variationen direkt unter ihr verwendet werden.Diese Einstellung steuert die maximale Anzahl von Kombinationen, die das Plugin zur Berechnung von Mindest- und Höchstpreisen verwendet. Eine höhere Anzahl von Kombinationen führt zu genaueren Preisen, aber es dauert auch länger, sie zu berechnen. Für Produkte, die viele Auswahlkombinationen haben können, wird empfohlen, eine geringere Anzahl von Kombinationen einzustellen, um die Leistung zu verbessern.Dadurch wird ein Button hinzugefügt, um die ausgewählte Option zu löschen.Dies wird als leerer Wert für den Fall gezählt, dass das Element erforderlich ist.Dadurch wird der ursprüngliche Preis mit der erforderlichen Messung geteilt.Aktivieren, um eine schwimmende „Gesamtsumme“-Box anzuzeigen.Dadurch wird die Standard-Plugin-Übersetzung mit den Pot-Dateien aktiviert.Dadurch werden alle diesem Produkt zugewiesenen globalen Formulare, mit Ausnahme der in der vorherigen Einstellung definierten, ausgeschlossen.Dies wird den Produktpreis weltweit mit dem Preis von den Optionen überschreiben, wenn der Gesamtpreis der Optionen größer als null ist.Damit verbirgt sich die durchschnittliche Preisanzeige auf dem Warenkorb für Kästchen.Dadurch wird dieses Element basierend auf der Produktmenge wiederholbar.Dadurch wird dieses Element wiederholbar.Dies überschreibt die Anzeigemethode nur für dieses Produkt.Dadurch wird der Produktpreis mit dem Preis aus den Optionen überschrieben, wenn der gesamte Optionspreis größer als Null ist.Dadurch wird das obige Zeitformat überschrieben.Dies überschreibt nur die Gesamt Summen Anzeige für dieses Produkt.Überschreibt, welche Rollen die Optionen für dieses Produkt sehen können.Dies ersetzt den angezeigten Produktpreis auf Shop-/Archiv-/Produktschleifenseiten.Dadurch werden die Optionswerte auf die Standardwerte zurückgesetzt, nachdem das Produkt in den Warenkorb gelegt wurdeMengen Auswahl für diese Option anzuzeigen.VorschaubilderMiniaturansichten mehrfachDonnerstagZeitZeitformatZeitauswahlstilZeitzonen Überschreibung für DatenelementTitelTiteloptionenTitel:BisOm te weten te komen hoe u toegang krijgt tot uw aankoopcode kunt u %sUm automatische Updates zu erhalten, ist eine Aktivierung der Lizenz erforderlich.Um die Zeichenfolgen für die lokalen Optionen zu übersetzen, bitte WPML-Schnittstelle verwenden.HeuteTooltipTooltip und linke SeiteTooltip und rechte SeiteTooltip max. BreiteObenOben linksOberer BildschirmrandOben rechtsGesamtGesamtpreis als StückpreisPlatzierung der „Gesamtsumme“-Box„Gesamtsumme“-Box Platzierung benutzerdefinierter HookTotal-Kasten-Platzierungs-Haken PrioritätÜbersetzungenNullen in den Preisen kürzenVersuchen Sie, von einer ungültigen IP-Adresse aus zu aktivieren!Versuchen Sie, von einer ungültigen Domain zu aktivieren!Der Versuch, von außen die Plugin-Schnittstelle zu aktivieren, ist nicht erlaubt!Versuchen Sie, mit einem ungültigen Kaufcode für Ihr Token zu aktivieren!Der Upload von Dateien größer als %s ist nicht erlaubt!DienstagDauerwagen ausschaltenTyp:URLUndiskontierter ProduktpreisRückgängigMenge MaximalwertEinheitspreisText für den StückpreisUnbekannter Beitragstyp.Unserialisierte Instanzen dieser Klasse sind verboten.AktualisierenWarenkorb aktualisierenWarenkorbtext aktualisierenHochladenKnopf hochladenUpload Element inline BildvorschauOrdner hinzufügenUpload ManagerErfolgreich hochgeladenDateien hochladenDateien hochladen TextHochladen Nachrichten TextURLURL-Ersatz nutzenWooCommerce-Wert nutzenVerwenden Sie erlaubte Dateitypen von WordPressBenutzerdefiniertes Bild nutzenFeldwert nutzenGlobale Einstellung verwendenLightbox für Bilder verwendenInterne VariationspreiseOptionen speichernVerwenden Sie Optionen Caching zur Steigerung der Performance. Deaktivieren Sie, wenn Sie Optionen haben, die die gleiche eindeutige ID teilen.Verwendung von Plus-und Minuszeichen auf OptionspreisenPlus-und Minuszeichen bei Preisen im Warenkorb und Kasse nutzenVerwenden Sie progressive Anzeige auf OptionenRegulärer Preis verwendenVerkaufspreis verwendenVerwenden Sie die Einstellung für jedes ProduktVerwenden Sie die "Von"-Zeichenkette der angebotenen ProduktpreiseVerwenden Sie den BildersatzVerwenden Sie dieses Feld, um eine Rasteranzeige zu erstellen. Geben Sie ein, wie viele Elemente pro Zeile für das Gitter verwendet werden, oder lassen Sie leer für die normale Anzeige.Verwenden Sie übersetzte Werte, wenn möglich auf Admin-BestellungBenutzernameVerwenden der BuchungseinstellungValidieren alsWertVariation %1$s von %2$sVariationsmöglichkeitenVariation:VariationenVerschiedenenDokumentation für Extra Product Options anzeigenEinstellungen für zusätzliche Produktoptionen anzeigenGlobales Formular anzeigenNachschlagetabelle anzeigenTemplate ansehenWarenkorb ansehenDetails anzeigenVisble nach dem Scrollen der SeitePremium-Kundensupport besuchenVisuellMittwochGibt an, ob bestimmte Produkte oder Kategorien eingeschlossen werden sollen.BreiteWooCommerce BuchungenWooCommerce Easy BookingsHolz-HandelsmessrechnerWooCommerce EinstellungenWooCommerce AbosWooCommerce ist nicht aktiviert!JahrJahr - Tag - MonatJaar - Maand - DagJahr . Tag . MonatJahr . Monat . TagJahr / Tag / MonatJahr / Monat / TagJaJa, aber zeige den PreisSie sind nicht berechtigt diesen Inhalt zu löschen.Sie haben keine Berechtigung, diesen Artikel zu bearbeiten.Du verfügst nicht über ausreichende Rechte, um dieses Element aus dem Papierkorb wiederherzustellen.Du bist nicht berechtigt, diesen Beitrag in den Papierkorb zu verschieben.Sie sind nicht berechtigt, dieses Element aus dem Papierkorb wiederherzustellen.Sie haben versucht, einen Gegenstand zu bearbeiten, der nicht existiert. Vielleicht wurde er gelöscht?Sie können eine Envato Personal Token um %s generierenSie können nur bis zu %1$s Auswahl für %2$s auswählen.Sie können nur bis zu %1$s Auswahlmöglichkeiten für %2$s auswählen.Sie können dieses Element nicht bearbeiten, da es im Papierkorb liegt. Stellen Sie es wieder her und versuchen es dann erneut.Sie können keine weiteren zusätzlichen Optionen hinzufügen.Sie können negativ bepreiste Produkte nicht dem Warenkorb hinzufügen.Sie können keine kostenlosen Produkte dem Warenkorb hinzufügen.Sie können nicht mehr als %1$s Zeichen für "%2$s" eingeben.Sie können dieses Element nicht in den Papierkorb verschieben. Es wird z.Zt. von %s bearbeitet.Dieses Datum kann nicht ausgewählt werden!Sie haben diesen Kaufcode bereits auf einer anderen Domain aktiviert!Sie haben Ihren Kaufcode bereits aktiviert!Sie müssen mindestens %1$s Zeichen für "%2$s" eingeben.Sie müssen mindestens %1$s Auswahl für %2$s auswählen.Sie müssen mindestens %1$s Auswahlmöglichkeiten für %2$s auswählen.Sie müssen genau %1$s Auswahl für %2$s auswählen.Sie müssen genau %1$s Auswahlmöglichkeiten für %2$s auswählen.Dein Envato Benutzername.Ihre Dateien werden hochgeladenIhre Einstellungen wurden zurückgesetzt.Ihre Einstellungen wurden gespeichert.und einautomatischverbleibende Zeichendiesen Link anklickenklicken auf diesen LinkdivMengeendet mitDateiDateiengrösser alsgrößer oder gleichh:mh:m:sh:m:ssh:mmh:mm:sh:mm:sshierhh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssistist leerist nichtist nicht leerjQuery-Selektor für das Hauptbild des ProduktsBezeichnungweniger alskleiner oder gleichoder registrieren Sie das Plugin, um automatische Updates zu erhalten.pGlobal FormsNachschlagetabellenOptionen TemplatesTM Zusätzliche ProduktoptionenAlle <span class="count">(%s)</span>Alle <span class="count">(%s)</span>Meine < span class = "count" > ( %s) </span>Meine < span class = "count" > ( %s) </span>Sticky <span class = "count" > ( %s) </span>Sticky <span class = "count" > ( %s) </span>anmeldegebührspanbeginnt mitdieses Feld, wenn die folgenden Bedingungen erfüllt sind.wenn die folgenden Bedingungen erfüllt sind.Zeitzonelanguages/woocommerce-tm-extra-product-options.mo000064400000001352150755142440016304 0ustar00��$,8�9Project-Id-Version: TM WooCommerce Extra Product Options
Report-Msgid-Bugs-To: 
POT-Creation-Date: 2015-06-16 06:19+0200
PO-Revision-Date: 2015-06-16 06:19+0200
Last-Translator: themecomplete <themecomplete@gmail.com>
Language-Team: themecomplete <themecomplete@gmail.com>
Language: en_GB
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=n != 1;
X-Generator: Poedit 1.8
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
languages/woocommerce-tm-extra-product-options-el.po000064400001263144150755142440016717 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:52+0200\n"
"PO-Revision-Date: 2024-03-07 11:52+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Επιπλέον Επιλογές Προϊόντος"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "Επιπλέον Επιλογές Προϊόντος Τέλη"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "Προβολή ρυθμίσεων Επιπλέον Επιλογών Προϊόντος"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Ρυθμίσεις"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Επιπλέον Επιλογές Προϊόντος & Πρόσθετα για το WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Περισσότερες πληροφορίες σχετικά με %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Προβολή Λεπτομερειών"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "Προβολή τεκμηρίωσης Επιπλέον Επιλογών Προϊόντος"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Tεκμηρίωση"

#: admin/class-themecomplete-epo-admin-base.php:724
#, fuzzy
msgid "Visit premium customer support"
msgstr "Επισκεφθείτε την premium υποστήριξη πελατών"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Επαγγελματική υποστήριξη"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Αντίγραφο)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, fuzzy, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Παραλλαγή #%1$s του %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "Δεν υπάρχουν ακόμα αποθηκευμένες παραλλαγές."

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "Δεν μπορείτε να προσθέσετε άλλες επιπλέον επιλογές."

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν την επιλογή;"

#: admin/class-themecomplete-epo-admin-base.php:1237
#, fuzzy
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Πριν προσθέσετε επιπλέον επιλογές προϊόντος, προσθέστε και αποθηκεύστε "
"ορισμένα χαρακτηριστικά στην καρτέλα Χαρακτηριστικά."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Σταθερό ποσό"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "Ποσοστό της αρχικής τιμής"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "Σφάλμα"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "Μη έγκυρο αίτημα!"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr ""
"Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον φάκελο και όλο το "
"περιεχόμενό του;"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο;"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "Είστε βέβαιοι ότι θέλετε να επαναφέρετε τις ρυθμίσεις;"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Ναι"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "Όχι"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Ακύρωση"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Κλείσιμο"

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr "Όνομα Σταθερας"

#: admin/class-themecomplete-epo-admin-base.php:1285
msgid "Constant value"
msgstr "Τιμή Σταθερας"

#: admin/class-themecomplete-epo-admin-base.php:1286
#, fuzzy
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Επιλέξτε το πλαίσιο ελέγχου συγκατάθεσης για να δώσετε την άδειά σας να "
"στείλετε τα δεδομένα σας στον διακομιστή και προσπαθήστε ξανά."

#: admin/class-themecomplete-epo-admin-base.php:1287
msgid "Connecting to activation server ..."
msgstr "Σύνδεση με διακομιστή ενεργοποίησης ..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Επιπλέον επιλογή προϊόντος #%1$s από %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "Δεν ήταν δυνατή η ενημέρωση της ανάρτησης στη βάση δεδομένων"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "Ενεργοποίηση εμφάνισης σημείων;"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr ""
"Αυτό σας επιτρέπει να δημιουργήσετε σημεία κατά μήκος του επιλογέα εύρους."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "Αριθμός σημείων"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "Εισαγάγετε τον αριθμό των σημείων που εμφανίζονται."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Σημείωση"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Αριστερή πλευρά"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Σωστη πλευρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
#, fuzzy
msgid "Tooltip and Left side"
msgstr "Συμβουλή εργαλείου και αριστερή πλευρά"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
#, fuzzy
msgid "Tooltip and Right side"
msgstr "Συμβουλή εργαλείου και δεξιά πλευρά"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
#, fuzzy
msgid "Show value on"
msgstr "Εμφάνιση αξίας στο"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
#, fuzzy
msgid "Select how to show the value of the range picker."
msgstr "Επιλέξτε τον τρόπο εμφάνισης της τιμής του επιλογέα εύρους."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
#, fuzzy
msgid "Step value"
msgstr "Τιμή βήματος"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
#, fuzzy
msgid "Enter the step for the handle."
msgstr "Εισαγάγετε το βήμα για τη λαβή."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Επικύρωση"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "Ηλεκτρονικό ταχυδρομείο"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Αριθμός"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Χαρακτήρες"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
#, fuzzy
msgid "Letters only"
msgstr "Μόνο γράμματα"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
#, fuzzy
msgid "Letters or Space only"
msgstr "Μόνο γράμματα ή διάστημα"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Αλφαριθμητικός"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "Αλφαριθμητικό Unicode"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "Αλφαριθμητικό Unicode ή διάστημα"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
#, fuzzy
msgid "Validate as"
msgstr "Επικύρωση ως"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
#, fuzzy
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Επιλέξτε εάν το πεδίο θα επικυρωθεί με βάση την επιλεγμένη μέθοδο."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr "Απαιτείται"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
#, fuzzy
msgid "Choose whether the user must fill out this field or not."
msgstr "Επιλέξτε εάν ο χρήστης πρέπει να συμπληρώσει αυτό το πεδίο ή όχι."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Ενεργοποιημένο"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
#, fuzzy
msgid "Choose whether the option is enabled or not."
msgstr "Επιλέξτε εάν η επιλογή είναι ενεργοποιημένη ή όχι."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
#, fuzzy
msgid "Enter the price for this field or leave it blank for no price."
msgstr "Εισαγάγετε την τιμή για αυτό το πεδίο ή αφήστε το κενό χωρίς τιμή."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Τιμή πώλησης"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
#, fuzzy
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Εισαγάγετε την τιμή έκπτωσης για αυτό το πεδίο ή αφήστε το κενόγια να "
"χρησιμοποιήσετε την προεπιλεγμένη τιμή."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
#, fuzzy
msgid "Text after Price"
msgstr "Κείμενο μετά την τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
#, fuzzy
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Εισαγάγετε ένα κείμενο που θα εμφανίζεται μετά την τιμή για αυτό το πεδίο ή "
"αφήστε το κενό χωρίς κείμενο."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
#, fuzzy
msgid "Text before Price"
msgstr "Κείμενο πριν από την τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
#, fuzzy
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Εισαγάγετε ένα κείμενο που θα εμφανίζεται πριν από την τιμή για αυτό το "
"πεδίο ή αφήστε το κενό χωρίς κείμενο."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
#, fuzzy
msgid "Percent of the original price + options"
msgstr "Ποσοστό της αρχικής τιμής + επιλογές"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
#, fuzzy
msgid "Price per word"
msgstr "Τιμή ανά λέξη"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
#, fuzzy
msgid "Percent of the original price per word"
msgstr "Ποσοστό της αρχικής τιμής ανά λέξη"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "Τιμή ανά λέξη (όχι n-th χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr "Ποσοστό της αρχικής τιμής ανά λέξη (όχι n-th χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
#, fuzzy
msgid "Price per character"
msgstr "Τιμή ανά χαρακτήρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "Ποσοστό της αρχικής τιμής ανά χαρακτήρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "Τιμή ανά χαρακτήρα (χωρίς πρώτο χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "Τιμή ανά χαρακτήρα (χωρίς n-οστό χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "Τιμή ανά χαρακτήρα (χωρίς n-οστό χαρακτήρα και χωρίς κενά)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "Ποσοστό της αρχικής τιμής ανά χαρακτήρα (χωρίς τον πρώτο χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr "Ποσοστό της αρχικής τιμής ανά χαρακτήρα (χωρίς n-οστό χαρακτήρα)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Ποσοστό της αρχικής τιμής ανά χαρακτήρα (χωρίς n-οστό χαρακτήρα και χωρίς "
"κενά)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "Τιμή ανά χαρακτήρα (χωρίς κενά)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
#, fuzzy
msgid "Price per row"
msgstr "Τιμή ανά σειρά"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
#, fuzzy
msgid "Math formula"
msgstr "Μαθηματικός τύπος"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
#, fuzzy
msgid "Fixed amount + options"
msgstr "Σταθερό ποσό + επιλογές"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "Πίνακας αναζήτησης"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Τύπος τιμής"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Ποσότητα"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
#, fuzzy
msgid "Current value"
msgstr "Τρέχουσα αξία"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
#, fuzzy
msgid "Step * price"
msgstr "Βήμα * τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
#, fuzzy
msgid "Price per Interval"
msgstr "Τιμή ανά διάστημα"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
msgid "Calculation type"
msgstr "Τύπος ενότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Κανένας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "Αναγνωριστικό στοιχείου για x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr ""
"Εισαγάγετε το αναγνωριστικό στοιχείου που θα χρησιμοποιηθεί για τη στήλη x."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "Αναγνωριστικό στοιχείου για y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr ""
"Εισαγάγετε το αναγνωριστικό στοιχείου που θα χρησιμοποιηθεί για τη στήλη y."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
#, fuzzy
msgid "Set to Fee"
msgstr "Ορισμός σε χρέωση"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
#, fuzzy
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Επισυνάψτε την τιμή στην παραγγελία καθιστώντας την ανεξάρτητη από την "
"ποσότητα του προϊόντος."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "Ελεύθεροι χαρακτήρες"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "Εισαγάγετε τον αριθμό των ελεύθερων χαρακτήρων."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Ελάχιστη τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
#, fuzzy
msgid "Enter the minimum value."
msgstr "Εισαγάγετε την ελάχιστη τιμή."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Μέγιστη τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
#, fuzzy
msgid "Enter the maximum value."
msgstr "Εισαγάγετε τη μέγιστη τιμή."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
#, fuzzy
msgid "Day / Month / Year"
msgstr "Ημέρα / Μήνας / Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
#, fuzzy
msgid "Month / Day / Year"
msgstr "Μήνας / Ημέρα / Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
#, fuzzy
msgid "Day . Month . Year"
msgstr "Μέρα. Μήνας. Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
#, fuzzy
msgid "Month . Day . Year"
msgstr "Μήνας. Μέρα. Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
#, fuzzy
msgid "Day - Month - Year"
msgstr "Ημέρα - Μήνας - Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
#, fuzzy
msgid "Month - Day - Year"
msgstr "Μήνας - Ημέρα - Έτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
#, fuzzy
msgid "Year / Month / Day"
msgstr "Έτος / Μήνας / Ημέρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
#, fuzzy
msgid "Year / Day / Month"
msgstr "Έτος / Ημέρα / Μήνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
#, fuzzy
msgid "Year . Month . Day"
msgstr "Έτος. Μήνας. Μέρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
#, fuzzy
msgid "Year . Day . Month"
msgstr "Έτος. Μέρα. Μήνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
#, fuzzy
msgid "Year - Month - Day"
msgstr "Έτος - Μήνας - Ημέρα"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
#, fuzzy
msgid "Year - Day - Month"
msgstr "Έτος - Ημέρα - Μήνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Μορφή ημερομηνίας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "ΩΩ:λλ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
#, fuzzy
msgid "HH:m"
msgstr "ΩΩ:μ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "Η:λλ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
#, fuzzy
msgid "H:m"
msgstr "Χ:μ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
#, fuzzy
msgid "HH:mm:ss"
msgstr "ΩΩ: λλ: δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
#, fuzzy
msgid "HH:m:ss"
msgstr "ΩΩ:δδ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
#, fuzzy
msgid "H:mm:ss"
msgstr "Ω:λλ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
#, fuzzy
msgid "H:m:ss"
msgstr "Ω:μ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
#, fuzzy
msgid "HH:mm:s"
msgstr "ΩΩ:λλ:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
#, fuzzy
msgid "HH:m:s"
msgstr "ΩΩ:μ:δευτ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
#, fuzzy
msgid "H:mm:s"
msgstr "Ω:λλ:δ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
#, fuzzy
msgid "H:m:s"
msgstr "Ω:μ:δευτ."

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
#, fuzzy
msgid "hh:mm"
msgstr "ωω:λλ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
#, fuzzy
msgid "hh:m"
msgstr "ωω:μ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
#, fuzzy
msgid "h:mm"
msgstr "ω:λλ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
#, fuzzy
msgid "h:m"
msgstr "ω:μ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
#, fuzzy
msgid "hh:m:ss"
msgstr "ωω:δδ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
#, fuzzy
msgid "h:mm:ss"
msgstr "ω:λλ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
#, fuzzy
msgid "h:m:ss"
msgstr "ω:μ:δδ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
#, fuzzy
msgid "hh:mm:s"
msgstr "ωω:λλ:δ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
#, fuzzy
msgid "hh:m:s"
msgstr "ωω:μ:δευτ."

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
#, fuzzy
msgid "h:mm:s"
msgstr "ω:λλ:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
#, fuzzy
msgid "h:m:s"
msgstr "ω:μ:δευτ."

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Μορφή Ώρας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
#, fuzzy
msgid "Custom Time format"
msgstr "Προσαρμοσμένη μορφή ώρας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
#, fuzzy
msgid "This will override the time format above."
msgstr "Αυτό θα παρακάμψει την παραπάνω μορφή ώρας."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
#, fuzzy
msgid "Start year"
msgstr "Έτος έναρξης"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
#, fuzzy
msgid "Enter starting year."
msgstr "Εισαγάγετε το έτος έναρξης."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
#, fuzzy
msgid "End year"
msgstr "Τέλος έτους"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
#, fuzzy
msgid "Enter ending year."
msgstr "Εισαγάγετε το έτος λήξης."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
#, fuzzy
msgid "Use URL replacements"
msgstr "Χρήση αντικαταστάσεων URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
#, fuzzy
msgid "Choose whether to redirect to a URL if the option is click."
msgstr ""
"Επιλέξτε αν θέλετε να κάνετε ανακατεύθυνση σε μια διεύθυνση URL εάν κάνετε "
"κλικ στην επιλογή."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
#, fuzzy
msgid "Populate options"
msgstr "Επιλογές συμπλήρωσης"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
#, fuzzy
msgid "Double click the radio button to remove its selected attribute."
msgstr ""
"Κάντε διπλό κλικ στο κουμπί επιλογής για να καταργήσετε το επιλεγμένο "
"χαρακτηριστικό."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
#, fuzzy
msgid "Variation options"
msgstr "Επιλογές παραλλαγής"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
#, fuzzy
msgid "Image swatches"
msgstr "Δείγματα εικόνων"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
#, fuzzy
msgid "Color swatches"
msgstr "Δείγματα χρωμάτων"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
#, fuzzy
msgid "Text swatches"
msgstr "Δείγματα κειμένου"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
#, fuzzy
msgid "Replacement mode"
msgstr "Λειτουργία αντικατάστασης"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
#, fuzzy
msgid "Select how to display the element."
msgstr "Επιλέξτε τον τρόπο εμφάνισης του στοιχείου."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
#, fuzzy
msgid "Start of the label"
msgstr "Έναρξη της ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Κέντρο"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
#, fuzzy
msgid "End of the label"
msgstr "Τέλος της ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
#, fuzzy
msgid "Swatch position"
msgstr "Θέση δείγματος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
#, fuzzy
msgid "Choose how the swatch will be displayed."
msgstr "Επιλέξτε τον τρόπο εμφάνισης του δείγματος."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
#, fuzzy
msgid "Use image lightbox"
msgstr "Χρήση lightbox εικόνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
#, fuzzy
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "Επιλέξτε αν θέλετε να ενεργοποιήσετε το lightbox στη μικρογραφία."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
#, fuzzy
msgid "Use the image replacements"
msgstr "Χρησιμοποιήστε τις αντικαταστάσεις εικόνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
#, fuzzy
msgid "Use custom image"
msgstr "Χρήση προσαρμοσμένης εικόνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
#, fuzzy
msgid "Changes product image"
msgstr "Αλλάζει την εικόνα προϊόντος"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
#, fuzzy
msgid "Choose whether to change the product image."
msgstr "Επιλέξτε αν θέλετε να αλλάξετε την εικόνα του προϊόντος."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Εμφάνιση ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Δείξε περιγραφή"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
#, fuzzy
msgid "Show label and description"
msgstr "Εμφάνιση ετικέτας και περιγραφής"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Εμφάνιση τίτλου εικόνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
#, fuzzy
msgid "Show image and label"
msgstr "Εμφάνιση εικόνας και ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
#, fuzzy
msgid "Show image and description"
msgstr "Εμφάνιση εικόνας και περιγραφής"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
#, fuzzy
msgid "Show image, label and description"
msgstr "Εμφάνιση εικόνας, ετικέτας και περιγραφής"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
#, fuzzy
msgid "Show tooltip"
msgstr "Εμφάνιση συμβουλής εργαλείου"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr ""
"Η ενεργοποίηση αυτού θα εμφανίσει μια συμβουλή εργαλείου πάνω από την "
"επιλογή."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
#, fuzzy
msgid "Enable clear options button"
msgstr "Ενεργοποίηση κουμπιού απαλοιφής επιλογών"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
#, fuzzy
msgid "This will add a button to clear the selected option."
msgstr "Αυτό θα προσθέσει ένα κουμπί για να διαγράψετε την επιλεγμένη επιλογή."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
#, fuzzy
msgid "Show responsive values"
msgstr "Εμφάνιση αποκριτικών τιμών"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "αυτόματο"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
#, fuzzy
msgid "Items per row (Desktops and laptops)"
msgstr "Στοιχεία ανά σειρά (Επιτραπέζιοι και φορητοί υπολογιστές)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
#, fuzzy
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Χρησιμοποιήστε αυτό το πεδίο για να κάνετε μια εμφάνιση πλέγματος. "
"Εισαγάγετε πόσα στοιχεία ανά γραμμή για το πλέγμα ή αφήστε κενά για κανονική "
"εμφάνιση."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
#, fuzzy
msgid "Items per row (Tablets landscape)"
msgstr "Στοιχεία ανά σειρά (οριζόντιο tablet)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
#, fuzzy
msgid "Items per row (Tablets portrait)"
msgstr "Στοιχεία ανά σειρά (Tablet πορτρέτο)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
#, fuzzy
msgid "Items per row (Smartphones)"
msgstr "Είδη ανά σειρά (Smartphones)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
#, fuzzy
msgid "Items per row (iPhone 5)"
msgstr "Στοιχεία ανά σειρά (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
#, fuzzy
msgid "Items per row (iPhone 6)"
msgstr "Στοιχεία ανά σειρά (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
#, fuzzy
msgid "Items per row (iPhone 6 +)"
msgstr "Στοιχεία ανά σειρά (iPhone 6 +)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "Στοιχεία ανά γραμμή (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Στοιχεία ανά γραμμή (Galaxy Tablets landscape)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "Περιορίστε την επιλογή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
#, fuzzy
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Εισαγάγετε έναν αριθμό πάνω από το 0 για να περιορίσετε την επιλογή του "
"πλαισίου ελέγχου ή να αφήσετε κενό για προεπιλεγμένη συμπεριφορά."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
#, fuzzy
msgid "Exact selection"
msgstr "Ακριβής επιλογή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Εισαγάγετε έναν αριθμό πάνω από το 0 για να επιλέξει ο χρήστης τον ακριβή "
"αριθμό πλαισίων ελέγχου ή να αφήσει κενό για προεπιλεγμένη συμπεριφορά."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
#, fuzzy
msgid "Minimum selection"
msgstr "Ελάχιστη επιλογή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Εισαγάγετε έναν αριθμό πάνω από το 0 για να επιλέξει ο χρήστης τουλάχιστον "
"αυτόν τον αριθμό πλαισίων ελέγχου ή να αφήσει κενό για προεπιλεγμένη "
"συμπεριφορά."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
#, fuzzy
msgid "Normal browser button"
msgstr "Κανονικό κουμπί προγράμματος περιήγησης"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
#, fuzzy
msgid "Styled button"
msgstr "Κουμπί με στυλ"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
#, fuzzy
msgid "Upload button style"
msgstr "Στυλ κουμπιού μεταφόρτωσης"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Πεδίο Ημερομνίας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Επιλογέας ημερομηνίας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
#, fuzzy
msgid "Date field and picker"
msgstr "Πεδίο ημερομηνίας και επιλογέας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
#, fuzzy
msgid "Date picker style"
msgstr "Στυλ επιλογής ημερομηνίας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Απόκρυψη τιμής"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
#, fuzzy
msgid "Choose whether to hide the price or not."
msgstr "Επιλέξτε αν θέλετε να αποκρύψετε την τιμή ή όχι."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Απενεργοποίηση"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Δεξιά"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Αριστερά"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Κορυφή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "Κάτω"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
#, fuzzy
msgid "Quantity selector"
msgstr "Επιλογέας ποσότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
#, fuzzy
msgid "This will show a quantity selector for this option."
msgstr "Αυτό θα εμφανίσει έναν επιλογέα ποσότητας για αυτήν την επιλογή."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "Ελάχιστη τιμή ποσότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
#, fuzzy
msgid "Quantity max value"
msgstr "Μέγιστη ποσότητα"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "Βήμα ποσότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
#, fuzzy
msgid "Enter the quantity step."
msgstr "Εισαγάγετε το βήμα ποσότητας."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
#, fuzzy
msgid "Quantity Default value"
msgstr "Ποσότητα Προεπιλεγμένη τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
#, fuzzy
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr "Εισαγάγετε μια τιμή που θα εφαρμοστεί αυτόματα στο πεδίο \"Ποσότητα\"."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Κράτηση θέσης"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Ελάχιστοι χαρακτήρες"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
#, fuzzy
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""
"Εισαγάγετε μια τιμή για τους ελάχιστους χαρακτήρες που πρέπει να εισάγει ο "
"χρήστης."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
#, fuzzy
msgid "Maximum characters"
msgstr "Μέγιστος αριθμός χαρακτήρων"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Εισαγάγετε μια τιμή για να περιορίσετε τους μέγιστους χαρακτήρες που μπορεί "
"να εισαγάγει ο χρήστης."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Προεπιλεγμένη τιμή"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
#, fuzzy
msgid "Enter a value to be applied to the field automatically."
msgstr "Εισαγάγετε μια τιμή που θα εφαρμοστεί αυτόματα στο πεδίο."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Μέγεθος"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "Μείωση πλάτους"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
#, fuzzy
msgid "Increase Width"
msgstr "Αύξηση πλάτους"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "Επεξεργασία Στοιχείου"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
#, fuzzy
msgid "Duplicate Element"
msgstr "Διπλότυπο στοιχείο"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(χωρίς τίτλο)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Επεξεργασία ενότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
#, fuzzy
msgid "Duplicate Section"
msgstr "Διπλότυπη ενότητα"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Ενότητα"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Προσθήκη στοιχείου"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
#, fuzzy
msgid "Choose the image to use in place of the radio button."
msgstr ""
"Επιλέξτε την εικόνα που θα χρησιμοποιήσετε στη θέση του κουμπιού επιλογής."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#, fuzzy
msgid "Remove the image."
msgstr "Αφαιρέστε την εικόνα."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
#, fuzzy
msgid "Choose the image to replace the product image with."
msgstr ""
"Επιλέξτε την εικόνα με την οποία θέλετε να αντικαταστήσετε την εικόνα του "
"προϊόντος."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
#, fuzzy
msgid "Select boxes"
msgstr "Πλαίσια επιλογής"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Κουμπιά μοναδικής επιλογής"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
#, fuzzy
msgid "Radio buttons and image at start of the label"
msgstr "Κουμπιά επιλογής και εικόνα στην αρχή της ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
#, fuzzy
msgid "Radio buttons and image at end of the label"
msgstr "Κουμπιά επιλογής και εικόνα στο τέλος της ετικέτας"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Εμφάνιση ως"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
#, fuzzy
msgid "Select the display type of this attribute."
msgstr "Επιλέξτε τον τύπο εμφάνισης αυτού του χαρακτηριστικού."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Ετικέτα Ιδιότητας"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
#, fuzzy
msgid "Leave blank to use the original attribute label."
msgstr "Αφήστε κενό για να χρησιμοποιήσετε την αρχική ετικέτα χαρακτηριστικού."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "Ενεργοποίηση"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "Δείξτε το κουμπί επαναφοράς"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
#, fuzzy
msgid "Enables the display of a reset button for this attribute."
msgstr ""
"Ενεργοποιεί την εμφάνιση ενός κουμπιού επαναφοράς για αυτό το χαρακτηριστικό."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
#, fuzzy
msgid "Attribute element class name"
msgstr "Όνομα κλάσης στοιχείου χαρακτηριστικού"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
#, fuzzy
msgid "Enter an extra class name to add to this attribute element"
msgstr ""
"Εισαγάγετε ένα επιπλέον όνομα κλάσης για προσθήκη σε αυτό το στοιχείο "
"χαρακτηριστικού"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Πλάτος"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
#, fuzzy
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Εισαγάγετε το πλάτος του εμφανιζόμενου στοιχείου ή αφήστε κενό για αυτόματο "
"πλάτος."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Ύψος"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
#, fuzzy
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Εισαγάγετε το ύψος του εμφανιζόμενου στοιχείου ή αφήστε κενό για αυτόματο "
"ύψος."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Απόκρυψη"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "Εμφάνιση"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
#, fuzzy
msgid "Show attribute name"
msgstr "Εμφάνιση ονόματος χαρακτηριστικού"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
#, fuzzy
msgid "Choose whether to show or hide the attribute name."
msgstr ""
"Επιλέξτε αν θα εμφανίζεται ή θα αποκρύπτεται το όνομα του χαρακτηριστικού."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Χρώμα"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
#, fuzzy
msgid "Select the color to use."
msgstr "Επιλέξτε το χρώμα που θα χρησιμοποιήσετε."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
#, fuzzy
msgid "Image replacement"
msgstr "Αντικατάσταση εικόνας"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
#, fuzzy
msgid "Select an image for this term."
msgstr "Επιλέξτε μια εικόνα για αυτόν τον όρο."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
#, fuzzy
msgid "Product Image replacement"
msgstr "Αντικατάσταση εικόνας προϊόντος"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
#, fuzzy
msgid "Select the image to replace the product image with."
msgstr ""
"Επιλέξτε την εικόνα με την οποία θέλετε να αντικαταστήσετε την εικόνα του "
"προϊόντος."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
#, fuzzy
msgid "No saved variations found."
msgstr "Δεν βρέθηκαν αποθηκευμένες παραλλαγές."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
#, fuzzy
msgid "Choose the image to use in place of the checkbox."
msgstr ""
"Επιλέξτε την εικόνα που θα χρησιμοποιήσετε στη θέση του πλαισίου ελέγχου."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
#, fuzzy
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Επιλέξτε την εικόνα που θα χρησιμοποιήσετε στη θέση του κουμπιού επιλογής "
"όταν είναι επιλεγμένη."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
#, fuzzy
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Επιλέξτε την εικόνα που θα χρησιμοποιήσετε στη θέση του πλαισίου ελέγχου "
"όταν είναι επιλεγμένο."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
#, fuzzy
msgid "Choose the image for the lightbox."
msgstr "Επιλέξτε την εικόνα για το lightbox."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
#, fuzzy
msgid "Delete all options"
msgstr "Διαγραφή όλων των επιλογών"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Επιλεγμένο"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Προεπιλογή"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
#, fuzzy
msgid "Choice label"
msgstr "Ετικέτα επιλογής"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Τύπος Τιμής"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Περιγραφή"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Προσθήκη στοιχείου"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
#, fuzzy
msgid "Add separator"
msgstr "Προσθήκη διαχωριστικού"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
#, fuzzy
msgid "Mass add"
msgstr "Μαζική προσθήκη"

#: admin/class-themecomplete-epo-admin-csv.php:41
#, fuzzy
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"Οι λειτουργίες php mb_detect_encoding και mb_convert_encoding απαιτούνται "
"για την εισαγωγή και εξαγωγή αρχείων CSV. Ζητήστε από τον πάροχο φιλοξενίας "
"σας να ενεργοποιήσει αυτήν τη λειτουργία."

#: admin/class-themecomplete-epo-admin-csv.php:289
#, fuzzy
msgid "Invalid CSV file."
msgstr "Μη έγκυρο αρχείο CSV."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr ""
"Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php."
"ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr ""
"Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε "
"στη φόρμα HTML."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "Το μεταφορτωμένο αρχείο μεταφορτώθηκε μόνο εν μέρει."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "Δε μεταφορτώθηκε κανένα αρχείο."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Λείπει ένας προσωρινός φάκελος."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Αποτυχία εγγραφής αρχείου στο δίσκο."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "Η μεταφόρτωση αρχείου σταμάτησε κατά επέκταση."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""
"Λυπούμαστε, αυτός ο τύπος αρχείου δεν επιτρέπεται για λόγους ασφαλείας."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "Δεν βρέθηκε αρχείο."

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr "Χρησιμοποιήθηκε μη έγκυρη μέθοδος εισαγωγής."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "Το αρχείο εισήχθη."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "Το αρχείο CSV δεν είναι έγκυρο!"

#: admin/class-themecomplete-epo-admin-csv.php:552
#, fuzzy
msgid "Invalid CSV file!"
msgstr "Μη έγκυρο αρχείο CSV!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "Δεν επιτρέπεται η μεταφόρτωση αρχείων μεγαλύτερων από %s !"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "Αρχείο που εισάγεται με νέους πίνακες."

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "Παρουσιάστηκε σφάλμα κατά την εισαγωγή του αρχείου CSV."

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Παρουσιάστηκε σφάλμα κατά την αποθήκευση των δεδομένων csv. Ελέγξτε την "
"κωδικοποίηση του αρχείου csv σας!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr ""
"Τα ονόματα των πινάκων είναι διαφορετικά. Θέλετε να παρακάμψετε τους πίνακες;"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
#, fuzzy
msgid "Invalid data!"
msgstr "Μη έγκυρα δεδομένα!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
#, fuzzy
msgid "Something went wrong with the request!"
msgstr "Κάτι πήγε στραβά με το αίτημα!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "Οι Επιλογές σώθηκαν!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "Συμπεριλάβετε επιπλέον καθολικές φόρμες"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(χωρίς τίτλο)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Διαγράψτε όλες τις πρόσθετες καθολικές φόρμες"

#: admin/class-themecomplete-epo-admin-global-base.php:525
#, fuzzy
msgid "Disable Exclude from Global Options"
msgstr "Απενεργοποίηση εξαίρεσης από καθολικές επιλογές"

#: admin/class-themecomplete-epo-admin-global-base.php:526
#, fuzzy
msgid "Enable Exclude from Global Options"
msgstr "Ενεργοποίηση εξαίρεσης από καθολικές επιλογές"

#: admin/class-themecomplete-epo-admin-global-base.php:527
#, fuzzy
msgid "Delete all options on the product"
msgstr "Διαγραφή όλων των επιλογών στο προϊόν"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "Η διαχείριση αρχείων δεν υποστηρίζεται στον διακομιστή σας."

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "Έγινε επαναφορά των ρυθμίσεών σας."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "Παρουσιάστηκε σφάλμα κατά την αποθήκευση των ρυθμίσεων."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Οι ρυθμίσεις σας έχουν αποθηκευτεί."

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "Κλωνοποίηση προτύπου"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Κλωνοποίηση φόρμας"

#: admin/class-themecomplete-epo-admin-global-base.php:951
#, fuzzy
msgid "Export form"
msgstr "Φόρμα εξαγωγής"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr "Εργαλείο δημιουργίας φόρμας επιλογών επιπλέον προϊόντων"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Τίτλος"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Προτεραιότητα"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Αίτηση στις"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Κατηγορίες"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Προϊόντα"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
#, fuzzy
msgid "Excluded Products"
msgstr "Εξαιρούμενα προϊόντα"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "Όλα τα προϊόντα"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Απενεργοποιημένο"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "Προϊόντα και Κατηγορίες"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Προσαρμοσμένος κώδικας"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "Ολες οι κατηγορίες"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
msgid "Form settings"
msgstr "Ρυθμίσεις CSS"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Δημοσίευση"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Ρόλοι"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Εξαίρεση προϊόντων"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
#, fuzzy
msgid "The description will appear under the title."
msgstr "Η περιγραφή θα εμφανιστεί κάτω από τον τίτλο."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr "Ενεργοποιημένοι ρόλοι για αυτή τη φόρμα"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr "Απενεργοποιημένοι ρόλοι για αυτή τη φόρμα"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
#, fuzzy
msgid "Exclude Product(s) from the form"
msgstr "Εξαίρεση προϊόντων από τη φόρμα"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Αναζήτηση προϊόντος&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Επιλέξτε το/τα προϊόν(ντα) για να εφαρμόσετε τις επιλογές"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
#, fuzzy
msgid "Meta data not correctly saved. Please save the product!"
msgstr ""
"Τα μετα-δεδομένα δεν αποθηκεύτηκαν σωστά. Παρακαλώ αποθηκεύστε το προϊόν!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Προσθήκη ενότητας"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr "Στυλ παραλλαγών"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Αποθήκευση"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "Εισαγωγή CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "Εξαγωγή CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr "Πλήρες μέγεθος"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
#, fuzzy
msgid "Please save the form before importing options!"
msgstr "Αποθηκεύστε τη φόρμα πριν εισαγάγετε επιλογές!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
#, fuzzy
msgid "Please save the product before importing options!"
msgstr "Αποθηκεύστε το προϊόν πριν από την εισαγωγή επιλογών!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr "Δεν βρέθηκαν στοιχεία!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
#, fuzzy
msgid "Start adding elements"
msgstr "Αρχίστε να προσθέτετε στοιχεία"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "Προσθήκη στοιχείου σε μια νέα ενότητα"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Οριστική Διαγραφή"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "Μετακίνηση στον  Κάδο απορριμμάτων"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Ενημέρωση"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
msgid "Apply mode"
msgstr "Αυτόματη λειτουργία"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "Όλα τα προϊόντα"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Προσαρμοσμένη τιμή"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr "Κάτι πήγε στραβά με το WordPress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "Το WooCommerce δεν είναι ενεργοποιημένο!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Κλέβεται&#8217; uh;"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr ""
"Δεν επιτρέπεται η μετακίνηση αυτού του στοιχείου στον Κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Σφάλμα κατά τη μετάβαση στον Κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr ""
"Δεν επιτρέπεται η επαναφορά αυτού του στοιχείου από τον Κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Σφάλμα κατά την επαναφορά από τον Κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "Δεν επιτρέπεται να διαγράψετε αυτό το αρχείο."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Σφάλμα στη διαγραφή."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr ""
"Το στοιχείο που προσπαθείτε να μετακινήσετε στον Κάδο δεν υπάρχει πλέον."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "Άγνωστο είδος θέσης."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"Δεν μπορείτε να μετακινήσετε αυτό το στοιχείο στον Κάδο απορριμμάτων. Το %s "
"επεξεργάζεται αυτή τη στιγμή."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
#, fuzzy
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""
"Το στοιχείο που προσπαθείτε να επαναφέρετε από τον Κάδο απορριμμάτων δεν "
"υπάρχει πλέον."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr ""
"Δεν επιτρέπεται να μετακινήσετε αυτό το στοιχείο από τον Κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr "Αυτό το στοιχείο έχει ήδη διαγραφεί."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr ""
"Προσπαθήσατε να επεξεργαστείτε ένα στοιχείο που δεν υπάρχει. Ίσως να "
"διαγράφηκε;"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "Δεν επιτρέπεται η παρέμβαση σε αυτό το αρχείο."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"Δεν μπορείτε να επεξεργαστείτε αυτό το στοιχείο επειδή βρίσκεται στον Κάδο "
"απορριμμάτων. Παρακαλούμε να το επαναφέρετε και να προσπαθήσετε ξανά."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "Ενημερώθηκε η δημοσίευση %s."
msgstr[1] "Ενημερώθηκαν οι δημοσιεύσεις %s."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "η καταχώρηση %s δεν Ενημερώθηκε, κάποιος την επεξεργάζεται."
msgstr[1] "οι καταχωρήσεις %s δεν Ενημερώθηκαν, κάποιος τις επεξεργάζεται."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "η δημοσίευση %s διαγράφηκε οριστικά."
msgstr[1] "οι δημοσιεύσεις %s διαγράφηκαν οριστικά."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s άρθρο μεταφέρθηκε στα διαγραμμένα."
msgstr[1] "%s άρθρα μεταφέρθηκαν στα διαγραμμένα."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "η καταχώρηση %s αποκαταστάθηκε από τον κάδο απορριμμάτων."
msgstr[1] "οι καταχωρήσεις %s αποκαταστάθηκαν από τον κάδο απορριμμάτων."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "Η επιλεγμένη φόρμα δεν περιέχει τμήματα"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Εμφάνιση φίλτρων"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
#, fuzzy
msgid "Hide filters"
msgstr "Απόκρυψη φίλτρων"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Φίλτρο βάσει"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "ανοιχτό"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αντικείμενο;"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr "Είστε βέβαιοι ότι θέλετε να κλωνοποιήσετε αυτό το στοιχείο;"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Επεξεργασία ρυθμίσεων"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "Αναγνωριστικό στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "Αναγνωριστικό ενότητας"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "είναι"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "δεν είναι"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "είναι κενό"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "δεν είναι κενό"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "ξεκινάει με"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "τελειώνει με"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "μεγαλύτερος από"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "λιγότερο από"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
#, fuzzy
msgid "greater than or equal to"
msgstr "μεγαλύτερο ή ίσο με"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
#, fuzzy
msgid "less than or equal to"
msgstr "μικρότερο ή ίσο με"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
#, fuzzy
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"Δεν είναι δυνατή η εφαρμογή κανόνων σε αυτό το στοιχείο ή ενότητα, καθώς δεν "
"υπάρχουν στοιχεία ρυθμισμένα με τιμή σε άλλες ενότητες ή δεν βρέθηκαν άλλες "
"ενότητες."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""
"Παρουσιάστηκε σφάλμα! Δεν είναι δυνατή η εφαρμογή όρων σε αυτό το στοιχείο!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "Συμπλήρωση"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "Μη έγκυρη επέκταση αρχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr "Εισαγωγή csv..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr "Αποθήκευση ... Περιμένετε."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "Εισαγωγή δεδομένων"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
#, fuzzy
msgid "Edit price"
msgstr "Επεξεργασία τιμής"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
#, fuzzy
msgid "Edit tab"
msgstr "Καρτέλα \"Επεξεργασία\""

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr "Αντικαταστήστε τα υπάρχοντα στοιχεία"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr "Προσθέστε νέα στοιχεία"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "Το έντυπο εφαρμόζεται σε όλα τα προϊόντα"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "Το έντυπο δεν εφαρμόζεται σε κανένα προϊόν"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Φόρτωση ..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "Μεταβλητές προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
msgid "Special variables"
msgstr "Καθολικές μεταβλητές"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
#, fuzzy
msgid "Global variables"
msgstr "Καθολικές μεταβλητές"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Εμφάνιση συνόλου επιλογών"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
msgid "Original product price + Options Total"
msgstr "Αρχική τιμή προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
msgid "Original product price + Cumulative Total"
msgstr "Αρχική τιμή προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
#, fuzzy
msgid "Product quantity"
msgstr "Ποσότητα προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
#, fuzzy
msgid "Original product price"
msgstr "Αρχική τιμή προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
msgid "Dynamic product price"
msgstr "Αρχική τιμή προϊόντος"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
#, fuzzy
msgid "This element"
msgstr "Αυτό το στοιχείο"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
#, fuzzy
msgid "The value of this element"
msgstr "Η αξία αυτού του στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
#, fuzzy
msgid "The value length of this element"
msgstr "Το μήκος τιμής αυτού του στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
#, fuzzy
msgid "The number of options the user has selected"
msgstr "Ο αριθμός των επιλογών που έχει επιλέξει ο χρήστης"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
#, fuzzy
msgid "The total quantity of this element"
msgstr "Η συνολική ποσότητα αυτού του στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
#, fuzzy
msgid "The quantity of this element"
msgstr "Η ποσότητα αυτού του στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
#, fuzzy
msgid "Other elements"
msgstr "Άλλα στοιχεία"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "Η τιμή του στοχευόμενου στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Αξία"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "Η τιμή του στοχευόμενου στοιχείου που μετατρέπεται σε float"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Κείμενο"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "Η ακατέργαστη αξία του στοχευόμενου στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
#, fuzzy
msgid "Text length"
msgstr "Μήκος κειμένου"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "Το μήκος κειμένου του στοχευόμενου στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "Η συνολική ποσότητα του στοχευόμενου στοιχείου"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Μέτρηση"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr ""
"Ο αριθμός των επιλογών που έχει επιλέξει ο χρήστης στο στοχευόμενο στοιχείο"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Όλα"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Αντιγραφή"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, fuzzy, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Ορυχείο <span class=\"count\">(%s)</span>"
msgstr[1] "Ορυχείο <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Όλα <span class=\"count\">(%s)</span>"
msgstr[1] "Όλα <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, fuzzy, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Κολλώδες <span class=\"count\">(%s)</span>"
msgstr[1] "Κολλώδες <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "Μη έγκυρος πίνακας CSV!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
#, fuzzy
msgid "An error has occurred!"
msgstr "Παρουσιάστηκε σφάλμα!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "Αντικατάσταση υπαρχόντων πινάκων"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "Αναζήτηση πίνακα"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "Δεν βρέθηκε πίνακας CSV!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "Εισαγάγετε ένα κάνοντας κλικ στο παρακάτω κουμπί."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Όνομα πίνακα"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "Ευρετήριο πίνακα"

#: admin/class-themecomplete-epo-admin-settings.php:273
#, fuzzy
msgid "EPO Control Panel"
msgstr "Πίνακας Ελέγχου EPO"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "Extra Product Options 设置"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Επαναφορά ρυθμίσεων"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Αποθήκευση αλλαγών"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "Οποιαδήποτε"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Κλικ για Εναλλαγή"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Χαρακτηριστικό:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Τύπος:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Πλαίσιο ελέγχου"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Επιλέξτε"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Ρυθμίσεις:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Παραλλαγή:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Τιμή:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "Προσαρμοσμένη τιμή (απαιτείται)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Προσαρμοσμένη τιμή"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Χαρακτηριστικά λείπουν. Διαγράψτε αυτήν την επιπλέον επιλογή:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
msgid "Percent of the origιnal price"
msgstr "Ποσοστό της αρχικής τιμής"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "J M Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Η φόρμα ενημερώθηκε."

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "Έγινε αποκατάσταση της μορφής για αναθεώρηση από %s"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "Η φόρμα δημοσιεύτηκε."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Η φόρμα αποθηκεύτηκε."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Η φόρμα υποβλήθηκε."

#: admin/views/html-tm-epo-fields-edit.php:37
#, fuzzy, php-format
msgid "Form scheduled for: %s."
msgstr "Φόρμα προγραμματισμένη για: %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Το προσχέδιο φόρμας ενημερώθηκε."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Εισάγετε τον τίτλο εδώ"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Αναίρεση"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Επιλογή"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Κόστος"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Ποσότητα"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Σύνολο"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "Φόρος"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Επεξεργασία αντικειμένου"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Διαγραφή στοιχείου"

#: admin/views/html-tm-epo.php:29
#, fuzzy
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Πριν προσθέσετε επιπλέον επιλογές σε αυτήν τη λειτουργία, προσθέστε και "
"αποθηκεύστε ορισμένα χαρακτηριστικά στην καρτέλα Χαρακτηριστικά."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Επέκταση όλων"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Σύμπτυξη όλων"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "Προσθήκη πρόσθετης επιλογής"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "WPBakery Page Builder"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Κανονικό"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Για να μεταφράσετε τις συμβολοσειρές για τις τοπικές επιλογές, "
"χρησιμοποιήστε τη διεπαφή WPML."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "Από"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Εύρος"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "Παράκαμψη εμφάνισης τιμής"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Αυτό θα αντικαταστήσει την εμφανιζόμενη τιμή προϊόντος στις σελίδες βρόχου "
"καταστήματος/αρχείου/προϊόντος."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Κανονικό"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "Προς"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Προσφορά"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"Οι φόρμες που θα επιλέξετε θα εμφανίζονται μαζί με τις φόρμες που έχει ήδη "
"το προϊόν."

#: admin/views/html-tm-global-epo.php:206
#, fuzzy
msgid "Exclude from"
msgstr "Εξαίρεση από"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Αυτό θα εξαιρέσει τυχόν καθολικές φόρμες που έχουν εκχωρηθεί σε αυτό το "
"προϊόν εκτός από αυτές που ορίζονται στην προηγούμενη ρύθμιση."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "Παράκαμψη τιμής προϊόντος"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Αυτό θα αντικαταστήσει την τιμή του προϊόντος με την τιμή από τις επιλογές "
"εάν η συνολική τιμή των δικαιωμάτων προτίμησης είναι μεγαλύτερη από μηδέν."

#: admin/views/html-tm-global-epo.php:243
#, fuzzy
msgid "Override global display"
msgstr "Παράκαμψη καθολικής οθόνης"

#: admin/views/html-tm-global-epo.php:244
#, fuzzy
msgid "This will override the display method only for this product."
msgstr "Αυτό θα παρακάμψει τη μέθοδο εμφάνισης μόνο για αυτό το προϊόν."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "Χρήση γενικής ρύθμισης"

#: admin/views/html-tm-global-epo.php:256
#, fuzzy
msgid "Always show"
msgstr "Να εμφανίζεται πάντα"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "Εμφάνιση μόνο με άγκιστρο ενέργειας"

#: admin/views/html-tm-global-epo.php:273
#, fuzzy
msgid "Override Final total box"
msgstr "Πλαίσιο \"Παράκαμψη τελικού συνόλου\""

#: admin/views/html-tm-global-epo.php:274
#, fuzzy
msgid "This will override the totals box display only for this product."
msgstr ""
"Αυτό θα παρακάμψει την εμφάνιση του πλαισίου αθροισμάτων μόνο για αυτό το "
"προϊόν."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
msgid "Disable if Options total is zero"
msgstr "Απόκρυψη πλαισίου \"Τελικό σύνολο\" εάν το σύνολο επιλογών είναι μηδέν"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
msgid "Disable if total is zero"
msgstr "Απόκρυψη πλαισίου \"Τελικό σύνολο\" εάν το σύνολο είναι μηδέν"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Εμφάνιση συνόλου επιλογών"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr "Αυτό θα παρακάμψει τη μέθοδο εμφάνισης μόνο για αυτό το προϊόν."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Εμφάνιση όταν το σύνολο είναι μεγαλύτερο από το μηδέν"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Εμφάνιση Τελικού Συνόλου"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
msgid "This will Show Final Total setting only for this product."
msgstr "Αυτό θα παρακάμψει τη μέθοδο εμφάνισης μόνο για αυτό το προϊόν."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
#, fuzzy
msgid "Override enabled roles for this product"
msgstr "Παράκαμψη ενεργοποιημένων ρόλων για αυτό το προϊόν"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
#, fuzzy
msgid "This will override which roles can see the options for this product."
msgstr ""
"Αυτό θα παρακάμψει ποιοι ρόλοι μπορούν να δουν τις επιλογές για αυτό το "
"προϊόν."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "Η κλωνοποίηση απαγορεύεται."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "Απαγορεύεται η αποτύπωση από αυτήν την κλάση."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "Δωρεάν!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Επιλογή"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "Προσθήκη στο καλάθι"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
#, fuzzy
msgid "Product element is not supported for components!"
msgstr "Το στοιχείο προϊόντος δεν υποστηρίζεται για εξαρτήματα!"

#: includes/class-themecomplete-extra-product-options.php:4984
#, fuzzy
msgid "Product element is not supported within another product element!"
msgstr "Το στοιχείο προϊόντος δεν υποστηρίζεται σε άλλο στοιχείο προϊόντος!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Πλαίσια Επιλογής"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Επιλογέας χρώματος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Ημερομηνία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Κυριακή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Δευτέρα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Τρίτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Τετάρτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Πέμπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Παρασκευή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Σάββατο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
#, fuzzy
msgid "January "
msgstr "Ιανουάριος "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Φεβρουάριος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Μάρτιος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "Απρίλιος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Μάιος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Ιούνιος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Ιούλιος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "Αύγουστος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "Σεπτέμβριος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Οκτώβριος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "Νοέμβριος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "Δεκέμβριος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
#, fuzzy
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Εισαγάγετε μια τιμή που θα εφαρμοστεί αυτόματα στο πεδίο σύμφωνα με την "
"επιλεγμένη μορφή ημερομηνίας. (Δύο ψηφία για την ημέρα, δύο ψηφία για το "
"μήνα και τέσσερα ψηφία για το έτος)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
#, fuzzy
msgid "Minimum selectable date"
msgstr "Ελάχιστη επιλέξιμη ημερομηνία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "Ένας αριθμός ημερών από σήμερα."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
#, fuzzy
msgid "Maximum selectable date"
msgstr "Μέγιστη επιλέξιμη ημερομηνία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Απενεργοποιημένες ημερομηνίες"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Ημερομηνίες διαχωρισμένες με κόμμα σύμφωνα με την επιλεγμένη μορφή "
"ημερομηνίας. (Δύο ψηφία για την ημέρα, δύο ψηφία για το μήνα και τέσσερα "
"ψηφία για το έτος)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
#, fuzzy
msgid "Enabled dates"
msgstr "Ενεργοποιημένες ημερομηνίες"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Ημερομηνίες διαχωρισμένες με κόμμα σύμφωνα με την επιλεγμένη μορφή "
"ημερομηνίας. (Δύο ψηφία για την ημέρα, δύο ψηφία για το μήνα και τέσσερα "
"ψηφία για το έτος). Λάβετε υπόψη ότι αυτό θα αντικαταστήσει οποιαδήποτε άλλη "
"ρύθμιση!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
#, fuzzy
msgid "Epo White"
msgstr "Epo Λευκό"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
#, fuzzy
msgid "Epo Black"
msgstr "Epo Μαύρο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Θέμα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "Επιλέξτε το θέμα για τον δημιουργό ημερομηνιών."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Μικρό"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Μεσαίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Μεγάλο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr "Επιλέξτε το μέγεθος για τον δημιουργό ημερομηνιών."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
#, fuzzy
msgid "Top of screen"
msgstr "Αρχή οθόνης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
#, fuzzy
msgid "Bottom of screen"
msgstr "Κάτω μέρος της οθόνης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Θέση"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr "Επιλέξτε τη θέση για τον δημιουργό ημερομηνιών."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
#, fuzzy
msgid "Exclude disabled"
msgstr "Εξαίρεση απενεργοποιημένης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
#, fuzzy
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Ενεργοποιώντας αυτό θα γίνει έτσι ώστε η ελάχιστη και η μέγιστη επιλέξιμη "
"ημερομηνία να μην υπολογίζονται οι επιλεγμένες απενεργοποιημένες εργάσιμες "
"ημέρες."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
#, fuzzy
msgid "Disable weekdays"
msgstr "Απενεργοποίηση καθημερινών ημερών"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
#, fuzzy
msgid "This allows you to disable all selected weekdays."
msgstr ""
"Αυτό σας επιτρέπει να απενεργοποιήσετε όλες τις επιλεγμένες καθημερινές."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
#, fuzzy
msgid "Disable months"
msgstr "Απενεργοποίηση μηνών"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
#, fuzzy
msgid "This allows you to disable all selected months."
msgstr "Αυτό σας επιτρέπει να απενεργοποιήσετε όλους τους επιλεγμένους μήνες."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Μεταφράσεις"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Ημέρα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Μήνας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Έτος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Διαχωριστικό"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Γενικές επιλογές"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Conditional Logic"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
#, fuzzy
msgid "CSS Settings"
msgstr "Ρυθμίσεις CSS"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
#, fuzzy
msgid "Element class name"
msgstr "Όνομα κλάσης στοιχείου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
#, fuzzy
msgid "Enter an extra class name to add to this element"
msgstr "Εισαγάγετε ένα επιπλέον όνομα κλάσης για προσθήκη σε αυτό το στοιχείο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "Παράκαμψη τιμής προϊόντος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
msgid "Change product weight"
msgstr "Αλλάζει την εικόνα προϊόντος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "Αναγνωριστικό ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr "Επιλέξτε τη φορολογική κλάση για τον τύπο τιμής σε αυτό το στοιχείο."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
msgid "Formula"
msgstr "Μαθηματικός τύπος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
msgid "Enter the formula for the calculation."
msgstr "Εισαγάγετε το βήμα για τη λαβή."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Εμφάνιση ως"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"\"Κλείσιμο\" στο ημερολόγιο."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
msgid "Text before result"
msgstr "Κείμενο πριν από την τιμή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Εισαγάγετε ένα κείμενο που θα εμφανίζεται πριν από την τιμή για αυτό το "
"πεδίο ή αφήστε το κενό χωρίς κείμενο."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
msgid "Text after result"
msgstr "Κείμενο μετά την τιμή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Εισαγάγετε ένα κείμενο που θα εμφανίζεται μετά την τιμή για αυτό το πεδίο ή "
"αφήστε το κενό χωρίς κείμενο."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Επικεφαλίδα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Κεφαλίδα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
#, fuzzy
msgid "Header title"
msgstr "Τίτλος κεφαλίδας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the Content"
msgstr "Αριστερά από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
msgid "Right of the Content"
msgstr "Δεξιά του πεδίου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Θέση επικεφαλίδας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Χρώμα γραμμάτων επικεφαλίδας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
#, fuzzy
msgid "Leave empty for default value"
msgstr "Αφήστε κενό για προεπιλεγμένη τιμή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Περιεχόμενο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
#, fuzzy
msgid "Content color"
msgstr "Χρώμα περιεχομένου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
msgid "Above Header"
msgstr "Πάνω από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
#, fuzzy
msgid "Icon tooltip left"
msgstr "Αριστερή συμβουλή εργαλείου εικονιδίου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
#, fuzzy
msgid "Icon tooltip right"
msgstr "Συμβουλή εργαλείου εικονιδίου δεξιά"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
#, fuzzy
msgid "Content position"
msgstr "Θέση περιεχομένου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
msgid "Multiple Upload"
msgstr "Επιλέξτε Πολλαπλάσιο πλαίσιο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Προϊόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Μοναδικό προϊόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
#, fuzzy
msgid "Select mode"
msgstr "Επιλέξτε λειτουργία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
#, fuzzy
msgid "Whether to include specific products or categories."
msgstr "Εάν θα συμπεριληφθούν συγκεκριμένα προϊόντα ή κατηγορίες."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
#, fuzzy
msgid "Search for a category ..."
msgstr "Αναζήτηση κατηγορίας ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Επιλέξτε κατηγορίες"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
#, fuzzy
msgid "Add categories to include all their associated products."
msgstr ""
"Προσθέστε κατηγορίες για να συμπεριλάβετε όλα τα συσχετισμένα προϊόντα τους."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Αναζήτησε ένα προϊόν ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Επιλέξτε προϊόντα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
#, fuzzy
msgid "Add the products individually."
msgstr "Προσθέστε τα προϊόντα ξεχωριστά."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
#, fuzzy
msgid "Choose a value"
msgstr "Επιλέξτε μια τιμή"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Τιμή Βάσης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "Όνομα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Σειρά μενού"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Τυχαία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Ταξινόμηση κατά"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
#, fuzzy
msgid "Select the parameter which the products will be sorted by."
msgstr "Επιλέξτε την παράμετρο με βάση την οποία θα ταξινομηθούν τα προϊόντα."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Αύξουσα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Φθίνουσα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Παραγγελία"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
#, fuzzy
msgid "Select the sorting order of the products."
msgstr "Επιλέξτε τη σειρά ταξινόμησης των προϊόντων."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Επιλέξτε ένα προϊόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
#, fuzzy
msgid "Default product"
msgstr "Προεπιλεγμένο προϊόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
#, fuzzy
msgid "Select the product that will be pre-selected."
msgstr "Επιλέξτε το προϊόν που θα προεπιλεγεί."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Αναπτυσσόμενο μενού"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Μικρογραφίες"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
#, fuzzy
msgid "Thumbnails multiple"
msgstr "Μικρογραφίες πολλαπλές"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
#, fuzzy
msgid "Layout mode"
msgstr "Λειτουργία διάταξης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
#, fuzzy
msgid "Select how the products will be presented."
msgstr "Επιλέξτε τον τρόπο παρουσίασης των προϊόντων."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
#, fuzzy
msgid "Dropdown Placeholder"
msgstr "Αναπτυσσόμενο σύμβολο κράτησης θέσης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
#, fuzzy
msgid "Enter the placeholder for the dropdown."
msgstr "Εισαγάγετε το σύμβολο κράτησης θέσης για το αναπτυσσόμενο μενού."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Ελάχιστη ποσότητα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Μέγιστη ποσότητα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
#, fuzzy
msgid "Shipped individually"
msgstr "Αποστέλλεται μεμονωμένα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
#, fuzzy
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Εάν αυτό είναι ενεργοποιημένο, το προϊόν που περιλαμβάνεται δεν αποστέλλεται "
"μαζί με το κύριο προϊόν."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
#, fuzzy
msgid "Maintain weight"
msgstr "Διατηρήστε το βάρος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
#, fuzzy
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Εάν αυτό είναι ενεργοποιημένο, το προϊόν που περιλαμβάνεται θα προσθέσει το "
"βάρος του στο κύριο προϊόν."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
#, fuzzy
msgid "Priced individually"
msgstr "Τιμή ξεχωριστά"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
#, fuzzy
msgid "If this is enabled the included product will maintain its own price."
msgstr ""
"Εάν αυτό είναι ενεργοποιημένο, το προϊόν που περιλαμβάνεται θα διατηρήσει τη "
"δική του τιμή."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Ποσοστό"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Τύπος έκπτωσης"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
#, fuzzy
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Επιλέξτε τον τύπο έκπτωσης. Η έκπτωση ισχύει για την τελική τιμή του "
"προϊόντος. Εάν το προϊόν έχει επιπλέον επιλογές τότε η έκπτωση ισχύει για το "
"ποσό μετά την προσθήκη των επιλογών στην τιμή του προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Έκπτωση"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
#, fuzzy
msgid "Enter the discount amount."
msgstr "Εισαγάγετε το ποσό έκπτωσης."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "Απενεργοποίηση πρόσθετων"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Εάν αυτό είναι ενεργοποιημένο, τα πρόσθετα που περιλαμβάνονται στο "
"συσχετισμένο προϊόν δεν θα εμφανίζονται."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "Εξαιρούνται οι τιμές Addon από την έκπτωση"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Εάν αυτό είναι ενεργοποιημένο, η έκπτωση δεν θα εφαρμοστεί στα πρόσθετα "
"προϊόντων."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Καλάθι"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Ταμείο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "Παραγγελία και μηνύματα ηλεκτρονικού ταχυδρομείου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "Απόκρυψη προϊόντος σε"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "Επιλέξτε πού θέλετε να αποκρύψετε το προϊόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
#, fuzzy
msgid "Enable to show the image of the associated product."
msgstr "Ενεργοποίηση για εμφάνιση της εικόνας του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Εμφάνιση τίτλου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
#, fuzzy
msgid "Enable to show the title of the associated product."
msgstr "Ενεργοποίηση για εμφάνιση του τίτλου του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Εμφάνιση τίτλου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
msgid "Enable to have the title link to the associated product."
msgstr "Ενεργοποίηση για εμφάνιση του τίτλου του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "Εμφάνιση τιμής"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
#, fuzzy
msgid "Enable to show the price of the associated product."
msgstr "Ενεργοποίηση για εμφάνιση της τιμής του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
#, fuzzy
msgid "Enable to show the description of the associated product."
msgstr "Ενεργοποίηση για εμφάνιση της περιγραφής του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
#, fuzzy
msgid "Show meta"
msgstr "Εμφάνιση meta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
#, fuzzy
msgid "Enable to show the meta of the associated product."
msgstr "Ενεργοποίηση για εμφάνιση του meta του συσχετισμένου προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Προχωρημένες επιλογές"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
#, fuzzy
msgid "Range picker"
msgstr "Επιλογέας εύρους"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "Επιλέξτε επιλογές τίτλου σελίδας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
#, fuzzy
msgid "Normal (clear)"
msgstr "Κανονική (καθαρή)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Πλαίσιο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
#, fuzzy
msgid "Expand and Collapse (start opened)"
msgstr "Ανάπτυξη και σύμπτυξη (έναρξη ανοίγματος)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
#, fuzzy
msgid "Expand and Collapse (start closed)"
msgstr "Ανάπτυξη και σύμπτυξη (έναρξη κλειστή)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Ακορντεόν"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
#, fuzzy
msgid "Section style"
msgstr "Στυλ ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
#, fuzzy
msgid "Select this section's display style."
msgstr "Επιλέξτε το στυλ εμφάνισης αυτής της ενότητας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr "Χρώμα φόντου ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
#, fuzzy
msgid "Section label background color"
msgstr "Χρώμα φόντου ετικέτας ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
#, fuzzy
msgid "Section subtitle background color"
msgstr "Χρώμα φόντου υποτίτλων ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
#, fuzzy
msgid "Before Local Options"
msgstr "Πριν από τις τοπικές επιλογές"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
#, fuzzy
msgid "After Local Options"
msgstr "Μετά τις τοπικές επιλογές"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
#, fuzzy
msgid "Section placement"
msgstr "Τοποθέτηση ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
#, fuzzy
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Επιλέξτε πού θα εμφανίζεται αυτή η ενότητα σε σύγκριση με τις τοπικές "
"Επιλογές."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
#, fuzzy
msgid "Pop up"
msgstr "Εμφανιστεί"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
#, fuzzy
msgid "Slider (wizard)"
msgstr "Ρυθμιστικό (οδηγός)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Καρτέλες"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
#, fuzzy
msgid "Section type"
msgstr "Τύπος ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
#, fuzzy
msgid "Select this section's display type."
msgstr "Επιλέξτε τον τύπο εμφάνισης αυτής της ενότητας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
#, fuzzy
msgid "Text link"
msgstr "Σύνδεσμος κειμένου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Κουμπί"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
#, fuzzy
msgid "Button Alt"
msgstr "Κουμπί Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
#, fuzzy
msgid "Section pop up button style"
msgstr "Στυλ αναδυόμενου κουμπιού ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
#, fuzzy
msgid "Select this section's pop up button style."
msgstr "Επιλέξτε το στυλ αναδυόμενου κουμπιού αυτής της ενότητας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
#, fuzzy
msgid "Section pop up button text"
msgstr "Κείμενο αναδυόμενου κουμπιού ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
#, fuzzy
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το προεπιλεγμένο κείμενο του "
"αναδυόμενου κουμπιού. Αυτό θα υπερισχύσει της παγκόσμιας αξίας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
#, fuzzy
msgid "Section class name"
msgstr "Όνομα κλάσης ενότητας"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
#, fuzzy
msgid "Enter an extra class name to add to this section"
msgstr "Εισαγάγετε ένα επιπλέον όνομα κλάσης για προσθήκη σε αυτήν την ενότητα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
#, fuzzy
msgid "Section Conditional Logic"
msgstr "Ενότητα Λογική υπό όρους"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
#, fuzzy
msgid "Enable conditional logic for showing or hiding this section."
msgstr ""
"Ενεργοποιήστε τη λογική υπό όρους για την εμφάνιση ή την απόκρυψη αυτής της "
"ενότητας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Επιλέξτε κουτί"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
#, fuzzy
msgid "This will count as an empty value in case the element is required."
msgstr "Αυτό θα μετρήσει ως κενή τιμή σε περίπτωση που απαιτείται το στοιχείο."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
#, fuzzy
msgid "Multi-Select Field"
msgstr "Επιλέξτε Πολλαπλάσιο πλαίσιο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Πρότυπο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
#, fuzzy
msgid "Select a template ..."
msgstr "Επιλέξτε ένα πρότυπο ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Επιλέξτε πρότυπο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
#, fuzzy
msgid "Add the template you want to display."
msgstr "Προσθέστε το πρότυπο που θέλετε να εμφανίσετε."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Περιοχή Κειμένου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Πεδίο κειμένου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
msgid "Enter the step."
msgstr "Εισαγάγετε το βήμα ποσότητας."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Ώρα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
#, fuzzy
msgid "System style"
msgstr "Στυλ συστήματος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Προσαρμοσμένο στυλ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
#, fuzzy
msgid "Time picker style"
msgstr "Στυλ επιλογής χρόνου"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
#, fuzzy
msgid "Minimum selectable time"
msgstr "Ελάχιστος επιλέξιμος χρόνος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
#, fuzzy
msgid "Enter the time the following format: 8:00 am"
msgstr "Εισαγάγετε την ώρα με την ακόλουθη μορφή: 8:00 π.μ."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
#, fuzzy
msgid "Maximum selectable time"
msgstr "Μέγιστος επιλέξιμος χρόνος"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
#, fuzzy
msgid "Select the theme for the timepicker."
msgstr "Επιλέξτε το θέμα για τον επιλογέα χρόνου."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
#, fuzzy
msgid "Select the size of the timepicker."
msgstr "Επιλέξτε το μέγεθος του επιλογέα χρόνου."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
#, fuzzy
msgid "Select the position of the timepicker."
msgstr "Επιλέξτε τη θέση του επιλογέα χρόνου."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Ώρα"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Λεπτό"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Δευτερόλεπτο"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Μεταφόρτωση"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Παραλλαγές"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
#, fuzzy
msgid "Element Conditional Logic"
msgstr "Στοιχείο λογικής υπό όρους"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
#, fuzzy
msgid "Enable conditional logic for showing or hiding this element."
msgstr ""
"Ενεργοποιήστε τη λογική υπό όρους για την εμφάνιση ή την απόκρυψη αυτού του "
"στοιχείου."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "ετικέτα"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
#, fuzzy
msgid "Label type"
msgstr "Τύπος ετικέτας"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Ετικέτα"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
msgid "Label view mode"
msgstr "Επιλέξτε λειτουργία"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above the fields"
msgstr "Πάνω από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above field"
msgstr "Πάνω από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the fields"
msgstr "Αριστερά από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr "Αριστερά από το πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the fields"
msgstr "Δεξιά του πεδίου"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the field"
msgstr "Δεξιά του πεδίου"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
#, fuzzy
msgid "Label position"
msgstr "Θέση ετικέτας"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Χρώμα ετικέτας"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Υπότιτλος"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below the fields"
msgstr "Κάτω πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below field"
msgstr "Κάτω πεδίο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
#, fuzzy
msgid "Subtitle position"
msgstr "Θέση υποτίτλων"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Χρώμα υποσέλιδου"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
#, fuzzy
msgid "Horizontal rule"
msgstr "Οριζόντιος κανόνας"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Περιθώριο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
#, fuzzy
msgid "Divider type"
msgstr "Τύπος διαχωριστικού"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
#, fuzzy
msgid "Label Options"
msgstr "Επιλογές ετικέτας"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
#, fuzzy
msgid "Element container id"
msgstr "Αναγνωριστικό κοντέινερ στοιχείου"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
#, fuzzy
msgid "Enter an id for the container of the element."
msgstr "Εισαγάγετε ένα αναγνωριστικό για τον περιέκτη του στοιχείου."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
#, fuzzy
msgid "Inherit product setting"
msgstr "Μεταβίβαση ρύθμισης προϊόντος"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr "Συμπερίληψη φόρου για τον τύπο τιμής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Επιλέξτε εάν θα συμπεριληφθεί φόρος για τον τύπο τιμής σε αυτό το στοιχείο."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr "Φορολογική κλάση για τον τύπο τιμής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr "Επιλέξτε τη φορολογική κλάση για τον τύπο τιμής σε αυτό το στοιχείο."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
#, fuzzy
msgid "Hide element label in cart"
msgstr "Απόκρυψη ετικέτας στοιχείου στο καλάθι"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
#, fuzzy
msgid "Choose whether to hide the element label in the cart or not."
msgstr ""
"Επιλέξτε αν θέλετε να αποκρύψετε την ετικέτα στοιχείου στο καλάθι ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
#, fuzzy
msgid "No, but hide price"
msgstr "Όχι, αλλά απόκρυψη τιμής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
#, fuzzy
msgid "Yes, but show price"
msgstr "Ναι, αλλά εμφάνιση τιμής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
#, fuzzy
msgid "Hide element value in cart"
msgstr "Απόκρυψη τιμής στοιχείου στο καλάθι"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
#, fuzzy
msgid "Choose whether to hide the element value in the cart or not."
msgstr ""
"Επιλέξτε αν θέλετε να αποκρύψετε την τιμή του στοιχείου στο καλάθι ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "Απόκρυψη ετικέτας στοιχείου στην παραγγελία"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr "Επιλέξτε αν θα αποκρύψετε την ετικέτα στοιχείου στην παραγγελία ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "Απόκρυψη τιμής στοιχείου στην παραγγελία"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr ""
"Επιλέξτε αν θα αποκρύψετε την τιμή του στοιχείου στην παραγγελία ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "Απόκρυψη ετικέτας στοιχείου σε αιωρούμενα σύνολα"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
#, fuzzy
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Επιλέξτε εάν θέλετε να αποκρύψετε την ετικέτα στοιχείου στο πλαίσιο "
"αιωρούμενων συνόλων ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
#, fuzzy
msgid "Hide element value in floating totals box"
msgstr "Απόκρυψη τιμής στοιχείου σε αιωρούμενα σύνολα πλαίσιο"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
#, fuzzy
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Επιλέξτε εάν θέλετε να αποκρύψετε την τιμή του στοιχείου στο πλαίσιο "
"αιωρούμενων συνόλων ή όχι."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "Ρυθμίσεις για το WooCommerce"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
#, fuzzy
msgid "Enable repeater"
msgstr "Ενεργοποίηση επαναλήπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
#, fuzzy
msgid "This will make this element repeatable."
msgstr "Αυτό θα κάνει αυτό το στοιχείο επαναλαμβανόμενο."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
#, fuzzy
msgid "Bind repeater with product quantity"
msgstr "Συνδέστε τον επαναλήπτη με την ποσότητα του προϊόντος"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
#, fuzzy
msgid "This will make this element repeatable based on the product quantity."
msgstr ""
"Αυτό θα κάνει αυτό το στοιχείο επαναλαμβανόμενο με βάση την ποσότητα του "
"προϊόντος."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
#, fuzzy
msgid "Repeater minimum limit"
msgstr "Ελάχιστο όριο επαναλήπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
#, fuzzy
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Ορίστε τον ελάχιστο αριθμό γραμμών που μπορεί να προσθέσει ένας χρήστης για "
"το πεδίο επανάληψης."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
#, fuzzy
msgid "Repeater maximum limit"
msgstr "Μέγιστο όριο επαναλήπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
#, fuzzy
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Ορίστε τον μέγιστο αριθμό γραμμών που μπορεί να προσθέσει ένας χρήστης για "
"το πεδίο επαναλήπτη."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
#, fuzzy
msgid "Repeater Button Label"
msgstr "Ετικέτα κουμπιού επαναλήπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
#, fuzzy
msgid "Leave this blank for the default label."
msgstr "Αφήστε αυτό το κενό για την προεπιλεγμένη ετικέτα."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "Αναγνωριστικό σύνδεσης κουμπιού επιλογής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Εισαγάγετε ένα προσαρμοσμένο αναγνωριστικό για να συνδέσετε διαφορετικά "
"στοιχεία κουμπιού επιλογής."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
#, fuzzy
msgid "Repeater Settings"
msgstr "Ρυθμίσεις επαναλήπτη"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, fuzzy, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Όλες οι παρουσίες της μεθόδου &quot;%s&quot;"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, fuzzy, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (Αναγνωριστικό παρουσίας: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
#, fuzzy
msgid "Flat Rates (Legacy)"
msgstr "Κατ 'αποκοπή χρεώσεις (Legacy)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
#, fuzzy
msgid "(Legacy)"
msgstr "(Κληρονομιά)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "Επιλέξτε τρόπους αποστολής ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "Ενεργοποίηση μεθόδων αποστολής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "Επιλέξτε τις μεθόδους αποστολής που θέλετε να ενεργοποιήσετε."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "Ενεργοποίηση κατάστασης μεθόδων αποστολής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Καθορίστε τις συνθήκες για την ενεργοποίηση των μεθόδων αποστολής με βάση "
"την τιμή του τρέχοντος πεδίου. Εάν πληρούνται οι προϋποθέσεις, οι "
"επιλεγμένες μέθοδοι αποστολής θα είναι διαθέσιμες για να επιλέξουν οι "
"πελάτες κατά την ολοκλήρωση της αγοράς."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
#, fuzzy
msgid "Disable Shipping Methods"
msgstr "Απενεργοποίηση μεθόδων αποστολής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "Επιλέξτε τις μεθόδους αποστολής που θέλετε να απενεργοποιήσετε."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "Απενεργοποίηση κατάστασης μεθόδων αποστολής"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Καθορίστε τις συνθήκες για την απενεργοποίηση των μεθόδων αποστολής με βάση "
"την τιμή του τρέχοντος πεδίου. Εάν πληρούνται οι προϋποθέσεις, οι "
"επιλεγμένες μέθοδοι αποστολής δεν θα είναι διαθέσιμες για να επιλέξουν οι "
"πελάτες κατά την ολοκλήρωση της αγοράς."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Ενέργειες"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Γενικές Ρυθμίσεις"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
#, fuzzy
msgid "Inherit product tax class"
msgstr "Κληρονομική φορολογική κατηγορία προϊόντων"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Τυπικό"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "Αφήστε το κενό για να το υπολογίσετε αυτόματα από την τιμή %s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr "Αφήστε το κενό για να το υπολογίσετε αυτόματα από την %s τιμή πώλησης"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "αυτή την ενότητα, εάν πληρούνται οι ακόλουθες προϋποθέσεις."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "αυτό το πεδίο, εάν πληρούνται οι ακόλουθες προϋποθέσεις."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "Προσθήκη νέας ομάδας συνθηκών"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr ""
"Η ποσότητα του &quot;%1$s&quot; δεν μπορεί να είναι μικρότερη από %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr ""
"Η ποσότητα του &quot;%1$s&quot; δεν μπορεί να είναι μεγαλύτερη από %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr ""
"Η ποσότητα του &quot;%1$s&quot; πρέπει να αναγράφεται σε πολλαπλάσια του "
"%2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, fuzzy, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s αφαιρεθεί μαζί με όλα τα σχετικά προϊόντα της!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"Το προϊόν %s αφαιρέθηκε από το καλάθι επειδή είχε αλλάξει από τότε που "
"προστέθηκε."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
#, fuzzy
msgid "You cannot add negative priced products to the cart."
msgstr "Δεν μπορείτε να προσθέσετε προϊόντα αρνητικής τιμής στο καλάθι."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
#, fuzzy
msgid "You cannot add zero priced products to the cart."
msgstr "Δεν μπορείτε να προσθέσετε προϊόντα μηδενικής τιμής στο καλάθι."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
#, fuzzy
msgid "Additional options"
msgstr "Πρόσθετες επιλογές"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "Το \"%s\" είναι υποχρεωτικό πεδίο."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, fuzzy, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s έχει αφαιρεθεί από το καλάθι σας επειδή έκτοτε έχει τροποποιηθεί. "
"Μπορείτε να το προσθέσετε ξανά στο καλάθι σας %2$s."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "εδώ"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
#, fuzzy
msgid "Extra fee"
msgstr "Επιπλέον χρέωση"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Άδειο καλάθι"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Επεξεργασία επιλογών"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Ενημέρωση καλαθιού"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "το %s ενημερώθηκε."
msgstr[1] "τα %s ενημερώθηκε."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Προβολή Καλαθιού"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"Επιπλέον επιλογές προϊόντων και πρόσθετα για WooCommerce απαιτεί WordPress "
"%s ή νεότερη έκδοση."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Επιπλέον επιλογές προϊόντων και πρόσθετα για WooCommerce απαιτεί WooCommerce "
"Επιπλέον επιλογές ολοκλήρωσης αγοράς %s ή νεότερη έκδοση!."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
#, fuzzy
msgid "The installed version is"
msgstr "Η εγκατεστημένη έκδοση είναι"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Σημαντικό:%2$s Η έκδοση του WooCommerce Extra Checkout Options δεν "
"υποστηρίζεται. Ενημερώστε στην πιο πρόσφατη έκδοση."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Σημαντικό:%2$s Επιπλέον επιλογές προϊόντων και πρόσθετα για το "
"WooCommerce έχει απενεργοποιηθεί επειδή δεν είναι συμβατό με την τρέχουσα "
"έκδοση των Extra Checkout Options."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Σημαντικό:%2$s Επιπλέον επιλογές προϊόντων και πρόσθετα για το "
"WooCommerce έχει απενεργοποιηθεί επειδή δεν είναι συμβατό με την τρέχουσα "
"έκδοση των Extra Checkout Options."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Σημαντικό:%2$s Εκτελέστε το WooCommerce updater πριν χρησιμοποιήσετε "
"επιπλέον επιλογές προϊόντων και πρόσθετα για WooCommerce."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Σημαντικό:%2$s Επιπλέον επιλογές προϊόντων και πρόσθετα για το "
"WooCommerce απαιτεί %3$sWooCommerce%4$s %5$s ή νεότερη έκδοση."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Εκτέλεση της ενήμερωσης"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s Σημαντικό:%2$s Επιπλέον επιλογές προϊόντων και πρόσθετα για WooCommerce "
"απαιτεί WordPress %3$s ή νεότερη έκδοση."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Σημαντικό:%2$s Επιπλέον επιλογές προϊόντων και πρόσθετα για WooCommerce "
"απαιτεί έκδοση PHP %3$s ή νεότερη."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Όνομα αρχείου"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Διαγραφή"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "TM Extra Product Options"

#: includes/classes/class-themecomplete-epo-post-types.php:101
#, fuzzy
msgid "Global Forms"
msgstr "Καθολικές φόρμες"

#: includes/classes/class-themecomplete-epo-post-types.php:102
#, fuzzy
msgid "Global Form"
msgstr "Καθολική φόρμα"

#: includes/classes/class-themecomplete-epo-post-types.php:103
#, fuzzy
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Καθολικές φόρμες"

#: includes/classes/class-themecomplete-epo-post-types.php:104
#, fuzzy
msgid "Add Global Form"
msgstr "Προσθήκη καθολικής φόρμας"

#: includes/classes/class-themecomplete-epo-post-types.php:105
#, fuzzy
msgid "Add New Global Form"
msgstr "Προσθήκη νέας καθολικής φόρμας"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Επεξεργασία"

#: includes/classes/class-themecomplete-epo-post-types.php:107
#, fuzzy
msgid "Edit Global Form"
msgstr "Επεξεργασία καθολικής φόρμας"

#: includes/classes/class-themecomplete-epo-post-types.php:108
#, fuzzy
msgid "New Global Form"
msgstr "Νέα καθολική φόρμα"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
#, fuzzy
msgid "View Global Form"
msgstr "Προβολή καθολικής φόρμας"

#: includes/classes/class-themecomplete-epo-post-types.php:111
#, fuzzy
msgid "Search Global Form"
msgstr "Αναζήτηση καθολικής φόρμας"

#: includes/classes/class-themecomplete-epo-post-types.php:112
#, fuzzy
msgid "No Global Form found"
msgstr "Δεν βρέθηκε καθολική φόρμα"

#: includes/classes/class-themecomplete-epo-post-types.php:113
#, fuzzy
msgid "No Global Form found in trash"
msgstr "Δεν βρέθηκε καθολική φόρμα στα σκουπίδια"

#: includes/classes/class-themecomplete-epo-post-types.php:114
#, fuzzy
msgid "Parent Global Form"
msgstr "Γονική καθολική φόρμα"

#: includes/classes/class-themecomplete-epo-post-types.php:116
#, fuzzy
msgid "This is where you can add new global options to your store."
msgstr "Εδώ μπορείτε να προσθέσετε νέες καθολικές επιλογές στο κατάστημά σας."

#: includes/classes/class-themecomplete-epo-post-types.php:156
#, fuzzy
msgid "Option Templates"
msgstr "Πρότυπα επιλογών"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "Πρότυπο επιλογής"

#: includes/classes/class-themecomplete-epo-post-types.php:158
#, fuzzy
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Πρότυπα επιλογών"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Προσθήκη προτύπου"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Προσθήκη νέο πρωτότυπο"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Επεξεργασία Προτύπου"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Νέο πρότυπο"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Προβολή προτύπου"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Πρότυπο αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "Δεν βρέθηκε πρότυπο"

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr "Δεν βρέθηκε πρότυπο σε κάδο απορριμμάτων"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "Γονικό πρότυπο"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "Εδώ μπορείτε να προσθέσετε νέες επιλογές καθολικού προτύπου."

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "Πίνακες αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Πίνακες αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "Προσθήκη πίνακα αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "Προσθήκη νέου πίνακα αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "Επεξεργασία πίνακα αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "Νέος πίνακας αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "Προβολή πίνακα αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "Αναζήτηση πίνακα αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "Δεν βρέθηκε πίνακας αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "Δεν βρέθηκε πίνακας αναζήτησης στον κάδο απορριμμάτων"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "Γονικός πίνακας αναζήτησης"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "Εδώ μπορείτε να προσθέσετε νέους πίνακες αναζήτησης."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Τιμή μονάδας"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Κόστος επιλογών"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "Επιλογές Ποσό ΦΠΑ"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
#, fuzzy
msgid "Fees amount"
msgstr "Ποσό τελών"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
#, fuzzy
msgid "Final total"
msgstr "Τελικό σύνολο"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Προηγούμενο"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Επόμενο"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "χαρακτήρες απομένουν"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
#, fuzzy
msgid "Uploading files"
msgstr "Μεταφόρτωση αρχείων"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
#, fuzzy
msgid "Your files are being uploaded"
msgstr "Τα αρχεία σας μεταφορτώνονται"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "αρχείο"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "αρχεία"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Αυτό το πεδίο είναι υποχρεωτικό."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Παρακαλώ εισάγετε μία έγκυρη διεύθυνση email."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Εισαγάγετε μια έγκυρη διεύθυνση URL."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Παρακαλώ εισάγετε έναν έγκυρο αριθμό."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Παρακαλώ, εισάγετε μόνο ψηφία."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Εισαγάγετε μια τιμή μικρότερη ή ίση με {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Εισαγάγετε μια τιμή μεγαλύτερη ή ίση με {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:582
#, fuzzy
msgid "Please enter no more than {0} character."
msgstr "Εισαγάγετε όχι περισσότερο από {0} χαρακτήρα."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "Παρακαλώ μην συμπληρώστε παρισότερους από {0} χαρακτήρες."

#: includes/classes/class-themecomplete-epo-scripts.php:584
#, fuzzy
msgid "Please enter at least {0} character."
msgstr "Εισαγάγετε τουλάχιστον {0} χαρακτήρα."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Εισαγάγετε τουλάχιστον {0} χαρακτήρες."

#: includes/classes/class-themecomplete-epo-scripts.php:586
#, fuzzy
msgid "Please select up to {0} choice."
msgstr "Επιλέξτε μέχρι {0} επιλογή."

#: includes/classes/class-themecomplete-epo-scripts.php:587
#, fuzzy
msgid "Please select up to {0} choices."
msgstr "Επιλέξτε έως και {0} επιλογές."

#: includes/classes/class-themecomplete-epo-scripts.php:588
#, fuzzy
msgid "Please select exactly {0} choice."
msgstr "Επιλέξτε ακριβώς {0} επιλογή."

#: includes/classes/class-themecomplete-epo-scripts.php:589
#, fuzzy
msgid "Please select exactly {0} choices."
msgstr "Επιλέξτε ακριβώς {0} επιλογές."

#: includes/classes/class-themecomplete-epo-scripts.php:590
#, fuzzy
msgid "Please select at least {0} choice."
msgstr "Επιλέξτε τουλάχιστον {0} επιλογή."

#: includes/classes/class-themecomplete-epo-scripts.php:591
#, fuzzy
msgid "Please select at least {0} choices."
msgstr "Επιλέξτε τουλάχιστον {0} επιλογές."

#: includes/classes/class-themecomplete-epo-scripts.php:592
#, fuzzy
msgid "Please enter a multiple of {0}."
msgstr "Εισαγάγετε ένα πολλαπλάσιο του {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:593
#, fuzzy
msgid "Please enter only letters."
msgstr "Παρακαλώ εισάγετε μόνο γράμματα."

#: includes/classes/class-themecomplete-epo-scripts.php:594
#, fuzzy
msgid "Please enter only letters or spaces."
msgstr "Εισαγάγετε μόνο γράμματα ή κενά."

#: includes/classes/class-themecomplete-epo-scripts.php:595
#, fuzzy
msgid "Please enter only letters, numbers or hyphens."
msgstr "Εισαγάγετε μόνο γράμματα, αριθμούς ή κάτω παύλες."

#: includes/classes/class-themecomplete-epo-scripts.php:596
#, fuzzy
msgid "Please enter only unicode letters and numbers."
msgstr "Εισαγάγετε μόνο γράμματα και αριθμούς unicode."

#: includes/classes/class-themecomplete-epo-scripts.php:597
#, fuzzy
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Εισαγάγετε μόνο γράμματα, αριθμούς ή κενά unicode."

#: includes/classes/class-themecomplete-epo-scripts.php:598
#, fuzzy
msgid "Minimum number of rows is {0}"
msgstr "Ο ελάχιστος αριθμός γραμμών είναι {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
#, fuzzy
msgid "Maximum number of rows is {0}"
msgstr "Ο μέγιστος αριθμός γραμμών είναι {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Ολοκληρώθηκε"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Σήμερα"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "Γενικά"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Εμφάνιση"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Strings"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Στυλ"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Γενικό"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr "Διαχείριση Μεταφόρτωσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Προσαρμοσμένος κώδικας"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "Σταθερές μαθηματικών τύπων"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Άδεια Χρήσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Παραγγελία"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Παραγγελία"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr "Ενεργοποίηση"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr "Τελικό συνολικό κουτί"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Διάφορα"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
msgid "Enable Frontend Access for Selected Roles"
msgstr "Ενεργοποίηση front-end για ρόλους"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
#, fuzzy
msgid "Select the roles that will have access to the extra options."
msgstr "Επιλέξτε τους ρόλους που θα έχουν πρόσβαση στις επιπλέον επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
msgid "Disable Frontend Access for Selected Roles"
msgstr "Απενεργοποίηση front-end για ρόλους"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
#, fuzzy
msgid "Select the roles that will not have access to the extra options."
msgstr "Επιλέξτε τους ρόλους που δεν θα έχουν πρόσβαση στις επιπλέον επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
#, fuzzy
msgid "Enable translations"
msgstr "Ενεργοποίηση μεταφράσεων"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr ""
"Αυτό θα ενεργοποιήσει την προεπιλεγμένη μετάφραση plugin χρησιμοποιώντας τα "
"αρχεία pot."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "Προτεραιότητα αγκίστρου τύπου ανάρτησης"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"Μην το αλλάξετε αυτό, εκτός αν γνωρίζετε πώς θα επηρεάσει τον ιστότοπό σας! "
"Αυτή είναι η προτεραιότητα που φορτώνονται οι τύποι θέσεων από το plugin."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
#, fuzzy
msgid "Default value is 100"
msgstr "Η προεπιλεγμένη τιμή είναι 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
msgid "Specify the areas where the plugin will be activated."
msgstr "Επιλέξτε την παράμετρο με βάση την οποία θα ταξινομηθούν τα προϊόντα."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Όλοι"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "Προϊόντα και Κατηγορίες"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "Μεταβλητές προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Σελίδα προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
#, fuzzy
#| msgid "Final total box"
msgid "Final Total Box"
msgstr "Τελικό συνολικό κουτί"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Ενεργοποιήστε αυτήν τη ρύθμιση για την εμφάνιση ενός Τελικού Συνολικού "
"Πλαισίου στη σελίδα προϊόντος, επιτρέποντας στους πελάτες να δουν το "
"συνολικό κόστος της παραγγελίας τους ή να το απενεργοποιήσουν για μια "
"απλοποιημένη σελίδα προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Εμφάνιση συνόλου επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Ενεργοποίηση για εμφάνιση του συνόλου ειδικά για επιλεγμένες επιλογές "
"προϊόντων."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Εμφάνιση Τελικού Συνόλου"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Ενεργοποιήστε την εμφάνιση του συνολικού πλήρους προϊόντος, παρέχοντας στους "
"πελάτες μια σαφή επισκόπηση του συνολικού κόστους."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
#, fuzzy
msgid "Enable Final total box for all products"
msgstr "Ενεργοποίηση πλαισίου τελικού συνόλου για όλα τα προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
#, fuzzy
msgid "Show the Final total box even when the product has no extra options"
msgstr ""
"Εμφάνιση του τελικού συνολικού κουτιού ακόμα και όταν το προϊόν δεν έχει "
"επιπλέον επιλογές"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
#, fuzzy
msgid "Enable original final total display"
msgstr "Ενεργοποίηση αρχικής τελικής συνολικής προβολής"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
#, fuzzy
msgid "Check to enable the display of the undiscounted final total"
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε την εμφάνιση του τελικού συνόλου χωρίς "
"προεξόφληση"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "Ενεργοποίηση επιλογών Εμφάνιση ΦΠΑ"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Ελέγξτε για να εμφανίσετε τις επιλογές ποσό ΦΠΑ πάνω από το σύνολο των "
"επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
#, fuzzy
msgid "Show Unit price on totals box"
msgstr "Πλαίσιο \"Εμφάνιση τιμής μονάδας στα σύνολα\""

#: includes/classes/class-themecomplete-epo-settings-base.php:379
#, fuzzy
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Ενεργοποιήστε αυτήν την επιλογή για να εμφανίζεται η τιμή μονάδας όταν είναι "
"ορατό το πλαίσιο συνόλων"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
#, fuzzy
msgid "Include Fees on unit price"
msgstr "Συμπεριλάβετε τέλη στην τιμή μονάδας"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
#, fuzzy
msgid "Enable this to add any Fees to the unit price"
msgstr ""
"Ενεργοποιήστε αυτήν την επιλογή για να προσθέσετε τυχόν χρεώσεις στην τιμή "
"μονάδας"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
#, fuzzy
msgid "Total price as Unit Price"
msgstr "Συνολική τιμή ως τιμή μονάδας"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
#, fuzzy
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Κάντε τη συνολική τιμή να μην πολλαπλασιάζεται με την ποσότητα του προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "Απόκρυψη πλαισίου \"Τελικό σύνολο\" μέχρι να επιλεγεί ένα στοιχείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Επιλέξτε αυτό για να εμφανίσετε το πλαίσιο Τελικό σύνολο μόνο όταν "
"συμπληρωθεί τουλάχιστον μία επιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr ""
"Απόκρυψη πλαισίου Τελικό σύνολο μέχρι να επιλεγούν όλα τα απαιτούμενα "
"στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Επιλέξτε αυτό για να εμφανίσετε το πλαίσιο Τελικό σύνολο μόνο όταν "
"συμπληρωθούν όλες οι απαιτούμενες ορατές επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr "Απόκρυψη πλαισίου \"Τελικό σύνολο\" μέχρι να επιλεγούν όλα τα στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Επιλέξτε αυτό για να εμφανίσετε το πλαίσιο Τελικό σύνολο μόνο όταν "
"συμπληρωθούν όλες οι ορατές επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
#, fuzzy
msgid "Disable lazy load images"
msgstr "Απενεργοποιήστε τις εικόνες τεμπέλης φόρτωσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
#, fuzzy
msgid "Enable this to disable lazy loading images."
msgstr ""
"Ενεργοποιήστε αυτό για να απενεργοποιήσετε την τεμπέλης φόρτωση εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
#, fuzzy
msgid "Preload lightbox images"
msgstr "Προφόρτωση εικόνων lightbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
#, fuzzy
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""
"Ενεργοποιήστε αυτό για να προφορτώσετε την εικόνα όταν χρησιμοποιείτε τη "
"λειτουργία lightbox."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
#, fuzzy
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Ενεργοποιήστε την προσθήκη για WooCommerce shortcodes"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
#, fuzzy
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Η ενεργοποίηση αυτού θα φορτώσει τα αρχεία plugin σε όλες τις σελίδες "
"WordPress. Χρησιμοποιήστε με προσοχή."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
#, fuzzy
msgid "Enable shortcodes in options strings"
msgstr "Ενεργοποίηση σύντομων κωδικών σε συμβολοσειρές επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
#, fuzzy
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"Η ενεργοποίηση αυτού θα επιτρέψει τη χρήση σύντομων κωδικών και κώδικα HTML "
"στην ετικέτα επιλογών και στο κείμενο περιγραφής."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Τοποθέτηση"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
#, fuzzy
msgid "Floating Totals box"
msgstr "Πλαίσιο \"Αιωρούμενα σύνολα\""

#: includes/classes/class-themecomplete-epo-settings-base.php:481
#, fuzzy
msgid "Add to cart button"
msgstr "Κουμπί προσθήκης στο καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animation"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
#, fuzzy
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Αυτό ελέγχει τον τρόπο εμφάνισης των πεδίων σας στο προσκήνιο. Εάν επιλέξετε "
"\"Εμφάνιση χρησιμοποιώντας άγκιστρα δράσης\" πρέπει να γράψετε χειροκίνητα "
"τον κώδικα στο θέμα ή το plugin σας για να εμφανίσετε τα πεδία και οι "
"παρακάτω ρυθμίσεις τοποθέτησης δεν θα λειτουργήσουν. Εάν χρησιμοποιείτε την "
"επέκταση σύνθετων προϊόντων, πρέπει να αφήσετε αυτήν τη ρύθμιση σε \"Κανονική"
"\", διαφορετικά οι επιπλέον επιλογές δεν μπορούν να εμφανιστούν στα πακέτα "
"σύνθετων προϊόντων. Δείτε περισσότερα στην τεκμηρίωση."

#: includes/classes/class-themecomplete-epo-settings-base.php:497
#, fuzzy
msgid "Show using action hooks"
msgstr "Εμφάνιση με χρήση αγκίστρων δράσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
#, fuzzy
msgid "Extra Options placement"
msgstr "Τοποθέτηση επιπλέον επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
#, fuzzy
msgid "Select where you want the extra options to appear."
msgstr "Επιλέξτε πού θέλετε να εμφανίζονται οι επιπλέον επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Πριν από την προσθήκη στο κουμπί καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Μετά την προσθήκη στο κουμπί καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
#, fuzzy
msgid "Before cart form"
msgstr "Φόρμα πριν από το καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
#, fuzzy
msgid "After cart form"
msgstr "Φόρμα μετά το καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "Πριν το προϊόν"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "Μετά το προϊόν"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
#, fuzzy
msgid "Before product summary"
msgstr "Πριν από τη σύνοψη προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Μετά την περίληψη του προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
#, fuzzy
msgid "After product image"
msgstr "Μετά την εικόνα του προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
#, fuzzy
msgid "Custom hook"
msgstr "Προσαρμοσμένο άγκιστρο"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
#, fuzzy
msgid "Extra Options placement custom hook"
msgstr "Επιπλέον επιλογές τοποθέτηση προσαρμοσμένου γάντζου"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
#, fuzzy
msgid "Extra Options placement hook priority"
msgstr "Προτεραιότητα αγκίστρου τοποθέτησης Extra Options"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
#, fuzzy
msgid "Select the Extra Options placement hook priority"
msgstr "Επιλέξτε την προτεραιότητα αγκίστρου τοποθέτησης Επιπλέον επιλογές"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
#, fuzzy
msgid "Totals box placement"
msgstr "Τοποθέτηση πλαισίου συνόλων"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
#, fuzzy
msgid "Select where you want the Totals box to appear."
msgstr "Επιλέξτε πού θέλετε να εμφανίζεται το πλαίσιο Σύνολα."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
#, fuzzy
msgid "Totals box placement custom hook"
msgstr "Τοποθέτηση κουτιού συνόλων προσαρμοσμένο άγκιστρο"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
#, fuzzy
msgid "Totals box placement hook priority"
msgstr "Προτεραιότητα αγκίστρου τοποθέτησης κουτιού αθροισμάτων"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
#, fuzzy
msgid "Select the Totals box placement hook priority"
msgstr ""
"Επιλέξτε την προτεραιότητα του άγκιστρου τοποθέτησης του πλαισίου \"Σύνολα\""

#: includes/classes/class-themecomplete-epo-settings-base.php:586
#, fuzzy
msgid "This will enable a floating box to display your totals box."
msgstr ""
"Αυτό θα επιτρέψει σε ένα αιωρούμενο πλαίσιο να εμφανίσει το πλαίσιο συνόλων."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "Κάτω δεξιά"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "Κάτω αριστερά"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "Επάνω δεξιά"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "Επάνω αριστερά"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
#, fuzzy
msgid "Floating Totals box visibility"
msgstr "Ορατότητα πλαισίου αιωρούμενων συνόλων"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
#, fuzzy
msgid "This determines the floating totals box visibility."
msgstr "Αυτό καθορίζει την ορατότητα του πλαισίου αιωρούμενων συνόλων."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
#, fuzzy
msgid "Always visible"
msgstr "Πάντα ορατό"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "Ορατό μετά την κύλιση της σελίδας"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
#, fuzzy
msgid "Hide after scrolling the page"
msgstr "Απόκρυψη μετά την κύλιση στη σελίδα"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
#, fuzzy
msgid "Pixels amount needed to scroll"
msgstr "Ποσότητα pixel που απαιτείται για κύλιση"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
#, fuzzy
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Επιλέξτε τον αριθμό pixel που χρειάζεται η σελίδα για κύλιση για να γίνουν "
"ορατά τα αιωρούμενα σύνολα."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
#, fuzzy
msgid "Add to cart button on floating totals box"
msgstr "Κουμπί προσθήκης στο καλάθι στο πλαίσιο αιωρούμενων συνόλων"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
#, fuzzy
msgid "Display the add to cart button on floating box."
msgstr "Εμφανίστε το κουμπί προσθήκης στο καλάθι σε αιωρούμενο κουτί."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
#, fuzzy
msgid "Change original product price"
msgstr "Αλλαγή αρχικής τιμής προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
#, fuzzy
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Ελέγξτε για να αντικαταστήσετε την αρχική τιμή του προϊόντος όταν αλλάζει η "
"τιμή."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
#, fuzzy
msgid "Change variation price"
msgstr "Αλλαγή τιμής διακύμανσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
#, fuzzy
msgid "Check to overwrite the variation price when the price is changing."
msgstr ""
"Ελέγξτε για να αντικαταστήσετε την τιμή διακύμανσης όταν αλλάζει η τιμή."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
#, fuzzy
msgid "Force Select Options"
msgstr "Επιβολή επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
#, fuzzy
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Αυτό αλλάζει το κουμπί προσθήκης στο καλάθι στις σελίδες καταστημάτων και "
"αρχειοθέτησης για να εμφανίζει επιλεγμένες επιλογές όταν το προϊόν έχει "
"επιπλέον επιλογές προϊόντος. Η ενεργοποίηση αυτού θα καταργήσει τη "
"λειτουργικότητα ajax."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
#, fuzzy
msgid "Enable extra options in shop and category view"
msgstr ""
"Ενεργοποίηση επιπλέον επιλογών στην προβολή καταστήματος και κατηγορίας"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
#, fuzzy
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε την εμφάνιση επιπλέον επιλογών στη σελίδα "
"καταστήματος και στην προβολή κατηγοριών. Αυτή η ρύθμιση εξαρτάται από το "
"θέμα και ορισμένες πτυχές ενδέχεται να μην λειτουργούν όπως αναμένεται."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
#, fuzzy
msgid "Remove Free price label"
msgstr "Κατάργηση δωρεάν ετικέτας τιμής"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
#, fuzzy
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Ελέγξτε για να αφαιρέσετε την ετικέτα δωρεάν τιμής όταν το προϊόν έχει "
"επιπλέον επιλογές"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
#, fuzzy
msgid "Use progressive display on options"
msgstr "Χρήση προοδευτικής εμφάνισης στις επιλογές"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
#, fuzzy
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Η ενεργοποίηση αυτού θα αποκρύψει τις επιλογές στη σελίδα του προϊόντος "
"μέχρι να αρχικοποιηθεί η JavaScript. Αυτή είναι μια ασφαλής ρύθμιση και "
"συνιστάται να είστε ενεργοί."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "Καθυστέρηση animation"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
#, fuzzy
msgid "How long the animation will take in milliseconds"
msgstr ""
"Πόσος χρόνος θα διαρκέσει η κινούμενη εικόνα σε χιλιοστά του δευτερολέπτου"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
#, fuzzy
msgid "Start Animation delay"
msgstr "Έναρξη καθυστέρησης κίνησης"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
#, fuzzy
msgid "The delay until the animation starts in milliseconds"
msgstr ""
"Η καθυστέρηση έως ότου ξεκινήσει η κινούμενη εικόνα σε χιλιοστά του "
"δευτερολέπτου"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
#, fuzzy
msgid "Show quantity selector only for elements with a value"
msgstr "Εμφάνιση επιλογέα ποσότητας μόνο για στοιχεία με τιμή"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
#, fuzzy
msgid "Check show quantity selector only for elements with a value."
msgstr "Επιλέξτε εμφάνιση επιλογέα ποσότητας μόνο για στοιχεία με τιμή."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr "Απόκρυψη κουμπιού προσθήκης στο καλάθι μέχρι να επιλεγεί ένα στοιχείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
#, fuzzy
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Ελέγξτε αυτό για να εμφανίσετε το κουμπί προσθήκης στο καλάθι μόνο όταν "
"συμπληρωθεί τουλάχιστον μία επιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Απόκρυψη κουμπιού προσθήκης στο καλάθι μέχρι να επιλεγούν όλα τα απαιτούμενα "
"στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Ελέγξτε αυτό για να εμφανίσετε το κουμπί προσθήκης στο καλάθι μόνο όταν "
"συμπληρωθούν όλες οι απαιτούμενες ορατές επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Απόκρυψη κουμπιού προσθήκης στο καλάθι μέχρι να επιλεγούν όλα τα στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Ελέγξτε αυτό για να εμφανίσετε το κουμπί προσθήκης στο καλάθι μόνο όταν "
"συμπληρωθούν όλες οι ορατές επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "Εμφάνιση ετικέτας πλήρους πλάτους για στοιχεία."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
#, fuzzy
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Ελέγξτε αυτό για να αναγκάσετε τα στοιχεία να έχουν πλήρες πλάτος αντί για "
"αυτόματο."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
#, fuzzy
msgid "Show choice description inline."
msgstr "Εμφάνιση ενσωματωμένης περιγραφής επιλογής."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
#, fuzzy
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Επιλέξτε αυτό για να απενεργοποιήσετε την εμφάνιση περιγραφής ως συμβουλής "
"εργαλείου και να την εμφανίσετε ενσωματωμένη."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
#, fuzzy
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Απόκρυψη ετικέτας επιλογών κατά τη χρήση της ρύθμισης Εμφάνιση συμβουλής "
"εργαλείου για κουμπιά επιλογής και πλαίσια ελέγχου"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Επιλέξτε αυτό για να αποκρύψετε την ετικέτα επιλογής όταν χρησιμοποιείτε τη "
"ρύθμιση Εμφάνιση συμβουλής εργαλείου για κουμπιά επιλογής και πλαίσια "
"ελέγχου."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "Αυτόματη απόκρυψη τιμής αν είναι μηδέν"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
#, fuzzy
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Ελέγξτε αυτό για να αποκρύψετε καθολικά την ένδειξη τιμής εάν είναι μηδέν."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "Περικοπή μηδενικών τιμών"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
#, fuzzy
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Ελέγξτε αυτό για να μειώσετε παγκοσμίως τις τιμές. Αυτό θα εφαρμοστεί και "
"στις εγγενείς τιμές WooCommerce."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
#, fuzzy
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Απόκρυψη html τιμής στοιχείου όταν είναι ενεργοποιημένη η απόκρυψη ρύθμισης "
"τιμών"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
#, fuzzy
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Ελέγξτε αυτό αν χρησιμοποιείτε το Google Merchant Center. Θα αποκρύψει την "
"τιμή html του στοιχείου όταν ενεργοποιήσετε την απόκρυψη της ρύθμισης τιμών."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
#, fuzzy
msgid "Use translated values when possible on admin Order"
msgstr "Χρησιμοποιήστε μεταφρασμένες τιμές όταν είναι δυνατόν στο admin Order"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
#, fuzzy
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"Λάβετε υπόψη ότι εάν οι επιλογές στην Παραγγελία αλλάξουν ή διαγραφούν, θα "
"έχετε λάθος αποτελέσματα ενεργοποιώντας αυτό!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
#, fuzzy
msgid "Include option pricing in product price"
msgstr ""
"Συμπεριλάβετε την τιμολόγηση δικαιωμάτων προαίρεσης στην τιμή του προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
#, fuzzy
msgid "Check this to include the pricing of the options to the product price."
msgstr ""
"Ελέγξτε αυτό για να συμπεριλάβετε την τιμολόγηση των επιλογών στην τιμή του "
"προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
#, fuzzy
msgid "Check for empty product price"
msgstr "Ελέγξτε για κενή τιμή προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
#, fuzzy
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Ελέγξτε αυτό για να ρυθμίσετε την προσθήκη στο μηδέν της τιμής του προϊόντος "
"όταν είναι κενή."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
#, fuzzy
msgid "Use the \"From\" string on displayed product prices"
msgstr ""
"Χρησιμοποιήστε τη συμβολοσειρά \"Από\" στις εμφανιζόμενες τιμές προϊόντων"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
#, fuzzy
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Ελέγξτε αυτό για να αλλάξετε την αναγραφή των τιμών ενός προϊόντος όταν έχει "
"επιπλέον επιλογές με τιμές."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
#, fuzzy
msgid "Alter generated product structured data"
msgstr "Τροποποίηση δομημένων δεδομένων προϊόντος που παράγονται"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
#, fuzzy
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Μεταβάλλει τα δομημένα δεδομένα του παραγόμενου προϊόντος. Αυτό μπορεί να "
"παράγει λανθασμένα αποτελέσματα εάν οι επιλογές χρησιμοποιούν λογική υπό "
"όρους!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "Δομή αποκριτικών επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
#, fuzzy
msgid "Enable this if you want the options to have responsive display."
msgstr "Ενεργοποιήστε αυτό εάν θέλετε οι επιλογές να έχουν αποκριτική οθόνη."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
#, fuzzy
msgid "Turn off persistent cart"
msgstr "Απενεργοποίηση μόνιμου καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
#, fuzzy
msgid "Enable this if the product has a lot of options."
msgstr "Ενεργοποιήστε αυτό εάν το προϊόν έχει πολλές επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
#, fuzzy
msgid "Clear cart button"
msgstr "Εκκαθάριση κουμπιού καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
#, fuzzy
msgid "Enables or disables the clear cart button"
msgstr "Ενεργοποιεί ή απενεργοποιεί το κουμπί απαλοιφής καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
#, fuzzy
msgid "Cart Field Display"
msgstr "Εμφάνιση πεδίου καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
#, fuzzy
msgid "Select how to display your fields in the cart"
msgstr "Επιλέξτε τον τρόπο εμφάνισης των πεδίων σας στο καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
#, fuzzy
msgid "Normal display"
msgstr "Κανονική οθόνη"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "Εμφάνιση ενός αναδυόμενου συνδέσμου"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
#, fuzzy
msgid "Advanced display"
msgstr "Προηγμένη οθόνη"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
#, fuzzy
msgid "Hide extra options in cart"
msgstr "Απόκρυψη επιπλέον επιλογών στο καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
#, fuzzy
msgid "Enables or disables the display of options in the cart."
msgstr "Ενεργοποιεί ή απενεργοποιεί την εμφάνιση επιλογών στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
msgid "Hide extra addon prices in cart and checkout"
msgstr ""
"Απόκρυψη διεύθυνσης URL αρχείου μεταφόρτωσης στο καλάθι και ολοκλήρωση αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Ενεργοποιεί ή απενεργοποιεί την εμφάνιση επιλογών στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
#, fuzzy
msgid "Prevent negative priced products"
msgstr "Αποτρέψτε τα προϊόντα με αρνητικές τιμές"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
#, fuzzy
msgid "Prevent adding to the cart negative priced products."
msgstr "Αποτρέψτε την προσθήκη στο καλάθι προϊόντων αρνητικής τιμής."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
#, fuzzy
msgid "Prevent zero priced products"
msgstr "Αποτρέψτε προϊόντα μηδενικής τιμής"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
#, fuzzy
msgid "Prevent adding to the cart zero priced products."
msgstr "Αποτρέψτε την προσθήκη στο καλάθι προϊόντων μηδενικής τιμής."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr "Απόκρυψη κουτάκι μέση τιμή στοιχείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
#, fuzzy
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Αυτό θα αποκρύψει την εμφάνιση της μέσης τιμής στο καλάθι για πλαίσια "
"ελέγχου."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
#, fuzzy
msgid "Show image replacement in cart and checkout"
msgstr "Εμφάνιση αντικατάστασης εικόνας στο καλάθι και ολοκλήρωση αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
#, fuzzy
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Η ενεργοποίηση αυτού θα εμφανίσει τις εικόνες των στοιχείων που έχουν "
"αντικατάσταση εικόνας."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
#, fuzzy
msgid "Hide upload file URL in cart and checkout"
msgstr ""
"Απόκρυψη διεύθυνσης URL αρχείου μεταφόρτωσης στο καλάθι και ολοκλήρωση αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
#, fuzzy
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Η ενεργοποίηση αυτού θα αποκρύψει τη διεύθυνση URL οποιουδήποτε "
"μεταφορτωμένου αρχείου ενώ βρίσκεστε στο καλάθι και στο ταμείο."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
#, fuzzy
msgid "Show uploaded image in cart and checkout"
msgstr "Εμφάνιση μεταφορτωμένης εικόνας στο καλάθι και ολοκλήρωση αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
#, fuzzy
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""
"Η ενεργοποίηση αυτού θα εμφανίσει τις μεταφορτωμένες εικόνες στο καλάθι και "
"στο ταμείο."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Μέγιστο πλάτος εικόνας"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr "Ορίστε το μέγιστο πλάτος των εικόνων που εμφανίζονται στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "Μέγιστο ύψος εικόνας"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
#, fuzzy
msgid "Set the maximum height of the images that appear on cart."
msgstr "Ορίστε το μέγιστο ύψος των εικόνων που εμφανίζονται στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
#, fuzzy
msgid "Always use unique values on cart for elements"
msgstr "Χρησιμοποιείτε πάντα μοναδικές τιμές στο καλάθι για στοιχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
#, fuzzy
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"Η ενεργοποίηση αυτού του στοιχείου θα διαχωρίσει τις τιμές διαχωρισμένες με "
"κόμμα για τα στοιχεία. Αυτό χρησιμοποιείται κυρίως για πολλαπλές επιλογές "
"πλαισίου ελέγχου."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
#, fuzzy
msgid "Post types to show the saved options"
msgstr "Τύποι δημοσιεύσεων για εμφάνιση των αποθηκευμένων επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Επιλέξτε τους τύπους αναρτήσεων όπου η προσθήκη θα τροποποιήσει την οθόνη "
"παραγγελίας επεξεργασίας για να εμφανίσει τις αποθηκευμένες επιλογές. "
"Μπορείτε να πληκτρολογήσετε τον προσαρμοσμένο τύπο δημοσίευσης."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
#, fuzzy
msgid "Strip html from emails"
msgstr "Αφαιρέστε html από μηνύματα ηλεκτρονικού ταχυδρομείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
#, fuzzy
msgid "Check to strip the html tags from emails"
msgstr ""
"Ελέγξτε για να αφαιρέσετε τις ετικέτες html από μηνύματα ηλεκτρονικού "
"ταχυδρομείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
#, fuzzy
msgid "Legacy meta data"
msgstr "Μεταδεδομένα παλαιού τύπου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
#, fuzzy
msgid "Check to enable legacy meta data functionality."
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε τη λειτουργία μετα-δεδομένων παλαιού τύπου."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
#, fuzzy
msgid "Unique meta values"
msgstr "Μοναδικές μετα-τιμές"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
#, fuzzy
msgid "Check to split items with multiple values to unique lines."
msgstr ""
"Ελέγξτε για να διαχωρίσετε στοιχεία με πολλές τιμές σε μοναδικές γραμμές."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
#, fuzzy
msgid "Prevent options from being sent to emails"
msgstr "Αποτροπή αποστολής επιλογών σε μηνύματα ηλεκτρονικού ταχυδρομείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
#, fuzzy
msgid "Check to disable options from being sent to emails."
msgstr ""
"Ελέγξτε για να απενεργοποιήσετε τις επιλογές από την αποστολή σε μηνύματα "
"ηλεκτρονικού ταχυδρομείου."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
#, fuzzy
msgid "Disable sending the options upon saving the order"
msgstr ""
"Απενεργοποιήστε την αποστολή των επιλογών κατά την αποθήκευση της παραγγελίας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
#, fuzzy
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Ενεργοποιήστε αυτό εάν λαμβάνετε ένα σφάλμα 500 όταν προσπαθείτε να "
"ολοκληρώσετε την παραγγελία στο ταμείο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
#, fuzzy
msgid "Attach upload files to emails"
msgstr "Επισυνάψτε αρχεία μεταφόρτωσης σε μηνύματα ηλεκτρονικού ταχυδρομείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
#, fuzzy
msgid "Check to Attach upload files to emails."
msgstr ""
"Ελέγξτε για να επισυνάψετε αρχεία μεταφόρτωσης σε μηνύματα ηλεκτρονικού "
"ταχυδρομείου."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
#, fuzzy
msgid "Disable Options on Order status change"
msgstr "Απενεργοποίηση επιλογών στην αλλαγή κατάστασης παραγγελίας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
#, fuzzy
msgid "Check this only if you are getting server errors on checkout."
msgstr ""
"Ελέγξτε αυτό μόνο εάν λαμβάνετε σφάλματα διακομιστή κατά την ολοκλήρωση "
"αγοράς."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr "Απόκρυψη URL αρχείου μεταφόρτωσης με την παραγγελία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Η ενεργοποίηση αυτού του αρχείου θα κρύψει τη διεύθυνση URL οποιονδήποτε "
"μεταφορτωμένων αρχείων κατά την παραγγελία."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
msgid "Show uploaded image in order"
msgstr "Εμφάνιση μεταφορτωμένης εικόνας στο καλάθι και ολοκλήρωση αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
msgid "Enabling this will show the uploaded images in order."
msgstr ""
"Η ενεργοποίηση αυτού θα εμφανίσει τις μεταφορτωμένες εικόνες στο καλάθι και "
"στο ταμείο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "Διαχωριστικό ετικέτας/τιμής πεδίου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Εισαγάγετε το χαρακτήρα που θα χρησιμοποιηθεί για το διαχωρισμό των ετικετών "
"πεδίων από τις τιμές πεδίων στο καλάθι και τη σειρά."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "Διαχωριστικό πολλαπλών τιμών πεδίων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Εισαγάγετε τη συμβολοσειρά που θα χρησιμοποιηθεί για τον διαχωρισμό "
"πολλαπλών τιμών για ένα πεδίο που επιτρέπει πολλαπλές επιλογές στο καλάθι "
"και την παραγγελία."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
#, fuzzy
msgid "Update cart text"
msgstr "Ενημέρωση κειμένου καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
#, fuzzy
msgid "Enter the Update cart text when you edit a product."
msgstr ""
"Εισαγάγετε το κείμενο του καλαθιού ενημέρωσης όταν επεξεργάζεστε ένα προϊόν."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
#, fuzzy
msgid "Edit Options text replacement"
msgstr "Αντικατάσταση κειμένου \"Επιλογές επεξεργασίας\""

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
#, fuzzy
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο Επιλογές "
"επεξεργασίας στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
#, fuzzy
msgid "Additional Options text replacement"
msgstr "Αντικατάσταση κειμένου πρόσθετων επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
#, fuzzy
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο Πρόσθετες επιλογές "
"όταν χρησιμοποιείτε την αναδυόμενη ρύθμιση στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
#, fuzzy
msgid "Close button text replacement"
msgstr "Αντικατάσταση κειμένου κουμπιού κλεισίματος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
#, fuzzy
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"Κλείσιμο όταν χρησιμοποιείτε την αναδυόμενη ρύθμιση στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Κείμενο κενού καλαθιού"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κενού κουμπιού "
"καλαθιού."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "Κείμενο Τελικού συνόλου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
#, fuzzy
msgid "Enter the Final total text or leave blank for default."
msgstr "Εισαγάγετε το τελικό συνολικό κείμενο ή αφήστε κενό για προεπιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
#, fuzzy
msgid "Unit price text"
msgstr "Κείμενο τιμής μονάδας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
#, fuzzy
msgid "Enter the Unit price text or leave blank for default."
msgstr "Εισαγάγετε το κείμενο Τιμή μονάδας ή αφήστε κενό για προεπιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
#, fuzzy
msgid "Options total text"
msgstr "Επιλογές συνολικού κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
#, fuzzy
msgid "Enter the Options total text or leave blank for default."
msgstr ""
"Εισαγάγετε το συνολικό κείμενο των Επιλογών ή αφήστε κενό για προεπιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "Επιλογές ΦΠΑ συνολικό κείμενο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr ""
"Εισαγάγετε τις επιλογές ΦΠΑ συνολικό κείμενο ή αφήστε κενό για προεπιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr "Κείμενο συνολικών χρεώσεων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
#, fuzzy
msgid "Enter the Fees total text or leave blank for default."
msgstr "Εισαγάγετε το συνολικό κείμενο Χρεώσεις ή αφήστε κενό για προεπιλογή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
#, fuzzy
msgid "Free Price text replacement"
msgstr "Δωρεάν αντικατάσταση κειμένου τιμής"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
#, fuzzy
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε την ετικέτα δωρεάν τιμής όταν "
"το προϊόν έχει επιπλέον επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
#, fuzzy
msgid "Force Select options text"
msgstr "Κείμενο επιλογών \"Επιβολή επιλογής\""

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Πληκτρολογήστε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"προσθήκη στο καλάθι όταν χρησιμοποιείτε την επιλογή Force."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr "Μη μηδενικές τιμές κειμένου προϊόντων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το μήνυμα όταν προσπαθείτε να "
"προσθέσετε ένα προϊόν μηδενικής τιμής στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr "Δεν υπάρχει κείμενο με αρνητικά προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το μήνυμα όταν προσπαθείτε να "
"προσθέσετε ένα προϊόν αρνητικής τιμής στο καλάθι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
#, fuzzy
msgid "Popup section button text replacement"
msgstr "Αντικατάσταση κειμένου κουμπιού αναδυόμενης ενότητας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού της "
"ενότητας ανανέωσης. Ορίζοντας αυτό σε %s θα γίνει έτσι ώστε το κείμενο του "
"κουμπιού να έχει τον τίτλο της ενότητας."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Ανοιχτό"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
#, fuzzy
msgid "Reset Options text replacement"
msgstr "Αντικατάσταση κειμένου \"Επιλογές επαναφοράς\""

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
#, fuzzy
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο επιλογών επαναφοράς "
"όταν χρησιμοποιείτε προσαρμοσμένες παραλλαγές."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
#, fuzzy
msgid "Reset options"
msgstr "Επαναφορά επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
#, fuzzy
msgid "Calendar close button text replacement"
msgstr "Αντικατάσταση κειμένου κουμπιού κλεισίματος ημερολογίου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
#, fuzzy
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"\"Κλείσιμο\" στο ημερολόγιο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
#, fuzzy
msgid "Calendar today button text replacement"
msgstr "Αντικατάσταση κειμένου κουμπιού \"Ημερολόγιο σήμερα\""

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
#, fuzzy
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"\"Σήμερα\" στο ημερολόγιο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
#, fuzzy
msgid "Slider previous text"
msgstr "Προηγούμενο κείμενο ρυθμιστικού"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
#, fuzzy
msgid "Enter a text to replace the previous button text for slider."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το προηγούμενο κείμενο "
"κουμπιού για ρυθμιστικό."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
#, fuzzy
msgid "Slider next text"
msgstr "Ρυθμιστικό επόμενο κείμενο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
#, fuzzy
msgid "Enter a text to replace the next button text for slider."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του επόμενου "
"κουμπιού για ρυθμιστικό."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
#, fuzzy
msgid "This field is required text"
msgstr "Αυτό το πεδίο είναι υποχρεωτικό κείμενο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
#, fuzzy
msgid "Enter a text to indicate that a field is required."
msgstr "Εισαγάγετε ένα κείμενο για να υποδείξετε ότι απαιτείται ένα πεδίο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "Χαρακτήρες υπόλοιπου κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
#, fuzzy
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε τους χαρακτήρες που απομένουν "
"όταν χρησιμοποιείτε μέγιστους χαρακτήρες σε ένα πεδίο κειμένου ή μια περιοχή "
"κειμένου."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr "Μεταφόρτωση αρχείων κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
#, fuzzy
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο Μεταφόρτωση αρχείων "
"που χρησιμοποιείται στο αναδυόμενο παράθυρο αφού κάνετε κλικ στο κουμπί "
"προσθήκης στο καλάθι όταν υπάρχουν πεδία μεταφόρτωσης."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr "Μεταφόρτωση κειμένου μηνύματος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
#, fuzzy
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Εισαγάγετε ένα μήνυμα που θα χρησιμοποιηθεί στο αναδυόμενο παράθυρο αφού "
"κάνετε κλικ στο κουμπί προσθήκης στο καλάθι όταν υπάρχουν πεδία μεταφόρτωσης."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr "Επιλογή αρχείου κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κουμπί Επιλογή κειμένου "
"αρχείου που χρησιμοποιείται στη μεταφόρτωση με στυλ."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Επιλογή αρχείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "Κείμενο ενός αρχείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο αρχείου που "
"χρησιμοποιείται στο κουμπί μεταφόρτωσης με στυλ."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "Κείμενο πολλαπλών αρχείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο αρχείων που "
"χρησιμοποιείται στο κουμπί μεταφόρτωσης με στυλ."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
#, fuzzy
msgid "Add button text on associated products"
msgstr "Προσθήκη κειμένου κουμπιού σε συσχετισμένα προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
#, fuzzy
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"προσθήκης σε συσχετισμένα προϊόντα."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Προσθήκη"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
#, fuzzy
msgid "Remove button text on associated products"
msgstr "Κατάργηση κειμένου κουμπιού σε συσχετισμένα προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού "
"κατάργησης σε συσχετισμένα προϊόντα."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Αφαίρεση"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
#, fuzzy
msgid "Repeater add text"
msgstr "Επαναλήπτης προσθήκη κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
#, fuzzy
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κουμπί προσθήκης κειμένου "
"για πεδία επαναλήπτη."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
#, fuzzy
msgid "Enable checkbox and radio styles"
msgstr "Ενεργοποίηση στυλ πλαισίου ελέγχου και ραδιοφώνου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
#, fuzzy
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""
"Ενεργοποιεί ή απενεργοποιεί επιπλέον στυλ για πλαίσια ελέγχου και κουμπιά "
"επιλογής."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
#, fuzzy
msgid "Select a style for the checkboxes and radio buttons"
msgstr "Επιλογή στιλ για τα πλαίσια επιλογής και τα κουμπιά επιλογής"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Στρογγυλό"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "Στρογγυλό 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Τετράγωνο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
#, fuzzy
msgid "Square 2"
msgstr "Πλατεία 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
msgid "Swatch border type"
msgstr "Επιλογή τύπου περιγράμματος στοιχείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
#, fuzzy
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Επιλέξτε ένα στυλ για το επιλεγμένο περίγραμμα όταν χρησιμοποιείτε "
"αντικαταστάσεις ή δείγματα εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Σκιά"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
#, fuzzy
msgid "Thin line"
msgstr "Λεπτή γραμμή"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
msgid "Choose the border width for image or color swatches."
msgstr "Επιλέξτε αν θέλετε να αποκρύψετε την τιμή ή όχι."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Επιλέξτε ένα στυλ για το επιλεγμένο περίγραμμα όταν χρησιμοποιείτε "
"αντικαταστάσεις ή δείγματα εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Επιλέξτε ένα στυλ για το επιλεγμένο περίγραμμα όταν χρησιμοποιείτε "
"αντικαταστάσεις ή δείγματα εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Οπτικό"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Σελίδα προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Τοποθεσία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Τιμολόγηση"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
#, fuzzy
msgid "Enable validation"
msgstr "Ενεργοποίηση επικύρωσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
#, fuzzy
msgid "Check to enable validation feature for builder elements"
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε τη δυνατότητα επικύρωσης για στοιχεία οικοδόμου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
#, fuzzy
msgid "Disable error scrolling"
msgstr "Απενεργοποίηση κύλισης σφαλμάτων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
#, fuzzy
msgid "Check to disable scrolling to the element with an error"
msgstr "Ελέγξτε για να απενεργοποιήσετε την κύλιση στο στοιχείο με σφάλμα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
#, fuzzy
msgid "Error label placement"
msgstr "Σφάλμα τοποθέτησης ετικέτας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
#, fuzzy
msgid "Set the placement for the validation error notification label"
msgstr ""
"Ορισμός της τοποθέτησης για την ετικέτα ειδοποίησης σφάλματος επικύρωσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
#, fuzzy
msgid "After the element"
msgstr "Μετά το στοιχείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
#, fuzzy
msgid "Before the element"
msgstr "Πριν από το στοιχείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
#, fuzzy
msgid "Use options cache"
msgstr "Χρήση προσωρινής μνήμης επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
#, fuzzy
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Χρησιμοποιήστε επιλογές αποθήκευσης στην cache για να ενισχύσετε την "
"απόδοση. Απενεργοποιήστε εάν έχετε επιλογές που μοιράζονται το ίδιο μοναδικό "
"αναγνωριστικό."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
#, fuzzy
msgid "Javascript and CSS inclusion mode"
msgstr "Λειτουργία συμπερίληψης Javascript και CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
#, fuzzy
msgid "Select how to include JS and CSS files"
msgstr "Επιλέξτε τον τρόπο συμπερίληψης αρχείων JS και CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
#, fuzzy
msgid "Single minified file"
msgstr "Ένα ελαχιστοποιημένο αρχείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
#, fuzzy
msgid "Multiple minified files"
msgstr "Πολλαπλά ελαχιστοποιημένα αρχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
#, fuzzy
msgid "DEV - multiple files"
msgstr "DEV - πολλαπλά αρχεία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
#, fuzzy
msgid "Disable PNG convert security"
msgstr "Απενεργοποιήστε την ασφάλεια μετατροπής PNG"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
#, fuzzy
msgid "Check to disable the conversion to png for image uploads."
msgstr ""
"Ελέγξτε για να απενεργοποιήσετε τη μετατροπή σε png για μεταφορτώσεις "
"εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Αυτό θα αντικαταστήσει σε γενικές γραμμές την τιμή του προϊόντος με την τιμή "
"από τις επιλογές εάν η συνολική τιμή των δικαιωμάτων προτίμησης είναι "
"μεγαλύτερη από το μηδέν."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr "Χρήση ρύθμισης για κάθε προϊόν"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "Λειτουργία τιμής επιλογών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "Επιλέξτε τη λειτουργία τιμής για τις επιλογές."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "Χρησιμοποιήστε την τιμή πώλησης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
#, fuzzy
msgid "Use regular price"
msgstr "Χρησιμοποιήστε κανονική τιμή"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "Μέγιστος αριθμός συνδυασμών για υπολογισμούς τιμών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Αυτή η ρύθμιση ελέγχει τον μέγιστο αριθμό συνδυασμών που θα χρησιμοποιήσει η "
"προσθήκη για τον υπολογισμό των ελάχιστων και μέγιστων τιμών. Ένας "
"μεγαλύτερος αριθμός συνδυασμών θα οδηγήσει σε πιο ακριβείς τιμές, αλλά θα "
"χρειαστεί περισσότερος χρόνος για τον υπολογισμό τους. Για προϊόντα που "
"μπορούν να έχουν πολλούς συνδυασμούς επιλογών, συνιστάται να ορίσετε "
"μικρότερο αριθμό συνδυασμών για να βελτιώσετε την απόδοση."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "Η προεπιλεγμένη τιμή είναι 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
#, fuzzy
msgid "Reset option values after the product is added to the cart"
msgstr "Επαναφορά τιμών επιλογών μετά την προσθήκη του προϊόντος στο καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
#, fuzzy
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Αυτό θα επαναφέρει τις τιμές επιλογών στις προεπιλεγμένες μετά την προσθήκη "
"του προϊόντος στο καλάθι"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
#, fuzzy
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr ""
"Χρησιμοποιήστε τα σύμβολα συν και πλην στις τιμές στο καλάθι και στο ταμείο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Επιλέξτε πώς θέλετε να εμφανίζεται το σημάδι των τιμών επιλογών στο καλάθι "
"και στο ταμείο."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
#, fuzzy
msgid "Display both signs"
msgstr "Εμφάνιση και των δύο σημείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
#, fuzzy
msgid "Display only minus sign"
msgstr "Εμφάνιση μόνο του συμβόλου μείον"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
#, fuzzy
msgid "Use plus and minus signs on option prices"
msgstr ""
"Χρησιμοποιήστε σύμβολα συν και πλην στις τιμές των δικαιωμάτων προαίρεσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Επιλέξτε πώς θέλετε να εμφανίζεται η ένδειξη τιμών επιλογών στη σελίδα του "
"προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
#, fuzzy
msgid "Input decimal separator"
msgstr "Εισαγωγή διαχωριστικού δεκαδικών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
#, fuzzy
msgid "Choose how to determine the decimal separator for user inputs"
msgstr ""
"Επιλέξτε τον τρόπο προσδιορισμού του διαχωριστικού δεκαδικών για εισόδους "
"χρηστών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "Χρησιμοποιήστε την τιμή WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
#, fuzzy
msgid "Determine by browser local"
msgstr "Προσδιορισμός με τοπικό πρόγραμμα περιήγησης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
#, fuzzy
msgid "Displayed decimal separator"
msgstr "Εμφανιζόμενο διαχωριστικό δεκαδικών"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
#, fuzzy
msgid "Choose which decimal separator to display on currency prices"
msgstr ""
"Επιλέξτε ποιο διαχωριστικό δεκαδικών θα εμφανίζεται στις τιμές νομισμάτων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "Παράκαμψη ζώνης ώρας για το στοιχείο Date"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Επιλέξτε ποια %s θα χρησιμοποιήσει το στοιχείο ημερομηνίας στους "
"υπολογισμούς παρασκηνίου ή αφήστε κενό για τη ζώνη ώρας διακομιστή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy
msgid "timezone"
msgstr "ζώνη ώρας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
#, fuzzy
msgid "Required state indicator"
msgstr "Απαιτούμενη ένδειξη κατάστασης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
#, fuzzy
msgid "Enter a string to indicate the required state of a field."
msgstr ""
"Εισαγάγετε μια συμβολοσειρά για να υποδείξετε την απαιτούμενη κατάσταση ενός "
"πεδίου."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
#, fuzzy
msgid "Required state indicator position"
msgstr "Απαιτούμενη θέση δείκτη κατάστασης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
#, fuzzy
msgid "Select the placement of the Required state indicator"
msgstr "Επιλέξτε την τοποθέτηση της ένδειξης Απαιτούμενη κατάσταση"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
#, fuzzy
msgid "Left of the label"
msgstr "Αριστερά της ετικέτας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
#, fuzzy
msgid "Right of the label"
msgstr "Δικαίωμα της ετικέτας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
#, fuzzy
msgid "Include tax string suffix on totals box"
msgstr "Πλαίσιο \"Συμπερίληψη επιθήματος συμβολοσειράς φόρου στα σύνολα\""

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""
"Ενεργοποιήστε αυτό για να προσθέσετε το επίθημα του φόρου WooCommerce στο "
"πλαίσιο συνόλων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
#, fuzzy
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr "Συμπεριλάβετε το WooCommerce Επίθημα εμφάνισης τιμής στα σύνολα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Ενεργοποιήστε αυτό για να προσθέσετε το WooCommerce Επίθημα εμφάνισης τιμής "
"στο πλαίσιο συνόλων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
#, fuzzy
msgid "jQuery selector for main product image"
msgstr "jQuery επιλογέας για την κύρια εικόνα του προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
#, fuzzy
msgid "This is used to change the product image."
msgstr "Αυτό χρησιμοποιείται για την αλλαγή της εικόνας του προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
#, fuzzy
msgid "Product image replacement mode"
msgstr "Λειτουργία αντικατάστασης εικόνας προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"Η λειτουργία Self αντικαθιστά την πραγματική εικόνα και η ενσωματωμένη "
"προσθέτει νέα στοιχεία εικόνας."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
#, fuzzy
msgid "Self mode"
msgstr "Αυτόματη λειτουργία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
#, fuzzy
msgid "Inline mode"
msgstr "Ενσωματωμένη λειτουργία"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
#, fuzzy
msgid "Move out of stock message"
msgstr "Μετακίνηση μηνύματος εκτός αποθέματος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Αυτό μετακινεί το μήνυμα εξαντλημένου αποθέματος όταν χρησιμοποιούνται "
"παραλλαγές στυλ ακριβώς κάτω από αυτές."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
#, fuzzy
msgid "Use internal variation price"
msgstr "Χρήση τιμής εσωτερικής διακύμανσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Ενεργοποιήστε αυτό εάν τα μεταβλητά προϊόντα σας έχουν πολλές επιλογές για "
"τη βελτίωση της απόδοσης. Λάβετε υπόψη ότι αυτό μπορεί να προκαλέσει "
"προβλήματα με προσθήκες έκπτωσης ή νομίσματος."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "Ενεργοποιήστε τη διεπαφή backend plugin"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Επιλέξτε τους ρόλους που θα έχουν πρόσβαση στις ρυθμίσεις της προσθήκης και "
"στη διεπαφή της προσθήκης ενώ βρίσκεστε στη σελίδα επεξεργασίας προϊόντος. Ο "
"ρόλος διαχειριστή έχει πάντα πρόσβαση."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
#, fuzzy
msgid "Hide override settings on products"
msgstr "Απόκρυψη ρυθμίσεων παράκαμψης σε προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
#, fuzzy
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Ενεργοποιήστε αυτήν την επιλογή για να αποκρύψετε την καρτέλα ρυθμίσεων στην "
"οθόνη επεξεργασίας προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
#, fuzzy
msgid "Hide Builder mode on products"
msgstr "Απόκρυψη λειτουργίας Builder σε προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
#, fuzzy
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Ενεργοποιήστε αυτό για να αποκρύψετε την καρτέλα οικοδόμου στην οθόνη "
"επεξεργασίας προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
#, fuzzy
msgid "Hide Normal mode on products"
msgstr "Απόκρυψη κανονικής λειτουργίας σε προϊόντα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
#, fuzzy
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""
"Ενεργοποιήστε αυτό για να αποκρύψετε την κανονική καρτέλα στην οθόνη "
"επεξεργασίας προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "Ενεργοποιήστε το WP Rocket CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε τη χρήση του WP Rocket cdn για τις εικόνες "
"plugin εάν είναι ενεργό."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "Ενεργοποιήστε το Jetpack CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε τη χρήση του Jetpack cdn για τις εικόνες "
"plugin εάν είναι ενεργό."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Επιλέξτε πλαίσιο"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Επιλογέας δεδομένων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
#, fuzzy
msgid "Tooltip max width"
msgstr "Μέγιστο πλάτος συμβουλής εργαλείου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
#, fuzzy
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""
"Ορίστε το μέγιστο πλάτος της συμβουλής εργαλείου που εμφανίζεται στα "
"στοιχεία."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
#, fuzzy
msgid "Image mode"
msgstr "Λειτουργία εικόνας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
#, fuzzy
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Ορίστε τη λειτουργία εικόνας που θα χρησιμοποιηθεί για διάφορες λειτουργίες "
"που σχετίζονται με την εικόνα."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
#, fuzzy
msgid "Absolute URL"
msgstr "Απόλυτη διεύθυνση URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
#, fuzzy
msgid "Relative URL"
msgstr "Σχετική διεύθυνση URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "Επανυπολογισμός εικόνας για αλλαγές"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Αυτό απαιτείται σε διάφορες λύσεις γκαλερί που αλλάζουν δυναμικά την εικόνα "
"html ή εάν θέλετε να ελέγξετε δυναμικά την εικόνα."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
#, fuzzy
msgid "Retrieve image sizes for image replacements"
msgstr "Ανάκτηση μεγεθών εικόνας για αντικαταστάσεις εικόνων"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr ""
"Απενεργοποιήστε αυτό για αργούς διακομιστές ή μεγάλες ποσότητες εικόνων."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "Εμφάνιση ποσότητας 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Ενεργοποιήστε την εμφάνιση της συμβολοσειράς ποσότητας ακόμα και όταν η "
"ποσότητα είναι 1 και όταν είναι ενεργοποιημένος ο επιλογέας ποσότητας."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
#, fuzzy
msgid "Show prices inside select box choices"
msgstr "Εμφάνιση τιμών μέσα σε επιλεγμένες επιλογές πλαισίου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Ελέγξτε αυτό για να εμφανίσετε την τιμή των επιλογών πλαισίου επιλογής εάν ο "
"τύπος τιμής είναι σταθερός."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
#, fuzzy
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr ""
"Εμφάνιση τιμών μέσα σε επιλεγμένες επιλογές πλαισίων, ακόμη και αν οι τιμές "
"είναι κρυφές"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Επιλέξτε αυτό για να εμφανίσετε την τιμή των επιλογών του πλαισίου επιλογής "
"εάν ο τύπος τιμής είναι σταθερός και ακόμη και αν το στοιχείο κρύβει την "
"τιμή."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
#, fuzzy
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""
"Πολλαπλασιάστε τις τιμές μέσα σε επιλεγμένες επιλογές κουτιού με τον "
"επιλογέα ποσότητας"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
#, fuzzy
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Ελέγξτε αυτό για να πολλαπλασιάσετε τις τιμές των επιλογών του πλαισίου "
"επιλογής με τον επιλογέα ποσότητας, εάν υπάρχει."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
#, fuzzy
msgid "Radio button undo button"
msgstr "Κουμπί επιλογής κουμπί αναίρεσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
#, fuzzy
msgid "Globally override the undo button for radio buttons"
msgstr "Καθολική παράκαμψη του κουμπιού αναίρεσης για κουμπιά επιλογής"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
#, fuzzy
msgid "Use field value"
msgstr "Χρήση τιμής πεδίου"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "Datepicker θέμα"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "Datepicker μέγεθος"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "Datepicker θέσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
#, fuzzy
msgid "Minimum characters for text-field and text-areas"
msgstr "Ελάχιστοι χαρακτήρες για πεδία κειμένου και περιοχές κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
#, fuzzy
msgid "Maximum characters for text-field and text-areas"
msgstr "Μέγιστος αριθμός χαρακτήρων για πεδία κειμένου και περιοχές κειμένου"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
#, fuzzy
msgid "Upload element inline Image preview"
msgstr "Μεταφόρτωση στοιχείου ενσωματωμένου Προεπισκόπηση εικόνας"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
#, fuzzy
msgid "Enable inline preview of the image that will be uploaded."
msgstr ""
"Ενεργοποιήστε την ενσωματωμένη προεπισκόπηση της εικόνας που θα μεταφορτωθεί."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
#, fuzzy
msgid "Scroll to the product element upon selection"
msgstr "Μεταβείτε με κύλιση στο στοιχείο προϊόντος κατά την επιλογή"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
#, fuzzy
msgid "Enable to scroll the viewport to the product element."
msgstr "Ενεργοποιήστε την κύλιση της οπτικής γωνίας στο στοιχείο προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
#, fuzzy
msgid "Product element scroll offset"
msgstr "Μετατόπιση κύλισης στοιχείου προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
#, fuzzy
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Εισαγάγετε μια τιμή για τη μετατόπιση κύλισης όταν επιλέγετε μια επιλογή για "
"το στοιχείο προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
#, fuzzy
msgid "Sync associated product quantity with main product quantity"
msgstr ""
"Συγχρονισμός συσχετισμένης ποσότητας προϊόντος με κύρια ποσότητα προϊόντος"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
#, fuzzy
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Επιτρέπουν οι ποσότητες των σχετικών προϊόντων να είναι πολλαπλάσιες της "
"κύριας ποσότητας προϊόντος."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Όνομα Χρήστη"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
#, fuzzy
msgid "Your Envato username."
msgstr "Το όνομα χρήστη σας στο Envato."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
#, fuzzy
msgid "Envato Personal Token"
msgstr "Envato Personal Token"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "Μπορείτε να δημιουργήσετε ένα Envato Personal Token %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy
msgid "clicking this link"
msgstr "Κάνοντας κλικ σε αυτόν τον σύνδεσμο"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Κωδικός αγοράς"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr ""
"Για να μάθετε πώς μπορείτε να αποκτήσετε πρόσβαση στον κωδικό αγοράς σας, "
"μπορείτε να %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy
msgid "click this link"
msgstr "Κάντε κλικ σε αυτόν τον σύνδεσμο"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Απενεργοποίηση Άδειας Χρήσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Ενεργοποίηση Άδειας Χρήσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "Η άδεια ενεργοποιήθηκε."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Συγκατάθεση"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
#, fuzzy
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Συμφωνώ ότι τα δεδομένα άδειας χρήσης θα μεταδοθούν στον διακομιστή αδειών "
"χρήσης."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
#, fuzzy
msgid "Use allowed file types from WordPress"
msgstr "Χρησιμοποιήστε επιτρεπόμενους τύπους αρχείων από το WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
#, fuzzy
msgid "Enable File manager"
msgstr "Ενεργοποίηση διαχείρισης αρχείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Μεταφόρτωση φακέλου"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "Η αλλαγή αυτού θα επηρεάσει μόνο τις μελλοντικές μεταφορτώσεις."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
#, fuzzy
msgid "Enable pop-up message on uploads"
msgstr "Ενεργοποίηση αναδυόμενου μηνύματος σε μεταφορτώσεις"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
#, fuzzy
msgid "Enables a pop-up when uploads are made."
msgstr ""
"Ενεργοποιεί ένα αναδυόμενο παράθυρο όταν πραγματοποιούνται μεταφορτώσεις."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
#, fuzzy
msgid "Enable upload success message"
msgstr "Ενεργοποίηση μηνύματος επιτυχίας μεταφόρτωσης"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
#, fuzzy
msgid "Indicates if the upload was successful with a message."
msgstr "Υποδεικνύει αν η αποστολή ήταν επιτυχής με ένα μήνυμα."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Επιτρεπτοί τύποι αρχείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
#, fuzzy
msgid "Select which file types the user will be allowed to upload."
msgstr "Επιλέξτε τους τύπους αρχείων που θα επιτρέπεται να ανεβάζει ο χρήστης."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
#, fuzzy
msgid "Select file types"
msgstr "Επιλογή τύπων αρχείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
#, fuzzy
msgid "Custom types"
msgstr "Προσαρμοσμένοι τύποι"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Επιλέξτε ειδικούς τύπους αρχείων που θα επιτρέπεται στο χρήστη να φορτώσει "
"διαχωρισμένα με κόμματα."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
#, fuzzy
msgid "File manager"
msgstr "Διαχείριση αρχείων"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
#, fuzzy
msgid "CSS code"
msgstr "Κωδικός CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
#, fuzzy
msgid "Only enter pure CSS code without and style tags"
msgstr "Εισαγάγετε μόνο καθαρό κώδικα CSS χωρίς ετικέτες στυλ"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
#, fuzzy
msgid "JavaScript code"
msgstr "Κώδικας JavaScript"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
#, fuzzy
msgid "Only enter pure JavaScript code without and script tags"
msgstr ""
"Εισαγάγετε μόνο καθαρό κώδικα JavaScript χωρίς ετικέτες δέσμης ενεργειών και "
"σεναρίων"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
#, fuzzy
msgid "Add Constant"
msgstr "Προσθήκη σταθεράς"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
#, fuzzy
msgid "Error connecting to server!"
msgstr "Σφάλμα κατά τη σύνδεση με το διακομιστή!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
#, fuzzy
msgid "Error getting data from the server!"
msgstr "Σφάλμα κατά τη λήψη δεδομένων από το διακομιστή!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
#, fuzzy
msgid "License activated!"
msgstr "Η άδεια ενεργοποιήθηκε!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
#, fuzzy
msgid "License deactivated!"
msgstr "Η άδεια χρήσης απενεργοποιήθηκε!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Μη έγκυρη ενέργεια."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
#, fuzzy
msgid "Please fill all fields before trying to activate."
msgstr ""
"Παρακαλούμε συμπληρώστε όλα τα πεδία πριν επιχειρήσετε να ενεργοποιήσετε."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr ""
"Δεν επιτρέπεται η προσπάθεια ενεργοποίησης εκτός της διεπαφής της προσθήκης!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr ""
"Σφάλμα κατά τη σύνδεση με το Envato API. Παρακαλώ προσπαθήστε ξανά αργότερα."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
#, fuzzy
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr ""
"Προσπαθώντας να ενεργοποιήσετε με έναν μη έγκυρο κωδικό αγοράς για το "
"διακριτικό σας!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
#, fuzzy
msgid "Envato rate limit exceeded! Please try again later."
msgstr "Υπέρβαση ορίου τιμής Envato! Προσπαθήστε ξανά αργότερα."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
#, fuzzy
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Αυτό το όνομα χρήστη δεν ισχύει για αυτόν τον κωδικό αγοράς στοιχείου. "
"Βεβαιωθείτε ότι έχετε εισαγάγει το σωστό όνομα χρήστη (με διάκριση πεζών-"
"κεφαλαίων)."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
#, fuzzy
msgid "Trying to activate from an invalid domain!"
msgstr "Προσπάθεια ενεργοποίησης από μη έγκυρο domain!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
#, fuzzy
msgid "Trying to activate from an invalid IP address!"
msgstr "Προσπάθεια ενεργοποίησης από μη έγκυρη διεύθυνση IP!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
#, fuzzy
msgid "The purchase code is already activated!"
msgstr "Ο κωδικός αγοράς είναι ήδη ενεργοποιημένος!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
#, fuzzy
msgid "The purchase code is already activated on another domain!"
msgstr "Ο κωδικός αγοράς είναι ήδη ενεργοποιημένος σε άλλο domain!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
#, fuzzy
msgid "You have already activated that purchase code on another domain!"
msgstr "Έχετε ήδη ενεργοποιήσει αυτόν τον κωδικό αγοράς σε άλλο τομέα!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
#, fuzzy
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "Ο κωδικός αγοράς είναι ήδη ενεργοποιημένος! Αγοράστε μια έγκυρη άδεια!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
#, fuzzy
msgid "You have already activated your purchase code!"
msgstr "Έχετε ήδη ενεργοποιήσει τον κωδικό αγοράς σας!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
#, fuzzy
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr ""
"Απενεργοποιήθηκε, αλλά ο κωδικός αγοράς δεν ενεργοποιήθηκε για κάποιο λόγο!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
#, fuzzy
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"Δεν είναι δυνατή η απενεργοποίηση. Ο κωδικός αγοράς δεν είναι έγκυρος για το "
"αποθηκευμένο κλειδί άδειας χρήσης!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
#, fuzzy
msgid "Could not complete request!"
msgstr "Δεν ήταν δυνατή η ολοκλήρωση του αιτήματος!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr "Λήψη πακέτου από την αγορά Envato market..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "Λάθος! Δεν είναι δυνατή η σύνδεση στο σύστημα αρχείων"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "To receive automatic updates license activation is required."
msgstr ""
"Για να λάβετε αυτόματες ενημερώσεις, απαιτείται ενεργοποίηση άδειας χρήσης."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "Ενεργοποιήστε τις Επιπλέον επιλογές προϊόντων."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
#, fuzzy
msgid "Error! Envato API error"
msgstr "Λάθος! Σφάλμα API Envato"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
#, fuzzy
msgid "Error on unzipping package"
msgstr "Σφάλμα κατά την αποσυμπίεση του πακέτου"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "Download new version from CodeCanyon"
msgstr "Κατεβάστε τη νέα έκδοση από το CodeCanyon"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "or register the plugin to receive automatic updates."
msgstr "ή καταχωρήστε την προσθήκη για να λαμβάνετε αυτόματες ενημερώσεις."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Προσθήκη μετάφρασης στο %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, fuzzy, php-format
msgid "Edit the %s translation"
msgstr "Επεξεργασία της %s μετάφρασης"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Γλώσσα"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, fuzzy, php-format
msgid "Language of this %s"
msgstr "Γλώσσα αυτής της %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
#, fuzzy
msgid "This is a translation of"
msgstr "Αυτή είναι μια μετάφραση του"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
#, fuzzy
msgid "Enable discounts on extra options"
msgstr "Ενεργοποίηση εκπτώσεων σε επιπλέον επιλογές"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
#, fuzzy
msgid "Base original price type according to"
msgstr "Βασικός αρχικός τύπος τιμής σύμφωνα με"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "Ορίστε σε ποιους τύπους τιμών θα βασιστεί η αρχική τους τιμή."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Καμία αλλαγή"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
#, fuzzy
msgid "Undiscounted product price"
msgstr "Τιμή προϊόντος χωρίς έκπτωση"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
#, fuzzy
msgid "Enable alteration of pricing table"
msgstr "Ενεργοποίηση αλλαγής πίνακα τιμολόγησης"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
#, fuzzy
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Ελέγξτε για να ενεργοποιήσετε τη συμπερίληψη τιμών δικαιωμάτων προαίρεσης "
"στον πίνακα τιμών."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
#, fuzzy
msgid "Prefix label"
msgstr "Ετικέτα προθέματος"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
#, fuzzy
msgid "Display a prefix label on product page."
msgstr "Εμφάνιση ετικέτας προθέματος στη σελίδα του προϊόντος."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
#, fuzzy
msgid "Suffix label"
msgstr "Ετικέτα επιθήματος"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
#, fuzzy
msgid "Display a suffix label on product page."
msgstr "Εμφάνιση ετικέτας επιθήματος στη σελίδα του προϊόντος."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
#, fuzzy
msgid "Label CSS selector"
msgstr "Επιλογέας CSS ετικετών"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
#, fuzzy
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Εισαγάγετε έναν επιλογέα CSS για να παρακάμψετε την προεπιλεγμένη ετικέτα "
"όπου θα εμφανίζεται η συμβολοσειρά έκπτωσης."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
#, fuzzy
msgid "Discount string placement"
msgstr "Τοποθέτηση συμβολοσειράς έκπτωσης"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
#, fuzzy
msgid "Select the placement of the discounted string compared to the label."
msgstr ""
"Επιλέξτε την τοποθέτηση της μειωμένης συμβολοσειράς σε σύγκριση με την "
"ετικέτα."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Μετά"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Πριν"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
#, fuzzy
msgid "Enable showing option prices in the Order"
msgstr "Ενεργοποίηση εμφάνισης τιμών επιλογών στην παραγγελία"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
#, fuzzy
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Ενεργοποιήστε το με δική σας ευθύνη, καθώς δεν είναι δυνατός ο υπολογισμός "
"των εκπτώσεων επιλογών στη σελίδα Παραγγελία."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "Κρατήσεις WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "Πολλαπλασιάστε το κόστος ανά άτομο"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
#, fuzzy
msgid "Enabling this will multiply the options price by the person count."
msgstr ""
"Η ενεργοποίηση αυτού θα πολλαπλασιάσει την τιμή των επιλογών με τον αριθμό "
"ατόμων."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
#, fuzzy
msgid "Using booking setting"
msgstr "Χρήση της ρύθμισης κράτησης"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "Πολλαπλασιάστε το κόστος ανά αριθμό μπλοκ"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
#, fuzzy
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"Η ενεργοποίηση αυτού θα πολλαπλασιάσει την τιμή των επιλογών με τον αριθμό "
"των μπλοκ."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
#, fuzzy
msgid "Add option cost to booking display price"
msgstr "Προσθήκη κόστους επιλογής στην τιμή εμφάνισης κράτησης"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
#, fuzzy
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"Η ενεργοποίηση αυτού του στοιχείου θα προσθέσει τις τιμές επιλογής στο "
"υπολογισμένο κόστος κράτησης."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
#, fuzzy
msgid "Dynamic Pricing & Discounts"
msgstr "Δυναμική τιμολόγηση & εκπτώσεις"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
#, fuzzy
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Η ενεργοποίηση αυτού θα εφαρμόσει τις εκπτώσεις προϊόντων και στις επιπλέον "
"επιλογές."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "Εύκολη κράτηση WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
#, fuzzy
msgid "WooCommerce Measurement Calculator"
msgstr "WooCommerce Υπολογιστής μέτρησης"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr "Πολλαπλασιασμός επιλογών κόστους ανά περιοχή"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
#, fuzzy
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""
"Η ενεργοποίηση αυτού θα πολλαπλασιάσει την τιμή των δικαιωμάτων προαίρεσης "
"με την περιοχή υπολογισμού."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
#, fuzzy
msgid "Divide price with measurement"
msgstr "Διαίρεση τιμής με μέτρηση"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
#, fuzzy
msgid "This will divide the original price with the needed measurement."
msgstr "Αυτό θα διαιρέσει την αρχική τιμή με την απαιτούμενη μέτρηση."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "Συνδρομές WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "Συμπεριλάβετε ξανά πρόσθετα κατόπιν παραγγελίας"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"Η ενεργοποίηση αυτού θα προσθέσει τα αποθηκευμένα πρόσθετα στη συνδρομή όταν "
"χρησιμοποιείτε ξανά τη λειτουργία παραγγελίας με μη αυτόματο τρόπο."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
#, fuzzy
msgid "Sign up fee"
msgstr "Τέλος εγγραφής"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
#, fuzzy
msgid "sign-up fee"
msgstr "Τέλος εγγραφής"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
#, fuzzy
msgid "and a"
msgstr "και ένα"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s (%2$s)"
msgstr[1] "%1$s κάθε %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
#, fuzzy
msgid "Subscription sign up fee text"
msgstr "Κείμενο τέλους εγγραφής συνδρομής"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
#, fuzzy
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Εισαγάγετε το κείμενο Τέλος εγγραφής συνδρομής ή αφήστε κενό για προεπιλογή."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
#, fuzzy
msgid "Sign up fee text"
msgstr "Κείμενο τέλους εγγραφής"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
#, fuzzy
msgid "Enter the Sign up fee text or leave blank for default."
msgstr "Εισαγάγετε το κείμενο Χρέωση εγγραφής ή αφήστε κενό για προεπιλογή."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr "Συνδρομητική εγγραφή"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
#, fuzzy
msgid "Options Subscription fee"
msgstr "Επιλογές Τέλος συνδρομής"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "Η ποσότητα για το \"%1$s\" πρέπει να είναι μεγαλύτερη από %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, fuzzy, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""
"Η ποσότητα για το \"%s\" πρέπει να είναι μεγαλύτερη από 0 για να προστεθεί "
"στο καλάθι."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, fuzzy, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "Μπορείτε να επιλέξετε μόνο έως και %1$s επιλογή για %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, fuzzy, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "Μπορείτε να επιλέξετε έως και %1$s επιλογές μόνο για %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "Πρέπει να επιλέξετε ακριβώς %1$s επιλογή για %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, fuzzy, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "Πρέπει να επιλέξετε ακριβώς %1$s επιλογές για %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "Πρέπει να επιλέξετε τουλάχιστον %1$s επιλογή για %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, fuzzy, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "Πρέπει να επιλέξετε τουλάχιστον %1$s επιλογές για %2$s."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
#, fuzzy
msgid "Invalid date entered!"
msgstr "Καταχωρήθηκε μη έγκυρη ημερομηνία!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
#, fuzzy
msgid "Invalid data submitted!"
msgstr "Υποβλήθηκαν μη έγκυρα δεδομένα!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
#, fuzzy
msgid "Invalid year date entered!"
msgstr "Καταχωρήθηκε μη έγκυρη ημερομηνία έτους!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
#, fuzzy
msgid "You cannot select that date!"
msgstr "Δεν μπορείτε να επιλέξετε αυτήν την ημερομηνία!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(μέγιστο μέγεθος αρχείου %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, fuzzy, php-format
msgid "%s is not a valid image file!"
msgstr "%s δεν είναι έγκυρο αρχείο εικόνας!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Η μεταφόρτωση ολοκληρώθηκε με επιτυχία"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, fuzzy, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "Πρέπει να εισαγάγετε τουλάχιστον %1$s χαρακτήρες για το \"%2$s\"."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr ""
"Δεν μπορείτε να εισαγάγετε περισσότερους από %1$s χαρακτήρες για το \"%2$s\"."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Όλοι"

#: includes/functions/epo-functions.php:294
#, fuzzy
msgid "Logged in users"
msgstr "Συνδεδεμένοι χρήστες"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
#, fuzzy
msgid "Echo a custom action"
msgstr "Επανάληψη προσαρμοσμένης ενέργειας"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
#, fuzzy
msgid "EPO custom action"
msgstr "Προσαρμοσμένη ενέργεια EPO"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Τίτλος:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
#, fuzzy
msgid "Custom action:"
msgstr "Προσαρμοσμένη ενέργεια:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "Ο κατάλογος του θέματος \"%s\" δεν υπάρχει."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "Εν αναμονή της εικόνας του προϊόντος"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "Μη Διαθέσιμο"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "Κωδικός:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "Καθαρισμός"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Ποσότητα"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Κάντε μιά επιλογή"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#, fuzzy
#~ msgid "Hide extra options prices in cart"
#~ msgstr "Απόκρυψη επιπλέον τιμών επιλογών στο καλάθι"

#, fuzzy
#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr ""
#~ "Ενεργοποιεί ή απενεργοποιεί την εμφάνιση των τιμών των επιλογών στο "
#~ "καλάθι."

#~ msgid "Show bottom"
#~ msgstr "Εμφάνιση κάτω"

#, fuzzy
#~ msgid "Show inside"
#~ msgstr "Εμφάνιση στο εσωτερικό"

#~ msgid "Disable categories"
#~ msgstr "Απενεργοποίηση κατηγοριών"

#~ msgid "Submit for Review"
#~ msgstr "Υποβολή για Ανασκόπηση"

#, fuzzy
#~ msgid "Show Both Final and Options total box"
#~ msgstr "Εμφάνιση του πλαισίου συνόλου \"Τελικό\" και \"Επιλογές\""

#, fuzzy
#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "Εμφάνιση πλαισίου \"Τελικό\" και απόκρυψη επιλογών εάν είναι μηδέν"

#, fuzzy
#~ msgid "Hide Final total box"
#~ msgstr "Απόκρυψη πλαισίου \"Τελικό σύνολο\""

#, fuzzy
#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Να εμφανίζεται πάντα μόνο το τελικό σύνολο (Τιμή x Ποσότητα)"

#, fuzzy
#~ msgid "Disable but change product prices"
#~ msgstr "Απενεργοποίηση αλλά αλλαγή τιμών προϊόντων"

#, fuzzy
#~ msgid "Select when to show the final total box"
#~ msgstr "Επιλέξτε πότε θα εμφανίζεται το πλαίσιο τελικού αθροίσματος"

#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr ""
#~ "Εμφάνιση τελικού αθροίσματος και απόκρυψη επιλογών αν το σύνολο είναι "
#~ "μηδέν"
languages/woocommerce-tm-extra-product-options-fr_FR.po000064400001103434150755142440017310 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:52+0200\n"
"PO-Revision-Date: 2024-03-07 11:52+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Options supplémentaires pour le produit"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "Frais des options supplémentaires du produit"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "Paramètres des options supplémentaires pour le produit"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Paramètres"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr ""
"Options de produits supplémentaires et modules complémentaires pour "
"WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Plus d’informations sur %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Voir les détails"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "Paramètres des Extra Product Options"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Documents"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "Visitez le forum support des clients premium"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Support Premium"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Copie)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Variation n&deg;%1$s sur %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "Il n’y a pas encore de variations enregistrées."

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "Vous ne pouvez pas ajouter plus d’options supplémentaires."

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "Êtes-vous sûr de vouloir supprimer cette option?"

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Avant d’ajouter des options supplémentaires, ajoutez et sauvegardez quelques "
"attributs dans la table Attributs."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Montant fixe"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "Pourcentage du prix originel"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "Erreur"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "Requête non valide !"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "Voulez-vous vraiment supprimer ce dossier et tout ce qu’il contient ?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "Voulez-vous vraiment supprimer ce fichier ?"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "Êtes-vous sûr de vouloir réinitialiser vos paramètres?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Oui"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "Non"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Annuler"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Fermer"

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr "Nom de la constante"

#: admin/class-themecomplete-epo-admin-base.php:1285
msgid "Constant value"
msgstr "Valeur de la constante"

#: admin/class-themecomplete-epo-admin-base.php:1286
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Veuillez cocher la case de consentement pour donner votre autorisation à "
"envoyer vos données au serveur et réessayer."

#: admin/class-themecomplete-epo-admin-base.php:1287
msgid "Connecting to activation server ..."
msgstr "Connexion au serveur d’activation ..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Option de produit supplémentaire #%1$s de %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "N’a pu mettre à jour le post dans la base de donnée"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "Activer l’affichage des points ?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr ""
"Ceci vous permet de générer des points le long du sélectionneur de gamme."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "Nombre de points"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "Entrez le nombre de valeurs pour l&#39;affichage des points."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Infobulle"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Côté gauche"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Côté droit"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr "Infobulle et côté gauche"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr "Infobulle et côté droit"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr "Afficher la valeur de"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr "Sélectionner comment afficher les valeurs du sélectionneur de gamme."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "Valeur d’échelon"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "Entrer l’étape à traiter."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Pas de validation"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "Email"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "Url"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Nombre"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Chiffres"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "Lettres uniquement"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr "Lettres ou espace uniquement"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Alphanumérique"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "Unicode alphanumérique"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "Unicode ou espace alphanumérique"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr "Valider en tant que"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Choisir lequel du champ et de la méthode choisie devra être validé."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr "Requis"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr "Choisir si l’utilisateur doit remplir le champ ou non."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Activer"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr "Choisissez si l’option doit est activée ou non."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr "Encoder le prix pour ce champ ou le laisser vide s’il n’a pas de prix."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Prix de vente"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Encoder le prix de vente pour ce champ ou le laisser vide afin d’utiliser le "
"prix par défaut."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
msgid "Text after Price"
msgstr "Le texte après le Prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Encoder un texte à afficher après le prix pour ce champ ou le laisser vide "
"s’il n’y a pas de texte."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
msgid "Text before Price"
msgstr "Le texte avant le Prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Encoder un texte à afficher avant le prix pour ce champ ou le laisser vide "
"s’il n’y a pas de texte."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr "Pourcentage du prix original + options"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr "Prix ​​par ligne"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr "Pourcentage du prix originel au travail à la journée"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "Prix par travail à la journée (pas de premier travail à la journée)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr ""
"Pourcentage du prix originel par travail à la journée (pas de premier "
"travail à la journée)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
msgid "Price per character"
msgstr "Prix par travail à la journée"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
msgid "Percent of the original price per character"
msgstr "Pourcentage du prix originel au travail à la journée"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
msgid "Price per character (no first char)"
msgstr "Prix par travail à la journée (pas de premier travail à la journée)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
msgid "Price per character (no n-th char)"
msgstr "Prix par caractère (aucun caractère de la n-ème)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
msgid "Price per character (no n-th char and no spaces)"
msgstr "Prix par caractère (aucun caractère n-ième et sans espace)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
msgid "Percent of the original price per character (no first char)"
msgstr ""
"Pourcentage du prix originel par travail à la journée (pas de premier "
"travail à la journée)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
msgid "Percent of the original price per character (no n-th char)"
msgstr "Pourcentage du prix d'origine par caractère (no n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Pourcentage du prix d'origine par caractère (no n-th char and pas d'espace)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
msgid "Price per character (no spaces)"
msgstr "Prix par travail à la journée (pas d’espaces)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
msgid "Price per row"
msgstr "Prix ​​par ligne"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr "Formule mathématiques"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
msgid "Fixed amount + options"
msgstr "Montant fixe et options"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
msgid "Lookup table"
msgstr "Table de consultation"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Type de prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr "Valeur actuelle"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
msgid "Step * price"
msgstr "Étape * prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
msgid "Price per Interval"
msgstr "Prix par intervalle"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
#| msgid "Section type"
msgid "Calculation type"
msgstr "Type de section"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Aucun"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
msgid "Element ID for x"
msgstr "ID d’élément pour x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
msgid "Enter the element id to use for the x column."
msgstr "Entrez l’identifiant de l’élément à utiliser pour la colonne x."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
msgid "Element ID for y"
msgstr "ID d’élément pour y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
msgid "Enter the element id to use for the y column."
msgstr "Entrez l’identifiant de l’élément à utiliser pour la colonne y."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
msgid "Set to Fee"
msgstr "Définir à frais"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Attachez le prix à la commande, ce qui le rend indépendant de la quantité du "
"produit."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
msgid "Free characters"
msgstr "Caractères gratuits"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
msgid "Enter the number of Free characters."
msgstr "Entrez le nombre de caractères gratuits."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Valeur minimum"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr "Entrer la valeur minimum."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Valeur maximum"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr "Entrer la valeur maximum."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "Jour / Mois / Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
msgid "Month / Day / Year"
msgstr "Mois / Jour / Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "Jour . Mois . Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
msgid "Month . Day . Year"
msgstr "Mois . Jour . Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "Jour - Mois - Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
msgid "Month - Day - Year"
msgstr "Mois - Jour - Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr "Jour / Mois / Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr "Jour / Mois / Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr "Jour . Mois . Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr "Jour . Mois . Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr "Jour - Mois - Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr "Jour - Mois - Année"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Format de date"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr "H:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr "HH:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr "HH:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
msgid "hh:m:ss"
msgstr "hh:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr "hh:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr "h:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Format de l’heure"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr "Format de l’heure personnalisée"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr "Cela remplace le format de l’heure qui précède."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
msgid "Start year"
msgstr "L’année de départ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr "Entrer l’année de départ."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr "Année de fin"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr "Entrer l’année de fin."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr "Utiliser les URL de remplacement"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "Choisir de rediriger vers une URL si on clique sur l’option."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr "Compléter les options"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr ""
"Double cliquer sur le bouton radio pour enlever ses attributs sélectionnés."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr "Options de variation"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
msgid "Image swatches"
msgstr "Échantillons d'images"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
msgid "Color swatches"
msgstr "Échantillons de couleurs"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
msgid "Text swatches"
msgstr "Échantillons de texte"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
msgid "Replacement mode"
msgstr "Mode de remplacement"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
msgid "Select how to display the element."
msgstr "Sélectionnez le mode d’affichage de l’élément."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr "Début de l&#39;étiquette"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Centre"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
msgid "End of the label"
msgstr "Fin de l&#39;étiquette"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr "Position Swatch"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
msgid "Choose how the swatch will be displayed."
msgstr "Choisissez le mode d’affichage de la nuance."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
msgid "Use image lightbox"
msgstr "Utiliser une image « lightbox »"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "Choisir d’activer la lightbox sur le thumbnail."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr "Utiliser l’image de remplacement"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr "Utiliser l’image personnalisée"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "Changer l’image du produit"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr "Choisir de changer l’image du produit."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Afficher l’étiquette"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Afficher la description"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr "Afficher le label et la description"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Afficher l'image"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr "Afficher image et le label"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
msgid "Show image and description"
msgstr "Afficher l’image et la description"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr "Afficher l’image, le label et la description"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "Afficher les Infobulles"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
msgid "Enabling this will show a tooltip over the choice."
msgstr "L’activation de cette option affichera une info-bulle sur le choix."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr "Autoriser les boutons d’options vides"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr "Ceci ajoutera un bouton afin de vider les options sélectionnées."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
msgid "Show responsive values"
msgstr "Afficher les valeurs responsives"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "auto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr "Articles par rangée (ordinateurs de bureau et ordinateurs portables)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Utiliser ce champ pour afficher une grille. Encoder combien d’éléments par "
"ligne pour la grille ou laisser vide pour un affichage normal."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr "Nombre d'articles par rangées sur des tablettes en mode paysage"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr "Nombre d'articles par rangées sur des tablettes en mode portrait"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr "Nombre d'articles par rangées sur des smartphone"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
msgid "Items per row (iPhone 5)"
msgstr "Articles par ligne (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr "Articles par ligne (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr "Articles par ligne (iPhone 6  )"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "Articles par rangée (Samsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Articles par rangée (Galaxy Tablets paysage)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "Limiter la sélection"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Entrer un nombre supérieur à 0 pour limiter la sélection de cases à cocher "
"ou laisser vide pour un comportement par défaut."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
msgid "Exact selection"
msgstr "Sélection exacte"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Entrer un nombre supérieur à 0 pour obliger l’utilisateur à sélectionner le "
"nombre exact de cases à cocher ou laisser vide pour un comportement par "
"défaut."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "Sélection minimum"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Entrer un nombre supérieur à 0 pour obliger l’utilisateur à sélectionner au "
"moins ce nombre de cases à cocher ou laisser vide pour un comportement par "
"défaut."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr "Bouton de navigateur normal"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "Bouton stylisé"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr "Charger (upload) le style du bouton"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Champ date"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Sélectionneur de date"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr "Champ et sélectionneur de date"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr "Style du sélectionneur de date"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Cacher le prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr "Choisir de masquer le prix ou non."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Désactiver"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Gauche"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Droite"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Au dessus"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "En dessous"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr "Sélectionneur de quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr "Ceci affichera un sélecteur de quantité pour cette option."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "Valeur minimum de la quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr "Valeur maximum de la quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "Etape de la quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr "Entrer les étapes de la quantité."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
msgid "Quantity Default value"
msgstr "Valeur par défaut de le quantité"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr "Encoder une valeur a appliquer automatiquement au champ Quantité."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Espace réservé"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Nombre minimum de caractères"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""
"Encoder une valeur pour le nombre de caractère minimum l’utilisateur doit "
"entrer."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "Nombre maximum de caractères"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Encoder une valeur pour limiter le nombre maximum de caractères qu’un "
"utilisateur peut entrer."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Valeur par défaut"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr "Entrer une valeur à appliquer automatiquement au champ."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Taille"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
msgid "Reduce Width"
msgstr "Réduire la largeur"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
msgid "Increase Width"
msgstr "Augmenter la largeur"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "Modifier l’élément"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "Dupliquer Element"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(Aucun titre)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Modifier la section"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "Dupliquer la section"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Section"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Ajout d’élément"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr "Choisir l’image à utiliser à la place du bouton radio."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
msgid "Remove the image."
msgstr "Supprimer l’image."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr "Choisir l’image qui remplacera l’image du produit."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
msgid "Select boxes"
msgstr "Boites de sélection"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Boutons radio"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr "Cases d’option et l’image au début de l’étiquette"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
msgid "Radio buttons and image at end of the label"
msgstr "Cases d’option et l’image à la fin de l’étiquette"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Afficher en tant que"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
msgid "Select the display type of this attribute."
msgstr "Sélectionner le type d’affichage de cet attribut."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Attribut du Label"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
msgid "Leave blank to use the original attribute label."
msgstr "Laisser vide pour utiliser l’attribut originel du label."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "Autoriser"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "Afficher le bouton d’annulation"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "Autoriser l’affichage d’un bouton d’annulation pour cet attribut."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
msgid "Attribute element class name"
msgstr "Nom de classe de l’attribut de l’élément"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr ""
"Entrer un nom de classe supplémentaire à ajouter à l’attribut de cet élément"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Largeur"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Entrer la largeur de l’élément affiché ou laisser vide pour une largeur "
"automatique."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Hauteur"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Entrer la hauteur de l’élément affiché ou laisser vide pour une hauteur "
"automatique."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Cacher"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "Afficher"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
msgid "Show attribute name"
msgstr "Afficher le nom de l’attribut"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr "Choisir d’afficher ou de masquer le nom de l’attribut."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Couleur"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "Sélectionner la couleur à utiliser."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
msgid "Image replacement"
msgstr "Image de remplacement"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr "Sélectionner une image pour cet élément."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
msgid "Product Image replacement"
msgstr "Image de remplacement du produit"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr "Sélectionner l’image qui doit remplacer l’image du produit."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
msgid "No saved variations found."
msgstr "Aucune variation sauvegardée trouvée."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr "Choisir l’image à utiliser à la place de la case à cocher."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Choisissez l’image à utiliser à la place de la case d’option lorsqu’il est "
"activé."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Choisissez l’image à utiliser à la place de la case à cocher lorsqu’il est "
"activé."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
msgid "Choose the image for the lightbox."
msgstr "Choisissez l&#39;image pour la lightbox."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "Supprimer toutes les options"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Coché"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Par défaut"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
msgid "Choice label"
msgstr "Linellé du choix"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Type de prix"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Description"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Ajouter un élément"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "Ajouter un séparateur"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
msgid "Mass add"
msgstr "Ajout en masse"

#: admin/class-themecomplete-epo-admin-csv.php:41
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"La fonction php  mb_detect_encoding et mb_convert_encoding sont requises "
"pour l'import et l'export de fichiers CSV. Veuillez voir avec votre "
"hébergeur pour activer cette fonction."

#: admin/class-themecomplete-epo-admin-csv.php:289
msgid "Invalid CSV file."
msgstr "Action non valide."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr ""
"Le fichier chargé excède la taille maximale imposée dans le fichier php.ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr ""
"La taille du fichier excède la taille de fichier maximale spécifiée "
"(MAX_FILE_SIZE) dans le formulaire HTML."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "Le fichier chargé ne l’a été qu’en partie."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "Aucun fichier n’a été chargé."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Il manque un fichier temporaire."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Echec d’écriture du fichier sur le disque."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "Le chargement du fichier a été arrêté par l’extension."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""
"Désolé, ce type de fichier n’est pas autorisé pour des raisons de sécurité."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "Aucun fichier trouvé."

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr "Méthode."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "Fichier importé."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
msgid "The CSV file is invalid!"
msgstr "Le fichier CSV n’est pas valide !"

#: admin/class-themecomplete-epo-admin-csv.php:552
msgid "Invalid CSV file!"
msgstr "Fichier CSV non valide!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr ""
"Essayer de charger des fichiers plus larges que %s n’est pas autorisé !"

#: admin/class-themecomplete-epo-admin-csv.php:624
msgid "File imported with new tables."
msgstr "Fichier importé avec les nouvelles tables."

#: admin/class-themecomplete-epo-admin-csv.php:633
msgid "There was an error importing the CSV file."
msgstr "Une erreur s’est produite lors de l’importation du fichier CSV."

#: admin/class-themecomplete-epo-admin-csv.php:662
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Une erreur s’est produite lors de l’enregistrement des données csv. Veuillez "
"vérifier l’encodage de votre fichier csv !"

#: admin/class-themecomplete-epo-admin-csv.php:678
msgid "Table names are different. Do you want to override the tables?"
msgstr ""
"Les noms des tables sont différents. Voulez-vous remplacer les tables ?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr "Donnée invalide !"

#: admin/class-themecomplete-epo-admin-global-base.php:261
msgid "Something went wrong with the request!"
msgstr "Quelque chose a mal tourné avec la demande!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "Options sauvegardées !"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "Inclure les formulaires additionnels globaux"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(sans titre)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Effacer toutes les formes globales supplémentaires"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "Désactiver Exclure des Options globales"

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr "Permettre d’exclure des Options globales"

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr "Supprimer toutes les options"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "Le gestionnaire de fichier n’est pas supporté sur votre serveur."

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "Vos réglages ont été réinitialisés."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "Une erreur s'est produite lors de l'enregistrement du fichier."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Vos réglages ont été enregistrés."

#: admin/class-themecomplete-epo-admin-global-base.php:914
msgid "Clone template"
msgstr "Dupliquer le modèle"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Dupliquer le formulaire"

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr "Exporter le formulaire"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr "Création de formulaire d'options supplémentaires"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Titre"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Priorité"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Appliqués à"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Catégories"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Produits"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr "Produits exclus"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "Tous les produits"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Désactiver"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "Produits et Catégories"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Code personnalisé"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "TOUTES les catégories"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
#| msgid "CSS Settings"
msgid "Form settings"
msgstr "Paramètres CSS"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Publier"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Rôles"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Exclure les produits"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr "La description apparaîtra sous le titre."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr "Rôles activés pour ce formulaire"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr "Rôles désactivés pour ce formulaire"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr "Exclure le ou les produits du formulaire"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Rechercher un produit&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Sélectionner le(s) produit(s) auxquels appliquer les options"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
msgid "Meta data not correctly saved. Please save the product!"
msgstr ""
"Les métadonnées ne sont pas correctement enregistrées. S’il vous plaît "
"enregistrer le produit!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Ajouter une section"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr "Variations de styles"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Sauvegarder"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "Importer le CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "Exporter le CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr "Grande taille"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr ""
"S’il vous plaît enregistrer le formulaire avant d’importer des options!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr "S’il vous plaît enregistrer le produit avant d’importer des options!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr "Aucun élément trouvé !"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr "Commencez à ajouter des éléments"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "Ajouter un élément dans une nouvelle section"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Supprimer de manière permanente"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "Déplacer dans la corbeille"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Mise à jour"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
#| msgid "Self mode"
msgid "Apply mode"
msgstr "Mode auto"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "Tous les produits"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Prix personnalisé"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr "Quelque chose n’a pas fonctionné avec WordPress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce n’est pas activé!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "On essaye de tricher, hein ?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr "Vous n’êtes pas autorisés a déplacer cet élément dans la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Erreur durant le déplacement vers la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr "Vous ne pouvez pas restaurer cet élément de la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Erreur de restauration de l’élément depuis la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "Vous ne pouvez pas supprimer cet élément."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Erreur durant la suppression."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr ""
"L’élément que vous tentez de déplacer depuis la corbeille n’existe plus."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "Type de post inconnu."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"Vous ne pouvez déplacer cet élément dans la corbeille. %s est actuellement "
"en cours d’édition."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""
"L’élément que vous essayez de restaurer depuis la corbeille n’existe plus."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr "Vous ne pouvez pas déplacer cet élément en dehors de la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr "Cet élément a déjà été supprimé."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr ""
"Vous avez tenté d’éditer un élément qui n’existe pas. Peut-être a-t-il été "
"supprimé ?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "Vous n’êtes pas autorisé à modifier cet élément."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"Vous ne pouvez éditer cet élément parce qu’il se trouve dans la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s post mis à jour."
msgstr[1] "%s posts mis à jour."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "%s non mis à jour, quelqu’un est en train de le modifier."
msgstr[1] "%s posts non mis à jour, quelqu’un est en train de les modifier."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s post supprimé définitivement."
msgstr[1] "%s posts supprimés définitivement."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s post déplacé dans la corbeille."
msgstr[1] "%s posts déplacés dans la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "%s post restauré depuis la corbeille."
msgstr[1] "%s posts restaurés depuis la corbeille."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "Le formulaire sélectionné ne contient aucunes sections"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Afficher les filtres"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "Cacher les filtres"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Filtrer par"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "on"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "Voulez-vous vraiment supprimer cet élément ?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr "Voulez-vous vraiment dupliquer cet élément ?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Modifier les paramètres"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "ID de l’élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "Identifiant ID de section"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "est"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "n'est pas"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "est vide"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "n’est pas vide"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "commence avec"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "se termine par"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "plus grand que"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "moins que"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr "supérieur ou égal à"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr "inférieur ou égal à"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"Vous ne pouvez pas appliquer les règles de cet élément ou de l’article car "
"il n’y a pas d’éléments de valeur configurée sur d’autres sections, ou pas "
"d’autres sections trouvés."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""
"Une erreur s’est produite ! Impossible d’appliquer des conditions sur cet "
"élément !"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "Remplir"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "Extension de fichier invalide"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr "Importation de csv..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr "Sauvegarde en cours … merci de patienter."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "Importation des données"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "Modifier le tarif"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
msgid "Edit tab"
msgstr "Onglet Modifier"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr "Remplacer les éléments existants"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr "Ajouter de nouveaux éléments"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "La forme est appliquée à tous les produits"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "La forme n’est pas appliquée à tous les produits"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Chargement ..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
msgid "Product variables"
msgstr "Variables de produit"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
#| msgid "Global variables"
msgid "Special variables"
msgstr "Variables globales"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr "Variables globales"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Afficher le total des options"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Options Total"
msgstr "Prix du produit original"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Cumulative Total"
msgstr "Prix du produit original"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "Quantité de Produit"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr "Prix du produit original"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
#| msgid "Original product price"
msgid "Dynamic product price"
msgstr "Prix du produit original"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr "Cet élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr "La valeur de cet élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr "La longueur de valeur de cet élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr "Nombre d’options sélectionnées par l’utilisateur"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr "La quantité totale de cet élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr "La quantité de cet élément"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr "Autres éléments"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
msgid "The price of the targeted element"
msgstr "Le prix de l’élément ciblé"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Valeur"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
msgid "The value of the targeted element converted to a float"
msgstr "La valeur de l’élément ciblé convertie en nombre à virgule flottante"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Texte"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
msgid "The raw value of the targeted element"
msgstr "La valeur brute de l’élément ciblé"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
msgid "Text length"
msgstr "Longueur du texte"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
msgid "The text length of the targeted element"
msgstr "La longueur du texte de l’élément ciblé"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
msgid "The total quantity of the targeted element"
msgstr "La quantité totale de l’élément ciblé"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Nombre"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
msgid "The number of options the user has selected on the targeted element"
msgstr ""
"Le nombre d’options sélectionnées par l’utilisateur sur l’élément ciblé"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Tout"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Copier"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Mon <span class=\"count\">(%s)</span>"
msgstr[1] "Mon <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Tous <span class=\\\"count\\\">(%s)</span>"
msgstr[1] "Tous <span class=\\\"count\\\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Post-it <span class=\\\"count\\\">(%s)</span>"
msgstr[1] "Post-it <span class=\\\"count\\\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
msgid "Invalid CSV table!"
msgstr "Tableau CSV non valide !"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "Une erreur est survenue !"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
msgid "Overwrite existing tables"
msgstr "Remplacer les tables existantes"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
msgid "Look up table"
msgstr "Consulter la table"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
msgid "No CSV table found!"
msgstr "Aucune table CSV n’a été trouvée !"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
msgid "Import one by clicking the button below."
msgstr "Importez-en un en cliquant sur le bouton ci-dessous."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Nom de la table"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
msgid "Table index"
msgstr "Index de la table"

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr "Panneau de contrôle de l’OEB"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "Paramètres des options supplémentaires pour le produit"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Réinitialiser les paramètres"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Enregistrer les changements"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "N’importe"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Cliquer pour basculer"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Attribut :"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Type :"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Case à cocher"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Sélectionner"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Paramètres:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Variation :"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Prix :"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "Prix personnalisé (requis)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Prix personnalisé"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Attributs manquants. Merci de SUPPRIMER cette option supplémentaire :"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
msgid "Percent of the origιnal price"
msgstr "Pourcentage du prix d'origine"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Formulaire mis à jour."

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "Formulaire restauré suite à une révision issue de %s"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "Formulaire publié."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Formulaire sauvegardé."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Formulaire soumis."

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr "Calendrier de formulaire pour : %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Brouillon du formulaire mis à jour."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Entrer le titre ici"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Annuler"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Option"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Coût"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Qté"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Total"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "Taxe"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Modifier élément"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Supprimer l'(les)article(s)"

#: admin/views/html-tm-epo.php:29
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Avant d’ajouter des options supplémentaires dans ce mode, ajoutez et "
"enregistrez certains attributs sur l’onglet Attributs."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Tout développer"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Tout fermer"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "Ajouter des options supplémentaires"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "Constructeur"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Normal"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Pour traduire des strings pour les options locales, merci d’utiliser "
"l’interface WPML."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "De"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Gamme"

#: admin/views/html-tm-global-epo.php:118
msgid "Price display override"
msgstr "Remplacement de l’affichage des prix"

#: admin/views/html-tm-global-epo.php:119
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Cela remplacera le prix du produit affiché sur les pages de la boutique/"
"archive/boucle de produit."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Normal"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "À"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Vente"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"Les formulaires que vous choisirez seront affichés aux côtés des formulaires "
"que le produit possède déjà."

#: admin/views/html-tm-global-epo.php:206
msgid "Exclude from"
msgstr "Exclure des"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Cela n’exclura toute forme global attribué à ce produit sauf celles définies "
"dans le paramètre précédent."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "Remplacer le prix du produit"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Cela remplacera le prix du produit avec le prix des options si le prix total "
"options est supérieur puis zéro."

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr "Passer outre l’affichage global"

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr "Cela remplacera la méthode d’affichage uniquement pour ce produit."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "Utiliser les paramètres généraux"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "Toujours afficher"

#: admin/views/html-tm-global-epo.php:260
msgid "Show only with an action hook"
msgstr "Afficher seulement avec les actions épinglées"

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr "Passer outre le total final de la boite"

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr ""
"Cela remplace l’affichage de la zone totaux uniquement pour ce produit."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
#| msgid "Hide Final total box if Options total is zero"
msgid "Disable if Options total is zero"
msgstr ""
"Cacher le total final de la boite si le total des options est égal à zéro"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
#| msgid "Hide Final total box if total is zero"
msgid "Disable if total is zero"
msgstr "Masquer la zone Total final si le total est égal à zéro"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Afficher le total des options"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr "Cela remplacera la méthode d’affichage uniquement pour ce produit."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Afficher lorsque le total est supérieur à zéro"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Afficher le total final"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid "This will Show Final Total setting only for this product."
msgstr "Cela remplacera la méthode d’affichage uniquement pour ce produit."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
msgid "Override enabled roles for this product"
msgstr "Substituer des rôles activés pour ce produit"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
msgid "This will override which roles can see the options for this product."
msgstr ""
"Cela remplacera les rôles qui peuvent afficher les options pour ce produit."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "Le clonage est interdit."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "La désérialisation des instances de cette classe est interdite."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "Gratuit!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Sélectionner les options"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "Ajouter au panier"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
msgid "Product element is not supported for components!"
msgstr "L’élément de produit n’est pas pris en charge pour les composants !"

#: includes/class-themecomplete-extra-product-options.php:4984
msgid "Product element is not supported within another product element!"
msgstr ""
"L’élément Product n’est pas pris en charge dans un autre élément Product !"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Cases à cocher"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Sélectionneur de couleur"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Date"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Dimanche"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Lundi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Mardi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Mercredi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Jeudi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Vendredi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Samedi"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr "Janvier "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Février"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Mars"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "Avril"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Mai"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Juin"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Juillet"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "Août"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "Septembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Octobre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "Novembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "Décembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Entrez une valeur à appliquer au champ automatiquement selon votre format de "
"la date sélectionnée. (Deux chiffres pour le jour, deux chiffres par mois et "
"quatre chiffres pour l’année)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr "Date minimale sélectionnable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "Un nombre de jours à partir d’aujourd’hui."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr "Date maximum sélectionnable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Désactiver les dates"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Une virgule sépare les dates en accord avec le format de date sélectionné. "
"(Deux chiffres pour le jour, deux chiffres pour le mois et quatre chiffres "
"pour l’année)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
msgid "Enabled dates"
msgstr "Activer les dates"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Une virgule sépare les dates en accord avec le format de date sélectionné. "
"(Deux chiffres pour le jour, deux chiffres pour le mois et quatre chiffres "
"pour l’année). Merci de noter que ce paramètre sera prioritairement pris en "
"compte sur tout autre paramètre !"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr "Epo blanc"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr "Epo noir"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Thème"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "Sélectionner le thème pour le datepicker (sélectionneur de dates)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Petit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Moyen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Large"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr "Sélectionner la date du Datepicker (sélectionneur de dates)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr "Haut de l’écran"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr "Bas de l’écran"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Position"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr "Sélectionner la position du Datepicker (sélectionneur de dates)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
msgid "Exclude disabled"
msgstr "Exclure désactivé"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Pour ce faire, la date minimum et maximale sélectionnable ne comptera pas "
"les jours de semaine désactivés sélectionnés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr "Désactiver les jours de la semaine"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr ""
"Ceci vous permet de désactiver tous les jours de la semaine sélectionnés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr "Désactiver les mois"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr "Cela vous permet de désactiver tous les mois sélectionnés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Traductions"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Jour"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Mois"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Année"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Diviseur"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Options générales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Logique conditionnelle"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr "Paramètres CSS"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr "Nom de classe de l’élément"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr "Entrer un nom de classe supplémentaire à ajouter à cet élément"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "Remplacer le prix du produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "Changer l’image du produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "Identifiant ID de section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr ""
"Choissisez la taxe pour le prix des frais supplémentaires de cet élément."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
#| msgid "Math formula"
msgid "Formula"
msgstr "Formule mathématiques"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "Entrer l’étape à traiter."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Afficher en tant que"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
#| msgid "Enter a text to replace the Close button text on the calendar."
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton de fermeture dans le "
"calendrier."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
#| msgid "Text before Price"
msgid "Text before result"
msgstr "Le texte avant le Prix"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
#| msgid ""
#| "Enter a text to display before the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Encoder un texte à afficher avant le prix pour ce champ ou le laisser vide "
"s’il n’y a pas de texte."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
#| msgid "Text after Price"
msgid "Text after result"
msgstr "Le texte après le Prix"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
#| msgid ""
#| "Enter a text to display after the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Encoder un texte à afficher après le prix pour ce champ ou le laisser vide "
"s’il n’y a pas de texte."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Titres"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Type de Header"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "Titre du Header"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the Content"
msgstr "Gauche du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the Content"
msgstr "Droite du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Position du Header"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Couleur du Header"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr "Laisser vide pour les valeurs par défaut"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Contenu (Content)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "Couleur du Contenu (Content)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
#| msgid "Above field"
msgid "Above Header"
msgstr "Dessus du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr "Icône de gauche de l’infobulle"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr "Icône droite de l’infobulle"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "Position du Contenu (Content)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
#| msgid "Multi-Select Field"
msgid "Multiple Upload"
msgstr "Sélectionner une case multiple"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Produit unique"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr "Mode de sélection"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr "Que ce soit pour inclure des produits ou des catégories spécifiques."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
msgid "Search for a category ..."
msgstr "Rechercher la catégorie..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Select categories"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr "Ajouter des catégories pour inclure tous leurs produits associés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Rechercher un produit ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Sélectionnez des produits"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr "Ajouter les produits individuellement."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr "Choisissez une valeur"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Prix de base"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "Nom"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Ordre du menu"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Aléatoire"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Trier par"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr "Sélectionnez le paramètre par lequel les produits seront triés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Ascendant"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Descendant"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Ordre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr "Sélectionnez l’ordre de tri des produits."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Sélectionner un produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr "Produit par défaut"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr "Sélectionnez le produit qui sera présélectionné."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Liste déroulante"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Miniatures"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
msgid "Thumbnails multiple"
msgstr "Miniatures multiples"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "Mode de disposition"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr "Sélectionnez comment les produits seront présentés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr "Décrochage Placeholder"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr "Entrez le lieu réservé pour le décrochage."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Quantité minimale"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Quantité Maximum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr "Expédié individuellement"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Si cela est activé, le produit inclus n’est pas expédié avec le produit "
"principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr "Maintenir le poids"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Si cela est activé, le produit inclus ajoutera son poids au produit "
"principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr "Prix individuel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr "Si cela est activé, le produit inclus maintiendra son propre prix."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Pourcentage"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Type de remise"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Sélectionnez le type de rabais. La réduction s’applique au prix final du "
"produit. Si le produit a des options supplémentaires, alors la réduction "
"s’applique au montant après que les options ont été ajoutées au prix du "
"produit."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Remise"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr "Entrez le code promo."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
msgid "Disable Addons"
msgstr "Désactiver les modules complémentaires"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Si cette option est activée, les addons inclus dans le produit associé ne "
"seront pas affichés."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
msgid "Exlude Addon prices from the discount"
msgstr "Exclure les prix des modules complémentaires de la remise"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Si cette option est activée, la réduction ne sera pas appliquée aux modules "
"complémentaires du produit."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Panier"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Commander"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
msgid "Order and Emails"
msgstr "Commande et e-mails"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
msgid "Hide product in"
msgstr "Masquer le produit dans"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
msgid "Select where to hide the product"
msgstr "Sélectionnez l’emplacement de masquage du produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr "Permettre de montrer l’image du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Afficher le titre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr "Permettre de montrer le titre du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Afficher le titre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
#| msgid "Enable to show the title of the associated product."
msgid "Enable to have the title link to the associated product."
msgstr "Permettre de montrer le titre du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "Afficher le prix"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr "Permettre de montrer le prix du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr "Permettre de montrer la description du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr "Afficher les métas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
msgid "Enable to show the meta of the associated product."
msgstr "Permettre de montrer la méta du produit associé."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Options avancées"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr "Sélectionneur de gamme"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "Options des titres"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr "Normal (vide)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Boite"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr "Développer et fermer (commencer l’ouverture)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr "Développer et fermer (commencer la fermeture)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Accordéon"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr "Style de la section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr "Sélectionnez le style d'affichage de cette section."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr "Couleur de fond de la section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
msgid "Section label background color"
msgstr "Couleur d’arrière-plan de l’étiquette de section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
msgid "Section subtitle background color"
msgstr "Couleur d’arrière-plan des sous-titres de section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr "Avant Options locales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr "Après Options locales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr "Emplacement de la section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Sélectionner où cette section devra apparaitre par rapport aux options "
"locales."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "Pop up"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr "Curseur (assistant)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Onglets"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr "Type de section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr "Sélectionner le type d’affichage de cette section."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "Lien Texte"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Bouton"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
msgid "Button Alt"
msgstr "Bouton Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
msgid "Section pop up button style"
msgstr "Section pop up button style"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
msgid "Select this section's pop up button style."
msgstr "Sélectionnez le style bouton pop up de cette section."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
msgid "Section pop up button text"
msgstr "Texte du bouton contextuel de la section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Entrez un texte pour remplacer le texte par défaut du bouton contextuel. "
"Cela remplacera la valeur globale."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr "Nom de classe de section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr "Entrer un nom de classe supplémentaire à ajouter à cette section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
msgid "Section Conditional Logic"
msgstr "Logique conditionnelle de la section"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr ""
"Autoriser la logique conditionnelle pour afficher ou masquer cette section."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Boite de sélection"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr ""
"Cela comptera comme une valeur vide au cas où l’élément est nécessaire."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
msgid "Multi-Select Field"
msgstr "Sélectionner une case multiple"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Template"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
msgid "Select a template ..."
msgstr "Sélectionnez un modèle..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Selectionnez template"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
msgid "Add the template you want to display."
msgstr "Ajoutez le modèle que vous souhaitez afficher."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Zone de texte"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Champ texte"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
#| msgid "Enter the quantity step."
msgid "Enter the step."
msgstr "Entrer les étapes de la quantité."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Heure"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr "Style système"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Style personnalisé"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr "Style de cueilleur de temps"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
msgid "Minimum selectable time"
msgstr "Minimum de temps sélectionnable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr "Entrez l’heure au format suivant : 08:00 am"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
msgid "Maximum selectable time"
msgstr "Temps maximum de sélectionnable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr "Sélectionnez le thème de la timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr "Sélectionnez la taille de la timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
msgid "Select the position of the timepicker."
msgstr "Sélectionnez la position de la timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Heure"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Minute"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Seconde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Charger"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Variations"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr "Logique conditionnelle de l’élément"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
msgid "Enable conditional logic for showing or hiding this element."
msgstr ""
"Autoriser la logique conditionnelle pour afficher ou masquer cet élément."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "Type de label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
#| msgid "Select mode"
msgid "Label view mode"
msgstr "Mode de sélection"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
#| msgid "Above field"
msgid "Above the fields"
msgstr "Dessus du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr "Dessus du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the fields"
msgstr "Gauche du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr "Gauche du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the fields"
msgstr "Droite du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the field"
msgstr "Droite du champ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "Position du label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Couleur du label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Sous-titre"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
#| msgid "Below field"
msgid "Below the fields"
msgstr "Champ du dessous"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr "Champ du dessous"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr "Position du sous-titre"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Couleur du sous-titre"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr "Règle horizontale"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Padding"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr "Type de diviseur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "Options du label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr "ID de l’élément"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr "Entrez un identifiant pour le conteneur de l&#39;élément."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
msgid "Inherit product setting"
msgstr "Hériter des paramètres du produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr "Inclure le prix de la taxe pour les frais supplémentaires"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Choisissez si vous souhaitez inclure le prix de la taxe pour les frais "
"supplémentaires sur cet élément."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr "Classe de la taxe pour le prix des frais supplémentaires"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr ""
"Choissisez la taxe pour le prix des frais supplémentaires de cet élément."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr "Cacher l&#39;étiquette d&#39;élément dans le panier"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr ""
"Choisissez si vous voulez masquer l&#39;étiquette d&#39;élément dans le "
"panier ou non."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr "Masquer le prix pour tous les produits"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
msgid "Yes, but show price"
msgstr "Oui, mais afficher prix"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr "Masquer valeur de l&#39;élément dans le panier"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr "Choisissez de cacher la valeur de l&#39;élément dans le panier ou non."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "Cacher l&#39;étiquette de l&#39;élément dans la commande"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr ""
"Choisissez si vous voulez masquer l&#39;étiquette dans la commande ou non."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "Masquer valeur de l'élément dans la commande"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr ""
"Choisissez si vous souhaitez masquer ou non la valeur de l'élément dans la "
"commande."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
msgid "Hide element label in floating totals box"
msgstr "Masquer l'étiquette dans la \"boite de totaux flottante\""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Choisissez si vous voulez masquer l&#39;étiquette dans la \"boite de totaux "
"flottante\"."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr "Masquer l'élément dans la \"boite de totaux flottante\""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Choisissez de cacher la valeur de l&#39;élément dans la boîte de totaux "
"flottante ou non."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "Paramètres WooCommerce"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
msgid "Enable repeater"
msgstr "Activer le répéteur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
msgid "This will make this element repeatable."
msgstr "Cela rendra cet élément reproductible."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
msgid "Bind repeater with product quantity"
msgstr "Répéteur de liaison avec quantité de produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
msgid "This will make this element repeatable based on the product quantity."
msgstr ""
"Cela rendra cet élément répétable en fonction de la quantité de produit."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
msgid "Repeater minimum limit"
msgstr "Limite minimale du répéteur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Définissez le nombre minimal de lignes qu’un utilisateur peut ajouter pour "
"le champ du répéteur."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
msgid "Repeater maximum limit"
msgstr "Limite maximale du répéteur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Définissez le nombre maximal de lignes qu’un utilisateur peut ajouter pour "
"le champ répéteur."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
msgid "Repeater Button Label"
msgstr "Étiquette du bouton Répéteur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
msgid "Leave this blank for the default label."
msgstr "Laissez ce champ vide pour l’étiquette par défaut."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
msgid "Radio Button Connector ID"
msgstr "ID du connecteur du bouton radio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Entrez un identifiant personnalisé pour connecter différents éléments de "
"bouton radio."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
msgid "Repeater Settings"
msgstr "Paramètres du répéteur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Toutes les &quot;%s&quot; instances de méthode"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (ID d’instance: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
msgid "Flat Rates (Legacy)"
msgstr "Tarifs forfaitaires (Légal)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr "(Héritage)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
msgid "Select shipping methods ..."
msgstr "Sélectionnez les méthodes d’expédition ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
msgid "Enable Shipping Methods"
msgstr "Activer les méthodes d’expédition"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
msgid "Select the shipping methods to enable."
msgstr "Sélectionnez les modes d’expédition à activer."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
msgid "Enable Shipping Methods Condition"
msgstr "Activer la condition des méthodes d’expédition"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Spécifiez les conditions d’activation des méthodes d’expédition en fonction "
"de la valeur du champ actuel. Si les conditions sont remplies, les modes "
"d’expédition sélectionnés seront disponibles pour que les clients puissent "
"choisir lors du paiement."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
msgid "Disable Shipping Methods"
msgstr "Désactiver les méthodes d’expédition"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
msgid "Select the shipping methods to disable."
msgstr "Sélectionnez les modes d’expédition à désactiver."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
msgid "Disable Shipping Methods Condition"
msgstr "Désactiver la condition des méthodes d’expédition"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Spécifiez les conditions de désactivation des méthodes d’expédition en "
"fonction de la valeur du champ actuel. Si les conditions sont remplies, les "
"modes d’expédition sélectionnés ne seront pas disponibles pour les clients "
"lors du paiement."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Actions"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Réglages généraux"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr "Hériter de la classe de taxe du produit"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Standard"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "Laisser vide pour calculer automatiquement depuis le %s prix"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr "Laisser vide pour calculer automatiquement depuis le %s prix de vente"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
msgid "this section if the following conditions are met."
msgstr "cette section si les conditions suivantes sont remplies."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
msgid "this field if the following conditions are met."
msgstr "ce champ si les conditions suivantes sont remplies."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
msgid "Add new condition group"
msgstr "Ajouter un nouveau groupe de conditions"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "La quantité de \"%1$s\" ne peut pas être inférieur à %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "La quantité de \"%1$s\" ne peut pas être supérieur à %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr "La quantité de « %1$s » doit être indiquée en multiples de %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s enlevé avec tous ses produits associés!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"L’article %s a été retiré du panier car il a été modifié depuis son ajout."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr "Vous ne pouvez ajouter des produits aux prix négatifs au panier."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
msgid "You cannot add zero priced products to the cart."
msgstr "Vous ne pouvez pas ajouter des produits à zéro à des prix au panier."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "Voir les options"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "\"%s\" est un champ requis."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s a été retiré de votre panier parce qu’il a depuis été modifié. Vous "
"pouvez l’ajouter à votre panier %2$s."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "ici"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr "Frais supplémentaires"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Vider le panier"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Modifier les options"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Mettre à jour le panier"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&laquo;%s&raquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "%s a été mis à jour."
msgstr[1] "%s posts mis à jour."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Voir le panier"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"Les options supplémentaire des produits TM de WooCommerce requièrent "
"WordPress %s ou une version ultérieure."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Les options de produits supplémentaires et les modules complémentaires pour "
"WooCommerce nécessitent les options de paiement supplémentaires de "
"WooCommerce %s ou une version ultérieure !."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
msgid "The installed version is"
msgstr "La version installée est"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Important :%2$s Votre version de WooCommerce Extra Checkout Options "
"n’est pas prise en charge. Veuillez effectuer la mise à jour vers la "
"dernière version."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Important :%2$s Options de produit et modules complémentaires "
"supplémentaires pour WooCommerce a été désactivé car il n’est pas compatible "
"avec la version actuelle des options de paiement supplémentaires."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
#| msgid ""
#| "%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has "
#| "been deactivated because it is not compatible with the current version of "
#| "Extra Checkout Options."
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Important :%2$s Options de produit et modules complémentaires "
"supplémentaires pour WooCommerce a été désactivé car il n’est pas compatible "
"avec la version actuelle des options de paiement supplémentaires."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Important :%2$s Veuillez exécuter le programme de mise à jour de "
"WooCommerce avant d’utiliser les options de produit supplémentaires et les "
"modules complémentaires pour WooCommerce."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Important :%2$s Options de produits supplémentaires et modules "
"complémentaires pour WooCommerce nécessite %3$sWooCommerce%4$s %5$s ou une "
"version ultérieure."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Mettre à jour"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%s Important : %s Les options supplémentaires des produits TM de WooCommerce "
"requièrent WordPress %s. ou une version ultérieure."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Important : %2$s Options de produit supplémentaires et modules "
"complémentaires pour WooCommerce nécessite la version %3$s ou ultérieure de "
"PHP."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Nom de fichier"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Supprimer"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "Options supplémentaires pour le produit"

#: includes/classes/class-themecomplete-epo-post-types.php:101
msgid "Global Forms"
msgstr "Formulaires globaux"

#: includes/classes/class-themecomplete-epo-post-types.php:102
msgid "Global Form"
msgstr "Forme globale"

#: includes/classes/class-themecomplete-epo-post-types.php:103
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Formulaires globaux"

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr "Ajouter un formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr "Ajouter un nouveau formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Modifier"

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr "Modifier le formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr "Nouveau formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr "Afficher le formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr "Chercher le formulaire global"

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr "Pas de formulaire global trouvé"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "Pas de formulaire global trouvé dans la corbeille"

#: includes/classes/class-themecomplete-epo-post-types.php:114
msgid "Parent Global Form"
msgstr "Formulaire global parent"

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr ""
"C’est là que vous pouvez ajouter de nouveaux produits à votre e-commerce."

#: includes/classes/class-themecomplete-epo-post-types.php:156
msgid "Option Templates"
msgstr "Modèles d’options"

#: includes/classes/class-themecomplete-epo-post-types.php:157
msgid "Option Template"
msgstr "Modèle d’option"

#: includes/classes/class-themecomplete-epo-post-types.php:158
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Modèles d’options"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Ajouter un modèle"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Ajouter un nouveau modèle"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Modifier le modèle"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Nouveau modèle"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Voir le modèle"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Modèle de Recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "Aucun modèle trouvé"

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr "Aucun modèle trouvé dans la corbeille"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "Thème parent"

#: includes/classes/class-themecomplete-epo-post-types.php:171
msgid "This is where you can add new global template options."
msgstr ""
"C’est ici que vous pouvez ajouter de nouvelles options de modèle global."

#: includes/classes/class-themecomplete-epo-post-types.php:202
msgid "Lookup tables"
msgstr "Tableaux de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:204
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Tableaux de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:205
msgid "Add Lookup table"
msgstr "Ajouter une table de correspondance"

#: includes/classes/class-themecomplete-epo-post-types.php:206
msgid "Add New Lookup table"
msgstr "Ajouter une nouvelle table de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:208
msgid "Edit Lookup table"
msgstr "Modifier la table de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:209
msgid "New Lookup table"
msgstr "Nouvelle table de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
msgid "View Lookup table"
msgstr "Voir la table de correspondance"

#: includes/classes/class-themecomplete-epo-post-types.php:212
msgid "Search Lookup table"
msgstr "Rechercher dans la table de recherche"

#: includes/classes/class-themecomplete-epo-post-types.php:213
msgid "No Lookup table found"
msgstr "Aucune table de correspondance n’a été trouvée"

#: includes/classes/class-themecomplete-epo-post-types.php:214
msgid "No Lookup table found in trash"
msgstr "Aucune table de correspondance n’a été trouvée dans la corbeille"

#: includes/classes/class-themecomplete-epo-post-types.php:215
msgid "Parent Lookup table"
msgstr "Table de correspondance parente"

#: includes/classes/class-themecomplete-epo-post-types.php:217
msgid "This is where you can add new lookup tables."
msgstr "C’est ici que vous pouvez ajouter de nouvelles tables de recherche."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Prix unitaire"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Montant des options"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
msgid "Options VAT amount"
msgstr "Montant de la TVA sur les options"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "Montant des Frais"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "Total final"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Précédent"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Suivant"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "caractères restants"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr "Téléchargement des fichiers"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
msgid "Your files are being uploaded"
msgstr "Vos fichiers sont en cours de téléchargement"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "fichier"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "fichiers"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Le champ est requis."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Merci de bien vouloir encoder une adresse email valide."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Merci de bien vouloir encoder une URL valide."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Merci de bien vouloir encoder un numéro valide."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Merci de n’encoder que des chiffres."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Merci d’entrer une valeur inférieure ou égale à {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Merci d’entrer une valeur supérieure ou égale à {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr "Merci de n’encoder pas plus de {0} caractères."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "Merci de n’encoder pas plus de {0} caractères."

#: includes/classes/class-themecomplete-epo-scripts.php:584
msgid "Please enter at least {0} character."
msgstr "Merci d’entrer au moins {0} caractères."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Merci d’entrer au moins {0} caractères."

#: includes/classes/class-themecomplete-epo-scripts.php:586
msgid "Please select up to {0} choice."
msgstr "Merci de sélectionner jusqu’à {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "Merci de sélectionner jusqu’à {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:588
msgid "Please select exactly {0} choice."
msgstr "Merci de sélectionner exactement {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "Merci de sélectionner exactement {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:590
msgid "Please select at least {0} choice."
msgstr "Merci de sélectionner au moins {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "Merci de sélectionner au moins {0} choix."

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr "Veuillez fournir un multiple de {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr "Veuillez entrer uniquement des lettres."

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr "Veuillez saisir uniquement des lettres ou des espaces."

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr "Merci de n’encoder que des chiffres."

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr "Merci de n’encoder que des chiffres."

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Merci de n’encoder que des chiffres."

#: includes/classes/class-themecomplete-epo-scripts.php:598
msgid "Minimum number of rows is {0}"
msgstr "Le nombre minimal de lignes est de {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
msgid "Maximum number of rows is {0}"
msgstr "Le nombre maximal de lignes est de {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Fait"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Aujourd’hui"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "Général"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Afficher"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Strings"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Style"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Global"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Éléments"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr "Gestionnaire de chargement"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Code personnalisé"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
msgid "Math Formula Constants"
msgstr "Constantes de formule mathématique"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Licence"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Commande de boutique"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Commande de boutique"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr "Initialisation"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr "Boite total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Divers"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
#| msgid "Enable front-end for roles"
msgid "Enable Frontend Access for Selected Roles"
msgstr "Activer l'interface pour les rôles"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
msgid "Select the roles that will have access to the extra options."
msgstr "Sélectionner les rôles qui auront accès aux options supplémentaires."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
#| msgid "Disable front-end for roles"
msgid "Disable Frontend Access for Selected Roles"
msgstr "Désactiver l'interface pour les rôles"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr "Sélectionner les rôles qui auront accès aux options supplémentaires."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
msgid "Enable translations"
msgstr "Activer les traductions"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
msgid "This will enable the default plugin translation using the pot files."
msgstr ""
"Cela activera la traduction du plugin par défaut à l’aide des fichiers pot."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
msgid "Post type hook priority"
msgstr "Priorité du crochet de type poteau"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"Ne modifiez pas cela à moins que vous ne sachiez comment cela affectera "
"votre site ! Il s’agit de la priorité à laquelle les types de messages sont "
"chargés par le plugin."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
msgid "Default value is 100"
msgstr "La valeur par défaut est 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
#| msgid "Select the parameter which the products will be sorted by."
msgid "Specify the areas where the plugin will be activated."
msgstr "Sélectionnez le paramètre par lequel les produits seront triés."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Tout le monde"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "Produits et Catégories"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
#| msgid "Product variables"
msgid "Product Taxonomies"
msgstr "Variables de produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Page du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "Boîte de total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Activez ce paramètre pour afficher une case Total final sur la page du "
"produit, permettant aux clients d’afficher le coût total de leur commande, "
"ou désactivez-la pour une page de produit simplifiée."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Afficher le total des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Activez cette option pour afficher le total spécifiquement pour les options "
"de produit sélectionnées."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Afficher le total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Permet d’afficher le total complet du produit, offrant aux clients une vue "
"d’ensemble claire du coût global."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
msgid "Enable Final total box for all products"
msgstr "Autoriser le total final de la boite pour tous les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
msgid "Show the Final total box even when the product has no extra options"
msgstr ""
"Afficher la boîte totale finale même lorsque le produit n’a pas d’options "
"supplémentaires"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr "Permettre l’affichage du total final d'origine"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr ""
"Cochez cette case pour activer l'affichage du total final non actualisé"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
msgid "Enable options VAT display"
msgstr "Activer les options d’affichage de la TVA"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Cochez cette case pour afficher le montant de la TVA des options au-dessus "
"du total des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
msgid "Show Unit price on totals box"
msgstr "Afficher le prix unitaire sur la zone des totaux"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Activez ceci pour afficher le prix unitaire lorsque la boîte totale est "
"visible"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr "Inclure les frais dans le prix unitaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
msgid "Enable this to add any Fees to the unit price"
msgstr "Activez ceci pour ajouter n’importe quel frais au prix unitaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
msgid "Total price as Unit Price"
msgstr "Prix total en tant que prix unitaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Assurez-vous que le prix total n'est pas multiplié par la quantité de produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
msgid "Hide Final total box until an element is chosen"
msgstr "Masquer la case Total final jusqu’à ce qu’un élément soit choisi"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Cochez cette case pour afficher le total final uniquement lorsqu’au moins "
"une option est remplie."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
msgid "Hide Final total box until all required elements are chosen"
msgstr ""
"Masquer la case Total final jusqu’à ce que tous les éléments requis soient "
"choisis"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Cochez cette case pour afficher le total final uniquement lorsque toutes les "
"options visibles requises sont remplies."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
msgid "Hide Final total box until all elements are chosen"
msgstr ""
"Masquer la case Total final jusqu’à ce que tous les éléments soient choisis"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Cochez cette case pour afficher la case Total final uniquement lorsque "
"toutes les options visibles sont remplies."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
msgid "Disable lazy load images"
msgstr "Désactiver les images lazy load"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
msgid "Enable this to disable lazy loading images."
msgstr "Activez ceci pour désactiver les images de chargement paresseuses."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
msgid "Preload lightbox images"
msgstr "Préchargez les images lightbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""
"Activez-le pour précharger l’image lors de l’utilisation de la fonction "
"lightbox."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Autoriser le plugin pour WooCommerce shortcodes"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Autoriser ceci chargera les fichiers du plugin sur toutes les pages "
"WordPress. A employer avec précautions."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
msgid "Enable shortcodes in options strings"
msgstr "Autoriser les boutons d’options vides"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"L’activation de ce système permettra l’utilisation de codes courts et de "
"code HTML dans l’étiquette des options et le texte de description."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Positionnement"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
msgid "Floating Totals box"
msgstr "Floating des totaux de la boite"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "Bouton Ajouter au panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animation"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Ceci contrôle la façon dont les champs sont affichés dans la partie front-"
"end.  Si vous choisissez \"Montrer à l'aide de shortcodes\" vous devez "
"manuellement écrire le code dans votre thème ou plugin afin d'afficher le "
"champs et que celui-ci fonctionne. Les paramètres de mise en place ne "
"fonctionneront pas. Si vous utilisez l'extension \"Composite Product\" vous "
"devez laissez les paramètres sur \"Normal\" sinon les options "
"supplémentaires ne pourront s'afficher dans le pack \"composite product\". "
"Plus d'informations disponibles dans la documentation. (en anlais)"

#: includes/classes/class-themecomplete-epo-settings-base.php:497
msgid "Show using action hooks"
msgstr "Afficher les action hooks utilisés"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
msgid "Extra Options placement"
msgstr "Placement des options supplémentaires"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
msgid "Select where you want the extra options to appear."
msgstr ""
"Sélectionnez l'endroit où vous souhaitez que les options supplémentaires "
"apparaissent."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Avant le bouton d’ajout au panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Après le bouton d’ajout au panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
msgid "Before cart form"
msgstr "Avant le formulaire du panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
msgid "After cart form"
msgstr "Après le formulaire du panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "Avant le produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "Après le produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr "Avant le récapitulatif produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Après le récapitulatif produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
msgid "After product image"
msgstr "Après l’image du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
msgid "Custom hook"
msgstr "Hook personnalisé"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
msgid "Extra Options placement custom hook"
msgstr "Options supplémentaires placement personnalisé"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
msgid "Extra Options placement hook priority"
msgstr "Priorité du crochet de placement du hook des options supplémentaires"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
msgid "Select the Extra Options placement hook priority"
msgstr ""
"Sélectionnez la priorité de crochet de placement d’options supplémentaires"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
msgid "Totals box placement"
msgstr "Placement des totaux de la boite"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
msgid "Select where you want the Totals box to appear."
msgstr "Select where you want the Totals box to appear."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
msgid "Totals box placement custom hook"
msgstr "Boite de total - placement personnalisé"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
msgid "Totals box placement hook priority"
msgstr "Totaux de placement prioritaire du hook"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
msgid "Select the Totals box placement hook priority"
msgstr "Sélectionnez la priorité de placement de la boîte Totals"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
msgid "This will enable a floating box to display your totals box."
msgstr ""
"Ceci va autoriser une floating box d’apparaitre les totaux de la boite."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "En bas à droite"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "En bas à gauche"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "En haut à droite"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "En haut à gauche"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
msgid "Floating Totals box visibility"
msgstr "Visibilité des totaux de la boîte flottante"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
msgid "This determines the floating totals box visibility."
msgstr "Cela déterminer la visibilité des totaux dans la boîte flottante."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "Toujours visible"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "Visble après le défilement de la page"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
msgid "Hide after scrolling the page"
msgstr "Masquer après le défilement de la page"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
msgid "Pixels amount needed to scroll"
msgstr "Quantité de pixels nécessaire pour faire défiler"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Sélectionnez le nombre de pixels que la page doit faire défiler pour que les "
"totaux flottants deviennent visibles."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
msgid "Add to cart button on floating totals box"
msgstr "Ajouter au panier le bouton des totaux de la boîte flottante"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
msgid "Display the add to cart button on floating box."
msgstr "Afficher l’ajouter le bouton au panier bouton de la boîte flottante."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr "Changer le prix d'origine du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Cochez pour écraser le prix d'origine du produit, lorsque le prix est "
"variable."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
msgid "Change variation price"
msgstr "Modifier le prix de la variation"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
msgid "Check to overwrite the variation price when the price is changing."
msgstr "Cochez pour écraser la variation de prix lorsque le prix est variable."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr "Forcer la sélection des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Cela change le bouton Ajouter au panier de la boutique pour afficher les "
"options de sélection lorsque le produit à des options de produits "
"supplémentaires. L’activation de cette fonctionnalité va supprimer l’ajax."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
msgid "Enable extra options in shop and category view"
msgstr ""
"Autoriser les options supplémentaires dans la vue du shop et de la catégorie"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Cocher pour autoriser l’affichage des options supplémentaires sur la page "
"shop et la vue des catégories. Ce paramètre dépend du thème et certains "
"aspects pourraient ne pas fonctionner comme vous l’espérez."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
msgid "Remove Free price label"
msgstr "Retirer le label de prix gratuit"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Cocher pour retirer le label de prix gratuit lorsque le produit a des "
"options supplémentaires"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
msgid "Use progressive display on options"
msgstr "Utiliser l’affichage progressif sur les options"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Permettre de masquer les options sur la page du produit jusqu'à ce que le "
"JavaScript est initialisé. Il s’agit d’un paramètre de sécurité intégrée et "
"nous vous recommandons d’être actif."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "Vitesse de l'animation"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
msgid "How long the animation will take in milliseconds"
msgstr "Combien de temps l’animation prendra en millisecondes"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
msgid "Start Animation delay"
msgstr "Temporisation de l’animation de démarrage"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
msgid "The delay until the animation starts in milliseconds"
msgstr "Le délai jusqu’à ce que l’animation commence en millisecondes"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
msgid "Show quantity selector only for elements with a value"
msgstr ""
"Afficher le sélecteur de quantité seulement pour les éléments ayant une "
"valeur"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
msgid "Check show quantity selector only for elements with a value."
msgstr ""
"Cocher le sélecteur qui affiche les quantités uniquement pour les éléments "
"ayant une valeur."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
msgid "Hide add-to-cart button until an element is chosen"
msgstr ""
"Cacher le bouton d’ajout au panier jusqu’à ce qu’une option soit choisie"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Cocher ceci pour afficher le bouton d’ajout au panier seulement quand au "
"moins une option est complétée."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Masquer le bouton d’ajout au panier jusqu’à ce que tous les éléments requis "
"soient choisis"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Cochez cette case pour afficher le bouton d’ajout au panier uniquement "
"lorsque toutes les options visibles requises sont remplies."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Masquer le bouton d’ajout au panier jusqu’à ce que tous les éléments soient "
"choisis"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Cochez cette case pour afficher le bouton d’ajout au panier uniquement "
"lorsque toutes les options visibles sont remplies."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
msgid "Show full width label for elements."
msgstr "Afficher l’étiquette pleine largeur des éléments."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Cochez cette case pour forcer les éléments à être en pleine largeur au lieu "
"d’être automatiques."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
msgid "Show choice description inline."
msgstr "Afficher la description du choix en ligne."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Cochez cette case pour désactiver l’affichage de la description comme une "
"infobulle et montrez-le en ligne à la place."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Masquer l’étiquette de choix lors de l’utilisation du paramètre Afficher "
"l’info-bulle pour les cases d’option et les cases à cocher"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Cochez cette case pour masquer l’étiquette de choix lorsque vous utilisez le "
"paramètre Afficher l’info-bulle pour les cases d’option et les cases à "
"cocher."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "Cacher automatiquement le prix si le total est égal à zéro"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Cocher ceci pour cacher globalement le prix affiché si le total est égal à "
"zéro."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
msgid "Trim zeros in prices"
msgstr "Réduire les zéros dans les prix"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Cochez cette case pour réduire globalement les prix à zéro. Cela "
"s’appliquera également aux prix natifs de WooCommerce."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Masquer le prix de l’élément html lorsque le paramètre de masquage du prix "
"est activé"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Vérifiez cette case si vous utilisez Google Merchant Center. Il masquera le "
"code html de prix de l’élément lorsque vous activez son paramètre de "
"masquage de prix."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr "Utiliser si possible les valeurs traduites dans admin Order"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"Veuillez noter que si les options de l'ordre changent ou sont supprimées, "
"vous obtiendrez de mauvais résultats en activant cette option !"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
msgid "Include option pricing in product price"
msgstr "Inclure le prix de l'option dans le prix du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
msgid "Check this to include the pricing of the options to the product price."
msgstr ""
"Cochez cette case pour inclure la tarification des options au prix du "
"produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
msgid "Check for empty product price"
msgstr "Vérifier le prix du produit vide"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Vérifiez ceci pour que le plugin soit réglé sur zéro le prix du produit "
"lorsqu’il est vide."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr "Utilisez la chaine de caractère \"From\" sur les prix affichés"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Cochez cette case pour modifier l&#39;affichage de prix d&#39;un produit "
"quand il a des options supplémentaires avec des prix."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
msgid "Alter generated product structured data"
msgstr "Modifier les données structurées des produits générés"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Modifie les données structurées du produit généré. Cela peut produire des "
"résultats erronés si les options utilisent la logique conditionnelle!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
msgid "Responsive options structure"
msgstr "Structure des options réactives"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
msgid "Enable this if you want the options to have responsive display."
msgstr ""
"Activez cette option si vous souhaitez que les options aient un affichage "
"réactif."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr "Cliquez sur On pour afficher le panier de façon persistante"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr "Activer cette option si le produit a beaucoup d’options."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr "Bouton pour vider le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr "Activer ou désactiver le bouton pour vider le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
msgid "Cart Field Display"
msgstr "Affichage du champ panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
msgid "Select how to display your fields in the cart"
msgstr "Sélectionner comment afficher vos champs dans le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr "Affichage normal"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "Afficher un lien pop-up"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr "Affichage avancé"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr "Cacher les options supplémentaires dans le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr "Activer ou désactiver l’affichage des options dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
#| msgid "Hide upload file URL in cart and checkout"
msgid "Hide extra addon prices in cart and checkout"
msgstr ""
"Afficher l'image téléchargée dans le panier et lors du passage en caisse"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
#| msgid "Enables or disables the display of options in the cart."
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Activer ou désactiver l’affichage des options dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr "Empêcher les produits à prix négatifs"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr "Évitez d'ajouter au panier des produits à prix négatif."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
msgid "Prevent zero priced products"
msgstr "Empêcher les prix à zéro pour les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
msgid "Prevent adding to the cart zero priced products."
msgstr "Empêcher l’ajout au panier lorsque les produits sont à zéro."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr "Masquer le prix moyen de la case à cocher de cet élément"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Cela permet de masquer l’affichage de prix moyen du panier dans les cases à "
"cocher."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr "Afficher l’image de remplacement dans le panier et le tunnel d’achat"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Autoriser ceci affichera les images des éléments qui ont une image de "
"remplacement."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
msgid "Hide upload file URL in cart and checkout"
msgstr ""
"Afficher l'image téléchargée dans le panier et lors du passage en caisse"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Activer cela montrera les images téléchargées dans le panier et lors du "
"passage en caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
msgid "Show uploaded image in cart and checkout"
msgstr ""
"Afficher l'image téléchargée dans le panier et lors du passage en caisse"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""
"Activer cela montrera les images téléchargées dans le panier et lors du "
"passage en caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Largeur maximale de l'image"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
msgid "Set the maximum width of the images that appear on cart."
msgstr ""
"Définissez la largeur maximale des images qui apparaissent sur le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "Hauteur maximale de l'image"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
msgid "Set the maximum height of the images that appear on cart."
msgstr ""
"Définissez la hauteur maximale des images qui apparaissent sur le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
msgid "Always use unique values on cart for elements"
msgstr "Utilisez toujours des valeurs uniques sur le chariot pour les éléments"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"L’activation de cela séparera les valeurs séparées de virgule pour les "
"éléments. Ceci est principalement utilisé pour plusieurs choix de case à "
"cocher."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
msgid "Post types to show the saved options"
msgstr "Types de publication pour afficher les options enregistrées"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Sélectionnez les types de publication où le plugin modifiera l’écran d’ordre "
"d’édition pour afficher les options enregistrées. Vous pouvez saisir votre "
"type de publication personnalisé."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
msgid "Strip html from emails"
msgstr "Filtrer le html des emails"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
msgid "Check to strip the html tags from emails"
msgstr "Cocher pour filtrer les tags html des emails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
msgid "Legacy meta data"
msgstr "Métadonnées héritées"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
msgid "Check to enable legacy meta data functionality."
msgstr ""
"Cochez cette case pour activer la fonctionnalité de métadonnées héritées."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
msgid "Unique meta values"
msgstr "Valeur maximum de la quantité"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
msgid "Check to split items with multiple values to unique lines."
msgstr ""
"Cochez cette case pour fractionner des éléments avec plusieurs valeurs en "
"lignes uniques."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr "Empêcher les options d&#39;être envoyé aux e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr "Cochez cette case pour désactiver les options d'envoi aux courriels."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
msgid "Disable sending the options upon saving the order"
msgstr "Désactiver l'envoi des options lors de l'enregistrement de la commande"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Activez cette option si vous effectuez une erreur 500 lorsque vous tentez de "
"terminer l'ordre dans la commande."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
msgid "Attach upload files to emails"
msgstr "Joindre des fichiers de téléchargement aux emails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
msgid "Check to Attach upload files to emails."
msgstr "Vérifier d'avoir joint les fichiers de téléchargement aux emails."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
msgid "Disable Options on Order status change"
msgstr "Désactiver les options lors du changement d'état de la commande"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
msgid "Check this only if you are getting server errors on checkout."
msgstr ""
"Cochez cette case seulement si vous obtenez des erreurs de serveur sur lors "
"du passage en caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr "Cacher le chemin du fichier chargé"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Activer cela montrera les images téléchargées dans le panier et lors du "
"passage en caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
#| msgid "Show uploaded image in cart and checkout"
msgid "Show uploaded image in order"
msgstr ""
"Afficher l'image téléchargée dans le panier et lors du passage en caisse"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
#| msgid "Enabling this will show the uploaded images in cart and checkout."
msgid "Enabling this will show the uploaded images in order."
msgstr ""
"Activer cela montrera les images téléchargées dans le panier et lors du "
"passage en caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
msgid "Field Label/value separator"
msgstr "Séparateur d’étiquette/valeur de champ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Saisissez le caractère qui sera utilisé pour séparer les étiquettes de champ "
"des valeurs de champ dans le panier et la commande."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
msgid "Multiple field values separator"
msgstr "Séparateur de valeurs de champs multiples"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Saisissez la chaîne qui sera utilisée pour séparer plusieurs valeurs d’un "
"champ qui autorise plusieurs sélections dans le panier et l’ordre."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
msgid "Update cart text"
msgstr "Mettre à jour le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
msgid "Enter the Update cart text when you edit a product."
msgstr ""
"Saisissez la mise à jour du panier lorsque vous édité ou modifié un produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr "Modifier les options du texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""
"Entrer un texte pour remplacer les options d’édition du texte dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr "Remplacement du texte des options additionnelles"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Entrer un texte pour remplacer le texte des options additionnelles quand on "
"utilise les paramètres pop-up dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr "Remplacement du texte du bouton de fermeture"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton de fermeture quand on "
"utilise le paramètre de pop up dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Texte du bouton vider le panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton pour vider le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "Texte du total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr "Entrez le final total ou laisser vide par défaut."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
msgid "Unit price text"
msgstr "Texte du Prix unitaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
msgid "Enter the Unit price text or leave blank for default."
msgstr ""
"Entrez le texte de prix unitaire ou laissez vide pour la valeur par défaut."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr "Options du texte du total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
msgid "Enter the Options total text or leave blank for default."
msgstr "Entrez les options total ou laisser vide par défaut."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
msgid "Options VAT total text"
msgstr "Options Texte total TVA"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
msgid "Enter the Options VAT total text or leave blank for default."
msgstr ""
"Saisissez le texte Total de la TVA dans les options ou laissez le champ vide "
"par défaut."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr "Texte du total frais supplémentaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
msgid "Enter the Fees total text or leave blank for default."
msgstr ""
"Entrez le texte pour le total des frais ou laissez vide pour la valeur par "
"défaut."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr "Remplacement du texte du Prix Gratuit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Entrer un texte pour remplacer le label du prix gratuit lorsque le produit a "
"des options supplémentaires."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr "Texte de sélection forcée des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton d’ajout au panier "
"lorsqu’on utilise la sélection forcée d’option."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr "Empêcher les prix à zéro pour les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton de fermeture quand on "
"utilise le paramètre de pop up dans le panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr "Empêcher les produits à prix négatifs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr "Vous ne pouvez ajouter des produits aux prix négatifs au panier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
msgid "Popup section button text replacement"
msgstr "Remplacement du texte du bouton de la section contextuelle"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Entrez un texte pour remplacer le texte du bouton de section de recharge. Si "
"vous définissez cette valeur sur %s, le texte du bouton aura le titre de la "
"section."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Ouvert"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr "Réinitialiser le texte de remplacement des Options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Entrer un texte pour remplacer l’option de réinitialisation du texte quand "
"on utilise des variations personnalisées."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "Réinitialiser les options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr "Remplacement du texte du bouton de fermeture du calendrier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton de fermeture dans le "
"calendrier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr "Texte du bouton Aujourd’hui du calendrier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""
"Entrer un texte pour remplacer le bouton de texte d’Aujourd’hui dans le "
"calendrier."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr "Texte du slider précédent"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton précédent dans le slider."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr "Texte du slider suivant"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr ""
"Entrer un texte pour remplacer le texte du bouton suivant dans le slider."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr "Ce champ est requis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
msgid "Enter a text to indicate that a field is required."
msgstr "Saisissez une chaîne pour indiquer l’état d’un champ obligatoire."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "Caractères restant dans le texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Saisir un texte pour remplacer les caractères restants de texte lorsque vous "
"utilisez le nombre maximum de caractères sur un champ de texte ou une zone "
"de texte."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr "Téléchargement de fichiers texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Entrez un texte pour remplacer le texte Téléchargement de fichiers utilisé "
"dans la fenêtre contextuelle après avoir cliqué sur le bouton Ajouter au "
"panier lorsqu'il y a des champs de téléchargement."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr "Télécharger le texte du message"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Écrivez votre message à utiliser dans le champ de la fenêtre après avoir "
"cliqué sur le bouton Ajouter au panier quand il y a des fichiers à "
"télécharger."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr "Sélectionnez le texte du fichier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Entrez un texte pour remplacer le texte sélectionner le fichier utilisé dans "
"le bouton de téléchargement de style."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Sélectionner"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
msgid "Single file text"
msgstr "Texte d’un seul fichier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Entrez un texte pour remplacer le texte du fichier utilisé dans le bouton de "
"téléchargement stylisé."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
msgid "Multiple files text"
msgstr "Texte de plusieurs fichiers"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Entrez un texte pour remplacer le texte des fichiers utilisé dans le bouton "
"de téléchargement stylisé."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
msgid "Add button text on associated products"
msgstr "Ajouter du texte de bouton sur les produits associés"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Entrez un texte pour remplacer le texte du bouton Ajouter sur les produits "
"associés."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Ajouter"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
msgid "Remove button text on associated products"
msgstr "Supprimer le texte du bouton sur les produits associés"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Entrez un texte pour remplacer le texte du bouton Supprimer sur les produits "
"associés."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Supprimer"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
msgid "Repeater add text"
msgstr "Répéteur ajouter du texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Entrez un texte pour remplacer le bouton Ajouter du texte pour les champs du "
"répéteur."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr "Activer les styles des cases à cocher et des boutons radio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""
"Activer ou désactiver les styles supplémentaires pour les cases à cocher et "
"les boutons radio."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
msgid "Select a style for the checkboxes and radio buttons"
msgstr "Sélectionnez un style pour les case à cocher et les boutons radio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Rond"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "Manche 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Carré"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "Carré 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
#| msgid "Select item border type"
msgid "Swatch border type"
msgstr "Sélectionner le type de bordure d’un élément"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Sélectionner un style pour la bordure sélectionnée lorsqu’on utilise une "
"image de remplacement ou les échantillons."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Ombre"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr "Ligne fine"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
#| msgid "Choose whether to hide the price or not."
msgid "Choose the border width for image or color swatches."
msgstr "Choisir de masquer le prix ou non."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Sélectionner un style pour la bordure sélectionnée lorsqu’on utilise une "
"image de remplacement ou les échantillons."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Sélectionner un style pour la bordure sélectionnée lorsqu’on utilise une "
"image de remplacement ou les échantillons."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Visuel"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Page du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Lieu"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Tarification"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr "Autoriser la validation"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr ""
"Cocher pour autoriser la validation de fonctionnalités pour le constructeur "
"d’éléments"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
msgid "Disable error scrolling"
msgstr "Désactiver le défilement d’erreur"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr "Cocher pour désactiver le défilement si l’élément à une erreur"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
msgid "Error label placement"
msgstr "Placement de l’étiquette d’erreur"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
msgid "Set the placement for the validation error notification label"
msgstr ""
"Définir le placement pour l’étiquette de notification d’erreur de validation"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
msgid "After the element"
msgstr "Après l’élément"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
msgid "Before the element"
msgstr "Avant l’élément"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
msgid "Use options cache"
msgstr "Utiliser les options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Utilisez la mise en cache des options pour augmenter la perfromance. "
"Désactivez si vous avez des options qui partagent le même ID unique."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
msgid "Javascript and CSS inclusion mode"
msgstr "Mode d’inclusion de JavaScript et CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
msgid "Select how to include JS and CSS files"
msgstr "Sélectionnez comment inclure les fichiers JS et CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
msgid "Single minified file"
msgstr "Seulement un fichier compressée"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
msgid "Multiple minified files"
msgstr "Plusieurs fichiers compressées"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
msgid "DEV - multiple files"
msgstr "DEV - plusieurs fichiers"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
msgid "Disable PNG convert security"
msgstr "Désactiver la sécurité de conversion PNG"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
msgid "Check to disable the conversion to png for image uploads."
msgstr ""
"Cochez pour désactiver la conversion en png pour les téléchargements "
"d'images."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Cela remplacera le prix du produit avec le prix des options si le prix total "
"si les options sont supérieur à zéro."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr "Utilisez le réglage sur chaque produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
msgid "Options price mode"
msgstr "Mode de prix des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
msgid "Select the price mode for the options."
msgstr "Sélectionnez le mode de prix pour les options."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
msgid "Use sale price"
msgstr "Utiliser le prix promo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
msgid "Use regular price"
msgstr "Utiliser le prix régulier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
msgid "Maximum number of combinations for price calcualtions"
msgstr "Nombre maximum de combinaisons pour les calculs de prix"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Ce paramètre contrôle le nombre maximum de combinaisons que le plugin "
"utilisera pour calculer les prix minimum et maximum. Un plus grand nombre de "
"combinaisons se traduira par des prix plus précis, mais il faudra également "
"plus de temps pour les calculer. Pour les produits qui peuvent avoir de "
"nombreuses combinaisons de choix, il est recommandé de définir un nombre "
"inférieur de combinaisons pour améliorer les performances."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
msgid "Default value is 10"
msgstr "La valeur par défaut est 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr ""
"Réinitialiser les valeurs des options une fois le produit ajouté au panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Cela ramènera les valeurs d’option aux valeurs par défaut après l’ajout du "
"produit au panier"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr ""
"Utilisez les signes plus et moins sur les prix dans le panier et lors du "
"passage en caisse"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Choisissez comment vous voulez que le signe des prix d’options soit affiché "
"dans le panier et la caisse."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
msgid "Display both signs"
msgstr "Afficher les deux signes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
msgid "Display only minus sign"
msgstr "Afficher seulement le signe moins"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
msgid "Use plus and minus signs on option prices"
msgstr "Utiliser des signes plus et moins sur les prix des options"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Choisissez la façon dont vous souhaitez afficher le signe des prix d’options "
"sur la page du produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr "Séparateur de décimales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
msgid "Choose how to determine the decimal separator for user inputs"
msgstr ""
"Choisir comment déterminer le séparateur de décimales pour les encodages des "
"utilisateurs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "Utiliser les valeurs WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr "Déterminer par le navigateur local"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr "Afficher le séparateur de décimales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
msgid "Choose which decimal separator to display on currency prices"
msgstr "Choisir quel séparateur de décimales à afficher pour les prix"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
msgid "Timezone override for Date element"
msgstr "Remplacement du fuseau horaire pour l’élément Date"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Choisissez le %s que l’élément de date utilisera dans les calculs du backend "
"ou laissez vide pour le fuseau horaire du serveur."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr "fuseau horaire"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr "Indicateur d’état requis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr "Entrer une string pour indiquer l’état requis d’un champ."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr "Position de l’indicateur d’état requis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
msgid "Select the placement of the Required state indicator"
msgstr "Sélectionnez le placement de l’indicateur d’état requis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr "La gauche du label"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr "La droite du label"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr "Inclure le suffixe de taxe string sur les totaux de la boite"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr "Permettre d’ajouter le suffixe fiscal WooCommerce sur la boîte total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr "Inclure le suffixe d’affichage WooCommerce Price sur la boîte totaux"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Activez cette option pour ajouter le suffixe d’affichage WooCommerce Price "
"dans la zone des totaux."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
msgid "jQuery selector for main product image"
msgstr "sélecteur de jQuery pour l’image du produit principal"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
msgid "This is used to change the product image."
msgstr "Il est utilisé pour modifier l'image du produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
msgid "Product image replacement mode"
msgstr "Mode de remplacement de l'image du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"Le mode Self remplace l'image réelle et Inline ajoute de nouveaux éléments "
"d'image."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
msgid "Self mode"
msgstr "Mode auto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
msgid "Inline mode"
msgstr "Mode Inline"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
msgid "Move out of stock message"
msgstr "Message de rupture de stock"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Ceci déplace le message hors stok lorsque des variations stylisées sont "
"utilisées juste en dessous d'elles."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
msgid "Use internal variation price"
msgstr "Utiliser le prix interne de variation"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Activez cette option si vos produits variables disposent de nombreuses "
"options pour améliorer les performances. Notez que cela peut causer des "
"problèmes avec les plugins de réduction ou de devise."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
msgid "Enable plugin backend interface"
msgstr "Activer l’interface backend du plugin"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Sélectionnez les rôles qui auront accès aux paramètres du plug-in et à "
"l’interface du plug-in lorsque vous êtes sur la page de modification du "
"produit. Le rôle d’administrateur a toujours accès."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
msgid "Hide override settings on products"
msgstr "Masquer les paramètres de substitution sur les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Activez ceci pour masquer l’onglet paramètres sur l’écran de modification du "
"produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
msgid "Hide Builder mode on products"
msgstr "Masquer le mode générateur sur les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Permettez-lui de masquer l’onglet constructeur sur l’écran de modification "
"du produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
msgid "Hide Normal mode on products"
msgstr "Masquer le mode Normal sur les produits"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""
"Activez ceci pour cacher l’onglet normal sur l’écran de modification de "
"produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
msgid "Enable WP Rocket CDN"
msgstr "Activer WP Rocket CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Cochez la case pour activer l’utilisation de WP Rocket cdn pour les images "
"du plugin s’il est actif."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
msgid "Enable Jetpack CDN"
msgstr "Activer Jetpack CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Cochez cette case pour activer l’utilisation de Jetpack cdn pour les images "
"du plug-in s’il est actif."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Boîte de sélection"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Sélecteur de date"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr "Largeur maximale tooltip"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
msgid "Set the max width of the tooltip that appears on the elements."
msgstr "Réglez la largeur maximale de l’outil qui apparaît sur les éléments."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr "Mode image"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Définissez le mode d’image qui sera utilisé pour diverses fonctionnalités "
"liées à l’image."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr "URL absolue"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
msgid "Relative URL"
msgstr "URL relative"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
msgid "Recalculate image on changes"
msgstr "URL relative"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Ceci est nécessaire sur plusieurs solutions de galerie qui modifient l’image "
"html dynamiquement ou si vous souhaitez contrôler l’image dynamiquement."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
msgid "Retrieve image sizes for image replacements"
msgstr "Récupérer des tailles d’image pour les remplacements d’images"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
msgid "Disable this for slow servers or large amounts of images."
msgstr ""
"Désactivez cette option pour les serveurs lents ou les grandes quantités "
"d’images."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
msgid "Show quantity 1"
msgstr "Afficher la quantité 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Activez cette option pour afficher la chaîne de quantité même lorsque la "
"quantité est égale à 1 et lorsque le sélecteur de quantité est activé."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
msgid "Show prices inside select box choices"
msgstr "Afficher les prix dans les choix de boîte de sélection"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Cochez cette case pour afficher le prix des options de la boîte de sélection "
"si le type de prix est fixe."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr ""
"Afficher les prix à l'intérieur des choix de boîte de sélection même si les "
"prix sont cachés"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Cochez cette case pour afficher le prix des options de la boîte de sélection "
"si le type de prix est fixe et même si l'élément masque le prix."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""
"Multipliez les prix à l'intérieur des choix de boîte de sélection avec son "
"sélecteur de quantité"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Cochez cette case pour modifier l&#39;affichage de prix d&#39;un produit "
"quand il a des options supplémentaires avec des prix."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr "Bouton radio d’annulation"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
msgid "Globally override the undo button for radio buttons"
msgstr "Remplacer globalement le bouton annuler les boutons radio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr "Utiliser la valeur du champ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "Thème du Datepicker (sélectionneur de dates)"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "Taille du Datepicker (sélectionneur de dates)"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "Position du Datepicker (sélectionneur de dates)"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
msgid "Minimum characters for text-field and text-areas"
msgstr "Minimum de caractères de champ de texte et zones de texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
msgid "Maximum characters for text-field and text-areas"
msgstr "Nombre maximum de caractères de champ de texte et zones de texte"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
msgid "Upload element inline Image preview"
msgstr "Aperçu de l’image d’élément de téléchargement en ligne"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
msgid "Enable inline preview of the image that will be uploaded."
msgstr "Activez l’aperçu en ligne de l’image qui sera téléchargée."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
msgid "Scroll to the product element upon selection"
msgstr "Faire défiler jusqu’à l’élément produit lors de la sélection"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
msgid "Enable to scroll the viewport to the product element."
msgstr "Permettre de faire défiler le viewport vers l’élément produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
msgid "Product element scroll offset"
msgstr "Décalage de défilement d’élément de produit"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Entrez une valeur pour le décalage de défilement lors de la sélection d’un "
"choix pour l’élément de produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
msgid "Sync associated product quantity with main product quantity"
msgstr ""
"Synchroniser la quantité de produits associés avec la quantité de produit "
"principal"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Permettre d’avoir les quantités des produits associés pour être un multiple "
"de la quantité principale du produit."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Nom d’utilisateur (identifiant)"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr "Votre nom d’utilisateur Envato."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
msgid "Envato Personal Token"
msgstr "Envato Jeton personnel"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "Vous pouvez générer un jeton personnel Envato par %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "cliquer sur ce lien"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Code d’achat"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "Pour savoir comment accéder à votre code d’achat, vous pouvez %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr "cliquez sur ce lien"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Désactiver la Licence"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Activer la Licence"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "Licence activée."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Consentement"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Je conviens que les données de licence seront transmises au serveur de "
"licences."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
msgid "Use allowed file types from WordPress"
msgstr "Utiliser les types de fichiers autorisés à partir de WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
msgid "Enable File manager"
msgstr "Gestionnaire de fichiers"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Dossier chargé"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "Changer ceci n’affectera que vos futurs chargements."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
msgid "Enable pop-up message on uploads"
msgstr "Activer des messages pop-up sur les téléchargements"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
msgid "Enables a pop-up when uploads are made."
msgstr "Permet un pop-up lorsque les téléchargements sont effectués."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
msgid "Enable upload success message"
msgstr "Activer le message de réussite du téléchargement"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
msgid "Indicates if the upload was successful with a message."
msgstr "Indique si le téléchargement a réussi avec un message."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Types de fichiers autorisés"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
msgid "Select which file types the user will be allowed to upload."
msgstr ""
"Sélectionnez les types de fichiers l’utilisateur seront saisis à télécharger."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
msgid "Select file types"
msgstr "Sélectionnez les types de fichiers"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
msgid "Custom types"
msgstr "Types personnalisés"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Sélectionnez les types de fichiers personnalisés que l'utilisateur sera "
"invité à télécharger, séparés par des virgules."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr "Gestionnaire de fichiers"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr "Code CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
msgid "Only enter pure CSS code without and style tags"
msgstr "N’entrez que le code CSS pur sans étiquettes de style"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr "Code JavaScript"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
msgid "Only enter pure JavaScript code without and script tags"
msgstr "N’entrez que le code JavaScript pur sans étiquettes de script"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
msgid "Add Constant"
msgstr "Ajouter une constante"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr "Erreur de connexion au serveur !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr "Erreur d’obtention des données depuis le serveur !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
msgid "License activated!"
msgstr "Licence activée !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr "Licence désactivée !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Action non valide."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
msgid "Please fill all fields before trying to activate."
msgstr ""
"Merci de bien vouloir compléter tous les champs avant d’essayer d’activer."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr ""
"Essayer d’activer en dehors de l’interface du plugin n’est pas autorisé !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr "Erreur de connexion à l’API Envato. Merci de réessayer ultérieurement."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr ""
"Tentative d’activation avec un code d’achat non valide pour votre token!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
msgid "Envato rate limit exceeded! Please try again later."
msgstr "Erreur de connexion à l’API Envato. Merci de réessayer ultérieurement."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Cet identifiant utilisateur n’est pas valide pour le code d’achat de cet "
"élément. Merci de vous assurer que vous avez encodé le bon identifiant "
"utilisateur (sensible à la casse)."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "Tentative d’activation depuis un domaine non valide !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
msgid "Trying to activate from an invalid IP address!"
msgstr "Tentative de connexion depuis une adresse IP non valide !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "Le code d’achat est déjà activé !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr "Le code d’achat est déjà actif sur un autre domaine !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr "Vous avez déjà activé ce code d’achat sur un autre domaine !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr ""
"Le code d’achat est déjà activé ! Merci de bien vouloir acheter une licence "
"valide !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr "Vous avez déjà activé votre code d’achat !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr ""
"Désactivé, mais le code d'achat n'a pas été activé pour une raison "
"quelconque!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"Impossible de désactiver. Le code d’achat n’est pas valide pour votre clé de "
"sauvegarde de licence !"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr "La requête n’a pu être complétée !"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr "Téléchargement du paquet du marché Envato..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "Erreur ! Impossible de se connecter au système de fichiers"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "To receive automatic updates license activation is required."
msgstr ""
"Pour recevoir des mises à jour automatiques, une activation est requise."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "Please activate Extra Product Options."
msgstr "Veuillez activer les options de produit supplémentaires."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr "Erreur ! Erreur de l’API d’Envato"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr "Erreur lors de la décompression du package"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "Download new version from CodeCanyon"
msgstr "Télécharger une nouvelle version depuis CodeCanyon"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr "ou enregistrez le plugin pour recevoir des mises à jour automatiques."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Ajout de la traduction à %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "Modifier la %s traduction"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Langage"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, php-format
msgid "Language of this %s"
msgstr "Langage de ceci %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
msgid "This is a translation of"
msgstr "Ceci est une traduction de"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
msgid "Enable discounts on extra options"
msgstr "Permettre les réductions sur les options supplémentaires"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr "Type de prix d’origine de base selon"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
msgid "Set to what price types will base their original price on."
msgstr ""
"Définissez à ce que ces types de prix baseront leur prix d’origine dessus."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Aucun changement"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr "Prix du produit non comptabilisé"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr "Permettre la modification du tableau des prix"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Cochez pour permettre l’inscription des prix d’options à la table de "
"tarification."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr "Préfix label"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr "Afficher un préfix label sur la page produit."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "Suffix label"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr "Afficher un suffix label sur la page produit."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr "Sélecteur de CSS d’étiquette"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Entrez un sélecteur CSS pour remplacer l’étiquette par défaut où la chaîne "
"de rabais sera affichée."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr "Placement de chaîne de réduction"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr ""
"Sélectionnez le placement de la chaîne à prix réduit par rapport à "
"l’étiquette."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Après"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Avant"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
msgid "Enable showing option prices in the Order"
msgstr "Désactiver l'envoi des options lors de l'enregistrement de la commande"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Activez-le à vos risques et périls car il n’est pas possible de calculer les "
"remises d’options sur la page commande."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "Multiplier le coût par le nombre de personnes"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr ""
"En activant cette option, vous multipliez le prix des options par le nombre "
"de personnes."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
msgid "Using booking setting"
msgstr "Utilisation du paramètre de réservation"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "Multiplier le coût par le nombre de blocs"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"En activant cette option, vous multipliez le prix des options par le nombre "
"de blocs."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
msgid "Add option cost to booking display price"
msgstr "Ajouter le coût de l’option au prix d’affichage de la réservation"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"L’activation de cette option ajoutera les prix des options au coût de "
"réservation calculé."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr "Prix et réductions dynamiques"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Autoriser cela appliquera les réductions sur les produits aux options "
"supplémentaires également."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "WooCommerce réservations facile"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
msgid "WooCommerce Measurement Calculator"
msgstr "Calculateur de mesure WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr "Multiplier le coût par le nombre de personnes"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""
"Autoriser cela appliquera les réductions sur les produits aux options "
"supplémentaires également."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
msgid "Divide price with measurement"
msgstr "Diviser le prix par la mesure"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr "Cela divisera le prix d’origine avec la mesure nécessaire."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "WooCommerce Subscriptions"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
msgid "Include addons on order again"
msgstr "Inclure à nouveau des addons sur commande"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"L’activation de cette option ajoutera les addons enregistrés à l’abonnement "
"lors de l’utilisation manuelle de la fonctionnalité de commande à nouveau."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr "Frais d’inscription"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
msgid "sign-up fee"
msgstr "frais d'inscription"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr "et un"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "%1$s tous les %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
msgid "Subscription sign up fee text"
msgstr "Texte d’inscription aux frais"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Sélectionnez le texte de frais d’abonnement ou laissez vide pour la valeur "
"par défaut."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
msgid "Sign up fee text"
msgstr "Inscrivez-vous au texte des frais"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
msgid "Enter the Sign up fee text or leave blank for default."
msgstr "Entrez le texte des frais d’inscription ou laissez vide par défaut."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr "Frais d’inscription"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr "Option des frais d'abonnement"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "La quantité pour « %1$s » doit être supérieure à %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""
"La quantité pour \"%s\" doit être supérieure à 0 pour être ajoutée au panier."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "Vous ne pouvez sélectionner que jusqu’à %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "Vous ne pouvez sélectionner que jusqu’à %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "Vous devez sélectionner exactement %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "Vous devez sélectionner exactement %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "Vous devez sélectionner au moins %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "Vous devez sélectionner au moins %1$s choix pour %2$s."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr "Date encodée non valide !"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "Date invalide soumise !"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr "Année encodée invalide !"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr "Vous ne pouvez sélectionner cette date !"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(max file size %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr "%s est pas un fichier image valide!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Chargement réussi"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "Vous devez saisir au moins %1$s caractères pour « %2$s »."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "Vous ne pouvez pas entrer plus de %1$s caractères pour « %2$s »."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Tout le monde"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "Utilisateurs connectés"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr "Echo une action personnalisée"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr "EPO action personnalisée"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Titre :"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr "Action personnalisée :"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s n’existe pas."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "En attente de l’image du produit"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "Effacer"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Qté"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Choisir une option"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#~ msgid "Hide extra options prices in cart"
#~ msgstr "Cacher le prix des options supplémentaires dans le panier"

#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr ""
#~ "Activer ou désactiver l’affichages des prix des options dans le panier."

#~ msgid "Show bottom"
#~ msgstr "Bouton d’affichage"

#~ msgid "Show inside"
#~ msgstr "Afficher l’intérieur"

#~ msgid "Disable categories"
#~ msgstr "Désactiver les catégories"

#~ msgid "Submit for Review"
#~ msgstr "Soumettre pour vérification"

#~ msgid "Show Both Final and Options total box"
#~ msgstr "Montrer à la fois la \"boite total final\" et ses options"

#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "N’afficher que la boite finale et cacher les Options si égal à zéro"

#~ msgid "Hide Final total box"
#~ msgstr "Cacher le total final de la boite"

#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Toujours afficher uniquement le total final (prix x quantité)"

#~ msgid "Disable but change product prices"
#~ msgstr "Désactiver, mais changer les prix des produits"

#~ msgid "Select when to show the final total box"
#~ msgstr "Sélectionner quand montrer la boite total final"

#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr ""
#~ "Montrer le total final et cacher les options du total s’il est égal à zéro"
languages/woocommerce-tm-extra-product-options.pot000064400000665653150755142440016517 0ustar00#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:52+0200\n"
"PO-Revision-Date: 2015-06-16 06:19+0200\n"
"Last-Translator: themecomplete <themecomplete@gmail.com>\n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;"
"_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;"
"esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583 admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275 admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:697 admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989 admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid "Before adding Extra Product Options, add and save some attributes on the Attributes tab."
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900 admin/views/html-tm-epo-admin.php:116
#: admin/views/html-tm-epo-admin.php:126 admin/views/html-tm-epo-admin.php:184
#: admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904 admin/views/html-tm-epo-admin.php:117
#: admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1240 admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1274 admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1285
msgid "Constant value"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1286
msgid ""
"Please check the consent checkbox to give your permission to send your data to the server and try again."
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1287
msgid "Connecting to activation server ..."
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1600
#, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr ""

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:453 admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544 admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757 admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:536
msgid "Enter the sale price for this field or leave it blankto use the default price."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:566
msgid "Text after Price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid "Enter a text to display after the price for this field or leave it blank for no text."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:593
msgid "Text before Price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:594
msgid "Enter a text to display before the price for this field or leave it blank for no text."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
msgid "Price per character"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
msgid "Percent of the original price per character"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
msgid "Price per character (no first char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
msgid "Price per character (no n-th char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
msgid "Price per character (no n-th char and no spaces)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
msgid "Percent of the original price per character (no first char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
msgid "Percent of the original price per character (no n-th char)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
msgid "Percent of the original price per character (no n-th char and no spaces)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
msgid "Price per character (no spaces)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:675
msgid "Price per row"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
msgid "Fixed amount + options"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
msgid "Lookup table"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:943
msgid "Step * price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:951
msgid "Price per Interval"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
msgid "Calculation type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408 admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
msgid "Element ID for x"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
msgid "Enter the element id to use for the x column."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
msgid "Element ID for y"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
msgid "Enter the element id to use for the y column."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
msgid "Set to Fee"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid "Attach the price to the order making it independent of the product quantity."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
msgid "Free characters"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
msgid "Enter the number of Free characters."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
msgid "Month / Day / Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
msgid "Month . Day . Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
msgid "Month - Day - Year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
msgid "HH:m"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
msgid "HH:mm:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
msgid "hh:m"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
msgid "h:m"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
msgid "hh:m:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
msgid "h:mm:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
msgid "h:m:ss"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
msgid "Start year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
msgid "Image swatches"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
msgid "Color swatches"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
msgid "Text swatches"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
msgid "Replacement mode"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
msgid "Select how to display the element."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
msgid "End of the label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
msgid "Choose how the swatch will be displayed."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
msgid "Use image lightbox"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
msgid "Show image and description"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
msgid "Enabling this will show a tooltip over the choice."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
msgid "Show responsive values"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the grid or leave blank for "
"normal display."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
msgid "Items per row (iPhone 5)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2098 admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid "Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
msgid "Exact selection"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default "
"behaviour."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
msgid ""
"Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for "
"default behaviour."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2241 admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873 admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
msgid "Quantity Default value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
msgid "Reduce Width"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
msgid "Increase Width"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
msgid "Remove the image."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
msgid "Select boxes"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4128 admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
msgid "Radio buttons and image at end of the label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
msgid "Select the display type of this attribute."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
msgid "Leave blank to use the original attribute label."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4183 admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
msgid "Attribute element class name"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4405 admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4409 admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
msgid "Show attribute name"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
msgid "Image replacement"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
msgid "Product Image replacement"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
msgid "No saved variations found."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid "Choose the image to use in place of the radio button when it is checked."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
msgid "Choose the image for the lightbox."
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
msgid "Choice label"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
msgid "Mass add"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:41
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. "
"Please ask your hosting provider to enable this function."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:289
msgid "Invalid CSV file."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:300 includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:301 includes/classes/class-themecomplete-epo-cart.php:2885
msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:302 includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:303 includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:305 includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:306 includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:307 includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:319 includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:393 admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:397 admin/class-themecomplete-epo-admin-csv.php:440
msgid "The CSV file is invalid!"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:552
msgid "Invalid CSV file!"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:624
msgid "File imported with new tables."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:633
msgid "There was an error importing the CSV file."
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:662
msgid "There was an error saving the csv data. Please check the encoding of your csv file!"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:678
msgid "Table names are different. Do you want to override the tables?"
msgstr ""

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:261
msgid "Something went wrong with the request!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:517 admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:914
msgid "Clone template"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1247
msgid "Custom"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1439
msgid "Form settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1621
msgid "Meta data not correctly saved. Please save the product!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1867
msgid "Apply mode"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1871
msgid "All products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1875
msgid "Customize"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2222
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid "You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid "You can&#8217;t edit this item because it is in the Trash. Please restore it and try again."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2720
msgid ""
"Cannot apply rules on this element or section since there are not any value configured elements on other "
"sections, or no other sections found."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2721
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2731
msgid "Edit tab"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2740
msgid "Product variables"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2741
msgid "Special variables"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2743
msgid "Options Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2744
msgid "Original product price + Options Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
msgid "Original product price + Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2749
msgid "Dynamic product price"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2758
msgid "The price of the targeted element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2759 admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2760
msgid "The value of the targeted element converted to a float"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2762
msgid "The raw value of the targeted element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2763
msgid "Text length"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2764
msgid "The text length of the targeted element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2766
msgid "The total quantity of the targeted element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2768
msgid "The number of options the user has selected on the targeted element"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] ""
msgstr[1] ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
msgid "Invalid CSV table!"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
msgid "Overwrite existing tables"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
msgid "Look up table"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
msgid "No CSV table found!"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
msgid "Import one by clicking the button below."
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr ""

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
msgid "Table index"
msgstr ""

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr ""

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-settings.php:294 admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr ""

#: admin/class-themecomplete-epo-admin-settings.php:295 admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr ""

#: admin/views/html-tm-epo-admin-attributes.php:18 admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr ""

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr ""

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr ""

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr ""

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr ""

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr ""

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr ""

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
msgid "Percent of the origιnal price"
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:27 admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29 admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr ""

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr ""

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr ""

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr ""

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr ""

#: admin/views/html-tm-epo-order-item-header.php:37 includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45 templates/products/template-quantity.php:112
msgid "Qty"
msgstr ""

#: admin/views/html-tm-epo-order-item-header.php:40 includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr ""

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr ""

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr ""

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr ""

#: admin/views/html-tm-epo.php:29
msgid "Before adding Extra Options in this mode, add and save some attributes on the Attributes tab."
msgstr ""

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr ""

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr ""

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr ""

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr ""

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr ""

#: admin/views/html-tm-global-epo.php:75
msgid "To translate the strings for the local options please use WPML interface."
msgstr ""

#: admin/views/html-tm-global-epo.php:110 admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr ""

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr ""

#: admin/views/html-tm-global-epo.php:118
msgid "Price display override"
msgstr ""

#: admin/views/html-tm-global-epo.php:119
msgid "This will replace the displayed product price on shop/archive/product loop pages."
msgstr ""

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr ""

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr ""

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr ""

#: admin/views/html-tm-global-epo.php:177
msgid "The forms you choose will be displayed alongside with the forms that the product already has."
msgstr ""

#: admin/views/html-tm-global-epo.php:206
msgid "Exclude from"
msgstr ""

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those defined in the previous setting."
msgstr ""

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr ""

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the total options price is "
"greater then zero."
msgstr ""

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr ""

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr ""

#: admin/views/html-tm-global-epo.php:252 admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320 admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr ""

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr ""

#: admin/views/html-tm-global-epo.php:260
msgid "Show only with an action hook"
msgstr ""

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr ""

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr ""

#: admin/views/html-tm-global-epo.php:294 includes/classes/class-themecomplete-epo-settings-base.php:321
msgid "Disable if Options total is zero"
msgstr ""

#: admin/views/html-tm-global-epo.php:298 includes/classes/class-themecomplete-epo-settings-base.php:322
msgid "Disable if total is zero"
msgstr ""

#: admin/views/html-tm-global-epo.php:311
msgid "Override Show Options Total"
msgstr ""

#: admin/views/html-tm-global-epo.php:312
msgid "This will override the Show Options Total setting only for this product."
msgstr ""

#: admin/views/html-tm-global-epo.php:332 includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr ""

#: admin/views/html-tm-global-epo.php:345
msgid "Override Show Final Total"
msgstr ""

#: admin/views/html-tm-global-epo.php:346
msgid "This will Show Final Total setting only for this product."
msgstr ""

#: admin/views/html-tm-global-epo.php:379 admin/views/html-tm-global-epo.php:401
msgid "Override enabled roles for this product"
msgstr ""

#: admin/views/html-tm-global-epo.php:380 admin/views/html-tm-global-epo.php:402
msgid "This will override which roles can see the options for this product."
msgstr ""

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr ""

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
msgid "Product element is not supported for components!"
msgstr ""

#: includes/class-themecomplete-extra-product-options.php:4984
msgid "Product element is not supported within another product element!"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your selected date format. (Two "
"digits for day, two digits for month and four digits for year)."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits for day, two digits for month "
"and four digits for year)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
msgid "Enabled dates"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits for day, two digits for month "
"and four digits for year). Please note that this will override any other setting!"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
msgid "Exclude disabled"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected "
"disabled weekdays."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
msgid "Set native product price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
msgid "Change product weight"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
msgid "Action mode"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
msgid "Choose the desired action mode for this element."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
msgid "Formula"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
msgid "Enter the formula for the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
msgid "Result Display Label"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
msgid "Text before result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
msgid "Enter a text to display before the calculation result or leave it blank for no text."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
msgid "Text after result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
msgid "Enter a text to display after the calculation result or leave it blank for no text."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
msgid "Left of the Content"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
msgid "Right of the Content"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
msgid "Above Header"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
msgid "Multiple Upload"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
msgid "Search for a category ..."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
msgid "Thumbnails multiple"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid "If this is enabled the included product is not shipped with the main product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid "If this is enabled the included product will add its weight to the main product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. If the product has extra "
"options then the discount applies to the amount after the options have been added to the product price."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
msgid "Disable Addons"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
msgid "If this is enabled the included addons the associated product has will not be displayed."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
msgid "Exlude Addon prices from the discount"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
msgid "If this is enabled the discount will not be applied to the product addons."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
msgid "Order and Emails"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
msgid "Hide product in"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
msgid "Select where to hide the product"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
msgid "Show title link"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
msgid "Enable to have the title link to the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
msgid "Enable to show the meta of the associated product."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
msgid "Section label background color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
msgid "Section subtitle background color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
msgid "Select where this section will appear compared to local Options."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
msgid "Button Alt"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
msgid "Section pop up button style"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
msgid "Select this section's pop up button style."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
msgid "Section pop up button text"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
msgid "Enter a text to replace the default pop up button text. This will override the global value."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
msgid "Section Conditional Logic"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
msgid "Multi-Select Field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
msgid "Select a template ..."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
msgid "Add the template you want to display."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
msgid "Enter the step."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
msgid "Minimum selectable time"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
msgid "Maximum selectable time"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
msgid "Select the position of the timepicker."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
msgid "Enable conditional logic for showing or hiding this element."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
msgid "Label view mode"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above the fields"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the fields"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the fields"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below the fields"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
msgid "Inherit product setting"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
msgid "Yes, but show price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
msgid "Hide element label in floating totals box"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid "Choose whether to hide the element label in the floating totals box or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid "Choose whether to hide the element value in the floating totals box or not."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
msgid "Enable repeater"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
msgid "This will make this element repeatable."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
msgid "Bind repeater with product quantity"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
msgid "This will make this element repeatable based on the product quantity."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
msgid "Repeater minimum limit"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
msgid "Repeater maximum limit"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
msgid "Repeater Button Label"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
msgid "Leave this blank for the default label."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
msgid "Radio Button Connector ID"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
msgid "Enter a custom id to connect different radio button elements."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
msgid "Repeater Settings"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
msgid "Flat Rates (Legacy)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
msgid "Select shipping methods ..."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
msgid "Enable Shipping Methods"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
msgid "Select the shipping methods to enable."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
msgid "Enable Shipping Methods Condition"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
msgid ""
"Specify the conditions for enabling shipping methods based on the value of the current field. If the "
"conditions are met, the selected shipping methods will be available for customers to choose during "
"checkout."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
msgid "Disable Shipping Methods"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
msgid "Select the shipping methods to disable."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
msgid "Disable Shipping Methods Condition"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
msgid ""
"Specify the conditions for disabling shipping methods based on the value of the current field. If the "
"conditions are met, the selected shipping methods will not be available for customers to choose during "
"checkout."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
msgid "this section if the following conditions are met."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
msgid "this field if the following conditions are met."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
msgid "Add new condition group"
msgstr ""

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr ""

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr ""

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr ""

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:965
#, php-format
msgid "The item %s was removed from the cart because it had changed since it was added."
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
msgid "You cannot add zero priced products to the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You can add it back to your cart "
"%2$s."
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr ""

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] ""
msgstr[1] ""

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, php-format
msgid "Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or later."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra Checkout Options %s or later!."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
msgid "The installed version is"
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please update to "
"the latest version."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been deactivated because it is not "
"compatible with the current version of Extra Checkout Options."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload has been deactivated because "
"its functionality is included in the main plugin."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product Options & Add-Ons for "
"WooCommerce."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires %3$sWooCommerce%4$s %5$s or "
"later."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, php-format
msgid "%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires WordPress %3$s or later."
msgstr ""

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires PHP version %3$s or later."
msgstr ""

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr ""

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:101
msgid "Global Forms"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:102
msgid "Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:103
msgctxt "post type general name"
msgid "Global Forms"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:114
msgid "Parent Global Form"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:156
msgid "Option Templates"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:157
msgid "Option Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:158
msgctxt "post type general name"
msgid "Option Templates"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:171
msgid "This is where you can add new global template options."
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:202
msgid "Lookup tables"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:204
msgctxt "post type general name"
msgid "Lookup tables"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:205
msgid "Add Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:206
msgid "Add New Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:208
msgid "Edit Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:209
msgid "New Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
msgid "View Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:212
msgid "Search Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:213
msgid "No Lookup table found"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:214
msgid "No Lookup table found in trash"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:215
msgid "Parent Lookup table"
msgstr ""

#: includes/classes/class-themecomplete-epo-post-types.php:217
msgid "This is where you can add new lookup tables."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
msgid "Options VAT amount"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
msgid "Your files are being uploaded"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:584
msgid "Please enter at least {0} character."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:586
msgid "Please select up to {0} choice."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:588
msgid "Please select exactly {0} choice."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:590
msgid "Please select at least {0} choice."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:598
msgid "Minimum number of rows is {0}"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:599
msgid "Maximum number of rows is {0}"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr ""

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
msgid "Math Formula Constants"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:162
msgid "Shop order (HPOS)"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:251
msgid "Enable Frontend Access for Selected Roles"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:252
msgid "Select the roles that will have access to the extra options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:261
msgid "Disable Frontend Access for Selected Roles"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:271
msgid "Enable translations"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:272
msgid "This will enable the default plugin translation using the pot files."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:279
msgid "Post type hook priority"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:280
msgid ""
"Do not change this unless you know how it will affect your site! This is the priority which the post "
"types are loaded by the plugin."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:282
msgid "Default value is 100"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
msgid "Specify the areas where the plugin will be activated."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:296
msgid "Everywhere"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
msgid "Product Categories"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:299
msgid "Product Taxonomies"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:300
msgid "Product Tags"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
msgid "WooCommerce Pages"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, allowing customers to view the "
"total cost of their order, or disable it for a simplified product page."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with a clear overview of the "
"overall cost."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:353
msgid "Enable Final total box for all products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:354
msgid "Show the Final total box even when the product has no extra options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:370
msgid "Enable options VAT display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:371
msgid "Check to display the options VAT amount above the options total"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:378
msgid "Show Unit price on totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:379
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:387
msgid "Enable this to add any Fees to the unit price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:394
msgid "Total price as Unit Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:402
msgid "Hide Final total box until an element is chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:403
msgid "Check this to show the Final total box only when at least one option is filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:410
msgid "Hide Final total box until all required elements are chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:411
msgid "Check this to show the Final total box only when all required visible options are filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:418
msgid "Hide Final total box until all elements are chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:419
msgid "Check this to show the Final total box only when all visible options are filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:426
msgid "Disable lazy load images"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:427
msgid "Enable this to disable lazy loading images."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:434
msgid "Preload lightbox images"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:435
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:442
msgid "Enable plugin for WooCommerce shortcodes"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:443
msgid "Enabling this will load the plugin files to all WordPress pages. Use with caution."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:450
msgid "Enable shortcodes in options strings"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:451
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options label and description text."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
msgid "Floating Totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:489
msgid ""
"This controls how your fields are displayed on the front-end. If you choose \"Show using action hooks\" "
"you have to manually write the code to your theme or plugin to display the fields and the placement "
"settings below will not work. If you use the Composite Products extension you must leave this setting to "
"\"Normal\" otherwise the extra options cannot be displayed on the composite product bundles. See more at "
"the documentation."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:497
msgid "Show using action hooks"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:501
msgid "Extra Options placement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:502
msgid "Select where you want the extra options to appear."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
msgid "Before cart form"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
msgid "After cart form"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
msgid "After product image"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
msgid "Custom hook"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:527
msgid "Extra Options placement custom hook"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:535
msgid "Extra Options placement hook priority"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:536
msgid "Select the Extra Options placement hook priority"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:543
msgid "Totals box placement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:544
msgid "Select where you want the Totals box to appear."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:569
msgid "Totals box placement custom hook"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:577
msgid "Totals box placement hook priority"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:578
msgid "Select the Totals box placement hook priority"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:586
msgid "This will enable a floating box to display your totals box."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:601
msgid "Floating Totals box visibility"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:602
msgid "This determines the floating totals box visibility."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:611
msgid "Hide after scrolling the page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:615
msgid "Pixels amount needed to scroll"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:616
msgid "Select the number of pixels the page needs to scroll for the floating totals to become visible."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:623
msgid "Add to cart button on floating totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:624
msgid "Display the add to cart button on floating box."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:632
msgid "Check to overwrite the original product price when the price is changing."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:639
msgid "Change variation price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:640
msgid "Check to overwrite the variation price when the price is changing."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:648
msgid ""
"This changes the add to cart button on shop and archive pages to display select options when the product "
"has extra product options. Enabling this will remove the ajax functionality."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:657
msgid "Enable extra options in shop and category view"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:658
msgid ""
"Check to enable the display of extra options on the shop page and category view. This setting is theme "
"dependent and some aspects may not work as expected."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:665
msgid "Remove Free price label"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:666
msgid "Check to remove Free price label when product has extra options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:673
msgid "Use progressive display on options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:674
msgid ""
"Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-"
"safe setting and we recommend to be active."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:682
msgid "How long the animation will take in milliseconds"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:689
msgid "Start Animation delay"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:690
msgid "The delay until the animation starts in milliseconds"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:697
msgid "Show quantity selector only for elements with a value"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:698
msgid "Check show quantity selector only for elements with a value."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:705
msgid "Hide add-to-cart button until an element is chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:706
msgid "Check this to show the add to cart button only when at least one option is filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:713
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:714
msgid "Check this to show the add to cart button only when all required visible options are filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:721
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:722
msgid "Check this to show the add to cart button only when all visible options are filled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:729
msgid "Show full width label for elements."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:730
msgid "Check this to force elements to be full width instead of auto."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:737
msgid "Show choice description inline."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:738
msgid "Check this to disable showing description as a tooltip and show it inline instead."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:745
msgid "Hide choice label when using the Show tooltip setting for radio buttons and checkboxes"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:746
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for radio buttons and checkboxes."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:754
msgid "Check this to globally hide the price display if it is zero."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:761
msgid "Trim zeros in prices"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:762
msgid ""
"Check this to globally trim zero in prices. This will be applied to native WooCommerce prices as well."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:769
msgid "Hide element price html when hide price setting is enabled"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:770
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of the element when you enable "
"its hide price setting."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will get wrong results by enabling "
"this!"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:789
msgid "Include option pricing in product price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:790
msgid "Check this to include the pricing of the options to the product price."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:797
msgid "Check for empty product price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:798
msgid "Check this to have the plugin set to zero the product price when it is empty."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid "Check this to alter the price display of a product when it has extra options with prices."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:813
msgid "Alter generated product structured data"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:814
msgid ""
"Alters the generated product structured data. This may produce wrong results if the options use "
"conditional logic!"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:821
msgid "Responsive options structure"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:822
msgid "Enable this if you want the options to have responsive display."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:866
msgid "Cart Field Display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:867
msgid "Select how to display your fields in the cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:888
msgid "Hide extra addon prices in cart and checkout"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:889
msgid "Enables or disables the display of addon prices in the cart and checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:905
msgid "Prevent zero priced products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:906
msgid "Prevent adding to the cart zero priced products."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:913
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid "Enabling this will show the images of elements that have an image replacement."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:926
msgid "Hide upload file URL in cart and checkout"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:927
msgid "Enabling this will hide the URL of any uploaded file while in cart and checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:933
msgid "Show uploaded image in cart and checkout"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:934
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:941
msgid "Set the maximum width of the images that appear on cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:948
msgid "Set the maximum height of the images that appear on cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:954
msgid "Always use unique values on cart for elements"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:955
msgid ""
"Enabling this will separate comma separated values for elements. This is mainly used for multiple "
"checkbox choices."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:984
msgid "Post types to show the saved options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:985
msgid ""
"Select the post types where the plugin will modify the edit order screen to show the saved options. You "
"can type in your custom post type."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:995
msgid "Strip html from emails"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:996
msgid "Check to strip the html tags from emails"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
msgid "Legacy meta data"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
msgid "Check to enable legacy meta data functionality."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
msgid "Unique meta values"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
msgid "Check to split items with multiple values to unique lines."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
msgid "Disable sending the options upon saving the order"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
msgid "Enable this if you are getting a 500 error when trying to complete the order in the checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
msgid "Attach upload files to emails"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
msgid "Check to Attach upload files to emails."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
msgid "Disable Options on Order status change"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
msgid "Check this only if you are getting server errors on checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
msgid "Show uploaded image in order"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
msgid "Enabling this will show the uploaded images in order."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
msgid "Field Label/value separator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
msgid ""
"Enter the character that will be used to separate field labels from field values in the cart and order."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
msgid "Multiple field values separator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
msgid ""
"Enter the string that will be used to separate multiple values for a field that allows multiple "
"selections in the cart and order."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
msgid "Update cart text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
msgid "Enter the Update cart text when you edit a product."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid "Enter a text to replace the Additional options text when using the pop up setting on the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid "Enter a text to replace the Close button text when using the pop up setting on the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
msgid "Unit price text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
msgid "Enter the Unit price text or leave blank for default."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
msgid "Enter the Options total text or leave blank for default."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
msgid "Options VAT total text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
msgid "Enter the Options VAT total text or leave blank for default."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
msgid "Enter the Fees total text or leave blank for default."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid "Enter a text to replace the Free price label when product has extra options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid "Enter a text to replace the add to cart button text when using the Force select option."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
msgid "Enter a text to replace the message when trying to add a zero priced product to the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
msgid "Enter a text to replace the message when trying to add a negative priced product to the cart."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
msgid "Popup section button text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s will make it so that the button "
"text has the section title."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1232 templates/tm-builder-section-start.php:94
msgid "Open"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid "Enter a text to replace the Reset options text when using custom variations."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1241 templates/tm-variations.php:598
msgid "Reset options"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
msgid "Enter a text to indicate that a field is required."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
msgid ""
"Enter a text to replace the Characters remaining text when using maximum characters on a text field or a "
"textarea."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart "
"button  when there are upload fields."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart button when there are upload "
"fields."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
msgid "Enter a text to replace the Select file text used in the styled upload button."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
msgid "Single file text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
msgid "Multiple files text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
msgid "Enter a text to replace the files text used in the styled upload button."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
msgid "Add button text on associated products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
msgid "Enter a text to replace the add button text on associated products."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12 templates/tm-builder-element-end.php:56
msgid "Add"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
msgid "Remove button text on associated products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
msgid "Repeater add text"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
msgid "Select a style for the checkboxes and radio buttons"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
msgid "Swatch border type"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid "Select a style for the selected border when using image replacements or swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid "Choose the border color for image or color swatches. If left blank it defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid "Choose the border color for text swatches. If left blank it is set to inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have selected an image, color or text "
"swatch. If left blank it is set to inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
msgid "Choose the border width for image or color swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
msgid "Select the border width for the active border when you have chosen an image or color swatch."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
msgid "Select the border width for the active border when you have chosen a text swatch."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
msgid "Disable error scrolling"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
msgid "Error label placement"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
msgid "Set the placement for the validation error notification label"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
msgid "After the element"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
msgid "Before the element"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
msgid "Use options cache"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
msgid ""
"Use options caching for boosting performance. Disable if you have options that share the same unique ID."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
msgid "Javascript and CSS inclusion mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
msgid "Select how to include JS and CSS files"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
msgid "Single minified file"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
msgid "Multiple minified files"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
msgid "DEV - multiple files"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
msgid "Disable PNG convert security"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
msgid "Check to disable the conversion to png for image uploads."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the options if the total options price "
"is greater then zero."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
msgid "Options price mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
msgid "Select the price mode for the options."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
msgid "Use sale price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
msgid "Use regular price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
msgid "Maximum number of combinations for price calcualtions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
msgid ""
"This setting controls the maximum number of combinations that the plugin will use to calculate minimum "
"and maximum prices. A higher number of combinations will result in more accurate prices, but it will also "
"take longer to calculate them. For products that can have many choice combinations, it is recommended to "
"set a lower number of combinations to improve performance."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
msgid "Default value is 10"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a product. Enabling this setting "
"will provide a more precise result at the cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
msgid "This will revert the option values to the default ones after adding the product to the cart"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
msgid "Choose how you want the sign of options prices to be displayed in cart and checkout."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
msgid "Display both signs"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
msgid "Display only minus sign"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
msgid "Use plus and minus signs on option prices"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
msgid "Choose how you want the sign of options prices to be displayed at the product page."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
msgid "Choose how to determine the decimal separator for user inputs"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
msgid "Choose which decimal separator to display on currency prices"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
msgid "Timezone override for Date element"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or leave blank for server timezone."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
msgid "Select the placement of the Required state indicator"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
msgid "Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
msgid "jQuery selector for main product image"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
msgid "This is used to change the product image."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
msgid "Product image replacement mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
msgid "Self mode replaces the actual image and Inline appends new image elements."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
msgid "Self mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
msgid "Inline mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
msgid "Move out of stock message"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
msgid "This moves the out of stock message when styled variations are used just below them."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
msgid "Use internal variation price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
msgid ""
"Enable this if your variable products have a lot of options to improve performance. Note that this may "
"cause issues with discount or currency plugins."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
msgid "Enable plugin backend interface"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
msgid ""
"Select the roles that will have access to the plugin settings and the plugin interface while on the edit "
"product page. The Admininstrator role always has access."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
msgid "Hide override settings on products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
msgid "Hide Builder mode on products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
msgid "Hide Normal mode on products"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
msgid "Enable WP Rocket CDN"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
msgid "Check to enable the use of WP Rocket cdn for the plugin images if it is active."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
msgid "Enable Jetpack CDN"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
msgid "Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid "Set the row gap between sections and fields. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid "Set the column gap between sections and fields. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid "Set the inner row gap between field elements. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid "Set the inner column gap between field elements. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
msgid "Set the image mode that will be used for various image related functionality."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
msgid "Relative URL"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
msgid "Recalculate image on changes"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
msgid ""
"This is required on several gallery solutions that change the image html dynamically or if you want to "
"control the image dynamically."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
msgid "Retrieve image sizes for image replacements"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
msgid "Disable this for slow servers or large amounts of images."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
msgid "Show quantity 1"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the quantity selector is enabled."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
msgid "Show prices inside select box choices"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
msgid "Check this to show the price of the select box options if the price type is fixed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
msgid ""
"Check this to show the price of the select box options if the price type is fixed and even if the element "
"hides the price."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
msgid "Check this to multiply the prices of the select box options with its quantity selector if any."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
msgid "Globally override the undo button for radio buttons"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
msgid "Minimum characters for text-field and text-areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
msgid "Maximum characters for text-field and text-areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
msgid "Upload element inline Image preview"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
msgid "Enable inline preview of the image that will be uploaded."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
msgid "Scroll to the product element upon selection"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
msgid "Enable to scroll the viewport to the product element."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
msgid "Product element scroll offset"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
msgid "Enter a value for the scroll offset when selecting a choice for the product element."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
msgid "Sync associated product quantity with main product quantity"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
msgid ""
"Enable to have the quantities of the associated products to be a multiple of the main product quantity."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
msgid "Envato Personal Token"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
msgid "I agree that the license data will be transmitted to the license server."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
msgid "Use allowed file types from WordPress"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
msgid "Enable File manager"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
msgid "Enable pop-up message on uploads"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
msgid "Enables a pop-up when uploads are made."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
msgid "Enable upload success message"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
msgid "Indicates if the upload was successful with a message."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
msgid "Select which file types the user will be allowed to upload."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
msgid "Select file types"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
msgid "Custom types"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid "Select custom file types the user will be allowed to upload separated by commas."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
msgid "Only enter pure CSS code without and style tags"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
msgid "Only enter pure JavaScript code without and script tags"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
msgid "Add Constant"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
msgid "License activated!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
msgid "Please fill all fields before trying to activate."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
msgid "Envato rate limit exceeded! Please try again later."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you entered the correct username "
"(case sensitive)."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
msgid "Trying to activate from an invalid IP address!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
msgid "Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "To receive automatic updates license activation is required."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "Please activate Extra Product Options."
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "Download new version from CodeCanyon"
msgstr ""

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr ""

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr ""

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr ""

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr ""

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, php-format
msgid "Language of this %s"
msgstr ""

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
msgid "This is a translation of"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
msgid "Enable discounts on extra options"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This configuration will "
"automatically synchronize with the setting of the discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
msgid "Set to what price types will base their original price on."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid "Enter a CSS selector to override the default label where the discount string will be displayed."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
msgid "Enable showing option prices in the Order"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
msgid ""
"Enable this at your own risk since it is not possible to calculate option discounts on the Order page."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
msgid "Using booking setting"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
msgid "Add option cost to booking display price"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
msgid "Enabling this will add the option prices to the calculated booking cost."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
msgid "Enabling this will apply the product discounts to the extra options as well."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
msgid "WooCommerce Measurement Calculator"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
msgid "Divide price with measurement"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
msgid "Include addons on order again"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
msgid ""
"Enabling this will add the saved addons to the subscription when using the order again functionality "
"manually."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
msgid "sign-up fee"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] ""
msgstr[1] ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
msgid "Subscription sign up fee text"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
msgid "Sign up fee text"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
msgid "Enter the Sign up fee text or leave blank for default."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr ""

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr ""

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr ""

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr ""

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr ""

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr ""

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr ""

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr ""

#: templates/_choice_description.php:20 templates/_price.php:20 templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr ""

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr ""

#: templates/products/template-item.php:90
msgid "N/A"
msgstr ""

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr ""

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr ""

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr ""

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr ""
languages/woocommerce-tm-extra-product-options-hi_IN.po000064400001331620150755142440017300 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:52+0200\n"
"PO-Revision-Date: 2024-03-07 11:53+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: hi_IN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,"
"_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;"
"esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
#, fuzzy
msgid "Extra Product Options"
msgstr "अतिरिक्त उत्पाद विकल्प"

#: admin/class-themecomplete-epo-admin-base.php:642
#, fuzzy
msgid "Extra Product Options Fees"
msgstr "अतिरिक्त उत्पाद विकल्प शुल्क"

#: admin/class-themecomplete-epo-admin-base.php:697
#, fuzzy
msgid "View Extra Product Options settings"
msgstr "अतिरिक्त उत्पाद विकल्प सेटिंग्स देखें"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989 admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "सेटिंग्स"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
#, fuzzy
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन"

#: admin/class-themecomplete-epo-admin-base.php:719
#, fuzzy, php-format
msgid "More information about %s"
msgstr "%s के बारे में अधिक जानकारी"

#: admin/class-themecomplete-epo-admin-base.php:721
#, fuzzy
msgid "View details"
msgstr "विवरण देखें"

#: admin/class-themecomplete-epo-admin-base.php:723
#, fuzzy
msgid "View Extra Product Options documentation"
msgstr "अतिरिक्त उत्पाद विकल्प दस्तावेज़ देखें"

#: admin/class-themecomplete-epo-admin-base.php:723
#, fuzzy
msgid "Docs"
msgstr "डॉक्स"

#: admin/class-themecomplete-epo-admin-base.php:724
#, fuzzy
msgid "Visit premium customer support"
msgstr "प्रीमियम ग्राहक सहायता पर जाएँ"

#: admin/class-themecomplete-epo-admin-base.php:724
#, fuzzy
msgid "Premium Support"
msgstr "प्रीमियम समर्थन"

#: admin/class-themecomplete-epo-admin-base.php:788
#, fuzzy
msgid "(Copy)"
msgstr "(प्रतिलिपि)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, fuzzy, php-format
msgid "Variation #%1$s of %2$s"
msgstr "%2$s की भिन्नता #%1$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "अभी तक कोई सहेजी गई विविधताएं नहीं हैं."

#: admin/class-themecomplete-epo-admin-base.php:1235
#, fuzzy
msgid "You cannot add any more extra options."
msgstr "आप और अधिक विकल्प नहीं जोड़ सकते."

#: admin/class-themecomplete-epo-admin-base.php:1236
#, fuzzy
msgid "Are you sure you want to remove this option?"
msgstr "क्या आप वाकई इस विकल्प को निकालना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-base.php:1237
#, fuzzy
msgid "Before adding Extra Product Options, add and save some attributes on the Attributes tab."
msgstr "अतिरिक्त उत्पाद विकल्प जोड़ने से पहले, विशेषताएँ टैब पर कुछ विशेषताएँ जोड़ें और सहेजें."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900 admin/views/html-tm-epo-admin.php:116
#: admin/views/html-tm-epo-admin.php:126 admin/views/html-tm-epo-admin.php:184
#: admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
#, fuzzy
msgid "Fixed amount"
msgstr "निश्चित राशि"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904 admin/views/html-tm-epo-admin.php:117
#: admin/views/html-tm-epo-admin.php:127
#, fuzzy
msgid "Percent of the original price"
msgstr "मूल मूल्य का प्रतिशत"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "त्रुटि"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
#, fuzzy
msgid "Invalid request!"
msgstr "अमान्य अनुरोध!"

#: admin/class-themecomplete-epo-admin-base.php:1276
#, fuzzy
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "क्या आप वाकई इस फ़ोल्डर और इसकी सभी सामग्री को हटाना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-base.php:1277
#, fuzzy
msgid "Are you sure you want to delete this file?"
msgstr "क्या आप वाकई इस फ़ाइल को हटाना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-base.php:1279
#, fuzzy
msgid "Are you sure you want to reset the settings?"
msgstr "क्या आप वाकई सेटिंग्स रीसेट करना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "हाँ"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "नहीं"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "कैंसिल करें"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "बंद"

#: admin/class-themecomplete-epo-admin-base.php:1284
#, fuzzy
msgid "Constant name"
msgstr "निरंतर नाम"

#: admin/class-themecomplete-epo-admin-base.php:1285
#, fuzzy
msgid "Constant value"
msgstr "स्थिर मान"

#: admin/class-themecomplete-epo-admin-base.php:1286
#, fuzzy
msgid ""
"Please check the consent checkbox to give your permission to send your data to the server and "
"try again."
msgstr "कृपया सर्वर पर अपना डेटा भेजने की अनुमति देने के लिए सहमति चेकबॉक्स की जाँच करें और पुन: प्रयास करें."

#: admin/class-themecomplete-epo-admin-base.php:1287
#, fuzzy
msgid "Connecting to activation server ..."
msgstr "सक्रियण सर्वर से कनेक्ट हो रहा है ..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, fuzzy, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "अतिरिक्त उत्पाद विकल्प # %2$s का %1$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
#, fuzzy
msgid "Could not update post in the database"
msgstr "डेटाबेस में पोस्ट अद्यतन नहीं किया जा सका"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
#, fuzzy
msgid "Enable points display?"
msgstr "अंक प्रदर्शन सक्षम करें?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr "यह आपको रेंज पिकर के साथ अंक उत्पन्न करने की अनुमति देता है।"

#: admin/class-themecomplete-epo-admin-builder-base.php:266
#, fuzzy
msgid "Number of points"
msgstr "अंकों की संख्या"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
#, fuzzy
msgid "Enter the number of values for the points display."
msgstr "अंक प्रदर्शन के लिए मानों की संख्या दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
#, fuzzy
msgid "Tooltip"
msgstr "टूलटिप"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
#, fuzzy
msgid "Left side"
msgstr "बाईं ओर"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "दाहिनी ओर"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
#, fuzzy
msgid "Tooltip and Left side"
msgstr "टूलटिप और बाईं ओर"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
#, fuzzy
msgid "Tooltip and Right side"
msgstr "टूलटिप और दाईं ओर"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
#, fuzzy
msgid "Show value on"
msgstr "पर मूल्य दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
#, fuzzy
msgid "Select how to show the value of the range picker."
msgstr "श्रेणी पिकर का मान दिखाने का तरीका चुनें."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
#, fuzzy
msgid "Step value"
msgstr "चरण मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
#, fuzzy
msgid "Enter the step for the handle."
msgstr "हैंडल के लिए चरण दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
#, fuzzy
msgid "No validation"
msgstr "कोई सत्यापन नहीं"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "ईमेल"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
#, fuzzy
msgid "Url"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
#, fuzzy
msgid "Number"
msgstr "संख्या"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
#, fuzzy
msgid "Digits"
msgstr "अंक"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
#, fuzzy
msgid "Letters only"
msgstr "केवल पत्र"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
#, fuzzy
msgid "Letters or Space only"
msgstr "केवल पत्र या स्थान"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
#, fuzzy
msgid "Alphanumeric"
msgstr "अल्फ़ान्यूमेरिक"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
#, fuzzy
msgid "Alphanumeric Unicode"
msgstr "अल्फ़ान्यूमेरिक यूनिकोड"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
#, fuzzy
msgid "Alphanumeric Unicode or Space"
msgstr "अल्फ़ान्यूमेरिक यूनिकोड या स्पेस"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
#, fuzzy
msgid "Validate as"
msgstr "के रूप में मान्य करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
#, fuzzy
msgid "Choose whether the field will be validated against the choosen method."
msgstr "चुनें कि क्या फ़ील्ड को चयन विधि के विरुद्ध मान्य किया जाएगा."

#: admin/class-themecomplete-epo-admin-builder-base.php:453 admin/views/html-tm-epo-admin.php:67
#, fuzzy
msgid "Required"
msgstr "आवश्यक"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
#, fuzzy
msgid "Choose whether the user must fill out this field or not."
msgstr "चुनें कि उपयोगकर्ता को यह फ़ील्ड भरनी चाहिए या नहीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544 admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "सक्षम"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
#, fuzzy
msgid "Choose whether the option is enabled or not."
msgstr "चुनें कि विकल्प सक्षम है या नहीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757 admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
#, fuzzy
msgid "Enter the price for this field or leave it blank for no price."
msgstr "इस फ़ील्ड के लिए मूल्य दर्ज करें या इसे बिना किसी मूल्य के रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
#, fuzzy
msgid "Sale Price"
msgstr "बिक्री मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
#, fuzzy
msgid "Enter the sale price for this field or leave it blankto use the default price."
msgstr "इस फ़ील्ड के लिए विक्रय मूल्य दर्ज करें या डिफ़ॉल्ट मूल्य का उपयोग करने के लिए इसे रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
#, fuzzy
msgid "Text after Price"
msgstr "कीमत के बाद का पाठ"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
#, fuzzy
msgid "Enter a text to display after the price for this field or leave it blank for no text."
msgstr ""
"इस फ़ील्ड के लिए मूल्य के बाद प्रदर्शित करने के लिए कोई पाठ दर्ज करें या बिना किसी पाठ के उसे रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
#, fuzzy
msgid "Text before Price"
msgstr "मूल्य से पहले पाठ"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
#, fuzzy
msgid "Enter a text to display before the price for this field or leave it blank for no text."
msgstr ""
"इस फ़ील्ड के लिए मूल्य से पहले प्रदर्शित करने के लिए कोई पाठ दर्ज करें या बिना किसी पाठ के उसे रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
#, fuzzy
msgid "Percent of the original price + options"
msgstr "मूल मूल्य + विकल्प का प्रतिशत"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
#, fuzzy
msgid "Price per word"
msgstr "प्रति शब्द मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
#, fuzzy
msgid "Percent of the original price per word"
msgstr "प्रति शब्द मूल मूल्य का प्रतिशत"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
#, fuzzy
msgid "Price per word (no n-th char)"
msgstr "प्रति शब्द मूल्य (कोई n-th char नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
#, fuzzy
msgid "Percent of the original price per word (no n-th char)"
msgstr "प्रति शब्द मूल मूल्य का प्रतिशत (कोई n-th char नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
#, fuzzy
msgid "Price per character"
msgstr "प्रति चरित्र की कीमत"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "प्रति चरित्र मूल मूल्य का प्रतिशत"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "प्रति चरित्र मूल्य (कोई पहला चार नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "प्रति वर्ण मूल्य (कोई n-th char नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "प्रति वर्ण मूल्य (कोई n-th char और कोई रिक्त स्थान नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "प्रति चरित्र मूल मूल्य का प्रतिशत (कोई पहला चार नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr "प्रति वर्ण मूल मूल्य का प्रतिशत (कोई n-th char नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid "Percent of the original price per character (no n-th char and no spaces)"
msgstr "प्रति चरित्र मूल मूल्य का प्रतिशत (कोई n-th char और कोई रिक्त स्थान नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "प्रति वर्ण मूल्य (कोई रिक्त स्थान नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
#, fuzzy
msgid "Price per row"
msgstr "प्रति पंक्ति मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
#, fuzzy
msgid "Math formula"
msgstr "गणित का सूत्र"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
#, fuzzy
msgid "Fixed amount + options"
msgstr "निश्चित राशि + विकल्प"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "लुकअप टेबल"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
#, fuzzy
msgid "Price type"
msgstr "मूल्य प्रकार"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
#, fuzzy
msgid "Quantity"
msgstr "परिमाण"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
#, fuzzy
msgid "Current value"
msgstr "वर्तमान मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
#, fuzzy
msgid "Step * price"
msgstr "चरण * मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
#, fuzzy
msgid "Price per Interval"
msgstr "प्रति अंतराल मूल्य"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
msgid "Calculation type"
msgstr "अनुभाग का प्रकार"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408 admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
#, fuzzy
msgid "None"
msgstr "कोई नहीं"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "x के लिए तत्व ID"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr "x स्तंभ के लिए उपयोग करने के लिए तत्व ID दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "Element ID for y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr "y स्तंभ के लिए उपयोग करने के लिए तत्व ID दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
#, fuzzy
msgid "Set to Fee"
msgstr "शुल्क पर सेट करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
#, fuzzy
msgid "Attach the price to the order making it independent of the product quantity."
msgstr "मूल्य को ऑर्डर में संलग्न करें जिससे यह उत्पाद मात्रा से स्वतंत्र हो।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "नि: शुल्क पात्र"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "नि: शुल्क वर्णों की संख्या दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
#, fuzzy
msgid "Min value"
msgstr "न्यूनतम मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
#, fuzzy
msgid "Enter the minimum value."
msgstr "न्यूनतम मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
#, fuzzy
msgid "Max value"
msgstr "अधिकतम मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
#, fuzzy
msgid "Enter the maximum value."
msgstr "अधिकतम मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
#, fuzzy
msgid "Day / Month / Year"
msgstr "दिन / महीना / वर्ष"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
#, fuzzy
msgid "Month / Day / Year"
msgstr "महीना / दिन / वर्ष"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
#, fuzzy
msgid "Day . Month . Year"
msgstr "दिन। महीना। साल"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
#, fuzzy
msgid "Month . Day . Year"
msgstr "महीना। दिन। साल"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
#, fuzzy
msgid "Day - Month - Year"
msgstr "दिन - महीना - वर्ष"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
#, fuzzy
msgid "Month - Day - Year"
msgstr "महीना - दिन - वर्ष"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
#, fuzzy
msgid "Year / Month / Day"
msgstr "वर्ष / महीना / दिन"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
#, fuzzy
msgid "Year / Day / Month"
msgstr "वर्ष / दिन / महीना"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
#, fuzzy
msgid "Year . Month . Day"
msgstr "साल। महीना। दिन"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
#, fuzzy
msgid "Year . Day . Month"
msgstr "साल। दिन। महीना"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
#, fuzzy
msgid "Year - Month - Day"
msgstr "वर्ष - महीना - दिन"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
#, fuzzy
msgid "Year - Day - Month"
msgstr "वर्ष - दिन - महीना"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
#, fuzzy
msgid "Date format"
msgstr "दिनांक स्वरूप"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
#, fuzzy
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
#, fuzzy
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
#, fuzzy
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
#, fuzzy
msgid "H:m"
msgstr "H:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
#, fuzzy
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
#, fuzzy
msgid "HH:m:ss"
msgstr "HH:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
#, fuzzy
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
#, fuzzy
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
#, fuzzy
msgid "HH:mm:s"
msgstr "HH:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
#, fuzzy
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
#, fuzzy
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
#, fuzzy
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
#, fuzzy
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
#, fuzzy
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
#, fuzzy
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
#, fuzzy
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
#, fuzzy
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
#, fuzzy
msgid "hh:m:ss"
msgstr "hh:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
#, fuzzy
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
#, fuzzy
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
#, fuzzy
msgid "hh:mm:s"
msgstr "hh:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
#, fuzzy
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
#, fuzzy
msgid "h:mm:s"
msgstr "h:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
#, fuzzy
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
#, fuzzy
msgid "Time format"
msgstr "समय का स्वरूप"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
#, fuzzy
msgid "Custom Time format"
msgstr "कस्टम समय स्वरूप"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
#, fuzzy
msgid "This will override the time format above."
msgstr "यह ऊपर दिए गए समय प्रारूप को ओवरराइड करेगा।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
#, fuzzy
msgid "Start year"
msgstr "वर्ष प्रारंभ करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
#, fuzzy
msgid "Enter starting year."
msgstr "प्रारंभ वर्ष दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
#, fuzzy
msgid "End year"
msgstr "अंतिम वर्ष"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
#, fuzzy
msgid "Enter ending year."
msgstr "अंतिम वर्ष में प्रवेश करें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
#, fuzzy
msgid "Use URL replacements"
msgstr "URL प्रतिस्थापन का उपयोग करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
#, fuzzy
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "चुनें कि यदि विकल्प क्लिक किया जाता है तो URL पर रीडायरेक्ट करना है या नहीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
#, fuzzy
msgid "Populate options"
msgstr "विकल्पों को पॉप्युलेट करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
#, fuzzy
msgid "Double click the radio button to remove its selected attribute."
msgstr "रेडियो बटन की चयनित विशेषता को निकालने के लिए उस पर डबल क्लिक करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
#, fuzzy
msgid "Variation options"
msgstr "भिन्नता विकल्प"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
#, fuzzy
msgid "Image swatches"
msgstr "छवि घड़ियों"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
#, fuzzy
msgid "Color swatches"
msgstr "रंग घड़ियों"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
#, fuzzy
msgid "Text swatches"
msgstr "टेक्स्ट घड़ियों"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
#, fuzzy
msgid "Replacement mode"
msgstr "प्रतिस्थापन मोड"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
#, fuzzy
msgid "Select how to display the element."
msgstr "तत्व प्रदर्शित करने का तरीका चुनें."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
#, fuzzy
msgid "Start of the label"
msgstr "लेबल की शुरुआत"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "केंद्र"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
#, fuzzy
msgid "End of the label"
msgstr "लेबल का अंत"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
#, fuzzy
msgid "Swatch position"
msgstr "घड़ी की स्थिति"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
#, fuzzy
msgid "Choose how the swatch will be displayed."
msgstr "चुनें कि Swatch कैसे प्रदर्शित किया जाएगा।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
#, fuzzy
msgid "Use image lightbox"
msgstr "छवि लाइटबॉक्स का उपयोग करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
#, fuzzy
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "चुनें कि थंबनेल पर लाइटबॉक्स सक्षम करना है या नहीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
#, fuzzy
msgid "Use the image replacements"
msgstr "छवि प्रतिस्थापन का उपयोग करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
#, fuzzy
msgid "Use custom image"
msgstr "कस्टम छवि का उपयोग करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
#, fuzzy
msgid "Changes product image"
msgstr "उत्पाद छवि परिवर्तित करता है"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
#, fuzzy
msgid "Choose whether to change the product image."
msgstr "चुनें कि उत्पाद छवि को बदलना है या नहीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
#, fuzzy
msgid "Show label"
msgstr "लेबल दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
#, fuzzy
msgid "Show description"
msgstr "विवरण दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
#, fuzzy
msgid "Show label and description"
msgstr "लेबल और विवरण दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
#, fuzzy
msgid "Show image"
msgstr "छवि दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
#, fuzzy
msgid "Show image and label"
msgstr "छवि और लेबल दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
#, fuzzy
msgid "Show image and description"
msgstr "छवि और विवरण दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
#, fuzzy
msgid "Show image, label and description"
msgstr "छवि, लेबल और विवरण दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
#, fuzzy
msgid "Show tooltip"
msgstr "टूलटिप दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr "इसे सक्षम करने से पसंद पर एक टूलटिप दिखाई देगी।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
#, fuzzy
msgid "Enable clear options button"
msgstr "स्पष्ट विकल्प बटन सक्षम करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
#, fuzzy
msgid "This will add a button to clear the selected option."
msgstr "यह चयनित विकल्प को साफ़ करने के लिए एक बटन जोड़ देगा।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
#, fuzzy
msgid "Show responsive values"
msgstr "उत्तरदायी मान दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
#, fuzzy
msgid "auto"
msgstr "ऑटो"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
#, fuzzy
msgid "Items per row (Desktops and laptops)"
msgstr "प्रति पंक्ति आइटम (डेस्कटॉप और लैपटॉप)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
#, fuzzy
msgid ""
"Use this field to make a grid display. Enter how many items per row for the grid or leave blank "
"for normal display."
msgstr ""
"ग्रिड प्रदर्शन बनाने के लिए इस फ़ील्ड का उपयोग करें. ग्रिड के लिए प्रति पंक्ति कितने आइटम दर्ज करें या सामान्य "
"प्रदर्शन के लिए रिक्त छोड़ दें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
#, fuzzy
msgid "Items per row (Tablets landscape)"
msgstr "प्रति पंक्ति आइटम (टैबलेट लैंडस्केप)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
#, fuzzy
msgid "Items per row (Tablets portrait)"
msgstr "आइटम प्रति पंक्ति (टैबलेट चित्र)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
#, fuzzy
msgid "Items per row (Smartphones)"
msgstr "आइटम प्रति पंक्ति (स्मार्टफ़ोन)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
#, fuzzy
msgid "Items per row (iPhone 5)"
msgstr "प्रति पंक्ति आइटम (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
#, fuzzy
msgid "Items per row (iPhone 6)"
msgstr "प्रति पंक्ति आइटम (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
#, fuzzy
msgid "Items per row (iPhone 6 +)"
msgstr "प्रति पंक्ति आइटम (iPhone 6 +)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
#, fuzzy
msgid "Items per row (Samnsung Galaxy)"
msgstr "आइटम प्रति पंक्ति (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
#, fuzzy
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "प्रति पंक्ति आइटम (गैलेक्सी टैबलेट लैंडस्केप)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098 admin/views/html-tm-epo-admin.php:81
#, fuzzy
msgid "Limit selection"
msgstr "चयन सीमित करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
#, fuzzy
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour."
msgstr "चेकबॉक्स चयन को सीमित करने या डिफ़ॉल्ट व्यवहार के लिए रिक्त छोड़ने के लिए 0 से ऊपर की संख्या दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
#, fuzzy
msgid "Exact selection"
msgstr "सटीक चयन"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select the exact number of checkboxes or leave blank "
"for default behaviour."
msgstr ""
"उपयोगकर्ता को चेकबॉक्स की सटीक संख्या का चयन करने या डिफ़ॉल्ट व्यवहार के लिए रिक्त छोड़ने के लिए 0 से ऊपर की "
"संख्या दर्ज करें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
#, fuzzy
msgid "Minimum selection"
msgstr "न्यूनतम चयन"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select at least that number of checkboxes or leave "
"blank for default behaviour."
msgstr ""
"उपयोगकर्ता को कम से कम उतने चेकबॉक्स का चयन करने या डिफ़ॉल्ट व्यवहार के लिए रिक्त छोड़ने के लिए 0 से ऊपर की "
"संख्या दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
#, fuzzy
msgid "Normal browser button"
msgstr "सामान्य ब्राउज़र बटन"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
#, fuzzy
msgid "Styled button"
msgstr "स्टाइल किया गया बटन"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
#, fuzzy
msgid "Upload button style"
msgstr "अपलोड करें बटन शैली"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
#, fuzzy
msgid "Date field"
msgstr "दिनांक फ़ील्ड"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
#, fuzzy
msgid "Date picker"
msgstr "खजूर चुनने वाला"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
#, fuzzy
msgid "Date field and picker"
msgstr "दिनांक फ़ील्ड और पिकर"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
#, fuzzy
msgid "Date picker style"
msgstr "खजूर चुनने की शैली"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241 admin/views/html-tm-epo-admin.php:64
#, fuzzy
msgid "Hide price"
msgstr "कीमत छुपाएं"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
#, fuzzy
msgid "Choose whether to hide the price or not."
msgstr "चुनें कि कीमत छिपानी है या नहीं।"

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873 admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
#, fuzzy
msgid "Disable"
msgstr "अक्षम"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "सही"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "बाएं"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
#, fuzzy
msgid "Top"
msgstr "लट्टू"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
#, fuzzy
msgid "Bottom"
msgstr "नीचे"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
#, fuzzy
msgid "Quantity selector"
msgstr "मात्रा चयनकर्ता"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
#, fuzzy
msgid "This will show a quantity selector for this option."
msgstr "यह इस विकल्प के लिए एक मात्रा चयनकर्ता दिखाएगा।"

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
#, fuzzy
msgid "Quantity min value"
msgstr "मात्रा न्यूनतम मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
#, fuzzy
msgid "Quantity max value"
msgstr "मात्रा अधिकतम मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
#, fuzzy
msgid "Quantity step"
msgstr "मात्रा चरण"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
#, fuzzy
msgid "Enter the quantity step."
msgstr "मात्रा चरण दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
#, fuzzy
msgid "Quantity Default value"
msgstr "मात्रा डिफ़ॉल्ट मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
#, fuzzy
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr "मात्रा फ़ील्ड पर स्वचालित रूप से लागू किया जाने वाला मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
#, fuzzy
msgid "Placeholder"
msgstr "प्लेसहोल्डर"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
#, fuzzy
msgid "Minimum characters"
msgstr "न्यूनतम वर्ण"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
#, fuzzy
msgid "Enter a value for the minimum characters the user must enter."
msgstr "उपयोगकर्ता द्वारा दर्ज किए जाने वाले न्यूनतम वर्णों के लिए कोई मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
#, fuzzy
msgid "Maximum characters"
msgstr "अधिकतम वर्ण"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
#, fuzzy
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr "उपयोगकर्ता द्वारा दर्ज किए जा सकने वाले अधिकतम वर्णों को सीमित करने के लिए कोई मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
#, fuzzy
msgid "Default value"
msgstr "डिफ़ॉल्ट मान"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
#, fuzzy
msgid "Enter a value to be applied to the field automatically."
msgstr "फ़ील्ड पर स्वचालित रूप से लागू होने के लिए मान दर्ज करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "आकार"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "चौड़ाई कम करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
#, fuzzy
msgid "Increase Width"
msgstr "चौड़ाई बढ़ाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
#, fuzzy
msgid "Edit Element"
msgstr "तत्व संपादित करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
#, fuzzy
msgid "Duplicate Element"
msgstr "Duplicate Element"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
#, fuzzy
msgid "(No title)"
msgstr "(कोई शीर्षक नहीं)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
#, fuzzy
msgid "Edit Section"
msgstr "अनुभाग संपादित करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
#, fuzzy
msgid "Duplicate Section"
msgstr "डुप्लिकेट अनुभाग"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
#, fuzzy
msgid "Section"
msgstr "अनुभाग"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
#, fuzzy
msgid "Add element"
msgstr "तत्व जोड़ें"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
#, fuzzy
msgid "Choose the image to use in place of the radio button."
msgstr "रेडियो बटन के स्थान पर उपयोग करने के लिए छवि चुनें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#, fuzzy
msgid "Remove the image."
msgstr "छवि को हटा दें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
#, fuzzy
msgid "Choose the image to replace the product image with."
msgstr "उत्पाद छवि को बदलने के लिए छवि चुनें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
#, fuzzy
msgid "Select boxes"
msgstr "बक्सों का चयन करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128 admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
#, fuzzy
msgid "Radio buttons"
msgstr "रेडियो बटन"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
#, fuzzy
msgid "Radio buttons and image at start of the label"
msgstr "लेबल की शुरुआत में रेडियो बटन और छवि"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
#, fuzzy
msgid "Radio buttons and image at end of the label"
msgstr "लेबल के अंत में रेडियो बटन और छवि"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
#, fuzzy
msgid "Display as"
msgstr "इस प्रकार प्रदर्शित करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
#, fuzzy
msgid "Select the display type of this attribute."
msgstr "इस विशेषता के प्रदर्शन प्रकार का चयन करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
#, fuzzy
msgid "Attribute Label"
msgstr "विशेषता लेबल"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
#, fuzzy
msgid "Leave blank to use the original attribute label."
msgstr "मूल विशेषता लेबल का उपयोग करने के लिए रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
#, fuzzy
msgid "Enable"
msgstr "योग्य बनाना"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
#, fuzzy
msgid "Show reset button"
msgstr "रीसेट बटन दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
#, fuzzy
msgid "Enables the display of a reset button for this attribute."
msgstr "इस विशेषता के लिए रीसेट बटन के प्रदर्शन को सक्षम करता है."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
#, fuzzy
msgid "Attribute element class name"
msgstr "विशेषता तत्व वर्ग का नाम"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
#, fuzzy
msgid "Enter an extra class name to add to this attribute element"
msgstr "इस विशेषता तत्व को जोड़ने के लिए एक अतिरिक्त वर्ग नाम दर्ज करें"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "चौड़ाई"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
#, fuzzy
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr "प्रदर्शित आइटम की चौड़ाई दर्ज करें या ऑटो चौड़ाई के लिए रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "ऊंचाई"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
#, fuzzy
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr "प्रदर्शित आइटम की ऊँचाई दर्ज करें या स्वत: ऊँचाई के लिए रिक्त छोड़ दें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328 admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "छिपाना"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324 admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "दिखाना"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
#, fuzzy
msgid "Show attribute name"
msgstr "विशेषता नाम दिखाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
#, fuzzy
msgid "Choose whether to show or hide the attribute name."
msgstr "चुनें कि विशेषता नाम दिखाना है या छिपाना है."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "रंग"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
#, fuzzy
msgid "Select the color to use."
msgstr "उपयोग करने के लिए रंग का चयन करें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
#, fuzzy
msgid "Image replacement"
msgstr "छवि प्रतिस्थापन"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
#, fuzzy
msgid "Select an image for this term."
msgstr "इस शब्द के लिए किसी छवि का चयन करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
#, fuzzy
msgid "Product Image replacement"
msgstr "उत्पाद छवि प्रतिस्थापन"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
#, fuzzy
msgid "Select the image to replace the product image with."
msgstr "उत्पाद छवि को बदलने के लिए छवि का चयन करें."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
#, fuzzy
msgid "No saved variations found."
msgstr "कोई सहेजी गई विविधताएँ नहीं मिलीं."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
#, fuzzy
msgid "Choose the image to use in place of the checkbox."
msgstr "चेकबॉक्स के स्थान पर उपयोग करने के लिए छवि चुनें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
#, fuzzy
msgid "Choose the image to use in place of the radio button when it is checked."
msgstr "चेक किए जाने पर रेडियो बटन के स्थान पर उपयोग करने के लिए छवि चुनें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
#, fuzzy
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr "चेकबॉक्स के स्थान पर उपयोग करने के लिए छवि चुनें जब इसे चेक किया जाता है।"

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
#, fuzzy
msgid "Choose the image for the lightbox."
msgstr "लाइटबॉक्स के लिए छवि चुनें।"

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
#, fuzzy
msgid "Delete all options"
msgstr "सभी विकल्प हटाएँ"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#, fuzzy
msgid "Checked"
msgstr "जाँच"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
#, fuzzy
msgid "Default"
msgstr "चूक"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
#, fuzzy
msgid "Choice label"
msgstr "पसंद लेबल"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
#, fuzzy
msgid "Price Type"
msgstr "मूल्य का प्रकार"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "विवरण"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
#, fuzzy
msgid "Add item"
msgstr "आइटम जोड़ें"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
#, fuzzy
msgid "Add separator"
msgstr "विभाजक जोड़ें"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
#, fuzzy
msgid "Mass add"
msgstr "द्रव्यमान जोड़ें"

#: admin/class-themecomplete-epo-admin-csv.php:41
#, fuzzy
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to import and export "
"CSV files. Please ask your hosting provider to enable this function."
msgstr ""
"CSV फ़ाइलों को आयात और निर्यात करने के लिए PHP फ़ंक्शन mb_detect_encoding और mb_convert_encoding आवश्यक "
"हैं। कृपया इस फ़ंक्शन को सक्षम करने के लिए अपने होस्टिंग प्रदाता से पूछें."

#: admin/class-themecomplete-epo-admin-csv.php:289
#, fuzzy
msgid "Invalid CSV file."
msgstr "अमान्य CSV फ़ाइल."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
#, fuzzy
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr "अपलोड की गई फ़ाइल php.ini में upload_max_filesize निर्देश से अधिक है।"

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
#, fuzzy
msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form."
msgstr "अपलोड की गई फ़ाइल HTML प्रपत्र में निर्दिष्ट MAX_FILE_SIZE निर्देश से अधिक है."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
#, fuzzy
msgid "The uploaded file was only partially uploaded."
msgstr "अपलोड की गई फ़ाइल केवल आंशिक रूप से अपलोड की गई थी."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
#, fuzzy
msgid "No file was uploaded."
msgstr "कोई फ़ाइल अपलोड नहीं की गई."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
#, fuzzy
msgid "Missing a temporary folder."
msgstr "कोई अस्थायी फ़ोल्डर अनुपलब्ध है."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
#, fuzzy
msgid "Failed to write file to disk."
msgstr "डिस्क पर फ़ाइल लिखने में विफल."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
#, fuzzy
msgid "File upload stopped by extension."
msgstr "फ़ाइल अपलोड एक्सटेंशन द्वारा रोक दी गई."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
#, fuzzy
msgid "Sorry, this file type is not permitted for security reasons."
msgstr "क्षमा करें, सुरक्षा कारणों से इस फ़ाइल प्रकार की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-csv.php:324
#, fuzzy
msgid "No file found."
msgstr "कोई फ़ाइल नहीं मिली."

#: admin/class-themecomplete-epo-admin-csv.php:337
#, fuzzy
msgid "Invalid import method used."
msgstr "अमान्य आयात विधि का उपयोग किया गया."

#: admin/class-themecomplete-epo-admin-csv.php:393 admin/class-themecomplete-epo-admin-csv.php:437
#, fuzzy
msgid "File imported."
msgstr "फ़ाइल आयात."

#: admin/class-themecomplete-epo-admin-csv.php:397 admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "CSV फ़ाइल अमान्य है!"

#: admin/class-themecomplete-epo-admin-csv.php:552
#, fuzzy
msgid "Invalid CSV file!"
msgstr "अमान्य CSV फ़ाइल!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, fuzzy, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "%s से बड़ी फ़ाइलें अपलोड करने का प्रयास करने की अनुमति नहीं है!"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "फ़ाइल नई तालिकाओं के साथ आयात की गई."

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "CSV फ़ाइल आयात करने में कोई त्रुटि आई."

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid "There was an error saving the csv data. Please check the encoding of your csv file!"
msgstr "CSV डेटा सहेजने में कोई त्रुटि थी. कृपया अपनी CSV फ़ाइल के एन्कोडिंग की जाँच करें!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr "तालिका के नाम भिन्न हैं. क्या आप तालिकाओं को ओवरराइड करना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
#, fuzzy
msgid "Invalid data!"
msgstr "अमान्य डेटा!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
#, fuzzy
msgid "Something went wrong with the request!"
msgstr "अनुरोध के साथ कुछ गलत हो गया!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
#, fuzzy
msgid "Options saved!"
msgstr "विकल्प सहेजे गए!"

#: admin/class-themecomplete-epo-admin-global-base.php:517 admin/views/html-tm-global-epo.php:176
#, fuzzy
msgid "Include additional Global forms"
msgstr "अतिरिक्त वैश्विक प्रपत्र शामिल करें"

#: admin/class-themecomplete-epo-admin-global-base.php:519
#, fuzzy
msgid "(no title)"
msgstr "(कोई शीर्षक नहीं)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
#, fuzzy
msgid "Clear all additional Global forms"
msgstr "सभी अतिरिक्त वैश्विक रूपों को साफ़ करें"

#: admin/class-themecomplete-epo-admin-global-base.php:525
#, fuzzy
msgid "Disable Exclude from Global Options"
msgstr "वैश्विक विकल्पों से बाहर करें अक्षम करें"

#: admin/class-themecomplete-epo-admin-global-base.php:526
#, fuzzy
msgid "Enable Exclude from Global Options"
msgstr "वैश्विक विकल्पों से बाहर करें सक्षम करें"

#: admin/class-themecomplete-epo-admin-global-base.php:527
#, fuzzy
msgid "Delete all options on the product"
msgstr "उत्पाद पर सभी विकल्प हटाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:613
#, fuzzy
msgid "File manager is not supported on your server."
msgstr "फ़ाइल प्रबंधक आपके सर्वर पर समर्थित नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:630
#, fuzzy
msgid "Your settings have been reset."
msgstr "आपकी सेटिंग्स रीसेट कर दी गई हैं."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
#, fuzzy
msgid "There was an error saving the settings."
msgstr "सेटिंग्स सहेजने में कोई त्रुटि आई."

#: admin/class-themecomplete-epo-admin-global-base.php:678
#, fuzzy
msgid "Your settings have been saved."
msgstr "आपकी सेटिंग्स सहेजी जा चुकी हैं."

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "क्लोन टेम्पलेट"

#: admin/class-themecomplete-epo-admin-global-base.php:946
#, fuzzy
msgid "Clone form"
msgstr "क्लोन फॉर्म"

#: admin/class-themecomplete-epo-admin-global-base.php:951
#, fuzzy
msgid "Export form"
msgstr "प्रपत्र निर्यात करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
#, fuzzy
msgid "Extra Product Options Form Builder"
msgstr "अतिरिक्त उत्पाद विकल्प फ़ॉर्म बिल्डर"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "शीर्षक"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
#, fuzzy
msgid "Priority"
msgstr "प्राथमिकता"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
#, fuzzy
msgid "Applied on"
msgstr "पर लागू किया गया"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "श्रेणियाँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
#, fuzzy
msgid "Products"
msgstr "उत्पादों"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
#, fuzzy
msgid "Excluded Products"
msgstr "बहिष्कृत उत्पाद"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
#, fuzzy
msgid "ALL products"
msgstr "सभी उत्पाद"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "अक्षम"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
#, fuzzy
msgid "Products and Categories"
msgstr "उत्पाद और श्रेणियाँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
msgid "Custom"
msgstr "कस्टम कोड"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
#, fuzzy
msgid "ALL categories"
msgstr "सभी श्रेणियाँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
msgid "Form settings"
msgstr "सीएसएस सेटिंग्स"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
#, fuzzy
msgid "Publish"
msgstr "प्रकाशित करना"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
#, fuzzy
msgid "Roles"
msgstr "भूमिकाओं"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
#, fuzzy
msgid "Exclude Products"
msgstr "उत्पादों को शामिल न करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
#, fuzzy
msgid "The description will appear under the title."
msgstr "वर्णन शीर्षक के अंतर्गत दिखाई देगा."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
#, fuzzy
msgid "Enabled roles for this form"
msgstr "इस प्रपत्र के लिए सक्षम की गई भूमिकाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
#, fuzzy
msgid "Disabled roles for this form"
msgstr "इस प्रपत्र के लिए अक्षम भूमिकाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
#, fuzzy
msgid "Exclude Product(s) from the form"
msgstr "फ़ॉर्म से उत्पाद (उत्पादों) को बाहर करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
#, fuzzy
msgid "Search for a product&hellip;"
msgstr "किसी उत्पाद की खोज करें..."

#: admin/class-themecomplete-epo-admin-global-base.php:1602
#, fuzzy
msgid "Select the Product(s) to apply the options"
msgstr "विकल्पों को लागू करने के लिए उत्पाद का चयन करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
#, fuzzy
msgid "Meta data not correctly saved. Please save the product!"
msgstr "मेटा डेटा ठीक से नहीं सहेजा गया. कृपया उत्पाद को सहेजें!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
#, fuzzy
msgid "Add section"
msgstr "अनुभाग जोड़ें"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
#, fuzzy
msgid "Style variations"
msgstr "शैली विविधताएं"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "सेव करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "सीएसवी आयात करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
#, fuzzy
msgid "Export CSV"
msgstr "निर्यात CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
#, fuzzy
msgid "Fullsize"
msgstr "पूर्ण आकार"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
#, fuzzy
msgid "Please save the form before importing options!"
msgstr "विकल्प आयात करने से पहले कृपया प्रपत्र सहेजें!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
#, fuzzy
msgid "Please save the product before importing options!"
msgstr "विकल्प आयात करने से पहले कृपया उत्पाद सहेजें!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
#, fuzzy
msgid "No elements found!"
msgstr "कोई तत्व नहीं मिला!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
#, fuzzy
msgid "Start adding elements"
msgstr "तत्व जोड़ना प्रारंभ करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
#, fuzzy
msgid "Add element in a new section"
msgstr "किसी नए अनुभाग में तत्व जोड़ें"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
#, fuzzy
msgid "Delete Permanently"
msgstr "स्थायी रूप से हटाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
#, fuzzy
msgid "Move to Trash"
msgstr "कूड़ेदान में जाओ"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "अपडेट करें"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
msgid "Apply mode"
msgstr "सेल्फ मोड"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
msgid "All products"
msgstr "सभी उत्पाद"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
msgid "Customize"
msgstr "कस्टम मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
#, fuzzy
msgid "Something went wrong with WordPress."
msgstr "वर्डप्रेस के साथ कुछ गलत हो गया।"

#: admin/class-themecomplete-epo-admin-global-base.php:1969
#, fuzzy
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce सक्षम नहीं है!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "छल कर रहे हैं..?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
#, fuzzy
msgid "You are not allowed to move this item to the Trash."
msgstr "आपको इस आइटम को कूड़ेदान में ले जाने की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
#, fuzzy
msgid "Error in moving to Trash."
msgstr "ट्रैश में जाने में त्रुटि।"

#: admin/class-themecomplete-epo-admin-global-base.php:2052
#, fuzzy
msgid "You are not allowed to restore this item from the Trash."
msgstr "आपको इस आइटम को ट्रैश से पुनर्स्थापित करने की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
#, fuzzy
msgid "Error in restoring from Trash."
msgstr "ट्रैश से पुनर्स्थापित करने में त्रुटि।"

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
#, fuzzy
msgid "You are not allowed to delete this item."
msgstr "आपको यह आइटम हटाने की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
#, fuzzy
msgid "Error in deleting."
msgstr "हटाने में त्रुटि."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
#, fuzzy
msgid "The item you are trying to move to the Trash no longer exists."
msgstr "जिस आइटम को आप ट्रैश में ले जाने का प्रयास कर रहे हैं वह अब मौजूद नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
#, fuzzy
msgid "Unknown post type."
msgstr "अज्ञात पोस्ट प्रकार."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, fuzzy, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr "आप इस आइटम को कूड़ेदान में नहीं ले जा सकते. %s वर्तमान में संपादन कर रहा है."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
#, fuzzy
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr "वह आइटम जिसे आप ट्रैश से पुनर्स्थापित करने का प्रयास कर रहे हैं, अब मौजूद नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
#, fuzzy
msgid "You are not allowed to move this item out of the Trash."
msgstr "आपको इस आइटम को कूड़ेदान से बाहर ले जाने की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
#, fuzzy
msgid "This item has already been deleted."
msgstr "यह आइटम पहले ही हटाया जा चुका है."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
#, fuzzy
msgid "You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?"
msgstr "आपने किसी ऐसे आइटम को संपादित करने का प्रयास किया जो मौजूद नहीं है. शायद इसे हटा दिया गया था?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
#, fuzzy
msgid "You are not allowed to edit this item."
msgstr "आपको इस आइटम को संपादित करने की अनुमति नहीं है."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
#, fuzzy
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it and try again."
msgstr "आप इस आइटम को संपादित नहीं कर सकते क्योंकि यह ट्रैश में है. कृपया इसे पुनर्स्थापित करें और पुन: प्रयास करें."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, fuzzy, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s पोस्ट अपडेट किया गया."
msgstr[1] "%s पोस्ट अपडेट किए गए."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, fuzzy, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "%s पोस्ट अपडेट नहीं है, कोई इसे संपादित कर रहा है।"
msgstr[1] "%s पोस्ट अपडेट नहीं हैं, कोई उन्हें संपादित कर रहा है।"

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, fuzzy, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s पोस्ट स्थायी रूप से हटा दी गई."
msgstr[1] "%s पोस्ट स्थायी रूप से हटा दिए गए."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, fuzzy, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s पोस्ट कूड़ेदान में चली गई।"
msgstr[1] "%s पोस्ट ट्रैश में चले गए।"

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, fuzzy, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "%s पद को कचरे से बहाल कर दिया गया।"
msgstr[1] "%s पदों को कचरे से बहाल।"

#: admin/class-themecomplete-epo-admin-global-base.php:2353
#, fuzzy
msgid "The selected form does not contain any sections"
msgstr "चयनित प्रपत्र में कोई अनुभाग नहीं है"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
#, fuzzy
msgid "Show filters"
msgstr "फ़िल्टर दिखाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
#, fuzzy
msgid "Hide filters"
msgstr "फ़िल्टर छुपाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
#, fuzzy
msgid "Filter by"
msgstr "फ़िल्टर द्वारा फ़िल्टर करें"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
#, fuzzy
msgctxt "Google font: on or off"
msgid "on"
msgstr "पर"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
#, fuzzy
msgid "Are you sure you want to delete this item?"
msgstr "क्या आप वाकई इस आइटम को हटाना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
#, fuzzy
msgid "Are you sure you want to clone this item?"
msgstr "क्या आप वाकई इस आइटम को क्लोन करना चाहते हैं?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
#, fuzzy
msgid "Edit settings"
msgstr "सेटिंग्स संपादित करें"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
#, fuzzy
msgid "Element id"
msgstr "Element id"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
#, fuzzy
msgid "Section id"
msgstr "अनुभाग आईडी"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
#, fuzzy
msgid "is"
msgstr "है"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
#, fuzzy
msgid "is not"
msgstr "नहीं है"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
#, fuzzy
msgid "is empty"
msgstr "खाली है"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
#, fuzzy
msgid "is not empty"
msgstr "खाली नहीं है"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
#, fuzzy
msgid "starts with"
msgstr "के साथ शुरू होता है"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
#, fuzzy
msgid "ends with"
msgstr "अंत में"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
#, fuzzy
msgid "greater than"
msgstr "से अधिक"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
#, fuzzy
msgid "less than"
msgstr "से कम"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
#, fuzzy
msgid "greater than or equal to"
msgstr "इससे अधिक या बराबर"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
#, fuzzy
msgid "less than or equal to"
msgstr "से कम या बराबर"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
#, fuzzy
msgid ""
"Cannot apply rules on this element or section since there are not any value configured elements "
"on other sections, or no other sections found."
msgstr ""
"इस तत्व या अनुभाग पर नियम लागू नहीं किए जा सकते क्योंकि अन्य अनुभागों पर कोई मान कॉन्फ़िगर किए गए तत्व नहीं "
"हैं, या कोई अन्य अनुभाग नहीं मिला है."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr "कोई त्रुटि उत्पन्न हुई! इस तत्व पर शर्तें लागू नहीं कर सकता!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
#, fuzzy
msgid "Populate"
msgstr "बसना"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
#, fuzzy
msgid "Invalid file extension"
msgstr "अमान्य फ़ाइल एक्सटेंशन"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
#, fuzzy
msgid "Importing csv..."
msgstr "csv आयात करना..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
#, fuzzy
msgid "Saving... Please wait."
msgstr "बचत।।। कृपया प्रतीक्षा करो।"

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
#, fuzzy
msgid "Importing data"
msgstr "डेटा आयात करना"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
#, fuzzy
msgid "Edit price"
msgstr "मूल्य संपादित करें"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
#, fuzzy
msgid "Edit tab"
msgstr "टैब संपादित करें"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
#, fuzzy
msgid "Overwrite existing elements"
msgstr "मौजूदा तत्वों को अधिलेखित करें"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
#, fuzzy
msgid "Append new elements"
msgstr "नए तत्व जोड़ें"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
#, fuzzy
msgid "The form is being applied to all products"
msgstr "प्रपत्र सभी उत्पादों पर लागू किया जा रहा है"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
#, fuzzy
msgid "The form isn't being applied to any products"
msgstr "प्रपत्र किसी भी उत्पाद पर लागू नहीं किया जा रहा है"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
#, fuzzy
msgid "Loading ..."
msgstr "लोड।।।"

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "उत्पाद चर"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
msgid "Special variables"
msgstr "वैश्विक चर"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
#, fuzzy
msgid "Global variables"
msgstr "वैश्विक चर"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "कुल विकल्प दिखाएँ"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
msgid "Original product price + Options Total"
msgstr "मूल उत्पाद मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
msgid "Original product price + Cumulative Total"
msgstr "मूल उत्पाद मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
#, fuzzy
msgid "Product quantity"
msgstr "उत्पाद की मात्रा"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
#, fuzzy
msgid "Original product price"
msgstr "मूल उत्पाद मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
msgid "Dynamic product price"
msgstr "मूल उत्पाद मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
#, fuzzy
msgid "This element"
msgstr "यह तत्व"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
#, fuzzy
msgid "The value of this element"
msgstr "इस तत्व का मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
#, fuzzy
msgid "The value length of this element"
msgstr "इस तत्व की मान लंबाई"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
#, fuzzy
msgid "The number of options the user has selected"
msgstr "उपयोगकर्ता द्वारा चयनित विकल्पों की संख्या"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
#, fuzzy
msgid "The total quantity of this element"
msgstr "इस तत्व की कुल मात्रा"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
#, fuzzy
msgid "The quantity of this element"
msgstr "इस तत्व की मात्रा"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
#, fuzzy
msgid "Other elements"
msgstr "अन्य तत्व"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "लक्षित तत्व की कीमत"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "लक्षित तत्व का मान फ्लोट में परिवर्तित हो जाता है"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
#, fuzzy
msgid "Text"
msgstr "टेक्स्ट"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "लक्षित तत्व का कच्चा मूल्य"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
#, fuzzy
msgid "Text length"
msgstr "पाठ की लंबाई"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "लक्षित तत्व की पाठ लंबाई"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "लक्षित तत्व की कुल मात्रा"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
#, fuzzy
msgid "Count"
msgstr "गिनना"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr "लक्षित तत्व पर उपयोगकर्ता द्वारा चयनित विकल्पों की संख्या"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "सभी"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
#, fuzzy
msgid "Copy"
msgstr "प्रतिलिपि"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, fuzzy, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "मेरा <span class=\"count\">(%s)</span>"
msgstr[1] "मेरा <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, fuzzy, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "सभी <span class=\"count\">(%s)</span>"
msgstr[1] "सभी <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, fuzzy, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "चिपचिपा <span class=\"count\">(%s)</span>"
msgstr[1] "चिपचिपा <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "अमान्य CSV तालिका!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
#, fuzzy
msgid "An error has occurred!"
msgstr "कोई त्रुटि उत्पन्न हुई!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "मौजूदा तालिकाओं को अधिलेखित करें"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "टेबल ऊपर देखो"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "कोई CSV तालिका नहीं मिली!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "नीचे दिए गए बटन पर क्लिक करके एक आयात करें।"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
#, fuzzy
msgid "Table name"
msgstr "तालिका का नाम"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "तालिका अनुक्रमणिका"

#: admin/class-themecomplete-epo-admin-settings.php:273
#, fuzzy
msgid "EPO Control Panel"
msgstr "ईपीओ नियंत्रण कक्ष"

#: admin/class-themecomplete-epo-admin-settings.php:292
#, fuzzy
msgid "Extra Product Options Settings"
msgstr "अतिरिक्त उत्पाद विकल्प सेटिंग्स"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
#, fuzzy
msgid "Reset settings"
msgstr "सेटिंग्स रीसेट करें"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
#, fuzzy
msgid "Save changes"
msgstr "परिवर्तन सहेजें"

#: admin/views/html-tm-epo-admin-attributes.php:18 admin/views/html-tm-epo-admin-variations.php:17
#, fuzzy
msgid "Any"
msgstr "कोई"

#: admin/views/html-tm-epo-admin.php:40
#, fuzzy
msgid "Click to toggle"
msgstr "टॉगल करने के लिए क्लिक करें"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
#, fuzzy
msgid "Attribute:"
msgstr "गुण:"

#: admin/views/html-tm-epo-admin.php:53
#, fuzzy
msgid "Type:"
msgstr "प्रकार:"

#: admin/views/html-tm-epo-admin.php:56
#, fuzzy
msgid "Checkbox"
msgstr "चेकबॉक्स"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "चुनें"

#: admin/views/html-tm-epo-admin.php:62
#, fuzzy
msgid "Settings:"
msgstr "सेटिंग्स:"

#: admin/views/html-tm-epo-admin.php:86
#, fuzzy
msgid "Variation:"
msgstr "विभिन्नता:"

#: admin/views/html-tm-epo-admin.php:94
#, fuzzy
msgid "Price:"
msgstr "दाम:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
#, fuzzy
msgid "Custom price (required)"
msgstr "कस्टम मूल्य (आवश्यक)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
#, fuzzy
msgid "Custom price"
msgstr "कस्टम मूल्य"

#: admin/views/html-tm-epo-admin.php:148
#, fuzzy
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "विशेषताएँ अनुपलब्ध हैं. कृपया इस अतिरिक्त विकल्प को हटाएँ:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
#, fuzzy
msgid "Percent of the origιnal price"
msgstr "मूल्य का प्रतिशत"

#: admin/views/html-tm-epo-fields-edit.php:22
#, fuzzy
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27 admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29 admin/views/html-tm-epo-fields-edit.php:30
#, fuzzy
msgid "Form updated."
msgstr "प्रपत्र अद्यतन किया गया."

#: admin/views/html-tm-epo-fields-edit.php:32
#, fuzzy, php-format
msgid "Form restored to revision from %s"
msgstr "%s से संशोधन के लिए फॉर्म बहाल"

#: admin/views/html-tm-epo-fields-edit.php:33
#, fuzzy
msgid "Form published."
msgstr "प्रपत्र प्रकाशित."

#: admin/views/html-tm-epo-fields-edit.php:34
#, fuzzy
msgid "Form saved."
msgstr "प्रपत्र सहेजा गया."

#: admin/views/html-tm-epo-fields-edit.php:35
#, fuzzy
msgid "Form submitted."
msgstr "प्रपत्र सबमिट किया गया।"

#: admin/views/html-tm-epo-fields-edit.php:37
#, fuzzy, php-format
msgid "Form scheduled for: %s."
msgstr "फॉर्म के लिए निर्धारित: %s।"

#: admin/views/html-tm-epo-fields-edit.php:38
#, fuzzy
msgid "Form draft updated."
msgstr "प्रपत्र ड्राफ्ट अद्यतन किया गया."

#: admin/views/html-tm-epo-fields-edit.php:78
#, fuzzy
msgid "Enter title here"
msgstr "शीर्षक यहाँ दर्ज करें"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "पहले जैसा"

#: admin/views/html-tm-epo-order-item-header.php:24
#, fuzzy
msgid "Option"
msgstr "विकल्प"

#: admin/views/html-tm-epo-order-item-header.php:34
#, fuzzy
msgid "Cost"
msgstr "क़ीमत"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45 templates/products/template-quantity.php:112
msgid "Qty"
msgstr "मात्रा"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "कुल"

#: admin/views/html-tm-epo-order-item-header.php:45
#, fuzzy
msgid "Tax"
msgstr "कर"

#: admin/views/html-tm-epo-order-item.php:256
#, fuzzy
msgid "Edit item"
msgstr "आइटम संपादित करें"

#: admin/views/html-tm-epo-order-item.php:257
#, fuzzy
msgid "Delete item"
msgstr "आइटम हटाएँ"

#: admin/views/html-tm-epo.php:29
#, fuzzy
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on the Attributes tab."
msgstr "इस मोड में अतिरिक्त विकल्प जोड़ने से पहले, विशेषताटैब पर कुछ विशेषताएँ जोड़ें और सहेजें."

#: admin/views/html-tm-epo.php:33
#, fuzzy
msgid "Expand all"
msgstr "सभी का विस्तार करें"

#: admin/views/html-tm-epo.php:35
#, fuzzy
msgid "Close all"
msgstr "सभी बंद करें"

#: admin/views/html-tm-epo.php:106
#, fuzzy
msgid "Add Extra Option"
msgstr "अतिरिक्त विकल्प जोड़ें"

#: admin/views/html-tm-global-epo.php:50
#, fuzzy
msgid "Builder"
msgstr "बिल्डर"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "सामान्य"

#: admin/views/html-tm-global-epo.php:75
#, fuzzy
msgid "To translate the strings for the local options please use WPML interface."
msgstr "स्थानीय विकल्पों के लिए तारों का अनुवाद करने के लिए कृपया WPML इंटरफ़ेस का उपयोग करें।"

#: admin/views/html-tm-global-epo.php:110 admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "और से"

#: admin/views/html-tm-global-epo.php:114
#, fuzzy
msgid "Range"
msgstr "श्रेणी"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "मूल्य प्रदर्शन ओवरराइड"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid "This will replace the displayed product price on shop/archive/product loop pages."
msgstr "यह दुकान / संग्रह / उत्पाद लूप पृष्ठों पर प्रदर्शित उत्पाद मूल्य को प्रतिस्थापित करेगा।"

#: admin/views/html-tm-global-epo.php:132
#, fuzzy
msgid "Regular"
msgstr "नियमित"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "सेवा"

#: admin/views/html-tm-global-epo.php:158
#, fuzzy
msgid "Sale"
msgstr "बिक्री"

#: admin/views/html-tm-global-epo.php:177
#, fuzzy
msgid ""
"The forms you choose will be displayed alongside with the forms that the product already has."
msgstr "आपके द्वारा चुने गए प्रपत्र उन प्रपत्रों के साथ प्रदर्शित किए जाएँगे जो उत्पाद के पास पहले से हैं."

#: admin/views/html-tm-global-epo.php:206
#, fuzzy
msgid "Exclude from"
msgstr "से बाहर करें"

#: admin/views/html-tm-global-epo.php:207
#, fuzzy
msgid ""
"This will exclude any global forms assigned to this product except those defined in the "
"previous setting."
msgstr ""
"यह पिछली सेटिंग में परिभाषित किए गए रूपों को छोड़कर इस उत्पाद को असाइन किए गए किसी भी वैश्विक रूपों को बाहर "
"कर देगा।"

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
#, fuzzy
msgid "Override product price"
msgstr "उत्पाद मूल्य ओवरराइड करें"

#: admin/views/html-tm-global-epo.php:226
#, fuzzy
msgid ""
"This will override the product price with the price from the options if the total options price "
"is greater then zero."
msgstr "यह विकल्पों से कीमत के साथ उत्पाद की कीमत को ओवरराइड करेगा यदि कुल विकल्प मूल्य शून्य से अधिक है।"

#: admin/views/html-tm-global-epo.php:243
#, fuzzy
msgid "Override global display"
msgstr "वैश्विक प्रदर्शन को ओवरराइड करें"

#: admin/views/html-tm-global-epo.php:244
#, fuzzy
msgid "This will override the display method only for this product."
msgstr "यह केवल इस उत्पाद के लिए प्रदर्शन विधि को ओवरराइड करेगा।"

#: admin/views/html-tm-global-epo.php:252 admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320 admin/views/html-tm-global-epo.php:354
#, fuzzy
msgid "Use global setting"
msgstr "वैश्विक सेटिंग का उपयोग करें"

#: admin/views/html-tm-global-epo.php:256
#, fuzzy
msgid "Always show"
msgstr "हमेशा दिखाएं"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "केवल एक्शन हुक के साथ दिखाएँ"

#: admin/views/html-tm-global-epo.php:273
#, fuzzy
msgid "Override Final total box"
msgstr "अंतिम कुल बॉक्स ओवरराइड करें"

#: admin/views/html-tm-global-epo.php:274
#, fuzzy
msgid "This will override the totals box display only for this product."
msgstr "यह केवल इस उत्पाद के लिए टोटल बॉक्स डिस्प्ले को ओवरराइड करेगा।"

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
msgid "Disable if Options total is zero"
msgstr "यदि विकल्प कुल शून्य है तो अंतिम कुल बॉक्स छुपाएँ"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
msgid "Disable if total is zero"
msgstr "यदि कुल योग शून्य है तो अंतिम कुल बॉक्स छुपाएँ"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "कुल विकल्प दिखाएँ"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
msgid "This will override the Show Options Total setting only for this product."
msgstr "यह केवल इस उत्पाद के लिए प्रदर्शन विधि को ओवरराइड करेगा।"

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "दिखाएँ कि कुल योग कब शून्य से अधिक है"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "अंतिम योग दिखाएँ"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
msgid "This will Show Final Total setting only for this product."
msgstr "यह केवल इस उत्पाद के लिए प्रदर्शन विधि को ओवरराइड करेगा।"

#: admin/views/html-tm-global-epo.php:379 admin/views/html-tm-global-epo.php:401
#, fuzzy
msgid "Override enabled roles for this product"
msgstr "इस उत्पाद के लिए सक्षम भूमिकाओं को ओवरराइड करें"

#: admin/views/html-tm-global-epo.php:380 admin/views/html-tm-global-epo.php:402
#, fuzzy
msgid "This will override which roles can see the options for this product."
msgstr "यह ओवरराइड करेगा कि कौन सी भूमिकाएं इस उत्पाद के लिए विकल्प देख सकती हैं।"

#: includes/class-themecomplete-extra-product-options-setup.php:51
#, fuzzy
msgid "Cloning is forbidden."
msgstr "क्लोनिंग मना है।"

#: includes/class-themecomplete-extra-product-options-setup.php:60
#, fuzzy
msgid "Unserializing instances of this class is forbidden."
msgstr "इस वर्ग के अक्रमबद्ध उदाहरणों को निषिद्ध किया गया है।"

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
#, fuzzy
msgid "Free!"
msgstr "उचित!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, fuzzy, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s–%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, fuzzy, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s – %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
#, fuzzy
msgid "Select options"
msgstr "विकल्पों का चयन करें"

#: includes/class-themecomplete-extra-product-options.php:2300
#, fuzzy
msgid "Add to cart"
msgstr "कार्ट में डालें"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
#, fuzzy
msgid "Product element is not supported for components!"
msgstr "उत्पाद तत्व घटकों के लिए समर्थित नहीं है!"

#: includes/class-themecomplete-extra-product-options.php:4984
#, fuzzy
msgid "Product element is not supported within another product element!"
msgstr "उत्पाद तत्व किसी अन्य उत्पाद तत्व के भीतर समर्थित नहीं है!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "चेक बॉक्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
#, fuzzy
msgid "Color picker"
msgstr "रंग पिकर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "दिनांक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
#, fuzzy
msgid "Sunday"
msgstr "रविवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
#, fuzzy
msgid "Monday"
msgstr "सोमवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
#, fuzzy
msgid "Tuesday"
msgstr "मंगलवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
#, fuzzy
msgid "Wednesday"
msgstr "बुधवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
#, fuzzy
msgid "Thursday"
msgstr "गुरूवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
#, fuzzy
msgid "Friday"
msgstr "शुक्रवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
#, fuzzy
msgid "Saturday"
msgstr "शानिवार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
#, fuzzy
msgid "January "
msgstr "जनवरी "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
#, fuzzy
msgid "February"
msgstr "फ़रवरी"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
#, fuzzy
msgid "March"
msgstr "मार्च"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
#, fuzzy
msgid "April"
msgstr "अप्रैल"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
#, fuzzy
msgid "May"
msgstr "क्या मैं"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
#, fuzzy
msgid "June"
msgstr "जून"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
#, fuzzy
msgid "July"
msgstr "जुलाई"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
#, fuzzy
msgid "August"
msgstr "अगस्त"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
#, fuzzy
msgid "September"
msgstr "सितंबर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
#, fuzzy
msgid "October"
msgstr "अक्टूबर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
#, fuzzy
msgid "November"
msgstr "नवंबर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
#, fuzzy
msgid "December"
msgstr "दिसंबर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
#, fuzzy
msgid ""
"Enter a value to be applied to the field automatically according to your selected date format. "
"(Two digits for day, two digits for month and four digits for year)."
msgstr ""
"अपने चयनित दिनांक स्वरूप के अनुसार फ़ील्ड पर स्वचालित रूप से लागू होने के लिए मान दर्ज करें. (दिन के लिए दो अंक, "
"महीने के लिए दो अंक और वर्ष के लिए चार अंक)।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
#, fuzzy
msgid "Minimum selectable date"
msgstr "न्यूनतम चयन योग्य दिनांक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
#, fuzzy
msgid "A number of days from today."
msgstr "आज से कुछ दिनों बाद।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
#, fuzzy
msgid "Maximum selectable date"
msgstr "अधिकतम चयन योग्य दिनांक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
#, fuzzy
msgid "Disabled dates"
msgstr "अक्षम दिनांक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits for day, two digits "
"for month and four digits for year)"
msgstr ""
"अल्पविराम ने आपके चयनित दिनांक स्वरूप के अनुसार दिनांक ों को अलग किया. (दिन के लिए दो अंक, महीने के लिए दो अंक "
"और वर्ष के लिए चार अंक)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
#, fuzzy
msgid "Enabled dates"
msgstr "सक्षम किए गए दिनांक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits for day, two digits "
"for month and four digits for year). Please note that this will override any other setting!"
msgstr ""
"अल्पविराम ने आपके चयनित दिनांक स्वरूप के अनुसार दिनांक ों को अलग किया. (दिन के लिए दो अंक, महीने के लिए दो अंक "
"और वर्ष के लिए चार अंक)। कृपया ध्यान दें कि यह किसी भी अन्य सेटिंग को ओवरराइड करेगा!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
#, fuzzy
msgid "Epo White"
msgstr "एपो व्हाइट"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
#, fuzzy
msgid "Epo Black"
msgstr "एपो ब्लैक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
#, fuzzy
msgid "Theme"
msgstr "विषय"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
#, fuzzy
msgid "Select the theme for the datepicker."
msgstr "डेटपिकर के लिए थीम का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
#, fuzzy
msgid "Small"
msgstr "छोटा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
#, fuzzy
msgid "Medium"
msgstr "मध्यम"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "विशाल"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
#, fuzzy
msgid "Select the size of the datepicker."
msgstr "डेटपिकर के आकार का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
#, fuzzy
msgid "Top of screen"
msgstr "स्क्रीन के शीर्ष"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
#, fuzzy
msgid "Bottom of screen"
msgstr "स्क्रीन के नीचे"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
#, fuzzy
msgid "Position"
msgstr "पद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
#, fuzzy
msgid "Select the position of the datepicker."
msgstr "डेटपिकर की स्थिति का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
#, fuzzy
msgid "Exclude disabled"
msgstr "अक्षम लोगों को बाहर रखें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
#, fuzzy
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date will not count the "
"selected disabled weekdays."
msgstr ""
"इसे सक्षम करने से यह ऐसा हो जाएगा कि न्यूनतम और अधिकतम चयन योग्य दिनांक चयनित अक्षम कार्यदिवसों की गणना "
"नहीं करेगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
#, fuzzy
msgid "Disable weekdays"
msgstr "कार्यदिवसों को अक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
#, fuzzy
msgid "This allows you to disable all selected weekdays."
msgstr "यह आपको सभी चयनित कार्यदिवसों को अक्षम करने की अनुमति देता है।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
#, fuzzy
msgid "Disable months"
msgstr "महीनों को अक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
#, fuzzy
msgid "This allows you to disable all selected months."
msgstr "यह आपको सभी चयनित महीनों को अक्षम करने की अनुमति देता है।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
#, fuzzy
msgid "Translations"
msgstr "अनुवाद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
#, fuzzy
msgid "Day"
msgstr "दिन"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
#, fuzzy
msgid "Month"
msgstr "महीना"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
#, fuzzy
msgid "Year"
msgstr "साल"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
#, fuzzy
msgid "Divider"
msgstr "भाजक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
#, fuzzy
msgid "General Options"
msgstr "सामान्य विकल्प"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
#, fuzzy
msgid "Conditional Logic"
msgstr "सशर्त तर्क"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
#, fuzzy
msgid "CSS Settings"
msgstr "सीएसएस सेटिंग्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
#, fuzzy
msgid "Element class name"
msgstr "तत्व वर्ग का नाम"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
#, fuzzy
msgid "Enter an extra class name to add to this element"
msgstr "इस तत्व को जोड़ने के लिए एक अतिरिक्त वर्ग नाम दर्ज करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
msgid "Set native product price"
msgstr "उत्पाद मूल्य ओवरराइड करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
msgid "Change product weight"
msgstr "उत्पाद छवि परिवर्तित करता है"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
msgid "Action mode"
msgstr "अनुभाग आईडी"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
msgid "Choose the desired action mode for this element."
msgstr "इस तत्व पर शुल्क मूल्य प्रकार के लिए कर वर्ग चुनें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
msgid "Formula"
msgstr "गणित का सूत्र"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
msgid "Enter the formula for the calculation."
msgstr "हैंडल के लिए चरण दर्ज करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
msgid "Result Display Label"
msgstr "इस प्रकार प्रदर्शित करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
msgid "Enter the text to show next to the calculation result on the page."
msgstr "कैलेंडर पर बंद करें बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
msgid "Text before result"
msgstr "मूल्य से पहले पाठ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
msgid "Enter a text to display before the calculation result or leave it blank for no text."
msgstr ""
"इस फ़ील्ड के लिए मूल्य से पहले प्रदर्शित करने के लिए कोई पाठ दर्ज करें या बिना किसी पाठ के उसे रिक्त छोड़ दें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
msgid "Text after result"
msgstr "कीमत के बाद का पाठ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
msgid "Enter a text to display after the calculation result or leave it blank for no text."
msgstr ""
"इस फ़ील्ड के लिए मूल्य के बाद प्रदर्शित करने के लिए कोई पाठ दर्ज करें या बिना किसी पाठ के उसे रिक्त छोड़ दें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
#, fuzzy
msgid "Heading"
msgstr "शीर्षक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
#, fuzzy
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
#, fuzzy
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
#, fuzzy
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
#, fuzzy
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
#, fuzzy
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
#, fuzzy
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
#, fuzzy
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
#, fuzzy
msgid "span"
msgstr "बित्ता"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
#, fuzzy
msgid "Header type"
msgstr "शीर्ष लेख का प्रकार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
#, fuzzy
msgid "Header title"
msgstr "शीर्ष लेख शीर्षक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
msgid "Left of the Content"
msgstr "मैदान के बाईं ओर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
msgid "Right of the Content"
msgstr "मैदान का दाहिना हिस्सा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
#, fuzzy
msgid "Header position"
msgstr "शीर्ष लेख की स्थिति"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
#, fuzzy
msgid "Header color"
msgstr "शीर्ष लेख का रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
#, fuzzy
msgid "Leave empty for default value"
msgstr "डिफ़ॉल्ट मान के लिए खाली छोड़ दें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
#, fuzzy
msgid "Content"
msgstr "सन्तोष"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
#, fuzzy
msgid "Content color"
msgstr "सामग्री का रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
msgid "Above Header"
msgstr "उपरोक्त फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
#, fuzzy
msgid "Icon tooltip left"
msgstr "आइकन टूलटिप छोड़ दिया गया"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
#, fuzzy
msgid "Icon tooltip right"
msgstr "आइकन टूलटिप दाईं ओर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
#, fuzzy
msgid "Content position"
msgstr "सामग्री की स्थिति"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
msgid "Multiple Upload"
msgstr "एकाधिक बॉक्स का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "उत्पाद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
#, fuzzy
msgid "Single Product"
msgstr "एकल उत्पाद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
#, fuzzy
msgid "Select mode"
msgstr "मोड का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
#, fuzzy
msgid "Whether to include specific products or categories."
msgstr "चाहे विशिष्ट उत्पादों या श्रेणियों को शामिल करना हो।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
#, fuzzy
msgid "Search for a category ..."
msgstr "एक श्रेणी खोजें ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
#, fuzzy
msgid "Select categories"
msgstr "श्रेणियों का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
#, fuzzy
msgid "Add categories to include all their associated products."
msgstr "उनके सभी संबद्ध उत्पादों को शामिल करने के लिए श्रेणियाँ जोड़ें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
#, fuzzy
msgid "Search for a product ..."
msgstr "एक उत्पाद की खोज करें ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
#, fuzzy
msgid "Select products"
msgstr "उत्पादों का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
#, fuzzy
msgid "Add the products individually."
msgstr "उत्पादों को व्यक्तिगत रूप से जोड़ें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
#, fuzzy
msgid "Choose a value"
msgstr "कोई मान चुनें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
#, fuzzy
msgid "Base price"
msgstr "बेस प्राइस"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "आईडी"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "नाम"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
#, fuzzy
msgid "Menu Order"
msgstr "मेनू ऑर्डर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
#, fuzzy
msgid "Random"
msgstr "बेतरतीब"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
#, fuzzy
msgid "Order by"
msgstr "आदेश द्वारा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
#, fuzzy
msgid "Select the parameter which the products will be sorted by."
msgstr "उस पैरामीटर का चयन करें जिसके द्वारा उत्पादों को क्रमबद्ध किया जाएगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
#, fuzzy
msgid "Ascending"
msgstr "आरोही"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
#, fuzzy
msgid "Descending"
msgstr "अवरोही"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "आदेश"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
#, fuzzy
msgid "Select the sorting order of the products."
msgstr "उत्पादों के सॉर्टिंग क्रम का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
#, fuzzy
msgid "Select a product"
msgstr "किसी उत्पाद का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
#, fuzzy
msgid "Default product"
msgstr "डिफ़ॉल्ट उत्पाद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
#, fuzzy
msgid "Select the product that will be pre-selected."
msgstr "उस उत्पाद का चयन करें जो पूर्व-चयनित होगा."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
#, fuzzy
msgid "Dropdown"
msgstr "ड्रॉपडाउन"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
#, fuzzy
msgid "Thumbnails"
msgstr "थंबनेल"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
#, fuzzy
msgid "Thumbnails multiple"
msgstr "थंबनेल एकाधिक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
#, fuzzy
msgid "Layout mode"
msgstr "लेआउट मोड"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
#, fuzzy
msgid "Select how the products will be presented."
msgstr "चुनें कि उत्पादों को कैसे प्रस्तुत किया जाएगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
#, fuzzy
msgid "Dropdown Placeholder"
msgstr "ड्रॉपडाउन प्लेसहोल्डर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
#, fuzzy
msgid "Enter the placeholder for the dropdown."
msgstr "ड्रॉपडाउन के लिए प्लेसहोल्डर दर्ज करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
#, fuzzy
msgid "Minimum quantity"
msgstr "न्यूनतम मात्रा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
#, fuzzy
msgid "Maximum quantity"
msgstr "अधिकतम मात्रा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
#, fuzzy
msgid "Shipped individually"
msgstr "व्यक्तिगत रूप से भेज दिया गया"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
#, fuzzy
msgid "If this is enabled the included product is not shipped with the main product."
msgstr "यदि यह सक्षम है तो शामिल उत्पाद मुख्य उत्पाद के साथ नहीं भेजा जाता है।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
#, fuzzy
msgid "Maintain weight"
msgstr "वजन बनाए रखें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
#, fuzzy
msgid "If this is enabled the included product will add its weight to the main product."
msgstr "यदि यह सक्षम है तो शामिल उत्पाद मुख्य उत्पाद में अपना वजन जोड़ देगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
#, fuzzy
msgid "Priced individually"
msgstr "व्यक्तिगत रूप से कीमत"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
#, fuzzy
msgid "If this is enabled the included product will maintain its own price."
msgstr "यदि यह सक्षम है तो शामिल उत्पाद अपनी कीमत बनाए रखेगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
#, fuzzy
msgid "Percentage"
msgstr "प्रतिशतता"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
#, fuzzy
msgid "Discount type"
msgstr "छूट का प्रकार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
#, fuzzy
msgid ""
"Select the discount type. The discount applies to the final product price. If the product has "
"extra options then the discount applies to the amount after the options have been added to the "
"product price."
msgstr ""
"छूट प्रकार का चयन करें. छूट अंतिम उत्पाद मूल्य पर लागू होती है। यदि उत्पाद में अतिरिक्त विकल्प हैं तो छूट उत्पाद "
"मूल्य में विकल्प जोड़े जाने के बाद राशि पर लागू होती है।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Prisavslag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
#, fuzzy
msgid "Enter the discount amount."
msgstr "छूट राशि दर्ज करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "ऐडऑन अक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid "If this is enabled the included addons the associated product has will not be displayed."
msgstr "यदि यह सक्षम किया गया है, तो संबंधित उत्पाद में शामिल ऐडऑन प्रदर्शित नहीं किए जाएंगे।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "ऐडऑन की कीमतों को छूट से अलग करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid "If this is enabled the discount will not be applied to the product addons."
msgstr "यदि यह सक्षम है, तो छूट उत्पाद ऐडऑन पर लागू नहीं होगी।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
#, fuzzy
msgid "Cart"
msgstr "गाड़ी"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "चेकआउट"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "आदेश और ईमेल"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "उत्पाद में छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "उत्पाद को छिपाने के लिए कहाँ का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
#, fuzzy
msgid "Enable to show the image of the associated product."
msgstr "संबद्ध उत्पाद की छवि दिखाने के लिए सक्षम करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
#, fuzzy
msgid "Show title"
msgstr "शीर्षक दिखाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
#, fuzzy
msgid "Enable to show the title of the associated product."
msgstr "संबद्ध उत्पाद का शीर्षक दिखाने के लिए सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
msgid "Show title link"
msgstr "शीर्षक दिखाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
msgid "Enable to have the title link to the associated product."
msgstr "संबद्ध उत्पाद का शीर्षक दिखाने के लिए सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
#, fuzzy
msgid "Show price"
msgstr "मूल्य दिखाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
#, fuzzy
msgid "Enable to show the price of the associated product."
msgstr "संबंधित उत्पाद की कीमत दिखाने के लिए सक्षम करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
#, fuzzy
msgid "Enable to show the description of the associated product."
msgstr "संबंधित उत्पाद का वर्णन दिखाने के लिए सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
#, fuzzy
msgid "Show meta"
msgstr "मेटा दिखाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
#, fuzzy
msgid "Enable to show the meta of the associated product."
msgstr "संबद्ध उत्पाद का मेटा दिखाने के लिए सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
#, fuzzy
msgid "Advanced options"
msgstr "उन्नत विकल्प"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
#, fuzzy
msgid "Range picker"
msgstr "रेंज पिकर"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
#, fuzzy
msgid "Title options"
msgstr "शीर्षक विकल्प"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
#, fuzzy
msgid "Normal (clear)"
msgstr "सामान्य (स्पष्ट)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
#, fuzzy
msgid "Box"
msgstr "संदूक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
#, fuzzy
msgid "Expand and Collapse (start opened)"
msgstr "विस्तार और पतन (प्रारंभ खोला गया)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
#, fuzzy
msgid "Expand and Collapse (start closed)"
msgstr "विस्तार और पतन (बंद प्रारंभ करें)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "अकॉर्डियन"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
#, fuzzy
msgid "Section style"
msgstr "अनुभाग शैली"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
#, fuzzy
msgid "Select this section's display style."
msgstr "इस अनुभाग की प्रदर्शन शैली का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
#, fuzzy
msgid "Section background color"
msgstr "अनुभाग पृष्ठभूमि रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
#, fuzzy
msgid "Section label background color"
msgstr "अनुभाग लेबल पृष्ठभूमि रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
#, fuzzy
msgid "Section subtitle background color"
msgstr "अनुभाग उपशीर्षक पृष्ठभूमि रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
#, fuzzy
msgid "Before Local Options"
msgstr "स्थानीय विकल्पों से पहले"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
#, fuzzy
msgid "After Local Options"
msgstr "स्थानीय विकल्पों के बाद"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
#, fuzzy
msgid "Section placement"
msgstr "अनुभाग प्लेसमेंट"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
#, fuzzy
msgid "Select where this section will appear compared to local Options."
msgstr "चुनें कि स्थानीय विकल्पों की तुलना में यह अनुभाग कहाँ दिखाई देगा."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
#, fuzzy
msgid "Pop up"
msgstr "पॉप अप करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
#, fuzzy
msgid "Slider (wizard)"
msgstr "स्लाइडर (विज़ार्ड)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
#, fuzzy
msgid "Tabs"
msgstr "टैब्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
#, fuzzy
msgid "Section type"
msgstr "अनुभाग का प्रकार"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
#, fuzzy
msgid "Select this section's display type."
msgstr "इस अनुभाग के प्रदर्शन प्रकार का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
#, fuzzy
msgid "Text link"
msgstr "पाठ लिंक"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
#, fuzzy
msgid "Button"
msgstr "बटन"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
#, fuzzy
msgid "Button Alt"
msgstr "बटन Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
#, fuzzy
msgid "Section pop up button style"
msgstr "अनुभाग पॉप अप बटन शैली"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
#, fuzzy
msgid "Select this section's pop up button style."
msgstr "इस अनुभाग की पॉप अप बटन शैली का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
#, fuzzy
msgid "Section pop up button text"
msgstr "अनुभाग पॉप अप बटन पाठ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
#, fuzzy
msgid ""
"Enter a text to replace the default pop up button text. This will override the global value."
msgstr ""
"डिफ़ॉल्ट पॉप अप बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें. यह वैश्विक मूल्य को ओवरराइड करेगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
#, fuzzy
msgid "Section class name"
msgstr "अनुभाग वर्ग का नाम"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
#, fuzzy
msgid "Enter an extra class name to add to this section"
msgstr "इस अनुभाग में जोड़ने के लिए कोई अतिरिक्त वर्ग नाम दर्ज करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
#, fuzzy
msgid "Section Conditional Logic"
msgstr "अनुभाग सशर्त तर्क"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
#, fuzzy
msgid "Enable conditional logic for showing or hiding this section."
msgstr "इस अनुभाग को दिखाने या छिपाने के लिए सशर्त तर्क सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
#, fuzzy
msgid "Select Box"
msgstr "बॉक्स का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
#, fuzzy
msgid "This will count as an empty value in case the element is required."
msgstr "तत्व की आवश्यकता होने पर यह एक खाली मान के रूप में गिना जाएगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
#, fuzzy
msgid "Multi-Select Field"
msgstr "एकाधिक बॉक्स का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "खाका"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
#, fuzzy
msgid "Select a template ..."
msgstr "टेम्पलेट का चयन करें ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
#, fuzzy
msgid "Select template"
msgstr "टेम्पलेट का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
#, fuzzy
msgid "Add the template you want to display."
msgstr "वह टेम्पलेट जोड़ें जिसे आप प्रदर्शित करना चाहते हैं."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
#, fuzzy
msgid "Text Area"
msgstr "पाठ क्षेत्र"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
#, fuzzy
msgid "Text Field"
msgstr "पाठ फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
msgid "Enter the step."
msgstr "मात्रा चरण दर्ज करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "समय"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
#, fuzzy
msgid "System style"
msgstr "सिस्टम शैली"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
#, fuzzy
msgid "Custom style"
msgstr "कस्टम शैली"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
#, fuzzy
msgid "Time picker style"
msgstr "समय चुनने की शैली"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
#, fuzzy
msgid "Minimum selectable time"
msgstr "न्यूनतम चयन योग्य समय"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
#, fuzzy
msgid "Enter the time the following format: 8:00 am"
msgstr "निम्न स्वरूप में समय दर्ज करें: 8:00 am"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
#, fuzzy
msgid "Maximum selectable time"
msgstr "अधिकतम चयन योग्य समय"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
#, fuzzy
msgid "Select the theme for the timepicker."
msgstr "टाइमपिकर के लिए थीम का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
#, fuzzy
msgid "Select the size of the timepicker."
msgstr "टाइमपिकर के आकार का चयन करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
#, fuzzy
msgid "Select the position of the timepicker."
msgstr "टाइमपिकर की स्थिति का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
#, fuzzy
msgid "Hour"
msgstr "घंटा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
#, fuzzy
msgid "Minute"
msgstr "मिनट"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
#, fuzzy
msgid "Second"
msgstr "दूसरा"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "अपलोड"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
#, fuzzy
msgid "Variations"
msgstr "बदलाव"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
#, fuzzy
msgid "Element Conditional Logic"
msgstr "तत्व सशर्त तर्क"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
#, fuzzy
msgid "Enable conditional logic for showing or hiding this element."
msgstr "इस तत्व को दिखाने या छिपाने के लिए सशर्त तर्क सक्षम करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
#, fuzzy
msgid "label"
msgstr "लेबल"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
#, fuzzy
msgid "Label type"
msgstr "लेबल का प्रकार"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
#, fuzzy
msgid "Label"
msgstr "लेबल"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
msgid "Label view mode"
msgstr "मोड का चयन करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above the fields"
msgstr "उपरोक्त फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above field"
msgstr "उपरोक्त फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the fields"
msgstr "मैदान के बाईं ओर"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the field"
msgstr "मैदान के बाईं ओर"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the fields"
msgstr "मैदान का दाहिना हिस्सा"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the field"
msgstr "मैदान का दाहिना हिस्सा"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
#, fuzzy
msgid "Label position"
msgstr "लेबल की स्थिति"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
#, fuzzy
msgid "Label color"
msgstr "रंग लेबल करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
#, fuzzy
msgid "Subtitle"
msgstr "उपशीर्षक"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below the fields"
msgstr "नीचे फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below field"
msgstr "नीचे फ़ील्ड"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
#, fuzzy
msgid "Subtitle position"
msgstr "उपशीर्षक की स्थिति"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
#, fuzzy
msgid "Subtitle color"
msgstr "उपशीर्षक का रंग"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
#, fuzzy
msgid "Horizontal rule"
msgstr "क्षैतिज नियम"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
#, fuzzy
msgid "Padding"
msgstr "गद्दी"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
#, fuzzy
msgid "Divider type"
msgstr "विभाजक का प्रकार"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
#, fuzzy
msgid "Label Options"
msgstr "लेबल विकल्प"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
#, fuzzy
msgid "Element container id"
msgstr "Element container id"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
#, fuzzy
msgid "Enter an id for the container of the element."
msgstr "तत्व के कंटेनर के लिए एक आईडी दर्ज करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
#, fuzzy
msgid "Inherit product setting"
msgstr "उत्पाद सेटिंग विरासत में प्राप्त करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
#, fuzzy
msgid "Include tax for Fee price type"
msgstr "शुल्क मूल्य प्रकार के लिए कर शामिल करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
#, fuzzy
msgid "Choose whether to include tax for Fee price type on this element."
msgstr "चुनें कि इस तत्व पर शुल्क मूल्य प्रकार के लिए कर शामिल करना है या नहीं।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
#, fuzzy
msgid "Tax class for Fee price type"
msgstr "शुल्क मूल्य प्रकार के लिए कर वर्ग"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
#, fuzzy
msgid "Choose the tax class for Fee price type on this element."
msgstr "इस तत्व पर शुल्क मूल्य प्रकार के लिए कर वर्ग चुनें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
#, fuzzy
msgid "Hide element label in cart"
msgstr "कार्ट में तत्व लेबल छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
#, fuzzy
msgid "Choose whether to hide the element label in the cart or not."
msgstr "चुनें कि कार्ट में तत्व लेबल छिपाना है या नहीं।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
#, fuzzy
msgid "No, but hide price"
msgstr "नहीं, लेकिन कीमत छिपाएं"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
#, fuzzy
msgid "Yes, but show price"
msgstr "हाँ, लेकिन कीमत दिखाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
#, fuzzy
msgid "Hide element value in cart"
msgstr "कार्ट में तत्व मान छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
#, fuzzy
msgid "Choose whether to hide the element value in the cart or not."
msgstr "चुनें कि कार्ट में तत्व मान छिपाना है या नहीं."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
#, fuzzy
msgid "Hide element label in order"
msgstr "तत्व लेबल को क्रम में छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
#, fuzzy
msgid "Choose whether to hide the element label in the order or not."
msgstr "चुनें कि तत्व लेबल को क्रम में छिपाना है या नहीं।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
#, fuzzy
msgid "Hide element value in order"
msgstr "तत्व मान को क्रम में छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
#, fuzzy
msgid "Choose whether to hide the element value in the order or not."
msgstr "चुनें कि तत्व मान को क्रम में छिपाना है या नहीं."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "फ़्लोटिंग टोटल बॉक्स में तत्व लेबल छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
#, fuzzy
msgid "Choose whether to hide the element label in the floating totals box or not."
msgstr "चुनें कि फ़्लोटिंग टोटल बॉक्स में तत्व लेबल छिपाना है या नहीं।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
#, fuzzy
msgid "Hide element value in floating totals box"
msgstr "फ़्लोटिंग टोटल बॉक्स में तत्व मान छुपाएँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
#, fuzzy
msgid "Choose whether to hide the element value in the floating totals box or not."
msgstr "चुनें कि फ़्लोटिंग टोटल बॉक्स में तत्व मान छिपाना है या नहीं।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
#, fuzzy
msgid "WooCommerce Settings"
msgstr "WooCommerce सेटिंग्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
#, fuzzy
msgid "Enable repeater"
msgstr "पुनरावर्तक सक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
#, fuzzy
msgid "This will make this element repeatable."
msgstr "यह इस तत्व को दोहराने योग्य बना देगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
#, fuzzy
msgid "Bind repeater with product quantity"
msgstr "उत्पाद मात्रा के साथ बाइंड रिपीटर"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
#, fuzzy
msgid "This will make this element repeatable based on the product quantity."
msgstr "यह उत्पाद मात्रा के आधार पर इस तत्व को दोहराने योग्य बना देगा।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
#, fuzzy
msgid "Repeater minimum limit"
msgstr "पुनरावर्तक न्यूनतम सीमा"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
#, fuzzy
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr "पुनरावर्तक फ़ील्ड के लिए उपयोगकर्ता द्वारा जोड़ी जा सकने वाली पंक्तियों की न्यूनतम संख्या सेट करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
#, fuzzy
msgid "Repeater maximum limit"
msgstr "पुनरावर्तक अधिकतम सीमा"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
#, fuzzy
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr "पुनरावर्तक फ़ील्ड के लिए उपयोगकर्ता द्वारा जोड़ी जा सकने वाली पंक्तियों की अधिकतम संख्या सेट करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
#, fuzzy
msgid "Repeater Button Label"
msgstr "पुनरावर्तक बटन लेबल"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
#, fuzzy
msgid "Leave this blank for the default label."
msgstr "इसे डिफ़ॉल्ट लेबल के लिए रिक्त छोड़ दें."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "रेडियो बटन कनेक्टर ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr "विभिन्न रेडियो बटन तत्वों को कनेक्ट करने के लिए एक कस्टम ID दर्ज करें."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
#, fuzzy
msgid "Repeater Settings"
msgstr "पुनरावर्तक सेटिंग्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, fuzzy, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "सभी &quot;%s&quot; विधि इंस्टेंस"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, fuzzy, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (उदाहरण आईडी: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, fuzzy, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s – %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
#, fuzzy
msgid "Flat Rates (Legacy)"
msgstr "फ्लैट दरें (विरासत)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
#, fuzzy
msgid "(Legacy)"
msgstr "(विरासत)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "शिपिंग विधियों का चयन करें ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "शिपिंग विधियाँ सक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "सक्षम करने के लिए शिपिंग विधियों का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "शिपिंग विधियों की स्थिति सक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of the current field. "
"If the conditions are met, the selected shipping methods will be available for customers to "
"choose during checkout."
msgstr ""
"वर्तमान फ़ील्ड के मान के आधार पर शिपिंग विधियों को सक्षम करने के लिए शर्तें निर्दिष्ट करें। यदि शर्तें पूरी हो जाती "
"हैं, तो चयनित शिपिंग विधियां ग्राहकों को चेकआउट के दौरान चुनने के लिए उपलब्ध होंगी।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
#, fuzzy
msgid "Disable Shipping Methods"
msgstr "शिपिंग विधियों को अक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "अक्षम करने के लिए शिपिंग विधियों का चयन करें।"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "शिपिंग विधियों की स्थिति अक्षम करें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of the current field. "
"If the conditions are met, the selected shipping methods will not be available for customers to "
"choose during checkout."
msgstr ""
"वर्तमान फ़ील्ड के मान के आधार पर शिपिंग विधियों को अक्षम करने के लिए शर्तें निर्दिष्ट करें। यदि शर्तें पूरी हो जाती "
"हैं, तो चयनित शिपिंग विधियाँ ग्राहकों को चेकआउट के दौरान चुनने के लिए उपलब्ध नहीं होंगी."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "कार्रवाइयाँ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "सामान्य सेटिंग्स"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
#, fuzzy
msgid "Inherit product tax class"
msgstr "उत्पाद कर वर्ग विरासत में"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
#, fuzzy
msgid "Standard"
msgstr "मानक"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "%s मूल्य से स्वचालित रूप से गणना करने के लिए इसे खाली छोड़ दें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr "%s बिक्री मूल्य से स्वचालित रूप से गणना करने के लिए इसे खाली छोड़ दें"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "यदि निम्न शर्तें पूरी की जाती हैं तो यह अनुभाग."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "यदि निम्न शर्तें पूरी होती हैं तो यह फ़ील्ड."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "नई शर्त समूह जोड़ें"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "&quot;%1$s&quot; की मात्रा %2$d से कम नहीं हो सकती है।"

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "&quot;%1$s&quot; की मात्रा %2$d से अधिक नहीं हो सकती है।"

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr "&quot;%1$s&quot; की मात्रा %2$d के गुणकों में दर्ज की जानी चाहिए।"

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, fuzzy, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s अपने सभी संबंधित उत्पादों के साथ हटा दिया गया है!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid "The item %s was removed from the cart because it had changed since it was added."
msgstr "आइटम %s कार्ट से निकाल दिया गया था क्योंकि इसे जोड़े जाने के बाद से यह बदल गया था."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
#, fuzzy
msgid "You cannot add negative priced products to the cart."
msgstr "आप कार्ट में नकारात्मक मूल्य वाले उत्पाद नहीं जोड़ सकते."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
#, fuzzy
msgid "You cannot add zero priced products to the cart."
msgstr "आप कार्ट में शून्य मूल्य वाले उत्पाद नहीं जोड़ सकते."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
#, fuzzy
msgid "Additional options"
msgstr "अतिरिक्त विकल्प"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, fuzzy, php-format
msgid "\"%s\" is a required field."
msgstr "\"%s\" एक आवश्यक फ़ील्ड है।"

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, fuzzy, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You can add it back to "
"your cart %2$s."
msgstr ""
"%1$s आपकी गाड़ी से निकाल दिया गया है क्योंकि तब से इसे संशोधित किया गया है. आप इसे अपने कार्ट %2$s में वापस "
"जोड़ सकते हैं।"

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, fuzzy
msgid "here"
msgstr "यहाँ"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
#, fuzzy
msgid "Extra fee"
msgstr "अतिरिक्त शुल्क"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
#, fuzzy
msgid "Empty cart"
msgstr "खाली गाड़ी"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
#, fuzzy
msgid "Edit options"
msgstr "विकल्प संपादित करें"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
#, fuzzy
msgid "Update cart"
msgstr "कार्ट अद्यतन करें"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, fuzzy, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "\"%s\""

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, fuzzy, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "%s अपडेट कर दिया गया है।"
msgstr[1] "%s अपडेट कर दिया गया है।"

#: includes/classes/class-themecomplete-epo-cart.php:4085
#, fuzzy
msgid "View cart"
msgstr "कार्ट देखें"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid "Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or later."
msgstr ""
"WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन के लिए वर्डप्रेस %s या बाद के संस्करण की आवश्यकता होती है।"

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra Checkout Options %s "
"or later!."
msgstr ""
"WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन के लिए WooCommerce अतिरिक्त चेकआउट विकल्प %s या बाद "
"के संस्करण की आवश्यकता होती है!"

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
#, fuzzy
msgid "The installed version is"
msgstr "स्थापित संस्करण है"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please "
"update to the latest version."
msgstr ""
"%1$s महत्वपूर्ण:%2$s WooCommerce अतिरिक्त चेकआउट विकल्प का आपका संस्करण समर्थित नहीं है। कृपया नवीनतम संस्करण "
"के लिए अद्यतन करें."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been deactivated because "
"it is not compatible with the current version of Extra Checkout Options."
msgstr ""
"%1$s महत्वपूर्ण: WooCommerce के लिए %2$s अतिरिक्त उत्पाद विकल्प और ऐड-ऑन निष्क्रिय कर दिए गए हैं क्योंकि यह "
"अतिरिक्त चेकआउट विकल्पों के वर्तमान संस्करण के साथ संगत नहीं है।"

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload has been "
"deactivated because its functionality is included in the main plugin."
msgstr ""
"%1$s महत्वपूर्ण: WooCommerce के लिए %2$s अतिरिक्त उत्पाद विकल्प और ऐड-ऑन निष्क्रिय कर दिए गए हैं क्योंकि यह "
"अतिरिक्त चेकआउट विकल्पों के वर्तमान संस्करण के साथ संगत नहीं है।"

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product Options & Add-Ons "
"for WooCommerce."
msgstr ""
"%1$s महत्वपूर्ण: %2$s कृपया WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन का उपयोग करने से पहले "
"WooCommerce अपडेटर चलाएं।"

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires %3$sWooCommerce%4$s "
"%5$s or later."
msgstr ""
"%1$s महत्वपूर्ण: WooCommerce के लिए %2$s अतिरिक्त उत्पाद विकल्प और ऐड-ऑन के लिए %3$sWooCommerce%4$s "
"%5$s या बाद में आवश्यक है।"

#: includes/classes/class-themecomplete-epo-check-base.php:321
#, fuzzy
msgid "Run the updater"
msgstr "अद्यतनकर्ता चलाएँ"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires WordPress %3$s or "
"later."
msgstr ""
"%1$s महत्वपूर्ण: %2$s WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन के लिए वर्डप्रेस %3$s या बाद के "
"संस्करण की आवश्यकता होती है।"

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires PHP version %3$s or "
"later."
msgstr ""
"%1$s महत्वपूर्ण:%2$s WooCommerce के लिए अतिरिक्त उत्पाद विकल्प और ऐड-ऑन के लिए PHP संस्करण %3$s या बाद के "
"संस्करण की आवश्यकता है।"

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
#, fuzzy
msgid "Filename"
msgstr "फ़ाइलनाम"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "हटाएं"

#: includes/classes/class-themecomplete-epo-post-types.php:75
#, fuzzy
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "टीएम अतिरिक्त उत्पाद विकल्प"

#: includes/classes/class-themecomplete-epo-post-types.php:101
#, fuzzy
msgid "Global Forms"
msgstr "वैश्विक रूप"

#: includes/classes/class-themecomplete-epo-post-types.php:102
#, fuzzy
msgid "Global Form"
msgstr "वैश्विक रूप"

#: includes/classes/class-themecomplete-epo-post-types.php:103
#, fuzzy
msgctxt "post type general name"
msgid "Global Forms"
msgstr "वैश्विक रूप"

#: includes/classes/class-themecomplete-epo-post-types.php:104
#, fuzzy
msgid "Add Global Form"
msgstr "वैश्विक प्रपत्र जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:105
#, fuzzy
msgid "Add New Global Form"
msgstr "नया वैश्विक प्रपत्र जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "संपादित करें"

#: includes/classes/class-themecomplete-epo-post-types.php:107
#, fuzzy
msgid "Edit Global Form"
msgstr "वैश्विक प्रपत्र संपादित करें"

#: includes/classes/class-themecomplete-epo-post-types.php:108
#, fuzzy
msgid "New Global Form"
msgstr "नया वैश्विक रूप"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
#, fuzzy
msgid "View Global Form"
msgstr "वैश्विक रूप देखें"

#: includes/classes/class-themecomplete-epo-post-types.php:111
#, fuzzy
msgid "Search Global Form"
msgstr "वैश्विक प्रपत्र खोजें"

#: includes/classes/class-themecomplete-epo-post-types.php:112
#, fuzzy
msgid "No Global Form found"
msgstr "कोई वैश्विक रूप नहीं मिला"

#: includes/classes/class-themecomplete-epo-post-types.php:113
#, fuzzy
msgid "No Global Form found in trash"
msgstr "कचरे में कोई वैश्विक रूप नहीं मिला"

#: includes/classes/class-themecomplete-epo-post-types.php:114
#, fuzzy
msgid "Parent Global Form"
msgstr "पैरेंट ग्लोबल फॉर्म"

#: includes/classes/class-themecomplete-epo-post-types.php:116
#, fuzzy
msgid "This is where you can add new global options to your store."
msgstr "यह वह जगह है जहां आप अपने स्टोर में नए वैश्विक विकल्प जोड़ सकते हैं।"

#: includes/classes/class-themecomplete-epo-post-types.php:156
#, fuzzy
msgid "Option Templates"
msgstr "विकल्प टेम्पलेट्स"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "विकल्प टेम्पलेट"

#: includes/classes/class-themecomplete-epo-post-types.php:158
#, fuzzy
msgctxt "post type general name"
msgid "Option Templates"
msgstr "विकल्प टेम्पलेट्स"

#: includes/classes/class-themecomplete-epo-post-types.php:159
#, fuzzy
msgid "Add Template"
msgstr "टेम्पलेट जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:160
#, fuzzy
msgid "Add New Template"
msgstr "नया टेम्पलेट जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:162
#, fuzzy
msgid "Edit Template"
msgstr "टेम्पलेट संपादित करें"

#: includes/classes/class-themecomplete-epo-post-types.php:163
#, fuzzy
msgid "New Template"
msgstr "नया टेम्पलेट"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
#, fuzzy
msgid "View Template"
msgstr "टेम्पलेट देखें"

#: includes/classes/class-themecomplete-epo-post-types.php:166
#, fuzzy
msgid "Search Template"
msgstr "खोज टेम्पलेट"

#: includes/classes/class-themecomplete-epo-post-types.php:167
#, fuzzy
msgid "No Template found"
msgstr "कोई टेम्पलेट नहीं मिला"

#: includes/classes/class-themecomplete-epo-post-types.php:168
#, fuzzy
msgid "No Template found in trash"
msgstr "कूड़ेदान में कोई टेम्पलेट नहीं मिला"

#: includes/classes/class-themecomplete-epo-post-types.php:169
#, fuzzy
msgid "Parent Template"
msgstr "पैरेंट टेम्पलेट"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "यह वह जगह है जहां आप नए वैश्विक टेम्पलेट विकल्प जोड़ सकते हैं।"

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "लुकअप तालिकाएँ"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "लुकअप तालिकाएँ"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "लुकअप तालिका जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "नई लुकअप तालिका जोड़ें"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "लुकअप तालिका संपादित करें"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "नई लुकअप तालिका"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "लुकअप तालिका देखें"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "खोज लुकअप तालिका"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "कोई लुकअप तालिका नहीं मिली"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "कचरे में कोई लुकअप टेबल नहीं मिली"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "पैरेंट लुकअप तालिका"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "यह वह जगह है जहां आप नए लुकअप टेबल जोड़ सकते हैं।"

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
#, fuzzy
msgid "Unit price"
msgstr "यूनिट मूल्य"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
#, fuzzy
msgid "Options amount"
msgstr "विकल्प राशि"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "विकल्प वैट राशि"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
#, fuzzy
msgid "Fees amount"
msgstr "फीस की राशि"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
#, fuzzy
msgid "Final total"
msgstr "अंतिम योग"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
#, fuzzy
msgid "Prev"
msgstr "पीछे"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "अगला"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
#, fuzzy
msgid "characters remaining"
msgstr "शेष वर्ण"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
#, fuzzy
msgid "Uploading files"
msgstr "फ़ाइलें अपलोड करना"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
#, fuzzy
msgid "Your files are being uploaded"
msgstr "आपकी फ़ाइलें अपलोड की जा रही हैं"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
#, fuzzy
msgid "file"
msgstr "रेती"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
#, fuzzy
msgid "files"
msgstr "फ़ाइलें"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "एह् खेतर लोड़चदा ऐ!."

#: includes/classes/class-themecomplete-epo-scripts.php:576
#, fuzzy
msgid "Please enter a valid email address."
msgstr "कृपया कोई मान्य ईमेल पता दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:577
#, fuzzy
msgid "Please enter a valid URL."
msgstr "कृपया कोई मान्य URL दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:578
#, fuzzy
msgid "Please enter a valid number."
msgstr "कृपया कोई मान्य संख्या दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:579
#, fuzzy
msgid "Please enter only digits."
msgstr "कृपया केवल अंक दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:580
#, fuzzy
msgid "Please enter a value less than or equal to {0}."
msgstr "कृपया {0} से कम या उसके बराबर मान दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:581
#, fuzzy
msgid "Please enter a value greater than or equal to {0}."
msgstr "कृपया {0} से बड़ा या बराबर मान दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:582
#, fuzzy
msgid "Please enter no more than {0} character."
msgstr "कृपया {0} से अधिक वर्ण दर्ज न करें."

#: includes/classes/class-themecomplete-epo-scripts.php:583
#, fuzzy
msgid "Please enter no more than {0} characters."
msgstr "कृपया {0} से अधिक वर्ण दर्ज न करें."

#: includes/classes/class-themecomplete-epo-scripts.php:584
#, fuzzy
msgid "Please enter at least {0} character."
msgstr "कृपया कम से कम {0} वर्ण दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:585
#, fuzzy
msgid "Please enter at least {0} characters."
msgstr "कृपया कम से कम {0} वर्ण दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:586
#, fuzzy
msgid "Please select up to {0} choice."
msgstr "कृपया {0} विकल्प तक का चयन करें."

#: includes/classes/class-themecomplete-epo-scripts.php:587
#, fuzzy
msgid "Please select up to {0} choices."
msgstr "कृपया {0} विकल्पों का चयन करें."

#: includes/classes/class-themecomplete-epo-scripts.php:588
#, fuzzy
msgid "Please select exactly {0} choice."
msgstr "कृपया बिल्कुल {0} विकल्प का चयन करें।"

#: includes/classes/class-themecomplete-epo-scripts.php:589
#, fuzzy
msgid "Please select exactly {0} choices."
msgstr "कृपया बिल्कुल {0} विकल्पों का चयन करें।"

#: includes/classes/class-themecomplete-epo-scripts.php:590
#, fuzzy
msgid "Please select at least {0} choice."
msgstr "कृपया कम से कम {0} विकल्प का चयन करें."

#: includes/classes/class-themecomplete-epo-scripts.php:591
#, fuzzy
msgid "Please select at least {0} choices."
msgstr "कृपया कम से कम {0} विकल्पों का चयन करें."

#: includes/classes/class-themecomplete-epo-scripts.php:592
#, fuzzy
msgid "Please enter a multiple of {0}."
msgstr "कृपया {0} का गुणक दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:593
#, fuzzy
msgid "Please enter only letters."
msgstr "कृपया केवल पत्र दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:594
#, fuzzy
msgid "Please enter only letters or spaces."
msgstr "कृपया केवल पत्र या रिक्तियाँ दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:595
#, fuzzy
msgid "Please enter only letters, numbers or hyphens."
msgstr "कृपया केवल अक्षर, संख्या या रेखांकन दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:596
#, fuzzy
msgid "Please enter only unicode letters and numbers."
msgstr "कृपया केवल यूनिकोड अक्षर और संख्याएँ दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:597
#, fuzzy
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "कृपया केवल यूनिकोड अक्षर, संख्याएँ या रिक्तियाँ दर्ज करें."

#: includes/classes/class-themecomplete-epo-scripts.php:598
#, fuzzy
msgid "Minimum number of rows is {0}"
msgstr "पंक्तियों की न्यूनतम संख्या {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
#, fuzzy
msgid "Maximum number of rows is {0}"
msgstr "पंक्तियों की अधिकतम संख्या {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "किया हुआ"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
#, fuzzy
msgid "Today"
msgstr "आज"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "सामान्य"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "डिस्प्ले"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
#, fuzzy
msgid "Strings"
msgstr "तार"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "शैली"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "वैश्विक"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
#, fuzzy
msgid "Elements"
msgstr "तत्वों"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
#, fuzzy
msgid "Upload manager"
msgstr "प्रबंधक अपलोड करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
#, fuzzy
msgid "Custom code"
msgstr "कस्टम कोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "गणित सूत्र स्थिरांक"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
#, fuzzy
msgid "License"
msgstr "लाइसेंस"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
msgid "Shop order (HPOS)"
msgstr "दुकान का आदेश"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
#, fuzzy
msgid "Shop order"
msgstr "दुकान का आदेश"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
#, fuzzy
msgid "Initialization"
msgstr "प्रारंभ"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
#, fuzzy
msgid "Final total box"
msgstr "अंतिम कुल बॉक्स"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
#, fuzzy
msgid "Various"
msgstr "विविध"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
msgid "Enable Frontend Access for Selected Roles"
msgstr "भूमिकाओं के लिए फ़्रंट-एंड सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
#, fuzzy
msgid "Select the roles that will have access to the extra options."
msgstr "उन भूमिकाओं का चयन करें जिनके पास अतिरिक्त विकल्पों तक पहुंच होगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
msgid "Disable Frontend Access for Selected Roles"
msgstr "भूमिकाओं के लिए फ़्रंट-एंड अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
#, fuzzy
msgid "Select the roles that will not have access to the extra options."
msgstr "उन भूमिकाओं का चयन करें जिनके पास अतिरिक्त विकल्पों तक पहुँच नहीं होगी."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
#, fuzzy
msgid "Enable translations"
msgstr "अनुवाद सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr "यह पॉट फ़ाइलों का उपयोग करके डिफ़ॉल्ट प्लगइन अनुवाद को सक्षम करेगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "पोस्ट प्रकार हुक प्राथमिकता"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the priority which the "
"post types are loaded by the plugin."
msgstr ""
"इसे तब तक न बदलें जब तक आप नहीं जानते कि यह आपकी साइट को कैसे प्रभावित करेगा! यह प्राथमिकता है कि पोस्ट "
"प्रकार प्लगइन द्वारा लोड किए जाते हैं।"

#: includes/classes/class-themecomplete-epo-settings-base.php:282
#, fuzzy
msgid "Default value is 100"
msgstr "डिफ़ॉल्ट मान 100 है"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
msgid "Specify the areas where the plugin will be activated."
msgstr "उस पैरामीटर का चयन करें जिसके द्वारा उत्पादों को क्रमबद्ध किया जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
msgid "Everywhere"
msgstr "सभी"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
msgid "Product Categories"
msgstr "उत्पाद और श्रेणियाँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "उत्पाद चर"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
msgid "Product Tags"
msgstr "उत्पाद पृष्ठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "अंतिम कुल बॉक्स"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, allowing customers to "
"view the total cost of their order, or disable it for a simplified product page."
msgstr ""
"उत्पाद पृष्ठ पर अंतिम कुल बॉक्स प्रदर्शित करने के लिए इस सेटिंग को सक्षम करें, जिससे ग्राहक अपने ऑर्डर की कुल लागत "
"देख सकें, या इसे सरलीकृत उत्पाद पृष्ठ के लिए अक्षम कर सकें."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "कुल विकल्प दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr "चयनित उत्पाद विकल्पों के लिए विशेष रूप से कुल प्रदर्शित करने में सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "अंतिम योग दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with a clear overview of "
"the overall cost."
msgstr "ग्राहकों को समग्र लागत का स्पष्ट अवलोकन प्रदान करते हुए, संपूर्ण उत्पाद को प्रदर्शित करने में सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:353
#, fuzzy
msgid "Enable Final total box for all products"
msgstr "सभी उत्पादों के लिए अंतिम कुल बॉक्स सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
#, fuzzy
msgid "Show the Final total box even when the product has no extra options"
msgstr "उत्पाद के पास कोई अतिरिक्त विकल्प न होने पर भी अंतिम कुल बॉक्स दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
#, fuzzy
msgid "Enable original final total display"
msgstr "मूल अंतिम कुल प्रदर्शन सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
#, fuzzy
msgid "Check to enable the display of the undiscounted final total"
msgstr "बिना छूट वाले अंतिम कुल के प्रदर्शन को सक्षम करने के लिए जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "VAT प्रदर्शन विकल्प सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr "विकल्पों की कुल संख्या के ऊपर विकल्प VAT राशि प्रदर्शित करने के लिए जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
#, fuzzy
msgid "Show Unit price on totals box"
msgstr "कुल बॉक्स पर इकाई मूल्य दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
#, fuzzy
msgid "Enable this to display the unit price when the totals box is visible"
msgstr "जब कुल बॉक्स दिखाई दे तो इकाई मूल्य प्रदर्शित करने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
#, fuzzy
msgid "Include Fees on unit price"
msgstr "इकाई मूल्य पर शुल्क शामिल करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
#, fuzzy
msgid "Enable this to add any Fees to the unit price"
msgstr "इकाई मूल्य में कोई भी शुल्क जोड़ने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
#, fuzzy
msgid "Total price as Unit Price"
msgstr "इकाई मूल्य के रूप में कुल मूल्य"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
#, fuzzy
msgid "Make the total price not being multiplied by the product quantity"
msgstr "कुल मूल्य को उत्पाद मात्रा से गुणा न करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "अंतिम कुल बॉक्स को तब तक छुपाएँ जब तक कोई तत्व नहीं चुन लिया जाता।"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid "Check this to show the Final total box only when at least one option is filled."
msgstr "अंतिम कुल बॉक्स दिखाने के लिए इसे केवल तभी जांचें जब कम से कम एक विकल्प भरा हो।"

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr "अंतिम कुल बॉक्स को तब तक छिपाएं जब तक कि सभी आवश्यक तत्व नहीं चुने जाते।"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid "Check this to show the Final total box only when all required visible options are filled."
msgstr "अंतिम कुल बॉक्स दिखाने के लिए इसे केवल तभी जांचें जब सभी आवश्यक दृश्यमान विकल्प भरे हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr "अंतिम कुल बॉक्स को तब तक छिपाएं जब तक कि सभी तत्व ों का चयन न हो जाए।"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid "Check this to show the Final total box only when all visible options are filled."
msgstr "अंतिम कुल बॉक्स दिखाने के लिए इसे केवल तभी जांचें जब सभी दृश्यमान विकल्प भरे हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:426
#, fuzzy
msgid "Disable lazy load images"
msgstr "आलसी लोड छवियों को अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
#, fuzzy
msgid "Enable this to disable lazy loading images."
msgstr "आलसी लोडिंग छवियों को अक्षम करने के लिए इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:434
#, fuzzy
msgid "Preload lightbox images"
msgstr "प्रकाशबॉक्स छवियों को प्रीलोड करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
#, fuzzy
msgid "Enable this to preload the image when using the lightbox feature."
msgstr "लाइटबॉक्स सुविधा का उपयोग करते समय छवि को प्रीलोड करने के लिए इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:442
#, fuzzy
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "WooCommerce शॉर्टकोड के लिए प्लगइन सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
#, fuzzy
msgid "Enabling this will load the plugin files to all WordPress pages. Use with caution."
msgstr "इसे सक्षम करने से प्लगइन फ़ाइलों को सभी वर्डप्रेस पृष्ठों पर लोड किया जाएगा। सावधानी के साथ प्रयोग करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:450
#, fuzzy
msgid "Enable shortcodes in options strings"
msgstr "विकल्प स्ट्रिंग्स में शॉर्टकोड सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
#, fuzzy
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options label and "
"description text."
msgstr "इसे सक्षम करने से विकल्प लेबल और विवरण पाठ में शॉर्टकोड और एचटीएमएल कोड का उपयोग किया जा सकेगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:478
#, fuzzy
msgid "Placement"
msgstr "नियोजन"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
#, fuzzy
msgid "Floating Totals box"
msgstr "फ़्लोटिंग टोटल्स बॉक्स"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
#, fuzzy
msgid "Add to cart button"
msgstr "कार्ट बटन में जोड़ें"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "एनीमेशन"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
#, fuzzy
msgid ""
"This controls how your fields are displayed on the front-end. If you choose \"Show using action "
"hooks\" you have to manually write the code to your theme or plugin to display the fields and "
"the placement settings below will not work. If you use the Composite Products extension you "
"must leave this setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"यह नियंत्रित करता है कि आपके फ़ील्ड फ्रंट-एंड पर कैसे प्रदर्शित होते हैं। यदि आप \"एक्शन हुक का उपयोग करके दिखाएं\" "
"चुनते हैं, तो आपको फ़ील्ड प्रदर्शित करने के लिए मैन्युअल रूप से अपनी थीम या प्लगइन पर कोड लिखना होगा और नीचे दी "
"गई प्लेसमेंट सेटिंग्स काम नहीं करेंगी। यदि आप समग्र उत्पाद एक्सटेंशन का उपयोग करते हैं, तो आपको इस सेटिंग को "
"\"सामान्य\" पर छोड़ना होगा अन्यथा अतिरिक्त विकल्प समग्र उत्पाद बंडलों पर प्रदर्शित नहीं किए जा सकते. "
"दस्तावेज़ीकरण पर अधिक देखें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:497
#, fuzzy
msgid "Show using action hooks"
msgstr "एक्शन हुक का उपयोग करके दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
#, fuzzy
msgid "Extra Options placement"
msgstr "अतिरिक्त विकल्प प्लेसमेंट"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
#, fuzzy
msgid "Select where you want the extra options to appear."
msgstr "चुनें कि आप अतिरिक्त विकल्प कहाँ दिखाना चाहते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
#, fuzzy
msgid "Before add to cart button"
msgstr "कार्ट बटन में जोड़ने से पहले"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
#, fuzzy
msgid "After add to cart button"
msgstr "कार्ट बटन में जोड़ने के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
#, fuzzy
msgid "Before cart form"
msgstr "कार्ट फॉर्म से पहले"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
#, fuzzy
msgid "After cart form"
msgstr "कार्ट फॉर्म के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
#, fuzzy
msgid "Before product"
msgstr "उत्पाद से पहले"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
#, fuzzy
msgid "After product"
msgstr "उत्पाद के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
#, fuzzy
msgid "Before product summary"
msgstr "उत्पाद सारांश से पहले"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
#, fuzzy
msgid "After product summary"
msgstr "उत्पाद सारांश के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
#, fuzzy
msgid "After product image"
msgstr "उत्पाद छवि के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
#, fuzzy
msgid "Custom hook"
msgstr "कस्टम हुक"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
#, fuzzy
msgid "Extra Options placement custom hook"
msgstr "अतिरिक्त विकल्प प्लेसमेंट कस्टम हुक"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
#, fuzzy
msgid "Extra Options placement hook priority"
msgstr "अतिरिक्त विकल्प प्लेसमेंट हुक प्राथमिकता"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
#, fuzzy
msgid "Select the Extra Options placement hook priority"
msgstr "अतिरिक्त विकल्प प्लेसमेंट हुक प्राथमिकता का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
#, fuzzy
msgid "Totals box placement"
msgstr "कुल बॉक्स प्लेसमेंट"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
#, fuzzy
msgid "Select where you want the Totals box to appear."
msgstr "चयन करें कि आप कुल बॉक्स कहाँ दिखाना चाहते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
#, fuzzy
msgid "Totals box placement custom hook"
msgstr "कुल बॉक्स प्लेसमेंट कस्टम हुक"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
#, fuzzy
msgid "Totals box placement hook priority"
msgstr "कुल बॉक्स प्लेसमेंट हुक प्राथमिकता"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
#, fuzzy
msgid "Select the Totals box placement hook priority"
msgstr "कुल बॉक्स प्लेसमेंट हुक प्राथमिकता का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
#, fuzzy
msgid "This will enable a floating box to display your totals box."
msgstr "यह आपके टोटल बॉक्स को प्रदर्शित करने के लिए एक फ़्लोटिंग बॉक्स को सक्षम करेगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:594
#, fuzzy
msgid "Bottom right"
msgstr "नीचे दाईं ओर"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
#, fuzzy
msgid "Bottom left"
msgstr "नीचे बाईं ओर"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
#, fuzzy
msgid "Top right"
msgstr "ऊपर दाईं ओर"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
#, fuzzy
msgid "Top left"
msgstr "ऊपर बाईं ओर"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
#, fuzzy
msgid "Floating Totals box visibility"
msgstr "फ्लोटिंग टोटल्स बॉक्स दृश्यता"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
#, fuzzy
msgid "This determines the floating totals box visibility."
msgstr "यह फ्लोटिंग टोटल बॉक्स दृश्यता निर्धारित करता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:609
#, fuzzy
msgid "Always visible"
msgstr "हमेशा दिखाई देता है"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
#, fuzzy
msgid "Visble after scrolling the page"
msgstr "पृष्ठ स्क्रॉल करने के बाद Visble"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
#, fuzzy
msgid "Hide after scrolling the page"
msgstr "पृष्ठ स्क्रॉल करने के बाद छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
#, fuzzy
msgid "Pixels amount needed to scroll"
msgstr "स्क्रॉल करने के लिए पिक्सेल की मात्रा आवश्यक"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
#, fuzzy
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals to become visible."
msgstr "फ़्लोटिंग टोटल को दृश्यमान होने के लिए पृष्ठ को स्क्रॉल करने के लिए आवश्यक पिक्सेल की संख्या का चयन करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:623
#, fuzzy
msgid "Add to cart button on floating totals box"
msgstr "फ़्लोटिंग टोटल बॉक्स पर कार्ट बटन में जोड़ें"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
#, fuzzy
msgid "Display the add to cart button on floating box."
msgstr "फ़्लोटिंग बॉक्स पर कार्ट में जोड़ें बटन प्रदर्शित करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
#, fuzzy
msgid "Change original product price"
msgstr "मूल उत्पाद मूल्य बदलें"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
#, fuzzy
msgid "Check to overwrite the original product price when the price is changing."
msgstr "जब कीमत बदल रही हो तो मूल उत्पाद मूल्य को अधिलेखित करने के लिए जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:639
#, fuzzy
msgid "Change variation price"
msgstr "परिवर्तन मूल्य"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
#, fuzzy
msgid "Check to overwrite the variation price when the price is changing."
msgstr "जब कीमत बदल रही हो तो भिन्नता मूल्य को अधिलेखित करने की जांच करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:647
#, fuzzy
msgid "Force Select Options"
msgstr "फोर्स विकल्प का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
#, fuzzy
msgid ""
"This changes the add to cart button on shop and archive pages to display select options when "
"the product has extra product options. Enabling this will remove the ajax functionality."
msgstr ""
"यह उत्पाद में अतिरिक्त उत्पाद विकल्प होने पर चुनिंदा विकल्प प्रदर्शित करने के लिए शॉप और संग्रह पृष्ठों पर कार्ट में "
"जोड़ें बटन को बदल देता है। इसे सक्षम करने से अजाक्स कार्यक्षमता हट जाएगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:657
#, fuzzy
msgid "Enable extra options in shop and category view"
msgstr "दुकान और श्रेणी दृश्य में अतिरिक्त विकल्प सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
#, fuzzy
msgid ""
"Check to enable the display of extra options on the shop page and category view. This setting "
"is theme dependent and some aspects may not work as expected."
msgstr ""
"शॉप पेज और श्रेणी दृश्य पर अतिरिक्त विकल्पों के प्रदर्शन को सक्षम करने के लिए जाँच करें. यह सेटिंग थीम पर निर्भर है "
"और हो सकता है कि कुछ पहलू अपेक्षा के अनुरूप काम न करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
#, fuzzy
msgid "Remove Free price label"
msgstr "नि: शुल्क मूल्य लेबल निकालें"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
#, fuzzy
msgid "Check to remove Free price label when product has extra options"
msgstr "उत्पाद में अतिरिक्त विकल्प होने पर नि: शुल्क मूल्य लेबल को हटाने के लिए जांचें"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
#, fuzzy
msgid "Use progressive display on options"
msgstr "विकल्पों पर प्रगतिशील प्रदर्शन का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
#, fuzzy
msgid ""
"Enabling this will hide the options on the product page until JavaScript is initialized. This "
"is a fail-safe setting and we recommend to be active."
msgstr ""
"इसे सक्षम करने से उत्पाद पृष्ठ पर विकल्प छिप जाएंगे जब तक कि जावास्क्रिप्ट प्रारंभ नहीं किया जाता है। यह एक विफल-"
"सुरक्षित सेटिंग है और हम सक्रिय रहने की सलाह देते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
#, fuzzy
msgid "Animation delay"
msgstr "एनीमेशन में देरी"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
#, fuzzy
msgid "How long the animation will take in milliseconds"
msgstr "मिलीसेकंड में एनीमेशन में कितना समय लगेगा?"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
#, fuzzy
msgid "Start Animation delay"
msgstr "ऐनिमेशन विलंब प्रारंभ करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
#, fuzzy
msgid "The delay until the animation starts in milliseconds"
msgstr "एनीमेशन के शुरू होने तक की देरी मिलीसेकंड में"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
#, fuzzy
msgid "Show quantity selector only for elements with a value"
msgstr "केवल मान वाले तत्वों के लिए मात्रा चयनकर्ता दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
#, fuzzy
msgid "Check show quantity selector only for elements with a value."
msgstr "केवल मान वाले तत्वों के लिए मात्रा चयनकर्ता दिखाएँ जाँचें."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr "जब तक कोई तत्व नहीं चुना जाता तब तक ऐड-टू-कार्ट बटन छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
#, fuzzy
msgid "Check this to show the add to cart button only when at least one option is filled."
msgstr "कार्ट में जोड़ें बटन दिखाने के लिए इसे केवल तभी जांचें जब कम से कम एक विकल्प भरा हो।"

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr "ऐड-टू-कार्ट बटन को तब तक छिपाएँ जब तक कि सभी आवश्यक तत्व नहीं चुन लिए जाते"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible options are filled."
msgstr "कार्ट में जोड़ें बटन दिखाने के लिए इसे केवल तभी जांचें जब सभी आवश्यक दृश्यमान विकल्प भरे हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr "ऐड-टू-कार्ट बटन को तब तक छिपाएँ जब तक कि सभी तत्व नहीं चुन लिए जाते"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid "Check this to show the add to cart button only when all visible options are filled."
msgstr "कार्ट में जोड़ें बटन दिखाने के लिए इसे केवल तभी जांचें जब सभी दृश्यमान विकल्प भरे हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "तत्वों के लिए पूर्ण चौड़ाई लेबल दिखाएँ."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
#, fuzzy
msgid "Check this to force elements to be full width instead of auto."
msgstr "तत्वों को ऑटो के बजाय पूर्ण चौड़ाई के लिए मजबूर करने के लिए इसे जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:737
#, fuzzy
msgid "Show choice description inline."
msgstr "इनलाइन पसंद विवरण दिखाएँ."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
#, fuzzy
msgid "Check this to disable showing description as a tooltip and show it inline instead."
msgstr "टूलटिप के रूप में वर्णन दिखाने को अक्षम करने के लिए इसे जांचें और इसके बजाय इसे इनलाइन दिखाएं।"

#: includes/classes/class-themecomplete-epo-settings-base.php:745
#, fuzzy
msgid "Hide choice label when using the Show tooltip setting for radio buttons and checkboxes"
msgstr "रेडियो बटन और चेकबॉक्स के लिए 'शो टूलटिप' सेटिंग का उपयोग करते समय पसंद लेबल छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for radio buttons and "
"checkboxes."
msgstr ""
"रेडियो बटन और चेकबॉक्स के लिए टूलटिप दिखाएँ सेटिंग का उपयोग करते समय पसंद लेबल को छिपाने के लिए इसकी जाँच करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
#, fuzzy
msgid "Auto hide price if zero"
msgstr "शून्य होने पर ऑटो हाइड कीमत"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
#, fuzzy
msgid "Check this to globally hide the price display if it is zero."
msgstr "यदि मूल्य प्रदर्शन शून्य है तो इसे वैश्विक स्तर पर छिपाने के लिए जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "कीमतों में कटौती शून्य"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
#, fuzzy
msgid ""
"Check this to globally trim zero in prices. This will be applied to native WooCommerce prices "
"as well."
msgstr ""
"कीमतों में वैश्विक स्तर पर शून्य को कम करने के लिए इसे देखें। यह देशी WooCommerce कीमतों पर भी लागू किया जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:769
#, fuzzy
msgid "Hide element price html when hide price setting is enabled"
msgstr "मूल्य सेटिंग छुपाना सक्षम होने पर तत्व मूल्य HTML छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
#, fuzzy
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of the element when "
"you enable its hide price setting."
msgstr ""
"यदि आप Google Merchant Center का उपयोग करते हैं तो इसे जांचें। जब आप इसकी हाइड प्राइस सेटिंग को सक्षम करते "
"हैं तो यह तत्व के मूल्य एचटीएमएल को छिपा देगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:779
#, fuzzy
msgid "Use translated values when possible on admin Order"
msgstr "व्यवस्थापक आदेश पर संभव होने पर अनुवादित मानों का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
#, fuzzy
msgid ""
"Please note that if the options on the Order change or get deleted you will get wrong results "
"by enabling this!"
msgstr ""
"कृपया ध्यान दें कि यदि ऑर्डर पर विकल्प बदलते हैं या हटा दिए जाते हैं तो आपको इसे सक्षम करके गलत परिणाम मिलेंगे!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
#, fuzzy
msgid "Include option pricing in product price"
msgstr "उत्पाद मूल्य में विकल्प मूल्य निर्धारण शामिल करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
#, fuzzy
msgid "Check this to include the pricing of the options to the product price."
msgstr "उत्पाद मूल्य के विकल्पों के मूल्य निर्धारण को शामिल करने के लिए इसे जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:797
#, fuzzy
msgid "Check for empty product price"
msgstr "खाली उत्पाद मूल्य की जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
#, fuzzy
msgid "Check this to have the plugin set to zero the product price when it is empty."
msgstr "प्लगइन को खाली होने पर उत्पाद मूल्य को शून्य करने के लिए सेट करने के लिए इसकी जांच करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:805
#, fuzzy
msgid "Use the \"From\" string on displayed product prices"
msgstr "प्रदर्शित उत्पाद की कीमतों पर \"से\" स्ट्रिंग का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
#, fuzzy
msgid "Check this to alter the price display of a product when it has extra options with prices."
msgstr "किसी उत्पाद के मूल्य प्रदर्शन को बदलने के लिए इसे जांचें जब इसमें कीमतों के साथ अतिरिक्त विकल्प हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:813
#, fuzzy
msgid "Alter generated product structured data"
msgstr "जेनरेट किए गए उत्पाद संरचित डेटा को बदलें"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
#, fuzzy
msgid ""
"Alters the generated product structured data. This may produce wrong results if the options use "
"conditional logic!"
msgstr ""
"जेनरेट किए गए उत्पाद संरचित डेटा को बदल देता है। यदि विकल्प सशर्त तर्क का उपयोग करते हैं तो यह गलत परिणाम "
"उत्पन्न कर सकता है!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "उत्तरदायी विकल्प संरचना"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
#, fuzzy
msgid "Enable this if you want the options to have responsive display."
msgstr "यदि आप विकल्पों को उत्तरदायी प्रदर्शन करना चाहते हैं तो इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:851
#, fuzzy
msgid "Turn off persistent cart"
msgstr "लगातार गाड़ी बंद करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
#, fuzzy
msgid "Enable this if the product has a lot of options."
msgstr "यदि उत्पाद में बहुत सारे विकल्प हैं तो इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:858
#, fuzzy
msgid "Clear cart button"
msgstr "कार्ट बटन साफ़ करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
#, fuzzy
msgid "Enables or disables the clear cart button"
msgstr "साफ़ कार्ट बटन सक्षम या अक्षम करता है"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
#, fuzzy
msgid "Cart Field Display"
msgstr "कार्ट फ़ील्ड प्रदर्शन"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
#, fuzzy
msgid "Select how to display your fields in the cart"
msgstr "कार्ट में अपने फ़ील्ड प्रदर्शित करने का तरीका चुनें"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
#, fuzzy
msgid "Normal display"
msgstr "सामान्य प्रदर्शन"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
#, fuzzy
msgid "Display a pop-up link"
msgstr "पॉप-अप लिंक प्रदर्शित करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
#, fuzzy
msgid "Advanced display"
msgstr "उन्नत प्रदर्शन"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
#, fuzzy
msgid "Hide extra options in cart"
msgstr "कार्ट में अतिरिक्त विकल्प छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
#, fuzzy
msgid "Enables or disables the display of options in the cart."
msgstr "कार्ट में विकल्पों के प्रदर्शन को सक्षम या अक्षम करता है."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
msgid "Hide extra addon prices in cart and checkout"
msgstr "कार्ट और चेकआउट में अपलोड फ़ाइल URL छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
msgid "Enables or disables the display of addon prices in the cart and checkout."
msgstr "कार्ट में विकल्पों के प्रदर्शन को सक्षम या अक्षम करता है."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
#, fuzzy
msgid "Prevent negative priced products"
msgstr "नकारात्मक मूल्य वाले उत्पादों को रोकें"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
#, fuzzy
msgid "Prevent adding to the cart negative priced products."
msgstr "कार्ट नकारात्मक मूल्य वाले उत्पादों को जोड़ने से बचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:905
#, fuzzy
msgid "Prevent zero priced products"
msgstr "शून्य मूल्य वाले उत्पादों को रोकें"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
#, fuzzy
msgid "Prevent adding to the cart zero priced products."
msgstr "कार्ट में शून्य मूल्य वाले उत्पादों को जोड़ने से बचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:912
#, fuzzy
msgid "Hide checkbox element average price"
msgstr "चेकबॉक्स तत्व औसत मूल्य छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
#, fuzzy
msgid "This will hide the average price display on the cart for checkboxes."
msgstr "यह चेकबॉक्स के लिए कार्ट पर औसत मूल्य प्रदर्शन को छिपा देगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:919
#, fuzzy
msgid "Show image replacement in cart and checkout"
msgstr "कार्ट और चेकआउट में छवि प्रतिस्थापन दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
#, fuzzy
msgid "Enabling this will show the images of elements that have an image replacement."
msgstr "इसे सक्षम करने से उन तत्वों की छवियां दिखाई देंगी जिनमें छवि प्रतिस्थापन है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:926
#, fuzzy
msgid "Hide upload file URL in cart and checkout"
msgstr "कार्ट और चेकआउट में अपलोड फ़ाइल URL छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
#, fuzzy
msgid "Enabling this will hide the URL of any uploaded file while in cart and checkout."
msgstr "इसे सक्षम करने से कार्ट और चेकआउट में किसी भी अपलोड की गई फ़ाइल का यूआरएल छिप जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:933
#, fuzzy
msgid "Show uploaded image in cart and checkout"
msgstr "कार्ट और चेकआउट में अपलोड की गई छवि दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
#, fuzzy
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr "इसे सक्षम करने से कार्ट और चेकआउट में अपलोड की गई छवियां दिखाई देंगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:940
#, fuzzy
msgid "Maximum image width"
msgstr "अधिकतम छवि चौड़ाई"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr "कार्ट पर दिखाई देने वाली छवियों की अधिकतम चौड़ाई सेट करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:947
#, fuzzy
msgid "Maximum image height"
msgstr "अधिकतम छवि ऊंचाई"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
#, fuzzy
msgid "Set the maximum height of the images that appear on cart."
msgstr "कार्ट पर दिखाई देने वाली छवियों की अधिकतम ऊंचाई सेट करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:954
#, fuzzy
msgid "Always use unique values on cart for elements"
msgstr "तत्वों के लिए कार्ट पर हमेशा अद्वितीय मूल्यों का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
#, fuzzy
msgid ""
"Enabling this will separate comma separated values for elements. This is mainly used for "
"multiple checkbox choices."
msgstr ""
"इसे सक्षम करने से तत्वों के लिए अल्पविराम पृथक मान अलग हो जाएंगे। यह मुख्य रूप से कई चेकबॉक्स विकल्पों के लिए उपयोग "
"किया जाता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:984
#, fuzzy
msgid "Post types to show the saved options"
msgstr "सहेजे गए विकल्प दिखाने के लिए पोस्ट प्रकार"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to show the saved "
"options. You can type in your custom post type."
msgstr ""
"उन पोस्ट प्रकारों का चयन करें जहां प्लगइन सहेजे गए विकल्पों को दिखाने के लिए संपादन आदेश स्क्रीन को संशोधित करेगा। "
"आप अपने कस्टम पोस्ट प्रकार में टाइप कर सकते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
#, fuzzy
msgid "Strip html from emails"
msgstr "ईमेल से एचटीएमएल स्ट्रिप करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
#, fuzzy
msgid "Check to strip the html tags from emails"
msgstr "ईमेल से HTML टैग हटाने के लिए जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
#, fuzzy
msgid "Legacy meta data"
msgstr "विरासत मेटा डेटा"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
#, fuzzy
msgid "Check to enable legacy meta data functionality."
msgstr "विरासत मेटा डेटा कार्यक्षमता सक्षम करने के लिए जाँच करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
#, fuzzy
msgid "Unique meta values"
msgstr "अद्वितीय मेटा मान"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
#, fuzzy
msgid "Check to split items with multiple values to unique lines."
msgstr "एकाधिक मानों वाले आइटम्स को अद्वितीय लाइनों में विभाजित करने की जाँच करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
#, fuzzy
msgid "Prevent options from being sent to emails"
msgstr "विकल्पों को ईमेल पर भेजे जाने से रोकें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
#, fuzzy
msgid "Check to disable options from being sent to emails."
msgstr "ईमेल पर भेजे जाने से विकल्पों को अक्षम करने की जाँच करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
#, fuzzy
msgid "Disable sending the options upon saving the order"
msgstr "ऑर्डर सहेजने पर विकल्प भेजना अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
#, fuzzy
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order in the checkout."
msgstr "यदि आपको चेकआउट में ऑर्डर पूरा करने का प्रयास करते समय 500 त्रुटि मिल रही है तो इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
#, fuzzy
msgid "Attach upload files to emails"
msgstr "अपलोड फ़ाइलों को ईमेल में संलग्न करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
#, fuzzy
msgid "Check to Attach upload files to emails."
msgstr "ईमेल में अपलोड फ़ाइलें संलग्न करने के लिए जाँच करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
#, fuzzy
msgid "Disable Options on Order status change"
msgstr "ऑर्डर स्थिति परिवर्तन पर विकल्प अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
#, fuzzy
msgid "Check this only if you are getting server errors on checkout."
msgstr "इसे केवल तभी जांचें जब आपको चेकआउट पर सर्वर त्रुटियां मिल रही हों।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
#, fuzzy
msgid "Hide upload file URL in order"
msgstr "अपलोड फ़ाइल URL को क्रम में छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
#, fuzzy
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr "इसे सक्षम करने से क्रम में रहते हुए किसी भी अपलोड की गई फ़ाइल का URL छिप जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
msgid "Show uploaded image in order"
msgstr "कार्ट और चेकआउट में अपलोड की गई छवि दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
msgid "Enabling this will show the uploaded images in order."
msgstr "इसे सक्षम करने से कार्ट और चेकआउट में अपलोड की गई छवियां दिखाई देंगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "फ़ील्ड लेबल/मान विभाजक"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field values in the cart "
"and order."
msgstr "कार्ट और ऑर्डर में फ़ील्ड मानों से फ़ील्ड लेबल ्स को अलग करने के लिए उपयोग किया जाने वाला वर्ण दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "एकाधिक फ़ील्ड मान विभाजक"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field that allows multiple "
"selections in the cart and order."
msgstr ""
"वह स्ट्रिंग दर्ज करें जिसका उपयोग किसी फ़ील्ड के लिए एकाधिक मानों को अलग करने के लिए किया जाएगा जो कार्ट और "
"ऑर्डर में एकाधिक चयनों की अनुमति देता है."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
#, fuzzy
msgid "Update cart text"
msgstr "कार्ट पाठ अद्यतन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
#, fuzzy
msgid "Enter the Update cart text when you edit a product."
msgstr "जब आप किसी उत्पाद को संपादित करते हैं तो कार्ट पाठ अद्यतन करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
#, fuzzy
msgid "Edit Options text replacement"
msgstr "विकल्प संपादित करें पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
#, fuzzy
msgid "Enter a text to replace the Edit options text on the cart."
msgstr "कार्ट पर संपादन विकल्प पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
#, fuzzy
msgid "Additional Options text replacement"
msgstr "अतिरिक्त विकल्प पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
#, fuzzy
msgid ""
"Enter a text to replace the Additional options text when using the pop up setting on the cart."
msgstr ""
"कार्ट पर पॉप अप सेटिंग का उपयोग करते समय अतिरिक्त विकल्प पाठ को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
#, fuzzy
msgid "Close button text replacement"
msgstr "बंद करें बटन पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
#, fuzzy
msgid "Enter a text to replace the Close button text when using the pop up setting on the cart."
msgstr "कार्ट पर पॉप अप सेटिंग का उपयोग करते समय बंद करें बटन पाठ को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
#, fuzzy
msgid "Empty cart text"
msgstr "खाली कार्ट पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
#, fuzzy
msgid "Enter a text to replace the empty cart button text."
msgstr "खाली कार्ट बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
#, fuzzy
msgid "Final total text"
msgstr "अंतिम कुल पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
#, fuzzy
msgid "Enter the Final total text or leave blank for default."
msgstr "अंतिम कुल पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
#, fuzzy
msgid "Unit price text"
msgstr "इकाई मूल्य पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
#, fuzzy
msgid "Enter the Unit price text or leave blank for default."
msgstr "इकाई मूल्य पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
#, fuzzy
msgid "Options total text"
msgstr "विकल्प कुल पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
#, fuzzy
msgid "Enter the Options total text or leave blank for default."
msgstr "विकल्प कुल पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "विकल्प VAT कुल पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr "विकल्प VAT कुल पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
#, fuzzy
msgid "Fees total text"
msgstr "कुल पाठ शुल्क"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
#, fuzzy
msgid "Enter the Fees total text or leave blank for default."
msgstr "शुल्क कुल पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
#, fuzzy
msgid "Free Price text replacement"
msgstr "नि: शुल्क मूल्य पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
#, fuzzy
msgid "Enter a text to replace the Free price label when product has extra options."
msgstr "जब उत्पाद में अतिरिक्त विकल्प हों, तो नि: शुल्क मूल्य लेबल को प्रतिस्थापित करने के लिए एक पाठ दर्ज करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
#, fuzzy
msgid "Force Select options text"
msgstr "विकल्प पाठ का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
#, fuzzy
msgid "Enter a text to replace the add to cart button text when using the Force select option."
msgstr "फोर्स चयन विकल्प का उपयोग करते समय कार्ट में जोड़ें बटन पाठ को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
#, fuzzy
msgid "No zero priced products text"
msgstr "कोई शून्य मूल्य उत्पाद पाठ नहीं"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
#, fuzzy
msgid "Enter a text to replace the message when trying to add a zero priced product to the cart."
msgstr "कार्ट में शून्य मूल्य वाला उत्पाद जोड़ने का प्रयास करते समय संदेश को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
#, fuzzy
msgid "No negative priced products text"
msgstr "कोई नकारात्मक मूल्य वाले उत्पाद पाठ नहीं"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced product to the cart."
msgstr ""
"कार्ट में नकारात्मक मूल्य वाला उत्पाद जोड़ने का प्रयास करते समय संदेश को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
#, fuzzy
msgid "Popup section button text replacement"
msgstr "पॉपअप अनुभाग बटन पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s will make it so that "
"the button text has the section title."
msgstr ""
"टॉपअप अनुभाग बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें. इसे %s पर सेट करने से यह ऐसा हो जाएगा "
"कि बटन टेक्स्ट में अनुभाग शीर्षक हो।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "खुला"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
#, fuzzy
msgid "Reset Options text replacement"
msgstr "विकल्प रीसेट करें पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
#, fuzzy
msgid "Enter a text to replace the Reset options text when using custom variations."
msgstr "कस्टम विविधताओं का उपयोग करते समय विकल्प रीसेट करें पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241 templates/tm-variations.php:598
#, fuzzy
msgid "Reset options"
msgstr "विकल्प रीसेट करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
#, fuzzy
msgid "Calendar close button text replacement"
msgstr "कैलेंडर बंद करें बटन पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
#, fuzzy
msgid "Enter a text to replace the Close button text on the calendar."
msgstr "कैलेंडर पर बंद करें बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
#, fuzzy
msgid "Calendar today button text replacement"
msgstr "कैलेंडर आज बटन पाठ प्रतिस्थापन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
#, fuzzy
msgid "Enter a text to replace the Today button text on the calendar."
msgstr "कैलेंडर पर आज बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
#, fuzzy
msgid "Slider previous text"
msgstr "स्लाइडर पिछला पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
#, fuzzy
msgid "Enter a text to replace the previous button text for slider."
msgstr "स्लाइडर के लिए पिछले बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
#, fuzzy
msgid "Slider next text"
msgstr "स्लाइडर अगला पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
#, fuzzy
msgid "Enter a text to replace the next button text for slider."
msgstr "स्लाइडर के लिए अगला बटन पाठ बदलने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
#, fuzzy
msgid "This field is required text"
msgstr "यह फ़ील्ड आवश्यक पाठ है"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
#, fuzzy
msgid "Enter a text to indicate that a field is required."
msgstr "यह इंगित करने के लिए कोई पाठ दर्ज करें कि कोई फ़ील्ड आवश्यक है."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
#, fuzzy
msgid "Characters remaining text"
msgstr "शेष पाठ वर्ण"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
#, fuzzy
msgid ""
"Enter a text to replace the Characters remaining text when using maximum characters on a text "
"field or a textarea."
msgstr ""
"किसी पाठ फ़ील्ड या पाठ क्षेत्र पर अधिकतम वर्णों का उपयोग करते समय शेष पाठ को प्रतिस्थापित करने के लिए पाठ "
"दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
#, fuzzy
msgid "Uploading files text"
msgstr "फ़ाइल पाठ अपलोड करना"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
#, fuzzy
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after clicking the add to "
"cart button  when there are upload fields."
msgstr ""
"अपलोड फ़ील्ड होने पर कार्ट में जोड़ें बटन पर क्लिक करने के बाद पॉप-अप में उपयोग की जाने वाली अपलोड फ़ाइल पाठ को "
"बदलने के लिए एक पाठ दर्ज करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
#, fuzzy
msgid "Uploading message text"
msgstr "संदेश पाठ अपलोड करना"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
#, fuzzy
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart button when there are "
"upload fields."
msgstr ""
"अपलोड फ़ील्ड होने पर कार्ट में जोड़ें बटन पर क्लिक करने के बाद पॉप-अप में उपयोग किए जाने के लिए एक संदेश दर्ज करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
#, fuzzy
msgid "Select file text"
msgstr "फ़ाइल पाठ का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid "Enter a text to replace the Select file text used in the styled upload button."
msgstr ""
"स्टाइल किए गए अपलोड बटन में उपयोग किए गए फ़ाइल पाठ का चयन करें को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
#, fuzzy
msgid "Select file(s)"
msgstr "फ़ाइल का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "एकल फ़ाइल पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr "स्टाइल किए गए अपलोड बटन में उपयोग किए गए फ़ाइल पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "एकाधिक फ़ाइलें पाठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid "Enter a text to replace the files text used in the styled upload button."
msgstr "स्टाइल किए गए अपलोड बटन में उपयोग किए गए फ़ाइल पाठ को बदलने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
#, fuzzy
msgid "Add button text on associated products"
msgstr "संबद्ध उत्पादों पर बटन पाठ जोड़ें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
#, fuzzy
msgid "Enter a text to replace the add button text on associated products."
msgstr "संबद्ध उत्पादों पर बटन पाठ जोड़ें को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12 templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "जोड़ें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
#, fuzzy
msgid "Remove button text on associated products"
msgstr "संबद्ध उत्पादों पर बटन पाठ निकालें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr "संबद्ध उत्पादों पर निकालें बटन पाठ को प्रतिस्थापित करने के लिए कोई पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "हटाना"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
#, fuzzy
msgid "Repeater add text"
msgstr "पुनरावर्तक पाठ जोड़ें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
#, fuzzy
msgid "Enter a text to replace the add text button for repeater fields."
msgstr "पुनरावर्तक फ़ील्ड के लिए पाठ जोड़ें बटन को प्रतिस्थापित करने के लिए पाठ दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
#, fuzzy
msgid "Enable checkbox and radio styles"
msgstr "चेकबॉक्स और रेडियो शैलियों को सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
#, fuzzy
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr "चेकबॉक्स और रेडियो बटन के लिए अतिरिक्त स्टाइल सक्षम या अक्षम करता है."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
#, fuzzy
msgid "Select a style for the checkboxes and radio buttons"
msgstr "चेकबॉक्स और रेडियो बटन के लिए शैली का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
#, fuzzy
msgid "Round"
msgstr "गोल"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
#, fuzzy
msgid "Round 2"
msgstr "राउंड 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
#, fuzzy
msgid "Square"
msgstr "वर्ग"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
#, fuzzy
msgid "Square 2"
msgstr "वर्ग 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
msgid "Swatch border type"
msgstr "आइटम बॉर्डर प्रकार का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
#, fuzzy
msgid "Select a style for the selected border when using image replacements or swatches."
msgstr "छवि प्रतिस्थापन या घड़ियों का उपयोग करते समय चयनित बॉर्डर के लिए शैली का चयन करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "साया"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
#, fuzzy
msgid "Thin line"
msgstr "पतली रेखा"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have selected an image, color "
"or text swatch. If left blank it is set to inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
msgid "Choose the border width for image or color swatches."
msgstr "चुनें कि कीमत छिपानी है या नहीं।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
msgid ""
"Select the border width for the active border when you have chosen an image or color swatch."
msgstr "छवि प्रतिस्थापन या घड़ियों का उपयोग करते समय चयनित बॉर्डर के लिए शैली का चयन करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
msgid "Select the border width for the active border when you have chosen a text swatch."
msgstr "छवि प्रतिस्थापन या घड़ियों का उपयोग करते समय चयनित बॉर्डर के लिए शैली का चयन करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "विज़ुअल"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
#, fuzzy
msgid "Product page"
msgstr "उत्पाद पृष्ठ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
#, fuzzy
msgid "Locale"
msgstr "स्थान"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
#, fuzzy
msgid "Pricing"
msgstr "मूल्य निर्धारण"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
#, fuzzy
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
#, fuzzy
msgid "Enable validation"
msgstr "सत्यापन सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
#, fuzzy
msgid "Check to enable validation feature for builder elements"
msgstr "बिल्डर तत्वों के लिए सत्यापन सुविधा सक्षम करने के लिए जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
#, fuzzy
msgid "Disable error scrolling"
msgstr "स्क्रॉलिंग त्रुटि अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
#, fuzzy
msgid "Check to disable scrolling to the element with an error"
msgstr "त्रुटि के साथ तत्व पर स्क्रॉलिंग को अक्षम करने के लिए जाँच करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
#, fuzzy
msgid "Error label placement"
msgstr "त्रुटि लेबल प्लेसमेंट"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
#, fuzzy
msgid "Set the placement for the validation error notification label"
msgstr "मान्यता त्रुटि सूचना लेबल के लिए प्लेसमेंट सेट करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
#, fuzzy
msgid "After the element"
msgstr "तत्व के बाद"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
#, fuzzy
msgid "Before the element"
msgstr "तत्व से पहले"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
#, fuzzy
msgid "Use options cache"
msgstr "विकल्प कैश का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
#, fuzzy
msgid ""
"Use options caching for boosting performance. Disable if you have options that share the same "
"unique ID."
msgstr ""
"प्रदर्शन बढ़ाने के लिए विकल्प कैशिंग का उपयोग करें. यदि आपके पास समान अद्वितीय ID साझा करने वाले विकल्प हैं, तो "
"अक्षम करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
#, fuzzy
msgid "Javascript and CSS inclusion mode"
msgstr "जावास्क्रिप्ट और सीएसएस समावेशन मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
#, fuzzy
msgid "Select how to include JS and CSS files"
msgstr "JS और CSS फ़ाइलों को शामिल करने का तरीका चुनें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
#, fuzzy
msgid "Single minified file"
msgstr "एकल लघु फ़ाइल"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
#, fuzzy
msgid "Multiple minified files"
msgstr "एकाधिक छोटी फ़ाइलें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
#, fuzzy
msgid "DEV - multiple files"
msgstr "DEV - एकाधिक फ़ाइलें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
#, fuzzy
msgid "Disable PNG convert security"
msgstr "PNG कनवर्ट सुरक्षा अक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
#, fuzzy
msgid "Check to disable the conversion to png for image uploads."
msgstr "छवि अपलोड के लिए पीएनजी में रूपांतरण को अक्षम करने के लिए जाँच करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
#, fuzzy
msgid ""
"This will globally override the product price with the price from the options if the total "
"options price is greater then zero."
msgstr ""
"यह विश्व स्तर पर विकल्पों से कीमत के साथ उत्पाद की कीमत को ओवरराइड करेगा यदि कुल विकल्प मूल्य शून्य से अधिक है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
#, fuzzy
msgid "Use setting on each product"
msgstr "प्रत्येक उत्पाद पर सेटिंग का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "विकल्प मूल्य मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "विकल्पों के लिए मूल्य मोड का चयन करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "बिक्री मूल्य का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
#, fuzzy
msgid "Use regular price"
msgstr "नियमित मूल्य का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "मूल्य गणना के लिए संयोजनों की अधिकतम संख्या"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin will use to calculate "
"minimum and maximum prices. A higher number of combinations will result in more accurate "
"prices, but it will also take longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to improve performance."
msgstr ""
"यह सेटिंग उन संयोजनों की अधिकतम संख्या को नियंत्रित करती है जिनका उपयोग प्लगइन न्यूनतम और अधिकतम कीमतों की "
"गणना करने के लिए करेगा. संयोजनों की एक उच्च संख्या के परिणामस्वरूप अधिक सटीक कीमतें होंगी, लेकिन उनकी गणना करने "
"में भी अधिक समय लगेगा। उन उत्पादों के लिए जिनमें कई विकल्प संयोजन हो सकते हैं, प्रदर्शन को बेहतर बनाने के लिए कम "
"संख्या में संयोजन सेट करने की सिफारिश की जाती है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "डिफ़ॉल्ट मान 10 है"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a product. Enabling this "
"setting will provide a more precise result at the cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
#, fuzzy
msgid "Reset option values after the product is added to the cart"
msgstr "कार्ट में उत्पाद जोड़े जाने के बाद विकल्प मान रीसेट करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
#, fuzzy
msgid ""
"This will revert the option values to the default ones after adding the product to the cart"
msgstr "यह कार्ट में उत्पाद जोड़ने के बाद विकल्प मानों को डिफ़ॉल्ट मानों में वापस कर देगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
#, fuzzy
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "कार्ट और चेकआउट में कीमतों पर प्लस और माइनस संकेतों का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
#, fuzzy
msgid "Choose how you want the sign of options prices to be displayed in cart and checkout."
msgstr "चुनें कि आप कार्ट और चेकआउट में विकल्पों की कीमतों का संकेत कैसे प्रदर्शित करना चाहते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
#, fuzzy
msgid "Display both signs"
msgstr "दोनों संकेत प्रदर्शित करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
#, fuzzy
msgid "Display only minus sign"
msgstr "केवल माइनस चिह्न प्रदर्शित करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
#, fuzzy
msgid "Use plus and minus signs on option prices"
msgstr "विकल्प की कीमतों पर प्लस और माइनस संकेतों का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
#, fuzzy
msgid "Choose how you want the sign of options prices to be displayed at the product page."
msgstr "चुनें कि आप उत्पाद पृष्ठ पर विकल्पों की कीमतों का चिह्न कैसे प्रदर्शित करना चाहते हैं."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
#, fuzzy
msgid "Input decimal separator"
msgstr "इनपुट दशमलव विभाजक"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
#, fuzzy
msgid "Choose how to determine the decimal separator for user inputs"
msgstr "उपयोगकर्ता इनपुट के लिए दशमलव विभाजक निर्धारित करने का तरीका चुनें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
#, fuzzy
msgid "Use WooCommerce value"
msgstr "WooCommerce मूल्य का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
#, fuzzy
msgid "Determine by browser local"
msgstr "ब्राउज़र स्थानीय द्वारा निर्धारित करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
#, fuzzy
msgid "Displayed decimal separator"
msgstr "दशमलव विभाजक प्रदर्शित"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
#, fuzzy
msgid "Choose which decimal separator to display on currency prices"
msgstr "चुनें कि मुद्रा की कीमतों पर कौन सा दशमलव विभाजक प्रदर्शित करना है"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "दिनांक तत्व के लिए टाइमज़ोन ओवरराइड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or leave blank for server "
"timezone."
msgstr "चुनें कि बैकएंड गणना पर दिनांक तत्व किस %s का उपयोग करेगा या सर्वर टाइमज़ोन के लिए रिक्त छोड़ देगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy
msgid "timezone"
msgstr "समय क्षेत्र"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
#, fuzzy
msgid "Required state indicator"
msgstr "आवश्यक स्थिति संकेतक"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
#, fuzzy
msgid "Enter a string to indicate the required state of a field."
msgstr "किसी फ़ील्ड की आवश्यक स्थिति इंगित करने के लिए कोई स्ट्रिंग दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
#, fuzzy
msgid "Required state indicator position"
msgstr "आवश्यक राज्य संकेतक स्थिति"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
#, fuzzy
msgid "Select the placement of the Required state indicator"
msgstr "आवश्यक स्थिति संकेतक के प्लेसमेंट का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
#, fuzzy
msgid "Left of the label"
msgstr "लेबल के बाईं ओर"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
#, fuzzy
msgid "Right of the label"
msgstr "लेबल का दाहिना"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
#, fuzzy
msgid "Include tax string suffix on totals box"
msgstr "टोटल बॉक्स पर टैक्स स्ट्रिंग प्रत्यय शामिल करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
#, fuzzy
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr "कुल बॉक्स पर WooCommerce कर प्रत्यय जोड़ने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
#, fuzzy
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr "कुल बॉक्स पर WooCommerce मूल्य प्रदर्शन प्रत्यय शामिल करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid "Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr "कुल बॉक्स पर WooCommerce मूल्य प्रदर्शन प्रत्यय जोड़ने के लिए इसे सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
#, fuzzy
msgid "jQuery selector for main product image"
msgstr "मुख्य उत्पाद छवि के लिए jQuery चयनकर्ता"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
#, fuzzy
msgid "This is used to change the product image."
msgstr "इसका उपयोग उत्पाद छवि को बदलने के लिए किया जाता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
#, fuzzy
msgid "Product image replacement mode"
msgstr "उत्पाद छवि प्रतिस्थापन मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid "Self mode replaces the actual image and Inline appends new image elements."
msgstr "सेल्फ मोड वास्तविक छवि को प्रतिस्थापित करता है और इनलाइन नए छवि तत्वों को जोड़ता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
#, fuzzy
msgid "Self mode"
msgstr "सेल्फ मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
#, fuzzy
msgid "Inline mode"
msgstr "इनलाइन मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
#, fuzzy
msgid "Move out of stock message"
msgstr "स्टॉक संदेश से बाहर निकलें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid "This moves the out of stock message when styled variations are used just below them."
msgstr ""
"यह आउट ऑफ स्टॉक संदेश को स्थानांतरित करता है जब उनके ठीक नीचे स्टाइल किए गए बदलावों का उपयोग किया जाता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
#, fuzzy
msgid "Use internal variation price"
msgstr "आंतरिक भिन्नता मूल्य का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve performance. Note that "
"this may cause issues with discount or currency plugins."
msgstr ""
"यदि आपके परिवर्तनीय उत्पादों में प्रदर्शन में सुधार करने के लिए बहुत सारे विकल्प हैं तो इसे सक्षम करें। ध्यान दें कि यह "
"छूट या मुद्रा प्लगइन्स के साथ समस्याएं पैदा कर सकता है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "प्लगइन बैकएंड इंटरफ़ेस सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin interface while on "
"the edit product page. The Admininstrator role always has access."
msgstr ""
"उन भूमिकाओं का चयन करें जिनके पास उत्पाद संपादित करने के पृष्ठ पर प्लगइन सेटिंग्स और प्लगइन इंटरफ़ेस तक पहुंच होगी। "
"व्यवस्थापक की भूमिका में हमेशा पहुँच होती है."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
#, fuzzy
msgid "Hide override settings on products"
msgstr "उत्पादों पर ओवरराइड सेटिंग्स छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
#, fuzzy
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr "उत्पाद संपादन स्क्रीन पर सेटिंग टैब को छिपाने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
#, fuzzy
msgid "Hide Builder mode on products"
msgstr "उत्पादों पर बिल्डर मोड छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
#, fuzzy
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr "उत्पाद संपादन स्क्रीन पर बिल्डर टैब को छिपाने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
#, fuzzy
msgid "Hide Normal mode on products"
msgstr "उत्पादों पर सामान्य मोड छुपाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
#, fuzzy
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr "उत्पाद संपादन स्क्रीन पर सामान्य टैब छिपाने के लिए इसे सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "WP रॉकेट CDN सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid "Check to enable the use of WP Rocket cdn for the plugin images if it is active."
msgstr "प्लगइन छवियों के लिए डब्ल्यूपी रॉकेट सीडीएन के उपयोग को सक्षम करने के लिए जांचें यदि यह सक्रिय है।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "Jetpack CDN सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid "Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr "यदि यह सक्रिय है तो प्लगइन छवियों के लिए जेटपैक सीडीएन के उपयोग को सक्षम करने के लिए जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
#, fuzzy
msgid "Select box"
msgstr "बॉक्स का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
#, fuzzy
msgid "Datepicker"
msgstr "Datepicker"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid "Set the row gap between sections and fields. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid "Set the column gap between sections and fields. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid "Set the inner row gap between field elements. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid "Set the inner column gap between field elements. %1$s This will be the %2$s css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
#, fuzzy
msgid "Tooltip max width"
msgstr "टूलटिप अधिकतम चौड़ाई"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
#, fuzzy
msgid "Set the max width of the tooltip that appears on the elements."
msgstr "तत्वों पर प्रकट होने वाले टूलटिप की अधिकतम चौड़ाई सेट करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
#, fuzzy
msgid "Image mode"
msgstr "छवि मोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
#, fuzzy
msgid "Set the image mode that will be used for various image related functionality."
msgstr "छवि मोड सेट करें जिसका उपयोग विभिन्न छवि से संबंधित कार्यक्षमता के लिए किया जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
#, fuzzy
msgid "Absolute URL"
msgstr "निरपेक्ष URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
#, fuzzy
msgid "Relative URL"
msgstr "सापेक्ष URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "परिवर्तनों पर छवि की पुनर्गणना करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html dynamically or if you "
"want to control the image dynamically."
msgstr ""
"यह कई गैलरी समाधानों पर आवश्यक है जो छवि को गतिशील रूप से बदलते हैं या यदि आप छवि को गतिशील रूप से नियंत्रित "
"करना चाहते हैं।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
#, fuzzy
msgid "Retrieve image sizes for image replacements"
msgstr "छवि प्रतिस्थापन के लिए छवि आकार पुनर्प्राप्त करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr "धीमी सर्वर या बड़ी मात्रा में छवियों के लिए इसे अक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "मात्रा 1 दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the quantity selector "
"is enabled."
msgstr "मात्रा 1 होने पर और मात्रा चयनकर्ता सक्षम होने पर भी मात्रा स्ट्रिंग दिखाने के लिए सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
#, fuzzy
msgid "Show prices inside select box choices"
msgstr "चुनिंदा बॉक्स विकल्पों के अंदर मूल्य दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
#, fuzzy
msgid "Check this to show the price of the select box options if the price type is fixed."
msgstr "यदि मूल्य प्रकार तय किया गया है, तो चयनित बॉक्स विकल्पों की कीमत दिखाने के लिए इसे जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
#, fuzzy
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr "कीमतें छिपी होने पर भी चुनिंदा बॉक्स विकल्पों के अंदर कीमतें दिखाएँ"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is fixed and even if "
"the element hides the price."
msgstr ""
"यदि मूल्य प्रकार तय किया गया है और भले ही तत्व कीमत छिपाता है तो चुनिंदा बॉक्स विकल्पों की कीमत दिखाने के लिए "
"इसे जांचें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
#, fuzzy
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr "अपने मात्रा चयनकर्ता के साथ चुनिंदा बॉक्स विकल्पों के अंदर कीमतों को गुणा करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
#, fuzzy
msgid ""
"Check this to multiply the prices of the select box options with its quantity selector if any."
msgstr "यदि कोई हो तो इसके मात्रा चयनकर्ता के साथ चुनिंदा बॉक्स विकल्पों की कीमतों को गुणा करने के लिए इसे देखें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
#, fuzzy
msgid "Radio button undo button"
msgstr "रेडियो बटन पूर्ववत करें बटन"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
#, fuzzy
msgid "Globally override the undo button for radio buttons"
msgstr "विश्व स्तर पर रेडियो बटन के लिए पूर्ववत बटन को ओवरराइड करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
#, fuzzy
msgid "Use field value"
msgstr "फ़ील्ड मान का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
#, fuzzy
msgid "Datepicker theme"
msgstr "डेटपिकर थीम"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
#, fuzzy
msgid "Datepicker size"
msgstr "डेटपिकर का आकार"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
#, fuzzy
msgid "Datepicker position"
msgstr "डेटपिकर की स्थिति"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
#, fuzzy
msgid "Minimum characters for text-field and text-areas"
msgstr "पाठ-फ़ील्ड और पाठ-क्षेत्रों के लिए न्यूनतम वर्ण"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
#, fuzzy
msgid "Maximum characters for text-field and text-areas"
msgstr "पाठ-फ़ील्ड और पाठ-क्षेत्रों के लिए अधिकतम वर्ण"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
#, fuzzy
msgid "Upload element inline Image preview"
msgstr "अपलोड तत्व इनलाइन छवि पूर्वावलोकन"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
#, fuzzy
msgid "Enable inline preview of the image that will be uploaded."
msgstr "अपलोड की जाने वाली छवि का इनलाइन पूर्वावलोकन सक्षम करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
#, fuzzy
msgid "Scroll to the product element upon selection"
msgstr "चयन पर उत्पाद तत्व पर स्क्रॉल करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
#, fuzzy
msgid "Enable to scroll the viewport to the product element."
msgstr "उत्पाद तत्व पर व्यूपोर्ट को स्क्रॉल करने के लिए सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
#, fuzzy
msgid "Product element scroll offset"
msgstr "उत्पाद तत्व स्क्रॉल ऑफसेट"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
#, fuzzy
msgid "Enter a value for the scroll offset when selecting a choice for the product element."
msgstr "उत्पाद तत्व के लिए कोई विकल्प चुनते समय स्क्रॉल ऑफसेट के लिए कोई मान दर्ज करें."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
#, fuzzy
msgid "Sync associated product quantity with main product quantity"
msgstr "मुख्य उत्पाद मात्रा के साथ संबद्ध उत्पाद मात्रा सिंक्रनाइज़ करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
#, fuzzy
msgid ""
"Enable to have the quantities of the associated products to be a multiple of the main product "
"quantity."
msgstr "संबंधित उत्पादों की मात्रा को मुख्य उत्पाद मात्रा का गुणक बनाने में सक्षम करें।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "उपयोगकर्ता नाम"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
#, fuzzy
msgid "Your Envato username."
msgstr "आपका Envato उपयोगकर्ता नाम."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
#, fuzzy
msgid "Envato Personal Token"
msgstr "Envato Personal Token"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "आप %s द्वारा एक Envato व्यक्तिगत टोकन उत्पन्न कर सकते हैं"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy
msgid "clicking this link"
msgstr "इस लिंक पर क्लिक करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
#, fuzzy
msgid "Purchase code"
msgstr "खरीद कोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "अपने खरीद कोड तक पहुंचने का तरीका जानने के लिए आप %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy
msgid "click this link"
msgstr "इस लिंक पर क्लिक करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
#, fuzzy
msgid "Deactivate License"
msgstr "लाइसेंस निष्क्रिय करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
#, fuzzy
msgid "Activate License"
msgstr "लायसेंस सक्रिय करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
#, fuzzy
msgid "License activated."
msgstr "लायसेंस सक्रिय किया गया."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
#, fuzzy
msgid "Consent"
msgstr "अनुमति"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
#, fuzzy
msgid "I agree that the license data will be transmitted to the license server."
msgstr "मैं सहमत हूं कि लाइसेंस डेटा लाइसेंस सर्वर को प्रेषित किया जाएगा।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
#, fuzzy
msgid "Use allowed file types from WordPress"
msgstr "वर्डप्रेस से अनुमत फ़ाइल प्रकारों का उपयोग करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
#, fuzzy
msgid "Enable File manager"
msgstr "फ़ाइल प्रबंधक सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
#, fuzzy
msgid "Upload folder"
msgstr "फ़ोल्डर अपलोड करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
#, fuzzy
msgid "Changing this will only affect future uploads."
msgstr "इसे बदलने से केवल भविष्य के अपलोड प्रभावित होंगे।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
#, fuzzy
msgid "Enable pop-up message on uploads"
msgstr "अपलोड पर पॉप-अप संदेश सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
#, fuzzy
msgid "Enables a pop-up when uploads are made."
msgstr "अपलोड किए जाने पर पॉप-अप सक्षम करता है."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
#, fuzzy
msgid "Enable upload success message"
msgstr "अपलोड सफलता संदेश सक्षम करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
#, fuzzy
msgid "Indicates if the upload was successful with a message."
msgstr "इंगित करता है कि संदेश के साथ अपलोड सफल रहा या नहीं."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
#, fuzzy
msgid "Allowed file types"
msgstr "अनुमत फ़ाइल प्रकार"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
#, fuzzy
msgid "Select which file types the user will be allowed to upload."
msgstr "चुनें कि उपयोगकर्ता को किन फ़ाइल प्रकारों को अपलोड करने की अनुमति दी जाएगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
#, fuzzy
msgid "Select file types"
msgstr "फ़ाइल प्रकारों का चयन करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
#, fuzzy
msgid "Custom types"
msgstr "कस्टम प्रकार"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
#, fuzzy
msgid "Select custom file types the user will be allowed to upload separated by commas."
msgstr "कस्टम फ़ाइल प्रकारों का चयन करें उपयोगकर्ता को अल्पविराम द्वारा अलग अपलोड करने की अनुमति दी जाएगी।"

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
#, fuzzy
msgid "File manager"
msgstr "फ़ाइल प्रबंधक"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
#, fuzzy
msgid "CSS code"
msgstr "सीएसएस कोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
#, fuzzy
msgid "Only enter pure CSS code without and style tags"
msgstr "केवल शुद्ध सीएसएस कोड और शैली टैग के बिना दर्ज करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
#, fuzzy
msgid "JavaScript code"
msgstr "JavaScript कोड"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
#, fuzzy
msgid "Only enter pure JavaScript code without and script tags"
msgstr "केवल शुद्ध जावास्क्रिप्ट कोड और स्क्रिप्ट टैग के बिना दर्ज करें"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
#, fuzzy
msgid "Add Constant"
msgstr "स्थिरांक जोड़ें"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
#, fuzzy
msgid "Error connecting to server!"
msgstr "सर्वर से कनेक्ट करने में त्रुटि!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
#, fuzzy
msgid "Error getting data from the server!"
msgstr "सर्वर से डेटा प्राप्त करने में त्रुटि!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
#, fuzzy
msgid "License activated!"
msgstr "लाइसेंस सक्रिय!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
#, fuzzy
msgid "License deactivated!"
msgstr "लाइसेंस निष्क्रिय!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
#, fuzzy
msgid "Invalid action."
msgstr "अमान्य क्रिया."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
#, fuzzy
msgid "Please fill all fields before trying to activate."
msgstr "सक्रिय करने का प्रयास करने से पहले कृपया सभी फ़ील्ड भरें."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
#, fuzzy
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr "प्लगइन इंटरफ़ेस के बाहर से सक्रिय करने की कोशिश करने की अनुमति नहीं है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
#, fuzzy
msgid "Error connecting to Envato API. Please try again later."
msgstr "Envato API से कनेक्ट करने में त्रुटि. कृपया बाद में पुन: प्रयास करें."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
#, fuzzy
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr "अपने टोकन के लिए एक अमान्य खरीद कोड के साथ सक्रिय करने की कोशिश कर रहा है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
#, fuzzy
msgid "Envato rate limit exceeded! Please try again later."
msgstr "एनवाटो दर सीमा पार हो गई! कृपया बाद में पुन: प्रयास करें."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
#, fuzzy
msgid ""
"That username is not valid for this item purchase code. Please make sure you entered the "
"correct username (case sensitive)."
msgstr ""
"वह उपयोगकर्ता नाम इस आइटम खरीद कोड के लिए मान्य नहीं है. कृपया सुनिश्चित करें कि आपने सही उपयोगकर्ता नाम "
"(मामला संवेदनशील) दर्ज किया है।"

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
#, fuzzy
msgid "Trying to activate from an invalid domain!"
msgstr "किसी अमान्य डोमेन से सक्रिय करने का प्रयास कर रहा है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
#, fuzzy
msgid "Trying to activate from an invalid IP address!"
msgstr "किसी अमान्य IP पते से सक्रिय करने का प्रयास कर रहा है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
#, fuzzy
msgid "The purchase code is already activated!"
msgstr "खरीद कोड पहले से ही सक्रिय है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
#, fuzzy
msgid "The purchase code is already activated on another domain!"
msgstr "खरीद कोड पहले से ही किसी अन्य डोमेन पर सक्रिय है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
#, fuzzy
msgid "You have already activated that purchase code on another domain!"
msgstr "आपने पहले से ही उस खरीद कोड को किसी अन्य डोमेन पर सक्रिय कर दिया है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
#, fuzzy
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "खरीद कोड पहले से ही सक्रिय है! कृपया एक वैध लाइसेंस खरीदें!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
#, fuzzy
msgid "You have already activated your purchase code!"
msgstr "आपने पहले से ही अपना खरीद कोड सक्रिय कर दिया है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
#, fuzzy
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr "निष्क्रिय कर दिया गया, लेकिन किसी कारण से खरीद कोड सक्रिय नहीं किया गया था!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
#, fuzzy
msgid "Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr "निष्क्रिय नहीं किया जा सकता. खरीद कोड आपकी सहेजी गई लाइसेंस कुंजी के लिए मान्य नहीं है!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
#, fuzzy
msgid "Could not complete request!"
msgstr "अनुरोध पूरा नहीं कर सका!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
#, fuzzy
msgid "Downloading package from Envato market..."
msgstr "Envato बाजार से पैकेज डाउनलोड करें ..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
#, fuzzy
msgid "Error! Can't connect to filesystem"
msgstr "भूल! फ़ाइल सिस्टम से कनेक्ट नहीं हो सकता"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "To receive automatic updates license activation is required."
msgstr "स्वचालित अद्यतन प्राप्त करने के लिए लायसेंस सक्रियण आवश्यक है."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "कृपया अतिरिक्त उत्पाद विकल्प सक्रिय करें."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
#, fuzzy
msgid "Error! Envato API error"
msgstr "भूल! Envato API त्रुटि"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
#, fuzzy
msgid "Error on unzipping package"
msgstr "अनज़िपिंग पैकेज पर त्रुटि"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "Download new version from CodeCanyon"
msgstr "कोडकैन्यन से नया संस्करण डाउनलोड करें"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "or register the plugin to receive automatic updates."
msgstr "या स्वचालित अद्यतन प्राप्त करने के लिए प्लगइन पंजीकृत करें."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, fuzzy, php-format
msgid "Add translation to %s"
msgstr "%s में अनुवाद जोड़ें"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, fuzzy, php-format
msgid "Edit the %s translation"
msgstr "%s अनुवाद संपादित करें"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "भाषा"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, fuzzy, php-format
msgid "Language of this %s"
msgstr "इस %s की भाषा"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
#, fuzzy
msgid "This is a translation of"
msgstr "यह किसका अनुवाद है?"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
#, fuzzy
msgid "Enable discounts on extra options"
msgstr "अतिरिक्त विकल्पों पर छूट सक्षम करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This configuration will "
"automatically synchronize with the setting of the discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
#, fuzzy
msgid "Base original price type according to"
msgstr "आधार मूल मूल्य प्रकार के अनुसार"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "सेट करें कि किस मूल्य प्रकार पर उनके मूल मूल्य का आधार होगा।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
#, fuzzy
msgid "No change"
msgstr "कोई बदलाव नहीं"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
#, fuzzy
msgid "Undiscounted product price"
msgstr "बिना छूट वाले उत्पाद की कीमत"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
#, fuzzy
msgid "Enable alteration of pricing table"
msgstr "मूल्य निर्धारण तालिका में परिवर्तन सक्षम करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
#, fuzzy
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr "मूल्य निर्धारण तालिका में विकल्प मूल्यों को शामिल करने में सक्षम करने के लिए जाँच करें।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
#, fuzzy
msgid "Prefix label"
msgstr "उपसर्ग लेबल"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
#, fuzzy
msgid "Display a prefix label on product page."
msgstr "उत्पाद पृष्ठ पर कोई उपसर्ग लेबल प्रदर्शित करें."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
#, fuzzy
msgid "Suffix label"
msgstr "प्रत्यय लेबल"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
#, fuzzy
msgid "Display a suffix label on product page."
msgstr "उत्पाद पृष्ठ पर प्रत्यय लेबल प्रदर्शित करें."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
#, fuzzy
msgid "Label CSS selector"
msgstr "लेबल सीएसएस चयनकर्ता"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
#, fuzzy
msgid ""
"Enter a CSS selector to override the default label where the discount string will be displayed."
msgstr "डिफ़ॉल्ट लेबल को ओवरराइड करने के लिए एक सीएसएस चयनकर्ता दर्ज करें जहां छूट स्ट्रिंग प्रदर्शित की जाएगी।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
#, fuzzy
msgid "Discount string placement"
msgstr "डिस्काउंट स्ट्रिंग प्लेसमेंट"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
#, fuzzy
msgid "Select the placement of the discounted string compared to the label."
msgstr "लेबल की तुलना में रियायती स्ट्रिंग के प्लेसमेंट का चयन करें."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
#, fuzzy
msgid "After"
msgstr "के बाद"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
#, fuzzy
msgid "Before"
msgstr "सामने"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
#, fuzzy
msgid "Enable showing option prices in the Order"
msgstr "ऑर्डर में विकल्प मूल्य दिखाने में सक्षम करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
#, fuzzy
msgid ""
"Enable this at your own risk since it is not possible to calculate option discounts on the "
"Order page."
msgstr "इसे अपने जोखिम पर सक्षम करें क्योंकि ऑर्डर पृष्ठ पर विकल्प छूट की गणना करना संभव नहीं है।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
#, fuzzy
msgid "WooCommerce Bookings"
msgstr "WooCommerce बुकिंग"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
#, fuzzy
msgid "Multiply cost by person count"
msgstr "लागत को व्यक्ति की गणना से गुणा करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
#, fuzzy
msgid "Enabling this will multiply the options price by the person count."
msgstr "इसे सक्षम करने से व्यक्ति की गिनती से विकल्प मूल्य कई गुना बढ़ जाएगा।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
#, fuzzy
msgid "Using booking setting"
msgstr "बुकिंग सेटिंग का उपयोग करना"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
#, fuzzy
msgid "Multiply cost by block count"
msgstr "ब्लॉक गणना से लागत गुणा करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
#, fuzzy
msgid "Enabling this will multiply the options price by the block count."
msgstr "इसे सक्षम करने से ब्लॉक गिनती से विकल्प मूल्य कई गुना बढ़ जाएगा।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
#, fuzzy
msgid "Add option cost to booking display price"
msgstr "बुकिंग प्रदर्शन मूल्य में विकल्प लागत जोड़ें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
#, fuzzy
msgid "Enabling this will add the option prices to the calculated booking cost."
msgstr "इसे सक्षम करने से गणना की गई बुकिंग लागत में विकल्प मूल्य जुड़ जाएंगे।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
#, fuzzy
msgid "Dynamic Pricing & Discounts"
msgstr "डायनेमिक मूल्य निर्धारण और छूट"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
#, fuzzy
msgid "Enabling this will apply the product discounts to the extra options as well."
msgstr "इसे सक्षम करने से उत्पाद छूट अतिरिक्त विकल्पों पर भी लागू होगी।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
#, fuzzy
msgid "WooCommerce Easy Bookings"
msgstr "WooCommerce आसान बुकिंग"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
#, fuzzy
msgid "WooCommerce Measurement Calculator"
msgstr "WooCommerce माप कैलकुलेटर"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
#, fuzzy
msgid "Multiply options cost by area"
msgstr "क्षेत्र के आधार पर विकल्प लागत गुणा करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
#, fuzzy
msgid "Enabling this will multiply the options price by the calculated area."
msgstr "इसे सक्षम करने से विकल्प मूल्य गणना क्षेत्र से गुणा हो जाएगा।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
#, fuzzy
msgid "Divide price with measurement"
msgstr "माप के साथ मूल्य विभाजित करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
#, fuzzy
msgid "This will divide the original price with the needed measurement."
msgstr "यह आवश्यक माप के साथ मूल मूल्य को विभाजित करेगा।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
#, fuzzy
msgid "WooCommerce Subscriptions"
msgstr "WooCommerce सदस्यताएँ"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "ऐडऑन को फिर से ऑर्डर पर शामिल करें"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the order again "
"functionality manually."
msgstr "इसे सक्षम करने से मैन्युअल रूप से ऑर्डर का उपयोग करते समय सहेजे गए ऐडऑन सदस्यता में जुड़ जाएंगे।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
#, fuzzy
msgid "Sign up fee"
msgstr "साइन अप शुल्क"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
#, fuzzy
msgid "sign-up fee"
msgstr "साइन-अप शुल्क"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
#, fuzzy
msgid "and a"
msgstr "और ए।"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, fuzzy, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "हर %2$s %1$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
#, fuzzy
msgid "Subscription sign up fee text"
msgstr "सदस्यता साइन अप शुल्क पाठ"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
#, fuzzy
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr "सदस्यता साइन अप शुल्क पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
#, fuzzy
msgid "Sign up fee text"
msgstr "साइन अप शुल्क पाठ"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
#, fuzzy
msgid "Enter the Sign up fee text or leave blank for default."
msgstr "साइन अप शुल्क पाठ दर्ज करें या डिफ़ॉल्ट रूप से रिक्त छोड़ दें."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
#, fuzzy
msgid "Subscription sign up fee"
msgstr "सदस्यता साइन अप शुल्क"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
#, fuzzy
msgid "Options Subscription fee"
msgstr "विकल्प सदस्यता शुल्क"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "\"%1$s\" की मात्रा %2$s से अधिक होनी चाहिए"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, fuzzy, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr "कार्ट में जोड़े जाने के लिए \"%s\" की मात्रा 0 से अधिक होनी चाहिए."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, fuzzy, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "आप केवल %2$s के लिए %1$s विकल्प का चयन कर सकते हैं।"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, fuzzy, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "आप केवल %2$s के लिए %1$s विकल्पों का चयन कर सकते हैं।"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "आपको %2$s के लिए बिल्कुल %1$s विकल्प चुनना होगा।"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, fuzzy, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "आपको %2$s के लिए बिल्कुल %1$s विकल्पों का चयन करना होगा."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "आपको %2$s के लिए कम से कम %1$s विकल्प का चयन करना होगा."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, fuzzy, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "आपको %2$s के लिए कम से कम %1$s विकल्पों का चयन करना होगा."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
#, fuzzy
msgid "Invalid date entered!"
msgstr "अमान्य दिनांक दर्ज किया गया!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
#, fuzzy
msgid "Invalid data submitted!"
msgstr "अमान्य डेटा सबमिट किया गया!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
#, fuzzy
msgid "Invalid year date entered!"
msgstr "अमान्य वर्ष दिनांक दर्ज किया गया!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
#, fuzzy
msgid "You cannot select that date!"
msgstr "आप उस तिथि का चयन नहीं कर सकते!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, fuzzy, php-format
msgid "(max file size %s)"
msgstr "(अधिकतम फ़ाइल आकार %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, fuzzy, php-format
msgid "%s is not a valid image file!"
msgstr "%s कोई मान्य छवि फ़ाइल नहीं है!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
#, fuzzy
msgid "Upload successful"
msgstr "सफल अपलोड करें"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, fuzzy, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "आपको \"%2$s\" के लिए कम से कम %1$s वर्ण दर्ज करने होंगे."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "आप \"%2$s\" के लिए %1$s से अधिक वर्ण दर्ज नहीं कर सकते."

#: includes/functions/epo-functions.php:291
#, fuzzy
msgid "Everyone"
msgstr "सभी"

#: includes/functions/epo-functions.php:294
#, fuzzy
msgid "Logged in users"
msgstr "लॉग इन उपयोगकर्ता"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
#, fuzzy
msgid "Echo a custom action"
msgstr "एक कस्टम क्रिया को प्रतिध्वनित करें"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
#, fuzzy
msgid "EPO custom action"
msgstr "EPO कस्टम क्रिया"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "शीर्षक:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
#, fuzzy
msgid "Custom action:"
msgstr "कस्टम क्रिया:"

#: templates/_choice_description.php:20 templates/_price.php:20 templates/_quantity.php:20
#, fuzzy, php-format
msgid "%s does not exist."
msgstr "%s मौजूद नहीं है."

#: templates/products/template-image.php:59
#, fuzzy
msgid "Awaiting product image"
msgstr "उत्पाद छवि की प्रतीक्षा"

#: templates/products/template-item.php:90
#, fuzzy
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
#, fuzzy
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "रिक्त"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "मात्रा"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "कोई विकल्प चुनें"

#, fuzzy
#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#, fuzzy
#~ msgid "Hide extra options prices in cart"
#~ msgstr "कार्ट में अतिरिक्त विकल्प मूल्य छुपाएँ"

#, fuzzy
#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr "कार्ट में विकल्पों की कीमतों के प्रदर्शन को सक्षम या अक्षम करता है."

#, fuzzy
#~ msgid "Show bottom"
#~ msgstr "नीचे दिखाएँ"

#, fuzzy
#~ msgid "Show inside"
#~ msgstr "अंदर दिखाएँ"

#, fuzzy
#~ msgid "Disable categories"
#~ msgstr "श्रेणियाँ अक्षम करें"

#, fuzzy
#~ msgid "Submit for Review"
#~ msgstr "समीक्षा के लिए सबमिट करें"

#, fuzzy
#~ msgid "Show Both Final and Options total box"
#~ msgstr "अंतिम और विकल्प कुल बॉक्स दोनों दिखाएँ"

#, fuzzy
#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "अंतिम बॉक्स दिखाएँ और शून्य होने पर विकल्प छुपाएँ"

#, fuzzy
#~ msgid "Hide Final total box"
#~ msgstr "अंतिम कुल बॉक्स छुपाएँ"

#, fuzzy
#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "हमेशा केवल अंतिम कुल (मूल्य x मात्रा) दिखाएँ"

#, fuzzy
#~ msgid "Disable but change product prices"
#~ msgstr "उत्पाद की कीमतों को अक्षम करें लेकिन बदलें"

#, fuzzy
#~ msgid "Select when to show the final total box"
#~ msgstr "अंतिम कुल बॉक्स दिखाने के लिए कब चुनें"

#, fuzzy
#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "अंतिम कुल दिखाएं और शून्य होने पर कुल विकल्प छिपाएँ"
languages/woocommerce-tm-extra-product-options-es_ES.po000064400001076723150755142440017322 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:52+0200\n"
"PO-Revision-Date: 2024-03-07 11:52+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Opciones extras del producto"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "Tarifas de Opciones de Producto Extra"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "Ver configuración Extra Product Options"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Ajustes"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
#, fuzzy
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Opciones de productos adicionales y complementos para WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Más información sobre %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Ver detalles"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "Ver documentación de Extra Product Options"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Documentos"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "Visitar el foro de soporte prémium para clientes"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Soporte de pago"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Copiar)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Variación #%1$s de %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "Aún no hay variaciones guardadas."

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "No se pueden agregar más opciones extra."

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "¿Seguro que quieres eliminar esta opción?"

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Antes de agregar opciones de productos adicionales, agregue y guarde algunos "
"atributos en la pestaña Atributos."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Cantidad fija"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "Porcentaje del precio original"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
#, fuzzy
msgid "Error"
msgstr "Error"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "¡Solicitud no válida!"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "¿Está seguro de que desea eliminar esta carpeta y todo su contenido?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "¿Estás seguro de que quieres eliminar este archivo?"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "¿Está seguro de que desea restablecer la configuración?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Sí"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "No"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Cancelar"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Cerrar"

#: admin/class-themecomplete-epo-admin-base.php:1284
#, fuzzy
msgid "Constant name"
msgstr "Nombre de la constante"

#: admin/class-themecomplete-epo-admin-base.php:1285
#, fuzzy
msgid "Constant value"
msgstr "Valor constante"

#: admin/class-themecomplete-epo-admin-base.php:1286
#, fuzzy
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Marque la casilla de verificación de consentimiento para dar su permiso para "
"enviar sus datos al servidor e inténtelo de nuevo."

#: admin/class-themecomplete-epo-admin-base.php:1287
#, fuzzy
msgid "Connecting to activation server ..."
msgstr "Conectándose al servidor de activación..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, fuzzy, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Opción de producto extra #%1$s de %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "No se pudo actualizar publicación en la base de datos"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "¿Habilitar la visualización de puntos?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr "Esto le permite generar puntos a lo largo del selector de rango."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "Número de puntos"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "Introduzca el número de valores para la visualización de puntos."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Lado izquierdo"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Lado derecho"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr "Descripción Tooltip  a la izquierda"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr "Descripción Tooltip  a la derecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr "Mostrar valor en"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr "Seleccione cómo mostrar el valor del selector de rango."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "Valor de paso"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "Introduzca el paso para el controlador."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Sin validación"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "Email"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "Url"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Número"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Dígitos"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "Solo letras"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr "Solo letras o espacio"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Alfanumérico"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "Unicode alfanumérico"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "Unicode alfanumérico o espacio"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr "Validar"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Elija si el campo se validará con el método elegido."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
#, fuzzy
msgid "Required"
msgstr "Requerido"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr "Elija si el usuario debe rellenar este campo o no."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Habilitado"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr "Elija si la opción está habilitada o no."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr "Introduzca el precio de este campo o déjelo en blanco sin precio."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Precio de venta"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Introducir el precio de venta para este campo o dejarlo blanco para usar el "
"precio por defecto."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
msgid "Text after Price"
msgstr "Texto después del precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Introduzca un texto para mostrar después del precio para este campo o "
"dejarlo en blanco sin texto."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
msgid "Text before Price"
msgstr "Texto antes del precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Introduzca un texto para mostrar antes del precio para este campo o dejarlo "
"en blanco sin texto."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr "Porcentaje del precio original + opciones"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr "Precio por palabra"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr "Porcentaje del precio original por palabra"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "Precio por palabra (sin n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr "Porcentaje del precio original por palabra (sin n-ésimo carácter)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
msgid "Price per character"
msgstr "Precio por personaje"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "Porcentaje del precio original por personaje"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "Precio por carácter (sin primer carácter)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "Precio por carácter (sin enésimo carácter)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "Precio por carácter (sin enésimo carácter y sin espacios)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "Porcentaje del precio original por personaje (sin primer carácter)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr "Porcentaje del precio original por carácter (sin n-ésimo carácter)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Porcentaje del precio original por carácter (sin n-ésimo carácter y sin "
"espacios)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "Precio por personaje (sin espacios)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
msgid "Price per row"
msgstr "Precio por fila"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr "Fórmula matemática"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
msgid "Fixed amount + options"
msgstr "Cantidad fija + opciones"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "Tabla de consulta"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Tipo de precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Cantidad"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr "Valor actual"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
msgid "Step * price"
msgstr "Paso * precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
msgid "Price per Interval"
msgstr "Precio por intervalo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
#| msgid "Section type"
msgid "Calculation type"
msgstr "Tipo de sección"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Ninguno"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "ID de elemento para x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr ""
"Introduzca el identificador de elemento que se utilizará para la columna x."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "ID de elemento para y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr ""
"Introduzca el identificador de elemento que se utilizará para la columna y."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
msgid "Set to Fee"
msgstr "Establecer como tarifa"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Adjunte el precio al pedido haciéndolo independiente de la cantidad del "
"producto."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "Personajes libres"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "Introduzca el número de caracteres libres."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Valor mínimo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr "Ingrese el valor mínimo."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Valor máximo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr "Ingrese el valor máximo."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "Día / mes / año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
msgid "Month / Day / Year"
msgstr "Mes / día / año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "Día . Mes . Año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
msgid "Month . Day . Year"
msgstr "Mes . Día . Año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "Día - mes - año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
msgid "Month - Day - Year"
msgstr "Mes - día - año"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr "Año/Mes/día"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr "Año / Día / Mes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr "Año. Mes. Día"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr "Año. Día. Mes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr "Año - Mes - Día"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr "Año - Día - Mes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Formato de fecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
msgid "HH:m"
msgstr "HH: m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr "H: m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr "HH: m: ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr "HH: mm: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH: m: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H: mm: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
msgid "hh:m"
msgstr "hh: m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
msgid "h:m"
msgstr "h: m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
msgid "hh:m:ss"
msgstr "hh: m: ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr "hh: mm: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr "hh: m: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr "h: mm: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Formato de hora"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr "Formato de hora personalizado"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr "Esto anulará el formato de hora anterior."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
msgid "Start year"
msgstr "Año de inicio"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr "Ingrese el año de inicio."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr "Año final"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr "Entrar  final de año."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr "Usar reemplazos de URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "Elija si desea redirigir a una URL si la opción es hacer clic."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr "Rellenar opciones"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr ""
"Haga doble clic en el botón de radio para eliminar su atributo seleccionado."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr "Opciones de variación"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
msgid "Image swatches"
msgstr "Muestras de imágenes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
msgid "Color swatches"
msgstr "Muestras de color"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
#, fuzzy
msgid "Text swatches"
msgstr "Muestras de texto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
#, fuzzy
msgid "Replacement mode"
msgstr "Modo de reemplazo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
#, fuzzy
msgid "Select how to display the element."
msgstr "Seleccione cómo mostrar el elemento."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr "Inicio de la etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Centro"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
msgid "End of the label"
msgstr "Fin de la etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr "Posición de la muestra"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
#, fuzzy
msgid "Choose how the swatch will be displayed."
msgstr "Elija cómo se mostrará la muestra."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
msgid "Use image lightbox"
msgstr "Usar lightbox de imágenes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "Elija si desea habilitar la caja de luz en la imagen miniatura."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr "Utilice los reemplazos de imágenes"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr "Establecer imagen personalizada"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "Cambia la imagen del producto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr "Elija si desea cambiar la imagen del producto."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Mostrar etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Mostrar descripción"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr "Mostrar etiqueta y descripción"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Mostrar imagen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr "Mostrar imagen y etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
msgid "Show image and description"
msgstr "Mostrar imagen y descripción"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr "Mostrar imagen, etiqueta y descripción"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "Mostrar tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr ""
"Al habilitar esto, se mostrará una información sobre herramientas sobre la "
"elección."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr "Habilitar el botón de borrar opciones"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr "Esto agregará un botón para borrar la opción seleccionada."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
msgid "Show responsive values"
msgstr "Muestre valores receptivos"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "auto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr "Artículos por fila (ordenadores de sobremesa y portátiles)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Utilice este campo para hacer una visualización de cuadrícula. Ingrese "
"cuántos elementos por fila para la cuadrícula o déjelo en blanco para la "
"visualización normal."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr "Elementos por fila (Tabletas en horizontal)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr "Elementos por fila (Tabletas en vertical)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr "Artículos por fila (Smartphones)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
msgid "Items per row (iPhone 5)"
msgstr "Artículos por fila (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr "Artículos por fila (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr "Artículos por fila (iPhone 6 +)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "Artículos por fila (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Artículos por fila (panorama de Tabletas Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "Limitar la selección"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Ingrese un número superior a 0 para limitar la selección de la casilla de "
"verificación o déjelo en blanco para el comportamiento predeterminado."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
msgid "Exact selection"
msgstr "Selección exacta"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Ingrese un número por encima de 0 para que el usuario seleccione el número "
"exacto de casillas de verificación o déjelo en blanco para el comportamiento "
"predeterminado."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "Selección mínima"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Ingrese un número por encima de 0 para que el usuario seleccione al menos "
"ese número de casillas de verificación o déjelo en blanco para el "
"comportamiento predeterminado."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr "Botón del navegador normal"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "Botón con estilo"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr "Carregar estilo del botón"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Campo de fecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Selector de Fechas"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr "Campo de selector de fecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr "Estilo selector de fecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Ocultar precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr "Elija si ocultar el precio o no."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Deshabilitar"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Derecha"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Izquierda"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Arriba"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "Abajo"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr "Selector de cantidad"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr "Esto mostrará un selector de cantidad para esta opción."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "Cantidad de valor mínimo"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr "Cantidad valor máximo"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "Paso de cantidad"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr "Introducir la cantidad de pasos."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
msgid "Quantity Default value"
msgstr "Cantidad Valor predeterminado"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr ""
"Introduzca un valor para ser aplicado al campo Cantidad automáticamente."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Marcador de posición"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Caracteres mínimos"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""
"Ingrese un valor para los caracteres mínimos que debe ingresar el usuario."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "Caracteres máximos"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Ingrese un valor para limitar el número máximo de caracteres que puede "
"ingresar el usuario."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Valor predeterminado"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr "Introduzca un valor que se aplicará al campo automáticamente."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Tamaño"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "Reducir el ancho"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
msgid "Increase Width"
msgstr "Aumentar el ancho"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "Editar elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "Duplicar Elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "Tienda"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Editar sección"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "Duplicar sección"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Sección"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Agregar elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr "Elija la imagen para usar en lugar del botón de opción."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
msgid "Remove the image."
msgstr "Eliminar esta imagen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr "Elija la imagen para reemplazar la imagen del producto."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
msgid "Select boxes"
msgstr "Seleccionar cajas"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Botones de selección (radio)"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr "Botones Radio e imagen al principio de la etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
msgid "Radio buttons and image at end of the label"
msgstr "Botones Radio e imagen al final de la etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Mostrar como"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
msgid "Select the display type of this attribute."
msgstr "Seleccione cómo se mostrará este atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Etiqueta de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
msgid "Leave blank to use the original attribute label."
msgstr "Déjelo en blanco para usar la etiqueta de atributo original."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
#, fuzzy
msgid "Enable"
msgstr "Habilitar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "Mostrar botón limpiar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "Habilita la visualización de un botón de limpiar para este atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
msgid "Attribute element class name"
msgstr "Nombre de clase de elemento de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr "Introduzca un nombre de clase para agregar a este elemento de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Ancho"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Introduzca el ancho del elemento a mostrar o deje en blanco ancho automático."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Altura"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Introduzca el alto para mostrar elemento o deje en blanco alto automático."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Ocultar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "Mostrar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
msgid "Show attribute name"
msgstr "Mostrar nombre de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr "Elige mostrar u ocultar nombre de atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Color"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "Selecciona el color a usar."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
msgid "Image replacement"
msgstr "Reemplazo de imagen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr "Seleccione una imagen para este término."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
msgid "Product Image replacement"
msgstr "Reemplazar imagen del producto"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr "Seleccione la imagen que reemplazará la del producto."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
msgid "No saved variations found."
msgstr "No se han encontrado variaciones guardadas."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr "Elegir la imagen a utilizar en lugar de casilla de verificación."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Elegir la imagen a utilizar en lugar del botón de radio cuando está clicado."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Elija la imagen para usar en lugar de la casilla de verificación cuando esté "
"marcada."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
msgid "Choose the image for the lightbox."
msgstr "Elija la imagen para la caja de luz."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "Eliminar todas las opciones"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Comprobado"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Por defecto"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
#, fuzzy
msgid "Choice label"
msgstr "Etiqueta de elección"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Tipo de Precio"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Descripción"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Agregar elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "Agregar separador"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
msgid "Mass add"
msgstr "Añadir en masa"

#: admin/class-themecomplete-epo-admin-csv.php:41
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"Las funciones php mb_detect_encoding y mb_convert_encoding son necesarias "
"para importar y exportar archivos CSV. Pídale a su proveedor de alojamiento "
"que habilite esta función."

#: admin/class-themecomplete-epo-admin-csv.php:289
msgid "Invalid CSV file."
msgstr "Archivo CSV inválido."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr "El archivo subido excede la directiva upload_max_filesize en php.ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr ""
"El archivo cargado excede el MAX_FILE_SIZE especificado en el formulario "
"HTML."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "El archivo cargado sólo fue parcialmente subido."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "No se ha subido ningún archivo."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Falta una carpeta temporal."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Error al escribir el archivo en el disco."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "Subida de archivo frenada por una extensión."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""
"Lo sentimos, este tipo de archivo no está permitido por razones de seguridad."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "Archivo no encontrado."

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr "No es válido en método de importación utilizado."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "Archivo importado."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "¡El archivo CSV no es válido!"

#: admin/class-themecomplete-epo-admin-csv.php:552
msgid "Invalid CSV file!"
msgstr "Archivo CSV inválido!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "Archivos de más de%s que está tratando de subir no está permitido!"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "Archivo importado con tablas nuevas."

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "Se ha producido un error al importar el archivo CSV."

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Se ha producido un error al guardar los datos csv. ¡Por favor, compruebe la "
"codificación de su archivo csv!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr "Los nombres de las tablas son diferentes. ¿Desea anular las tablas?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr "Datos incorrectos!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
msgid "Something went wrong with the request!"
msgstr "¡Algo salió mal con la solicitud!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "¡Opciones guardadas!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "Incluir formulario adicional Global"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(sin título)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Limpiar todos los formularios globales adicionales"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "Deshabilitar la exclusión de las opciones globales"

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr "Habilitar la exclusión de las opciones globales"

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr "Eliminar todas las opciones del producto"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "Administrador de archivos no es compatible con el servidor."

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "Se han restablecido los ajustes."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "Ha habido un error al guardar los ajustes."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Tus opciones han sido guardadas."

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "Clonar plantilla"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Clonar formulario"

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr "Exportar formulario"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr "Constructor de formulario para las Opciones de Producto"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Título"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Prioridad"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Solicitado el"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Categorías"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Productos"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr "Productos excluidos"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "Todos los productos"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Desactivado"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "Productos y Categorías"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Código Personalizado"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "Todas las categorias"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
#| msgid "CSS Settings"
msgid "Form settings"
msgstr "Ajustes CSS"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Publicar"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Roles"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Excluir productos"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr "La descripción aparecerá debajo del título."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr "Roles habilitados para este formulario"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr "Usuarios deshabilitados para este formulario"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr "Excluir producto (s) del formulario"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Buscar un producto&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Seleccione el (los) producto (s) para aplicar las opciones"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
#, fuzzy
msgid "Meta data not correctly saved. Please save the product!"
msgstr ""
"Los metadatos no se han guardado correctamente. ¡Por favor, guarde el "
"producto!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Añadir sección"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr "Variaciones de estilo"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Guardar"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "Importar CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "Exportar CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr "Tamaño completo"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr "¡Guarde el formulario antes de importar opciones!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr "¡Guarde el producto antes de importar opciones!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
#, fuzzy
msgid "No elements found!"
msgstr "¡No se han encontrado elementos!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr "Comience a agregar elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "Añadir elemento en una nueva sección"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Borrar permanentemente"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "Mover a la Papelera"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Actualizar"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
#| msgid "Self mode"
msgid "Apply mode"
msgstr "Auto-Modo"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "Todos los productos"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Precio personalizado"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr "Algo salió mal con WordPress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "¡WooCommerce no está habilitado!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Haciendo trampa, ¿eh?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr "No se permite trasladar este elemento a la papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Error al mover a la papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr "No está autorizado para restaurar este elemento de la Papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Error en la restauración de la papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "No está autorizado para borrar este elemento."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Error al eliminar."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr "El artículo que intenta mover a papelera, ya no existe."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "Tipo de Contenido desconocido."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"Este artículo se puede mover a la papelera. Actualmente está editando %s."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""
"El artículo que usted está tratando de restaurar  desde la papelera,  ya no "
"existe."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr "No puedes sacar este elemento de la Papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr "Este tema ya ha sido eliminado."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr "S'ha intentat editar un element inexistent. Potser va ser eliminat?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "Usted no está autorizado para editar este elemento."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"No puedes editar esto ya que está en la Papelera. Restáurala de la Papelera "
"e inténtalo de nuevo."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s post actualizado."
msgstr[1] "%s entradas actualizadas."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "1 entrada no actualizada, alguien más está editándola."
msgstr[1] "%s entradas no actualizadas, alguien más está editándolas."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s entradas eliminadas."
msgstr[1] "%s entradas borradas permanentemente."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "post movido a la papelera."
msgstr[1] "%s entradas movidos a la papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "1 entrada restaurada de la basura."
msgstr[1] "%s entradas restauradas de la papelera."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "El formulario seleccionado, no tiene ninguna sección"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Mostrar filtros"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "Ocultar filtros"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Filtrar por"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "en"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "¿Está seguro de que desea eliminar este artículo?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr "¿Está seguro de que quiere ducplicar este elemento?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Editar ajustes"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "ID de elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "ID de Sección"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "es"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "no es"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "está vacía"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "no está vacío"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "comienza con"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "termina con"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "mayor que"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "menor que"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr "mayor o igual que"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr "es menor que o igual a"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"No se pueden aplicar reglas en este elemento o sección porque no hay "
"elementos configurados de valor en otras secciones, o no se encontraron "
"otras secciones."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""
"¡Se ha producido un error! ¡No se pueden aplicar condiciones a este elemento!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "Poblar"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "Extensión de archivo no válida"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr "Importando csv ..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr "Guardando datos, espere por favor."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "Importando datos"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "Editar precio"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
#, fuzzy
msgid "Edit tab"
msgstr "Pestaña Editar"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr "Sobrescribir elementos existentes"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr "Anexar nuevos elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "El formulario se aplica a todos los productos"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "El formulario no se aplica a ningún producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Cargando…"

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "Variables de producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
#| msgid "Global variables"
msgid "Special variables"
msgstr "Variables globales"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr "Variables globales"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Mostrar opciones Total"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Options Total"
msgstr "Precio original del producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Cumulative Total"
msgstr "Precio original del producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "Cantidad de productos"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr "Precio original del producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
#| msgid "Original product price"
msgid "Dynamic product price"
msgstr "Precio original del producto"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr "Quitar elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr "El valor de este elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr "La longitud del valor de este elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr "La cantidad de opciones que el usuario ha seleccionado"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr "La cantidad total de este elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr "La cantidad de este elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr "Otros elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "El precio del elemento objetivo"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Valor"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "El valor del elemento de destino convertido en flotante"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Texto"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "El valor bruto del elemento de destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
msgid "Text length"
msgstr "Longitud del texto"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "La longitud del texto del elemento de destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "La cantidad total del elemento objetivo"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Contar"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr ""
"El número de opciones que el usuario ha seleccionado en el elemento de "
"destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Todo"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Copiar"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Mina <span class=\"count\">(%s)</span>"
msgstr[1] "Mina <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Todo <span class=\"count\">(%s)</span>"
msgstr[1] "Todo <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Adherente <span class=\"count\">(%s)</span>"
msgstr[1] "Adherente <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "¡Tabla CSV no válida!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "¡Se ha producido un error!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "Sobrescribir tablas existentes"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "Tabla de búsqueda"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "¡No se encontró ninguna tabla CSV!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "Importe uno haciendo clic en el botón de abajo."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Nombre de la Tabla"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "Índice de la tabla"

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr "Panel de control de la EPO"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "Configuración Extra Opciones de Producto"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Reiniciar ajustes"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Guardar cambios"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "Ninguna"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Haga clic para activar"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Atributo:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Tipo:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Checkbox"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Seleccionar"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Ajustes:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Variación:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Precio:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "Precio personalizado (obligatorio)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Precio personalizado"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Faltan atributos. BORRAR esta opción adicional:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
#, fuzzy
msgid "Percent of the origιnal price"
msgstr "Porcentaje del precio original"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Formulario actualizado."

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "Formulario restaurado a la revisión %s"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "Formulario publicado."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Formulario guardado."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Formulario enviado."

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr "Formulario programado para: %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Borrador del formulario actualizado."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Introduce el título aquí"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Deshacer"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Opción"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Costo"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Cantidad"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Total"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "Impuestos"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Editar elemento"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Eliminar elemento"

#: admin/views/html-tm-epo.php:29
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Antes de agregar opciones adicionales en este modo, agregue y guarde algunos "
"atributos en la pestaña Atributos."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Expandir todo"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Cerrar todo"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "Añadir opción adicional"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "Constructor"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Normal"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Para traducir las cadenas de las opciones locales, utilice la interfaz WPML."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "Desde"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Rango"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "Anulación de visualización de precios"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Esto reemplazará el precio del producto mostrado en las páginas de bucle de "
"tienda / archivo / producto."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Regular"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "Hasta"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Venta"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"Los formularios que elija se mostrarán junto con los formularios que ya "
"tiene el producto."

#: admin/views/html-tm-global-epo.php:206
#, fuzzy
msgid "Exclude from"
msgstr "Excluir de"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Esto excluirá cualquier formulario global asignado a este producto, excepto "
"los definidos en la configuración anterior."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "Anular el precio del producto"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Esto anulará el precio del producto con el precio de las opciones si el "
"precio total de las opciones es mayor que cero."

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr "Anular la visualización global"

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr "Esto anulará el método de visualización solo para este producto."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "Usar configuración global"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "Mostrar siempre"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "Mostrar solo con un gancho de acción"

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr "Anular el cuadro total final"

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr ""
"Esto anulará la visualización del cuadro de totales solo para este producto."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
#| msgid "Hide Final total box if Options total is zero"
msgid "Disable if Options total is zero"
msgstr "Ocultar el cuadro de Total final si el total de opciones es cero"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
msgid "Disable if total is zero"
msgstr "Ocultar cuadro Total final si el total es cero"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Mostrar opciones Total"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr "Esto anulará el método de visualización solo para este producto."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Mostrar cuando el total es mayor que cero"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Mostrar total final"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid "This will Show Final Total setting only for this product."
msgstr "Esto anulará el método de visualización solo para este producto."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
msgid "Override enabled roles for this product"
msgstr "Anular roles habilitados para este producto"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
msgid "This will override which roles can see the options for this product."
msgstr "Esto anulará qué roles pueden ver las opciones para este producto."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "La clonación está prohibida."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "Se prohíbe la serialización de instancias de esta clase."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "¡Gratis!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Seleccionar opciones"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "Añadir al carrito"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
#, fuzzy
msgid "Product element is not supported for components!"
msgstr "¡El elemento de producto no es compatible con los componentes!"

#: includes/class-themecomplete-extra-product-options.php:4984
#, fuzzy
msgid "Product element is not supported within another product element!"
msgstr "¡El elemento de producto no se admite en otro elemento de producto!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Casillas de verificación"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Selector de color"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Fecha"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Domingo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Lunes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Martes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Miércoles"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Jueves"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Viernes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Sábado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr "Enero "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Febrero"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Marzo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "Abril"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Mayo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Junio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Julio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "Agosto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "Septiembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Octubre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "Noviembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "Diciembre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Debe colocarse en formato DD/MM/YYYY, (es decir dos digitos para el dia, "
"otros dos para el mes y cuatro dígitos para el año)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr "Seleccionar fecha mínima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "Varios días a partir de hoy."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr "Fecha máxima seleccionable para una reserva"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Deshabitar fechas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Debe colocarse en formato DD/MM/YYYY, (es decir dos digitos para el dia, "
"otros dos para el mes y cuatro dígitos para el año.)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
msgid "Enabled dates"
msgstr "Fechas habilitadas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Las fechas según su formato de fecha seleccionado separados por comas. (Dos "
"dígitos para día, dos dígitos para el mes y cuatro dígitos para el año). "
"Tenga en cuenta que esto anulará cualquier otra configuración!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr "Blanco Epo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr "Epo Negro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Tema"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "Seleccione el tema para el selector de fechas."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Pequeño"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Mediano"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Grande"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr "Selecciona el Tamaño de DatePicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr "Parte superior de la pantalla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr "Parte inferior de la pantalla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Posición"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr "Seleccione la posición de la datepicker (selector de fechas)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
msgid "Exclude disabled"
msgstr "Excluir discapacitados"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Habilitar esto hará que las fechas seleccionables Mínimo y Máximo no cuenten "
"los días de semana deshabilitados seleccionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr "Desactivar los días de la semana"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr "Esto le permite desactivar todos los días de la semana seleccionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr "Deshabilitar meses"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr "Esto le permite deshabilitar todos los meses seleccionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Traducciones"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Día"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Mes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Año"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Separador"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Opciones generales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Lógica Condicional"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr "Ajustes CSS"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr "Nombre de clase de elemento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr "Introduzca un nombre de clase para agregar a este elemento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "Anular el precio del producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "Cambia la imagen del producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "ID de Sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr ""
"Elija la clase de impuestos para el tipo de precio de tarifa en este "
"elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
#| msgid "Math formula"
msgid "Formula"
msgstr "Fórmula matemática"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "Introduzca el paso para el controlador."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Mostrar como"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
#| msgid "Enter a text to replace the Close button text on the calendar."
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""
"Introduce un texto para cambiar el texto del botón de Cerrar en el "
"calendario."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
#| msgid "Text before Price"
msgid "Text before result"
msgstr "Texto antes del precio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
#| msgid ""
#| "Enter a text to display before the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Introduzca un texto para mostrar antes del precio para este campo o dejarlo "
"en blanco sin texto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
#| msgid "Text after Price"
msgid "Text after result"
msgstr "Texto después del precio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
#| msgid ""
#| "Enter a text to display after the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Introduzca un texto para mostrar después del precio para este campo o "
"dejarlo en blanco sin texto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Encabezado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Tipo de Encabezado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "Titulo de encabezado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the Content"
msgstr "A la izquierda del campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the Content"
msgstr "A la derecha"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Posición del encabezado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Color del encabezado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr "Deja en blanco para el valor predeterminado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Contenido"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "Color del contenido"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
#| msgid "Above field"
msgid "Above Header"
msgstr "Arriba el campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr "Icono del Tooltip a la IZQuierda"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr "Icono del Tooltip a la DERecha"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "Posición del contenido"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
msgid "Multiple Upload"
msgstr "Seleccione Casilla Múltiple"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Producto Individual"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr "Seleccione modo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr "Ya sea para incluir productos o categorías específicos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
#, fuzzy
msgid "Search for a category ..."
msgstr "Buscar una categoría ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Seleccionar categorías"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr "Agregue categorías para incluir todos sus productos asociados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Buscar por un producto ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Seleccionar productos"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr "Agregue los productos individualmente."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr "Selecione um valor"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Precio base"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "Nombre"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Orden del menú"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Aleatorio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Ordenar por"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr "Seleccione el parámetro por el que se ordenarán los productos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Ascendente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Descendente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Orden"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr "Seleccione el orden de clasificación de los productos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Seleccione un producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr "Producto predeterminado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr "Seleccione el producto que será preseleccionado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Desplegable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Miniaturas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
msgid "Thumbnails multiple"
msgstr "Miniaturas múltiples"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "Modo Plantilla del diseño"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr "Seleccione cómo se presentarán los productos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr "Marcador de posición desplegable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr "Ingrese el marcador de posición para el menú desplegable."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Cantidad mínima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Cantidad máxima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr "Enviado individualmente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Si está habilitado, el producto incluido no se envía con el producto "
"principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr "Mantener el peso"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Si esto está habilitado, el producto incluido agregará su peso al producto "
"principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr "Precio individual"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr ""
"Si esto está habilitado, el producto incluido mantendrá su propio precio."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Porcentaje"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Tipo de descuento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Seleccione el tipo de descuento. El descuento se aplica al precio del "
"producto final. Si el producto tiene opciones adicionales, el descuento se "
"aplica al monto después de que las opciones se hayan agregado al precio del "
"producto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Descuento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr "Escriba la cantidad de descuento del código."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "Desactivar complementos"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Si esto está habilitado, no se mostrarán los complementos incluidos que "
"tiene el producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "Exlude los precios de Addon del descuento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Si esto está habilitado, el descuento no se aplicará a los complementos del "
"producto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Carrito"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Pagar"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "Pedidos y correos electrónicos"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "Ocultar producto en"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "Seleccione dónde ocultar el producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr "Habilite para mostrar la imagen del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Mostrar título"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr "Habilite para mostrar el título del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Mostrar título"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
#| msgid "Enable to show the title of the associated product."
msgid "Enable to have the title link to the associated product."
msgstr "Habilite para mostrar el título del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
#, fuzzy
msgid "Show price"
msgstr "Mostrar precio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr "Habilite para mostrar el precio del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr "Habilite para mostrar la descripción del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr "Mostrar meta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
msgid "Enable to show the meta of the associated product."
msgstr "Habilite para mostrar el meta del producto asociado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Opciones avanzadas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr "Selector de rango"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "Opciones de título"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr "Normal (claro)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Caja"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr "Expandir y contraer (comenzar abierto)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr "Expandir y contraer (inicio cerrado)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Acordeón"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr "Estilo de sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr "Seleccione el estilo de visualización de esta sección."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
#, fuzzy
msgid "Section background color"
msgstr "Color de fondo de la sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
#, fuzzy
msgid "Section label background color"
msgstr "Color de fondo de la etiqueta de sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
#, fuzzy
msgid "Section subtitle background color"
msgstr "Color de fondo de los subtítulos de la sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr "Antes de las opciones locales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr "Después de las opciones locales"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr "Colocación de la sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
#, fuzzy
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Seleccione dónde aparecerá esta sección en comparación con Opciones locales."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "Ventana Emergente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr "Control deslizante (asistente)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Pestañas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr "Tipo de sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr "Seleccione el tipo  de visualización de esta sección."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "Texto link"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Botón"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
msgid "Button Alt"
msgstr "Botón Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
msgid "Section pop up button style"
msgstr "Sección estilo de botón emergente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
msgid "Select this section's pop up button style."
msgstr "Seleccione el estilo del botón emergente de esta sección."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
#, fuzzy
msgid "Section pop up button text"
msgstr "Texto del botón emergente de la sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
#, fuzzy
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Introduzca un texto para reemplazar el texto predeterminado del botón "
"emergente. Esto anulará el valor global."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr "Nombre de clase de sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr "Introduzca un nombre de clase para agregar a esta sección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
msgid "Section Conditional Logic"
msgstr "Sección Lógica condicional"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr "Activar la Lógica Condicional para mostrar u ocultar esta sección."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Caja de selección"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr ""
"Esto contará como un valor vacío en caso de que se requiera el elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
#, fuzzy
msgid "Multi-Select Field"
msgstr "Seleccione Casilla Múltiple"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Plantilla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
#, fuzzy
msgid "Select a template ..."
msgstr "Seleccione una plantilla ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Selecciona plantilla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
#, fuzzy
msgid "Add the template you want to display."
msgstr "Agregue la plantilla que desea mostrar."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Área de texto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Campo de texto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
#| msgid "Enter the quantity step."
msgid "Enter the step."
msgstr "Introducir la cantidad de pasos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Hora"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr "Estilo del sistema"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Estilo personalizado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr "Estilo selector de tiempo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
msgid "Minimum selectable time"
msgstr "Tiempo mínimo seleccionable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr "Escriba la hora en el formato siguiente: 8:00 am"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
msgid "Maximum selectable time"
msgstr "Tiempo máximo seleccionable"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr "Seleccione el tema para el selector de tiempo."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr "Seleccione el tamaño del selector de tiempo."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
msgid "Select the position of the timepicker."
msgstr "Seleccione la posición de la timepicker (selector de horas)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Hora"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Minuto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Segundo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Subir"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Variaciones"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr "Lógica condicional de elementos"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
msgid "Enable conditional logic for showing or hiding this element."
msgstr "Activar la Lógica Condicional para mostrar u ocultar este elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "Tipo de etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
#| msgid "Select mode"
msgid "Label view mode"
msgstr "Seleccione modo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
#| msgid "Above field"
msgid "Above the fields"
msgstr "Arriba el campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr "Arriba el campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the fields"
msgstr "A la izquierda del campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr "A la izquierda del campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the fields"
msgstr "A la derecha"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the field"
msgstr "A la derecha"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "Posición de la etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Color de la etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Subtítulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
#| msgid "Below field"
msgid "Below the fields"
msgstr "Debajo del campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr "Debajo del campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr "Posición del subtítulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Color del Subtítulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr "Línea horizontal"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Relleno"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr "Tipo de divisor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "Opciones de etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr "ID de contenedor de elemento"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr "Ingrese una identificación para el contenedor del elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
msgid "Inherit product setting"
msgstr "Configuración de producto heredada"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr "Incluir el impuesto por tipo de precio de tarifa"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Elija si desea incluir impuestos para el tipo de precio Tarifa en este "
"elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr "Clase de impuestos para el tipo de precio de tarifa"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr ""
"Elija la clase de impuestos para el tipo de precio de tarifa en este "
"elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr "Ocultar la etiqueta del elemento en el carrito"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr "Elija si desea ocultar la etiqueta del elemento en el carrito o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr "Mostrar u ocultar precio en"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
msgid "Yes, but show price"
msgstr "Si, pero mostrar precio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr "Ocultar el valor del elemento en el carrito"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr "Elija si ocultar el valor del elemento en el carrito o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "Ocultar etiqueta de elemento en orden"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr "Elija si ocultar la etiqueta del elemento en el orden o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "Ocultar el valor del elemento en orden"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr "Elija si desea ocultar el valor del elemento en el orden o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "Ocultar etiqueta de elemento en cuadro de totales flotantes"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Elija si desea ocultar la etiqueta del elemento en el cuadro de totales "
"flotantes o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr "Ocultar el valor del elemento en el cuadro flotante de totales"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Elija si desea ocultar el valor del elemento en el cuadro de totales "
"flotantes o no."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "Ajustes de Ventas"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
#, fuzzy
msgid "Enable repeater"
msgstr "Habilitar repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
#, fuzzy
msgid "This will make this element repeatable."
msgstr "Esto hará que este elemento sea repetible."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
#, fuzzy
msgid "Bind repeater with product quantity"
msgstr "Enlazar repetidor con cantidad de producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
#, fuzzy
msgid "This will make this element repeatable based on the product quantity."
msgstr ""
"Esto hará que este elemento sea repetible en función de la cantidad de "
"producto."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
#, fuzzy
msgid "Repeater minimum limit"
msgstr "Límite mínimo del repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
#, fuzzy
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Establezca el número mínimo de filas que un usuario puede agregar para el "
"campo repetidor."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
#, fuzzy
msgid "Repeater maximum limit"
msgstr "Límite máximo del repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
#, fuzzy
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Establezca el número máximo de filas que un usuario puede agregar para el "
"campo repetidor."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
#, fuzzy
msgid "Repeater Button Label"
msgstr "Etiqueta del botón repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
#, fuzzy
msgid "Leave this blank for the default label."
msgstr "Deje esto en blanco para la etiqueta predeterminada."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "ID del conector del botón de radio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Introduzca un identificador personalizado para conectar diferentes elementos "
"del botón de opción."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
#, fuzzy
msgid "Repeater Settings"
msgstr "Configuración del repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, fuzzy, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Todas las instancias del método &quot;%s&quot;"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, fuzzy, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (ID de instancia: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
#, fuzzy
msgid "Flat Rates (Legacy)"
msgstr "Tarifas planas (heredadas)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr "(Heredado)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "Seleccione los métodos de envío ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "Habilitar métodos de envío"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "Seleccione los métodos de envío que desea habilitar."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "Habilitar condición de métodos de envío"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Especifique las condiciones para habilitar los métodos de envío en función "
"del valor del campo actual. Si se cumplen las condiciones, los métodos de "
"envío seleccionados estarán disponibles para que los clientes elijan durante "
"el proceso de pago."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
#, fuzzy
msgid "Disable Shipping Methods"
msgstr "Desactivar los métodos de envío"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "Seleccione los métodos de envío que desea deshabilitar."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "Desactivar la condición de métodos de envío"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Especifique las condiciones para deshabilitar los métodos de envío en "
"función del valor del campo actual. Si se cumplen las condiciones, los "
"métodos de envío seleccionados no estarán disponibles para que los clientes "
"los elijan durante el proceso de pago."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Acciones"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Configuración general"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr "Clase de impuesto inherente del producto"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Estándar"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr ""
"Déjelo en blanco para calcularlo automáticamente a partir del precio %s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr ""
"Déjelo en blanco para calcularlo automáticamente a partir del %s precio de "
"oferta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "esta sección si se cumplen las siguientes condiciones."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "este campo si se cumplen las siguientes condiciones."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "Agregar nuevo grupo de condiciones"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "La cantidad de &quot;%1$s&quot;  no puede ser menos de %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "La cantidad de &quot;%1$s&quot; no puede ser más de %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr "La cantidad de &quot;%1$s&quot; deberá indicarse en múltiplos de %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s eliminado junto con todos sus productos asociados!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"El artículo %s se eliminó del carrito porque había cambiado desde que se "
"agregó."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr "No puede añadir productos con precio negativo."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
msgid "You cannot add zero priced products to the cart."
msgstr "No puede agregar productos con precio cero al carrito."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "Opciones adicionales"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "\"%s\" es un campo necesario."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s ha sido retirado de su carrito porque desde entonces ha sido "
"modificado. Puede agregarlo de nuevo a su carrito %2$s."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "aquí"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr "Cuota extra"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Vaciar carrito"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Editar opciones"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Actualizar carrito"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "%s ha sido actualizado."
msgstr[1] "%s han sido actualizados."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Ver carrito"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"Opciones de productos adicionales y complementos para WooCommerce requieren "
"WordPress %s o posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Opciones de productos adicionales y complementos para WooCommerce requieren "
"opciones de pago adicionales de WooCommerce %s o posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
msgid "The installed version is"
msgstr "La versión instalada del tema activo"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Importante:%2$s No se admite tu versión de WooCommerce Extra Checkout "
"Options. Actualice a la última versión."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Importante: %2$s Opciones de productos adicionales y complementos para "
"WooCommerce se ha desactivado porque no es compatible con la versión actual "
"de Opciones de pago adicionales."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Importante: %2$s Opciones de productos adicionales y complementos para "
"WooCommerce se ha desactivado porque no es compatible con la versión actual "
"de Opciones de pago adicionales."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Importante:%2$s Ejecute el actualizador de WooCommerce antes de usar "
"Opciones de productos adicionales y complementos para WooCommerce."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Importante: %2$s opciones de productos adicionales y complementos para "
"WooCommerce requiere %3$sWooCommerce%4$s %5$s o posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Ejecutar el actualizador"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s Importante: %2$s Opciones de productos adicionales y complementos para "
"WooCommerce requieren WordPress %3$s o posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Importante: %2$s Opciones de productos adicionales y complementos para "
"WooCommerce requiere la versión de PHP %3$s o posterior."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Nombre del archivo"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Borrar"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "Opciones Extra de Producto"

#: includes/classes/class-themecomplete-epo-post-types.php:101
#, fuzzy
msgid "Global Forms"
msgstr "Formularios globales"

#: includes/classes/class-themecomplete-epo-post-types.php:102
msgid "Global Form"
msgstr "Forma global"

#: includes/classes/class-themecomplete-epo-post-types.php:103
#, fuzzy
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Formularios globales"

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr "Agregar formulario Global"

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr "Añadir nuevo formulario global"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Editar"

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr "Editar formulario Global"

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr "Nuevo Formulario Global"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr "Ver formulario global"

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr "Formulario global de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr "Ningún formulario Global encontrado"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "Ningún formulario Global encontrado en la basura"

#: includes/classes/class-themecomplete-epo-post-types.php:114
msgid "Parent Global Form"
msgstr "Formulario Global Padre"

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr "Aquí es donde puede agregar nuevas opciones globales a su tienda."

#: includes/classes/class-themecomplete-epo-post-types.php:156
#, fuzzy
msgid "Option Templates"
msgstr "Plantillas de opciones"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "Plantilla de opción"

#: includes/classes/class-themecomplete-epo-post-types.php:158
#, fuzzy
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Plantillas de opciones"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Agregar plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Agregar nueva plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Editar plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Nueva Plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Ver plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Plantilla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "No se encontró ninguna plantilla"

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr "No se encontró ninguna plantilla en la papelera"

#: includes/classes/class-themecomplete-epo-post-types.php:169
#, fuzzy
msgid "Parent Template"
msgstr "Plantilla para padres"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "Aquí es donde puede agregar nuevas opciones de plantilla global."

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "Tablas de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Tablas de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "Agregar tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "Agregar nueva tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "Editar tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "Nueva tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "Ver tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "Tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "No se encontró ninguna tabla de búsqueda"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "No se encontró ninguna tabla de búsqueda en la papelera"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "Tabla de búsqueda principal"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "Aquí es donde puede agregar nuevas tablas de búsqueda."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Precio unitario"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Costo extra"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "Opciones Importe del IVA"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "Importe de las tarifas"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "Total"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Anterior"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Siguiente"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "caracteres restantes"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr "Subiendo archivos"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
msgid "Your files are being uploaded"
msgstr "Tus archivos han sido subidos"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "archivo"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "archivos"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Este campo es obligatorio."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Por favor, introduce una dirección de correo electrónico válida."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Por favor, introduzca una URL válido."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Por favor escribe un número válido."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Por favor, introduzca solo números."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Por favor introduzca un valor menor o igual a {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Por favor introduzca un valor mayor o igual a {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr "No ingrese más de {0} carácter."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "No ingrese más de {0} caracteres."

#: includes/classes/class-themecomplete-epo-scripts.php:584
msgid "Please enter at least {0} character."
msgstr "Ingrese al menos {0} carácter."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Por favor introduzca al menos {0} caracteres."

#: includes/classes/class-themecomplete-epo-scripts.php:586
msgid "Please select up to {0} choice."
msgstr "Seleccione hasta {0} opción."

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "Por favor, seleccione hasta {0} opciones."

#: includes/classes/class-themecomplete-epo-scripts.php:588
msgid "Please select exactly {0} choice."
msgstr "Seleccione exactamente la opción {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "Por favor, seleccione exactamente {0} opciones."

#: includes/classes/class-themecomplete-epo-scripts.php:590
msgid "Please select at least {0} choice."
msgstr "Seleccione al menos {0} opción."

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "Por favor, seleccione al menos {0} opciones."

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr "Por favor, introduzca un múltiplo de {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr "Por favor, introduzca sólo letras."

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr "Por favor, introduzca sólo letras y espacios."

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr "Ingrese solo letras, números o guiones bajos."

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr "Introduzca solo letras y números Unicode."

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Por favor introduzca sólo letras, números o espacios."

#: includes/classes/class-themecomplete-epo-scripts.php:598
#, fuzzy
msgid "Minimum number of rows is {0}"
msgstr "El número mínimo de filas es {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
#, fuzzy
msgid "Maximum number of rows is {0}"
msgstr "El número máximo de filas es {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Hecho"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Hoy"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "General"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Mostrar"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Todas las cadenas"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Estilo"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Global"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr "Gestor de cargas"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Código Personalizado"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "Constantes de fórmula matemática"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Licencia"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr "Inicialización"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr "Caja total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Varios"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
#| msgid "Enable front-end for roles"
msgid "Enable Frontend Access for Selected Roles"
msgstr "Habilitar el front-end para roles"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
msgid "Select the roles that will have access to the extra options."
msgstr "Seleccione los roles que tendrán acceso a las opciones adicionales."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
#| msgid "Disable front-end for roles"
msgid "Disable Frontend Access for Selected Roles"
msgstr "Deshabilitar el front-end para roles"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr "Seleccione los roles que no tendrán acceso a las opciones adicionales."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
#, fuzzy
msgid "Enable translations"
msgstr "Habilitar traducciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr ""
"Esto habilitará la traducción predeterminada del plugin utilizando los "
"archivos pot."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "Prioridad de gancho de tipo de publicación"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"¡No cambie esto a menos que sepa cómo afectará a su sitio! Esta es la "
"prioridad con la que el plugin carga los tipos de publicaciones."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
#, fuzzy
msgid "Default value is 100"
msgstr "El valor predeterminado es 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
#| msgid "Select the parameter which the products will be sorted by."
msgid "Specify the areas where the plugin will be activated."
msgstr "Seleccione el parámetro por el que se ordenarán los productos."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Todos"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "Productos y Categorías"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "Variables de producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Página de producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "Caja Total Final"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Habilite esta configuración para mostrar una caja de total final en la "
"página del producto, lo que permite a los clientes ver el costo total de su "
"pedido, o desactívela para una página de producto simplificada."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Mostrar opciones Total"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Habilite esta opción para mostrar el total específicamente para las opciones "
"de producto seleccionadas."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Mostrar total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Permite mostrar el total completo del producto, proporcionando a los "
"clientes una visión clara del coste total."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
msgid "Enable Final total box for all products"
msgstr "Habilitar Total Final para todos los productos"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
msgid "Show the Final total box even when the product has no extra options"
msgstr ""
"Muestre la casilla Total final incluso cuando el producto no tenga opciones "
"adicionales"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr "Habilitar visualización total final original"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr "Marque para habilitar la visualización del total final no descontado"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "Habilitar opciones de visualización del IVA"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Marque para mostrar las opciones Importe del IVA por encima del total de "
"opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
msgid "Show Unit price on totals box"
msgstr "Mostrar precio unitario en la casilla de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Habilite esto para mostrar el precio unitario cuando el cuadro de totales "
"esté visible"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr "Incluir tarifas sobre el precio unitario"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
msgid "Enable this to add any Fees to the unit price"
msgstr "Habilite esto para agregar cualquier tarifa al precio unitario"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
msgid "Total price as Unit Price"
msgstr "Precio total como precio unitario"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Hacer que el precio total no se multiplique por la cantidad del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "Ocultar el cuadro de total final hasta que se elija un elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Marque esta opción para mostrar la casilla Total final solo cuando se "
"complete al menos una opción."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr ""
"Ocultar el cuadro total final hasta que se elijan todos los elementos "
"requeridos"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Marque esta opción para mostrar la casilla Total final solo cuando se hayan "
"rellenado todas las opciones visibles requeridas."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr "Ocultar el cuadro total final hasta que se elijan todos los elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Marque esta opción para mostrar la casilla Total final solo cuando se hayan "
"rellenado todas las opciones visibles."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
msgid "Disable lazy load images"
msgstr "Deshabilitar imágenes de carga diferida"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
msgid "Enable this to disable lazy loading images."
msgstr "Habilite esto para deshabilitar la carga diferida de imágenes."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
msgid "Preload lightbox images"
msgstr "Imágenes de preload lightbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""
"Habilite esto para precargar la imagen cuando use la función de caja de luz."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Habilitar el complemento para los códigos cortos de WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Al habilitar esto, se cargarán los archivos del complemento en todas las "
"páginas de WordPress. Úselo con precaución."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
msgid "Enable shortcodes in options strings"
msgstr "Habilitar códigos cortos en cadenas de opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"Habilitar esto permitirá el uso de códigos cortos y código HTML en la "
"etiqueta de opciones y el texto de descripción."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Colocación"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
msgid "Floating Totals box"
msgstr "Caja flotante de Totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "Botón de añadir al carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animación"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Esto controla cómo se muestran sus campos en la interfaz. Si elige \"Mostrar "
"usando ganchos de acción\", debe escribir manualmente el código en su tema o "
"complemento para mostrar los campos y la configuración de ubicación a "
"continuación no funcionará. Si utiliza la extensión de productos compuestos, "
"debe dejar esta configuración en \"Normal\"; de lo contrario, las opciones "
"adicionales no se pueden mostrar en los paquetes de productos compuestos. "
"Ver más en la documentación."

#: includes/classes/class-themecomplete-epo-settings-base.php:497
msgid "Show using action hooks"
msgstr "Mostrar el uso de ganchos de acción"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
msgid "Extra Options placement"
msgstr "Colocación de opciones adicionales"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
msgid "Select where you want the extra options to appear."
msgstr "Seleccione dónde desea colocar las opciones extras."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Antes del botón Añadir al carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Después del botón Añadir al carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
msgid "Before cart form"
msgstr "Antes del formulario del carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
msgid "After cart form"
msgstr "Después del formulario del carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "Antes del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "Después del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr "Antes del Resumen del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Después del resumen del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
msgid "After product image"
msgstr "Después de la imagen del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
msgid "Custom hook"
msgstr "Gancho personalizado"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
msgid "Extra Options placement custom hook"
msgstr "Colocación de gancho personalizado Opciones Extra"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
msgid "Extra Options placement hook priority"
msgstr "Prioridad de gancho personalizado Opciones Extra"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
msgid "Select the Extra Options placement hook priority"
msgstr ""
"Seleccione la prioridad del gancho de colocación de Opciones adicionales"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
msgid "Totals box placement"
msgstr "Ubicación de la caja de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
msgid "Select where you want the Totals box to appear."
msgstr "Seleccione dónde desea colocar el cuadro de Total."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
msgid "Totals box placement custom hook"
msgstr "Gancho personalizado de colocación de caja de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
msgid "Totals box placement hook priority"
msgstr "Prioridad del gancho de colocación de la caja de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
msgid "Select the Totals box placement hook priority"
msgstr "Seleccione la prioridad del gancho de colocación del cuadro Totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
msgid "This will enable a floating box to display your totals box."
msgstr "Esto habilitará un cuadro flotante para mostrar su cuadro de totales."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "Abajo a la derecha"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "Abajo a la izquierda"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "Arriba a la derecha"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "Arriba a la izquierda"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
msgid "Floating Totals box visibility"
msgstr "Visibilidad de la Caja de Totales flotante"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
msgid "This determines the floating totals box visibility."
msgstr "Esto determina la visibilidad del cuadro de totales flotantes."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "Siempre visible"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "Visble después de desplazarse por la página"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
#, fuzzy
msgid "Hide after scrolling the page"
msgstr "Ocultar después de desplazarse por la página"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
msgid "Pixels amount needed to scroll"
msgstr "Cantidad de píxeles necesaria para desplazarse"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Seleccione la cantidad de píxeles que la página necesita para desplazarse "
"para que los totales flotantes sean visibles."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
msgid "Add to cart button on floating totals box"
msgstr "Botón Agregar al carrito en el cuadro flotante de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
msgid "Display the add to cart button on floating box."
msgstr "Visualice el botón añadir al carrito en el cuadro flotante."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr "Cambiar el precio del producto original"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Marque para sobrescribir el precio del producto original cuando el precio "
"esté cambiando."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
msgid "Change variation price"
msgstr "Cambiar el precio de variación"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
msgid "Check to overwrite the variation price when the price is changing."
msgstr ""
"Marque para sobrescribir el precio de variación cuando el precio esté "
"cambiando."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr "Forzar seleccionar opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Esto cambia el botón Agregar al carrito en las páginas de tienda y archivo "
"para mostrar opciones seleccionadas cuando el producto tiene opciones de "
"producto adicionales. Habilitar esto eliminará la funcionalidad ajax."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
msgid "Enable extra options in shop and category view"
msgstr "Habilitar opciones adicionales en la vista de la tienda y categoría"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Marque para habilitar la visualización de opciones adicionales en la página "
"de la tienda y la vista de categoría. Esta configuración depende del tema y "
"es posible que algunos aspectos no funcionen como se esperaba."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
msgid "Remove Free price label"
msgstr "Quite la etiqueta de libre precio"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Activar para eliminar la etiqueta del precio cuando el producto tiene "
"opciones extra con variación de precio"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
msgid "Use progressive display on options"
msgstr "Usar visualización progresiva en las opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Habilitar esto ocultará las opciones en la página del producto hasta que se "
"inicialice JavaScript. Esta es una configuración a prueba de fallas y "
"recomendamos que esté activa."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "Retraso de la animación"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
msgid "How long the animation will take in milliseconds"
msgstr "Cuánto tiempo tardará la animación en milisegundos"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
msgid "Start Animation delay"
msgstr "Retraso de inicio de animación"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
msgid "The delay until the animation starts in milliseconds"
msgstr "El retraso hasta que comienza la animación en milisegundos"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
msgid "Show quantity selector only for elements with a value"
msgstr "Mostrar selector de cantidad solo para artículos con un valor"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
msgid "Check show quantity selector only for elements with a value."
msgstr "Mostrar selector de cantidad solo para artíclos con un valor."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr "Ocultar el botón de agregar al carrito hasta que se elija un elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Marque esto para mostrar el botón Agregar al carrito solo cuando se complete "
"al menos una opción."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Ocultar el botón de agregar al carrito hasta que se elijan todos los "
"elementos necesarios"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Marque esta opción para mostrar el botón Agregar al carrito solo cuando se "
"hayan llenado todas las opciones visibles requeridas."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Ocultar el botón de agregar al carrito hasta que se elijan todos los "
"elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Marque esta opción para mostrar el botón Agregar al carrito solo cuando se "
"hayan llenado todas las opciones visibles."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "Mostrar etiqueta de ancho completo para los elementos."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
#, fuzzy
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Marque esta opción para forzar que los elementos sean de ancho completo en "
"lugar de automático."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
msgid "Show choice description inline."
msgstr "Muestra la descripción de la elección en línea."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Marque esto para deshabilitar la visualización de la descripción como "
"información sobre herramientas y mostrarla en línea."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
#, fuzzy
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Ocultar etiqueta de elección al usar la configuración Mostrar información "
"sobre herramientas para botones de opción y casillas de verificación"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Marque esta opción para ocultar la etiqueta de elección cuando utilice la "
"opción Mostrar información sobre herramientas para botones de opción y "
"casillas de verificación."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "Ocultar automáticamente el precio si es cero"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Marque esto para ocultar globalmente la visualización del precio si es cero."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "Recortar ceros en los precios"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
#, fuzzy
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Verifique esto para recortar globalmente cero en los precios. Esto también "
"se aplicará a los precios nativos de WooCommerce."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
#, fuzzy
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Ocultar elemento precio html cuando la configuración Ocultar precio está "
"habilitada"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
#, fuzzy
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Marque esta opción si utiliza Google Merchant Center. Ocultará el html de "
"precio del elemento cuando habilite su configuración de precio oculto."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr ""
"Utilice los valores traducidos cuando sea posible en el pedido de "
"administrador"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"¡Tenga en cuenta que si las opciones del Pedido cambian o se eliminan, "
"obtendrá resultados incorrectos al habilitar esto!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
msgid "Include option pricing in product price"
msgstr ""
"Marque esto para incluir el precio de las opciones al precio del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
msgid "Check this to include the pricing of the options to the product price."
msgstr ""
"Marque esto para incluir el precio de las opciones al precio del producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
msgid "Check for empty product price"
msgstr "Verifique el precio del producto vacío"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Marque esto para que el complemento se establezca en cero el precio del "
"producto cuando esté vacío."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr "Utilice  \"De\" en los precios de los productos mostrados"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Marque esto para modificar la visualización de precios de un producto cuando "
"tenga opciones adicionales con precios."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
msgid "Alter generated product structured data"
msgstr "Modificar los datos estructurados de productos generados"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Altera los datos estructurados del producto generados. ¡Esto puede producir "
"resultados incorrectos si las opciones usan lógica condicional!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "Estructura de opciones responsivas"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
#, fuzzy
msgid "Enable this if you want the options to have responsive display."
msgstr "Habilite esto si desea que las opciones tengan una pantalla adaptable."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr "Desactivar carrito persistente"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr "Habilítelo si el producto tiene muchas opciones."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr "Botón Vaciar carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr "Activa o desactiva el botón borrar carro"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
msgid "Cart Field Display"
msgstr "Visualización del campo del carro"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
msgid "Select how to display your fields in the cart"
msgstr "Seleccione como mostrar los campos en el carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr "Pantalla normal"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "Mostrar un enlace emergente"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr "Pantalla avanzada"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr "Ocultar opciones adicionales en el carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr "Activa o desactiva la visualización de opciones en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
#| msgid "Hide upload file URL in cart and checkout"
msgid "Hide extra addon prices in cart and checkout"
msgstr ""
"Ocultar la URL del archivo de carga en el carrito y finalizar la compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
#| msgid "Enables or disables the display of options in the cart."
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Activa o desactiva la visualización de opciones en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr "Evitar productos con precios negativos"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr "Evite agregar al carrito productos con precio negativo."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
msgid "Prevent zero priced products"
msgstr "Evitar productos de precio cero"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
msgid "Prevent adding to the cart zero priced products."
msgstr "Evite agregar al carrito productos con precio cero."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr "Ocultar el precio medio del elemento de la casilla de verificación"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Esto ocultará la visualización del precio promedio en el carrito para las "
"casillas de verificación."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr "Mostrar el reemplazo de la imagen en el carrito y pagar"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Al habilitar esto, se mostrarán las imágenes de los elementos que tienen un "
"reemplazo de imagen."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
msgid "Hide upload file URL in cart and checkout"
msgstr ""
"Ocultar la URL del archivo de carga en el carrito y finalizar la compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Al habilitar esto, se ocultará la dirección URL de cualquier archivo cargado "
"mientras esté en el carrito y el checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
msgid "Show uploaded image in cart and checkout"
msgstr "Mostrar la imagen cargada en el carrito y finalizar la compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""
"Al activar esto se mostrarán las imágenes subidas en el carrito y el pago."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Ancho máximo de la imagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr "Establece el ancho máximo de las imágenes que aparecen en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "Alto máximo de la imagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
#, fuzzy
msgid "Set the maximum height of the images that appear on cart."
msgstr "Establece la altura máxima de las imágenes que aparecen en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
msgid "Always use unique values on cart for elements"
msgstr "Utilice siempre valores únicos en el carrito para los elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"Habilitar esto separará los valores separados por comas para los elementos. "
"Esto se usa principalmente para múltiples opciones de casillas de "
"verificación."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
#, fuzzy
msgid "Post types to show the saved options"
msgstr "Tipos de publicaciones para mostrar las opciones guardadas"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Seleccione los tipos de publicación donde el complemento modificará la "
"pantalla de orden de edición para mostrar las opciones guardadas. Puede "
"escribir su tipo de publicación personalizada."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
msgid "Strip html from emails"
msgstr "Eliminar html de los correos electrónicos"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
msgid "Check to strip the html tags from emails"
msgstr "Marque para quitar las etiquetas html de los correos electrónicos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
msgid "Legacy meta data"
msgstr "Metadatos heredados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
msgid "Check to enable legacy meta data functionality."
msgstr "Marque para habilitar la funcionalidad de metadatos heredados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
msgid "Unique meta values"
msgstr "Valores meta únicos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
msgid "Check to split items with multiple values to unique lines."
msgstr "Marque para dividir elementos con varios valores en líneas únicas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr "Evitar que se envíen opciones a los correos electrónicos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr "Marque para deshabilitar el envío de opciones a correos electrónicos."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
msgid "Disable sending the options upon saving the order"
msgstr "Deshabilitar el envío de las opciones al guardar el pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Habilite esto si recibe un error 500 al intentar completar el pedido en la "
"caja."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
msgid "Attach upload files to emails"
msgstr "Adjuntar archivos de subida a correos electrónicos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
msgid "Check to Attach upload files to emails."
msgstr ""
"Comprobar si se han añadido ficheros para subir en los correos electrónicos."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
msgid "Disable Options on Order status change"
msgstr "Desactivar opciones al cambiar el estado del pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
msgid "Check this only if you are getting server errors on checkout."
msgstr ""
"Marque esto solo si está recibiendo errores del servidor al finalizar la "
"compra."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr "Ocultar la URL del archivo de carga en orden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Al habilitar esto, se ocultará la dirección URL de cualquier archivo cargado "
"mientras esté en orden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
#| msgid "Show uploaded image in cart and checkout"
msgid "Show uploaded image in order"
msgstr "Mostrar la imagen cargada en el carrito y finalizar la compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
#| msgid "Enabling this will show the uploaded images in cart and checkout."
msgid "Enabling this will show the uploaded images in order."
msgstr ""
"Al activar esto se mostrarán las imágenes subidas en el carrito y el pago."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "Etiqueta de campo/separador de valores"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Introduzca el carácter que se utilizará para separar las etiquetas de campo "
"de los valores de campo en el carrito y el pedido."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "Separador de valores de campo múltiple"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Introduzca la cadena que se utilizará para separar varios valores de un "
"campo que permita varias selecciones en el carrito y el pedido."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
msgid "Update cart text"
msgstr "Actualizar el texto del carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
msgid "Enter the Update cart text when you edit a product."
msgstr "Ingrese el texto Actualizar carrito cuando edite un producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr "Reemplazo de texto de Opciones de edición"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""
"Introduce un texto para cambiar el texto Editar Opciones de texto en el "
"carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr "Texto para Opciones Adicionales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Introduce un texto para reemplazar el texto de Opciones Adicionales cuando "
"se utiliza la configuración de ventana emergente en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr "Reemplazo del texto del botón Cerrar"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Introduce un texto para reemplazar el texto del botón Cerrar cuando se "
"utiliza la configuración de ventana emergente en el carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Texto de carro vacío"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr "Introduce un texto para el botón de Vaciar Carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "Texto de Precio total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr "Ingrese el texto total final o déjelo en blanco por defecto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
msgid "Unit price text"
msgstr "Texto de precio unitario"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
msgid "Enter the Unit price text or leave blank for default."
msgstr "Ingrese el texto del precio unitario o déjelo en blanco por defecto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr "Opciones de texto total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
msgid "Enter the Options total text or leave blank for default."
msgstr "Introduzca el texto Total de Opciones o dejar en blanco por defecto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "Opciones IVA texto total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr ""
"Introduzca el texto Total de IVA de Opciones o déjelo en blanco por defecto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr "Tarifas de texto total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
msgid "Enter the Fees total text or leave blank for default."
msgstr "Ingrese el texto del total de tarifas o déjelo en blanco por defecto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr "Reemplazo de texto de precio gratuito"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Introduce un texto para cambiar la etiqueta de Gratis cuando el producto "
"tiene opciones extra."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr "Texto de la opción Forzar Selección"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Introduce un texto para reemplazar el botón de Añadir al Carrito cuando se "
"usa la opción de Forzar Selección."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr "No hay texto de productos con precio cero"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Ingrese un texto para reemplazar el mensaje cuando intente agregar un "
"producto de precio cero al carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr "Sin texto de productos con precio negativo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr ""
"Ingrese un texto para reemplazar el mensaje cuando intente agregar un "
"producto de precio negativo al carrito."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
#, fuzzy
msgid "Popup section button text replacement"
msgstr "Reemplazo del texto del botón de la sección emergente"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Introduzca un texto para reemplazar el texto del botón de la sección de "
"recarga. Si lo estableces en %s, el texto del botón tendrá el título de la "
"sección."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Abierto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr "Texto para Opciones de Reiniciar"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Introduce un texto para cambiar el texto de Reiniciar opciones, cuando se "
"usan variaciones personalizadas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "Resetear opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr "Cambio de texto del botón de cierre del calendario"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""
"Introduce un texto para cambiar el texto del botón de Cerrar en el "
"calendario."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr "Reemplazo del texto del botón Calendario hoy"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""
"Introduce un texto para cambiar el botón de texto Hoy, en el calendario."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr "Texto anterior del control deslizante"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr "Introduce un texto para cambiar el botón Anterior para el slider."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr "Texto siguiente del control deslizante"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr "Introduce un texto para cambiar el botón Siguiente para el slider."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr "Este campo es texto obligatorio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
msgid "Enter a text to indicate that a field is required."
msgstr "Ingrese un texto para indicar que se requiere un campo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "Texto para Caracteres restantes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Introduce un texto para reemplazar el texto de Quedan tantos Caracteres, al "
"usar un máximo de caracteres en el campo de texto o área de texto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr "Carga de archivos de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Introduce un texto para cambiar el texto de Subiendo Archivos, usado en la "
"ventana emergente después de clicar el botón de añadir al carrito cuando se "
"suben campos."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr "Subiendo el texto del mensaje"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Ingrese un mensaje que se usará en la ventana emergente después de hacer "
"clic en el botón Agregar al carrito cuando haya campos de carga."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr "Seleccionar texto de archivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Introduzca un texto para reemplazar el botón Seleccionar texto de archivo "
"utilizado en el botón de carga con estilo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Seleccionar archivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "Texto de un solo archivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Introduzca un texto para reemplazar el texto del archivo utilizado en el "
"botón de carga con estilo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "Texto de varios archivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Introduzca un texto para reemplazar el texto de los archivos utilizados en "
"el botón de carga con estilo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
msgid "Add button text on associated products"
msgstr "Agregar texto de botón en productos asociados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
#, fuzzy
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Introduzca un texto para reemplazar el texto del botón Agregar en los "
"productos asociados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Añadir"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
msgid "Remove button text on associated products"
msgstr "Eliminar el texto del botón en productos asociados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Introduzca un texto para reemplazar el texto del botón de eliminación en los "
"productos asociados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Eliminar"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
#, fuzzy
msgid "Repeater add text"
msgstr "Repetidor agregar texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
#, fuzzy
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Introduzca un texto para reemplazar el botón Agregar texto para los campos "
"repetidores."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr "Habilitar casillas de verificación y estilos de radio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""
"Activa o desactiva el estilo adicional para casillas de verificación y "
"botones de opción."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
msgid "Select a style for the checkboxes and radio buttons"
msgstr ""
"Seleccione un estilo para las casillas de verificación y los botones de "
"opción"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Redondo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "Redondo 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Cuadrado"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "Cuadrado 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
#| msgid "Select item border type"
msgid "Swatch border type"
msgstr "Seleccione el tipo de borde del elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Seleccione un estilo para el borde seleccionado cuando utilice reemplazos de "
"imágenes o muestras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Sombra"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr "Línea delgada"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
#| msgid "Choose whether to hide the price or not."
msgid "Choose the border width for image or color swatches."
msgstr "Elija si ocultar el precio o no."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Seleccione un estilo para el borde seleccionado cuando utilice reemplazos de "
"imágenes o muestras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Seleccione un estilo para el borde seleccionado cuando utilice reemplazos de "
"imágenes o muestras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Visual"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Página de producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Local"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Precios"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr "Habilitar validación"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr ""
"Marque para habilitar la función de validación para los elementos del "
"constructor"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
msgid "Disable error scrolling"
msgstr "Deshabilitar el desplazamiento de errores"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr "Marque para deshabilitar el desplazamiento al elemento con un error"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
msgid "Error label placement"
msgstr "Colocación de la etiqueta de error"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
msgid "Set the placement for the validation error notification label"
msgstr ""
"Establecer la ubicación de la etiqueta de notificación de error de validación"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
msgid "After the element"
msgstr "Después del elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
msgid "Before the element"
msgstr "Antes del elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
msgid "Use options cache"
msgstr "Usar caché de opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Utilice el almacenamiento en caché de opciones para mejorar el rendimiento. "
"Desactive si tiene opciones que comparten el mismo ID único."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
msgid "Javascript and CSS inclusion mode"
msgstr "Modo de inclusión de JavaScript y CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
msgid "Select how to include JS and CSS files"
msgstr "Seleccione cómo incluir archivos JS y CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
msgid "Single minified file"
msgstr "Archivo minificado único"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
msgid "Multiple minified files"
msgstr "Varios archivos minificados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
msgid "DEV - multiple files"
msgstr "DEV: varios archivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
msgid "Disable PNG convert security"
msgstr "Deshabilitar conversión de seguridad de PNG"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
msgid "Check to disable the conversion to png for image uploads."
msgstr "Marque para deshabilitar la conversión a png para cargas de imágenes."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Esto anulará globalmente el precio del producto con el precio de las "
"opciones si el precio total de las opciones es mayor que cero."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr "Use el ajuste en cada producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "Opciones modo precio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "Seleccione el modo de precio para las opciones."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "Utilizar precio de venta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
msgid "Use regular price"
msgstr "Utilizar el precio regular"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "Número máximo de combinaciones para el cálculo de precios"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Esta configuración controla el número máximo de combinaciones que el plugin "
"utilizará para calcular los precios mínimos y máximos. Un mayor número de "
"combinaciones dará como resultado precios más precisos, pero también llevará "
"más tiempo calcularlos. Para los productos que pueden tener muchas "
"combinaciones de opciones, se recomienda establecer un número menor de "
"combinaciones para mejorar el rendimiento."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "El valor predeterminado es 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr ""
"Restablecer los valores de las opciones después de agregar el producto al "
"carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Esto revertirá los valores de las opciones a los predeterminados después de "
"agregar el producto al carrito"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "Use signos más y menos en los precios en el carrito y en la caja"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Elija cómo desea que se muestre el signo de los precios de las opciones en "
"el carrito y en el pago."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
msgid "Display both signs"
msgstr "Mostrar ambos signos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
msgid "Display only minus sign"
msgstr "Mostrar solo el signo menos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
msgid "Use plus and minus signs on option prices"
msgstr "Use signos más y menos en los precios de las opciones"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Elija cómo desea que se muestre el signo de los precios de las opciones en "
"la página de producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr "Separador decimal de entrada"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
msgid "Choose how to determine the decimal separator for user inputs"
msgstr ""
"Elija cómo determinar el separador decimal para las entradas de usuario"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "Utilice el valor de WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr "Determinar por navegador local"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr "Separador decimal mostrado"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
msgid "Choose which decimal separator to display on currency prices"
msgstr "Elija qué separador decimal mostrar en los precios de las divisas"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "Invalidación de zona horaria para el elemento Date"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Elija qué %s usará el elemento de fecha en los cálculos de backend o déjelo "
"en blanco para la zona horaria del servidor."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr "huso horario"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr "Indicador de estado requerido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr "Ingrese una cadena para indicar el estado requerido de un campo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr "Posición requerida del indicador de estado"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
msgid "Select the placement of the Required state indicator"
msgstr "Seleccione la ubicación del indicador de estado requerido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr "A la Izquierda de la etiqueta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr "Derecho de la etiqueta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr "Incluir el sufijo de cadena de impuestos en el cuadro de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""
"Habilite esto para agregar el sufijo de impuestos de WooCommerce en el "
"cuadro de totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
#, fuzzy
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr ""
"Incluye el sufijo de visualización de precios de WooCommerce en el cuadro de "
"totales"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Habilite esto para agregar el sufijo de visualización de precios de "
"WooCommerce en el cuadro de totales."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
msgid "jQuery selector for main product image"
msgstr "selector de jQuery para la imagen principal del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
msgid "This is used to change the product image."
msgstr "Esto se usa para cambiar la imagen del producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
msgid "Product image replacement mode"
msgstr "Modo de reemplazo de imagen de producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"El modo automático reemplaza la imagen real e Inline agrega nuevos elementos "
"de imagen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
msgid "Self mode"
msgstr "Auto-Modo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
msgid "Inline mode"
msgstr "Modo en línea"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
msgid "Move out of stock message"
msgstr "Mover Mensaje Sin Stock"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Esto mueve el mensaje de agotado cuando se usan variaciones con estilo justo "
"debajo de ellas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
msgid "Use internal variation price"
msgstr "Usar precio de variación interna"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Habilite esta opción si sus productos variables tienen muchas opciones para "
"mejorar el rendimiento. Tenga en cuenta que esto puede causar problemas con "
"los complementos de descuento o moneda."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "Habilitar la interfaz de backend del complemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Seleccione los roles que tendrán acceso a la configuración del complemento y "
"a la interfaz del complemento mientras se encuentra en la página de edición "
"del producto. El rol Admininstrator siempre tiene acceso."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
msgid "Hide override settings on products"
msgstr "Ocultar opciones de anulación en los productos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Habilite esto para ocultar la pestaña de configuración en la pantalla de "
"edición del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
msgid "Hide Builder mode on products"
msgstr "Ocultar el modo de constructor en los productos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Habilite esto para ocultar la pestaña del constructor en la pantalla de "
"edición del producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
msgid "Hide Normal mode on products"
msgstr "Ocultar el modo Normal en productos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""
"Habilite esto para ocultar la pestaña normal en la pantalla de edición del "
"producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "Habilitar WP Rocket CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Marque para habilitar el uso de WP Rocket cdn para las imágenes del "
"complemento si está activo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "Habilitar Jetpack CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Marque para habilitar el uso de Jetpack cdn para las imágenes del "
"complemento si está activo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Caja de selección"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Selector de fechas"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr "Ancho máximo de la información"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""
"Establezca el ancho máximo de la información sobre herramientas que aparece "
"en los elementos."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr "Modo imagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Configure el modo de imagen que se utilizará para varias funciones "
"relacionadas con la imagen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr "URL absoluta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
msgid "Relative URL"
msgstr "URL relativa"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "Volver a calcular la imagen en los cambios"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Esto es necesario en varias soluciones de galería que cambian el html de la "
"imagen dinámicamente o si desea controlar la imagen dinámicamente."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
#, fuzzy
msgid "Retrieve image sizes for image replacements"
msgstr "Recuperar tamaños de imagen para reemplazos de imágenes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr ""
"Desactive esto para servidores lentos o grandes cantidades de imágenes."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "Mostrar cantidad 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Habilite esta opción para mostrar la cadena de cantidad incluso cuando la "
"cantidad es 1 y cuando el selector de cantidad está habilitado."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
msgid "Show prices inside select box choices"
msgstr "Mostrar precios dentro de las opciones del cuadro de selección"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Marque esto para mostrar el precio de las opciones del cuadro de selección "
"si el tipo de precio es fijo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr ""
"Mostrar precios dentro de las opciones de la casilla de selección incluso si "
"los precios están ocultos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Marque esto para mostrar el precio de las opciones del cuadro de selección "
"si el tipo de precio es fijo e incluso si el elemento oculta el precio."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""
"Multiplique los precios dentro de las opciones del cuadro de selección con "
"su selector de cantidad"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Marque esto para multiplicar los precios de las opciones del cuadro de "
"selección con su selector de cantidad, si lo hubiera."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr "Botón de radio deshacer botón"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
msgid "Globally override the undo button for radio buttons"
msgstr "Anule globalmente el botón deshacer para los botones de opción"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr "Usar valor de campo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "Tema de selector de fecha"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "Tamaño del selector de fecha"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "Posición del selector de fecha"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
msgid "Minimum characters for text-field and text-areas"
msgstr "Caracteres mínimos para campos de texto y áreas de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
msgid "Maximum characters for text-field and text-areas"
msgstr "Máximo de caracteres para campo de texto y áreas de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
msgid "Upload element inline Image preview"
msgstr "Cargar elemento de vista previa de la imagen en línea"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
msgid "Enable inline preview of the image that will be uploaded."
msgstr "Habilite la vista previa en línea de la imagen que se cargará."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
msgid "Scroll to the product element upon selection"
msgstr "Desplácese hasta el elemento del producto al seleccionarlo"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
msgid "Enable to scroll the viewport to the product element."
msgstr ""
"Habilite para desplazarse por la ventana gráfica hasta el elemento del "
"producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
msgid "Product element scroll offset"
msgstr "Desplazamiento de desplazamiento del elemento de producto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
#, fuzzy
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Introduzca un valor para el desplazamiento al seleccionar una opción para el "
"elemento de producto."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
msgid "Sync associated product quantity with main product quantity"
msgstr ""
"Sincronizar la cantidad de producto asociada con la cantidad de producto "
"principal"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Habilite para que las cantidades de los productos asociados sean un múltiplo "
"de la cantidad del producto principal."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Nombre de usuario"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr "Su nombre de usuario Envato."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
msgid "Envato Personal Token"
msgstr "Token personal de Envato"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "Puede generar un token personal de Envato mediante %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "haciendo clic en este enlace"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Código de compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "Para saber cómo acceder a su código de compra, puede %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr "haz clic en este enlace"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Desactivar licencia"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Activar licencia"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "Licencia activada."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Consentimiento"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Acepto que los datos de la licencia se transmitan al servidor de licencias."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
msgid "Use allowed file types from WordPress"
msgstr "Utilice los tipos de archivos permitidos de WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
msgid "Enable File manager"
msgstr "Habilitar el administrador de archivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Carpeta de carga"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "Cambiar esto solo afectará a futuras subidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
msgid "Enable pop-up message on uploads"
msgstr "Activar ventana emergente en las subidas"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
msgid "Enables a pop-up when uploads are made."
msgstr "Muestra una ventana emergente cuando se realizan las subidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
msgid "Enable upload success message"
msgstr "Habilitar mensaje de éxito de carga"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
msgid "Indicates if the upload was successful with a message."
msgstr "Indica si la carga fue exitosa con un mensaje."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Archivos permitidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
msgid "Select which file types the user will be allowed to upload."
msgstr "Seleccione los tipos de archivos que el usuario podrá cargar."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
msgid "Select file types"
msgstr "Seleccionar tipos de archivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
msgid "Custom types"
msgstr "Tipos personalizados"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Seleccione los tipos de archivos personalizados que el usuario podrá cargar "
"separados por comas."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr "Gestor de archivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr "Código CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
msgid "Only enter pure CSS code without and style tags"
msgstr "Solo ingrese código CSS puro sin etiquetas y estilo"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr "Código JavaScript"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
msgid "Only enter pure JavaScript code without and script tags"
msgstr "Solo ingrese código JavaScript puro sin etiquetas de script"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
#, fuzzy
msgid "Add Constant"
msgstr "Agregar constante"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr "Error al conectar con el servidor!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr "Error al obtener los datos del servidor!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
msgid "License activated!"
msgstr "Licencia activada!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr "Licencia desactivada!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Acción invalida."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
msgid "Please fill all fields before trying to activate."
msgstr "Complete todos los campos antes de intentar activar."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr "No se permite intentar activar desde fuera de la interfaz del plugin!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr ""
"Error al conectarse a la API de Envato. Por favor, inténtelo de nuevo más "
"tarde."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr "¡Intentando activar con un código de compra no válido para su token!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
msgid "Envato rate limit exceeded! Please try again later."
msgstr ""
"¡Se superó el límite de velocidad de Envato! Por favor, inténtelo de nuevo "
"más tarde."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Ese nombre de usuario no es válido para este código de compra de artículo. "
"Asegúrese de haber ingresado el nombre de usuario correcto (distingue entre "
"mayúsculas y minúsculas)."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "Tratando de activar desde un dominio no válido!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
msgid "Trying to activate from an invalid IP address!"
msgstr "¡Intentando activar desde una dirección IP no válida!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "¡El código de compra ya está activado!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr "¡El código de compra ya está activado en otro dominio!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr "¡Ya ha activado ese código de compra en otro dominio!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "¡El código de compra ya está activado! ¡Compre una licencia válida!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr "¡Ya has activado tu código de compra!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr "Desactivado, pero el código de compra no se activó por alguna razón!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"No se puede desactivar. ¡El código de compra no es válido para su clave de "
"licencia guardada!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr "¡No se pudo completar la solicitud!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr "Descargando paquete del mercado de Envato ..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "¡Error! No se puede conectar al sistema de ficheros"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "To receive automatic updates license activation is required."
msgstr ""
"Para recibir actualizaciones automáticas se requiere la activación de la "
"licencia."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "Por favor, active las opciones de productos adicionales."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr "Error! Envato API error"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr "Error en la descompresión del paquete"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "Download new version from CodeCanyon"
msgstr "Descarga la nueva versión de CodeCanyon"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr "o registre el complemento para recibir actualizaciones automáticas."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Añadir traducción a %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "Editar la traducción de %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Idioma"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, php-format
msgid "Language of this %s"
msgstr "Idiomas de esta %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
msgid "This is a translation of"
msgstr "Esta es una traducción de"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
msgid "Enable discounts on extra options"
msgstr "Habilite descuentos en opciones adicionales"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr "Tipo de precio base original según"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "Establezca en qué tipos de precios basarán su precio original."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Sin cambio"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr "Precio del producto sin descuento"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr "Habilitar la modificación de la tabla de precios"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Marque para habilitar la inclusión de precios de opciones en la tabla de "
"precios."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr "Prefijo de Etiqueta"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr "Muestre una etiqueta de prefijo en la página del producto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "Etiqueta de sufijo"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr "Muestre una etiqueta de sufijo en la página del producto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr "Selector de etiquetas CSS"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Ingrese un selector de CSS para anular la etiqueta predeterminada donde se "
"mostrará la cadena de descuento."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr "Colocación de cadenas de descuento"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr ""
"Seleccione la ubicación de la cadena con descuento en comparación con la "
"etiqueta."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Después"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Antes"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
msgid "Enable showing option prices in the Order"
msgstr "Habilitar mostrar precios de opciones en el pedido"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Habilite esto bajo su propio riesgo, ya que no es posible calcular "
"descuentos de opciones en la página de pedidos."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "Multiplicar el coste por persona"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr ""
"Habilitar esto multiplicará el precio de las opciones por el recuento de "
"personas."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
msgid "Using booking setting"
msgstr "Usando la configuración de reserva"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "Multiplicar el precio por el numero de bloques"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"Habilitar esto multiplicará el precio de las opciones por el recuento de "
"bloques."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
#, fuzzy
msgid "Add option cost to booking display price"
msgstr "Agregar costo de opción al precio de visualización de la reserva"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
#, fuzzy
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"Al habilitar esto, se agregarán los precios de las opciones al costo de "
"reserva calculado."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr "Dynamic Pricing and Discounts"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Habilitar esto también aplicará los descuentos de productos a las opciones "
"adicionales."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "Reservas fáciles de WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
msgid "WooCommerce Measurement Calculator"
msgstr "Calculadora de Medidas de Woocommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr "Multiplica el costo de las opciones por área"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""
"Habilitar esto multiplicará el precio de las opciones por el área calculada."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
msgid "Divide price with measurement"
msgstr "Dividir precio con medida"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr "Esto dividirá el precio original con la medida necesaria."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "Suscripciones de WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "Incluir complementos en orden de nuevo"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"Al habilitar esto, se agregarán los complementos guardados a la suscripción "
"cuando se use la funcionalidad de pedido nuevamente manualmente."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr "Cuota de inscripción"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
msgid "sign-up fee"
msgstr "de pago inicial"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr "y un"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "%1$s cada %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
msgid "Subscription sign up fee text"
msgstr "Texto de la tarifa de suscripción a la suscripción"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Ingrese el texto de la tarifa de suscripción a la suscripción o déjelo en "
"blanco por defecto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
msgid "Sign up fee text"
msgstr "Texto de tarifa de registro"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
msgid "Enter the Sign up fee text or leave blank for default."
msgstr ""
"Ingrese el texto de la tarifa de inscripción o déjelo en blanco por defecto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr "Tarifa de suscripción a la suscripción"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr "Opciones cuota de suscripción"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "La cantidad correspondiente a \"%1$s\" debe ser superior a %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr "La cantidad de \"%s\" debe ser mayor que 0 que se añadirá al carrito."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, fuzzy, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "Solo puede seleccionar hasta %1$s opción para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, fuzzy, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "Solo puede seleccionar hasta %1$s opciones para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "Debe seleccionar exactamente %1$s opción para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, fuzzy, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "Debe seleccionar exactamente %1$s opciones para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "Debe seleccionar al menos %1$s opción para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, fuzzy, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "Debe seleccionar al menos %1$s opciones para %2$s."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr "¡Fecha ingresada no válida!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "¡Datos no válidos enviados!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr "No es válido el año de la fecha introducida!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr "¡No puede seleccionar esa fecha!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(Tamaño máximo de archivo %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr "%s no es un archivo de imagen válido!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Subida exitosa"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, fuzzy, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "Debe introducir al menos %1$s caracteres para \"%2$s\"."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "No puede introducir más de %1$s caracteres para \"%2$s\"."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Todos"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "Usuarios conectados"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr "Acción personalizada"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr "Acción personalizada EPO"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Título:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr "Acción personalizada:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s no existe."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "Esperando imagen del producto"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "Limpiar"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Cantidad"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Elige una opción"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#~ msgid "Hide extra options prices in cart"
#~ msgstr "Ocultar precios de opciones adicionales en el carrito"

#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr ""
#~ "Activa o desactiva la visualización de los precios de las opciones en el "
#~ "carrito."

#~ msgid "Show bottom"
#~ msgstr "Mostrar parte inferior"

#~ msgid "Show inside"
#~ msgstr "Mostrar dentro"

#~ msgid "Disable categories"
#~ msgstr "Deshabilitar categorías"

#~ msgid "Submit for Review"
#~ msgstr "Enviar para revisión"

#~ msgid "Show Both Final and Options total box"
#~ msgstr "Mostrar tanto precio total como opciones finales"

#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "Mostrar cuadro final y ocultar opciones si es cero"

#~ msgid "Hide Final total box"
#~ msgstr "Ocultar cuadro de total final"

#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Mostrar siempre solo el total final (precio x cantidad)"

#~ msgid "Disable but change product prices"
#~ msgstr "Deshabilitar pero cambiar los precios de los productos"

#~ msgid "Select when to show the final total box"
#~ msgstr "Seleccionar cuando mostrar Precio total"

#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "Mostrar el total final y ocultar el total de opciones si es cero"
languages/woocommerce-tm-extra-product-options-el.mo000064400000134562150755142440016714 0ustar00����|!�,�,�,�,-*-8?-\x-:�-B."S.v.
}.�.
�.�.�.�.	�.�.�.///(/5/A/^/g/s//�/�/�/
�/�/�/�/0
0"0	@0J0Z0^0
r0}0)�0*�0D�0*1,H1,u1	�1�1
�14�1�122
22=2D2^2m2t2�2�2�2�2�2�2�2
�2�2.�2�233
'323:3C38T3=�3=�3A	4K4!Q4s4
�4�4�4	�4�4�4�4#�4�4
55"5*5/5%45Z5`5l5y5�5�5
�5�5�5
�5�5�5�56
66&6
.6<6C6V6
b6m6y6�6�6�6�6�6
�6�6�6
�6�67
7)797B7G7T7
a7	o7y7
�7
�7�7�7
�7�7�7�7��7?�8q�8FF9�9�9D�9W�93N:A�:2�:�:;7;F;Y;s;"�;�;�;
�;
�;"�;</<N<"i<�<�<�<�<�<-�<!=A=	J=T=d=u=�=�=!�=�=�=
�=�=�=�=>
>>%>6>=>W>Z>]>`>c>f>i>n>t>�>�>�>�>�>#�>�>�>

??6?;?
>?I?Z?i?�?�?�?�?�?�?$@(0@Y@y@~@�@�@�@�@�@�@	�@�@�@�@�@�@AA	A A5AIAZA^A
eA	pAzA�A�A�A�A�A�A
�A�AB1BOBSBXBeBjBmBB	�B�B�B�B �B
�BC(C-C4C=CDCUC]CbCiCxC�C�C�C�C�C�C�C5�C5D
TD_D	kDuD#�D�D2�D/E%3E)YE�E�E�E�E�E�E
�E�E&�E$F
?FJFQFYFbFjFwF�F�F
�F�F�F�F
�F
�F�F�F�F�FGGG
$G/G5G;GCGSGXG
]GhGqGvG�G�G�G�G�G�G�G
HH
H%H
6HAHPSH�H�H�H�H�H*�H&I"BI$eI	�I�I	�I�I
�I�I�I�I�I�I
J
J
J!J
3J(>JgJvJ{J$�J<�J�J�J�J�JKK+K4KCK
JKUKZK^K{K�K	�K
�K)�K,�K]�K>SL/�LZ�LGM.eM�M"�M'�M:�M N#8Ni\N~�NuEO
�O�O�O�O�O
�O�O�OI�OHPNPVPZP	cPmPsPD�P5�P�PQ	Q
Q
QQ30QdQkQwQ
~Q�Q�Q�Q�Q�Q�Q�QR"R+R
1R
<RGR(OR#xR
�R	�R�R�R�R	�R�R�R
S'S<SVSrSwS({S&�S7�S3T87TOpT[�T&U@CU�U�U�U�U�U"�U	V
VVV%V*V3V6V?VFVSV	YVcV/eVM�V�V�V��V7�Y�Y�YGZ?^Z��Z�([�\��\mn]�]�]1	^;^9S^"�^�^�^�^2�^&_47_*l_!�_#�_E�_##`!G`$i`/�`)�`�`E�`7a:Ra�a.�a�a"�a6b	:b Dbeb*|b�b�bm�bc<c��co9dk�ddeze!�e�er�e<fGOfC�f�f�fL�fEg`gig�g�g�g�g�g�g�g�g�guh8�h�h�h�hi)i 6i|Wi��i�Vj��jckUxk �k#�k3lGlXl
rl#}l�lG�l�lm.mHm_mrmom�m+�m#*n:Nn#�n�n�n!�n)o%.oTojo�o
�o6�o�o�o#p(p!9p#[pp�p�p�p �p9�pM0q~q�q�qC�q�qr-rArAZr%�r�r)�r's'+s/Ss'�s)�s-�st-tBt*Zt�t;�t��t��v�4w�"x�xI�x� y��y��z��{_?|)�|�|��|%Y}W}`�}a8~�~#�~�~�~D�~49_n=�i�v�C��׀2�!!�nC�V��	�#�(;�,d���<��'�]�'l�#��%��
ރ����"�/�!O�q�~���������������	��6��!�
��2�;�DL�R��L�1�]M�������ʆ#�K�CR���#��1ӇS�Y�y�?��6ʈ���.�J�W�d�'u�����+Ӊ*��*�=�P�\�k�&��*��Պ
���
�#�'=�!e�
��:��͋
܋F�@.�Mo�@��T��S�
k�v�����$��KǍ�)+�#U�:y�K���F�Z�i�z�������͏܏�%	�/�D�0b�E��ِ�/�`8�/��ɑؑ�@�OH�E��MޒK,�Ex�h��7'�_�t�/}���Ĕ͔9��/�?�	U�_�t�������,͕���+�<�,M�z�2��ɖ
֖���%�
>�I�
a�l��,����ї���	�#�.B�#q�*��-����(�+?�k�|�$����%ݙ����.ښ	�!�:�hZ�WÛ]�Wy�ќ�����-�.>�0m�����,ܝ!	�+�3G�{�b�����
)�34��h�������';�c�v�������
ΠA٠�*�9�Y�Ju�N�������I0��z�y�a���S��gM����;?�B{����:�����*�1�E�=R�
�������R�_�p�}��������ӫib�
̬׬����%�S6���#����%ح-��H,�6u�:���8�*$�8O���������үZ�V<�����'Ӱ=��9�F�U�b�'��*��Ա@�4�=�SD�T�����y�������_+����?K�A��ͷ'޷�
��3�@�M�k�r�
{�������Ǹָ��M	�W�\���-g�kw��
�.�Jhq��8�����/PG+���I�?����=�4��$Q�&��U���������DAk�����+��
��1��������)����@�1~��M����s�h�[�&tR��	�p�3\�HR����f�V{
�=�>�S�oF�f�-Z:����[F���������!�9���<
W*Y^��W_���e�U�i_�A��K�~�#"]���!���'v%ot,S^��G����N��%���b��3X{�TQ�c$�B��7w�}`���9n]���}�c�n�jE�L�X��5p���������i?�������C�8D�z��"�2�.��7���a;M��al�mO�������E	���@��
Nr|Csly�,���r`�������5y��/���(�J���Vx> m2L���6;��u	��:Tv� ��u���<4g\
��|H�'���P(d�Z��jKI��)Y���x0�#b�60��*dz����q���O��B���e"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%s does not exist.%s has been updated.%s have been updated.%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.(Copy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAccordionActionsActivate LicenseAddAdd Extra OptionAdd New TemplateAdd TemplateAdd elementAdd element in a new sectionAdd itemAdd sectionAdd to cartAdd translation to %sAdvanced optionsAfterAfter add to cart buttonAfter productAfter product summaryAllAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAnimationAnimation delayAnyAppend new elementsApplied onAprilAre you sure you want to clone this item?Are you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttribute LabelAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase priceBeforeBefore add to cart buttonBefore productBottomBottom leftBottom rightBoxBuilderButtonCDNCancelCartCategoriesCenterChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?CheckboxCheckboxesCheckedCheckoutChoose an optionChoose the tax class for Fee price type on this element.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the order or not.Choose whether to include tax for Fee price type on this element.ClearClear all additional Global formsClick to toggleClone formCloning is forbidden.CloseClose allColorColor pickerConditional LogicConnecting to activation server ...ConsentConstant nameConstant valueContentCopyCostCould not update post in the databaseCountCustom codeCustom priceCustom price (required)Custom styleDateDate fieldDate formatDate pickerDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDeactivate LicenseDecemberDefaultDefault valueDeleteDelete PermanentlyDelete itemDescendingDescriptionDigitsDisableDisabledDisabled datesDisabled roles for this formDiscountDiscount typeDisplayDisplay a pop-up linkDisplay asDividerDocsDoneDownloading package from Envato market...DropdownEditEdit ElementEdit SectionEdit TemplateEdit itemEdit optionsEdit settingsElement idElementsEmailEmpty cartEmpty cart textEnableEnable points display?Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable this to add the WooCommerce tax suffix on the totals boxEnable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.EnabledEnabled roles for this formEnabling this will hide the URL of any uploaded file while in order.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the empty cart button text.Enter a value to limit the maximum characters the user can enter.Enter the number of values for the points display.Enter title hereErrorError connecting to Envato API. Please try again later.Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error! Can't connect to filesystemEveryoneExclude ProductsExpand allExport CSVExtra Product Option #%1$s of %2$sExtra Product OptionsExtra Product Options & Add-Ons for WooCommerceExtra Product Options FeesExtra Product Options Form BuilderExtra Product Options SettingsFailed to write file to disk.FebruaryFees total textFile imported.File manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal total boxFinal total textFixed amountForm draft updated.Form published.Form restored to revision from %sForm saved.Form submitted.Form updated.Free!FridayFromFullsizeGeneralGeneral OptionsGeneral SettingsGlobalGoogle font: on or offonH1H2H3H4H5H6H:mmHH:mmHeader colorHeader positionHeader typeHeadingHeightHideHide checkbox element average priceHide element label in orderHide element value in orderHide priceHide upload file URL in orderHourIDImport CSVImporting csv...Importing dataInclude additional Global formsInclude tax for Fee price typeInitializationInvalid action.Invalid file extensionInvalid import method used.Invalid request!Item name in quotes&ldquo;%s&rdquo;Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)JulyJuneLabelLabel colorLanguageLargeLeftLeft of the fieldLeft sideLicenseLicense activated.Limit selectionLoading ...LocaleM j, Y @ H:iMarchMax valueMaximum image heightMaximum image widthMaximum quantityMayMediumMenu OrderMin valueMinimum charactersMinimum quantityMinuteMissing a temporary folder.MondayMonthMore information about %sMove to TrashMultiply cost by block countMultiply cost by person countMultiply options cost by areaN/ANameNew TemplateNextNoNo Template foundNo Template found in trashNo changeNo elements found!No file found.No file was uploaded.No negative priced products textNo validationNo zero priced products textNoneNormalNovemberNumberNumber of pointsOctoberOpenOptionOptions amountOptions saved!OrderOrder byOverride product priceOverwrite existing elementsPaddingParent TemplatePercent of the original pricePercent of the original price per word (no n-th char)Percent of the origιnal pricePercentagePlaceholderPlacementPlease enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} characters.Please enter no more than {0} characters.Please enter only digits.PopulatePositionPremium SupportPrevPricePrice TypePrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:PricingPriorityProductProduct pageProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity min valueQuantity stepRadio buttonsRandomRangeRegularRemoveRequiredReset settingsRightRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSaving... Please wait.Search TemplateSearch for a product ...Search for a product&hellip;SecondSectionSection background colorSection idSelectSelect BoxSelect a productSelect boxSelect categoriesSelect custom file types the user will be allowed to upload separated by commas.Select fileSelect file textSelect optionsSelect productsSelect templateSelect the Product(s) to apply the optionsSelect the position of the datepicker.Select the size of the datepicker.Select the theme for the datepicker.SeptemberSettingsSettings:ShadowShop orderShowShow Final TotalShow Options TotalShow descriptionShow filtersShow imageShow labelShow priceShow reset buttonShow titleShow when the total is greater than zeroSingle ProductSizeSmallSomething went wrong with WordPress.Sorry, this file type is not permitted for security reasons.SquareStandardStringsStyleStyle variationsSubscription sign up feeSubtitleSubtitle colorSundayTable nameTabsTaxTax class for Fee price typeTemplateTextText AreaText FieldThe form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The item you are trying to move to the Trash no longer exists.The selected form does not contain any sectionsThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.ThemeThere are no saved variations yet.There was an error saving the settings.This allows you to generate points along the range picker.This field is required.This item has already been deleted.This will exclude any global forms assigned to this product except those defined in the previous setting.This will globally override the product price with the price from the options if the total options price is greater then zero.This will override the product price with the price from the options if the total options price is greater then zero.ThumbnailsThursdayTimeTime formatTitleTitle optionsTitle:ToTo translate the strings for the local options please use WPML interface.TodayTooltipTopTop leftTop rightTotalTranslationsTrying to activate from outside the plugin interface is not allowed!Trying to upload files larger than %s is not allowed!TuesdayType:URLUndoUnit priceUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUploadUpload folderUpload managerUpload successfulUploading files textUploading message textUrlUse WooCommerce valueUse global settingUse setting on each productUsernameValueVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView TemplateView cartView detailsVisble after scrolling the pageVisualWednesdayWidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYesYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item out of the Trash.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot move this item to the Trash. %s is currently editing.Your settings have been reset.Your settings have been saved.autocharacters remainingdivelement quantity input tooltipQtyends withfilefilesgreater thanherehh:mm:ssisis emptyis notis not emptylabelless thanppost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>spanstarts withProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:52+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: el
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n != 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
Το "%s" είναι υποχρεωτικό πεδίο.%1$s &ndash; %2$s%1$s (%2$s)%1$s κάθε %2$sΟ κατάλογος του θέματος "%s" δεν υπάρχει.το %s ενημερώθηκε.τα %s ενημερώθηκε.%s άρθρο μεταφέρθηκε στα διαγραμμένα.%s άρθρα μεταφέρθηκαν στα διαγραμμένα.η καταχώρηση %s δεν Ενημερώθηκε, κάποιος την επεξεργάζεται.οι καταχωρήσεις %s δεν Ενημερώθηκαν, κάποιος τις επεξεργάζεται.η δημοσίευση %s διαγράφηκε οριστικά.οι δημοσιεύσεις %s διαγράφηκαν οριστικά.η καταχώρηση %s αποκαταστάθηκε από τον κάδο απορριμμάτων.οι καταχωρήσεις %s αποκαταστάθηκαν από τον κάδο απορριμμάτων.Ενημερώθηκε η δημοσίευση %s.Ενημερώθηκαν οι δημοσιεύσεις %s.(Αντίγραφο)(χωρίς τίτλο)(μέγιστο μέγεθος αρχείου %s)(χωρίς τίτλο)Ένας αριθμός ημερών από σήμερα.Ολες οι κατηγορίεςΌλα τα προϊόνταΑκορντεόνΕνέργειεςΕνεργοποίηση Άδειας ΧρήσηςΠροσθήκηΠροσθήκη πρόσθετης επιλογήςΠροσθήκη νέο πρωτότυποΠροσθήκη προτύπουΠροσθήκη στοιχείουΠροσθήκη στοιχείου σε μια νέα ενότηταΠροσθήκη στοιχείουΠροσθήκη ενότηταςΠροσθήκη στο καλάθιΠροσθήκη μετάφρασης στο %sΠροχωρημένες επιλογέςΜετάΜετά την προσθήκη στο κουμπί καλαθιούΜετά το προϊόνΜετά την περίληψη του προϊόντοςΌλαΕπιτρεπτοί τύποι αρχείωνΑλφαριθμητικόςΑλφαριθμητικό UnicodeΑλφαριθμητικό Unicode ή διάστημαAnimationΚαθυστέρηση animationΟποιαδήποτεΠροσθέστε νέα στοιχείαΑίτηση στιςΑπρίλιοςΕίστε βέβαιοι ότι θέλετε να κλωνοποιήσετε αυτό το στοιχείο;Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο;Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον φάκελο και όλο το περιεχόμενό του;Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αντικείμενο;Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν την επιλογή;Είστε βέβαιοι ότι θέλετε να επαναφέρετε τις ρυθμίσεις;ΑύξουσαΕτικέτα ΙδιότηταςΧαρακτηριστικό:Χαρακτηριστικά λείπουν. Διαγράψτε αυτήν την επιπλέον επιλογή:ΑύγουστοςΑυτόματη απόκρυψη τιμής αν είναι μηδένΕν αναμονή της εικόνας του προϊόντοςΤιμή ΒάσηςΠρινΠριν από την προσθήκη στο κουμπί καλαθιούΠριν το προϊόνΚάτωΚάτω αριστεράΚάτω δεξιάΠλαίσιοWPBakery Page BuilderΚουμπίCDNΑκύρωσηΚαλάθιΚατηγορίεςΚέντροΗ αλλαγή αυτού θα επηρεάσει μόνο τις μελλοντικές μεταφορτώσεις.Χαρακτήρες υπόλοιπου κειμένουΚλέβεται&#8217; uh;Πλαίσιο ελέγχουΠλαίσια ΕπιλογήςΕπιλεγμένοΤαμείοΚάντε μιά επιλογήΕπιλέξτε τη φορολογική κλάση για τον τύπο τιμής σε αυτό το στοιχείο.Επιλέξτε αν θα αποκρύψετε την ετικέτα στοιχείου στην παραγγελία ή όχι.Επιλέξτε αν θα αποκρύψετε την τιμή του στοιχείου στην παραγγελία ή όχι.Επιλέξτε εάν θα συμπεριληφθεί φόρος για τον τύπο τιμής σε αυτό το στοιχείο.ΚαθαρισμόςΔιαγράψτε όλες τις πρόσθετες καθολικές φόρμεςΚλικ για ΕναλλαγήΚλωνοποίηση φόρμαςΗ κλωνοποίηση απαγορεύεται.ΚλείσιμοΣύμπτυξη όλωνΧρώμαΕπιλογέας χρώματοςConditional LogicΣύνδεση με διακομιστή ενεργοποίησης ...ΣυγκατάθεσηΌνομα ΣταθεραςΤιμή ΣταθεραςΠεριεχόμενοΑντιγραφήΚόστοςΔεν ήταν δυνατή η ενημέρωση της ανάρτησης στη βάση δεδομένωνΜέτρησηΠροσαρμοσμένος κώδικαςΠροσαρμοσμένη τιμήΠροσαρμοσμένη τιμή (απαιτείται)Προσαρμοσμένο στυλΗμερομηνίαΠεδίο ΗμερομνίαςΜορφή ημερομηνίαςΕπιλογέας ημερομηνίαςΕπιλογέας δεδομένωνDatepicker θέσηςDatepicker μέγεθοςDatepicker θέμαΗμέραΑπενεργοποίηση Άδειας ΧρήσηςΔεκέμβριοςΠροεπιλογήΠροεπιλεγμένη τιμήΔιαγραφήΟριστική ΔιαγραφήΔιαγραφή στοιχείουΦθίνουσαΠεριγραφήΧαρακτήρεςΑπενεργοποίησηΑπενεργοποιημένοΑπενεργοποιημένες ημερομηνίεςΑπενεργοποιημένοι ρόλοι για αυτή τη φόρμαΈκπτωσηΤύπος έκπτωσηςΕμφάνισηΕμφάνιση ενός αναδυόμενου συνδέσμουΕμφάνιση ωςΔιαχωριστικόTεκμηρίωσηΟλοκληρώθηκεΛήψη πακέτου από την αγορά Envato market...Αναπτυσσόμενο μενούΕπεξεργασίαΕπεξεργασία ΣτοιχείουΕπεξεργασία ενότηταςΕπεξεργασία ΠροτύπουΕπεξεργασία αντικειμένουΕπεξεργασία επιλογώνΕπεξεργασία ρυθμίσεωνΑναγνωριστικό στοιχείουΣτοιχείαΗλεκτρονικό ταχυδρομείοΆδειο καλάθιΚείμενο κενού καλαθιούΕνεργοποίησηΕνεργοποίηση εμφάνισης σημείων;Ενεργοποιήστε αυτήν τη ρύθμιση για την εμφάνιση ενός Τελικού Συνολικού Πλαισίου στη σελίδα προϊόντος, επιτρέποντας στους πελάτες να δουν το συνολικό κόστος της παραγγελίας τους ή να το απενεργοποιήσουν για μια απλοποιημένη σελίδα προϊόντος.Ενεργοποιήστε αυτό για να προσθέσετε το επίθημα του φόρου WooCommerce στο πλαίσιο συνόλωνΕνεργοποιήστε την εμφάνιση του συνολικού πλήρους προϊόντος, παρέχοντας στους πελάτες μια σαφή επισκόπηση του συνολικού κόστους.Ενεργοποίηση για εμφάνιση του συνόλου ειδικά για επιλεγμένες επιλογές προϊόντων.ΕνεργοποιημένοΕνεργοποιημένοι ρόλοι για αυτή τη φόρμαΗ ενεργοποίηση αυτού του αρχείου θα κρύψει τη διεύθυνση URL οποιονδήποτε μεταφορτωμένων αρχείων κατά την παραγγελία.Πληκτρολογήστε ένα κείμενο για να αντικαταστήσετε το κείμενο του κουμπιού προσθήκη στο καλάθι όταν χρησιμοποιείτε την επιλογή Force.Εισαγάγετε ένα κείμενο για να αντικαταστήσετε το κείμενο του κενού κουμπιού καλαθιού.Εισαγάγετε μια τιμή για να περιορίσετε τους μέγιστους χαρακτήρες που μπορεί να εισαγάγει ο χρήστης.Εισαγάγετε τον αριθμό των σημείων που εμφανίζονται.Εισάγετε τον τίτλο εδώΣφάλμαΣφάλμα κατά τη σύνδεση με το Envato API. Παρακαλώ προσπαθήστε ξανά αργότερα.Σφάλμα στη διαγραφή.Σφάλμα κατά τη μετάβαση στον Κάδο απορριμμάτων.Σφάλμα κατά την επαναφορά από τον Κάδο απορριμμάτων.Λάθος! Δεν είναι δυνατή η σύνδεση στο σύστημα αρχείωνΌλοιΕξαίρεση προϊόντωνΕπέκταση όλωνΕξαγωγή CSVΕπιπλέον επιλογή προϊόντος #%1$s από %2$sΕπιπλέον Επιλογές ΠροϊόντοςΕπιπλέον Επιλογές Προϊόντος & Πρόσθετα για το WooCommerceΕπιπλέον Επιλογές Προϊόντος ΤέληΕργαλείο δημιουργίας φόρμας επιλογών επιπλέον προϊόντωνExtra Product Options 设置Αποτυχία εγγραφής αρχείου στο δίσκο.ΦεβρουάριοςΚείμενο συνολικών χρεώσεωνΤο αρχείο εισήχθη.Η διαχείριση αρχείων δεν υποστηρίζεται στον διακομιστή σας.Η μεταφόρτωση αρχείου σταμάτησε κατά επέκταση.Όνομα αρχείουΦίλτρο βάσειΤελικό συνολικό κουτίΚείμενο Τελικού συνόλουΣταθερό ποσόΤο προσχέδιο φόρμας ενημερώθηκε.Η φόρμα δημοσιεύτηκε.Έγινε αποκατάσταση της μορφής για αναθεώρηση από %sΗ φόρμα αποθηκεύτηκε.Η φόρμα υποβλήθηκε.Η φόρμα ενημερώθηκε.Δωρεάν!ΠαρασκευήΑπόΠλήρες μέγεθοςΓενικάΓενικές επιλογέςΓενικές ΡυθμίσειςΓενικόανοιχτόH1H2H3H4H5H6Η:λλΩΩ:λλΧρώμα γραμμάτων επικεφαλίδαςΘέση επικεφαλίδαςΚεφαλίδαΕπικεφαλίδαΎψοςΑπόκρυψηΑπόκρυψη κουτάκι μέση τιμή στοιχείουΑπόκρυψη ετικέτας στοιχείου στην παραγγελίαΑπόκρυψη τιμής στοιχείου στην παραγγελίαΑπόκρυψη τιμήςΑπόκρυψη URL αρχείου μεταφόρτωσης με την παραγγελίαΏραIDΕισαγωγή CSVΕισαγωγή csv...Εισαγωγή δεδομένωνΣυμπεριλάβετε επιπλέον καθολικές φόρμεςΣυμπερίληψη φόρου για τον τύπο τιμήςΕνεργοποίησηΜη έγκυρη ενέργεια.Μη έγκυρη επέκταση αρχείουΧρησιμοποιήθηκε μη έγκυρη μέθοδος εισαγωγής.Μη έγκυρο αίτημα!&ldquo;%s&rdquo;Στοιχεία ανά γραμμή (Galaxy Tablets landscape)Στοιχεία ανά γραμμή (Samnsung Galaxy)ΙούλιοςΙούνιοςΕτικέταΧρώμα ετικέταςΓλώσσαΜεγάλοΑριστεράΑριστερά από το πεδίοΑριστερή πλευράΆδεια ΧρήσηςΗ άδεια ενεργοποιήθηκε.Περιορίστε την επιλογήΦόρτωση ...ΤοποθεσίαJ M Y @ H:iΜάρτιοςΜέγιστη τιμήΜέγιστο ύψος εικόναςΜέγιστο πλάτος εικόναςΜέγιστη ποσότηταΜάιοςΜεσαίοΣειρά μενούΕλάχιστη τιμήΕλάχιστοι χαρακτήρεςΕλάχιστη ποσότηταΛεπτόΛείπει ένας προσωρινός φάκελος.ΔευτέραΜήναςΠερισσότερες πληροφορίες σχετικά με %sΜετακίνηση στον  Κάδο απορριμμάτωνΠολλαπλασιάστε το κόστος ανά αριθμό μπλοκΠολλαπλασιάστε το κόστος ανά άτομοΠολλαπλασιασμός επιλογών κόστους ανά περιοχήΜη ΔιαθέσιμοΌνομαΝέο πρότυποΕπόμενοΌχιΔεν βρέθηκε πρότυποΔεν βρέθηκε πρότυπο σε κάδο απορριμμάτωνΚαμία αλλαγήΔεν βρέθηκαν στοιχεία!Δεν βρέθηκε αρχείο.Δε μεταφορτώθηκε κανένα αρχείο.Δεν υπάρχει κείμενο με αρνητικά προϊόνταΕπικύρωσηΜη μηδενικές τιμές κειμένου προϊόντωνΚανέναςΚανονικόΝοέμβριοςΑριθμόςΑριθμός σημείωνΟκτώβριοςΑνοιχτόΕπιλογήΚόστος επιλογώνΟι Επιλογές σώθηκαν!ΠαραγγελίαΤαξινόμηση κατάΠαράκαμψη τιμής προϊόντοςΑντικαταστήστε τα υπάρχοντα στοιχείαΠεριθώριοΓονικό πρότυποΠοσοστό της αρχικής τιμήςΠοσοστό της αρχικής τιμής ανά λέξη (όχι n-th χαρακτήρα)Ποσοστό της αρχικής τιμήςΠοσοστόΚράτηση θέσηςΤοποθέτησηΕισαγάγετε μια έγκυρη διεύθυνση URL.Παρακαλώ εισάγετε μία έγκυρη διεύθυνση email.Παρακαλώ εισάγετε έναν έγκυρο αριθμό.Εισαγάγετε μια τιμή μεγαλύτερη ή ίση με {0}.Εισαγάγετε μια τιμή μικρότερη ή ίση με {0}.Εισαγάγετε τουλάχιστον {0} χαρακτήρες.Παρακαλώ μην συμπληρώστε παρισότερους από {0} χαρακτήρες.Παρακαλώ, εισάγετε μόνο ψηφία.ΣυμπλήρωσηΘέσηΕπαγγελματική υποστήριξηΠροηγούμενοΤιμήΤύπος ΤιμήςΤιμή ανά λέξη (όχι n-th χαρακτήρα)%1$s &ndash; %2$s%1$s&ndash;%2$sΤύπος τιμήςΤιμή:ΤιμολόγησηΠροτεραιότηταΠροϊόνΣελίδα προϊόντοςΠροϊόνταΠροϊόντα και ΚατηγορίεςΔημοσίευσηΚωδικός αγοράςΠοσότηταΠοσότηταΕλάχιστη τιμή ποσότηταςΒήμα ποσότηταςΚουμπιά μοναδικής επιλογήςΤυχαίαΕύροςΚανονικόΑφαίρεσηΑπαιτείταιΕπαναφορά ρυθμίσεωνΔεξιάΣωστη πλευραΡόλοιΣτρογγυλόΣτρογγυλό 2Εκτέλεση της ενήμερωσηςΚωδικός:ΠροσφοράΤιμή πώλησηςΣάββατοΑποθήκευσηΑποθήκευση αλλαγώνΑποθήκευση ... Περιμένετε.Πρότυπο αναζήτησηςΑναζήτησε ένα προϊόν ...Αναζήτηση προϊόντος&hellip;ΔευτερόλεπτοΕνότηταΧρώμα φόντου ενότηταςΑναγνωριστικό ενότηταςΕπιλέξτεΕπιλέξτε κουτίΕπιλέξτε ένα προϊόνΕπιλέξτε πλαίσιοΕπιλέξτε κατηγορίεςΕπιλέξτε ειδικούς τύπους αρχείων που θα επιτρέπεται στο χρήστη να φορτώσει διαχωρισμένα με κόμματα.Επιλογή αρχείουΕπιλογή αρχείου κειμένουΕπιλογήΕπιλέξτε προϊόνταΕπιλέξτε πρότυποΕπιλέξτε το/τα προϊόν(ντα) για να εφαρμόσετε τις επιλογέςΕπιλέξτε τη θέση για τον δημιουργό ημερομηνιών.Επιλέξτε το μέγεθος για τον δημιουργό ημερομηνιών.Επιλέξτε το θέμα για τον δημιουργό ημερομηνιών.ΣεπτέμβριοςΡυθμίσειςΡυθμίσεις:ΣκιάΠαραγγελίαΕμφάνισηΕμφάνιση Τελικού ΣυνόλουΕμφάνιση συνόλου επιλογώνΔείξε περιγραφήΕμφάνιση φίλτρωνΕμφάνιση τίτλου εικόναςΕμφάνιση ετικέταςΕμφάνιση τιμήςΔείξτε το κουμπί επαναφοράςΕμφάνιση τίτλουΕμφάνιση όταν το σύνολο είναι μεγαλύτερο από το μηδένΜοναδικό προϊόνΜέγεθοςΜικρόΚάτι πήγε στραβά με το WordPress.Λυπούμαστε, αυτός ο τύπος αρχείου δεν επιτρέπεται για λόγους ασφαλείας.ΤετράγωνοΤυπικόStringsΣτυλΣτυλ παραλλαγώνΣυνδρομητική εγγραφήΥπότιτλοςΧρώμα υποσέλιδουΚυριακήΌνομα πίνακαΚαρτέλεςΦόροςΦορολογική κλάση για τον τύπο τιμήςΠρότυποΚείμενοΠεριοχή ΚειμένουΠεδίο κειμένουΤο έντυπο εφαρμόζεται σε όλα τα προϊόνταΤο έντυπο δεν εφαρμόζεται σε κανένα προϊόνΟι φόρμες που θα επιλέξετε θα εμφανίζονται μαζί με τις φόρμες που έχει ήδη το προϊόν.Το στοιχείο που προσπαθείτε να μετακινήσετε στον Κάδο δεν υπάρχει πλέον.Η επιλεγμένη φόρμα δεν περιέχει τμήματαΤο μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε στη φόρμα HTML.Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php.ini.Το μεταφορτωμένο αρχείο μεταφορτώθηκε μόνο εν μέρει.ΘέμαΔεν υπάρχουν ακόμα αποθηκευμένες παραλλαγές.Παρουσιάστηκε σφάλμα κατά την αποθήκευση των ρυθμίσεων.Αυτό σας επιτρέπει να δημιουργήσετε σημεία κατά μήκος του επιλογέα εύρους.Αυτό το πεδίο είναι υποχρεωτικό.Αυτό το στοιχείο έχει ήδη διαγραφεί.Αυτό θα εξαιρέσει τυχόν καθολικές φόρμες που έχουν εκχωρηθεί σε αυτό το προϊόν εκτός από αυτές που ορίζονται στην προηγούμενη ρύθμιση.Αυτό θα αντικαταστήσει σε γενικές γραμμές την τιμή του προϊόντος με την τιμή από τις επιλογές εάν η συνολική τιμή των δικαιωμάτων προτίμησης είναι μεγαλύτερη από το μηδέν.Αυτό θα αντικαταστήσει την τιμή του προϊόντος με την τιμή από τις επιλογές εάν η συνολική τιμή των δικαιωμάτων προτίμησης είναι μεγαλύτερη από μηδέν.ΜικρογραφίεςΠέμπτηΏραΜορφή ΏραςΤίτλοςΕπιλέξτε επιλογές τίτλου σελίδαςΤίτλος:ΠροςΓια να μεταφράσετε τις συμβολοσειρές για τις τοπικές επιλογές, χρησιμοποιήστε τη διεπαφή WPML.ΣήμεραΣημείωσηΚορυφήΕπάνω αριστεράΕπάνω δεξιάΣύνολοΜεταφράσειςΔεν επιτρέπεται η προσπάθεια ενεργοποίησης εκτός της διεπαφής της προσθήκης!Δεν επιτρέπεται η μεταφόρτωση αρχείων μεγαλύτερων από %s !ΤρίτηΤύπος:URLΑναίρεσηΤιμή μονάδαςΆγνωστο είδος θέσης.Απαγορεύεται η αποτύπωση από αυτήν την κλάση.ΕνημέρωσηΕνημέρωση καλαθιούΜεταφόρτωσηΜεταφόρτωση φακέλουΔιαχείριση ΜεταφόρτωσηςΗ μεταφόρτωση ολοκληρώθηκε με επιτυχίαΜεταφόρτωση αρχείων κειμένουΜεταφόρτωση κειμένου μηνύματοςURLΧρησιμοποιήστε την τιμή WooCommerceΧρήση γενικής ρύθμισηςΧρήση ρύθμισης για κάθε προϊόνΌνομα ΧρήστηΑξίαΠαραλλαγή:ΠαραλλαγέςΔιάφοραΠροβολή τεκμηρίωσης Επιπλέον Επιλογών ΠροϊόντοςΠροβολή ρυθμίσεων Επιπλέον Επιλογών ΠροϊόντοςΠροβολή προτύπουΠροβολή ΚαλαθιούΠροβολή ΛεπτομερειώνΟρατό μετά την κύλιση της σελίδαςΟπτικόΤετάρτηΠλάτοςΚρατήσεις WooCommerceΕύκολη κράτηση WooCommerceΡυθμίσεις για το WooCommerceΣυνδρομές WooCommerceΤο WooCommerce δεν είναι ενεργοποιημένο!ΈτοςΝαιΔεν επιτρέπεται να διαγράψετε αυτό το αρχείο.Δεν επιτρέπεται η παρέμβαση σε αυτό το αρχείο.Δεν επιτρέπεται να μετακινήσετε αυτό το στοιχείο από τον Κάδο απορριμμάτων.Δεν επιτρέπεται η μετακίνηση αυτού του στοιχείου στον Κάδο απορριμμάτων.Δεν επιτρέπεται η επαναφορά αυτού του στοιχείου από τον Κάδο απορριμμάτων.Προσπαθήσατε να επεξεργαστείτε ένα στοιχείο που δεν υπάρχει. Ίσως να διαγράφηκε;Δεν μπορείτε να επεξεργαστείτε αυτό το στοιχείο επειδή βρίσκεται στον Κάδο απορριμμάτων. Παρακαλούμε να το επαναφέρετε και να προσπαθήσετε ξανά.Δεν μπορείτε να προσθέσετε άλλες επιπλέον επιλογές.Δεν μπορείτε να μετακινήσετε αυτό το στοιχείο στον Κάδο απορριμμάτων. Το %s επεξεργάζεται αυτή τη στιγμή.Έγινε επαναφορά των ρυθμίσεών σας.Οι ρυθμίσεις σας έχουν αποθηκευτεί.αυτόματοχαρακτήρες απομένουνdivΠοσότητατελειώνει μεαρχείοαρχείαμεγαλύτερος απόεδώhh:mm:ssείναιείναι κενόδεν είναιδεν είναι κενόετικέταλιγότερο απόpTM Extra Product OptionsΌλα <span class="count">(%s)</span>Όλα <span class="count">(%s)</span>spanξεκινάει μεlanguages/woocommerce-tm-extra-product-options-zh_CN.mo000064400000306634150755142440017316 0ustar00����&y�M�g�g�go�g|h�h�h5�h$i&i-i
6iAi
Ti_i|i�i�i�i	�i�i�i�i�i�i�ijj+j&8j8_j�j�j�j(�j�j
�j
k%,kRk^k)qk�k#�k�k�k�k
ll$l=l
Ml[lol�l�l�l�l�l�l'�lrm�m-�m�m�m	�m�mnn
n&n),n*VnD�n*�n,�n,o	KoLUo�o�o�o
�o4�o-p4pLp%cp
�p�p�p�p]�pX(q�q�q�q�q�q#�q�qrrr,r0r
8rCrGrTr&]r&�r�r��rIAs�s�s
�s�s�s�s�s.t/tIt\t<zt��t=8uYvuR�u>#v<bvf�vMwFTw^�wR�wzMxR�x'y3Cy7wy9�y/�y�z;�zD�z76{In{B�{?�{:;|(v|�|
�|�|�|�|�|�|(�|=}SX}T�}"~3$~DX~1�~H�~58NF�,�8�+4�7`�<��KՀ=!�<_�K��=�(&�AO�;��2͂i�<j���!��σ�
���	��:�@�M��\��ބ����
����
ȅօ���%
�3�
9�G�Z�i�u�����������Ն
چ�����
%�0�D�T�e�i�|�����E������
�*�?�F�Y�!l���
������̈ӈ#ۈ&��&�C�\�t���1��Ή߉�����
7�E�M�'c�'��
����ъ/��5�S�[�h�m�?r�$��)׋�
��1�C�_�q�����������ٌ
�	���
�
�$�-�E�_�r�
����
������"���'�"� ?�`�<|�<��!��.�9G�#��(��Ώ �$�)+�fU�0��]�?K����-8�?f�+��DҒ>�=V�?��Aԓq�F��gϔ57�9m�3��2ە3�3B�v�������
–Ж'�C�)X�7��9��H�g=�L��P�DC����R�yo�A�E+�Bq�s��N(�Aw���ʜ_Ӝl3�w��s�\��9�U#�Vy�2П^�rb�>ՠX�:m�L��L��>B����C
�@N�W��\�3D�Yx�8Ҥ<�=H�T��@ۥ��7��A��::�0u�0��-ק��5-�6c�8��6ӨC
�5N�3����Fө�3�2L�'�>���N��N�,m�D��߫�3�	:�	D�N�7T���#��̬߬���.�"I�l����� ����ϭ��
��"
�"-�
P�[�g�#�%��ɮ/߮�"*�M�	l�v���������ȯ-կ!�%�	.�8�D�T�e�r�������а����!#�E�Q�i�
y�������������Ʊֱ�����3�L�O�R�U�X�[�^�b�h�o�t�{�����������������˲ز������3�#Q�Vu�̳�:�>�)Y�������"Ǵ
�)���=�M�0R�H��̵ϵ�M�PB�D��
ض���
�� �/�J�'j���'��:ٷ�6#�Z�r���������Ѹ��
��/�F�b�s�$��$��(ع�!�!=� _�������ͺֺ!��
���
+�9�E�
T�_�h�|�0����>׻C�'Z�������	����ƼӼ����,�<�H�O�_�l�A|���Ľͽ	ڽ�0��(�=�Q�o���������
��7ƾ	���0�L�j�{�������Ŀ�����&�@�
Z�h�{������D�1�5�:�J�W�l�����	������ ���
5�C�`�s�x��������������/��7�D�I�P�a�z�������������'���3�J�f�n�����'��&��5��
4�?�^�	j�t���#����2��/"�$R�%w�(��)����$
�2/�b�.}�5��1��o�.��1��"��#�!,�"N�q� ��������%����$�'�4�L�\�4a�0�� ��)���/�
5�@�S�
g�u���&��$��
�������%�-�0G�@x����������5�
=�K�O�X�o�����
����
��+��-�6�=�C�P�X�e�l�)�������������(�9�!R�t�:��
����+����0�
C�N�T�Z�b�r�w�
|���������,������	�#�<�Y�a�{���
����������
�!(�J�
W�b�3s�Q�����
.�9�F�PX�������*��"�-&�&T�1{���������0��*�-D�r����*W�3��_��:�4Q�D��&��-��< �@]�"��)��$��$�$5�#Z�*~�@��/��2�;M�	��	��M��>��9*�Ed�E��=��
.�9�	B�L�S�
h�s�x�������������
��2�+G�!s�
����	��
��%��C��5:�p���C��
����(���
6�(D�m�y���������������$��<�Q�X�a�j�����
����
����������
��)�G�P�_�q�~���;����
����������	�
'�2�C�U�	a�
k�{y�4��,*�)W�,��]���>%�Cd�+�����9x�'��C��E�<d�;��F��$�/A�"q�Z��G��.7� f�����"��'��	��/��1,�:^�����O�3��0�=�Y�q�)��;��#��4�BI�@��;��i	�~s�D��E7�'}�<��u��)X�@��D��[�3d�
��������������
������7�<9�Iv�������������
�	� �&�@� U�"v���.��*��D�@E�5�������������
�!�1�3D�x��������#��
����
��/�F�J�_�%u�����������h�)z�7��"����1-�_�sz�2�!�*�@�L�d�
v�
����(��#���
�	�
��7�V�	]�3g�������"���"�>�C�V�i�|���������(�&��3�OQ�/��/�0�[2�&��4��0�@�\�@y�.��3�/�.M�|����������1"5	Xbgmz�����������������&/	5?4U�#�'�/�
�"#��q
h�&�* Jkt}��!����-4ATg��$�*���* KXh~��-��		*	7	D	K	^	{	�	�	�	�	�	�	�	�	
$#
mH
�
-�
�
�
%,	<F(M$v:�"�(�"A<H$����.�
!
*
=
V
c
j
}
S�
��
�����-	4>	KU	\	fp
t	�����B\	�������-@Sf<|�<99vE�9�10gbE�$W5]�u�Za.�0�36P$���'=9e-�3�*0,<]+�	�	����	��01EbK��$B4*wF�-�-0E!v-�!�,�06F-}-�3�*
86T?�'�V�3J~!�������"'nJ��X e l y � � � � � � � 	� � !!&!6!F!^!n!~!�!�!�!�!�!�!�!�!"-"C"G"S"_"k"9{"	�"�"�"	�"�"�"�"##4#A#H#!O#q#x##�#�#�#�#�#$!"$D$T$[$h$�$�$�$�$�$+�$+�$	&%0%C%3S%�%�%	�%�%�%�%0�%&!1&S&Z&j&w&�&�&�&�&�&�&�&�&'')'6'C'P'
]'k'|'�'�'�'�'�'�'�'�'($(B([(z(0�(0�(�(-)*?)j)&�)�)�)$�)$*`'*3�*V�*B+�V+3�+;,-T,9�,B�,?�,??-<-Q�-<.9K.*�.'�.'�.%/'&/'N/v/�/�/�/�/�/!�/<�/$50-Z0'�0E�0Z�0<Q1K�1<�1�2T�2`33c36�30�3[�3?[4B�4�4�4E�4e>5g�5g6Ot66�6Q�6ZM7$�7`�7i.86�8W�89'9Qa9N�9<:�?:9�:<�:V7;H�;9�;W<<i<6�<'�<<=-B=�p=*�=B&>6i>-�>0�>�>?-?-@?0n?-�?0�?-�?*,@-W@�@6�@�@�@'�@#A6?AvAB�A%�A�A6BEB[B-nB	�B�B�B2�B�B$�B C!3CUCtC�C%�C�C	�C�C�CD#D0D7DDDQDoD	�D�D�D!�D!�D�D/EDE`EvE�E�E�E�E�E�E�E0F-3F	aFkFrF	yF�F�F�F�F�F�F�F�FG3G"FGiG|G�G�G�G	�G	�G�G	�G�G�GHHH"H/H'<HdHgHjHmHpHsHvHzH�H�H�H�H�H�H�H	�H�H�H�H�H�H�H�HIII2IQI$gIN�I�I�I1JKJ*jJ�J!�J�J!�JK0KCKbKoK0vK9�K�K�K�KKLK\LB�L�L�LM	MM,M9MRM!kM�M�M2�M�M$�M!N4N	GNQN^NwN�N�N�N�N�N�N
O)O:OVO-gO0�O�O�O P#!PEP\PtP�P�P�P�P�P�P�P�P�PQQQ
&Q4Q*AQlQ.�Q4�Q�QR	RR,R3R	CRMR	`RjR}R�R�R�R	�R�R�R�R!�RSS%S	2S<S*LSwS�S�S�S�S�S�S�S�S-T	/T9T*ITtT�T�T�T�T�T�T	�TUUUU(U@UMU]UmU�U�U�U9�UV	VV	#V-V@V_VoV�V�V�V�V�V�VWW5WKWOWVWeW~W	�W�W�W�W-�W1�WXXX+X>XKX^XqXxX�X�X�X�X�X�X	YY/Y<YOY$nY=�Y	�Y�Y	�Y�YZZ'7Z_Z${Z$�Z�Z�Z[! [B[X[*w[�['�[0�[*\r<\'�\'�\�\];]W]q]�]�]�]�]�]�]!�]^^3^	@^$J^$o^�^$�^�^�^�^�^__,_+9_e_w_�_	�_�_�_	�_�_�_�_-�_#`<`U`b`o`v`�`�`�`�`�`�`�`�`�`�`a!a'7a_afamaza�a�a�a!�a�a�a�a	bb5bKbXbnb�b6�b�b�b!�bcc3c@cGcNcUc^cqcvc}c	�c�c�c�c�c�c�cdd&d;dBdUdbdrd{d�d�d�d�d�d�d	e
e' e<He�e!�e	�e	�e�e<�ef(f;fNfmf-�f$�f*�fgg!g.g';gcg$g�g��g!Zh$|hB�h*�h$i04i$ei�i*�i*�i$�i$j!Cj$ej�j�j'�j*�j*k-Fk*tk�k�k9�k9�k6'l<^l<�l'�lmm	m!m(m5mBmIm\mom�m�m�m�m�m�m�m*n;nZngn}n�n�n9�n-�n!o4o9Do~o�o-�o�o�o�opp%p,pBpIpXpnp�p�p9�p�p�p�p�pqq%q
2q	@q	Jq!Tqvq}q�q�q�q	�q�q�q�q	�qr0r?rLrYr`rdr�r�r�r�r�r�r�r�r�ris3ks!�s�s'�s<tEt6Rt<�t�t��t*bu�u6�u:�u&v'Bv2jv�v!�v�vD�vG*w!rw�w�w�w!�w�w�w'x-+x-Yx��xlFy*�z�z�z
{{$3{9X{!�{0�{6�{-|*J|Tu|Q�|9}0V}�}*�}?�}!~33~9g~E�~-�~		/9@Mcj	w�6�0�:�(�/�6�L�b�	i�s�����������ր��#�� �3<�0p�/��	сہ	�����(�/�6�-O�}�����������݂�����'�:�A�T�)k�������΃���^�!n�-��!����4�G�lZ�<Dž	��	!�+�@�P�X�_�f�������ĆԆ����	�$'�L�S�e�z�������̇Ї�
����
�&�*�D�`�'|�=��5�,�,E�Wr�'ʉ-�- �<N���6��'�2	�,<�,i�����ȋ�	�����,�<�@�	G�Q�X�_�f�v�z���������������������Č͌	ьی�����'-�U�W�d�q���	����N|���U�h D�
6�G9*��g�{��\��zN���v�r�e@�PSA9�:��I:!=6[�n5�oL`�����m<�i�u
�1Z��e���{��g���3�Ad�>wg���^y-�[XRq��(%����n��R1k��QGKMe��������?�I�=���f�M�������a��H����p�+U8u�3�%��g� &�i��,�#�wQ�`o~Q��)�^E�[�h�q��>�:-k�F�04Y��X|p3���j�L�8T��<dJ�?2#�a���;���[3����i�"�b��v���%�`����~ ,���7t��y�����*���,��H�!� �{��
��\������Cq���f5V��_��J�crr���pj��m����l�|�1_z���)����P}�Y���r��&sJS�J Ij'�x4���y�we��z������{rH���Vx4�^i����;	�.=��ys�E;�:>e	�E����$�+�0<s��nOKA}+k	���R�;b���"�(uM�Y��%���^��
����D8Y
�����Pk����/	�P�l�OS�X?�$���x/b)
���n��f�O9�t/c\1���2�����#�����o���������������'-s��6-#����})�������~��,!.oFE���(�>�
���B�hB�U�Gx�Q�SB�Qs]��?V�������*M�5�t���=���"����5��t�������
�`|f�V���`d"+�NW���G���&O�:��������c'����E~�/��������Dv�>�i]&��D��\��t�',�����bX��y9V��]&�m������ZL�����Cq�v��]O���C�*����9}��"PNo�F�m�0|��
��Y���wL�2�
�K�)���=���B�Gp�K�8C��lv��u5<�����c��$T���m_7���(BU��!��h�x�����\f�!0�.���4R���~I����Zq��a�-*z�Na/F�8j���khp��7_���@���X�2��4�3g7%6ndu�l����D��$�H�7�U?��'z�S��1���a�WLj���WA0T�@Z�$�	K����W;��+#�T�����l��d�C��[(.��M�.��26��THZA�������c�<�{}��_Fw^Rb]��I�����@W@�J������"%s" is a required field.%1$s &ndash; %2$s%1$s has been removed from your cart because it has since been modified. You can add it back to your cart %2$s.%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please update to the latest version.%s does not exist.%s is not a valid image file!%s removed along with all of its associated products!&quot;%1$s&quot; (Instance ID: %2$s)(Copy)(Legacy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAbove fieldAbsolute URLAccordionActionsActivate LicenseAddAdd ConstantAdd Extra OptionAdd Global FormAdd New Global FormAdd New TemplateAdd TemplateAdd button text on associated productsAdd categories to include all their associated products.Add elementAdd element in a new sectionAdd itemAdd option cost to booking display priceAdd sectionAdd separatorAdd the products individually.Add the template you want to display.Add to cartAdd to cart buttonAdd to cart button on floating totals boxAdd translation to %sAdditional Options text replacementAdditional optionsAdvanced displayAdvanced optionsAfterAfter Local OptionsAfter add to cart buttonAfter cart formAfter productAfter product imageAfter product summaryAfter the elementAllAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAlter generated product structured dataAlters the generated product structured data. This may produce wrong results if the options use conditional logic!Always showAlways use unique values on cart for elementsAlways visibleAn error has occurred!AnimationAnimation delayAnyAppend new elementsApplied onAprilAre you sure you want to clone this item?Are you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttach the price to the order making it independent of the product quantity.Attach upload files to emailsAttribute LabelAttribute element class nameAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase original price type according toBase priceBeforeBefore Local OptionsBefore add to cart buttonBefore adding Extra Options in this mode, add and save some attributes on the Attributes tab.Before adding Extra Product Options, add and save some attributes on the Attributes tab.Before cart formBefore productBefore product summaryBefore the elementBelow fieldBind repeater with product quantityBottomBottom leftBottom of screenBottom rightBoxBuilderButton AltCDNCSS SettingsCSS codeCalendar close button text replacementCalendar today button text replacementCancelCannot apply rules on this element or section since there are not any value configured elements on other sections, or no other sections found.Cannot deactivate. Purchase code is not valid for your saved license key!CartCart Field DisplayCategoriesCenterChange original product priceChange variation priceChanges product imageChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?Check for empty product priceCheck show quantity selector only for elements with a value.Check this if you use Google Merchant Center. It will hide the price html of the element when you enable its hide price setting.Check this only if you are getting server errors on checkout.Check this to alter the price display of a product when it has extra options with prices.Check this to disable showing description as a tooltip and show it inline instead.Check this to force elements to be full width instead of auto.Check this to globally hide the price display if it is zero.Check this to globally trim zero in prices. This will be applied to native WooCommerce prices as well.Check this to have the plugin set to zero the product price when it is empty.Check this to include the pricing of the options to the product price.Check this to multiply the prices of the select box options with its quantity selector if any.Check this to show the add to cart button only when at least one option is filled.Check this to show the price of the select box options if the price type is fixed and even if the element hides the price.Check this to show the price of the select box options if the price type is fixed.Check to Attach upload files to emails.Check to disable options from being sent to emails.Check to disable scrolling to the element with an errorCheck to disable the conversion to png for image uploads.Check to enable legacy meta data functionality.Check to enable the display of extra options on the shop page and category view. This setting is theme dependent and some aspects may not work as expected.Check to enable the display of the undiscounted final totalCheck to enable the inclusion of option prices to the pricing table.Check to enable validation feature for builder elementsCheck to overwrite the original product price when the price is changing.Check to overwrite the variation price when the price is changing.Check to remove Free price label when product has extra optionsCheck to split items with multiple values to unique lines.Check to strip the html tags from emailsCheckboxCheckboxesCheckedCheckoutChoice labelChoose a valueChoose an optionChoose how the swatch will be displayed.Choose how to determine the decimal separator for user inputsChoose how you want the sign of options prices to be displayed at the product page.Choose how you want the sign of options prices to be displayed in cart and checkout.Choose the image for the lightbox.Choose the image to replace the product image with.Choose the image to use in place of the checkbox when it is checked.Choose the image to use in place of the checkbox.Choose the image to use in place of the radio button when it is checked.Choose the image to use in place of the radio button.Choose the tax class for Fee price type on this element.Choose whether the field will be validated against the choosen method.Choose whether the option is enabled or not.Choose whether the user must fill out this field or not.Choose whether to change the product image.Choose whether to enable the lightbox on the thumbnail.Choose whether to hide the element label in the cart or not.Choose whether to hide the element label in the floating totals box or not.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the cart or not.Choose whether to hide the element value in the floating totals box or not.Choose whether to hide the element value in the order or not.Choose whether to hide the price or not.Choose whether to include tax for Fee price type on this element.Choose whether to redirect to a URL if the option is click.Choose whether to show or hide the attribute name.Choose which %s the date element will use on the backend calculations or leave blank for server timezone.Choose which decimal separator to display on currency pricesClearClear all additional Global formsClear cart buttonClick to toggleClone formCloning is forbidden.Close allClose button text replacementColorColor pickerColor swatchesComma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!Conditional LogicConsentConstant nameContentContent colorContent positionCopyCostCould not complete request!Could not update post in the databaseCountCurrent valueCustom Time formatCustom action:Custom codeCustom hookCustom priceCustom price (required)Custom styleCustom typesDEV - multiple filesDateDate fieldDate field and pickerDate formatDate pickerDate picker styleDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDeactivated, but the purchase code was not activated for some reason!DecemberDefaultDefault productDefault valueDefault value is 100DeleteDelete PermanentlyDelete all optionsDelete all options on the productDelete itemDescendingDescriptionDetermine by browser localDigitsDisableDisable Exclude from Global OptionsDisable Options on Order status changeDisable PNG convert securityDisable Shipping MethodsDisable error scrollingDisable lazy load imagesDisable monthsDisable sending the options upon saving the orderDisable weekdaysDisabledDisabled datesDisabled roles for this formDiscountDiscount string placementDiscount typeDisplayDisplay a pop-up linkDisplay a prefix label on product page.Display a suffix label on product page.Display asDisplay both signsDisplay only minus signDisplay the add to cart button on floating box.Displayed decimal separatorDivide price with measurementDividerDivider typeDocsDoneDouble click the radio button to remove its selected attribute.Download new version from CodeCanyonDownloading package from Envato market...DropdownDropdown PlaceholderDuplicate ElementDuplicate SectionDynamic Pricing & DiscountsEPO Control PanelEPO custom actionEcho a custom actionEditEdit ElementEdit Global FormEdit Options text replacementEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit tabEdit the %s translationElement Conditional LogicElement class nameElement container idElement idElementsEmpty cartEmpty cart textEnableEnable Exclude from Global OptionsEnable File managerEnable Final total box for all productsEnable alteration of pricing tableEnable checkbox and radio stylesEnable clear options buttonEnable conditional logic for showing or hiding this element.Enable conditional logic for showing or hiding this section.Enable discounts on extra optionsEnable extra options in shop and category viewEnable inline preview of the image that will be uploaded.Enable original final total displayEnable plugin for WooCommerce shortcodesEnable points display?Enable pop-up message on uploadsEnable shortcodes in options stringsEnable showing option prices in the OrderEnable this at your own risk since it is not possible to calculate option discounts on the Order page.Enable this if the product has a lot of options.Enable this if you are getting a 500 error when trying to complete the order in the checkout.Enable this if you want the options to have responsive display.Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable this to add any Fees to the unit priceEnable this to add the WooCommerce tax suffix on the totals boxEnable this to disable lazy loading images.Enable this to display the unit price when the totals box is visibleEnable this to hide the builder tab on the product edit screenEnable this to hide the normal tab on the product edit screenEnable this to hide the settings tab on the product edit screenEnable this to preload the image when using the lightbox feature.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.Enable to have the quantities of the associated products to be a multiple of the main product quantity.Enable to scroll the viewport to the product element.Enable to show the description of the associated product.Enable to show the image of the associated product.Enable to show the meta of the associated product.Enable to show the price of the associated product.Enable to show the title of the associated product.Enable translationsEnable upload success messageEnable validationEnabledEnabled datesEnabled roles for this formEnables a pop-up when uploads are made.Enables or disables extra styling for checkboxes and radio buttons.Enables or disables the clear cart buttonEnables or disables the display of options in the cart.Enables the display of a reset button for this attribute.Enabling this will add the option prices to the calculated booking cost.Enabling this will allow the use of shortcodes and HTML code in the options label and description text.Enabling this will apply the product discounts to the extra options as well.Enabling this will hide the URL of any uploaded file while in cart and checkout.Enabling this will hide the URL of any uploaded file while in order.Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-safe setting and we recommend to be active.Enabling this will load the plugin files to all WordPress pages. Use with caution.Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected disabled weekdays.Enabling this will multiply the options price by the block count.Enabling this will multiply the options price by the calculated area.Enabling this will multiply the options price by the person count.Enabling this will separate comma separated values for elements. This is mainly used for multiple checkbox choices.Enabling this will show the images of elements that have an image replacement.Enabling this will show the uploaded images in cart and checkout.End of the labelEnd yearEnter a CSS selector to override the default label where the discount string will be displayed.Enter a message to be used in the pop-up after clicking the add to cart button when there are upload fields.Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for default behaviour.Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.Enter a string to indicate the required state of a field.Enter a text to display after the price for this field or leave it blank for no text.Enter a text to display before the price for this field or leave it blank for no text.Enter a text to indicate that a field is required.Enter a text to replace the Additional options text when using the pop up setting on the cart.Enter a text to replace the Characters remaining text when using maximum characters on a text field or a textarea.Enter a text to replace the Close button text on the calendar.Enter a text to replace the Close button text when using the pop up setting on the cart.Enter a text to replace the Edit options text on the cart.Enter a text to replace the Free price label when product has extra options.Enter a text to replace the Reset options text when using custom variations.Enter a text to replace the Today button text on the calendar.Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart button  when there are upload fields.Enter a text to replace the add button text on associated products.Enter a text to replace the add text button for repeater fields.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the default pop up button text. This will override the global value.Enter a text to replace the empty cart button text.Enter a text to replace the message when trying to add a zero priced product to the cart.Enter a text to replace the next button text for slider.Enter a text to replace the previous button text for slider.Enter a value for the minimum characters the user must enter.Enter a value for the scroll offset when selecting a choice for the product element.Enter a value to be applied to the Quantity field automatically.Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).Enter a value to be applied to the field automatically.Enter a value to limit the maximum characters the user can enter.Enter an extra class name to add to this attribute elementEnter an extra class name to add to this elementEnter an extra class name to add to this sectionEnter an id for the container of the element.Enter ending year.Enter starting year.Enter the Fees total text or leave blank for default.Enter the Final total text or leave blank for default.Enter the Options total text or leave blank for default.Enter the Sign up fee text or leave blank for default.Enter the Subscription sign up fee text or leave blank for default.Enter the Unit price text or leave blank for default.Enter the Update cart text when you edit a product.Enter the discount amount.Enter the height of the displayed item or leave blank for auto height.Enter the maximum value.Enter the minimum value.Enter the number of values for the points display.Enter the placeholder for the dropdown.Enter the price for this field or leave it blank for no price.Enter the quantity step.Enter the sale price for this field or leave it blankto use the default price.Enter the step for the handle.Enter the time the following format: 8:00 amEnter the width of the displayed item or leave blank for auto width.Enter title hereEnvato Personal TokenEnvato rate limit exceeded! Please try again later.Epo BlackEpo WhiteErrorError connecting to Envato API. Please try again later.Error connecting to server!Error getting data from the server!Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error label placementError on unzipping packageError! Can't connect to filesystemError! Envato API errorEveryoneExact selectionExclude Product(s) from the formExclude ProductsExclude disabledExclude fromExcluded ProductsExpand allExpand and Collapse (start closed)Expand and Collapse (start opened)Export CSVExport formExtra Options placementExtra Options placement custom hookExtra Options placement hook priorityExtra Product OptionsExtra Product Options & Add-Ons for WooCommerceExtra Product Options FeesExtra Product Options Form BuilderExtra Product Options SettingsExtra feeFailed to write file to disk.FebruaryFees amountFees total textFile imported.File managerFile manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal totalFinal total boxFinal total textFixed amountFixed amount + optionsFlat Rates (Legacy)Floating Totals boxFloating Totals box visibilityForce Select OptionsForce Select options textForm draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %s.Form submitted.Form updated.Free Price text replacementFree!FridayFromFullsizeGeneralGeneral OptionsGeneral SettingsGlobalGlobal FormGlobal FormsGlobal variablesGlobally override the undo button for radio buttonsH1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide Builder mode on productsHide Normal mode on productsHide after scrolling the pageHide checkbox element average priceHide choice label when using the Show tooltip setting for radio buttons and checkboxesHide element label in cartHide element label in orderHide element price html when hide price setting is enabledHide element value in cartHide element value in floating totals boxHide element value in orderHide extra options in cartHide filtersHide override settings on productsHide priceHide upload file URL in cart and checkoutHide upload file URL in orderHorizontal ruleHourHow long the animation will take in millisecondsI agree that the license data will be transmitted to the license server.IDIcon tooltip leftIcon tooltip rightIf this is enabled the included product is not shipped with the main product.If this is enabled the included product will add its weight to the main product.If this is enabled the included product will maintain its own price.Image modeImage replacementImage swatchesImport CSVImporting csv...Importing dataInclude Fees on unit priceInclude additional Global formsInclude option pricing in product priceInclude tax for Fee price typeInclude tax string suffix on totals boxInclude the WooCommerce Price display suffix on totals boxIncrease WidthIndicates if the upload was successful with a message.Inherit product settingInherit product tax classInitializationInline modeInput decimal separatorInvalid CSV file!Invalid CSV file.Invalid action.Invalid data submitted!Invalid data!Invalid date entered!Invalid file extensionInvalid import method used.Invalid request!Invalid year date entered!Item name in quotes&ldquo;%s&rdquo;Items per row (Desktops and laptops)Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)Items per row (Smartphones)Items per row (Tablets landscape)Items per row (Tablets portrait)Items per row (iPhone 5)Items per row (iPhone 6 +)Items per row (iPhone 6)January JavaScript codeJavascript and CSS inclusion modeJulyJuneLabelLabel CSS selectorLabel OptionsLabel colorLabel positionLabel typeLanguageLanguage of this %sLayout modeLeave blank to use the original attribute label.Leave empty for default valueLeave it blank to calculate it automatically from the %s priceLeave it blank to calculate it automatically from the %s sale priceLeave this blank for the default label.LeftLeft of the fieldLeft of the labelLeft sideLegacy meta dataLetters onlyLetters or Space onlyLicenseLicense activated!License activated.License deactivated!Limit selectionLoading ...LocaleLogged in usersM j, Y @ H:iMaintain weightMake the total price not being multiplied by the product quantityMarchMass addMath formulaMax valueMaximum charactersMaximum characters for text-field and text-areasMaximum image heightMaximum image widthMaximum number of rows is {0}Maximum quantityMaximum selectable dateMaximum selectable timeMayMediumMenu OrderMeta data not correctly saved. Please save the product!Min valueMinimum charactersMinimum characters for text-field and text-areasMinimum number of rows is {0}Minimum quantityMinimum selectable dateMinimum selectable timeMinimum selectionMinuteMissing a temporary folder.MondayMonthMonth - Day - YearMonth . Day . YearMonth / Day / YearMore information about %sMove out of stock messageMove to TrashMulti-Select FieldMultiple minified filesMultiply cost by block countMultiply cost by person countMultiply options cost by areaMultiply prices inside select box choices with its quantity selectorN/ANameNew Global FormNew TemplateNo Global Form foundNo Global Form found in trashNo Template foundNo Template found in trashNo changeNo elements found!No file found.No file was uploaded.No negative priced products textNo saved variations found.No validationNo zero priced products textNo, but hide priceNoneNormalNormal (clear)Normal browser buttonNormal displayNovemberNumberNumber of pointsOctoberOnly enter pure CSS code without and style tagsOnly enter pure JavaScript code without and script tagsOpenOptionOption TemplatesOptions Subscription feeOptions amountOptions saved!Options total textOrder byOriginal product priceOther elementsOverride Final total boxOverride enabled roles for this productOverride global displayOverride product priceOverwrite existing elementsPaddingParent Global FormParent TemplatePercent of the original pricePercent of the original price + optionsPercent of the original price per wordPercent of the original price per word (no n-th char)PercentagePixels amount needed to scrollPlaceholderPlacementPlease enter a multiple of {0}.Please enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} character.Please enter at least {0} characters.Please enter no more than {0} character.Please enter no more than {0} characters.Please enter only digits.Please enter only letters or spaces.Please enter only letters, numbers or underscores.Please enter only letters.Please enter only unicode letters and numbers.Please enter only unicode letters, numbers or spaces.Please fill all fields before trying to activate.Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!Please save the form before importing options!Please save the product before importing options!Please select at least {0} choice.Please select at least {0} choices.Please select exactly {0} choice.Please select exactly {0} choices.Please select up to {0} choice.Please select up to {0} choices.Pop upPopulatePopulate optionsPopup section button text replacementPositionPost types to show the saved optionsPrefix labelPreload lightbox imagesPremium SupportPrevPrevent adding to the cart negative priced products.Prevent adding to the cart zero priced products.Prevent negative priced productsPrevent options from being sent to emailsPrevent zero priced productsPricePrice TypePrice per IntervalPrice per characterPrice per rowPrice per wordPrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:Priced individuallyPricingPriorityProductProduct Image replacementProduct element is not supported for components!Product element is not supported within another product element!Product element scroll offsetProduct image replacement modeProduct pageProduct quantityProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity Default valueQuantity max valueQuantity min valueQuantity selectorQuantity stepRadio button undo buttonRadio buttonsRadio buttons and image at end of the labelRadio buttons and image at start of the labelRandomRangeRange pickerRegularRelative URLRemoveRemove Free price labelRemove button text on associated productsRemove the image.Repeater Button LabelRepeater SettingsRepeater add textRepeater maximum limitRepeater minimum limitReplacement modeRequired state indicatorRequired state indicator positionReset Options text replacementReset option values after the product is added to the cartReset optionsReset settingsRetrieve image sizes for image replacementsRightRight of the fieldRight of the labelRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSaving... Please wait.Scroll to the product element upon selectionSearch Global FormSearch TemplateSearch for a category ...Search for a product ...Search for a product&hellip;SectionSection Conditional LogicSection background colorSection class nameSection idSection label background colorSection placementSection pop up button styleSection pop up button textSection styleSection subtitle background colorSection typeSelect BoxSelect a productSelect a style for the checkboxes and radio buttonsSelect a style for the selected border when using image replacements or swatches.Select a template ...Select an image for this term.Select boxSelect boxesSelect categoriesSelect custom file types the user will be allowed to upload separated by commas.Select fileSelect file textSelect file typesSelect how the products will be presented.Select how to display the element.Select how to display your fields in the cartSelect how to include JS and CSS filesSelect how to show the value of the range picker.Select modeSelect optionsSelect productsSelect templateSelect the Extra Options placement hook prioritySelect the Product(s) to apply the optionsSelect the Totals box placement hook prioritySelect the color to use.Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.Select the display type of this attribute.Select the image to replace the product image with.Select the number of pixels the page needs to scroll for the floating totals to become visible.Select the parameter which the products will be sorted by.Select the placement of the Required state indicatorSelect the placement of the discounted string compared to the label.Select the position of the timepicker.Select the product that will be pre-selected.Select the roles that will have access to the extra options.Select the roles that will not have access to the extra options.Select the size of the timepicker.Select the sorting order of the products.Select the theme for the datepicker.Select the theme for the timepicker.Select this section's display style.Select this section's display type.Select this section's pop up button style.Select where this section will appear compared to local Options.Select where you want the Totals box to appear.Select where you want the extra options to appear.Select which file types the user will be allowed to upload.Self modeSeptemberSet the image mode that will be used for various image related functionality.Set the max width of the tooltip that appears on the elements.Set the maximum height of the images that appear on cart.Set the maximum number of rows a user can add for the repeater field.Set the minimum number of rows a user can add for the repeater field.Set the placement for the validation error notification labelSet to FeeSettingsSettings:ShadowShipped individuallyShop orderShowShow Final TotalShow Options TotalShow Unit price on totals boxShow attribute nameShow choice description inline.Show descriptionShow filtersShow imageShow image and descriptionShow image and labelShow image replacement in cart and checkoutShow image, label and descriptionShow labelShow label and descriptionShow metaShow priceShow prices inside select box choicesShow prices inside select box choices even if the prices are hiddenShow quantity selector only for elements with a valueShow reset buttonShow responsive valuesShow the Final total box even when the product has no extra optionsShow titleShow tooltipShow uploaded image in cart and checkoutShow using action hooksShow value onShow when the total is greater than zeroSign up feeSign up fee textSingle ProductSingle minified fileSizeSlider (wizard)Slider next textSlider previous textSmallSomething went wrong with WordPress.Sorry, this file type is not permitted for security reasons.SquareSquare 2StandardStart Animation delayStart adding elementsStart of the labelStart yearStep * priceStep valueStringsStrip html from emailsStyleStyle variationsStyled buttonSubscription sign up feeSubscription sign up fee textSubtitleSubtitle colorSubtitle positionSuffix labelSundaySwatch positionSync associated product quantity with main product quantitySystem styleTable nameTabsTaxTax class for Fee price typeTemplateTextText AreaText FieldText after PriceText before PriceText lengthText linkText swatchesThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The delay until the animation starts in millisecondsThe description will appear under the title.The form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The installed version isThe item you are trying to move to the Trash no longer exists.The item you are trying to restore from the Trash no longer exists.The number of options the user has selectedThe php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. Please ask your hosting provider to enable this function.The purchase code is already activated on another domain!The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity for "%s" must be greater than 0 to be added to the cart.The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d.The quantity of this elementThe selected form does not contain any sectionsThe total quantity of this elementThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.The value length of this elementThe value of this elementThemeThere are no saved variations yet.There was an error saving the settings.Thin lineThis allows you to disable all selected months.This allows you to disable all selected weekdays.This allows you to generate points along the range picker.This changes the add to cart button on shop and archive pages to display select options when the product has extra product options. Enabling this will remove the ajax functionality.This controls how your fields are displayed on the front-end. If you choose "Show using action hooks" you have to manually write the code to your theme or plugin to display the fields and the placement settings below will not work. If you use the Composite Products extension you must leave this setting to "Normal" otherwise the extra options cannot be displayed on the composite product bundles. See more at the documentation.This determines the floating totals box visibility.This elementThis field is required textThis field is required.This is a translation ofThis is used to change the product image.This is where you can add new global options to your store.This item has already been deleted.This will add a button to clear the selected option.This will count as an empty value in case the element is required.This will divide the original price with the needed measurement.This will enable a floating box to display your totals box.This will exclude any global forms assigned to this product except those defined in the previous setting.This will globally override the product price with the price from the options if the total options price is greater then zero.This will hide the average price display on the cart for checkboxes.This will make this element repeatable based on the product quantity.This will make this element repeatable.This will override the display method only for this product.This will override the product price with the price from the options if the total options price is greater then zero.This will override the time format above.This will override the totals box display only for this product.This will override which roles can see the options for this product.This will revert the option values to the default ones after adding the product to the cartThis will show a quantity selector for this option.ThumbnailsThumbnails multipleThursdayTimeTime formatTime picker styleTitleTitle optionsTitle:ToTo find out how to access your purchase code you can %sTo receive automatic updates license activation is required.To translate the strings for the local options please use WPML interface.TodayTooltipTooltip and Left sideTooltip and Right sideTopTop leftTop of screenTop rightTotalTotal price as Unit PriceTotals box placementTotals box placement custom hookTotals box placement hook priorityTranslationsTrying to activate from an invalid IP address!Trying to activate from an invalid domain!Trying to activate from outside the plugin interface is not allowed!Trying to activate with an invalid purchase code for your token!Trying to upload files larger than %s is not allowed!TuesdayTurn off persistent cartType:Undiscounted product priceUndoUnique meta valuesUnit priceUnit price textUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUpdate cart textUploadUpload button styleUpload element inline Image previewUpload folderUpload managerUpload successfulUploading filesUploading files textUploading message textUrlUse URL replacementsUse WooCommerce valueUse allowed file types from WordPressUse custom imageUse field valueUse global settingUse image lightboxUse internal variation priceUse options cacheUse options caching for boosting performance. Disable if you have options that share the same unique ID.Use plus and minus signs on option pricesUse plus and minus signs on prices in cart and checkoutUse progressive display on optionsUse regular priceUse setting on each productUse the "From" string on displayed product pricesUse the image replacementsUse this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.Use translated values when possible on admin OrderUsernameUsing booking settingValidate asVariation #%1$s of %2$sVariation optionsVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView Global FormView TemplateView cartView detailsVisble after scrolling the pageVisit premium customer supportVisualWednesdayWhether to include specific products or categories.WidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce Measurement CalculatorWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYear - Day - MonthYear - Month - DayYear . Day . MonthYear . Month . DayYear / Day / MonthYear / Month / DayYesYes, but show priceYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item to the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can generate an Envato Personal Token by %sYou can only select up to %1$s choice for %2$s.You can only select up to %1$s choices for %2$s.You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot add negative priced products to the cart.You cannot add zero priced products to the cart.You cannot move this item to the Trash. %s is currently editing.You cannot select that date!You have already activated that purchase code on another domain!You have already activated your purchase code!You must enter at least %1$s characters for "%2$s".You must select at least %1$s choices for %2$s.You must select exactly %1$s choices for %2$s.Your Envato username.Your files are being uploadedYour settings have been reset.Your settings have been saved.and aautocharacters remainingclick this linkclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thangreater than or equal toh:mh:m:sh:m:ssh:mmh:mm:sh:mm:ssherehh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssisis emptyis notis not emptyjQuery selector for main product imagelabelless thanless than or equal toor register the plugin to receive automatic updates.ppost type general nameGlobal Formspost type general nameOption Templatespost type general nameTM Extra Product Optionsspanstarts withtimezoneProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:54+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: zh_CN
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=1; plural=0;
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
“%s”是一个必需的字段。%1$s &ndash; %2$s由于已对%1$s进行了修改,因此已将其从购物车中删除。您可以将其添加回购物车%2$s。%1$s重要提示: %2$s不支持您的WooCommerce额外结帐选项版本。请更新到最新版本。%s 不存在。%s不是一个有效的图像文件!%s 及其所有相关产品一起删除!“%1$s”(实例 ID:%2$s)(复制)(Legacy)(无标题)(最大文件大小%s)(无标题)从今天开始的日期天数。所有类别所有产品字段显示在上方绝对网址折叠操作激活许可证添加添加常量添加额外选项添加全局表单添加新的全局表单添加新模板添加模板在相关产品上添加按钮文字添加类别以包括其所相关产品。添加元素在新节中添加元素添加项目将期权成本添加到预订显示价格添加部分添加分隔符分别添加产品。添加要显示的模板。添加到购物车添加到购物车按钮添加到购物车按钮在浮动合计框中添加翻译 %s附加选项文本替换附加选项高级显示高级选项之后本地选项之后加入购物车 按钮之后购物车表单后产品之后产品图片后产品简述后元素之后所有允许的文件类型字母数字字母数字Unicode字母数字Unicode或空格改变生成的产品结构化数据更改生成的产品结构化数据。 如果选项使用条件逻辑,这可能会产生错误的结果!总是显示始终在购物车上为元素使用唯一值始终可见发生了错误!动画动画延迟任意添加新元素应用于四月你确定你想要复制这个项目吗?你确定要删除这个文件吗?你确定要删除这个文件夹和它的所有内容吗?你确定要删除这个项目吗?你确定你想要删除这个选项吗?是否确实要重置设置?升序将价格附加到订单上,使其独立于产品数量。将上传文件附加到电子邮件属性标签属性元素类名属性:属性失踪。请删除这个额外的选项:八月如果为零自动隐藏的价格等待产品图片基本原价类型根据基本价格之前本地选项之前加入购物车 按钮之前在添加额外选项之前,在"属性"选项卡上添加和保存某些属性。在添加Extra Product Options之前,添加并保存一些属性在<ph id="mtc_1" equiv-text="base64:Jmx0O3N0cm9uZyZndDs="/>Attributes<ph id="mtc_2" equiv-text="base64:Jmx0Oy9zdHJvbmcmZ3Q7"/> tab.购物车表单之前产品之前产品总结前在元素之前字段显示在下方绑定中继器与产品数量底部左下角屏幕底部右下角盒子生成器按钮AltCDNCSS 设置CSS代码日历关闭按钮文本替换日历今日按钮文本替换取消无法对这个元素或选项应用规则,因为在其他选项没有任何值配置的元素,或者没有找到其他的模块选项。无法停用。购买代码对您保存的许可证密钥无效!购物车购物车栏位显示类别居中改变原来的产品价格改变变动的价格更改产品图像更改此设置只会影响将来的上传。剩余字符文本Cheatin&#8217; uh?检查空产品价格选中“仅显示具有值的元素的数量选择器”。如果您使用Google商家中心,请选中此项。当您启用隐藏其价格设置时,它将隐藏元素的价格html。只有在结账时收到服务器错误时才检查此项。当产品有额外的价格时,改变产品的价格。检查此以禁用显示描述为图利皮普,并显示其内联。选中此选项可强制元素为全宽而不是自动。如果价格是0,就在全局范围内隐藏。选中此项以在全局范围内将价格削减为零。这也将应用于原生 WooCommerce 价格。选中此选项可将插件设置为空时将产品价格设为零。包括产品价格的期权定价。选中此选项可将选择框选项的价格乘以其数量选择器(如果有)。选中此项仅当至少有一个选项被填充时才显示“添加到购物车”按钮。如果价格类型是固定的,即使元素隐藏价格,也请选中此选项以显示选择框选项的价格。如果价格类型是固定的,则选中此项可显示“选择框”选项的价格。检查以将上传文件附加到电子邮件.选中以禁止将选项发送到电子邮件。选中此项可禁用滚动到出现错误的元素选中此选项可禁用图像上传到png的转换。检查以启用旧元数据功能。在商店页面和类别视图中显示额外的选项。这个设置是与主题相关的,一些方面可能不能如预期的那样工作。选中以显示未折扣的最终总计选中此选项可将选项价格包含在定价表中。选中以启用生成器元素的验证功能当价格变化时,覆盖原始的产品价格。当价格变化时,覆盖变化价格。当产品有额外选项是,删除免费标签选中此项可将具有多个值的项拆分为唯一行。检查以去除电子邮件中的html标签复选框复选框检查结帐选择标签选择值选择一个选项选择色板的显示方式。选择如何确定用户输入的小数分隔符选择您希望如何在产品页面上显示选项价格的标志。选择您希望如何在购物车和结帐中显示期权价格的标志。为lightbox选择图像。选择图像以替换产品图像。选中复选框时,请选择要用于替换复选框的图像。选择要代替复选框使用的图像。选中单选按钮时,请选择要用来代替单选按钮的图像.选择要使用的图像代替单选按钮。在此元素上选择费用类型的税级。选择是否根据所选方法验证该字段。选择是否启用了该选项。选择用户是否必须填写这一字段。选择是否改变产品图片。选择是否启用缩略图上的lightbox。选择是否在购物车中隐藏元素标签。选择是否在浮动总计框中隐藏元素标签。选择是否在订单中隐藏元素标签。选择是否隐藏购物车中的元素值。选择是否在浮动总计框中隐藏元素值。选择是否在订单中隐藏元素值。选择是否隐藏价格。选择是否在该元素上包括税费价格类型。如果选项为“单击”,请选择是否重定向到URL。选择是否显示或隐藏属性名。选择日期元素将在后端计算中使用哪种%s,或为服务器时区留空。选择显示在货币价格上的小数点分隔符清除清除所有额外的全局表单清空购物车按钮点击切换复制表单禁止克隆。关闭所有关闭按钮的文本替换颜色颜色选择器设置颜色样本的半径/大小逗号分隔日期,根据您选择的日期格式。(一天两位数,一个月两位数,一年四位数)逗号分隔日期,根据您选择的日期格式。(一天两位数,一个月两位数,一年四位数)。请注意,这将覆盖任何其他设置!条件逻辑同意常数名称内容内容颜色内容位置复制费用无法完成请求!无法在数据库中更新post计数当前值自定义时间格式自定义操作:自定义代码自定义勾子自定义价格自定义价格(必需)自定义样式自定义类型发展多个文件日期日期字段日期字段和选择器日期格式日期选择器日期选择风格日期选择器日期选择器的位置日期选择器尺寸日期选择器主题天日-月-年日.月.年日/月/年停用许可证已停用,但由于某些原因未激活购买代码!十二月默认默认产品默认值默认值为 100删除永久删除删除所有选项删除产品上的所有选项删除项目降序描述探测浏览器的本地化设置位数禁用禁用从全局选项中排除禁用订单状态更改选项禁用PNG转换安全性禁用送货方式禁用错误滚动禁用延迟加载图片禁用月份保存订单后禁用发送选项禁用工作日禁用禁用日期为此表单的禁用角色折扣折扣字符串放置折扣类型显示显示一个弹出链接在产品详情页显示一个前缀标签.在产品详情页显示一个后缀标签.显示为显示两个标志仅显示减号显示添加到购物车按钮在浮动合计框。显示十进制分隔符将价格与测量分开分隔线分隔线类型文档完成双击单选按钮以删除它所选的属性。从 CodeCanyon 下载新版本从Envato市场下载软件包...下拉下拉占位符复制元素复制章节动态折扣EPO 控制面板EPO 自定义action回显自定义操作编辑编辑元素编辑全局表单编辑选项的文本替换编辑部分编辑模板编辑项目编辑选项编辑价格编辑设置编辑 标签编辑 %s 翻译元素条件逻辑元素类名称元素容器id元素ID元素清空购物车空的购物车文本启用启用从全局选项排除启用文件管理器为所有产品启用最终合计框启用定价表的更改启用复选框和单选样式启用明确选项按钮启用条件逻辑来显示或隐藏该元素。启用条件逻辑来显示或隐藏这一项。启用额外的选项优惠在商店和类别视图中启用额外选项启用要上载的图像的内联预览。启用原始最终总显示支持用于WooCommerce短码的插件启用点显示?在上传时启用弹出消息在选项字符串中启用短代码启用在订单中显示选项价格启用此功能需要您自担风险,因为无法在“订购”页面上计算选项折扣。如果产品有很多选项,请启用此选项。如果您在在结帐中尝试完成订单时出现 500 错误,请启用此选项。如果您希望选项具有响应式显示,请启用此选项。启用此设置可在产品页面上显示最终总计,从而允许客户查看其订单的总成本,或禁用它以简化产品页面。启用此选项可将任何费用添加到单价中启用此选项可在总计框中添加WooCommerce税后缀启用此选项可禁用延迟加载图像。启用此选项可在“总计”框可见时显示单价启用此选项可隐藏产品编辑屏幕上的构建器选项卡启用此选项可隐藏产品编辑屏幕上的常规选项卡启用此选项可隐藏产品编辑屏幕上的设置选项卡启用此选项可在使用灯箱功能时预加载图像。能够显示全面的产品总数,为客户提供总体成本的清晰概览。启用此选项可专门显示所选产品选项的总计。使关联产品的数量为主要产品数量的倍数。启用以将视口滚动到产品元素。启用以显示关联产品的描述。启用以显示关联产品的图像。启用以显示关联产品的meta。启用以显示关联产品的价格。启用以显示关联产品的标题。启用翻译启用上传成功消息启用验证启用启用日期此表单的启用角色在上传时启用弹出窗口。为复选框和单选按钮启用或禁用额外的样式。启用或禁用清除购物车按钮启用或禁用购物车中选项的显示。允许为该属性显示复位按钮。启用此功能将添加到计算的预订成本中的期权价格。启用此功能将允许在选项标签和描述文本中使用短代码和 HTML 代码。启用此功能也会将产品折扣应用于额外选项。启用此选项将在购物车和结帐时隐藏所有上载文件的URL。启用此功能将按顺序隐藏任何上传文件的URL。启用此选项将隐藏产品页面上的选项,直到初始化JavaScript。 这是一个故障安全设置,我们建议您保持活动状态。启用这一功能将把插件文件加载到所有WordPress页面。谨慎使用。启用此功能将使“最小”和“最大”可选日期不计入所选的禁用工作日。启用此选项将使选项价格乘以块计数。启用此选项将使选项价格乘以计算区域。启用此功能会将选项价格乘以人数。启用此选项将分隔逗号分隔的元素值。 这主要用于多个复选框选择。启用此选项将显示具有图像替换的元素的图像。启用此选项将在购物车和结帐中显示上传的图像。结束标签结束年份输入CSS选择器以覆盖将显示折扣字符串的默认标签。在有上传字段时单击 添加到购物车 按钮后,输入要在弹出框中使用的消息。输入一个大于0的数字,让用户至少选择复选框的数量,或者为默认行为留空。输入一个大于0的数字,让用户选择复选框的确切数量,或者为默认行为留空。输入大于0的数字以限制复选框的选择,或者默认行为留空。输入一个字符串来表示字段的所需状态。在此字段的价格之后输入要显示的文本,或将其留空无文本。请在此字段的价格前输入要显示的文本,或将其留空以不显示文本。输入文本以指示需要字段。当在购物车中使用弹出的设置时,输入一个文本来替换额外的选项文本。当在文本字段或文本区域中使用最大字符时,输入文本来替换字符剩余的文本。输入文本来替换日历上的关闭按钮文本。当在购物车中使用弹出的设置时,输入文本来替换关闭按钮文本。输入文本以替换购物车中的编辑选项文本。当产品有额外的选项时,输入一个文本来替换免费价格标签。当使用自定义变量时,输入一个文本来替换重置选项文本。输入文本以替换日历上的“今天”按钮文本。在有上传字段时单击 添加到购物车 按钮后,输入一个文本来替换弹出框中使用的上传文件文本。输入文本替换关联产品上的添加按钮文本。输入文本以替换中继器字段的添加文本按钮。在使用Force select选项时,输入一个文本以替换add to cart按钮文本。输入文本以替换默认弹出按钮文本。这将覆盖全局值。输入一个文本来替换空的购物车按钮文本。在尝试将零价格产品添加到其他购物车时,请输入文本替换消息。输入一个文本来替换滑块的下一个按钮文本。输入一个文本,以替换先前的按钮文本。用户必须输入的最小字符数。输入滚动偏移值,然后选择产品元素的选项。输入要自动应用到数量字段的值。根据选定的日期格式,输入要自动应用于字段的值。(两位数表示日,两位数表示月,四位数表示年)。输入要自动应用于该字段的值。请输入一个数字来限制用户的最大可输入字符数。输入一个额外的类名,以添加到这个属性输入额外的类名称以添加到此元素输入一个额外的类名,以添加到该项请输入元素容器id。输入终止年。输入起始年。输入选项合计文本,或默认为空。输入最后的合计文本,或默认为空。输入选项合计文本,或默认为空。输入订阅的费用文本或留空为默认。输入订阅注册费文本或默认为空。输入单价格文本或默认为空白。编辑产品时输入更新购物车文本。输入折扣金额。输入显示项的高度,或留空为自动高度。输入的最大值。输入最小值。请输入要显示多少个值的点。输入下拉的占位符。请输入该字段的价格,否则将空无价格。输入数量级。输入此字段的售价,或使用默认价格保留该字段。请输入次此处理器的步进值.输入以下格式: 8:00 am输入显示项的宽度,或留空为自动宽度。在这里输入标题Envato个人代币超过Envato速率限制!请稍后再试。Epo黑色白错误连接到Envato API时出错。 请稍后再试。连接服务器错误!从服务器获取数据时出错!删除时出错。移至垃圾桶时发生错误。从垃圾箱恢复时出错。错误标签放置解压缩包时出错错误! 无法连接到文件系统错误!Envato API错误所有人准确的选择从表单中排除产品不包括的商品排除这些排除排除产品展开全部展开和折叠(开始关闭)展开和折叠(开始打开)导出CSV导出表单额外选项的位置额外选项位置自定义勾子额外选项位置勾子优先值额外的产品选项Extra Product Options & Add-Ons for WooCommerce额外的产品选择费用额外的产品选项额外的产品选项设置额外费用无法将文件写入磁盘。二月费用金额费用总计文字文件导入。文件管理在您的服务器上不支持文件管理器。文件由于扩展名限制而上传停止。文件名过滤总计总计框总计文本固定金额固定金额和选项统一费率(旧版)浮动总计框浮动合计框可见性强制选择强制选择选项的文本表格草稿已更新。表单已发布。表单已从 %s 还原为修订版表单已保存。预定表格:%s.表单已提交。表格更新。免费价格文本替换免费!星期五从全尺寸常规常规选项常规设置全局全局表单全局表单全局变量全局覆盖单选按钮的撤消按钮H1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:毫米HH:mm:sHH:mm:ss标题颜色页眉位置页眉标题页眉类型标题高度隐藏在产品上隐藏构建模式在产品上隐藏标准模式滚动页面后隐藏隐藏复选框元素的平均价格使用单选按钮和复选框的显示工具提示设置时隐藏选项标签隐藏元素标签在购物车在订单中隐藏元素标签启用隐藏价格设置时隐藏元素价格html在购物车中隐藏元素值在“浮动总计”框中隐藏元素值隐藏元素值在订单中在购物车中隐藏其他选项隐藏过滤器在首页隐藏产品滑块部分隐藏价格隐藏购物车中的上传文件网址并签出按顺序隐藏上传文件URL水平规则小时动画需要多长时间(以毫秒为单位)我同意将许可证数据传输到许可证服务器。ID提示图标在左侧提示图标在右侧如果启用此功能,则包含的产品不会随主产品一起提供。如果启用此功能,随附的产品将为其重量添加到主产品。如果启用此功能,包含的产品将维持自己的价格。图片模式图像替换图像样本导入CSV导入csv……导入数据包括单价中的费用包括其他全球形式包含期权定价的产品价格含税价格类型包含税字符在合计框在汇总框中包括WooCommerce价格显示后缀增加宽度表示上传是否成功的消息。继承产品设置继承产品税类初始化内联模式输入十进制分隔符无效的CSV文件!无效的CSV文件。无效的操作。无效的数据提交!无效数据!日期输入错误!无效的文件扩展名使用的导入方法无效。无效的请求!输入了无效的年份!&ldquo;%s&rdquo;每行项目(台式机和笔记本电脑)每行项目(三星Galaxy平板電腦橫向)每行项目 (Samnsung Galaxy)每行项目(智能手机)每行项目(平板电脑景观)每行项目(平板电脑的肖像)每行项目(iPhone 5)每行项目(iPhone 6+)每行项目(iPhone 6)一月 JavaScript代码Javascript和CSS包含模式七月六月标签标签 CSS 选择器标签选项标签颜色标签位置标签类型语言此 %s 语言布局模式保留空白,使用原始属性标签。留空则使用默认值将其留空,以便从 %s 价格自动计算将其留空,以便从 %s 销售价格自动计算留空为默认标签。左侧字段显示在左侧标签左侧左边旧版元数据仅字母仅字母或空格许可证许可证激活!许可证已激活。许可证失效!限制选择载入中...本地化登录用户M j, Y @ H:i保持重量使总价格不乘以产品数量三月批量添加数学公式最大值最大字符数文本字段和文本区域的最大字符最大图像高度最大图像宽度最大行数最大数量最多可选择的日期最大可选择的时间五月中菜单顺序元数据未正确保存。请保存产品!最小值最小字符数文本字段和文本区域的最小字符最小行数为{0}最小数量最低可选择的日期最小可选择的时间最低的选择分钟缺少临时文件夹。星期一月月-日-年月.日.年月/日/年关于%s的更多信息脱销信息移到回收站选择多个框中多个压缩文件按块数乘以成本按人数计算成本按区域乘以选项成本将选择框选项内的价格与其数量选择器相乘N/A名称新的全局表单新模板暂无全局表单回收站中没有全局表单未找到模板回收站中未找到模版不做变更未找到任何元素!未找到文件。没有上传文件。无负价格产品文本未发现保存的变化。没有验证无零价格产品文本不,但隐藏价格无正常标准(清晰)标准的浏览器按钮常规显示十一月数量积分数量十月只输入没有和样式标签的纯CSS代码仅输入不带脚本标签的纯JavaScript代码打开选项选项模板选择订阅费用选项金额选项已保存!选项合计文本排序改变原来的产品价格其他元素覆盖最后合计框这个产品启用角色覆盖覆盖全局显示覆盖产品价格覆盖现有的元素内边距父级全局表单父級模板原价的百分比原价的百分比加上选项每个单词原始价格的百分比每个单词原始价格的百分比(没有第n个字符)百分比滚动所需的像素量占位符放置请输入{0}的倍数。请输入有效网址。请输入有效的电子邮件地址。请输入有效的号码。请输入大于或等于{0}的值。请输入小于或等于{0}的值。请输入至少{0}个字符.请输入至少{0}个字符。请输入不超过{0}字符。请输入不超过{0}个字符。请只输入数字。请只输入字母或空格。请只输入字母、数字或下划线。请只输入字母。请只输入统一码字母和数字。请只输入统一码字母、数字或空格。请在尝试激活前填写所有字段。请注意,如果订单上的选项发生变化或被删除,您将通过启用此功能获得错误的结果!请在导入选项之前保存表格!请在导入选项之前保存产品!请至少选择{0}选项。至少应选择 {0}个选项。请准确选择{0}选项。请选择 {0}个选项。请选择最多{0}选择。最多可选择 {0}个选项。弹出填充填充选项弹出部分按钮文本替换位置文章类型显示保存的选项前缀标签预加载灯箱图片高级支持上一页防止添加购物车负价产品。防止增加购物车零价产品。防止负定价产品阻止将选项发送到电子邮件防止零价产品价格价格类型每间隔价格每个角色的价格每行的价格每字价格每个字的价格(没有第n个字符)%1$s &ndash; %2$s%1$s&ndash;%2$s价格类型价格:单独定价价格优先级产品产品图片替换组件不支持产品元素!另一个产品元素不支持产品元素!产品元素滚动偏移产品形象替换模式产品页面产品数量产品产品和类别发布购买代码数量数量数量默认值数量最大值数量最小值数量选择器步进单选按钮取消按钮单选按钮标签上的单选按钮和图像标签开始时的单选按钮和图像随机范围范围选择常规相对网址删除删除免费的价格标签删除相关产品的按钮文本删除图片。中继器按钮标签中继器设置重复器添加文本中继器最大限制中继器最小限制更换模式必须状态指示器必须状态指示器位置重置选项文本替换在将产品添加到购物车后重新设置选项值重置选项重新设置检索图像替换的图像大小右侧字段显示在右侧标签右侧右边角色圆形圆形 2运行更新程序SKU:促销销售价格星期六保存保存更改保存……请稍等。选择后滚动到产品元素搜索全局表单搜索模板在分类中搜索...搜索产品...搜索产品&hellip;部分选项条件逻辑背景颜色章节类名称部分ID标签背景颜色选项定位部分弹出按钮样式部分弹出按钮文本选项风格副标题背景颜色章节类型类型选择框选择一个产品选中复选框和单选按钮的样式使用图像替换或样本时为选定边框选择样式。选择一个模板...为这一项选择一个图像。选择框选择框选择类别选择允许用户以逗号分隔的自定义文件类型。选择文件选择文件文本选择文件类型选择产品的展示方式。选择如何显示元素。选择如何在购物车中显示您的字段选择如何包括 JS 和 CSS 文件选择如何显示范围选择器的值。选择模式选择选项选择产品选择模板选择附加选项放置挂钩优先级选择产品以应用选项选择总计框放置挂钩优先级选择要使用的颜色。选择折扣类型。折扣适用于最终产品价格。如果产品具有更多选项,则折扣适用于将选项添加到产品价格后的金额。选择该属性的显示类型。选择图像以替换产品图像。选择页面需要滚动的像素数,以便显示浮动总数。选择将对产品进行排序的参数。选择所需状态指示器的位置选择折扣字符串相对于标签的位置。请选择时间选择器的位置。选择将被预选的产品。选择能够访问额外选项的角色。选择无法访问额外选项的角色。请选择时间选择器的大小。选择产品的排序顺序。选择日期选择器的主题。请选择时间选择器的样式。选择此项的显示风格。选择此项的显示类型。选择此部分的弹出按钮样式。选择与本地选项相比较的区域。选择你想要合计框出现在哪里。选择你想要额外选项出现在哪里。选择允许用户上传的文件类型。自动模式九月设置将用于各种图像相关功能的图像模式。设置出现在元素上的工具提示的最大宽度。设置显示在购物车中的图像的最大高度。设置用户可以为中继器字段添加的最大行数。设置用户可以为中继器字段添加的最小行数。设置验证错误通知标签的位置设置为收费设置设置:阴影单独发货店铺订单显示显示最终总数显示选项合计在总计框中显示单价显示属性名称内联显示选择描述。显示描述显示过滤器显示图像显示图片和描述显示图片和标签在购物车中显示图像替换和结帐显示图像,标签和描述显示标签显示标签和描述显示元素数据显示价格在选择框内显示价格即使价格被隐藏,也会在选择框内显示价格仅显示具有值的元素的数量选择器显示重置按钮显示响应值即使产品没有额外选项,也显示最终总计框显示标题显示工具条在购物车和结帐中显示上传的图片使用action hook 显示显示值在当总数大于零时显示注册费用注册费用单品单个缩小的文件大小滑块(向导)下一个文本滑块上一个文本滑块小WordPress出了问题。抱歉,出于安全原因,不允许使用此文件类型.方形方形 2标准开始动画延迟开始添加元素开始标签开始年份阶梯*价格步进值字符串尝试过滤email中的html标签样式风格变化按钮的风格订阅注册费订阅注册费用文本副标题副标题颜色字幕位置后缀标签星期日色板位置将相关产品数量与主要产品数量同步系统风格表格名称标签税按收费价格类型征税模板文本文本区域文本字段价格后面显示的文本价格之前的文本文本长度文本链接文本色板该用户名对该商品的购买代码无效。请确保输入正确的用户名(区分大小写)。动画开始之前的延迟(以毫秒为单位)此说明将显示在标题下。表单被应用于所有产品表单没有被应用到任何产品上您选择的表单将与产品已有的表单一起显示。当前版本你想要搬到垃圾的物品已经不复存在了。你试图从垃圾中恢复的物品已经不复存在了。用户选择的选项数导入和导出CSV文件需要php函数mb_detect_encoding和mb_convert_encoding。请咨询您的托管提供商启用此功能。购买代码已在另一个域上激活!购买代码已经激活!购买代码已激活!请购买有效的许可证!"%s"的数量必须大于 0 才能添加到购物车中。“%1$s”的数量不能高于%2$d。“ %1$s”的数量不能小于%2$d。“%1$s”的数量必须以%2$d的倍数输入。此元素的数量所选表单不包含任何部分此元素的总量上载的文件超出了HTML表单中指定的MAX_FILE_SIZE指令。上传的文件超过了php.ini中的upload_max_filesize指令限制。上传的文件仅部分上传。该元素的值长度此元素的值主题目前还没有保存的变量。保存设置时出错。细线允许您禁用所有选定的月份。这允许您禁用所有选择的工作日。这允许您沿着范围选择器生成点。当产品有额外的产品选项时,这将更改“购物车”和“存档”页面上的“添加到购物车”按钮以显示“选择”选项。启用此选项将删除ajax功能。这可以控制前端显示字段的显示方式。如果您选择"使用操作挂钩显示",则必须手动将代码写入主题或插件以显示字段,而下面的位置设置将不起作用。如果您使用复合产品扩展,您必须将此设置保留为"正常",否则复合产品包上无法显示额外的选项。有关文档,请参阅更多。这确定了浮动总计框的可见性。当前元素这个字段是必需的文本这是必填栏。这是翻译后的值这是用来改变产品形象的。在这里,您可以向商店添加新的全局选项。这个条目已经被删除了。这将添加一个按钮来清除所选选项。如果元素是必需的,则此值将计为空值。这会将原始价格除以所需的度量。将启用一个浮动框显示合计框。这将排除分配给该产品的任何全局表单,除了前面设置的那些。如果总期权价格大于零,这将全局覆盖产品价格和期权价格。这将隐藏购物车上复选框的平均价格显示。这将使此元素可根据产品数量重复。这将使此元素可重复。这将仅覆盖该产品的显示方法。如果总期权价格大于零,这将会覆盖产品价格。这将覆盖上述时间格式。这将覆盖仅用于该产品的总数框显示。这将覆盖哪些角色可以看到该产品的选项。这将在将产品添加到购物车后将选项值还原为默认值这个选项将显示一个数量选择器。缩略图多个缩略图星期四时间时间格式时间选择器样式标题标题选项标题:到要了解如何访问您的购买代码,您可以 %s要接收自动更新,需要激活许可证。要为本地选项翻译字符串,请使用WPML接口。今天提示工具提示在左边工具提示在右边顶部左上角屏幕的顶部右上总计作为单价的总价合计框位置合计框位置自定义勾子合计框位置勾子优先值翻译试图从无效的IP地址激活!尝试从无效域激活!尝试从插件界面外部激活是不允许的!尝试使用无效的代码购买代码激活!试图上传大于%s的文件是不允许的!星期二关闭持久性购物车类型:未打折产品价格撤销唯一元值单价单价未知的文章类型。反序列化此类的实例是被禁止的。更新更新购物车更新购物车上传上传按钮样式上传元素内联图像预览上传文件夹上传管理上传成功上传文件上传文件文本上传消息文本网址使用链接替换使用 WooCommerce 值使用 WordPress 中允许的文件类型使用自定义图片使用字段值使用全局设置使用lightbox图像使用内部变动价格使用选项缓存使用缓存选项以提高性能。如果您有共享相同唯一 ID 的选项,则禁用。选项价格使用加号和减号在购物车和结账时使用加号和减号在选项上使用渐进式显示使用正常价格在每个产品上使用设置在显示的产品价格上使用“From”字符串使用图像替换使用此字段来进行网格显示。输入网格的每一行有多少项,或留空以正常显示。。如果可能,尝试在后台订单中显示翻译后的值用户名使用预订设置验证为%2$s 的变量 #%1$s变异的选择变化:变化各种查看其他产品选项文档查看其他产品选项设置查看全局表单查看模板查看购物车查看详情在滚动页面之后可见访问高级客户支持视觉星期三是否包括特定产品或类别。宽度WooCommerce预订Woomerce轻松预订Woomerce测量计算器WooCommerce设置WooCommerce订阅WooCommerce未启用!年份 - 日 - 月年 - 月 - 日年. 日. 月年. 月.日年 /日/月年 /月 /日是是的,但是显示价格您不能删除此项目。您不能编辑此项目。您无权将此项目移至垃圾桶。你试图编辑一个不存在的条目。也许是删除吗?您可以通过以下方式生成Envato个人代币%s您最多只能为%2$s选择%1$s个选项。您最多只能为%2$s选择%1$s个选项。你可以不编辑这一项,因为它在垃圾桶里。请恢复它,再试一次。你不能添加任何额外的选项。您不能将负价产品添加到购物车。您不能将零价商品添加到购物车。你不能把这东西搬到垃圾里去。% s目前编辑。您不能选择那个日期!您已经在另一个域上激活了该购买代码!您已经激活了您的购买代码!您必须为“%2$s”输入至少%1$s个字符。您必须为%2$s至少选择%1$s个选项。您必须为%2$s准确选择%1$s个选项。您的Envato用户名。您的文件正在上传您的设置已成功重置.你的设置已保存。和一个自动剩余字符单击此链接点击此链接div数量结束于文件文件大于大于或等于h:mh:m:sh:m:ssh:mmh:mm:sh:mm:ss这里hh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ss是是空的不是不是空的jQuery 主产品图象选择器标签小于小于或等于或注册插件以接收自动更新。p全局表单选项模板额外产品选项跨度开始于时区languages/woocommerce-tm-extra-product-options-pt_BR.po000064400001075052150755142440017324 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:54+0200\n"
"PO-Revision-Date: 2024-03-07 11:54+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Opções Extras"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "Taxas extras de opções de produtos"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "Opções Extras do Produto"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Configurações"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Opções de produtos extras e complementos para o WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Mais informações sobre %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Ver detalhes"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "Ver documentação de Opções Extras do Produto"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Documentos"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "Visite o Suporte ao Cliente Premium"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Suporte Premium"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Copiar)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Variação #%1$s de %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "Ainda não há variações salvas."

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "Você não pode acrescentar mais opções extras."

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "Você tem certeza de que quer remover esta opção?"

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Antes de adicionar Opções de Produtos Extras, adicione e salve alguns "
"atributos na guia Atributos."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Quantia fixa"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "Porcentagem do preço inicial"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "Erro"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "Solicitação Inválida!"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "Tem certeza de que deseja excluir esta pasta e todo o seu conteúdo?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "Tem certeza de que deseja excluir este arquivo?"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "Tem certeza de que deseja redefinir as configurações?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Sim"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "Não"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Cancelar"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Fechar"

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr "Nome constante"

#: admin/class-themecomplete-epo-admin-base.php:1285
msgid "Constant value"
msgstr "Valor constante"

#: admin/class-themecomplete-epo-admin-base.php:1286
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Marque a caixa de seleção de consentimento para dar sua permissão para "
"enviar seus dados ao servidor e tente novamente."

#: admin/class-themecomplete-epo-admin-base.php:1287
msgid "Connecting to activation server ..."
msgstr "Conectando-se ao servidor de ativação..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Opção de Produto Extra #%1$s de %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "Não foi possível atualizar o banco de dados"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "Ativar pontos de exibição?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr ""
"Isso permite que você para gerar pontos ao longo do seletor de intervalo."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "Número de pontos"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "Insira o número de valores para a exibição de pontos."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Lado Esquerdo"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Lado direito"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr "Dica e esquerdo"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr "Tooltip e do lado direito"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr "Mostrar valor em"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr "Selecione como mostrar o valor do seletor de intervalo."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "Valor do passo"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "Digite o passo para o identificador."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Sem Validação"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "E-mail"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "Url"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Número"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Dígitos"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "Apenas letras"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr "Somente letras ou espaço"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Alfanumérico"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "Unicode alfanumérico"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "Unicode ou espaço alfanumérico"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr "Validar como"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Escolha se o campo será validado em relação ao método escolhido."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr "Obrigatório"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr "Escolha se o usuário deve preencher este campo ou não."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Ativado"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr "Escolha se a opção está ativada ou não."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr "Digite o preço para este campo ou deixe em branco por nenhum preço."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Preço de Venda"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
#, fuzzy
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Insira o preço de venda para este campo ou deixe-o em branco para usar o "
"preço padrão."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
#, fuzzy
msgid "Text after Price"
msgstr "Texto após Preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Insira um texto a ser exibido depois que o preço para este campo ou deixe em "
"branco para nenhum texto."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
#, fuzzy
msgid "Text before Price"
msgstr "Texto antes do Preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
#, fuzzy
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Insira um texto a ser exibido antes do preço desse campo ou deixe-o em "
"branco para nenhum texto."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr "Porcentagem do preço original + opções"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr "Preço por linha"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr "Porcentagem do preço original por caractere"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "Preço por caractere  (no n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr "Porcentagem do preço original por caractere (no n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
#, fuzzy
msgid "Price per character"
msgstr "Preço por caractere"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "Porcentagem do preço original por caractere"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "Preço por caractere (sem primeiro caractere)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "Preço por caractere (sem n-ésimo caractere)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "Preço por caractere (sem non-ésimo caractere e sem espaços)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "Porcentagem do preço original por caractere (sem primeiro caractere)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr ""
"Porcentagem do preço original por caractere (sem o non-ésimo caractere)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Porcentagem do preço original por caractere (sem nono caractere e sem "
"espaços)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "Preço por caractere (sem espaços)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
#, fuzzy
msgid "Price per row"
msgstr "Preço por linha"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr "Formato de Data"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
#, fuzzy
msgid "Fixed amount + options"
msgstr "Valor fixo + opções"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "Tabela de pesquisa"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Tipo de preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Quantidade"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr "Valor atual"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
#, fuzzy
msgid "Step * price"
msgstr "Passo * preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
#, fuzzy
msgid "Price per Interval"
msgstr "Preço por Intervalo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
#| msgid "Section type"
msgid "Calculation type"
msgstr "Tipo de seção"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Nenhum"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "ID do elemento para x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr "Insira o id do elemento a ser usado para a coluna x."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "ID do elemento para y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr "Insira o id do elemento a ser usado para a coluna y."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
#, fuzzy
msgid "Set to Fee"
msgstr "Definir como Taxa"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Verifique para tornar o preço total não sendo multiplicado pela quantidade "
"do produto."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "Personagens gratuitos"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "Digite o número de caracteres gratuitos."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Valor mín"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr "Entre o valor mínimo."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Valor máx"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr "Entre o valor máximo."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "Day - Month - Year"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
#, fuzzy
msgid "Month / Day / Year"
msgstr "Mês / Dia / Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "Dia . Mês . Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
#, fuzzy
msgid "Month . Day . Year"
msgstr "Mês. Dia. Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "Dia - Mês - Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
#, fuzzy
msgid "Month - Day - Year"
msgstr "Mês - Dia - Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr "Dia / Mês / Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr "Dia / Mês / Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr "Dia . Mês . Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr "Dia . Mês . Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr "Dia - Mês - Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr "Dia - Mês - Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Formato de data"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
#, fuzzy
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr "H (m)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
#, fuzzy
msgid "HH:mm:ss"
msgstr "HH: milímetro: ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr "HH:m:SS"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr "H:mm: SS"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr "H:m:SS"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
#, fuzzy
msgid "HH:mm:s"
msgstr "HH: milímetro: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
#, fuzzy
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
#, fuzzy
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
#, fuzzy
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
#, fuzzy
msgid "hh:m:ss"
msgstr "hh:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
#, fuzzy
msgid "h:mm:ss"
msgstr "h: mm: ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
#, fuzzy
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
#, fuzzy
msgid "hh:mm:s"
msgstr "hh: mm: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
#, fuzzy
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
#, fuzzy
msgid "h:mm:s"
msgstr "h: milímetro: s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
#, fuzzy
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Formato da Hora"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr "Formato do tempo personalizado"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr "Isso irá substituir o formato do tempo acima."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
#, fuzzy
msgid "Start year"
msgstr "Ano de início"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr "Entre o ano de começo."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr "Fim de Ano"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr "Entre o ano Final."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr "Use substituições de URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "Escolha quando redirecionar a uma URL quando a opção é um click."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr "Preencher opções"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr "Click duplo no botão rádio remove o atributo selecionado."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr "Opções de variação"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
#, fuzzy
msgid "Image swatches"
msgstr "Amostras de imagens"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
#, fuzzy
msgid "Color swatches"
msgstr "Amostras de cores"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
#, fuzzy
msgid "Text swatches"
msgstr "Amostras de texto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
#, fuzzy
msgid "Replacement mode"
msgstr "Modo de substituição"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
#, fuzzy
msgid "Select how to display the element."
msgstr "Selecione como exibir o elemento."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr "Início do rótulo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Centro"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
#, fuzzy
msgid "End of the label"
msgstr "Fim do rótulo"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr "Posição de Swatch"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
#, fuzzy
msgid "Choose how the swatch will be displayed."
msgstr "Escolha como a amostra será exibida."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
#, fuzzy
msgid "Use image lightbox"
msgstr "Usar lightbox de imagem"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "Escolha se deseja ativar a mesa de luz na miniatura."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr "Use substituições imagem"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr "Use imagem personalizada"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "Mudar a imagem do produto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr "Escolha se deseja alterar a imagem do produto."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Exibir etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Exibir descrição"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr "Mostrar rótulo e descrição"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Exibir Imagem"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr "Mostrar imagem e etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
#, fuzzy
msgid "Show image and description"
msgstr "Mostrar imagem e descrição"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr "Mostrar imagem, rótulo e descrição"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "Mostrar Dica"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr "Habilitar isso mostrará uma dica de ferramenta sobre a escolha."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr "Habilitar botão de limpar opções"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr "Isto irá adicionar um botão para apagar a opção selecionada."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
#, fuzzy
msgid "Show responsive values"
msgstr "Mostrar valores responsivos"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "auto"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr "Itens por linha (Desktops e laptops)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Utilize este campo para fazer uma exibição de grade. Digite o número de "
"itens por linha para a grade ou deixe em branco para exibição normal."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr "Itens por linha (paisagem de Tablets)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr "Itens por linha (retrato em tablets)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr "Itens por linha (Smartphones)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
#, fuzzy
msgid "Items per row (iPhone 5)"
msgstr "Itens por linha (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr "Itens por linha (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr "Itens por linha (iPhone 6 +)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "Itens por linha (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Itens por linha (paisagem de Tablets Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "Limitar seleção"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Insira um número superior a 0 para limitar a seleção caixa ou deixe em "
"branco para o comportamento padrão."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
#, fuzzy
msgid "Exact selection"
msgstr "Seleção exata"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Insira um número superior a 0 para que o usuário selecione o número exato de "
"caixas ou deixe em branco para o comportamento padrão."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "Qtde. Mínima de Seleções"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Digite um número acima de 0 para que o usuário marque pelo menos esse número "
"de caixas de seleção ou deixe em branco para o comportamento padrão."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr "Botão normal do navegador"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "Botão estilizado"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr "Estilo de botão Upload"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Campo data"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Seletor de Data"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr "Campo de data e seletor"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr "Estilo de selecionador de data"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Esconder preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr "Optar por ocultar o preço ou não."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Desativar"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Direita"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Esquerda"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Topo"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "Inferior"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr "Seletor de quantidade"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr "Isto irá mostrar o seletor de quantidade para esta opção."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "Quantidade min valor"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr "Valor máximo Quantidade"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "Etapa Quantidade"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr "Insira o incremento de Quantidade."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
#, fuzzy
msgid "Quantity Default value"
msgstr "Valor padrão da quantidade"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr ""
"Introduzir um valor a ser aplicada ao campo Quantidade automaticamente."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Placeholder"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Caracteres mínimos"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr "Digite um valor para os personagens mínimos o usuário deve entrar."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "Máximo de caracteres"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Insira um valor para limitar o máximo de caracteres que o usuário pode "
"entrar."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Valor padrão"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr "Introduzir um valor a ser aplicada ao campo automaticamente."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Tamanho"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "Reduzir largura"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
#, fuzzy
msgid "Increase Width"
msgstr "Aumentar largura"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "Editar Elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "Duplicar Elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(Sem título)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Editar seção"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "Duplicar Seção"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Seção"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Adicionar elemento"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr "Escolha a imagem para usar no lugar do botão de rádio."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#, fuzzy
msgid "Remove the image."
msgstr "Remova a imagem."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr "Escolha a imagem para substituir a imagem do produto com."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
#, fuzzy
msgid "Select boxes"
msgstr "Selecionar caixas"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Botão de seleção única"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr "Teclas e imagem de rádio na extremidade da etiqueta"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
#, fuzzy
msgid "Radio buttons and image at end of the label"
msgstr "Botões de opção e imagem no final do rótulo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Mostrar como"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
#, fuzzy
msgid "Select the display type of this attribute."
msgstr "Selecione o tipo de exibição desse atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Etiqueta atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
#, fuzzy
msgid "Leave blank to use the original attribute label."
msgstr "Deixe em branco para usar o rótulo do atributo original."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "Habilitar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "Mostrar botão de reset"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "Permite a exibição de um botão de reset para este atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
#, fuzzy
msgid "Attribute element class name"
msgstr "Nome da classe do elemento de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr ""
"Digite um nome de classe extra para adicionar a este elemento de atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Largura"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Introduza a largura do item exibido ou deixe em branco para a largura do "
"automóvel."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Altura"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Introduza a altura do item exibido ou deixe em branco para a altura "
"automática."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Ocultar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
#, fuzzy
msgid "Show"
msgstr "Mostrar"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
#, fuzzy
msgid "Show attribute name"
msgstr "Mostrar nome do atributo"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr "Escolha se deseja mostrar ou ocultar o nome do atributo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Cor"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "Selecione a cor a ser usada."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
#, fuzzy
msgid "Image replacement"
msgstr "Substituição de imagem"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr "Selecione uma imagem para este termo."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
#, fuzzy
msgid "Product Image replacement"
msgstr "Substituição da imagem do produto"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr "Selecione a imagem para substituir a imagem do produto com."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
#, fuzzy
msgid "No saved variations found."
msgstr "Nenhuma variação salva encontrada."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr "Escolha a imagem para usar no lugar da caixa de seleção."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Escolha a imagem para usar no lugar do botão de rádio quando selecionado."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Escolha a imagem para usar no lugar da caixa de seleção quando selecionada."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
#, fuzzy
msgid "Choose the image for the lightbox."
msgstr "Escolha a imagem para a lightbox."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "Opções para Deletar"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Marcado"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Padrão"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
#, fuzzy
msgid "Choice label"
msgstr "Escolha do rótulo"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Tipo de Preço"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Descrição"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Adicionar item"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "Adicionar separador"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
#, fuzzy
msgid "Mass add"
msgstr "Adicionar massa"

#: admin/class-themecomplete-epo-admin-csv.php:41
#, fuzzy
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"As funções php mb_detect_encoding e mb_convert_encoding são necessárias para "
"importar e exportar arquivos CSV. Por favor, peça ao seu provedor de "
"hospedagem para ativar esta função."

#: admin/class-themecomplete-epo-admin-csv.php:289
#, fuzzy
msgid "Invalid CSV file."
msgstr "Arquivo CSV inválido."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr "O arquivo carregado excede a diretriz upload_max_filesize em php.ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr ""
"O arquivo enviado excede a diretiva MAX_FILE_SIZE que foi especificada no "
"formulário HTML."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "O arquivo só foi parcialmente carregado."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "Nenhum arquivo foi enviado."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Faltando uma pasta temporária."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Falha ao gravar o arquivo em disco."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "O carregamento do arquivo foi interrompido por extensão."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""
"Desculpe, mas este tipo de arquivo não é permitido por razões de segurança."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "Nenhum arquivo encontrado."

#: admin/class-themecomplete-epo-admin-csv.php:337
#, fuzzy
msgid "Invalid import method used."
msgstr "Método de importação inválido usado."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "Arquivo importado."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "O arquivo CSV é inválido!"

#: admin/class-themecomplete-epo-admin-csv.php:552
#, fuzzy
msgid "Invalid CSV file!"
msgstr "Arquivo CSV inválido!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, fuzzy, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "Não é permitido fazer upload de arquivos maiores que %s!"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "Arquivo importado com novas tabelas."

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "Ocorreu um erro ao importar o ficheiro CSV."

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Ocorreu um erro ao salvar os dados csv. Por favor, verifique a codificação "
"do seu arquivo csv!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr "Os nomes das tabelas são diferentes. Deseja substituir as tabelas?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr "Dados inválidos!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
#, fuzzy
msgid "Something went wrong with the request!"
msgstr "Algo deu errado com o pedido!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "Opções salvas!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "Incluem formas globais adicionais"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(sem título)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Limpar todos formulários globais adicionais"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "Excluir de Opções Extra de produtos global"

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr "Ativar exclusão das opções globais"

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr "Deletar todas opções do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "O Gerenciador de arquivos não é suportado no seu servidor."

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "Suas configurações foram reiniciadas."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "Houve um erro ao salvar suas configurações."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Suas configurações foram salvas."

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "Modelo de clonagem"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Clonar Formulário"

#: admin/class-themecomplete-epo-admin-global-base.php:951
#, fuzzy
msgid "Export form"
msgstr "Formulário de exportação"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
#, fuzzy
msgid "Extra Product Options Form Builder"
msgstr "Construtor de formulários de opções de produtos extras"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Título"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Prioridade"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Aplicado em"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Categorias"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Produtos"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr "Produtos Excluídos"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "TODOS produtos"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Desativado"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "Produtos e Categorias"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Código Personalizado"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "TODAS categorias"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
#| msgid "CSS Settings"
msgid "Form settings"
msgstr "Configurações de CSS"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Publicar"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Funções"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Produtos excluídos"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr "A descrição aparecerá sob o título."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
#, fuzzy
msgid "Enabled roles for this form"
msgstr "Funções habilitadas para este formulário"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
#, fuzzy
msgid "Disabled roles for this form"
msgstr "Funções desabilitadas para este formulário"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr "Habilitar regras para este formulário"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Procure por um produto&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Selecione o produto (s) para aplicar as opções"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
#, fuzzy
msgid "Meta data not correctly saved. Please save the product!"
msgstr "Metadados não salvos corretamente. Por favor, salve o produto!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Adicionar seção"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
#, fuzzy
msgid "Style variations"
msgstr "Variações de estilo"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Salvar"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "Importar CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "Exportar CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
#, fuzzy
msgid "Fullsize"
msgstr "Tamanho completo"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr "Por favor, salve o formulário antes de importar opções!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr "Por favor, salve o produto antes de importar opções!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr "Não foram encontrados elementos!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr "Inicie adicionando elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "Adicionar elemento em uma nova seção"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Excluir Permanentemente"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "Mover para Lixeira"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Atualizar"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
msgid "Apply mode"
msgstr "Modo próprio"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "TODOS produtos"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Preço Personalizado"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
#, fuzzy
msgid "Something went wrong with WordPress."
msgstr "Algo deu errado com o WordPress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce não está habilitado!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Cheatin&#8217; uh?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr "Sem permissão para mover este item para a Lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Erro em mover para a lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr "Não tem permissão para restaurar este item da lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Erro ao restaurar da lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "Sem permissão para apagar este item."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Erro ao apagar."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
#, fuzzy
msgid "The item you are trying to move to the Trash no longer exists."
msgstr "O item que você está tentando mover para a Lixeira não existe mais."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
#, fuzzy
msgid "Unknown post type."
msgstr "Tipo de postagem desconhecido."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"Não é possível mover este item para a lixeira.  %s está editando no momento."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
#, fuzzy
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr "O item que você está tentando restaurar da Lixeira não existe mais."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr "Você não tem permissão para mover este item para fora da Lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
#, fuzzy
msgid "This item has already been deleted."
msgstr "Este item já foi excluído."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr "Você tentou editar um item que não existe. Talvez tenha sido apagado?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "Você não tem permissão para editar este item."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"Você pode & #8217; t editar este item porque ele está no lixo. Por favor, "
"restaure-o e tente novamente."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s post atualizado."
msgstr[1] "%s posts atualizados."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "%s post não atualizado, alguém o está editando."
msgstr[1] "%s posts não atualizados, alguém os está editando."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s post excluído permanentemente."
msgstr[1] "%s posts excluídos permanentemente."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s post movido para a lixeira."
msgstr[1] "%s posts movidos para a lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "%s post restaurado da lixeira."
msgstr[1] "%s posts restaurados da lixeira."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "O formulário selecionado não tem nenhuma seção"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Mostrar filtros"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "Esconder filtros"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Filtrar por"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "em"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "Tem certeza de que deseja excluir este item?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
#, fuzzy
msgid "Are you sure you want to clone this item?"
msgstr "Tem certeza de que deseja clonar este item?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Editar Configurações"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "Id do elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "Seção"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "é"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "não é"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "está vazio"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "não está vazio"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "começa com"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "termina com"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "maior que"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "menor que"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr "melhor que ou igual a"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
#, fuzzy
msgid "less than or equal to"
msgstr "menor ou igual a"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
#, fuzzy
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"Não é possível aplicar regras a esse elemento ou seção, pois não há nenhum "
"elemento configurado de valor em outras seções ou nenhuma outra seção "
"encontrada."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr "Ocorreu um erro! Não é possível aplicar condições a este elemento!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "Criar em massa"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "Extensão de arquivo inválida"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
#, fuzzy
msgid "Importing csv..."
msgstr "Importando csv..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
#, fuzzy
msgid "Saving... Please wait."
msgstr "Poupança... Aguarde."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "Importando dados"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "Editar Preço"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
msgid "Edit tab"
msgstr "Editar Guia"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
#, fuzzy
msgid "Overwrite existing elements"
msgstr "Substituir elementos existentes"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
#, fuzzy
msgid "Append new elements"
msgstr "Acrescentar novos elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "O formulário está sendo aplicado a todos produtos"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "Este formulário não está aplicado a nenhum produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Carregando ..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "Variáveis de produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
#| msgid "Global variables"
msgid "Special variables"
msgstr "Variáveis globais"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr "Variáveis globais"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Mostrar opções Total"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Options Total"
msgstr "Mudar o preço original do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Cumulative Total"
msgstr "Mudar o preço original do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "Quantidade do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr "Mudar o preço original do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
#| msgid "Original product price"
msgid "Dynamic product price"
msgstr "Mudar o preço original do produto"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr "Este elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr "O valor deste elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr "O comprimento do valor deste elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr "O número de opções que o usuário selecionou"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr "A quantidade total deste elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr "A quantidade deste elemento"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr "Outros Elementos"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "O preço do elemento visado"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Valor"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "O valor do elemento de destino convertido em um float"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Texto"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "O valor bruto do elemento de destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
#, fuzzy
msgid "Text length"
msgstr "Comprimento do texto"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "O comprimento do texto do elemento de destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "A quantidade total do elemento visado"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Contagem"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr "O número de opções que o usuário selecionou no elemento de destino"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Todos"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Copiar"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Meu < span classe = \"count\" > ( %s) </span>"
msgstr[1] "Meu < span classe = \"count\" > ( %s) </span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Tudo <span class=\"count\">(%s)</span>"
msgstr[1] "Tudo <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Fixo < span classe = \"count\" > ( %s) </span>"
msgstr[1] "Fixo < span classe = \"count\" > ( %s) </span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "Tabela CSV inválida!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "Ocorreu um erro!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "Substituir tabelas existentes"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "Procurar tabela"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "Nenhuma tabela CSV encontrada!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "Importe um clicando no botão abaixo."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Nome da tabela"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "Índice da tabela"

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr "Painel de controle EPO"

#: admin/class-themecomplete-epo-admin-settings.php:292
#, fuzzy
msgid "Extra Product Options Settings"
msgstr "Configurações de opções de produtos extras"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Redefinir Configurações"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Salvar alterações"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "Qualquer"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Clique para alternar"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Atributo:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Tipo:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Checkbox"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Selecionar"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Configurações:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Variação:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Preço:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "Preço padrão (obrigatório)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Preço Personalizado"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Atributos faltando. Por favor, apague essa opção extra:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
msgid "Percent of the origιnal price"
msgstr "Porcentagem do Preço Original"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Formulário atualizado."

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "Formulário restaurado para revisão de %s"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "Formulário publicado."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Formulário salvo."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Formulário enviado."

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr "Formulário agendado para: %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Rascunho do formulário atualizado."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Digite o título aqui"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Desfazer"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Opção"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Custo"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Qtd"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Total"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "Imposto"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Editar item"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Excluir item"

#: admin/views/html-tm-epo.php:29
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Antes de adicionar opções extras neste modo, adicione e salve alguns "
"atributos na guia Atributos."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Expandir tudo"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Fechar tudo"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "Adicionar opção extra"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "Construtor"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Normal"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Para traduzir as cordas para as opções locais utilize interface de WPML."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "De"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Intervalo"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "Substituição de exibição de preço"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Isso substituirá o preço do produto exibido nas páginas de loop de loja/"
"arquivo/produto."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Regular"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "Para"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Venda"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"As formas que você escolher serão exibidas ao lado com as formas que o "
"produto já tem."

#: admin/views/html-tm-global-epo.php:206
#, fuzzy
msgid "Exclude from"
msgstr "Excluir de"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Isto irá excluir quaisquer formulários globais atribuídos a este produto, "
"exceto aqueles definidos na configuração anterior."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "Substituir o preço do produto"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Isto irá substituir o preço do produto com o preço das opções, se o preço "
"total de opções é maior então zero."

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr "Substituir exibição mundial"

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr ""
"Isto irá substituir o método de visualização somente para este produto."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "Usar configuração global"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "Mostrar sempre"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "Mostrar apenas com um gancho de ação"

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr "Substituir a caixa Total final"

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr "Isto substituirá a exibição de caixa totais somente para este produto."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
msgid "Disable if Options total is zero"
msgstr "Ocultar caixa Total final se o total de opções for zero"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
msgid "Disable if total is zero"
msgstr "Ocultar caixa total final se o total for zero"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Mostrar opções Total"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr ""
"Isto irá substituir o método de visualização somente para este produto."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Mostrar quando o total é maior que zero"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Mostrar Total Final"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid "This will Show Final Total setting only for this product."
msgstr ""
"Isto irá substituir o método de visualização somente para este produto."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
#, fuzzy
msgid "Override enabled roles for this product"
msgstr "Substituir funções habilitadas para este produto"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
#, fuzzy
msgid "This will override which roles can see the options for this product."
msgstr "Isso substituirá quais funções podem ver as opções para este produto."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "A clonagem é proibida."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "As instâncias de desserialização dessa Classe são proibidas."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "Grátis!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Selecionar opções"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "Adicionar ao carrinho"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
#, fuzzy
msgid "Product element is not supported for components!"
msgstr "O elemento Product não é suportado para componentes!"

#: includes/class-themecomplete-extra-product-options.php:4984
#, fuzzy
msgid "Product element is not supported within another product element!"
msgstr "O elemento Product não é suportado em outro elemento do produto!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Caixas de Seleção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Selecionador de cores"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Data"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Domingo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Segunda"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Terça"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Quarta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Quinta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Sexta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Sábado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr "Janeiro "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Fevereiro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Março"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "Abril"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Maio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Junho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Julho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "Agosto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "Setembro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Outubro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "Novembro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "Dezembro"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Insira um valor para ser aplicado ao campo automaticamente de acordo com seu "
"formato de data selecionada. (Dois dígitos para o dia, dois dígitos para o "
"mês e quatro dígitos para o ano)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr "Data mínima seleccionável"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "Um número de dias de hoje."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr "Data selecionável máxima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Datas desabilitadas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Separados por vírgula datas de acordo com o formato da data seleccionada. "
"(Dois dígitos para o dia, dois dígitos para mês e quatro dígitos para o ano)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
#, fuzzy
msgid "Enabled dates"
msgstr "Datas habilitadas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Datas separadas por vírgulas de acordo com o formato da data selecionada. "
"(Dois dígitos por dia, dois dígitos por mês e quatro dígitos por ano). Por "
"favor note que isso irá substituir qualquer outra configuração!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr "Epo Branco"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr "Epo preto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Tema"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "Selecione o tema para o datepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Pequeno"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Médio"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Grande"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr "Selecione o tamanho do datepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr "Parte superior da tela"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr "Parte inferior da tela"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Posição"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr "Seleccione a posição do datepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
#, fuzzy
msgid "Exclude disabled"
msgstr "Excluir desativado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
#, fuzzy
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Habilitar isso fará com que a data selecionável Mínima e Máxima não conte os "
"dias da semana desabilitados selecionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr "Semana desativar"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr "Isso permite que você desabilite todos os dias da semana selecionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
#, fuzzy
msgid "Disable months"
msgstr "Desativar meses"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr "Isto permite que você desative dias da semana selecionados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Traduções"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Dia"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Mês"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Ano"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Divisor"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Opções Gerais"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Lógica condicional"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr "Configurações de CSS"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr "Nome da classe elemento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr "Digite um nome de classe extra para adicionar a este elemento"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "Substituir o preço do produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "Mudar a imagem do produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "Seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr ""
"Escolha se deseja incluir impostos para o tipo de preço, taxa neste elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
#| msgid "Math formula"
msgid "Formula"
msgstr "Formato de Data"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "Digite o passo para o identificador."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Mostrar como"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
#| msgid "Enter a text to replace the Close button text on the calendar."
msgid "Enter the text to show next to the calculation result on the page."
msgstr "Insira um texto para substituir o texto do botão Fechar no calentário."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
msgid "Text before result"
msgstr "Texto antes do Preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Insira um texto a ser exibido antes do preço desse campo ou deixe-o em "
"branco para nenhum texto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
msgid "Text after result"
msgstr "Texto após Preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
#| msgid ""
#| "Enter a text to display after the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Insira um texto a ser exibido depois que o preço para este campo ou deixe em "
"branco para nenhum texto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Cabeçalho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Tipo de cabeçalho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "Título do Cabeçalho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
msgid "Left of the Content"
msgstr "Esquerda do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
msgid "Right of the Content"
msgstr "Direito do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Posição do cabeçalho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Cor do cabeçalho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr "Deixe em branco para ID padrão"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Conteúdo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "Cor do conteúdo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
#| msgid "Above field"
msgid "Above Header"
msgstr "Campo acima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr "Ícone dica esquerda"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr "O ícone direito da dica"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "Posição do conteúdo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
msgid "Multiple Upload"
msgstr "Selecionar caixa múltipla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Produto Único"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr "Selecione o Modo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr "Seja para incluir produtos ou categorias específicas."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
#, fuzzy
msgid "Search for a category ..."
msgstr "Procure por uma categoria..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Selecionar categorias"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr "Adicione categorias para incluir todos os seus produtos associados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Procure um produto ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Selecionar produtos"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr "Adicione os produtos individualmente."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
#, fuzzy
msgid "Choose a value"
msgstr "Escolha um valor"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Preço base"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
#, fuzzy
msgid "Name"
msgstr "Nome"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Ordem do menu"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Aleatório"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Ordenar por"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr "Selecione a imagem para substituir a imagem do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Ascendente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Descendente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Pedido"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr "Selecione o tamanho do Selecionador de Data."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Selecionar um produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr "Antes do Produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr "Selecione usuários que terão acesso a opções extras."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Lista suspensa"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Miniaturas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
#, fuzzy
msgid "Thumbnails multiple"
msgstr "Miniaturas múltiplas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "Modo de layout"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr "Selecione como os produtos serão apresentados."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr "Espaço reservado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr "Entre o incremento para o manuseio."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Quantidade mínima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Quantidade máxima"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr "Enviado individualmente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Se isso estiver habilitado, o produto incluído não será enviado com o "
"produto principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr "Manter o peso"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Se isso estiver habilitado, o produto incluído adicionará seu peso ao "
"produto principal."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr "Preço individualmente"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr ""
"Se isso estiver habilitado, o produto incluído manterá seu próprio preço."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Porcentagem"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Tipo de desconto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Selecione o tipo de desconto. O desconto se aplica ao preço final do "
"produto. Se o produto tiver opções extras, o desconto se aplica ao valor "
"após as opções terem sido adicionadas ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Desconto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr "Entre o valor mínimo."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "Desativar Addons"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Se isso estiver habilitado, os addons incluídos que o produto associado tem "
"não serão exibidos."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "Exlude preços Addon a partir do desconto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Se isso for habilitado, o desconto não será aplicado aos complementos do "
"produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Carrinho"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Finalizar"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "Pedidos e E-mails"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "Ocultar produto em"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "Selecione onde ocultar o produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr "Marque isto para incluir o valor das opções ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Exibir título"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr "Marque isto para incluir o valor das opções ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Exibir título"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
#| msgid "Enable to show the title of the associated product."
msgid "Enable to have the title link to the associated product."
msgstr "Marque isto para incluir o valor das opções ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "Mostrar preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr "Marque isto para incluir o valor das opções ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr "Marque isto para incluir o valor das opções ao preço do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr "Mostrar meta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
#, fuzzy
msgid "Enable to show the meta of the associated product."
msgstr "Habilite para mostrar a meta do produto associado."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Opções Avançadas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr "Raio do Seletor"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "Opções de Título Elegante"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr "Normal (limpar)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Caixa"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr "Expandir e recolher (iniciar aberto)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr "Expandir e recolher (iniciar fechado)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Acordeão"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr "Estilo seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr "Escolha o estilo de apresentação desta seção."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr "Cor de Fundo da Seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
#, fuzzy
msgid "Section label background color"
msgstr "Cor de fundo do rótulo da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
#, fuzzy
msgid "Section subtitle background color"
msgstr "Cor de fundo do subtítulo da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr "Antes Opções locais"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr "Depois Opções locais"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr "Colocação secção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
#, fuzzy
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Selecione onde esta seção aparecerá em comparação com as Opções locais."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "Pop up"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr "Slider (assistente)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Abas"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr "Tipo de seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr "Selecione tipo de exibição deste seção."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "Link do Texto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Botão"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
#, fuzzy
msgid "Button Alt"
msgstr "Alt do botão"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
#, fuzzy
msgid "Section pop up button style"
msgstr "Estilo do botão pop-up da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
#, fuzzy
msgid "Select this section's pop up button style."
msgstr "Selecione o estilo do botão pop-up desta seção."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
#, fuzzy
msgid "Section pop up button text"
msgstr "Texto do botão pop-up da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
#, fuzzy
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Insira um texto para substituir o texto do botão pop-up padrão. Isso "
"substituirá o valor global."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr "Nome da classe de seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr "Digite um nome de classe extra para adicionar a esta seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
#, fuzzy
msgid "Section Conditional Logic"
msgstr "Lógica condicional da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr "Activar lógica condicional para mostrar ou ocultar esta secção."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Caixa de Seleção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr "Isso contará como um valor vazio no caso de o elemento ser necessário."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
#, fuzzy
msgid "Multi-Select Field"
msgstr "Selecionar caixa múltipla"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Modelo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
#, fuzzy
msgid "Select a template ..."
msgstr "Selecione um modelo..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Selecionar modelo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
#, fuzzy
msgid "Add the template you want to display."
msgstr "Adicione o modelo que você deseja exibir."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Área de texto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Campo de texto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
#| msgid "Enter the quantity step."
msgid "Enter the step."
msgstr "Insira o incremento de Quantidade."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Tempo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr "Estilo da seção"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Estilo personalizado"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr "Estilo do Selecionador de Data"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
#, fuzzy
msgid "Minimum selectable time"
msgstr "Tempo mínimo selecionável"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr "Introduza o tempo no seguinte formato: 08:00"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
#, fuzzy
msgid "Maximum selectable time"
msgstr "Tempo máximo selecionável"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr "Selecione o tema para o timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr "Selecione o tamanho do timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
#, fuzzy
msgid "Select the position of the timepicker."
msgstr "Selecione a posição do seletor de tempo."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Hora"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Minuto"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Segundo"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Upload"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Variações"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr "Elemento condicional Logic"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
#, fuzzy
msgid "Enable conditional logic for showing or hiding this element."
msgstr "Habilite a lógica condicional para mostrar ou ocultar esse elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "Tipo de Etiqueta"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Rótulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
#| msgid "Select mode"
msgid "Label view mode"
msgstr "Selecione o Modo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
#| msgid "Above field"
msgid "Above the fields"
msgstr "Campo acima"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr "Campo acima"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the fields"
msgstr "Esquerda do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the field"
msgstr "Esquerda do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the fields"
msgstr "Direito do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the field"
msgstr "Direito do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "Posição da rótulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Cor do rótulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Subtítulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
#| msgid "Below field"
msgid "Below the fields"
msgstr "Abaixo do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr "Abaixo do campo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
#, fuzzy
msgid "Subtitle position"
msgstr "Posição da legenda"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Cor do Subtítulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr "Regra horizontal"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Preenchimento"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr "Tipo de Divisor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "Opções Rótulo"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr "Id de elemento contêiner"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr "Introduza um id para o recipiente do elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
#, fuzzy
msgid "Inherit product setting"
msgstr "Herdar a configuração do produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
#, fuzzy
msgid "Include tax for Fee price type"
msgstr "Incluir imposto para o tipo de preço Taxa"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
#, fuzzy
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Escolha se deseja incluir imposto para o tipo de preço Taxa neste elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
#, fuzzy
msgid "Tax class for Fee price type"
msgstr "Classe de imposto para Tipo de preço de taxa"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr ""
"Escolha se deseja incluir impostos para o tipo de preço, taxa neste elemento."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr "Ocultar o rótulo do elemento no carrinho"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr "Escolha se deseja ocultar o rótulo de elemento no carrinho ou não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr "Não, mas ocultar o preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
#, fuzzy
msgid "Yes, but show price"
msgstr "Sim, mas mostrar preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr "Esconder o valor do elemento no carrinho"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr "Escolha se deseja ocultar o valor do elemento no carrinho ou não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "Ocultar o rótulo do elemento em ordem"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr "Escolha se deseja ocultar o rótulo de elemento na ordem ou não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "Ocultar o valor de elemento em ordem"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr "Escolha se deseja ocultar o valor de elemento na ordem ou não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "Ocultar rótulo do elemento na caixa de totais flutuantes"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Escolha se deseja ocultar o rótulo de elemento na caixa flutuante totais ou "
"não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr "Esconder o valor elemento flutuante totais de caixa"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Escolha se deseja ocultar o valor de elemento na caixa flutuante totais ou "
"não."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "Configurações do WooCommerce"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
#, fuzzy
msgid "Enable repeater"
msgstr "Ativar repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
#, fuzzy
msgid "This will make this element repeatable."
msgstr "Isso tornará esse elemento repetível."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
#, fuzzy
msgid "Bind repeater with product quantity"
msgstr "Ligar repetidor com quantidade de produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
#, fuzzy
msgid "This will make this element repeatable based on the product quantity."
msgstr ""
"Isso tornará esse elemento repetível com base na quantidade do produto."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
#, fuzzy
msgid "Repeater minimum limit"
msgstr "Limite mínimo do repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
#, fuzzy
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Defina o número mínimo de linhas que um usuário pode adicionar para o campo "
"repetidor."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
#, fuzzy
msgid "Repeater maximum limit"
msgstr "Limite máximo do repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
#, fuzzy
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Defina o número máximo de linhas que um usuário pode adicionar para o campo "
"repetidor."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
#, fuzzy
msgid "Repeater Button Label"
msgstr "Rótulo do botão repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
#, fuzzy
msgid "Leave this blank for the default label."
msgstr "Deixe isso em branco para o rótulo padrão."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "ID do conector do botão de opção"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Insira uma ID personalizada para conectar diferentes elementos de botão de "
"opção."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
#, fuzzy
msgid "Repeater Settings"
msgstr "Configurações do repetidor"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Todos os &quot;%s&quot; Instâncias de método"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, fuzzy, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (ID da instância: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
#, fuzzy
msgid "Flat Rates (Legacy)"
msgstr "Taxas Fixas (Legado)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr "(Legado)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "Selecione os métodos de envio..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "Habilitar métodos de envio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "Selecione os métodos de envio a serem habilitados."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "Habilitar condição de métodos de envio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Especifique as condições para habilitar métodos de envio com base no valor "
"do campo atual. Se as condições forem atendidas, os métodos de envio "
"selecionados estarão disponíveis para os clientes escolherem durante o "
"checkout."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
#, fuzzy
msgid "Disable Shipping Methods"
msgstr "Desativar métodos de envio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "Selecione os métodos de envio a serem desabilitados."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "Desativar condição de métodos de envio"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Especifique as condições para desabilitar os métodos de envio com base no "
"valor do campo atual. Se as condições forem atendidas, os métodos de envio "
"selecionados não estarão disponíveis para os clientes escolherem durante o "
"checkout."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Ações"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Configurações Gerais"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr "Herdar a configuração do produto"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Padrão"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "Deixe em branco para calcular automaticamente do  %s preço"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr "Deixe em branco para calcular automaticamente do %s preço de promoção"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "esta seção se as seguintes condições forem atendidas."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "este campo se as seguintes condições forem atendidas."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "Adicionar novo grupo de condições"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "A Quantidade de &quot;%1$s&quot; não pode ser menor que %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "A Quantidade de &quot;%1$s&quot; não pode ser maior que %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr ""
"A quantidade de &quot;%1$s&quot; deve ser inserida em múltiplos de %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s removido junto com todos os seus produtos associados!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"O item %s foi removido do carrinho porque havia sido alterado desde que foi "
"adicionado."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr "Você não pode adicionar produtos com preços negativos para o carrinho."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
#, fuzzy
msgid "You cannot add zero priced products to the cart."
msgstr "Não é possível adicionar produtos com preço zero ao carrinho."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "Mais opções"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "“% s” é um campo obrigatório."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, fuzzy, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s foi removido do seu carrinho porque já foi modificado. Você pode "
"adicioná-lo de volta ao seu carrinho %2$s."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "aqui"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr "Taxa extra"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Carrinho Vazio"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Editar opções"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Atualizar carrinho"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "%s foi Atualizado."
msgstr[1] "%s foram atualizados."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Ver carrinho"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"Opções de produto extra & Add-Ons para WooCommerce requer WordPress %s ou "
"posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Opções de Produtos Extras e Complementos para o WooCommerce requer Opções de "
"Checkout Extra do WooCommerce %s ou posterior!."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
#, fuzzy
msgid "The installed version is"
msgstr "A versão instalada é"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Importante:%2$s Sua versão do WooCommerce Extra Checkout Options não é "
"suportada. Atualize para a versão mais recente."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Importante:%2$s Opções de Produto Extra & Add-Ons para WooCommerce foi "
"desativado porque não é compatível com a versão atual de Opções de Checkout "
"Extra."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Importante:%2$s Opções de Produto Extra & Add-Ons para WooCommerce foi "
"desativado porque não é compatível com a versão atual de Opções de Checkout "
"Extra."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Importante:%2$s Execute o atualizador do WooCommerce antes de usar "
"Opções de Produto Extra e Add-Ons para o WooCommerce."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Importante:%2$s Opções de produtos extras e complementos para o "
"WooCommerce requer %3$sWooCommerce%4$s %5$s ou posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Executar Atualização"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s Importante:%2$s Opções de produtos extras e complementos para o "
"WooCommerce requer WordPress %3$s ou posterior."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Importante:%2$s Opções de produto extra & Add-Ons para WooCommerce "
"requer PHP versão %3$s ou posterior."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Nome do arquivo"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Excluir"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "Opções Extras de Produtos"

#: includes/classes/class-themecomplete-epo-post-types.php:101
#, fuzzy
msgid "Global Forms"
msgstr "Formulários Globais"

#: includes/classes/class-themecomplete-epo-post-types.php:102
#, fuzzy
msgid "Global Form"
msgstr "Formulário Global"

#: includes/classes/class-themecomplete-epo-post-types.php:103
#, fuzzy
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Formulários Globais"

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr "Adicionar Formulário Global"

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr "Adicionar novo formulário global"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Editar"

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr "Editar formulário global"

#: includes/classes/class-themecomplete-epo-post-types.php:108
#, fuzzy
msgid "New Global Form"
msgstr "Novo Formulário Global"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr "Vista de formulário global"

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr "Formulário de pesquisa global"

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr "Nenhuma forma global encontrado"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "Nenhuma forma global encontrada no lixo"

#: includes/classes/class-themecomplete-epo-post-types.php:114
#, fuzzy
msgid "Parent Global Form"
msgstr "Formulário Global Pai"

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr "Aqui você pode adicionar novos produtos para sua loja."

#: includes/classes/class-themecomplete-epo-post-types.php:156
#, fuzzy
msgid "Option Templates"
msgstr "Modelos de opção"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "Modelo de opção"

#: includes/classes/class-themecomplete-epo-post-types.php:158
#, fuzzy
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Modelos de opção"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Adicionar Modelo"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Adicionar novo modelo"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Editar Modelo"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Novo Modelo"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Ver Template"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Pesquisar template"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "Nenhum modelo encontrado"

#: includes/classes/class-themecomplete-epo-post-types.php:168
#, fuzzy
msgid "No Template found in trash"
msgstr "Nenhum modelo encontrado na lixeira"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "Modelo Principal"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "É aqui que você pode adicionar novas opções de modelo global."

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "Tabelas de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Tabelas de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "Adicionar tabela de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "Adicionar nova tabela de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "Editar tabela de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "Nova tabela de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "Exibir tabela de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "Tabela de pesquisa de pesquisa"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "Nenhuma tabela de pesquisa encontrada"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "Nenhuma tabela de pesquisa encontrada na lixeira"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "Tabela de Pesquisa Pai"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "É aqui que você pode adicionar novas tabelas de pesquisa."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Preço unitário"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Subtotal"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "Opções Valor do IVA"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "Valor fixo"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "Preço Final"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Anterior"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Próximo"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "caracteres restantes"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
#, fuzzy
msgid "Uploading files"
msgstr "Carregando arquivos"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
#, fuzzy
msgid "Your files are being uploaded"
msgstr "Seus arquivos estão sendo carregados"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "arquivo"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "arquivos"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Este campo é obrigatório."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Por favor insira um endereço de e-mail válido."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Por favor, insira um URL válido."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Por favor insira um número válido."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Por favor, indique apenas dígitos."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Por favor insira um valor menor ou igual a {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Digite um valor maior ou igual a {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr "Por favor não digite mais que {0} caracteres."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "Digite mais de {0} caracteres."

#: includes/classes/class-themecomplete-epo-scripts.php:584
#, fuzzy
msgid "Please enter at least {0} character."
msgstr "Digite pelo menos {0} caractere."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Digite pelo menos {0} caracteres."

#: includes/classes/class-themecomplete-epo-scripts.php:586
#, fuzzy
msgid "Please select up to {0} choice."
msgstr "Selecione até {0} escolha."

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "Por favor, selecionar até {0} escolhas."

#: includes/classes/class-themecomplete-epo-scripts.php:588
#, fuzzy
msgid "Please select exactly {0} choice."
msgstr "Selecione exatamente {0} escolha."

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "Por favor, selecione exatamente {0} escolhas."

#: includes/classes/class-themecomplete-epo-scripts.php:590
#, fuzzy
msgid "Please select at least {0} choice."
msgstr "Selecione pelo menos {0} opção."

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "Por favor selecione pelo menos {0} opções."

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr "Insira um múltiplo de {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr "Por favor, insira apenas letras."

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr "Digite apenas letras ou espaços."

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr "Digite apenas letras, números ou sublinhados."

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr "Digite apenas letras e números unicode."

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Digite apenas letras, números ou espaços unicode."

#: includes/classes/class-themecomplete-epo-scripts.php:598
#, fuzzy
msgid "Minimum number of rows is {0}"
msgstr "O número mínimo de linhas é {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
#, fuzzy
msgid "Maximum number of rows is {0}"
msgstr "O número máximo de linhas é {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Feito"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Hoje"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "Geral"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Exibição"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Cordas"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Estilo"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Global"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
#, fuzzy
msgid "Upload manager"
msgstr "Gerenciador de upload"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Código Personalizado"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "Constantes de fórmula matemática"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Licença"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
#, fuzzy
msgid "Initialization"
msgstr "Inicialização"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
#, fuzzy
msgid "Final total box"
msgstr "Caixa total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Vários"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
#| msgid "Enable front-end for roles"
msgid "Enable Frontend Access for Selected Roles"
msgstr "Habilitar front-end para papéis"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
#, fuzzy
msgid "Select the roles that will have access to the extra options."
msgstr "Selecione as funções que terão acesso às opções extras."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
#| msgid "Disable front-end for roles"
msgid "Disable Frontend Access for Selected Roles"
msgstr "Disable front-end para papéis"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr ""
"Selecione as funções administrativas que terão acesso às opções extras."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
#, fuzzy
msgid "Enable translations"
msgstr "Habilitar traduções"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr "Isso habilitará a tradução padrão do plugin usando os arquivos pot."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "Prioridade do gancho do tipo de postagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"Não altere isso a menos que você saiba como isso afetará seu site! Esta é a "
"prioridade que os tipos de post são carregados pelo plugin."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
#, fuzzy
msgid "Default value is 100"
msgstr "O valor padrão é 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
#| msgid "Select the parameter which the products will be sorted by."
msgid "Specify the areas where the plugin will be activated."
msgstr "Selecione a imagem para substituir a imagem do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Todos"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "Produtos e Categorias"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "Variáveis de produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Página do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "Caixa Total Final"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Habilite essa configuração para exibir uma Caixa Total Final na página do "
"produto, permitindo que os clientes visualizem o custo total de seu pedido, "
"ou desabilite-a para uma página simplificada do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Mostrar opções Total"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Habilite para exibir o total especificamente para as opções de produto "
"selecionadas."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Mostrar Total Final"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Permite exibir o total abrangente do produto, fornecendo aos clientes uma "
"visão geral clara do custo geral."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
#, fuzzy
msgid "Enable Final total box for all products"
msgstr "Ativar caixa total final para todos os produtos"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
#, fuzzy
msgid "Show the Final total box even when the product has no extra options"
msgstr ""
"Mostrar a caixa total final mesmo quando o produto não tem opções extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr "Habilitar a exibição total final original"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr "Verificar para permitir a exibição do total final não descontado"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "Ativar opções de exibição de IVA"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Verifique para exibir o valor do IVA das opções acima do total das opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
#, fuzzy
msgid "Show Unit price on totals box"
msgstr "Mostrar preço unitário na caixa de totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
#, fuzzy
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Habilite isso para exibir o preço unitário quando a caixa de totais estiver "
"visível"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr "Incluir Taxas no preço unitário"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
#, fuzzy
msgid "Enable this to add any Fees to the unit price"
msgstr "Habilite isso para adicionar quaisquer Taxas ao preço unitário"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
#, fuzzy
msgid "Total price as Unit Price"
msgstr "Preço total como preço unitário"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Faça com que o preço total não seja multiplicado pela quantidade do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "Ocultar a caixa total final até que um elemento seja escolhido"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Marque esta opção para mostrar a caixa Total final somente quando pelo menos "
"uma opção estiver preenchida."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr ""
"Ocultar a caixa total final até que todos os elementos necessários sejam "
"escolhidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Marque esta opção para mostrar a caixa Total final somente quando todas as "
"opções visíveis necessárias estiverem preenchidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr ""
"Ocultar a caixa total final até que todos os elementos sejam escolhidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Marque esta opção para mostrar a caixa Total final somente quando todas as "
"opções visíveis estiverem preenchidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
#, fuzzy
msgid "Disable lazy load images"
msgstr "Desativar imagens de carregamento lento"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
#, fuzzy
msgid "Enable this to disable lazy loading images."
msgstr "Habilite isso para desativar o carregamento lento de imagens."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
#, fuzzy
msgid "Preload lightbox images"
msgstr "Pré-carregar imagens lightbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
#, fuzzy
msgid "Enable this to preload the image when using the lightbox feature."
msgstr "Habilite isso para pré-carregar a imagem ao usar o recurso lightbox."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
#, fuzzy
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Ativar plugin para shortcodes do WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
#, fuzzy
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Habilitar isso carregará os arquivos do plugin em todas as páginas do "
"WordPress. Use com cautela."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
#, fuzzy
msgid "Enable shortcodes in options strings"
msgstr "Habilitar shortcodes em cadeias de caracteres de opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
#, fuzzy
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"Habilitar isso permitirá o uso de shortcodes e código HTML no rótulo de "
"opções e no texto de descrição."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Posicionamento"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
#, fuzzy
msgid "Floating Totals box"
msgstr "Caixa de Totais Flutuantes"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "Botão \"Adicionar ao carrinho\""

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animação"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
#, fuzzy
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Isso controla como seus campos são exibidos no front-end. Se você escolher "
"\"Mostrar usando ganchos de ação\", você terá que escrever manualmente o "
"código em seu tema ou plugin para exibir os campos e as configurações de "
"posicionamento abaixo não funcionarão. Se você usar a extensão Produtos "
"compostos, deverá deixar essa configuração como \"Normal\", caso contrário, "
"as opções extras não poderão ser exibidas nos pacotes de produtos compostos. "
"Veja mais na documentação."

#: includes/classes/class-themecomplete-epo-settings-base.php:497
#, fuzzy
msgid "Show using action hooks"
msgstr "Mostrar usando ganchos de ação"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
#, fuzzy
msgid "Extra Options placement"
msgstr "Colocação de opções extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
#, fuzzy
msgid "Select where you want the extra options to appear."
msgstr "Selecione onde você deseja que as opções extras apareçam."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Antes do botão Adicionar ao Carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Depois do botão Adicionar ao carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
#, fuzzy
msgid "Before cart form"
msgstr "Antes do formulário do carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
#, fuzzy
msgid "After cart form"
msgstr "Após o formulário do carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "Antes da grade do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "Após a meta do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr "Antes da Descrição do Produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Após Descrição do Produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
#, fuzzy
msgid "After product image"
msgstr "Imagem pós-produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
#, fuzzy
msgid "Custom hook"
msgstr "Gancho personalizado"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
#, fuzzy
msgid "Extra Options placement custom hook"
msgstr "Gancho personalizado de posicionamento de opções extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
#, fuzzy
msgid "Extra Options placement hook priority"
msgstr "Prioridade do gancho de posicionamento de opções extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
#, fuzzy
msgid "Select the Extra Options placement hook priority"
msgstr "Selecione a prioridade do gancho de posicionamento Opções Extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
#, fuzzy
msgid "Totals box placement"
msgstr "Colocação da caixa de totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
#, fuzzy
msgid "Select where you want the Totals box to appear."
msgstr "Selecione onde você deseja que a caixa Totais apareça."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
#, fuzzy
msgid "Totals box placement custom hook"
msgstr "Gancho personalizado de colocação da caixa de totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
#, fuzzy
msgid "Totals box placement hook priority"
msgstr "Total de prioridade de gancho de colocação da caixa"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
#, fuzzy
msgid "Select the Totals box placement hook priority"
msgstr "Selecione a prioridade do gancho de posicionamento da caixa Totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
#, fuzzy
msgid "This will enable a floating box to display your totals box."
msgstr "Isso permitirá que uma caixa flutuante exiba sua caixa de totais."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "Inferior Direito"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "Inferior esquerdo"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "Topo direito"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "Topo esquerdo"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
#, fuzzy
msgid "Floating Totals box visibility"
msgstr "Visibilidade da caixa de Totais Flutuantes"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
#, fuzzy
msgid "This determines the floating totals box visibility."
msgstr "Isso determina a visibilidade da caixa de totais flutuantes."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "Sempre visível"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "Visível após rolar a página"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
#, fuzzy
msgid "Hide after scrolling the page"
msgstr "Ocultar depois de rolar a página"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
#, fuzzy
msgid "Pixels amount needed to scroll"
msgstr "Quantidade de pixels necessários para rolar"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
#, fuzzy
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Selecione o número de pixels que a página precisa rolar para que os totais "
"flutuantes fiquem visíveis."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
#, fuzzy
msgid "Add to cart button on floating totals box"
msgstr "Botão Adicionar ao carrinho na caixa de totais flutuantes"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
#, fuzzy
msgid "Display the add to cart button on floating box."
msgstr "Exiba o botão Adicionar ao carrinho na caixa flutuante."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr "Alterar o preço do produto original"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
#, fuzzy
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Marque para substituir o preço original do produto quando o preço estiver "
"mudando."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
#, fuzzy
msgid "Change variation price"
msgstr "Alterar preço de variação"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
#, fuzzy
msgid "Check to overwrite the variation price when the price is changing."
msgstr ""
"Marque para substituir o preço de variação quando o preço estiver mudando."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr "Forçar opções de seleção"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
#, fuzzy
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Isso altera o botão Adicionar ao carrinho nas páginas de loja e arquivo para "
"exibir opções selecionadas quando o produto tiver opções extras de produto. "
"Habilitar isso removerá a funcionalidade ajax."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
#, fuzzy
msgid "Enable extra options in shop and category view"
msgstr "Habilitar opções extras no modo de exibição de loja e categoria"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
#, fuzzy
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Marque para ativar a exibição de opções extras na página da loja e na "
"visualização de categoria. Essa configuração é dependente do tema e alguns "
"aspectos podem não funcionar conforme o esperado."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
#, fuzzy
msgid "Remove Free price label"
msgstr "Remover etiqueta de preço gratuito"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
#, fuzzy
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Verifique para remover a etiqueta de preço gratuito quando o produto tiver "
"opções extras"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
#, fuzzy
msgid "Use progressive display on options"
msgstr "Usar exibição progressiva nas opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
#, fuzzy
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Habilitar isso ocultará as opções na página do produto até que o JavaScript "
"seja inicializado. Esta é uma configuração à prova de falhas e recomendamos "
"estar ativo."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "Atraso de animação"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
#, fuzzy
msgid "How long the animation will take in milliseconds"
msgstr "Quanto tempo a animação levará em milissegundos"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
#, fuzzy
msgid "Start Animation delay"
msgstr "Iniciar atraso de animação"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
#, fuzzy
msgid "The delay until the animation starts in milliseconds"
msgstr "O atraso até que a animação seja iniciada em milissegundos"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
#, fuzzy
msgid "Show quantity selector only for elements with a value"
msgstr "Mostrar seletor de quantidade somente para elementos com um valor"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
#, fuzzy
msgid "Check show quantity selector only for elements with a value."
msgstr ""
"Marque mostrar seletor de quantidade apenas para elementos com um valor."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr ""
"Ocultar o botão de adição ao carrinho até que um elemento seja escolhido"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
#, fuzzy
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Marque esta opção para mostrar o botão Adicionar ao carrinho somente quando "
"pelo menos uma opção estiver preenchida."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Ocultar o botão add-to-cart até que todos os elementos necessários sejam "
"escolhidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Marque isso para mostrar o botão Adicionar ao carrinho somente quando todas "
"as opções visíveis necessárias estiverem preenchidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Ocultar o botão add-to-cart até que todos os elementos sejam escolhidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Marque esta opção para mostrar o botão Adicionar ao carrinho somente quando "
"todas as opções visíveis estiverem preenchidas."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "Mostrar rótulo de largura total para elementos."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
#, fuzzy
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Marque isso para forçar os elementos a serem de largura total em vez de "
"automático."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
#, fuzzy
msgid "Show choice description inline."
msgstr "Mostrar a descrição da escolha embutida."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
#, fuzzy
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Marque isso para desativar a exibição da descrição como uma dica de "
"ferramenta e mostrá-la embutida."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
#, fuzzy
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Ocultar rótulo de escolha ao usar a configuração Mostrar dica de ferramenta "
"para botões de opção e caixas de seleção"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Marque isso para ocultar o rótulo de escolha ao usar a configuração Mostrar "
"dica de ferramenta para botões de opção e caixas de seleção."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "Ocultar automaticamente o preço se zero"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
#, fuzzy
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Verifique isso para ocultar globalmente a exibição do preço se for zero."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "Cortar zeros nos preços"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
#, fuzzy
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Verifique isso para reduzir globalmente zero nos preços. Isso também será "
"aplicado aos preços nativos do WooCommerce."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
#, fuzzy
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Ocultar html de preço do elemento quando a configuração de preço oculta "
"estiver habilitada"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
#, fuzzy
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Verifique isso se você usa o Google Merchant Center. Ele ocultará o html de "
"preço do elemento quando você habilitar sua configuração de preço de "
"ocultação."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr ""
"Utilize informações traduzidas quando possível no pedido do Administrador"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"Por favor, note que, se as opções na alterar a ordem ou ficar excluído você "
"vai obter resultados errados ao permitir isso!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
#, fuzzy
msgid "Include option pricing in product price"
msgstr "Incluir preços de opções no preço do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
#, fuzzy
msgid "Check this to include the pricing of the options to the product price."
msgstr "Verifique isso para incluir o preço das opções ao preço do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
#, fuzzy
msgid "Check for empty product price"
msgstr "Verifique o preço do produto vazio"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
#, fuzzy
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Verifique isso para ter o plugin definido para zerar o preço do produto "
"quando ele estiver vazio."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr ""
"Use a seqüência de caracteres \"De\" sobre os preços do produto exibido"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Verificar isto para alterar a exibição de preço de um produto quando ele tem "
"opções extras com preços."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
#, fuzzy
msgid "Alter generated product structured data"
msgstr "Alterar dados estruturados de produtos gerados"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
#, fuzzy
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Altera os dados estruturados do produto gerados. Isso pode produzir "
"resultados errados se as opções usarem lógica condicional!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "Estrutura de opções responsivas"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
#, fuzzy
msgid "Enable this if you want the options to have responsive display."
msgstr "Habilite isso se quiser que as opções tenham exibição responsiva."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr "Desativar carrinho persistente"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr "Ative isto se o produto tiver muitas opções."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr "Botão Limpar carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr "Habilita ou desabilita o botão limpar carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
#, fuzzy
msgid "Cart Field Display"
msgstr "Exibição de campo do carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
#, fuzzy
msgid "Select how to display your fields in the cart"
msgstr "Selecione como exibir seus campos no carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr "Exibição normal"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "Exibir um link pop-up"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr "Visualização avançada"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr "Ocultar opções extras no carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr "Ativa ou desativa a exibição das opções no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
msgid "Hide extra addon prices in cart and checkout"
msgstr "Ocultar URL do arquivo de upload no carrinho e checkout"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
#| msgid "Enables or disables the display of options in the cart."
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Ativa ou desativa a exibição das opções no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr "Impede produtos com preços negativos"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr "Impedir adição ao carrinho de produtos com preços negativos."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
#, fuzzy
msgid "Prevent zero priced products"
msgstr "Evite produtos com preço zero"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
#, fuzzy
msgid "Prevent adding to the cart zero priced products."
msgstr "Evite adicionar ao carrinho produtos com preço zero."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
#, fuzzy
msgid "Hide checkbox element average price"
msgstr "Ocultar preço médio do elemento da caixa de seleção"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
#, fuzzy
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Isso ocultará a exibição do preço médio no carrinho para caixas de seleção."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr "Mostrar substituição de imagem no carrinho e check-out"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Ativar isso mostrará as imagens de produtos que tem substitutos de imagem."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
#, fuzzy
msgid "Hide upload file URL in cart and checkout"
msgstr "Ocultar URL do arquivo de upload no carrinho e checkout"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
#, fuzzy
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Ativar isso ocultará a URL de qualquer arquivo carregado enquanto estiver no "
"carrinho e no checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
#, fuzzy
msgid "Show uploaded image in cart and checkout"
msgstr "Mostrar imagem carregada no carrinho e checkout"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
#, fuzzy
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr "Ativar isso mostrará as imagens carregadas no carrinho e no checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Largura máxima de imagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr "Defina a largura máxima das imagens que aparecem no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
#, fuzzy
msgid "Maximum image height"
msgstr "Altura máxima da imagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
#, fuzzy
msgid "Set the maximum height of the images that appear on cart."
msgstr "Defina a altura máxima das imagens que aparecem no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
#, fuzzy
msgid "Always use unique values on cart for elements"
msgstr "Sempre use valores exclusivos no carrinho para elementos"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
#, fuzzy
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"Habilitar isso separará os valores separados por vírgulas para os elementos. "
"Isso é usado principalmente para várias opções de caixa de seleção."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
#, fuzzy
msgid "Post types to show the saved options"
msgstr "Tipos de postagem para mostrar as opções salvas"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Selecione os tipos de postagem onde o plugin modificará a tela de ordem de "
"edição para mostrar as opções salvas. Você pode digitar seu tipo de postagem "
"personalizada."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
#, fuzzy
msgid "Strip html from emails"
msgstr "Remover html de e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
#, fuzzy
msgid "Check to strip the html tags from emails"
msgstr "Verifique para remover as tags html dos e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
#, fuzzy
msgid "Legacy meta data"
msgstr "Metadados herdados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
#, fuzzy
msgid "Check to enable legacy meta data functionality."
msgstr "Verifique para habilitar a funcionalidade de metadados herdados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
#, fuzzy
msgid "Unique meta values"
msgstr "Metavalores exclusivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
#, fuzzy
msgid "Check to split items with multiple values to unique lines."
msgstr "Marque para dividir itens com vários valores em linhas exclusivas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr "Evitar as opções de serem enviados para e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr "Seleção para desabilitar as opções de serem enviados para e-mails."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
#, fuzzy
msgid "Disable sending the options upon saving the order"
msgstr "Desativar o envio das opções ao salvar o pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
#, fuzzy
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Habilite isso se você estiver recebendo um erro 500 ao tentar concluir o "
"pedido no checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
#, fuzzy
msgid "Attach upload files to emails"
msgstr "Anexar arquivos de upload a e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
#, fuzzy
msgid "Check to Attach upload files to emails."
msgstr "Marque para Anexar arquivos de upload para e-mails."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
#, fuzzy
msgid "Disable Options on Order status change"
msgstr "Desativar opções na alteração do status do pedido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
#, fuzzy
msgid "Check this only if you are getting server errors on checkout."
msgstr ""
"Verifique isso somente se você estiver recebendo erros de servidor no check-"
"out."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
#, fuzzy
msgid "Hide upload file URL in order"
msgstr "Ocultar o URL do arquivo de upload na ordem"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
#, fuzzy
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Habilitar isso ocultará a URL de qualquer arquivo carregado enquanto estiver "
"em ordem."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
msgid "Show uploaded image in order"
msgstr "Mostrar imagem carregada no carrinho e checkout"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
msgid "Enabling this will show the uploaded images in order."
msgstr "Ativar isso mostrará as imagens carregadas no carrinho e no checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "Rótulo de campo/separador de valor"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Insira o caractere que será usado para separar os rótulos de campo dos "
"valores de campo no carrinho e na ordem."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "Separador de vários valores de campo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Insira a cadeia de caracteres que será usada para separar vários valores "
"para um campo que permite várias seleções no carrinho e na ordem."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
#, fuzzy
msgid "Update cart text"
msgstr "Atualizar texto do carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
#, fuzzy
msgid "Enter the Update cart text when you edit a product."
msgstr "Insira o texto Atualizar carrinho ao editar um produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr "Editar Opções de substituição de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr "Insira um texto para substituir o texto Editar opções no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr "Substituição de texto de Opções Adicionais"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Insira um texto para substituir o texto opções adicionais ao usar o pop-up "
"de ajuste no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr "Substituição de texto do botão Fechar"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Insira um texto para substituir o texto do botão Fechar ao usar o pop-up de "
"configurações no carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Texto Carrinho vazio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr "Insira um texto para substituir o texto tecla do carro vazio."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "Texto de total final"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr "Digite o texto Final total ou deixar em branco por padrão."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
#, fuzzy
msgid "Unit price text"
msgstr "Texto do preço unitário"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
#, fuzzy
msgid "Enter the Unit price text or leave blank for default."
msgstr "Insira o texto Preço unitário ou deixe em branco por padrão."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr "Texto de Opções total"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
#, fuzzy
msgid "Enter the Options total text or leave blank for default."
msgstr "Insira o texto total de Opções ou deixe em branco por padrão."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "Opções de texto total do IVA"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr "Insira o texto total Opções IVA ou deixe em branco por padrão."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
#, fuzzy
msgid "Fees total text"
msgstr "Texto total das taxas"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
#, fuzzy
msgid "Enter the Fees total text or leave blank for default."
msgstr "Insira o texto Total de taxas ou deixe em branco por padrão."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr "Substituição de texto de Grátis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Insira um texto para substituir o rótulo Grátis quando o produto tiver "
"opções extras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr "Forçar a Seleção das Opções Extras (acréscimos)"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Insira um texto para substituir o suplemento ao carrinho texto do botão "
"quando utilizar o selecione a opção Force."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
#, fuzzy
msgid "No zero priced products text"
msgstr "Nenhum texto de produtos com preço zero"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Insira um texto para substituir a mensagem ao tentar adicionar um produto "
"com preço zero ao carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
#, fuzzy
msgid "No negative priced products text"
msgstr "Nenhum texto de produtos com preço negativo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr ""
"Insira um texto para substituir a mensagem ao tentar adicionar um produto "
"com preço negativo ao carrinho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
#, fuzzy
msgid "Popup section button text replacement"
msgstr "Substituição de texto do botão da seção pop-up"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Insira um texto para substituir o texto do botão de seção de recarga. "
"Definir isso como %s fará com que o texto do botão tenha o título da seção."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Abrir"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr "Substituição de texto de Reiniciar as opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Insira um texto para substituir as opções de Reiniciar texto quando estiver "
"utilizando variações específicas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "Redefinir opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr "Substituição de texto do botão Fechar do Calendário"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr "Insira um texto para substituir o texto do botão Fechar no calentário."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr "Substituição de texto do botão Hoje do calendário"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr "Insira um texto para substituir o botão texto Hoje  no calendário."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr "Slider texto anterior"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr ""
"Insira um texto para substituir o texto do botão anterior para controle "
"deslizante."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr "Slider próximo texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr ""
"Insira um texto para substituir o seguinte texto do botão de controle "
"deslizante."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr "Este campo é obrigatório"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
#, fuzzy
msgid "Enter a text to indicate that a field is required."
msgstr "Insira um texto para indicar que um campo é obrigatório."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "Caracteres restantes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
#, fuzzy
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Insira um texto para substituir o texto restante de Caracteres ao usar o "
"máximo de caracteres em um campo de texto ou em uma área de texto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
#, fuzzy
msgid "Uploading files text"
msgstr "Carregando texto de arquivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
#, fuzzy
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Insira um texto para substituir o texto Carregando arquivos usado no pop-up "
"depois de clicar no botão Adicionar ao carrinho quando houver campos de "
"carregamento."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
#, fuzzy
msgid "Uploading message text"
msgstr "Carregando texto da mensagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
#, fuzzy
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Insira uma mensagem a ser usada no pop-up depois de clicar no botão "
"adicionar ao carrinho quando houver campos de carregamento."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
#, fuzzy
msgid "Select file text"
msgstr "Selecionar texto do arquivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Insira um texto para substituir o botão Selecionar texto do arquivo usado no "
"botão de carregamento estilizado."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Selecione o arquivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "Texto de arquivo único"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Insira um texto para substituir o texto do arquivo usado no botão de "
"carregamento com estilo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "Texto de vários arquivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Insira um texto para substituir o texto dos arquivos usado no botão de "
"carregamento estilizado."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
#, fuzzy
msgid "Add button text on associated products"
msgstr "Adicionar texto de botão em produtos associados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
#, fuzzy
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Insira um texto para substituir o texto do botão Adicionar em produtos "
"associados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Adicionar"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
#, fuzzy
msgid "Remove button text on associated products"
msgstr "Remover texto do botão em produtos associados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Insira um texto para substituir o texto do botão remover em produtos "
"associados."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Remover"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
#, fuzzy
msgid "Repeater add text"
msgstr "Repetidor adicionar texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
#, fuzzy
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Insira um texto para substituir o botão Adicionar texto para campos "
"repetidores."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr "Ativar estilos checkbox e radio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""
"Habilita ou desabilita o estilo extra para caixas de seleção e botões de "
"rádio."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
#, fuzzy
msgid "Select a style for the checkboxes and radio buttons"
msgstr "Selecione um estilo para as caixas de seleção e botões de opção"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Redondo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "Round 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Quadrado"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "Quadrado 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
#| msgid "Select item border type"
msgid "Swatch border type"
msgstr "Tipo de borda Selecione o item"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Escolha um estilo para a borda selecionada ao usar substituições de imagem "
"ou amostras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Sombra"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr "Linha fina"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
#| msgid "Choose whether to hide the price or not."
msgid "Choose the border width for image or color swatches."
msgstr "Optar por ocultar o preço ou não."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Escolha um estilo para a borda selecionada ao usar substituições de imagem "
"ou amostras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Escolha um estilo para a borda selecionada ao usar substituições de imagem "
"ou amostras."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Visual"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Página do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Idioma local"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Preços"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr "Habilitar a validação"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr "Verifique para ativar o recurso de validação para elementos construtor"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
#, fuzzy
msgid "Disable error scrolling"
msgstr "Desativar rolagem de erro"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr "Verifique para desativar a rolagem para o elemento com um erro"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
#, fuzzy
msgid "Error label placement"
msgstr "Posicionamento de rótulo de erro"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
#, fuzzy
msgid "Set the placement for the validation error notification label"
msgstr ""
"Definir o posicionamento para o rótulo de notificação de erro de validação"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
#, fuzzy
msgid "After the element"
msgstr "Após o elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
#, fuzzy
msgid "Before the element"
msgstr "Antes do elemento"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
#, fuzzy
msgid "Use options cache"
msgstr "Usar cache de opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
#, fuzzy
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Use o cache de opções para aumentar o desempenho. Desative se você tiver "
"opções que compartilham a mesma ID exclusiva."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
#, fuzzy
msgid "Javascript and CSS inclusion mode"
msgstr "Modo de inclusão de Javascript e CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
#, fuzzy
msgid "Select how to include JS and CSS files"
msgstr "Selecione como incluir arquivos JS e CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
#, fuzzy
msgid "Single minified file"
msgstr "Arquivo único minimizado"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
#, fuzzy
msgid "Multiple minified files"
msgstr "Vários arquivos minimizados"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
#, fuzzy
msgid "DEV - multiple files"
msgstr "DEV - vários arquivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
#, fuzzy
msgid "Disable PNG convert security"
msgstr "Desativar a segurança de conversão PNG"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
#, fuzzy
msgid "Check to disable the conversion to png for image uploads."
msgstr "Marque para desativar a conversão para png para uploads de imagens."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
#, fuzzy
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Isso substituirá globalmente o preço do produto pelo preço das opções se o "
"preço total das opções for maior que zero."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
#, fuzzy
msgid "Use setting on each product"
msgstr "Use a configuração em cada produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "Modo de preço de opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "Selecione o modo de preço para as opções."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "Use o preço de venda"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
#, fuzzy
msgid "Use regular price"
msgstr "Use o preço normal"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "Número máximo de combinações para calcualtions de preço"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Essa configuração controla o número máximo de combinações que o plugin usará "
"para calcular os preços mínimo e máximo. Um número maior de combinações "
"resultará em preços mais precisos, mas também levará mais tempo para calculá-"
"los. Para produtos que podem ter muitas combinações de escolha, recomenda-se "
"definir um número menor de combinações para melhorar o desempenho."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "O valor padrão é 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr ""
"Redefinir os valores de opção depois que o produto é adicionado ao carrinho "
"de"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
#, fuzzy
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Isso reverterá os valores de opção para os valores padrão depois de "
"adicionar o produto ao carrinho"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
#, fuzzy
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "Use sinais de mais e menos nos preços no carrinho e no checkout"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Escolha como você deseja que o sinal de preços de opções seja exibido no "
"carrinho e no checkout."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
#, fuzzy
msgid "Display both signs"
msgstr "Exibir ambos os sinais"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
#, fuzzy
msgid "Display only minus sign"
msgstr "Exibir apenas sinal de subtração"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
#, fuzzy
msgid "Use plus and minus signs on option prices"
msgstr "Use sinais de mais e menos nos preços das opções"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Escolha como você deseja que o sinal de preços de opções seja exibido na "
"página do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr "Separador decimal de entrada"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
#, fuzzy
msgid "Choose how to determine the decimal separator for user inputs"
msgstr "Escolher como determinar o separador decimal para entradas do usuário"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "Use valor WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr "Determine pelo navegador local"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr "Exibido separador decimal"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
#, fuzzy
msgid "Choose which decimal separator to display on currency prices"
msgstr "Escolha qual separador decimal exibir nos preços das moedas"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "Substituição de fuso horário para o elemento Date"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Escolha qual %s o elemento de data usará nos cálculos de back-end ou deixe "
"em branco para o fuso horário do servidor."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr "fuso horário"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr "Indicador de estado obrigatório"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr "Introduza uma cadeia para indicar o estado necessário de um campo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr "Posição do indicador de estado necessárias"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
#, fuzzy
msgid "Select the placement of the Required state indicator"
msgstr "Selecione o posicionamento do indicador Estado obrigatório"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr "Esquerda da etiqueta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr "Direita da etiqueta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr "Incluir sufixo cadeia tributária na caixa totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
#, fuzzy
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""
"Habilite isso para adicionar o sufixo de imposto do WooCommerce na caixa de "
"totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
#, fuzzy
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr "Incluir o sufixo de exibição Preço do WooCommerce na caixa de totais"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Habilite isso para adicionar o sufixo de exibição Preço do WooCommerce na "
"caixa de totais."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
#, fuzzy
msgid "jQuery selector for main product image"
msgstr "jQuery seletor para imagem principal do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
#, fuzzy
msgid "This is used to change the product image."
msgstr "Isso é usado para alterar a imagem do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
#, fuzzy
msgid "Product image replacement mode"
msgstr "Modo de substituição da imagem do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"O modo automático substitui a imagem real e o Inline acrescenta novos "
"elementos de imagem."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
#, fuzzy
msgid "Self mode"
msgstr "Modo próprio"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
#, fuzzy
msgid "Inline mode"
msgstr "Modo embutido"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
#, fuzzy
msgid "Move out of stock message"
msgstr "Mensagem de saída de estoque"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Isso move a mensagem de fora de estoque quando variações estilizadas são "
"usadas logo abaixo delas."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
#, fuzzy
msgid "Use internal variation price"
msgstr "Usar preço de variação interna"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Habilite isso se seus produtos variáveis tiverem muitas opções para melhorar "
"o desempenho. Observe que isso pode causar problemas com plug-ins de "
"desconto ou moeda."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "Ativar a interface de back-end do plugin"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Selecione as funções que terão acesso às configurações do plug-in e à "
"interface do plug-in enquanto estiver na página do produto de edição. A "
"função Admininstrator sempre tem acesso."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
#, fuzzy
msgid "Hide override settings on products"
msgstr "Ocultar configurações de substituição em produtos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
#, fuzzy
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Habilite isso para ocultar a guia Configurações na tela de edição do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
#, fuzzy
msgid "Hide Builder mode on products"
msgstr "Ocultar o modo Builder em produtos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
#, fuzzy
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Habilite isso para ocultar a guia do construtor na tela de edição do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
#, fuzzy
msgid "Hide Normal mode on products"
msgstr "Ocultar o modo Normal nos produtos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
#, fuzzy
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr "Habilite isso para ocultar a guia normal na tela de edição do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "Ativar WP Rocket CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Verifique para ativar o uso do WP Rocket cdn para as imagens do plugin se "
"ele estiver ativo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "Ativar CDN Jetpack"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Verifique para ativar o uso do Jetpack cdn para as imagens do plugin se ele "
"estiver ativo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Caixa de seleção"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Datas"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr "Largura máxima da Tooltip"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
#, fuzzy
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""
"Defina a largura máxima da dica de ferramenta que aparece nos elementos."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
#, fuzzy
msgid "Image mode"
msgstr "Modo de imagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
#, fuzzy
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Defina o modo de imagem que será usado para várias funcionalidades "
"relacionadas à imagem."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr "URL absoluta"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
#, fuzzy
msgid "Relative URL"
msgstr "URL relativa"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "Recalcular imagem em caso de alterações"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Isso é necessário em várias soluções de galeria que alteram o html da imagem "
"dinamicamente ou se você deseja controlar a imagem dinamicamente."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
#, fuzzy
msgid "Retrieve image sizes for image replacements"
msgstr "Recuperar tamanhos de imagem para substituições de imagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr ""
"Desative isso para servidores lentos ou grandes quantidades de imagens."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "Mostrar quantidade 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Habilite para mostrar a cadeia de caracteres de quantidade mesmo quando a "
"quantidade for 1 e quando o seletor de quantidade estiver habilitado."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
#, fuzzy
msgid "Show prices inside select box choices"
msgstr "Mostrar preços dentro das opções de caixa selecionada"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Marque isso para mostrar o preço das opções da caixa de seleção se o tipo de "
"preço for fixo."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
#, fuzzy
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr ""
"Mostrar preços dentro das opções de caixa de seleção, mesmo que os preços "
"estejam ocultos"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Marque isso para mostrar o preço das opções da caixa de seleção se o tipo de "
"preço for fixo e mesmo se o elemento ocultar o preço."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
#, fuzzy
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""
"Multiplique os preços dentro das opções de caixa de seleção com seu seletor "
"de quantidade"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
#, fuzzy
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Marque isso para multiplicar os preços das opções da caixa de seleção com "
"seu seletor de quantidade, se houver."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr "Rádio botão botão undo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
#, fuzzy
msgid "Globally override the undo button for radio buttons"
msgstr "Substituir globalmente o botão de desfazer para botões de opção"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr "Valor do campo"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "Tema de selecionador de data"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "Datepicker tamanho"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "Posição datepicker"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
#, fuzzy
msgid "Minimum characters for text-field and text-areas"
msgstr "Caracteres mínimos para campo de texto e áreas de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
#, fuzzy
msgid "Maximum characters for text-field and text-areas"
msgstr "Máximo de caracteres para campo de texto e áreas de texto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
#, fuzzy
msgid "Upload element inline Image preview"
msgstr "Carregar elemento embutido Visualização de imagem"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
#, fuzzy
msgid "Enable inline preview of the image that will be uploaded."
msgstr "Habilite a visualização embutida da imagem que será carregada."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
#, fuzzy
msgid "Scroll to the product element upon selection"
msgstr "Role até o elemento do produto após a seleção"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
#, fuzzy
msgid "Enable to scroll the viewport to the product element."
msgstr "Habilite para rolar o visor até o elemento do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
#, fuzzy
msgid "Product element scroll offset"
msgstr "Deslocamento de rolagem do elemento do produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
#, fuzzy
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Insira um valor para o deslocamento de rolagem ao selecionar uma opção para "
"o elemento de produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
#, fuzzy
msgid "Sync associated product quantity with main product quantity"
msgstr ""
"Sincronizar a quantidade de produto associada com a quantidade principal do "
"produto"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
#, fuzzy
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Permitir que as quantidades dos produtos associados sejam um múltiplo da "
"quantidade principal do produto."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Nome de usuário"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr "Nome de usuário do Envato."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
#, fuzzy
msgid "Envato Personal Token"
msgstr "Token pessoal da Envato"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "Você pode gerar um Envato Personal Token %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "clicando neste link"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Código de Compra"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "Para acessar o código de compra para um item %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr "clique nesse link"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Desativar Licença"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Ativar Licença"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "Licença ativada."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Consentimento"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
#, fuzzy
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Concordo que os dados da licença serão transmitidos ao servidor de licenças."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
#, fuzzy
msgid "Use allowed file types from WordPress"
msgstr "Usar tipos de arquivo permitidos do WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
#, fuzzy
msgid "Enable File manager"
msgstr "Ativar o Gerenciador de arquivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Pasta de Amostras"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "Mudar isso só vai afetar futuros carregamentos."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
#, fuzzy
msgid "Enable pop-up message on uploads"
msgstr "Ativar mensagem pop-up em uploads"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
#, fuzzy
msgid "Enables a pop-up when uploads are made."
msgstr "Habilita um pop-up quando os uploads são feitos."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
#, fuzzy
msgid "Enable upload success message"
msgstr "Habilitar mensagem de sucesso de upload"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
#, fuzzy
msgid "Indicates if the upload was successful with a message."
msgstr "Indica se o carregamento foi bem-sucedido com uma mensagem."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Tipos de arquivo permitidos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
#, fuzzy
msgid "Select which file types the user will be allowed to upload."
msgstr ""
"Selecione quais tipos de arquivo o usuário terá permissão para carregar."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
#, fuzzy
msgid "Select file types"
msgstr "Selecionar tipos de arquivo"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
#, fuzzy
msgid "Custom types"
msgstr "Tipos personalizados"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
#, fuzzy
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Selecione os tipos de arquivo personalizados que o usuário terá permissão "
"para carregar separados por vírgulas."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr "Gerenciador de arquivos"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr "Código CSS"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
#, fuzzy
msgid "Only enter pure CSS code without and style tags"
msgstr "Insira apenas código CSS puro sem e tags de estilo"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr "Código JavaScript"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
#, fuzzy
msgid "Only enter pure JavaScript code without and script tags"
msgstr "Insira apenas código JavaScript puro sem tags e script"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
#, fuzzy
msgid "Add Constant"
msgstr "Adicionar constante"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr "Erro ao conectar servidor!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr "Erro ao obter dados do servidor!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
#, fuzzy
msgid "License activated!"
msgstr "Licença ativada!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr "Licença desativado!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Ação invalida."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
#, fuzzy
msgid "Please fill all fields before trying to activate."
msgstr "Por favor, preencha todos os campos antes de tentar ativar."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr "Tentando ativar fora da interface do plug-in não é permitido!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr "Erro ao ligar ao Envato API. Por favor tente de novo mais tarde."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
#, fuzzy
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr "Tentando ativar com um código de compra inválido para o seu token!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
#, fuzzy
msgid "Envato rate limit exceeded! Please try again later."
msgstr "Limite de taxa Envato excedido! Tente novamente mais tarde."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Este nome de usuário não é válido para este código de compra item. Por "
"favor, certifique-se de que você inseriu o nome de usuário correto (case "
"sensitive)."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "Tentando ativar a partir de um domínio inválido!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
#, fuzzy
msgid "Trying to activate from an invalid IP address!"
msgstr "Tentando ativar a partir de um endereço IP inválido!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "O código de compra já está ativado!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr "O código de compra já está ativado em outro domínio!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
#, fuzzy
msgid "You have already activated that purchase code on another domain!"
msgstr "Você já ativou esse código de compra em outro domínio!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr ""
"O código de compra já está ativado! Por favor, compre uma licença válida!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr "Você já ativou o seu código de compra!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr "Desativado, mas o código de compra não foi ativado por algum motivo!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
#, fuzzy
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"Não é possível desativar. O código de compra não é válido para sua chave de "
"licença salva!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr "Não foi possível concluir do pedido!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
#, fuzzy
msgid "Downloading package from Envato market..."
msgstr "Baixando pacote do mercado Envato..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "Erro! Não é possível se conectar ao sistema de arquivos"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "To receive automatic updates license activation is required."
msgstr ""
"Para receber atualizações automáticas, é necessária a ativação da licença."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "Por favor, ative as Opções de Produtos Extras."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
#, fuzzy
msgid "Error! Envato API error"
msgstr "Erro! Erro da API do Envato"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
#, fuzzy
msgid "Error on unzipping package"
msgstr "Erro ao descompactar o pacote"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "Download new version from CodeCanyon"
msgstr "Baixe a nova versão do CodeCanyon"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr "ou registar-se o plug-in para receber atualizações automáticas."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Adicionar tradução para %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "Editar a tradução de %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Idioma"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, fuzzy, php-format
msgid "Language of this %s"
msgstr "Linguagem deste %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
#, fuzzy
msgid "This is a translation of"
msgstr "Esta é uma tradução de"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
#, fuzzy
msgid "Enable discounts on extra options"
msgstr "Ativar descontos em opções extras"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr "Tipo de preço base original de acordo com"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "Defina em quais tipos de preço basearão seu preço original."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Nenhuma mudança"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr "Preço do produto sem desconto"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr "Permitir a alteração da tabela de preços"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Verifique para permitir a inclusão de preços de opções na tabela de preços."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr "Etiqueta prefixo"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr "Mostrar uma etiqueta de prefixo na página do produto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "Etiqueta sufixo"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr "Mostrar um sufixo na página do produto."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr "Etiqueta seletora CSS"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Insira um seletor de CSS para substituir a etiqueta padrão onde a cadeia de "
"desconto será exibida."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr "Colocação de cordas com desconto"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr "Selecione a colocação do fio descontado em comparação com a etiqueta."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Depois"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Antes"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
#, fuzzy
msgid "Enable showing option prices in the Order"
msgstr "Ativar a exibição de preços de opções no Pedido"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
#, fuzzy
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Habilite isso por sua conta e risco, pois não é possível calcular descontos "
"de opções na página Pedido."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "Reservas: Multiplique custo por contagem pessoa"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr ""
"Permitir que isto vai multiplicar o preço de opções pela contagem de pessoa."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
#, fuzzy
msgid "Using booking setting"
msgstr "Usando a configuração de reserva"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "Reservas: Multiplicar o custo pela contagem por  bloco"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"Permitir que isto vai multiplicar o preço de opções pela contagem de bloco."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
#, fuzzy
msgid "Add option cost to booking display price"
msgstr "Adicionar custo de opção ao preço de exibição da reserva"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
#, fuzzy
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"Habilitar isso adicionará os preços da opção ao custo de reserva calculado."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr "Preços & Descontos Dinâmicos"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
#, fuzzy
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Habilitar isso aplicará os descontos de produtos às opções extras também."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "WooCommerce Easy Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
#, fuzzy
msgid "WooCommerce Measurement Calculator"
msgstr "Calculadora de Medição WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
#, fuzzy
msgid "Multiply options cost by area"
msgstr "Multiplique o custo das opções por área"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
#, fuzzy
msgid "Enabling this will multiply the options price by the calculated area."
msgstr "Habilitar isso multiplicará o preço das opções pela área calculada."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
#, fuzzy
msgid "Divide price with measurement"
msgstr "Dividir preço com medição"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr "Isto dividirá o preço original com a medida necessária."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "Assinaturas WooCommerce"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "Inclua addons no pedido novamente"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"Habilitar isso adicionará os complementos salvos à assinatura ao usar a "
"funcionalidade de pedido novamente manualmente."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr "Taxa de inscrição (%s)"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
msgid "sign-up fee"
msgstr "taxa de Inscrição"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr "e um"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "%1$s a cada %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
#, fuzzy
msgid "Subscription sign up fee text"
msgstr "Texto da taxa de inscrição"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
#, fuzzy
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Insira o texto Taxa de inscrição da assinatura ou deixe em branco por padrão."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
#, fuzzy
msgid "Sign up fee text"
msgstr "Texto da taxa de inscrição"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
#, fuzzy
msgid "Enter the Sign up fee text or leave blank for default."
msgstr "Insira o texto da taxa de inscrição ou deixe em branco por padrão."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
#, fuzzy
msgid "Subscription sign up fee"
msgstr "Taxa de inscrição"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr "Opções da Taxa de Inscrição"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "A quantidade para \"%1$s\" deve ser maior que %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""
"A quantidade de \"%s\" deve ser maior que 0 para ser adicionado para o "
"carrinho."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, fuzzy, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "Você só pode selecionar até %1$s opção para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, fuzzy, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "Você só pode selecionar até %1$s opções para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "Você deve selecionar exatamente %1$s opção para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, fuzzy, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "Você deve selecionar exatamente %1$s opções para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "Você deve selecionar pelo menos %1$s opção para %2$s."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, fuzzy, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "Você deve selecionar pelo menos %1$s opções para %2$s."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr "Data inválida informada!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "Dados inválidos apresentado!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr "Data inválido inserido ano!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr "Você não pode selecionar essa data!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(tamanho máximo de arquivo %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr "%s não é um arquivo de imagem válido!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Enviado com Sucesso"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, fuzzy, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "Você deve inserir pelo menos %1$s caracteres para \"%2$s\"."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "Não é possível inserir mais de %1$s caracteres para \"%2$s\"."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Todos"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "Usuários logados"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr "Echo uma ação personalizada"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr "Ação personalizada EPO"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Título:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr "Ação personalizada:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s não existe."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "Aguardando imagem do produto"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/D"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "Limpar"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Qtd"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Escolha uma opção"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#~ msgid "Hide extra options prices in cart"
#~ msgstr "Esconder os preços das opções no carrinho"

#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr "Ativa ou desativa a exibição de preços de opções no carrinho."

#, fuzzy
#~ msgid "Show bottom"
#~ msgstr "Mostrar parte inferior"

#, fuzzy
#~ msgid "Show inside"
#~ msgstr "Mostrar dentro"

#, fuzzy
#~ msgid "Disable categories"
#~ msgstr "Desativar categorias"

#~ msgid "Submit for Review"
#~ msgstr "Enviar para revisão"

#, fuzzy
#~ msgid "Show Both Final and Options total box"
#~ msgstr "Mostrar caixa total Final e Opções"

#, fuzzy
#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "Mostrar caixa Final e ocultar Opções se zero"

#, fuzzy
#~ msgid "Hide Final total box"
#~ msgstr "Ocultar caixa total final"

#, fuzzy
#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Sempre mostrar apenas o total final (Preço x Quantidade)"

#, fuzzy
#~ msgid "Disable but change product prices"
#~ msgstr "Desativar, mas alterar os preços dos produtos"

#, fuzzy
#~ msgid "Select when to show the final total box"
#~ msgstr "Selecione quando mostrar a caixa total final"

#, fuzzy
#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "Mostrar total final e ocultar Total de opções se zero"
languages/woocommerce-tm-extra-product-options-nl_NL.po000064400001102702150755142440017311 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:53+0200\n"
"PO-Revision-Date: 2024-03-07 11:53+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Extra Product Opties"

#: admin/class-themecomplete-epo-admin-base.php:642
#, fuzzy
msgid "Extra Product Options Fees"
msgstr "Kosten voor extra productopties"

#: admin/class-themecomplete-epo-admin-base.php:697
#, fuzzy
msgid "View Extra Product Options settings"
msgstr "Instellingen voor extra productopties weergeven"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Instellingen"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
#, fuzzy
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Extra productopties en add-ons voor WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Meer informatie over %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Bekijk details"

#: admin/class-themecomplete-epo-admin-base.php:723
#, fuzzy
msgid "View Extra Product Options documentation"
msgstr "Documentatie over extra productopties bekijken"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Documentatie"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "Bezoek de premium klantenservice"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Premium Support"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Kopie)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Variatie nr. %1$s van %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
#, fuzzy
msgid "There are no saved variations yet."
msgstr "Er zijn nog geen opgeslagen variaties."

#: admin/class-themecomplete-epo-admin-base.php:1235
#, fuzzy
msgid "You cannot add any more extra options."
msgstr "Je kunt geen extra opties meer toevoegen."

#: admin/class-themecomplete-epo-admin-base.php:1236
#, fuzzy
msgid "Are you sure you want to remove this option?"
msgstr "Weet u zeker dat u deze optie wilt verwijderen?"

#: admin/class-themecomplete-epo-admin-base.php:1237
#, fuzzy
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Voordat u extra productopties toevoegt, voegt u enkele kenmerken toe en "
"slaat u deze op het tabblad Kenmerken op."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Vast bedrag"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
#, fuzzy
msgid "Percent of the original price"
msgstr "Percentage van de oorspronkelijke prijs"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "Fout"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "Ongeldige aanvraag!"

#: admin/class-themecomplete-epo-admin-base.php:1276
#, fuzzy
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr "Weet u zeker dat u deze map en alle inhoud ervan wilt verwijderen?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "Weet u zeker dat u dit bestand wilt verwijderen?"

#: admin/class-themecomplete-epo-admin-base.php:1279
#, fuzzy
msgid "Are you sure you want to reset the settings?"
msgstr "Weet je zeker dat je de instellingen wilt resetten?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Ja"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "Nee"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Annuleren"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Sluiten"

#: admin/class-themecomplete-epo-admin-base.php:1284
#, fuzzy
msgid "Constant name"
msgstr "Constante naam"

#: admin/class-themecomplete-epo-admin-base.php:1285
#, fuzzy
msgid "Constant value"
msgstr "Constante waarde"

#: admin/class-themecomplete-epo-admin-base.php:1286
#, fuzzy
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Vink het selectievakje Toestemming aan om uw toestemming te geven om uw "
"gegevens naar de server te verzenden en probeer het opnieuw."

#: admin/class-themecomplete-epo-admin-base.php:1287
#, fuzzy
msgid "Connecting to activation server ..."
msgstr "Verbinding maken met activeringsserver ..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, fuzzy, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Extra productoptie #%1$s van %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
#, fuzzy
msgid "Could not update post in the database"
msgstr "Kon bericht in de database niet bijwerken"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
#, fuzzy
msgid "Enable points display?"
msgstr "Puntenweergave inschakelen?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
#, fuzzy
msgid "This allows you to generate points along the range picker."
msgstr "Hiermee kunt u punten genereren langs de rangepicker."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
#, fuzzy
msgid "Number of points"
msgstr "Aantal punten"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
#, fuzzy
msgid "Enter the number of values for the points display."
msgstr "Voer het aantal waarden voor de puntenweergave in."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Linkerkant"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Rechterkant"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
#, fuzzy
msgid "Tooltip and Left side"
msgstr "Tooltip en linkerkant"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
#, fuzzy
msgid "Tooltip and Right side"
msgstr "Tooltip en rechterkant"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
#, fuzzy
msgid "Show value on"
msgstr "Toon waarde op"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
#, fuzzy
msgid "Select how to show the value of the range picker."
msgstr "Selecteer hoe u de waarde van de bereikkiezer wilt weergeven."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "Stapwaarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "Voer de stap in voor de handeling."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Geen controle"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "E-mail"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "Url"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Nummer"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Cijfers"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "Alleen letters (A-Z)"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
#, fuzzy
msgid "Letters or Space only"
msgstr "Alleen letters of spatie"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Alfanumeriek"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
#, fuzzy
msgid "Alphanumeric Unicode"
msgstr "Alfanumerieke Unicode"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
#, fuzzy
msgid "Alphanumeric Unicode or Space"
msgstr "Alfanumerieke Unicode of spatie"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
#, fuzzy
msgid "Validate as"
msgstr "Valideren als"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
#, fuzzy
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Kies of het veld wordt gevalideerd aan de hand van de gekozen methode."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr "Verplicht"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
#, fuzzy
msgid "Choose whether the user must fill out this field or not."
msgstr "Kies of de gebruiker dit veld moet invullen of niet."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Ingeschakeld"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
#, fuzzy
msgid "Choose whether the option is enabled or not."
msgstr "Kies of de optie is ingeschakeld of niet."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Prijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
#, fuzzy
msgid "Enter the price for this field or leave it blank for no price."
msgstr "Voer de prijs voor dit veld in of laat het leeg voor geen prijs."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Verkoopprijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
#, fuzzy
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Voer de verkoopprijs voor dit veld in of laat het leegom de standaardprijs "
"te gebruiken."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
#, fuzzy
msgid "Text after Price"
msgstr "Tekst na de prijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
#, fuzzy
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Voer een tekst in die na de prijs voor dit veld moet worden weergegeven of "
"laat deze leeg voor geen tekst."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
#, fuzzy
msgid "Text before Price"
msgstr "Tekst voor prijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
#, fuzzy
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Voer een tekst in die vóór de prijs voor dit veld moet worden weergegeven of "
"laat deze leeg voor geen tekst."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
#, fuzzy
msgid "Percent of the original price + options"
msgstr "Percentage van de oorspronkelijke prijs + opties"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
#, fuzzy
msgid "Price per word"
msgstr "Prijs per woord"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
#, fuzzy
msgid "Percent of the original price per word"
msgstr "Percentage van de oorspronkelijke prijs per woord"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
#, fuzzy
msgid "Price per word (no n-th char)"
msgstr "Prijs per woord (geen n-de teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
#, fuzzy
msgid "Percent of the original price per word (no n-th char)"
msgstr "Percentage van de oorspronkelijke prijs per woord (geen n-de teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
#, fuzzy
msgid "Price per character"
msgstr "Prijs per karakter"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
#, fuzzy
msgid "Percent of the original price per character"
msgstr "Percentage van de oorspronkelijke prijs per teken"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
#, fuzzy
msgid "Price per character (no first char)"
msgstr "Prijs per teken (geen eerste teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
#, fuzzy
msgid "Price per character (no n-th char)"
msgstr "Prijs per karakter (geen n-de teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
#, fuzzy
msgid "Price per character (no n-th char and no spaces)"
msgstr "Prijs per teken (geen n-de teken en geen spaties)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
#, fuzzy
msgid "Percent of the original price per character (no first char)"
msgstr "Percentage van de oorspronkelijke prijs per teken (geen eerste teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
#, fuzzy
msgid "Percent of the original price per character (no n-th char)"
msgstr "Percentage van de oorspronkelijke prijs per teken (geen n-de teken)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
#, fuzzy
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Percentage van de oorspronkelijke prijs per teken (geen n-de teken en geen "
"spaties)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
#, fuzzy
msgid "Price per character (no spaces)"
msgstr "Prijs per teken (geen spaties)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
#, fuzzy
msgid "Price per row"
msgstr "Prijs per rij"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
#, fuzzy
msgid "Math formula"
msgstr "Wiskundige formule"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
#, fuzzy
msgid "Fixed amount + options"
msgstr "Vast bedrag + opties"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
#, fuzzy
msgid "Lookup table"
msgstr "Tabel opzoeken"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Prijs type"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Aantal"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
#, fuzzy
msgid "Current value"
msgstr "Huidige waarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
#, fuzzy
msgid "Step * price"
msgstr "Stap * prijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
#, fuzzy
msgid "Price per Interval"
msgstr "Prijs per interval"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
msgid "Calculation type"
msgstr "Type sectie"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Geen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
#, fuzzy
msgid "Element ID for x"
msgstr "Element-ID voor x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
#, fuzzy
msgid "Enter the element id to use for the x column."
msgstr "Voer de element-id in die u wilt gebruiken voor de x-kolom."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
#, fuzzy
msgid "Element ID for y"
msgstr "Element-ID voor y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
#, fuzzy
msgid "Enter the element id to use for the y column."
msgstr "Voer de element-id in die u wilt gebruiken voor de y-kolom."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
#, fuzzy
msgid "Set to Fee"
msgstr "Instellen op Kosten"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
#, fuzzy
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Koppel de prijs aan de bestelling en maak deze onafhankelijk van de "
"producthoeveelheid."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
#, fuzzy
msgid "Free characters"
msgstr "Gratis karakters"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
#, fuzzy
msgid "Enter the number of Free characters."
msgstr "Voer het aantal gratis tekens in."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Minimale waarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
#, fuzzy
msgid "Enter the minimum value."
msgstr "Voer de minimumwaarde in."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Maximale waarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
#, fuzzy
msgid "Enter the maximum value."
msgstr "Voer de maximale waarde in."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "Dag / Maand / Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
#, fuzzy
msgid "Month / Day / Year"
msgstr "Maand / Dag / Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "Dag . Maand . Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
#, fuzzy
msgid "Month . Day . Year"
msgstr "Maand. Dag. Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "Dag - Maand - Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
#, fuzzy
msgid "Month - Day - Year"
msgstr "Maand - Dag - Jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
#, fuzzy
msgid "Year / Month / Day"
msgstr "Jaar / Maand / Dag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
#, fuzzy
msgid "Year / Day / Month"
msgstr "Jaar / Dag / Maand"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
#, fuzzy
msgid "Year . Month . Day"
msgstr "Jaar. Maand. Dag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
#, fuzzy
msgid "Year . Day . Month"
msgstr "Jaar. Dag. Maand"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
#, fuzzy
msgid "Year - Month - Day"
msgstr "Jaar - Maand - Dag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
#, fuzzy
msgid "Year - Day - Month"
msgstr "Jaar - Dag - Maand"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Datumweergave"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
#, fuzzy
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
#, fuzzy
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
#, fuzzy
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
#, fuzzy
msgid "H:m"
msgstr "H:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
#, fuzzy
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
#, fuzzy
msgid "HH:m:ss"
msgstr "HH:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
#, fuzzy
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
#, fuzzy
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr "HH:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "uu:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
#, fuzzy
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
#, fuzzy
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
#, fuzzy
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
#, fuzzy
msgid "hh:mm:ss"
msgstr "uu:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
#, fuzzy
msgid "hh:m:ss"
msgstr "uu:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
#, fuzzy
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
#, fuzzy
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr "hh:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr "h:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Tijdnotatie"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
#, fuzzy
msgid "Custom Time format"
msgstr "Aangepaste tijdnotatie"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
#, fuzzy
msgid "This will override the time format above."
msgstr "Hiermee wordt de bovenstaande tijdnotatie overschreven."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
#, fuzzy
msgid "Start year"
msgstr "Startjaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
#, fuzzy
msgid "Enter starting year."
msgstr "Voer het startjaar in."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
#, fuzzy
msgid "End year"
msgstr "Einde jaar"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
#, fuzzy
msgid "Enter ending year."
msgstr "Voer het eindjaar in."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
#, fuzzy
msgid "Use URL replacements"
msgstr "URL-vervangingen gebruiken"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
#, fuzzy
msgid "Choose whether to redirect to a URL if the option is click."
msgstr "Kies of u wilt omleiden naar een URL als de optie klikken is."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
#, fuzzy
msgid "Populate options"
msgstr "Opties invullen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
#, fuzzy
msgid "Double click the radio button to remove its selected attribute."
msgstr ""
"Dubbelklik op het keuzerondje om het geselecteerde attribuut te verwijderen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
#, fuzzy
msgid "Variation options"
msgstr "Variatie opties"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
#, fuzzy
msgid "Image swatches"
msgstr "Afbeeldingsstalen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
#, fuzzy
msgid "Color swatches"
msgstr "Kleurstalen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
#, fuzzy
msgid "Text swatches"
msgstr "Tekststalen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
#, fuzzy
msgid "Replacement mode"
msgstr "Vervangende modus"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
#, fuzzy
msgid "Select how to display the element."
msgstr "Selecteer hoe u het element wilt weergeven."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
#, fuzzy
msgid "Start of the label"
msgstr "Begin van het etiket"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Midden"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
#, fuzzy
msgid "End of the label"
msgstr "Einde van het etiket"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
#, fuzzy
msgid "Swatch position"
msgstr "Positie van het staal"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
#, fuzzy
msgid "Choose how the swatch will be displayed."
msgstr "Kies hoe het staal wordt weergegeven."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
#, fuzzy
msgid "Use image lightbox"
msgstr "Gebruik de lightbox voor afbeeldingen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
#, fuzzy
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr "Kies of u de lightbox op de miniatuur wilt inschakelen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
#, fuzzy
msgid "Use the image replacements"
msgstr "Gebruik de afbeeldingsvervangingen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
#, fuzzy
msgid "Use custom image"
msgstr "Aangepaste afbeelding gebruiken"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "Verander product afbeelding"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
#, fuzzy
msgid "Choose whether to change the product image."
msgstr "Kies of je de productafbeelding wilt wijzigen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Toon label"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Beschrijving weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
#, fuzzy
msgid "Show label and description"
msgstr "Toon label en beschrijving"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Afbeelding weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
#, fuzzy
msgid "Show image and label"
msgstr "Afbeelding en label weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
#, fuzzy
msgid "Show image and description"
msgstr "Toon afbeelding en beschrijving"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
#, fuzzy
msgid "Show image, label and description"
msgstr "Toon afbeelding, label en beschrijving"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "Toon tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
#, fuzzy
msgid "Enabling this will show a tooltip over the choice."
msgstr "Als u dit inschakelt, wordt een tooltip over de keuze weergegeven."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
#, fuzzy
msgid "Enable clear options button"
msgstr "Knop Opties wissen inschakelen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
#, fuzzy
msgid "This will add a button to clear the selected option."
msgstr "Hiermee wordt een knop toegevoegd om de geselecteerde optie te wissen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
#, fuzzy
msgid "Show responsive values"
msgstr "Responsieve waarden weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "automatisch"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
#, fuzzy
msgid "Items per row (Desktops and laptops)"
msgstr "Artikelen per rij (desktops en laptops)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
#, fuzzy
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Gebruik dit veld om een rasterweergave te maken. Voer het aantal items per "
"rij in voor het raster of laat dit veld leeg voor de normale weergave."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
#, fuzzy
msgid "Items per row (Tablets landscape)"
msgstr "Items per rij (Tablets liggend)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
#, fuzzy
msgid "Items per row (Tablets portrait)"
msgstr "Artikelen per rij (Tablets staand)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
#, fuzzy
msgid "Items per row (Smartphones)"
msgstr "Artikelen per rij (Smartphones)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
#, fuzzy
msgid "Items per row (iPhone 5)"
msgstr "Items per rij (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
#, fuzzy
msgid "Items per row (iPhone 6)"
msgstr "Items per rij (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
#, fuzzy
msgid "Items per row (iPhone 6 +)"
msgstr "Artikelen per rij (iPhone 6+)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
#, fuzzy
msgid "Items per row (Samnsung Galaxy)"
msgstr "Items per rij (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
#, fuzzy
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Items per rij (Galaxy-tablets liggend)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
#, fuzzy
msgid "Limit selection"
msgstr "Beperk selectie"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
#, fuzzy
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Voer een getal boven 0 in om de selectie van selectievakjes te beperken of "
"laat dit veld leeg voor standaardgedrag."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
#, fuzzy
msgid "Exact selection"
msgstr "Exacte selectie"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Voer een getal boven 0 in om de gebruiker het exacte aantal selectievakjes "
"te laten selecteren of laat dit veld leeg voor standaardgedrag."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "Minimale selectie"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
#, fuzzy
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Voer een getal boven 0 in om de gebruiker ten minste dat aantal "
"selectievakjes te laten selecteren of laat dit veld leeg voor "
"standaardgedrag."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
#, fuzzy
msgid "Normal browser button"
msgstr "Normale browserknop"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "Gestijlde knop"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
#, fuzzy
msgid "Upload button style"
msgstr "Stijl van de uploadknop"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Datumveld"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Datumkiezer"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
#, fuzzy
msgid "Date field and picker"
msgstr "Datumveld en kiezer"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
#, fuzzy
msgid "Date picker style"
msgstr "Stijl van datumkiezer"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Verberg prijs"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
#, fuzzy
msgid "Choose whether to hide the price or not."
msgstr "Kies of je de prijs wilt verbergen of niet."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Uitschakelen"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Rechts"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Links"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Top"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "Onderkant"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
#, fuzzy
msgid "Quantity selector"
msgstr "Hoeveelheid selector"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
#, fuzzy
msgid "This will show a quantity selector for this option."
msgstr "Dit toont een hoeveelheidskiezer voor deze optie."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
#, fuzzy
msgid "Quantity min value"
msgstr "Hoeveelheid minimale waarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
#, fuzzy
msgid "Quantity max value"
msgstr "Maximale hoeveelheid waarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
#, fuzzy
msgid "Quantity step"
msgstr "Hoeveelheid stap"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
#, fuzzy
msgid "Enter the quantity step."
msgstr "Voer de hoeveelheidsstap in."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
#, fuzzy
msgid "Quantity Default value"
msgstr "Hoeveelheid Standaardwaarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
#, fuzzy
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr ""
"Voer een waarde in die automatisch moet worden toegepast op het veld "
"Hoeveelheid."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Placeholder"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Minimum aantal tekens"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
#, fuzzy
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""
"Voer een waarde in voor het minimum aantal tekens dat de gebruiker moet "
"invoeren."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "Maximaal aantal tekens"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
#, fuzzy
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Voer een waarde in om het maximum aantal tekens dat de gebruiker kan "
"invoeren te beperken."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Standaardwaarde"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
#, fuzzy
msgid "Enter a value to be applied to the field automatically."
msgstr "Voer een waarde in die automatisch op het veld moet worden toegepast."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Grootte"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
#, fuzzy
msgid "Reduce Width"
msgstr "Breedte verkleinen"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
#, fuzzy
msgid "Increase Width"
msgstr "Breedte vergroten"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
#, fuzzy
msgid "Edit Element"
msgstr "Element bewerken"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "Element kopieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(Geen titel)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Bewerk Onderdeel"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "Sectie dupliceren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Sectie"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Element toevoegen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
#, fuzzy
msgid "Choose the image to use in place of the radio button."
msgstr "Kies de afbeelding die u wilt gebruiken in plaats van het keuzerondje."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#, fuzzy
msgid "Remove the image."
msgstr "Verwijder de afbeelding."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
#, fuzzy
msgid "Choose the image to replace the product image with."
msgstr "Kies de afbeelding waarmee u de productafbeelding wilt vervangen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
#, fuzzy
msgid "Select boxes"
msgstr "Vakjes selecteren"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Radio buttons"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
#, fuzzy
msgid "Radio buttons and image at start of the label"
msgstr "Radioknoppen en afbeelding aan het begin van het label"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
#, fuzzy
msgid "Radio buttons and image at end of the label"
msgstr "Keuzerondjes en afbeelding aan het einde van het label"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Weergeven als"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
#, fuzzy
msgid "Select the display type of this attribute."
msgstr "Selecteer het weergavetype van dit kenmerk."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Attribuut Label"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
#, fuzzy
msgid "Leave blank to use the original attribute label."
msgstr "Laat dit veld leeg om het oorspronkelijke kenmerklabel te gebruiken."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "Inschakelen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
#, fuzzy
msgid "Show reset button"
msgstr "Resetknop weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "Schakelt de weergave in van een reset-knop voor dit kenmerk."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
#, fuzzy
msgid "Attribute element class name"
msgstr "Naam van de klasse van het attribuutelement"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
#, fuzzy
msgid "Enter an extra class name to add to this attribute element"
msgstr "Voer een extra klassenaam in om aan dit attribuutelement toe te voegen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Breedte"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
#, fuzzy
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Voer de breedte van het weergegeven item in of laat dit veld leeg voor "
"automatische breedte."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Hoogte"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
#, fuzzy
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Voer de hoogte van het weergegeven item in of laat dit veld leeg voor "
"automatische hoogte."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Verberg"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "Toon"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
#, fuzzy
msgid "Show attribute name"
msgstr "Attribuutnaam weergeven"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
#, fuzzy
msgid "Choose whether to show or hide the attribute name."
msgstr "Kies of u de kenmerknaam wilt weergeven of verbergen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Kleur"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "Selecteer de te gebruiken kleur."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
#, fuzzy
msgid "Image replacement"
msgstr "Afbeelding vervangen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
#, fuzzy
msgid "Select an image for this term."
msgstr "Selecteer een afbeelding voor deze term."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
#, fuzzy
msgid "Product Image replacement"
msgstr "Vervanging van productafbeeldingen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
#, fuzzy
msgid "Select the image to replace the product image with."
msgstr "Selecteer de afbeelding waarmee u de productafbeelding wilt vervangen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
#, fuzzy
msgid "No saved variations found."
msgstr "Geen opgeslagen variaties gevonden."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
#, fuzzy
msgid "Choose the image to use in place of the checkbox."
msgstr ""
"Kies de afbeelding die u wilt gebruiken in plaats van het aankruisvakje."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
#, fuzzy
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Kies de afbeelding die u wilt gebruiken in plaats van het keuzerondje "
"wanneer dit is aangevinkt."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
#, fuzzy
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Kies de afbeelding die u wilt gebruiken in plaats van het selectievakje "
"wanneer deze is aangevinkt."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
#, fuzzy
msgid "Choose the image for the lightbox."
msgstr "Kies de afbeelding voor de lightbox."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "Alle opties verwijderen"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Geselecteerd"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Standaard"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
msgid "Choice label"
msgstr "Keuze label"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Prijs Type"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Omschrijving"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Voeg item toe"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "Voeg scheidingsteken toe"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
#, fuzzy
msgid "Mass add"
msgstr "Massa toevoegen"

#: admin/class-themecomplete-epo-admin-csv.php:41
#, fuzzy
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"De php-functies mb_detect_encoding en mb_convert_encoding zijn vereist om "
"CSV-bestanden te importeren en exporteren. Vraag uw hostingprovider om deze "
"functie in te schakelen."

#: admin/class-themecomplete-epo-admin-csv.php:289
#, fuzzy
msgid "Invalid CSV file."
msgstr "Ongeldig CSV-bestand."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr ""
"Het geüploade bestand overschrijdt het voorschrift upload_max_filesize in "
"php.ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr ""
"Het geüploade bestand overschrijdt het voorschrift MAX_FILE_SIZE "
"gespecificeerd in het HTML-formulier."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "Het bestand is slechts gedeeltelijk geüploadet."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "Er is geen bestand geüploadet."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Er ontbreekt een tijdelijke map."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Het schrijven naar de schijf is mislukt."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr "Uploaden van het bestand gestopt door de extensie."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr "Sorry, dit bestandstype is om veiligheidsredenen niet toegestaan."

#: admin/class-themecomplete-epo-admin-csv.php:324
#, fuzzy
msgid "No file found."
msgstr "Geen bestand gevonden."

#: admin/class-themecomplete-epo-admin-csv.php:337
#, fuzzy
msgid "Invalid import method used."
msgstr "Ongeldige importmethode gebruikt."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
#, fuzzy
msgid "File imported."
msgstr "Bestand geïmporteerd."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
#, fuzzy
msgid "The CSV file is invalid!"
msgstr "Het CSV-bestand is ongeldig!"

#: admin/class-themecomplete-epo-admin-csv.php:552
#, fuzzy
msgid "Invalid CSV file!"
msgstr "Ongeldig CSV-bestand!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, fuzzy, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr ""
"Het is niet toegestaan om bestanden te uploaden die groter zijn dan %s!"

#: admin/class-themecomplete-epo-admin-csv.php:624
#, fuzzy
msgid "File imported with new tables."
msgstr "Bestand geïmporteerd met nieuwe tabellen."

#: admin/class-themecomplete-epo-admin-csv.php:633
#, fuzzy
msgid "There was an error importing the CSV file."
msgstr "Er is een fout opgetreden bij het importeren van het CSV-bestand."

#: admin/class-themecomplete-epo-admin-csv.php:662
#, fuzzy
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Er is een fout opgetreden bij het opslaan van de csv-gegevens. Controleer de "
"codering van uw csv-bestand!"

#: admin/class-themecomplete-epo-admin-csv.php:678
#, fuzzy
msgid "Table names are different. Do you want to override the tables?"
msgstr "Tabelnamen zijn anders. Wil je de tabellen overschrijven?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
#, fuzzy
msgid "Invalid data!"
msgstr "Ongeldige gegevens!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
#, fuzzy
msgid "Something went wrong with the request!"
msgstr "Er is iets misgegaan met het verzoek!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "Wijzigingen opgeslagen!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
#, fuzzy
msgid "Include additional Global forms"
msgstr "Voeg aanvullende algemene formulieren toe"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(geen titel)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Alle aanvullende globale formulieren wissen"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "Uitsluiten van globale opties uitschakelen"

#: admin/class-themecomplete-epo-admin-global-base.php:526
#, fuzzy
msgid "Enable Exclude from Global Options"
msgstr "Opties voor uitsluiten van algemeen inschakelen"

#: admin/class-themecomplete-epo-admin-global-base.php:527
#, fuzzy
msgid "Delete all options on the product"
msgstr "Verwijder alle opties op het product"

#: admin/class-themecomplete-epo-admin-global-base.php:613
#, fuzzy
msgid "File manager is not supported on your server."
msgstr "Bestandsbeheer wordt niet ondersteund op uw server."

#: admin/class-themecomplete-epo-admin-global-base.php:630
#, fuzzy
msgid "Your settings have been reset."
msgstr "Uw instellingen zijn gereset."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
#, fuzzy
msgid "There was an error saving the settings."
msgstr "Er is een fout opgetreden bij het opslaan van de instellingen."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Je instellingen zijn opgeslagen."

#: admin/class-themecomplete-epo-admin-global-base.php:914
#, fuzzy
msgid "Clone template"
msgstr "Sjabloon klonen"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Formulier Kopiëren"

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr "Formulier Exporteren"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
#, fuzzy
msgid "Extra Product Options Form Builder"
msgstr "Extra productopties Form Builder"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Titel"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Prioriteit"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Gesolliciteerd op"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Categorieën"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Producten"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
#, fuzzy
msgid "Excluded Products"
msgstr "Uitgesloten producten"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
#, fuzzy
msgid "ALL products"
msgstr "ALLE producten"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Uitgeschakeld"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
#, fuzzy
msgid "Products and Categories"
msgstr "Producten en categorieën"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Aangepaste code"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
#, fuzzy
msgid "ALL categories"
msgstr "ALLE categorieën"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
msgid "Form settings"
msgstr "CSS-instellingen"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Publiceren"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Rollen"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Producten uitsluiten"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
#, fuzzy
msgid "The description will appear under the title."
msgstr "De beschrijving verschijnt onder de titel."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
#, fuzzy
msgid "Enabled roles for this form"
msgstr "Ingeschakelde rollen voor dit formulier"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
#, fuzzy
msgid "Disabled roles for this form"
msgstr "Uitgeschakelde rollen voor dit formulier"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
#, fuzzy
msgid "Exclude Product(s) from the form"
msgstr "Product(en) uitsluiten van het formulier"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Zoek naar een product&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Selecteer het/de product(en) om de opties toe te passen"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
#, fuzzy
msgid "Meta data not correctly saved. Please save the product!"
msgstr "Metagegevens niet correct opgeslagen. Bewaar het product!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Sectie toevoegen"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
#, fuzzy
msgid "Style variations"
msgstr "Stijl variaties"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Opslaan"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "Importeer CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "CSV exporteren"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
#, fuzzy
msgid "Fullsize"
msgstr "Op ware grootte"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
#, fuzzy
msgid "Please save the form before importing options!"
msgstr "Sla het formulier op voordat u opties importeert!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
#, fuzzy
msgid "Please save the product before importing options!"
msgstr "Sla het product op voordat u opties importeert!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
#, fuzzy
msgid "No elements found!"
msgstr "Geen elementen gevonden!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
#, fuzzy
msgid "Start adding elements"
msgstr "Begin met het toevoegen van elementen"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
#, fuzzy
msgid "Add element in a new section"
msgstr "Element toevoegen aan een nieuwe sectie"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Permanent verwijderen"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "Verplaats naar prullenmand"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Bijwerken"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
msgid "Apply mode"
msgstr "Zelf-modus"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
msgid "All products"
msgstr "ALLE producten"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Aangepaste prijs"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
#, fuzzy
msgid "Something went wrong with WordPress."
msgstr "Er is iets misgegaan met WordPress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
#, fuzzy
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce is niet ingeschakeld!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Valsspelen&#8217; hé?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr "U hebt niet het recht dit item naar de prullenbak te verplaatsen."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Er is een fout opgetreden bij het verwijderen."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr "U hebt niet het recht dit item terug te zetten vanuit de prullenbak."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Er is iets fout gegaan bij het terugzetten vanuit de prullenbak."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "U hebt niet het recht dit item te verwijderen."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Fout bij het verwijderen."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
#, fuzzy
msgid "The item you are trying to move to the Trash no longer exists."
msgstr ""
"Het item dat u naar de prullenmand probeert te verplaatsen, bestaat niet "
"meer."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "Onbekend Berichttype."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, fuzzy, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"U kunt dit item niet naar de prullenmand verplaatsen. %s is momenteel aan "
"het bewerken."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
#, fuzzy
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""
"Het item dat u probeert te herstellen vanuit de prullenbak bestaat niet meer."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
#, fuzzy
msgid "You are not allowed to move this item out of the Trash."
msgstr "Het is niet toegestaan om dit item uit de prullenmand te verplaatsen."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
#, fuzzy
msgid "This item has already been deleted."
msgstr "Dit punt is reeds verwijderd."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr ""
"U probeert een item te bewerken dat niet bestaat. Is het misschien "
"verwijderd?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "U hebt niet het recht dit item te bewerken."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"U kunt dit item niet bewerken omdat het in de prullenbak staat. Gelieve te "
"herstellen en probeer het opnieuw."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s post bijgewerkt."
msgstr[1] "%s berichten bijgewerkt."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "%s bericht niet bijgewerkt, iemand is deze aan het bewerken."
msgstr[1] "%s berichten niet bijgewerkt, iemand is ze aan het bewerken."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s bericht permanent verwijderd."
msgstr[1] "%s berichten permanent verwijderd."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s bericht naar de prullenbak verplaatst."
msgstr[1] "%s berichten naar de prullenbak verplaatst."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "%s bericht hersteld vanuit de prullenbak."
msgstr[1] "%s berichten hersteld vanuit de prullenbak."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
#, fuzzy
msgid "The selected form does not contain any sections"
msgstr "Het geselecteerde formulier bevat geen secties"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Toon filters"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "Verberg filters"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Filter op"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "aan"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "Weet u zeker dat u dit item wilt verwijderen?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
#, fuzzy
msgid "Are you sure you want to clone this item?"
msgstr "Weet je zeker dat je dit item wilt klonen?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Instellingen bewerken"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
#, fuzzy
msgid "Element id"
msgstr "Element-id"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
#, fuzzy
msgid "Section id"
msgstr "Sectie-id"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "is"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "is niet"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "is leeg"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "is niet leeg"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "begint met"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "eindigt met"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "groter dan"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "kleiner dan"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
#, fuzzy
msgid "greater than or equal to"
msgstr "groter dan of gelijk aan"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr "minder dan of gelijk aan"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
#, fuzzy
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"Er kunnen geen regels worden toegepast op dit element of deze sectie, omdat "
"er geen waardegeconfigureerde elementen zijn in andere secties of omdat er "
"geen andere secties zijn gevonden."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
#, fuzzy
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""
"Er is een fout opgetreden! Kan geen voorwaarden toepassen op dit element!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
#, fuzzy
msgid "Populate"
msgstr "Bevolken"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
#, fuzzy
msgid "Invalid file extension"
msgstr "Ongeldige bestandsextensie"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
#, fuzzy
msgid "Importing csv..."
msgstr "CSV importeren..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
#, fuzzy
msgid "Saving... Please wait."
msgstr "Besparing... Een ogenblik geduld."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
#, fuzzy
msgid "Importing data"
msgstr "Gegevens importeren"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "Tarief bewerken"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
#, fuzzy
msgid "Edit tab"
msgstr "Tabblad Bewerken"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
#, fuzzy
msgid "Overwrite existing elements"
msgstr "Bestaande elementen overschrijven"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
#, fuzzy
msgid "Append new elements"
msgstr "Voeg nieuwe elementen toe"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
#, fuzzy
msgid "The form is being applied to all products"
msgstr "Het formulier wordt toegepast op alle producten"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
#, fuzzy
msgid "The form isn't being applied to any products"
msgstr "Het formulier wordt niet toegepast op producten"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Aan het laden..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
#, fuzzy
msgid "Product variables"
msgstr "Product variabelen"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
msgid "Special variables"
msgstr "Globale variabelen"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
#, fuzzy
msgid "Global variables"
msgstr "Globale variabelen"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Toon opties Totaal"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
msgid "Original product price + Options Total"
msgstr "Oorspronkelijke productprijs"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
msgid "Original product price + Cumulative Total"
msgstr "Oorspronkelijke productprijs"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "Aantal producten"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
#, fuzzy
msgid "Original product price"
msgstr "Oorspronkelijke productprijs"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
msgid "Dynamic product price"
msgstr "Oorspronkelijke productprijs"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
#, fuzzy
msgid "This element"
msgstr "Dit element"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
#, fuzzy
msgid "The value of this element"
msgstr "De waarde van dit element"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
#, fuzzy
msgid "The value length of this element"
msgstr "De waardelengte van dit element"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
#, fuzzy
msgid "The number of options the user has selected"
msgstr "Het aantal opties dat de gebruiker heeft geselecteerd"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
#, fuzzy
msgid "The total quantity of this element"
msgstr "De totale hoeveelheid van dit element"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
#, fuzzy
msgid "The quantity of this element"
msgstr "De hoeveelheid van dit element"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
#, fuzzy
msgid "Other elements"
msgstr "Overige elementen"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
#, fuzzy
msgid "The price of the targeted element"
msgstr "De prijs van het beoogde element"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Waarde"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
#, fuzzy
msgid "The value of the targeted element converted to a float"
msgstr "De waarde van het beoogde element geconverteerd naar een float"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Tekst"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
#, fuzzy
msgid "The raw value of the targeted element"
msgstr "De ruwe waarde van het beoogde element"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
#, fuzzy
msgid "Text length"
msgstr "Lengte van de tekst"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
#, fuzzy
msgid "The text length of the targeted element"
msgstr "De tekstlengte van het beoogde element"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
#, fuzzy
msgid "The total quantity of the targeted element"
msgstr "De totale hoeveelheid van het beoogde element"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Aantal"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
#, fuzzy
msgid "The number of options the user has selected on the targeted element"
msgstr ""
"Het aantal opties dat de gebruiker heeft geselecteerd voor het beoogde "
"element"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Alle"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Kopiëren"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Mijn <span class=\"count\">(%s)</span>"
msgstr[1] "Mijn <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Alle <span class=\"screen-reader-text\">(%s)</span>"
msgstr[1] "Alle <span class=\"screen-reader-text\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Sticky <span class=\"count\">(%s)</span>"
msgstr[1] "Sticky <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
#, fuzzy
msgid "Invalid CSV table!"
msgstr "Ongeldige CSV-tabel!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "Er is een fout opgetreden!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
#, fuzzy
msgid "Overwrite existing tables"
msgstr "Bestaande tabellen overschrijven"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
#, fuzzy
msgid "Look up table"
msgstr "Tabel opzoeken"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
#, fuzzy
msgid "No CSV table found!"
msgstr "Geen CSV-tabel gevonden!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
#, fuzzy
msgid "Import one by clicking the button below."
msgstr "Importeer er een door op de onderstaande knop te klikken."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Tabel naam"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
#, fuzzy
msgid "Table index"
msgstr "Tabel index"

#: admin/class-themecomplete-epo-admin-settings.php:273
#, fuzzy
msgid "EPO Control Panel"
msgstr "EPO Bedieningspaneel"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "Instellingen Extra Product Opties"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Instellingen resetten"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Wijzigingen opslaan"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "Elke"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Klik om te wisselen"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Eigenschap:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Type:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Selectievakje"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Selecteer"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Instellingen:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Variatie:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Prijs:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
#, fuzzy
msgid "Custom price (required)"
msgstr "Aangepaste prijs (verplicht)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Aangepaste prijs"

#: admin/views/html-tm-epo-admin.php:148
#, fuzzy
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Attributen ontbreken. Gelieve deze extra optie te VERWIJDEREN:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
#, fuzzy
msgid "Percent of the origιnal price"
msgstr "Percentage van de oorspronkelijke prijs"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Formulier bijgewerkt."

#: admin/views/html-tm-epo-fields-edit.php:32
#, fuzzy, php-format
msgid "Form restored to revision from %s"
msgstr "Formulier hersteld naar revisie van %s"

#: admin/views/html-tm-epo-fields-edit.php:33
#, fuzzy
msgid "Form published."
msgstr "Formulier gepubliceerd."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Formulier opgeslagen."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Formulier ingediend."

#: admin/views/html-tm-epo-fields-edit.php:37
#, fuzzy, php-format
msgid "Form scheduled for: %s."
msgstr "Formulier gepland voor: %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Formulierconcept bijgewerkt."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Voer hier de titel in"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Ongedaan maken"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Optie"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Kosten"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Aantal"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Totaal"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "BTW"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Bewerk item"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Verwijder item"

#: admin/views/html-tm-epo.php:29
#, fuzzy
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Voordat u extra opties toevoegt in deze modus, voegt u enkele attributen toe "
"en slaat u deze op het tabblad Attributen op."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Alles uitklappen"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Alles sluiten"

#: admin/views/html-tm-epo.php:106
#, fuzzy
msgid "Add Extra Option"
msgstr "Extra optie toevoegen"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "Bouwer"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Normaal"

#: admin/views/html-tm-global-epo.php:75
#, fuzzy
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Om de strings voor de lokale opties te vertalen, gebruikt u de WPML-"
"interface."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "Van"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Reeks"

#: admin/views/html-tm-global-epo.php:118
#, fuzzy
msgid "Price display override"
msgstr "Prijsweergave opheffen"

#: admin/views/html-tm-global-epo.php:119
#, fuzzy
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Dit vervangt de weergegeven productprijs op winkel-/archief-/"
"productluspagina's."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Standaard"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "Tot"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Sale"

#: admin/views/html-tm-global-epo.php:177
#, fuzzy
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"De formulieren die u kiest, worden weergegeven naast de formulieren die het "
"product al heeft."

#: admin/views/html-tm-global-epo.php:206
#, fuzzy
msgid "Exclude from"
msgstr "Uitsluiten van"

#: admin/views/html-tm-global-epo.php:207
#, fuzzy
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Hiermee worden alle algemene formulieren uitgesloten die aan dit product "
"zijn toegewezen, behalve de formulieren die in de vorige instelling zijn "
"gedefinieerd."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
#, fuzzy
msgid "Override product price"
msgstr "Productprijs overschrijven"

#: admin/views/html-tm-global-epo.php:226
#, fuzzy
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Hierdoor wordt de productprijs overschreven door de prijs van de opties als "
"de totale optieprijs groter is dan nul."

#: admin/views/html-tm-global-epo.php:243
#, fuzzy
msgid "Override global display"
msgstr "Globale weergave overschrijven"

#: admin/views/html-tm-global-epo.php:244
#, fuzzy
msgid "This will override the display method only for this product."
msgstr ""
"Hierdoor wordt de weergavemethode alleen voor dit product overschreven."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
#, fuzzy
msgid "Use global setting"
msgstr "Algemene instelling gebruiken"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "Altijd laten zien"

#: admin/views/html-tm-global-epo.php:260
#, fuzzy
msgid "Show only with an action hook"
msgstr "Alleen weergeven met een actiehaak"

#: admin/views/html-tm-global-epo.php:273
#, fuzzy
msgid "Override Final total box"
msgstr "Eindtotaal vak overschrijven"

#: admin/views/html-tm-global-epo.php:274
#, fuzzy
msgid "This will override the totals box display only for this product."
msgstr ""
"Hierdoor wordt alleen de weergave van het totalenvak voor dit product "
"overschreven."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
msgid "Disable if Options total is zero"
msgstr "Vak Eindtotaal verbergen als het totaal van opties nul is"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
msgid "Disable if total is zero"
msgstr "Verberg het vak Eindtotaal als het totaal nul is"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Toon opties Totaal"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr ""
"Hierdoor wordt de weergavemethode alleen voor dit product overschreven."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Weergeven wanneer het totaal groter is dan nul"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Eindtotaal weergeven"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
msgid "This will Show Final Total setting only for this product."
msgstr ""
"Hierdoor wordt de weergavemethode alleen voor dit product overschreven."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
#, fuzzy
msgid "Override enabled roles for this product"
msgstr "Ingeschakelde rollen voor dit product overschrijven"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
#, fuzzy
msgid "This will override which roles can see the options for this product."
msgstr ""
"Hiermee wordt overschreven welke rollen de opties voor dit product kunnen "
"zien."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "Actie niet toegestaan."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "Het is niet toegestaan exemplaren van deze klasse te incasseren."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "Gratis!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Selecteer opties"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "In winkelwagen"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
#, fuzzy
msgid "Product element is not supported for components!"
msgstr "Productelement wordt niet ondersteund voor componenten!"

#: includes/class-themecomplete-extra-product-options.php:4984
#, fuzzy
msgid "Product element is not supported within another product element!"
msgstr "Productelement wordt niet ondersteund binnen een ander productelement!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Keuzevakjes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Kleurkiezer"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Zondag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Maandag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Dinsdag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Woensdag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Donderdag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Vrijdag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Zaterdag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
#, fuzzy
msgid "January "
msgstr "Januari "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Februari"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Maart"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "April"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Mei"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Juni"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Juli"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "Augustus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "September"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Oktober"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "November"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
#, fuzzy
msgid "December"
msgstr "December"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
#, fuzzy
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Voer een waarde in die automatisch op het veld moet worden toegepast op "
"basis van de door u geselecteerde datumnotatie. (Twee cijfers voor dag, twee "
"cijfers voor maand en vier cijfers voor jaar)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
#, fuzzy
msgid "Minimum selectable date"
msgstr "Minimaal selecteerbare datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
#, fuzzy
msgid "A number of days from today."
msgstr "Een aantal dagen vanaf vandaag."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
#, fuzzy
msgid "Maximum selectable date"
msgstr "Maximaal selecteerbare datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Uitgeschakelde data"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Door komma's gescheiden datums volgens de door u geselecteerde datumnotatie. "
"(Twee cijfers voor dag, twee cijfers voor maand en vier cijfers voor jaar)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
#, fuzzy
msgid "Enabled dates"
msgstr "Ingeschakelde datums"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
#, fuzzy
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Door komma's gescheiden datums volgens de door u geselecteerde datumnotatie. "
"(Twee cijfers voor dag, twee cijfers voor maand en vier cijfers voor jaar). "
"Houd er rekening mee dat dit elke andere instelling overschrijft!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
#, fuzzy
msgid "Epo White"
msgstr "Epo Wit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
#, fuzzy
msgid "Epo Black"
msgstr "Epo Zwart"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Thema"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
#, fuzzy
msgid "Select the theme for the datepicker."
msgstr "Selecteer het thema voor de datumkiezer."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Klein"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Medium"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Groot"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
#, fuzzy
msgid "Select the size of the datepicker."
msgstr "Selecteer de grootte van de datumkiezer."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
#, fuzzy
msgid "Top of screen"
msgstr "Bovenkant van het scherm"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
#, fuzzy
msgid "Bottom of screen"
msgstr "Onderkant van het scherm"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Positie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
#, fuzzy
msgid "Select the position of the datepicker."
msgstr "Selecteer de positie van de datumkiezer."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
#, fuzzy
msgid "Exclude disabled"
msgstr "Uitgeschakeld uitsluiten"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
#, fuzzy
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Als u dit inschakelt, worden de geselecteerde uitgeschakelde weekdagen niet "
"meegeteld voor de minimale en maximale selecteerbare datum."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
#, fuzzy
msgid "Disable weekdays"
msgstr "Schakel weekdagen uit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr "Hiermee kunt u alle geselecteerde weekdagen uitschakelen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr "Uitschakelen maanden"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
#, fuzzy
msgid "This allows you to disable all selected months."
msgstr "Hiermee kunt u alle geselecteerde maanden uitschakelen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Vertalingen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Dag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Maand"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Jaar"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Scheidingslijn"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Algemene opties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Conditionele logica"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
#, fuzzy
msgid "CSS Settings"
msgstr "CSS-instellingen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
#, fuzzy
msgid "Element class name"
msgstr "Naam van elementklasse"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
#, fuzzy
msgid "Enter an extra class name to add to this element"
msgstr "Voer een extra klassenaam in om aan dit element toe te voegen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
msgid "Set native product price"
msgstr "Productprijs overschrijven"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "Verander product afbeelding"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
msgid "Action mode"
msgstr "Sectie-id"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
msgid "Choose the desired action mode for this element."
msgstr "Kies de belastingklasse voor het prijstype Kosten voor dit element."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
msgid "Formula"
msgstr "Wiskundige formule"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "Voer de stap in voor de handeling."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Weergeven als"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""
"Voer een tekst in ter vervanging van de tekst van de knop Sluiten in de "
"agenda."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
msgid "Text before result"
msgstr "Tekst voor prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Voer een tekst in die vóór de prijs voor dit veld moet worden weergegeven of "
"laat deze leeg voor geen tekst."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
msgid "Text after result"
msgstr "Tekst na de prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Voer een tekst in die na de prijs voor dit veld moet worden weergegeven of "
"laat deze leeg voor geen tekst."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Kop"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Header type"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "Header titel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
msgid "Left of the Content"
msgstr "Links van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
msgid "Right of the Content"
msgstr "Rechts van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Positie header"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Kleur koptekst"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
#, fuzzy
msgid "Leave empty for default value"
msgstr "Laat leeg voor standaardwaarde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Inhoud"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "Kleur inhoud"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
msgid "Above Header"
msgstr "Boven veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
#, fuzzy
msgid "Icon tooltip left"
msgstr "Pictogram tooltip links"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
#, fuzzy
msgid "Icon tooltip right"
msgstr "Pictogram tooltip rechts"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "Inhoud positie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
msgid "Multiple Upload"
msgstr "Selecteer vakje Meerdere"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Product"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Enkel Product"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
#, fuzzy
msgid "Select mode"
msgstr "Selecteer modus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
#, fuzzy
msgid "Whether to include specific products or categories."
msgstr "Of het nu gaat om specifieke producten of categorieën."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
#, fuzzy
msgid "Search for a category ..."
msgstr "Zoeken naar een categorie ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Selecteer Categorieën"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
#, fuzzy
msgid "Add categories to include all their associated products."
msgstr "Voeg categorieën toe om alle bijbehorende producten op te nemen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Zoek naar een product..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Selecteer producten"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
#, fuzzy
msgid "Add the products individually."
msgstr "Voeg de producten afzonderlijk toe."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr "Kies een waarde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Basis prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "Naam"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Menu volgorde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Willekeurig"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Sorteer op"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
#, fuzzy
msgid "Select the parameter which the products will be sorted by."
msgstr "Selecteer de parameter waarop de producten worden gesorteerd."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Oplopend"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Aflopend"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Bestelling"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
#, fuzzy
msgid "Select the sorting order of the products."
msgstr "Selecteer de sorteervolgorde van de producten."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Selecteer een product"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
#, fuzzy
msgid "Default product"
msgstr "Standaard product"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
#, fuzzy
msgid "Select the product that will be pre-selected."
msgstr "Selecteer het product dat vooraf wordt geselecteerd."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Dropdown"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Miniaturen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
#, fuzzy
msgid "Thumbnails multiple"
msgstr "Miniaturen meerdere"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "Layout modus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
#, fuzzy
msgid "Select how the products will be presented."
msgstr "Selecteer hoe de producten worden gepresenteerd."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
#, fuzzy
msgid "Dropdown Placeholder"
msgstr "Tijdelijke aanduiding voor vervolgkeuzelijst"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
#, fuzzy
msgid "Enter the placeholder for the dropdown."
msgstr "Voer de tijdelijke aanduiding voor de vervolgkeuzelijst in."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Minimum aantal"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Maximum hoeveelheid"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
#, fuzzy
msgid "Shipped individually"
msgstr "Per stuk verzonden"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
#, fuzzy
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Als dit is ingeschakeld, wordt het meegeleverde product niet met het "
"hoofdproduct verzonden."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
#, fuzzy
msgid "Maintain weight"
msgstr "Op gewicht blijven"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
#, fuzzy
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Als dit is ingeschakeld, voegt het meegeleverde product zijn gewicht toe aan "
"het hoofdproduct."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
#, fuzzy
msgid "Priced individually"
msgstr "Individueel geprijsd"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
#, fuzzy
msgid "If this is enabled the included product will maintain its own price."
msgstr ""
"Als dit is ingeschakeld, behoudt het meegeleverde product zijn eigen prijs."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Percentage"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Kortingstype"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
#, fuzzy
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Selecteer het kortingstype. De korting is van toepassing op de uiteindelijke "
"productprijs. Als het product extra opties heeft, dan geldt de korting voor "
"het bedrag nadat de opties zijn toegevoegd aan de productprijs."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Korting"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
#, fuzzy
msgid "Enter the discount amount."
msgstr "Voer het kortingsbedrag in."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
#, fuzzy
msgid "Disable Addons"
msgstr "Add-ons uitschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
#, fuzzy
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Als dit is ingeschakeld, worden de meegeleverde add-ons van het bijbehorende "
"product niet weergegeven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
#, fuzzy
msgid "Exlude Addon prices from the discount"
msgstr "Add-on prijzen uitsluiten van de korting"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
#, fuzzy
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Als dit is ingeschakeld, wordt de korting niet toegepast op de productadd-"
"ons."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Winkelwagen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Afrekenen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
#, fuzzy
msgid "Order and Emails"
msgstr "Bestelling en e-mails"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
#, fuzzy
msgid "Hide product in"
msgstr "Product verbergen in"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
#, fuzzy
msgid "Select where to hide the product"
msgstr "Selecteer waar u het product wilt verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
#, fuzzy
msgid "Enable to show the image of the associated product."
msgstr ""
"Schakel deze optie in om de afbeelding van het bijbehorende product weer te "
"geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Laat titel zien"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
#, fuzzy
msgid "Enable to show the title of the associated product."
msgstr ""
"Schakel deze optie in om de titel van het bijbehorende product weer te geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Laat titel zien"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
msgid "Enable to have the title link to the associated product."
msgstr ""
"Schakel deze optie in om de titel van het bijbehorende product weer te geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "Toon prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
#, fuzzy
msgid "Enable to show the price of the associated product."
msgstr "Schakel in om de prijs van het bijbehorende product weer te geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
#, fuzzy
msgid "Enable to show the description of the associated product."
msgstr ""
"Schakel deze optie in om de beschrijving van het bijbehorende product weer "
"te geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
#, fuzzy
msgid "Show meta"
msgstr "Toon meta"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
#, fuzzy
msgid "Enable to show the meta of the associated product."
msgstr "Schakel in om de meta van het bijbehorende product weer te geven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Geavanceerde opties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
#, fuzzy
msgid "Range picker"
msgstr "Bereik kiezer"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
#, fuzzy
msgid "Title options"
msgstr "Titelopties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
#, fuzzy
msgid "Normal (clear)"
msgstr "Normaal (helder)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Box"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
#, fuzzy
msgid "Expand and Collapse (start opened)"
msgstr "Uitvouwen en samenvouwen (start geopend)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
#, fuzzy
msgid "Expand and Collapse (start closed)"
msgstr "Uitvouwen en samenvouwen (start gesloten)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Accordeon"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
#, fuzzy
msgid "Section style"
msgstr "Sectie stijl"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
#, fuzzy
msgid "Select this section's display style."
msgstr "Selecteer de weergavestijl van deze sectie."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
#, fuzzy
msgid "Section background color"
msgstr "Achtergrondkleur van de sectie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
#, fuzzy
msgid "Section label background color"
msgstr "Achtergrondkleur sectielabel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
#, fuzzy
msgid "Section subtitle background color"
msgstr "Achtergrondkleur ondertiteling sectie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
#, fuzzy
msgid "Before Local Options"
msgstr "Vóór lokale opties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
#, fuzzy
msgid "After Local Options"
msgstr "Na lokale opties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
#, fuzzy
msgid "Section placement"
msgstr "Plaatsing van secties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
#, fuzzy
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Selecteer waar dit gedeelte wordt weergegeven in vergelijking met lokale "
"opties."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "Pop up"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
#, fuzzy
msgid "Slider (wizard)"
msgstr "Schuifregelaar (wizard)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Tabbladen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
#, fuzzy
msgid "Section type"
msgstr "Type sectie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
#, fuzzy
msgid "Select this section's display type."
msgstr "Selecteer het weergavetype van deze sectie."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "Tekst Link"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Knop"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
#, fuzzy
msgid "Button Alt"
msgstr "Knop Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
#, fuzzy
msgid "Section pop up button style"
msgstr "Stijl van pop-upknoppen voor secties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
#, fuzzy
msgid "Select this section's pop up button style."
msgstr "Selecteer de pop-upknopstijl van deze sectie."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
#, fuzzy
msgid "Section pop up button text"
msgstr "Tekst van de pop-upknop voor secties"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
#, fuzzy
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Voer een tekst in ter vervanging van de standaardtekst van de pop-upknop. "
"Dit zal de globale waarde tenietdoen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
#, fuzzy
msgid "Section class name"
msgstr "Naam van sectieklasse"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
#, fuzzy
msgid "Enter an extra class name to add to this section"
msgstr "Voer een extra lesgroepnaam in om aan deze sectie toe te voegen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
#, fuzzy
msgid "Section Conditional Logic"
msgstr "Voorwaardelijke logica van de sectie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
#, fuzzy
msgid "Enable conditional logic for showing or hiding this section."
msgstr ""
"Schakel voorwaardelijke logica in voor het weergeven of verbergen van deze "
"sectie."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Selectie box"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
#, fuzzy
msgid "This will count as an empty value in case the element is required."
msgstr "Dit telt als een lege waarde in het geval dat het element vereist is."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
#, fuzzy
msgid "Multi-Select Field"
msgstr "Selecteer vakje Meerdere"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Sjabloon"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
#, fuzzy
msgid "Select a template ..."
msgstr "Selecteer een sjabloon ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Kies het sjabloon"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
#, fuzzy
msgid "Add the template you want to display."
msgstr "Voeg de sjabloon toe die u wilt weergeven."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Tekstgebied"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Tekstveld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
msgid "Enter the step."
msgstr "Voer de hoeveelheidsstap in."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Tijd"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
#, fuzzy
msgid "System style"
msgstr "Systeem stijl"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Aangepaste stijl"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
#, fuzzy
msgid "Time picker style"
msgstr "Stijl van tijdkiezer"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
#, fuzzy
msgid "Minimum selectable time"
msgstr "Minimaal selecteerbare tijd"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
#, fuzzy
msgid "Enter the time the following format: 8:00 am"
msgstr "Voer de tijd in op het volgende formaat: 8:00 uur"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
#, fuzzy
msgid "Maximum selectable time"
msgstr "Maximaal selecteerbare tijd"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
#, fuzzy
msgid "Select the theme for the timepicker."
msgstr "Selecteer het thema voor de timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
#, fuzzy
msgid "Select the size of the timepicker."
msgstr "Selecteer de grootte van de timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
#, fuzzy
msgid "Select the position of the timepicker."
msgstr "Selecteer de positie van de timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Uur"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Minuut"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Tweede"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Uploaden"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Variaties"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
#, fuzzy
msgid "Element Conditional Logic"
msgstr "Voorwaardelijke logica van element"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
#, fuzzy
msgid "Enable conditional logic for showing or hiding this element."
msgstr ""
"Schakel voorwaardelijke logica in voor het weergeven of verbergen van dit "
"element."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "Label type"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
msgid "Label view mode"
msgstr "Selecteer modus"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above the fields"
msgstr "Boven veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
msgid "Above field"
msgstr "Boven veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the fields"
msgstr "Links van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
msgid "Left of the field"
msgstr "Links van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the fields"
msgstr "Rechts van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
msgid "Right of the field"
msgstr "Rechts van het veld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "Label positie"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Label kleur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Ondertitel"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below the fields"
msgstr "Veld Beneden"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
msgid "Below field"
msgstr "Veld Beneden"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr "Positie van de ondertitel"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Subtitel kleur"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
#, fuzzy
msgid "Horizontal rule"
msgstr "Horizontale regel"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Padding"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
#, fuzzy
msgid "Divider type"
msgstr "Type verdeler"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "Label opties"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
#, fuzzy
msgid "Element container id"
msgstr "Elementcontainer-id"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
#, fuzzy
msgid "Enter an id for the container of the element."
msgstr "Voer een id in voor de container van het element."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
#, fuzzy
msgid "Inherit product setting"
msgstr "Productinstelling overnemen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
#, fuzzy
msgid "Include tax for Fee price type"
msgstr "Inclusief belasting voor prijstype Kosten"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
#, fuzzy
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Kies of u belasting wilt opnemen voor het prijstype Kosten voor dit element."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
#, fuzzy
msgid "Tax class for Fee price type"
msgstr "Belastingklasse voor prijstype Kosten"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
#, fuzzy
msgid "Choose the tax class for Fee price type on this element."
msgstr "Kies de belastingklasse voor het prijstype Kosten voor dit element."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
#, fuzzy
msgid "Hide element label in cart"
msgstr "Verberg het elementlabel in de winkelwagen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
#, fuzzy
msgid "Choose whether to hide the element label in the cart or not."
msgstr "Kies of u het elementlabel in de winkelwagen wilt verbergen of niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
#, fuzzy
msgid "No, but hide price"
msgstr "Nee, maar verberg de prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
#, fuzzy
msgid "Yes, but show price"
msgstr "Ja, maar toon prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
#, fuzzy
msgid "Hide element value in cart"
msgstr "Verberg elementwaarde in winkelwagen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
#, fuzzy
msgid "Choose whether to hide the element value in the cart or not."
msgstr "Kies of u de elementwaarde in de winkelwagen wilt verbergen of niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
#, fuzzy
msgid "Hide element label in order"
msgstr "Elementlabel op volgorde verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
#, fuzzy
msgid "Choose whether to hide the element label in the order or not."
msgstr "Kies of u het elementlabel in de bestelling wilt verbergen of niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
#, fuzzy
msgid "Hide element value in order"
msgstr "Elementwaarde in volgorde verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
#, fuzzy
msgid "Choose whether to hide the element value in the order or not."
msgstr "Kies of u de elementwaarde in de bestelling wilt verbergen of niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
#, fuzzy
msgid "Hide element label in floating totals box"
msgstr "Elementlabel verbergen in vak met zwevende totalen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
#, fuzzy
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Kies of u het elementlabel in het vak met zwevende totalen wilt verbergen of "
"niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
#, fuzzy
msgid "Hide element value in floating totals box"
msgstr "Elementwaarde verbergen in vak zwevende totalen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
#, fuzzy
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Kies of u de elementwaarde in het vak met zwevende totalen wilt verbergen of "
"niet."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "WooCommerce instellingen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
#, fuzzy
msgid "Enable repeater"
msgstr "Repeater inschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
#, fuzzy
msgid "This will make this element repeatable."
msgstr "Dit maakt dit element herhaalbaar."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
#, fuzzy
msgid "Bind repeater with product quantity"
msgstr "Bind repeater met producthoeveelheid"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
#, fuzzy
msgid "This will make this element repeatable based on the product quantity."
msgstr "Dit maakt dit element herhaalbaar op basis van de producthoeveelheid."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
#, fuzzy
msgid "Repeater minimum limit"
msgstr "Minimumlimiet repeater"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
#, fuzzy
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Stel het minimum aantal rijen in dat een gebruiker kan toevoegen voor het "
"repeaterveld."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
#, fuzzy
msgid "Repeater maximum limit"
msgstr "Maximale limiet voor repeaters"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
#, fuzzy
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Stel het maximum aantal rijen in dat een gebruiker kan toevoegen voor het "
"repeaterveld."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
#, fuzzy
msgid "Repeater Button Label"
msgstr "Repeater Knop Label"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
#, fuzzy
msgid "Leave this blank for the default label."
msgstr "Laat dit veld leeg voor het standaardlabel."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
#, fuzzy
msgid "Radio Button Connector ID"
msgstr "Connector-ID keuzerondje"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
#, fuzzy
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Voer een aangepaste id in om verschillende keuzerondjes met elkaar te "
"verbinden."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
#, fuzzy
msgid "Repeater Settings"
msgstr "Repeater instellingen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, fuzzy, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Alle instanties van de &quot;%s&quot;-methode"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, fuzzy, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "'%1$s' (instantie-ID: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
#, fuzzy
msgid "Flat Rates (Legacy)"
msgstr "Forfaitaire tarieven (legacy)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
#, fuzzy
msgid "(Legacy)"
msgstr "(Nalatenschap)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
#, fuzzy
msgid "Select shipping methods ..."
msgstr "Selecteer verzendmethoden ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
#, fuzzy
msgid "Enable Shipping Methods"
msgstr "Verzendmethoden inschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
#, fuzzy
msgid "Select the shipping methods to enable."
msgstr "Selecteer de verzendmethoden die u wilt inschakelen."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
#, fuzzy
msgid "Enable Shipping Methods Condition"
msgstr "Voorwaarde voor verzendmethoden inschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
#, fuzzy
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Geef de voorwaarden op voor het inschakelen van verzendmethoden op basis van "
"de waarde van het huidige veld. Als aan de voorwaarden is voldaan, kunnen "
"klanten tijdens het afrekenen kiezen uit de geselecteerde verzendmethoden."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
#, fuzzy
msgid "Disable Shipping Methods"
msgstr "Verzendmethoden uitschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
#, fuzzy
msgid "Select the shipping methods to disable."
msgstr "Selecteer de verzendmethoden die u wilt uitschakelen."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
#, fuzzy
msgid "Disable Shipping Methods Condition"
msgstr "Voorwaarde voor verzendmethoden uitschakelen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
#, fuzzy
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Geef de voorwaarden op voor het uitschakelen van verzendmethoden op basis "
"van de waarde van het huidige veld. Als aan de voorwaarden wordt voldaan, "
"kunnen klanten tijdens het afrekenen niet kiezen uit de geselecteerde "
"verzendmethoden."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Acties"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Algemene instellingen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
#, fuzzy
msgid "Inherit product tax class"
msgstr "Productbelastingklasse erven"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Standaard"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "Laat het leeg om het automatisch te berekenen op basis van de %s prijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, fuzzy, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr ""
"Laat het leeg om het automatisch te berekenen op basis van de %s verkoopprijs"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
#, fuzzy
msgid "this section if the following conditions are met."
msgstr "indien aan de volgende voorwaarden is voldaan."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
#, fuzzy
msgid "this field if the following conditions are met."
msgstr "dit veld als aan de volgende voorwaarden is voldaan."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
#, fuzzy
msgid "Add new condition group"
msgstr "Nieuwe voorwaardegroep toevoegen"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "Het aantal van &quot;%1$s&quot; mag niet lager zijn dan %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "De hoeveelheid \"%1$s\" kan niet hoger zijn dan %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, fuzzy, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr ""
"De hoeveelheid &quot;%1$s&quot; moet worden ingevuld in veelvouden van %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, fuzzy, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s samen met alle bijbehorende producten verwijderd!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, fuzzy, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"Het artikel %s is uit de winkelwagen verwijderd omdat het is gewijzigd sinds "
"het is toegevoegd."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
#, fuzzy
msgid "You cannot add negative priced products to the cart."
msgstr "U kunt geen negatief geprijsde producten aan de winkelwagen toevoegen."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
#, fuzzy
msgid "You cannot add zero priced products to the cart."
msgstr "U kunt geen producten met een nulprijs aan de winkelwagen toevoegen."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "Extra opties"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "\"%s\" is een verplicht veld."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, fuzzy, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s is uit uw winkelwagen verwijderd omdat deze sindsdien is gewijzigd. Je "
"kunt het %2$s weer aan je winkelwagentje toevoegen."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "hier"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
#, fuzzy
msgid "Extra fee"
msgstr "Extra kosten"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Lege winkelwagen"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Uw keuze wijzigen"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Winkelwagen bijwerken"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, fuzzy, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "%s werd geüpdatet."
msgstr[1] "%s zijn geüpdatet."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Bekijk winkelwagen"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"Voor extra productopties en add-ons voor WooCommerce is WordPress %s of "
"hoger vereist."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, fuzzy, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Voor extra productopties en add-ons voor WooCommerce is WooCommerce Extra "
"Checkout Options %s of later vereist!."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
#, fuzzy
msgid "The installed version is"
msgstr "De geïnstalleerde versie is"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Belangrijk:%2$s Jouw versie van WooCommerce Extra Checkout Options "
"wordt niet ondersteund. Gelieve te updaten naar de nieuwste versie."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Belangrijk:%2$s Extra productopties en add-ons voor WooCommerce is "
"gedeactiveerd omdat het niet compatibel is met de huidige versie van Extra "
"Checkout Options."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Belangrijk:%2$s Extra productopties en add-ons voor WooCommerce is "
"gedeactiveerd omdat het niet compatibel is met de huidige versie van Extra "
"Checkout Options."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Belangrijk:%2$s Voer de WooCommerce updater uit voordat u Extra "
"productopties en add-ons voor WooCommerce gebruikt."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Belangrijk:%2$s Voor extra productopties en add-ons voor WooCommerce is "
"%3$sWooCommerce%4$s %5$s of hoger vereist."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Voer de updater uit"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s Belangrijk:%2$s Voor extra productopties en add-ons voor WooCommerce is "
"WordPress %3$s of hoger vereist."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, fuzzy, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Belangrijk:%2$s Voor extra productopties en add-ons voor WooCommerce is "
"een PHP-versie %3$s of hoger vereist."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Bestandsnaam"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Verwijderen"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "TM Extra Product Options"

#: includes/classes/class-themecomplete-epo-post-types.php:101
#, fuzzy
msgid "Global Forms"
msgstr "Globale formulieren"

#: includes/classes/class-themecomplete-epo-post-types.php:102
#, fuzzy
msgid "Global Form"
msgstr "Globaal formulier"

#: includes/classes/class-themecomplete-epo-post-types.php:103
#, fuzzy
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Globale formulieren"

#: includes/classes/class-themecomplete-epo-post-types.php:104
#, fuzzy
msgid "Add Global Form"
msgstr "Globaal formulier toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:105
#, fuzzy
msgid "Add New Global Form"
msgstr "Nieuw globaal formulier toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Bewerken"

#: includes/classes/class-themecomplete-epo-post-types.php:107
#, fuzzy
msgid "Edit Global Form"
msgstr "Globaal formulier bewerken"

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr "Nieuwe globale formulier"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
#, fuzzy
msgid "View Global Form"
msgstr "Globaal formulier weergeven"

#: includes/classes/class-themecomplete-epo-post-types.php:111
#, fuzzy
msgid "Search Global Form"
msgstr "Zoeken in een algemeen formulier"

#: includes/classes/class-themecomplete-epo-post-types.php:112
#, fuzzy
msgid "No Global Form found"
msgstr "Geen globaal formulier gevonden"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "Geen globale formulier gevonden in Prullenbak"

#: includes/classes/class-themecomplete-epo-post-types.php:114
#, fuzzy
msgid "Parent Global Form"
msgstr "Bovenliggend algemeen formulier"

#: includes/classes/class-themecomplete-epo-post-types.php:116
#, fuzzy
msgid "This is where you can add new global options to your store."
msgstr "Hier kunt u nieuwe algemene opties aan uw winkel toevoegen."

#: includes/classes/class-themecomplete-epo-post-types.php:156
#, fuzzy
msgid "Option Templates"
msgstr "Optie Sjablonen"

#: includes/classes/class-themecomplete-epo-post-types.php:157
#, fuzzy
msgid "Option Template"
msgstr "Optie Sjabloon"

#: includes/classes/class-themecomplete-epo-post-types.php:158
#, fuzzy
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Optie Sjablonen"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Sjabloon toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Nieuw sjabloon toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Bewerk template"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Nieuwe Template"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Bekijk Template"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Zoek Template"

#: includes/classes/class-themecomplete-epo-post-types.php:167
#, fuzzy
msgid "No Template found"
msgstr "Geen sjabloon gevonden"

#: includes/classes/class-themecomplete-epo-post-types.php:168
#, fuzzy
msgid "No Template found in trash"
msgstr "Geen sjabloon gevonden in prullenbak"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "Hoofd Template"

#: includes/classes/class-themecomplete-epo-post-types.php:171
#, fuzzy
msgid "This is where you can add new global template options."
msgstr "Hier kunt u nieuwe algemene sjabloonopties toevoegen."

#: includes/classes/class-themecomplete-epo-post-types.php:202
#, fuzzy
msgid "Lookup tables"
msgstr "Tabellen opzoeken"

#: includes/classes/class-themecomplete-epo-post-types.php:204
#, fuzzy
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Tabellen opzoeken"

#: includes/classes/class-themecomplete-epo-post-types.php:205
#, fuzzy
msgid "Add Lookup table"
msgstr "Opzoektabel toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:206
#, fuzzy
msgid "Add New Lookup table"
msgstr "Nieuwe opzoektabel toevoegen"

#: includes/classes/class-themecomplete-epo-post-types.php:208
#, fuzzy
msgid "Edit Lookup table"
msgstr "Opzoektabel bewerken"

#: includes/classes/class-themecomplete-epo-post-types.php:209
#, fuzzy
msgid "New Lookup table"
msgstr "Nieuwe opzoektabel"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
#, fuzzy
msgid "View Lookup table"
msgstr "Opzoektabel weergeven"

#: includes/classes/class-themecomplete-epo-post-types.php:212
#, fuzzy
msgid "Search Lookup table"
msgstr "Zoektabel Opzoeken"

#: includes/classes/class-themecomplete-epo-post-types.php:213
#, fuzzy
msgid "No Lookup table found"
msgstr "Geen opzoektabel gevonden"

#: includes/classes/class-themecomplete-epo-post-types.php:214
#, fuzzy
msgid "No Lookup table found in trash"
msgstr "Geen opzoektabel gevonden in prullenbak"

#: includes/classes/class-themecomplete-epo-post-types.php:215
#, fuzzy
msgid "Parent Lookup table"
msgstr "Tabel voor het opzoeken van ouders"

#: includes/classes/class-themecomplete-epo-post-types.php:217
#, fuzzy
msgid "This is where you can add new lookup tables."
msgstr "Hier kunt u nieuwe opzoektabellen toevoegen."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Stukprijs"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Kosten versie"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
#, fuzzy
msgid "Options VAT amount"
msgstr "Opties BTW-bedrag"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "Kosten van extra opties"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "Totaalbedrag"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Vorige"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Volgende"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "resterende tekens"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr "Bestanden aan het uploaden"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
#, fuzzy
msgid "Your files are being uploaded"
msgstr "Uw bestanden worden geüpload"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "bestand"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "bestanden"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Dit veld is verplicht."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Voer een geldig e-mailadres in."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Vul een geldige URL in."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Vul een geldig nummer in."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Voer enkel cijfers in."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Gelieve een waarde van minder dan of gelijk aan {0} ."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Vul een waarde groter dan of gelijk aan {0} ."

#: includes/classes/class-themecomplete-epo-scripts.php:582
#, fuzzy
msgid "Please enter no more than {0} character."
msgstr "Voer niet meer dan {0} teken in."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "Voer niet meer dan {0} tekens in."

#: includes/classes/class-themecomplete-epo-scripts.php:584
#, fuzzy
msgid "Please enter at least {0} character."
msgstr "Voer ten minste {0} teken in."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Voer minstens {0} tekens in."

#: includes/classes/class-themecomplete-epo-scripts.php:586
#, fuzzy
msgid "Please select up to {0} choice."
msgstr "Selecteer maximaal {0} keuze."

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "Selecteer maximaal {0} optie(s)."

#: includes/classes/class-themecomplete-epo-scripts.php:588
#, fuzzy
msgid "Please select exactly {0} choice."
msgstr "Selecteer precies {0} keuze."

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "Selecteer {0} optie(s)."

#: includes/classes/class-themecomplete-epo-scripts.php:590
#, fuzzy
msgid "Please select at least {0} choice."
msgstr "Selecteer ten minste {0} keuze."

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "Selecteer minimaal {0} optie(s)."

#: includes/classes/class-themecomplete-epo-scripts.php:592
#, fuzzy
msgid "Please enter a multiple of {0}."
msgstr "Voer een veelvoud van {0} in."

#: includes/classes/class-themecomplete-epo-scripts.php:593
#, fuzzy
msgid "Please enter only letters."
msgstr "Voer alleen letters in."

#: includes/classes/class-themecomplete-epo-scripts.php:594
#, fuzzy
msgid "Please enter only letters or spaces."
msgstr "Voer alleen letters of spaties in."

#: includes/classes/class-themecomplete-epo-scripts.php:595
#, fuzzy
msgid "Please enter only letters, numbers or hyphens."
msgstr "Voer alleen letters, cijfers of onderstrepingstekens in."

#: includes/classes/class-themecomplete-epo-scripts.php:596
#, fuzzy
msgid "Please enter only unicode letters and numbers."
msgstr "Voer alleen unicode-letters en -cijfers in."

#: includes/classes/class-themecomplete-epo-scripts.php:597
#, fuzzy
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Voer alleen unicode-letters, cijfers of spaties in."

#: includes/classes/class-themecomplete-epo-scripts.php:598
#, fuzzy
msgid "Minimum number of rows is {0}"
msgstr "Minimum aantal rijen is {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
#, fuzzy
msgid "Maximum number of rows is {0}"
msgstr "Het maximum aantal rijen is {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Klaar"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Vandaag"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "Algemeen"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Weergave"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Tekenreeksen"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Stijl"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Algemeen"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Elementen"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
#, fuzzy
msgid "Upload manager"
msgstr "Uploadbeheer"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Aangepaste code"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
#, fuzzy
msgid "Math Formula Constants"
msgstr "Wiskundige Formule Constanten"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Licentie"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Bestelling"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Bestelling"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
#, fuzzy
msgid "Initialization"
msgstr "Initialisatie"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
#, fuzzy
msgid "Final total box"
msgstr "Eindtotaal vak"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Diverse"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
msgid "Enable Frontend Access for Selected Roles"
msgstr "Front-end inschakelen voor rollen"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
#, fuzzy
msgid "Select the roles that will have access to the extra options."
msgstr "Selecteer de rollen die toegang hebben tot de extra opties."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
msgid "Disable Frontend Access for Selected Roles"
msgstr "Front-end uitschakelen voor rollen"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
#, fuzzy
msgid "Select the roles that will not have access to the extra options."
msgstr "Selecteer de rollen die geen toegang hebben tot de extra opties."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
#, fuzzy
msgid "Enable translations"
msgstr "Vertalingen inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
#, fuzzy
msgid "This will enable the default plugin translation using the pot files."
msgstr ""
"Dit zal de standaard plugin-vertaling inschakelen met behulp van de pot-"
"bestanden."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
#, fuzzy
msgid "Post type hook priority"
msgstr "Haakprioriteit van het paaltype"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
#, fuzzy
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"Verander dit niet tenzij u weet hoe dit uw site zal beïnvloeden! Dit is de "
"prioriteit die de posttypes worden geladen door de plugin."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
#, fuzzy
msgid "Default value is 100"
msgstr "De standaardwaarde is 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
msgid "Specify the areas where the plugin will be activated."
msgstr "Selecteer de parameter waarop de producten worden gesorteerd."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Iedereen"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
msgid "Product Categories"
msgstr "Producten en categorieën"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
msgid "Product Taxonomies"
msgstr "Product variabelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Productpagina"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "Eindtotaal Doos"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Schakel deze instelling in om een eindtotaalvak weer te geven op de "
"productpagina, zodat klanten de totale kosten van hun bestelling kunnen "
"bekijken, of schakel deze optie uit voor een vereenvoudigde productpagina."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Toon opties Totaal"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Schakel deze optie in om het totaal specifiek voor geselecteerde "
"productopties weer te geven."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Eindtotaal weergeven"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Maak het mogelijk om het uitgebreide producttotaal weer te geven, waardoor "
"klanten een duidelijk overzicht krijgen van de totale kosten."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
#, fuzzy
msgid "Enable Final total box for all products"
msgstr "Eindtotaalvak inschakelen voor alle producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
#, fuzzy
msgid "Show the Final total box even when the product has no extra options"
msgstr "Toon het vak Eindtotaal, zelfs als het product geen extra opties heeft"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
#, fuzzy
msgid "Enable original final total display"
msgstr "Oorspronkelijke weergave van het eindtotaal inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
#, fuzzy
msgid "Check to enable the display of the undiscounted final total"
msgstr ""
"Vink deze optie aan om de weergave van het niet-verdisconteerde eindtotaal "
"in te schakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
#, fuzzy
msgid "Enable options VAT display"
msgstr "Opties voor btw-weergave inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
#, fuzzy
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Vink deze optie aan om het btw-bedrag van de opties boven het totaal van de "
"opties weer te geven"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
#, fuzzy
msgid "Show Unit price on totals box"
msgstr "Toon eenheidsprijs op het vak totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
#, fuzzy
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Schakel dit in om de eenheidsprijs weer te geven wanneer het totalenvak "
"zichtbaar is"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
#, fuzzy
msgid "Include Fees on unit price"
msgstr "Kosten opnemen in de eenheidsprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
#, fuzzy
msgid "Enable this to add any Fees to the unit price"
msgstr "Schakel dit in om eventuele kosten toe te voegen aan de eenheidsprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
#, fuzzy
msgid "Total price as Unit Price"
msgstr "Totaalprijs als eenheidsprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
#, fuzzy
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Zorg ervoor dat de totaalprijs niet wordt vermenigvuldigd met de "
"producthoeveelheid"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
#, fuzzy
msgid "Hide Final total box until an element is chosen"
msgstr "Verberg het vak Eindtotaal totdat een element is gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
#, fuzzy
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Vink dit aan om het vakje Eindtotaal alleen weer te geven als ten minste één "
"optie is ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
#, fuzzy
msgid "Hide Final total box until all required elements are chosen"
msgstr "Verberg het vak Eindtotaal totdat alle vereiste elementen zijn gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
#, fuzzy
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Vink dit aan om het vakje Eindtotaal alleen weer te geven als alle vereiste "
"zichtbare opties zijn ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
#, fuzzy
msgid "Hide Final total box until all elements are chosen"
msgstr "Verberg het vak Eindtotaal totdat alle elementen zijn gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
#, fuzzy
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Vink dit aan om het vakje Eindtotaal alleen weer te geven als alle zichtbare "
"opties zijn ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
#, fuzzy
msgid "Disable lazy load images"
msgstr "Schakel lazy load-afbeeldingen uit"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
#, fuzzy
msgid "Enable this to disable lazy loading images."
msgstr "Schakel dit in om lazy loading afbeeldingen uit te schakelen."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
#, fuzzy
msgid "Preload lightbox images"
msgstr "Lightbox-afbeeldingen vooraf laden"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
#, fuzzy
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""
"Schakel dit in om de afbeelding vooraf te laden bij gebruik van de lightbox-"
"functie."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
#, fuzzy
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Schakel plug-in in voor WooCommerce-shortcodes"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
#, fuzzy
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Als u dit inschakelt, worden de plug-inbestanden naar alle WordPress-"
"pagina's geladen. Wees voorzichtig."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
#, fuzzy
msgid "Enable shortcodes in options strings"
msgstr "Shortcodes inschakelen in optiereeksen"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
#, fuzzy
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"Als u dit inschakelt, kunt u shortcodes en HTML-code gebruiken in het "
"optielabel en de beschrijvingstekst."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Plaatsing"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
#, fuzzy
msgid "Floating Totals box"
msgstr "Vak Zwevende totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "Toevoegen aan winkelwagentje knop"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animatie"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
#, fuzzy
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Dit bepaalt hoe uw velden worden weergegeven op de front-end. Als je "
"\"Weergeven met actiehaken\" kiest, moet je de code handmatig naar je thema "
"of plug-in schrijven om de velden weer te geven en de onderstaande "
"plaatsingsinstellingen werken niet. Als u de extensie Samengestelde "
"producten gebruikt, moet u deze instelling op \"Normaal\" laten staan, "
"anders kunnen de extra opties niet worden weergegeven op de samengestelde "
"productbundels. Zie meer in de documentatie."

#: includes/classes/class-themecomplete-epo-settings-base.php:497
#, fuzzy
msgid "Show using action hooks"
msgstr "Actiehaken weergeven"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
#, fuzzy
msgid "Extra Options placement"
msgstr "Extra opties plaatsing"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
#, fuzzy
msgid "Select where you want the extra options to appear."
msgstr "Selecteer waar u de extra opties wilt weergeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Voor de Knop: toevoegen aan winkelwagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Nu toevoegen aan het winkelmandje"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
#, fuzzy
msgid "Before cart form"
msgstr "Vóór het formulier van de winkelwagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
#, fuzzy
msgid "After cart form"
msgstr "Formulier na winkelwagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
#, fuzzy
msgid "Before product"
msgstr "Vóór het product"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
#, fuzzy
msgid "After product"
msgstr "Naar het product"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
#, fuzzy
msgid "Before product summary"
msgstr "Vóór productsamenvatting"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Na productoverzicht"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
#, fuzzy
msgid "After product image"
msgstr "Na productafbeelding"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
#, fuzzy
msgid "Custom hook"
msgstr "Haak op maat"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
#, fuzzy
msgid "Extra Options placement custom hook"
msgstr "Extra opties plaatsing haak op maat"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
#, fuzzy
msgid "Extra Options placement hook priority"
msgstr "Extra opties plaatsing haak prioriteit"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
#, fuzzy
msgid "Select the Extra Options placement hook priority"
msgstr "Selecteer de prioriteit van de plaatsingshaak Extra opties"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
#, fuzzy
msgid "Totals box placement"
msgstr "Plaatsing van het vak Totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
#, fuzzy
msgid "Select where you want the Totals box to appear."
msgstr "Selecteer waar u het vak Totalen wilt weergeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
#, fuzzy
msgid "Totals box placement custom hook"
msgstr "Totalen box plaatsing aangepaste haak"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
#, fuzzy
msgid "Totals box placement hook priority"
msgstr "Totalen box plaatsing haak prioriteit"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
#, fuzzy
msgid "Select the Totals box placement hook priority"
msgstr "Selecteer het vak Totalen Plaatsingshaak prioriteit"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
#, fuzzy
msgid "This will enable a floating box to display your totals box."
msgstr "Dit zal een zwevend vak inschakelen om uw totalenvak weer te geven."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "Rechtsonder"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "Linksonder"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "Rechtsboven"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "Linksboven"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
#, fuzzy
msgid "Floating Totals box visibility"
msgstr "Zichtbaarheid van het vak Zwevende totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
#, fuzzy
msgid "This determines the floating totals box visibility."
msgstr "Dit bepaalt de zichtbaarheid van het vak met zwevende totalen."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "Altijd zichtbaar"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
#, fuzzy
msgid "Visble after scrolling the page"
msgstr "Zichtbaar na het scrollen van de pagina"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
#, fuzzy
msgid "Hide after scrolling the page"
msgstr "Verbergen na het scrollen van de pagina"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
#, fuzzy
msgid "Pixels amount needed to scroll"
msgstr "Hoeveelheid pixels die nodig is om te scrollen"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
#, fuzzy
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Selecteer het aantal pixels dat de pagina moet scrollen om de zwevende "
"totalen zichtbaar te maken."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
#, fuzzy
msgid "Add to cart button on floating totals box"
msgstr "Knop Toevoegen aan winkelwagentje op vak met zwevende totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
#, fuzzy
msgid "Display the add to cart button on floating box."
msgstr "Geef de knop Toevoegen aan winkelwagentje weer op het zwevende vak."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
#, fuzzy
msgid "Change original product price"
msgstr "Wijzig de oorspronkelijke productprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
#, fuzzy
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Vink deze optie aan om de oorspronkelijke productprijs te overschrijven "
"wanneer de prijs wordt gewijzigd."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
#, fuzzy
msgid "Change variation price"
msgstr "Variatieprijs wijzigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
#, fuzzy
msgid "Check to overwrite the variation price when the price is changing."
msgstr ""
"Vink deze optie aan om de variatieprijs te overschrijven wanneer de prijs "
"wordt gewijzigd."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
#, fuzzy
msgid "Force Select Options"
msgstr "Opties voor geforceerd selecteren"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
#, fuzzy
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Dit verandert de knop Toevoegen aan winkelwagentje op winkel- en "
"archiefpagina's om geselecteerde opties weer te geven wanneer het product "
"extra productopties heeft. Als u dit inschakelt, wordt de ajax-"
"functionaliteit verwijderd."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
#, fuzzy
msgid "Enable extra options in shop and category view"
msgstr "Schakel extra opties in winkel- en categorieweergave in"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
#, fuzzy
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Vink deze optie aan om de weergave van extra opties op de winkelpagina en de "
"categorieweergave in te schakelen. Deze instelling is afhankelijk van het "
"thema en sommige aspecten werken mogelijk niet zoals verwacht."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
#, fuzzy
msgid "Remove Free price label"
msgstr "Verwijderen Gratis prijslabel"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
#, fuzzy
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Vink deze optie aan om het gratis prijslabel te verwijderen wanneer het "
"product extra opties heeft"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
#, fuzzy
msgid "Use progressive display on options"
msgstr "Progressieve weergave gebruiken bij opties"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
#, fuzzy
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Als u dit inschakelt, worden de opties op de productpagina verborgen totdat "
"JavaScript is geïnitialiseerd. Dit is een fail-safe instelling en we raden "
"aan om actief te zijn."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
#, fuzzy
msgid "Animation delay"
msgstr "Animatievertraging"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
#, fuzzy
msgid "How long the animation will take in milliseconds"
msgstr "Hoe lang de animatie duurt in milliseconden"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
#, fuzzy
msgid "Start Animation delay"
msgstr "Vertraging animatie starten"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
#, fuzzy
msgid "The delay until the animation starts in milliseconds"
msgstr "De vertraging tot het starten van de animatie in milliseconden"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
#, fuzzy
msgid "Show quantity selector only for elements with a value"
msgstr "Hoeveelheidskiezer alleen weergeven voor elementen met een waarde"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
#, fuzzy
msgid "Check show quantity selector only for elements with a value."
msgstr "Vink de hoeveelheidskiezer alleen aan voor elementen met een waarde."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
#, fuzzy
msgid "Hide add-to-cart button until an element is chosen"
msgstr ""
"Verberg de knop Toevoegen aan winkelwagentje totdat een element is gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
#, fuzzy
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Vink deze optie aan om de knop Toevoegen aan winkelwagentje alleen weer te "
"geven als ten minste één optie is ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
#, fuzzy
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Verberg de knop Toevoegen aan winkelwagentje totdat alle vereiste elementen "
"zijn gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Vink deze optie aan om de knop Toevoegen aan winkelwagentje alleen weer te "
"geven als alle vereiste zichtbare opties zijn ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
#, fuzzy
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Verberg de knop Toevoegen aan winkelwagentje totdat alle elementen zijn "
"gekozen"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
#, fuzzy
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Vink deze optie aan om de knop Toevoegen aan winkelwagentje alleen weer te "
"geven als alle zichtbare opties zijn ingevuld."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
#, fuzzy
msgid "Show full width label for elements."
msgstr "Label over de volledige breedte weergeven voor elementen."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
#, fuzzy
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Vink deze optie aan om elementen te forceren om de volledige breedte te "
"hebben in plaats van automatisch."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
#, fuzzy
msgid "Show choice description inline."
msgstr "Keuzebeschrijving inline weergeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
#, fuzzy
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Vink deze optie aan om het weergeven van een beschrijving als knopinfo uit "
"te schakelen en in plaats daarvan inline weer te geven."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
#, fuzzy
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Keuzelabel verbergen bij gebruik van de instelling Knopinfo weergeven voor "
"keuzerondjes en selectievakjes"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
#, fuzzy
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Schakel deze optie in om het keuzelabel te verbergen wanneer u de instelling "
"Knopinfo weergeven gebruikt voor keuzerondjes en selectievakjes."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
#, fuzzy
msgid "Auto hide price if zero"
msgstr "Prijs automatisch verbergen indien nul"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
#, fuzzy
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Vink deze optie aan om de prijsweergave globaal te verbergen als deze nul is."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
#, fuzzy
msgid "Trim zeros in prices"
msgstr "Snijd nullen in prijzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
#, fuzzy
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Vink dit aan om wereldwijd nul in prijzen te verminderen. Dit wordt ook "
"toegepast op native WooCommerce prijzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
#, fuzzy
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Elementprijs-html verbergen wanneer prijsinstelling verbergen is ingeschakeld"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
#, fuzzy
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Controleer dit als je Google Merchant Center gebruikt. Het zal de prijshtml "
"van het element verbergen wanneer u de prijsinstelling voor het verbergen "
"inschakelt."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
#, fuzzy
msgid "Use translated values when possible on admin Order"
msgstr "Gebruik indien mogelijk vertaalde waarden op de beheerdersbestelling"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
#, fuzzy
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"Houd er rekening mee dat als de opties op de bestelling veranderen of worden "
"verwijderd, u verkeerde resultaten krijgt door dit in te schakelen!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
#, fuzzy
msgid "Include option pricing in product price"
msgstr "Optieprijzen opnemen in de productprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
#, fuzzy
msgid "Check this to include the pricing of the options to the product price."
msgstr "Vink dit aan om de prijs van de opties op te nemen in de productprijs."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
#, fuzzy
msgid "Check for empty product price"
msgstr "Controleer de prijs van het lege product"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
#, fuzzy
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Vink dit aan om de plug-in in te stellen op nul van de productprijs wanneer "
"deze leeg is."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
#, fuzzy
msgid "Use the \"From\" string on displayed product prices"
msgstr "Gebruik de tekenreeks \"Van\" op de weergegeven productprijzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
#, fuzzy
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Vink deze optie aan om de prijsweergave van een product te wijzigen wanneer "
"het extra opties met prijzen heeft."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
#, fuzzy
msgid "Alter generated product structured data"
msgstr "Wijzig gegenereerde productgestructureerde gegevens"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
#, fuzzy
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Wijzigt de gegenereerde productgestructureerde gegevens. Dit kan verkeerde "
"resultaten opleveren als de opties voorwaardelijke logica gebruiken!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
#, fuzzy
msgid "Responsive options structure"
msgstr "Responsieve optiestructuur"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
#, fuzzy
msgid "Enable this if you want the options to have responsive display."
msgstr ""
"Schakel dit in als u wilt dat de opties een responsieve weergave hebben."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
#, fuzzy
msgid "Turn off persistent cart"
msgstr "Permanente winkelwagen uitschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
#, fuzzy
msgid "Enable this if the product has a lot of options."
msgstr "Schakel dit in als het product veel opties heeft."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
#, fuzzy
msgid "Clear cart button"
msgstr "Knop Winkelwagen wissen"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
#, fuzzy
msgid "Enables or disables the clear cart button"
msgstr "Schakelt de knop Winkelwagen wissen in of uit"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
#, fuzzy
msgid "Cart Field Display"
msgstr "Weergave van winkelwagenveld"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
#, fuzzy
msgid "Select how to display your fields in the cart"
msgstr "Selecteer hoe u uw velden in de winkelwagen wilt weergeven"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
#, fuzzy
msgid "Normal display"
msgstr "Normale weergave"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
#, fuzzy
msgid "Display a pop-up link"
msgstr "Een pop-uplink weergeven"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
#, fuzzy
msgid "Advanced display"
msgstr "Geavanceerd display"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
#, fuzzy
msgid "Hide extra options in cart"
msgstr "Verberg extra opties in winkelwagen"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
#, fuzzy
msgid "Enables or disables the display of options in the cart."
msgstr "Hiermee schakelt u de weergave van opties in de winkelwagen in of uit."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
msgid "Hide extra addon prices in cart and checkout"
msgstr "Verberg de URL van het uploadbestand in de winkelwagen en de kassa"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Hiermee schakelt u de weergave van opties in de winkelwagen in of uit."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
#, fuzzy
msgid "Prevent negative priced products"
msgstr "Voorkom negatief geprijsde producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
#, fuzzy
msgid "Prevent adding to the cart negative priced products."
msgstr ""
"Voorkom dat u negatief geprijsde producten aan de winkelwagen toevoegt."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
#, fuzzy
msgid "Prevent zero priced products"
msgstr "Voorkom producten met een nulprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
#, fuzzy
msgid "Prevent adding to the cart zero priced products."
msgstr ""
"Voorkom het toevoegen van producten met een nulprijs aan de winkelwagen."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
#, fuzzy
msgid "Hide checkbox element average price"
msgstr "Selectievakje-element verbergen gemiddelde prijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:913
#, fuzzy
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Hierdoor wordt de weergave van de gemiddelde prijs in de winkelwagen "
"verborgen voor selectievakjes."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
#, fuzzy
msgid "Show image replacement in cart and checkout"
msgstr "Toon afbeeldingsvervanging in winkelwagen en afrekenen"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
#, fuzzy
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Als u dit inschakelt, worden de afbeeldingen weergegeven van elementen die "
"een afbeeldingsvervanging hebben."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
#, fuzzy
msgid "Hide upload file URL in cart and checkout"
msgstr "Verberg de URL van het uploadbestand in de winkelwagen en de kassa"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
#, fuzzy
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Als u dit inschakelt, wordt de URL van elk geüpload bestand verborgen "
"terwijl u in de winkelwagen en bij het afrekenen bent."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
#, fuzzy
msgid "Show uploaded image in cart and checkout"
msgstr "Toon geüploade afbeelding in winkelwagen en afrekenen"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
#, fuzzy
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""
"Als u dit inschakelt, worden de geüploade afbeeldingen in de winkelwagen en "
"bij het afrekenen weergegeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Maximale breedte van de afbeelding"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
#, fuzzy
msgid "Set the maximum width of the images that appear on cart."
msgstr ""
"Stel de maximale breedte in van de afbeeldingen die in de winkelwagen "
"verschijnen."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "Maximale afbeeldingshoogte"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
#, fuzzy
msgid "Set the maximum height of the images that appear on cart."
msgstr ""
"Stel de maximale hoogte in van de afbeeldingen die in de winkelwagen "
"verschijnen."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
#, fuzzy
msgid "Always use unique values on cart for elements"
msgstr "Gebruik altijd unieke waarden op de winkelwagen voor elementen"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
#, fuzzy
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"Als u dit inschakelt, worden door komma's gescheiden waarden voor elementen "
"gescheiden. Dit wordt voornamelijk gebruikt voor meerdere selectievakjes."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
#, fuzzy
msgid "Post types to show the saved options"
msgstr "Berichttypen om de opgeslagen opties weer te geven"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
#, fuzzy
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Selecteer de berichttypen waarbij de plug-in het scherm voor het bewerken "
"van de volgorde zal wijzigen om de opgeslagen opties weer te geven. U kunt "
"uw aangepaste berichttype typen."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
#, fuzzy
msgid "Strip html from emails"
msgstr "Verwijder html uit e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
#, fuzzy
msgid "Check to strip the html tags from emails"
msgstr "Vink aan om de html-tags uit e-mails te verwijderen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
#, fuzzy
msgid "Legacy meta data"
msgstr "Verouderde metagegevens"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
#, fuzzy
msgid "Check to enable legacy meta data functionality."
msgstr ""
"Vink deze optie aan om verouderde metagegevensfunctionaliteit in te "
"schakelen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
#, fuzzy
msgid "Unique meta values"
msgstr "Unieke metawaarden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
#, fuzzy
msgid "Check to split items with multiple values to unique lines."
msgstr ""
"Vink deze optie aan om items met meerdere waarden te splitsen in unieke "
"regels."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
#, fuzzy
msgid "Prevent options from being sent to emails"
msgstr "Voorkomen dat opties naar e-mails worden verzonden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
#, fuzzy
msgid "Check to disable options from being sent to emails."
msgstr ""
"Vink deze optie aan om uit te schakelen of opties naar e-mails kunnen worden "
"verzonden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
#, fuzzy
msgid "Disable sending the options upon saving the order"
msgstr ""
"Schakel het verzenden van de opties uit bij het opslaan van de bestelling"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
#, fuzzy
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Schakel dit in als je een 500-foutmelding krijgt wanneer je de bestelling "
"probeert af te ronden bij het afrekenen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
#, fuzzy
msgid "Attach upload files to emails"
msgstr "Uploadbestanden toevoegen aan e-mails"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
#, fuzzy
msgid "Check to Attach upload files to emails."
msgstr "Vink deze optie aan om uploadbestanden toe te voegen aan e-mails."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
#, fuzzy
msgid "Disable Options on Order status change"
msgstr "Opties uitschakelen bij het wijzigen van de orderstatus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
#, fuzzy
msgid "Check this only if you are getting server errors on checkout."
msgstr "Controleer dit alleen als je serverfouten krijgt bij het afrekenen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
#, fuzzy
msgid "Hide upload file URL in order"
msgstr "Verberg de URL van het uploadbestand in volgorde"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
#, fuzzy
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Als u dit inschakelt, wordt de URL van elk geüpload bestand verborgen "
"terwijl het in orde is."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
msgid "Show uploaded image in order"
msgstr "Toon geüploade afbeelding in winkelwagen en afrekenen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
msgid "Enabling this will show the uploaded images in order."
msgstr ""
"Als u dit inschakelt, worden de geüploade afbeeldingen in de winkelwagen en "
"bij het afrekenen weergegeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
#, fuzzy
msgid "Field Label/value separator"
msgstr "Veld Label/waardescheidingsteken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
#, fuzzy
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Voer het teken in dat wordt gebruikt om veldlabels te scheiden van "
"veldwaarden in de winkelwagen en bestelling."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
#, fuzzy
msgid "Multiple field values separator"
msgstr "Scheidingsteken voor meerdere veldwaarden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
#, fuzzy
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Voer de tekenreeks in die wordt gebruikt om meerdere waarden te scheiden "
"voor een veld dat meerdere selecties in de winkelwagen en bestelling "
"toestaat."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
#, fuzzy
msgid "Update cart text"
msgstr "Winkelwagentekst bijwerken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
#, fuzzy
msgid "Enter the Update cart text when you edit a product."
msgstr "Voer de tekst Winkelwagen bijwerken in wanneer u een product bewerkt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
#, fuzzy
msgid "Edit Options text replacement"
msgstr "Opties voor tekstvervanging bewerken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
#, fuzzy
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""
"Voer een tekst in om de tekst Opties bewerken in de winkelwagen te vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
#, fuzzy
msgid "Additional Options text replacement"
msgstr "Extra opties tekstvervanging"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
#, fuzzy
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Voer een tekst in om de tekst Extra opties te vervangen bij gebruik van de "
"pop-upinstelling op de winkelwagen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
#, fuzzy
msgid "Close button text replacement"
msgstr "Tekstvervanging van de knop Sluiten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
#, fuzzy
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Voer een tekst in om de tekst van de knop Sluiten te vervangen wanneer u de "
"pop-upinstelling op de winkelwagen gebruikt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Hele winkelmand legen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
#, fuzzy
msgid "Enter a text to replace the empty cart button text."
msgstr ""
"Voer een tekst in om de tekst van de knop Lege winkelwagen te vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
#, fuzzy
msgid "Final total text"
msgstr "Definitieve totaaltekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
#, fuzzy
msgid "Enter the Final total text or leave blank for default."
msgstr "Voer de tekst Eindtotaal in of laat leeg voor standaard."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
#, fuzzy
msgid "Unit price text"
msgstr "Tekst eenheidsprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
#, fuzzy
msgid "Enter the Unit price text or leave blank for default."
msgstr "Voer de tekst Eenheidsprijs in of laat deze leeg als standaard."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
#, fuzzy
msgid "Options total text"
msgstr "Opties totale tekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
#, fuzzy
msgid "Enter the Options total text or leave blank for default."
msgstr ""
"Voer de totale tekst van de opties in of laat dit veld leeg als "
"standaardtekst."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
#, fuzzy
msgid "Options VAT total text"
msgstr "Opties BTW totaaltekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
#, fuzzy
msgid "Enter the Options VAT total text or leave blank for default."
msgstr "Voer de tekst Opties voor btw-totaal of leeg laten voor standaard."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
#, fuzzy
msgid "Fees total text"
msgstr "Kosten totale tekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
#, fuzzy
msgid "Enter the Fees total text or leave blank for default."
msgstr "Voer de tekst Kosten totaal in of laat deze leeg voor standaard."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
#, fuzzy
msgid "Free Price text replacement"
msgstr "Gratis prijs tekstvervanging"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
#, fuzzy
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Voer een tekst in om het gratis prijslabel te vervangen wanneer het product "
"extra opties heeft."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
#, fuzzy
msgid "Force Select options text"
msgstr "Tekst opties forceren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
#, fuzzy
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Voer een tekst in om de tekst van de knop Toevoegen aan winkelwagentje te "
"vervangen wanneer u de optie Forceren selecteren gebruikt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
#, fuzzy
msgid "No zero priced products text"
msgstr "Geen tekst voor producten met een nulprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Voer een tekst in om het bericht te vervangen wanneer u probeert een product "
"met een nulprijs aan de winkelwagen toe te voegen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
#, fuzzy
msgid "No negative priced products text"
msgstr "Geen tekst over negatief geprijsde producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
#, fuzzy
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr ""
"Voer een tekst in om het bericht te vervangen wanneer u een negatief "
"geprijsd product aan de winkelwagen probeert toe te voegen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
#, fuzzy
msgid "Popup section button text replacement"
msgstr "Vervanging van de tekst van de pop-upsectieknop"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, fuzzy, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Voer een tekst in om de tekst van de knop voor het opwaarderen te vervangen. "
"Als u dit instelt op %s, wordt de tekst van de knop de titel van de sectie "
"weergegeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Open"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
#, fuzzy
msgid "Reset Options text replacement"
msgstr "Opties voor tekstvervanging opnieuw instellen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
#, fuzzy
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Voer een tekst in ter vervanging van de tekst Opties opnieuw instellen bij "
"het gebruik van aangepaste variaties."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "Reset Opties"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
#, fuzzy
msgid "Calendar close button text replacement"
msgstr "Tekstvervanging van de knop voor het sluiten van de agenda"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
#, fuzzy
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""
"Voer een tekst in ter vervanging van de tekst van de knop Sluiten in de "
"agenda."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
#, fuzzy
msgid "Calendar today button text replacement"
msgstr "Vervanging van de tekst van de knop Agenda vandaag"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
#, fuzzy
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""
"Voer een tekst in ter vervanging van de tekst van de knop Vandaag in de "
"agenda."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
#, fuzzy
msgid "Slider previous text"
msgstr "Schuifregelaar vorige tekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
#, fuzzy
msgid "Enter a text to replace the previous button text for slider."
msgstr ""
"Voer een tekst in om de vorige knoptekst voor de schuifregelaar te vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
#, fuzzy
msgid "Slider next text"
msgstr "Schuifregelaar volgende tekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
#, fuzzy
msgid "Enter a text to replace the next button text for slider."
msgstr ""
"Voer een tekst in om de tekst van de volgende knop voor de schuifregelaar te "
"vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
#, fuzzy
msgid "This field is required text"
msgstr "Dit veld is verplichte tekst"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
#, fuzzy
msgid "Enter a text to indicate that a field is required."
msgstr "Voer een tekst in om aan te geven dat een veld verplicht is."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
#, fuzzy
msgid "Characters remaining text"
msgstr "Resterende tekst van tekens"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
#, fuzzy
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Voer een tekst in ter vervanging van de resterende tekst Tekens bij gebruik "
"van een maximum aantal tekens in een tekstveld of een tekstgebied."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
#, fuzzy
msgid "Uploading files text"
msgstr "Tekst van bestanden uploaden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
#, fuzzy
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Voer een tekst in ter vervanging van de tekst Bestanden uploaden die in de "
"pop-up wordt gebruikt nadat u op de knop Toevoegen aan winkelwagentje hebt "
"geklikt wanneer er uploadvelden zijn."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
#, fuzzy
msgid "Uploading message text"
msgstr "Berichttekst uploaden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
#, fuzzy
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Voer een bericht in dat in de pop-up moet worden gebruikt nadat u op de knop "
"Toevoegen aan winkelwagentje hebt geklikt wanneer er uploadvelden zijn."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
#, fuzzy
msgid "Select file text"
msgstr "Bestandstekst selecteren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
#, fuzzy
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Voer een tekst in ter vervanging van de knop Bestandstekst selecteren die "
"wordt gebruikt in de opgemaakte uploadknop."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Selecteer bestand"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
#, fuzzy
msgid "Single file text"
msgstr "Tekst in één bestand"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
#, fuzzy
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Voer een tekst in ter vervanging van de bestandstekst die wordt gebruikt in "
"de opgemaakte uploadknop."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
#, fuzzy
msgid "Multiple files text"
msgstr "Tekst van meerdere bestanden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
#, fuzzy
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Voer een tekst in ter vervanging van de bestandstekst die wordt gebruikt in "
"de opgemaakte uploadknop."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
#, fuzzy
msgid "Add button text on associated products"
msgstr "Knoptekst toevoegen aan gekoppelde producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
#, fuzzy
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Voer een tekst in om de tekst van de knop Toevoegen op gekoppelde producten "
"te vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Toevoegen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
#, fuzzy
msgid "Remove button text on associated products"
msgstr "Knoptekst verwijderen op gekoppelde producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
#, fuzzy
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Voer een tekst in om de tekst van de knop Verwijderen op gekoppelde "
"producten te vervangen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Verwijderen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
#, fuzzy
msgid "Repeater add text"
msgstr "Repeater tekst toevoegen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
#, fuzzy
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Voer een tekst in ter vervanging van de knop Tekst toevoegen voor "
"repeatervelden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
#, fuzzy
msgid "Enable checkbox and radio styles"
msgstr "Selectievakjes en radiostijlen inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
#, fuzzy
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr ""
"Hiermee schakelt u extra vormgeving voor selectievakjes en keuzerondjes in "
"of uit."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
#, fuzzy
msgid "Select a style for the checkboxes and radio buttons"
msgstr "Selecteer een stijl voor de selectievakjes en keuzerondjes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Rond"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
#, fuzzy
msgid "Round 2"
msgstr "Ronde 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Vierkant"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "Vierkant 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
msgid "Swatch border type"
msgstr "Randtype item selecteren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
#, fuzzy
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Selecteer een stijl voor de geselecteerde rand bij het gebruik van "
"afbeeldingsvervangingen of stalen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Schaduw"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
#, fuzzy
msgid "Thin line"
msgstr "Dunne lijn"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
msgid "Choose the border width for image or color swatches."
msgstr "Kies of je de prijs wilt verbergen of niet."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Selecteer een stijl voor de geselecteerde rand bij het gebruik van "
"afbeeldingsvervangingen of stalen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Selecteer een stijl voor de geselecteerde rand bij het gebruik van "
"afbeeldingsvervangingen of stalen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Visueel"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Productpagina"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Locale"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Prijzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
#, fuzzy
msgid "Enable validation"
msgstr "Validatie inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
#, fuzzy
msgid "Check to enable validation feature for builder elements"
msgstr "Vink aan om de validatiefunctie voor builder-elementen in te schakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
#, fuzzy
msgid "Disable error scrolling"
msgstr "Fout scrollen uitschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
#, fuzzy
msgid "Check to disable scrolling to the element with an error"
msgstr ""
"Vink deze optie aan om het scrollen naar het element met een fout uit te "
"schakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
#, fuzzy
msgid "Error label placement"
msgstr "Fout bij plaatsing van etiketten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
#, fuzzy
msgid "Set the placement for the validation error notification label"
msgstr ""
"De plaatsing instellen voor het label voor het melden van validatiefouten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
#, fuzzy
msgid "After the element"
msgstr "Na het element"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
#, fuzzy
msgid "Before the element"
msgstr "Voor het element"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
#, fuzzy
msgid "Use options cache"
msgstr "Optiecache gebruiken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
#, fuzzy
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Gebruik opties caching om de prestaties te verbeteren. Schakel deze optie "
"uit als u opties hebt die dezelfde unieke id delen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
#, fuzzy
msgid "Javascript and CSS inclusion mode"
msgstr "Javascript- en CSS-opnamemodus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
#, fuzzy
msgid "Select how to include JS and CSS files"
msgstr "Selecteer hoe u JS- en CSS-bestanden wilt opnemen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
#, fuzzy
msgid "Single minified file"
msgstr "Enkelvoudig verkleind bestand"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
#, fuzzy
msgid "Multiple minified files"
msgstr "Meerdere verkleinde bestanden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
#, fuzzy
msgid "DEV - multiple files"
msgstr "DEV - meerdere bestanden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
#, fuzzy
msgid "Disable PNG convert security"
msgstr "Schakel de beveiliging van PNG-conversie uit"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
#, fuzzy
msgid "Check to disable the conversion to png for image uploads."
msgstr ""
"Vink deze optie aan om de conversie naar png uit te schakelen voor het "
"uploaden van afbeeldingen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
#, fuzzy
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Dit zal globaal de productprijs overschrijven met de prijs van de opties als "
"de totale optieprijs groter is dan nul."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
#, fuzzy
msgid "Use setting on each product"
msgstr "Gebruik de instelling op elk product"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
#, fuzzy
msgid "Options price mode"
msgstr "Prijsmodus opties"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
#, fuzzy
msgid "Select the price mode for the options."
msgstr "Selecteer de prijsmodus voor de opties."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
#, fuzzy
msgid "Use sale price"
msgstr "Gebruik verkoopprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
#, fuzzy
msgid "Use regular price"
msgstr "Gebruik de normale prijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
#, fuzzy
msgid "Maximum number of combinations for price calcualtions"
msgstr "Maximaal aantal combinaties voor prijsberekeningen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
#, fuzzy
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Deze instelling bepaalt het maximale aantal combinaties dat de plug-in zal "
"gebruiken om minimum- en maximumprijzen te berekenen. Een groter aantal "
"combinaties zal resulteren in nauwkeurigere prijzen, maar het zal ook langer "
"duren om ze te berekenen. Voor producten die veel keuzecombinaties kunnen "
"hebben, wordt aanbevolen om een lager aantal combinaties in te stellen om de "
"prestaties te verbeteren."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
#, fuzzy
msgid "Default value is 10"
msgstr "Standaardwaarde is 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
#, fuzzy
msgid "Reset option values after the product is added to the cart"
msgstr ""
"Optiewaarden resetten nadat het product aan de winkelwagen is toegevoegd"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
#, fuzzy
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Hierdoor worden de optiewaarden teruggezet naar de standaardwaarden nadat "
"het product aan de winkelwagen is toegevoegd"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
#, fuzzy
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "Gebruik plus- en mintekens op prijzen in winkelwagen en afrekenen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Kies hoe u wilt dat het teken van optieprijzen wordt weergegeven in de "
"winkelwagen en bij het afrekenen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
#, fuzzy
msgid "Display both signs"
msgstr "Toon beide tekens"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
#, fuzzy
msgid "Display only minus sign"
msgstr "Alleen minteken weergeven"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
#, fuzzy
msgid "Use plus and minus signs on option prices"
msgstr "Gebruik plus- en mintekens op optieprijzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
#, fuzzy
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Kies hoe u wilt dat het teken van optieprijzen wordt weergegeven op de "
"productpagina."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
#, fuzzy
msgid "Input decimal separator"
msgstr "Decimaal invoerscheidingsteken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
#, fuzzy
msgid "Choose how to determine the decimal separator for user inputs"
msgstr "Kiezen hoe u het decimaalteken voor gebruikersinvoer wilt bepalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
#, fuzzy
msgid "Use WooCommerce value"
msgstr "Gebruik WooCommerce waarde"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
#, fuzzy
msgid "Determine by browser local"
msgstr "Bepaal per lokale browser"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
#, fuzzy
msgid "Displayed decimal separator"
msgstr "Weergegeven decimaalteken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
#, fuzzy
msgid "Choose which decimal separator to display on currency prices"
msgstr "Kies welk decimaalteken u wilt weergeven op valutaprijzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
#, fuzzy
msgid "Timezone override for Date element"
msgstr "Tijdzone overschrijven voor datumelement"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Kies welke %s het datumelement zal gebruiken in de backend-berekeningen of "
"laat dit veld leeg voor de tijdzone van de server."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, fuzzy
msgid "timezone"
msgstr "Tijdzone"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
#, fuzzy
msgid "Required state indicator"
msgstr "Vereiste statusindicator"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
#, fuzzy
msgid "Enter a string to indicate the required state of a field."
msgstr ""
"Voer een tekenreeks in om de vereiste status van een veld aan te geven."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
#, fuzzy
msgid "Required state indicator position"
msgstr "Vereiste positie van de statusindicator"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
#, fuzzy
msgid "Select the placement of the Required state indicator"
msgstr "Selecteer de plaatsing van de indicator Vereiste status"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
#, fuzzy
msgid "Left of the label"
msgstr "Links van het etiket"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
#, fuzzy
msgid "Right of the label"
msgstr "Rechts van het etiket"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
#, fuzzy
msgid "Include tax string suffix on totals box"
msgstr "Achtervoegsel van belastingtekenreeks opnemen in het vak Totalen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
#, fuzzy
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""
"Schakel dit in om het WooCommerce-belastingachtervoegsel toe te voegen aan "
"het totalenvak"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
#, fuzzy
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr ""
"Voeg het WooCommerce Prijsweergave-achtervoegsel toe aan het totalenvak"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
#, fuzzy
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Schakel dit in om het WooCommerce Prijsweergaveachtervoegsel toe te voegen "
"aan het totalenvak."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
#, fuzzy
msgid "jQuery selector for main product image"
msgstr "jQuery-selector voor hoofdproductafbeelding"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
#, fuzzy
msgid "This is used to change the product image."
msgstr "Dit wordt gebruikt om de productafbeelding te wijzigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
#, fuzzy
msgid "Product image replacement mode"
msgstr "Modus voor het vervangen van productafbeeldingen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
#, fuzzy
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"De zelfmodus vervangt de eigenlijke afbeelding en Inline voegt nieuwe "
"afbeeldingselementen toe."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
#, fuzzy
msgid "Self mode"
msgstr "Zelf-modus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
#, fuzzy
msgid "Inline mode"
msgstr "Inline-modus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
#, fuzzy
msgid "Move out of stock message"
msgstr "Bericht Niet op voorraad"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
#, fuzzy
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Hierdoor wordt het bericht dat het niet op voorraad is verplaatst wanneer er "
"net onder gestileerde variaties worden gebruikt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
#, fuzzy
msgid "Use internal variation price"
msgstr "Gebruik interne variatieprijs"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
#, fuzzy
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Schakel dit in als uw variabele producten veel opties hebben om de "
"prestaties te verbeteren. Houd er rekening mee dat dit problemen kan "
"veroorzaken met kortings- of valutaplug-ins."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
#, fuzzy
msgid "Enable plugin backend interface"
msgstr "Backend-interface voor plug-ins inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
#, fuzzy
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Selecteer de rollen die toegang hebben tot de plug-ininstellingen en de plug-"
"ininterface op de productpagina bewerken. De rol Beheerder heeft altijd "
"toegang."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
#, fuzzy
msgid "Hide override settings on products"
msgstr "Override-instellingen voor producten verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
#, fuzzy
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Schakel dit in om het tabblad Instellingen op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
#, fuzzy
msgid "Hide Builder mode on products"
msgstr "Verberg de bouwmodus op producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
#, fuzzy
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Schakel dit in om het tabblad Builder op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
#, fuzzy
msgid "Hide Normal mode on products"
msgstr "Verberg de normale modus op producten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
#, fuzzy
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""
"Schakel dit in om het normale tabblad op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
#, fuzzy
msgid "Enable WP Rocket CDN"
msgstr "Schakel WP Rocket CDN in"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
#, fuzzy
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Vink aan om het gebruik van WP Rocket cdn voor de plug-inafbeeldingen in te "
"schakelen als deze actief is."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
#, fuzzy
msgid "Enable Jetpack CDN"
msgstr "Jetpack CDN inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
#, fuzzy
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Vink aan om het gebruik van Jetpack cdn voor de plug-inafbeeldingen in te "
"schakelen als het actief is."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Select box"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Datumkiezer"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
#, fuzzy
msgid "Tooltip max width"
msgstr "Maximale breedte tooltip"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
#, fuzzy
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""
"Stel de maximale breedte in van de knopinfo die op de elementen wordt "
"weergegeven."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr "Beeldmodus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
#, fuzzy
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Stel de afbeeldingsmodus in die zal worden gebruikt voor verschillende "
"afbeeldingsgerelateerde functionaliteit."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
#, fuzzy
msgid "Absolute URL"
msgstr "Absolute URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
#, fuzzy
msgid "Relative URL"
msgstr "Relatieve URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
#, fuzzy
msgid "Recalculate image on changes"
msgstr "Afbeelding opnieuw berekenen bij wijzigingen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
#, fuzzy
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Dit is vereist voor verschillende galerijoplossingen die de html-code van de "
"afbeelding dynamisch wijzigen of als u de afbeelding dynamisch wilt beheren."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
#, fuzzy
msgid "Retrieve image sizes for image replacements"
msgstr "Afbeeldingsformaten ophalen voor afbeeldingsvervangingen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
#, fuzzy
msgid "Disable this for slow servers or large amounts of images."
msgstr "Schakel dit uit voor trage servers of grote hoeveelheden afbeeldingen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
#, fuzzy
msgid "Show quantity 1"
msgstr "Toon aantal 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
#, fuzzy
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Schakel in om de hoeveelheidsreeks weer te geven, zelfs wanneer de "
"hoeveelheid 1 is en wanneer de hoeveelheidskiezer is ingeschakeld."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
#, fuzzy
msgid "Show prices inside select box choices"
msgstr "Toon prijzen in selectievakjes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Vink dit aan om de prijs van de selectievakjes weer te geven als het "
"prijstype vast is."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
#, fuzzy
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr "Toon prijzen in selectievakjes, zelfs als de prijzen verborgen zijn"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
#, fuzzy
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Vink deze optie aan om de prijs van de opties van het selectievak weer te "
"geven als het prijstype vast is en zelfs als het element de prijs verbergt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
#, fuzzy
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr "Vermenigvuldig prijzen in selectievakjes met de hoeveelheidskiezer"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
#, fuzzy
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Vink deze optie aan om de prijzen van de selectievakjes te vermenigvuldigen "
"met de hoeveelheidskiezer, indien aanwezig."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
#, fuzzy
msgid "Radio button undo button"
msgstr "Knop voor ongedaan maken met keuzerondje"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
#, fuzzy
msgid "Globally override the undo button for radio buttons"
msgstr "De knop Ongedaan maken voor keuzerondjes globaal overschrijven"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
#, fuzzy
msgid "Use field value"
msgstr "Veldwaarde gebruiken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
#, fuzzy
msgid "Datepicker theme"
msgstr "Thema Datumkiezer"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
#, fuzzy
msgid "Datepicker size"
msgstr "Grootte van de Datepicker"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
#, fuzzy
msgid "Datepicker position"
msgstr "Positie van de datumkiezer"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
#, fuzzy
msgid "Minimum characters for text-field and text-areas"
msgstr "Minimumaantal tekens voor tekstvelden en tekstgebieden"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
#, fuzzy
msgid "Maximum characters for text-field and text-areas"
msgstr "Maximum aantal tekens voor tekstveld en tekstgebieden"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
#, fuzzy
msgid "Upload element inline Image preview"
msgstr "Element inline uploaden Voorbeeld van afbeelding"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
#, fuzzy
msgid "Enable inline preview of the image that will be uploaded."
msgstr "Schakel een inline voorbeeld in van de afbeelding die wordt geüpload."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
#, fuzzy
msgid "Scroll to the product element upon selection"
msgstr "Scroll naar het productelement bij selectie"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
#, fuzzy
msgid "Enable to scroll the viewport to the product element."
msgstr ""
"Schakel deze optie in om de viewport naar het productelement te scrollen."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
#, fuzzy
msgid "Product element scroll offset"
msgstr "Verschuiving van productelementen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
#, fuzzy
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Voer een waarde in voor de scrollverschuiving bij het selecteren van een "
"keuze voor het productelement."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
#, fuzzy
msgid "Sync associated product quantity with main product quantity"
msgstr ""
"Synchroniseer de bijbehorende producthoeveelheid met de "
"hoofdproducthoeveelheid"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
#, fuzzy
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Schakel in om de hoeveelheden van de bijbehorende producten een veelvoud te "
"laten zijn van de hoofdproducthoeveelheid."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Gebruikersnaam"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
#, fuzzy
msgid "Your Envato username."
msgstr "Uw Envato-gebruikersnaam."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
#, fuzzy
msgid "Envato Personal Token"
msgstr "Envato persoonlijk token"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, fuzzy, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "U kunt een Envato Personal Token genereren door %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "door op deze link te klikken"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Aankoop Code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr ""
"Om te weten te komen hoe u toegang krijgt tot uw aankoopcode, kunt u %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, fuzzy
msgid "click this link"
msgstr "Klik op deze link"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Deactiveer licentie"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Activeer licentie"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
#, fuzzy
msgid "License activated."
msgstr "Licentie geactiveerd."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Toestemming"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
#, fuzzy
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Ik ga ermee akkoord dat de licentiegegevens naar de licentieserver worden "
"verzonden."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
#, fuzzy
msgid "Use allowed file types from WordPress"
msgstr "Gebruik toegestane bestandstypen van WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
#, fuzzy
msgid "Enable File manager"
msgstr "Bestandsbeheer inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Map uploaden"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
#, fuzzy
msgid "Changing this will only affect future uploads."
msgstr "Als u dit wijzigt, heeft dit alleen invloed op toekomstige uploads."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
#, fuzzy
msgid "Enable pop-up message on uploads"
msgstr "Pop-upbericht inschakelen bij uploads"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
#, fuzzy
msgid "Enables a pop-up when uploads are made."
msgstr "Hiermee schakelt u een pop-up in wanneer uploads worden gemaakt."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
#, fuzzy
msgid "Enable upload success message"
msgstr "Bericht over uploaden inschakelen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
#, fuzzy
msgid "Indicates if the upload was successful with a message."
msgstr "Geeft aan of het uploaden is gelukt met een bericht."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Toegestane bestandstypen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
#, fuzzy
msgid "Select which file types the user will be allowed to upload."
msgstr "Selecteer welke bestandstypen de gebruiker mag uploaden."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
#, fuzzy
msgid "Select file types"
msgstr "Bestandstypen selecteren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
#, fuzzy
msgid "Custom types"
msgstr "Aangepaste typen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
#, fuzzy
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Selecteer aangepaste bestandstypen die de gebruiker mag uploaden, gescheiden "
"door komma's."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
#, fuzzy
msgid "File manager"
msgstr "Bestandsbeheer"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
#, fuzzy
msgid "CSS code"
msgstr "CSS-code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
#, fuzzy
msgid "Only enter pure CSS code without and style tags"
msgstr "Voer alleen pure CSS-code in zonder en stijltags"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
#, fuzzy
msgid "JavaScript code"
msgstr "JavaScript-code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
#, fuzzy
msgid "Only enter pure JavaScript code without and script tags"
msgstr "Voer alleen pure JavaScript-code in zonder en scripttags"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
#, fuzzy
msgid "Add Constant"
msgstr "Constante toevoegen"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
#, fuzzy
msgid "Error connecting to server!"
msgstr "Fout bij het verbinden met de server!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
#, fuzzy
msgid "Error getting data from the server!"
msgstr "Fout bij het ophalen van gegevens van de server!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
#, fuzzy
msgid "License activated!"
msgstr "Licentie geactiveerd!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
#, fuzzy
msgid "License deactivated!"
msgstr "Licentie gedeactiveerd!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Ongeldige actie."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
#, fuzzy
msgid "Please fill all fields before trying to activate."
msgstr "Vul alle velden in voordat u probeert te activeren."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
#, fuzzy
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr ""
"Proberen te activeren van buiten de plug-in-interface is niet toegestaan!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
#, fuzzy
msgid "Error connecting to Envato API. Please try again later."
msgstr "Fout bij het verbinden met de Envato API. Probeer het later opnieuw."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
#, fuzzy
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr "Je probeert te activeren met een ongeldige aankoopcode voor je token!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
#, fuzzy
msgid "Envato rate limit exceeded! Please try again later."
msgstr "Envato-snelheidslimiet overschreden! Probeer het later opnieuw."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Deze gebruikersnaam is niet geldig voor deze aankoop Artikelcode. Controleer "
"of dat u de juiste gebruikersnaam (hoofdlettergevoelig) in hebt gevoerd."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "Probeert te activeren van een ongeldig domain!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
#, fuzzy
msgid "Trying to activate from an invalid IP address!"
msgstr "Proberen te activeren vanaf een ongeldig IP-adres!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "De activatie code is reeds geactiveerd!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
#, fuzzy
msgid "The purchase code is already activated on another domain!"
msgstr "De aankoopcode is al geactiveerd op een ander domein!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr "Activatie code reeds geactiveerd op een ander domain!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "De activatie code is reeds geactiveerd! Schaf een geldige licentie!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
#, fuzzy
msgid "You have already activated your purchase code!"
msgstr "Je hebt je aankoopcode al geactiveerd!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
#, fuzzy
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr ""
"Gedeactiveerd, maar de aankoopcode is om de een of andere reden niet "
"geactiveerd!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
#, fuzzy
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"Kan niet deactiveren. Aankoopcode is niet geldig voor uw opgeslagen "
"licentiesleutel!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
#, fuzzy
msgid "Could not complete request!"
msgstr "Kon aanvraag niet voltooien!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
#, fuzzy
msgid "Downloading package from Envato market..."
msgstr "Pakket downloaden van Envato-markt..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "Fout! Kan geen verbinding maken met bestandssysteem"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "To receive automatic updates license activation is required."
msgstr "Om automatische updates te ontvangen, is licentieactivering vereist."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
#, fuzzy
msgid "Please activate Extra Product Options."
msgstr "Activeer Extra productopties."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr "Fout! Envato API fout"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr "Fout in uitpakken pakket"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "Download new version from CodeCanyon"
msgstr "Download de nieuwe versie van CodeCanyon"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
#, fuzzy
msgid "or register the plugin to receive automatic updates."
msgstr "Of registreer de plug-in om automatische updates te ontvangen."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Vertaling aan %s toevoegen"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "De vertaling van %s bewerken"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Taal"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, fuzzy, php-format
msgid "Language of this %s"
msgstr "Taal van deze %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
#, fuzzy
msgid "This is a translation of"
msgstr "Dit is een vertaling van"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
#, fuzzy
msgid "Enable discounts on extra options"
msgstr "Schakel kortingen op extra opties in"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
#, fuzzy
msgid "Base original price type according to"
msgstr "Basis origineel prijstype volgens"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
#, fuzzy
msgid "Set to what price types will base their original price on."
msgstr "Stel in op welke prijstypen hun oorspronkelijke prijs baseren."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Geen wijzigingen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
#, fuzzy
msgid "Undiscounted product price"
msgstr "Niet-gereduceerde productprijs"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
#, fuzzy
msgid "Enable alteration of pricing table"
msgstr "Wijziging van prijstabel inschakelen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
#, fuzzy
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Vink deze optie aan om het opnemen van optieprijzen in de prijstabel in te "
"schakelen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
#, fuzzy
msgid "Prefix label"
msgstr "Label met voorvoegsel"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
#, fuzzy
msgid "Display a prefix label on product page."
msgstr "Geef een voorvoegsellabel weer op de productpagina."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "Achtervoegsel label"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
#, fuzzy
msgid "Display a suffix label on product page."
msgstr "Geef een achtervoegsellabel weer op de productpagina."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
#, fuzzy
msgid "Label CSS selector"
msgstr "CSS-selector voor labels"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
#, fuzzy
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Voer een CSS-selector in om het standaardlabel te overschrijven waarop de "
"kortingsreeks wordt weergegeven."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
#, fuzzy
msgid "Discount string placement"
msgstr "Plaatsing van kortingsreeksen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
#, fuzzy
msgid "Select the placement of the discounted string compared to the label."
msgstr ""
"Selecteer de plaatsing van de kortingsreeks ten opzichte van het label."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Na"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Voor"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
#, fuzzy
msgid "Enable showing option prices in the Order"
msgstr "Schakel het tonen van optieprijzen in de Order in"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
#, fuzzy
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Schakel dit op eigen risico in, aangezien het niet mogelijk is om "
"optiekortingen te berekenen op de Bestelpagina."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
#, fuzzy
msgid "Multiply cost by person count"
msgstr "Vermenigvuldig de kosten met het aantal personen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
#, fuzzy
msgid "Enabling this will multiply the options price by the person count."
msgstr ""
"Als u dit inschakelt, wordt de prijs van de opties vermenigvuldigd met het "
"aantal personen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
#, fuzzy
msgid "Using booking setting"
msgstr "Boekingsinstelling gebruiken"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
#, fuzzy
msgid "Multiply cost by block count"
msgstr "Vermenigvuldig de kosten met het aantal blokken"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
#, fuzzy
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"Als u dit inschakelt, wordt de prijs van de opties vermenigvuldigd met het "
"aantal blokken."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
#, fuzzy
msgid "Add option cost to booking display price"
msgstr "Optiekosten toevoegen aan de weergaveprijs van de boeking"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
#, fuzzy
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"Als u dit inschakelt, worden de optieprijzen toegevoegd aan de berekende "
"boekingskosten."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
#, fuzzy
msgid "Dynamic Pricing & Discounts"
msgstr "Dynamische prijzen en kortingen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
#, fuzzy
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Als u dit inschakelt, worden de productkortingen ook toegepast op de extra "
"opties."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
#, fuzzy
msgid "WooCommerce Easy Bookings"
msgstr "WooCommerce Gemakkelijke Boekingen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
#, fuzzy
msgid "WooCommerce Measurement Calculator"
msgstr "WooCommerce Meting Calculator"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
#, fuzzy
msgid "Multiply options cost by area"
msgstr "Vermenigvuldig de kosten van opties per gebied"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
#, fuzzy
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""
"Als u dit inschakelt, wordt de optieprijs vermenigvuldigd met het berekende "
"gebied."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
#, fuzzy
msgid "Divide price with measurement"
msgstr "Prijs delen met meting"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
#, fuzzy
msgid "This will divide the original price with the needed measurement."
msgstr "Dit deelt de oorspronkelijke prijs met de benodigde meting."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "WooCommerce Subscriptions"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
#, fuzzy
msgid "Include addons on order again"
msgstr "Voeg add-ons opnieuw toe aan de bestelling"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
#, fuzzy
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"Als u dit inschakelt, worden de opgeslagen add-ons aan het abonnement "
"toegevoegd wanneer u de functionaliteit voor opnieuw bestellen handmatig "
"gebruikt."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
#, fuzzy
msgid "Sign up fee"
msgstr "Inschrijfgeld"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
#, fuzzy
msgid "sign-up fee"
msgstr "Inschrijfgeld"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
#, fuzzy
msgid "and a"
msgstr "en een"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "%1$s elke %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
#, fuzzy
msgid "Subscription sign up fee text"
msgstr "Tekst aanmeldingskosten abonnement"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
#, fuzzy
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Voer de tekst van de aanmeldingskosten voor abonnementen in of laat deze "
"leeg als standaard."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
#, fuzzy
msgid "Sign up fee text"
msgstr "Tekst inschrijfgeld"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
#, fuzzy
msgid "Enter the Sign up fee text or leave blank for default."
msgstr ""
"Voer de tekst van de aanmeldingskosten in of laat deze leeg als standaard."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
#, fuzzy
msgid "Subscription sign up fee"
msgstr "Inschrijfgeld voor abonnement"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
#, fuzzy
msgid "Options Subscription fee"
msgstr "Opties Abonnementskosten"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, fuzzy, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "De hoeveelheid voor \"%1$s\" moet groter zijn dan %2$s"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, fuzzy, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""
"De hoeveelheid voor \"%s\" moet groter zijn dan 0 om aan de winkelwagen te "
"worden toegevoegd."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, fuzzy, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "U kunt maximaal %1$s keuze voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, fuzzy, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "U kunt maximaal %1$s keuzes voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, fuzzy, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "U moet precies %1$s keuze voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, fuzzy, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "U moet precies %1$s keuzes voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, fuzzy, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "U moet ten minste %1$s keuze voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, fuzzy, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "U moet ten minste %1$s keuzes voor %2$s selecteren."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
#, fuzzy
msgid "Invalid date entered!"
msgstr "Ongeldige datum ingevoerd!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "Ongeldige importmethode gebruikt!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
#, fuzzy
msgid "Invalid year date entered!"
msgstr "Ongeldige jaardatum ingevoerd!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
#, fuzzy
msgid "You cannot select that date!"
msgstr "U kunt die datum niet selecteren!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(max. bestandsgrootte %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, fuzzy, php-format
msgid "%s is not a valid image file!"
msgstr "%s is geen geldig afbeeldingsbestand!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Upload succesvol"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, fuzzy, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "U moet ten minste %1$s tekens invoeren voor \"%2$s\"."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, fuzzy, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "U kunt niet meer dan %1$s tekens invoeren voor '%2$s'."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Iedereen"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "Ingelogde deelnemers"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
#, fuzzy
msgid "Echo a custom action"
msgstr "Een aangepaste actie herhalen"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
#, fuzzy
msgid "EPO custom action"
msgstr "Aangepaste actie EOB"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Titel:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
#, fuzzy
msgid "Custom action:"
msgstr "Aangepaste actie:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s bestaat niet."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "Wacht op productafbeelding"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "SKU:"

#: templates/products/template-variable.php:60
#, fuzzy
msgid "Clear"
msgstr "Wissen"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Aantal"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Kies een optie"

#, fuzzy
#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#, fuzzy
#~ msgid "Hide extra options prices in cart"
#~ msgstr "Verberg extra opties prijzen in winkelwagen"

#, fuzzy
#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr ""
#~ "Hiermee schakelt u de weergave van prijzen van opties in de winkelwagen "
#~ "in of uit."

#~ msgid "Show bottom"
#~ msgstr "Toon onderkant"

#, fuzzy
#~ msgid "Show inside"
#~ msgstr "Binnen weergeven"

#, fuzzy
#~ msgid "Disable categories"
#~ msgstr "Categorieën uitschakelen"

#~ msgid "Submit for Review"
#~ msgstr "Indienen voor review"

#, fuzzy
#~ msgid "Show Both Final and Options total box"
#~ msgstr "Het vak Eind- en Optiestotaal weergeven"

#, fuzzy
#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "Eindvak weergeven en opties verbergen als nul"

#, fuzzy
#~ msgid "Hide Final total box"
#~ msgstr "Eindtotaal verbergen"

#, fuzzy
#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Toon altijd alleen Eindtotaal (Prijs x Hoeveelheid)"

#, fuzzy
#~ msgid "Disable but change product prices"
#~ msgstr "Uitschakelen maar productprijzen wijzigen"

#, fuzzy
#~ msgid "Select when to show the final total box"
#~ msgstr "Selecteer wanneer u het vak voor het eindtotaal wilt weergeven"

#, fuzzy
#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "Eindtotaal weergeven en totaal opties verbergen indien nul"
languages/woocommerce-tm-extra-product-options-de_DE.po000064400001076531150755142440017261 0ustar00msgid ""
msgstr ""
"Project-Id-Version: Extra Product Options & Add-Ons for WooCommerce\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-07 11:51+0200\n"
"PO-Revision-Date: 2024-03-07 11:51+0200\n"
"Last-Translator: \n"
"Language-Team: themecomplete <themecomplete@gmail.com>\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.3\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
"X-Poedit-Basepath: ..\n"
"X-Textdomain-Support: yes\n"
"X-Poedit-SearchPath-0: .\n"

#: admin/class-themecomplete-epo-admin-base.php:583
#: admin/class-themecomplete-epo-admin-base.php:1094
#: admin/class-themecomplete-epo-admin-base.php:1275
#: admin/class-themecomplete-epo-admin-global-base.php:977
#: admin/class-themecomplete-epo-admin-global-base.php:978
#: admin/class-themecomplete-epo-admin-global-base.php:2519
#: admin/class-themecomplete-epo-admin-global-base.php:2535
#: admin/class-themecomplete-epo-admin-global-base.php:2738
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:210
#: admin/class-themecomplete-epo-admin-settings.php:88
msgid "Extra Product Options"
msgstr "Zusätzliche Produktoptionen"

#: admin/class-themecomplete-epo-admin-base.php:642
msgid "Extra Product Options Fees"
msgstr "Gebühren für zusätzliche Produktoptionen"

#: admin/class-themecomplete-epo-admin-base.php:697
msgid "View Extra Product Options settings"
msgstr "Einstellungen für zusätzliche Produktoptionen anzeigen"

#: admin/class-themecomplete-epo-admin-base.php:697
#: admin/class-themecomplete-epo-admin-global-base.php:988
#: admin/class-themecomplete-epo-admin-global-base.php:989
#: admin/views/html-tm-global-epo.php:64
msgid "Settings"
msgstr "Einstellungen"

#: admin/class-themecomplete-epo-admin-base.php:713
#: includes/classes/class-themecomplete-epo-check-base.php:210
#: includes/classes/class-themecomplete-epo-check-base.php:226
#: includes/classes/class-themecomplete-epo-check-base.php:242
msgid "Extra Product Options & Add-Ons for WooCommerce"
msgstr "Zusätzliche Produktoptionen und Add-Ons für WooCommerce"

#: admin/class-themecomplete-epo-admin-base.php:719
#, php-format
msgid "More information about %s"
msgstr "Weitere Informationen zu %s"

#: admin/class-themecomplete-epo-admin-base.php:721
msgid "View details"
msgstr "Details anzeigen"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "View Extra Product Options documentation"
msgstr "Dokumentation für Extra Product Options anzeigen"

#: admin/class-themecomplete-epo-admin-base.php:723
msgid "Docs"
msgstr "Dokumente"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Visit premium customer support"
msgstr "Premium-Kundensupport besuchen"

#: admin/class-themecomplete-epo-admin-base.php:724
msgid "Premium Support"
msgstr "Premium-Support"

#: admin/class-themecomplete-epo-admin-base.php:788
msgid "(Copy)"
msgstr "(Kopie)"

#: admin/class-themecomplete-epo-admin-base.php:823
#, php-format
msgid "Variation #%1$s of %2$s"
msgstr "Variation %1$s von %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:2705
msgid "There are no saved variations yet."
msgstr "Es sind noch keine gespeicherten Variationen vorhanden."

#: admin/class-themecomplete-epo-admin-base.php:1235
msgid "You cannot add any more extra options."
msgstr "Sie können keine weiteren zusätzlichen Optionen hinzufügen."

#: admin/class-themecomplete-epo-admin-base.php:1236
msgid "Are you sure you want to remove this option?"
msgstr "Sind Sie sicher, dass Sie diese Option entfernen möchten?"

#: admin/class-themecomplete-epo-admin-base.php:1237
msgid ""
"Before adding Extra Product Options, add and save some attributes on the "
"Attributes tab."
msgstr ""
"Fügen Sie vor dem Hinzufügen zusätzlicher Produktoptionen einige Attribute "
"auf der Registerkarte „Attribute“ hinzu und speichern Sie sie."

#: admin/class-themecomplete-epo-admin-base.php:1238
#: admin/class-themecomplete-epo-admin-builder-base.php:611
#: admin/class-themecomplete-epo-admin-builder-base.php:720
#: admin/class-themecomplete-epo-admin-builder-base.php:833
#: admin/class-themecomplete-epo-admin-builder-base.php:886
#: admin/class-themecomplete-epo-admin-builder-base.php:939
#: admin/class-themecomplete-epo-admin-builder-base.php:4900
#: admin/views/html-tm-epo-admin.php:116 admin/views/html-tm-epo-admin.php:126
#: admin/views/html-tm-epo-admin.php:184 admin/views/html-tm-epo-admin.php:194
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:418
msgid "Fixed amount"
msgstr "Fester Betrag"

#: admin/class-themecomplete-epo-admin-base.php:1239
#: admin/class-themecomplete-epo-admin-builder-base.php:615
#: admin/class-themecomplete-epo-admin-builder-base.php:732
#: admin/class-themecomplete-epo-admin-builder-base.php:837
#: admin/class-themecomplete-epo-admin-builder-base.php:890
#: admin/class-themecomplete-epo-admin-builder-base.php:955
#: admin/class-themecomplete-epo-admin-builder-base.php:4904
#: admin/views/html-tm-epo-admin.php:117 admin/views/html-tm-epo-admin.php:127
msgid "Percent of the original price"
msgstr "Prozent des ursprünglichen Preises"

#: admin/class-themecomplete-epo-admin-base.php:1240
#: admin/class-themecomplete-epo-admin-base.php:1278
#: admin/class-themecomplete-epo-admin-global-base.php:2728
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:216
msgid "Error"
msgstr "Fehler"

#: admin/class-themecomplete-epo-admin-base.php:1274
#: admin/class-themecomplete-epo-admin-csv.php:754
#: admin/class-themecomplete-epo-admin-global-base.php:2722
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:208
msgid "Invalid request!"
msgstr "Ungültige Anfrage!"

#: admin/class-themecomplete-epo-admin-base.php:1276
msgid "Are you sure you want to delete this folder and all of its contents?"
msgstr ""
"Sind Sie sicher, dass Sie diesen Ordner und all seinen Inhalt löschen "
"möchten?"

#: admin/class-themecomplete-epo-admin-base.php:1277
msgid "Are you sure you want to delete this file?"
msgstr "Sind Sie sicher, dass Sie diese Datei löschen möchten?"

#: admin/class-themecomplete-epo-admin-base.php:1279
msgid "Are you sure you want to reset the settings?"
msgstr "Sind Sie sicher, dass Sie die Einstellungen zurücksetzen möchten?"

#: admin/class-themecomplete-epo-admin-base.php:1280
#: admin/class-themecomplete-epo-admin-builder-base.php:238
#: admin/class-themecomplete-epo-admin-builder-base.php:1596
#: admin/class-themecomplete-epo-admin-global-base.php:2702
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1003
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1054
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1080
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1106
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1132
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1158
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1180
#: includes/classes/class-themecomplete-epo-settings-base.php:1596
msgid "Yes"
msgstr "Ja"

#: admin/class-themecomplete-epo-admin-base.php:1281
#: admin/class-themecomplete-epo-admin-builder-base.php:234
#: admin/class-themecomplete-epo-admin-builder-base.php:1592
#: admin/class-themecomplete-epo-admin-builder-base.php:1785
#: admin/class-themecomplete-epo-admin-builder-base.php:1824
#: admin/class-themecomplete-epo-admin-builder-base.php:4378
#: admin/class-themecomplete-epo-admin-global-base.php:2703
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1007
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1050
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1072
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1102
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1124
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1154
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1176
#: includes/classes/class-themecomplete-epo-settings-base.php:1595
msgid "No"
msgstr "Nein"

#: admin/class-themecomplete-epo-admin-base.php:1282
#: admin/class-themecomplete-epo-admin-global-base.php:2706
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:214
#: includes/classes/class-themecomplete-epo-scripts.php:521
msgid "Cancel"
msgstr "Abbrechen"

#: admin/class-themecomplete-epo-admin-base.php:1283
#: admin/class-themecomplete-epo-admin-global-base.php:1707
#: admin/class-themecomplete-epo-admin-global-base.php:1723
#: includes/classes/class-themecomplete-epo-scripts.php:522
#: includes/classes/class-themecomplete-epo-settings-base.php:1132
msgid "Close"
msgstr "Schließen"

#: admin/class-themecomplete-epo-admin-base.php:1284
msgid "Constant name"
msgstr "Name einer Konstante"

#: admin/class-themecomplete-epo-admin-base.php:1285
msgid "Constant value"
msgstr "Wert einer Konstante"

#: admin/class-themecomplete-epo-admin-base.php:1286
msgid ""
"Please check the consent checkbox to give your permission to send your data "
"to the server and try again."
msgstr ""
"Bitte aktivieren Sie das Kontrollkästchen für die Einwilligung, um Ihre "
"Einwilligung zum Senden Ihrer Daten an den Server zu erteilen, und versuchen "
"Sie es erneut."

#: admin/class-themecomplete-epo-admin-base.php:1287
msgid "Connecting to activation server ..."
msgstr "Verbindung zum Aktivierungsserver wird hergestellt ..."

#: admin/class-themecomplete-epo-admin-base.php:1600
#, php-format
msgid "Extra Product Option #%1$s of %2$s"
msgstr "Zusätzliche Produktoption #%1$s von %2$s"

#: admin/class-themecomplete-epo-admin-base.php:1612
msgid "Could not update post in the database"
msgstr "Der Beitrag konnte nicht aktualisiert werden"

#: admin/class-themecomplete-epo-admin-builder-base.php:242
msgid "Enable points display?"
msgstr "Punkte aktivieren?"

#: admin/class-themecomplete-epo-admin-builder-base.php:243
msgid "This allows you to generate points along the range picker."
msgstr "Hier können Sie Punkte im Bereich-Werkzeug setzen."

#: admin/class-themecomplete-epo-admin-builder-base.php:266
msgid "Number of points"
msgstr "Anzahl der Punkte"

#: admin/class-themecomplete-epo-admin-builder-base.php:267
msgid "Enter the number of values for the points display."
msgstr "Geben Sie die Anzahl der Werte für die Punkteanzeige ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:296
#: admin/class-themecomplete-epo-admin-builder-base.php:4413
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:209
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:652
msgid "Tooltip"
msgstr "Tooltip"

#: admin/class-themecomplete-epo-admin-builder-base.php:300
msgid "Left side"
msgstr "Linke Seite"

#: admin/class-themecomplete-epo-admin-builder-base.php:304
msgid "Right side"
msgstr "Rechte Seite"

#: admin/class-themecomplete-epo-admin-builder-base.php:308
msgid "Tooltip and Left side"
msgstr "Tooltip und linke Seite"

#: admin/class-themecomplete-epo-admin-builder-base.php:312
msgid "Tooltip and Right side"
msgstr "Tooltip und rechte Seite"

#: admin/class-themecomplete-epo-admin-builder-base.php:316
msgid "Show value on"
msgstr "Wert anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:317
msgid "Select how to show the value of the range picker."
msgstr "Wählen Sie, wie der Wert des Bereich-Wählers angezeigt werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:363
msgid "Step value"
msgstr "Schritt-Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:364
msgid "Enter the step for the handle."
msgstr "Geben Sie den Schritt für den Griff ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:390
msgid "No validation"
msgstr "Keine Bestätigung"

#: admin/class-themecomplete-epo-admin-builder-base.php:394
msgid "Email"
msgstr "E-Mail"

#: admin/class-themecomplete-epo-admin-builder-base.php:398
msgid "Url"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:402
msgid "Number"
msgstr "Nummer"

#: admin/class-themecomplete-epo-admin-builder-base.php:406
msgid "Digits"
msgstr "Ziffern"

#: admin/class-themecomplete-epo-admin-builder-base.php:410
msgid "Letters only"
msgstr "Nur Briefe"

#: admin/class-themecomplete-epo-admin-builder-base.php:414
msgid "Letters or Space only"
msgstr "Nur Buchstaben oder Leerzeichen"

#: admin/class-themecomplete-epo-admin-builder-base.php:418
msgid "Alphanumeric"
msgstr "Alphanumerisch"

#: admin/class-themecomplete-epo-admin-builder-base.php:422
msgid "Alphanumeric Unicode"
msgstr "Alphanumerischer Unicode"

#: admin/class-themecomplete-epo-admin-builder-base.php:426
msgid "Alphanumeric Unicode or Space"
msgstr "Alphanumerischer Unicode oder Leerzeichen"

#: admin/class-themecomplete-epo-admin-builder-base.php:430
msgid "Validate as"
msgstr "Validieren als"

#: admin/class-themecomplete-epo-admin-builder-base.php:431
msgid "Choose whether the field will be validated against the choosen method."
msgstr "Wählen Sie aus, ob das Feld mit der gewählten Methode validiert wird."

#: admin/class-themecomplete-epo-admin-builder-base.php:453
#: admin/views/html-tm-epo-admin.php:67
msgid "Required"
msgstr "Erforderlich"

#: admin/class-themecomplete-epo-admin-builder-base.php:454
msgid "Choose whether the user must fill out this field or not."
msgstr "Wählen Sie, ob der Benutzer dieses Feld ausfüllen muss."

#: admin/class-themecomplete-epo-admin-builder-base.php:477
#: admin/class-themecomplete-epo-admin-builder-base.php:5544
#: admin/views/html-tm-epo-admin.php:70
msgid "Enabled"
msgstr "Aktiviert"

#: admin/class-themecomplete-epo-admin-builder-base.php:478
msgid "Choose whether the option is enabled or not."
msgstr "Wählen Sie aus, ob die Option aktiviert ist oder nicht."

#: admin/class-themecomplete-epo-admin-builder-base.php:503
#: admin/class-themecomplete-epo-admin-builder-base.php:5451
#: admin/class-themecomplete-epo-admin-builder-base.php:5466
#: admin/class-themecomplete-epo-admin-builder-base.php:5503
#: admin/class-themecomplete-epo-admin-global-base.php:2757
#: admin/views/html-tm-global-epo.php:106
#: includes/classes/class-themecomplete-epo-cart.php:2097
#: includes/classes/class-themecomplete-epo-scripts.php:529
#: includes/classes/class-themecomplete-epo-settings-base.php:479
msgid "Price"
msgstr "Preis"

#: admin/class-themecomplete-epo-admin-builder-base.php:504
msgid "Enter the price for this field or leave it blank for no price."
msgstr ""
"Geben Sie den Preis für dieses Feld ein oder lassen Sie es kostenlos leer."

#: admin/class-themecomplete-epo-admin-builder-base.php:535
#: admin/class-themecomplete-epo-admin-builder-base.php:5452
#: admin/class-themecomplete-epo-admin-builder-base.php:5486
#: admin/class-themecomplete-epo-admin-builder-base.php:5504
msgid "Sale Price"
msgstr "Angebotspreis"

#: admin/class-themecomplete-epo-admin-builder-base.php:536
msgid ""
"Enter the sale price for this field or leave it blankto use the default "
"price."
msgstr ""
"Geben Sie den Verkaufspreis für dieses Feld ein oder lassen Sie es leer, um "
"den Standardpreis zu verwenden."

#: admin/class-themecomplete-epo-admin-builder-base.php:566
msgid "Text after Price"
msgstr "Text nach Preis"

#: admin/class-themecomplete-epo-admin-builder-base.php:567
msgid ""
"Enter a text to display after the price for this field or leave it blank for "
"no text."
msgstr ""
"Text eingeben der nach dem Preis angezeigt werden soll oder für keinen Text "
"einfach Leer lassen."

#: admin/class-themecomplete-epo-admin-builder-base.php:593
msgid "Text before Price"
msgstr "Text vor dem Preis"

#: admin/class-themecomplete-epo-admin-builder-base.php:594
msgid ""
"Enter a text to display before the price for this field or leave it blank "
"for no text."
msgstr ""
"Text eingeben der vor dem Preis angezeigt werden soll oder für keinen Text "
"einfach Leer lassen."

#: admin/class-themecomplete-epo-admin-builder-base.php:619
#: admin/class-themecomplete-epo-admin-builder-base.php:736
#: admin/class-themecomplete-epo-admin-builder-base.php:841
#: admin/class-themecomplete-epo-admin-builder-base.php:894
#: admin/class-themecomplete-epo-admin-builder-base.php:959
#: admin/class-themecomplete-epo-admin-builder-base.php:4908
msgid "Percent of the original price + options"
msgstr "Prozent des ursprünglichen Preises + Optionen"

#: admin/class-themecomplete-epo-admin-builder-base.php:623
#: admin/class-themecomplete-epo-admin-builder-base.php:740
msgid "Price per word"
msgstr "Preis pro Wort"

#: admin/class-themecomplete-epo-admin-builder-base.php:627
#: admin/class-themecomplete-epo-admin-builder-base.php:744
msgid "Percent of the original price per word"
msgstr "Prozent des ursprünglichen Preises pro Wort"

#: admin/class-themecomplete-epo-admin-builder-base.php:631
#: admin/class-themecomplete-epo-admin-builder-base.php:748
msgid "Price per word (no n-th char)"
msgstr "Preis pro Wort (no n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:635
#: admin/class-themecomplete-epo-admin-builder-base.php:752
msgid "Percent of the original price per word (no n-th char)"
msgstr "Prozent des ursprünglichen Preises pro Wort (no n-th char)"

#: admin/class-themecomplete-epo-admin-builder-base.php:639
#: admin/class-themecomplete-epo-admin-builder-base.php:756
msgid "Price per character"
msgstr "Preis pro Zeichen (kein erstes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:643
#: admin/class-themecomplete-epo-admin-builder-base.php:760
msgid "Percent of the original price per character"
msgstr "Prozent des ursprünglichen Preises pro Zeichen (kein erstes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:647
#: admin/class-themecomplete-epo-admin-builder-base.php:764
msgid "Price per character (no first char)"
msgstr "Preis pro Zeichen (kein erstes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:651
#: admin/class-themecomplete-epo-admin-builder-base.php:768
msgid "Price per character (no n-th char)"
msgstr "Preis pro Zeichen (kein n-tes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:655
#: admin/class-themecomplete-epo-admin-builder-base.php:772
msgid "Price per character (no n-th char and no spaces)"
msgstr "Preis pro Zeichen (kein n-tes Zeichen und keine Leerzeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:659
#: admin/class-themecomplete-epo-admin-builder-base.php:776
msgid "Percent of the original price per character (no first char)"
msgstr "Prozent des ursprünglichen Preises pro Zeichen (kein erstes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:663
#: admin/class-themecomplete-epo-admin-builder-base.php:780
msgid "Percent of the original price per character (no n-th char)"
msgstr "Prozent des ursprünglichen Preises pro Zeichen (kein n-tes Zeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:667
#: admin/class-themecomplete-epo-admin-builder-base.php:784
msgid ""
"Percent of the original price per character (no n-th char and no spaces)"
msgstr ""
"Prozent des ursprünglichen Preises pro Zeichen (kein n-tes Zeichen und ohne "
"Leerzeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:671
#: admin/class-themecomplete-epo-admin-builder-base.php:788
msgid "Price per character (no spaces)"
msgstr "Preis pro Zeichen (ohne Leerzeichen)"

#: admin/class-themecomplete-epo-admin-builder-base.php:675
msgid "Price per row"
msgstr "Preis pro Reihe"

#: admin/class-themecomplete-epo-admin-builder-base.php:679
#: admin/class-themecomplete-epo-admin-builder-base.php:792
#: admin/class-themecomplete-epo-admin-builder-base.php:845
#: admin/class-themecomplete-epo-admin-builder-base.php:898
#: admin/class-themecomplete-epo-admin-builder-base.php:963
#: admin/class-themecomplete-epo-admin-builder-base.php:1004
#: admin/class-themecomplete-epo-admin-builder-base.php:4912
msgid "Math formula"
msgstr "Mathematische Formel"

#: admin/class-themecomplete-epo-admin-builder-base.php:683
#: admin/class-themecomplete-epo-admin-builder-base.php:796
#: admin/class-themecomplete-epo-admin-builder-base.php:849
#: admin/class-themecomplete-epo-admin-builder-base.php:902
#: admin/class-themecomplete-epo-admin-builder-base.php:967
#: admin/class-themecomplete-epo-admin-builder-base.php:4916
msgid "Fixed amount + options"
msgstr "Feste Menge + Optionen"

#: admin/class-themecomplete-epo-admin-builder-base.php:687
#: admin/class-themecomplete-epo-admin-builder-base.php:800
#: admin/class-themecomplete-epo-admin-builder-base.php:853
#: admin/class-themecomplete-epo-admin-builder-base.php:906
#: admin/class-themecomplete-epo-admin-builder-base.php:971
#: admin/class-themecomplete-epo-admin-builder-base.php:1008
#: admin/class-themecomplete-epo-admin-builder-base.php:1076
#: includes/classes/class-themecomplete-epo-post-types.php:203
msgid "Lookup table"
msgstr "Suchtabelle"

#: admin/class-themecomplete-epo-admin-builder-base.php:705
#: admin/class-themecomplete-epo-admin-builder-base.php:818
#: admin/class-themecomplete-epo-admin-builder-base.php:871
#: admin/class-themecomplete-epo-admin-builder-base.php:924
#: admin/class-themecomplete-epo-admin-builder-base.php:989
msgid "Price type"
msgstr "Preis-Typ"

#: admin/class-themecomplete-epo-admin-builder-base.php:724
#: admin/class-themecomplete-epo-admin-global-base.php:2765
#: includes/classes/class-themecomplete-epo-cart.php:2098
msgid "Quantity"
msgstr "Menge"

#: admin/class-themecomplete-epo-admin-builder-base.php:728
#: admin/class-themecomplete-epo-admin-builder-base.php:947
msgid "Current value"
msgstr "Aktueller Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:943
msgid "Step * price"
msgstr "Schritt * Preis"

#: admin/class-themecomplete-epo-admin-builder-base.php:951
msgid "Price per Interval"
msgstr "Preis pro Intervall"

#: admin/class-themecomplete-epo-admin-builder-base.php:1026
#, fuzzy
#| msgid "Section type"
msgid "Calculation type"
msgstr "Sektionstyp"

#: admin/class-themecomplete-epo-admin-builder-base.php:1041
#: admin/class-themecomplete-epo-admin-builder-base.php:1670
#: admin/class-themecomplete-epo-admin-global-base.php:1295
#: admin/class-themecomplete-epo-admin-global-base.php:1363
#: admin/class-themecomplete-epo-admin-global-base.php:1369
#: admin/class-themecomplete-epo-admin-global-base.php:1376
#: admin/class-themecomplete-epo-admin-global-base.php:1408
#: admin/views/html-tm-global-epo.php:102
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:410
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:735
msgid "None"
msgstr "Keine"

#: admin/class-themecomplete-epo-admin-builder-base.php:1095
msgid "Element ID for x"
msgstr "Element-ID für x"

#: admin/class-themecomplete-epo-admin-builder-base.php:1096
msgid "Enter the element id to use for the x column."
msgstr ""
"Geben Sie die Element-ID ein, die für die x-Spalte verwendet werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:1115
msgid "Element ID for y"
msgstr "Element-ID für y"

#: admin/class-themecomplete-epo-admin-builder-base.php:1116
msgid "Enter the element id to use for the y column."
msgstr ""
"Geben Sie die Element-ID ein, die für die Y-Spalte verwendet werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:1149
#: admin/class-themecomplete-epo-admin-builder-base.php:5532
msgid "Set to Fee"
msgstr "Auf Gebühr eingestellt"

#: admin/class-themecomplete-epo-admin-builder-base.php:1150
msgid ""
"Attach the price to the order making it independent of the product quantity."
msgstr ""
"Fügen Sie den Preis an den Auftrag an, sodass er unabhängig von der "
"Produktmenge ist."

#: admin/class-themecomplete-epo-admin-builder-base.php:1182
msgid "Free characters"
msgstr "Gratischars"

#: admin/class-themecomplete-epo-admin-builder-base.php:1183
msgid "Enter the number of Free characters."
msgstr "Geben Sie die Anzahl der Gratis-Zeichen ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:1226
msgid "Min value"
msgstr "Minimalwert"

#: admin/class-themecomplete-epo-admin-builder-base.php:1227
msgid "Enter the minimum value."
msgstr "Geben Sie den Mindestwert ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:1275
msgid "Max value"
msgstr "Maximum Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:1276
msgid "Enter the maximum value."
msgstr "Geben Sie den Maximalwert ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:1318
msgid "Day / Month / Year"
msgstr "Tag / Monat / Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1322
msgid "Month / Day / Year"
msgstr "Monat / Tag / Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1326
msgid "Day . Month . Year"
msgstr "Tag . Monat . Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1330
msgid "Month . Day . Year"
msgstr "Monat . Tag . Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1334
msgid "Day - Month - Year"
msgstr "Tag - Monat - Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1338
msgid "Month - Day - Year"
msgstr "Monat - Tag - Jahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1343
msgid "Year / Month / Day"
msgstr "Jahr / Monat / Tag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1347
msgid "Year / Day / Month"
msgstr "Jahr / Tag / Monat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1351
msgid "Year . Month . Day"
msgstr "Jahr . Monat . Tag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1355
msgid "Year . Day . Month"
msgstr "Jahr . Tag . Monat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1359
msgid "Year - Month - Day"
msgstr "Jaar - Maand - Dag"

#: admin/class-themecomplete-epo-admin-builder-base.php:1363
msgid "Year - Day - Month"
msgstr "Jahr - Tag - Monat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1368
msgid "Date format"
msgstr "Datumsformat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1391
msgid "HH:mm"
msgstr "HH:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1395
msgid "HH:m"
msgstr "HH:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1399
msgid "H:mm"
msgstr "H:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1403
msgid "H:m"
msgstr "H:i"

#: admin/class-themecomplete-epo-admin-builder-base.php:1407
msgid "HH:mm:ss"
msgstr "HH:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1411
msgid "HH:m:ss"
msgstr "HH:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1415
msgid "H:mm:ss"
msgstr "H:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1419
msgid "H:m:ss"
msgstr "H:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1423
msgid "HH:mm:s"
msgstr "HH:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1427
msgid "HH:m:s"
msgstr "HH:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1431
msgid "H:mm:s"
msgstr "H:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1435
msgid "H:m:s"
msgstr "H:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1440
msgid "hh:mm"
msgstr "hh:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1444
msgid "hh:m"
msgstr "hh:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1448
msgid "h:mm"
msgstr "h:mm"

#: admin/class-themecomplete-epo-admin-builder-base.php:1452
msgid "h:m"
msgstr "h:m"

#: admin/class-themecomplete-epo-admin-builder-base.php:1456
msgid "hh:mm:ss"
msgstr "hh:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1460
msgid "hh:m:ss"
msgstr "hh:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1464
msgid "h:mm:ss"
msgstr "h:mm:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1468
msgid "h:m:ss"
msgstr "h:m:ss"

#: admin/class-themecomplete-epo-admin-builder-base.php:1472
msgid "hh:mm:s"
msgstr "hh:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1476
msgid "hh:m:s"
msgstr "hh:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1480
msgid "h:mm:s"
msgstr "h:mm:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1484
msgid "h:m:s"
msgstr "h:m:s"

#: admin/class-themecomplete-epo-admin-builder-base.php:1488
msgid "Time format"
msgstr "Zeitformat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1516
msgid "Custom Time format"
msgstr "Benutzerdefiniertes Zeitformat"

#: admin/class-themecomplete-epo-admin-builder-base.php:1517
msgid "This will override the time format above."
msgstr "Dadurch wird das obige Zeitformat überschrieben."

#: admin/class-themecomplete-epo-admin-builder-base.php:1543
msgid "Start year"
msgstr "Startjahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1544
msgid "Enter starting year."
msgstr "Geben Sie das Startjahr ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:1567
msgid "End year"
msgstr "Endjahr"

#: admin/class-themecomplete-epo-admin-builder-base.php:1568
msgid "Enter ending year."
msgstr "Geben Sie das Ende des Jahres."

#: admin/class-themecomplete-epo-admin-builder-base.php:1600
msgid "Use URL replacements"
msgstr "URL-Ersatz nutzen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1601
msgid "Choose whether to redirect to a URL if the option is click."
msgstr ""
"Wählen Sie, ob Sie auf eine URL umleiten möchten, wenn die Option klicken "
"wird."

#: admin/class-themecomplete-epo-admin-builder-base.php:1624
msgid "Populate options"
msgstr "Optionen veröffentlichen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1625
msgid "Double click the radio button to remove its selected attribute."
msgstr ""
"Doppelklicken Sie auf den Radio Button, um sein ausgewähltes Attribut zu "
"entfernen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1644
msgid "Variation options"
msgstr "Variationsmöglichkeiten"

#: admin/class-themecomplete-epo-admin-builder-base.php:1674
#: admin/class-themecomplete-epo-admin-builder-base.php:4140
msgid "Image swatches"
msgstr "Bildtuare"

#: admin/class-themecomplete-epo-admin-builder-base.php:1678
#: admin/class-themecomplete-epo-admin-builder-base.php:4144
msgid "Color swatches"
msgstr "Farbtube"

#: admin/class-themecomplete-epo-admin-builder-base.php:1682
#: admin/class-themecomplete-epo-admin-builder-base.php:4148
msgid "Text swatches"
msgstr "Textfarbfelder"

#: admin/class-themecomplete-epo-admin-builder-base.php:1686
msgid "Replacement mode"
msgstr "Ersatzmodus"

#: admin/class-themecomplete-epo-admin-builder-base.php:1687
msgid "Select how to display the element."
msgstr "Wählen Sie aus, wie das Element angezeigt werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:1712
msgid "Start of the label"
msgstr "Start der Beschriftung"

#: admin/class-themecomplete-epo-admin-builder-base.php:1716
msgid "Center"
msgstr "Zentriert"

#: admin/class-themecomplete-epo-admin-builder-base.php:1720
msgid "End of the label"
msgstr "Ende der Beschriftung"

#: admin/class-themecomplete-epo-admin-builder-base.php:1724
msgid "Swatch position"
msgstr "Swatch-Position"

#: admin/class-themecomplete-epo-admin-builder-base.php:1725
msgid "Choose how the swatch will be displayed."
msgstr "Wählen Sie aus, wie das Farbfeld angezeigt werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:1754
msgid "Use image lightbox"
msgstr "Lightbox für Bilder verwenden"

#: admin/class-themecomplete-epo-admin-builder-base.php:1755
msgid "Choose whether to enable the lightbox on the thumbnail."
msgstr ""
"Wählen Sie, ob beim Klick auf die Miniaturansicht das Bild in voller Größe "
"in der Lightbox angezeigt werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:1789
#: admin/class-themecomplete-epo-admin-builder-base.php:4382
msgid "Use the image replacements"
msgstr "Verwenden Sie den Bildersatz"

#: admin/class-themecomplete-epo-admin-builder-base.php:1793
#: admin/class-themecomplete-epo-admin-builder-base.php:4386
msgid "Use custom image"
msgstr "Benutzerdefiniertes Bild nutzen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1797
#: admin/class-themecomplete-epo-admin-builder-base.php:4390
msgid "Changes product image"
msgstr "Produktbild verändert"

#: admin/class-themecomplete-epo-admin-builder-base.php:1798
#: admin/class-themecomplete-epo-admin-builder-base.php:4391
msgid "Choose whether to change the product image."
msgstr "Wählen Sie, ob Sie das Produktbild ändern möchten."

#: admin/class-themecomplete-epo-admin-builder-base.php:1828
msgid "Show label"
msgstr "Beschriftung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1832
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:607
msgid "Show description"
msgstr "Beschreibung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1836
msgid "Show label and description"
msgstr "Beschriftung und Beschreibung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1840
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:548
msgid "Show image"
msgstr "Bild anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1844
msgid "Show image and label"
msgstr "Bild und Beschriftung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1848
msgid "Show image and description"
msgstr "Bild und Beschreibung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1852
msgid "Show image, label and description"
msgstr "Bild, Beschriftung und Beschreibung anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1857
msgid "Show tooltip"
msgstr "Tooltip anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1858
msgid "Enabling this will show a tooltip over the choice."
msgstr "Wenn Sie dies aktivieren, wird ein Tooltip über der Auswahl angezeigt."

#: admin/class-themecomplete-epo-admin-builder-base.php:1887
msgid "Enable clear options button"
msgstr "Klarsicht-Optionen-Taste aktivieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:1888
msgid "This will add a button to clear the selected option."
msgstr ""
"Dadurch wird ein Button hinzugefügt, um die ausgewählte Option zu löschen."

#: admin/class-themecomplete-epo-admin-builder-base.php:1899
msgid "Show responsive values"
msgstr "Responsive Werte anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:1925
#: admin/class-themecomplete-epo-admin-builder-base.php:1941
#: admin/class-themecomplete-epo-admin-builder-base.php:1957
#: admin/class-themecomplete-epo-admin-builder-base.php:1973
#: admin/class-themecomplete-epo-admin-builder-base.php:1989
#: admin/class-themecomplete-epo-admin-builder-base.php:2005
#: admin/class-themecomplete-epo-admin-builder-base.php:2021
#: admin/class-themecomplete-epo-admin-builder-base.php:2037
#: admin/class-themecomplete-epo-admin-builder-base.php:2053
msgid "auto"
msgstr "automatisch"

#: admin/class-themecomplete-epo-admin-builder-base.php:1927
#: admin/class-themecomplete-epo-admin-builder-base.php:4215
msgid "Items per row (Desktops and laptops)"
msgstr "Artikel pro Reihe (Desktops und Laptops)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1928
#: admin/class-themecomplete-epo-admin-builder-base.php:1944
#: admin/class-themecomplete-epo-admin-builder-base.php:1960
#: admin/class-themecomplete-epo-admin-builder-base.php:1976
#: admin/class-themecomplete-epo-admin-builder-base.php:1992
#: admin/class-themecomplete-epo-admin-builder-base.php:2008
#: admin/class-themecomplete-epo-admin-builder-base.php:2024
#: admin/class-themecomplete-epo-admin-builder-base.php:2040
#: admin/class-themecomplete-epo-admin-builder-base.php:2056
#: admin/class-themecomplete-epo-admin-builder-base.php:4216
#: admin/class-themecomplete-epo-admin-builder-base.php:4232
#: admin/class-themecomplete-epo-admin-builder-base.php:4247
#: admin/class-themecomplete-epo-admin-builder-base.php:4262
#: admin/class-themecomplete-epo-admin-builder-base.php:4277
#: admin/class-themecomplete-epo-admin-builder-base.php:4292
#: admin/class-themecomplete-epo-admin-builder-base.php:4307
#: admin/class-themecomplete-epo-admin-builder-base.php:4322
#: admin/class-themecomplete-epo-admin-builder-base.php:4337
msgid ""
"Use this field to make a grid display. Enter how many items per row for the "
"grid or leave blank for normal display."
msgstr ""
"Verwenden Sie dieses Feld, um eine Rasteranzeige zu erstellen. Geben Sie "
"ein, wie viele Elemente pro Zeile für das Gitter verwendet werden, oder "
"lassen Sie leer für die normale Anzeige."

#: admin/class-themecomplete-epo-admin-builder-base.php:1943
#: admin/class-themecomplete-epo-admin-builder-base.php:4231
msgid "Items per row (Tablets landscape)"
msgstr "Elemente pro Zeile (Tablets Querformat)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1959
#: admin/class-themecomplete-epo-admin-builder-base.php:4246
msgid "Items per row (Tablets portrait)"
msgstr "Elemente pro Zeile (Tablets Porträt)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1975
#: admin/class-themecomplete-epo-admin-builder-base.php:4261
msgid "Items per row (Smartphones)"
msgstr "Artikel pro Reihe (Smartphones)"

#: admin/class-themecomplete-epo-admin-builder-base.php:1991
#: admin/class-themecomplete-epo-admin-builder-base.php:4276
msgid "Items per row (iPhone 5)"
msgstr "Artikel pro Reihe (iPhone 5)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2007
#: admin/class-themecomplete-epo-admin-builder-base.php:4291
msgid "Items per row (iPhone 6)"
msgstr "Artikel pro Reihe (iPhone 6)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2023
#: admin/class-themecomplete-epo-admin-builder-base.php:4306
msgid "Items per row (iPhone 6 +)"
msgstr "Artikel pro Reihe (iPhone 6 +)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2039
#: admin/class-themecomplete-epo-admin-builder-base.php:4321
msgid "Items per row (Samnsung Galaxy)"
msgstr "Gegenstände pro Reihe (Samnsung Galaxy)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2055
#: admin/class-themecomplete-epo-admin-builder-base.php:4336
msgid "Items per row (Galaxy Tablets landscape)"
msgstr "Elemente pro Zeile (Galaxy Tablets Querformat)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2098
#: admin/views/html-tm-epo-admin.php:81
msgid "Limit selection"
msgstr "Auswahl einschränken"

#: admin/class-themecomplete-epo-admin-builder-base.php:2099
msgid ""
"Enter a number above 0 to limit the checkbox selection or leave blank for "
"default behaviour."
msgstr ""
"Geben Sie eine Nummer über 0 ein, um die Auswahl des Kästchens zu begrenzen, "
"oder lassen Sie sie für das Standardverhalten leer."

#: admin/class-themecomplete-epo-admin-builder-base.php:2122
msgid "Exact selection"
msgstr "Exakte Auswahl"

#: admin/class-themecomplete-epo-admin-builder-base.php:2123
msgid ""
"Enter a number above 0 to have the user select the exact number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Geben Sie eine Nummer über 0 ein, um den Benutzer die genaue Anzahl der "
"Checkboxen wählen zu lassen oder für das Standardverhalten leer zu bleiben."

#: admin/class-themecomplete-epo-admin-builder-base.php:2146
msgid "Minimum selection"
msgstr "Mindestauswahl"

#: admin/class-themecomplete-epo-admin-builder-base.php:2147
msgid ""
"Enter a number above 0 to have the user select at least that number of "
"checkboxes or leave blank for default behaviour."
msgstr ""
"Geben Sie eine Zahl über 0 ein, damit der Benutzer mindestens diese Anzahl "
"von Checkboxen aktiviert, oder lassen Sie das Standardverhalten leer."

#: admin/class-themecomplete-epo-admin-builder-base.php:2171
msgid "Normal browser button"
msgstr "Normaler Browser-Button"

#: admin/class-themecomplete-epo-admin-builder-base.php:2175
msgid "Styled button"
msgstr "Stilvolle Schaltfläche"

#: admin/class-themecomplete-epo-admin-builder-base.php:2179
msgid "Upload button style"
msgstr "Knopf hochladen"

#: admin/class-themecomplete-epo-admin-builder-base.php:2206
msgid "Date field"
msgstr "Datumsfeld"

#: admin/class-themecomplete-epo-admin-builder-base.php:2210
msgid "Date picker"
msgstr "Datumsauswahl"

#: admin/class-themecomplete-epo-admin-builder-base.php:2214
msgid "Date field and picker"
msgstr "Datumsfeld und Picker"

#: admin/class-themecomplete-epo-admin-builder-base.php:2218
msgid "Date picker style"
msgstr "Datumsauswahl Style"

#: admin/class-themecomplete-epo-admin-builder-base.php:2241
#: admin/views/html-tm-epo-admin.php:64
msgid "Hide price"
msgstr "Preis ausblenden"

#: admin/class-themecomplete-epo-admin-builder-base.php:2242
msgid "Choose whether to hide the price or not."
msgstr "Wählen Sie, ob Sie den Preis verstecken möchten oder nicht."

#: admin/class-themecomplete-epo-admin-builder-base.php:2269
#: admin/class-themecomplete-epo-admin-builder-base.php:4179
#: admin/class-themecomplete-epo-admin-global-base.php:1873
#: admin/views/html-tm-global-epo.php:290
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:144
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:587
#: includes/classes/class-themecomplete-epo-settings-base.php:320
#: includes/classes/class-themecomplete-epo-settings-base.php:593
#: includes/classes/class-themecomplete-epo-settings-base.php:1978
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:514
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:279
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:294
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:649
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:297
msgid "Disable"
msgstr "Deaktivieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2273
msgid "Right"
msgstr "Rechts"

#: admin/class-themecomplete-epo-admin-builder-base.php:2277
msgid "Left"
msgstr "Links"

#: admin/class-themecomplete-epo-admin-builder-base.php:2281
msgid "Top"
msgstr "Oben"

#: admin/class-themecomplete-epo-admin-builder-base.php:2285
msgid "Bottom"
msgstr "Unten"

#: admin/class-themecomplete-epo-admin-builder-base.php:2289
msgid "Quantity selector"
msgstr "Mengenauswahl"

#: admin/class-themecomplete-epo-admin-builder-base.php:2290
msgid "This will show a quantity selector for this option."
msgstr "Mengen Auswahl für diese Option anzuzeigen."

#: admin/class-themecomplete-epo-admin-builder-base.php:2295
msgid "Quantity min value"
msgstr "Menge min Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:2309
msgid "Quantity max value"
msgstr "Menge max Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:2334
msgid "Quantity step"
msgstr "Mengenschritt"

#: admin/class-themecomplete-epo-admin-builder-base.php:2335
msgid "Enter the quantity step."
msgstr "Geben Sie die Menge für einen Schritt ein."

#: admin/class-themecomplete-epo-admin-builder-base.php:2354
msgid "Quantity Default value"
msgstr "Menge Standard Wert"

#: admin/class-themecomplete-epo-admin-builder-base.php:2356
msgid "Enter a value to be applied to the Quantity field automatically."
msgstr ""
"Geben Sie einen Wert ein, der automatisch auf das Menge Feld angewendet "
"werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:2389
msgid "Placeholder"
msgstr "Platzhalter"

#: admin/class-themecomplete-epo-admin-builder-base.php:2416
msgid "Minimum characters"
msgstr "Mindestanzahl von Zeichen"

#: admin/class-themecomplete-epo-admin-builder-base.php:2417
#: includes/classes/class-themecomplete-epo-settings-base.php:2028
#: includes/classes/class-themecomplete-epo-settings-base.php:2036
msgid "Enter a value for the minimum characters the user must enter."
msgstr ""
"Geben Sie einen Wert für die Mindestzeichen ein, die der Benutzer eingeben "
"muss."

#: admin/class-themecomplete-epo-admin-builder-base.php:2441
msgid "Maximum characters"
msgstr "Max. Zeichen"

#: admin/class-themecomplete-epo-admin-builder-base.php:2442
msgid "Enter a value to limit the maximum characters the user can enter."
msgstr ""
"Geben Sie einen Wert ein, um die maximalen Zeichen zu begrenzen, die der "
"Benutzer eingeben kann."

#: admin/class-themecomplete-epo-admin-builder-base.php:2466
#: admin/class-themecomplete-epo-admin-builder-base.php:2491
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:165
msgid "Default value"
msgstr "Standardwert"

#: admin/class-themecomplete-epo-admin-builder-base.php:2467
#: admin/class-themecomplete-epo-admin-builder-base.php:2492
msgid "Enter a value to be applied to the field automatically."
msgstr ""
"Geben Sie automatisch einen Wert ein, der auf das Feld angewendet werden "
"soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:2533
#: admin/class-themecomplete-epo-admin-builder-base.php:2885
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:267
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:200
#: includes/classes/class-themecomplete-epo-helper-base.php:1180
msgid "Size"
msgstr "Größe"

#: admin/class-themecomplete-epo-admin-builder-base.php:2537
#: admin/class-themecomplete-epo-admin-builder-base.php:2889
msgid "Reduce Width"
msgstr "Breite reduzieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2540
#: admin/class-themecomplete-epo-admin-builder-base.php:2892
msgid "Increase Width"
msgstr "Erhöhen Sie die Breite"

#: admin/class-themecomplete-epo-admin-builder-base.php:2545
msgid "Edit Element"
msgstr "Element bearbeiten"

#: admin/class-themecomplete-epo-admin-builder-base.php:2550
msgid "Duplicate Element"
msgstr "Element duplizieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2553
#: admin/class-themecomplete-epo-admin-global-base.php:2699
#: admin/class-themecomplete-epo-admin-global-base.php:2701
msgid "Change Element Type"
msgstr ""

#: admin/class-themecomplete-epo-admin-builder-base.php:2583
#: admin/class-themecomplete-epo-admin-global-base.php:2737
msgid "(No title)"
msgstr "(kein Titel)"

#: admin/class-themecomplete-epo-admin-builder-base.php:2896
msgid "Edit Section"
msgstr "Abschnitt bearbeiten"

#: admin/class-themecomplete-epo-admin-builder-base.php:2900
msgid "Duplicate Section"
msgstr "Section duplizieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:2915
#: admin/class-themecomplete-epo-admin-builder-base.php:2982
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:29
msgid "Section"
msgstr "Abschnitt"

#: admin/class-themecomplete-epo-admin-builder-base.php:3024
#: admin/class-themecomplete-epo-admin-builder-base.php:3053
#: admin/class-themecomplete-epo-admin-builder-base.php:3072
#: admin/class-themecomplete-epo-admin-builder-base.php:3087
#: admin/class-themecomplete-epo-admin-global-base.php:1691
#: admin/class-themecomplete-epo-admin-global-base.php:1750
#: admin/class-themecomplete-epo-admin-global-base.php:2729
msgid "Add element"
msgstr "Element hinzufügen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4674
#: admin/class-themecomplete-epo-admin-builder-base.php:4951
msgid "Choose the image to use in place of the radio button."
msgstr ""
"Wählen Sie das Bild aus, das anstelle des Funkknopfes verwendet wird, wenn "
"es aktiviert ist."

#: admin/class-themecomplete-epo-admin-builder-base.php:4048
#: admin/class-themecomplete-epo-admin-builder-base.php:4065
msgid "Remove the image."
msgstr "Dieses Bild entfernen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4065
#: admin/class-themecomplete-epo-admin-builder-base.php:4753
#: admin/class-themecomplete-epo-admin-builder-base.php:4755
#: admin/class-themecomplete-epo-admin-builder-base.php:4957
#: admin/class-themecomplete-epo-admin-builder-base.php:4962
msgid "Choose the image to replace the product image with."
msgstr "Wählen Sie das Bild, um das Produktbild zu ersetzen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4124
msgid "Select boxes"
msgstr "Boxen auswählen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4128
#: admin/views/html-tm-epo-admin.php:55
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:278
#: includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1850
msgid "Radio buttons"
msgstr "Radio Buttons"

#: admin/class-themecomplete-epo-admin-builder-base.php:4132
msgid "Radio buttons and image at start of the label"
msgstr "Funktasten und Bild beim Start des Labels"

#: admin/class-themecomplete-epo-admin-builder-base.php:4136
msgid "Radio buttons and image at end of the label"
msgstr "Funkknöpfe und Bild am Ende des Labels"

#: admin/class-themecomplete-epo-admin-builder-base.php:4152
msgid "Display as"
msgstr "Anzeigen als"

#: admin/class-themecomplete-epo-admin-builder-base.php:4153
msgid "Select the display type of this attribute."
msgstr "Wählen Sie den Anzeigetyp dieses Attributs aus."

#: admin/class-themecomplete-epo-admin-builder-base.php:4165
msgid "Attribute Label"
msgstr "Attribut Beschriftung"

#: admin/class-themecomplete-epo-admin-builder-base.php:4166
msgid "Leave blank to use the original attribute label."
msgstr "Freilassen, um die urspüngliche Attribut-Bezeichnung zu verwenden."

#: admin/class-themecomplete-epo-admin-builder-base.php:4183
#: admin/views/html-tm-global-epo.php:286
#: includes/classes/class-themecomplete-epo-settings-base.php:319
#: includes/classes/class-themecomplete-epo-settings-base.php:1977
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:515
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:280
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:295
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:650
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:298
msgid "Enable"
msgstr "Aktivieren"

#: admin/class-themecomplete-epo-admin-builder-base.php:4187
msgid "Show reset button"
msgstr "Reset-Taste anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4188
msgid "Enables the display of a reset button for this attribute."
msgstr "Ermöglicht die Anzeige eines Reset-Buttons für dieses Attribut."

#: admin/class-themecomplete-epo-admin-builder-base.php:4200
msgid "Attribute element class name"
msgstr "Attribut CSS-Klasse"

#: admin/class-themecomplete-epo-admin-builder-base.php:4201
msgid "Enter an extra class name to add to this attribute element"
msgstr ""
"Geben Sie einen zusätzlichen Class Namen für dieses Attributelement ein"

#: admin/class-themecomplete-epo-admin-builder-base.php:4350
msgid "Width"
msgstr "Breite"

#: admin/class-themecomplete-epo-admin-builder-base.php:4351
msgid "Enter the width of the displayed item or leave blank for auto width."
msgstr ""
"Geben Sie die Breite des angezeigten Gegenstandes ein oder lassen Sie "
"Leerzeichen für die automatische Breite."

#: admin/class-themecomplete-epo-admin-builder-base.php:4364
msgid "Height"
msgstr "Höhe"

#: admin/class-themecomplete-epo-admin-builder-base.php:4365
msgid "Enter the height of the displayed item or leave blank for auto height."
msgstr ""
"Geben Sie die Höhe des angezeigten Gegenstandes ein oder lassen Sie die "
"automatische Höhe leer."

#: admin/class-themecomplete-epo-admin-builder-base.php:4405
#: admin/views/html-tm-global-epo.php:328
#: admin/views/html-tm-global-epo.php:362
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2009
#: includes/classes/class-themecomplete-epo-settings-base.php:335
#: includes/classes/class-themecomplete-epo-settings-base.php:349
msgid "Hide"
msgstr "Verstecken"

#: admin/class-themecomplete-epo-admin-builder-base.php:4409
#: admin/views/html-tm-global-epo.php:324
#: admin/views/html-tm-global-epo.php:358
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2008
#: includes/classes/class-themecomplete-epo-settings-base.php:334
#: includes/classes/class-themecomplete-epo-settings-base.php:348
msgid "Show"
msgstr "Anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4417
msgid "Show attribute name"
msgstr "Attribut-Name anzeigen"

#: admin/class-themecomplete-epo-admin-builder-base.php:4418
msgid "Choose whether to show or hide the attribute name."
msgstr ""
"Wählen Sie, ob Sie die den Attributname anzeigen oder ausblenden möchten."

#: admin/class-themecomplete-epo-admin-builder-base.php:4434
msgid "Color"
msgstr "Farbe"

#: admin/class-themecomplete-epo-admin-builder-base.php:4435
msgid "Select the color to use."
msgstr "Wählen Sie die Farbe aus, die Sie verwenden möchten."

#: admin/class-themecomplete-epo-admin-builder-base.php:4447
msgid "Image replacement"
msgstr "Bildersatz"

#: admin/class-themecomplete-epo-admin-builder-base.php:4448
msgid "Select an image for this term."
msgstr "Wählen Sie ein Bild für diesen Begriff."

#: admin/class-themecomplete-epo-admin-builder-base.php:4462
msgid "Product Image replacement"
msgstr "Produktbild Ersatz"

#: admin/class-themecomplete-epo-admin-builder-base.php:4463
msgid "Select the image to replace the product image with."
msgstr "Wählen Sie das Bild, um das Produktbild zu ersetzen."

#: admin/class-themecomplete-epo-admin-builder-base.php:4490
msgid "No saved variations found."
msgstr "Es wurden keine gespeicherten Variationen gefunden."

#: admin/class-themecomplete-epo-admin-builder-base.php:4676
#: admin/class-themecomplete-epo-admin-builder-base.php:4954
msgid "Choose the image to use in place of the checkbox."
msgstr ""
"Wählen Sie das Bild, das anstelle des Auswahlfeldes verwendet werden soll."

#: admin/class-themecomplete-epo-admin-builder-base.php:4714
#: admin/class-themecomplete-epo-admin-builder-base.php:4952
msgid ""
"Choose the image to use in place of the radio button when it is checked."
msgstr ""
"Wählen Sie das Bild aus, das anstelle des Funkknopfes verwendet wird, wenn "
"es aktiviert ist."

#: admin/class-themecomplete-epo-admin-builder-base.php:4716
#: admin/class-themecomplete-epo-admin-builder-base.php:4955
msgid "Choose the image to use in place of the checkbox when it is checked."
msgstr ""
"Wählen Sie das Bild aus, das anstelle des Kontrollkästchens verwendet wird, "
"wenn es aktiviert ist."

#: admin/class-themecomplete-epo-admin-builder-base.php:4791
#: admin/class-themecomplete-epo-admin-builder-base.php:4793
#: admin/class-themecomplete-epo-admin-builder-base.php:4958
#: admin/class-themecomplete-epo-admin-builder-base.php:4963
msgid "Choose the image for the lightbox."
msgstr "Wählen Sie das Bild für die Lightbox."

#: admin/class-themecomplete-epo-admin-builder-base.php:5123
msgid "Delete all options"
msgstr "Alle Optionen löschen"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
msgid "Checked"
msgstr "Ausgewählt"

#: admin/class-themecomplete-epo-admin-builder-base.php:5350
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:132
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:201
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:171
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:423
#: includes/classes/class-themecomplete-epo-settings-base.php:1431
msgid "Default"
msgstr "Standard"

#: admin/class-themecomplete-epo-admin-builder-base.php:5419
msgid "Choice label"
msgstr "Auswahllabel"

#: admin/class-themecomplete-epo-admin-builder-base.php:5515
msgid "Price Type"
msgstr "Preis Typ"

#: admin/class-themecomplete-epo-admin-builder-base.php:5539
#: admin/class-themecomplete-epo-admin-global-base.php:1055
#: admin/class-themecomplete-epo-admin-global-base.php:1478
msgid "Description"
msgstr "Beschreibung"

#: admin/class-themecomplete-epo-admin-builder-base.php:5583
msgid "URL"
msgstr "URL"

#: admin/class-themecomplete-epo-admin-builder-base.php:5595
msgid "Add item"
msgstr "Füge Element hinzu"

#: admin/class-themecomplete-epo-admin-builder-base.php:5597
msgid "Add separator"
msgstr "Trennzeichen hinzufügen"

#: admin/class-themecomplete-epo-admin-builder-base.php:5599
msgid "Mass add"
msgstr "Massenzugabe"

#: admin/class-themecomplete-epo-admin-csv.php:41
msgid ""
"The php functions mb_detect_encoding and mb_convert_encoding are required to "
"import and export CSV files. Please ask your hosting provider to enable this "
"function."
msgstr ""
"Die PHP-Funktionen mb_detect_encoding und mb_convert_encoding sind "
"erforderlich um CSV Dateien zu importieren und exportieren. Bitte wenden Sie "
"sich zur Aktivierung dieser Funktionen an Ihren Hosting-Provider."

#: admin/class-themecomplete-epo-admin-csv.php:289
msgid "Invalid CSV file."
msgstr "Ungültige CSV-Datei."

#: admin/class-themecomplete-epo-admin-csv.php:300
#: includes/classes/class-themecomplete-epo-cart.php:2884
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgstr ""
"Die hochgeladene Datei überschreitet die upload_max_filesize Begrenzung in "
"der php.ini."

#: admin/class-themecomplete-epo-admin-csv.php:301
#: includes/classes/class-themecomplete-epo-cart.php:2885
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form."
msgstr "Die hochgeladene Datei überschreitet die maximale Dateigröße."

#: admin/class-themecomplete-epo-admin-csv.php:302
#: includes/classes/class-themecomplete-epo-cart.php:2886
msgid "The uploaded file was only partially uploaded."
msgstr "Die geladene Datei wurde nur teilweise geladen."

#: admin/class-themecomplete-epo-admin-csv.php:303
#: includes/classes/class-themecomplete-epo-cart.php:2887
msgid "No file was uploaded."
msgstr "Keine Datei wurde geladen."

#: admin/class-themecomplete-epo-admin-csv.php:305
#: includes/classes/class-themecomplete-epo-cart.php:2889
msgid "Missing a temporary folder."
msgstr "Ein temporärer Ordner wurde nicht gefunden."

#: admin/class-themecomplete-epo-admin-csv.php:306
#: includes/classes/class-themecomplete-epo-cart.php:2890
msgid "Failed to write file to disk."
msgstr "Das Speichern der Datei ist fehlgeschlagen."

#: admin/class-themecomplete-epo-admin-csv.php:307
#: includes/classes/class-themecomplete-epo-cart.php:2891
msgid "File upload stopped by extension."
msgstr ""
"Das Hochladen der Datei wurde aufgrund der Dateierweiterung abgebrochen."

#: admin/class-themecomplete-epo-admin-csv.php:319
#: includes/classes/class-themecomplete-epo-cart.php:2929
#: includes/classes/class-themecomplete-epo-cart.php:2938
#: includes/classes/class-themecomplete-epo-cart.php:2948
msgid "Sorry, this file type is not permitted for security reasons."
msgstr ""
"Entschuldigung, aber dieser Dateityp ist aus Sicherheitsgründen nicht "
"erlaubt."

#: admin/class-themecomplete-epo-admin-csv.php:324
msgid "No file found."
msgstr "Keine Datei gefunden."

#: admin/class-themecomplete-epo-admin-csv.php:337
msgid "Invalid import method used."
msgstr "Ungültige Importmethode verwendet."

#: admin/class-themecomplete-epo-admin-csv.php:393
#: admin/class-themecomplete-epo-admin-csv.php:437
msgid "File imported."
msgstr "Datei wurde importiert."

#: admin/class-themecomplete-epo-admin-csv.php:397
#: admin/class-themecomplete-epo-admin-csv.php:440
msgid "The CSV file is invalid!"
msgstr "Die CSV-Datei ist ungültig!"

#: admin/class-themecomplete-epo-admin-csv.php:552
msgid "Invalid CSV file!"
msgstr "Ungültige CSV-Datei!"

#: admin/class-themecomplete-epo-admin-csv.php:595
#: includes/class-themecomplete-extra-product-options.php:1071
#, php-format
msgid "Trying to upload files larger than %s is not allowed!"
msgstr "Der Upload von Dateien größer als %s ist nicht erlaubt!"

#: admin/class-themecomplete-epo-admin-csv.php:624
msgid "File imported with new tables."
msgstr "Datei mit neuen Tabellen importiert."

#: admin/class-themecomplete-epo-admin-csv.php:633
msgid "There was an error importing the CSV file."
msgstr "Beim Importieren der CSV-Datei ist ein Fehler aufgetreten."

#: admin/class-themecomplete-epo-admin-csv.php:662
msgid ""
"There was an error saving the csv data. Please check the encoding of your "
"csv file!"
msgstr ""
"Beim Speichern der CSV-Daten ist ein Fehler aufgetreten. Bitte überprüfen "
"Sie die Kodierung Ihrer CSV-Datei!"

#: admin/class-themecomplete-epo-admin-csv.php:678
msgid "Table names are different. Do you want to override the tables?"
msgstr ""
"Tabellennamen sind unterschiedlich. Möchten Sie die Tabellen überschreiben?"

#: admin/class-themecomplete-epo-admin-csv.php:748
#: includes/classes/class-themecomplete-epo-update-licenser.php:220
msgid "Invalid data!"
msgstr "Ungültige Daten!"

#: admin/class-themecomplete-epo-admin-global-base.php:261
msgid "Something went wrong with the request!"
msgstr "Mit der Bitte ist etwas schief gelaufen!"

#: admin/class-themecomplete-epo-admin-global-base.php:306
msgid "Options saved!"
msgstr "Optionen gespeichert!"

#: admin/class-themecomplete-epo-admin-global-base.php:517
#: admin/views/html-tm-global-epo.php:176
msgid "Include additional Global forms"
msgstr "Zusätzliche globale Formulare einbinden"

#: admin/class-themecomplete-epo-admin-global-base.php:519
msgid "(no title)"
msgstr "(kein Titel)"

#: admin/class-themecomplete-epo-admin-global-base.php:523
msgid "Clear all additional Global forms"
msgstr "Alle zusätzlichen globalen Formulare entfernen"

#: admin/class-themecomplete-epo-admin-global-base.php:525
msgid "Disable Exclude from Global Options"
msgstr "Ausschließen von globalen Optionen deaktivieren"

#: admin/class-themecomplete-epo-admin-global-base.php:526
msgid "Enable Exclude from Global Options"
msgstr "Ausschließen von globalen Optionen aktivieren"

#: admin/class-themecomplete-epo-admin-global-base.php:527
msgid "Delete all options on the product"
msgstr "Alle Optionen vom Produkt löschen"

#: admin/class-themecomplete-epo-admin-global-base.php:613
msgid "File manager is not supported on your server."
msgstr "Der Dateimanager wird auf Ihrem Server nicht unterstützt."

#: admin/class-themecomplete-epo-admin-global-base.php:630
msgid "Your settings have been reset."
msgstr "Ihre Einstellungen wurden zurückgesetzt."

#: admin/class-themecomplete-epo-admin-global-base.php:657
#: admin/class-themecomplete-epo-admin-global-base.php:700
msgid "There was an error saving the settings."
msgstr "Beim Speichern der Einstellungen ist ein Fehler aufgetreten."

#: admin/class-themecomplete-epo-admin-global-base.php:678
msgid "Your settings have been saved."
msgstr "Ihre Einstellungen wurden gespeichert."

#: admin/class-themecomplete-epo-admin-global-base.php:914
msgid "Clone template"
msgstr "Klonvorlage"

#: admin/class-themecomplete-epo-admin-global-base.php:946
msgid "Clone form"
msgstr "Formular duplizieren"

#: admin/class-themecomplete-epo-admin-global-base.php:951
msgid "Export form"
msgstr "Dieses Formular exportieren"

#: admin/class-themecomplete-epo-admin-global-base.php:1053
#: admin/class-themecomplete-epo-admin-global-base.php:1481
msgid "Extra Product Options Form Builder"
msgstr "Formular-Tool zum Erstellen zusätzlicher Produktoptionen"

#: admin/class-themecomplete-epo-admin-global-base.php:1128
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:183
msgid "Title"
msgstr "Titel"

#: admin/class-themecomplete-epo-admin-global-base.php:1138
#: admin/class-themecomplete-epo-admin-global-base.php:1859
msgid "Priority"
msgstr "Priorität"

#: admin/class-themecomplete-epo-admin-global-base.php:1139
msgid "Applied on"
msgstr "Angewendet auf"

#: admin/class-themecomplete-epo-admin-global-base.php:1140
#: admin/class-themecomplete-epo-admin-global-base.php:1242
#: admin/class-themecomplete-epo-admin-global-base.php:1264
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:102
msgid "Categories"
msgstr "Kategorie"

#: admin/class-themecomplete-epo-admin-global-base.php:1141
#: admin/class-themecomplete-epo-admin-global-base.php:1245
#: admin/class-themecomplete-epo-admin-global-base.php:1254
#: admin/class-themecomplete-epo-admin-global-base.php:1469
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:94
msgid "Products"
msgstr "Produkte"

#: admin/class-themecomplete-epo-admin-global-base.php:1142
msgid "Excluded Products"
msgstr "Ausgeschlossene Produkte"

#: admin/class-themecomplete-epo-admin-global-base.php:1231
#: admin/class-themecomplete-epo-admin-global-base.php:1267
#: admin/class-themecomplete-epo-admin-global-base.php:1359
#: admin/class-themecomplete-epo-admin-global-base.php:1374
msgid "ALL products"
msgstr "ALLE Produkte"

#: admin/class-themecomplete-epo-admin-global-base.php:1234
#: admin/class-themecomplete-epo-admin-global-base.php:1256
#: admin/class-themecomplete-epo-admin-global-base.php:1288
#: admin/class-themecomplete-epo-admin-global-base.php:1302
msgid "Disabled"
msgstr "Deaktiviert"

#: admin/class-themecomplete-epo-admin-global-base.php:1240
#: admin/class-themecomplete-epo-admin-global-base.php:1262
msgid "Products and Categories"
msgstr "Produkte und Kategorien"

#: admin/class-themecomplete-epo-admin-global-base.php:1247
#, fuzzy
#| msgid "Custom code"
msgid "Custom"
msgstr "Benutzerdefinierter Code"

#: admin/class-themecomplete-epo-admin-global-base.php:1285
#: admin/class-themecomplete-epo-admin-global-base.php:1309
msgid "ALL categories"
msgstr "ALLE Kategorien"

#: admin/class-themecomplete-epo-admin-global-base.php:1439
#, fuzzy
#| msgid "CSS Settings"
msgid "Form settings"
msgstr "CSS-Einstellungen"

#: admin/class-themecomplete-epo-admin-global-base.php:1442
#: admin/class-themecomplete-epo-admin-global-base.php:1820
#: admin/class-themecomplete-epo-admin-global-base.php:1821
msgid "Publish"
msgstr "Veröffentlichen"

#: admin/class-themecomplete-epo-admin-global-base.php:1472
msgid "Roles"
msgstr "Rollen"

#: admin/class-themecomplete-epo-admin-global-base.php:1475
msgid "Exclude Products"
msgstr "Produkte ausschliessen"

#: admin/class-themecomplete-epo-admin-global-base.php:1502
msgid "The description will appear under the title."
msgstr "Die Beschreibung wird unter dem Titel angezeigt."

#: admin/class-themecomplete-epo-admin-global-base.php:1531
msgid "Enabled roles for this form"
msgstr "Rollen für dieses Formular aktivieren"

#: admin/class-themecomplete-epo-admin-global-base.php:1546
msgid "Disabled roles for this form"
msgstr "Rollen für dieses Formular deaktivieren"

#: admin/class-themecomplete-epo-admin-global-base.php:1574
msgid "Exclude Product(s) from the form"
msgstr "Produkt(e) aus dem Formular ausschließen"

#: admin/class-themecomplete-epo-admin-global-base.php:1575
#: admin/class-themecomplete-epo-admin-global-base.php:1629
msgid "Search for a product&hellip;"
msgstr "Nach einem Produkt suchen&hellip;"

#: admin/class-themecomplete-epo-admin-global-base.php:1602
msgid "Select the Product(s) to apply the options"
msgstr "Wählen Sie die Produkte, um die Optionen anzuwenden"

#: admin/class-themecomplete-epo-admin-global-base.php:1621
msgid "Meta data not correctly saved. Please save the product!"
msgstr "Metadaten nicht korrekt gespeichert. Bitte speichern Sie das Produkt!"

#: admin/class-themecomplete-epo-admin-global-base.php:1692
#: admin/class-themecomplete-epo-admin-global-base.php:1752
msgid "Add section"
msgstr "Abschnitt hinzufügen"

#: admin/class-themecomplete-epo-admin-global-base.php:1693
#: admin/class-themecomplete-epo-admin-global-base.php:1753
msgid "Style variations"
msgstr "Style-Variationen"

#: admin/class-themecomplete-epo-admin-global-base.php:1701
#: admin/class-themecomplete-epo-admin-global-base.php:2732
msgid "Save"
msgstr "Speichern"

#: admin/class-themecomplete-epo-admin-global-base.php:1703
#: admin/class-themecomplete-epo-admin-global-base.php:1757
#: admin/class-themecomplete-epo-admin-global-base.php:1759
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:261
msgid "Import CSV"
msgstr "CSV-Datei importieren"

#: admin/class-themecomplete-epo-admin-global-base.php:1704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:262
msgid "Export CSV"
msgstr "Exportiere CSV"

#: admin/class-themecomplete-epo-admin-global-base.php:1708
#: admin/class-themecomplete-epo-admin-global-base.php:1724
msgid "Fullsize"
msgstr "Fullsize"

#: admin/class-themecomplete-epo-admin-global-base.php:1715
#: admin/class-themecomplete-epo-admin-global-base.php:1762
msgid "Please save the form before importing options!"
msgstr "Bitte speichern Sie das Formular, bevor Sie Optionen importieren!"

#: admin/class-themecomplete-epo-admin-global-base.php:1719
#: admin/class-themecomplete-epo-admin-global-base.php:1766
msgid "Please save the product before importing options!"
msgstr "Bitte speichern Sie das Produkt vor dem Import von Optionen!"

#: admin/class-themecomplete-epo-admin-global-base.php:1739
#: admin/class-themecomplete-epo-admin-global-base.php:1745
msgid "No elements found!"
msgstr "Keine Elemente gefunden!"

#: admin/class-themecomplete-epo-admin-global-base.php:1741
msgid "Start adding elements"
msgstr "Fügen Sie ein Element hinzu"

#: admin/class-themecomplete-epo-admin-global-base.php:1776
msgid "Add element in a new section"
msgstr "Element in einem neuen Abschnitt hinzufügen"

#: admin/class-themecomplete-epo-admin-global-base.php:1805
msgid "Delete Permanently"
msgstr "Dauerhaft löschen"

#: admin/class-themecomplete-epo-admin-global-base.php:1807
msgid "Move to Trash"
msgstr "In den Papierkorb verschieben"

#: admin/class-themecomplete-epo-admin-global-base.php:1827
#: admin/class-themecomplete-epo-admin-global-base.php:1829
#: admin/class-themecomplete-epo-admin-global-base.php:2704
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:213
msgid "Update"
msgstr "Aktualisieren"

#: admin/class-themecomplete-epo-admin-global-base.php:1867
#, fuzzy
#| msgid "Self mode"
msgid "Apply mode"
msgstr "Selbstmodus"

#: admin/class-themecomplete-epo-admin-global-base.php:1871
#, fuzzy
#| msgid "ALL products"
msgid "All products"
msgstr "ALLE Produkte"

#: admin/class-themecomplete-epo-admin-global-base.php:1875
#, fuzzy
#| msgid "Custom price"
msgid "Customize"
msgstr "Sonderpreis"

#: admin/class-themecomplete-epo-admin-global-base.php:1961
msgid "Something went wrong with WordPress."
msgstr "Da lief was falsch mit Wordpress."

#: admin/class-themecomplete-epo-admin-global-base.php:1969
msgid "WooCommerce is not enabled!"
msgstr "WooCommerce ist nicht aktiviert!"

#: admin/class-themecomplete-epo-admin-global-base.php:1972
#: admin/class-themecomplete-epo-admin-global-base.php:2303
msgid "Cheatin&#8217; uh?"
msgstr "Na - schummelt da wer ?"

#: admin/class-themecomplete-epo-admin-global-base.php:2024
#: admin/class-themecomplete-epo-admin-global-base.php:2191
msgid "You are not allowed to move this item to the Trash."
msgstr ""
"Du bist nicht berechtigt, diesen Beitrag in den Papierkorb zu verschieben."

#: admin/class-themecomplete-epo-admin-global-base.php:2032
#: admin/class-themecomplete-epo-admin-global-base.php:2202
msgid "Error in moving to Trash."
msgstr "Fehler beim Verschieben in den Papierkorb."

#: admin/class-themecomplete-epo-admin-global-base.php:2052
msgid "You are not allowed to restore this item from the Trash."
msgstr ""
"Sie sind nicht berechtigt, dieses Element aus dem Papierkorb "
"wiederherzustellen."

#: admin/class-themecomplete-epo-admin-global-base.php:2056
#: admin/class-themecomplete-epo-admin-global-base.php:2234
msgid "Error in restoring from Trash."
msgstr "Fehler beim Wiederherstellen aus dem Papierkorb."

#: admin/class-themecomplete-epo-admin-global-base.php:2075
#: admin/class-themecomplete-epo-admin-global-base.php:2252
msgid "You are not allowed to delete this item."
msgstr "Sie sind nicht berechtigt diesen Inhalt zu löschen."

#: admin/class-themecomplete-epo-admin-global-base.php:2080
#: admin/class-themecomplete-epo-admin-global-base.php:2083
#: admin/class-themecomplete-epo-admin-global-base.php:2259
#: admin/class-themecomplete-epo-admin-global-base.php:2262
msgid "Error in deleting."
msgstr "Fehler beim Löschen."

#: admin/class-themecomplete-epo-admin-global-base.php:2183
msgid "The item you are trying to move to the Trash no longer exists."
msgstr ""
"Der Gegenstand, den Sie versuchen, in den Papierkorb zu legen, existiert "
"nicht mehr."

#: admin/class-themecomplete-epo-admin-global-base.php:2187
#: admin/class-themecomplete-epo-admin-global-base.php:2226
#: admin/class-themecomplete-epo-admin-global-base.php:2248
#: admin/class-themecomplete-epo-admin-global-base.php:2289
msgid "Unknown post type."
msgstr "Unbekannter Beitragstyp."

#: admin/class-themecomplete-epo-admin-global-base.php:2198
#, php-format
msgid "You cannot move this item to the Trash. %s is currently editing."
msgstr ""
"Sie können dieses Element nicht in den Papierkorb verschieben. Es wird z.Zt. "
"von %s bearbeitet."

#: admin/class-themecomplete-epo-admin-global-base.php:2222
msgid "The item you are trying to restore from the Trash no longer exists."
msgstr ""
"Der Gegenstand, den Sie aus dem Papierkorb wiederherstellen wollen, "
"existiert nicht mehr."

#: admin/class-themecomplete-epo-admin-global-base.php:2230
msgid "You are not allowed to move this item out of the Trash."
msgstr ""
"Du verfügst nicht über ausreichende Rechte, um dieses Element aus dem "
"Papierkorb wiederherzustellen."

#: admin/class-themecomplete-epo-admin-global-base.php:2244
msgid "This item has already been deleted."
msgstr "Dieser Artikel wurde bereits gelöscht."

#: admin/class-themecomplete-epo-admin-global-base.php:2286
msgid ""
"You attempted to edit an item that doesn&#8217;t exist. Perhaps it was "
"deleted?"
msgstr ""
"Sie haben versucht, einen Gegenstand zu bearbeiten, der nicht existiert. "
"Vielleicht wurde er gelöscht?"

#: admin/class-themecomplete-epo-admin-global-base.php:2292
msgid "You are not allowed to edit this item."
msgstr "Sie haben keine Berechtigung, diesen Artikel zu bearbeiten."

#: admin/class-themecomplete-epo-admin-global-base.php:2296
msgid ""
"You can&#8217;t edit this item because it is in the Trash. Please restore it "
"and try again."
msgstr ""
"Sie können dieses Element nicht bearbeiten, da es im Papierkorb liegt. "
"Stellen Sie es wieder her und versuchen es dann erneut."

#: admin/class-themecomplete-epo-admin-global-base.php:2339
#, php-format
msgid "%s post updated."
msgid_plural "%s posts updated."
msgstr[0] "%s Beitrag aktualisiert."
msgstr[1] "%s Beiträge aktualisiert."

#: admin/class-themecomplete-epo-admin-global-base.php:2341
#, php-format
msgid "%s post not updated, somebody is editing it."
msgid_plural "%s posts not updated, somebody is editing them."
msgstr[0] "%s Beitrag nicht aktualisiert, da er von jemandem bearbeitet wird."
msgstr[1] ""
"%s Beiträge nicht aktualisiert, da sie von jemandem bearbeitet werden."

#: admin/class-themecomplete-epo-admin-global-base.php:2343
#, php-format
msgid "%s post permanently deleted."
msgid_plural "%s posts permanently deleted."
msgstr[0] "%s Beitrag dauerhaft gelöscht."
msgstr[1] "%s Beiträge dauerhaft gelöscht."

#: admin/class-themecomplete-epo-admin-global-base.php:2345
#, php-format
msgid "%s post moved to the Trash."
msgid_plural "%s posts moved to the Trash."
msgstr[0] "%s Beitrag in den Papierkorb verschoben."
msgstr[1] "%s Beiträge in den Papierkorb verschoben."

#: admin/class-themecomplete-epo-admin-global-base.php:2347
#, php-format
msgid "%s post restored from the Trash."
msgid_plural "%s posts restored from the Trash."
msgstr[0] "%s Beitrag aus dem Papierkorb wiederhergestellt."
msgstr[1] "%s Beiträge aus dem Papierkorb wiederhergestellt."

#: admin/class-themecomplete-epo-admin-global-base.php:2353
msgid "The selected form does not contain any sections"
msgstr "Die gewählte Form enthält keine Abschnitte"

#: admin/class-themecomplete-epo-admin-global-base.php:2471
msgid "Show filters"
msgstr "Filter anzeigen"

#: admin/class-themecomplete-epo-admin-global-base.php:2472
msgid "Hide filters"
msgstr "Filter ausblenden"

#: admin/class-themecomplete-epo-admin-global-base.php:2490
msgid "Filter by"
msgstr "Filtern nach"

#: admin/class-themecomplete-epo-admin-global-base.php:2553
msgctxt "Google font: on or off"
msgid "on"
msgstr "an"

#: admin/class-themecomplete-epo-admin-global-base.php:2697
msgid "Are you sure you want to delete this item?"
msgstr "Sind Sie sicher, dass Sie diesen Inhalt löschen möchten?"

#: admin/class-themecomplete-epo-admin-global-base.php:2698
msgid "Are you sure you want to clone this item?"
msgstr "Wollen Sie diesen Artikel wirklich klonen?"

#: admin/class-themecomplete-epo-admin-global-base.php:2700
msgid "Would you like the new element to inherit data from the previous one?"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2707
msgid "Edit settings"
msgstr "Einstellungen bearbeiten"

#: admin/class-themecomplete-epo-admin-global-base.php:2708
msgid "Element id"
msgstr "Element-ID"

#: admin/class-themecomplete-epo-admin-global-base.php:2709
msgid "Section id"
msgstr "Abschnitt ID"

#: admin/class-themecomplete-epo-admin-global-base.php:2710
msgid "is"
msgstr "ist"

#: admin/class-themecomplete-epo-admin-global-base.php:2711
msgid "is not"
msgstr "ist nicht"

#: admin/class-themecomplete-epo-admin-global-base.php:2712
msgid "is empty"
msgstr "ist leer"

#: admin/class-themecomplete-epo-admin-global-base.php:2713
msgid "is not empty"
msgstr "ist nicht leer"

#: admin/class-themecomplete-epo-admin-global-base.php:2714
msgid "starts with"
msgstr "beginnt mit"

#: admin/class-themecomplete-epo-admin-global-base.php:2715
msgid "ends with"
msgstr "endet mit"

#: admin/class-themecomplete-epo-admin-global-base.php:2716
msgid "greater than"
msgstr "grösser als"

#: admin/class-themecomplete-epo-admin-global-base.php:2717
msgid "less than"
msgstr "weniger als"

#: admin/class-themecomplete-epo-admin-global-base.php:2718
msgid "greater than or equal to"
msgstr "größer oder gleich"

#: admin/class-themecomplete-epo-admin-global-base.php:2719
msgid "less than or equal to"
msgstr "kleiner oder gleich"

#: admin/class-themecomplete-epo-admin-global-base.php:2720
msgid ""
"Cannot apply rules on this element or section since there are not any value "
"configured elements on other sections, or no other sections found."
msgstr ""
"Die Regeln sind für dieses Element oder den Abschnitt nicht anwendbar, da "
"mit keinen Wert konfigurierte Elemente auf andere Sektionen oder auf keine "
"anderen Sektionen anwendbar ist."

#: admin/class-themecomplete-epo-admin-global-base.php:2721
msgid "An error has occurred! Cannot apply conditions on this element!"
msgstr ""
"Ein Fehler ist aufgetreten! Auf dieses Element können keine Bedingungen "
"angewendet werden!"

#: admin/class-themecomplete-epo-admin-global-base.php:2723
msgid "Populate"
msgstr "Befüllen"

#: admin/class-themecomplete-epo-admin-global-base.php:2724
msgid "Invalid file extension"
msgstr "Ungültige Dateiendung"

#: admin/class-themecomplete-epo-admin-global-base.php:2725
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:211
msgid "Importing csv..."
msgstr "Importiere csv..."

#: admin/class-themecomplete-epo-admin-global-base.php:2726
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:212
msgid "Saving... Please wait."
msgstr "Speichern… Bitte warten."

#: admin/class-themecomplete-epo-admin-global-base.php:2727
#: admin/class-themecomplete-epo-admin-lookuptable-base.php:209
msgid "Importing data"
msgstr "Importiere Daten"

#: admin/class-themecomplete-epo-admin-global-base.php:2730
msgid "Edit price"
msgstr "Preis eintragen"

#: admin/class-themecomplete-epo-admin-global-base.php:2731
msgid "Edit tab"
msgstr "Registerkarte Bearbeiten"

#: admin/class-themecomplete-epo-admin-global-base.php:2733
msgid "Overwrite existing elements"
msgstr "Bestehende Elemente überschreiben"

#: admin/class-themecomplete-epo-admin-global-base.php:2734
msgid "Append new elements"
msgstr "Neue Elemente hinzufügen"

#: admin/class-themecomplete-epo-admin-global-base.php:2735
msgid "The form is being applied to all products"
msgstr "Die Vorlage wurde auf alle Produkte angewendet"

#: admin/class-themecomplete-epo-admin-global-base.php:2736
msgid "The form isn't being applied to any products"
msgstr "Die Vorlage wurde nicht auf alle Produkte angewendet"

#: admin/class-themecomplete-epo-admin-global-base.php:2739
msgid "Loading ..."
msgstr "Wird geladen ..."

#: admin/class-themecomplete-epo-admin-global-base.php:2740
msgid "Product variables"
msgstr "Produktvariablen"

#: admin/class-themecomplete-epo-admin-global-base.php:2741
#, fuzzy
#| msgid "Global variables"
msgid "Special variables"
msgstr "Globale Variablen"

#: admin/class-themecomplete-epo-admin-global-base.php:2742
msgid "Global variables"
msgstr "Globale Variablen"

#: admin/class-themecomplete-epo-admin-global-base.php:2743
#, fuzzy
#| msgid "Show Options Total"
msgid "Options Total"
msgstr "Optionen insgesamt anzeigen"

#: admin/class-themecomplete-epo-admin-global-base.php:2744
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Options Total"
msgstr "Original-Produktpreis"

#: admin/class-themecomplete-epo-admin-global-base.php:2745
msgid "Cumulative Total"
msgstr ""

#: admin/class-themecomplete-epo-admin-global-base.php:2746
#, fuzzy
#| msgid "Original product price"
msgid "Original product price + Cumulative Total"
msgstr "Original-Produktpreis"

#: admin/class-themecomplete-epo-admin-global-base.php:2747
msgid "Product quantity"
msgstr "Produktmenge"

#: admin/class-themecomplete-epo-admin-global-base.php:2748
msgid "Original product price"
msgstr "Original-Produktpreis"

#: admin/class-themecomplete-epo-admin-global-base.php:2749
#, fuzzy
#| msgid "Original product price"
msgid "Dynamic product price"
msgstr "Original-Produktpreis"

#: admin/class-themecomplete-epo-admin-global-base.php:2750
msgid "This element"
msgstr "Dieses Element"

#: admin/class-themecomplete-epo-admin-global-base.php:2751
msgid "The value of this element"
msgstr "Der Wert dieses Elements"

#: admin/class-themecomplete-epo-admin-global-base.php:2752
msgid "The value length of this element"
msgstr "Die Wertlänge dieses Elements"

#: admin/class-themecomplete-epo-admin-global-base.php:2753
msgid "The number of options the user has selected"
msgstr "Die Anzahl der Optionen, die der Benutzer ausgewählt hat"

#: admin/class-themecomplete-epo-admin-global-base.php:2754
msgid "The total quantity of this element"
msgstr "Die Gesamtmenge dieses Elements"

#: admin/class-themecomplete-epo-admin-global-base.php:2755
msgid "The quantity of this element"
msgstr "Die Menge dieses Elements"

#: admin/class-themecomplete-epo-admin-global-base.php:2756
msgid "Other elements"
msgstr "Sonstige Elemente"

#: admin/class-themecomplete-epo-admin-global-base.php:2758
msgid "The price of the targeted element"
msgstr "Der Preis des Zielelements"

#: admin/class-themecomplete-epo-admin-global-base.php:2759
#: admin/views/html-tm-epo-order-item-header.php:25
#: includes/classes/class-themecomplete-epo-scripts.php:527
msgid "Value"
msgstr "Wert"

#: admin/class-themecomplete-epo-admin-global-base.php:2760
msgid "The value of the targeted element converted to a float"
msgstr "Der Wert des Zielelements, konvertiert in eine Gleitkommazahl"

#: admin/class-themecomplete-epo-admin-global-base.php:2761
#: includes/classes/class-themecomplete-epo-settings-base.php:1853
msgid "Text"
msgstr "Text"

#: admin/class-themecomplete-epo-admin-global-base.php:2762
msgid "The raw value of the targeted element"
msgstr "Der Rohwert des Zielelements"

#: admin/class-themecomplete-epo-admin-global-base.php:2763
msgid "Text length"
msgstr "Textlänge"

#: admin/class-themecomplete-epo-admin-global-base.php:2764
msgid "The text length of the targeted element"
msgstr "Die Textlänge des Zielelements"

#: admin/class-themecomplete-epo-admin-global-base.php:2766
msgid "The total quantity of the targeted element"
msgstr "Die Gesamtmenge des Zielelements"

#: admin/class-themecomplete-epo-admin-global-base.php:2767
msgid "Count"
msgstr "Anzahl"

#: admin/class-themecomplete-epo-admin-global-base.php:2768
msgid "The number of options the user has selected on the targeted element"
msgstr ""
"Die Anzahl der Optionen, die der Benutzer für das Zielelement ausgewählt hat"

#: admin/class-themecomplete-epo-admin-global-base.php:2846
msgid "All"
msgstr "Alle"

#: admin/class-themecomplete-epo-admin-global-base.php:3445
msgid "Copy"
msgstr "Kopieren"

#: admin/class-themecomplete-epo-admin-global-list-table.php:158
#, php-format
msgctxt "posts"
msgid "Mine <span class=\"count\">(%s)</span>"
msgid_plural "Mine <span class=\"count\">(%s)</span>"
msgstr[0] "Meine < span class = \"count\" > ( %s) </span>"
msgstr[1] "Meine < span class = \"count\" > ( %s) </span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:179
#, php-format
msgctxt "posts"
msgid "All <span class=\"count\">(%s)</span>"
msgid_plural "All <span class=\"count\">(%s)</span>"
msgstr[0] "Alle <span class=\"count\">(%s)</span>"
msgstr[1] "Alle <span class=\"count\">(%s)</span>"

#: admin/class-themecomplete-epo-admin-global-list-table.php:242
#, php-format
msgctxt "posts"
msgid "Sticky <span class=\"count\">(%s)</span>"
msgid_plural "Sticky <span class=\"count\">(%s)</span>"
msgstr[0] "Sticky <span class = \"count\" > ( %s) </span>"
msgstr[1] "Sticky <span class = \"count\" > ( %s) </span>"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:215
msgid "Invalid CSV table!"
msgstr "Ungültige CSV-Tabelle!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:217
msgid "An error has occurred!"
msgstr "Ein Fehler ist aufgetreten!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:218
msgid "Overwrite existing tables"
msgstr "Vorhandene Tabellen überschreiben"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:233
msgid "Look up table"
msgstr "Tabelle nachschlagen"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:255
msgid "No CSV table found!"
msgstr "Keine CSV-Tabelle gefunden!"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:257
msgid "Import one by clicking the button below."
msgstr "Importieren Sie einen, indem Sie auf die Schaltfläche unten klicken."

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:312
msgid "Table name"
msgstr "Tabellenname"

#: admin/class-themecomplete-epo-admin-lookuptable-base.php:317
msgid "Table index"
msgstr "Tabellen-Index"

#: admin/class-themecomplete-epo-admin-settings.php:273
msgid "EPO Control Panel"
msgstr "EPO-Bedienfeld"

#: admin/class-themecomplete-epo-admin-settings.php:292
msgid "Extra Product Options Settings"
msgstr "Einstellungen für zusätzliche Produktoptionen"

#: admin/class-themecomplete-epo-admin-settings.php:294
#: admin/class-themecomplete-epo-admin-settings.php:330
msgid "Reset settings"
msgstr "Einstellungen zurücksetzen"

#: admin/class-themecomplete-epo-admin-settings.php:295
#: admin/class-themecomplete-epo-admin-settings.php:331
msgid "Save changes"
msgstr "Änderungen speichern"

#: admin/views/html-tm-epo-admin-attributes.php:18
#: admin/views/html-tm-epo-admin-variations.php:17
msgid "Any"
msgstr "Alle"

#: admin/views/html-tm-epo-admin.php:40
msgid "Click to toggle"
msgstr "Zum Aus-/Einklappen klicken"

#: admin/views/html-tm-epo-admin.php:43 admin/views/html-tm-epo-admin.php:90
#: admin/views/html-tm-epo-admin.php:144 admin/views/html-tm-epo.php:110
msgid "Attribute:"
msgstr "Attribute:"

#: admin/views/html-tm-epo-admin.php:53
msgid "Type:"
msgstr "Typ:"

#: admin/views/html-tm-epo-admin.php:56
msgid "Checkbox"
msgstr "Checkbox"

#: admin/views/html-tm-epo-admin.php:57
msgid "Select"
msgstr "Auswählen"

#: admin/views/html-tm-epo-admin.php:62
msgid "Settings:"
msgstr "Einstellungen:"

#: admin/views/html-tm-epo-admin.php:86
msgid "Variation:"
msgstr "Variation:"

#: admin/views/html-tm-epo-admin.php:94
msgid "Price:"
msgstr "Preis:"

#: admin/views/html-tm-epo-admin.php:114 admin/views/html-tm-epo-admin.php:182
msgid "Custom price (required)"
msgstr "Sonderpreis (erforderlich)"

#: admin/views/html-tm-epo-admin.php:124 admin/views/html-tm-epo-admin.php:192
msgid "Custom price"
msgstr "Sonderpreis"

#: admin/views/html-tm-epo-admin.php:148
msgid "Attributes missing. Please DELETE this extra option:"
msgstr "Attribute fehlen. Bitte LÖSCHE diese Extra-Option:"

#: admin/views/html-tm-epo-admin.php:185 admin/views/html-tm-epo-admin.php:195
msgid "Percent of the origιnal price"
msgstr "Prozent des Original-Preises"

#: admin/views/html-tm-epo-fields-edit.php:22
msgid "M j, Y @ H:i"
msgstr "M j, Y @ H:i"

#: admin/views/html-tm-epo-fields-edit.php:27
#: admin/views/html-tm-epo-fields-edit.php:28
#: admin/views/html-tm-epo-fields-edit.php:29
#: admin/views/html-tm-epo-fields-edit.php:30
msgid "Form updated."
msgstr "Formular aktualisiert."

#: admin/views/html-tm-epo-fields-edit.php:32
#, php-format
msgid "Form restored to revision from %s"
msgstr "Formular wiederhergestellt zur Revision von %s"

#: admin/views/html-tm-epo-fields-edit.php:33
msgid "Form published."
msgstr "Formular veröffentlicht."

#: admin/views/html-tm-epo-fields-edit.php:34
msgid "Form saved."
msgstr "Gespeichert."

#: admin/views/html-tm-epo-fields-edit.php:35
msgid "Form submitted."
msgstr "Formular übermittelt."

#: admin/views/html-tm-epo-fields-edit.php:37
#, php-format
msgid "Form scheduled for: %s."
msgstr "Formular geplant für: %s."

#: admin/views/html-tm-epo-fields-edit.php:38
msgid "Form draft updated."
msgstr "Formularentwurf aktualisiert."

#: admin/views/html-tm-epo-fields-edit.php:78
msgid "Enter title here"
msgstr "Geben Sie den Titel ein"

#: admin/views/html-tm-epo-fields.php:48
msgid "Undo"
msgstr "Rückgängig"

#: admin/views/html-tm-epo-order-item-header.php:24
msgid "Option"
msgstr "Option"

#: admin/views/html-tm-epo-order-item-header.php:34
msgid "Cost"
msgstr "Kosten"

#: admin/views/html-tm-epo-order-item-header.php:37
#: includes/classes/class-themecomplete-epo-scripts.php:528
#: templates/products/template-quantity-hidden.php:45
#: templates/products/template-quantity.php:112
msgid "Qty"
msgstr "Menge"

#: admin/views/html-tm-epo-order-item-header.php:40
#: includes/classes/class-themecomplete-epo-cart.php:2099
msgid "Total"
msgstr "Gesamt"

#: admin/views/html-tm-epo-order-item-header.php:45
msgid "Tax"
msgstr "Steuer"

#: admin/views/html-tm-epo-order-item.php:256
msgid "Edit item"
msgstr "Element bearbeiten"

#: admin/views/html-tm-epo-order-item.php:257
msgid "Delete item"
msgstr "Artikel löschen"

#: admin/views/html-tm-epo.php:29
msgid ""
"Before adding Extra Options in this mode, add and save some attributes on "
"the Attributes tab."
msgstr ""
"Fügen Sie vor dem Hinzufügen zusätzlicher Optionen in diesem Modus einige "
"Attribute auf der Registerkarte Attribute hinzu und speichern Sie sie."

#: admin/views/html-tm-epo.php:33
msgid "Expand all"
msgstr "Alle aufklappen"

#: admin/views/html-tm-epo.php:35
msgid "Close all"
msgstr "Alle schließen"

#: admin/views/html-tm-epo.php:106
msgid "Add Extra Option"
msgstr "Zusätzliche Option hinzufügen"

#: admin/views/html-tm-global-epo.php:50
msgid "Builder"
msgstr "Builder"

#: admin/views/html-tm-global-epo.php:57
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:281
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:312
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:220
#: includes/classes/class-themecomplete-epo-settings-base.php:496
#: includes/classes/class-themecomplete-epo-settings-base.php:2021
msgid "Normal"
msgstr "Normal"

#: admin/views/html-tm-global-epo.php:75
msgid ""
"To translate the strings for the local options please use WPML interface."
msgstr ""
"Um die Zeichenfolgen für die lokalen Optionen zu übersetzen, bitte WPML-"
"Schnittstelle verwenden."

#: admin/views/html-tm-global-epo.php:110
#: admin/views/html-tm-global-epo.php:132
msgid "From"
msgstr "Von"

#: admin/views/html-tm-global-epo.php:114
msgid "Range"
msgstr "Bereich"

#: admin/views/html-tm-global-epo.php:118
msgid "Price display override"
msgstr "Überschreibung der Preisanzeige"

#: admin/views/html-tm-global-epo.php:119
msgid ""
"This will replace the displayed product price on shop/archive/product loop "
"pages."
msgstr ""
"Dies ersetzt den angezeigten Produktpreis auf Shop-/Archiv-/"
"Produktschleifenseiten."

#: admin/views/html-tm-global-epo.php:132
msgid "Regular"
msgstr "Regulär"

#: admin/views/html-tm-global-epo.php:145
msgid "To"
msgstr "Bis"

#: admin/views/html-tm-global-epo.php:158
msgid "Sale"
msgstr "Sale"

#: admin/views/html-tm-global-epo.php:177
msgid ""
"The forms you choose will be displayed alongside with the forms that the "
"product already has."
msgstr ""
"Die Formulare, die Sie wählen, werden zusammen mit den Formularen angezeigt, "
"die das Produkt bereits hat."

#: admin/views/html-tm-global-epo.php:206
msgid "Exclude from"
msgstr "Von globalen"

#: admin/views/html-tm-global-epo.php:207
msgid ""
"This will exclude any global forms assigned to this product except those "
"defined in the previous setting."
msgstr ""
"Dadurch werden alle diesem Produkt zugewiesenen globalen Formulare, mit "
"Ausnahme der in der vorherigen Einstellung definierten, ausgeschlossen."

#: admin/views/html-tm-global-epo.php:225
#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:69
#: includes/classes/class-themecomplete-epo-settings-base.php:1586
msgid "Override product price"
msgstr "Produktpreis überschreiben"

#: admin/views/html-tm-global-epo.php:226
msgid ""
"This will override the product price with the price from the options if the "
"total options price is greater then zero."
msgstr ""
"Dadurch wird der Produktpreis mit dem Preis aus den Optionen überschrieben, "
"wenn der gesamte Optionspreis größer als Null ist."

#: admin/views/html-tm-global-epo.php:243
msgid "Override global display"
msgstr "Überschreiben Sie die globale Anzeige"

#: admin/views/html-tm-global-epo.php:244
msgid "This will override the display method only for this product."
msgstr "Dies überschreibt die Anzeigemethode nur für dieses Produkt."

#: admin/views/html-tm-global-epo.php:252
#: admin/views/html-tm-global-epo.php:282
#: admin/views/html-tm-global-epo.php:320
#: admin/views/html-tm-global-epo.php:354
msgid "Use global setting"
msgstr "Globale Einstellung verwenden"

#: admin/views/html-tm-global-epo.php:256
msgid "Always show"
msgstr "Immer anzeigen"

#: admin/views/html-tm-global-epo.php:260
msgid "Show only with an action hook"
msgstr "Zeige nur mit \"Action Hook\""

#: admin/views/html-tm-global-epo.php:273
msgid "Override Final total box"
msgstr "Übersteuerung Endsumme Box"

#: admin/views/html-tm-global-epo.php:274
msgid "This will override the totals box display only for this product."
msgstr "Dies überschreibt nur die Gesamt Summen Anzeige für dieses Produkt."

#: admin/views/html-tm-global-epo.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:321
#, fuzzy
#| msgid "Hide Final total box if Options total is zero"
msgid "Disable if Options total is zero"
msgstr "Gesamtsumme ausblenden, wenn Optionen-Summe Null ist"

#: admin/views/html-tm-global-epo.php:298
#: includes/classes/class-themecomplete-epo-settings-base.php:322
#, fuzzy
#| msgid "Hide Final total box if total is zero"
msgid "Disable if total is zero"
msgstr "Feld \"Endsumme ausblenden\", wenn \"Summe\" Null ist"

#: admin/views/html-tm-global-epo.php:311
#, fuzzy
#| msgid "Show Options Total"
msgid "Override Show Options Total"
msgstr "Optionen insgesamt anzeigen"

#: admin/views/html-tm-global-epo.php:312
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid ""
"This will override the Show Options Total setting only for this product."
msgstr "Dies überschreibt die Anzeigemethode nur für dieses Produkt."

#: admin/views/html-tm-global-epo.php:332
#: includes/classes/class-themecomplete-epo-settings-base.php:336
msgid "Show when the total is greater than zero"
msgstr "Wird angezeigt, wenn die Summe größer als Null ist"

#: admin/views/html-tm-global-epo.php:345
#, fuzzy
#| msgid "Show Final Total"
msgid "Override Show Final Total"
msgstr "Gesamtsumme anzeigen"

#: admin/views/html-tm-global-epo.php:346
#, fuzzy
#| msgid "This will override the display method only for this product."
msgid "This will Show Final Total setting only for this product."
msgstr "Dies überschreibt die Anzeigemethode nur für dieses Produkt."

#: admin/views/html-tm-global-epo.php:379
#: admin/views/html-tm-global-epo.php:401
msgid "Override enabled roles for this product"
msgstr "Überschreiben ermöglichte Rollen für dieses Produkt"

#: admin/views/html-tm-global-epo.php:380
#: admin/views/html-tm-global-epo.php:402
msgid "This will override which roles can see the options for this product."
msgstr ""
"Überschreibt, welche Rollen die Optionen für dieses Produkt sehen können."

#: includes/class-themecomplete-extra-product-options-setup.php:51
msgid "Cloning is forbidden."
msgstr "Klonen ist verboten."

#: includes/class-themecomplete-extra-product-options-setup.php:60
msgid "Unserializing instances of this class is forbidden."
msgstr "Unserialisierte Instanzen dieser Klasse sind verboten."

#: includes/class-themecomplete-extra-product-options.php:1114
#: includes/class-themecomplete-extra-product-options.php:1665
#: includes/classes/class-themecomplete-epo-associated-products.php:161
msgid "Free!"
msgstr "Gratis!"

#: includes/class-themecomplete-extra-product-options.php:1686
#: includes/class-themecomplete-extra-product-options.php:1693
#: includes/classes/class-themecomplete-epo-associated-products.php:210
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s&ndash;%2$s"
msgstr "%1$s&ndash;%2$s"

#: includes/class-themecomplete-extra-product-options.php:1708
#: includes/classes/class-themecomplete-epo-associated-products.php:232
#, php-format
msgctxt "Price range: from-to"
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/class-themecomplete-extra-product-options.php:2296
#: includes/classes/class-themecomplete-epo-settings-base.php:1204
msgid "Select options"
msgstr "Optionen wählen"

#: includes/class-themecomplete-extra-product-options.php:2300
msgid "Add to cart"
msgstr "In den Warenkorb"

#: includes/class-themecomplete-extra-product-options.php:4980
#: includes/class-themecomplete-extra-product-options.php:4981
msgid "Product element is not supported for components!"
msgstr "Das Produktelement wird für Komponenten nicht unterstützt!"

#: includes/class-themecomplete-extra-product-options.php:4984
msgid "Product element is not supported within another product element!"
msgstr ""
"Das Element Produkt wird innerhalb eines anderen Element Produkt nicht "
"unterstützt!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:286
msgid "Checkboxes"
msgstr "Kontrollkästchen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-color.php:29
msgid "Color picker"
msgstr "Farbauswahl"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:187
msgid "Date"
msgstr "Datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:61
msgid "Sunday"
msgstr "Sonntag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:63
msgid "Monday"
msgstr "Montag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:65
msgid "Tuesday"
msgstr "Dienstag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:67
msgid "Wednesday"
msgstr "Mittwoch"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:69
msgid "Thursday"
msgstr "Donnerstag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:71
msgid "Friday"
msgstr "Freitag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:73
msgid "Saturday"
msgstr "Samstag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:100
msgid "January "
msgstr "Januar "

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:102
msgid "February"
msgstr "Februar"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:104
msgid "March"
msgstr "Martie"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:106
msgid "April"
msgstr "April"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:108
msgid "May"
msgstr "Mai"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:110
msgid "June"
msgstr "Juni"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:112
msgid "July"
msgstr "Juli"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:114
msgid "August"
msgstr "August"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:116
msgid "September"
msgstr "September"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:118
msgid "October"
msgstr "Oktober"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:120
msgid "November"
msgstr "November"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:122
msgid "December"
msgstr "Dezember"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:166
msgid ""
"Enter a value to be applied to the field automatically according to your "
"selected date format. (Two digits for day, two digits for month and four "
"digits for year)."
msgstr ""
"Gebe einen Wert ein, der entsprechend dem gewählten Datumsformat automatisch "
"auf das Feld angewendet werden soll. (Zwei Ziffern für Tag, zwei Ziffern für "
"Monat und vier Ziffern für Jahr)."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:179
msgid "Minimum selectable date"
msgstr "Min. auswählbares Datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:180
#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:194
msgid "A number of days from today."
msgstr "Eine Anzahl von Tagen -  von heute."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:193
msgid "Maximum selectable date"
msgstr "Maximal wählbares Datum"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:206
msgid "Disabled dates"
msgstr "Deaktivierte Daten (Datum)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:207
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year)"
msgstr ""
"Komma getrennte Daten nach Ihrem gewählten Datumsformat. (Zwei Ziffern für "
"den Tag, zwei Ziffern für den Monat und vier Ziffern für das Jahr)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:219
msgid "Enabled dates"
msgstr "Aktivierte Daten (Datum)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:220
msgid ""
"Comma separated dates according to your selected date format. (Two digits "
"for day, two digits for month and four digits for year). Please note that "
"this will override any other setting!"
msgstr ""
"Komma getrennte Daten nach Ihrem gewählten Datumsformat. (Zwei Ziffern für "
"den Tag, zwei Ziffern für den Monat und vier Ziffern für Jahr). Bitte "
"beachten Sie, dass dies jede andere Einstellung außer Kraft setzt!"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:233
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:160
#: includes/classes/class-themecomplete-epo-settings-base.php:1992
msgid "Epo White"
msgstr "Epo White"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:237
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:164
#: includes/classes/class-themecomplete-epo-settings-base.php:1993
msgid "Epo Black"
msgstr "Epo Black"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:168
msgid "Theme"
msgstr "Theme"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:242
#: includes/classes/class-themecomplete-epo-settings-base.php:1984
msgid "Select the theme for the datepicker."
msgstr "Wählen Sie ein Design für den Datumswähler."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:255
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:188
#: includes/classes/class-themecomplete-epo-settings-base.php:2006
msgid "Small"
msgstr "Klein"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:259
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:192
#: includes/classes/class-themecomplete-epo-settings-base.php:2007
msgid "Medium"
msgstr "Mittel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:263
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:196
#: includes/classes/class-themecomplete-epo-settings-base.php:2008
msgid "Large"
msgstr "Groß"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:268
#: includes/classes/class-themecomplete-epo-settings-base.php:1998
msgid "Select the size of the datepicker."
msgstr "Wählen Sie die Größe der Datumsanzeige."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:285
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:224
#: includes/classes/class-themecomplete-epo-settings-base.php:2022
msgid "Top of screen"
msgstr "Oberer Bildschirmrand"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:289
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:228
#: includes/classes/class-themecomplete-epo-settings-base.php:2023
msgid "Bottom of screen"
msgstr "Unterer Bildschirmrand"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:293
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:232
msgid "Position"
msgstr "Position"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:294
#: includes/classes/class-themecomplete-epo-settings-base.php:2013
msgid "Select the position of the datepicker."
msgstr "Wählen Sie die Position des DatePickers."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:306
msgid "Exclude disabled"
msgstr "Ausgeschlossen deaktiviert"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:307
msgid ""
"Enabling this will make it so that the Minimum and Maximum selectable date "
"will not count the selected disabled weekdays."
msgstr ""
"Wenn Sie dies aktivieren, wird die setzbare Anzahl der ausgewählten "
"deaktivierten Wochentage durch das Datum \"Minimum\" und \"Maximum\" nicht "
"gezählt."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:320
msgid "Disable weekdays"
msgstr "Wochentage deaktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:321
msgid "This allows you to disable all selected weekdays."
msgstr "Damit können Sie alle ausgewählten Wochentage deaktivieren."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:335
msgid "Disable months"
msgstr "Monate deaktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:336
msgid "This allows you to disable all selected months."
msgstr "Auf diese Weise können Sie alle ausgewählten Monate deaktivieren."

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:342
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:244
#: includes/classes/class-themecomplete-epo-wpml-base.php:1274
msgid "Translations"
msgstr "Übersetzungen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:360
#: includes/fields/class-themecomplete-epo-fields-date.php:114
msgid "Day"
msgstr "Tag"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:378
#: includes/fields/class-themecomplete-epo-fields-date.php:141
msgid "Month"
msgstr "Monat"

#: includes/classes/builder/class-themecomplete-epo-builder-element-date.php:392
#: includes/fields/class-themecomplete-epo-fields-date.php:170
msgid "Year"
msgstr "Jahr"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:29
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:712
msgid "Divider"
msgstr "Trenner"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:52
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:66
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1801
msgid "General Options"
msgstr "Allgemeine Optionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:53
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:886
msgid "Conditional Logic"
msgstr "Bedingte Logik"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:54
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:956
msgid "CSS Settings"
msgstr "CSS-Einstellungen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:74
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:928
msgid "Element class name"
msgstr "Attribut CSS-Klasse"

#: includes/classes/builder/class-themecomplete-epo-builder-element-divider.php:75
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:242
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:929
msgid "Enter an extra class name to add to this element"
msgstr ""
"Geben Sie einen Namen der Extraklasse ein, um dieses Element hinzuzufügen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:29
msgid "Dynamic Calculations"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:65
msgid "Calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:73
#, fuzzy
#| msgid "Override product price"
msgid "Set native product price"
msgstr "Produktpreis überschreiben"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:77
#, fuzzy
#| msgid "Changes product image"
msgid "Change product weight"
msgstr "Produktbild verändert"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:81
#, fuzzy
#| msgid "Section id"
msgid "Action mode"
msgstr "Abschnitt ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:82
#, fuzzy
#| msgid "Choose the tax class for Fee price type on this element."
msgid "Choose the desired action mode for this element."
msgstr ""
"Wählen Sie für dieses Element die Steuerklasse für die Gebührenpreis Typ."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:95
msgid "Hide calculation result"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:96
msgid "When activated, the plugin hides the outcome of the calculation."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:109
#, fuzzy
#| msgid "Math formula"
msgid "Formula"
msgstr "Mathematische Formel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:110
#, fuzzy
#| msgid "Enter the step for the handle."
msgid "Enter the formula for the calculation."
msgstr "Geben Sie den Schritt für den Griff ein."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:123
#, fuzzy
#| msgid "Display as"
msgid "Result Display Label"
msgstr "Anzeigen als"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:124
#, fuzzy
#| msgid "Enter a text to replace the Close button text on the calendar."
msgid "Enter the text to show next to the calculation result on the page."
msgstr ""
"Geben Sie einen Text ein, um den Text \"Schließen\" im Kalender zu ersetzen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:139
#, fuzzy
#| msgid "Text before Price"
msgid "Text before result"
msgstr "Text vor dem Preis"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:140
#, fuzzy
#| msgid ""
#| "Enter a text to display before the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display before the calculation result or leave it blank for "
"no text."
msgstr ""
"Text eingeben der vor dem Preis angezeigt werden soll oder für keinen Text "
"einfach Leer lassen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:156
#, fuzzy
#| msgid "Text after Price"
msgid "Text after result"
msgstr "Text nach Preis"

#: includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php:157
#, fuzzy
#| msgid ""
#| "Enter a text to display after the price for this field or leave it blank "
#| "for no text."
msgid ""
"Enter a text to display after the calculation result or leave it blank for "
"no text."
msgstr ""
"Text eingeben der nach dem Preis angezeigt werden soll oder für keinen Text "
"einfach Leer lassen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:29
msgid "Heading"
msgstr "Überschrift"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:69
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:440
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:482
msgid "H1"
msgstr "H1"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:73
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:444
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:486
msgid "H2"
msgstr "H2"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:77
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:448
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:490
msgid "H3"
msgstr "H3"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:81
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:452
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:494
msgid "H4"
msgstr "H4"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:85
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:456
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:498
msgid "H5"
msgstr "H5"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:89
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:460
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:502
msgid "H6"
msgstr "H6"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:93
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:464
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:506
msgid "p"
msgstr "p"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:97
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:468
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:510
msgid "div"
msgstr "div"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:101
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:472
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:514
msgid "span"
msgstr "span"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:105
msgid "Header type"
msgstr "Header-Typ"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:118
msgid "Header title"
msgstr "Kopftitel"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:136
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the Content"
msgstr "Links des Feldes"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:140
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the Content"
msgstr "Rechts vom Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:148
msgid "Header position"
msgstr "Kopfposition"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:162
msgid "Header color"
msgstr "Kopfzeilen Farbe"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:163
#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:188
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:214
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:241
#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:268
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:620
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:679
msgid "Leave empty for default value"
msgstr "Für den Standardwert leer lassen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:173
msgid "Content"
msgstr "Inhalt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:187
msgid "Content color"
msgstr "Farbe Inhalt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:205
#, fuzzy
#| msgid "Above field"
msgid "Above Header"
msgstr "Über dem Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:213
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:656
msgid "Icon tooltip left"
msgstr "Icon-Tooltip links"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:217
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:660
msgid "Icon tooltip right"
msgstr "Icon-Tooltip rechts"

#: includes/classes/builder/class-themecomplete-epo-builder-element-header.php:221
msgid "Content position"
msgstr "Inhalt Position"

#: includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php:29
#, fuzzy
#| msgid "Multi-Select Field"
msgid "Multiple Upload"
msgstr "Wählen Sie das Feld Mehrere aus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:301
#: includes/classes/class-themecomplete-epo-settings-base.php:1855
msgid "Product"
msgstr "Produkt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:98
msgid "Single Product"
msgstr "Einzelnes Produkt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:106
msgid "Select mode"
msgstr "Auswahlmodus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:107
msgid "Whether to include specific products or categories."
msgstr ""
"Gibt an, ob bestimmte Produkte oder Kategorien eingeschlossen werden sollen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:117
msgid "Search for a category ..."
msgstr "Suchen Sie nach einer Kategorie ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:124
msgid "Select categories"
msgstr "Kategorien auswählen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:125
msgid "Add categories to include all their associated products."
msgstr "Fügen Sie Kategorien hinzu, die alle zugehörigen Produkte enthalten."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:141
msgid "Search for a product ..."
msgstr "Suche nach einem Produkt ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:149
msgid "Select products"
msgstr "Produkte auswählen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:150
msgid "Add the products individually."
msgstr "Fügen Sie die Produkte einzeln hinzu."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:164
msgid "Choose a value"
msgstr "Wählen Sie ein Wert"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:175
msgid "Base price"
msgstr "Basispreis"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:179
msgid "ID"
msgstr "ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:191
msgid "Name"
msgstr "Name"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:195
msgid "Menu Order"
msgstr "Menüreihenfolge"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:199
msgid "Random"
msgstr "Zufällig"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:203
msgid "Order by"
msgstr "Sortieren nach"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:204
msgid "Select the parameter which the products will be sorted by."
msgstr ""
"Wählen Sie den Parameter aus, nach dem die Produkte sortiert werden sollen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:225
msgid "Ascending"
msgstr "Aufsteigend"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:229
msgid "Descending"
msgstr "Absteigend"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:233
#: includes/classes/class-themecomplete-epo-settings-base.php:90
msgid "Order"
msgstr "Bestellung"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:234
msgid "Select the sorting order of the products."
msgstr "Wählen Sie die Sortierreihenfolge der Produkte."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:252
msgid "Select a product"
msgstr "Wählen Sie ein Produkt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:258
msgid "Default product"
msgstr "Standardprodukt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:259
msgid "Select the product that will be pre-selected."
msgstr "Wählen Sie das Produkt aus, das vorab ausgewählt werden soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:274
msgid "Dropdown"
msgstr "Dropdown"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:282
msgid "Thumbnails"
msgstr "Vorschaubilder"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:290
msgid "Thumbnails multiple"
msgstr "Miniaturansichten mehrfach"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:294
msgid "Layout mode"
msgstr "Layout Modus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:295
msgid "Select how the products will be presented."
msgstr "Wählen Sie aus, wie die Produkte präsentiert werden sollen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:320
msgid "Dropdown Placeholder"
msgstr "Dropdown-Platzhalter"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:321
msgid "Enter the placeholder for the dropdown."
msgstr "Geben Sie den Platzhalter für die Dropdownliste ein."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:339
msgid "Minimum quantity"
msgstr "Mindestmenge"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:348
msgid "Maximum quantity"
msgstr "Maximummenge"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:362
msgid "Shipped individually"
msgstr "Einzeln versendet"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:363
msgid ""
"If this is enabled the included product is not shipped with the main product."
msgstr ""
"Wenn diese Option aktiviert ist, wird das mitgelieferte Produkt nicht mit "
"dem Hauptprodukt geliefert."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:375
msgid "Maintain weight"
msgstr "Gewicht halten"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:376
msgid ""
"If this is enabled the included product will add its weight to the main "
"product."
msgstr ""
"Wenn dies aktiviert ist, wird das mitgelieferte Produkt dem Hauptprodukt "
"sein Gewicht hinzufügen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:394
msgid "Priced individually"
msgstr "Preislich individuell"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:395
msgid "If this is enabled the included product will maintain its own price."
msgstr ""
"Wenn dies aktiviert ist, behält das mitgelieferte Produkt seinen eigenen "
"Preis bei."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:414
msgid "Percentage"
msgstr "Prozentsatz"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:422
msgid "Discount type"
msgstr "Rabattart"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:423
msgid ""
"Select the discount type. The discount applies to the final product price. "
"If the product has extra options then the discount applies to the amount "
"after the options have been added to the product price."
msgstr ""
"Wählen Sie den Rabatt Typ. Der Rabatt gilt für den Endproduktpreis. Wenn das "
"Produkt über zusätzliche Optionen verfügt, gilt der Rabatt für den Betrag, "
"nachdem die Optionen zum Produktpreis hinzugefügt wurden."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:442
msgid "Discount"
msgstr "Rabatt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:443
msgid "Enter the discount amount."
msgstr "Geben Sie den Rabattbetrag ein."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:465
msgid "Disable Addons"
msgstr "Addons deaktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:466
msgid ""
"If this is enabled the included addons the associated product has will not "
"be displayed."
msgstr ""
"Wenn diese Option aktiviert ist, werden die mitgelieferten Addons, die das "
"zugehörige Produkt hat, nicht angezeigt."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:478
msgid "Exlude Addon prices from the discount"
msgstr "Addon-Preise vom Rabatt ausschließen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:479
msgid ""
"If this is enabled the discount will not be applied to the product addons."
msgstr ""
"Wenn diese Option aktiviert ist, wird der Rabatt nicht auf die Produkt-"
"Addons angewendet."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:508
#: includes/classes/class-themecomplete-epo-settings-base.php:89
#: includes/classes/class-themecomplete-epo-settings-base.php:302
#: includes/classes/class-themecomplete-epo-settings-base.php:1079
msgid "Cart"
msgstr "Warenkorb"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:303
msgid "Checkout"
msgstr "Kasse"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:516
msgid "Order and Emails"
msgstr "Bestellung und E-Mails"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:520
msgid "Hide product in"
msgstr "Produkt ausblenden in"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:521
msgid "Select where to hide the product"
msgstr "Wählen Sie aus, wo das Produkt ausgeblendet werden soll"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:549
msgid "Enable to show the image of the associated product."
msgstr ""
"Aktivieren Sie diese Option, um das Bild des zugehörigen Produkts anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:562
msgid "Show title"
msgstr "Titel anzeigen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:563
msgid "Enable to show the title of the associated product."
msgstr ""
"Aktivieren Sie diese Option, um den Titel des zugehörigen Produkts "
"anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:575
#, fuzzy
#| msgid "Show title"
msgid "Show title link"
msgstr "Titel anzeigen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:576
#, fuzzy
#| msgid "Enable to show the title of the associated product."
msgid "Enable to have the title link to the associated product."
msgstr ""
"Aktivieren Sie diese Option, um den Titel des zugehörigen Produkts "
"anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:594
msgid "Show price"
msgstr "Preis anzeigen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:595
msgid "Enable to show the price of the associated product."
msgstr ""
"Aktivieren Sie diese Option, um den Preis des zugehörigen Produkts "
"anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:608
msgid "Enable to show the description of the associated product."
msgstr ""
"Aktivieren Sie diese Option, um die Beschreibung des zugehörigen Produkts "
"anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:620
msgid "Show meta"
msgstr "Meta anzeigen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:621
msgid "Enable to show the meta of the associated product."
msgstr ""
"Aktivieren Sie diese Option, um den Meta des zugehörigen Produkts anzuzeigen."

#: includes/classes/builder/class-themecomplete-epo-builder-element-product.php:625
msgid "Advanced options"
msgstr "Erweiterte Optionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-range.php:29
msgid "Range picker"
msgstr "Bereichsauswahl"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:56
msgid "Title options"
msgstr "Titeloptionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:169
msgid "Normal (clear)"
msgstr "Normal"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:173
msgid "Box"
msgstr "Box"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:177
msgid "Expand and Collapse (start opened)"
msgstr "Erweitern und Reduzieren (standardmäßig geöffnet)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:182
msgid "Expand and Collapse (start closed)"
msgstr "Erweitern und Reduzieren (standardmäßig geschlossen)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:187
msgid "Accordion"
msgstr "Akkordeon"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:192
msgid "Section style"
msgstr "Abschnitt-Stil"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:193
msgid "Select this section's display style."
msgstr "Wählen Sie den Darstellungsstil dieses Abschnitts aus."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:213
msgid "Section background color"
msgstr "Bereich-Hintergrundfarbe"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:240
msgid "Section label background color"
msgstr "Hintergrundfarbe der Abschnittsbeschriftung"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:267
msgid "Section subtitle background color"
msgstr "Hintergrundfarbe des Untertitels des Abschnitts"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:288
msgid "Before Local Options"
msgstr "Vor lokalen Optionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:292
msgid "After Local Options"
msgstr "Nach lokalen Optionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:296
msgid "Section placement"
msgstr "Sektionsplatzierung"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:297
msgid "Select where this section will appear compared to local Options."
msgstr ""
"Wählen Sie aus, wo dieser Abschnitt im Vergleich zu lokalen Optionen "
"erscheint."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:316
msgid "Pop up"
msgstr "Pop-Up"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:320
msgid "Slider (wizard)"
msgstr "Slider (Assistent)"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:326
msgid "Tabs"
msgstr "Tabs"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:332
msgid "Section type"
msgstr "Sektionstyp"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:333
msgid "Select this section's display type."
msgstr "Wählen Sie den Anzeigetyp dieses Bereichs."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:347
msgid "Text link"
msgstr "Text-Link"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:351
msgid "Button"
msgstr "Schaltfläche"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:355
msgid "Button Alt"
msgstr "Button Alt"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:359
msgid "Section pop up button style"
msgstr "Abschnitt Popup-Schaltfläche Stil"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:360
msgid "Select this section's pop up button style."
msgstr "Wählen Sie den Popup-Schaltflächenstil dieses Abschnitts aus."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:378
msgid "Section pop up button text"
msgstr "Popup-Schaltflächentext für Abschnitte"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:379
msgid ""
"Enter a text to replace the default pop up button text. This will override "
"the global value."
msgstr ""
"Geben Sie einen Text ein, der den standardmäßigen Popup-Schaltflächentext "
"ersetzen soll. Dadurch wird der globale Wert überschrieben."

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:398
msgid "Section class name"
msgstr "Name der Sektionsklasse"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:399
msgid "Enter an extra class name to add to this section"
msgstr ""
"Geben Sie einen Namen der Extraklasse ein, um sie diesem Abschnitt "
"hinzuzufügen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:446
msgid "Section Conditional Logic"
msgstr "Bedingungslogik dieses Sbschnitts"

#: includes/classes/builder/class-themecomplete-epo-builder-element-section.php:447
msgid "Enable conditional logic for showing or hiding this section."
msgstr ""
"Aktivieren Sie die bedingte Logik, um diesen Abschnitt zu zeigen oder zu "
"verstecken."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:29
msgid "Select Box"
msgstr "Auswahlbox"

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php:63
msgid "This will count as an empty value in case the element is required."
msgstr ""
"Dies wird als leerer Wert für den Fall gezählt, dass das Element "
"erforderlich ist."

#: includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php:29
msgid "Multi-Select Field"
msgstr "Wählen Sie das Feld Mehrere aus"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:29
msgid "Template"
msgstr "Vorlage"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:99
msgid "Select a template ..."
msgstr "Wählen Sie eine Vorlage aus ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:105
msgid "Select template"
msgstr "Template wählen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-template.php:106
msgid "Add the template you want to display."
msgstr "Fügen Sie die Vorlage hinzu, die Sie anzeigen möchten."

#: includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php:29
msgid "Text Area"
msgstr "Textbereich"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:29
msgid "Text Field"
msgstr "Textfeld"

#: includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php:73
#, fuzzy
#| msgid "Enter the quantity step."
msgid "Enter the step."
msgstr "Geben Sie die Menge für einen Schritt ein."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:29
msgid "Time"
msgstr "Zeit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:76
msgid "System style"
msgstr "System Style"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:80
msgid "Custom style"
msgstr "Benutzerdefinierter Style"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:84
msgid "Time picker style"
msgstr "Zeitauswahlstil"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:120
msgid "Minimum selectable time"
msgstr "Min. auswählbare Zeit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:121
#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:141
msgid "Enter the time the following format: 8:00 am"
msgstr "Geben Sie die Uhrzeit in folgendem Format ein: 8:00 am"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:140
msgid "Maximum selectable time"
msgstr "Max. auswählbare Zeit"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:169
msgid "Select the theme for the timepicker."
msgstr "Wählen Sie das Thema für den Timepicker."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:201
msgid "Select the size of the timepicker."
msgstr "Wählen Sie die Größe des Timeickers."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:233
msgid "Select the position of the timepicker."
msgstr "Wählen Sie die Position des Timeickers."

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:268
#: includes/classes/class-themecomplete-epo-scripts.php:614
msgid "Hour"
msgstr "Stunde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:292
#: includes/classes/class-themecomplete-epo-scripts.php:615
msgid "Minute"
msgstr "Minute"

#: includes/classes/builder/class-themecomplete-epo-builder-element-time.php:312
#: includes/classes/class-themecomplete-epo-scripts.php:616
msgid "Second"
msgstr "Sekunde"

#: includes/classes/builder/class-themecomplete-epo-builder-element-upload.php:29
#: includes/classes/class-themecomplete-epo-settings-base.php:1854
msgid "Upload"
msgstr "Hochladen"

#: includes/classes/builder/class-themecomplete-epo-builder-element-variations.php:29
msgid "Variations"
msgstr "Variationen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:397
msgid "Element Conditional Logic"
msgstr "Element Konditionelle Logik"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:398
msgid "Enable conditional logic for showing or hiding this element."
msgstr "Bedingte Logik zum anzeigen oder ausblenden des Elementes."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:417
msgid "Full width"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:418
msgid "Auto"
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:476
msgid "label"
msgstr "Bezeichnung"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:518
msgid "Label type"
msgstr "Beschriftung Typ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:532
#: includes/classes/class-themecomplete-epo-scripts.php:526
msgid "Label"
msgstr "Beschriftung"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:560
#, fuzzy
#| msgid "Select mode"
msgid "Label view mode"
msgstr "Auswahlmodus"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:561
msgid "Select if the label should full be width or auto."
msgstr ""

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
#, fuzzy
#| msgid "Above field"
msgid "Above the fields"
msgstr "Über dem Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:575
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:644
msgid "Above field"
msgstr "Über dem Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
#, fuzzy
#| msgid "Left of the field"
msgid "Left of the fields"
msgstr "Links des Feldes"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:579
msgid "Left of the field"
msgstr "Links des Feldes"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
#, fuzzy
#| msgid "Right of the field"
msgid "Right of the fields"
msgstr "Rechts vom Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:583
msgid "Right of the field"
msgstr "Rechts vom Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:591
msgid "Label position"
msgstr "Label Position"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:619
msgid "Label color"
msgstr "Beschriftungsfarbe"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:630
msgid "Subtitle"
msgstr "Untertitel"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
#, fuzzy
#| msgid "Below field"
msgid "Below the fields"
msgstr "Unter dem Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:648
msgid "Below field"
msgstr "Unter dem Feld"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:664
msgid "Subtitle position"
msgstr "Untertitelposition"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:678
msgid "Subtitle color"
msgstr "Untertitel Schriftfarbe"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:708
msgid "Horizontal rule"
msgstr "Horizontal Regel"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:716
msgid "Padding"
msgstr "Innenabstand"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:720
msgid "Divider type"
msgstr "Trennbalken Typ"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:846
msgid "Label Options"
msgstr "Labeloptionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:941
msgid "Element container id"
msgstr "Element Container ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:942
msgid "Enter an id for the container of the element."
msgstr "Geben Sie eine ID für den Container des Elements ein."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:999
msgid "Inherit product setting"
msgstr "Produkteinstellungen vererben"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1011
msgid "Include tax for Fee price type"
msgstr "Steuern für Gebührenpreis Typ einschließen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1012
msgid "Choose whether to include tax for Fee price type on this element."
msgstr ""
"Wählen Sie aus, ob für dieses Element eine Steuer für die Gebührenpreis Typ "
"angegeben werden soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1030
msgid "Tax class for Fee price type"
msgstr "Steuerklasse für Gebührenpreistyp"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1031
msgid "Choose the tax class for Fee price type on this element."
msgstr ""
"Wählen Sie für dieses Element die Steuerklasse für die Gebührenpreis Typ."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1058
msgid "Hide element label in cart"
msgstr "Element Beschriftung im Warenkorb verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1059
msgid "Choose whether to hide the element label in the cart or not."
msgstr ""
"Wählen Sie, ob die Bezeichnung im Warenkorb verborgen oder sichtbar sein "
"soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1076
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1128
msgid "No, but hide price"
msgstr "Auto verstecken Preis, wenn Null"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1084
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1136
msgid "Yes, but show price"
msgstr "Ja, aber zeige den Preis"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1088
msgid "Hide element value in cart"
msgstr "Preis im Warenkorb verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1089
msgid "Choose whether to hide the element value in the cart or not."
msgstr ""
"Wählen Sie, ob der Preis des Elements im Warenkorb verborgen oder sichtbar "
"sein soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1110
msgid "Hide element label in order"
msgstr "Bezeichnung in der Bestellung verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1111
msgid "Choose whether to hide the element label in the order or not."
msgstr ""
"Wählen Sie, ob die Bezeichnung in der Bestellung verborgen oder sichtbar "
"sein soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1140
msgid "Hide element value in order"
msgstr "Preis in der Bestellung verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1141
msgid "Choose whether to hide the element value in the order or not."
msgstr ""
"Wählen Sie, ob der Preis in der Bestellung verborgen oder sichtbar sein soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1162
msgid "Hide element label in floating totals box"
msgstr "Bezeichnung in der „Gesamtsumme“-Box verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1163
msgid ""
"Choose whether to hide the element label in the floating totals box or not."
msgstr ""
"Wählen Sie, ob die Bezeichnung in der „Gesamtsumme“-Box verborgen oder "
"sichtbar sein soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1184
msgid "Hide element value in floating totals box"
msgstr "Preis in der „Gesamtsumme“-Box verbergen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1185
msgid ""
"Choose whether to hide the element value in the floating totals box or not."
msgstr ""
"Wählen Sie, ob der Preis in der „Gesamtsumme“-Box verborgen oder sichtbar "
"sein soll."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1199
msgid "WooCommerce Settings"
msgstr "WooCommerce Einstellungen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1241
msgid "Enable repeater"
msgstr "Repeater einschalten"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1242
msgid "This will make this element repeatable."
msgstr "Dadurch wird dieses Element wiederholbar."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1260
msgid "Bind repeater with product quantity"
msgstr "Binden Sie den Repeater mit der Produktmenge"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1261
msgid "This will make this element repeatable based on the product quantity."
msgstr ""
"Dadurch wird dieses Element basierend auf der Produktmenge wiederholbar."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1285
msgid "Repeater minimum limit"
msgstr "Mindestgrenze für Repeater"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1286
msgid "Set the minimum number of rows a user can add for the repeater field."
msgstr ""
"Legen Sie die Mindestanzahl von Zeilen fest, die ein Benutzer für das "
"Repeater-Feld hinzufügen kann."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1310
msgid "Repeater maximum limit"
msgstr "Maximale Grenzwerte für Repeater"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1311
msgid "Set the maximum number of rows a user can add for the repeater field."
msgstr ""
"Legen Sie die maximale Anzahl von Zeilen fest, die ein Benutzer für das "
"Repeater-Feld hinzufügen kann."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1333
msgid "Repeater Button Label"
msgstr "Beschriftung der Repeater-Taste"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1334
msgid "Leave this blank for the default label."
msgstr "Lassen Sie dieses Feld für die Standardbezeichnung leer."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1366
msgid "Radio Button Connector ID"
msgstr "Optionsfeld-Konnektor-ID"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1367
msgid "Enter a custom id to connect different radio button elements."
msgstr ""
"Geben Sie eine benutzerdefinierte ID ein, um verschiedene "
"Optionsfeldelemente zu verbinden."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1391
msgid "Repeater Settings"
msgstr "Repeater-Einstellungen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1444
#, php-format
msgid "All &quot;%s&quot; Method Instances"
msgstr "Alle &quot;%s&quot;-Methodeninstanzen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1463
#, php-format
msgid "&quot;%1$s&quot; (Instance ID: %2$s)"
msgstr "&quot;%1$s&quot; (Instanz-ID: %2$s)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1465
#, php-format
msgid "%1$s &ndash; %2$s"
msgstr "%1$s &ndash; %2$s"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1480
msgid "Flat Rates (Legacy)"
msgstr "Flatrates (Legacy)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1483
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1501
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1512
msgid "(Legacy)"
msgstr "(Vermächtnis)"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1552
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1584
msgid "Select shipping methods ..."
msgstr "Versandarten auswählen ..."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1558
msgid "Enable Shipping Methods"
msgstr "Versandarten aktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1559
msgid "Select the shipping methods to enable."
msgstr "Wählen Sie die Versandarten aus, die Sie aktivieren möchten."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1572
msgid "Enable Shipping Methods Condition"
msgstr "Versandartenbedingung aktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1573
msgid ""
"Specify the conditions for enabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will be available for customers to choose during checkout."
msgstr ""
"Geben Sie die Bedingungen für die Aktivierung von Versandmethoden basierend "
"auf dem Wert des aktuellen Felds an. Wenn die Bedingungen erfüllt sind, "
"können Kunden die ausgewählten Versandarten während des Bestellvorgangs "
"auswählen."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1590
msgid "Disable Shipping Methods"
msgstr "Versandarten deaktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1591
msgid "Select the shipping methods to disable."
msgstr "Wählen Sie die zu deaktivierenden Versandarten aus."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1604
msgid "Disable Shipping Methods Condition"
msgstr "Versandartenbedingung deaktivieren"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1605
msgid ""
"Specify the conditions for disabling shipping methods based on the value of "
"the current field. If the conditions are met, the selected shipping methods "
"will not be available for customers to choose during checkout."
msgstr ""
"Geben Sie die Bedingungen für die Deaktivierung von Versandmethoden "
"basierend auf dem Wert des aktuellen Felds an. Wenn die Bedingungen erfüllt "
"sind, stehen die ausgewählten Versandarten den Kunden während des "
"Bestellvorgangs nicht zur Auswahl."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1619
msgid "Actions"
msgstr "Aktionen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1805
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1809
msgid "General Settings"
msgstr "Allgemeine Einstellungen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1911
msgid "Inherit product tax class"
msgstr "Produktsteuerklasse erben"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1912
msgid "Standard"
msgstr "Standard"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1956
#, php-format
msgid "Leave it blank to calculate it automatically from the %s price"
msgstr "Lassen Sie es leer, um es automatisch aus dem %s Preis zu berechnen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:1975
#, php-format
msgid "Leave it blank to calculate it automatically from the %s sale price"
msgstr ""
"Lassen Sie es leer, um es automatisch aus dem %s Verkaufspreis zu berechnen"

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2014
msgid "this section if the following conditions are met."
msgstr "wenn die folgenden Bedingungen erfüllt sind."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2016
msgid "this field if the following conditions are met."
msgstr "dieses Feld, wenn die folgenden Bedingungen erfüllt sind."

#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2023
#: includes/classes/builder/class-themecomplete-epo-builder-element.php:2038
msgid "Add new condition group"
msgstr "Neue Bedingungsgruppe hinzufügen"

#: includes/classes/class-themecomplete-epo-associated-products.php:714
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be lower than %2$d."
msgstr "Die Menge von &quot;%1$s&quot; darf nicht geringer sein als %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:720
#, php-format
msgid "The quantity of &quot;%1$s&quot; cannot be higher than %2$d."
msgstr "Die Menge von &quot;%1$s&quot; darf nicht höher sein als %2$d."

#: includes/classes/class-themecomplete-epo-associated-products.php:726
#, php-format
msgid "The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d."
msgstr ""
"Die Menge von &quot;%1$s&quot; muss in Vielfachen von %2$d eingegeben werden."

#: includes/classes/class-themecomplete-epo-associated-products.php:1356
#, php-format
msgid "%s removed along with all of its associated products!"
msgstr "%s zusammen mit allen zugehörigen Produkten entfernt!"

#: includes/classes/class-themecomplete-epo-cart.php:965
#, php-format
msgid ""
"The item %s was removed from the cart because it had changed since it was "
"added."
msgstr ""
"Der Artikel %s wurde aus dem Warenkorb entfernt, da er sich seit dem "
"Hinzufügen geändert hat."

#: includes/classes/class-themecomplete-epo-cart.php:1144
#: includes/classes/class-themecomplete-epo-settings-base.php:1222
msgid "You cannot add negative priced products to the cart."
msgstr "Sie können negativ bepreiste Produkte nicht dem Warenkorb hinzufügen."

#: includes/classes/class-themecomplete-epo-cart.php:1156
#: includes/classes/class-themecomplete-epo-settings-base.php:1213
msgid "You cannot add zero priced products to the cart."
msgstr "Sie können keine kostenlosen Produkte dem Warenkorb hinzufügen."

#: includes/classes/class-themecomplete-epo-cart.php:2118
#: includes/classes/class-themecomplete-epo-scripts.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:1123
msgid "Additional options"
msgstr "Zusätzliche Optionen"

#: includes/classes/class-themecomplete-epo-cart.php:3022
#: includes/classes/class-themecomplete-epo-cart.php:3122
#, php-format
msgid "\"%s\" is a required field."
msgstr "\"%s\" ist ein Pflichtfeld."

#: includes/classes/class-themecomplete-epo-cart.php:3255
#, php-format
msgid ""
"%1$s has been removed from your cart because it has since been modified. You "
"can add it back to your cart %2$s."
msgstr ""
"%1$s wurde aus Ihrem Warenkorb entfernt, da es geändert wurde. Sie können es "
"wieder in Ihren Warenkorb legen %2$s."

#: includes/classes/class-themecomplete-epo-cart.php:3255
msgid "here"
msgstr "hier"

#: includes/classes/class-themecomplete-epo-cart.php:3387
#: includes/classes/class-themecomplete-epo-cart.php:3406
#: includes/classes/class-themecomplete-epo-scripts.php:513
msgid "Extra fee"
msgstr "Zusatzgebühr"

#: includes/classes/class-themecomplete-epo-cart.php:3507
#: includes/classes/class-themecomplete-epo-settings-base.php:1141
msgid "Empty cart"
msgstr "Warenkorb leeren"

#: includes/classes/class-themecomplete-epo-cart.php:3896
#: includes/classes/class-themecomplete-epo-cart.php:3962
#: includes/classes/class-themecomplete-epo-settings-base.php:1114
msgid "Edit options"
msgstr "Optionen ändern"

#: includes/classes/class-themecomplete-epo-cart.php:3989
#: includes/classes/class-themecomplete-epo-settings-base.php:1105
msgid "Update cart"
msgstr "Warenkorb aktualisieren"

#: includes/classes/class-themecomplete-epo-cart.php:4075
#, php-format
msgctxt "Item name in quotes"
msgid "&ldquo;%s&rdquo;"
msgstr "&ldquo;%s&rdquo;"

#: includes/classes/class-themecomplete-epo-cart.php:4080
#, php-format
msgid "%s has been updated."
msgid_plural "%s have been updated."
msgstr[0] "Die %s wurde aktualisiert."
msgstr[1] "%s Beiträge aktualisiert."

#: includes/classes/class-themecomplete-epo-cart.php:4085
msgid "View cart"
msgstr "Warenkorb ansehen"

#: includes/classes/class-themecomplete-epo-check-base.php:121
#, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or "
"later."
msgstr ""
"WooCommerce TM Extra-Produktoptionen erfordert WordPress %s oder später."

#: includes/classes/class-themecomplete-epo-check-base.php:193
#, php-format
msgid ""
"Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra "
"Checkout Options %s or later!."
msgstr ""
"Zusätzliche Produktoptionen und Add-Ons für WooCommerce erfordern "
"WooCommerce Extra Checkout Options %s oder höher!."

#: includes/classes/class-themecomplete-epo-check-base.php:196
#: includes/classes/class-themecomplete-epo-check-base.php:198
msgid "The installed version is"
msgstr "Die installierte Version ist"

#: includes/classes/class-themecomplete-epo-check-base.php:213
#, php-format
msgid ""
"%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not "
"supported. Please update to the latest version."
msgstr ""
"%1$s Wichtig:%2$s Ihre Version von WooCommerce Extra Checkout Options wird "
"nicht unterstützt. Bitte aktualisieren Sie auf die neueste Version."

#: includes/classes/class-themecomplete-epo-check-base.php:229
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been "
"deactivated because it is not compatible with the current version of Extra "
"Checkout Options."
msgstr ""
"%1$s Wichtig: %2$s Extra Product Options & Add-Ons für WooCommerce wurde "
"deaktiviert, da es nicht mit der aktuellen Version von Extra Checkout "
"Options kompatibel ist."

#: includes/classes/class-themecomplete-epo-check-base.php:245
#, fuzzy, php-format
#| msgid ""
#| "%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has "
#| "been deactivated because it is not compatible with the current version of "
#| "Extra Checkout Options."
msgid ""
"%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload "
"has been deactivated because its functionality is included in the main "
"plugin."
msgstr ""
"%1$s Wichtig: %2$s Extra Product Options & Add-Ons für WooCommerce wurde "
"deaktiviert, da es nicht mit der aktuellen Version von Extra Checkout "
"Options kompatibel ist."

#: includes/classes/class-themecomplete-epo-check-base.php:294
#, php-format
msgid ""
"%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product "
"Options & Add-Ons for WooCommerce."
msgstr ""
"%1$s Wichtig:%2$s Bitte führen Sie den WooCommerce-Updater aus, bevor Sie "
"zusätzliche Produktoptionen und Add-Ons für WooCommerce verwenden."

#: includes/classes/class-themecomplete-epo-check-base.php:303
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"%3$sWooCommerce%4$s %5$s or later."
msgstr ""
"%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce "
"erfordert %3$sWooCommerce%4$s %5$s oder höher."

#: includes/classes/class-themecomplete-epo-check-base.php:321
msgid "Run the updater"
msgstr "Updater ausführen"

#: includes/classes/class-themecomplete-epo-check-base.php:359
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"WordPress %3$s or later."
msgstr ""
"%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce "
"erfordert WordPress %3$s oder höher."

#: includes/classes/class-themecomplete-epo-check-base.php:377
#, php-format
msgid ""
"%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires "
"PHP version %3$s or later."
msgstr ""
"%1$s Wichtig: %2$s Zusätzliche Produktoptionen und Add-Ons für WooCommerce "
"erfordert die PHP-Version %3$s oder höher."

#: includes/classes/class-themecomplete-epo-helper-base.php:1179
msgid "Filename"
msgstr "Dateiname"

#: includes/classes/class-themecomplete-epo-helper-base.php:1191
#: includes/classes/class-themecomplete-epo-helper-base.php:1204
msgid "Delete"
msgstr "Löschen"

#: includes/classes/class-themecomplete-epo-post-types.php:75
msgctxt "post type general name"
msgid "TM Extra Product Options"
msgstr "TM Zusätzliche Produktoptionen"

#: includes/classes/class-themecomplete-epo-post-types.php:101
msgid "Global Forms"
msgstr "Global Forms"

#: includes/classes/class-themecomplete-epo-post-types.php:102
msgid "Global Form"
msgstr "Globales Formular"

#: includes/classes/class-themecomplete-epo-post-types.php:103
msgctxt "post type general name"
msgid "Global Forms"
msgstr "Global Forms"

#: includes/classes/class-themecomplete-epo-post-types.php:104
msgid "Add Global Form"
msgstr "Globales Formular hinzufügen"

#: includes/classes/class-themecomplete-epo-post-types.php:105
msgid "Add New Global Form"
msgstr "Neues globales Formular"

#: includes/classes/class-themecomplete-epo-post-types.php:106
#: includes/classes/class-themecomplete-epo-post-types.php:161
#: includes/classes/class-themecomplete-epo-post-types.php:207
msgid "Edit"
msgstr "Bearbeiten"

#: includes/classes/class-themecomplete-epo-post-types.php:107
msgid "Edit Global Form"
msgstr "Globales Formular bearbeiten"

#: includes/classes/class-themecomplete-epo-post-types.php:108
msgid "New Global Form"
msgstr "Neues globales Formular"

#: includes/classes/class-themecomplete-epo-post-types.php:109
#: includes/classes/class-themecomplete-epo-post-types.php:110
msgid "View Global Form"
msgstr "Globales Formular anzeigen"

#: includes/classes/class-themecomplete-epo-post-types.php:111
msgid "Search Global Form"
msgstr "Globales Formular suchen"

#: includes/classes/class-themecomplete-epo-post-types.php:112
msgid "No Global Form found"
msgstr "Kein globales Formular gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:113
msgid "No Global Form found in trash"
msgstr "Kein globales Formular im Papierkorb gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:114
msgid "Parent Global Form"
msgstr "Übergeordnetes globales Formular"

#: includes/classes/class-themecomplete-epo-post-types.php:116
msgid "This is where you can add new global options to your store."
msgstr "Hier können Sie Ihrem Shop neue globale Optionen hinzufügen."

#: includes/classes/class-themecomplete-epo-post-types.php:156
msgid "Option Templates"
msgstr "Optionen Templates"

#: includes/classes/class-themecomplete-epo-post-types.php:157
msgid "Option Template"
msgstr "Options-Vorlage"

#: includes/classes/class-themecomplete-epo-post-types.php:158
msgctxt "post type general name"
msgid "Option Templates"
msgstr "Optionen Templates"

#: includes/classes/class-themecomplete-epo-post-types.php:159
msgid "Add Template"
msgstr "Vorlage hinzufügen"

#: includes/classes/class-themecomplete-epo-post-types.php:160
msgid "Add New Template"
msgstr "Neue Vorlage hinzufügen"

#: includes/classes/class-themecomplete-epo-post-types.php:162
msgid "Edit Template"
msgstr "Vorlage bearbeiten"

#: includes/classes/class-themecomplete-epo-post-types.php:163
msgid "New Template"
msgstr "Neue Vorlage"

#: includes/classes/class-themecomplete-epo-post-types.php:164
#: includes/classes/class-themecomplete-epo-post-types.php:165
msgid "View Template"
msgstr "Template ansehen"

#: includes/classes/class-themecomplete-epo-post-types.php:166
msgid "Search Template"
msgstr "Suchseite"

#: includes/classes/class-themecomplete-epo-post-types.php:167
msgid "No Template found"
msgstr "Keine Vorlage gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:168
msgid "No Template found in trash"
msgstr "Keine Vorlage im Papierkorb gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:169
msgid "Parent Template"
msgstr "Übergeordnete Vorlage"

#: includes/classes/class-themecomplete-epo-post-types.php:171
msgid "This is where you can add new global template options."
msgstr "Hier können Sie neue globale Vorlagenoptionen hinzufügen."

#: includes/classes/class-themecomplete-epo-post-types.php:202
msgid "Lookup tables"
msgstr "Nachschlagetabellen"

#: includes/classes/class-themecomplete-epo-post-types.php:204
msgctxt "post type general name"
msgid "Lookup tables"
msgstr "Nachschlagetabellen"

#: includes/classes/class-themecomplete-epo-post-types.php:205
msgid "Add Lookup table"
msgstr "Nachschlagetabelle hinzufügen"

#: includes/classes/class-themecomplete-epo-post-types.php:206
msgid "Add New Lookup table"
msgstr "Neue Nachschlagetabelle hinzufügen"

#: includes/classes/class-themecomplete-epo-post-types.php:208
msgid "Edit Lookup table"
msgstr "Nachschlagetabelle bearbeiten"

#: includes/classes/class-themecomplete-epo-post-types.php:209
msgid "New Lookup table"
msgstr "Neue Nachschlagetabelle"

#: includes/classes/class-themecomplete-epo-post-types.php:210
#: includes/classes/class-themecomplete-epo-post-types.php:211
msgid "View Lookup table"
msgstr "Nachschlagetabelle anzeigen"

#: includes/classes/class-themecomplete-epo-post-types.php:212
msgid "Search Lookup table"
msgstr "Such-Lookup-Tabelle"

#: includes/classes/class-themecomplete-epo-post-types.php:213
msgid "No Lookup table found"
msgstr "Keine Nachschlagetabelle gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:214
msgid "No Lookup table found in trash"
msgstr "Keine Nachschlagetabelle im Papierkorb gefunden"

#: includes/classes/class-themecomplete-epo-post-types.php:215
msgid "Parent Lookup table"
msgstr "Übergeordnete Nachschlagetabelle"

#: includes/classes/class-themecomplete-epo-post-types.php:217
msgid "This is where you can add new lookup tables."
msgstr "Hier können Sie neue Nachschlagetabellen hinzufügen."

#: includes/classes/class-themecomplete-epo-scripts.php:514
#: includes/classes/class-themecomplete-epo-settings-base.php:1159
msgid "Unit price"
msgstr "Einheitspreis"

#: includes/classes/class-themecomplete-epo-scripts.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:1168
msgid "Options amount"
msgstr "Zusatzoptionen"

#: includes/classes/class-themecomplete-epo-scripts.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:1177
msgid "Options VAT amount"
msgstr "Optionen MwSt.-Betrag"

#: includes/classes/class-themecomplete-epo-scripts.php:517
#: includes/classes/class-themecomplete-epo-settings-base.php:1186
msgid "Fees amount"
msgstr "Fester Betrag"

#: includes/classes/class-themecomplete-epo-scripts.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:1150
msgid "Final total"
msgstr "Gesamtsumme"

#: includes/classes/class-themecomplete-epo-scripts.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:1268
msgid "Prev"
msgstr "Zurück"

#: includes/classes/class-themecomplete-epo-scripts.php:520
#: includes/classes/class-themecomplete-epo-settings-base.php:1277
msgid "Next"
msgstr "Weiter"

#: includes/classes/class-themecomplete-epo-scripts.php:524
#: includes/classes/class-themecomplete-epo-settings-base.php:1295
msgid "characters remaining"
msgstr "verbleibende Zeichen"

#: includes/classes/class-themecomplete-epo-scripts.php:531
#: includes/classes/class-themecomplete-epo-settings-base.php:1304
msgid "Uploading files"
msgstr "Dateien hochladen"

#: includes/classes/class-themecomplete-epo-scripts.php:532
#: includes/classes/class-themecomplete-epo-settings-base.php:1313
msgid "Your files are being uploaded"
msgstr "Ihre Dateien werden hochgeladen"

#: includes/classes/class-themecomplete-epo-scripts.php:534
#: includes/classes/class-themecomplete-epo-settings-base.php:1331
msgid "file"
msgstr "Datei"

#: includes/classes/class-themecomplete-epo-scripts.php:535
#: includes/classes/class-themecomplete-epo-settings-base.php:1340
#: includes/classes/class-themecomplete-epo-settings-base.php:2211
msgid "files"
msgstr "Dateien"

#: includes/classes/class-themecomplete-epo-scripts.php:575
#: includes/classes/class-themecomplete-epo-settings-base.php:1286
msgid "This field is required."
msgstr "Dieses Feld wird benötigt."

#: includes/classes/class-themecomplete-epo-scripts.php:576
msgid "Please enter a valid email address."
msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein."

#: includes/classes/class-themecomplete-epo-scripts.php:577
msgid "Please enter a valid URL."
msgstr "Bitte geben Sie eine gültige URL ein."

#: includes/classes/class-themecomplete-epo-scripts.php:578
msgid "Please enter a valid number."
msgstr "Bitte geben Sie eine gültige Nummer ein."

#: includes/classes/class-themecomplete-epo-scripts.php:579
msgid "Please enter only digits."
msgstr "Bitte geben Sie nur Ziffern ein."

#: includes/classes/class-themecomplete-epo-scripts.php:580
msgid "Please enter a value less than or equal to {0}."
msgstr "Bitte geben Sie einen Wert ein, der kleiner oder gleich {0} ist."

#: includes/classes/class-themecomplete-epo-scripts.php:581
msgid "Please enter a value greater than or equal to {0}."
msgstr "Bitte geben Sie einen Wert ein, der größer oder gleich {0} ist."

#: includes/classes/class-themecomplete-epo-scripts.php:582
msgid "Please enter no more than {0} character."
msgstr "Bitte geben Sie nicht mehr als {0} ein."

#: includes/classes/class-themecomplete-epo-scripts.php:583
msgid "Please enter no more than {0} characters."
msgstr "Bitte geben Sie nicht mehr als {0} Zeichen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:584
msgid "Please enter at least {0} character."
msgstr "Bitte geben Sie mindestens {0} Zeichen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:585
msgid "Please enter at least {0} characters."
msgstr "Bitte geben Sie mindestens {0} Zeichen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:586
msgid "Please select up to {0} choice."
msgstr "Bitte wählen Sie bis zu {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:587
msgid "Please select up to {0} choices."
msgstr "Bitte wählen Sie bis zu {0} Auswahlmöglichkeiten aus."

#: includes/classes/class-themecomplete-epo-scripts.php:588
msgid "Please select exactly {0} choice."
msgstr "Bitte wählen Sie genau {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:589
msgid "Please select exactly {0} choices."
msgstr "Bitte wählen Sie exakt {0} Auswahlmöglichkeiten aus."

#: includes/classes/class-themecomplete-epo-scripts.php:590
msgid "Please select at least {0} choice."
msgstr "Bitte wählen Sie mindestens {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:591
msgid "Please select at least {0} choices."
msgstr "Bitte wählen Sie mehr als {0} Auswahlmöglichkeiten aus."

#: includes/classes/class-themecomplete-epo-scripts.php:592
msgid "Please enter a multiple of {0}."
msgstr "Bitte mehr eingeben als {0}."

#: includes/classes/class-themecomplete-epo-scripts.php:593
msgid "Please enter only letters."
msgstr "Bitte geben Sie nur Buchstaben  ein."

#: includes/classes/class-themecomplete-epo-scripts.php:594
msgid "Please enter only letters or spaces."
msgstr "Bitte geben Sie nur Buchstaben oder Leerzeichen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:595
msgid "Please enter only letters, numbers or hyphens."
msgstr "Bitte geben Sie nur Buchstaben, Zahlen oder Unterstriche ein."

#: includes/classes/class-themecomplete-epo-scripts.php:596
msgid "Please enter only unicode letters and numbers."
msgstr "Bitte geben Sie nur Unicode Buchstaben und Zahlen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:597
msgid "Please enter only unicode letters, numbers or spaces."
msgstr "Bitte geben Sie nur Unicode-Buchstaben, Zahlen oder Leerzeichen ein."

#: includes/classes/class-themecomplete-epo-scripts.php:598
msgid "Minimum number of rows is {0}"
msgstr "Die Mindestanzahl der Zeilen beträgt {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:599
msgid "Maximum number of rows is {0}"
msgstr "Die maximale Anzahl von Zeilen beträgt {0}"

#: includes/classes/class-themecomplete-epo-scripts.php:611
#: includes/classes/class-themecomplete-epo-settings-base.php:1250
msgid "Done"
msgstr "Erledigt"

#: includes/classes/class-themecomplete-epo-scripts.php:612
#: includes/classes/class-themecomplete-epo-settings-base.php:1259
msgid "Today"
msgstr "Heute"

#: includes/classes/class-themecomplete-epo-settings-base.php:87
#: includes/classes/class-themecomplete-epo-settings-base.php:1078
#: includes/classes/class-themecomplete-epo-settings-base.php:1516
#: includes/classes/class-themecomplete-epo-settings-base.php:1848
msgid "General"
msgstr "Allgemein"

#: includes/classes/class-themecomplete-epo-settings-base.php:88
#: includes/classes/class-themecomplete-epo-settings-base.php:477
#: includes/classes/class-themecomplete-epo-settings-base.php:488
msgid "Display"
msgstr "Anzeige"

#: includes/classes/class-themecomplete-epo-settings-base.php:91
#: includes/classes/class-themecomplete-epo-settings-base.php:1521
msgid "Strings"
msgstr "Zeichen"

#: includes/classes/class-themecomplete-epo-settings-base.php:92
#: includes/classes/class-themecomplete-epo-settings-base.php:1405
msgid "Style"
msgstr "Stil"

#: includes/classes/class-themecomplete-epo-settings-base.php:93
msgid "Global"
msgstr "Global"

#: includes/classes/class-themecomplete-epo-settings-base.php:94
#: includes/classes/class-themecomplete-epo-settings-base.php:1081
msgid "Elements"
msgstr "Elemente"

#: includes/classes/class-themecomplete-epo-settings-base.php:95
msgid "Upload manager"
msgstr "Upload Manager"

#: includes/classes/class-themecomplete-epo-settings-base.php:96
msgid "Custom code"
msgstr "Benutzerdefinierter Code"

#: includes/classes/class-themecomplete-epo-settings-base.php:97
#: includes/classes/class-themecomplete-epo-settings-base.php:2362
msgid "Math Formula Constants"
msgstr "Mathematische Formelkonstanten"

#: includes/classes/class-themecomplete-epo-settings-base.php:99
msgid "License"
msgstr "Lizenz"

#: includes/classes/class-themecomplete-epo-settings-base.php:162
#, fuzzy
#| msgid "Shop order"
msgid "Shop order (HPOS)"
msgstr "Bestellung"

#: includes/classes/class-themecomplete-epo-settings-base.php:163
msgid "Shop order"
msgstr "Bestellung"

#: includes/classes/class-themecomplete-epo-settings-base.php:245
msgid "Initialization"
msgstr "Initialisierung"

#: includes/classes/class-themecomplete-epo-settings-base.php:246
#: includes/classes/class-themecomplete-epo-settings-base.php:1080
msgid "Final total box"
msgstr "Gesamtsumme-Box"

#: includes/classes/class-themecomplete-epo-settings-base.php:247
#: includes/classes/class-themecomplete-epo-settings-base.php:483
#: includes/classes/class-themecomplete-epo-settings-base.php:1523
msgid "Various"
msgstr "Verschiedenen"

#: includes/classes/class-themecomplete-epo-settings-base.php:251
#, fuzzy
#| msgid "Enable front-end for roles"
msgid "Enable Frontend Access for Selected Roles"
msgstr "Frontend für folgende Rollen aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:252
msgid "Select the roles that will have access to the extra options."
msgstr ""
"Wählen Sie die Berechtigungsgruppen aus, die Zugriff auf diese Optionen "
"haben."

#: includes/classes/class-themecomplete-epo-settings-base.php:261
#, fuzzy
#| msgid "Disable front-end for roles"
msgid "Disable Frontend Access for Selected Roles"
msgstr "Frontend für folgende Rollen deaktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:262
msgid "Select the roles that will not have access to the extra options."
msgstr ""
"Wählen Sie die Berechtigungsgruppen aus, die keinen Zugriff auf diese "
"Optionen haben."

#: includes/classes/class-themecomplete-epo-settings-base.php:271
msgid "Enable translations"
msgstr "Übersetzungen aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:272
msgid "This will enable the default plugin translation using the pot files."
msgstr ""
"Dadurch wird die Standard-Plugin-Übersetzung mit den Pot-Dateien aktiviert."

#: includes/classes/class-themecomplete-epo-settings-base.php:279
msgid "Post type hook priority"
msgstr "Priorität des Beitragstyps"

#: includes/classes/class-themecomplete-epo-settings-base.php:280
msgid ""
"Do not change this unless you know how it will affect your site! This is the "
"priority which the post types are loaded by the plugin."
msgstr ""
"Ändern Sie dies nicht, es sei denn, Sie wissen, wie es sich auf Ihre Website "
"auswirken wird! Dies ist die Priorität, mit der die Beitragstypen vom Plugin "
"geladen werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:282
msgid "Default value is 100"
msgstr "Standard: 100"

#: includes/classes/class-themecomplete-epo-settings-base.php:288
msgid "Plugin Loading Areas"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:289
#, fuzzy
#| msgid "Select the parameter which the products will be sorted by."
msgid "Specify the areas where the plugin will be activated."
msgstr ""
"Wählen Sie den Parameter aus, nach dem die Produkte sortiert werden sollen."

#: includes/classes/class-themecomplete-epo-settings-base.php:296
#, fuzzy
#| msgid "Everyone"
msgid "Everywhere"
msgstr "Jeder"

#: includes/classes/class-themecomplete-epo-settings-base.php:297
msgid "Shop"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:298
#, fuzzy
#| msgid "Products and Categories"
msgid "Product Categories"
msgstr "Produkte und Kategorien"

#: includes/classes/class-themecomplete-epo-settings-base.php:299
#, fuzzy
#| msgid "Product variables"
msgid "Product Taxonomies"
msgstr "Produktvariablen"

#: includes/classes/class-themecomplete-epo-settings-base.php:300
#, fuzzy
#| msgid "Product page"
msgid "Product Tags"
msgstr "Produktseite"

#: includes/classes/class-themecomplete-epo-settings-base.php:304
msgid "Order Received Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:305
msgid "My Account Page"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:306
#, fuzzy
#| msgid "WooCommerce"
msgid "WooCommerce Pages"
msgstr "WooCommerce"

#: includes/classes/class-themecomplete-epo-settings-base.php:307
msgid "Supported Quickview Solutions"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:311
msgid "Final Total Box"
msgstr "Endgültige Gesamtbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:312
msgid ""
"Enable this setting to display a Final Total Box on the product page, "
"allowing customers to view the total cost of their order, or disable it for "
"a simplified product page."
msgstr ""
"Aktivieren Sie diese Einstellung, um auf der Produktseite eine Endsummenbox "
"anzuzeigen, in der Kunden die Gesamtkosten ihrer Bestellung einsehen können, "
"oder deaktivieren Sie sie für eine vereinfachte Produktseite."

#: includes/classes/class-themecomplete-epo-settings-base.php:326
msgid "Show Options Total"
msgstr "Optionen insgesamt anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:327
msgid "Enable to display the total specifically for selected product options."
msgstr ""
"Aktivieren Sie diese Option, um die Gesamtsumme speziell für ausgewählte "
"Produktoptionen anzuzeigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:340
msgid "Show Final Total"
msgstr "Gesamtsumme anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:341
msgid ""
"Enable to display the comprehensive product total, providing customers with "
"a clear overview of the overall cost."
msgstr ""
"Ermöglichen Sie die Anzeige der umfassenden Produktsumme, um den Kunden "
"einen klaren Überblick über die Gesamtkosten zu geben."

#: includes/classes/class-themecomplete-epo-settings-base.php:353
msgid "Enable Final total box for all products"
msgstr "Gesamtsumme für alle Produkte anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:354
msgid "Show the Final total box even when the product has no extra options"
msgstr ""
"Zeigen Sie den endgültigen Gesamtbetrag an, auch wenn das Produkt keine "
"zusätzlichen Optionen hat"

#: includes/classes/class-themecomplete-epo-settings-base.php:361
msgid "Enable original final total display"
msgstr "Aktivieren Sie die ursprüngliche Gesamtanzeige"

#: includes/classes/class-themecomplete-epo-settings-base.php:362
msgid "Check to enable the display of the undiscounted final total"
msgstr ""
"Aktivieren Sie diese Option, um die Anzeige der nicht diskontierten Endsumme "
"zu aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:370
msgid "Enable options VAT display"
msgstr "Optionen für die MwSt.-Anzeige aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:371
msgid "Check to display the options VAT amount above the options total"
msgstr ""
"Aktivieren Sie diese Option, um den Mehrwertsteuerbetrag der Optionen über "
"dem Gesamtbetrag der Optionen anzuzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:378
msgid "Show Unit price on totals box"
msgstr "Zeigen Sie den Einheitspreis auf der Gesamtbox"

#: includes/classes/class-themecomplete-epo-settings-base.php:379
msgid "Enable this to display the unit price when the totals box is visible"
msgstr ""
"Aktivieren Sie diese Option, um den Stückpreis anzuzeigen, wenn die "
"Gesamtbetrag Box sichtbar ist"

#: includes/classes/class-themecomplete-epo-settings-base.php:386
msgid "Include Fees on unit price"
msgstr "Gebühren für Stückpreis"

#: includes/classes/class-themecomplete-epo-settings-base.php:387
msgid "Enable this to add any Fees to the unit price"
msgstr "Aktivieren Sie diese Option, um dem Stückpreis Gebühren hinzuzufügen"

#: includes/classes/class-themecomplete-epo-settings-base.php:394
msgid "Total price as Unit Price"
msgstr "Gesamtpreis als Stückpreis"

#: includes/classes/class-themecomplete-epo-settings-base.php:395
msgid "Make the total price not being multiplied by the product quantity"
msgstr ""
"Stellen Sie sicher, dass der Gesamtbetrag nicht mit der Produktmenge "
"multipliziert wird"

#: includes/classes/class-themecomplete-epo-settings-base.php:402
msgid "Hide Final total box until an element is chosen"
msgstr "Feld \"Endergebnis\" ausblenden, bis ein Element ausgewählt ist"

#: includes/classes/class-themecomplete-epo-settings-base.php:403
msgid ""
"Check this to show the Final total box only when at least one option is "
"filled."
msgstr ""
"Aktivieren Sie diese Option, um das Kontrollkästchen Endergebnis nur "
"anzuzeigen, wenn mindestens eine Option ausgefüllt ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:410
msgid "Hide Final total box until all required elements are chosen"
msgstr ""
"Blenden Sie das Feld \"Endsumme\" aus, bis alle erforderlichen Elemente "
"ausgewählt sind"

#: includes/classes/class-themecomplete-epo-settings-base.php:411
msgid ""
"Check this to show the Final total box only when all required visible "
"options are filled."
msgstr ""
"Aktivieren Sie diese Option, um das Kontrollkästchen Endgültige Summe nur "
"anzuzeigen, wenn alle erforderlichen sichtbaren Optionen ausgefüllt sind."

#: includes/classes/class-themecomplete-epo-settings-base.php:418
msgid "Hide Final total box until all elements are chosen"
msgstr ""
"Blenden Sie das Feld \"Endsumme\" aus, bis alle Elemente ausgewählt sind"

#: includes/classes/class-themecomplete-epo-settings-base.php:419
msgid ""
"Check this to show the Final total box only when all visible options are "
"filled."
msgstr ""
"Aktivieren Sie diese Option, um das Kontrollkästchen Endergebnis nur "
"anzuzeigen, wenn alle sichtbaren Optionen ausgefüllt sind."

#: includes/classes/class-themecomplete-epo-settings-base.php:426
msgid "Disable lazy load images"
msgstr "Lazy load deaktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:427
msgid "Enable this to disable lazy loading images."
msgstr ""
"Aktivieren Sie diese Option, um das verzögerte Laden von Bildern zu "
"deaktivieren."

#: includes/classes/class-themecomplete-epo-settings-base.php:434
msgid "Preload lightbox images"
msgstr "Vorladen von Lightbox-Bildern"

#: includes/classes/class-themecomplete-epo-settings-base.php:435
msgid "Enable this to preload the image when using the lightbox feature."
msgstr ""
"Aktivieren Sie dies, um das Bild vorzuladen, wenn Sie die Lightbox-Funktion "
"verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:442
msgid "Enable plugin for WooCommerce shortcodes"
msgstr "Plugin für WooCommerce-Shortcodes aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:443
msgid ""
"Enabling this will load the plugin files to all WordPress pages. Use with "
"caution."
msgstr ""
"Aktiviert dies wird die Plugin-Dateien auf alle WordPress-Seiten laden. Mit "
"Vorsicht verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:450
msgid "Enable shortcodes in options strings"
msgstr "Shortcodes in Optionszeichenfolgen aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:451
msgid ""
"Enabling this will allow the use of shortcodes and HTML code in the options "
"label and description text."
msgstr ""
"Wenn Sie dies aktivieren, können Shortcodes und HTML-Codes in den "
"Optionsbezeichnungen und Beschreibungstexten verwendet werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:478
msgid "Placement"
msgstr "Platzierung"

#: includes/classes/class-themecomplete-epo-settings-base.php:480
#: includes/classes/class-themecomplete-epo-settings-base.php:585
msgid "Floating Totals box"
msgstr "„Gesamtsumme“-Box fließend"

#: includes/classes/class-themecomplete-epo-settings-base.php:481
msgid "Add to cart button"
msgstr "Zum Warenkorb hinzufügen Button"

#: includes/classes/class-themecomplete-epo-settings-base.php:482
msgid "Animation"
msgstr "Animation"

#: includes/classes/class-themecomplete-epo-settings-base.php:489
msgid ""
"This controls how your fields are displayed on the front-end. If you choose "
"\"Show using action hooks\" you have to manually write the code to your "
"theme or plugin to display the fields and the placement settings below will "
"not work. If you use the Composite Products extension you must leave this "
"setting to \"Normal\" otherwise the extra options cannot be displayed on the "
"composite product bundles. See more at the documentation."
msgstr ""
"Wenn Sie \"Mit Hilfe von Action-Hooks\" wählen, müssen Sie den Code manuell "
"auf Ihr Thema oder Plugin schreiben, um die Felder anzuzeigen, und die "
"Einstellungen unten funktionieren nicht. Wenn Sie Composite Products "
"Extension verwenden, müssen Sie diese Einstellung auf \"Normal\" lassen, "
"sonst können die zusätzlichen Optionen nicht auf den Composite-"
"Produktbündeln angezeigt werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:497
msgid "Show using action hooks"
msgstr "Aktion-Hooks Verwendung anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:501
msgid "Extra Options placement"
msgstr "Extra-Options-Platzierung"

#: includes/classes/class-themecomplete-epo-settings-base.php:502
msgid "Select where you want the extra options to appear."
msgstr "Wählen Sie aus, wo die zusätzlichen Optionen angezeigt werden sollen."

#: includes/classes/class-themecomplete-epo-settings-base.php:509
#: includes/classes/class-themecomplete-epo-settings-base.php:551
msgid "Before add to cart button"
msgstr "Vor dem Kauf-Button"

#: includes/classes/class-themecomplete-epo-settings-base.php:510
#: includes/classes/class-themecomplete-epo-settings-base.php:552
msgid "After add to cart button"
msgstr "Nach dem Kauf-Button"

#: includes/classes/class-themecomplete-epo-settings-base.php:512
#: includes/classes/class-themecomplete-epo-settings-base.php:554
msgid "Before cart form"
msgstr "Vor dem Warenkorb-Formular"

#: includes/classes/class-themecomplete-epo-settings-base.php:513
#: includes/classes/class-themecomplete-epo-settings-base.php:555
msgid "After cart form"
msgstr "Nach dem Warenkorb-Formular"

#: includes/classes/class-themecomplete-epo-settings-base.php:515
#: includes/classes/class-themecomplete-epo-settings-base.php:557
msgid "Before product"
msgstr "Vor Produkt"

#: includes/classes/class-themecomplete-epo-settings-base.php:516
#: includes/classes/class-themecomplete-epo-settings-base.php:558
msgid "After product"
msgstr "Nach dem Produkt"

#: includes/classes/class-themecomplete-epo-settings-base.php:518
#: includes/classes/class-themecomplete-epo-settings-base.php:560
msgid "Before product summary"
msgstr "Vor der Produktübersicht"

#: includes/classes/class-themecomplete-epo-settings-base.php:519
#: includes/classes/class-themecomplete-epo-settings-base.php:561
msgid "After product summary"
msgstr "Nach der Produktübersicht"

#: includes/classes/class-themecomplete-epo-settings-base.php:521
#: includes/classes/class-themecomplete-epo-settings-base.php:563
msgid "After product image"
msgstr "Nach Produktbild"

#: includes/classes/class-themecomplete-epo-settings-base.php:523
#: includes/classes/class-themecomplete-epo-settings-base.php:565
msgid "Custom hook"
msgstr "Benutzerdefinierter Hook"

#: includes/classes/class-themecomplete-epo-settings-base.php:527
msgid "Extra Options placement custom hook"
msgstr "Zusätzliche Optionen Platzierung benutzerdefinierter Hook"

#: includes/classes/class-themecomplete-epo-settings-base.php:535
msgid "Extra Options placement hook priority"
msgstr "Extra-Optionen Platzierung Hook-Priorität"

#: includes/classes/class-themecomplete-epo-settings-base.php:536
msgid "Select the Extra Options placement hook priority"
msgstr "Wählen Sie die Platzierung Hook Priorität für zusätzliche Optionen"

#: includes/classes/class-themecomplete-epo-settings-base.php:543
msgid "Totals box placement"
msgstr "Platzierung der „Gesamtsumme“-Box"

#: includes/classes/class-themecomplete-epo-settings-base.php:544
msgid "Select where you want the Totals box to appear."
msgstr "Wählen Sie, wo die „Gesamtsumme“-Box angezeigt werden soll."

#: includes/classes/class-themecomplete-epo-settings-base.php:569
msgid "Totals box placement custom hook"
msgstr "„Gesamtsumme“-Box Platzierung benutzerdefinierter Hook"

#: includes/classes/class-themecomplete-epo-settings-base.php:577
msgid "Totals box placement hook priority"
msgstr "Total-Kasten-Platzierungs-Haken Priorität"

#: includes/classes/class-themecomplete-epo-settings-base.php:578
msgid "Select the Totals box placement hook priority"
msgstr "Wählen Sie die Gesamtbetrag Box Platzierung Hook Priorität aus"

#: includes/classes/class-themecomplete-epo-settings-base.php:586
msgid "This will enable a floating box to display your totals box."
msgstr "Aktivieren, um eine schwimmende „Gesamtsumme“-Box anzuzeigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:594
msgid "Bottom right"
msgstr "Unten rechts"

#: includes/classes/class-themecomplete-epo-settings-base.php:595
msgid "Bottom left"
msgstr "Unten links"

#: includes/classes/class-themecomplete-epo-settings-base.php:596
msgid "Top right"
msgstr "Oben rechts"

#: includes/classes/class-themecomplete-epo-settings-base.php:597
msgid "Top left"
msgstr "Oben links"

#: includes/classes/class-themecomplete-epo-settings-base.php:601
msgid "Floating Totals box visibility"
msgstr "Floating Totals Box Sichtbarkeit"

#: includes/classes/class-themecomplete-epo-settings-base.php:602
msgid "This determines the floating totals box visibility."
msgstr "Dies bestimmt die schwimmenden Gesamtmengen der Box Sichtbarkeit."

#: includes/classes/class-themecomplete-epo-settings-base.php:609
msgid "Always visible"
msgstr "Immer sichtbar"

#: includes/classes/class-themecomplete-epo-settings-base.php:610
msgid "Visble after scrolling the page"
msgstr "Visble nach dem Scrollen der Seite"

#: includes/classes/class-themecomplete-epo-settings-base.php:611
msgid "Hide after scrolling the page"
msgstr "Ausblenden nach dem Scrollen der Seite"

#: includes/classes/class-themecomplete-epo-settings-base.php:615
msgid "Pixels amount needed to scroll"
msgstr "Zum Scrollen benötigte Pixelmenge"

#: includes/classes/class-themecomplete-epo-settings-base.php:616
msgid ""
"Select the number of pixels the page needs to scroll for the floating totals "
"to become visible."
msgstr ""
"Wählen Sie die Anzahl der Pixel aus, die die Seite scrollen muss, damit der "
"schwebende Gesamtbetrag sichtbar wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:623
msgid "Add to cart button on floating totals box"
msgstr "In den Warenkorb-Knopf auf schwimmenden Totalkarton"

#: includes/classes/class-themecomplete-epo-settings-base.php:624
msgid "Display the add to cart button on floating box."
msgstr ""
"Zeigt die Schaltfläche \"in den Warenkorb\" auf der schwimmenden Box an."

#: includes/classes/class-themecomplete-epo-settings-base.php:631
msgid "Change original product price"
msgstr "Urrsprünglichen Produktpreis ändern"

#: includes/classes/class-themecomplete-epo-settings-base.php:632
msgid ""
"Check to overwrite the original product price when the price is changing."
msgstr ""
"Überschreiben Sie den ursprünglichen Produktpreis, wenn sich der Preis "
"ändert."

#: includes/classes/class-themecomplete-epo-settings-base.php:639
msgid "Change variation price"
msgstr "Variationskurs"

#: includes/classes/class-themecomplete-epo-settings-base.php:640
msgid "Check to overwrite the variation price when the price is changing."
msgstr "Überschreiben Sie den Variationspreis, wenn sich der Preis ändert."

#: includes/classes/class-themecomplete-epo-settings-base.php:647
msgid "Force Select Options"
msgstr "Jetzt Gestalten"

#: includes/classes/class-themecomplete-epo-settings-base.php:648
msgid ""
"This changes the add to cart button on shop and archive pages to display "
"select options when the product has extra product options. Enabling this "
"will remove the ajax functionality."
msgstr ""
"Dadurch ändert sich der Text der Schaltfläche In den Einkaufswagen in "
"ausgewählte Optionen auf Shop- und Archivseiten, wenn das Produkt "
"zusätzliche Produktoptionen hat.Wenn Sie dies aktivieren, wird die Ajax-"
"Funktionalität entfernt."

#: includes/classes/class-themecomplete-epo-settings-base.php:657
msgid "Enable extra options in shop and category view"
msgstr "Zusätzliche Optionen in der Shop-und Kategorienansicht aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:658
msgid ""
"Check to enable the display of extra options on the shop page and category "
"view. This setting is theme dependent and some aspects may not work as "
"expected."
msgstr ""
"Überprüfen Sie, ob Sie die zusätzlichen Optionen auf der Shop-Seite und der "
"Kategorienansicht anzeigen lassen. Diese Einstellung ist thematisch abhängig "
"und einige Aspekte funktionieren vielleicht nicht wie erwartet."

#: includes/classes/class-themecomplete-epo-settings-base.php:665
msgid "Remove Free price label"
msgstr "Kostenloses Preisschild entfernen"

#: includes/classes/class-themecomplete-epo-settings-base.php:666
msgid "Check to remove Free price label when product has extra options"
msgstr ""
"Entfernt die Kostenlos Beschriftung wenn eine zusätzliche Option gewählt ist"

#: includes/classes/class-themecomplete-epo-settings-base.php:673
msgid "Use progressive display on options"
msgstr "Verwenden Sie progressive Anzeige auf Optionen"

#: includes/classes/class-themecomplete-epo-settings-base.php:674
msgid ""
"Enabling this will hide the options on the product page until JavaScript is "
"initialized. This is a fail-safe setting and we recommend to be active."
msgstr ""
"Damit verbergen sich die Optionen auf der Produktseite, bis JavaScript "
"initialisiert ist. Dies ist eine ausfallsichere Einstellung, und wir "
"empfehlen, aktiv zu sein."

#: includes/classes/class-themecomplete-epo-settings-base.php:681
msgid "Animation delay"
msgstr "Animationsverzögerung (s)"

#: includes/classes/class-themecomplete-epo-settings-base.php:682
msgid "How long the animation will take in milliseconds"
msgstr "Wie lange die Animation in Millisekunden dauert"

#: includes/classes/class-themecomplete-epo-settings-base.php:689
msgid "Start Animation delay"
msgstr "Start Animation verzögert sich"

#: includes/classes/class-themecomplete-epo-settings-base.php:690
msgid "The delay until the animation starts in milliseconds"
msgstr "Die Verzögerung bis zum Start der Animation in Millisekunden"

#: includes/classes/class-themecomplete-epo-settings-base.php:697
msgid "Show quantity selector only for elements with a value"
msgstr "Mengenauswahl nur für Elemente mit Wert anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:698
msgid "Check show quantity selector only for elements with a value."
msgstr "Check Show Mengenauswahl nur für Elemente mit einem Wert."

#: includes/classes/class-themecomplete-epo-settings-base.php:705
msgid "Hide add-to-cart button until an element is chosen"
msgstr "Öffnen Sie den Add-to-Cart-Button, bis eine Option gewählt ist"

#: includes/classes/class-themecomplete-epo-settings-base.php:706
msgid ""
"Check this to show the add to cart button only when at least one option is "
"filled."
msgstr ""
"Überprüfen Sie dies, um den Knopf zum Warenkorb anzuzeigen, wenn mindestens "
"eine Option ausgefüllt ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:713
msgid "Hide add-to-cart button until all required elements are chosen"
msgstr ""
"Blenden Sie die Schaltfläche \"In den Warenkorb\" aus, bis alle "
"erforderlichen Elemente ausgewählt sind"

#: includes/classes/class-themecomplete-epo-settings-base.php:714
msgid ""
"Check this to show the add to cart button only when all required visible "
"options are filled."
msgstr ""
"Aktivieren Sie diese Option, um die Schaltfläche \"In den Warenkorb\" nur "
"anzuzeigen, wenn alle erforderlichen sichtbaren Optionen ausgefüllt sind."

#: includes/classes/class-themecomplete-epo-settings-base.php:721
msgid "Hide add-to-cart button until all elements are chosen"
msgstr ""
"Blenden Sie die Schaltfläche \"In den Warenkorb\" aus, bis alle Elemente "
"ausgewählt sind"

#: includes/classes/class-themecomplete-epo-settings-base.php:722
msgid ""
"Check this to show the add to cart button only when all visible options are "
"filled."
msgstr ""
"Aktivieren Sie diese Option, um die Schaltfläche \"In den Warenkorb\" nur "
"anzuzeigen, wenn alle sichtbaren Optionen ausgefüllt sind."

#: includes/classes/class-themecomplete-epo-settings-base.php:729
msgid "Show full width label for elements."
msgstr "Beschriftung für Elemente in voller Breite anzeigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:730
msgid "Check this to force elements to be full width instead of auto."
msgstr ""
"Aktivieren Sie diese Option, um zu erzwingen, dass Elemente die volle Breite "
"anstelle von auto haben."

#: includes/classes/class-themecomplete-epo-settings-base.php:737
msgid "Show choice description inline."
msgstr "Auswahlbeschreibung inline anzeigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:738
msgid ""
"Check this to disable showing description as a tooltip and show it inline "
"instead."
msgstr ""
"Überprüfen Sie dies, um die Descirption als Tooltip zu deaktivieren und "
"zeigen Sie sie stattdessen inline."

#: includes/classes/class-themecomplete-epo-settings-base.php:745
msgid ""
"Hide choice label when using the Show tooltip setting for radio buttons and "
"checkboxes"
msgstr ""
"Ausblenden der Auswahlbeschriftung bei Verwendung der Einstellung "
"\"QuickInfo anzeigen\" für Optionsfelder und Kontrollkästchen"

#: includes/classes/class-themecomplete-epo-settings-base.php:746
msgid ""
"Check this to hide the choice label when using the Show tooltip setting for "
"radio buttons and checkboxes."
msgstr ""
"Aktivieren Sie diese Option, um die Auswahlbeschriftung auszublenden, wenn "
"Sie die Einstellung \"QuickInfo anzeigen\" für Optionsfelder und "
"Kontrollkästchen verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:753
msgid "Auto hide price if zero"
msgstr "Auto verstecken Preis, wenn Null"

#: includes/classes/class-themecomplete-epo-settings-base.php:754
msgid "Check this to globally hide the price display if it is zero."
msgstr ""
"Überprüfen Sie dies, um die Preisanzeige global zu verstecken, wenn sie null "
"ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:761
msgid "Trim zeros in prices"
msgstr "Nullen in den Preisen kürzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:762
msgid ""
"Check this to globally trim zero in prices. This will be applied to native "
"WooCommerce prices as well."
msgstr ""
"Überprüfen Sie dies, um die Preise weltweit auf Null zu senken. Dies gilt "
"auch für native WooCommerce-Preise."

#: includes/classes/class-themecomplete-epo-settings-base.php:769
msgid "Hide element price html when hide price setting is enabled"
msgstr ""
"Element price html ausblenden, wenn die Einstellung zum Ausblenden des "
"Preises aktiviert ist"

#: includes/classes/class-themecomplete-epo-settings-base.php:770
msgid ""
"Check this if you use Google Merchant Center. It will hide the price html of "
"the element when you enable its hide price setting."
msgstr ""
"Überprüfen Sie diese Option, wenn Sie das Google Merchant Center verwenden. "
"Es blendet den Preis-HTML des Elements aus, wenn Sie die Einstellung zum "
"Ausblenden des Preises aktivieren."

#: includes/classes/class-themecomplete-epo-settings-base.php:779
msgid "Use translated values when possible on admin Order"
msgstr "Verwenden Sie übersetzte Werte, wenn möglich auf Admin-Bestellung"

#: includes/classes/class-themecomplete-epo-settings-base.php:780
msgid ""
"Please note that if the options on the Order change or get deleted you will "
"get wrong results by enabling this!"
msgstr ""
"Bitte beachten Sie, dass Sie, wenn sich die Optionen auf der Bestellung "
"ändern oder gelöscht werden, falsche Ergebnisse erzielen, indem Sie dies "
"aktivieren!"

#: includes/classes/class-themecomplete-epo-settings-base.php:789
msgid "Include option pricing in product price"
msgstr "Optionspreis in den Produktpreis einschließen"

#: includes/classes/class-themecomplete-epo-settings-base.php:790
msgid "Check this to include the pricing of the options to the product price."
msgstr ""
"Überprüfen Sie dies, um die Preise der Optionen auf den Produktpreis zu "
"enthalten."

#: includes/classes/class-themecomplete-epo-settings-base.php:797
msgid "Check for empty product price"
msgstr "Auf leeren Produktpreis prüfen"

#: includes/classes/class-themecomplete-epo-settings-base.php:798
msgid ""
"Check this to have the plugin set to zero the product price when it is empty."
msgstr ""
"Aktivieren Sie diese Option, damit das Plugin den Produktpreis auf Null "
"setzt, wenn es leer ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:805
msgid "Use the \"From\" string on displayed product prices"
msgstr "Verwenden Sie die \"Von\"-Zeichenkette der angebotenen Produktpreise"

#: includes/classes/class-themecomplete-epo-settings-base.php:806
msgid ""
"Check this to alter the price display of a product when it has extra options "
"with prices."
msgstr ""
"Überprüfen Sie dies, um die Preisanzeige eines Produktes zu ändern, wenn es "
"zusätzliche Optionen mit Preisen hat."

#: includes/classes/class-themecomplete-epo-settings-base.php:813
msgid "Alter generated product structured data"
msgstr "Generierte Produktstrukturdaten ändern"

#: includes/classes/class-themecomplete-epo-settings-base.php:814
msgid ""
"Alters the generated product structured data. This may produce wrong results "
"if the options use conditional logic!"
msgstr ""
"Ändert die generierten Produktstrukturdaten. Dies kann zu falschen "
"Ergebnissen führen, wenn die Optionen bedingte Logik verwendet!"

#: includes/classes/class-themecomplete-epo-settings-base.php:821
msgid "Responsive options structure"
msgstr "Responsive Optionsstruktur"

#: includes/classes/class-themecomplete-epo-settings-base.php:822
msgid "Enable this if you want the options to have responsive display."
msgstr ""
"Aktivieren Sie diese Option, wenn Sie möchten, dass die Optionen eine "
"reaktionsschnelle Anzeige haben."

#: includes/classes/class-themecomplete-epo-settings-base.php:851
msgid "Turn off persistent cart"
msgstr "Dauerwagen ausschalten"

#: includes/classes/class-themecomplete-epo-settings-base.php:852
msgid "Enable this if the product has a lot of options."
msgstr "Aktivieren Sie dies, wenn das Produkt viele Optionen hat."

#: includes/classes/class-themecomplete-epo-settings-base.php:858
msgid "Clear cart button"
msgstr "Warenkorb leeren Button"

#: includes/classes/class-themecomplete-epo-settings-base.php:859
msgid "Enables or disables the clear cart button"
msgstr "Aktiviert oder deaktiviert den übersichtlichen Warenkorb-Button"

#: includes/classes/class-themecomplete-epo-settings-base.php:866
msgid "Cart Field Display"
msgstr "Warenkorb Field Display"

#: includes/classes/class-themecomplete-epo-settings-base.php:867
msgid "Select how to display your fields in the cart"
msgstr "Wählen Sie, wie Sie Ihre Felder im Warenkorb anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:874
msgid "Normal display"
msgstr "Normales Display"

#: includes/classes/class-themecomplete-epo-settings-base.php:875
msgid "Display a pop-up link"
msgstr "Einen Pop-up-Link anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:876
msgid "Advanced display"
msgstr "Erweiterte Anzeige"

#: includes/classes/class-themecomplete-epo-settings-base.php:880
msgid "Hide extra options in cart"
msgstr "Zusätzlichen Optione im Warenkorb verstecken"

#: includes/classes/class-themecomplete-epo-settings-base.php:881
msgid "Enables or disables the display of options in the cart."
msgstr "Aktiviert oder deaktiviert die Anzeige von Optionen im Warenkorb."

#: includes/classes/class-themecomplete-epo-settings-base.php:888
#, fuzzy
#| msgid "Hide upload file URL in cart and checkout"
msgid "Hide extra addon prices in cart and checkout"
msgstr "URL der Upload-Datei im Warenkorb und an der Kasse ausblenden"

#: includes/classes/class-themecomplete-epo-settings-base.php:889
#, fuzzy
#| msgid "Enables or disables the display of options in the cart."
msgid ""
"Enables or disables the display of addon prices in the cart and checkout."
msgstr "Aktiviert oder deaktiviert die Anzeige von Optionen im Warenkorb."

#: includes/classes/class-themecomplete-epo-settings-base.php:898
msgid "Prevent negative priced products"
msgstr "Negative Preise verhindern"

#: includes/classes/class-themecomplete-epo-settings-base.php:899
msgid "Prevent adding to the cart negative priced products."
msgstr ""
"Verhindern Sie, dass Waren mit negativen Preisen in den Warenkorb gelegt "
"werden können."

#: includes/classes/class-themecomplete-epo-settings-base.php:905
msgid "Prevent zero priced products"
msgstr "Produkte mit \"Null-Preis\" verhindern"

#: includes/classes/class-themecomplete-epo-settings-base.php:906
msgid "Prevent adding to the cart zero priced products."
msgstr "Verhindern, dassProdukte mit \"Null-Preis\"  in den Warenkorb kommen."

#: includes/classes/class-themecomplete-epo-settings-base.php:912
msgid "Hide checkbox element average price"
msgstr "Verstecken Sie das Kästchen \"Durchschnittspreis\""

#: includes/classes/class-themecomplete-epo-settings-base.php:913
msgid "This will hide the average price display on the cart for checkboxes."
msgstr ""
"Damit verbirgt sich die durchschnittliche Preisanzeige auf dem Warenkorb für "
"Kästchen."

#: includes/classes/class-themecomplete-epo-settings-base.php:919
msgid "Show image replacement in cart and checkout"
msgstr "Zeigen Sie Bildwechsel in Warenkorb und Kasse"

#: includes/classes/class-themecomplete-epo-settings-base.php:920
msgid ""
"Enabling this will show the images of elements that have an image "
"replacement."
msgstr ""
"Damit werden die Bilder von Elementen angezeigt, die einen Bildersatz haben."

#: includes/classes/class-themecomplete-epo-settings-base.php:926
msgid "Hide upload file URL in cart and checkout"
msgstr "URL der Upload-Datei im Warenkorb und an der Kasse ausblenden"

#: includes/classes/class-themecomplete-epo-settings-base.php:927
msgid ""
"Enabling this will hide the URL of any uploaded file while in cart and "
"checkout."
msgstr ""
"Wenn Sie dies aktivieren, wird die URL aller hochgeladenen Dateien im "
"Warenkorb und an der Kasse ausgeblendet."

#: includes/classes/class-themecomplete-epo-settings-base.php:933
msgid "Show uploaded image in cart and checkout"
msgstr "Hochgeladenes Bild im Warenkorb und an der Kasse anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:934
msgid "Enabling this will show the uploaded images in cart and checkout."
msgstr ""
"Damit werden die hochgeladenen Bilder in Warenkorb und Kasse angezeigt."

#: includes/classes/class-themecomplete-epo-settings-base.php:940
msgid "Maximum image width"
msgstr "Max. Bildbreite"

#: includes/classes/class-themecomplete-epo-settings-base.php:941
msgid "Set the maximum width of the images that appear on cart."
msgstr ""
"Legen Sie die maximale Breite der Bilder fest, die im Warenkorb angezeigt "
"werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:947
msgid "Maximum image height"
msgstr "Max. Bildhöhe"

#: includes/classes/class-themecomplete-epo-settings-base.php:948
msgid "Set the maximum height of the images that appear on cart."
msgstr ""
"Legen Sie die maximale Höhe der Bilder fest, die im Warenkorb angezeigt "
"werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:954
msgid "Always use unique values on cart for elements"
msgstr "Gebruik altijd unieke waarden op de winkelwagen voor elementen"

#: includes/classes/class-themecomplete-epo-settings-base.php:955
msgid ""
"Enabling this will separate comma separated values for elements. This is "
"mainly used for multiple checkbox choices."
msgstr ""
"Wenn Sie dies aktivieren, werden durch Kommas getrennte Werte für Elemente "
"getrennt. Dies wird hauptsächlich für mehrere Checkboxen verwendet."

#: includes/classes/class-themecomplete-epo-settings-base.php:984
msgid "Post types to show the saved options"
msgstr "Beitragstypen, um die gespeicherten Optionen anzuzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:985
msgid ""
"Select the post types where the plugin will modify the edit order screen to "
"show the saved options. You can type in your custom post type."
msgstr ""
"Wählen Sie die Beitragstypen aus, bei denen das Plugin den Bildschirm zum "
"Bearbeiten der Reihenfolge ändert, um die gespeicherten Optionen anzuzeigen. "
"Sie können Ihren benutzerdefinierten Beitragstyp eingeben."

#: includes/classes/class-themecomplete-epo-settings-base.php:995
msgid "Strip html from emails"
msgstr "HTML aus E-Mails entfernen"

#: includes/classes/class-themecomplete-epo-settings-base.php:996
msgid "Check to strip the html tags from emails"
msgstr "Überprüfen Sie, ob die HTML-Tags aus E-Mails entfernt werden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1002
msgid "Legacy meta data"
msgstr "Legacy-Metadaten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1003
msgid "Check to enable legacy meta data functionality."
msgstr ""
"Aktivieren Sie diese Option, um die Legacy-Metadatenfunktionalität zu "
"aktivieren."

#: includes/classes/class-themecomplete-epo-settings-base.php:1009
msgid "Unique meta values"
msgstr "Menge Maximalwert"

#: includes/classes/class-themecomplete-epo-settings-base.php:1010
msgid "Check to split items with multiple values to unique lines."
msgstr ""
"Aktivieren Sie diese Option, um Elemente mit mehreren Werten in eindeutige "
"Zeilen aufzuteilen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1016
msgid "Prevent options from being sent to emails"
msgstr "Verhindern, dass Optionen an E-Mails gesendet werden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1017
msgid "Check to disable options from being sent to emails."
msgstr "Überprüfen Sie, ob Sie die Optionen nicht an E-Mails senden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1023
msgid "Disable sending the options upon saving the order"
msgstr ""
"Deaktivieren Sie das Versenden der Optionen beim Speichern der Bestellung"

#: includes/classes/class-themecomplete-epo-settings-base.php:1024
msgid ""
"Enable this if you are getting a 500 error when trying to complete the order "
"in the checkout."
msgstr ""
"Aktivieren Sie dies, wenn Sie einen 500-Fehler haben, wenn Sie versuchen, "
"die Bestellung in der Kasse abzuschließen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1030
msgid "Attach upload files to emails"
msgstr "Hochgeladene Dateien an E-Mails anhängen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1031
msgid "Check to Attach upload files to emails."
msgstr "Aktivieren um hochgeladene Dateien an Emails anzuhängen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1037
msgid "Disable Options on Order status change"
msgstr "Optionen zur Änderung des Auftragszustands ausschalten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1038
msgid "Check this only if you are getting server errors on checkout."
msgstr "Aktivieren Sie dies nur, wenn Sie Serverfehler an der Kasse erhalten."

#: includes/classes/class-themecomplete-epo-settings-base.php:1044
msgid "Hide upload file URL in order"
msgstr "Hochgeladenen Dateipfad verstecken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1045
msgid "Enabling this will hide the URL of any uploaded file while in order."
msgstr ""
"Wenn Sie dies aktivieren, wird die URL aller hochgeladenen Dateien in der "
"Bestellung ausgeblendet."

#: includes/classes/class-themecomplete-epo-settings-base.php:1051
#, fuzzy
#| msgid "Show uploaded image in cart and checkout"
msgid "Show uploaded image in order"
msgstr "Hochgeladenes Bild im Warenkorb und an der Kasse anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1052
#, fuzzy
#| msgid "Enabling this will show the uploaded images in cart and checkout."
msgid "Enabling this will show the uploaded images in order."
msgstr ""
"Damit werden die hochgeladenen Bilder in Warenkorb und Kasse angezeigt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1086
msgid "Field Label/value separator"
msgstr "Trennzeichen für Feldbeschriftung/Wert"

#: includes/classes/class-themecomplete-epo-settings-base.php:1087
msgid ""
"Enter the character that will be used to separate field labels from field "
"values in the cart and order."
msgstr ""
"Geben Sie das Zeichen ein, das verwendet wird, um Feldbeschriftungen von "
"Feldwerten im Warenkorb und in der Bestellung zu trennen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1094
msgid "Multiple field values separator"
msgstr "Trennzeichen für mehrere Feldwerte"

#: includes/classes/class-themecomplete-epo-settings-base.php:1095
msgid ""
"Enter the string that will be used to separate multiple values for a field "
"that allows multiple selections in the cart and order."
msgstr ""
"Geben Sie die Zeichenfolge ein, die verwendet wird, um mehrere Werte für ein "
"Feld zu trennen, das eine Mehrfachauswahl im Warenkorb und in der Bestellung "
"zulässt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1102
msgid "Update cart text"
msgstr "Warenkorbtext aktualisieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1103
msgid "Enter the Update cart text when you edit a product."
msgstr ""
"Geben Sie den Text \"Warenkorb aktualisieren\" ein, wenn Sie ein Produkt "
"bearbeiten."

#: includes/classes/class-themecomplete-epo-settings-base.php:1111
msgid "Edit Options text replacement"
msgstr "Textersatz bearbeiten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1112
msgid "Enter a text to replace the Edit options text on the cart."
msgstr ""
"Geben Sie einen Text ein, um den Text der Optionen Bearbeiten auf dem "
"Warenkorb zu ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1120
msgid "Additional Options text replacement"
msgstr "Zusätzliche Optionen Textersatz"

#: includes/classes/class-themecomplete-epo-settings-base.php:1121
msgid ""
"Enter a text to replace the Additional options text when using the pop up "
"setting on the cart."
msgstr ""
"Geben Sie einen Text ein, um den Text der zusätzlichen Optionen zu ersetzen, "
"wenn Sie die Pop-up-Einstellung auf dem Warenkorb verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1129
msgid "Close button text replacement"
msgstr "\"Schließen\"-Button Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1130
msgid ""
"Enter a text to replace the Close button text when using the pop up setting "
"on the cart."
msgstr ""
"Geben Sie einen Text ein, um den Knopffetext zu ersetzen, wenn Sie die Pop-"
"Up-Einstellung auf dem Warenkorb verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1138
msgid "Empty cart text"
msgstr "Text leeren Wagens"

#: includes/classes/class-themecomplete-epo-settings-base.php:1139
msgid "Enter a text to replace the empty cart button text."
msgstr "Geben Sie einen Text ein, um den leeren Warenknopf zu ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1147
msgid "Final total text"
msgstr "\"Gesamtsumme\" Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1148
msgid "Enter the Final total text or leave blank for default."
msgstr ""
"Geben Sie den Final-Gesamttext ein oder lassen Sie den Text für die "
"Standardeinstellung leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1156
msgid "Unit price text"
msgstr "Text für den Stückpreis"

#: includes/classes/class-themecomplete-epo-settings-base.php:1157
msgid "Enter the Unit price text or leave blank for default."
msgstr ""
"Geben Sie den Text der Einheit und lassen Sie die Standardeinstellung leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1165
msgid "Options total text"
msgstr "„Optionensumme“-Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1166
msgid "Enter the Options total text or leave blank for default."
msgstr ""
"Geben Sie den Gesamttext der Optionen ein oder lassen Sie sie standardmäßig "
"leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1174
msgid "Options VAT total text"
msgstr "Optionen MwSt.-Gesamttext"

#: includes/classes/class-themecomplete-epo-settings-base.php:1175
msgid "Enter the Options VAT total text or leave blank for default."
msgstr ""
"Geben Sie den Text Optionen MwSt.-Gesamtbetrag ein, oder lassen Sie das Feld "
"für Standard leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1183
msgid "Fees total text"
msgstr "Gebühren Gesamttext"

#: includes/classes/class-themecomplete-epo-settings-base.php:1184
msgid "Enter the Fees total text or leave blank for default."
msgstr ""
"Geben Sie den Gesamttext der Gebühren ein oder lassen Sie sie standardmäßig "
"leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1193
msgid "Free Price text replacement"
msgstr "\"Kostenlos\" Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1194
msgid ""
"Enter a text to replace the Free price label when product has extra options."
msgstr ""
"Geben Sie einen Text ein, um das Gratis-Preisetikett zu ersetzen, wenn das "
"Produkt zusätzliche Optionen hat."

#: includes/classes/class-themecomplete-epo-settings-base.php:1201
msgid "Force Select options text"
msgstr "Optionen aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1202
msgid ""
"Enter a text to replace the add to cart button text when using the Force "
"select option."
msgstr ""
"Geben Sie einen Text ein, um den Text, der in den Warenkorb-Knopf "
"aufgenommen wird, zu ersetzen, wenn Sie die Option \"Auswahl verwenden\" "
"verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1210
msgid "No zero priced products text"
msgstr "Keine Null Produkt Preise Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1211
msgid ""
"Enter a text to replace the message when trying to add a zero priced product "
"to the cart."
msgstr ""
"Geben Sie einen Text ein, ersetzen Sie die Nachricht, wenn Sie versuchen, "
"dem Warenkorb ein Produkt mit einem Nullpreis hinzuzufügen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1219
msgid "No negative priced products text"
msgstr "Negative Preise verhindern"

#: includes/classes/class-themecomplete-epo-settings-base.php:1220
msgid ""
"Enter a text to replace the message when trying to add a negative priced "
"product to the cart."
msgstr ""
"Geben Sie einen Text ein, ersetzen Sie die Nachricht, wenn Sie versuchen, "
"dem Warenkorb ein Produkt zum negativen Preis hinzuzufügen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1228
msgid "Popup section button text replacement"
msgstr "Textersetzung für die Schaltfläche des Popup-Abschnitts"

#: includes/classes/class-themecomplete-epo-settings-base.php:1230
#, php-format
msgid ""
"Enter a text to replace the topup section button text. Setting this to %s "
"will make it so that the button text has the section title."
msgstr ""
"Geben Sie einen Text ein, der den Schaltflächentext für den Aufladebereich "
"ersetzen soll. Wenn Sie dies auf %s setzen, wird der Schaltflächentext mit "
"dem Abschnittstitel versehen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1232
#: templates/tm-builder-section-start.php:94
msgid "Open"
msgstr "Offen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1238
msgid "Reset Options text replacement"
msgstr "Optionen Textersatz setzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1239
msgid ""
"Enter a text to replace the Reset options text when using custom variations."
msgstr ""
"Geben Sie hier den Text an, um den „Optionen zurücksetzten“-Text zu "
"ersetzen, wenn benutzerdefinierte Variationen benutzt werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1241
#: templates/tm-variations.php:598
msgid "Reset options"
msgstr "Zurücksetzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1247
msgid "Calendar close button text replacement"
msgstr "Kalender schließen Knopf Textersatz"

#: includes/classes/class-themecomplete-epo-settings-base.php:1248
msgid "Enter a text to replace the Close button text on the calendar."
msgstr ""
"Geben Sie einen Text ein, um den Text \"Schließen\" im Kalender zu ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1256
msgid "Calendar today button text replacement"
msgstr "„Kalendar: Heute“-Button-Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1257
msgid "Enter a text to replace the Today button text on the calendar."
msgstr ""
"Geben Sie einen Text ein, um den „Heute“-Button-Text im Kalender zu ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1265
msgid "Slider previous text"
msgstr "Slider: „Zurück“-Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1266
msgid "Enter a text to replace the previous button text for slider."
msgstr ""
"Geben Sie einen Text ein, um den Button-Text für den vorherigen Slider zu "
"ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1274
msgid "Slider next text"
msgstr "Slider: „Weiter“-Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1275
msgid "Enter a text to replace the next button text for slider."
msgstr ""
"Geben Sie einen Text an, um den Button-Text für den nächsten Slider ersetzen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1283
msgid "This field is required text"
msgstr "Dies ist ein Pflichtfeld Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1284
msgid "Enter a text to indicate that a field is required."
msgstr "Geben Sie einen Text ein, der anzeigt, dass ein Feld benötigt wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1292
msgid "Characters remaining text"
msgstr "Zeichen bleiben Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1293
msgid ""
"Enter a text to replace the Characters remaining text when using maximum "
"characters on a text field or a textarea."
msgstr ""
"Geben Sie einen Text ein, um den verbleibenden Text der Zeichen zu ersetzen, "
"wenn Sie maximale Zeichen auf einem Textfeld oder einem Textbereich "
"verwenden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1301
msgid "Uploading files text"
msgstr "Dateien hochladen Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1302
msgid ""
"Enter a text to replace the Uploading files text used in the pop-up after "
"clicking the add to cart button  when there are upload fields."
msgstr ""
"Geben Sie einen Text ein, um den Text des Upload-Dateien zu ersetzen, der im "
"Pop-up verwendet wird, nachdem Sie auf den Knopf \"Hinzufügen\" zum "
"Warenkorb klicken, wenn es Upload-Felder gibt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1310
msgid "Uploading message text"
msgstr "Hochladen Nachrichten Text"

#: includes/classes/class-themecomplete-epo-settings-base.php:1311
msgid ""
"Enter a message to be used in the pop-up after clicking the add to cart "
"button when there are upload fields."
msgstr ""
"Geben Sie eine Nachricht ein, die im Pop-up verwendet werden soll, nachdem "
"Sie auf den Knopf \"Zum Warenkorb\" geklickt haben, wenn es Upload-Felder "
"gibt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1319
msgid "Select file text"
msgstr "Datei Text auswählen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1320
msgid ""
"Enter a text to replace the Select file text used in the styled upload "
"button."
msgstr ""
"Geben Sie einen Text ein, der den Text \"Dateien auswählen\" ersetzt, der in "
"der gestylten Upload-Button verwendet wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1322
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:65
#: includes/fields/class-themecomplete-epo-fields-upload.php:72
msgid "Select file(s)"
msgstr "Datei auswählen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1328
msgid "Single file text"
msgstr "Einzelner Dateitext"

#: includes/classes/class-themecomplete-epo-settings-base.php:1329
msgid "Enter a text to replace the file text used in the styled upload button."
msgstr ""
"Geben Sie einen Text ein, der den Text \"Dateien auswählen\" ersetzt, der in "
"der gestylten Upload-Button verwendet wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1337
msgid "Multiple files text"
msgstr "Text in mehreren Dateien"

#: includes/classes/class-themecomplete-epo-settings-base.php:1338
msgid ""
"Enter a text to replace the files text used in the styled upload button."
msgstr ""
"Geben Sie einen Text ein, der den Dateitext ersetzt, der in der formatierten "
"Upload-Schaltfläche verwendet wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1346
msgid "Add button text on associated products"
msgstr "Hinzufügen von Schaltflächentext zu zugehörigen Produkten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1347
msgid "Enter a text to replace the add button text on associated products."
msgstr ""
"Geben Sie einen Text ein, der den Text der Schaltfläche \"Hinzufügen\" für "
"verknüpfte Produkte ersetzen soll."

#: includes/classes/class-themecomplete-epo-settings-base.php:1349
#: includes/classes/class-themecomplete-epo-settings-base.php:1367
#: templates/products/template-quantity-button.php:12
#: templates/tm-builder-element-end.php:56
msgid "Add"
msgstr "Hinzufügen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1355
msgid "Remove button text on associated products"
msgstr "Schaltflächentext auf zugehörigen Produkten entfernen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1356
msgid "Enter a text to replace the remove button text on associated products."
msgstr ""
"Geben Sie einen Text ein, der den Text der Schaltfläche \"Entfernen\" bei "
"zugeordneten Produkten ersetzen soll."

#: includes/classes/class-themecomplete-epo-settings-base.php:1358
#: templates/products/template-quantity-button.php:13
msgid "Remove"
msgstr "Entfernen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1364
msgid "Repeater add text"
msgstr "Repeater Text hinzufügen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1365
msgid "Enter a text to replace the add text button for repeater fields."
msgstr ""
"Geben Sie einen Text ein, der die Schaltfläche \"Text hinzufügen\" für "
"Repeater-Felder ersetzen soll."

#: includes/classes/class-themecomplete-epo-settings-base.php:1397
msgid "Enable checkbox and radio styles"
msgstr "Aktivieren der Kästchenfeld-Styles"

#: includes/classes/class-themecomplete-epo-settings-base.php:1398
msgid "Enables or disables extra styling for checkboxes and radio buttons."
msgstr "Aktiviert oder deaktiviert den Style für Auswahl- und Schaltkästchen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1406
msgid "Select a style for the checkboxes and radio buttons"
msgstr "Selecteer een stijl voor de selectievakjes en de keuzerondjes"

#: includes/classes/class-themecomplete-epo-settings-base.php:1413
#: includes/classes/class-themecomplete-epo-settings-base.php:1433
msgid "Circle"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1414
msgid "Circle 2"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1415
#: includes/classes/class-themecomplete-epo-settings-base.php:1434
msgid "Round"
msgstr "Rund"

#: includes/classes/class-themecomplete-epo-settings-base.php:1416
msgid "Round 2"
msgstr "Rund 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1417
#: includes/classes/class-themecomplete-epo-settings-base.php:1432
msgid "Square"
msgstr "Quadrat"

#: includes/classes/class-themecomplete-epo-settings-base.php:1418
msgid "Square 2"
msgstr "Quadrat 2"

#: includes/classes/class-themecomplete-epo-settings-base.php:1423
#, fuzzy
#| msgid "Select item border type"
msgid "Swatch border type"
msgstr "Wählen Sie den Rahmentyp"

#: includes/classes/class-themecomplete-epo-settings-base.php:1424
msgid ""
"Select a style for the selected border when using image replacements or "
"swatches."
msgstr ""
"Wählen Sie einen Stil für den Rahmen, bei Verwendung des Bildaustausches "
"oder Bild-Feldern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1435
msgid "Shadow"
msgstr "Schatten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1436
msgid "Thin line"
msgstr "Dünne Linie"

#: includes/classes/class-themecomplete-epo-settings-base.php:1440
msgid "Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1441
msgid ""
"Choose the border color for image or color swatches. If left blank it "
"defaults to transparent."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1448
msgid "Text Swatch Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1449
msgid ""
"Choose the border color for text swatches. If left blank it is set to "
"inherit the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1456
msgid "Swatch Active Border Color"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1457
msgid ""
"Choose the color that should appear as the active border when you have "
"selected an image, color or text swatch. If left blank it is set to inherit "
"the current color."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1464
msgid "Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1465
#, fuzzy
#| msgid "Choose whether to hide the price or not."
msgid "Choose the border width for image or color swatches."
msgstr "Wählen Sie, ob Sie den Preis verstecken möchten oder nicht."

#: includes/classes/class-themecomplete-epo-settings-base.php:1472
msgid "Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1473
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen an image "
"or color swatch."
msgstr ""
"Wählen Sie einen Stil für den Rahmen, bei Verwendung des Bildaustausches "
"oder Bild-Feldern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1480
msgid "Text Swatch Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1481
msgid "Choose the border width for text swatches."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1488
msgid "Text Swatch Active Border Width"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1489
#, fuzzy
#| msgid ""
#| "Select a style for the selected border when using image replacements or "
#| "swatches."
msgid ""
"Select the border width for the active border when you have chosen a text "
"swatch."
msgstr ""
"Wählen Sie einen Stil für den Rahmen, bei Verwendung des Bildaustausches "
"oder Bild-Feldern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1517
msgid "Visual"
msgstr "Visuell"

#: includes/classes/class-themecomplete-epo-settings-base.php:1518
msgid "Product page"
msgstr "Produktseite"

#: includes/classes/class-themecomplete-epo-settings-base.php:1519
msgid "Locale"
msgstr "Lokal"

#: includes/classes/class-themecomplete-epo-settings-base.php:1520
msgid "Pricing"
msgstr "Preise"

#: includes/classes/class-themecomplete-epo-settings-base.php:1522
msgid "CDN"
msgstr "CDN"

#: includes/classes/class-themecomplete-epo-settings-base.php:1527
msgid "Enable validation"
msgstr "Validierung aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1528
msgid "Check to enable validation feature for builder elements"
msgstr "Überprüfen, um die Validierung von Bauelementen zu ermöglichen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1535
msgid "Disable error scrolling"
msgstr "Fehlerscrollen abschalten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1536
msgid "Check to disable scrolling to the element with an error"
msgstr ""
"Überprüfen Sie, ob Sie das Scrollen auf das Element mit einem Fehler "
"deaktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1543
msgid "Error label placement"
msgstr "Fehler bei der Platzierung von Etiketten"

#: includes/classes/class-themecomplete-epo-settings-base.php:1544
msgid "Set the placement for the validation error notification label"
msgstr ""
"Legen Sie die Platzierung für das Etikett der Validierungsfehlermeldung fest"

#: includes/classes/class-themecomplete-epo-settings-base.php:1551
msgid "After the element"
msgstr "Nach dem Element"

#: includes/classes/class-themecomplete-epo-settings-base.php:1552
msgid "Before the element"
msgstr "Vor dem Element"

#: includes/classes/class-themecomplete-epo-settings-base.php:1556
msgid "Use options cache"
msgstr "Optionen speichern"

#: includes/classes/class-themecomplete-epo-settings-base.php:1557
msgid ""
"Use options caching for boosting performance. Disable if you have options "
"that share the same unique ID."
msgstr ""
"Verwenden Sie Optionen Caching zur Steigerung der Performance. Deaktivieren "
"Sie, wenn Sie Optionen haben, die die gleiche eindeutige ID teilen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1564
msgid "Javascript and CSS inclusion mode"
msgstr "JavaScript und CSS Aufnahme Modus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1565
msgid "Select how to include JS and CSS files"
msgstr "Wählen Sie, wie JS und CSS-Dateien aufgenommen werden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1572
msgid "Single minified file"
msgstr "Einzelne, einheitliche Datei"

#: includes/classes/class-themecomplete-epo-settings-base.php:1573
msgid "Multiple minified files"
msgstr "Mehrere minifizierte Dateien"

#: includes/classes/class-themecomplete-epo-settings-base.php:1574
msgid "DEV - multiple files"
msgstr "DEV-mehrere Dateien"

#: includes/classes/class-themecomplete-epo-settings-base.php:1578
msgid "Disable PNG convert security"
msgstr "PNG Deaktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1579
msgid "Check to disable the conversion to png for image uploads."
msgstr ""
"Aktivieren wenn Sie alle Bilder beim Upload ins PNG-Format konvertieren "
"wollen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1587
msgid ""
"This will globally override the product price with the price from the "
"options if the total options price is greater then zero."
msgstr ""
"Dies wird den Produktpreis weltweit mit dem Preis von den Optionen "
"überschreiben, wenn der Gesamtpreis der Optionen größer als null ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:1594
msgid "Use setting on each product"
msgstr "Verwenden Sie die Einstellung für jedes Produkt"

#: includes/classes/class-themecomplete-epo-settings-base.php:1600
msgid "Options price mode"
msgstr "Optionspreis-Modus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1601
msgid "Select the price mode for the options."
msgstr "Wählen Sie den Preismodus für die Optionen aus."

#: includes/classes/class-themecomplete-epo-settings-base.php:1608
msgid "Use sale price"
msgstr "Verkaufspreis verwenden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1609
msgid "Use regular price"
msgstr "Regulärer Preis verwenden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1613
msgid "Maximum number of combinations for price calcualtions"
msgstr "Maximale Anzahl von Kombinationen für Preisberechnungen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1614
msgid ""
"This setting controls the maximum number of combinations that the plugin "
"will use to calculate minimum and maximum prices. A higher number of "
"combinations will result in more accurate prices, but it will also take "
"longer to calculate them. For products that can have many choice "
"combinations, it is recommended to set a lower number of combinations to "
"improve performance."
msgstr ""
"Diese Einstellung steuert die maximale Anzahl von Kombinationen, die das "
"Plugin zur Berechnung von Mindest- und Höchstpreisen verwendet. Eine höhere "
"Anzahl von Kombinationen führt zu genaueren Preisen, aber es dauert auch "
"länger, sie zu berechnen. Für Produkte, die viele Auswahlkombinationen haben "
"können, wird empfohlen, eine geringere Anzahl von Kombinationen "
"einzustellen, um die Leistung zu verbessern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1617
msgid "Default value is 10"
msgstr "Der Standardwert ist 10"

#: includes/classes/class-themecomplete-epo-settings-base.php:1622
msgid "Calculate the Precise Maximum Price"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1623
msgid ""
"This setting influences how the plugin calculates the maximum price of a "
"product. Enabling this setting will provide a more precise result at the "
"cost of processing speed."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1630
msgid "Reset option values after the product is added to the cart"
msgstr ""
"Optionswerte zurücksetzen, nachdem das Produkt in den Warenkorb gelegt wurde"

#: includes/classes/class-themecomplete-epo-settings-base.php:1631
msgid ""
"This will revert the option values to the default ones after adding the "
"product to the cart"
msgstr ""
"Dadurch werden die Optionswerte auf die Standardwerte zurückgesetzt, nachdem "
"das Produkt in den Warenkorb gelegt wurde"

#: includes/classes/class-themecomplete-epo-settings-base.php:1638
msgid "Use plus and minus signs on prices in cart and checkout"
msgstr "Plus-und Minuszeichen bei Preisen im Warenkorb und Kasse nutzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1639
msgid ""
"Choose how you want the sign of options prices to be displayed in cart and "
"checkout."
msgstr ""
"Wählen Sie, wie Sie möchten, dass das Zeichen der Optionspreise in Warenkorb "
"und Kasse angezeigt wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1646
#: includes/classes/class-themecomplete-epo-settings-base.php:1660
msgid "Display both signs"
msgstr "Beide Schilder anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1647
#: includes/classes/class-themecomplete-epo-settings-base.php:1661
msgid "Display only minus sign"
msgstr "Nur Minuszeichen anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1652
msgid "Use plus and minus signs on option prices"
msgstr "Verwendung von Plus-und Minuszeichen auf Optionspreisen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1653
msgid ""
"Choose how you want the sign of options prices to be displayed at the "
"product page."
msgstr ""
"Wählen Sie, wie Sie möchten, dass das Zeichen der Optionspreise auf der "
"Produktseite angezeigt wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1666
msgid "Input decimal separator"
msgstr "Eingangsdezimalabscheider"

#: includes/classes/class-themecomplete-epo-settings-base.php:1667
msgid "Choose how to determine the decimal separator for user inputs"
msgstr ""
"Wählen Sie, wie Sie den Dezimalseparator für Benutzereingänge bestimmen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1674
#: includes/classes/class-themecomplete-epo-settings-base.php:1688
msgid "Use WooCommerce value"
msgstr "WooCommerce-Wert nutzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1675
#: includes/classes/class-themecomplete-epo-settings-base.php:1689
msgid "Determine by browser local"
msgstr "Bestimmen Sie per Browser vor Ort"

#: includes/classes/class-themecomplete-epo-settings-base.php:1680
msgid "Displayed decimal separator"
msgstr "Angezeigter Dezimal-Separator"

#: includes/classes/class-themecomplete-epo-settings-base.php:1681
msgid "Choose which decimal separator to display on currency prices"
msgstr ""
"Wählen Sie, welcher Dezimalseparator auf den Devisenpreisen angezeigt werden "
"soll"

#: includes/classes/class-themecomplete-epo-settings-base.php:1693
msgid "Timezone override for Date element"
msgstr "Zeitzonen Überschreibung für Datenelement"

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
#, php-format
msgid ""
"Choose which %s the date element will use on the backend calculations or "
"leave blank for server timezone."
msgstr ""
"Wählen Sie aus, welche %s das Datumselement für die Backend Berechnungen "
"verwenden soll, oder lassen Sie das Feld für die Server Zeitzone leer."

#: includes/classes/class-themecomplete-epo-settings-base.php:1695
msgid "timezone"
msgstr "Zeitzone"

#: includes/classes/class-themecomplete-epo-settings-base.php:1702
msgid "Required state indicator"
msgstr "Erforderlicher staatlicher Indikator"

#: includes/classes/class-themecomplete-epo-settings-base.php:1703
msgid "Enter a string to indicate the required state of a field."
msgstr ""
"Geben Sie eine Zeichenkette ein, um den gewünschten Zustand eines Feldes "
"anzuzeigen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1710
msgid "Required state indicator position"
msgstr "Erforderliche staatliche Indikatorposition"

#: includes/classes/class-themecomplete-epo-settings-base.php:1711
msgid "Select the placement of the Required state indicator"
msgstr "Selecteer de plaats van de vereiste toestandsindicator"

#: includes/classes/class-themecomplete-epo-settings-base.php:1718
msgid "Left of the label"
msgstr "Links vom Label"

#: includes/classes/class-themecomplete-epo-settings-base.php:1719
msgid "Right of the label"
msgstr "Rechts vom Label"

#: includes/classes/class-themecomplete-epo-settings-base.php:1723
msgid "Include tax string suffix on totals box"
msgstr "Fügt einen „inkl. MwSt“-Suffix der „Gesamtsumme“-Box hinzu"

#: includes/classes/class-themecomplete-epo-settings-base.php:1724
msgid "Enable this to add the WooCommerce tax suffix on the totals box"
msgstr ""
"Aktivieren Sie dies, um das WooCommerce-Steuersuffix in der Summenbox "
"hinzuzufügen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1731
msgid "Include the WooCommerce Price display suffix on totals box"
msgstr ""
"Fügen Sie das Suffix für die Anzeige des WooCommerce-Preises in das Feld "
"\"Summen\" ein"

#: includes/classes/class-themecomplete-epo-settings-base.php:1732
msgid ""
"Enable this to add the WooCommerce Price display suffix on the totals box."
msgstr ""
"Aktivieren Sie diese Option, um das Suffix für die Anzeige des WooCommerce-"
"Preises im Feld \"Summen\" hinzuzufügen."

#: includes/classes/class-themecomplete-epo-settings-base.php:1739
msgid "jQuery selector for main product image"
msgstr "jQuery-Selektor für das Hauptbild des Produkts"

#: includes/classes/class-themecomplete-epo-settings-base.php:1740
msgid "This is used to change the product image."
msgstr "Dies wird verwendet, um das Produktbild zu verändern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1747
msgid "Product image replacement mode"
msgstr "Mit diesem Modus kann das Produktbild ersetzt werden"

#: includes/classes/class-themecomplete-epo-settings-base.php:1748
msgid ""
"Self mode replaces the actual image and Inline appends new image elements."
msgstr ""
"Der Selbstmodus ersetzt das aktuelle Bild und fügt Inline neue Bildelemente "
"hinzu."

#: includes/classes/class-themecomplete-epo-settings-base.php:1755
msgid "Self mode"
msgstr "Selbstmodus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1756
msgid "Inline mode"
msgstr "Inline-Modus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1760
msgid "Move out of stock message"
msgstr "Verschiebe die \"Ausverkauft\"-Meldung"

#: includes/classes/class-themecomplete-epo-settings-base.php:1761
msgid ""
"This moves the out of stock message when styled variations are used just "
"below them."
msgstr ""
"Dies verschiebt die \"Ausverkauft\"-Nachricht, falls gestylte Variationen "
"direkt unter ihr verwendet werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1768
msgid "Use internal variation price"
msgstr "Interne Variationspreise"

#: includes/classes/class-themecomplete-epo-settings-base.php:1769
msgid ""
"Enable this if your variable products have a lot of options to improve "
"performance. Note that this may cause issues with discount or currency "
"plugins."
msgstr ""
"Aktivieren Sie diese Option, wenn Ihre variablen Produkte über viele "
"Optionen zur Verbesserung der Leistung verfügen. Beachten Sie, dass dies zu "
"Problemen mit Rabatt- oder Währungs-Plugins führen kann."

#: includes/classes/class-themecomplete-epo-settings-base.php:1776
msgid "Enable plugin backend interface"
msgstr "Plugin-Backend-Schnittstelle aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1777
msgid ""
"Select the roles that will have access to the plugin settings and the plugin "
"interface while on the edit product page. The Admininstrator role always has "
"access."
msgstr ""
"Wählen Sie die Rollen aus, die Zugriff auf die Plugin-Einstellungen und die "
"Plugin-Oberfläche haben, während Sie sich auf der Seite \"Produkt bearbeiten"
"\" befinden. Die Rolle \"Admininstrator\" hat immer Zugriff."

#: includes/classes/class-themecomplete-epo-settings-base.php:1786
msgid "Hide override settings on products"
msgstr ""
"Die Einstellungen zum \"Override\" (Überschreiben der Einstellungen) auf "
"Produktseiten verstecken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1787
msgid "Enable this to hide the settings tab on the product edit screen"
msgstr ""
"Schakel dit in om het tabblad Instellingen op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1794
msgid "Hide Builder mode on products"
msgstr ""
"Den \"Formular-Builder\"-Modus auf Produktseiten nicht anzeigen/verstecken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1795
msgid "Enable this to hide the builder tab on the product edit screen"
msgstr ""
"Schakel dit in om het tabblad builder op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1802
msgid "Hide Normal mode on products"
msgstr "Den \"normalen Modus\" auf Produkten nicht anzeigen/verstecken"

#: includes/classes/class-themecomplete-epo-settings-base.php:1803
msgid "Enable this to hide the normal tab on the product edit screen"
msgstr ""
"Schakel dit in om het normale tabblad op het productbewerkingsscherm te "
"verbergen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1811
msgid "Enable WP Rocket CDN"
msgstr "WP Rocket CDN aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1812
msgid ""
"Check to enable the use of WP Rocket cdn for the plugin images if it is "
"active."
msgstr ""
"Aktivieren Sie die Verwendung von WP Rocket cdn für die Plugin-Bilder, wenn "
"es aktiv ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:1819
msgid "Enable Jetpack CDN"
msgstr "Jetpack CDN aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:1820
msgid ""
"Check to enable the use of Jetpack cdn for the plugin images if it is active."
msgstr ""
"Aktivieren Sie die Verwendung von Jetpack cdn für die Plugin-Bilder, wenn es "
"aktiv ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:1849
msgid "Grid"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1851
msgid "Select box"
msgstr "Auswahl Box"

#: includes/classes/class-themecomplete-epo-settings-base.php:1852
msgid "Datepicker"
msgstr "Datumsauswahl"

#: includes/classes/class-themecomplete-epo-settings-base.php:1859
msgid "Main Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1861
#, php-format
msgid ""
"Set the row gap between sections and fields. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1869
msgid "Main Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1871
#, php-format
msgid ""
"Set the column gap between sections and fields. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1879
msgid "Inner Row gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1881
#, php-format
msgid ""
"Set the inner row gap between field elements. %1$s This will be the %2$s css "
"variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1889
msgid "Inner Column gap"
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1891
#, php-format
msgid ""
"Set the inner column gap between field elements. %1$s This will be the %2$s "
"css variable."
msgstr ""

#: includes/classes/class-themecomplete-epo-settings-base.php:1899
msgid "Tooltip max width"
msgstr "Tooltip max. Breite"

#: includes/classes/class-themecomplete-epo-settings-base.php:1900
msgid "Set the max width of the tooltip that appears on the elements."
msgstr ""
"Legen Sie die max. Breite des Tooltips fest, die auf den Elementen angezeigt "
"wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1907
msgid "Image mode"
msgstr "Bildmodus"

#: includes/classes/class-themecomplete-epo-settings-base.php:1908
msgid ""
"Set the image mode that will be used for various image related functionality."
msgstr ""
"Stellen Sie den Bildmodus ein, der für verschiedene bildbezogene Funktionen "
"verwendet wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:1915
msgid "Absolute URL"
msgstr "Absolute URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1916
msgid "Relative URL"
msgstr "Relative URL"

#: includes/classes/class-themecomplete-epo-settings-base.php:1920
msgid "Recalculate image on changes"
msgstr "Bild bei Änderungen neu berechnen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1921
msgid ""
"This is required on several gallery solutions that change the image html "
"dynamically or if you want to control the image dynamically."
msgstr ""
"Dies ist für mehrere Galerielösungen erforderlich, die den HTML-Code des "
"Bildes dynamisch ändern oder wenn Sie das Bild dynamisch steuern möchten."

#: includes/classes/class-themecomplete-epo-settings-base.php:1928
msgid "Retrieve image sizes for image replacements"
msgstr "Abrufen von Bildgrößen für Bildersetzungen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1929
msgid "Disable this for slow servers or large amounts of images."
msgstr ""
"Deaktivieren Sie diese Option für langsame Server oder große Mengen an "
"Bildern."

#: includes/classes/class-themecomplete-epo-settings-base.php:1936
msgid "Show quantity 1"
msgstr "Menge anzeigen 1"

#: includes/classes/class-themecomplete-epo-settings-base.php:1937
msgid ""
"Enable to show the quantity string even when the quantity is 1 and when the "
"quantity selector is enabled."
msgstr ""
"Aktivieren Sie diese Option, um die Mengenzeichenfolge auch dann anzuzeigen, "
"wenn die Menge 1 ist und die Mengenauswahl aktiviert ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:1944
msgid "Show prices inside select box choices"
msgstr "Preise innerhalb der ausgewählten Box anzeigen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1945
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed."
msgstr ""
"Überprüfen Sie dies, um den Preis der ausgewählten Box-Optionen anzuzeigen, "
"wenn der Preistyp festgelegt ist."

#: includes/classes/class-themecomplete-epo-settings-base.php:1952
msgid "Show prices inside select box choices even if the prices are hidden"
msgstr "Zeigen Sie die Preise innerhalb der Auswahl der Box"

#: includes/classes/class-themecomplete-epo-settings-base.php:1953
msgid ""
"Check this to show the price of the select box options if the price type is "
"fixed and even if the element hides the price."
msgstr ""
"Überprüfen Sie dies, um den Preis für die ausgewählten Box-Optionen "
"anzuzeigen, wenn der Preistyp festgelegt ist und sogar, wenn das Element den "
"Preis verbirgt."

#: includes/classes/class-themecomplete-epo-settings-base.php:1960
msgid "Multiply prices inside select box choices with its quantity selector"
msgstr ""
"Multiplizieren Sie Preise innerhalb der Auswahl der Box mit seiner Quantität "
"Selektor"

#: includes/classes/class-themecomplete-epo-settings-base.php:1961
msgid ""
"Check this to multiply the prices of the select box options with its "
"quantity selector if any."
msgstr ""
"Überprüfen Sie dies, um die Preise der ausgewählten Box-Optionen mit ihrem "
"Mengenwähler zu multiplizieren, falls vorhanden."

#: includes/classes/class-themecomplete-epo-settings-base.php:1968
msgid "Radio button undo button"
msgstr "Auswahlknopf Undo-Knopf"

#: includes/classes/class-themecomplete-epo-settings-base.php:1969
msgid "Globally override the undo button for radio buttons"
msgstr "Überschreiben Sie global den Rückgängig Button für Radio Buttons"

#: includes/classes/class-themecomplete-epo-settings-base.php:1976
#: includes/classes/class-themecomplete-epo-settings-base.php:1991
#: includes/classes/class-themecomplete-epo-settings-base.php:2005
#: includes/classes/class-themecomplete-epo-settings-base.php:2020
msgid "Use field value"
msgstr "Feldwert nutzen"

#: includes/classes/class-themecomplete-epo-settings-base.php:1983
msgid "Datepicker theme"
msgstr "Datepicker Thema"

#: includes/classes/class-themecomplete-epo-settings-base.php:1997
msgid "Datepicker size"
msgstr "Datepicker Größe"

#: includes/classes/class-themecomplete-epo-settings-base.php:2012
msgid "Datepicker position"
msgstr "Datumsauswahl"

#: includes/classes/class-themecomplete-epo-settings-base.php:2027
msgid "Minimum characters for text-field and text-areas"
msgstr "Mindestzeichenzahl für Textfeld und Textbereiche"

#: includes/classes/class-themecomplete-epo-settings-base.php:2035
msgid "Maximum characters for text-field and text-areas"
msgstr "Maximale Zeichenzahl für Textfeld und Textbereiche"

#: includes/classes/class-themecomplete-epo-settings-base.php:2043
msgid "Upload element inline Image preview"
msgstr "Upload Element inline Bildvorschau"

#: includes/classes/class-themecomplete-epo-settings-base.php:2044
msgid "Enable inline preview of the image that will be uploaded."
msgstr ""
"Aktivieren Sie die Inline Vorschau des Bildes, das hochgeladen werden soll."

#: includes/classes/class-themecomplete-epo-settings-base.php:2051
msgid "Scroll to the product element upon selection"
msgstr "Scrollen Sie bei Auswahl zum Produktelement"

#: includes/classes/class-themecomplete-epo-settings-base.php:2052
msgid "Enable to scroll the viewport to the product element."
msgstr ""
"Aktivieren Sie diese Option, um das Ansichtsfenster zum Produktelement zu "
"scrollen."

#: includes/classes/class-themecomplete-epo-settings-base.php:2059
msgid "Product element scroll offset"
msgstr "Produktelement Bildlaufversatz"

#: includes/classes/class-themecomplete-epo-settings-base.php:2060
msgid ""
"Enter a value for the scroll offset when selecting a choice for the product "
"element."
msgstr ""
"Geben Sie einen Wert für den Scroll-Versatz ein, wenn Sie eine Auswahl für "
"das Produktelement auswählen."

#: includes/classes/class-themecomplete-epo-settings-base.php:2067
msgid "Sync associated product quantity with main product quantity"
msgstr "Zugeordnete Produktmenge mit Hauptproduktmenge synchronisieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2068
msgid ""
"Enable to have the quantities of the associated products to be a multiple of "
"the main product quantity."
msgstr ""
"Aktivieren Sie die Option, dass die Mengen der zugeordneten Produkte ein "
"Vielfaches der Hauptproduktmenge sind."

#: includes/classes/class-themecomplete-epo-settings-base.php:2146
msgid "Username"
msgstr "Benutzername"

#: includes/classes/class-themecomplete-epo-settings-base.php:2147
msgid "Your Envato username."
msgstr "Dein Envato Benutzername."

#: includes/classes/class-themecomplete-epo-settings-base.php:2154
msgid "Envato Personal Token"
msgstr "Ihr Envato Personal Token"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
#, php-format
msgid "You can generate an Envato Personal Token by %s"
msgstr "Sie können eine Envato Personal Token um %s generieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2156
msgid "clicking this link"
msgstr "klicken auf diesen Link"

#: includes/classes/class-themecomplete-epo-settings-base.php:2163
msgid "Purchase code"
msgstr "Lizenz - Code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
#, php-format
msgid "To find out how to access your purchase code you can %s"
msgstr "Om te weten te komen hoe u toegang krijgt tot uw aankoopcode kunt u %s"

#: includes/classes/class-themecomplete-epo-settings-base.php:2165
msgid "click this link"
msgstr "diesen Link anklicken"

#: includes/classes/class-themecomplete-epo-settings-base.php:2168
msgid "Deactivate License"
msgstr "Lizenz deaktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2169
msgid "Activate License"
msgstr "Lizenz aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2174
msgid "License activated."
msgstr "Lizenz aktiviert."

#: includes/classes/class-themecomplete-epo-settings-base.php:2184
msgid "Consent"
msgstr "Zustimmung"

#: includes/classes/class-themecomplete-epo-settings-base.php:2185
msgid ""
"I agree that the license data will be transmitted to the license server."
msgstr ""
"Ich bin damit einverstanden, dass die Lizenzdaten an den Lizenzserver "
"übermittelt werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:2209
msgid "Use allowed file types from WordPress"
msgstr "Verwenden Sie erlaubte Dateitypen von WordPress"

#: includes/classes/class-themecomplete-epo-settings-base.php:2231
msgid "Enable File manager"
msgstr "Dateimanager aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2242
msgid "Upload folder"
msgstr "Ordner hinzufügen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2243
msgid "Changing this will only affect future uploads."
msgstr "Eine Änderung wird sich nur auf zukünftige Uploads auswirken."

#: includes/classes/class-themecomplete-epo-settings-base.php:2249
msgid "Enable pop-up message on uploads"
msgstr "Pop-up-Nachricht auf Uploads aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2250
msgid "Enables a pop-up when uploads are made."
msgstr "Ermöglicht ein Pop-up, wenn Uploads gemacht werden."

#: includes/classes/class-themecomplete-epo-settings-base.php:2256
msgid "Enable upload success message"
msgstr "Upload-Erfolgsnachricht aktivieren"

#: includes/classes/class-themecomplete-epo-settings-base.php:2257
msgid "Indicates if the upload was successful with a message."
msgstr "Gibt an, ob der Upload mit einer Nachricht erfolgreich war."

#: includes/classes/class-themecomplete-epo-settings-base.php:2263
msgid "Allowed file types"
msgstr "Zulässige Dateitypen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2264
msgid "Select which file types the user will be allowed to upload."
msgstr "Wählen Sie aus, welche Dateitypen der Benutzer zum Hochladen hat."

#: includes/classes/class-themecomplete-epo-settings-base.php:2272
msgid "Select file types"
msgstr "Datei Typ auswählen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2276
msgid "Custom types"
msgstr "Benutzerdefinierte Typen"

#: includes/classes/class-themecomplete-epo-settings-base.php:2277
msgid ""
"Select custom file types the user will be allowed to upload separated by "
"commas."
msgstr ""
"Wählen Sie benutzerdefinierte Dateitypen aus, die der Benutzer für den "
"Upload durch Kommas freigesetzt wird."

#: includes/classes/class-themecomplete-epo-settings-base.php:2285
msgid "File manager"
msgstr "Dateimanager"

#: includes/classes/class-themecomplete-epo-settings-base.php:2313
msgid "CSS code"
msgstr "CSS Code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2314
msgid "Only enter pure CSS code without and style tags"
msgstr "Geben Sie nur reinen CSS-Code ohne und Style-Tags ein"

#: includes/classes/class-themecomplete-epo-settings-base.php:2321
msgid "JavaScript code"
msgstr "JavaScript Code"

#: includes/classes/class-themecomplete-epo-settings-base.php:2322
msgid "Only enter pure JavaScript code without and script tags"
msgstr "Geben Sie nur reinen JavaScript-Code ohne und Skript-Tags ein"

#: includes/classes/class-themecomplete-epo-settings-base.php:2345
msgid "Add Constant"
msgstr "Konstante hinzufügen"

#: includes/classes/class-themecomplete-epo-update-licenser.php:160
msgid "Error connecting to server!"
msgstr "Fehler bei der Verbindung zum Server!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:175
msgid "Error getting data from the server!"
msgstr "Fehler beim Erhalten von Daten vom Server!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:198
msgid "License activated!"
msgstr "Lizenz aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:211
#: includes/classes/class-themecomplete-epo-update-licenser.php:278
msgid "License deactivated!"
msgstr "Lizenz deaktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:226
msgid "Invalid action."
msgstr "Aktion ungültig."

#: includes/classes/class-themecomplete-epo-update-licenser.php:229
msgid "Please fill all fields before trying to activate."
msgstr "Bitte füllen Sie alle Felder aus, bevor Sie versuchen zu aktivieren."

#: includes/classes/class-themecomplete-epo-update-licenser.php:232
msgid "Trying to activate from outside the plugin interface is not allowed!"
msgstr ""
"Der Versuch, von außen die Plugin-Schnittstelle zu aktivieren, ist nicht "
"erlaubt!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:235
msgid "Error connecting to Envato API. Please try again later."
msgstr ""
"Fehler bei der Verbindung zu Envato API. Bitte versuchen Sie es später noch "
"einmal."

#: includes/classes/class-themecomplete-epo-update-licenser.php:238
msgid "Trying to activate with an invalid purchase code for your token!"
msgstr ""
"Versuchen Sie, mit einem ungültigen Kaufcode für Ihr Token zu aktivieren!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:241
msgid "Envato rate limit exceeded! Please try again later."
msgstr ""
"Envato-Szins-Grenze überschritten! Bitte versuchen Sie es später noch einmal."

#: includes/classes/class-themecomplete-epo-update-licenser.php:244
msgid ""
"That username is not valid for this item purchase code. Please make sure you "
"entered the correct username (case sensitive)."
msgstr ""
"Dieser Benutzername gilt nicht für diesen Artikel-Kaufcode. Bitte stellen "
"Sie sicher, dass Sie den richtigen Benutzernamen (case sensitive) eingegeben "
"haben."

#: includes/classes/class-themecomplete-epo-update-licenser.php:247
msgid "Trying to activate from an invalid domain!"
msgstr "Versuchen Sie, von einer ungültigen Domain zu aktivieren!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:250
msgid "Trying to activate from an invalid IP address!"
msgstr "Versuchen Sie, von einer ungültigen IP-Adresse aus zu aktivieren!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:253
msgid "The purchase code is already activated!"
msgstr "Der Kaufcode ist bereits aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:256
msgid "The purchase code is already activated on another domain!"
msgstr "Der Kaufcode ist bereits auf einer anderen Domain aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:259
msgid "You have already activated that purchase code on another domain!"
msgstr "Sie haben diesen Kaufcode bereits auf einer anderen Domain aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:262
msgid "The purchase code is already activated! Please buy a valid license!"
msgstr "Der Kaufcode ist bereits belegt! Bitte kaufen Sie eine gültige Lizenz!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:266
msgid "You have already activated your purchase code!"
msgstr "Sie haben Ihren Kaufcode bereits aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:269
msgid "Deactivated, but the purchase code was not activated for some reason!"
msgstr ""
"Deaktiviert, aber der Kaufcode wurde aus irgendeinem Grund nicht aktiviert!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:285
msgid ""
"Cannot deactivate. Purchase code is not valid for your saved license key!"
msgstr ""
"Kann nicht deaktivieren. Kaufcode ist nicht gültig für Ihren gespeicherten "
"Lizenzschlüssel!"

#: includes/classes/class-themecomplete-epo-update-licenser.php:307
msgid "Could not complete request!"
msgstr "Konnte Anfrage nicht fertigstellen!"

#: includes/classes/class-themecomplete-epo-update-updater.php:106
msgid "Downloading package from Envato market..."
msgstr "Download-Paket von Envato Markt ..."

#: includes/classes/class-themecomplete-epo-update-updater.php:111
msgid "Error! Can't connect to filesystem"
msgstr "Fehler! Kann keine Verbindung zum Dateisystem herstellen"

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "To receive automatic updates license activation is required."
msgstr ""
"Um automatische Updates zu erhalten, ist eine Aktivierung der Lizenz "
"erforderlich."

#: includes/classes/class-themecomplete-epo-update-updater.php:117
msgid "Please activate Extra Product Options."
msgstr "Bitte aktivieren Sie die Extra Produktoptionen."

#: includes/classes/class-themecomplete-epo-update-updater.php:127
msgid "Error! Envato API error"
msgstr "Fehler! Envato API Fehler"

#: includes/classes/class-themecomplete-epo-update-updater.php:163
msgid "Error on unzipping package"
msgstr "Fehler beim Auspacken des Archivs"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "Download new version from CodeCanyon"
msgstr "Neue Version von CodeCanyon herunterladen"

#: includes/classes/class-themecomplete-epo-update-updater.php:403
msgid "or register the plugin to receive automatic updates."
msgstr "oder registrieren Sie das Plugin, um automatische Updates zu erhalten."

#: includes/classes/class-themecomplete-epo-wpml-base.php:1011
#, php-format
msgid "Add translation to %s"
msgstr "Übersetzung hinzufügen zu %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1060
#, php-format
msgid "Edit the %s translation"
msgstr "Bearbeiten Sie die %s -Übersetzung"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1098
msgid "Language"
msgstr "Sprache"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1211
#, php-format
msgid "Language of this %s"
msgstr "Sprache dieser %s"

#: includes/classes/class-themecomplete-epo-wpml-base.php:1223
msgid "This is a translation of"
msgstr "Dies ist eine Übersetzung von"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:433
#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:490
msgid "Advanced Dynamic Pricing"
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:506
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:641
msgid "Enable discounts on extra options"
msgstr "Ermöglichung von Rabatten auf zusätzliche Optionen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:507
msgid ""
"Enabling this will extend product discounts to include extra options. This "
"configuration will automatically synchronize with the setting of the "
"discount plugin."
msgstr ""

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:520
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:655
msgid "Base original price type according to"
msgstr "Basis Original Preis Typ nach"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:521
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:656
msgid "Set to what price types will base their original price on."
msgstr ""
"Stellen Sie ein, worauf diese Preis Typen ihren ursprünglichen Preis "
"basieren."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:528
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:663
msgid "No change"
msgstr "Keine Änderung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:529
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:664
msgid "Undiscounted product price"
msgstr "Undiskontierter Produktpreis"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:534
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:669
msgid "Enable alteration of pricing table"
msgstr "Änderung der Preistabelle möglich"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:535
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:670
msgid "Check to enable the inclusion of option prices to the pricing table."
msgstr ""
"Aktivieren Sie diese Option, um die Einbeziehung von Optionspreisen in die "
"Preistabelle zu aktivieren.."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:541
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:676
msgid "Prefix label"
msgstr "Präfix-Beschriftung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:542
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:677
msgid "Display a prefix label on product page."
msgstr "Eine Präfix-Beschriftung auf der Produktseite anzeigen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:549
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:684
msgid "Suffix label"
msgstr "Suffix-Beschriftung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:550
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:685
msgid "Display a suffix label on product page."
msgstr "Eine Suffix-Beschriftung auf der Produktseite anzeigen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:557
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:692
msgid "Label CSS selector"
msgstr "Beschriftungsfarbe"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:558
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:693
msgid ""
"Enter a CSS selector to override the default label where the discount string "
"will be displayed."
msgstr ""
"Geben Sie eine CSS-Selektor-Auswahl ein, um die Standardbeschriftung zu "
"überschreiben, auf der die Rabattzeichenfolge angezeigt wird."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:565
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:700
msgid "Discount string placement"
msgstr "Sektionsplatzierung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:566
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:701
msgid "Select the placement of the discounted string compared to the label."
msgstr ""
"Selecteer de plaats van de afgeprijsde string ten opzichte van het label."

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:573
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:708
msgid "After"
msgstr "Nach"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:574
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:709
msgid "Before"
msgstr "Vorher"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:579
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:714
msgid "Enable showing option prices in the Order"
msgstr ""
"Deaktivieren Sie das Versenden der Optionen beim Speichern der Bestellung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php:580
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:715
msgid ""
"Enable this at your own risk since it is not possible to calculate option "
"discounts on the Order page."
msgstr ""
"Aktivieren Sie dies auf eigene Gefahr, da es nicht möglich ist, "
"Optionsrabatte auf der Bestellseite zu berechnen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:250
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:263
msgid "WooCommerce Bookings"
msgstr "WooCommerce Buchungen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:271
msgid "Multiply cost by person count"
msgstr "Kosten mit Personenanzahl multiplizieren"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:272
msgid "Enabling this will multiply the options price by the person count."
msgstr "Dies wird den Optionen-Preis mit der Anzahl der Person multiplizieren."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:281
#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:296
msgid "Using booking setting"
msgstr "Verwenden der Buchungseinstellung"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:286
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:289
msgid "Multiply cost by block count"
msgstr "Kosten mit Anzahl der Zeiträumen multiplizieren"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:287
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:290
msgid "Enabling this will multiply the options price by the block count."
msgstr ""
"Aktiviert wird der Optionen-Preis durch die Anzahl der Personen "
"multiplizieren."

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:301
msgid "Add option cost to booking display price"
msgstr "Optionskosten zum Buchungsanzeigepreis hinzufügen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php:302
msgid ""
"Enabling this will add the option prices to the calculated booking cost."
msgstr ""
"Wenn Sie diese Option aktivieren, werden die Optionspreise zu den "
"berechneten Buchungskosten hinzugefügt."

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:619
#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:632
msgid "Dynamic Pricing & Discounts"
msgstr "Dynamische Preise & Rabatte"

#: includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php:642
msgid ""
"Enabling this will apply the product discounts to the extra options as well."
msgstr ""
"Wenn aktiv, gelten die Produktrabatte ebenfalls für die zusätzlichen "
"Optionen."

#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:268
#: includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php:281
msgid "WooCommerce Easy Bookings"
msgstr "WooCommerce Easy Bookings"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:126
#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:139
msgid "WooCommerce Measurement Calculator"
msgstr "Holz-Handelsmessrechner"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:147
msgid "Multiply options cost by area"
msgstr "Multiplizierte Optionen kosten nach Fläche"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:148
msgid "Enabling this will multiply the options price by the calculated area."
msgstr ""
"Um dies zu ermöglichen, multiplizieren Sie den Optionspreis um den "
"berechneten Bereich."

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:155
msgid "Divide price with measurement"
msgstr "Preis mit Messung teilen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php:156
msgid "This will divide the original price with the needed measurement."
msgstr ""
"Dadurch wird der ursprüngliche Preis mit der erforderlichen Messung geteilt."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:230
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:243
msgid "WooCommerce Subscriptions"
msgstr "WooCommerce Abos"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:251
msgid "Include addons on order again"
msgstr "Addons auf Bestellung wieder beilegen"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:252
msgid ""
"Enabling this will add the saved addons to the subscription when using the "
"order again functionality manually."
msgstr ""
"Wenn Sie diese Option aktivieren, werden die gespeicherten Addons dem "
"Abonnement hinzugefügt, wenn Sie die Funktion \"Erneut bestellen\" manuell "
"verwenden."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:331
msgid "Sign up fee"
msgstr "Anmeldegebühr"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:332
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:370
msgid "sign-up fee"
msgstr "anmeldegebühr"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:333
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:369
msgid "and a"
msgstr "und ein"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:401
#, php-format
msgid "%1$s / %2$s"
msgid_plural "%1$s every %2$s"
msgstr[0] "%1$s / %2$s"
msgstr[1] "%1$s alle %2$s"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:471
msgid "Subscription sign up fee text"
msgstr "Gebührentext anmelden"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:472
msgid "Enter the Subscription sign up fee text or leave blank for default."
msgstr ""
"Geben Sie den Gebührentext für das Abonnement ein oder lassen Sie ihn für "
"den Standard leer."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:479
msgid "Sign up fee text"
msgstr "Anmeldegebühr Text"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:480
msgid "Enter the Sign up fee text or leave blank for default."
msgstr ""
"Geben Sie den Text für die Anmeldegebühr ein, oder lassen Sie sie für den "
"Standardwert leer."

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:668
#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:748
msgid "Subscription sign up fee"
msgstr "Gebührentext anmelden"

#: includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php:1422
msgid "Options Subscription fee"
msgstr "Abonnement-Gebühr"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:585
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:612
#: includes/fields/class-themecomplete-epo-fields-color.php:68
#: includes/fields/class-themecomplete-epo-fields-date.php:306
#: includes/fields/class-themecomplete-epo-fields-radio.php:597
#: includes/fields/class-themecomplete-epo-fields-range.php:76
#: includes/fields/class-themecomplete-epo-fields-select.php:209
#: includes/fields/class-themecomplete-epo-fields-selectmultiple.php:196
#: includes/fields/class-themecomplete-epo-fields-textarea.php:80
#: includes/fields/class-themecomplete-epo-fields-textfield.php:102
#: includes/fields/class-themecomplete-epo-fields-time.php:122
#, php-format
msgid "The quantity for \"%1$s\" must be greater than %2$s"
msgstr "Die Menge für \"%1$s\" muss größer als %2$s sein"

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:591
#: includes/fields/class-themecomplete-epo-fields-checkbox.php:618
#, php-format
msgid "The quantity for \"%s\" must be greater than 0 to be added to the cart."
msgstr ""
"Die Menge für \"%s\" muss größer als 0 sein um in den Warenkorb gelegt zu "
"werden."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:628
#, php-format
msgid "You can only select up to %1$s choice for %2$s."
msgstr "Sie können nur bis zu %1$s Auswahl für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:631
#, php-format
msgid "You can only select up to %1$s choices for %2$s."
msgstr "Sie können nur bis zu %1$s Auswahlmöglichkeiten für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:641
#, php-format
msgid "You must select exactly %1$s choice for %2$s."
msgstr "Sie müssen genau %1$s Auswahl für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:644
#, php-format
msgid "You must select exactly %1$s choices for %2$s."
msgstr "Sie müssen genau %1$s Auswahlmöglichkeiten für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:654
#, php-format
msgid "You must select at least %1$s choice for %2$s."
msgstr "Sie müssen mindestens %1$s Auswahl für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-checkbox.php:657
#, php-format
msgid "You must select at least %1$s choices for %2$s."
msgstr "Sie müssen mindestens %1$s Auswahlmöglichkeiten für %2$s auswählen."

#: includes/fields/class-themecomplete-epo-fields-date.php:341
#: includes/fields/class-themecomplete-epo-fields-date.php:439
#: includes/fields/class-themecomplete-epo-fields-date.php:594
msgid "Invalid date entered!"
msgstr "Ungültiges Datum eingegeben!"

#: includes/fields/class-themecomplete-epo-fields-date.php:373
msgid "Invalid data submitted!"
msgstr "Ungültige Daten eingereicht!"

#: includes/fields/class-themecomplete-epo-fields-date.php:446
msgid "Invalid year date entered!"
msgstr "Ungültiges Jahr eingegeben!"

#: includes/fields/class-themecomplete-epo-fields-date.php:485
#: includes/fields/class-themecomplete-epo-fields-date.php:539
#: includes/fields/class-themecomplete-epo-fields-date.php:586
msgid "You cannot select that date!"
msgstr "Dieses Datum kann nicht ausgewählt werden!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:70
#: includes/fields/class-themecomplete-epo-fields-upload.php:77
#, php-format
msgid "(max file size %s)"
msgstr "(maximale Dateigröße %s)"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:136
#: includes/fields/class-themecomplete-epo-fields-upload.php:139
#, php-format
msgid "%s is not a valid image file!"
msgstr "%s ist keine gültige Image-Datei!"

#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:184
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:199
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:315
#: includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php:330
#: includes/fields/class-themecomplete-epo-fields-upload.php:189
#: includes/fields/class-themecomplete-epo-fields-upload.php:282
msgid "Upload successful"
msgstr "Erfolgreich hochgeladen"

#: includes/fields/class-themecomplete-epo-fields-textarea.php:102
#: includes/fields/class-themecomplete-epo-fields-textfield.php:125
#, php-format
msgid "You must enter at least %1$s characters for \"%2$s\"."
msgstr "Sie müssen mindestens %1$s Zeichen für \"%2$s\" eingeben."

#: includes/fields/class-themecomplete-epo-fields-textarea.php:122
#: includes/fields/class-themecomplete-epo-fields-textfield.php:144
#, php-format
msgid "You cannot enter more than %1$s characters for \"%2$s\"."
msgstr "Sie können nicht mehr als %1$s Zeichen für \"%2$s\" eingeben."

#: includes/functions/epo-functions.php:291
msgid "Everyone"
msgstr "Jeder"

#: includes/functions/epo-functions.php:294
msgid "Logged in users"
msgstr "Inhalt verfügbar für angemeldete Benutzer"

#: includes/widgets/class-themecomplete-epo-widget-action.php:28
msgid "Echo a custom action"
msgstr "Eine eigene Aktion ausgeben lassen"

#: includes/widgets/class-themecomplete-epo-widget-action.php:37
msgid "EPO custom action"
msgstr "Benutzerdefinierte Aktion"

#: includes/widgets/class-themecomplete-epo-widget-action.php:87
msgid "Title:"
msgstr "Titel:"

#: includes/widgets/class-themecomplete-epo-widget-action.php:91
msgid "Custom action:"
msgstr "Benutzerdefinierte Aktion:"

#: templates/_choice_description.php:20 templates/_price.php:20
#: templates/_quantity.php:20
#, php-format
msgid "%s does not exist."
msgstr "%s existiert nicht."

#: templates/products/template-image.php:59
msgid "Awaiting product image"
msgstr "Warte auf Produktbild"

#: templates/products/template-item.php:90
msgid "N/A"
msgstr "N/A"

#: templates/products/template-item.php:92
msgid "SKU:"
msgstr "Artikelnummer:"

#: templates/products/template-variable.php:60
msgid "Clear"
msgstr "Löschen"

#: templates/tm-element-quantity.php:92
msgctxt "element quantity input tooltip"
msgid "Qty"
msgstr "Menge"

#: templates/tm-variations.php:347
msgid "Choose an option"
msgstr "Wählen Sie eine Option aus"

#~ msgid "WooCommerce"
#~ msgstr "WooCommerce"

#~ msgid "Hide extra options prices in cart"
#~ msgstr "Zusätzlichen Optionen im Warenkorb verstecken"

#~ msgid "Enables or disables the display of prices of options in the cart."
#~ msgstr ""
#~ "Ermöglicht oder deaktiviert die Anzeige der Preise der Optionen im "
#~ "Warenkorb."

#~ msgid "Show bottom"
#~ msgstr "Boden anzeigen"

#~ msgid "Show inside"
#~ msgstr "Innen anzeigen"

#~ msgid "Disable categories"
#~ msgstr "Kategorien deaktivieren"

#~ msgid "Submit for Review"
#~ msgstr "Zur Bewertung senden"

#~ msgid ""
#~ "Activate to display the total specifically for selected product options, "
#~ "allowing customers to see the cost breakdown for their chosen "
#~ "customizations."
#~ msgstr ""
#~ "Aktivieren Sie diese Option, um die Gesamtsumme speziell für ausgewählte "
#~ "Produktoptionen anzuzeigen, sodass Kunden die Kostenaufschlüsselung für "
#~ "die von ihnen gewählten Anpassungen sehen können."

#~ msgid "Show Both Final and Options total box"
#~ msgstr "Zeige das Gesamt- und das Options-Gesamtfeld an"

#~ msgid "Show Final box and hide Options if zero"
#~ msgstr "Gesamtbetrag anzeigen und Optionen bei \"Null\" ausblenden"

#~ msgid "Hide Final total box"
#~ msgstr "Gesamtsumme ausblenden"

#~ msgid "Always show only Final total (Price x Quantity)"
#~ msgstr "Immer nur Gesamtsumme zeigen (Preis x Menge)"

#~ msgid "Disable but change product prices"
#~ msgstr "Die Produktpreise deaktivieren, aber Produktpreis ändern"

#~ msgid "Select when to show the final total box"
#~ msgstr "Wählen, um eine Box mit der Gesamtsumme anzuzeigen"

#~ msgid "Show Final total and hide Options total if zero"
#~ msgstr "Gesamtsumme zeigen und Optionen-Summe verbergen, wenn sie Null ist"
languages/woocommerce-tm-extra-product-options-es_ES.mo000064400000326200150755142440017302 0ustar00���t%=�J�c�c�c�co	dyd*�d�d8�d\e:keB�e"�e5fBfIf
Rf]f
pf{f�f�f�f�f	�f�f�f�f�fgg)g:g&Gg8ng�g�g�g�g
�g�ghh)1h[h#qh�h�h�h�h�h�h�h

ii/iEiWi[ini{i�i'�ir�iIj-Uj�j�j	�j�j�j�j
�j�j)�j*kDAk*�k,�k,�k	lLlbl�l�l
�l4�l�l�lm%#m
ImTm[mpm]�mX�mAnRnanxn�n�n�n�n�n�n�n�n
�n�n�n�n&o&'oNo�UoI�o.p3p
FpQpXpvp�p.�p�p�p�p<q=ZqY�qR�q<ErM�rF�r^sRvsz�sRDt'�t3�t7�t9+u/eu��u;1vDmv7�vI�vB4w?ww:�w(�wx
$x/x7x@xOx=`xS�xT�x"Gy3jyD�y1�yHz5^z8�zF�z,{8A{+z{7�{<�{K|=g|<�|K�|=.}(l}A�};�}2~iF~<�~�~!�~'
7BX	^h������*������
��%�*�/�%K�q�
w�����������́�����
�#�9�E�Q�
c�n�����������͂�E�9�B�J�
Z�h�o���!����
Ã΃ڃ����#�&(�O�l�����1��ބ����$�-�
G�U�]�'s�'��
Å΅�/��)�E�c�k�x�}�?��$†)���/�A�S�o�����������ˇ�
��	��
�
&�4�L�f�y�
������
����"È�'��""� E�f�<��<��!��.�9M�#��(��Ԋ �$�)1�f[�0‹]��Q�-��?,�+l�D��>ݍ=�?Z�A��q܎FN�g��5��93�3m�2��3Ԑ3�<�Z�l�
t���'��CƑ)
�74�9l�g��L�P[�D����R��yؔAR�E��Bڕs�N��A�"�3�_<�l��w	�s��\��9R�U��V�29�^l�r˚>>�X}�:֛L�L^�>����Ws�3˝8��<8�=u�@����7��AП:�0M�0~�-��ݠ�5�6;�8r�6��C�5&�3\���F����2$�'W�>���Nף&�,E�Dr���Ȥ3ޤ	�	�7&�^�#z�����˥��"�>�V�_� o�������
Ħ"Ϧ"�
� �,�#D�%h�����"���	��)�2�>�N�]�-j�!����	èͨݨ���
��.�B�a�v�����!��֩���

��4�:�A�F�O�W�g�x����3��������������
���!�&�-�5�;�C�L�Y�i�v�����������#ѫ���,�)G�q�����"��
ج)�
�+�;�0@�Hq�����ϭM�P0�D��
ƮѮ�
�����8�'X���'��ǯ6֯
�%�?�N�Z�r�������
��̰����&�$A�$f�(����Ա!� �3�L�g�����!������Ų˲
޲���
���/�5�0A�r�>��Cϳ��*�	<�F�W�d�z���������ʹٴ����A
�O�U�^�	k�u�0������#�'�
.�	9�C�0V�������ȶڶ����
��0�C�]�
w�������طD��;�?�D�T�a�f�i�~�����	ɸӸ� ���
4�B�_�r�w�~���������¹ӹ/۹7�C�H�O�h�w�����������κ'��'�>�Z�b�u�'��&��5�
�#�B�	N�X�x�#����2Ӽ/�$6�%[�(��)��Խ$�2�F�.a�5��1ƾo��.h�1��"ɿ#�!�"2�U� u���������������4��0/� `�)�����
���
���&;�$b�
�������������������*�;�D�\�
d�r�v��������
����
��+�-/�]�d�j�w������)������!�"�:A�
|���������
��������������
��	���$�,;�h�{�������������
����
6�D�Q�
X�c�3t�Q����
�$�1�PC�������*��-��&�1C�u�������0��*��-�:��S�*�3J�_~�:��4�DN�&��&��-��<�@L�"��"��)��$��$"�$G�#l�*��/��2��;�	Z�	d�Mn�>��=��
9�D�	M�W�^�
s�~�������������
�
�"�=�+R�!~�
����	��%��C��5:�p���C��
����(���
6�(D�m�y���������������$��&�<;�x����������
����
��������
)�7�P�n�w���������;����
����6�?�	D�
N�Y�j�|�	��{��4�,C�)p�,��]��%�>>�C}�+�����9��'��C��E7�<}�;����/�"C�Zf�G��.	� 8�Y�s�"y�'��	��/��1��:0��k��!�3����+�C�)\�;��#��4��B�@^�;��i��~E�D��<	�uF�)��@��D'�[l�3��
����$�)�5�G�
M�[�b�7e�<��I��$�*�2�H�_�q�u�
~�	�������� ��"���.�*K�Dv�@��5��2�:�S�Y�]�x�}�
������3���������#1�
U�c�r�������������%���&�6�I�\�y�h��)��7�"V�y���1����s��2h�������������
��
��(�#=�a�
r�	����������	��3���!�6�"P�s����������������"�5�9�(M�&v�7��3��8	�OB�/��[��&�4E�0z�@����@	�.J�y���������������.�"2�	U�_�d�j�w�����������������������������������&�,�	2�<�4R���/��M��O�SW����������������y�
P�1^�&��=��w��=m�J��.��5%�[�
d�o�v�
���������	���,�4�N�h�����.��?�!�&2�Y�j�{�&�����:��8�X�m���� ��&��#��"�!@�b�x�}�
������8���@���
$=E
]k5q5�F�4$+Y:�
�R�3R'g	�0��-��#AMS#qp�p w������	':?K
R]am3y-����`��"�'"Jj.���'�>	QU	u�	~
M�
e�
JP}�c�}i
N{
G�
CGV>���E�R�SQZ�RmSD�BIR
lw}�H�c�dO$�7�WAiN�9�N46�*�2�.?GC�W�;#:_T�>� .PO?�+�|B��2�4Fel%x�����H$8	GQe}�$�6����/EZ"o������%>Qq������G�	@JVn���(���  0 9 3F 3z ,� )� (!.!;A!!}!�!�!,�!	�!#�!"*"2";N":�"�"�"�"=#A#\#	v#�#
�#�#M�#(�#-$F$!R$t$�$�$�$�$�$%%%*1%\%l%}%�%
�%�%�% �%�%&0&	?&I&O&^&0t&&�&.�&1�&6-'&d'D�'D�'+(DA(@�(-�(@�((6)(_)0�)2�)s�)1`*P�*��*>�+X�+?R,W�,^�,UI-`�-M.pN.i�.t)/Q�/<�/6-04d06�07�0$1-1
C1N1&a1=�1[�1)"2?L2F�2y�2YM3z�3g"4��4x>5��5R96N�6S�6�/7b�7L18~8
�8l�8�	9��9�E:��:@�;c�;`+<7�<��<�P=O�=�1>P�>^?jg?I�?�@q�@46ACkAB�AK�AI>B�B?C]HCF�C:�C:(D<cD�D�DF�D=EDWEN�E`�EELF=�F-�FK�FJGdGB~G;�GB�G @H_aH'�H0�HNIiI�IZ�I	�I
JR
J"`J(�J�J�J)�J#K&+K4RK�K�K�K#�K�K�KL
L$&L&KLrLL#�L2�L0�LM%8M7^M)�M�M)�M�M�MN,N?N;RN-�N�N�N�N�N�NO
O'O@O*YO�O%�O$�O�O'P)P>P^PrP%�P	�P�P�P�P�P�P�PQQQ@2QsQvQyQ|QQ�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q	�Q�Q	�Q�Q�Q�QR%R
8RCRJR/RR#�RC�R.�R%S+?S>kS&�S*�S�S/T<TGKT,�T�T�T5�TK
UYU \U}UQ�UW�UKFV�V�V�V�V�V�V(�V#"WIFW0�W@�WX.X#CX(gX�X�X�X�X�X�XY*Y=Y [Y3|Y�Y.�Y�Y<Z1EZ%wZ!�Z+�Z)�Z[ 4[U[t[{[&�[�[�[�[�[�[�[\'\8\?\R\Y\=t\+�\I�\S(]	|]�]�]�]�]�]�]^^^1^G^]^i^o^�^�^H�^�^�^_
_#_;7_s_�_�_,�_�_```
 `.`:B`}`�`�`�`�`�`�`aaa)a;aVana�a.�a �a-�acb�b�b�b�b	�b�b$�b1�b!c09c
jcuc �c*�c+�cd)d>dZdbdidxd�d	�d�d�d�d4�d<eBeJeReqe}e�e�e�e�e�e�e+f3fSf!qf�f�f�f)�f*�fC'g
kg/vg�g�g*�g&�gCh%^h2�h2�h�h-
i!8i"Zi$}i.�i.�i#j*$j7Oj4�j{�j28k0kk �k,�k&�k/lAl)_l�l�l�l	�l�l�l�lm7	m3Am&um:�m�m�m�m
n"n7nGn"Zn}n�n�n�n�n�n	�n�n�n9o'<odoxo	�o�o�o�o�o�o�o�op,pApRprp.�p2�p	�p�pqqq)q!2q3Tq�q�q+�q �qR	r\rnr�r�r�r�r�r�r	�r�r�r�r�rs
ss"%s;Hs�s�s�s�s�s�stt:tIt#dt�t�t�t�t�tP�tb3u)�u�u�u�ua�u_vsv�v/�v0�v*w8:wsw�w�w�wI�w:
xDHx�x��x,�y6�yy�y@oz:�zT�z>@{={1�{D�{G4|$||-�|7�|.}.6}8e}7�};�}3~4F~>{~	�~
�~_�~_/P������'�.�6�J�0a���2�������2�7L�'������݁?�h*�>��҂�W�\�l�=|�$��߃)��0�L�`�z���&��%Ȅ���#�N:���
��	����Dž���
	�
�%�*7�b�i��(��4��
����(�;�C�R[�����	ԇ	އ3�	�&�,�;�J�d�{�
�����;P�.��-��-�[�%s�8��UҊ6(��_�9�)L�Hv�E��:�<@�}�5��"ЍN�EB�1��&�����"�*#�N�;]�F��@��!����>�#�3�S�n�0��B����=�J[�:��F�y(����f'�C��xҖ*K�Nv�Dŗl
�9w�
����Ҙ٘ޘ���$�-�93�Tm�L™��$�"@� c���������Ӛ!ٚ ��6�9S���8��0ӛE�GJ�E��؜ߜ���!�*�3�H�X�q�:��
˝֝�	��6*�a�r���������ݞ���5�N�n�����!��ڟ��6}�A��.��%�@�7_�#�����Og���#ɢ������+�7�C�+J�(v���
��ãϣ-ܣ1
�<�
C�9N����� ��%Ĥ���"�<�A�S�e�u���
������.��4�-%�4S�@��Cɦ5
�dC�)��/ҧ6�K9�!��7��'ߨ�$� B� c�����������ةܩ����	���#�)�0�5�>�F�L�R�	[�e�	k�u�~�������8��ݪ	��D�L�N�Ii�I��S��Q�a�f�s�e���d��1O����L��m�������li\b���,���U����Xg�?��:����l)�J��r��t}=J]4��b�.`�.���Rn��xZa�)��>���X9Be����Yr'�@�����J�q���*��wLP9\�Fx0_&�Wj6l���#�LY2%�S?
y����EU��Rz1���(��a��j������qTZ��oh!o��t�;@�W��>c-�cO���-�=��������Y���	qJ��=�����H��7�R����#�)�
���h��?���U�
)�C�������'vOS5����0`�Q6�EFjhN4w������Z1��O���4�a)���{�Z�$�p� ��g�V��C���k+��}su�%���R����M�tvQ�p��s�T/�k	O��&�,�lAI]/����U~C��|Ep7Q�+���[E�����9 ���	�x_z����{��M��	�@�g=5f��j(�}��������+�^&��8(��3�u�.����D/�w������
�K���I!2��V�!�p�o�F@�.��D"��\���K<|K�N�"��|�"/4G�<k��Ry���k��'i�`����r���[h��50-�<�'r| ��WaA
��BAF���67t[u.S^B�-����8�:%N�B�+S�J�a�8��
���XA�$�IGYjG���mz���9HwE�!v�13#>�bHT3�����8_���f��y��u���*�0H�t'~�o��c����A�<��s��m7�g����6�I��q��^U>�P�d�MW%cn�Q�]T��2]{
�N2�i@����D^ebX�e3�������;�$����>���n,z���~�V�5L��*���Px������&l[0��x;F(�PI��k��GBf����^\���3��{	��*�y,�����Q}{b}]��
��+�NL�i�!<�;��d�f��d 81��n��d�K6-(��q��~D�z_�H�=:�����T�M��4�vW��m�
#Dv�$i���,�rK���%�s����_[X�
���Mw�����&�h�V��V�/`��2�e:$���G :���S��Z�C�n�~"��Y��p��m���?o�;uf�"��c��7g�`*5���|C�����9y#�s\��?�P"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%1$s has been removed from your cart because it has since been modified. You can add it back to your cart %2$s.%s does not exist.%s has been updated.%s have been updated.%s is not a valid image file!%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.%s removed along with all of its associated products!(Copy)(Legacy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAbove fieldAbsolute URLAccordionActionsActivate LicenseAddAdd Extra OptionAdd Global FormAdd New Global FormAdd New TemplateAdd TemplateAdd button text on associated productsAdd categories to include all their associated products.Add elementAdd element in a new sectionAdd itemAdd sectionAdd separatorAdd the products individually.Add to cartAdd to cart buttonAdd to cart button on floating totals boxAdd translation to %sAdditional Options text replacementAdditional optionsAdvanced displayAdvanced optionsAfterAfter Local OptionsAfter add to cart buttonAfter cart formAfter productAfter product imageAfter product summaryAfter the elementAllAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAlter generated product structured dataAlters the generated product structured data. This may produce wrong results if the options use conditional logic!Always showAlways use unique values on cart for elementsAlways visibleAn error has occurred!AnimationAnimation delayAnyAppend new elementsApplied onAprilAre you sure you want to clone this item?Are you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttach the price to the order making it independent of the product quantity.Attach upload files to emailsAttribute LabelAttribute element class nameAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase original price type according toBase priceBeforeBefore Local OptionsBefore add to cart buttonBefore adding Extra Options in this mode, add and save some attributes on the Attributes tab.Before adding Extra Product Options, add and save some attributes on the Attributes tab.Before cart formBefore productBefore product summaryBefore the elementBelow fieldBottomBottom leftBottom of screenBottom rightBoxBuilderButtonButton AltCDNCSS SettingsCSS codeCalendar close button text replacementCalendar today button text replacementCancelCannot apply rules on this element or section since there are not any value configured elements on other sections, or no other sections found.Cannot deactivate. Purchase code is not valid for your saved license key!CartCart Field DisplayCategoriesCenterChange original product priceChange variation priceChanges product imageChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?Check for empty product priceCheck show quantity selector only for elements with a value.Check this only if you are getting server errors on checkout.Check this to alter the price display of a product when it has extra options with prices.Check this to disable showing description as a tooltip and show it inline instead.Check this to globally hide the price display if it is zero.Check this to have the plugin set to zero the product price when it is empty.Check this to include the pricing of the options to the product price.Check this to multiply the prices of the select box options with its quantity selector if any.Check this to show the add to cart button only when at least one option is filled.Check this to show the price of the select box options if the price type is fixed and even if the element hides the price.Check this to show the price of the select box options if the price type is fixed.Check to Attach upload files to emails.Check to disable options from being sent to emails.Check to disable scrolling to the element with an errorCheck to disable the conversion to png for image uploads.Check to enable legacy meta data functionality.Check to enable the display of extra options on the shop page and category view. This setting is theme dependent and some aspects may not work as expected.Check to enable the display of the undiscounted final totalCheck to enable the inclusion of option prices to the pricing table.Check to enable validation feature for builder elementsCheck to overwrite the original product price when the price is changing.Check to overwrite the variation price when the price is changing.Check to remove Free price label when product has extra optionsCheck to split items with multiple values to unique lines.Check to strip the html tags from emailsCheckboxCheckboxesCheckedCheckoutChoose a valueChoose an optionChoose how to determine the decimal separator for user inputsChoose how you want the sign of options prices to be displayed at the product page.Choose how you want the sign of options prices to be displayed in cart and checkout.Choose the image for the lightbox.Choose the image to replace the product image with.Choose the image to use in place of the checkbox when it is checked.Choose the image to use in place of the checkbox.Choose the image to use in place of the radio button when it is checked.Choose the image to use in place of the radio button.Choose the tax class for Fee price type on this element.Choose whether the field will be validated against the choosen method.Choose whether the option is enabled or not.Choose whether the user must fill out this field or not.Choose whether to change the product image.Choose whether to enable the lightbox on the thumbnail.Choose whether to hide the element label in the cart or not.Choose whether to hide the element label in the floating totals box or not.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the cart or not.Choose whether to hide the element value in the floating totals box or not.Choose whether to hide the element value in the order or not.Choose whether to hide the price or not.Choose whether to include tax for Fee price type on this element.Choose whether to redirect to a URL if the option is click.Choose whether to show or hide the attribute name.Choose which %s the date element will use on the backend calculations or leave blank for server timezone.Choose which decimal separator to display on currency pricesClearClear all additional Global formsClear cart buttonClick to toggleClone formCloning is forbidden.CloseClose allClose button text replacementColorColor pickerColor swatchesComma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!Conditional LogicConsentContentContent colorContent positionCopyCostCould not complete request!Could not update post in the databaseCountCurrent valueCustom Time formatCustom action:Custom codeCustom hookCustom priceCustom price (required)Custom styleCustom typesDEV - multiple filesDateDate fieldDate field and pickerDate formatDate pickerDate picker styleDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDeactivated, but the purchase code was not activated for some reason!DecemberDefaultDefault productDefault valueDeleteDelete PermanentlyDelete all optionsDelete all options on the productDelete itemDescendingDescriptionDetermine by browser localDigitsDisableDisable Exclude from Global OptionsDisable Options on Order status changeDisable PNG convert securityDisable error scrollingDisable lazy load imagesDisable monthsDisable sending the options upon saving the orderDisable weekdaysDisabledDisabled datesDisabled roles for this formDiscountDiscount string placementDiscount typeDisplayDisplay a pop-up linkDisplay a prefix label on product page.Display a suffix label on product page.Display asDisplay both signsDisplay only minus signDisplay the add to cart button on floating box.Displayed decimal separatorDivide price with measurementDividerDivider typeDocsDoneDouble click the radio button to remove its selected attribute.Download new version from CodeCanyonDownloading package from Envato market...DropdownDropdown PlaceholderDuplicate ElementDuplicate SectionDynamic Pricing & DiscountsEPO Control PanelEPO custom actionEcho a custom actionEditEdit ElementEdit Global FormEdit Options text replacementEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit the %s translationElement Conditional LogicElement class nameElement container idElement idElementsEmailEmpty cartEmpty cart textEnable Exclude from Global OptionsEnable File managerEnable Final total box for all productsEnable alteration of pricing tableEnable checkbox and radio stylesEnable clear options buttonEnable conditional logic for showing or hiding this element.Enable conditional logic for showing or hiding this section.Enable discounts on extra optionsEnable extra options in shop and category viewEnable inline preview of the image that will be uploaded.Enable original final total displayEnable plugin for WooCommerce shortcodesEnable points display?Enable pop-up message on uploadsEnable shortcodes in options stringsEnable showing option prices in the OrderEnable this at your own risk since it is not possible to calculate option discounts on the Order page.Enable this if the product has a lot of options.Enable this if you are getting a 500 error when trying to complete the order in the checkout.Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable this to add any Fees to the unit priceEnable this to add the WooCommerce tax suffix on the totals boxEnable this to disable lazy loading images.Enable this to display the unit price when the totals box is visibleEnable this to hide the builder tab on the product edit screenEnable this to hide the normal tab on the product edit screenEnable this to hide the settings tab on the product edit screenEnable this to preload the image when using the lightbox feature.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.Enable to have the quantities of the associated products to be a multiple of the main product quantity.Enable to scroll the viewport to the product element.Enable to show the description of the associated product.Enable to show the image of the associated product.Enable to show the meta of the associated product.Enable to show the price of the associated product.Enable to show the title of the associated product.Enable upload success messageEnable validationEnabledEnabled datesEnabled roles for this formEnables a pop-up when uploads are made.Enables or disables extra styling for checkboxes and radio buttons.Enables or disables the clear cart buttonEnables or disables the display of options in the cart.Enables the display of a reset button for this attribute.Enabling this will allow the use of shortcodes and HTML code in the options label and description text.Enabling this will apply the product discounts to the extra options as well.Enabling this will hide the URL of any uploaded file while in cart and checkout.Enabling this will hide the URL of any uploaded file while in order.Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-safe setting and we recommend to be active.Enabling this will load the plugin files to all WordPress pages. Use with caution.Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected disabled weekdays.Enabling this will multiply the options price by the block count.Enabling this will multiply the options price by the calculated area.Enabling this will multiply the options price by the person count.Enabling this will separate comma separated values for elements. This is mainly used for multiple checkbox choices.Enabling this will show the images of elements that have an image replacement.Enabling this will show the uploaded images in cart and checkout.End of the labelEnd yearEnter a CSS selector to override the default label where the discount string will be displayed.Enter a message to be used in the pop-up after clicking the add to cart button when there are upload fields.Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for default behaviour.Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.Enter a string to indicate the required state of a field.Enter a text to display after the price for this field or leave it blank for no text.Enter a text to display before the price for this field or leave it blank for no text.Enter a text to indicate that a field is required.Enter a text to replace the Additional options text when using the pop up setting on the cart.Enter a text to replace the Characters remaining text when using maximum characters on a text field or a textarea.Enter a text to replace the Close button text on the calendar.Enter a text to replace the Close button text when using the pop up setting on the cart.Enter a text to replace the Edit options text on the cart.Enter a text to replace the Free price label when product has extra options.Enter a text to replace the Reset options text when using custom variations.Enter a text to replace the Today button text on the calendar.Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart button  when there are upload fields.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the empty cart button text.Enter a text to replace the next button text for slider.Enter a text to replace the previous button text for slider.Enter a value for the minimum characters the user must enter.Enter a value to be applied to the Quantity field automatically.Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).Enter a value to be applied to the field automatically.Enter a value to limit the maximum characters the user can enter.Enter an extra class name to add to this attribute elementEnter an extra class name to add to this elementEnter an extra class name to add to this sectionEnter an id for the container of the element.Enter ending year.Enter starting year.Enter the Fees total text or leave blank for default.Enter the Final total text or leave blank for default.Enter the Options total text or leave blank for default.Enter the Sign up fee text or leave blank for default.Enter the Subscription sign up fee text or leave blank for default.Enter the Unit price text or leave blank for default.Enter the Update cart text when you edit a product.Enter the discount amount.Enter the height of the displayed item or leave blank for auto height.Enter the maximum value.Enter the minimum value.Enter the number of values for the points display.Enter the placeholder for the dropdown.Enter the price for this field or leave it blank for no price.Enter the quantity step.Enter the sale price for this field or leave it blankto use the default price.Enter the step for the handle.Enter the time the following format: 8:00 amEnter the width of the displayed item or leave blank for auto width.Enter title hereEnvato Personal TokenEnvato rate limit exceeded! Please try again later.Epo BlackEpo WhiteError connecting to Envato API. Please try again later.Error connecting to server!Error getting data from the server!Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error label placementError on unzipping packageError! Can't connect to filesystemError! Envato API errorEveryoneExact selectionExclude Product(s) from the formExclude ProductsExclude disabledExcluded ProductsExpand allExpand and Collapse (start closed)Expand and Collapse (start opened)Export CSVExport formExtra Options placementExtra Options placement custom hookExtra Options placement hook priorityExtra Product OptionsExtra Product Options FeesExtra Product Options Form BuilderExtra Product Options SettingsExtra feeFailed to write file to disk.FebruaryFees amountFees total textFile imported.File managerFile manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal Total BoxFinal totalFinal total boxFinal total textFixed amountFixed amount + optionsFloating Totals boxFloating Totals box visibilityForce Select OptionsForce Select options textForm draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %s.Form submitted.Form updated.Free Price text replacementFree!FridayFromFullsizeGeneralGeneral OptionsGeneral SettingsGlobalGlobal FormGlobal variablesGlobally override the undo button for radio buttonsGoogle font: on or offonH1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide Builder mode on productsHide Normal mode on productsHide checkbox element average priceHide element label in cartHide element label in orderHide element value in cartHide element value in floating totals boxHide element value in orderHide extra options in cartHide filtersHide override settings on productsHide priceHide upload file URL in cart and checkoutHide upload file URL in orderHorizontal ruleHourHow long the animation will take in millisecondsI agree that the license data will be transmitted to the license server.IDIcon tooltip leftIcon tooltip rightIf this is enabled the included product is not shipped with the main product.If this is enabled the included product will add its weight to the main product.If this is enabled the included product will maintain its own price.Image modeImage replacementImage swatchesImport CSVImporting csv...Importing dataInclude Fees on unit priceInclude additional Global formsInclude option pricing in product priceInclude tax for Fee price typeInclude tax string suffix on totals boxIncrease WidthIndicates if the upload was successful with a message.Inherit product settingInherit product tax classInitializationInline modeInput decimal separatorInvalid CSV file!Invalid CSV file.Invalid action.Invalid data submitted!Invalid data!Invalid date entered!Invalid file extensionInvalid import method used.Invalid request!Invalid year date entered!Item name in quotes&ldquo;%s&rdquo;Items per row (Desktops and laptops)Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)Items per row (Smartphones)Items per row (Tablets landscape)Items per row (Tablets portrait)Items per row (iPhone 5)Items per row (iPhone 6 +)Items per row (iPhone 6)January JavaScript codeJavascript and CSS inclusion modeJulyJuneLabelLabel CSS selectorLabel OptionsLabel colorLabel positionLabel typeLanguageLanguage of this %sLargeLayout modeLeave blank to use the original attribute label.Leave empty for default valueLeave it blank to calculate it automatically from the %s priceLeave it blank to calculate it automatically from the %s sale priceLeftLeft of the fieldLeft of the labelLeft sideLegacy meta dataLetters onlyLetters or Space onlyLicenseLicense activated!License activated.License deactivated!Limit selectionLoading ...LocaleLogged in usersM j, Y @ H:iMaintain weightMake the total price not being multiplied by the product quantityMarchMass addMath formulaMax valueMaximum charactersMaximum characters for text-field and text-areasMaximum image heightMaximum image widthMaximum quantityMaximum selectable dateMaximum selectable timeMayMediumMenu OrderMin valueMinimum charactersMinimum characters for text-field and text-areasMinimum quantityMinimum selectable dateMinimum selectable timeMinimum selectionMinuteMissing a temporary folder.MondayMonthMonth - Day - YearMonth . Day . YearMonth / Day / YearMore information about %sMove out of stock messageMove to TrashMultiple minified filesMultiply cost by block countMultiply cost by person countMultiply options cost by areaMultiply prices inside select box choices with its quantity selectorN/ANameNew Global FormNew TemplateNextNoNo Global Form foundNo Global Form found in trashNo Template foundNo Template found in trashNo changeNo file found.No file was uploaded.No negative priced products textNo saved variations found.No validationNo zero priced products textNo, but hide priceNoneNormalNormal (clear)Normal browser buttonNormal displayNovemberNumberNumber of pointsOctoberOnly enter pure CSS code without and style tagsOnly enter pure JavaScript code without and script tagsOpenOptionOptions Subscription feeOptions amountOptions saved!Options total textOrderOrder byOriginal product priceOther elementsOverride Final total boxOverride enabled roles for this productOverride global displayOverride product priceOverwrite existing elementsPaddingParent Global FormPercent of the original pricePercent of the original price + optionsPercent of the original price per wordPercent of the original price per word (no n-th char)PercentagePixels amount needed to scrollPlaceholderPlacementPlease enter a multiple of {0}.Please enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} character.Please enter at least {0} characters.Please enter no more than {0} character.Please enter no more than {0} characters.Please enter only digits.Please enter only letters or spaces.Please enter only letters, numbers or underscores.Please enter only letters.Please enter only unicode letters and numbers.Please enter only unicode letters, numbers or spaces.Please fill all fields before trying to activate.Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!Please save the form before importing options!Please save the product before importing options!Please select at least {0} choice.Please select at least {0} choices.Please select exactly {0} choice.Please select exactly {0} choices.Please select up to {0} choice.Please select up to {0} choices.Pop upPopulatePopulate optionsPositionPrefix labelPreload lightbox imagesPremium SupportPrevPrevent adding to the cart negative priced products.Prevent adding to the cart zero priced products.Prevent negative priced productsPrevent options from being sent to emailsPrevent zero priced productsPricePrice TypePrice per IntervalPrice per characterPrice per rowPrice per wordPrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:Priced individuallyPricingPriorityProductProduct Image replacementProduct element scroll offsetProduct image replacement modeProduct pageProduct quantityProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity Default valueQuantity max valueQuantity min valueQuantity selectorQuantity stepRadio button undo buttonRadio buttonsRadio buttons and image at end of the labelRadio buttons and image at start of the labelRandomRangeRange pickerRegularRelative URLRemoveRemove Free price labelRemove button text on associated productsRemove the image.Required state indicatorRequired state indicator positionReset Options text replacementReset option values after the product is added to the cartReset optionsReset settingsRightRight of the fieldRight of the labelRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSaving... Please wait.Scroll to the product element upon selectionSearch Global FormSearch TemplateSearch for a product ...Search for a product&hellip;SecondSectionSection Conditional LogicSection class nameSection idSection placementSection pop up button styleSection styleSection typeSelectSelect BoxSelect a productSelect a style for the checkboxes and radio buttonsSelect a style for the selected border when using image replacements or swatches.Select an image for this term.Select boxSelect boxesSelect categoriesSelect custom file types the user will be allowed to upload separated by commas.Select fileSelect file textSelect file typesSelect how the products will be presented.Select how to display your fields in the cartSelect how to include JS and CSS filesSelect how to show the value of the range picker.Select modeSelect optionsSelect productsSelect templateSelect the Extra Options placement hook prioritySelect the Product(s) to apply the optionsSelect the Totals box placement hook prioritySelect the color to use.Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.Select the display type of this attribute.Select the image to replace the product image with.Select the number of pixels the page needs to scroll for the floating totals to become visible.Select the parameter which the products will be sorted by.Select the placement of the Required state indicatorSelect the placement of the discounted string compared to the label.Select the position of the datepicker.Select the position of the timepicker.Select the product that will be pre-selected.Select the roles that will have access to the extra options.Select the roles that will not have access to the extra options.Select the size of the datepicker.Select the size of the timepicker.Select the sorting order of the products.Select the theme for the datepicker.Select the theme for the timepicker.Select this section's display style.Select this section's display type.Select this section's pop up button style.Select where you want the Totals box to appear.Select where you want the extra options to appear.Select which file types the user will be allowed to upload.Self modeSeptemberSet the image mode that will be used for various image related functionality.Set the max width of the tooltip that appears on the elements.Set the placement for the validation error notification labelSet to FeeSettingsSettings:ShadowShipped individuallyShop orderShowShow Final TotalShow Options TotalShow Unit price on totals boxShow attribute nameShow choice description inline.Show descriptionShow filtersShow imageShow image and descriptionShow image and labelShow image replacement in cart and checkoutShow image, label and descriptionShow labelShow label and descriptionShow metaShow prices inside select box choicesShow prices inside select box choices even if the prices are hiddenShow quantity selector only for elements with a valueShow reset buttonShow responsive valuesShow the Final total box even when the product has no extra optionsShow titleShow tooltipShow uploaded image in cart and checkoutShow using action hooksShow value onShow when the total is greater than zeroSign up feeSign up fee textSingle ProductSingle minified fileSizeSlider (wizard)Slider next textSlider previous textSmallSomething went wrong with WordPress.Something went wrong with the request!Sorry, this file type is not permitted for security reasons.SquareSquare 2StandardStart Animation delayStart adding elementsStart of the labelStart yearStep * priceStep valueStringsStrip html from emailsStyleStyle variationsStyled buttonSubscription sign up feeSubscription sign up fee textSubtitleSubtitle colorSubtitle positionSuffix labelSundaySwatch positionSync associated product quantity with main product quantitySystem styleTable nameTabsTaxTax class for Fee price typeTemplateTextText AreaText FieldText after PriceText before PriceText lengthText linkThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The delay until the animation starts in millisecondsThe description will appear under the title.The form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The installed version isThe item you are trying to move to the Trash no longer exists.The item you are trying to restore from the Trash no longer exists.The number of options the user has selectedThe php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. Please ask your hosting provider to enable this function.The purchase code is already activated on another domain!The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity for "%s" must be greater than 0 to be added to the cart.The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The quantity of this elementThe selected form does not contain any sectionsThe total quantity of this elementThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.The value length of this elementThe value of this elementThemeThere are no saved variations yet.There was an error saving the settings.Thin lineThis allows you to disable all selected months.This allows you to disable all selected weekdays.This allows you to generate points along the range picker.This changes the add to cart button on shop and archive pages to display select options when the product has extra product options. Enabling this will remove the ajax functionality.This controls how your fields are displayed on the front-end. If you choose "Show using action hooks" you have to manually write the code to your theme or plugin to display the fields and the placement settings below will not work. If you use the Composite Products extension you must leave this setting to "Normal" otherwise the extra options cannot be displayed on the composite product bundles. See more at the documentation.This determines the floating totals box visibility.This elementThis field is required textThis field is required.This is a translation ofThis is used to change the product image.This is where you can add new global options to your store.This item has already been deleted.This will add a button to clear the selected option.This will count as an empty value in case the element is required.This will divide the original price with the needed measurement.This will enable a floating box to display your totals box.This will exclude any global forms assigned to this product except those defined in the previous setting.This will globally override the product price with the price from the options if the total options price is greater then zero.This will hide the average price display on the cart for checkboxes.This will override the display method only for this product.This will override the product price with the price from the options if the total options price is greater then zero.This will override the time format above.This will override the totals box display only for this product.This will override which roles can see the options for this product.This will revert the option values to the default ones after adding the product to the cartThis will show a quantity selector for this option.ThumbnailsThumbnails multipleThursdayTimeTime formatTime picker styleTitleTitle optionsTitle:ToTo find out how to access your purchase code you can %sTo receive automatic updates license activation is required.To translate the strings for the local options please use WPML interface.TodayTooltipTooltip and Left sideTooltip and Right sideTooltip max widthTopTop leftTop of screenTop rightTotalTotal price as Unit PriceTotals box placementTotals box placement custom hookTotals box placement hook priorityTranslationsTrying to activate from an invalid IP address!Trying to activate from an invalid domain!Trying to activate from outside the plugin interface is not allowed!Trying to activate with an invalid purchase code for your token!Trying to upload files larger than %s is not allowed!TuesdayTurn off persistent cartType:URLUndiscounted product priceUndoUnique meta valuesUnit priceUnit price textUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUpdate cart textUploadUpload button styleUpload element inline Image previewUpload folderUpload managerUpload successfulUploading filesUploading files textUploading message textUrlUse URL replacementsUse WooCommerce valueUse allowed file types from WordPressUse custom imageUse field valueUse global settingUse image lightboxUse internal variation priceUse options cacheUse options caching for boosting performance. Disable if you have options that share the same unique ID.Use plus and minus signs on option pricesUse plus and minus signs on prices in cart and checkoutUse progressive display on optionsUse regular priceUse setting on each productUse the "From" string on displayed product pricesUse the image replacementsUse this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.Use translated values when possible on admin OrderUsernameUsing booking settingValidate asValueVariation #%1$s of %2$sVariation optionsVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView Global FormView TemplateView cartView detailsVisble after scrolling the pageVisit premium customer supportVisualWednesdayWhether to include specific products or categories.WidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce Measurement CalculatorWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYear - Day - MonthYear - Month - DayYear . Day . MonthYear . Month . DayYear / Day / MonthYear / Month / DayYesYes, but show priceYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item out of the Trash.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can generate an Envato Personal Token by %sYou can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot add negative priced products to the cart.You cannot add zero priced products to the cart.You cannot move this item to the Trash. %s is currently editing.You cannot select that date!You have already activated that purchase code on another domain!You have already activated your purchase code!Your Envato username.Your files are being uploadedYour settings have been reset.Your settings have been saved.and aautocharacters remainingclick this linkclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thangreater than or equal toh:mh:m:sh:m:ssh:mmh:mm:sh:mm:ssherehh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssisis emptyis notis not emptyjQuery selector for main product imagelabelless thanless than or equal toor register the plugin to receive automatic updates.ppost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>postsMine <span class="count">(%s)</span>Mine <span class="count">(%s)</span>postsSticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>sign-up feespanstarts withtimezoneProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:52+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: es_ES
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n != 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
"%s" es un campo necesario.%1$s &ndash; %2$s%1$s / %2$s%1$s cada %2$s%1$s ha sido retirado de su carrito porque desde entonces ha sido modificado. Puede agregarlo de nuevo a su carrito %2$s.%s no existe.%s ha sido actualizado.%s han sido actualizados.%s no es un archivo de imagen válido!post movido a la papelera.%s entradas movidos a la papelera.1 entrada no actualizada, alguien más está editándola.%s entradas no actualizadas, alguien más está editándolas.%s entradas eliminadas.%s entradas borradas permanentemente.1 entrada restaurada de la basura.%s entradas restauradas de la papelera.%s post actualizado.%s entradas actualizadas.%s eliminado junto con todos sus productos asociados!(Copiar)(Heredado)Tienda(Tamaño máximo de archivo %s)(sin título)Varios días a partir de hoy.Todas las categoriasTodos los productosArriba el campoURL absolutaAcordeónAccionesActivar licenciaAñadirAñadir opción adicionalAgregar formulario GlobalAñadir nuevo formulario globalAgregar nueva plantillaAgregar plantillaAgregar texto de botón en productos asociadosAgregue categorías para incluir todos sus productos asociados.Agregar elementoAñadir elemento en una nueva secciónAgregar elementoAñadir secciónAgregar separadorAgregue los productos individualmente.Añadir al carritoBotón de añadir al carritoBotón Agregar al carrito en el cuadro flotante de totalesAñadir traducción a %sTexto para Opciones AdicionalesOpciones adicionalesPantalla avanzadaOpciones avanzadasDespuésDespués de las opciones localesDespués del botón Añadir al carritoDespués del formulario del carritoDespués del productoDespués de la imagen del productoDespués del resumen del productoDespués del elementoTodoArchivos permitidosAlfanuméricoUnicode alfanuméricoUnicode alfanumérico o espacioModificar los datos estructurados de productos generadosAltera los datos estructurados del producto generados. ¡Esto puede producir resultados incorrectos si las opciones usan lógica condicional!Mostrar siempreUtilice siempre valores únicos en el carrito para los elementosSiempre visible¡Se ha producido un error!AnimaciónRetraso de la animaciónNingunaAnexar nuevos elementosSolicitado elAbril¿Está seguro de que quiere ducplicar este elemento?¿Estás seguro de que quieres eliminar este archivo?¿Está seguro de que desea eliminar esta carpeta y todo su contenido?¿Está seguro de que desea eliminar este artículo?¿Seguro que quieres eliminar esta opción?¿Está seguro de que desea restablecer la configuración?AscendenteAdjunte el precio al pedido haciéndolo independiente de la cantidad del producto.Adjuntar archivos de subida a correos electrónicosEtiqueta de atributoNombre de clase de elemento de atributoAtributo:Faltan atributos. BORRAR esta opción adicional:AgostoOcultar automáticamente el precio si es ceroEsperando imagen del productoTipo de precio base original segúnPrecio baseAntesAntes de las opciones localesAntes del botón Añadir al carritoAntes de agregar opciones adicionales en este modo, agregue y guarde algunos atributos en la pestaña Atributos.Antes de agregar opciones de productos adicionales, agregue y guarde algunos atributos en la pestaña Atributos.Antes del formulario del carritoAntes del productoAntes del Resumen del productoAntes del elementoDebajo del campoAbajoAbajo a la izquierdaParte inferior de la pantallaAbajo a la derechaCajaConstructorBotónBotón AltCDNAjustes CSSCódigo CSSCambio de texto del botón de cierre del calendarioReemplazo del texto del botón Calendario hoyCancelarNo se pueden aplicar reglas en este elemento o sección porque no hay elementos configurados de valor en otras secciones, o no se encontraron otras secciones.No se puede desactivar. ¡El código de compra no es válido para su clave de licencia guardada!CarritoVisualización del campo del carroCategoríasCentroCambiar el precio del producto originalCambiar el precio de variaciónCambia la imagen del productoCambiar esto solo afectará a futuras subidas.Texto para Caracteres restantesHaciendo trampa, ¿eh?Verifique el precio del producto vacíoMostrar selector de cantidad solo para artíclos con un valor.Marque esto solo si está recibiendo errores del servidor al finalizar la compra.Marque esto para modificar la visualización de precios de un producto cuando tenga opciones adicionales con precios.Marque esto para deshabilitar la visualización de la descripción como información sobre herramientas y mostrarla en línea.Marque esto para ocultar globalmente la visualización del precio si es cero.Marque esto para que el complemento se establezca en cero el precio del producto cuando esté vacío.Marque esto para incluir el precio de las opciones al precio del producto.Marque esto para multiplicar los precios de las opciones del cuadro de selección con su selector de cantidad, si lo hubiera.Marque esto para mostrar el botón Agregar al carrito solo cuando se complete al menos una opción.Marque esto para mostrar el precio de las opciones del cuadro de selección si el tipo de precio es fijo e incluso si el elemento oculta el precio.Marque esto para mostrar el precio de las opciones del cuadro de selección si el tipo de precio es fijo.Comprobar si se han añadido ficheros para subir en los correos electrónicos.Marque para deshabilitar el envío de opciones a correos electrónicos.Marque para deshabilitar el desplazamiento al elemento con un errorMarque para deshabilitar la conversión a png para cargas de imágenes.Marque para habilitar la funcionalidad de metadatos heredados.Marque para habilitar la visualización de opciones adicionales en la página de la tienda y la vista de categoría. Esta configuración depende del tema y es posible que algunos aspectos no funcionen como se esperaba.Marque para habilitar la visualización del total final no descontadoMarque para habilitar la inclusión de precios de opciones en la tabla de precios.Marque para habilitar la función de validación para los elementos del constructorMarque para sobrescribir el precio del producto original cuando el precio esté cambiando.Marque para sobrescribir el precio de variación cuando el precio esté cambiando.Activar para eliminar la etiqueta del precio cuando el producto tiene opciones extra con variación de precioMarque para dividir elementos con varios valores en líneas únicas.Marque para quitar las etiquetas html de los correos electrónicosCheckboxCasillas de verificaciónComprobadoPagarSelecione um valorElige una opciónElija cómo determinar el separador decimal para las entradas de usuarioElija cómo desea que se muestre el signo de los precios de las opciones en la página de producto.Elija cómo desea que se muestre el signo de los precios de las opciones en el carrito y en el pago.Elija la imagen para la caja de luz.Elija la imagen para reemplazar la imagen del producto.Elija la imagen para usar en lugar de la casilla de verificación cuando esté marcada.Elegir la imagen a utilizar en lugar de casilla de verificación.Elegir la imagen a utilizar en lugar del botón de radio cuando está clicado.Elija la imagen para usar en lugar del botón de opción.Elija la clase de impuestos para el tipo de precio de tarifa en este elemento.Elija si el campo se validará con el método elegido.Elija si la opción está habilitada o no.Elija si el usuario debe rellenar este campo o no.Elija si desea cambiar la imagen del producto.Elija si desea habilitar la caja de luz en la imagen miniatura.Elija si desea ocultar la etiqueta del elemento en el carrito o no.Elija si desea ocultar la etiqueta del elemento en el cuadro de totales flotantes o no.Elija si ocultar la etiqueta del elemento en el orden o no.Elija si ocultar el valor del elemento en el carrito o no.Elija si desea ocultar el valor del elemento en el cuadro de totales flotantes o no.Elija si desea ocultar el valor del elemento en el orden o no.Elija si ocultar el precio o no.Elija si desea incluir impuestos para el tipo de precio Tarifa en este elemento.Elija si desea redirigir a una URL si la opción es hacer clic.Elige mostrar u ocultar nombre de atributo.Elija qué %s usará el elemento de fecha en los cálculos de backend o déjelo en blanco para la zona horaria del servidor.Elija qué separador decimal mostrar en los precios de las divisasLimpiarLimpiar todos los formularios globales adicionalesBotón Vaciar carritoHaga clic para activarClonar formularioLa clonación está prohibida.CerrarCerrar todoReemplazo del texto del botón CerrarColorSelector de colorMuestras de colorDebe colocarse en formato DD/MM/YYYY, (es decir dos digitos para el dia, otros dos para el mes y cuatro dígitos para el año.)Las fechas según su formato de fecha seleccionado separados por comas. (Dos dígitos para día, dos dígitos para el mes y cuatro dígitos para el año). Tenga en cuenta que esto anulará cualquier otra configuración!Lógica CondicionalConsentimientoContenidoColor del contenidoPosición del contenidoCopiarCosto¡No se pudo completar la solicitud!No se pudo actualizar publicación en la base de datosContarValor actualFormato de hora personalizadoAcción personalizada:Código PersonalizadoGancho personalizadoPrecio personalizadoPrecio personalizado (obligatorio)Estilo personalizadoTipos personalizadosDEV: varios archivosFechaCampo de fechaCampo de selector de fechaFormato de fechaSelector de FechasEstilo selector de fechaSelector de fechasPosición del selector de fechaTamaño del selector de fechaTema de selector de fechaDíaDía - mes - añoDía . Mes . AñoDía / mes / añoDesactivar licenciaDesactivado, pero el código de compra no se activó por alguna razón!DiciembrePor defectoProducto predeterminadoValor predeterminadoBorrarBorrar permanentementeEliminar todas las opcionesEliminar todas las opciones del productoEliminar elementoDescendenteDescripciónDeterminar por navegador localDígitosDeshabilitarDeshabilitar la exclusión de las opciones globalesDesactivar opciones al cambiar el estado del pedidoDeshabilitar conversión de seguridad de PNGDeshabilitar el desplazamiento de erroresDeshabilitar imágenes de carga diferidaDeshabilitar mesesDeshabilitar el envío de las opciones al guardar el pedidoDesactivar los días de la semanaDesactivadoDeshabitar fechasUsuarios deshabilitados para este formularioDescuentoColocación de cadenas de descuentoTipo de descuentoMostrarMostrar un enlace emergenteMuestre una etiqueta de prefijo en la página del producto.Muestre una etiqueta de sufijo en la página del producto.Mostrar comoMostrar ambos signosMostrar solo el signo menosVisualice el botón añadir al carrito en el cuadro flotante.Separador decimal mostradoDividir precio con medidaSeparadorTipo de divisorDocumentosHechoHaga doble clic en el botón de radio para eliminar su atributo seleccionado.Descarga la nueva versión de CodeCanyonDescargando paquete del mercado de Envato ...DesplegableMarcador de posición desplegableDuplicar ElementoDuplicar secciónDynamic Pricing and DiscountsPanel de control de la EPOAcción personalizada EPOAcción personalizadaEditarEditar elementoEditar formulario GlobalReemplazo de texto de Opciones de ediciónEditar secciónEditar plantillaEditar elementoEditar opcionesEditar precioEditar ajustesEditar la traducción de %sLógica condicional de elementosNombre de clase de elementoID de contenedor de elementoID de elementoElementosEmailVaciar carritoTexto de carro vacíoHabilitar la exclusión de las opciones globalesHabilitar el administrador de archivosHabilitar Total Final para todos los productosHabilitar la modificación de la tabla de preciosHabilitar casillas de verificación y estilos de radioHabilitar el botón de borrar opcionesActivar la Lógica Condicional para mostrar u ocultar este elemento.Activar la Lógica Condicional para mostrar u ocultar esta sección.Habilite descuentos en opciones adicionalesHabilitar opciones adicionales en la vista de la tienda y categoríaHabilite la vista previa en línea de la imagen que se cargará.Habilitar visualización total final originalHabilitar el complemento para los códigos cortos de WooCommerce¿Habilitar la visualización de puntos?Activar ventana emergente en las subidasHabilitar códigos cortos en cadenas de opcionesHabilitar mostrar precios de opciones en el pedidoHabilite esto bajo su propio riesgo, ya que no es posible calcular descuentos de opciones en la página de pedidos.Habilítelo si el producto tiene muchas opciones.Habilite esto si recibe un error 500 al intentar completar el pedido en la caja.Habilite esta configuración para mostrar una caja de total final en la página del producto, lo que permite a los clientes ver el costo total de su pedido, o desactívela para una página de producto simplificada.Habilite esto para agregar cualquier tarifa al precio unitarioHabilite esto para agregar el sufijo de impuestos de WooCommerce en el cuadro de totalesHabilite esto para deshabilitar la carga diferida de imágenes.Habilite esto para mostrar el precio unitario cuando el cuadro de totales esté visibleHabilite esto para ocultar la pestaña del constructor en la pantalla de edición del productoHabilite esto para ocultar la pestaña normal en la pantalla de edición del productoHabilite esto para ocultar la pestaña de configuración en la pantalla de edición del productoHabilite esto para precargar la imagen cuando use la función de caja de luz.Permite mostrar el total completo del producto, proporcionando a los clientes una visión clara del coste total.Habilite esta opción para mostrar el total específicamente para las opciones de producto seleccionadas.Habilite para que las cantidades de los productos asociados sean un múltiplo de la cantidad del producto principal.Habilite para desplazarse por la ventana gráfica hasta el elemento del producto.Habilite para mostrar la descripción del producto asociado.Habilite para mostrar la imagen del producto asociado.Habilite para mostrar el meta del producto asociado.Habilite para mostrar el precio del producto asociado.Habilite para mostrar el título del producto asociado.Habilitar mensaje de éxito de cargaHabilitar validaciónHabilitadoFechas habilitadasRoles habilitados para este formularioMuestra una ventana emergente cuando se realizan las subidas.Activa o desactiva el estilo adicional para casillas de verificación y botones de opción.Activa o desactiva el botón borrar carroActiva o desactiva la visualización de opciones en el carrito.Habilita la visualización de un botón de limpiar para este atributo.Habilitar esto permitirá el uso de códigos cortos y código HTML en la etiqueta de opciones y el texto de descripción.Habilitar esto también aplicará los descuentos de productos a las opciones adicionales.Al habilitar esto, se ocultará la dirección URL de cualquier archivo cargado mientras esté en el carrito y el checkout.Al habilitar esto, se ocultará la dirección URL de cualquier archivo cargado mientras esté en orden.Habilitar esto ocultará las opciones en la página del producto hasta que se inicialice JavaScript. Esta es una configuración a prueba de fallas y recomendamos que esté activa.Al habilitar esto, se cargarán los archivos del complemento en todas las páginas de WordPress. Úselo con precaución.Habilitar esto hará que las fechas seleccionables Mínimo y Máximo no cuenten los días de semana deshabilitados seleccionados.Habilitar esto multiplicará el precio de las opciones por el recuento de bloques.Habilitar esto multiplicará el precio de las opciones por el área calculada.Habilitar esto multiplicará el precio de las opciones por el recuento de personas.Habilitar esto separará los valores separados por comas para los elementos. Esto se usa principalmente para múltiples opciones de casillas de verificación.Al habilitar esto, se mostrarán las imágenes de los elementos que tienen un reemplazo de imagen.Al activar esto se mostrarán las imágenes subidas en el carrito y el pago.Fin de la etiquetaAño finalIngrese un selector de CSS para anular la etiqueta predeterminada donde se mostrará la cadena de descuento.Ingrese un mensaje que se usará en la ventana emergente después de hacer clic en el botón Agregar al carrito cuando haya campos de carga.Ingrese un número por encima de 0 para que el usuario seleccione al menos ese número de casillas de verificación o déjelo en blanco para el comportamiento predeterminado.Ingrese un número por encima de 0 para que el usuario seleccione el número exacto de casillas de verificación o déjelo en blanco para el comportamiento predeterminado.Ingrese un número superior a 0 para limitar la selección de la casilla de verificación o déjelo en blanco para el comportamiento predeterminado.Ingrese una cadena para indicar el estado requerido de un campo.Introduzca un texto para mostrar después del precio para este campo o dejarlo en blanco sin texto.Introduzca un texto para mostrar antes del precio para este campo o dejarlo en blanco sin texto.Ingrese un texto para indicar que se requiere un campo.Introduce un texto para reemplazar el texto de Opciones Adicionales cuando se utiliza la configuración de ventana emergente en el carrito.Introduce un texto para reemplazar el texto de Quedan tantos Caracteres, al usar un máximo de caracteres en el campo de texto o área de texto.Introduce un texto para cambiar el texto del botón de Cerrar en el calendario.Introduce un texto para reemplazar el texto del botón Cerrar cuando se utiliza la configuración de ventana emergente en el carrito.Introduce un texto para cambiar el texto Editar Opciones de texto en el carrito.Introduce un texto para cambiar la etiqueta de Gratis cuando el producto tiene opciones extra.Introduce un texto para cambiar el texto de Reiniciar opciones, cuando se usan variaciones personalizadas.Introduce un texto para cambiar el botón de texto Hoy, en el calendario.Introduce un texto para cambiar el texto de Subiendo Archivos, usado en la ventana emergente después de clicar el botón de añadir al carrito cuando se suben campos.Introduce un texto para reemplazar el botón de Añadir al Carrito cuando se usa la opción de Forzar Selección.Introduce un texto para el botón de Vaciar Carrito.Introduce un texto para cambiar el botón Siguiente para el slider.Introduce un texto para cambiar el botón Anterior para el slider.Ingrese un valor para los caracteres mínimos que debe ingresar el usuario.Introduzca un valor para ser aplicado al campo Cantidad automáticamente.Debe colocarse en formato DD/MM/YYYY, (es decir dos digitos para el dia, otros dos para el mes y cuatro dígitos para el año).Introduzca un valor que se aplicará al campo automáticamente.Ingrese un valor para limitar el número máximo de caracteres que puede ingresar el usuario.Introduzca un nombre de clase para agregar a este elemento de atributoIntroduzca un nombre de clase para agregar a este elementoIntroduzca un nombre de clase para agregar a esta secciónIngrese una identificación para el contenedor del elemento.Entrar  final de año.Ingrese el año de inicio.Ingrese el texto del total de tarifas o déjelo en blanco por defecto.Ingrese el texto total final o déjelo en blanco por defecto.Introduzca el texto Total de Opciones o dejar en blanco por defecto.Ingrese el texto de la tarifa de inscripción o déjelo en blanco por defecto.Ingrese el texto de la tarifa de suscripción a la suscripción o déjelo en blanco por defecto.Ingrese el texto del precio unitario o déjelo en blanco por defecto.Ingrese el texto Actualizar carrito cuando edite un producto.Escriba la cantidad de descuento del código.Introduzca el alto para mostrar elemento o deje en blanco alto automático.Ingrese el valor máximo.Ingrese el valor mínimo.Introduzca el número de valores para la visualización de puntos.Ingrese el marcador de posición para el menú desplegable.Introduzca el precio de este campo o déjelo en blanco sin precio.Introducir la cantidad de pasos.Introducir el precio de venta para este campo o dejarlo blanco para usar el precio por defecto.Introduzca el paso para el controlador.Escriba la hora en el formato siguiente: 8:00 amIntroduzca el ancho del elemento a mostrar o deje en blanco ancho automático.Introduce el título aquíToken personal de Envato¡Se superó el límite de velocidad de Envato! Por favor, inténtelo de nuevo más tarde.Epo NegroBlanco EpoError al conectarse a la API de Envato. Por favor, inténtelo de nuevo más tarde.Error al conectar con el servidor!Error al obtener los datos del servidor!Error al eliminar.Error al mover a la papelera.Error en la restauración de la papelera.Colocación de la etiqueta de errorError en la descompresión del paquete¡Error! No se puede conectar al sistema de ficherosError! Envato API errorTodosSelección exactaExcluir producto (s) del formularioExcluir productosExcluir discapacitadosProductos excluidosExpandir todoExpandir y contraer (inicio cerrado)Expandir y contraer (comenzar abierto)Exportar CSVExportar formularioColocación de opciones adicionalesColocación de gancho personalizado Opciones ExtraPrioridad de gancho personalizado Opciones ExtraOpciones extras del productoTarifas de Opciones de Producto ExtraConstructor de formulario para las Opciones de ProductoConfiguración Extra Opciones de ProductoCuota extraError al escribir el archivo en el disco.FebreroImporte de las tarifasTarifas de texto totalArchivo importado.Gestor de archivosAdministrador de archivos no es compatible con el servidor.Subida de archivo frenada por una extensión.Nombre del archivoFiltrar porCaja Total FinalTotalCaja total finalTexto de Precio totalCantidad fijaCantidad fija + opcionesCaja flotante de TotalesVisibilidad de la Caja de Totales flotanteForzar seleccionar opcionesTexto de la opción Forzar SelecciónBorrador del formulario actualizado.Formulario publicado.Formulario restaurado a la revisión %sFormulario guardado.Formulario programado para: %s.Formulario enviado.Formulario actualizado.Reemplazo de texto de precio gratuito¡Gratis!ViernesDesdeTamaño completoGeneralOpciones generalesConfiguración generalGlobalForma globalVariables globalesAnule globalmente el botón deshacer para los botones de opciónenH1H2H3H4H5H6H: mH:m:sH:m:ssH:mmH: mm: sH:mm:ssHH: mHH: m: sHH: m: ssHH:mmHH: mm: sHH:mm:ssColor del encabezadoPosición del encabezadoTitulo de encabezadoTipo de EncabezadoEncabezadoAlturaOcultarOcultar el modo de constructor en los productosOcultar el modo Normal en productosOcultar el precio medio del elemento de la casilla de verificaciónOcultar la etiqueta del elemento en el carritoOcultar etiqueta de elemento en ordenOcultar el valor del elemento en el carritoOcultar el valor del elemento en el cuadro flotante de totalesOcultar el valor del elemento en ordenOcultar opciones adicionales en el carritoOcultar filtrosOcultar opciones de anulación en los productosOcultar precioOcultar la URL del archivo de carga en el carrito y finalizar la compraOcultar la URL del archivo de carga en ordenLínea horizontalHoraCuánto tiempo tardará la animación en milisegundosAcepto que los datos de la licencia se transmitan al servidor de licencias.IDIcono del Tooltip a la IZQuierdaIcono del Tooltip a la DERechaSi está habilitado, el producto incluido no se envía con el producto principal.Si esto está habilitado, el producto incluido agregará su peso al producto principal.Si esto está habilitado, el producto incluido mantendrá su propio precio.Modo imagenReemplazo de imagenMuestras de imágenesImportar CSVImportando csv ...Importando datosIncluir tarifas sobre el precio unitarioIncluir formulario adicional GlobalMarque esto para incluir el precio de las opciones al precio del productoIncluir el impuesto por tipo de precio de tarifaIncluir el sufijo de cadena de impuestos en el cuadro de totalesAumentar el anchoIndica si la carga fue exitosa con un mensaje.Configuración de producto heredadaClase de impuesto inherente del productoInicializaciónModo en líneaSeparador decimal de entradaArchivo CSV inválido!Archivo CSV inválido.Acción invalida.¡Datos no válidos enviados!Datos incorrectos!¡Fecha ingresada no válida!Extensión de archivo no válidaNo es válido en método de importación utilizado.¡Solicitud no válida!No es válido el año de la fecha introducida!&ldquo;%s&rdquo;Artículos por fila (ordenadores de sobremesa y portátiles)Artículos por fila (panorama de Tabletas Galaxy)Artículos por fila (Samnsung Galaxy)Artículos por fila (Smartphones)Elementos por fila (Tabletas en horizontal)Elementos por fila (Tabletas en vertical)Artículos por fila (iPhone 5)Artículos por fila (iPhone 6 +)Artículos por fila (iPhone 6)Enero Código JavaScriptModo de inclusión de JavaScript y CSSJulioJunioEtiquetaSelector de etiquetas CSSOpciones de etiquetaColor de la etiquetaPosición de la etiquetaTipo de etiquetaIdiomaIdiomas de esta %sGrandeModo Plantilla del diseñoDéjelo en blanco para usar la etiqueta de atributo original.Deja en blanco para el valor predeterminadoDéjelo en blanco para calcularlo automáticamente a partir del precio %sDéjelo en blanco para calcularlo automáticamente a partir del %s precio de ofertaIzquierdaA la izquierda del campoA la Izquierda de la etiquetaLado izquierdoMetadatos heredadosSolo letrasSolo letras o espacioLicenciaLicencia activada!Licencia activada.Licencia desactivada!Limitar la selecciónCargando…LocalUsuarios conectadosM j, Y @ H:iMantener el pesoHacer que el precio total no se multiplique por la cantidad del productoMarzoAñadir en masaFórmula matemáticaValor máximoCaracteres máximosMáximo de caracteres para campo de texto y áreas de textoAlto máximo de la imagenAncho máximo de la imagenCantidad máximaFecha máxima seleccionable para una reservaTiempo máximo seleccionableMayoMedianoOrden del menúValor mínimoCaracteres mínimosCaracteres mínimos para campos de texto y áreas de textoCantidad mínimaSeleccionar fecha mínimaTiempo mínimo seleccionableSelección mínimaMinutoFalta una carpeta temporal.LunesMesMes - día - añoMes . Día . AñoMes / día / añoMás información sobre %sMover Mensaje Sin StockMover a la PapeleraVarios archivos minificadosMultiplicar el precio por el numero de bloquesMultiplicar el coste por personaMultiplica el costo de las opciones por áreaMultiplique los precios dentro de las opciones del cuadro de selección con su selector de cantidadN/ANombreNuevo Formulario GlobalNueva PlantillaSiguienteNoNingún formulario Global encontradoNingún formulario Global encontrado en la basuraNo se encontró ninguna plantillaNo se encontró ninguna plantilla en la papeleraSin cambioArchivo no encontrado.No se ha subido ningún archivo.Sin texto de productos con precio negativoNo se han encontrado variaciones guardadas.Sin validaciónNo hay texto de productos con precio ceroMostrar u ocultar precio enNingunoNormalNormal (claro)Botón del navegador normalPantalla normalNoviembreNúmeroNúmero de puntosOctubreSolo ingrese código CSS puro sin etiquetas y estiloSolo ingrese código JavaScript puro sin etiquetas de scriptAbiertoOpciónOpciones cuota de suscripciónCosto extra¡Opciones guardadas!Opciones de texto totalOrdenOrdenar porPrecio original del productoOtros elementosAnular el cuadro total finalAnular roles habilitados para este productoAnular la visualización globalAnular el precio del productoSobrescribir elementos existentesRellenoFormulario Global PadrePorcentaje del precio originalPorcentaje del precio original + opcionesPorcentaje del precio original por palabraPorcentaje del precio original por palabra (sin n-ésimo carácter)PorcentajeCantidad de píxeles necesaria para desplazarseMarcador de posiciónColocaciónPor favor, introduzca un múltiplo de {0}.Por favor, introduzca una URL válido.Por favor, introduce una dirección de correo electrónico válida.Por favor escribe un número válido.Por favor introduzca un valor mayor o igual a {0}.Por favor introduzca un valor menor o igual a {0}.Ingrese al menos {0} carácter.Por favor introduzca al menos {0} caracteres.No ingrese más de {0} carácter.No ingrese más de {0} caracteres.Por favor, introduzca solo números.Por favor, introduzca sólo letras y espacios.Ingrese solo letras, números o guiones bajos.Por favor, introduzca sólo letras.Introduzca solo letras y números Unicode.Por favor introduzca sólo letras, números o espacios.Complete todos los campos antes de intentar activar.¡Tenga en cuenta que si las opciones del Pedido cambian o se eliminan, obtendrá resultados incorrectos al habilitar esto!¡Guarde el formulario antes de importar opciones!¡Guarde el producto antes de importar opciones!Seleccione al menos {0} opción.Por favor, seleccione al menos {0} opciones.Seleccione exactamente la opción {0}.Por favor, seleccione exactamente {0} opciones.Seleccione hasta {0} opción.Por favor, seleccione hasta {0} opciones.Ventana EmergentePoblarRellenar opcionesPosiciónPrefijo de EtiquetaImágenes de preload lightboxSoporte de pagoAnteriorEvite agregar al carrito productos con precio negativo.Evite agregar al carrito productos con precio cero.Evitar productos con precios negativosEvitar que se envíen opciones a los correos electrónicosEvitar productos de precio ceroPrecioTipo de PrecioPrecio por intervaloPrecio por personajePrecio por filaPrecio por palabraPrecio por palabra (sin n-th char)%1$s &ndash; %2$s%1$s&ndash;%2$sTipo de precioPrecio:Precio individualPreciosPrioridadProductoReemplazar imagen del productoDesplazamiento de desplazamiento del elemento de productoModo de reemplazo de imagen de productoPágina de productoCantidad de productosProductosProductos y CategoríasPublicarCódigo de compraCantidadCantidadCantidad Valor predeterminadoCantidad valor máximoCantidad de valor mínimoSelector de cantidadPaso de cantidadBotón de radio deshacer botónBotones de selección (radio)Botones Radio e imagen al final de la etiquetaBotones Radio e imagen al principio de la etiquetaAleatorioRangoSelector de rangoRegularURL relativaEliminarQuite la etiqueta de libre precioEliminar el texto del botón en productos asociadosEliminar esta imagen.Indicador de estado requeridoPosición requerida del indicador de estadoTexto para Opciones de ReiniciarRestablecer los valores de las opciones después de agregar el producto al carritoResetear opcionesReiniciar ajustesDerechaA la derechaDerecho de la etiquetaLado derechoRolesRedondoRedondo 2Ejecutar el actualizadorSKU:VentaPrecio de ventaSábadoGuardarGuardar cambiosGuardando datos, espere por favor.Desplácese hasta el elemento del producto al seleccionarloFormulario global de búsquedaPlantilla de búsquedaBuscar por un producto ...Buscar un producto&hellip;SegundoSecciónSección Lógica condicionalNombre de clase de secciónID de SecciónColocación de la secciónSección estilo de botón emergenteEstilo de secciónTipo de secciónSeleccionarCaja de selecciónSeleccione un productoSeleccione un estilo para las casillas de verificación y los botones de opciónSeleccione un estilo para el borde seleccionado cuando utilice reemplazos de imágenes o muestras.Seleccione una imagen para este término.Caja de selecciónSeleccionar cajasSeleccionar categoríasSeleccione los tipos de archivos personalizados que el usuario podrá cargar separados por comas.Seleccionar archivoSeleccionar texto de archivoSeleccionar tipos de archivosSeleccione cómo se presentarán los productos.Seleccione como mostrar los campos en el carritoSeleccione cómo incluir archivos JS y CSSSeleccione cómo mostrar el valor del selector de rango.Seleccione modoSeleccionar opcionesSeleccionar productosSelecciona plantillaSeleccione la prioridad del gancho de colocación de Opciones adicionalesSeleccione el (los) producto (s) para aplicar las opcionesSeleccione la prioridad del gancho de colocación del cuadro TotalesSelecciona el color a usar.Seleccione el tipo de descuento. El descuento se aplica al precio del producto final. Si el producto tiene opciones adicionales, el descuento se aplica al monto después de que las opciones se hayan agregado al precio del producto.Seleccione cómo se mostrará este atributo.Seleccione la imagen que reemplazará la del producto.Seleccione la cantidad de píxeles que la página necesita para desplazarse para que los totales flotantes sean visibles.Seleccione el parámetro por el que se ordenarán los productos.Seleccione la ubicación del indicador de estado requeridoSeleccione la ubicación de la cadena con descuento en comparación con la etiqueta.Seleccione la posición de la datepicker (selector de fechas).Seleccione la posición de la timepicker (selector de horas).Seleccione el producto que será preseleccionado.Seleccione los roles que tendrán acceso a las opciones adicionales.Seleccione los roles que no tendrán acceso a las opciones adicionales.Selecciona el Tamaño de DatePicker.Seleccione el tamaño del selector de tiempo.Seleccione el orden de clasificación de los productos.Seleccione el tema para el selector de fechas.Seleccione el tema para el selector de tiempo.Seleccione el estilo de visualización de esta sección.Seleccione el tipo  de visualización de esta sección.Seleccione el estilo del botón emergente de esta sección.Seleccione dónde desea colocar el cuadro de Total.Seleccione dónde desea colocar las opciones extras.Seleccione los tipos de archivos que el usuario podrá cargar.Auto-ModoSeptiembreConfigure el modo de imagen que se utilizará para varias funciones relacionadas con la imagen.Establezca el ancho máximo de la información sobre herramientas que aparece en los elementos.Establecer la ubicación de la etiqueta de notificación de error de validaciónEstablecer como tarifaAjustesAjustes:SombraEnviado individualmentePedidoMostrarMostrar total finalMostrar opciones TotalMostrar precio unitario en la casilla de totalesMostrar nombre de atributoMuestra la descripción de la elección en línea.Mostrar descripciónMostrar filtrosMostrar imagenMostrar imagen y descripciónMostrar imagen y etiquetaMostrar el reemplazo de la imagen en el carrito y pagarMostrar imagen, etiqueta y descripciónMostrar etiquetaMostrar etiqueta y descripciónMostrar metaMostrar precios dentro de las opciones del cuadro de selecciónMostrar precios dentro de las opciones de la casilla de selección incluso si los precios están ocultosMostrar selector de cantidad solo para artículos con un valorMostrar botón limpiarMuestre valores receptivosMuestre la casilla Total final incluso cuando el producto no tenga opciones adicionalesMostrar títuloMostrar tooltipMostrar la imagen cargada en el carrito y finalizar la compraMostrar el uso de ganchos de acciónMostrar valor enMostrar cuando el total es mayor que ceroCuota de inscripciónTexto de tarifa de registroProducto IndividualArchivo minificado únicoTamañoControl deslizante (asistente)Texto siguiente del control deslizanteTexto anterior del control deslizantePequeñoAlgo salió mal con WordPress.¡Algo salió mal con la solicitud!Lo sentimos, este tipo de archivo no está permitido por razones de seguridad.CuadradoCuadrado 2EstándarRetraso de inicio de animaciónComience a agregar elementosInicio de la etiquetaAño de inicioPaso * precioValor de pasoTodas las cadenasEliminar html de los correos electrónicosEstiloVariaciones de estiloBotón con estiloTarifa de suscripción a la suscripciónTexto de la tarifa de suscripción a la suscripciónSubtítuloColor del SubtítuloPosición del subtítuloEtiqueta de sufijoDomingoPosición de la muestraSincronizar la cantidad de producto asociada con la cantidad de producto principalEstilo del sistemaNombre de la TablaPestañasImpuestosClase de impuestos para el tipo de precio de tarifaPlantillaTextoÁrea de textoCampo de textoTexto después del precioTexto antes del precioLongitud del textoTexto linkEse nombre de usuario no es válido para este código de compra de artículo. Asegúrese de haber ingresado el nombre de usuario correcto (distingue entre mayúsculas y minúsculas).El retraso hasta que comienza la animación en milisegundosLa descripción aparecerá debajo del título.El formulario se aplica a todos los productosEl formulario no se aplica a ningún productoLos formularios que elija se mostrarán junto con los formularios que ya tiene el producto.La versión instalada del tema activoEl artículo que intenta mover a papelera, ya no existe.El artículo que usted está tratando de restaurar  desde la papelera,  ya no existe.La cantidad de opciones que el usuario ha seleccionadoLas funciones php mb_detect_encoding y mb_convert_encoding son necesarias para importar y exportar archivos CSV. Pídale a su proveedor de alojamiento que habilite esta función.¡El código de compra ya está activado en otro dominio!¡El código de compra ya está activado!¡El código de compra ya está activado! ¡Compre una licencia válida!La cantidad de "%s" debe ser mayor que 0 que se añadirá al carrito.La cantidad de &quot;%1$s&quot; no puede ser más de %2$d.La cantidad de &quot;%1$s&quot;  no puede ser menos de %2$d.La cantidad de este elementoEl formulario seleccionado, no tiene ninguna secciónLa cantidad total de este elementoEl archivo cargado excede el MAX_FILE_SIZE especificado en el formulario HTML.El archivo subido excede la directiva upload_max_filesize en php.ini.El archivo cargado sólo fue parcialmente subido.La longitud del valor de este elementoEl valor de este elementoTemaAún no hay variaciones guardadas.Ha habido un error al guardar los ajustes.Línea delgadaEsto le permite deshabilitar todos los meses seleccionados.Esto le permite desactivar todos los días de la semana seleccionados.Esto le permite generar puntos a lo largo del selector de rango.Esto cambia el botón Agregar al carrito en las páginas de tienda y archivo para mostrar opciones seleccionadas cuando el producto tiene opciones de producto adicionales. Habilitar esto eliminará la funcionalidad ajax.Esto controla cómo se muestran sus campos en la interfaz. Si elige "Mostrar usando ganchos de acción", debe escribir manualmente el código en su tema o complemento para mostrar los campos y la configuración de ubicación a continuación no funcionará. Si utiliza la extensión de productos compuestos, debe dejar esta configuración en "Normal"; de lo contrario, las opciones adicionales no se pueden mostrar en los paquetes de productos compuestos. Ver más en la documentación.Esto determina la visibilidad del cuadro de totales flotantes.Quitar elementoEste campo es texto obligatorioEste campo es obligatorio.Esta es una traducción deEsto se usa para cambiar la imagen del producto.Aquí es donde puede agregar nuevas opciones globales a su tienda.Este tema ya ha sido eliminado.Esto agregará un botón para borrar la opción seleccionada.Esto contará como un valor vacío en caso de que se requiera el elemento.Esto dividirá el precio original con la medida necesaria.Esto habilitará un cuadro flotante para mostrar su cuadro de totales.Esto excluirá cualquier formulario global asignado a este producto, excepto los definidos en la configuración anterior.Esto anulará globalmente el precio del producto con el precio de las opciones si el precio total de las opciones es mayor que cero.Esto ocultará la visualización del precio promedio en el carrito para las casillas de verificación.Esto anulará el método de visualización solo para este producto.Esto anulará el precio del producto con el precio de las opciones si el precio total de las opciones es mayor que cero.Esto anulará el formato de hora anterior.Esto anulará la visualización del cuadro de totales solo para este producto.Esto anulará qué roles pueden ver las opciones para este producto.Esto revertirá los valores de las opciones a los predeterminados después de agregar el producto al carritoEsto mostrará un selector de cantidad para esta opción.MiniaturasMiniaturas múltiplesJuevesHoraFormato de horaEstilo selector de tiempoTítuloOpciones de títuloTítulo:HastaPara saber cómo acceder a su código de compra, puede %sPara recibir actualizaciones automáticas se requiere la activación de la licencia.Para traducir las cadenas de las opciones locales, utilice la interfaz WPML.HoyTooltipDescripción Tooltip  a la izquierdaDescripción Tooltip  a la derechaAncho máximo de la informaciónArribaArriba a la izquierdaParte superior de la pantallaArriba a la derechaTotalPrecio total como precio unitarioUbicación de la caja de totalesGancho personalizado de colocación de caja de totalesPrioridad del gancho de colocación de la caja de totalesTraducciones¡Intentando activar desde una dirección IP no válida!Tratando de activar desde un dominio no válido!No se permite intentar activar desde fuera de la interfaz del plugin!¡Intentando activar con un código de compra no válido para su token!Archivos de más de%s que está tratando de subir no está permitido!MartesDesactivar carrito persistenteTipo:URLPrecio del producto sin descuentoDeshacerValores meta únicosPrecio unitarioTexto de precio unitarioTipo de Contenido desconocido.Se prohíbe la serialización de instancias de esta clase.ActualizarActualizar carritoActualizar el texto del carritoSubirCarregar estilo del botónCargar elemento de vista previa de la imagen en líneaCarpeta de cargaGestor de cargasSubida exitosaSubiendo archivosCarga de archivos de textoSubiendo el texto del mensajeUrlUsar reemplazos de URLUtilice el valor de WooCommerceUtilice los tipos de archivos permitidos de WordPressEstablecer imagen personalizadaUsar valor de campoUsar configuración globalUsar lightbox de imágenesUsar precio de variación internaUsar caché de opcionesUtilice el almacenamiento en caché de opciones para mejorar el rendimiento. Desactive si tiene opciones que comparten el mismo ID único.Use signos más y menos en los precios de las opcionesUse signos más y menos en los precios en el carrito y en la cajaUsar visualización progresiva en las opcionesUtilizar el precio regularUse el ajuste en cada productoUtilice  "De" en los precios de los productos mostradosUtilice los reemplazos de imágenesUtilice este campo para hacer una visualización de cuadrícula. Ingrese cuántos elementos por fila para la cuadrícula o déjelo en blanco para la visualización normal.Utilice los valores traducidos cuando sea posible en el pedido de administradorNombre de usuarioUsando la configuración de reservaValidarValorVariación #%1$s de %2$sOpciones de variaciónVariación:VariacionesVariosVer documentación de Extra Product OptionsVer configuración Extra Product OptionsVer formulario globalVer plantillaVer carritoVer detallesVisble después de desplazarse por la páginaVisitar el foro de soporte prémium para clientesVisualMiércolesYa sea para incluir productos o categorías específicos.AnchoWooCommerce BookingsReservas fáciles de WooCommerceCalculadora de Medidas de WoocommerceAjustes de VentasSuscripciones de WooCommerce¡WooCommerce no está habilitado!AñoAño - Día - MesAño - Mes - DíaAño. Día. MesAño. Mes. DíaAño / Día / MesAño/Mes/díaSíSi, pero mostrar precioNo está autorizado para borrar este elemento.Usted no está autorizado para editar este elemento.No puedes sacar este elemento de la Papelera.No se permite trasladar este elemento a la papelera.No está autorizado para restaurar este elemento de la Papelera.S'ha intentat editar un element inexistent. Potser va ser eliminat?Puede generar un token personal de Envato mediante %sNo puedes editar esto ya que está en la Papelera. Restáurala de la Papelera e inténtalo de nuevo.No se pueden agregar más opciones extra.No puede añadir productos con precio negativo.No puede agregar productos con precio cero al carrito.Este artículo se puede mover a la papelera. Actualmente está editando %s.¡No puede seleccionar esa fecha!¡Ya ha activado ese código de compra en otro dominio!¡Ya has activado tu código de compra!Su nombre de usuario Envato.Tus archivos han sido subidosSe han restablecido los ajustes.Tus opciones han sido guardadas.y unautocaracteres restanteshaz clic en este enlacehaciendo clic en este enlacedivCantidadtermina conarchivoarchivosmayor quemayor o igual queh: mh:m:sh:m:ssh:mmh: mm: sh:mm:ssaquíhh: mhh: m: shh: m: sshh:mmhh: mm: shh:mm:ssesestá vacíano esno está vacíoselector de jQuery para la imagen principal del productoetiquetamenor quees menor que o igual ao registre el complemento para recibir actualizaciones automáticas.pOpciones Extra de ProductoTodo <span class="count">(%s)</span>Todo <span class="count">(%s)</span>Mina <span class="count">(%s)</span>Mina <span class="count">(%s)</span>Adherente <span class="count">(%s)</span>Adherente <span class="count">(%s)</span>de pago inicialspancomienza conhuso horariolanguages/index.php000064400000000126150755142440010340 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
languages/woocommerce-tm-extra-product-options-fr_FR.mo000064400000433703150755142440017311 0ustar00����,slY8w9wSwewo�w��wn�xf	ydpyo�y|Ez�z*�z{8{\W{:�{B�{"2|5U|$�|�|�|
�|�|
�|�|}}"}.}	;}E}M}^}b}o}�}�}�}�}�}�}&�}8~H~T~q~z~(�~�~
�~�~%�~&)9c#y�������
�#�7�M�_�#c���������'ڀr�u�-������?Ձ	��/�3�
G�R�)X�*��D��*�,�,J�	w�L��΃���
�4$�Y�`�x�%��
����DŽ܄]��XT�����ͅ���#�'�.�:�K�X�\�d�
k�v�z���&��&��ކ��It���Ç
և����.3�b�|���<����=k�Y��R�>V�<��fҊM9�i��F�^8�Y��P�OB�\��S�RC�z��R�'d�3��7��9��?2�/r����;>�Dz�M��O
�7]�I��Bߒ?"�:b�(��Ɠ
ϓړ�����(�=A�S�TӔ"(�3K�D�1ĕH��5?�8u�F��,��8"�+[�7��<��K��=H�<��KØ=�(M�Av�;��2�i'�<��Κ!Ԛ���
�#�2�H�	N�X�v�|��������Ԝ#�
�
� �/�
7�E�V�[�`�%|���
����ɝ؝�����"�/�D�
I�T�j�v���
������ÞԞ؞����E$�j�s�{�
������Ÿɟܟ!��
�(�4�O�V�^�#m�&����ՠ"��)�B�1Q�9����Ρס���
&�4�<�'R�'z�
������/آ�$�B�J��W�ܣ�?�$&�)K�u�~�������Ӥ������/�A�_�
l�	z���
��
������˥�����
/�:�C�
I�T�d�"k���'��ʦݦ!���",� O�p�<��<ɧ!�.(�9W���#��Ш(�� 0�Q�$a�)��f��0�]H�?�����}�-*�JX�?��+�D�>T�=��?ѭA�qS�FŮg�5t�9��3�2�3K�i�3��1�O�a�
i�w�'��C��)��7)�9a�H��n�gS�L��P�DY����R2�y��A��EA�B��sʶ2>�Nq�A����_�=|�l��w'�s��\�9p�U��V�2W�^��r�>\�X��:�L/�L|�Nɽ>��W�C�@$�We�\��3�GN�H��]�Y=�8��<�F
��T�=��T�@m����7R�A��:��0�08�-i�����5��6��<,�8i�6��C��5�3S�g����-
�-8�Ff�����$��2�'7�>_���N����%�,��D���*�3@�	t�	~���7����#����3�R�h�"�������� ����	��'�%9�
_�"j�"��
������#��%�")�L�/b�i��O��L�"g���	�������������1�@�-M�!{���	���������������%�9�X�m�����!��������
��+�;�A�H�M�V�^�n��������3���������
�
����!�&�-�5�:�A�I�O�W�`�m�}�����������2��;��/7�g�5��>��2��,�#J�Vn���)��
�:&�a�)|�������"��

��)(�R�p���0��H������J'�Xr�M��P�Dj�
������
��(��� �/�J�j�'����'��:��2�6A�x���������������$�
<�J�`�w�����$��$��(	�2�R�!n� �����������!�9�>�C�I�
\�j�v�
����������0����>�CM�'��������	������
� �(�;�N�c�s����
����
������A���$�-�D�	Q�[�0n�����5�����-�E�]�a�
h�7s�	����0�����(�@�X�j�q���������������
��(�H�\�t�����D�����+�<�I�N�Q�e�z���������	����&� <�]�
x���������������������/�7O�������������������(�;�A�R�[�r���'��������
�'�/�B�V�f�'��+��;��H�:]�&��5����
��>�	J�&T�h{����#�B�2_�/��$��%��(
�)6�`�$z�2����.��5�1R�o��.��1#�"U�#x�!��"���� �"�)�2�%C�i�r�$����������4��0� O�)p�����
��������#�0*�"[�~�
������&��$�
%�0�7�K�S�\�d�0~�@�����-�:�K�]�f�~�
��������������
�����
1�+?�-k���������������)�;�M�c�u���������!�
�:)�
d�r���+�����
����
��%�*�
/�:�C�H�U�,l���������� �'�/�I�b�
u��������
�!���%�
,�7�3H�Q|���
���P-�~�����*��"�-��&)�1P����������0�*
�-5�c��|�*H�3s�_��:�4B�Dw�&��&��
&�-�<��'@�'
&2"Y"|)�$�$�$#8*\@� �/�2;L	�J�	�M�>59tE�8�E-=s
�:��	

&16GZx���#�
��+)!U
w�	��
�%�C�:	5J	�	�	C�	
�	�	(
.

F
(T
}
�
�
�
�
�
�
�
�

$&5<\���pB
I
R
[
q
�

�
�

�
�
�
�
�

�
8APbov;���
�>�%*.KT	Y
cn�	�
�{�14J,)�,�]aPz>�C
+NCz��!b9�'�C�1*E\<�;�Fb%/�'�*�"(ZKG�.� 6>u�"�*�S�'7	_/i1�:����3i������)};�6�,#GTkt�45Bj@�;�D* io ~� DX!E�!'�!<"uH")�"@�"D)#Qn#[�#3$
P$[$o$x$}$�$"�$�$
�$�$�$7�$<%IQ%�%�%�%�%�%�%�%
�%	&
&&-& B&"c&�&�&.�&*�&D'@G'5�'�'�'�'�'�'(	(
('(7(3J(~(�(�(�(�(#�(
�(�(�() )5)L)P)e)%{)�)�)�)�)�)*h*)�*7�*"�*++&+1B+t+s�+2,6,?,U,a,g,,
�,
�,�,(�,#�,�,
-
-	--7-D-d-�-	�-3�-�-�-�-"�- .5.O.k.p.�.�.�.�.�.�.�.(�.&#/7J/3�/8�/O�//?0/o00�0[�0&,14S10�16�1@�112@N2.�23�2.�2/!3-Q3.3�3�3�34 4&4+4@4P4c4"g4	�4�4�4�4�4�4�4�4�4�4�4�4�4�4�45	5555&5-5&:5a5	g5q54�5�5#�5$�5'6//6M_6O�6S�6Q7]7b7/n71�7�7��7�:�:�:y�:�Y;�5<��<�u=��=��>_?-r?#�?K�?�@G�@O�@*)A,TA(�A�A�A
�A�A�A/�AB3BEBUB
aBlBtB�B�B$�B�B#�B$C'0CXCsC5�CC�CD.DCD'XDG�D�D�D&�D/EJE\E=uE�E0�EFF$F6F=F$TFyF�F�F �F�F�F/G1GNG^G!vG:�G��GjHH|H�H�HY�H	JITIkIwI
�I�I.�I+�IGJ.MJ2|J:�J	�JX�J3MK�K.�K
�KF�KL=L"XL&{L�L�L�L#�L��LrpM�MNN2NFN/WN
�N�N�N�N�N�N�N
�N�N�N�N:O+COoO�wOj9P�P�P�P�P$�P �PQ6;Q!rQ�Q!�Q`�Q�4Ra�R?Sz�Sg:TT�T}�TauU��UN|V�VuKWq�Wc3X��X{Yl�Y�Zk�ZD[EI[E�[Q�[_'\N�\��\H�]W�]jO^h�^[#_P_G�_^`[w`,�`aaa	&a0aBaXa.ka\�ag�ak_b(�b6�bZ+c?�c[�c:"dL]dF�d2�d8$e(]e1�eY�eWfKjfH�f\�fV\g"�gj�g>Ah:�h��h@?i�i3�i�i�i�ijj4j;j,Gjtj|j�j��jZkfl'}l�l�l�l�l�lm*m1m(7m7`m�m�m"�m�m�m�mn#n?nSnhn�n
�n�n�n�n�n�n0
o.;o.jo�o�o�o�o�oS�o	HpRp^prp�p�p	�p �p�pq%q
AqLq#Xq|q�q(�q(�qA�q+%r)Qr6{r%�r �r�rGsVVs#�s�s�s&�st"!tDtSt\t.tt-�t�t�t!�tG!u%iu�u�u�u��u	xv�vM�v4�v/
w:wLwdwvw�w�w�w�wxx#xAx`x~x�x�x�x�x�x�x	y'#yKycy{y�y�y
�y�y�y�y	z*
z8z;Qz�z%�z2�z�z-{;>{'z{K�{K�{::|Nu|B�|+}03}'d}/�}"�}5�}~'+~GS~z�~:oQS����݀A��e�GS�C��P߂Z0�T��Z�V;�q��h�wm�C�8)�3b�2��1Ɇ���2��LJ3߇�+�3�"E�?h�a��5
�@@�G��_ɉ�)��ʊc^�]‹] ��~�lG�|��U1�c��Y��E�E�U,�]���
��k�Zr��͑�n������>:�iy�h�GL�z����R��w�P~�jϗx:�v��W*����UQ�X��{�l|�G�h1�j��A�wG�I��M	�WW����TR�t��B��_�8�aW�S��C
�CQ�;��Ѣ�S	�2]�Y��5�F �Zg�L¤P��`��F��FB�Y�����)�<A�-~�J��#��`�|����./�Y^���̩K�/�	8�B�KI� ��5���0
�<;�&x�+��;˫%�
-�;�(M�v�������:����.�/6�f�v�&��0��F�/,�(\�Q���׮o��-�25�8h���-����$�*&�+Q�}���C��<�)�8�D�Z�f�x�������ϲ-� �'>�$f���7��׳#��&�%>�d�y�����
��	������ϴ
ִ���9�E�H�K�N�Q�T�W�Z�^�d�k�p�w����������������ϵߵ�����-�P2�W��G۶'#�ZK�a��O�(X�;�����6L�8��;��[��0T�7��.��2��82�k�z�K��#޻��7�QS���!��ʼk�aU�W��O�C_�
����ľ۾4� �6�'O�,w�*��3Ͽ:�<>�G{��9�#�(6�_�n�z�����������1�	O�Y�o���E��-��%�15�@g�A�����(�F�O�'_������� ��������
�������:2�)m�<��E��6�Q�X�h�
{����������������,�;�@�X�k�������O����#�?�V�e�A������7��&5�\�n� ������
��d��)�8�:V�&������ ��
�� $�E�K�P�e�z���������*�/�K�*k�.��.��f��[�_�c�}�������'�� ��2��31�Ee���'�������"+�(N�'w���-��&����
�!�=�N�W�^�o�8w�@���������'�!E�g������������	����'-�.U�!����"������'�
G�U�&r�6��_��L0�;}�6��_��P�n�3z�����9��x�$��-��7��0�9=�9w�*��*��1�19�&k�6��&��'��&�&?�Of����LB�I��*��*�,/�,\�,��,��������:	�D�#M�<q�
��������:��A3�(u�5��-����&�;�O�Go�=��3��1)�[�p�G������������	 �*� 2�IS�R��1��*"�M�]�r�����������	��"�����/�K� a���
��9��9��
 �+�1�I�V�j�q�	~� ��7�������0�L�j�������+��3��L �m��� ��C����#�6�C�J�O�X�g�l�
r�������+��E��!�%?�e�z���������$���!�:�6T�����(����4��3�
C�Q�e�C~�y��<�+X���������
@�!N�#p�6��5��8�4:�Fo�������/��.�OD�=��;��%��4�4#�@X�t��B�=Q�W��B��+*��V�/�4L�H�����H��7��3�>N�)��,��D��))�4S�5��6��Q��4G�/|�Y��S�	Z�Vd�	��c�J)�Jt�b��J"�em�R�&�N8���������������0�F�*f�����6����$�+�HF�.����#���/�>�8O�b���R�!V� x�`�����K$�#p���1���!�# =^ey��3�,�R�gbhox,�#���
%-HNcs�
������V^mH���9�(
.<H`w
����#fC�)�,�4%oZ�R�O7	P�	6�	R
�b
97&qY�=�Q0<�<�G�D
'b
8�
,�
+�
$oAO�1&3JZ��2�C�>>�
�=LFL���9�D�
=K_t��1+M]K�E�'=ne��B�M�=IVO�q�ubV�M/(}E�o�3\I�L�c'c�<�
,7LRXl6�����D�I( Zr 
� 	� � !!	3!=!O!b!t!$z! �!(�!'�!"!"9?"7y"P�"L#JO#�#<�#�#�#!�#
$$
1$?$V$Al$�$�$�$�$#�$?%Y%i%�%�%"�%!�%�% �% &@@&!�&�&#�&#�&%'-'�B':�'Z	(1d(�(�('�(>�("/)�R);�)!*)>*h*|*�*�*�*
�*�*%�*8�*3+Q+q+�+�+'�+,�+�+�+F,N,V, k,!�,�,�, �,---2-G-\-q-�-�-+�-7�-E.JL.;�.a�.65/Al/A�/O�/=@0A~0G�0E1dN1)�1A�1/2>O27�27�29�2983!r3.�3(�3%�344424F4Z4^4c4r4z4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�4�45	
558%5^5	d5n5F�5�5�5�5�5(
6M66G�6S�6 747
973G78{7�7��&N���
�{��7����"!t���}�����J���$�����f�D�UJfa��$�t9��yzs����:�����@/!}'nD���m�����W������h%x���=��o�t��.>����&�� gK�\wX���:e��v�U��:j0�6��8��l�fjS�������`�������pY_u�BzR���K�I���A���a���|���{�*��.�*��K��r��<
�u=����2�X�����������93�G�k���B|����T�Br
���mpy���_F+[����4�;j]�Q������wN���y�LQ!���C���	��'�=hNO6�;���!;�I_a�D4 >K/�3i���W�
]��e��u�Z[]|:��}g���?+'��`2z0Q����[!����=tz��72U�~?&1�lc���e`a�T��'���v�+�Dz�lM����&�d�?�yl
UL�o*�����M�1Q���v��5�������|�g$���b�`�Rf�~<N"Y��W���M3g�kW�,�,�J74F������L�4~�M�)��h�x�d���%)qrSvw���50B-W.�b�2��5�g-�<����\1�^�����> <��#�wOh4����J����o9*x�V�FlR�J�ncdu)�#���v���O�+B�)�C��X.���Nr"(�T�Jk^5�7#�F�d/q@�|2p���^ �����0s�x��q�Iaa��O� .����/�,$�$�HG���8
<�=�g��9GlKLrm�n��V��]�A�\Gp�#>����x�B	Y�D�S^01eA�_�P���A?
�8Dy��+�,A#����L@"-E��q�����o1PQRSZf��,�6�{ETA�CX	���~�TV��6>�u4m	}K9kIs��%��3�ro�-�V
���+��u[t[����*{�|`.�8G:�sC
-�]����b0QqS�'`h(1�P��/��5�V�mt�&X����,�R�����b/����<L���������7��H_q:��OjE��Z=C��H	b�����bZ[���U	�H_����*�C�������Y2���iP�)^�;f��6MU�$�wj(3�d7��cI�cG������iFV������n��s;�p
E�h�i-
��\�k��Y��6(]�}{���N�?�Z���9!�{��Zi�w&��Y���>�jd��#���������E%3��nOy"�%���5��i����nx?�Eo�����I�����e���~����H�'�W��^�8����@
c������k�����~�%;\�\P�����������c���T�(SeR�����P�@}�z�Fsmv�MX��p����(�� @�8��H")�"%s" is a required field.%1$s &ndash; %2$s%1$s / %2$s%1$s every %2$s%1$s has been removed from your cart because it has since been modified. You can add it back to your cart %2$s.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been deactivated because it is not compatible with the current version of Extra Checkout Options.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires %3$sWooCommerce%4$s %5$s or later.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires PHP version %3$s or later.%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires WordPress %3$s or later.%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product Options & Add-Ons for WooCommerce.%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please update to the latest version.%s does not exist.%s has been updated.%s have been updated.%s is not a valid image file!%s post moved to the Trash.%s posts moved to the Trash.%s post not updated, somebody is editing it.%s posts not updated, somebody is editing them.%s post permanently deleted.%s posts permanently deleted.%s post restored from the Trash.%s posts restored from the Trash.%s post updated.%s posts updated.%s removed along with all of its associated products!&quot;%1$s&quot; (Instance ID: %2$s)(Copy)(Legacy)(No title)(max file size %s)(no title)A number of days from today.ALL categoriesALL productsAbove fieldAbsolute URLAccordionActionsActivate LicenseAddAdd ConstantAdd Extra OptionAdd Global FormAdd Lookup tableAdd New Global FormAdd New Lookup tableAdd New TemplateAdd TemplateAdd button text on associated productsAdd categories to include all their associated products.Add elementAdd element in a new sectionAdd itemAdd new condition groupAdd option cost to booking display priceAdd sectionAdd separatorAdd the products individually.Add the template you want to display.Add to cartAdd to cart buttonAdd to cart button on floating totals boxAdd translation to %sAdditional Options text replacementAdditional optionsAdvanced displayAdvanced optionsAfterAfter Local OptionsAfter add to cart buttonAfter cart formAfter productAfter product imageAfter product summaryAfter the elementAllAll &quot;%s&quot; Method InstancesAllowed file typesAlphanumericAlphanumeric UnicodeAlphanumeric Unicode or SpaceAlter generated product structured dataAlters the generated product structured data. This may produce wrong results if the options use conditional logic!Always showAlways use unique values on cart for elementsAlways visibleAn error has occurred!An error has occurred! Cannot apply conditions on this element!AnimationAnimation delayAnyAppend new elementsApplied onAprilAre you sure you want to clone this item?Are you sure you want to delete this file?Are you sure you want to delete this folder and all of its contents?Are you sure you want to delete this item?Are you sure you want to remove this option?Are you sure you want to reset the settings?AscendingAttach the price to the order making it independent of the product quantity.Attach upload files to emailsAttribute LabelAttribute element class nameAttribute:Attributes missing. Please DELETE this extra option:AugustAuto hide price if zeroAwaiting product imageBase original price type according toBase priceBeforeBefore Local OptionsBefore add to cart buttonBefore adding Extra Options in this mode, add and save some attributes on the Attributes tab.Before adding Extra Product Options, add and save some attributes on the Attributes tab.Before cart formBefore productBefore product summaryBefore the elementBelow fieldBind repeater with product quantityBottomBottom leftBottom of screenBottom rightBoxBuilderButtonButton AltCDNCSS SettingsCSS codeCalendar close button text replacementCalendar today button text replacementCancelCannot apply rules on this element or section since there are not any value configured elements on other sections, or no other sections found.Cannot deactivate. Purchase code is not valid for your saved license key!CartCart Field DisplayCategoriesCenterChange original product priceChange variation priceChanges product imageChanging this will only affect future uploads.Characters remaining textCheatin&#8217; uh?Check for empty product priceCheck show quantity selector only for elements with a value.Check this if you use Google Merchant Center. It will hide the price html of the element when you enable its hide price setting.Check this only if you are getting server errors on checkout.Check this to alter the price display of a product when it has extra options with prices.Check this to disable showing description as a tooltip and show it inline instead.Check this to force elements to be full width instead of auto.Check this to globally hide the price display if it is zero.Check this to globally trim zero in prices. This will be applied to native WooCommerce prices as well.Check this to have the plugin set to zero the product price when it is empty.Check this to hide the choice label when using the Show tooltip setting for radio buttons and checkboxes.Check this to include the pricing of the options to the product price.Check this to multiply the prices of the select box options with its quantity selector if any.Check this to show the Final total box only when all required visible options are filled.Check this to show the Final total box only when all visible options are filled.Check this to show the Final total box only when at least one option is filled.Check this to show the add to cart button only when all required visible options are filled.Check this to show the add to cart button only when all visible options are filled.Check this to show the add to cart button only when at least one option is filled.Check this to show the price of the select box options if the price type is fixed and even if the element hides the price.Check this to show the price of the select box options if the price type is fixed.Check to Attach upload files to emails.Check to disable options from being sent to emails.Check to disable scrolling to the element with an errorCheck to disable the conversion to png for image uploads.Check to display the options VAT amount above the options totalCheck to enable legacy meta data functionality.Check to enable the display of extra options on the shop page and category view. This setting is theme dependent and some aspects may not work as expected.Check to enable the display of the undiscounted final totalCheck to enable the inclusion of option prices to the pricing table.Check to enable the use of Jetpack cdn for the plugin images if it is active.Check to enable the use of WP Rocket cdn for the plugin images if it is active.Check to enable validation feature for builder elementsCheck to overwrite the original product price when the price is changing.Check to overwrite the variation price when the price is changing.Check to remove Free price label when product has extra optionsCheck to split items with multiple values to unique lines.Check to strip the html tags from emailsCheckboxCheckboxesCheckedCheckoutChoice labelChoose a valueChoose an optionChoose how the swatch will be displayed.Choose how to determine the decimal separator for user inputsChoose how you want the sign of options prices to be displayed at the product page.Choose how you want the sign of options prices to be displayed in cart and checkout.Choose the image for the lightbox.Choose the image to replace the product image with.Choose the image to use in place of the checkbox when it is checked.Choose the image to use in place of the checkbox.Choose the image to use in place of the radio button when it is checked.Choose the image to use in place of the radio button.Choose the tax class for Fee price type on this element.Choose whether the field will be validated against the choosen method.Choose whether the option is enabled or not.Choose whether the user must fill out this field or not.Choose whether to change the product image.Choose whether to enable the lightbox on the thumbnail.Choose whether to hide the element label in the cart or not.Choose whether to hide the element label in the floating totals box or not.Choose whether to hide the element label in the order or not.Choose whether to hide the element value in the cart or not.Choose whether to hide the element value in the floating totals box or not.Choose whether to hide the element value in the order or not.Choose whether to hide the price or not.Choose whether to include tax for Fee price type on this element.Choose whether to redirect to a URL if the option is click.Choose whether to show or hide the attribute name.Choose which %s the date element will use on the backend calculations or leave blank for server timezone.Choose which decimal separator to display on currency pricesClearClear all additional Global formsClear cart buttonClick to toggleClone formClone templateCloning is forbidden.CloseClose allClose button text replacementColorColor pickerColor swatchesComma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!Conditional LogicConnecting to activation server ...ConsentConstant nameConstant valueContentContent colorContent positionCopyCostCould not complete request!Could not update post in the databaseCountCurrent valueCustom Time formatCustom action:Custom codeCustom hookCustom priceCustom price (required)Custom styleCustom typesDEV - multiple filesDateDate fieldDate field and pickerDate formatDate pickerDate picker styleDatepickerDatepicker positionDatepicker sizeDatepicker themeDayDay - Month - YearDay . Month . YearDay / Month / YearDeactivate LicenseDeactivated, but the purchase code was not activated for some reason!DecemberDefaultDefault productDefault valueDefault value is 10Default value is 100DeleteDelete PermanentlyDelete all optionsDelete all options on the productDelete itemDescendingDescriptionDetermine by browser localDigitsDisableDisable AddonsDisable Exclude from Global OptionsDisable Options on Order status changeDisable PNG convert securityDisable Shipping MethodsDisable Shipping Methods ConditionDisable error scrollingDisable lazy load imagesDisable monthsDisable sending the options upon saving the orderDisable this for slow servers or large amounts of images.Disable weekdaysDisabledDisabled datesDisabled roles for this formDiscountDiscount string placementDiscount typeDisplayDisplay a pop-up linkDisplay a prefix label on product page.Display a suffix label on product page.Display asDisplay both signsDisplay only minus signDisplay the add to cart button on floating box.Displayed decimal separatorDivide price with measurementDividerDivider typeDo not change this unless you know how it will affect your site! This is the priority which the post types are loaded by the plugin.DocsDoneDouble click the radio button to remove its selected attribute.Download new version from CodeCanyonDownloading package from Envato market...DropdownDropdown PlaceholderDuplicate ElementDuplicate SectionDynamic Pricing & DiscountsEPO Control PanelEPO custom actionEcho a custom actionEditEdit ElementEdit Global FormEdit Lookup tableEdit Options text replacementEdit SectionEdit TemplateEdit itemEdit optionsEdit priceEdit settingsEdit tabEdit the %s translationElement Conditional LogicElement ID for xElement ID for yElement class nameElement container idElement idElementsEmailEmpty cartEmpty cart textEnableEnable Exclude from Global OptionsEnable File managerEnable Final total box for all productsEnable Jetpack CDNEnable Shipping MethodsEnable Shipping Methods ConditionEnable WP Rocket CDNEnable alteration of pricing tableEnable checkbox and radio stylesEnable clear options buttonEnable conditional logic for showing or hiding this element.Enable conditional logic for showing or hiding this section.Enable discounts on extra optionsEnable extra options in shop and category viewEnable inline preview of the image that will be uploaded.Enable options VAT displayEnable original final total displayEnable plugin backend interfaceEnable plugin for WooCommerce shortcodesEnable points display?Enable pop-up message on uploadsEnable repeaterEnable shortcodes in options stringsEnable showing option prices in the OrderEnable this at your own risk since it is not possible to calculate option discounts on the Order page.Enable this if the product has a lot of options.Enable this if you are getting a 500 error when trying to complete the order in the checkout.Enable this if you want the options to have responsive display.Enable this if your variable products have a lot of options to improve performance. Note that this may cause issues with discount or currency plugins.Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable this to add any Fees to the unit priceEnable this to add the WooCommerce Price display suffix on the totals box.Enable this to add the WooCommerce tax suffix on the totals boxEnable this to disable lazy loading images.Enable this to display the unit price when the totals box is visibleEnable this to hide the builder tab on the product edit screenEnable this to hide the normal tab on the product edit screenEnable this to hide the settings tab on the product edit screenEnable this to preload the image when using the lightbox feature.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.Enable to have the quantities of the associated products to be a multiple of the main product quantity.Enable to scroll the viewport to the product element.Enable to show the description of the associated product.Enable to show the image of the associated product.Enable to show the meta of the associated product.Enable to show the price of the associated product.Enable to show the quantity string even when the quantity is 1 and when the quantity selector is enabled.Enable to show the title of the associated product.Enable translationsEnable upload success messageEnable validationEnabledEnabled datesEnabled roles for this formEnables a pop-up when uploads are made.Enables or disables extra styling for checkboxes and radio buttons.Enables or disables the clear cart buttonEnables or disables the display of options in the cart.Enables the display of a reset button for this attribute.Enabling this will add the option prices to the calculated booking cost.Enabling this will add the saved addons to the subscription when using the order again functionality manually.Enabling this will allow the use of shortcodes and HTML code in the options label and description text.Enabling this will apply the product discounts to the extra options as well.Enabling this will hide the URL of any uploaded file while in cart and checkout.Enabling this will hide the URL of any uploaded file while in order.Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-safe setting and we recommend to be active.Enabling this will load the plugin files to all WordPress pages. Use with caution.Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected disabled weekdays.Enabling this will multiply the options price by the block count.Enabling this will multiply the options price by the calculated area.Enabling this will multiply the options price by the person count.Enabling this will separate comma separated values for elements. This is mainly used for multiple checkbox choices.Enabling this will show a tooltip over the choice.Enabling this will show the images of elements that have an image replacement.Enabling this will show the uploaded images in cart and checkout.End of the labelEnd yearEnter a CSS selector to override the default label where the discount string will be displayed.Enter a custom id to connect different radio button elements.Enter a message to be used in the pop-up after clicking the add to cart button when there are upload fields.Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for default behaviour.Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.Enter a string to indicate the required state of a field.Enter a text to display after the price for this field or leave it blank for no text.Enter a text to display before the price for this field or leave it blank for no text.Enter a text to indicate that a field is required.Enter a text to replace the Additional options text when using the pop up setting on the cart.Enter a text to replace the Characters remaining text when using maximum characters on a text field or a textarea.Enter a text to replace the Close button text on the calendar.Enter a text to replace the Close button text when using the pop up setting on the cart.Enter a text to replace the Edit options text on the cart.Enter a text to replace the Free price label when product has extra options.Enter a text to replace the Reset options text when using custom variations.Enter a text to replace the Select file text used in the styled upload button.Enter a text to replace the Today button text on the calendar.Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart button  when there are upload fields.Enter a text to replace the add button text on associated products.Enter a text to replace the add text button for repeater fields.Enter a text to replace the add to cart button text when using the Force select option.Enter a text to replace the default pop up button text. This will override the global value.Enter a text to replace the empty cart button text.Enter a text to replace the file text used in the styled upload button.Enter a text to replace the files text used in the styled upload button.Enter a text to replace the message when trying to add a negative priced product to the cart.Enter a text to replace the message when trying to add a zero priced product to the cart.Enter a text to replace the next button text for slider.Enter a text to replace the previous button text for slider.Enter a text to replace the remove button text on associated products.Enter a text to replace the topup section button text. Setting this to %s will make it so that the button text has the section title.Enter a value for the minimum characters the user must enter.Enter a value for the scroll offset when selecting a choice for the product element.Enter a value to be applied to the Quantity field automatically.Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).Enter a value to be applied to the field automatically.Enter a value to limit the maximum characters the user can enter.Enter an extra class name to add to this attribute elementEnter an extra class name to add to this elementEnter an extra class name to add to this sectionEnter an id for the container of the element.Enter ending year.Enter starting year.Enter the Fees total text or leave blank for default.Enter the Final total text or leave blank for default.Enter the Options VAT total text or leave blank for default.Enter the Options total text or leave blank for default.Enter the Sign up fee text or leave blank for default.Enter the Subscription sign up fee text or leave blank for default.Enter the Unit price text or leave blank for default.Enter the Update cart text when you edit a product.Enter the character that will be used to separate field labels from field values in the cart and order.Enter the discount amount.Enter the element id to use for the x column.Enter the element id to use for the y column.Enter the height of the displayed item or leave blank for auto height.Enter the maximum value.Enter the minimum value.Enter the number of Free characters.Enter the number of values for the points display.Enter the placeholder for the dropdown.Enter the price for this field or leave it blank for no price.Enter the quantity step.Enter the sale price for this field or leave it blankto use the default price.Enter the step for the handle.Enter the string that will be used to separate multiple values for a field that allows multiple selections in the cart and order.Enter the time the following format: 8:00 amEnter the width of the displayed item or leave blank for auto width.Enter title hereEnvato Personal TokenEnvato rate limit exceeded! Please try again later.Epo BlackEpo WhiteErrorError connecting to Envato API. Please try again later.Error connecting to server!Error getting data from the server!Error in deleting.Error in moving to Trash.Error in restoring from Trash.Error label placementError on unzipping packageError! Can't connect to filesystemError! Envato API errorEveryoneExact selectionExclude Product(s) from the formExclude ProductsExclude disabledExclude fromExcluded ProductsExlude Addon prices from the discountExpand allExpand and Collapse (start closed)Expand and Collapse (start opened)Export CSVExport formExtra Options placementExtra Options placement custom hookExtra Options placement hook priorityExtra Product Option #%1$s of %2$sExtra Product OptionsExtra Product Options & Add-Ons for WooCommerceExtra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra Checkout Options %s or later!.Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or later.Extra Product Options FeesExtra Product Options Form BuilderExtra Product Options SettingsExtra feeFailed to write file to disk.FebruaryFees amountFees total textField Label/value separatorFile imported with new tables.File imported.File managerFile manager is not supported on your server.File upload stopped by extension.FilenameFilter byFinal Total BoxFinal totalFinal total boxFinal total textFixed amountFixed amount + optionsFlat Rates (Legacy)Floating Totals boxFloating Totals box visibilityForce Select OptionsForce Select options textForm draft updated.Form published.Form restored to revision from %sForm saved.Form scheduled for: %s.Form submitted.Form updated.Free Price text replacementFree charactersFree!FridayFromFullsizeGeneralGeneral OptionsGeneral SettingsGlobalGlobal FormGlobal FormsGlobal variablesGlobally override the undo button for radio buttonsGoogle font: on or offonH1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssHeader colorHeader positionHeader titleHeader typeHeadingHeightHideHide Builder mode on productsHide Final total box until all elements are chosenHide Final total box until all required elements are chosenHide Final total box until an element is chosenHide Normal mode on productsHide add-to-cart button until all elements are chosenHide add-to-cart button until all required elements are chosenHide add-to-cart button until an element is chosenHide after scrolling the pageHide checkbox element average priceHide choice label when using the Show tooltip setting for radio buttons and checkboxesHide element label in cartHide element label in floating totals boxHide element label in orderHide element price html when hide price setting is enabledHide element value in cartHide element value in floating totals boxHide element value in orderHide extra options in cartHide filtersHide override settings on productsHide priceHide product inHide upload file URL in cart and checkoutHide upload file URL in orderHorizontal ruleHourHow long the animation will take in millisecondsI agree that the license data will be transmitted to the license server.IDIcon tooltip leftIcon tooltip rightIf this is enabled the discount will not be applied to the product addons.If this is enabled the included addons the associated product has will not be displayed.If this is enabled the included product is not shipped with the main product.If this is enabled the included product will add its weight to the main product.If this is enabled the included product will maintain its own price.Image modeImage replacementImage swatchesImport CSVImport one by clicking the button below.Importing csv...Importing dataInclude Fees on unit priceInclude additional Global formsInclude addons on order againInclude option pricing in product priceInclude tax for Fee price typeInclude tax string suffix on totals boxInclude the WooCommerce Price display suffix on totals boxIncrease WidthIndicates if the upload was successful with a message.Inherit product settingInherit product tax classInitializationInline modeInput decimal separatorInvalid CSV file!Invalid CSV file.Invalid CSV table!Invalid action.Invalid data submitted!Invalid data!Invalid date entered!Invalid file extensionInvalid import method used.Invalid request!Invalid year date entered!Item name in quotes&ldquo;%s&rdquo;Items per row (Desktops and laptops)Items per row (Galaxy Tablets landscape)Items per row (Samnsung Galaxy)Items per row (Smartphones)Items per row (Tablets landscape)Items per row (Tablets portrait)Items per row (iPhone 5)Items per row (iPhone 6 +)Items per row (iPhone 6)January JavaScript codeJavascript and CSS inclusion modeJulyJuneLabelLabel CSS selectorLabel OptionsLabel colorLabel positionLabel typeLanguageLanguage of this %sLargeLayout modeLeave blank to use the original attribute label.Leave empty for default valueLeave it blank to calculate it automatically from the %s priceLeave it blank to calculate it automatically from the %s sale priceLeave this blank for the default label.LeftLeft of the fieldLeft of the labelLeft sideLegacy meta dataLetters onlyLetters or Space onlyLicenseLicense activated!License activated.License deactivated!Limit selectionLoading ...LocaleLogged in usersLook up tableLookup tableLookup tablesM j, Y @ H:iMaintain weightMake the total price not being multiplied by the product quantityMarchMass addMath Formula ConstantsMath formulaMax valueMaximum charactersMaximum characters for text-field and text-areasMaximum image heightMaximum image widthMaximum number of combinations for price calcualtionsMaximum number of rows is {0}Maximum quantityMaximum selectable dateMaximum selectable timeMayMediumMenu OrderMeta data not correctly saved. Please save the product!Min valueMinimum charactersMinimum characters for text-field and text-areasMinimum number of rows is {0}Minimum quantityMinimum selectable dateMinimum selectable timeMinimum selectionMinuteMissing a temporary folder.MondayMonthMonth - Day - YearMonth . Day . YearMonth / Day / YearMore information about %sMove out of stock messageMove to TrashMulti-Select FieldMultiple field values separatorMultiple files textMultiple minified filesMultiply cost by block countMultiply cost by person countMultiply options cost by areaMultiply prices inside select box choices with its quantity selectorN/ANameNew Global FormNew Lookup tableNew TemplateNextNoNo CSV table found!No Global Form foundNo Global Form found in trashNo Lookup table foundNo Lookup table found in trashNo Template foundNo Template found in trashNo changeNo elements found!No file found.No file was uploaded.No negative priced products textNo saved variations found.No validationNo zero priced products textNo, but hide priceNoneNormalNormal (clear)Normal browser buttonNormal displayNovemberNumberNumber of pointsOctoberOnly enter pure CSS code without and style tagsOnly enter pure JavaScript code without and script tagsOpenOptionOption TemplateOption TemplatesOptions Subscription feeOptions VAT amountOptions VAT total textOptions amountOptions price modeOptions saved!Options total textOrderOrder and EmailsOrder byOriginal product priceOther elementsOverride Final total boxOverride enabled roles for this productOverride global displayOverride product priceOverwrite existing elementsOverwrite existing tablesPaddingParent Global FormParent Lookup tableParent TemplatePercent of the original pricePercent of the original price + optionsPercent of the original price per characterPercent of the original price per character (no first char)Percent of the original price per character (no n-th char and no spaces)Percent of the original price per character (no n-th char)Percent of the original price per wordPercent of the original price per word (no n-th char)Percent of the origιnal pricePercentagePixels amount needed to scrollPlaceholderPlacementPlease activate Extra Product Options.Please check the consent checkbox to give your permission to send your data to the server and try again.Please enter a multiple of {0}.Please enter a valid URL.Please enter a valid email address.Please enter a valid number.Please enter a value greater than or equal to {0}.Please enter a value less than or equal to {0}.Please enter at least {0} character.Please enter at least {0} characters.Please enter no more than {0} character.Please enter no more than {0} characters.Please enter only digits.Please enter only letters or spaces.Please enter only letters, numbers or underscores.Please enter only letters.Please enter only unicode letters and numbers.Please enter only unicode letters, numbers or spaces.Please fill all fields before trying to activate.Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!Please save the form before importing options!Please save the product before importing options!Please select at least {0} choice.Please select at least {0} choices.Please select exactly {0} choice.Please select exactly {0} choices.Please select up to {0} choice.Please select up to {0} choices.Pop upPopulatePopulate optionsPopup section button text replacementPositionPost type hook priorityPost types to show the saved optionsPrefix labelPreload lightbox imagesPremium SupportPrevPrevent adding to the cart negative priced products.Prevent adding to the cart zero priced products.Prevent negative priced productsPrevent options from being sent to emailsPrevent zero priced productsPricePrice TypePrice display overridePrice per IntervalPrice per characterPrice per character (no first char)Price per character (no n-th char and no spaces)Price per character (no n-th char)Price per character (no spaces)Price per rowPrice per wordPrice per word (no n-th char)Price range: from-to%1$s &ndash; %2$sPrice range: from-to%1$s&ndash;%2$sPrice typePrice:Priced individuallyPricingPriorityProductProduct Image replacementProduct element is not supported for components!Product element is not supported within another product element!Product element scroll offsetProduct image replacement modeProduct pageProduct quantityProduct variablesProductsProducts and CategoriesPublishPurchase codeQtyQuantityQuantity Default valueQuantity max valueQuantity min valueQuantity selectorQuantity stepRadio Button Connector IDRadio button undo buttonRadio buttonsRadio buttons and image at end of the labelRadio buttons and image at start of the labelRandomRangeRange pickerRecalculate image on changesReduce WidthRegularRelative URLRemoveRemove Free price labelRemove button text on associated productsRemove the image.Repeater Button LabelRepeater SettingsRepeater add textRepeater maximum limitRepeater minimum limitReplacement modeRequiredRequired state indicatorRequired state indicator positionReset Options text replacementReset option values after the product is added to the cartReset optionsReset settingsResponsive options structureRetrieve image sizes for image replacementsRightRight of the fieldRight of the labelRight sideRolesRoundRound 2Run the updaterSKU:SaleSale PriceSaturdaySaveSave changesSaving... Please wait.Scroll to the product element upon selectionSearch Global FormSearch Lookup tableSearch TemplateSearch for a category ...Search for a product ...Search for a product&hellip;SecondSectionSection Conditional LogicSection background colorSection class nameSection idSection label background colorSection placementSection pop up button styleSection pop up button textSection styleSection subtitle background colorSection typeSelectSelect BoxSelect a productSelect a style for the checkboxes and radio buttonsSelect a style for the selected border when using image replacements or swatches.Select a template ...Select an image for this term.Select boxSelect boxesSelect categoriesSelect custom file types the user will be allowed to upload separated by commas.Select fileSelect file textSelect file typesSelect how the products will be presented.Select how to display the element.Select how to display your fields in the cartSelect how to include JS and CSS filesSelect how to show the value of the range picker.Select modeSelect optionsSelect productsSelect shipping methods ...Select templateSelect the Extra Options placement hook prioritySelect the Product(s) to apply the optionsSelect the Totals box placement hook prioritySelect the color to use.Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.Select the display type of this attribute.Select the image to replace the product image with.Select the number of pixels the page needs to scroll for the floating totals to become visible.Select the parameter which the products will be sorted by.Select the placement of the Required state indicatorSelect the placement of the discounted string compared to the label.Select the position of the datepicker.Select the position of the timepicker.Select the post types where the plugin will modify the edit order screen to show the saved options. You can type in your custom post type.Select the price mode for the options.Select the product that will be pre-selected.Select the roles that will have access to the extra options.Select the roles that will have access to the plugin settings and the plugin interface while on the edit product page. The Admininstrator role always has access.Select the roles that will not have access to the extra options.Select the shipping methods to disable.Select the shipping methods to enable.Select the size of the datepicker.Select the size of the timepicker.Select the sorting order of the products.Select the theme for the datepicker.Select the theme for the timepicker.Select this section's display style.Select this section's display type.Select this section's pop up button style.Select where this section will appear compared to local Options.Select where to hide the productSelect where you want the Totals box to appear.Select where you want the extra options to appear.Select which file types the user will be allowed to upload.Self modeSelf mode replaces the actual image and Inline appends new image elements.SeptemberSet the image mode that will be used for various image related functionality.Set the max width of the tooltip that appears on the elements.Set the maximum height of the images that appear on cart.Set the maximum number of rows a user can add for the repeater field.Set the maximum width of the images that appear on cart.Set the minimum number of rows a user can add for the repeater field.Set the placement for the validation error notification labelSet to FeeSet to what price types will base their original price on.SettingsSettings:ShadowShipped individuallyShop orderShowShow Final TotalShow Options TotalShow Unit price on totals boxShow attribute nameShow choice description inline.Show descriptionShow filtersShow full width label for elements.Show imageShow image and descriptionShow image and labelShow image replacement in cart and checkoutShow image, label and descriptionShow labelShow label and descriptionShow metaShow only with an action hookShow priceShow prices inside select box choicesShow prices inside select box choices even if the prices are hiddenShow quantity 1Show quantity selector only for elements with a valueShow reset buttonShow responsive valuesShow the Final total box even when the product has no extra optionsShow titleShow tooltipShow uploaded image in cart and checkoutShow using action hooksShow value onShow when the total is greater than zeroSign up feeSign up fee textSingle ProductSingle file textSingle minified fileSizeSlider (wizard)Slider next textSlider previous textSmallSomething went wrong with WordPress.Something went wrong with the request!Sorry, this file type is not permitted for security reasons.Specify the conditions for disabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will not be available for customers to choose during checkout.Specify the conditions for enabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will be available for customers to choose during checkout.SquareSquare 2StandardStart Animation delayStart adding elementsStart of the labelStart yearStep * priceStep valueStringsStrip html from emailsStyleStyle variationsStyled buttonSubscription sign up feeSubscription sign up fee textSubtitleSubtitle colorSubtitle positionSuffix labelSundaySwatch positionSync associated product quantity with main product quantitySystem styleTable indexTable nameTable names are different. Do you want to override the tables?TabsTaxTax class for Fee price typeTemplateTextText AreaText FieldText after PriceText before PriceText lengthText linkText swatchesThat username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).The CSV file is invalid!The delay until the animation starts in millisecondsThe description will appear under the title.The form is being applied to all productsThe form isn't being applied to any productsThe forms you choose will be displayed alongside with the forms that the product already has.The installed version isThe item %s was removed from the cart because it had changed since it was added.The item you are trying to move to the Trash no longer exists.The item you are trying to restore from the Trash no longer exists.The number of options the user has selectedThe number of options the user has selected on the targeted elementThe php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. Please ask your hosting provider to enable this function.The price of the targeted elementThe purchase code is already activated on another domain!The purchase code is already activated!The purchase code is already activated! Please buy a valid license!The quantity for "%1$s" must be greater than %2$sThe quantity for "%s" must be greater than 0 to be added to the cart.The quantity of &quot;%1$s&quot; cannot be higher than %2$d.The quantity of &quot;%1$s&quot; cannot be lower than %2$d.The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d.The quantity of this elementThe raw value of the targeted elementThe selected form does not contain any sectionsThe text length of the targeted elementThe total quantity of the targeted elementThe total quantity of this elementThe uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.The uploaded file exceeds the upload_max_filesize directive in php.ini.The uploaded file was only partially uploaded.The value length of this elementThe value of the targeted element converted to a floatThe value of this elementThemeThere are no saved variations yet.There was an error importing the CSV file.There was an error saving the csv data. Please check the encoding of your csv file!There was an error saving the settings.Thin lineThis allows you to disable all selected months.This allows you to disable all selected weekdays.This allows you to generate points along the range picker.This changes the add to cart button on shop and archive pages to display select options when the product has extra product options. Enabling this will remove the ajax functionality.This controls how your fields are displayed on the front-end. If you choose "Show using action hooks" you have to manually write the code to your theme or plugin to display the fields and the placement settings below will not work. If you use the Composite Products extension you must leave this setting to "Normal" otherwise the extra options cannot be displayed on the composite product bundles. See more at the documentation.This determines the floating totals box visibility.This elementThis field is required textThis field is required.This is a translation ofThis is required on several gallery solutions that change the image html dynamically or if you want to control the image dynamically.This is used to change the product image.This is where you can add new global options to your store.This is where you can add new global template options.This is where you can add new lookup tables.This item has already been deleted.This moves the out of stock message when styled variations are used just below them.This setting controls the maximum number of combinations that the plugin will use to calculate minimum and maximum prices. A higher number of combinations will result in more accurate prices, but it will also take longer to calculate them. For products that can have many choice combinations, it is recommended to set a lower number of combinations to improve performance.This will add a button to clear the selected option.This will count as an empty value in case the element is required.This will divide the original price with the needed measurement.This will enable a floating box to display your totals box.This will enable the default plugin translation using the pot files.This will exclude any global forms assigned to this product except those defined in the previous setting.This will globally override the product price with the price from the options if the total options price is greater then zero.This will hide the average price display on the cart for checkboxes.This will make this element repeatable based on the product quantity.This will make this element repeatable.This will override the display method only for this product.This will override the product price with the price from the options if the total options price is greater then zero.This will override the time format above.This will override the totals box display only for this product.This will override which roles can see the options for this product.This will replace the displayed product price on shop/archive/product loop pages.This will revert the option values to the default ones after adding the product to the cartThis will show a quantity selector for this option.ThumbnailsThumbnails multipleThursdayTimeTime formatTime picker styleTimezone override for Date elementTitleTitle optionsTitle:ToTo find out how to access your purchase code you can %sTo receive automatic updates license activation is required.To translate the strings for the local options please use WPML interface.TodayTooltipTooltip and Left sideTooltip and Right sideTooltip max widthTopTop leftTop of screenTop rightTotalTotal price as Unit PriceTotals box placementTotals box placement custom hookTotals box placement hook priorityTranslationsTrim zeros in pricesTrying to activate from an invalid IP address!Trying to activate from an invalid domain!Trying to activate from outside the plugin interface is not allowed!Trying to activate with an invalid purchase code for your token!Trying to upload files larger than %s is not allowed!TuesdayTurn off persistent cartType:URLUndiscounted product priceUndoUnique meta valuesUnit priceUnit price textUnknown post type.Unserializing instances of this class is forbidden.UpdateUpdate cartUpdate cart textUploadUpload button styleUpload element inline Image previewUpload folderUpload managerUpload successfulUploading filesUploading files textUploading message textUrlUse URL replacementsUse WooCommerce valueUse allowed file types from WordPressUse custom imageUse field valueUse global settingUse image lightboxUse internal variation priceUse options cacheUse options caching for boosting performance. Disable if you have options that share the same unique ID.Use plus and minus signs on option pricesUse plus and minus signs on prices in cart and checkoutUse progressive display on optionsUse regular priceUse sale priceUse setting on each productUse the "From" string on displayed product pricesUse the image replacementsUse this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.Use translated values when possible on admin OrderUsernameUsing booking settingValidate asValueVariation #%1$s of %2$sVariation optionsVariation:VariationsVariousView Extra Product Options documentationView Extra Product Options settingsView Global FormView Lookup tableView TemplateView cartView detailsVisble after scrolling the pageVisit premium customer supportVisualWednesdayWhether to include specific products or categories.WidthWooCommerce BookingsWooCommerce Easy BookingsWooCommerce Measurement CalculatorWooCommerce SettingsWooCommerce SubscriptionsWooCommerce is not enabled!YearYear - Day - MonthYear - Month - DayYear . Day . MonthYear . Month . DayYear / Day / MonthYear / Month / DayYesYes, but show priceYou are not allowed to delete this item.You are not allowed to edit this item.You are not allowed to move this item out of the Trash.You are not allowed to move this item to the Trash.You are not allowed to restore this item from the Trash.You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?You can generate an Envato Personal Token by %sYou can only select up to %1$s choice for %2$s.You can only select up to %1$s choices for %2$s.You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.You cannot add any more extra options.You cannot add negative priced products to the cart.You cannot add zero priced products to the cart.You cannot enter more than %1$s characters for "%2$s".You cannot move this item to the Trash. %s is currently editing.You cannot select that date!You have already activated that purchase code on another domain!You have already activated your purchase code!You must enter at least %1$s characters for "%2$s".You must select at least %1$s choice for %2$s.You must select at least %1$s choices for %2$s.You must select exactly %1$s choice for %2$s.You must select exactly %1$s choices for %2$s.Your Envato username.Your files are being uploadedYour settings have been reset.Your settings have been saved.and aautocharacters remainingclick this linkclicking this linkdivelement quantity input tooltipQtyends withfilefilesgreater thangreater than or equal toh:mh:m:sh:m:ssh:mmh:mm:sh:mm:ssherehh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssisis emptyis notis not emptyjQuery selector for main product imagelabelless thanless than or equal toor register the plugin to receive automatic updates.ppost type general nameGlobal Formspost type general nameLookup tablespost type general nameOption Templatespost type general nameTM Extra Product OptionspostsAll <span class="count">(%s)</span>All <span class="count">(%s)</span>postsMine <span class="count">(%s)</span>Mine <span class="count">(%s)</span>postsSticky <span class="count">(%s)</span>Sticky <span class="count">(%s)</span>sign-up feespanstarts withthis field if the following conditions are met.this section if the following conditions are met.timezoneProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:52+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: fr_FR
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n > 1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
"%s" est un champ requis.%1$s &ndash; %2$s%1$s / %2$s%1$s tous les %2$s%1$s a été retiré de votre panier parce qu’il a depuis été modifié. Vous pouvez l’ajouter à votre panier %2$s.%1$s Important :%2$s Options de produit et modules complémentaires supplémentaires pour WooCommerce a été désactivé car il n’est pas compatible avec la version actuelle des options de paiement supplémentaires.%1$s Important :%2$s Options de produits supplémentaires et modules complémentaires pour WooCommerce nécessite %3$sWooCommerce%4$s %5$s ou une version ultérieure.%1$s Important : %2$s Options de produit supplémentaires et modules complémentaires pour WooCommerce nécessite la version %3$s ou ultérieure de PHP.%s Important : %s Les options supplémentaires des produits TM de WooCommerce requièrent WordPress %s. ou une version ultérieure.%1$s Important :%2$s Veuillez exécuter le programme de mise à jour de WooCommerce avant d’utiliser les options de produit supplémentaires et les modules complémentaires pour WooCommerce.%1$s Important :%2$s Votre version de WooCommerce Extra Checkout Options n’est pas prise en charge. Veuillez effectuer la mise à jour vers la dernière version.%s n’existe pas.%s a été mis à jour.%s posts mis à jour.%s est pas un fichier image valide!%s post déplacé dans la corbeille.%s posts déplacés dans la corbeille.%s non mis à jour, quelqu’un est en train de le modifier.%s posts non mis à jour, quelqu’un est en train de les modifier.%s post supprimé définitivement.%s posts supprimés définitivement.%s post restauré depuis la corbeille.%s posts restaurés depuis la corbeille.%s post mis à jour.%s posts mis à jour.%s enlevé avec tous ses produits associés!&quot;%1$s&quot; (ID d’instance: %2$s)(Copie)(Héritage)(Aucun titre)(max file size %s)(sans titre)Un nombre de jours à partir d’aujourd’hui.TOUTES les catégoriesTous les produitsDessus du champURL absolueAccordéonActionsActiver la LicenceAjouterAjouter une constanteAjouter des options supplémentairesAjouter un formulaire globalAjouter une table de correspondanceAjouter un nouveau formulaire globalAjouter une nouvelle table de rechercheAjouter un nouveau modèleAjouter un modèleAjouter du texte de bouton sur les produits associésAjouter des catégories pour inclure tous leurs produits associés.Ajout d’élémentAjouter un élément dans une nouvelle sectionAjouter un élémentAjouter un nouveau groupe de conditionsAjouter le coût de l’option au prix d’affichage de la réservationAjouter une sectionAjouter un séparateurAjouter les produits individuellement.Ajoutez le modèle que vous souhaitez afficher.Ajouter au panierBouton Ajouter au panierAjouter au panier le bouton des totaux de la boîte flottanteAjout de la traduction à %sRemplacement du texte des options additionnellesVoir les optionsAffichage avancéOptions avancéesAprèsAprès Options localesAprès le bouton d’ajout au panierAprès le formulaire du panierAprès le produitAprès l’image du produitAprès le récapitulatif produitAprès l’élémentToutToutes les &quot;%s&quot; instances de méthodeTypes de fichiers autorisésAlphanumériqueUnicode alphanumériqueUnicode ou espace alphanumériqueModifier les données structurées des produits générésModifie les données structurées du produit généré. Cela peut produire des résultats erronés si les options utilisent la logique conditionnelle!Toujours afficherUtilisez toujours des valeurs uniques sur le chariot pour les élémentsToujours visibleUne erreur est survenue !Une erreur s’est produite ! Impossible d’appliquer des conditions sur cet élément !AnimationVitesse de l'animationN’importeAjouter de nouveaux élémentsAppliqués àAvrilVoulez-vous vraiment dupliquer cet élément ?Voulez-vous vraiment supprimer ce fichier ?Voulez-vous vraiment supprimer ce dossier et tout ce qu’il contient ?Voulez-vous vraiment supprimer cet élément ?Êtes-vous sûr de vouloir supprimer cette option?Êtes-vous sûr de vouloir réinitialiser vos paramètres?AscendantAttachez le prix à la commande, ce qui le rend indépendant de la quantité du produit.Joindre des fichiers de téléchargement aux emailsAttribut du LabelNom de classe de l’attribut de l’élémentAttribut :Attributs manquants. Merci de SUPPRIMER cette option supplémentaire :AoûtCacher automatiquement le prix si le total est égal à zéroEn attente de l’image du produitType de prix d’origine de base selonPrix de baseAvantAvant Options localesAvant le bouton d’ajout au panierAvant d’ajouter des options supplémentaires dans ce mode, ajoutez et enregistrez certains attributs sur l’onglet Attributs.Avant d’ajouter des options supplémentaires, ajoutez et sauvegardez quelques attributs dans la table Attributs.Avant le formulaire du panierAvant le produitAvant le récapitulatif produitAvant l’élémentChamp du dessousRépéteur de liaison avec quantité de produitEn dessousEn bas à gaucheBas de l’écranEn bas à droiteBoiteConstructeurBoutonBouton AltCDNParamètres CSSCode CSSRemplacement du texte du bouton de fermeture du calendrierTexte du bouton Aujourd’hui du calendrierAnnulerVous ne pouvez pas appliquer les règles de cet élément ou de l’article car il n’y a pas d’éléments de valeur configurée sur d’autres sections, ou pas d’autres sections trouvés.Impossible de désactiver. Le code d’achat n’est pas valide pour votre clé de sauvegarde de licence !PanierAffichage du champ panierCatégoriesCentreChanger le prix d'origine du produitModifier le prix de la variationChanger l’image du produitChanger ceci n’affectera que vos futurs chargements.Caractères restant dans le texteOn essaye de tricher, hein ?Vérifier le prix du produit videCocher le sélecteur qui affiche les quantités uniquement pour les éléments ayant une valeur.Vérifiez cette case si vous utilisez Google Merchant Center. Il masquera le code html de prix de l’élément lorsque vous activez son paramètre de masquage de prix.Cochez cette case seulement si vous obtenez des erreurs de serveur sur lors du passage en caisse.Cochez cette case pour modifier l&#39;affichage de prix d&#39;un produit quand il a des options supplémentaires avec des prix.Cochez cette case pour désactiver l’affichage de la description comme une infobulle et montrez-le en ligne à la place.Cochez cette case pour forcer les éléments à être en pleine largeur au lieu d’être automatiques.Cocher ceci pour cacher globalement le prix affiché si le total est égal à zéro.Cochez cette case pour réduire globalement les prix à zéro. Cela s’appliquera également aux prix natifs de WooCommerce.Vérifiez ceci pour que le plugin soit réglé sur zéro le prix du produit lorsqu’il est vide.Cochez cette case pour masquer l’étiquette de choix lorsque vous utilisez le paramètre Afficher l’info-bulle pour les cases d’option et les cases à cocher.Cochez cette case pour inclure la tarification des options au prix du produit.Cochez cette case pour modifier l&#39;affichage de prix d&#39;un produit quand il a des options supplémentaires avec des prix.Cochez cette case pour afficher le total final uniquement lorsque toutes les options visibles requises sont remplies.Cochez cette case pour afficher la case Total final uniquement lorsque toutes les options visibles sont remplies.Cochez cette case pour afficher le total final uniquement lorsqu’au moins une option est remplie.Cochez cette case pour afficher le bouton d’ajout au panier uniquement lorsque toutes les options visibles requises sont remplies.Cochez cette case pour afficher le bouton d’ajout au panier uniquement lorsque toutes les options visibles sont remplies.Cocher ceci pour afficher le bouton d’ajout au panier seulement quand au moins une option est complétée.Cochez cette case pour afficher le prix des options de la boîte de sélection si le type de prix est fixe et même si l'élément masque le prix.Cochez cette case pour afficher le prix des options de la boîte de sélection si le type de prix est fixe.Vérifier d'avoir joint les fichiers de téléchargement aux emails.Cochez cette case pour désactiver les options d'envoi aux courriels.Cocher pour désactiver le défilement si l’élément à une erreurCochez pour désactiver la conversion en png pour les téléchargements d'images.Cochez cette case pour afficher le montant de la TVA des options au-dessus du total des optionsCochez cette case pour activer la fonctionnalité de métadonnées héritées.Cocher pour autoriser l’affichage des options supplémentaires sur la page shop et la vue des catégories. Ce paramètre dépend du thème et certains aspects pourraient ne pas fonctionner comme vous l’espérez.Cochez cette case pour activer l'affichage du total final non actualiséCochez pour permettre l’inscription des prix d’options à la table de tarification.Cochez cette case pour activer l’utilisation de Jetpack cdn pour les images du plug-in s’il est actif.Cochez la case pour activer l’utilisation de WP Rocket cdn pour les images du plugin s’il est actif.Cocher pour autoriser la validation de fonctionnalités pour le constructeur d’élémentsCochez pour écraser le prix d'origine du produit, lorsque le prix est variable.Cochez pour écraser la variation de prix lorsque le prix est variable.Cocher pour retirer le label de prix gratuit lorsque le produit a des options supplémentairesCochez cette case pour fractionner des éléments avec plusieurs valeurs en lignes uniques.Cocher pour filtrer les tags html des emailsCase à cocherCases à cocherCochéCommanderLinellé du choixChoisissez une valeurChoisir une optionChoisissez le mode d’affichage de la nuance.Choisir comment déterminer le séparateur de décimales pour les encodages des utilisateursChoisissez la façon dont vous souhaitez afficher le signe des prix d’options sur la page du produit.Choisissez comment vous voulez que le signe des prix d’options soit affiché dans le panier et la caisse.Choisissez l&#39;image pour la lightbox.Choisir l’image qui remplacera l’image du produit.Choisissez l’image à utiliser à la place de la case à cocher lorsqu’il est activé.Choisir l’image à utiliser à la place de la case à cocher.Choisissez l’image à utiliser à la place de la case d’option lorsqu’il est activé.Choisir l’image à utiliser à la place du bouton radio.Choissisez la taxe pour le prix des frais supplémentaires de cet élément.Choisir lequel du champ et de la méthode choisie devra être validé.Choisissez si l’option doit est activée ou non.Choisir si l’utilisateur doit remplir le champ ou non.Choisir de changer l’image du produit.Choisir d’activer la lightbox sur le thumbnail.Choisissez si vous voulez masquer l&#39;étiquette d&#39;élément dans le panier ou non.Choisissez si vous voulez masquer l&#39;étiquette dans la "boite de totaux flottante".Choisissez si vous voulez masquer l&#39;étiquette dans la commande ou non.Choisissez de cacher la valeur de l&#39;élément dans le panier ou non.Choisissez de cacher la valeur de l&#39;élément dans la boîte de totaux flottante ou non.Choisissez si vous souhaitez masquer ou non la valeur de l'élément dans la commande.Choisir de masquer le prix ou non.Choisissez si vous souhaitez inclure le prix de la taxe pour les frais supplémentaires sur cet élément.Choisir de rediriger vers une URL si on clique sur l’option.Choisir d’afficher ou de masquer le nom de l’attribut.Choisissez le %s que l’élément de date utilisera dans les calculs du backend ou laissez vide pour le fuseau horaire du serveur.Choisir quel séparateur de décimales à afficher pour les prixEffacerEffacer toutes les formes globales supplémentairesBouton pour vider le panierCliquer pour basculerDupliquer le formulaireDupliquer le modèleLe clonage est interdit.FermerTout fermerRemplacement du texte du bouton de fermetureCouleurSélectionneur de couleurÉchantillons de couleursUne virgule sépare les dates en accord avec le format de date sélectionné. (Deux chiffres pour le jour, deux chiffres pour le mois et quatre chiffres pour l’année)Une virgule sépare les dates en accord avec le format de date sélectionné. (Deux chiffres pour le jour, deux chiffres pour le mois et quatre chiffres pour l’année). Merci de noter que ce paramètre sera prioritairement pris en compte sur tout autre paramètre !Logique conditionnelleConnexion au serveur d’activation ...ConsentementNom de la constanteValeur de la constanteContenu (Content)Couleur du Contenu (Content)Position du Contenu (Content)CopierCoûtLa requête n’a pu être complétée !N’a pu mettre à jour le post dans la base de donnéeNombreValeur actuelleFormat de l’heure personnaliséeAction personnalisée :Code personnaliséHook personnaliséPrix personnaliséPrix personnalisé (requis)Style personnaliséTypes personnalisésDEV - plusieurs fichiersDateChamp dateChamp et sélectionneur de dateFormat de dateSélectionneur de dateStyle du sélectionneur de dateSélecteur de datePosition du Datepicker (sélectionneur de dates)Taille du Datepicker (sélectionneur de dates)Thème du Datepicker (sélectionneur de dates)JourJour - Mois - AnnéeJour . Mois . AnnéeJour / Mois / AnnéeDésactiver la LicenceDésactivé, mais le code d'achat n'a pas été activé pour une raison quelconque!DécembrePar défautProduit par défautValeur par défautLa valeur par défaut est 10La valeur par défaut est 100SupprimerSupprimer de manière permanenteSupprimer toutes les optionsSupprimer toutes les optionsSupprimer l'(les)article(s)DescendantDescriptionDéterminer par le navigateur localChiffresDésactiverDésactiver les modules complémentairesDésactiver Exclure des Options globalesDésactiver les options lors du changement d'état de la commandeDésactiver la sécurité de conversion PNGDésactiver les méthodes d’expéditionDésactiver la condition des méthodes d’expéditionDésactiver le défilement d’erreurDésactiver les images lazy loadDésactiver les moisDésactiver l'envoi des options lors de l'enregistrement de la commandeDésactivez cette option pour les serveurs lents ou les grandes quantités d’images.Désactiver les jours de la semaineDésactiverDésactiver les datesRôles désactivés pour ce formulaireRemisePlacement de chaîne de réductionType de remiseAfficherAfficher un lien pop-upAfficher un préfix label sur la page produit.Afficher un suffix label sur la page produit.Afficher en tant queAfficher les deux signesAfficher seulement le signe moinsAfficher l’ajouter le bouton au panier bouton de la boîte flottante.Afficher le séparateur de décimalesDiviser le prix par la mesureDiviseurType de diviseurNe modifiez pas cela à moins que vous ne sachiez comment cela affectera votre site ! Il s’agit de la priorité à laquelle les types de messages sont chargés par le plugin.DocumentsFaitDouble cliquer sur le bouton radio pour enlever ses attributs sélectionnés.Télécharger une nouvelle version depuis CodeCanyonTéléchargement du paquet du marché Envato...Liste déroulanteDécrochage PlaceholderDupliquer ElementDupliquer la sectionPrix et réductions dynamiquesPanneau de contrôle de l’OEBEPO action personnaliséeEcho une action personnaliséeModifierModifier l’élémentModifier le formulaire globalModifier la table de rechercheModifier les options du texteModifier la sectionModifier le modèleModifier élémentModifier les optionsModifier le tarifModifier les paramètresOnglet ModifierModifier la %s traductionLogique conditionnelle de l’élémentID d’élément pour xID d’élément pour yNom de classe de l’élémentID de l’élémentID de l’élémentÉlémentsEmailVider le panierTexte du bouton vider le panierAutoriserPermettre d’exclure des Options globalesGestionnaire de fichiersAutoriser le total final de la boite pour tous les produitsActiver Jetpack CDNActiver les méthodes d’expéditionActiver la condition des méthodes d’expéditionActiver WP Rocket CDNPermettre la modification du tableau des prixActiver les styles des cases à cocher et des boutons radioAutoriser les boutons d’options videsAutoriser la logique conditionnelle pour afficher ou masquer cet élément.Autoriser la logique conditionnelle pour afficher ou masquer cette section.Permettre les réductions sur les options supplémentairesAutoriser les options supplémentaires dans la vue du shop et de la catégorieActivez l’aperçu en ligne de l’image qui sera téléchargée.Activer les options d’affichage de la TVAPermettre l’affichage du total final d'origineActiver l’interface backend du pluginAutoriser le plugin pour WooCommerce shortcodesActiver l’affichage des points ?Activer des messages pop-up sur les téléchargementsActiver le répéteurAutoriser les boutons d’options videsDésactiver l'envoi des options lors de l'enregistrement de la commandeActivez-le à vos risques et périls car il n’est pas possible de calculer les remises d’options sur la page commande.Activer cette option si le produit a beaucoup d’options.Activez cette option si vous effectuez une erreur 500 lorsque vous tentez de terminer l'ordre dans la commande.Activez cette option si vous souhaitez que les options aient un affichage réactif.Activez cette option si vos produits variables disposent de nombreuses options pour améliorer les performances. Notez que cela peut causer des problèmes avec les plugins de réduction ou de devise.Activez ce paramètre pour afficher une case Total final sur la page du produit, permettant aux clients d’afficher le coût total de leur commande, ou désactivez-la pour une page de produit simplifiée.Activez ceci pour ajouter n’importe quel frais au prix unitaireActivez cette option pour ajouter le suffixe d’affichage WooCommerce Price dans la zone des totaux.Permettre d’ajouter le suffixe fiscal WooCommerce sur la boîte totalActivez ceci pour désactiver les images de chargement paresseuses.Activez ceci pour afficher le prix unitaire lorsque la boîte totale est visiblePermettez-lui de masquer l’onglet constructeur sur l’écran de modification du produitActivez ceci pour cacher l’onglet normal sur l’écran de modification de produitActivez ceci pour masquer l’onglet paramètres sur l’écran de modification du produitActivez-le pour précharger l’image lors de l’utilisation de la fonction lightbox.Permet d’afficher le total complet du produit, offrant aux clients une vue d’ensemble claire du coût global.Activez cette option pour afficher le total spécifiquement pour les options de produit sélectionnées.Permettre d’avoir les quantités des produits associés pour être un multiple de la quantité principale du produit.Permettre de faire défiler le viewport vers l’élément produit.Permettre de montrer la description du produit associé.Permettre de montrer l’image du produit associé.Permettre de montrer la méta du produit associé.Permettre de montrer le prix du produit associé.Activez cette option pour afficher la chaîne de quantité même lorsque la quantité est égale à 1 et lorsque le sélecteur de quantité est activé.Permettre de montrer le titre du produit associé.Activer les traductionsActiver le message de réussite du téléchargementAutoriser la validationActiverActiver les datesRôles activés pour ce formulairePermet un pop-up lorsque les téléchargements sont effectués.Activer ou désactiver les styles supplémentaires pour les cases à cocher et les boutons radio.Activer ou désactiver le bouton pour vider le panierActiver ou désactiver l’affichage des options dans le panier.Autoriser l’affichage d’un bouton d’annulation pour cet attribut.L’activation de cette option ajoutera les prix des options au coût de réservation calculé.L’activation de cette option ajoutera les addons enregistrés à l’abonnement lors de l’utilisation manuelle de la fonctionnalité de commande à nouveau.L’activation de ce système permettra l’utilisation de codes courts et de code HTML dans l’étiquette des options et le texte de description.Autoriser cela appliquera les réductions sur les produits aux options supplémentaires également.Activer cela montrera les images téléchargées dans le panier et lors du passage en caisse.Activer cela montrera les images téléchargées dans le panier et lors du passage en caisse.Permettre de masquer les options sur la page du produit jusqu'à ce que le JavaScript est initialisé. Il s’agit d’un paramètre de sécurité intégrée et nous vous recommandons d’être actif.Autoriser ceci chargera les fichiers du plugin sur toutes les pages WordPress. A employer avec précautions.Pour ce faire, la date minimum et maximale sélectionnable ne comptera pas les jours de semaine désactivés sélectionnés.En activant cette option, vous multipliez le prix des options par le nombre de blocs.Autoriser cela appliquera les réductions sur les produits aux options supplémentaires également.En activant cette option, vous multipliez le prix des options par le nombre de personnes.L’activation de cela séparera les valeurs séparées de virgule pour les éléments. Ceci est principalement utilisé pour plusieurs choix de case à cocher.L’activation de cette option affichera une info-bulle sur le choix.Autoriser ceci affichera les images des éléments qui ont une image de remplacement.Activer cela montrera les images téléchargées dans le panier et lors du passage en caisse.Fin de l&#39;étiquetteAnnée de finEntrez un sélecteur CSS pour remplacer l’étiquette par défaut où la chaîne de rabais sera affichée.Entrez un identifiant personnalisé pour connecter différents éléments de bouton radio.Écrivez votre message à utiliser dans le champ de la fenêtre après avoir cliqué sur le bouton Ajouter au panier quand il y a des fichiers à télécharger.Entrer un nombre supérieur à 0 pour obliger l’utilisateur à sélectionner au moins ce nombre de cases à cocher ou laisser vide pour un comportement par défaut.Entrer un nombre supérieur à 0 pour obliger l’utilisateur à sélectionner le nombre exact de cases à cocher ou laisser vide pour un comportement par défaut.Entrer un nombre supérieur à 0 pour limiter la sélection de cases à cocher ou laisser vide pour un comportement par défaut.Entrer une string pour indiquer l’état requis d’un champ.Encoder un texte à afficher après le prix pour ce champ ou le laisser vide s’il n’y a pas de texte.Encoder un texte à afficher avant le prix pour ce champ ou le laisser vide s’il n’y a pas de texte.Saisissez une chaîne pour indiquer l’état d’un champ obligatoire.Entrer un texte pour remplacer le texte des options additionnelles quand on utilise les paramètres pop-up dans le panier.Saisir un texte pour remplacer les caractères restants de texte lorsque vous utilisez le nombre maximum de caractères sur un champ de texte ou une zone de texte.Entrer un texte pour remplacer le texte du bouton de fermeture dans le calendrier.Entrer un texte pour remplacer le texte du bouton de fermeture quand on utilise le paramètre de pop up dans le panier.Entrer un texte pour remplacer les options d’édition du texte dans le panier.Entrer un texte pour remplacer le label du prix gratuit lorsque le produit a des options supplémentaires.Entrer un texte pour remplacer l’option de réinitialisation du texte quand on utilise des variations personnalisées.Entrez un texte pour remplacer le texte sélectionner le fichier utilisé dans le bouton de téléchargement de style.Entrer un texte pour remplacer le bouton de texte d’Aujourd’hui dans le calendrier.Entrez un texte pour remplacer le texte Téléchargement de fichiers utilisé dans la fenêtre contextuelle après avoir cliqué sur le bouton Ajouter au panier lorsqu'il y a des champs de téléchargement.Entrez un texte pour remplacer le texte du bouton Ajouter sur les produits associés.Entrez un texte pour remplacer le bouton Ajouter du texte pour les champs du répéteur.Entrer un texte pour remplacer le texte du bouton d’ajout au panier lorsqu’on utilise la sélection forcée d’option.Entrez un texte pour remplacer le texte par défaut du bouton contextuel. Cela remplacera la valeur globale.Entrer un texte pour remplacer le texte du bouton pour vider le panier.Entrez un texte pour remplacer le texte du fichier utilisé dans le bouton de téléchargement stylisé.Entrez un texte pour remplacer le texte des fichiers utilisé dans le bouton de téléchargement stylisé.Vous ne pouvez ajouter des produits aux prix négatifs au panier.Entrer un texte pour remplacer le texte du bouton de fermeture quand on utilise le paramètre de pop up dans le panier.Entrer un texte pour remplacer le texte du bouton suivant dans le slider.Entrer un texte pour remplacer le texte du bouton précédent dans le slider.Entrez un texte pour remplacer le texte du bouton Supprimer sur les produits associés.Entrez un texte pour remplacer le texte du bouton de section de recharge. Si vous définissez cette valeur sur %s, le texte du bouton aura le titre de la section.Encoder une valeur pour le nombre de caractère minimum l’utilisateur doit entrer.Entrez une valeur pour le décalage de défilement lors de la sélection d’un choix pour l’élément de produit.Encoder une valeur a appliquer automatiquement au champ Quantité.Entrez une valeur à appliquer au champ automatiquement selon votre format de la date sélectionnée. (Deux chiffres pour le jour, deux chiffres par mois et quatre chiffres pour l’année).Entrer une valeur à appliquer automatiquement au champ.Encoder une valeur pour limiter le nombre maximum de caractères qu’un utilisateur peut entrer.Entrer un nom de classe supplémentaire à ajouter à l’attribut de cet élémentEntrer un nom de classe supplémentaire à ajouter à cet élémentEntrer un nom de classe supplémentaire à ajouter à cette sectionEntrez un identifiant pour le conteneur de l&#39;élément.Entrer l’année de fin.Entrer l’année de départ.Entrez le texte pour le total des frais ou laissez vide pour la valeur par défaut.Entrez le final total ou laisser vide par défaut.Saisissez le texte Total de la TVA dans les options ou laissez le champ vide par défaut.Entrez les options total ou laisser vide par défaut.Entrez le texte des frais d’inscription ou laissez vide par défaut.Sélectionnez le texte de frais d’abonnement ou laissez vide pour la valeur par défaut.Entrez le texte de prix unitaire ou laissez vide pour la valeur par défaut.Saisissez la mise à jour du panier lorsque vous édité ou modifié un produit.Saisissez le caractère qui sera utilisé pour séparer les étiquettes de champ des valeurs de champ dans le panier et la commande.Entrez le code promo.Entrez l’identifiant de l’élément à utiliser pour la colonne x.Entrez l’identifiant de l’élément à utiliser pour la colonne y.Entrer la hauteur de l’élément affiché ou laisser vide pour une hauteur automatique.Entrer la valeur maximum.Entrer la valeur minimum.Entrez le nombre de caractères gratuits.Entrez le nombre de valeurs pour l&#39;affichage des points.Entrez le lieu réservé pour le décrochage.Encoder le prix pour ce champ ou le laisser vide s’il n’a pas de prix.Entrer les étapes de la quantité.Encoder le prix de vente pour ce champ ou le laisser vide afin d’utiliser le prix par défaut.Entrer l’étape à traiter.Saisissez la chaîne qui sera utilisée pour séparer plusieurs valeurs d’un champ qui autorise plusieurs sélections dans le panier et l’ordre.Entrez l’heure au format suivant : 08:00 amEntrer la largeur de l’élément affiché ou laisser vide pour une largeur automatique.Entrer le titre iciEnvato Jeton personnelErreur de connexion à l’API Envato. Merci de réessayer ultérieurement.Epo noirEpo blancErreurErreur de connexion à l’API Envato. Merci de réessayer ultérieurement.Erreur de connexion au serveur !Erreur d’obtention des données depuis le serveur !Erreur durant la suppression.Erreur durant le déplacement vers la corbeille.Erreur de restauration de l’élément depuis la corbeille.Placement de l’étiquette d’erreurErreur lors de la décompression du packageErreur ! Impossible de se connecter au système de fichiersErreur ! Erreur de l’API d’EnvatoTout le mondeSélection exacteExclure le ou les produits du formulaireExclure les produitsExclure désactivéExclure desProduits exclusExclure les prix des modules complémentaires de la remiseTout développerDévelopper et fermer (commencer la fermeture)Développer et fermer (commencer l’ouverture)Exporter le CSVExporter le formulairePlacement des options supplémentairesOptions supplémentaires placement personnaliséPriorité du crochet de placement du hook des options supplémentairesOption de produit supplémentaire #%1$s de %2$sOptions supplémentaires pour le produitOptions de produits supplémentaires et modules complémentaires pour WooCommerceLes options de produits supplémentaires et les modules complémentaires pour WooCommerce nécessitent les options de paiement supplémentaires de WooCommerce %s ou une version ultérieure !.Les options supplémentaire des produits TM de WooCommerce requièrent WordPress %s ou une version ultérieure.Frais des options supplémentaires du produitCréation de formulaire d'options supplémentairesParamètres des options supplémentaires pour le produitFrais supplémentairesEchec d’écriture du fichier sur le disque.FévrierMontant des FraisTexte du total frais supplémentaireSéparateur d’étiquette/valeur de champFichier importé avec les nouvelles tables.Fichier importé.Gestionnaire de fichiersLe gestionnaire de fichier n’est pas supporté sur votre serveur.Le chargement du fichier a été arrêté par l’extension.Nom de fichierFiltrer parBoîte de total finalTotal finalBoite total finalTexte du total finalMontant fixeMontant fixe et optionsTarifs forfaitaires (Légal)Floating des totaux de la boiteVisibilité des totaux de la boîte flottanteForcer la sélection des optionsTexte de sélection forcée des optionsBrouillon du formulaire mis à jour.Formulaire publié.Formulaire restauré suite à une révision issue de %sFormulaire sauvegardé.Calendrier de formulaire pour : %s.Formulaire soumis.Formulaire mis à jour.Remplacement du texte du Prix GratuitCaractères gratuitsGratuit!VendrediDeGrande tailleGénéralOptions généralesRéglages générauxGlobalForme globaleFormulaires globauxVariables globalesRemplacer globalement le bouton annuler les boutons radioonH1H2H3H4H5H6H:mH:m:sH:m:ssH:mmH:mm:sH:mm:ssHH:mHH:m:sHH:m:ssHH:mmHH:mm:sHH:mm:ssCouleur du HeaderPosition du HeaderTitre du HeaderType de HeaderTitresHauteurCacherMasquer le mode générateur sur les produitsMasquer la case Total final jusqu’à ce que tous les éléments soient choisisMasquer la case Total final jusqu’à ce que tous les éléments requis soient choisisMasquer la case Total final jusqu’à ce qu’un élément soit choisiMasquer le mode Normal sur les produitsMasquer le bouton d’ajout au panier jusqu’à ce que tous les éléments soient choisisMasquer le bouton d’ajout au panier jusqu’à ce que tous les éléments requis soient choisisCacher le bouton d’ajout au panier jusqu’à ce qu’une option soit choisieMasquer après le défilement de la pageMasquer le prix moyen de la case à cocher de cet élémentMasquer l’étiquette de choix lors de l’utilisation du paramètre Afficher l’info-bulle pour les cases d’option et les cases à cocherCacher l&#39;étiquette d&#39;élément dans le panierMasquer l'étiquette dans la "boite de totaux flottante"Cacher l&#39;étiquette de l&#39;élément dans la commandeMasquer le prix de l’élément html lorsque le paramètre de masquage du prix est activéMasquer valeur de l&#39;élément dans le panierMasquer l'élément dans la "boite de totaux flottante"Masquer valeur de l'élément dans la commandeCacher les options supplémentaires dans le panierCacher les filtresMasquer les paramètres de substitution sur les produitsCacher le prixMasquer le produit dansAfficher l'image téléchargée dans le panier et lors du passage en caisseCacher le chemin du fichier chargéRègle horizontaleHeureCombien de temps l’animation prendra en millisecondesJe conviens que les données de licence seront transmises au serveur de licences.IDIcône de gauche de l’infobulleIcône droite de l’infobulleSi cette option est activée, la réduction ne sera pas appliquée aux modules complémentaires du produit.Si cette option est activée, les addons inclus dans le produit associé ne seront pas affichés.Si cela est activé, le produit inclus n’est pas expédié avec le produit principal.Si cela est activé, le produit inclus ajoutera son poids au produit principal.Si cela est activé, le produit inclus maintiendra son propre prix.Mode imageImage de remplacementÉchantillons d'imagesImporter le CSVImportez-en un en cliquant sur le bouton ci-dessous.Importation de csv...Importation des donnéesInclure les frais dans le prix unitaireInclure les formulaires additionnels globauxInclure à nouveau des addons sur commandeInclure le prix de l'option dans le prix du produitInclure le prix de la taxe pour les frais supplémentairesInclure le suffixe de taxe string sur les totaux de la boiteInclure le suffixe d’affichage WooCommerce Price sur la boîte totauxAugmenter la largeurIndique si le téléchargement a réussi avec un message.Hériter des paramètres du produitHériter de la classe de taxe du produitInitialisationMode InlineSéparateur de décimalesFichier CSV non valide!Action non valide.Tableau CSV non valide !Action non valide.Date invalide soumise !Donnée invalide !Date encodée non valide !Extension de fichier invalideMéthode.Requête non valide !Année encodée invalide !&laquo;%s&raquo;Articles par rangée (ordinateurs de bureau et ordinateurs portables)Articles par rangée (Galaxy Tablets paysage)Articles par rangée (Samsung Galaxy)Nombre d'articles par rangées sur des smartphoneNombre d'articles par rangées sur des tablettes en mode paysageNombre d'articles par rangées sur des tablettes en mode portraitArticles par ligne (iPhone 5)Articles par ligne (iPhone 6  )Articles par ligne (iPhone 6)Janvier Code JavaScriptMode d’inclusion de JavaScript et CSSJuilletJuinLabelSélecteur de CSS d’étiquetteOptions du labelCouleur du labelPosition du labelType de labelLangageLangage de ceci %sLargeMode de dispositionLaisser vide pour utiliser l’attribut originel du label.Laisser vide pour les valeurs par défautLaisser vide pour calculer automatiquement depuis le %s prixLaisser vide pour calculer automatiquement depuis le %s prix de venteLaissez ce champ vide pour l’étiquette par défaut.DroiteGauche du champLa gauche du labelCôté gaucheMétadonnées héritéesLettres uniquementLettres ou espace uniquementLicenceLicence activée !Licence activée.Licence désactivée !Limiter la sélectionChargement ...LieuUtilisateurs connectésConsulter la tableTable de consultationTableaux de rechercheM j, Y @ H:iMaintenir le poidsAssurez-vous que le prix total n'est pas multiplié par la quantité de produitMarsAjout en masseConstantes de formule mathématiqueFormule mathématiquesValeur maximumNombre maximum de caractèresNombre maximum de caractères de champ de texte et zones de texteHauteur maximale de l'imageLargeur maximale de l'imageNombre maximum de combinaisons pour les calculs de prixLe nombre maximal de lignes est de {0}Quantité MaximumDate maximum sélectionnableTemps maximum de sélectionnableMaiMoyenOrdre du menuLes métadonnées ne sont pas correctement enregistrées. S’il vous plaît enregistrer le produit!Valeur minimumNombre minimum de caractèresMinimum de caractères de champ de texte et zones de texteLe nombre minimal de lignes est de {0}Quantité minimaleDate minimale sélectionnableMinimum de temps sélectionnableSélection minimumMinuteIl manque un fichier temporaire.LundiMoisMois - Jour - AnnéeMois . Jour . AnnéeMois / Jour / AnnéePlus d’informations sur %sMessage de rupture de stockDéplacer dans la corbeilleSélectionner une case multipleSéparateur de valeurs de champs multiplesTexte de plusieurs fichiersPlusieurs fichiers compresséesMultiplier le coût par le nombre de blocsMultiplier le coût par le nombre de personnesMultiplier le coût par le nombre de personnesMultipliez les prix à l'intérieur des choix de boîte de sélection avec son sélecteur de quantitéN/ANomNouveau formulaire globalNouvelle table de rechercheNouveau modèleSuivantNonAucune table CSV n’a été trouvée !Pas de formulaire global trouvéPas de formulaire global trouvé dans la corbeilleAucune table de correspondance n’a été trouvéeAucune table de correspondance n’a été trouvée dans la corbeilleAucun modèle trouvéAucun modèle trouvé dans la corbeilleAucun changementAucun élément trouvé !Aucun fichier trouvé.Aucun fichier n’a été chargé.Empêcher les produits à prix négatifsAucune variation sauvegardée trouvée.Pas de validationEmpêcher les prix à zéro pour les produitsMasquer le prix pour tous les produitsAucunNormalNormal (vide)Bouton de navigateur normalAffichage normalNovembreNombreNombre de pointsOctobreN’entrez que le code CSS pur sans étiquettes de styleN’entrez que le code JavaScript pur sans étiquettes de scriptOuvertOptionModèle d’optionModèles d’optionsOption des frais d'abonnementMontant de la TVA sur les optionsOptions Texte total TVAMontant des optionsMode de prix des optionsOptions sauvegardées !Options du texte du totalOrdreCommande et e-mailsTrier parPrix du produit originalAutres élémentsPasser outre le total final de la boiteSubstituer des rôles activés pour ce produitPasser outre l’affichage globalRemplacer le prix du produitRemplacer les éléments existantsRemplacer les tables existantesPaddingFormulaire global parentTable de correspondance parenteThème parentPourcentage du prix originelPourcentage du prix original + optionsPourcentage du prix originel au travail à la journéePourcentage du prix originel par travail à la journée (pas de premier travail à la journée)Pourcentage du prix d'origine par caractère (no n-th char and pas d'espace)Pourcentage du prix d'origine par caractère (no n-th char)Pourcentage du prix originel au travail à la journéePourcentage du prix originel par travail à la journée (pas de premier travail à la journée)Pourcentage du prix d'originePourcentageQuantité de pixels nécessaire pour faire défilerEspace réservéPositionnementVeuillez activer les options de produit supplémentaires.Veuillez cocher la case de consentement pour donner votre autorisation à envoyer vos données au serveur et réessayer.Veuillez fournir un multiple de {0}.Merci de bien vouloir encoder une URL valide.Merci de bien vouloir encoder une adresse email valide.Merci de bien vouloir encoder un numéro valide.Merci d’entrer une valeur supérieure ou égale à {0}.Merci d’entrer une valeur inférieure ou égale à {0}.Merci d’entrer au moins {0} caractères.Merci d’entrer au moins {0} caractères.Merci de n’encoder pas plus de {0} caractères.Merci de n’encoder pas plus de {0} caractères.Merci de n’encoder que des chiffres.Veuillez saisir uniquement des lettres ou des espaces.Merci de n’encoder que des chiffres.Veuillez entrer uniquement des lettres.Merci de n’encoder que des chiffres.Merci de n’encoder que des chiffres.Merci de bien vouloir compléter tous les champs avant d’essayer d’activer.Veuillez noter que si les options de l'ordre changent ou sont supprimées, vous obtiendrez de mauvais résultats en activant cette option !S’il vous plaît enregistrer le formulaire avant d’importer des options!S’il vous plaît enregistrer le produit avant d’importer des options!Merci de sélectionner au moins {0} choix.Merci de sélectionner au moins {0} choix.Merci de sélectionner exactement {0} choix.Merci de sélectionner exactement {0} choix.Merci de sélectionner jusqu’à {0} choix.Merci de sélectionner jusqu’à {0} choix.Pop upRemplirCompléter les optionsRemplacement du texte du bouton de la section contextuellePositionPriorité du crochet de type poteauTypes de publication pour afficher les options enregistréesPréfix labelPréchargez les images lightboxSupport PremiumPrécédentÉvitez d'ajouter au panier des produits à prix négatif.Empêcher l’ajout au panier lorsque les produits sont à zéro.Empêcher les produits à prix négatifsEmpêcher les options d&#39;être envoyé aux e-mailsEmpêcher les prix à zéro pour les produitsPrixType de prixRemplacement de l’affichage des prixPrix par intervallePrix par travail à la journéePrix par travail à la journée (pas de premier travail à la journée)Prix par caractère (aucun caractère n-ième et sans espace)Prix par caractère (aucun caractère de la n-ème)Prix par travail à la journée (pas d’espaces)Prix ​​par lignePrix ​​par lignePrix par travail à la journée (pas de premier travail à la journée)%1$s &ndash; %2$s%1$s&ndash;%2$sType de prixPrix :Prix individuelTarificationPrioritéProduitImage de remplacement du produitL’élément de produit n’est pas pris en charge pour les composants !L’élément Product n’est pas pris en charge dans un autre élément Product !Décalage de défilement d’élément de produitMode de remplacement de l'image du produitPage du produitQuantité de ProduitVariables de produitProduitsProduits et CatégoriesPublierCode d’achatQtéQuantitéValeur par défaut de le quantitéValeur maximum de la quantitéValeur minimum de la quantitéSélectionneur de quantitéEtape de la quantitéID du connecteur du bouton radioBouton radio d’annulationBoutons radioCases d’option et l’image à la fin de l’étiquetteCases d’option et l’image au début de l’étiquetteAléatoireGammeSélectionneur de gammeURL relativeRéduire la largeurNormalURL relativeSupprimerRetirer le label de prix gratuitSupprimer le texte du bouton sur les produits associésSupprimer l’image.Étiquette du bouton RépéteurParamètres du répéteurRépéteur ajouter du texteLimite maximale du répéteurLimite minimale du répéteurMode de remplacementRequisIndicateur d’état requisPosition de l’indicateur d’état requisRéinitialiser le texte de remplacement des OptionsRéinitialiser les valeurs des options une fois le produit ajouté au panierRéinitialiser les optionsRéinitialiser les paramètresStructure des options réactivesRécupérer des tailles d’image pour les remplacements d’imagesGaucheDroite du champLa droite du labelCôté droitRôlesRondManche 2Mettre à jourSKU:VentePrix de venteSamediSauvegarderEnregistrer les changementsSauvegarde en cours … merci de patienter.Faire défiler jusqu’à l’élément produit lors de la sélectionChercher le formulaire globalRechercher dans la table de rechercheModèle de RechercheRechercher la catégorie...Rechercher un produit ...Rechercher un produit&hellip;SecondeSectionLogique conditionnelle de la sectionCouleur de fond de la sectionNom de classe de sectionIdentifiant ID de sectionCouleur d’arrière-plan de l’étiquette de sectionEmplacement de la sectionSection pop up button styleTexte du bouton contextuel de la sectionStyle de la sectionCouleur d’arrière-plan des sous-titres de sectionType de sectionSélectionnerBoite de sélectionSélectionner un produitSélectionnez un style pour les case à cocher et les boutons radioSélectionner un style pour la bordure sélectionnée lorsqu’on utilise une image de remplacement ou les échantillons.Sélectionnez un modèle...Sélectionner une image pour cet élément.Boîte de sélectionBoites de sélectionSelect categoriesSélectionnez les types de fichiers personnalisés que l'utilisateur sera invité à télécharger, séparés par des virgules.SélectionnerSélectionnez le texte du fichierSélectionnez les types de fichiersSélectionnez comment les produits seront présentés.Sélectionnez le mode d’affichage de l’élément.Sélectionner comment afficher vos champs dans le panierSélectionnez comment inclure les fichiers JS et CSSSélectionner comment afficher les valeurs du sélectionneur de gamme.Mode de sélectionSélectionner les optionsSélectionnez des produitsSélectionnez les méthodes d’expédition ...Selectionnez templateSélectionnez la priorité de crochet de placement d’options supplémentairesSélectionner le(s) produit(s) auxquels appliquer les optionsSélectionnez la priorité de placement de la boîte TotalsSélectionner la couleur à utiliser.Sélectionnez le type de rabais. La réduction s’applique au prix final du produit. Si le produit a des options supplémentaires, alors la réduction s’applique au montant après que les options ont été ajoutées au prix du produit.Sélectionner le type d’affichage de cet attribut.Sélectionner l’image qui doit remplacer l’image du produit.Sélectionnez le nombre de pixels que la page doit faire défiler pour que les totaux flottants deviennent visibles.Sélectionnez le paramètre par lequel les produits seront triés.Sélectionnez le placement de l’indicateur d’état requisSélectionnez le placement de la chaîne à prix réduit par rapport à l’étiquette.Sélectionner la position du Datepicker (sélectionneur de dates).Sélectionnez la position de la timepicker.Sélectionnez les types de publication où le plugin modifiera l’écran d’ordre d’édition pour afficher les options enregistrées. Vous pouvez saisir votre type de publication personnalisé.Sélectionnez le mode de prix pour les options.Sélectionnez le produit qui sera présélectionné.Sélectionner les rôles qui auront accès aux options supplémentaires.Sélectionnez les rôles qui auront accès aux paramètres du plug-in et à l’interface du plug-in lorsque vous êtes sur la page de modification du produit. Le rôle d’administrateur a toujours accès.Sélectionner les rôles qui auront accès aux options supplémentaires.Sélectionnez les modes d’expédition à désactiver.Sélectionnez les modes d’expédition à activer.Sélectionner la date du Datepicker (sélectionneur de dates).Sélectionnez la taille de la timepicker.Sélectionnez l’ordre de tri des produits.Sélectionner le thème pour le datepicker (sélectionneur de dates)Sélectionnez le thème de la timepicker.Sélectionnez le style d'affichage de cette section.Sélectionner le type d’affichage de cette section.Sélectionnez le style bouton pop up de cette section.Sélectionner où cette section devra apparaitre par rapport aux options locales.Sélectionnez l’emplacement de masquage du produitSelect where you want the Totals box to appear.Sélectionnez l'endroit où vous souhaitez que les options supplémentaires apparaissent.Sélectionnez les types de fichiers l’utilisateur seront saisis à télécharger.Mode autoLe mode Self remplace l'image réelle et Inline ajoute de nouveaux éléments d'image.SeptembreDéfinissez le mode d’image qui sera utilisé pour diverses fonctionnalités liées à l’image.Réglez la largeur maximale de l’outil qui apparaît sur les éléments.Définissez la hauteur maximale des images qui apparaissent sur le panier.Définissez le nombre maximal de lignes qu’un utilisateur peut ajouter pour le champ répéteur.Définissez la largeur maximale des images qui apparaissent sur le panier.Définissez le nombre minimal de lignes qu’un utilisateur peut ajouter pour le champ du répéteur.Définir le placement pour l’étiquette de notification d’erreur de validationDéfinir à fraisDéfinissez à ce que ces types de prix baseront leur prix d’origine dessus.ParamètresParamètres:OmbreExpédié individuellementCommande de boutiqueAfficherAfficher le total finalAfficher le total des optionsAfficher le prix unitaire sur la zone des totauxAfficher le nom de l’attributAfficher la description du choix en ligne.Afficher la descriptionAfficher les filtresAfficher l’étiquette pleine largeur des éléments.Afficher l'imageAfficher l’image et la descriptionAfficher image et le labelAfficher l’image de remplacement dans le panier et le tunnel d’achatAfficher l’image, le label et la descriptionAfficher l’étiquetteAfficher le label et la descriptionAfficher les métasAfficher seulement avec les actions épingléesAfficher le prixAfficher les prix dans les choix de boîte de sélectionAfficher les prix à l'intérieur des choix de boîte de sélection même si les prix sont cachésAfficher la quantité 1Afficher le sélecteur de quantité seulement pour les éléments ayant une valeurAfficher le bouton d’annulationAfficher les valeurs responsivesAfficher la boîte totale finale même lorsque le produit n’a pas d’options supplémentairesAfficher le titreAfficher les InfobullesAfficher l'image téléchargée dans le panier et lors du passage en caisseAfficher les action hooks utilisésAfficher la valeur deAfficher lorsque le total est supérieur à zéroFrais d’inscriptionInscrivez-vous au texte des fraisProduit uniqueTexte d’un seul fichierSeulement un fichier compresséeTailleCurseur (assistant)Texte du slider suivantTexte du slider précédentPetitQuelque chose n’a pas fonctionné avec WordPress.Quelque chose a mal tourné avec la demande!Désolé, ce type de fichier n’est pas autorisé pour des raisons de sécurité.Spécifiez les conditions de désactivation des méthodes d’expédition en fonction de la valeur du champ actuel. Si les conditions sont remplies, les modes d’expédition sélectionnés ne seront pas disponibles pour les clients lors du paiement.Spécifiez les conditions d’activation des méthodes d’expédition en fonction de la valeur du champ actuel. Si les conditions sont remplies, les modes d’expédition sélectionnés seront disponibles pour que les clients puissent choisir lors du paiement.CarréCarré 2StandardTemporisation de l’animation de démarrageCommencez à ajouter des élémentsDébut de l&#39;étiquetteL’année de départÉtape * prixValeur d’échelonStringsFiltrer le html des emailsStyleVariations de stylesBouton styliséFrais d’inscriptionTexte d’inscription aux fraisSous-titreCouleur du sous-titrePosition du sous-titreSuffix labelDimanchePosition SwatchSynchroniser la quantité de produits associés avec la quantité de produit principalStyle systèmeIndex de la tableNom de la tableLes noms des tables sont différents. Voulez-vous remplacer les tables ?OngletsTaxeClasse de la taxe pour le prix des frais supplémentairesTemplateTexteZone de texteChamp texteLe texte après le PrixLe texte avant le PrixLongueur du texteLien TexteÉchantillons de texteCet identifiant utilisateur n’est pas valide pour le code d’achat de cet élément. Merci de vous assurer que vous avez encodé le bon identifiant utilisateur (sensible à la casse).Le fichier CSV n’est pas valide !Le délai jusqu’à ce que l’animation commence en millisecondesLa description apparaîtra sous le titre.La forme est appliquée à tous les produitsLa forme n’est pas appliquée à tous les produitsLes formulaires que vous choisirez seront affichés aux côtés des formulaires que le produit possède déjà.La version installée estL’article %s a été retiré du panier car il a été modifié depuis son ajout.L’élément que vous tentez de déplacer depuis la corbeille n’existe plus.L’élément que vous essayez de restaurer depuis la corbeille n’existe plus.Nombre d’options sélectionnées par l’utilisateurLe nombre d’options sélectionnées par l’utilisateur sur l’élément cibléLa fonction php  mb_detect_encoding et mb_convert_encoding sont requises pour l'import et l'export de fichiers CSV. Veuillez voir avec votre hébergeur pour activer cette fonction.Le prix de l’élément cibléLe code d’achat est déjà actif sur un autre domaine !Le code d’achat est déjà activé !Le code d’achat est déjà activé ! Merci de bien vouloir acheter une licence valide !La quantité pour « %1$s » doit être supérieure à %2$sLa quantité pour "%s" doit être supérieure à 0 pour être ajoutée au panier.La quantité de "%1$s" ne peut pas être supérieur à %2$d.La quantité de "%1$s" ne peut pas être inférieur à %2$d.La quantité de « %1$s » doit être indiquée en multiples de %2$d.La quantité de cet élémentLa valeur brute de l’élément cibléLe formulaire sélectionné ne contient aucunes sectionsLa longueur du texte de l’élément cibléLa quantité totale de l’élément cibléLa quantité totale de cet élémentLa taille du fichier excède la taille de fichier maximale spécifiée (MAX_FILE_SIZE) dans le formulaire HTML.Le fichier chargé excède la taille maximale imposée dans le fichier php.ini.Le fichier chargé ne l’a été qu’en partie.La longueur de valeur de cet élémentLa valeur de l’élément ciblé convertie en nombre à virgule flottanteLa valeur de cet élémentThèmeIl n’y a pas encore de variations enregistrées.Une erreur s’est produite lors de l’importation du fichier CSV.Une erreur s’est produite lors de l’enregistrement des données csv. Veuillez vérifier l’encodage de votre fichier csv !Une erreur s'est produite lors de l'enregistrement du fichier.Ligne fineCela vous permet de désactiver tous les mois sélectionnés.Ceci vous permet de désactiver tous les jours de la semaine sélectionnés.Ceci vous permet de générer des points le long du sélectionneur de gamme.Cela change le bouton Ajouter au panier de la boutique pour afficher les options de sélection lorsque le produit à des options de produits supplémentaires. L’activation de cette fonctionnalité va supprimer l’ajax.Ceci contrôle la façon dont les champs sont affichés dans la partie front-end.  Si vous choisissez "Montrer à l'aide de shortcodes" vous devez manuellement écrire le code dans votre thème ou plugin afin d'afficher le champs et que celui-ci fonctionne. Les paramètres de mise en place ne fonctionneront pas. Si vous utilisez l'extension "Composite Product" vous devez laissez les paramètres sur "Normal" sinon les options supplémentaires ne pourront s'afficher dans le pack "composite product". Plus d'informations disponibles dans la documentation. (en anlais)Cela déterminer la visibilité des totaux dans la boîte flottante.Cet élémentCe champ est requisLe champ est requis.Ceci est une traduction deCeci est nécessaire sur plusieurs solutions de galerie qui modifient l’image html dynamiquement ou si vous souhaitez contrôler l’image dynamiquement.Il est utilisé pour modifier l'image du produit.C’est là que vous pouvez ajouter de nouveaux produits à votre e-commerce.C’est ici que vous pouvez ajouter de nouvelles options de modèle global.C’est ici que vous pouvez ajouter de nouvelles tables de recherche.Cet élément a déjà été supprimé.Ceci déplace le message hors stok lorsque des variations stylisées sont utilisées juste en dessous d'elles.Ce paramètre contrôle le nombre maximum de combinaisons que le plugin utilisera pour calculer les prix minimum et maximum. Un plus grand nombre de combinaisons se traduira par des prix plus précis, mais il faudra également plus de temps pour les calculer. Pour les produits qui peuvent avoir de nombreuses combinaisons de choix, il est recommandé de définir un nombre inférieur de combinaisons pour améliorer les performances.Ceci ajoutera un bouton afin de vider les options sélectionnées.Cela comptera comme une valeur vide au cas où l’élément est nécessaire.Cela divisera le prix d’origine avec la mesure nécessaire.Ceci va autoriser une floating box d’apparaitre les totaux de la boite.Cela activera la traduction du plugin par défaut à l’aide des fichiers pot.Cela n’exclura toute forme global attribué à ce produit sauf celles définies dans le paramètre précédent.Cela remplacera le prix du produit avec le prix des options si le prix total si les options sont supérieur à zéro.Cela permet de masquer l’affichage de prix moyen du panier dans les cases à cocher.Cela rendra cet élément répétable en fonction de la quantité de produit.Cela rendra cet élément reproductible.Cela remplacera la méthode d’affichage uniquement pour ce produit.Cela remplacera le prix du produit avec le prix des options si le prix total options est supérieur puis zéro.Cela remplace le format de l’heure qui précède.Cela remplace l’affichage de la zone totaux uniquement pour ce produit.Cela remplacera les rôles qui peuvent afficher les options pour ce produit.Cela remplacera le prix du produit affiché sur les pages de la boutique/archive/boucle de produit.Cela ramènera les valeurs d’option aux valeurs par défaut après l’ajout du produit au panierCeci affichera un sélecteur de quantité pour cette option.MiniaturesMiniatures multiplesJeudiHeureFormat de l’heureStyle de cueilleur de tempsRemplacement du fuseau horaire pour l’élément DateTitreOptions des titresTitre :ÀPour savoir comment accéder à votre code d’achat, vous pouvez %sPour recevoir des mises à jour automatiques, une activation est requise.Pour traduire des strings pour les options locales, merci d’utiliser l’interface WPML.Aujourd’huiInfobulleInfobulle et côté gaucheInfobulle et côté droitLargeur maximale tooltipAu dessusEn haut à gaucheHaut de l’écranEn haut à droiteTotalPrix total en tant que prix unitairePlacement des totaux de la boiteBoite de total - placement personnaliséTotaux de placement prioritaire du hookTraductionsRéduire les zéros dans les prixTentative de connexion depuis une adresse IP non valide !Tentative d’activation depuis un domaine non valide !Essayer d’activer en dehors de l’interface du plugin n’est pas autorisé !Tentative d’activation avec un code d’achat non valide pour votre token!Essayer de charger des fichiers plus larges que %s n’est pas autorisé !MardiCliquez sur On pour afficher le panier de façon persistanteType :URLPrix du produit non comptabiliséAnnulerValeur maximum de la quantitéPrix unitaireTexte du Prix unitaireType de post inconnu.La désérialisation des instances de cette classe est interdite.Mise à jourMettre à jour le panierMettre à jour le panierChargerCharger (upload) le style du boutonAperçu de l’image d’élément de téléchargement en ligneDossier chargéGestionnaire de chargementChargement réussiTéléchargement des fichiersTéléchargement de fichiers texteTélécharger le texte du messageUrlUtiliser les URL de remplacementUtiliser les valeurs WooCommerceUtiliser les types de fichiers autorisés à partir de WordPressUtiliser l’image personnaliséeUtiliser la valeur du champUtiliser les paramètres générauxUtiliser une image « lightbox »Utiliser le prix interne de variationUtiliser les optionsUtilisez la mise en cache des options pour augmenter la perfromance. Désactivez si vous avez des options qui partagent le même ID unique.Utiliser des signes plus et moins sur les prix des optionsUtilisez les signes plus et moins sur les prix dans le panier et lors du passage en caisseUtiliser l’affichage progressif sur les optionsUtiliser le prix régulierUtiliser le prix promoUtilisez le réglage sur chaque produitUtilisez la chaine de caractère "From" sur les prix affichésUtiliser l’image de remplacementUtiliser ce champ pour afficher une grille. Encoder combien d’éléments par ligne pour la grille ou laisser vide pour un affichage normal.Utiliser si possible les valeurs traduites dans admin OrderNom d’utilisateur (identifiant)Utilisation du paramètre de réservationValider en tant queValeurVariation n&deg;%1$s sur %2$sOptions de variationVariation :VariationsDiversParamètres des Extra Product OptionsParamètres des options supplémentaires pour le produitAfficher le formulaire globalVoir la table de correspondanceVoir le modèleVoir le panierVoir les détailsVisble après le défilement de la pageVisitez le forum support des clients premiumVisuelMercrediQue ce soit pour inclure des produits ou des catégories spécifiques.LargeurWooCommerce BookingsWooCommerce réservations facileCalculateur de mesure WooCommerceParamètres WooCommerceWooCommerce SubscriptionsWooCommerce n’est pas activé!AnnéeJour - Mois - AnnéeJour - Mois - AnnéeJour . Mois . AnnéeJour . Mois . AnnéeJour / Mois / AnnéeJour / Mois / AnnéeOuiOui, mais afficher prixVous ne pouvez pas supprimer cet élément.Vous n’êtes pas autorisé à modifier cet élément.Vous ne pouvez pas déplacer cet élément en dehors de la corbeille.Vous n’êtes pas autorisés a déplacer cet élément dans la corbeille.Vous ne pouvez pas restaurer cet élément de la corbeille.Vous avez tenté d’éditer un élément qui n’existe pas. Peut-être a-t-il été supprimé ?Vous pouvez générer un jeton personnel Envato par %sVous ne pouvez sélectionner que jusqu’à %1$s choix pour %2$s.Vous ne pouvez sélectionner que jusqu’à %1$s choix pour %2$s.Vous ne pouvez éditer cet élément parce qu’il se trouve dans la corbeille.Vous ne pouvez pas ajouter plus d’options supplémentaires.Vous ne pouvez ajouter des produits aux prix négatifs au panier.Vous ne pouvez pas ajouter des produits à zéro à des prix au panier.Vous ne pouvez pas entrer plus de %1$s caractères pour « %2$s ».Vous ne pouvez déplacer cet élément dans la corbeille. %s est actuellement en cours d’édition.Vous ne pouvez sélectionner cette date !Vous avez déjà activé ce code d’achat sur un autre domaine !Vous avez déjà activé votre code d’achat !Vous devez saisir au moins %1$s caractères pour « %2$s ».Vous devez sélectionner au moins %1$s choix pour %2$s.Vous devez sélectionner au moins %1$s choix pour %2$s.Vous devez sélectionner exactement %1$s choix pour %2$s.Vous devez sélectionner exactement %1$s choix pour %2$s.Votre nom d’utilisateur Envato.Vos fichiers sont en cours de téléchargementVos réglages ont été réinitialisés.Vos réglages ont été enregistrés.et unautocaractères restantscliquez sur ce liencliquer sur ce liendivQtése termine parfichierfichiersplus grand quesupérieur ou égal àh:mh:m:sh:m:ssh:mmh:mm:sh:mm:ssicihh:mhh:m:shh:m:sshh:mmhh:mm:shh:mm:ssestest viden'est pasn’est pas videsélecteur de jQuery pour l’image du produit principallabelmoins queinférieur ou égal àou enregistrez le plugin pour recevoir des mises à jour automatiques.pFormulaires globauxTableaux de rechercheModèles d’optionsOptions supplémentaires pour le produitTous <span class=\"count\">(%s)</span>Tous <span class=\"count\">(%s)</span>Mon <span class="count">(%s)</span>Mon <span class="count">(%s)</span>Post-it <span class=\"count\">(%s)</span>Post-it <span class=\"count\">(%s)</span>frais d'inscriptionspancommence avecce champ si les conditions suivantes sont remplies.cette section si les conditions suivantes sont remplies.fuseau horairelanguages/woocommerce-tm-extra-product-options-hi_IN.mo000064400000014547150755142440017302 0ustar00��S�qL	#'	+5
<GN
alu��������������q�F�@	H	N	^	c	k	|	�	�	�	
�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	
�	�	�	



,
(?
h
m
s
"|
:�
�
�
�
�

$-3:@"D�g)!Eg	z����$�(,;h	x	�����
���"
-�:����)
-;.Q����,��	'4AWdq���	����(,;/h_��e��2"	U_r�	�����(�!7	JTE->C42"*O=,(#:15I3.GN 7;MB+<6K!8L@/?0)DQ
A$%'P9	JFHRS&
AccordionActionsAddAllAnimationCancelCategoriesCenterCheatin&#8217; uh?CheckboxesCheckoutChoose an optionClearCloseColorDateDeleteDescriptionDisabledDiscountDisplayDoneEditEmailEnable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.Enable to display the total specifically for selected product options.EnabledErrorFinal Total BoxFromGeneralGeneral SettingsGlobalHeightHideIDImport CSVLanguageLargeLeftNameNextNoNormalOpenOrderPriceProductQtyRemoveRightRight sideSaveSelectSettingsShadowShowShow Final TotalShow Options TotalShow when the total is greater than zeroSizeStyleTemplateThere are no saved variations yet.This allows you to generate points along the range picker.This field is required.TimeTitleTitle:ToTotalURLUndoUpdateUploadUsernameValueVisualWidthYeselement quantity input tooltipQtyProject-Id-Version: Extra Product Options & Add-Ons for WooCommerce
Report-Msgid-Bugs-To: 
PO-Revision-Date: 2024-03-07 11:53+0200
Last-Translator: 
Language-Team: themecomplete <themecomplete@gmail.com>
Language: hi_IN
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=(n==0 || n==1);
X-Generator: Poedit 2.4.3
X-Poedit-SourceCharset: UTF-8
X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c
X-Poedit-Basepath: ..
X-Textdomain-Support: yes
X-Poedit-SearchPath-0: .
अकॉर्डियनकार्रवाइयाँजोड़ेंसभीएनीमेशनकैंसिल करेंश्रेणियाँकेंद्रछल कर रहे हैं..?चेक बॉक्सचेकआउटकोई विकल्प चुनेंरिक्तबंदरंगदिनांकहटाएंविवरणअक्षमPrisavslagडिस्प्लेकिया हुआसंपादित करेंईमेलउत्पाद पृष्ठ पर अंतिम कुल बॉक्स प्रदर्शित करने के लिए इस सेटिंग को सक्षम करें, जिससे ग्राहक अपने ऑर्डर की कुल लागत देख सकें, या इसे सरलीकृत उत्पाद पृष्ठ के लिए अक्षम कर सकें.ग्राहकों को समग्र लागत का स्पष्ट अवलोकन प्रदान करते हुए, संपूर्ण उत्पाद को प्रदर्शित करने में सक्षम करें।चयनित उत्पाद विकल्पों के लिए विशेष रूप से कुल प्रदर्शित करने में सक्षम करें।सक्षमत्रुटिअंतिम कुल बॉक्सऔर सेसामान्यसामान्य सेटिंग्सवैश्विकऊंचाईछिपानाआईडीसीएसवी आयात करेंभाषाविशालबाएंनामअगलानहींसामान्यखुलाआदेशमूल्यउत्पादमात्राहटानासहीदाहिनी ओरसेव करेंचुनेंसेटिंग्ससायादिखानाअंतिम योग दिखाएँकुल विकल्प दिखाएँदिखाएँ कि कुल योग कब शून्य से अधिक हैआकारशैलीखाकाअभी तक कोई सहेजी गई विविधताएं नहीं हैं.यह आपको रेंज पिकर के साथ अंक उत्पन्न करने की अनुमति देता है।एह् खेतर लोड़चदा ऐ!.समयशीर्षकशीर्षक:सेवाकुलURLपहले जैसाअपडेट करेंअपलोडउपयोगकर्ता नाममूल्यविज़ुअलचौड़ाईहाँमात्राindex.php000064400000000126150755142440006372 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
tm-woo-extra-product-options.php000064400000002576150755142440013010 0ustar00<?php
/**
 * Plugin Name: Extra Product Options & Add-Ons for WooCommerce
 * Plugin URI: https://epo.themecomplete.com/
 * Description: <code><strong>Extra Product Options</strong></code> elevates your WooCommerce store by adding customizable add-ons.
 * Author: ThemeComplete
 * Author URI: https://themecomplete.com/
 *
 * Version: 6.4.6
 * Requires at least: 5.0
 * Requires PHP: 7.4
 * Tested up to: 7.0
 * WC requires at least: 4.1
 * WC tested up to: 9.0
 * Copyright: © 2024 THEMECOMPLETE LTD
 *
 * @package  Extra Product Options & Add-Ons for WooCommerce
 * @category Core
 * @author   ThemeComplete
 */

defined( 'ABSPATH' ) || exit;

// Define THEMECOMPLETE_EPO_PLUGIN_FILE.
if ( ! defined( 'THEMECOMPLETE_EPO_PLUGIN_FILE' ) ) {
	define( 'THEMECOMPLETE_EPO_PLUGIN_FILE', __FILE__ );
}

// Check if another plugin is overwriting our classes.
if ( class_exists( 'Themecomplete_Extra_Product_Options_Setup' ) ) {
	return;
}

// Include the main Extra Product Options Setup class.
require_once __DIR__ . '/includes/class-themecomplete-extra-product-options-setup.php';

/**
 * Main instance of Themecomplete_Extra_Product_Options_Setup.
 *
 * @since 4.8
 * @return Themecomplete_Extra_Product_Options_Setup
 */
function themecomplete_extra_product_options_setup() {
	return Themecomplete_Extra_Product_Options_Setup::instance();
}

// Setup the plugin.
themecomplete_extra_product_options_setup();
admin/class-themecomplete-epo-admin-global-list-table.php000064400000026441150755142440017464 0ustar00<?php
/**
 * Extra Product Options Field List Table class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

require_once ABSPATH . 'wp-admin/includes/class-wp-posts-list-table.php';

/**
 * Extra Product Options Field List Table class
 *
 * Original WordPress class : class-wp-posts-list-table.php
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */
class THEMECOMPLETE_EPO_ADMIN_Global_List_Table extends WP_Posts_List_Table {

	/**
	 * Holds the admin edit link
	 *
	 * @var string
	 */
	protected $editlink;

	/**
	 * Holds the number of posts for this user.
	 *
	 * @var integer
	 */
	private $user_posts_count;

	/**
	 * Holds the number of posts which are sticky.
	 *
	 * @var integer
	 */
	private $sticky_posts_count = 0;

	/**
	 * Constructor.
	 *
	 * @param array<mixed> $args An associative array of arguments.
	 */
	public function __construct( $args = [] ) {
		global $wpdb;

		$this->editlink = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;

		unset( $_GET['post_type'] ); // phpcs:ignore WordPress.Security.NonceVerification

		add_filter( 'wp_count_posts', [ $this, 'wp_count_posts' ], 10, 3 );

		parent::__construct(
			[
				'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
			]
		);

		$exclude_states = get_post_stati(
			[
				'show_in_admin_all_list' => false,
			]
		);

		$post_type = $this->screen->post_type;

		$user_posts_count_sql = "SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' ) AND post_author = %d";

		// phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$this->user_posts_count = (int) $wpdb->get_var(
			$wpdb->prepare( $user_posts_count_sql, $post_type, get_current_user_id() ) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
		);

		$sticky_posts = get_option( 'sticky_posts' );

		if ( 'post' === $post_type && $sticky_posts ) {
			$sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) );

			$sticky_posts_count_sql = "SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status NOT IN ('trash', 'auto-draft') AND ID IN ($sticky_posts)";
			// phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$this->sticky_posts_count = (int) $wpdb->get_var(
				$wpdb->prepare( $sticky_posts_count_sql, $post_type ) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
			);
		}
	}

	/**
	 * The current screen
	 *
	 * @return WP_Screen
	 */
	public function get_screen() {
		return $this->screen;
	}

	/**
	 * Find the amount of post's type
	 *
	 * @param object $counts An object containing the current post_type's post counts by status.
	 * @param string $type Post type to retrieve count. Default 'post'.
	 * @param string $perm 'readable' or empty. Default empty.
	 * @since 1.0
	 * @return object
	 */
	public function wp_count_posts( $counts, $type, $perm ) {
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$counts = THEMECOMPLETE_EPO_HELPER()->wp_count_posts( $type, $perm );
		}

		return $counts;
	}

	/**
	 * Get an associative array ( id => link ) with the list
	 * of views available on this table.
	 *
	 * @return array<mixed>
	 */
	protected function get_views() {
		global $locked_post_status, $avail_post_stati;

		$views = [];

		$link_post_type = 'product';

		$post_type = $this->screen->post_type;

		if ( ! empty( $locked_post_status ) ) {
			return $views;
		}

		$num_posts   = wp_count_posts( $post_type, 'readable' );
		$total_posts = array_sum( (array) $num_posts );
		$class       = '';

		$current_user_id = get_current_user_id();
		$all_args        = [
			'post_type' => $link_post_type,
			'page'      => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK,
		];
		$mine            = '';

		// Subtract post types that are not included in the admin all list.
		foreach ( get_post_stati( [ 'show_in_admin_all_list' => false ] ) as $state ) {
			$total_posts -= $num_posts->$state;
		}

		if ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) {
			if ( isset( $_GET['author'] ) && ( intval( $_GET['author'] ) === $current_user_id ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				$class = 'current';
			}

			$mine_args = [
				'post_type' => $link_post_type,
				'page'      => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK,
				'author'    => $current_user_id,
			];

			$mine_inner_html = sprintf(
				/* translators: %s: Number of posts. */
				_nx(
					'Mine <span class="count">(%s)</span>',
					'Mine <span class="count">(%s)</span>',
					$this->user_posts_count,
					'posts'
				),
				number_format_i18n( $this->user_posts_count )
			);

			$mine = [
				'url'     => esc_url( add_query_arg( $mine_args, 'edit.php' ) ),
				'label'   => $mine_inner_html,
				'current' => isset( $_GET['author'] ) && ( intval( $_GET['author'] ) === $current_user_id ), // phpcs:ignore WordPress.Security.NonceVerification
			];

			$all_args['all_posts'] = 1;
			$class                 = '';
		}

		$all_inner_html = sprintf(
			/* translators: %s: Number of posts. */
			_nx(
				'All <span class="count">(%s)</span>',
				'All <span class="count">(%s)</span>',
				$total_posts,
				'posts'
			),
			number_format_i18n( $total_posts )
		);

		$status_links = [
			'all' => [
				'url'     => esc_url( add_query_arg( $all_args, 'edit.php' ) ),
				'label'   => $all_inner_html,
				'current' => $this->is_base_request() || isset( $_REQUEST['all_posts'] ), // phpcs:ignore WordPress.Security.NonceVerification
			],
		];

		if ( is_array( $mine ) ) {
			$status_links['mine'] = $mine;
		}

		foreach ( get_post_stati( [ 'show_in_admin_status_list' => true ], 'objects' ) as $status ) {
			$class = '';

			$status_name = (string) $status->name;

			if ( ! in_array( $status_name, $avail_post_stati, true ) || empty( $num_posts->$status_name ) ) {
				continue;
			}

			if ( isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'] ) { // phpcs:ignore WordPress.Security.NonceVerification
				$class = 'current';
			}

			$status_args = [
				'post_status' => $status_name,
				'post_type'   => $link_post_type,
				'page'        => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK,
			];

			$status_label = sprintf(
				translate_nooped_plural( $status->label_count, $num_posts->$status_name ),
				number_format_i18n( $num_posts->$status_name )
			);

			$status_links[ $status_name ] = [
				'url'     => esc_url( add_query_arg( $status_args, 'edit.php' ) ),
				'label'   => $status_label,
				'current' => isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'], // phpcs:ignore WordPress.Security.NonceVerification
			];
		}

		if ( ! empty( $this->sticky_posts_count ) ) {
			$class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : ''; // phpcs:ignore WordPress.Security.NonceVerification

			$sticky_args = [
				'post_type'   => $link_post_type,
				'page'        => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK,
				'show_sticky' => 1,
			];

			$sticky_inner_html = sprintf(
				/* translators: %s: Number of posts. */
				_nx(
					'Sticky <span class="count">(%s)</span>',
					'Sticky <span class="count">(%s)</span>',
					$this->sticky_posts_count,
					'posts'
				),
				number_format_i18n( $this->sticky_posts_count )
			);

			$sticky_link = [
				'sticky' => [
					'url'     => esc_url( add_query_arg( $sticky_args, 'edit.php' ) ),
					'label'   => $sticky_inner_html,
					'current' => ! empty( $_REQUEST['show_sticky'] ), // phpcs:ignore WordPress.Security.NonceVerification
				],
			];

			// Sticky comes after Publish, or if not listed, after All.
			$split        = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ), true );
			$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );
		}

		if ( method_exists( get_parent_class(), 'get_views_links' ) ) {
			$views = parent::get_views_links( $status_links ); // @phpstan-ignore-line
		}

		return $views;
	}

	/**
	 * Helper to create links to edit.php with params.
	 *
	 * @param string[] $args  Associative array of URL parameters for the link.
	 * @param string   $label Link text.
	 * @param string   $class_name Optional. Class attribute. Default empty string.
	 *
	 * @return string The formatted link string.
	 */
	protected function get_edit_link( $args, $label, $class_name = '' ) {

		unset( $args['post_type'] );

		$url          = add_query_arg( $args, $this->editlink );
		$class_html   = '';
		$aria_current = '';
		if ( ! empty( $class_name ) ) {
			$class_html = sprintf(
				' class="%s"',
				esc_attr( $class_name )
			);

			if ( 'current' === $class_name ) {
				$aria_current = ' aria-current="page"';
			}
		}

		return sprintf(
			'<a href="%s"%s%s>%s</a>',
			esc_url( $url ),
			$class_html,
			$aria_current,
			$label
		);
	}

	/**
	 * Prepares the list of items for displaying.
	 *
	 * @return void
	 */
	public function prepare_items() {

		parent::prepare_items();

		global $avail_post_stati, $wp_query, $per_page, $mode;

		$post_type = $this->screen->post_type;

		THEMECOMPLETE_EPO_WPML()->apply_query_filter();
		$avail_post_stati = wp_edit_posts_query( array_merge( $_GET, [ 'post_type' => $post_type ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.WP.GlobalVariablesOverride
		THEMECOMPLETE_EPO_WPML()->remove_query_filter();

		$this->hierarchical_display = ( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' === $wp_query->query['orderby'] );

		$per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride

		// This filter is documented in wp-admin/includes/post.php.
		$per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride

		if ( $this->hierarchical_display ) {
			$total_items = $wp_query->post_count;
		} elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) {
			$total_items = $wp_query->found_posts;
		} else {
			$post_counts = (array) wp_count_posts( $post_type, 'readable' );

			if ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'], $avail_post_stati, true ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$total_items = $post_counts[ sanitize_text_field( wp_unslash( $_REQUEST['post_status'] ) ) ]; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			} elseif ( isset( $_REQUEST['show_sticky'] ) && sanitize_text_field( wp_unslash( $_REQUEST['show_sticky'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$total_items = $this->sticky_posts_count;
			} elseif ( isset( $_GET['author'] ) && get_current_user_id() === intval( $_GET['author'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$total_items = $this->user_posts_count;
			} else {
				$total_items = array_sum( $post_counts );

				// Subtract post types that are not included in the admin all list.
				foreach ( get_post_stati( [ 'show_in_admin_all_list' => false ] ) as $state ) {
					$total_items -= $post_counts[ $state ];
				}
			}
		}

		if ( $this->hierarchical_display ) {
			$total_pages = ceil( $total_items / $per_page );
		} else {
			$total_pages = $wp_query->max_num_pages;
		}

		$this->set_pagination_args(
			[
				'total_items' => $total_items,
				'total_pages' => $total_pages,
				'per_page'    => $per_page,
			]
		);
	}
}
admin/class-themecomplete-epo-admin-lookuptable-base.php000064400000034452150755142440017420 0ustar00<?php
/**
 * Extra Product Options admin setup
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options admin lookup table setup
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_Admin_LookupTable_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Admin_LookupTable_Base|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Admin_LookupTable_Base
	 * @since 6.1
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.1
	 */
	public function __construct() {
		// Load scripts.
		add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ], 11 );

		add_action( 'admin_footer', [ $this, 'script_templates' ] );

		add_action( 'wp_ajax_tc_lookup_table_import', [ $this, 'import' ] );
		add_action( 'wp_ajax_tc_lookup_table_export', [ $this, 'export' ] );

		// save meta data.
		add_action( 'save_post', [ $this, 'tm_save_postdata' ], 1, 2 );
	}

	/**
	 * Save our meta data
	 *
	 * @param integer $post_id The post id.
	 * @param WP_Post $post_object The post object.
	 * @return void
	 * @since 6.1
	 */
	public function tm_save_postdata( $post_id, $post_object ) {
		if ( empty( $_POST ) || ! isset( $_POST['post_type'] ) || ( THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE !== $_POST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return;
		}
		$this->tm_save_postdata_do( $post_id, $post_object );
	}

	/**
	 * Save meta data
	 *
	 * @param integer $post_id The post id.
	 * @param WP_Post $post_object The post object.
	 * @return void|integer
	 * @since 6.1
	 */
	public function tm_save_postdata_do( $post_id, $post_object ) {
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
			return $post_id;
		}
		if ( 'revision' === $post_object->post_type ) {
			return;
		}
		check_admin_referer( 'update-post_' . $post_id );

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $post_id;
		}

		if ( isset( $_POST['lookuptable_meta_changed'] ) ) {
			$tm_metas = wp_unslash( $_POST['lookuptable_meta_changed'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tm_metas = rawurldecode( $tm_metas );
			$tm_metas = nl2br( $tm_metas );
			$tm_metas = json_decode( $tm_metas, true );

			if ( ! empty( $tm_metas ) && is_array( $tm_metas ) ) {
				$old_data = themecomplete_get_post_meta( $post_id, 'lookuptable_meta', true );
				$save     = themecomplete_save_post_meta( $post_id, $tm_metas, $old_data, 'lookuptable_meta' );
			}
		}
	}

	/**
	 * Import a lookup table.
	 *
	 * @return void
	 * @since 6.1
	 */
	public function import() {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->lookuptable_import();
	}

	/**
	 * Export a lookup table.
	 *
	 * @return void
	 * @since 6.3
	 */
	public function export() {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->export_lookuptable( 'metaserialized' );
	}

	/**
	 * Print script templates
	 *
	 * @return void
	 * @since 6.1
	 */
	public function script_templates() {
		// The check is required in case other plugin do things that don't load the wc_get_template function.
		if ( function_exists( 'wc_get_template' ) ) {
			wc_get_template( 'tc-js-admin-templates.php', [], '', THEMECOMPLETE_EPO_PLUGIN_PATH . '/assets/js/admin/' );
		}
	}

	/**
	 * Load scripts
	 *
	 * @param string $hook_suffix The current admin page.
	 * @return void
	 * @since 6.1
	 */
	public function admin_enqueue_scripts( $hook_suffix ) {
		if ( in_array( $hook_suffix, [ 'post.php', 'post-new.php' ], true ) ) {
			$screen = get_current_screen();
			if ( is_object( $screen ) && THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE === $screen->post_type ) {
				$this->register_admin_scripts();
			}
		}
	}

	/**
	 * Enqueue plugin scripts and dequeue unwanted woocommerce scripts
	 *
	 * @return void
	 * @since 6.1
	 */
	public function register_admin_scripts() {
		global $wp_query, $post;
		$ext = '.min';
		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}
		THEMECOMPLETE_EPO_ADMIN_GLOBAL()->register_admin_styles( 1 );
		wp_enqueue_style( 'themecomplete-lookuptable-admin', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-lookup-table-admin' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );

		wp_register_script( 'themecomplete-api', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-api' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
		wp_register_script( 'jquery-tcfloatbox', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tcfloatbox' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
		wp_register_script( 'jquery-tctooltip', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctooltip' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
		wp_register_script( 'themecomplete-tabs', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctabs' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
		wp_register_script( 'toastr', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/toastr' . $ext . '.js', [], '2.1.4', true );
		wp_register_script(
			'themecomplete-epo-admin-lookuptable',
			THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/tm-epo-admin-lookuptable' . $ext . '.js',
			[
				'jquery',
				'json2',
				'wp-util',
				'themecomplete-api',
				'toastr',
				'themecomplete-tabs',
				'jquery-tcfloatbox',
				'jquery-tctooltip',
				'plupload-all',
			],
			THEMECOMPLETE_EPO_VERSION,
			true
		);

		$post_id = isset( $post->ID ) ? floatval( $post->ID ) : '';
		$meta    = themecomplete_get_post_meta( $post_id, 'lookuptable_meta', true );
		$params  = [
			'post_id'                                   => sprintf( '%d', $post_id ),
			'import_nonce'                              => wp_create_nonce( 'import-nonce' ),
			'export_nonce'                              => wp_create_nonce( 'export-nonce' ),
			'tm_epo_global_displayed_decimal_separator' => get_option( 'tm_epo_global_displayed_decimal_separator' ),
			'currency_format_decimal_sep'               => esc_attr( wp_unslash( get_option( 'woocommerce_price_decimal_sep' ) ) ),

			// WPML 3.3.x fix.
			'ajax_url'                                  => strtok( admin_url( 'admin-ajax' . '.php' ), '?' ), // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
			'i18n_invalid_request'                      => esc_html__( 'Invalid request!', 'woocommerce-tm-extra-product-options' ),
			'i18n_import_title'                         => esc_html__( 'Importing data', 'woocommerce-tm-extra-product-options' ),
			'i18n_epo'                                  => esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
			'i18n_importing'                            => esc_html__( 'Importing csv...', 'woocommerce-tm-extra-product-options' ),
			'i18n_saving'                               => esc_html__( 'Saving... Please wait.', 'woocommerce-tm-extra-product-options' ),
			'i18n_update'                               => esc_html__( 'Update', 'woocommerce-tm-extra-product-options' ),
			'i18n_cancel'                               => esc_html__( 'Cancel', 'woocommerce-tm-extra-product-options' ),
			'i18n_invalid_csv'                          => esc_html__( 'Invalid CSV table!', 'woocommerce-tm-extra-product-options' ),
			'i18n_error_title'                          => esc_html__( 'Error', 'woocommerce-tm-extra-product-options' ),
			'i18n_error_message'                        => esc_html__( 'An error has occurred!', 'woocommerce-tm-extra-product-options' ),
			'i18n_overwrite_existing_tables'            => esc_html__( 'Overwrite existing tables', 'woocommerce-tm-extra-product-options' ),
			'lookuptable'                               => $meta,
		];
		wp_localize_script( 'themecomplete-epo-admin-lookuptable', 'TMEPOADMINLOOKUPJS', $params );
		wp_enqueue_script( 'themecomplete-epo-admin-lookuptable' );
	}

	/**
	 * Submenu "Lookup Table"
	 *
	 * @return void
	 * @since 6.1
	 */
	public function preload_lookuptable_settings() {
		// Look up table meta box.
		add_meta_box( 'tmformfieldsbuilder', esc_html__( 'Look up table', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_lookup_tables_meta_box' ], THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE, 'normal', 'core' );
	}

	/**
	 * Lookup tables meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 6.1
	 */
	public function tm_lookup_tables_meta_box( $post ) {

		?>
		<div id="tmformfieldsbuilderwrap" class="tc-wrapper">
			<?php
			echo '<input id="builder_import_file" name="builder_import_file" type="file" class="builder-import-file">';
			echo '<div class="builder-layout tm-hidden builder-lookuptable">';
			$this->print_saved_lookuptable( $post->ID );
			echo '</div>';

			echo '<div id="tc-welcome" class="tc-welcome">';
			echo '<div class="tc-info-text">'
				. esc_html__( 'No CSV table found!', 'woocommerce-tm-extra-product-options' )
				. '<br><small>'
				. esc_html__( 'Import one by clicking the button below.', 'woocommerce-tm-extra-product-options' )
				. '</small></div>';
			echo '</div>';
			echo '<div class="tc-buttons">';
			echo '<button type="button" class="tm-animated tc-add-import-csv tc tc-button large" title="' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label">' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
			echo '<button type="button" class="tm-animated tc-add-export-csv tc tc-button large" title="' . esc_html__( 'Export CSV', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label">' . esc_html__( 'Export CSV', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
			echo '</div>';
			?>
		</div>
		<?php
	}

	/**
	 * Generates the saved lookup table.
	 *
	 * @param integer $post_id The current post id.
	 * @return void
	 * @since 6.1
	 * @access public
	 */
	public function print_saved_lookuptable( $post_id = 0 ) {

		$builder = themecomplete_get_post_meta( $post_id, 'lookuptable_meta', true );

		if ( ! is_array( $builder ) ) {
			$builder = [];
		}

		if ( ! empty( $post_id ) && is_array( $builder ) && count( $builder ) > 0 ) {
			$lookup_tables = [];
			$lookuptables  = THEMECOMPLETE_EPO()->fetch_all_lookuptables();
			if ( $lookuptables ) {
				foreach ( $lookuptables as $table ) {
					$meta = themecomplete_get_post_meta( $table->ID, 'lookuptable_meta', true );
					if ( ! is_array( $meta ) ) {
						$meta = [];
					}
					foreach ( $meta as $table_name => $table_data ) {
						$index = 0;
						if ( isset( $lookup_tables[ $table_name ] ) ) {
							$index = count( $lookup_tables[ $table_name ] );
						}
						$lookup_tables[ $table_name ][ $table->ID ] = $index;
					}
				}
			}
			echo '<div class="lookuptable-wrapper">';
			echo '<div class="container-lookup-table">';
			echo '<div class="wrap-lookup-table">';
			$decimal_separator = wc_get_price_decimal_separator();
			foreach ( $builder as $table_name => $data ) {
				$table_index = isset( $lookup_tables[ $table_name ][ $post_id ] ) ? $lookup_tables[ $table_name ][ $post_id ] : 0;
				$rows        = [];
				echo '<div class="lookuptable-name">';
				echo '<div class="table-name">';
				echo '<span class="table-name-label">' . esc_html__( 'Table name', 'woocommerce-tm-extra-product-options' ) . '</span>';
				echo '<span contenteditable="true" class="table-name-value">' . esc_html( $table_name ) . '</span>';
				echo '</div>';
				if ( isset( $lookup_tables[ $table_name ] ) && count( $lookup_tables[ $table_name ] ) > 1 ) {
					echo '<div class="table-index">';
					echo '<span class="table-index-label">' . esc_html__( 'Table index', 'woocommerce-tm-extra-product-options' ) . '</span>';
					echo '<span class="table-index-value">' . esc_html( (string) $table_index ) . '</span>';
					echo '</div>';
				}
				echo '</div>';
				echo '<div class="lookup-table-wrap epo">';
				echo '<table class="lookup-table" data-vertable="epo">';
				echo '<thead>';
				echo '<tr class="row head">';
				echo '<th class="ltcell column1" data-row="1" data-column="1"></th>';
				$counter = 1;
				foreach ( $data as $x => $y_data ) {
					++$counter;
					foreach ( $y_data as $y => $cell ) {
						$rows[ $y ][] = $cell;
					}
					echo '<th contenteditable="true" class="ltcell column' . esc_attr( (string) $counter ) . '" data-row="1" data-column="' . esc_attr( (string) $counter ) . '">';
					if ( is_numeric( $x ) ) {
						echo esc_html( str_replace( '.', $decimal_separator, (string) $x ) );
					} else {
						echo esc_html( $x );
					}
					echo '</th>';
				}
				echo '</tr>';
				echo '</thead>';
				echo '<tbody>';
				$row = 1;
				foreach ( $rows as $row1 => $rown ) {
					$counter = 1;
					++$row;
					echo '<tr class="row row' . esc_attr( (string) $row ) . '">';
					echo '<td contenteditable="true" class="ltcell column' . esc_attr( (string) $counter ) . '" data-row="' . esc_attr( (string) $row ) . '" data-column="' . esc_attr( (string) $counter ) . '">';
					if ( is_numeric( $row1 ) ) {
						echo esc_html( str_replace( '.', $decimal_separator, (string) $row1 ) );
					} else {
						echo esc_html( $row1 );
					}
					echo '</td>';
					foreach ( $rown as $cell_data ) {
						++$counter;
						echo '<td contenteditable="true" class="ltcell column' . esc_attr( (string) $counter ) . '" data-row="' . esc_attr( (string) $row ) . '" data-column="' . esc_attr( (string) $counter ) . '">' . esc_html( str_replace( '.', $decimal_separator, $cell_data ) ) . '</td>';
					}
					echo '</tr>';
				}
				echo '</tbody>';
				echo '</table>';
				echo '</div>';
			}
			echo '</div>';
			echo '</div>';
			echo '</div>';
		}
	}

	/**
	 * Save imported CSV
	 *
	 * @param integer $post_id The post id.
	 * @return void|false
	 * @since 6.1
	 */
	public function save_imported_csv( $post_id ) {
		if ( empty( $post_id ) ) {
			return false;
		}

		$import = get_transient( 'tc_lookuptable_import_csv_' . $post_id );

		if ( ! empty( $import ) ) {

			delete_transient( 'tc_lookuptable_import_csv_' . $post_id );

			$meta = 'lookuptable_meta';
			$post = get_post( $post_id );
			if ( $post && property_exists( $post, 'ID' ) && property_exists( $post, 'post_type' ) ) {
				$old_data = themecomplete_get_post_meta( $post_id, $meta, true );
				themecomplete_save_post_meta( $post_id, $import, $old_data, $meta );
				$this->print_saved_lookuptable( $post_id );
			}
		}
	}
}
admin/index.php000064400000000126150755142440007462 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
admin/views/html-tm-epo.php000064400000007305150755142440011661 0ustar00<?php
/**
 * View for displaying saved TM EPOs
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

global $post_id, $tm_is_ajax, $woocommerce;
$attributes  = themecomplete_get_attributes( $post_id );
$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );

// Check for variations.
$non_variation_attribute_found = false;
if ( $attributes ) {
	foreach ( $attributes as $attribute ) {
		if ( isset( $attribute['is_variation'] ) && ! $attribute['is_variation'] ) {
			$non_variation_attribute_found = true;
			break;
		}
	}
}

// When $variation_attribute_found && $variations.
if ( ! $attributes || ! $non_variation_attribute_found ) : ?>
	<div id="message" class="tc-info-text">
		<?php esc_html_e( 'Before adding Extra Options in this mode, add and save some attributes on the Attributes tab.', 'woocommerce-tm-extra-product-options' ); ?>
	</div>
<?php else : ?>
	<p class="toolbar">
		<a href="#" class="expand_all"><?php esc_html_e( 'Expand all', 'woocommerce-tm-extra-product-options' ); ?></a>
		/
		<a href="#" class="close_all"><?php esc_html_e( 'Close all', 'woocommerce-tm-extra-product-options' ); ?></a>
	</p>
	<div class="tc-normal-epos wc-metaboxes">
		<?php
		// Get parent data.
		$parent_data = [
			'id'         => $post_id,
			'attributes' => $attributes,
		];

		if ( ! isset( $tmepos ) ) {
			$args   = [
				'post_type'   => THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
				'post_status' => [ 'private', 'publish' ],
				'numberposts' => -1,
				'orderby'     => 'menu_order',
				'order'       => 'asc',
				'post_parent' => $post_id,
			];
			$tmepos = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
		}

		if ( $tmepos ) {
			// Get variations.
			$args       = [
				'post_type'   => 'product_variation',
				'post_status' => [ 'private', 'publish' ],
				'numberposts' => -1,
				'orderby'     => 'menu_order',
				'order'       => 'asc',
				'post_parent' => $post_id,
			];
			$variations = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
			$loop       = 0;
			foreach ( $tmepos as $price ) {
				$tmcp_id          = absint( $price->ID );
				$tmcp_post_status = esc_attr( $price->post_status );
				$tmcp_data        = themecomplete_get_post_meta( $tmcp_id );
				$variation_fields = [
					'_regular_price',
					'tmcp_required',
					'tmcp_hide_price',
					'tmcp_limit',
					'_regular_price_type',
				];
				foreach ( $variation_fields as $field ) {
					$$field = isset( $tmcp_data[ $field ][0] ) ? themecomplete_maybe_unserialize( $tmcp_data[ $field ][0] ) : '';

				}
				/**
				 *
				 * $key = attirbute
				 * $k = variation
				 * $v = price
				 */
				if ( isset( $_regular_price ) && is_array( $_regular_price ) ) {
					foreach ( $_regular_price as $key => $value ) {
						foreach ( $value as $k => $v ) {
							$_regular_price[ $key ][ $k ] = wc_format_localized_price( $v );
						}
					}
				}

				include 'html-tm-epo-admin.php';

				++$loop;
			}
		}
		?>
	</div>
	<p class="toolbar">
		<button type="button" class="tc tc-button fr tm_add_epo" <?php disabled( ( count( $attributes ) > 0 ), false ); ?>><?php esc_html_e( 'Add Extra Option', 'woocommerce-tm-extra-product-options' ); ?></button>
		<span class="fr">
	<?php
	// Ouput Attributes List.
	esc_html_e( 'Attribute:', 'woocommerce-tm-extra-product-options' );
	echo ' <select class="tmcp-attr-list" name="tmcp-attr-list">';
	foreach ( $attributes as $attribute ) {
		// Only deal with attributes that are not variations.
		if ( $attribute['is_variation'] ) {
			continue;
		}

		echo '<option value="' . esc_attr( sanitize_title( $attribute['name'] ) ) . '">' . esc_html( wc_attribute_label( $attribute['name'] ) ) . '</option>';
	}
	echo '</select>';
	?>
			</span>
	</p>
	<?php
endif;
?>
admin/views/index.php000064400000000126150755142440010617 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
admin/views/html-tm-epo-admin-variations.php000064400000001703150755142440015120 0ustar00<?php
/**
 * View for displaying the variation select box
 *
 * @package Extra Product Options/Admin/Views
 * @version 4.8.5
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $variations ) && isset( $loop ) ) {
	$tmcp_attribute_selected_value = isset( $tmcp_data['tmcp_attribute'][0] ) ? $tmcp_data['tmcp_attribute'][0] : '';
	$tmcp_type_selected_value      = isset( $tmcp_data['tmcp_type'][0] ) ? $tmcp_data['tmcp_type'][0] : '';

	?>
	<select class="tmcp-variation" name="tmcp_variation[<?php echo esc_attr( $loop ); ?>]">
		<option value="0"><?php esc_html_e( 'Any', 'woocommerce-tm-extra-product-options' ); ?> &hellip;</option>
		<?php
		$_variations = (array) $variations;
		foreach ( $_variations as $_variation ) {
			$_variation = (array) $_variation;
			?>
			<option value="<?php echo esc_attr( sanitize_title( $_variation['ID'] ) ); ?>"><?php echo esc_html( $_variation['ID'] ); ?></option>
			<?php
		}
		?>
	</select>
	<?php
	unset( $_variations );
}
admin/views/html-tm-epo-order-item.php000064400000023765150755142440013736 0ustar00<?php
/**
 * Shows an order item
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $item, $item_id, $order, $_product, $item_meta, $epo, $key, $epo_name, $epo_value, $epo_edit_value, $edit_buttons, $epo_edit_cost, $epo_edit_quantity, $epo_is_fee, $epo_quantity, $order_taxes ) ) :
	$item_id           = intval( $item_id );
	$key               = (string) $key;
	$epo_name          = (string) $epo_name;
	$epo_value         = (string) $epo_value;
	$epo_quantity      = (string) $epo_quantity;
	$epo_edit_value    = (bool) $epo_edit_value;
	$edit_buttons      = (bool) $edit_buttons;
	$epo_edit_cost     = (bool) $epo_edit_cost;
	$epo_edit_quantity = (bool) $epo_edit_quantity;
	$epo_is_fee        = (bool) $epo_is_fee;
	$order_taxes       = (array) $order_taxes;
	$item_meta         = (array) $item_meta;
	$epo               = (array) $epo;

	$input_type = ( $order instanceof WC_Order || $order instanceof WC_Order_Refund ) && ( is_callable( [ $order, 'is_editable' ] ) && $order->is_editable() ) ? 'number' : 'text';

	$product_link  = $_product ? admin_url( 'post.php?post=' . absint( themecomplete_get_id( $_product ) ) . '&action=edit' ) : '';
	$thumbnail     = '';
	$tax_data      = wc_tax_enabled() ? themecomplete_maybe_unserialize( isset( $item['line_tax_data'] ) ? $item['line_tax_data'] : '' ) : false;
	$item_total    = ( isset( $item['line_total'] ) ) ? esc_attr( wc_format_localized_price( $item['line_total'] ) ) : '';
	$item_subtotal = ( isset( $item['line_subtotal'] ) ) ? esc_attr( wc_format_localized_price( $item['line_subtotal'] ) ) : '';

	$currency_arg             = [ 'currency' => $order->get_currency() ];
	$epo_can_show_order_price = apply_filters( 'epo_can_show_order_price', true, $item_meta );
	$row_class                = apply_filters( 'woocommerce_admin_html_order_item_class', isset( $class ) && ! empty( $class ) ? $class : '', $item, $order );
	?>
<tr class="tm-order-line-option item <?php echo esc_attr( (string) $row_class ); ?>" data-order_item_id="<?php echo esc_attr( (string) $item_id ); ?>" data-tm_item_id="<?php echo esc_attr( (string) $item_id ); ?>" data-tm_key_id="<?php echo esc_attr( (string) $key ); ?>">
	<?php echo ( version_compare( WC()->version, '2.6', '>=' ) ) ? '' : '<td class="check-column">&nbsp;</td>'; ?>
	<td class="thumb">
		<?php
		echo '<div class="tc-epo-wc-order-item-thumbnail">' . apply_filters( 'wc_epo_kses', wp_kses_post( $thumbnail ), $thumbnail, false ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		?>
	</td>
	<td class="tm-c name" data-sort-value="<?php echo esc_attr( $item['name'] ); ?>">
		<div class="tm-50">
			<?php
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $epo_name ), $epo_name, false ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			?>
		</div>
		<div class="view">
			<div class="tm-50">
				<?php
				if ( isset( $epo['display_value'] ) ) {
					echo apply_filters( 'wc_epo_kses', wp_kses_post( $epo['display_value'] ), $epo['display_value'], false ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				}
				echo apply_filters( 'wc_epo_kses', wp_kses_post( $epo_value ), $epo_value, false ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				?>
			</div>
		</div>
		<?php if ( $epo_edit_value ) { ?>
			<div class="edit">
				<div class="tm-50">
					<?php
					$textarea_value = '';
					$edit_value     = $epo['value'];
					if ( isset( $epo['edit_value'] ) ) {
						$edit_value = $epo['edit_value'];
					}
					if ( is_array( $edit_value ) ) {
						$edit_value     = THEMECOMPLETE_EPO_HELPER()->entity_decode( $edit_value );
						$edit_value     = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $edit_value, THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ) );
						$textarea_value = $edit_value;
					} else {
						$textarea_value = $edit_value;
					}
					?>
					<textarea novalidate name="tm_epo[<?php echo esc_attr( (string) $item_id ); ?>][<?php echo esc_attr( (string) $key ); ?>][value]" class="value"><?php echo esc_textarea( $textarea_value ); ?></textarea>
				</div>
			</div>
		<?php } ?>
	</td>

	<?php

	do_action( 'woocommerce_admin_order_item_values', $_product, $item, 0 );
	do_action( 'wc_epo_admin_order_item', $order, $_product, $item, $item_id, $epo, $key );

	?>

	<td class="item_cost" width="1%" data-sort-value="<?php echo esc_attr( $order->get_item_subtotal( $item, false, true ) ); ?>">
		<?php

		if ( $epo['quantity'] <= 0 ) {
			if ( $epo_can_show_order_price ) {
				echo '<div class="view">' . wc_price( 0, $currency_arg ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			}
			if ( $epo_can_show_order_price && $epo_edit_cost ) {
				echo '<div class="edit"><input novalidate type="' . esc_attr( (string) $input_type ) . '" name="tm_epo[' . esc_attr( (string) $item_id ) . '][' . esc_attr( $key ) . '][price]" placeholder="0" value="0" data-qty="0" class="price"></div>';
			}
		} else {
			echo '<div class="view">';

			if ( $epo_can_show_order_price ) {
				if ( $epo_is_fee ) {
					echo wc_price( (float) $epo['price'], $currency_arg ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				} else {
					// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
					echo wc_price(
						themecomplete_order_get_price_excluding_tax(
							$order,
							$item_id,
							[
								'qty'   => 1,
								'price' => $epo['price'],
							]
						) / $epo['quantity'],
						$currency_arg
					);
				}
			}

			echo '</div>';
			if ( $epo_can_show_order_price && $epo_edit_cost ) {
				echo '<div class="edit"><input novalidate type="' . esc_attr( (string) $input_type ) . '" name="tm_epo[' . esc_attr( (string) $item_id ) . '][' . esc_attr( (string) $key ) . '][price]" placeholder="0" value="' .
				esc_attr(
					(string) ( themecomplete_order_get_price_excluding_tax(
						$order,
						$item_id,
						[
							'qty'   => 1,
							'price' => $epo['price'],
						]
					) / $epo['quantity'] )
				) .
				'" data-qty="' .
				esc_attr(
					$epo['quantity']
				) .
				'" class="price"></div>';
			}
		}

		?>
	</td>
	<td class="quantity" width="1%">
		<div class="view">
			<?php
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $epo_quantity ), $epo_quantity, false ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			?>
		</div>
		<?php if ( $epo_edit_quantity ) { ?>
			<div class="edit">
				<?php $item_qty = esc_attr( $item['qty'] ); ?>
				<input novalidate type="<?php echo esc_attr( $input_type ); ?>" step="1" min="0" autocomplete="off" name="tm_epo[<?php echo absint( $item_id ); ?>][<?php echo esc_attr( $key ); ?>][quantity]" placeholder="0" value="<?php echo esc_attr( $epo['quantity'] ); ?>" data-qty="<?php echo esc_attr( $epo['quantity'] ); ?>" class="quantity">
				<small>&times;<?php echo esc_html( (string) $item_meta['_qty'][0] ); ?></small>
			</div>
		<?php } ?>
	</td>
	<td class="line_cost" width="1%" data-sort-value="<?php echo esc_attr( isset( $item['line_total'] ) ? $item['line_total'] : '' ); ?>">
		<div class="view">
			<?php
			if ( $epo_can_show_order_price ) {
				echo '<span class="amount">';
				if ( $epo_is_fee ) {
					echo wc_price( (float) $epo['price'], $currency_arg ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				} else {
					// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
					echo wc_price(
						(float) themecomplete_order_get_price_excluding_tax(
							$order,
							$item_id,
							[
								'qty'   => 1,
								'price' => $epo['price'],
							]
						) * (float) $item_meta['_qty'][0],
						$currency_arg
					);
				}
				echo '</span>';
			}
			?>
		</div>
	</td>

	<?php
	if ( ! empty( $tax_data ) ) {
		$tax_based_on = get_option( 'woocommerce_tax_based_on' );

		$state    = '';
		$postcode = '';
		$city     = '';

		if ( 'billing' === $tax_based_on ) {
			$country  = $order->get_billing_country();
			$state    = $order->get_billing_state();
			$postcode = $order->get_billing_postcode();
			$city     = $order->get_billing_city();
		} elseif ( 'shipping' === $tax_based_on ) {
			$country  = $order->get_shipping_country();
			$state    = $order->get_shipping_state();
			$postcode = $order->get_shipping_postcode();
			$city     = $order->get_shipping_city();
		}

		// Default to base.
		if ( 'base' === $tax_based_on || empty( $country ) ) {
			$default  = wc_get_base_location();
			$country  = $default['country'];
			$state    = $default['state'];
			$postcode = '';
			$city     = '';
		}
		$tax_class = $item['tax_class'];
		$tax_rates = WC_Tax::find_rates(
			[
				'country'   => $country,
				'state'     => $state,
				'postcode'  => $postcode,
				'city'      => $city,
				'tax_class' => $tax_class,
			]
		);
		if ( $epo_is_fee ) {
			$epo_line_taxes = WC_Tax::calc_tax( (float) $epo['price'], $tax_rates, false );
		} else {
			$epo_line_taxes = WC_Tax::calc_tax( (float) $epo['price'] * (float) $item_meta['_qty'][0], $tax_rates, themecomplete_order_get_att( $order, 'prices_include_tax' ) );
		}


		foreach ( $order_taxes as $tax_item ) {
			$tax_item_id = $tax_item['rate_id'];
			if ( $tax_item instanceof WC_Order_Item_Tax && is_callable( [ $tax_item, 'get_rate_id' ] ) ) {
				$tax_item_id = $tax_item->get_rate_id();
			}
			?>
			<td class="line_tax" width="1%">
				<div class="view">
					<?php
					if ( isset( $epo_line_taxes[ $tax_item_id ] ) ) {
						$tax_price = $epo_line_taxes[ $tax_item_id ];
						echo wc_price( wc_round_tax_total( $tax_price ), $currency_arg ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
					} else {
						echo '&ndash;';
					}
					?>
				</div>
			</td>
			<?php
		}
	}
	?>
	<td class="wc-order-edit-line-item" width="1%">
		<div class="wc-order-edit-line-item-actions">
			<?php if ( $edit_buttons && $order->is_editable() ) : ?>
				<a class="edit-order-item tips" href="#" data-tip="<?php esc_attr_e( 'Edit item', 'woocommerce' ); ?>"></a>
				<a class="tm-delete-order-item tips" href="#" data-tip="<?php esc_attr_e( 'Delete item', 'woocommerce' ); ?>"></a>
			<?php endif; ?>
		</div>
	</td>
</tr>
	<?php
endif;
admin/views/html-tm-global-epo.php000064400000044221150755142440013115 0ustar00<?php
/**
 * View for displaying saved Global EPOs
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

global $post, $post_id, $tm_is_ajax, $woocommerce;
$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id );
if ( ! $wpml_is_original_product ) {
	$tm_meta_cpf = themecomplete_get_post_meta( absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) ), 'tm_meta_cpf', true );
} else {
	$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );
}
$tm_meta_cpf_mode = isset( $tm_meta_cpf['mode'] ) ? $tm_meta_cpf['mode'] : '';
if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_builder_mode' ) && 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_normal_mode' ) ) {
	$tm_meta_cpf_mode = 'local';
}
if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_normal_mode' ) && 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_builder_mode' ) ) {
	$tm_meta_cpf_mode = 'builder';
}
if ( 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_settings' ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_normal_mode' ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_builder_mode' ) ) {
	$tm_meta_cpf_mode = 'settings';
}
// Check for deprecated Normal mode.
$args   = [
	'post_type'   => THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
	'post_status' => [ 'private', 'publish' ],
	'numberposts' => -1,
	'orderby'     => 'menu_order',
	'order'       => 'asc',
	'post_parent' => $post_id,
];
$tmepos = $post_id ? THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args ) : false;
?>
<div id="tc-admin-extra-product-options" class="panel wc-metaboxes-wrapper">
	<div id="tc-admin-extra-product-options-inner">
		<div class="tm-mode-selector">
			<input type="hidden" value="<?php echo esc_attr( $tm_meta_cpf_mode ); ?>" id="tm-meta-cpf-mode" name="tm_meta_cpf[mode]">
			<p class="form-field tm-mode-select">
				<span class="
				<?php
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_builder_mode' ) ) {
					echo 'tm-hidden ';
				}
				?>
				button button-primary button-large tc-select-mode tc-builder-select"><i class="tcfa tcfa-th-large"></i><?php esc_html_e( 'Builder', 'woocommerce-tm-extra-product-options' ); ?></span>
					<span class="
					<?php
					if ( empty( $tmepos ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_normal_mode' ) ) {
						echo 'tm-hidden ';
					}
					?>
					button button-primary button-large tc-select-mode tc-local-select"><i class="tcfa tcfa-th-list"></i><?php esc_html_e( 'Normal', 'woocommerce-tm-extra-product-options' ); ?></span>	
				<span class="
				<?php
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_settings' ) ) {
					echo 'tm-hidden ';
				}
				?>
				button button-primary button-large tc-select-mode tc-settings-select"><i class="tcfa tcfa-cog"></i><?php esc_html_e( 'Settings', 'woocommerce-tm-extra-product-options' ); ?></span>
			</p>
		</div>
		<div class="tm-mode-builder"><?php THEMECOMPLETE_EPO_ADMIN_GLOBAL()->tm_form_fields_builder_meta_box( $post ); ?></div>
		<div class="tm-mode-local tc-wrapper">
		<?php
		if ( THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id ) ) {
			include 'html-tm-epo.php';
		} else {
			?>
			<div id="message" class="tm-inner inline woocommerce-message">
			<?php esc_html_e( 'To translate the strings for the local options please use WPML interface.', 'woocommerce-tm-extra-product-options' ); ?>
			</div>
			<?php
		}
		?>
		</div>
		<div class="tm-mode-settings tc-options-group woocommerce_options_panel tc-wrapper">
			<?php
			if ( THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id ) ) {
				// Price display override.
				$tm_price_display_override      = isset( $tm_meta_cpf['price_display_override'] ) ? $tm_meta_cpf['price_display_override'] : '';
				$tm_price_display_override_sale = isset( $tm_meta_cpf['price_display_override_sale'] ) ? $tm_meta_cpf['price_display_override_sale'] : '';
				$tm_price_display_override_to   = isset( $tm_meta_cpf['price_display_override_to'] ) ? $tm_meta_cpf['price_display_override_to'] : '';
				$tm_price_display_mode          = isset( $tm_meta_cpf['price_display_mode'] ) ? $tm_meta_cpf['price_display_mode'] : 'none';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'message0x0_class' => 'overflow-show tm-epo-switch-wrapper price-display-mode-wrap',
						'wpmldisable'      => 1,
						'default'          => $tm_price_display_mode,
						'type'             => 'radio',
						'tags'             => [
							'class' => 'price-display-mode',
							'id'    => 'price_display_mode',
							'name'  => 'tm_meta_cpf[price_display_mode]',
						],
						'options'          => [
							[
								'text'  => esc_html__( 'None', 'woocommerce-tm-extra-product-options' ),
								'value' => 'none',
							],
							[
								'text'  => esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ),
								'value' => 'price',
							],
							[
								'text'  => esc_html__( 'From', 'woocommerce-tm-extra-product-options' ),
								'value' => 'from',
							],
							[
								'text'  => esc_html__( 'Range', 'woocommerce-tm-extra-product-options' ),
								'value' => 'range',
							],
						],
						'label'            => esc_html__( 'Price display override', 'woocommerce-tm-extra-product-options' ),
						'desc'             => esc_html__( 'This will replace the displayed product price on shop/archive/product loop pages.', 'woocommerce-tm-extra-product-options' ),
						'extra_fields'     => [
							[
								'nodiv'             => 1,
								'type'              => 'input',
								'default'           => $tm_price_display_override,
								'input_type'        => 'text',
								'message0x0_class'  => 'overflow-show',
								'tags'              => [
									'id'    => 'tm_price_display_override',
									'name'  => 'tm_meta_cpf[price_display_override]',
									'class' => 'text wc_input_price',
								],
								'html_before_field' => '<span class="tm-choice-regular">' . esc_html__( 'Regular', 'woocommerce-tm-extra-product-options' ) . '</span><span class="tm-choice-from">' . esc_html__( 'From', 'woocommerce-tm-extra-product-options' ) . '</span>',
							],
							[
								'nodiv'             => 1,
								'type'              => 'input',
								'default'           => $tm_price_display_override_to,
								'input_type'        => 'text',
								'message0x0_class'  => 'overflow-show',
								'tags'              => [
									'id'    => 'tm_price_display_override_to',
									'name'  => 'tm_meta_cpf[price_display_override_to]',
									'class' => 'text wc_input_price',
								],
								'html_before_field' => '<span class="tm-choice-to">' . esc_html__( 'To', 'woocommerce-tm-extra-product-options' ) . '</span>',
							],
							[
								'nodiv'             => 1,
								'type'              => 'input',
								'default'           => $tm_price_display_override_sale,
								'input_type'        => 'text',
								'message0x0_class'  => 'overflow-show',
								'tags'              => [
									'id'    => 'tm_price_display_override_sale',
									'name'  => 'tm_meta_cpf[price_display_override_sale]',
									'class' => 'text wc_input_price',
								],
								'html_before_field' => '<span class="tm-choice-sale">' . esc_html__( 'Sale', 'woocommerce-tm-extra-product-options' ) . '</span>',
							],
						],
					],
					true
				);

				// Include additional Global forms.
				$args               = [
					'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
					'post_status' => [ 'publish' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'title',
					'order'       => 'asc',
				];
				$tmp_tmglobalprices = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
				echo '<div class="message0x0 tc-clearfix">' .
					'<div class="message2x1">' .
					'<label for="tm_meta_cpf_exclude"><span>' . esc_html__( 'Include additional Global forms', 'woocommerce-tm-extra-product-options' ) . '</span></label>' .
					'<div class="messagexdesc">' . esc_attr( esc_html__( 'The forms you choose will be displayed alongside with the forms that the product already has.', 'woocommerce-tm-extra-product-options' ) ) . '</div>' .
					'</div>' .
					'<div class="message2x2">';
				if ( $tmp_tmglobalprices ) {
					echo '<div class="wp-tab-panel"><ul>';
					$wpml_tmp_tmglobalprices       = [];
					$wpml_tmp_tmglobalprices_added = [];
					foreach ( $tmp_tmglobalprices as $price ) {
						$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $price->ID, $price->post_type ) );
						if ( (float) $original_product_id === (float) $price->ID ) {
							$tm_global_forms = ( isset( $tm_meta_cpf['global_forms'] ) && is_array( $tm_meta_cpf['global_forms'] ) ) ? in_array( $price->ID, $tm_meta_cpf['global_forms'] ) : false; // phpcs:ignore WordPress.PHP.StrictInArray
							echo '<li><label>';
							echo '<input type="checkbox" value="' . esc_attr( $price->ID ) . '" id="tm_meta_cpf_global_forms_' . esc_attr( $price->ID ) . '" name="tm_meta_cpf[global_forms][]" class="checkbox" ';
							checked( $tm_global_forms, true, true );
							echo '>';
							echo ' ' . esc_html( $price->post_title ) . '</label></li>';
						}
					}
					echo '</ul></div>';
				}
				echo '</div></div>';

				// Ouput Exclude.
				$tm_exclude = isset( $tm_meta_cpf['exclude'] ) ? $tm_meta_cpf['exclude'] : '';

				$global_type_labels_name = '';
				if ( THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type instanceof WP_Post_Type ) {
					$global_type_labels_name = esc_html__( 'Exclude from', 'woocommerce-tm-extra-product-options' ) . ' ' . esc_html( THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name );
				}
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'       => 'checkbox',
						'default'    => $tm_exclude,
						'input_type' => 'checkbox',
						'label'      => $global_type_labels_name,
						'desc'       => esc_html__( 'This will exclude any global forms assigned to this product except those defined in the previous setting.', 'woocommerce-tm-extra-product-options' ),
						'tags'       => [
							'id'    => 'tm_meta_cpf_exclude',
							'name'  => 'tm_meta_cpf[exclude]',
							'class' => 'checkbox',
							'value' => '1',
						],
					],
					true
				);

				// Ouput Price override.
				$price_override = isset( $tm_meta_cpf['price_override'] ) ? $tm_meta_cpf['price_override'] : '';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'       => 'checkbox',
						'default'    => $price_override,
						'input_type' => 'checkbox',
						'label'      => esc_html__( 'Override product price', 'woocommerce-tm-extra-product-options' ),
						'desc'       => esc_html__( 'This will override the product price with the price from the options if the total options price is greater then zero.', 'woocommerce-tm-extra-product-options' ),
						'tags'       => [
							'id'    => 'tm_meta_cpf_price_override',
							'name'  => 'tm_meta_cpf[price_override]',
							'class' => 'checkbox',
							'value' => '1',
						],
					],
					true
				);

				// Ouput Override display.
				$tm_override_display = isset( $tm_meta_cpf['override_display'] ) ? $tm_meta_cpf['override_display'] : '';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'    => 'select',
						'default' => $tm_override_display,
						'label'   => esc_html__( 'Override global display', 'woocommerce-tm-extra-product-options' ),
						'desc'    => esc_html__( 'This will override the display method only for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'    => [
							'id'   => 'tm_meta_cpf_override_display',
							'name' => 'tm_meta_cpf[override_display]',
						],
						'options' => [
							[
								'value' => '',
								'text'  => esc_html__( 'Use global setting', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'normal',
								'text'  => esc_html__( 'Always show', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'action',
								'text'  => esc_html__( 'Show only with an action hook', 'woocommerce-tm-extra-product-options' ),
							],
						],
					],
					true
				);

				// Ouput Override final totals box.
				$tm_override_final_total_box = isset( $tm_meta_cpf['override_final_total_box'] ) ? THEMECOMPLETE_EPO_SETTINGS()->get_compatibility_value( 'override_final_total_box', $tm_meta_cpf['override_final_total_box'] ) : '';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'    => 'select',
						'default' => $tm_override_final_total_box,
						'label'   => esc_html__( 'Override Final total box', 'woocommerce-tm-extra-product-options' ),
						'desc'    => esc_html__( 'This will override the totals box display only for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'    => [
							'id'   => 'tm_meta_cpf_override_final_total_box',
							'name' => 'tm_meta_cpf[override_final_total_box]',
						],
						'options' => [
							[
								'value' => '',
								'text'  => esc_html__( 'Use global setting', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'enable',
								'text'  => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'disable',
								'text'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'hideifoptionsiszero',
								'text'  => esc_html__( 'Disable if Options total is zero', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'hideiftotaliszero',
								'text'  => esc_html__( 'Disable if total is zero', 'woocommerce-tm-extra-product-options' ),
							],
						],
					],
					true
				);

				// Ouput Override show options totals.
				$tm_override_show_options_total = isset( $tm_meta_cpf['override_show_options_total'] ) ? $tm_meta_cpf['override_show_options_total'] : '';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'    => 'select',
						'default' => $tm_override_show_options_total,
						'label'   => esc_html__( 'Override Show Options Total', 'woocommerce-tm-extra-product-options' ),
						'desc'    => esc_html__( 'This will override the Show Options Total setting only for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'    => [
							'id'   => 'tm_meta_cpf_override_show_options_total',
							'name' => 'tm_meta_cpf[override_show_options_total]',
						],
						'options' => [
							[
								'value' => '',
								'text'  => esc_html__( 'Use global setting', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'show',
								'text'  => esc_html__( 'Show', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'hide',
								'text'  => esc_html__( 'Hide', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'showtgz',
								'text'  => esc_html__( 'Show when the total is greater than zero', 'woocommerce-tm-extra-product-options' ),
							],
						],
					],
					true
				);

				// Ouput Override show final totals.
				$tm_override_show_final_total = isset( $tm_meta_cpf['override_show_final_total'] ) ? $tm_meta_cpf['override_show_final_total'] : '';
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'    => 'select',
						'default' => $tm_override_show_final_total,
						'label'   => esc_html__( 'Override Show Final Total', 'woocommerce-tm-extra-product-options' ),
						'desc'    => esc_html__( 'This will Show Final Total setting only for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'    => [
							'id'   => 'tm_meta_cpf_override_show_final_total',
							'name' => 'tm_meta_cpf[override_show_final_total]',
						],
						'options' => [
							[
								'value' => '',
								'text'  => esc_html__( 'Use global setting', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'show',
								'text'  => esc_html__( 'Show', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'value' => 'hide',
								'text'  => esc_html__( 'Hide', 'woocommerce-tm-extra-product-options' ),
							],
						],
					],
					true
				);

				// Ouput Override enabled roles.
				$tm_override_enabled_roles = isset( $tm_meta_cpf['override_enabled_roles'] ) ? $tm_meta_cpf['override_enabled_roles'] : '';
				if ( ! is_array( $tm_override_enabled_roles ) ) {
					$tm_override_enabled_roles = [ $tm_override_enabled_roles ];
				}
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'     => 'select',
						'multiple' => 'multiple',
						'default'  => $tm_override_enabled_roles,
						'label'    => esc_html__( 'Override enabled roles for this product', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'This will override which roles can see the options for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'     => [
							'id'    => 'tm_meta_cpf_override_enabled_roles',
							'name'  => 'tm_meta_cpf[override_enabled_roles]',
							'class' => 'multiselect',
						],
						'options'  => THEMECOMPLETE_EPO_HELPER()->convert_to_select_options( themecomplete_get_roles() ),
					],
					true
				);

				// Ouput Override disabled roles.
				$tm_override_disabled_roles = isset( $tm_meta_cpf['override_disabled_roles'] ) ? $tm_meta_cpf['override_disabled_roles'] : '';
				if ( ! is_array( $tm_override_disabled_roles ) ) {
					$tm_override_disabled_roles = [ $tm_override_disabled_roles ];
				}
				THEMECOMPLETE_EPO_HTML()->create_field(
					[
						'type'     => 'select',
						'multiple' => 'multiple',
						'default'  => $tm_override_disabled_roles,
						'label'    => esc_html__( 'Override enabled roles for this product', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'This will override which roles can see the options for this product.', 'woocommerce-tm-extra-product-options' ),
						'tags'     => [
							'id'    => 'tm_meta_cpf_override_disabled_roles',
							'name'  => 'tm_meta_cpf[override_disabled_roles]',
							'class' => 'multiselect',
						],
						'options'  => THEMECOMPLETE_EPO_HELPER()->convert_to_select_options( themecomplete_get_roles() ),
					],
					true
				);
			}
			?>
		</div>
	</div>
</div>
admin/views/html-tm-epo-fields.php000064400000011050150755142440013115 0ustar00<?php
/**
 * View for displaying saved TM EPOs
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $post_type_object )
	&& isset( $bulk_counts )
	&& isset( $post_type )
	&& isset( $general_messages )
) {

	?>
	<div class="wrap">
	<h2>
	<?php
	$global_type_labels_name = '';
	if ( THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type instanceof WP_Post_Type ) {
		$global_type_labels_name = THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name;
	}
	if ( '' !== $global_type_labels_name ) {
		echo esc_html( $global_type_labels_name );
	}
	if ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create_posts ) ) {
		echo ' <a href="' . esc_url( admin_url( $post_new_file ) ) . '" class="add-new-h2">' . esc_html( $post_type_object->labels->add_new ) . '</a>';
	}
	?>
	</h2>

	<?php
	// If we have a bulk message to issue.
	$messages = [];
	foreach ( $bulk_counts as $message => $count ) {
		if ( isset( $bulk_messages[ $post_type ][ $message ] ) ) {
			$messages[] = sprintf( $bulk_messages[ $post_type ][ $message ], number_format_i18n( $count ) );
		}
		if ( 'trashed' === $message && isset( $_REQUEST['ids'] ) ) {// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$ids = preg_replace( '/[^0-9,]/', '', sanitize_text_field( wp_unslash( $_REQUEST['ids'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( isset( $_REQUEST['from_bulk'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$tm_nonce = 'bulk-posts';
				$tm_bulk  = '&tm_bulk=1';
			} elseif ( is_string( $ids ) && isset( $_REQUEST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$tm_nonce = sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) . '-post_' . $ids; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$tm_bulk  = '';
			} elseif ( is_string( $ids ) && isset( $_REQUEST['trashed'] ) && 1 === intval( $_REQUEST['trashed'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$tm_nonce = 'untrash-post_' . $ids;
				$tm_bulk  = '';
			}
			if ( is_string( $ids ) && isset( $tm_nonce ) && isset( $tm_bulk ) ) {
				$messages[] = '<a href="' . esc_url( wp_nonce_url( 'edit.php?post_type=product&page=' . esc_attr( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK ) . '&doaction=undo&action=untrash&ids=' . esc_attr( $ids ) . $tm_bulk, $tm_nonce ) ) . '">' . esc_html__( 'Undo', 'woocommerce-tm-extra-product-options' ) . '</a>';
			}
		}
	}
	$error_messages = [];
	if ( isset( $_REQUEST['message'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$error_messages[] = $general_messages[ $post_type ][ sanitize_text_field( wp_unslash( $_REQUEST['message'] ) ) ]; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	}
	if ( $messages ) {
		echo '<div id="message" class="updated"><p>' . wp_kses_post( join( ' ', $messages ) ) . '</p></div>';
	}
	unset( $messages );
	if ( $error_messages ) {
		echo '<div id="message" class="error"><p>' . wp_kses_post( join( ' ', $error_messages ) ) . '</p></div>';
	}
	unset( $error_messages );
	if ( isset( $_SERVER['REQUEST_URI'] ) ) {
		$_SERVER['REQUEST_URI'] = esc_url_raw( remove_query_arg( [ 'locked', 'skipped', 'updated', 'deleted', 'trashed', 'untrashed' ], esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) );
	}
	?>
	<?php do_action( 'tm_list_table_action', 'views' ); ?>

	<form id="posts-filter" action="" method="get">

		<?php
		do_action(
			'tm_list_table_action',
			'search_box',
			[
				'text'     => $post_type_object->labels->search_items,
				'input_id' => 'post',
			]
		);
		?>
		<input type="hidden" name="tm_bulk" class="post_is_bulk" value="1"/>
		<input type="hidden" name="post_status" class="post_status_page" value="<?php echo ! empty( $_REQUEST['post_status'] ) ? esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['post_status'] ) ) ) : 'all'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>"/>
		<input type="hidden" name="post_type" class="post_type_page" value="product"/>
		<input type="hidden" name="page" class="page_page" value="<?php echo esc_attr( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK ); ?>"/>
		<?php if ( ! empty( $_REQUEST['show_sticky'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<input type="hidden" name="show_sticky" value="1"/>
		<?php } ?>
		<?php do_action( 'tm_list_table_action', 'display' ); ?>
	</form>
	<?php do_action( 'tm_list_table_action', 'inline_edit' ); ?>
	<div id="ajax-response"></div>
	<br class="clear"/>
	</div>
	<?php
}
admin/views/html-tm-epo-admin.php000064400000032067150755142440012752 0ustar00<?php
/**
 * View for displaying single TM EPO record
 *
 * @package Extra Product Options/Admin/Views
 * @version 4.8
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $variations )
	&& isset( $parent_data )
	&& isset( $tmcp_data )
	&& isset( $tmcp_id )
	&& isset( $loop )
	&& isset( $tmcp_post_status )
	&& isset( $tmcp_required )
	&& isset( $tmcp_hide_price )
	&& isset( $tmcp_limit )
) {

	$tmcp_attribute_selected_value = isset( $tmcp_data['tmcp_attribute'][0] ) ? $tmcp_data['tmcp_attribute'][0] : '';
	$tmcp_type_selected_value      = isset( $tmcp_data['tmcp_type'][0] ) ? $tmcp_data['tmcp_type'][0] : '';

	$_field_attribute = false;
	foreach ( $parent_data['attributes'] as $attribute ) {
		// Get only attributes that are not variations.
		if ( $attribute['is_variation'] || sanitize_title( $attribute['name'] ) !== $tmcp_attribute_selected_value ) {
			continue;
		}

		$_field_attribute = true;
		break;
	}
	if ( ! empty( $_field_attribute ) ) {
		?>
		<div data-epo-attr="<?php echo esc_attr( sanitize_title( $tmcp_attribute_selected_value ) ); ?>" class="tc-normal-epo wc-metabox closed">
			<h3>
				<div class="tmicon tcfa tcfa-times delete remove_tm_epo" rel="<?php echo esc_attr( $tmcp_id ); ?>"></div>
				<div class="tmicon tcfa tcfa-caret-up fold tip" title="<?php esc_html_e( 'Click to toggle', 'woocommerce-tm-extra-product-options' ); ?>"></div>
				<div class="tmicon tcfa tcfa-grip-vertical move"></div>
				<span class="tm-att-id">#<?php echo esc_html( $tmcp_id ); ?></span>
				<span class="tm-att-label"><?php esc_html_e( 'Attribute:', 'woocommerce-tm-extra-product-options' ); ?></span>
				<span class="tm-att-value"><?php echo esc_html( wc_attribute_label( urldecode( $tmcp_attribute_selected_value ) ) ); ?></span>
				<input type="hidden" value="<?php echo esc_attr( sanitize_title( $tmcp_attribute_selected_value ) ); ?>" class="tmcp_attribute" name="tmcp_attribute[<?php echo esc_attr( $loop ); ?>]">
				<input type="hidden" class="tmcp_loop" name="tmcp_loop[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $loop ); ?>"/>
				<input type="hidden" name="tmcp_post_id[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $tmcp_id ); ?>"/>
				<input type="hidden" class="tm_epo_menu_order" name="tmcp_menu_order[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $loop ); ?>"/>
			</h3>
			<div class="woocommerce-tmcp-attributes wc-metabox-content">
				<div class="data tc-clearfix">
					<p class="form-row form-row-first tmcp-main-choices">
						<label><?php esc_html_e( 'Type:', 'woocommerce-tm-extra-product-options' ); ?></label>
						<select class="tm-type" name="tmcp_type[<?php echo esc_attr( $loop ); ?>]">
							<option <?php selected( $tmcp_type_selected_value, 'radio' ); ?> value="radio"><?php esc_html_e( 'Radio buttons', 'woocommerce-tm-extra-product-options' ); ?></option>
							<option <?php selected( $tmcp_type_selected_value, 'checkbox' ); ?> value="checkbox"><?php esc_html_e( 'Checkbox', 'woocommerce-tm-extra-product-options' ); ?></option>
							<option <?php selected( $tmcp_type_selected_value, 'select' ); ?> value="select"><?php esc_html_e( 'Select', 'woocommerce-tm-extra-product-options' ); ?></option>
						</select>
					</p>
					<p class="form-row form-row-last">
					<span class="tm-options">
						<label><?php esc_html_e( 'Settings:', 'woocommerce-tm-extra-product-options' ); ?></label>
						<span class="tm-hide-price">
							<label><input type="checkbox" class="checkbox" name="tmcp_hide_price[<?php echo esc_attr( $loop ); ?>]" <?php checked( $tmcp_hide_price, 1 ); ?> value="1"/> <?php esc_html_e( 'Hide price', 'woocommerce-tm-extra-product-options' ); ?></label>
						</span>
						<span class="tm-required">
							<label><input type="checkbox" class="checkbox" name="tmcp_required[<?php echo esc_attr( $loop ); ?>]" <?php checked( $tmcp_required, 1 ); ?> value="1"/> <?php esc_html_e( 'Required', 'woocommerce-tm-extra-product-options' ); ?></label>
						</span>
						<span class="tm-enabled">
							<label><input type="checkbox" class="checkbox" name="tmcp_enabled[<?php echo esc_attr( $loop ); ?>]" <?php checked( $tmcp_post_status, 'publish' ); ?> /> <?php esc_html_e( 'Enabled', 'woocommerce-tm-extra-product-options' ); ?></label>
						</span>
					</span>
						<span class="tmcp_choices
						<?php
						if ( 'checkbox' !== $tmcp_type_selected_value ) {
							echo ' tm-hidden';
						}
						?>
						">
						<?php
						echo '<span class="tm-hide-price"><label>' . esc_html__( 'Limit selection', 'woocommerce-tm-extra-product-options' ) . ': <input step="1" min="0" max="" name="tmcp_limit[' . esc_attr( $loop ) . ']" value="' . esc_attr( $tmcp_limit ) . '" title="Qty" pattern="[0-9]*" inputmode="numeric" type="number" /></label></span>';
						?>
					</span>
					</p>
					<p class="form-row form-row-full tmcp_variation show_if_variable">
						<label><?php esc_html_e( 'Variation:', 'woocommerce-tm-extra-product-options' ); ?></label>
						<?php include 'html-tm-epo-admin-variations.php'; ?>
					</p>
					<p class="form-row form-row-first tmcp_attribute">
						<label><?php esc_html_e( 'Attribute:', 'woocommerce-tm-extra-product-options' ); ?></label>
						<?php include 'html-tm-epo-admin-attributes.php'; ?>
					</p>
					<p class="form-row form-row-last tmcp-pricing">
						<label><?php echo esc_html__( 'Price:', 'woocommerce-tm-extra-product-options' ) . ' (' . esc_html( get_woocommerce_currency_symbol() ) . ')'; ?></label>
						<?php
						if ( ! empty( $_regular_price ) && is_array( $_regular_price ) ) {
							/*
							* $key_attribute = attirbute
							* $key_variation = variation
							* $price = price
							*/
							if ( ! isset( $_regular_price_type ) || ! is_array( $_regular_price_type ) ) {
								$_regular_price_type = [];
							}
							foreach ( $_regular_price as $key_attribute => $value ) {
								foreach ( $value as $key_variation => $price ) {
									if ( ! isset( $_regular_price_type[ $key_attribute ] ) ) {
										$_regular_price_type[ $key_attribute ] = [];
									}
									if ( ! isset( $_regular_price_type[ $key_attribute ][ $key_variation ] ) ) {
										$_regular_price_type[ $key_attribute ][ $key_variation ] = '';
									}
									?>
									<input type="text" name="tmcp_regular_price[<?php echo esc_attr( $loop ); ?>][<?php echo esc_attr( $key_attribute ); ?>][<?php echo esc_attr( $key_variation ); ?>]" value="<?php echo esc_attr( $price ); ?>" class="wc_input_price tmcp-price-input tmcp-price-input-variation-<?php echo esc_attr( $key_variation ); ?>" data-price-input-attribute="<?php echo esc_attr( $key_attribute ); ?>" placeholder="<?php esc_html_e( 'Custom price (required)', 'woocommerce-tm-extra-product-options' ); ?>"/>
									<select class="tmcp-price-input-type tmcp-price-input-variation-<?php echo esc_attr( $key_variation ); ?>" data-price-input-attribute="<?php echo esc_attr( $key_attribute ); ?>" name="tmcp_regular_price_type[<?php echo esc_attr( $loop ); ?>][<?php echo esc_attr( $key_attribute ); ?>][<?php echo esc_attr( $key_variation ); ?>]">
										<option <?php selected( $_regular_price_type[ $key_attribute ][ $key_variation ], '' ); ?> value=""><?php esc_html_e( 'Fixed amount', 'woocommerce-tm-extra-product-options' ); ?></option>
										<option <?php selected( $_regular_price_type[ $key_attribute ][ $key_variation ], 'percent' ); ?> value="percent"><?php esc_html_e( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ); ?></option>
									</select>
									<?php
								}
							}
						} else {
							?>
							<input type="text" name="tmcp_regular_price[<?php echo esc_attr( $loop ); ?>][0][0]" value="" class="wc_input_price tmcp-price-input tmcp-price-input-variation-0 tmcp-price-input-attribute-0" data-price-input-attribute="0" placeholder="<?php esc_html_e( 'Custom price', 'woocommerce-tm-extra-product-options' ); ?>"/>
							<select class="tmcp-price-input-type tmcp-price-input-variation-0 tmcp-price-input-attribute-0" data-price-input-attribute="0" name="tmcp_regular_price_type[<?php echo esc_attr( $loop ); ?>][0][0]">
								<option value=""><?php esc_html_e( 'Fixed amount', 'woocommerce-tm-extra-product-options' ); ?></option>
								<option value="percent"><?php esc_html_e( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ); ?></option>
							</select>
							<?php
						}
						?>
					</p>
				</div>
			</div>

		</div>
		<?php
	} else {
		?>
		<div data-epo-attr="<?php echo esc_attr( sanitize_title( $tmcp_attribute_selected_value ) ); ?>" class="missing tc-normal-epo wc-metabox closed">
			<h3>
				<div class="tmicon tcfa tcfa-times delete remove_tm_epo" rel="<?php echo esc_attr( $tmcp_id ); ?>"></div>
				<span class="tm-att-id">#<?php echo esc_html( $tmcp_id ); ?> &mdash; </span>
				<span class="tm-att-label"><?php esc_html_e( 'Attribute:', 'woocommerce-tm-extra-product-options' ); ?></span>
				<span class="tm-att-value"><?php echo esc_html( wc_attribute_label( $tmcp_attribute_selected_value ) ); ?></span>
				<input type="hidden" value="<?php echo esc_attr( sanitize_title( $tmcp_attribute_selected_value ) ); ?>" class="tmcp_attribute" name="tmcp_attribute[<?php echo esc_attr( $loop ); ?>]">
				<?php
				esc_html_e( 'Attributes missing. Please DELETE this extra option:', 'woocommerce-tm-extra-product-options' );
				?>

				<input type="hidden" class="checkbox" name="tmcp_type[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $tmcp_type_selected_value ); ?>"/>
				<input type="hidden" class="checkbox" name="tmcp_hide_price[<?php echo esc_attr( $loop ); ?>]" <?php checked( $tmcp_hide_price, 1 ); ?> value="1"/>


				<input type="hidden" class="tmcp_loop" name="tmcp_loop[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $loop ); ?>"/>
				<input type="hidden" name="tmcp_post_id[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $tmcp_id ); ?>"/>
				<input type="hidden" class="tm_epo_menu_order" name="tmcp_menu_order[<?php echo esc_attr( $loop ); ?>]" value="<?php echo esc_attr( $loop ); ?>"/>
			</h3>
			<div class="woocommerce-tmcp-attributes wc-metabox-content">
				<div class="data tc-clearfix">
					<?php
					echo '<label><input type="hidden" name="tmcp_limit[' . esc_attr( $loop ) . ']" value="' . esc_attr( $tmcp_limit ) . '" /></label>';
					include 'html-tm-epo-admin-variations.php';
					if ( isset( $_regular_price ) && is_array( $_regular_price ) ) {
						/*
						* $key_attribute = attirbute
						* $key_variation = variation
						* $price = price
						*/
						if ( ! isset( $_regular_price_type ) || ! is_array( $_regular_price_type ) ) {
							$_regular_price_type = [];
						}
						foreach ( $_regular_price as $key_attribute => $value ) {
							foreach ( $value as $key_variation => $price ) {
								if ( ! isset( $_regular_price_type[ $key_attribute ] ) ) {
									$_regular_price_type[ $key_attribute ] = [];
								}
								if ( ! isset( $_regular_price_type[ $key_attribute ][ $key_variation ] ) ) {
									$_regular_price_type[ $key_attribute ][ $key_variation ] = '';
								}
								?>
								<input type="text" name="tmcp_regular_price[<?php echo esc_attr( $loop ); ?>][<?php echo esc_attr( $key_attribute ); ?>][<?php echo esc_attr( $key_variation ); ?>]" value="<?php echo esc_attr( $price ); ?>" class="wc_input_price tmcp-price-input tmcp-price-input-variation-<?php echo esc_attr( $key_variation ); ?>" data-price-input-attribute="<?php echo esc_attr( $key_attribute ); ?>" placeholder="<?php esc_html_e( 'Custom price (required)', 'woocommerce-tm-extra-product-options' ); ?>"/>
								<select class="tmcp-price-input-type tmcp-price-input-variation-<?php echo esc_attr( $key_variation ); ?>" data-price-input-attribute="<?php echo esc_attr( $key_attribute ); ?>" name="tmcp_regular_price_type[<?php echo esc_attr( $loop ); ?>][<?php echo esc_attr( $key_attribute ); ?>][<?php echo esc_attr( $key_variation ); ?>]">
									<option <?php selected( $_regular_price_type[ $key_attribute ][ $key_variation ], '' ); ?> value=""><?php esc_html_e( 'Fixed amount', 'woocommerce-tm-extra-product-options' ); ?></option>
									<option <?php selected( $_regular_price_type[ $key_attribute ][ $key_variation ], 'percent' ); ?> value="percent"><?php esc_html_e( 'Percent of the origιnal price', 'woocommerce-tm-extra-product-options' ); ?></option>
								</select>
								<?php
							}
						}
					} else {
						?>
						<input type="text" name="tmcp_regular_price[<?php echo esc_attr( $loop ); ?>][0][0]" value="" class="wc_input_price tmcp-price-input tmcp-price-input-variation-0 tmcp-price-input-attribute-0" data-price-input-attribute="0" placeholder="<?php esc_html_e( 'Custom price', 'woocommerce-tm-extra-product-options' ); ?>"/>
						<select class="tmcp-price-input-type tmcp-price-input-variation-0 tmcp-price-input-attribute-0" data-price-input-attribute="0" name="tmcp_regular_price_type[<?php echo esc_attr( $loop ); ?>][0][0]">
							<option value=""><?php esc_html_e( 'Fixed amount', 'woocommerce-tm-extra-product-options' ); ?></option>
							<option value="percent"><?php esc_html_e( 'Percent of the origιnal price', 'woocommerce-tm-extra-product-options' ); ?></option>
						</select>
						<?php
					}
					?>
				</div>
			</div>
		</div>
		<?php
	}
}
admin/views/html-tm-epo-order-item-header.php000064400000004734150755142440015157 0ustar00<?php
/**
 * Shows an order item header
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $item, $item_id, $order, $header_title, $_product ) ) :
	$item_id      = intval( $item_id );
	$header_title = (string) $header_title;
	$tax_data     = wc_tax_enabled() ? themecomplete_maybe_unserialize( isset( $item['line_tax_data'] ) ? $item['line_tax_data'] : '' ) : false;
	$row_class    = apply_filters( 'woocommerce_admin_html_order_item_class', isset( $class ) && ! empty( $class ) ? $class : '', $item, $order );
	if ( ! empty( $row_class ) ) {
		$row_class = ' ' . $row_class;
	}
	?>
<tr class="tm-order-line<?php echo ' ' . esc_attr( (string) $row_class ); ?>" data-order_item_id="<?php echo esc_attr( (string) $item_id ); ?>">
	<?php echo ( version_compare( WC()->version, '2.6', '>=' ) ) ? '' : '<td class="check-column">&nbsp;</td>'; ?>
	<td class="thumb">&nbsp;</td>
	<td class="tm-c name" data-sort-value="<?php echo esc_attr( $item['name'] ); ?>">
		<div class="tm-view tm-order-header">
			<?php echo esc_html( $header_title ); ?>
		</div>
		<div class="tm-view tm-header">
			<div class="tm-50"><?php esc_html_e( 'Option', 'woocommerce-tm-extra-product-options' ); ?></div>
			<div class="tm-50"><?php esc_html_e( 'Value', 'woocommerce-tm-extra-product-options' ); ?></div>
		</div>
	</td>
	<?php

	do_action( 'wc_epo_admin_order_item_header', $order, $_product, $item, $item_id );

	?>
	<td class="item_cost" width="1%" data-sort-value="<?php echo esc_attr( $order->get_item_subtotal( $item, false, true ) ); ?>">
		<?php esc_html_e( 'Cost', 'woocommerce' ); ?>
	</td>
	<td class="quantity" width="1%">
		<?php esc_html_e( 'Qty', 'woocommerce' ); ?>
	</td>
	<td class="line_cost" width="1%" data-sort-value="<?php echo esc_attr( isset( $item['line_total'] ) ? $item['line_total'] : '' ); ?>">
		<?php esc_html_e( 'Total', 'woocommerce' ); ?>
	</td>
	<?php
	if ( ! empty( $tax_data ) && isset( $order_taxes ) && is_array( $order_taxes ) ) {
		foreach ( $order_taxes as $tax_item ) {
			$column_label = esc_html__( 'Tax', 'woocommerce' );
			if ( $tax_item instanceof WC_Order_Item_Tax && is_callable( [ $tax_item, 'get_label' ] ) ) {
				$tax_label = $tax_item->get_label();
				if ( ! empty( $tax_label ) ) {
					$column_label = $tax_label;
				}
			}
			?>
			<td class="line_tax" width="1%">
				<?php echo esc_html( $column_label ); ?>
			</td>
			<?php
		}
	}
	?>
	<td class="wc-order-edit-line-item" width="1%">
		&nbsp;
	</td>
</tr>
	<?php
endif;
admin/views/html-tm-epo-admin-attributes.php000064400000004001150755142440015121 0ustar00<?php
/**
 * View for displaying the attributes select box
 *
 * @package Extra Product Options/Admin/Views
 * @version 4.8.5
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $parent_data ) && isset( $tmcp_attribute_selected_value ) && isset( $loop ) ) {
	foreach ( $parent_data['attributes'] as $attribute ) {
		// Get only attributes that are not variations.
		if ( $attribute['is_variation'] || sanitize_title( $attribute['name'] ) !== $tmcp_attribute_selected_value ) {
			continue;
		} ?>
		<select data-tm-attr="<?php echo esc_attr( sanitize_title( $attribute['name'] ) ); ?>" class="tmcp_att tmcp_attribute_<?php echo esc_attr( sanitize_title( $attribute['name'] ) ); ?>" name="attribute_<?php echo esc_attr( sanitize_title( $attribute['name'] ) ); ?>[<?php echo esc_attr( $loop ); ?>]">
			<option value="0"><?php esc_html_e( 'Any', 'woocommerce-tm-extra-product-options' ); ?>
				<?php echo esc_html( wc_attribute_label( $attribute['name'] ) ); ?>&hellip;
			</option>
			<?php
			// Get terms for attribute taxonomy or value if its a custom attribute.
			if ( $attribute['is_taxonomy'] ) {
				$all_terms = get_terms(
					[
						'taxonomy'   => $attribute['name'],
						'orderby'    => 'name',
						'hide_empty' => false,
					]
				);
				if ( is_array( $all_terms ) ) {
					foreach ( $all_terms as $_term ) {
						$has_term = has_term( intval( $_term->term_id ), $attribute['name'], $parent_data['id'] ) ? 1 : 0;
						if ( $has_term ) {
							?>
							<option value="<?php echo esc_attr( $_term->slug ); ?>"><?php echo esc_html( apply_filters( 'woocommerce_tm_epo_option_name', $_term->name, null, null ) ); ?></option>
							<?php
						}
					}
				}
			} else {
				$options = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) );
				foreach ( $options as $option ) {
					?>
					<option value="<?php echo esc_attr( sanitize_title( $option ) ); ?>"><?php echo esc_html( apply_filters( 'woocommerce_tm_epo_option_name', $option, null, null ) ); ?></option>
					<?php
				}
			}
			?>
		</select>
		<?php
	}
}
admin/views/html-tm-epo-fields-edit.php000064400000007614150755142440014053 0ustar00<?php
/**
 * View for displaying add/edit screen
 *
 * @package Extra Product Options/Admin/Views
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

require_once ABSPATH . 'wp-admin/includes/meta-boxes.php';

if ( isset( $post )
	&& isset( $post_type )
	&& isset( $title )
	&& isset( $post_type_object )
	&& isset( $post_ID )
	&& isset( $nonce_action )
) {

	/* translators: Publish box date format, see https://secure.php.net/date */
	$scheduled_date = date_i18n( esc_html__( 'M j, Y @ H:i', 'woocommerce-tm-extra-product-options' ), strtotime( $post->post_date ) );

	$messages                                       = [];
	$messages[ THEMECOMPLETE_EPO_GLOBAL_POST_TYPE ] = [
		0  => '', // Unused. Messages start at index 1.
		1  => esc_html__( 'Form updated.', 'woocommerce-tm-extra-product-options' ),
		2  => esc_html__( 'Form updated.', 'woocommerce-tm-extra-product-options' ),
		3  => esc_html__( 'Form updated.', 'woocommerce-tm-extra-product-options' ),
		4  => esc_html__( 'Form updated.', 'woocommerce-tm-extra-product-options' ),
		/* translators: %s: date and time of the revision */
		5  => isset( $_GET['revision'] ) ? sprintf( esc_html__( 'Form restored to revision from %s', 'woocommerce-tm-extra-product-options' ), wp_post_revision_title( absint( sanitize_text_field( wp_unslash( $_GET['revision'] ) ) ), false ) ) : false, // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		6  => esc_html__( 'Form published.', 'woocommerce-tm-extra-product-options' ),
		7  => esc_html__( 'Form saved.', 'woocommerce-tm-extra-product-options' ),
		8  => esc_html__( 'Form submitted.', 'woocommerce-tm-extra-product-options' ),
		/* translators: %s: Scheduled date for the Form. */
		9  => sprintf( __( 'Form scheduled for: %s.', 'woocommerce-tm-extra-product-options' ), '<strong>' . $scheduled_date . '</strong>' ),
		10 => esc_html__( 'Form draft updated.', 'woocommerce-tm-extra-product-options' ),
	];

	$message = false;
	// phpcs:disable WordPress.Security.NonceVerification.Recommended
	if ( isset( $_GET['message'] ) ) {
		$message_id = absint( wp_unslash( $_GET['message'] ) );
		if ( isset( $messages[ $post_type ][ $message_id ] ) ) {
			$message = $messages[ $post_type ][ $message_id ];
		}
	}
	// phpcs:enable WordPress.Security.NonceVerification.Recommended
	?>
	<div class="wrap">
	<h2>
	<?php
		echo esc_html( $title );
	if ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create_posts ) ) {
		echo ' <a href="' . esc_url( admin_url( $post_new_file ) ) . '" class="add-new-h2">' . esc_html( $post_type_object->labels->add_new ) . '</a>';
	}
	?>
		</h2>
	<?php if ( $message ) : ?>
		<div id="message" class="updated"><p><?php echo esc_html( $message ); ?></p></div>
	<?php endif; ?>

	<form name="post" action="" method="post" id="post">
		<input type="hidden" id="post_ID" name="post_ID" value="<?php echo esc_attr( (string) $post_ID ); ?>"/>
		<input type="hidden" id="hiddenaction" name="action" value="editpost"/>
		<?php
		wp_nonce_field( $nonce_action );
		wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
		wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
		?>
		<div id="poststuff">
			<div id="post-body" class="metabox-holder columns-2">
				<div id="post-body-content">

					<div id="titlediv">
						<div id="titlewrap">
							<label class="screen-reader-text" id="title-prompt-text" for="title"><?php esc_html_e( 'Enter title here', 'woocommerce-tm-extra-product-options' ); ?></label>
							<input type="text" name="post_title" value="<?php echo esc_attr( $post->post_title ); ?>" id="title" autocomplete="off"/>
						</div>
					</div>
				</div>

				<div id="postbox-container-1" class="postbox-container">
					<?php do_meta_boxes( '', 'side', $post ); ?>
				</div>

				<div id="postbox-container-2" class="postbox-container">
					<?php do_meta_boxes( '', 'normal', $post ); ?>
				</div>

			</div>
			<br class="clear">
		</div>
	</form>
	</div>
	<?php
}
admin/class-themecomplete-epo-admin-csv.php000064400000077612150755142440014767 0ustar00<?php
/**
 * Extra Product Options CSV Importer/Exporter
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 * phpcs:disable Generic.Files.OneObjectStructurePerFile
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options CSV import/export class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_ADMIN_CSV {

	/**
	 * Error loading string
	 *
	 * @var string
	 */
	private $error_loading_string = '';

	/**
	 * If mb_detect_encoding is supported
	 *
	 * @var boolean
	 */
	private $is_active = true;

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		if ( ! function_exists( 'mb_detect_encoding' ) ) {
			$this->error_loading_string = '<p>' . esc_html__( 'The php functions mb_detect_encoding and mb_convert_encoding are required to import and export CSV files. Please ask your hosting provider to enable this function.', 'woocommerce-tm-extra-product-options' ) . '</p>';
			$this->is_active            = false;
		}
	}

	/**
	 * Check if the system supports mb_detect_encoding
	 *
	 * @param string $type Action type.
	 * @return void
	 * @since 1.0
	 */
	public function check_if_active( $type = '' ) {
		if ( ! $this->is_active ) {
			switch ( $type ) {
				case 'download':
				case 'export_by_id':
				case 'export_by_product_id':
					wp_die( wp_kses_post( $this->error_loading_string ) );
					break; // @phpstan-ignore-line

				default:
					// $this->error_loading_string is escaped
					wp_send_json(
						[
							'error'   => 1,
							'message' => $this->error_loading_string,
						]
					);
					break; // @phpstan-ignore-line
			}
		}
	}

	/**
	 * Removes utf-8 BOM
	 *
	 * @param mixed $text Text to remove BOM from.
	 * @return mixed
	 * @since 1.0
	 */
	public function remove_utf8_bom( $text ) {
		$bom  = pack( 'H*', 'EFBBBF' );
		$text = preg_replace( "/^$bom/", '', $text );

		return $text;
	}

	/**
	 * Decides if data needs to be utf-8 encoded
	 *
	 * @param string $data Data to check.
	 * @param string $enc Encoding.
	 * @return string
	 * @since 1.0
	 */
	public function format_data_from_csv( $data, $enc ) {
		return ( 'UTF-8' === $enc ) ? $data : THEMECOMPLETE_EPO_HELPER()->utf8_encode( $data );
	}

	/**
	 * Import option data
	 *
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function do_options_import() {
		$import  = $this->check_for_import();
		$message = $import['message'];
		$data    = [];

		if ( isset( $import['data']['file'] ) ) {
			$file        = $import['data']['file'];
			$enc         = $import['data']['enc'];
			$parsed_data = [];
			$raw_headers = [];

			$handle = fopen( $file['tmp_name'], 'r' ); // phpcs:ignore WordPress.WP.AlternativeFunctions
			if ( false !== $handle ) {
				$csv = new THEMECOMPLETE_CONVERT_ARRAY_TO_CSV();

				$start_pos = 0;
				while ( true ) {
					$header = fgetcsv( $handle, 0, $csv->delimiter );
					if ( false === $header ) {
						break; // Exit the loop when no more lines are available.
					}
					$header = $this->remove_utf8_bom( $header );

					$position = ftell( $handle );

					if ( ! empty( $header[0] ) ) {
						$start_pos = $position;
						break;
					}
				}
				$start_pos = (int) $start_pos;

				if ( (int) 0 !== $start_pos ) {
					fseek( $handle, $start_pos );
				}

				while ( true ) {
					$postmeta = fgetcsv( $handle, 0, $csv->delimiter );
					if ( false === $postmeta ) {
						break; // Exit the loop when no more lines are available.
					}
					$row = [];
					foreach ( $header as $key => $heading ) {
						$heading   = $this->remove_utf8_bom( trim( $heading ) );
						$s_heading = $heading;
						$s_heading = $this->format_data_from_csv( $s_heading, $enc );

						if ( '' === $s_heading ) {
							continue;
						}
						$row[ $s_heading ]         = ( isset( $postmeta[ $key ] ) ) ? $this->format_data_from_csv( $postmeta[ $key ], $enc ) : '';
						$raw_headers[ $s_heading ] = $heading;
					}

					$parsed_data[] = $row;
					unset( $postmeta, $row );
				}
				fclose( $handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions
			}

			$data = $parsed_data;
		}

		return [
			'data'    => $data,
			'message' => $message,
		];
	}

	/**
	 * Import lookup table data
	 *
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function do_lookuptable_import() {
		$import  = $this->check_for_import();
		$message = $import['message'];
		$data    = $import['data'];

		if ( isset( $import['data']['file'] ) ) {
			$file        = $import['data']['file'];
			$enc         = $import['data']['enc'];
			$parsed_data = [];
			$raw_data    = [];
			$headers     = [];

			$handle = fopen( $file['tmp_name'], 'r' ); // phpcs:ignore WordPress.WP.AlternativeFunctions
			if ( false !== $handle ) {
				$csv          = new THEMECOMPLETE_CONVERT_ARRAY_TO_CSV();
				$table_name   = '';
				$can_be_table = 1;
				$table_rows   = 0;
				while ( true ) {
					$header = fgetcsv( $handle, 0, $csv->delimiter );
					if ( false === $header ) {
						break; // Exit the loop when no more lines are available.
					}
					$header = $this->remove_utf8_bom( $header );

					$is_header_empty = array_reduce(
						$header,
						function ( $carry, $element ) {
							return $carry && ( '' === $element );
						},
						true
					);

					if ( $is_header_empty ) {
						$can_be_table = 1;
					}

					if ( $can_be_table && ! empty( $header[0] ) && ! is_numeric( $header[0] ) ) {
						$table_name   = $this->remove_utf8_bom( trim( $header[0] ) );
						$table_name   = $this->format_data_from_csv( $table_name, $enc );
						$can_be_table = 0;
						$table_rows   = 0;
					}
					if ( $table_name ) {
						$row = [];
						foreach ( $header as $key => $heading ) {
							$heading = $this->remove_utf8_bom( trim( $heading ) );
							$heading = $this->format_data_from_csv( $heading, $enc );
							if ( 0 < $table_rows && 0 < $key ) {
								$heading = wc_format_decimal( $heading, false, true );
							}
							$row[ $key ] = $heading;
						}
						$raw_data[ $table_name ][] = $row;
						++$table_rows;
					}
				}

				foreach ( $raw_data as $raw_name => $data ) {
					foreach ( $data[0] as $key_x => $x ) {
						if ( '' === $x || 0 === $key_x ) {
							continue;
						}
						$headers[ $raw_name ][] = $x;
					}
				}

				foreach ( $raw_data as $raw_name => $data ) {
					unset( $data[0] );
					if ( array_key_exists( $raw_name, $headers ) && is_array( $headers[ $raw_name ] ) ) {
						foreach ( $headers[ $raw_name ] as $ckey => $column_data ) {
							foreach ( $data as $xline ) {
								$key = $xline[0];
								if ( '' === $key ) {
									continue;
								}
								foreach ( $xline as $xkey => $x ) {
									if ( 0 === $xkey ) {
										continue;
									}
									if ( $xkey === $ckey + 1 ) {
										$parsed_data[ $raw_name ][ $column_data ][ $key ] = $x;
									}
								}
							}
						}
					}
				}

				fclose( $handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions
			}

			$data = $parsed_data;
		}

		return [
			'data'    => $data,
			'message' => $message,
		];
	}

	/**
	 * Check if there is data to be imported
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function check_for_import() {
		$files   = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification
		$data    = [];
		$message = esc_html__( 'Invalid CSV file.', 'woocommerce-tm-extra-product-options' );
		if ( isset( $files['builder_import_file'] ) ) {
			$passed = true;
			$file   = $files['builder_import_file'];

			if ( ! empty( $file['name'] ) ) {
				if ( ! empty( $file['error'] ) ) {
					$passed = false;
					// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
					$upload_error_strings = [
						false,
						esc_html__( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'The uploaded file was only partially uploaded.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'No file was uploaded.', 'woocommerce-tm-extra-product-options' ),
						'',
						esc_html__( 'Missing a temporary folder.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'Failed to write file to disk.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'File upload stopped by extension.', 'woocommerce-tm-extra-product-options' ),
					];
					if ( isset( $upload_error_strings[ $file['error'] ] ) ) {
						$data    = false;
						$message = $upload_error_strings[ $file['error'] ];
					}
				}
				$check_filetype = wp_check_filetype( $file['name'] );
				$check_filetype = $check_filetype['ext'];
				if ( ! $check_filetype ) {
					$passed  = false;
					$data    = false;
					$message = esc_html__( 'Sorry, this file type is not permitted for security reasons.', 'woocommerce-tm-extra-product-options' ) . ' (' . pathinfo( $file['name'], PATHINFO_EXTENSION ) . ')';
				}
			} else {
				$passed  = false;
				$data    = false;
				$message = esc_html__( 'No file found.', 'woocommerce-tm-extra-product-options' );
			}
			if ( $passed && is_array( $data ) ) {
				$enc = mb_detect_encoding( $file['tmp_name'], 'UTF-8, ISO-8859-1', true );

				if ( $enc ) {
					setlocale( LC_ALL, 'en_US.' . $enc );
				}

				$data['file'] = $file;
				$data['enc']  = $enc;
			}
		} else {
			$message = esc_html__( 'Invalid import method used.', 'woocommerce-tm-extra-product-options' );
		}

		return [
			'data'    => $data,
			'message' => $message,
		];
	}

	/**
	 * Parse imported data (for options)
	 *
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function parse_imported_data() {

		$parsed_data = [];
		$import      = $this->do_options_import();
		$message     = $import['message'];
		$import      = $import['data'];
		$data        = [];

		if ( ! empty( $import ) ) {
			$parsed_data = $import;

			foreach ( $parsed_data as $key => $value ) {
				foreach ( $value as $k => $v ) {
					$k = trim( $k );
					$k = $this->remove_utf8_bom( $k );
					if ( mb_strpos( $k, 'multiple_' ) === 0 ) {
						$v = THEMECOMPLETE_EPO_HELPER()->array_unserialize( $v );

						if ( str_ends_with( $k, 'checkboxes_options_default_value' ) && is_array( $v ) ) {
							$data[ $k ][] = $v;
						} elseif ( str_ends_with( $k, 'options_default_value' ) && is_array( $v ) ) {
							$data[ $k ][] = $v[0];
						} else {
							$data[ $k ][] = $v;
						}
					} elseif ( mb_strpos( $k, 'variations_options' ) === 0 ) {
						$v = themecomplete_maybe_unserialize( $v );
						if ( is_array( $v ) ) {
							foreach ( $v as $ok => $ov ) {
								$data[ $k ][ $ok ] = $ov;
							}
						}
					} else {
						if ( ( 'product_productids' === $k || 'product_hiddenin' === $k ) && str_contains( $v, '|' ) ) {
							$v = explode( '|', $v );
						}
						$data[ $k ][] = $v;
					}
				}

				if ( $data ) {
					$message = esc_html__( 'File imported.', 'woocommerce-tm-extra-product-options' );
				}
			}
		} elseif ( false !== $import ) {
			$message = esc_html__( 'The CSV file is invalid!', 'woocommerce-tm-extra-product-options' );
		}

		return [
			'data'    => $data,
			'message' => $message,
		];
	}

	/**
	 * Parse imported data (for options)
	 *
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function parse_imported_lookuptable() {

		$parsed_data = [];
		$import      = $this->do_lookuptable_import();
		$message     = $import['message'];
		$import      = $import['data'];
		$data        = [];
		$table_names = [];

		if ( ! empty( $import ) ) {
			$parsed_data = $import;

			$parsed_headers = [];

			foreach ( $parsed_data as $key => $value ) {
				$table_names[] = $key;
				foreach ( $value as $k => $v ) {
					if ( is_numeric( $k ) || 'max' === $k ) {
						$data = true;
						break;
					}
				}
			}

			if ( $data ) {
				$message = esc_html__( 'File imported.', 'woocommerce-tm-extra-product-options' );
			}
		} elseif ( false !== $import ) {
			$message = esc_html__( 'The CSV file is invalid!', 'woocommerce-tm-extra-product-options' );
		}

		return [
			'table_names' => $table_names,
			'data'        => $parsed_data,
			'message'     => $message,
		];
	}

	/**
	 * Cleans the csv data
	 *
	 * @param array<mixed> $import Import array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function clean_csv_data( $import ) {
		$remove_keys  = [];
		$clean_import = [];
		$element_keys = [];
		if ( ! is_array( $import ) || ! isset( $import['sections'] ) ) {
			return $clean_import;
		}
		foreach ( $import['sections'] as $key => $value ) {
			if ( '' === $value ) {
				$remove_keys[] = $key;
			}
		}
		if ( isset( $import['element_type'] ) ) {
			foreach ( $import['element_type'] as $key => $value ) {
				if ( ! isset( $element_keys[ $value ] ) ) {
					$element_keys[ $value ] = [];
				}
				$element_keys[ $value ][] = count( $element_keys[ $value ] );
			}
		}
		foreach ( $import as $key => $value ) {
			if ( 'element_type' !== $key && 'div_size' !== $key ) {
				$split       = explode( '_', $key );
				$element_key = false;
				if ( isset( $split[0] ) && 'multiple' === $split[0] ) {
					if ( isset( $split[1] ) ) {
						$element_key = $split[1];
					}
				} else {
					$element_key = $split[0];
				}

				foreach ( $import[ $key ] as $k => $v ) {
					if ( 'sections' === $element_key || 'section' === $element_key ) {
						if ( ! in_array( $k, $remove_keys ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
							$clean_import[ $key ][ $k ] = $v;
						}
					} elseif ( 'variations' === $element_key || ( isset( $element_keys[ $element_key ] ) && in_array( $k, $element_keys[ $element_key ] ) ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
						$clean_import[ $key ][ $k ] = $v;
					}
				}
			}
		}
		$clean_import['element_type'] = isset( $import['element_type'] ) ? $import['element_type'] : [ '' ];
		$clean_import['div_size']     = $import['div_size'];

		return $clean_import;
	}

	/**
	 * Import csv
	 *
	 * @return void
	 * @since 1.0
	 */
	public function import() {
		check_ajax_referer( 'import-nonce', 'security' );
		$message        = $this->debug_post_max_size();
		$import         = $this->parse_imported_data();
		$import_message = $import['message'];
		$import         = $import['data'];

		if ( ! empty( $import ) ) {
			$message = $import_message;
			if ( ! isset( $_REQUEST['is_original_post'] ) || ! empty( $_REQUEST['is_original_post'] ) ) {
				$import = $this->clean_csv_data( $import );
				$import = THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $import );
			}
			if ( ! empty( $import ) ) {
				$import = [ 'tm_meta' => [ 'tmfbuilder' => $import ] ];
				set_transient( 'tc_import_csv', $import, DAY_IN_SECONDS );
				if ( ! empty( $_REQUEST['import_override'] ) ) {
					set_transient( 'tc_import_override', sanitize_text_field( wp_unslash( $_REQUEST['import_override'] ) ), DAY_IN_SECONDS );
				}

				// save_imported_csv returns internal HTML code.
				// already escaped where needed.
				ob_start();
				if ( isset( $_REQUEST['post_id'] ) ) {
					THEMECOMPLETE_EPO_ADMIN_GLOBAL()->save_imported_csv( absint( wp_unslash( $_REQUEST['post_id'] ) ) );
				}
				$options = ob_get_clean();

				$json_result = [
					'result'   => 1,
					'message'  => $message,
					'jsobject' => THEMECOMPLETE_EPO_ADMIN_BUILDER()->jsbuilder,
				];

				if ( $options ) {
					$json_result['options'] = $options;
				}

				wp_send_json( $json_result );
			} else {
				$message = esc_html__( 'Invalid CSV file!', 'woocommerce-tm-extra-product-options' );
			}
		}
		// $message is escaped
		wp_send_json(
			[
				'result'  => 0,
				'message' => $message,
			]
		);
	}

	/**
	 * Debug post_max_size
	 *
	 * @return string
	 * @since 6.1
	 */
	public function debug_post_max_size() {
		check_ajax_referer( 'import-nonce', 'security' );
		$this->check_if_active( 'import' );

		$message  = '';
		$post_max = (float) wc_let_to_num( (string) ini_get( 'post_max_size' ) );

		if ( empty( $_FILES )
			&& empty( $_POST )
			&& isset( $_SERVER['REQUEST_METHOD'] )
			&& 'post' === strtolower( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			&& isset( $_SERVER['CONTENT_LENGTH'] )
			&& (float) $_SERVER['CONTENT_LENGTH'] > $post_max
			&& (
				! isset( $_GET ) || // @phpstan-ignore-line
				(
					isset( $_GET ) && // @phpstan-ignore-line
					isset( $_GET['post_type'] )
					&& isset( $_GET['action'] )
					&& ! str_starts_with( sanitize_text_field( wp_unslash( $_GET['post_type'] ) ), 'ct_template' )
					&& ! str_starts_with( sanitize_text_field( wp_unslash( $_GET['action'] ) ), 'oxy_render_' )
				)
			)
		) {
			/* translators: post max size  */
			$message = sprintf( esc_html__( 'Trying to upload files larger than %s is not allowed!', 'woocommerce-tm-extra-product-options' ), $post_max );
		}
		return $message;
	}

	/**
	 * Import lookup table csv
	 *
	 * @return void
	 * @since 6.1
	 */
	public function lookuptable_import() {
		check_ajax_referer( 'import-nonce', 'security' );

		if ( isset( $_REQUEST['import_override'] ) ) {
			$import_override = absint( wp_unslash( $_REQUEST['import_override'] ) );
			if ( 1 === $import_override ) {
				if ( isset( $_REQUEST['post_id'] ) ) {
					$post_id = absint( wp_unslash( $_REQUEST['post_id'] ) );
					$import  = get_transient( 'tc_lookuptable_import_csv_' . $post_id );
					if ( ! empty( $import ) ) {
						// save_imported_csv returns internal HTML code.
						// already escaped where needed.
						ob_start();
						THEMECOMPLETE_EPO_ADMIN_LOOKUPTABLE()->save_imported_csv( $post_id );
						$table = ob_get_clean();

						$json_result = [
							'result'   => 1,
							'message'  => esc_html__( 'File imported with new tables.', 'woocommerce-tm-extra-product-options' ),
							'jsobject' => [ $import ],
						];
						if ( $table ) {
							$json_result['table'] = $table;
						}
					} else {
						$json_result = [
							'result'  => 0,
							'message' => esc_html__( 'There was an error importing the CSV file.', 'woocommerce-tm-extra-product-options' ),
						];
					}
					wp_send_json( $json_result );
				}
			}
		}

		$message        = $this->debug_post_max_size();
		$import         = $this->parse_imported_lookuptable();
		$table_names    = $import['table_names'];
		$import_message = $import['message'];
		$import         = $import['data'];

		if ( empty( $message ) ) {
			$message = $import_message;
		}

		if ( ! empty( $import ) ) {
			$message = $import_message;
			$table   = false;
			if ( isset( $_REQUEST['post_id'] ) ) {
				$post_id = absint( wp_unslash( $_REQUEST['post_id'] ) );
				$set     = set_transient( 'tc_lookuptable_import_csv_' . $post_id, $import, DAY_IN_SECONDS );

				if ( false === $set ) {
					wp_send_json(
						[
							'result'  => 0,
							'message' => esc_html__( 'There was an error saving the csv data. Please check the encoding of your csv file!', 'woocommerce-tm-extra-product-options' ),
						]
					);
				}

				$builder = themecomplete_get_post_meta( $post_id, 'lookuptable_meta', true );
				if ( is_array( $builder ) ) {
					$builder_table_names = [];
					foreach ( $builder as $table_name => $data ) {
						$builder_table_names[] = $table_name;
					}
					foreach ( $builder_table_names as $key => $name ) {
						if ( isset( $table_names[ $key ] ) && $name !== $table_names[ $key ] ) {
							$json_result = [
								'result'    => 1,
								'different' => 1,
								'message'   => esc_html__( 'Table names are different. Do you want to override the tables?', 'woocommerce-tm-extra-product-options' ),
							];
							wp_send_json( $json_result );
						}
					}
				}

				// save_imported_csv returns internal HTML code.
				// already escaped where needed.
				ob_start();
				THEMECOMPLETE_EPO_ADMIN_LOOKUPTABLE()->save_imported_csv( $post_id );
				$table = ob_get_clean();
			}

			$json_result = [
				'result'   => 1,
				'message'  => $message,
				'jsobject' => [ $import ],
			];

			if ( $table ) {
				$json_result['table'] = $table;
			}

			wp_send_json( $json_result );
		}

		// $message is escaped
		wp_send_json(
			[
				'result'  => 0,
				'message' => $message,
			]
		);
	}

	/**
	 * Export lookup table csv
	 *
	 * @param string $variable Variable to use.
	 * @return void
	 * @since 6.3
	 */
	public function export_lookuptable( $variable = '' ) {
		$this->check_if_active( 'export' );
		check_ajax_referer( 'export-nonce', 'security' );

		$tm_meta = '';
		$json    = [];
		if ( ! empty( $variable ) && isset( $_REQUEST[ $variable ] ) ) {

			$tm_metas = json_decode( nl2br( wp_unslash( $_REQUEST[ $variable ] ) ), true ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

			if ( ! empty( $tm_metas )
				&& is_array( $tm_metas )
			) {

				$csv      = new THEMECOMPLETE_CONVERT_ARRAY_TO_CSV();
				$tm_meta  = $csv->convert_lookuptable( $tm_metas );
				$sitename = sanitize_key( get_bloginfo( 'name' ) );
				$sitename = ( ! empty( $sitename ) ) ? $sitename . '.' : $sitename;
				$filename = $sitename . 'users.' . gmdate( 'Y-m-d-H-i-s' ) . '.csv';

				set_transient( 'tc_export_' . $filename, $tm_meta, DAY_IN_SECONDS );

				$sendback = esc_url_raw( add_query_arg( 'filename', $filename, admin_url( 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&action=download' ) ) );
				$json     = [ 'result' => $sendback ];
			} else {
				$json = [
					'error'   => 1,
					'message' => esc_html__( 'Invalid data!', 'woocommerce-tm-extra-product-options' ),
				];
			}
		} else {
			$json = [
				'error'   => 1,
				'message' => esc_html__( 'Invalid request!', 'woocommerce-tm-extra-product-options' ),
			];
		}

		wp_send_json(
			$json
		);
	}

	/**
	 * Export csv
	 *
	 * @param string $variable Variable to use.
	 * @return void
	 * @since 1.0
	 */
	public function export( $variable = '' ) {
		$this->check_if_active( 'export' );
		check_ajax_referer( 'export-nonce', 'security' );

		$tm_meta  = '';
		$sendback = '';
		if ( ! empty( $variable ) && isset( $_REQUEST[ $variable ] ) ) {

			$tm_metas = json_decode( nl2br( wp_unslash( $_REQUEST[ $variable ] ) ), true ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

			if ( ! empty( $tm_metas )
				&& is_array( $tm_metas )
				&& isset( $tm_metas['tm_meta'] )
				&& is_array( $tm_metas['tm_meta'] )
				&& isset( $tm_metas['tm_meta']['tmfbuilder'] )
			) {

				$csv = new THEMECOMPLETE_CONVERT_ARRAY_TO_CSV();
				if ( ! isset( $_REQUEST['is_original_post'] ) || ! empty( $_REQUEST['is_original_post'] ) ) {
					$tm_meta = $csv->convert( THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $tm_metas['tm_meta']['tmfbuilder'] ) );
				} else {
					$tm_meta = $csv->convert( $tm_metas['tm_meta']['tmfbuilder'] );
				}
				$sitename = sanitize_key( get_bloginfo( 'name' ) );

				$sitename = ( ! empty( $sitename ) ) ? $sitename . '.' : $sitename;
				$filename = $sitename . 'users.' . gmdate( 'Y-m-d-H-i-s' ) . '.csv';

				set_transient( 'tc_export_' . $filename, $tm_meta, DAY_IN_SECONDS );

				$sendback = esc_url_raw( add_query_arg( 'filename', $filename, admin_url( 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&action=download' ) ) );

			}
		}

		wp_send_json(
			[ 'result' => $sendback ]
		);
	}

	/**
	 * Export builder
	 *
	 * @param array<mixed> $tm_meta Builder meta data.
	 * @param boolean      $recreate If the internal element ids should be recreated.
	 * @param integer      $post_id The post id.
	 * @return void
	 * @since 6.0
	 */
	private function export_builder( $tm_meta = [], $recreate = true, $post_id = 0 ) {
		if ( ! empty( $tm_meta )
			&& is_array( $tm_meta )
			&& isset( $tm_meta['tmfbuilder'] )
			&& is_array( $tm_meta['tmfbuilder'] )
		) {

			if ( $recreate ) {
				$tm_meta = THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $tm_meta );
			}
			$tm_meta = $tm_meta['tmfbuilder'];

			$csv     = new THEMECOMPLETE_CONVERT_ARRAY_TO_CSV();
			$tm_meta = $csv->convert( $tm_meta );

			$sitename = sanitize_key( get_bloginfo( 'name' ) );
			if ( ! empty( $sitename ) ) {
				$sitename .= '.';
			}
			$filename = $sitename . 'form.' . $post_id . '.' . gmdate( 'Y-m-d-H-i-s' ) . '.csv';

			set_transient( 'tc_export_' . $filename, $tm_meta, DAY_IN_SECONDS );
			$this->download( $filename );

		}
	}

	/**
	 * Export csv by product id
	 *
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function export_by_product_id( $post_id = 0 ) {
		$this->check_if_active( 'export_by_product_id' );

		$tm_meta = [];
		$epos    = THEMECOMPLETE_EPO()->get_product_tm_epos( $post_id );

		if ( is_array( $epos ) && isset( $epos['global_ids'] ) && is_array( $epos['global_ids'] ) ) {

			foreach ( $epos['global_ids'] as $post ) {

				$id   = $post->ID;
				$type = $post->post_type;

				$meta = themecomplete_get_post_meta( $id, 'tm_meta', true );

				if ( ! empty( $meta )
					&& is_array( $meta )
					&& isset( $meta['tmfbuilder'] )
					&& is_array( $meta['tmfbuilder'] )
				) {

					$meta    = THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $meta );
					$tm_meta = array_merge_recursive( $tm_meta, $meta );

				}
			}
		}

		$this->export_builder( $tm_meta, false, $post_id );
	}

	/**
	 * Export csv by form id
	 *
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function export_by_id( $post_id = 0 ) {
		$this->check_if_active( 'export_by_id' );
		check_ajax_referer( 'tmexport_form_nonce_' . $post_id, 'security' );
		$tm_meta = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
		$this->export_builder( $tm_meta, true, $post_id );
	}

	/**
	 * Download csv
	 *
	 * @param string $filename The file name.
	 * @return void
	 * @since 1.0
	 */
	public function download( $filename = '' ) {
		$this->check_if_active( 'download' );

		if ( isset( $_REQUEST['filename'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$filename = sanitize_text_field( wp_unslash( $_REQUEST['filename'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}
		if ( function_exists( 'set_time_limit' ) ) {
			set_time_limit( 0 );
		}
		if ( function_exists( 'apache_setenv' ) ) {
			apache_setenv( 'no-gzip', '1' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions
		}
		ini_set( 'zlib.output_compression', '0' ); // phpcs:ignore WordPress.PHP.IniSet

		header( 'Content-Description: File Transfer' );
		header( 'Content-Disposition: attachment; filename=' . $filename );
		header( 'Content-Type: text/csv; charset=UTF-8', true );
		if ( ! empty( $filename ) ) {
			$csv = get_transient( 'tc_export_' . $filename );
			if ( false !== $csv ) {
				delete_transient( 'tc_export_' . $filename );
				// fix for Excel both on Windows and OS X.
				$csv = mb_convert_encoding( $csv, 'UTF-8' );
				if ( false !== $csv ) {
					if ( is_string( $csv ) ) {
						$csv = pack( 'H*', 'EFBBBF' ) . $csv;
					}
					// No escape required or allowed here.
					die( wp_check_invalid_utf8( apply_filters( 'wc_epo_download_csv', $csv ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput
				}
			}
		}
		die();
	}
}


/**
 * Convert a PHP array into CSV
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
final class THEMECOMPLETE_CONVERT_ARRAY_TO_CSV {

	/**
	 * The delimiter
	 *
	 * @var string
	 */
	public $delimiter;

	/**
	 * The text separator
	 *
	 * @var string
	 */
	public $text_separator;

	/**
	 * The replace text separator
	 *
	 * @var string
	 */
	public $replace_text_separator;

	/**
	 * The line delimiter
	 *
	 * @var string
	 */
	public $line_delimiter;

	/**
	 * Class Constructor
	 *
	 * @param string $delimiter The delimiter.
	 * @param string $text_separator The text separator.
	 * @param string $replace_text_separator The replace text separator.
	 * @param string $line_delimiter The line delimiter.
	 * @since 1.0
	 */
	public function __construct( $delimiter = ',', $text_separator = '"', $replace_text_separator = '""', $line_delimiter = "\n" ) {
		$this->delimiter              = $delimiter;
		$this->text_separator         = $text_separator;
		$this->replace_text_separator = $replace_text_separator;
		$this->line_delimiter         = $line_delimiter;
	}

	/**
	 * Replaces the data
	 *
	 * @param string $data Data to replace.
	 * @return string
	 * @since 1.0
	 */
	public function replace_data( $data = '' ) {
		return $this->text_separator
			. str_replace( $this->text_separator, $this->replace_text_separator, $data )
			. $this->text_separator;
	}

	/**
	 * Formats the data
	 *
	 * @param string $data Data to format.
	 * @return string
	 * @since 1.0
	 */
	public function format_data( $data = '' ) {
		$data = (string) ( $data );
		$enc  = mb_detect_encoding( $data, 'UTF-8, ISO-8859-1', true );
		$data = ( 'UTF-8' === $enc ) ? $data : THEMECOMPLETE_EPO_HELPER()->utf8_encode( $data );

		return $data;
	}

	/**
	 * Converts the data
	 *
	 * @param array<mixed> $input Data array to convert.
	 * @return string
	 * @since 1.0
	 */
	public function convert( $input = [] ) {
		$lines  = [];
		$header = [];
		$row    = [];
		$csv    = '';
		foreach ( $input as $key => $v ) {
			$header[ $key ] = $key;
			$line           = $this->convertline( $v );
			$lines[ $key ]  = $line;
		}
		// Re-order headers.
		$header = [ 'div_size' => $header['div_size'] ] + $header;
		$header = [ 'element_type' => $header['element_type'] ] + $header;
		$lines  = [ 'div_size' => $lines['div_size'] ] + $lines;
		$lines  = [ 'element_type' => $lines['element_type'] ] + $lines;

		foreach ( $lines as $key => $value ) {
			if ( ! empty( $value ) && is_array( $value ) ) {
				if ( 'variations_options' === $key ) {
					$v              = serialize( $value ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions
					$v              = $this->format_data( $v );
					$v              = $this->replace_data( $v );
					$row[0][ $key ] = $v;
				} else {
					foreach ( $value as $k => $v ) {
						$v                 = THEMECOMPLETE_EPO_HELPER()->array_serialize( $v );
						$v                 = $this->format_data( $v );
						$v                 = $this->replace_data( $v );
						$row[ $k ][ $key ] = $v;
					}
				}
			}
		}
		foreach ( $row as $k ) {
			$value = [];
			foreach ( $header as $key => $vkey ) {
				if ( isset( $k[ $key ] ) ) {
					$value[] = $k[ $key ];
				} else {
					$value[] = '';
				}
			}
			$csv .= implode( $this->delimiter, $value ) . $this->line_delimiter;
		}
		$csv = implode( $this->delimiter, $header ) . $this->line_delimiter . $csv;

		return $csv;
	}

	/**
	 * Converts the lookuptable data
	 *
	 * @param array<mixed> $input Data array to convert.
	 * @return string
	 * @since 1.0
	 */
	public function convert_lookuptable( $input = [] ) {
		$csv           = '';
		$input_length  = count( $input );
		$input_counter = 0;
		foreach ( $input as $table_name => $table_data ) {
			++$input_counter;

			$lines  = [];
			$y_axis = [];
			$row    = [];

			$lines[0] = [ $table_name ];
			foreach ( $table_data as $x_axis => $y ) {
				$lines[0][ count( $lines[0] ) ] = $x_axis;
				foreach ( $y as $y_key => $y_value ) {
					if ( ! isset( $y_axis[ $y_key ] ) ) {
						$y_axis[ $y_key ] = [ $y_key ];
					}
					array_push( $y_axis[ $y_key ], $y_value );
				}
			}
			$counter = 1;
			foreach ( $y_axis as $y_data_key => $y_data ) {
				$lines[ $counter ] = $y_data;
				++$counter;
			}

			foreach ( $lines as $key => $value ) {
				// @phpstan-ignore-next-line
				if ( ! empty( $value ) && is_array( $value ) ) {
					foreach ( $value as $k => $v ) {
						$v = $this->format_data( $v );
						// Don't add text_separator for the table name.
						if ( ! empty( $key ) || ! empty( $k ) ) {
							$v = $this->replace_data( $v );
						}

						$row[ $key ][ $k ] = $v;
					}
				}
			}

			$result = [];
			foreach ( $row as $sub_array ) {
				$result[] = implode( $this->delimiter, $sub_array );
			}
			$csv_part = implode( $this->line_delimiter, $result );

			$csv = $csv . $csv_part;
			if ( $input_counter < $input_length ) {
				$csv = $csv . $this->line_delimiter . $this->line_delimiter;
			}
		}

		return $csv;
	}

	/**
	 * Convert a single line
	 *
	 * @param mixed $line Line to convert.
	 * @return array<mixed>
	 * @since 1.0
	 */
	private function convertline( $line ) {
		$csv_line = [];
		if ( is_array( $line ) ) {
			foreach ( $line as $key => $v ) {
				$csv_line[ $key ] = is_array( $v ) ?
					$this->convertline( $v ) :
					$v;
			}
		} else {
			$csv_line[] = $line;
		}

		return $csv_line;
	}
}
admin/class-themecomplete-epo-admin-global-base.php000064400000416445150755142440016345 0ustar00<?php
/**
 * Extra Product Options Global Administration class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Global Administration class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_ADMIN_Global_Base {

	/**
	 * The class THEMECOMPLETE_EPO_ADMIN_Global_List_Table
	 *
	 * @var object|null THEMECOMPLETE_EPO_ADMIN_Global_List_Table
	 */
	public $tm_list_table;
	/**
	 * The base post type.
	 *
	 * @var string|boolean
	 */
	public $basetype = false;

	/**
	 * The $post variable for use in scripts templates.
	 *
	 * @var object|boolean
	 */
	public $post = false;

	/**
	 * The meta data array related to the plugin.
	 *
	 * @var array<mixed>
	 */
	public $tm_meta = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_ADMIN_Global_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_ADMIN_Global_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {

		// Add menu action.
		add_action( 'admin_menu', [ $this, 'admin_menu' ], 9 );

		// Pre-render actions.
		add_action( 'admin_init', [ $this, 'tm_admin_init' ], 9 );
		add_action( 'plugins_loaded', [ $this, 'tm_plugins_loaded' ], 100 );
		add_action( 'init', [ $this, 'tm_init' ], 100 );
		add_action( 'current_screen', [ $this, 'current_screen' ], 100 );

		// Add the plugin to WooCommerce screen ids so that we can load the generic WooCommerce files.
		add_filter( 'woocommerce_screen_ids', [ $this, 'woocommerce_screen_ids' ] );

		// Add list columns.
		add_filter( 'manage_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE . '_posts_columns', [ $this, 'tm_list_columns' ] );
		add_action( 'manage_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE . '_posts_custom_column', [ $this, 'tm_list_column' ], 10, 2 );

		// Export a form.
		add_action( 'wp_ajax_tm_export', [ $this, 'export' ] );

		// Variations check.
		add_action( 'wp_ajax_woocommerce_tm_variations_check', [ $this, 'tm_variations_check' ] );
		add_action( 'wp_ajax_nopriv_woocommerce_tm_variations_check', [ $this, 'tm_variations_check' ] );
		add_action( 'wp_ajax_woocommerce_tm_get_variations_array', [ $this, 'tm_get_variations_array' ] );
		add_action( 'wp_ajax_nopriv_woocommerce_tm_get_variations_array', [ $this, 'tm_get_variations_array' ] );

		// Ajax save settings.
		add_action( 'wp_ajax_tm_save_settings', [ $this, 'tm_save_settings' ] );
		// Ajax reset settings.
		add_action( 'wp_ajax_tm_reset_settings', [ $this, 'tm_reset_settings' ] );

		// File manager.
		add_action( 'wp_ajax_tm_mn_movetodir', [ $this, 'tm_mn_movetodir' ] );
		add_action( 'wp_ajax_tm_mn_deldir', [ $this, 'tm_mn_deldir' ] );
		add_action( 'wp_ajax_tm_mn_delfile', [ $this, 'tm_mn_delfile' ] );

		// Add extra functionality on list screen.
		add_action( 'bulk_actions-edit-product', [ $this, 'bulk_actions_edit_product' ], 10, 1 );
		add_action( 'load-edit.php', [ $this, 'bulk_actions_edit_product_do' ] );

		// Save options (ajax).
		add_action( 'wp_ajax_tm_save', [ $this, 'tm_save' ] );
		add_action( 'wp_ajax_nopriv_tm_save', [ $this, 'tm_save' ] );

		// Get the categories of a product.
		add_action( 'wp_ajax_wc_epo_get_product_categories', [ $this, 'wc_epo_get_product_categories' ] );
		// Search product in a category.
		add_action( 'wp_ajax_wc_epo_search_products_in_categories', [ $this, 'wc_epo_search_products_in_categories' ] );

		// For dashboard menu.
		add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ], 11 );
	}

	/**
	 * Current screen
	 *
	 * @return void
	 * @since 6.0
	 */
	public function current_screen() {
		$screen = get_current_screen();
		if ( is_object( $screen ) && THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $screen->post_type ) {
			// save meta data.
			add_action( 'save_post', [ $this, 'tm_save_postdata' ], 1, 2 );

			$do_action = isset( $_GET['action'] ) ? wp_unslash( $_GET['action'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Recommended

			if ( $do_action && 'clone' === $do_action ) {
				$post_id = 0;
				if ( isset( $_GET['post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$post_id = absint( $_GET['post'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}

				if ( $post_id ) {
					$this->do_clone_form( $post_id, $post_id );
					if ( isset( $_SERVER['REQUEST_URI'] ) ) {
						wp_safe_redirect(
							esc_url_raw(
								admin_url( 'edit.php?post_type=' . THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE )
							)
						);
					}
					exit;
				}
			}
		}
	}

	/**
	 * Load scripts
	 *
	 * @param string $hook_suffix The current admin page.
	 * @return void
	 * @since 1.0
	 */
	public function admin_enqueue_scripts( $hook_suffix ) {

		// Dashboard Menu style.
		wp_enqueue_style( 'themecomplete-epo-admin-menu', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-global-admin-menu.css', [], THEMECOMPLETE_EPO_VERSION );

		// Option Templates.
		if ( in_array( $hook_suffix, [ 'post.php', 'post-new.php' ], true ) ) {
			$screen = get_current_screen();
			if ( is_object( $screen ) && THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $screen->post_type ) {
				$this->register_admin_scripts( 1 );
			}
		}
	}

	/**
	 * Search for products and variations in categories
	 *
	 * @return void
	 * @since 5.0
	 */
	public static function wc_epo_search_products_in_categories() {
		check_ajax_referer( 'search-products', 'security' );

		$include_category_ids = ! empty( $_GET['include'] ) && is_array( $_GET['include'] ) ? array_map( 'absint', $_GET['include'] ) : [];

		if ( empty( $include_category_ids ) ) {
			wp_die();
		}

		$include_category_slugs = get_terms(
			[
				'taxonomy' => 'product_cat',
				'include'  => $include_category_ids,
				'fields'   => 'id=>slug',
			]
		);

		if ( empty( $include_category_slugs ) || ! is_array( $include_category_slugs ) ) {
			wp_die();
		}

		$product_ids = wc_get_products(
			[
				'category' => array_values( $include_category_slugs ),
				'return'   => 'ids',
				'limit'    => -1,
			]
		);

		$_GET['include'] = $product_ids;

		WC_AJAX::json_search_products();
	}

	/**
	 * Get the categories of a product.
	 *
	 * @return void
	 * @since 5.0
	 */
	public static function wc_epo_get_product_categories() {

		check_ajax_referer( 'get-product-categories', 'security' );

		if ( empty( $_POST['product_id'] ) ) {
			die();
		}

		$product = wc_get_product( absint( $_POST['product_id'] ) );

		if ( ! $product ) {
			die();
		}

		wp_send_json(
			[
				'result'       => 'success',
				'category_ids' => $product->get_category_ids(),
			]
		);
	}

	/**
	 * Save options (ajax)
	 *
	 * @return void
	 * @since 4.8
	 */
	public function tm_save() {
		check_ajax_referer( 'save-nonce', 'security' );

		$message = esc_html__( 'Something went wrong with the request!', 'woocommerce-tm-extra-product-options' );

		$json_result = [
			'result'  => 0,
			'message' => $message,
		];

		$post_id = 0;
		if ( isset( $_REQUEST['post_id'] ) ) {
			$post_id = absint( wp_unslash( $_REQUEST['post_id'] ) );
		}

		if ( ! empty( $post_id ) ) {

			$tm_metas = [];

			if ( isset( $_REQUEST['tm_uploadmeta'] ) ) {
				$tm_metas = wp_unslash( $_REQUEST['tm_uploadmeta'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				$tm_metas = rawurldecode( $tm_metas );
				$tm_metas = nl2br( $tm_metas );
				$tm_metas = json_decode( $tm_metas, true );
			}

			if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
				$tm_meta = $tm_metas['tm_meta'];

				$meta = 'tm_meta';
				$post = get_post( $post_id );
				if ( $post && property_exists( $post, 'ID' ) && property_exists( $post, 'post_type' ) ) {

					$post_type = $post->post_type;
					$basetype  = $this->basetype;
					if ( false === $basetype ) {
						$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
					}
					$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id, $post_type, $basetype );
					if ( ! $wpml_is_original_product ) {
						$meta = 'tm_meta_wpml';
					}

					$old_data = themecomplete_get_post_meta( $post_id, $meta, true );
					if ( isset( $old_data['priority'] ) ) {
						$tm_meta['priority'] = $old_data['priority'];
					}
					themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, $meta );
					$json_result['message'] = esc_html__( 'Options saved!', 'woocommerce-tm-extra-product-options' );
					$json_result['result']  = 1;

				}
			}
		}

		wp_send_json( $json_result );
	}

	/**
	 * Add extra functionality on list screen (execute)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function bulk_actions_edit_product_do() {
		global $typenow;
		$post_type = $typenow;

		if ( 'product' === $post_type ) {

			// get the action
			// depending on your resource type this could be
			// WP_Users_List_Table, WP_Comments_List_Table, etc.
			$wp_list_table = _get_list_table( 'WP_Posts_List_Table' );
			if ( ! $wp_list_table instanceof WP_Posts_List_Table ) {
				return;
			}

			$action   = $wp_list_table->current_action();
			$post_ids = [];

			// make sure ids are submitted.
			// depending on the resource type, this may be 'media' or 'ids'.
			if ( isset( $_REQUEST['post'] ) && is_array( $_REQUEST['post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$post_ids = array_map( 'intval', $_REQUEST['post'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}

			if ( empty( $post_ids ) ) {
				return;
			}

			$sendback = remove_query_arg( [ 'tc_updated', 'tc_removed', 'untrashed', 'deleted', 'ids' ], wp_get_referer() );
			if ( ! $sendback ) {
				$sendback = admin_url( "edit.php?post_type=$post_type" );
			}
			$pagenum  = $wp_list_table->get_pagenum();
			$sendback = add_query_arg( 'paged', $pagenum, $sendback );

			$do_action = ( 'tcclear' === $action || 'tcproductclear' === $action || 'tcclearexclude' === $action || 'tcclearexcludeadd' === $action ) ? $action : substr( $action, 0, 3 );

			switch ( $do_action ) {
				case 'tc_':
					$tc_updated = 0;
					foreach ( $post_ids as $post_id ) {
						$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );
						if ( ! is_array( $tm_meta_cpf ) ) {
							$tm_meta_cpf = [];
						}
						if ( is_array( $tm_meta_cpf ) ) {
							if ( ! isset( $tm_meta_cpf['global_forms'] ) ) {
								$tm_meta_cpf['global_forms'] = [];
							}
							$tm_meta_cpf['global_forms'][] = substr( $action, 3 );
							$tm_meta_cpf['global_forms']   = array_unique( $tm_meta_cpf['global_forms'] );
							themecomplete_update_post_meta( $post_id, 'tm_meta_cpf', $tm_meta_cpf );
						}

						++$tc_updated;
					}
					$sendback = add_query_arg(
						[
							'tc_updated' => $tc_updated,
							'ids'        => join(
								',',
								$post_ids
							),
						],
						$sendback
					);
					break;

				case 'tcclear':
					$tc_removed = 0;
					foreach ( $post_ids as $post_id ) {
						$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );
						if ( ! is_array( $tm_meta_cpf ) ) {
							$tm_meta_cpf = [];
						}
						if ( is_array( $tm_meta_cpf ) ) {
							if ( ! isset( $tm_meta_cpf['global_forms'] ) ) {
								$tm_meta_cpf['global_forms'] = [];
							}
							unset( $tm_meta_cpf['global_forms'] );
							themecomplete_update_post_meta( $post_id, 'tm_meta_cpf', $tm_meta_cpf );
						}
						++$tc_removed;
					}
					$sendback = add_query_arg(
						[
							'tc_removed' => $tc_removed,
							'ids'        => join(
								',',
								$post_ids
							),
						],
						$sendback
					);
					break;

				case 'tcproductclear':
					$tc_removed = 0;
					foreach ( $post_ids as $post_id ) {
						themecomplete_update_post_meta( $post_id, 'tm_meta', '' );
						++$tc_removed;
					}
					$sendback = add_query_arg(
						[
							'tc_removed' => $tc_removed,
							'ids'        => join(
								',',
								$post_ids
							),
						],
						$sendback
					);
					break;

				case 'tcclearexclude':
					$tc_removed = 0;
					foreach ( $post_ids as $post_id ) {
						$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );
						if ( ! is_array( $tm_meta_cpf ) ) {
							$tm_meta_cpf = [];
						}
						if ( is_array( $tm_meta_cpf ) ) {
							if ( ! isset( $tm_meta_cpf['exclude'] ) ) {
								$tm_meta_cpf['exclude'] = [];
							}
							unset( $tm_meta_cpf['exclude'] );
							themecomplete_update_post_meta( $post_id, 'tm_meta_cpf', $tm_meta_cpf );
						}
						++$tc_removed;
					}
					$sendback = add_query_arg(
						[
							'tc_removed' => $tc_removed,
							'ids'        => join(
								',',
								$post_ids
							),
						],
						$sendback
					);
					break;

				case 'tcclearexcludeadd':
					$tc_removed = 0;
					foreach ( $post_ids as $post_id ) {
						$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );
						if ( ! is_array( $tm_meta_cpf ) ) {
							$tm_meta_cpf = [];
						}
						if ( is_array( $tm_meta_cpf ) ) {
							if ( ! isset( $tm_meta_cpf['exclude'] ) ) {
								$tm_meta_cpf['exclude'] = [];
							}
							$tm_meta_cpf['exclude'] = '1';
							themecomplete_update_post_meta( $post_id, 'tm_meta_cpf', $tm_meta_cpf );
						}
						++$tc_removed;
					}
					$sendback = add_query_arg(
						[
							'tc_removed' => $tc_removed,
							'ids'        => join(
								',',
								$post_ids
							),
						],
						$sendback
					);
					break;

				default:
					return;
			}

			wp_safe_redirect( $sendback );
			exit;
		}
	}

	/**
	 * Add extra functionality on list screen
	 *
	 * @param array<mixed> $actions An array of the available bulk actions.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function bulk_actions_edit_product( $actions ) {
		$args = [
			'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
			'post_status' => [ 'publish' ], // get only enabled global extra options.
			'numberposts' => -1,
			'orderby'     => 'date',
			'order'       => 'asc',
		];

		THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
		$tmp_tmglobalprices = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
		THEMECOMPLETE_EPO_WPML()->restore_sql_filter();
		if ( $tmp_tmglobalprices ) {
			$actions['tcline'] = esc_html__( 'Include additional Global forms', 'woocommerce-tm-extra-product-options' );
			foreach ( $tmp_tmglobalprices as $key => $tmcp ) {
				$actions[ 'tc_' . $tmcp->ID ] = ( ( '' === $tmcp->post_title ) ? esc_html__( '(no title)', 'default' ) : $tmcp->post_title );
			}
			$actions['tcline2'] = '---';
		}
		$actions['tcclear'] = esc_html__( 'Clear all additional Global forms', 'woocommerce-tm-extra-product-options' );

		$actions['tcclearexclude']    = esc_html__( 'Disable Exclude from Global Options', 'woocommerce-tm-extra-product-options' );
		$actions['tcclearexcludeadd'] = esc_html__( 'Enable Exclude from Global Options', 'woocommerce-tm-extra-product-options' );
		$actions['tcproductclear']    = esc_html__( 'Delete all options on the product', 'woocommerce-tm-extra-product-options' );

		return $actions;
	}

	/**
	 * File manager (delete directory)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_mn_deldir() {

		check_ajax_referer( 'settings-nonce', 'security' );

		if ( isset( $_POST['tmdir'] ) ) {
			$subdir = THEMECOMPLETE_EPO()->upload_dir . sanitize_text_field( wp_unslash( $_POST['tmdir'] ) );
			$param  = wp_upload_dir();
			if ( empty( $param['subdir'] ) ) {
				$param['path']   = $param['path'] . $subdir;
				$param['url']    = $param['url'] . $subdir;
				$param['subdir'] = $subdir;
			} else {
				$param['path']   = str_replace( $param['subdir'], $subdir, $param['path'] );
				$param['url']    = str_replace( $param['subdir'], $subdir, $param['url'] );
				$param['subdir'] = str_replace( $param['subdir'], $subdir, $param['subdir'] );
			}
			$html = THEMECOMPLETE_EPO_HELPER()->file_rmdir( $param['path'] );
		}

		$this->tm_mn_movetodir();
	}

	/**
	 * File manager (delete file)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_mn_delfile() {

		check_ajax_referer( 'settings-nonce', 'security' );

		if ( isset( $_POST['tmfile'] ) && isset( $_POST['tmdir'] ) ) {
			$tmdir  = sanitize_text_field( wp_unslash( $_POST['tmdir'] ) );
			$subdir = THEMECOMPLETE_EPO()->upload_dir . $tmdir;
			$param  = wp_upload_dir();
			if ( empty( $param['subdir'] ) ) {
				$param['path']   = $param['path'] . $subdir;
				$param['url']    = $param['url'] . $subdir;
				$param['subdir'] = $subdir;
			} else {
				$param['path']   = str_replace( $param['subdir'], $subdir, $param['path'] );
				$param['url']    = str_replace( $param['subdir'], $subdir, $param['url'] );
				$param['subdir'] = str_replace( $param['subdir'], $subdir, $param['subdir'] );
			}
			$html = THEMECOMPLETE_EPO_HELPER()->file_delete( $param['path'] . '/' . sanitize_text_field( wp_unslash( $_POST['tmfile'] ) ) );
		}

		$this->tm_mn_movetodir();
	}

	/**
	 * File manager (move to a directory)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_mn_movetodir() {

		check_ajax_referer( 'settings-nonce', 'security' );

		$html = '';
		if ( isset( $_POST['dir'] ) ) {
			$html = THEMECOMPLETE_EPO_HELPER()->file_manager( THEMECOMPLETE_EPO()->upload_dir, sanitize_text_field( wp_unslash( $_POST['dir'] ) ) );
		}
		if ( $html ) {
			wp_send_json(
				[
					'result' => $html,
				]
			);
		} else {
			wp_send_json(
				[
					'error'   => 1,
					'message' => esc_html__( 'File manager is not supported on your server.', 'woocommerce-tm-extra-product-options' ),
				]
			);
		}
	}

	/**
	 * Reset plugin settings (via ajax)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_reset_settings() {

		check_ajax_referer( 'settings-nonce', 'security' );

		$error   = 0;
		$message = esc_html__( 'Your settings have been reset.', 'woocommerce-tm-extra-product-options' );

		$thissettings_options = THEMECOMPLETE_EPO_SETTINGS()->settings_options();
		$thissettings_array   = [];
		foreach ( $thissettings_options as $key => $value ) {
			$thissettings_array[ $key ] = THEMECOMPLETE_EPO_SETTINGS()->create_setting( $key, $value );
		}
		$settings = [];
		$settings = array_merge( $settings, [ [ 'type' => 'tm_tabs_header' ] ] );

		foreach ( $thissettings_array as $key => $value ) {
			$settings = array_merge( $settings, $value );
			foreach ( $value as $k => $v ) {
				if ( isset( $v['type'] ) && isset( $v['id'] ) && isset( $v['default'] ) && 'tm_title' !== $v['type'] ) {
					$_POST[ $v['id'] ] = $v['default'];
				}
			}
		}
		$options = apply_filters(
			'tm_' . THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID . '_settings',
			$settings
		);

		if ( class_exists( 'WC_Admin_Settings' ) ) {
			WC_Admin_Settings::save_fields( $options );
		} else {
			$error   = 1;
			$message = esc_html__( 'There was an error saving the settings.', 'woocommerce-tm-extra-product-options' );
		}
		wp_send_json(
			[
				'error'   => $error,
				'message' => $message,
			]
		);
	}

	/**
	 * Save plugin settings (via ajax)
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_save_settings() {

		check_ajax_referer( 'settings-nonce', 'security' );

		$error   = 0;
		$message = esc_html__( 'Your settings have been saved.', 'woocommerce-tm-extra-product-options' );

		$thissettings_options = THEMECOMPLETE_EPO_SETTINGS()->settings_options();
		$thissettings_array   = [];
		foreach ( $thissettings_options as $key => $value ) {
			$thissettings_array[ $key ] = THEMECOMPLETE_EPO_SETTINGS()->create_setting( $key, $value );
		}
		$settings = [];
		$settings = array_merge( $settings, [ [ 'type' => 'tm_tabs_header' ] ] );

		foreach ( $thissettings_array as $key => $value ) {
			$settings = array_merge( $settings, $value );
		}
		$options = apply_filters(
			'tm_' . THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID . '_settings',
			$settings
		);

		if ( class_exists( 'WC_Admin_Settings' ) ) {
			WC_Admin_Settings::save_fields( $options );
		} else {
			$error   = 1;
			$message = esc_html__( 'There was an error saving the settings.', 'woocommerce-tm-extra-product-options' );
		}
		wp_send_json(
			[
				'error'   => $error,
				'message' => $message,
			]
		);
	}

	/**
	 * Variations check
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_variations_check() {
		global $post, $tm_is_ajax;
		$tm_is_ajax  = true;
		$json_result = [
			'result' => 0,
			'html'   => '',
		];
		if ( isset( $_POST['post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post_id = absint( $_POST['post_id'] ); // phpcs:ignore WordPress.Security.NonceVerification
			$builder = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
			$meta    = [];
			if ( isset( $builder['tmfbuilder'] ) && isset( $builder['tmfbuilder']['variations_options'] ) ) {
				$meta = $builder['tmfbuilder']['variations_options'];
			}
			ob_start();
			THEMECOMPLETE_EPO_ADMIN_BUILDER()->builder_sub_variations_options(
				[
					'meta'       => $meta,
					'product_id' => $post_id,
				]
			);
			$html                  = ob_get_clean();
			$json_result['result'] = 1;
			$json_result['html']   = $html;

			$returned_js = THEMECOMPLETE_EPO_ADMIN_BUILDER()->builder_sub_variations_options(
				[
					'meta'       => $meta,
					'product_id' => $post_id,
					'return_js'  => true,
				]
			);
			if ( is_array( $returned_js ) ) {
				$temp_array = [
					'id'       => 'multiple',
					'multiple' => [],
				];
				foreach ( $returned_js as $js_value ) {
					$temp_array['multiple'][] = THEMECOMPLETE_EPO_ADMIN_BUILDER()->remove_for_js( $js_value );
				}
				$json_result['jsobject'] = $temp_array;
			}
		}
		wp_send_json( $json_result );
	}

	/**
	 * Get available variations
	 *
	 * @param object $product The product object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_available_variations( $product ) {
		$available_variations = [];

		if ( $product instanceof WC_Product ) {
			foreach ( $product->get_children() as $child_id ) {
				$variation = wc_get_product( $child_id );
				if ( false !== $variation ) {
					$variation_id = themecomplete_get_variation_id( $variation );
					// Hide out of stock variations if 'Hide out of stock items from the catalog' is checked.
					if ( empty( $variation_id ) || ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && ! $variation->is_in_stock() ) ) {
						continue;
					}

					// Filter 'woocommerce_hide_invisible_variations' to optionally hide invisible variations (disabled variations and variations with empty price).
					if ( apply_filters( 'woocommerce_hide_invisible_variations', false, themecomplete_get_id( $product ), $variation ) && ! $variation->variation_is_visible() ) { // @phpstan-ignore-line
						continue;
					}

					$available_variations[] = $this->get_available_variation( $variation, $product );
				}
			}
		}

		return $available_variations;
	}

	/**
	 * Get available variation
	 *
	 * @param mixed  $variation The variation.
	 * @param object $product The product object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_available_variation( $variation, $product ) {
		if ( is_numeric( $variation ) ) {
			$variation = wc_get_product( $variation );
		}

		return apply_filters(
			'tc_epo_woocommerce_available_variation',
			[
				'variation_id' => themecomplete_get_variation_id( $variation ),
				'attributes'   => $variation->get_variation_attributes(),
				'is_in_stock'  => $variation->is_in_stock(),
				'status'       => $variation->get_status( 'edit' ),
			],
			$product,
			$variation
		);
	}

	/**
	 * Get variations array
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_get_variations_array() {
		$variations = [];
		$attributes = [];
		if ( isset( $_POST['post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			if ( class_exists( 'Woocommerce_Waitlist' ) ) {
				remove_filter( 'woocommerce_get_availability', [ Woocommerce_Waitlist::get_instance(), 'wew_check_product_availability' ], 2 );
				remove_filter( 'woocommerce_get_availability', [ Woocommerce_Waitlist::get_instance(), 'wew_check_product_availability' ] );
			}

			$product = wc_get_product( absint( wp_unslash( $_POST['post_id'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification

			if ( $product && is_object( $product ) && is_callable( [ $product, 'get_available_variations' ] ) ) {
				$variations     = $this->get_available_variations( $product );
				$attributes     = $product->get_variation_attributes(); // @phpstan-ignore-line
				$all_attributes = $product->get_attributes();
				if ( $attributes ) {
					foreach ( $attributes as $key => $value ) {
						if ( ! $value ) {
							$attributes[ $key ] = array_map( 'trim', explode( '|', $all_attributes[ $key ]['value'] ) );
						}
					}
				}
			}
		}
		wp_send_json(
			[
				'variations' => $variations,
				'attributes' => $attributes,
			]
		);
	}

	/**
	 * Export a form.
	 *
	 * @return void
	 * @since 1.0
	 */
	public function export() {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->export( 'metaserialized' );
	}

	/**
	 * Import a form.
	 *
	 * @return void
	 * @since 1.0
	 */
	public function import() {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->import();
	}

	/**
	 * Download a form.
	 *
	 * @return void
	 * @since 1.0
	 */
	public function download() {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->download();
	}

	/**
	 * Extra row actions.
	 *
	 * @param array<mixed> $actions An array of row action links.
	 * @param WP_Post      $post The post object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function row_actions_template( $actions, $post ) {
		// Get the post type object.
		$post_type = get_post_type_object( $post->post_type );

		$can_do_clone = true;
		// Disable wpml cloning on translated forms.
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$ppid = absint( themecomplete_get_post_meta( $post->ID, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true ) );
			if ( ! empty( $ppid ) && absint( $post->ID ) !== $ppid ) {
				$can_do_clone = false;
			}
		}

		if ( $can_do_clone ) {
			// Clone a form.
			$nonce                    = wp_create_nonce( 'tmclone_form_nonce_' . $post->ID );
			$actions['tm_clone_form'] = '<a class="tm-clone-form" rel="' . esc_attr( $nonce ) . '" href="' . esc_url( admin_url( 'post.php?action=clone&amp;post=' . $post->ID . '&amp;_wpnonce=' . $nonce ) ) . '">' . esc_html__( 'Clone template', 'woocommerce-tm-extra-product-options' ) . '</a>';
		}

		ksort( $actions );

		return $actions;
	}

	/**
	 * Extra row actions.
	 *
	 * @param array<mixed> $actions An array of row action links.
	 * @param WP_Post      $post The post object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function row_actions( $actions, $post ) {
		// Get the post type object.
		$post_type = get_post_type_object( $post->post_type );

		$can_do_clone = true;
		// Disable wpml cloning on translated forms.
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$ppid = absint( themecomplete_get_post_meta( $post->ID, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true ) );
			if ( ! empty( $ppid ) && absint( $post->ID ) !== $ppid ) {
				$can_do_clone = false;
			}
		}

		if ( $can_do_clone ) {
			// Clone a form.
			$nonce                    = wp_create_nonce( 'tmclone_form_nonce_' . $post->ID );
			$actions['tm_clone_form'] = '<a class="tm-clone-form" rel="' . esc_attr( $nonce ) . '" href="' . esc_url( admin_url( 'edit.php?post_type=product&amp;page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&amp;action=clone&amp;post=' . $post->ID . '&amp;_wpnonce=' . $nonce ) ) . '">' . esc_html__( 'Clone form', 'woocommerce-tm-extra-product-options' ) . '</a>';
		}

		// Export a form.
		$nonce                     = wp_create_nonce( 'tmexport_form_nonce_' . $post->ID );
		$actions['tm_export_form'] = '<a class="tm-export-form" rel="' . esc_attr( $nonce ) . '" href="' . esc_url( admin_url( 'edit.php?post_type=product&amp;page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&amp;action=export&amp;post=' . $post->ID . '&amp;_wpnonce=' . $nonce ) ) . '">' . esc_html__( 'Export form', 'woocommerce-tm-extra-product-options' ) . '</a>';
		ksort( $actions );

		return $actions;
	}

	/**
	 * Add menus
	 *
	 * @return void
	 * @since 1.0
	 */
	public function admin_menu() {
		if ( THEMECOMPLETE_EPO_ADMIN()->is_backend_enabled() ) {
			$page_hook = add_submenu_page(
				'edit.php?post_type=product',
				THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name,
				THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name,
				'manage_woocommerce', //phpcs:ignore
				THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK,
				[ $this, 'admin_screen' ]
			);
			// Restrict loading scripts and functions unless we are on the plugin page.
			add_action( 'load-' . $page_hook, [ $this, 'tm_load_admin' ] );

			add_menu_page(
				esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
				esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
				'manage_woocommerce', //phpcs:ignore
				'tcepo',
				[ $this, 'admin_epo_menu' ],
				'dashicons-screenoptions',
				54.6
			);

			$hook1 = add_submenu_page(
				'tcepo',
				esc_html__( 'Settings', 'woocommerce-tm-extra-product-options' ),
				esc_html__( 'Settings', 'woocommerce-tm-extra-product-options' ),
				'manage_woocommerce', //phpcs:ignore
				'tcepo-settings',
				[ $this, 'admin_epo_submenu_settings' ]
			);
			add_action( 'load-' . $hook1, [ $this, 'preload_settings' ] );
			add_submenu_page(
				'tcepo',
				THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name,
				THEMECOMPLETE_EPO_POST_TYPES::instance()::$global_type->labels->name,
				'manage_woocommerce', //phpcs:ignore
				'tcepo-global',
				[ $this, 'admin_epo_submenu_global' ]
			);
			add_action( 'load-edit.php', [ $this, 'tm_load_admin_templates' ] );
		}
	}

	/**
	 * Menu redirect
	 *
	 * @return void
	 * @since 5.0
	 */
	public function admin_epo_menu() {
		wp_safe_redirect( admin_url( 'admin.php?page=tcepo-settings' ), 301 );
		exit;
	}

	/**
	 * Submenu "Settings"
	 *
	 * @return void
	 * @since 5.0
	 */
	public function preload_settings() {
		global $current_tab;
		$current_tab = THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID;

		// Include settings pages.
		WC_Admin_Settings::get_settings_pages();

		do_action( 'woocommerce_settings_page_init' );
	}

	/**
	 * Submenu "Settings"
	 *
	 * @return void
	 * @since 5.0
	 */
	public function admin_epo_submenu_settings() {
		WC_Admin_Settings::output();
	}

	/**
	 * Submenu "Option Templates"
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 6.0
	 */
	public function preload_template_settings( $post ) { //phpcs:ignore
		// Builder meta box.
		add_meta_box( 'tmformfieldsbuilder', esc_html__( 'Extra Product Options Form Builder', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_form_fields_builder_meta_box' ], THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE, 'normal', 'core' );
		// Description meta box (used for getting tinymce).
		add_meta_box( 'thepostexcerpt', esc_html__( 'Description', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_description_meta_box' ], null, 'normal', 'core' );
	}

	/**
	 * Submenu "Global Forms"
	 *
	 * @return void
	 * @since 5.0
	 */
	public function admin_epo_submenu_global() {
		wp_safe_redirect( admin_url( 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK ), 301 );
		exit;
	}

	/**
	 * Load scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_load_scripts() {
		// Load css and javascript files.
		add_action( 'admin_enqueue_scripts', [ $this, 'register_admin_scripts' ], 11 );
	}

	/**
	 * Loads plugin functionality
	 *
	 * @return void
	 * @since 6.2
	 */
	public function tm_load_admin_templates() {
		global $typenow;
		$post_type = $typenow;

		if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post_type ) {
			// Extra row actions.
			add_filter( 'post_row_actions', [ $this, 'row_actions_template' ], 10, 2 );
		}
	}

	/**
	 * Loads plugin functionality
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_load_admin() {
		$this->tm_load_scripts();

		// Custom action to populate the filter select box.
		add_action( 'restrict_manage_posts', [ $this, 'tm_restrict_manage_posts' ] );

		// Add screen option.
		$this->tm_add_option();

		// Add meta boxes.
		$this->tm_add_metaboxes();

		// Extra row actions.
		add_filter( 'post_row_actions', [ $this, 'row_actions' ], 10, 2 );
	}

	/**
	 * Add list columns
	 *
	 * @param array<mixed> $columns The columns array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_list_columns( $columns ) {
		$new_columns          = [];
		$new_columns['cb']    = isset( $columns['cb'] ) ? $columns['cb'] : '<input type="checkbox" />';
		$new_columns['title'] = isset( $columns['title'] ) ? $columns['title'] : esc_html__( 'Title', 'woocommerce-tm-extra-product-options' );
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$flags = '';
			foreach ( THEMECOMPLETE_EPO_WPML()->get_active_languages() as $key => $value ) {
				if ( THEMECOMPLETE_EPO_WPML()->get_lang() !== $key ) {
					$flags .= THEMECOMPLETE_EPO_WPML()->get_flag( $key );
				}
			}
			$new_columns['tm_icl_translations'] = '<span class="tm-icl-space">&nbsp;</span>' . $flags;
		}
		$new_columns['priority']            = esc_html__( 'Priority', 'woocommerce-tm-extra-product-options' );
		$new_columns['applied_on']          = esc_html__( 'Applied on', 'woocommerce-tm-extra-product-options' );
		$new_columns['product_cat']         = esc_html__( 'Categories', 'woocommerce-tm-extra-product-options' );
		$new_columns['product_ids']         = esc_html__( 'Products', 'woocommerce-tm-extra-product-options' );
		$new_columns['product_exclude_ids'] = esc_html__( 'Excluded Products', 'woocommerce-tm-extra-product-options' );

		unset( $columns['cb'] );
		unset( $columns['title'] );

		return array_merge( $new_columns, $columns );
	}

	/**
	 * List column actions
	 *
	 * @param string  $column The column.
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function tm_list_column( $column, $post_id ) {
		switch ( $column ) {

			case 'tm_icl_translations':
				$main_post_id = 0;
				$tm_meta_lang = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
				if ( empty( $tm_meta_lang ) ) {
					$tm_meta_lang = THEMECOMPLETE_EPO_WPML()->get_default_lang();
					$main_post_id = $post_id;
				}
				if ( empty( $main_post_id ) ) {
					$main_post_id = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true );
				}
				THEMECOMPLETE_EPO_WPML()->get_flag( $tm_meta_lang, 1 );
				foreach ( THEMECOMPLETE_EPO_WPML()->get_active_languages() as $key => $value ) {
					if ( $key !== $tm_meta_lang || 'all' === THEMECOMPLETE_EPO_WPML()->get_lang() ) {

						if ( THEMECOMPLETE_EPO_WPML()->get_default_lang() === $key ) {
							$query = new WP_Query(
								[
									'post_type'      => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
									'post_status'    => [ 'publish', 'draft' ],
									'numberposts'    => -1,
									'posts_per_page' => -1,
									'orderby'        => 'date',
									'order'          => 'asc',
									'no_found_rows'  => true,
									'p'              => $main_post_id,
								]
							);
						} else {

							$meta_query   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $key, '=', 'EXISTS' );
							$meta_query[] = [
								'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
								'value'   => $main_post_id,
								'compare' => '=',
							];

							$query = new WP_Query(
								[
									'post_type'      => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
									'post_status'    => [ 'publish', 'draft' ],
									'numberposts'    => -1,
									'posts_per_page' => -1,
									'orderby'        => 'date',
									'order'          => 'asc',
									'no_found_rows'  => true,
									'meta_query'     => $meta_query, // phpcs:ignore WordPress.DB.SlowDBQuery
								]
							);

						}

						if ( ! empty( $query->posts ) ) {
							THEMECOMPLETE_EPO_WPML()->edit_lang_link( $query->post->ID, $key, $value, $main_post_id, false, false, 1 );
						} elseif ( empty( $query->posts ) ) {
							THEMECOMPLETE_EPO_WPML()->add_lang_link( $main_post_id, $key, $value, false, 1 );
						}
					}
				}
				break;

			case 'applied_on':
				$tm_meta_apply_mode = themecomplete_get_post_meta( $post_id, 'tm_meta_apply_mode', true );
				$tm_meta_cat        = themecomplete_get_post_meta( $post_id, 'tm_meta_disable_categories', true );
				$tm_meta_id         = apply_filters( 'wc_epo_tm_meta_product_ids', themecomplete_get_post_meta( $post_id, 'tm_meta_product_ids', true ), $post_id );
				if ( is_array( $tm_meta_id ) && 1 === count( $tm_meta_id ) && empty( $tm_meta_id[0] ) ) {
					$tm_meta_id = false;
				}
				if ( $tm_meta_apply_mode ) {
					switch ( $tm_meta_apply_mode ) {
						case 'apply-to-all-products':
							echo '<span class="tc-color-active">' . esc_html__( 'ALL products', 'woocommerce-tm-extra-product-options' ) . '</span>';
							break;
						case 'disable-form':
							echo '<span class="tc-color-error">' . esc_html__( 'Disabled', 'woocommerce-tm-extra-product-options' ) . '</span>';
							break;
						case 'customize-selection':
							$terms = get_the_term_list( $post_id, 'product_cat', '', ' , ', '' );
							if ( is_string( $terms ) ) {
								if ( ! empty( $tm_meta_id ) && is_array( $tm_meta_id ) ) {
									echo '<span class="tc-color-active">' . esc_html__( 'Products and Categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
								} else {
									echo '<span class="tc-color-active">' . esc_html__( 'Categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
								}
							} elseif ( ! empty( $tm_meta_id ) && is_array( $tm_meta_id ) ) {
								echo '<span class="tc-color-active">' . esc_html__( 'Products', 'woocommerce-tm-extra-product-options' ) . '</span>';
							} else {
								echo '<span class="tc-color-active">' . esc_html__( 'Custom', 'woocommerce-tm-extra-product-options' ) . '</span>';
							}
							break;
					}
				} elseif ( ! $tm_meta_apply_mode ) {
					if ( $tm_meta_cat ) {
						if ( ! empty( $tm_meta_id ) && is_array( $tm_meta_id ) ) {
							echo '<span class="tc-color-active">' . esc_html__( 'Products', 'woocommerce-tm-extra-product-options' ) . '</span>';
						} else {
							echo '<span class="tc-color-error">' . esc_html__( 'Disabled', 'woocommerce-tm-extra-product-options' ) . '</span>';
						}
					} else {
						$terms = get_the_term_list( $post_id, 'product_cat', '', ' , ', '' );
						if ( is_string( $terms ) ) {
							if ( ! empty( $tm_meta_id ) && is_array( $tm_meta_id ) ) {
								echo '<span class="tc-color-active">' . esc_html__( 'Products and Categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
							} else {
								echo '<span class="tc-color-active">' . esc_html__( 'Categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
							}
						} elseif ( ! $terms ) {
							echo '<span class="tc-color-active">' . esc_html__( 'ALL products', 'woocommerce-tm-extra-product-options' ) . '</span>';
						}
					}
				}

				break;

			case 'product_cat':
				$tm_meta_apply_mode = themecomplete_get_post_meta( $post_id, 'tm_meta_apply_mode', true );
				$tm_meta            = themecomplete_get_post_meta( $post_id, 'tm_meta_disable_categories', true );
				$tm_meta_id         = apply_filters( 'wc_epo_tm_meta_product_ids', themecomplete_get_post_meta( $post_id, 'tm_meta_product_ids', true ), $post_id );
				if ( is_array( $tm_meta_id ) && 1 === count( $tm_meta_id ) && empty( $tm_meta_id[0] ) ) {
					$tm_meta_id = false;
				}

				if ( $tm_meta_apply_mode ) {
					switch ( $tm_meta_apply_mode ) {
						case 'apply-to-all-products':
							echo '<span class="tc-color-active">' . esc_html__( 'ALL categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
							break;
						case 'disable-form':
							echo '<span class="tc-color-error">' . esc_html__( 'Disabled', 'woocommerce-tm-extra-product-options' ) . '</span>';
							break;
						case 'customize-selection':
							$terms = get_the_term_list( $post_id, 'product_cat', '', ' , ', '' );
							if ( is_string( $terms ) ) {
								echo wp_kses_post( $terms );
							} elseif ( empty( $tm_meta_id ) || ! is_array( $tm_meta_id ) ) {
								echo '<span class="tc-color-error">' . esc_html__( 'None', 'woocommerce-tm-extra-product-options' ) . '</span>';
							}
							break;
					}
				} elseif ( ! $tm_meta_apply_mode ) {
					if ( $tm_meta ) {
						if ( empty( $tm_meta_id ) || ! is_array( $tm_meta_id ) ) {
							echo '<span class="tc-color-error">' . esc_html__( 'Disabled', 'woocommerce-tm-extra-product-options' ) . '</span>';
						}
					} else {
						$terms = get_the_term_list( $post_id, 'product_cat', '', ' , ', '' );
						if ( is_string( $terms ) ) {
							echo wp_kses_post( $terms );
						} elseif ( ! $terms ) {
							echo '<span class="tc-color-active">' . esc_html__( 'ALL categories', 'woocommerce-tm-extra-product-options' ) . '</span>';
						}
					}
				}
				break;

			case 'priority':
				$post_id = THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id, THEMECOMPLETE_EPO_GLOBAL_POST_TYPE );
				$tm_meta = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
				if ( is_array( $tm_meta ) ) {
					if ( ! isset( $tm_meta['priority'] ) ) {
						$tm_meta['priority'] = 10;
					}
					if ( is_array( $tm_meta['priority'] ) ) {
						$tm_meta['priority'] = $tm_meta['priority'][0];
					}
					echo esc_html( $tm_meta['priority'] );
				}
				break;

			case 'product_ids':
				$tm_meta_apply_mode = themecomplete_get_post_meta( $post_id, 'tm_meta_apply_mode', true );
				$tm_meta_cat        = themecomplete_get_post_meta( $post_id, 'tm_meta_disable_categories', true );
				$tm_meta            = apply_filters( 'wc_epo_tm_meta_product_ids', themecomplete_get_post_meta( $post_id, 'tm_meta_product_ids', true ), $post_id );
				if ( is_array( $tm_meta ) && 1 === count( $tm_meta ) && empty( $tm_meta[0] ) ) {
					$tm_meta = false;
				}
				if ( ! empty( $tm_meta ) ) {
					if ( is_array( $tm_meta ) ) {
						if ( 1 === count( $tm_meta ) && ! empty( $tm_meta[0] ) ) {
							$title = get_the_title( $tm_meta[0] );
							echo '<a title="' . esc_attr( $title ) . '" href="' . esc_url( admin_url( 'post.php?action=edit&post=' . esc_attr( $tm_meta[0] ) ) ) . '">' . esc_html( $title ) . '</a>';
						} else {
							$comma_check = false;
							foreach ( $tm_meta as $key => $value ) {
								if ( ! empty( $value ) ) {
									$title = get_the_title( $value );
									if ( $comma_check ) {
										echo ' , ';
									}
									echo '<a class="tm-tooltip" title="' . esc_attr( $title ) . '" href="' . esc_url( admin_url( 'post.php?action=edit&post=' . esc_attr( $value ) ) ) . '">' . esc_html( $value ) . '</a>';
									$comma_check = true;
								}
							}
						}
					}
				} elseif ( empty( $tm_meta ) ) {
					if ( $tm_meta_apply_mode ) {
						switch ( $tm_meta_apply_mode ) {
							case 'apply-to-all-products':
								echo '<span class="tc-color-active">' . esc_html__( 'ALL products', 'woocommerce-tm-extra-product-options' ) . '</span>';
								break;
							case 'disable-form':
							case 'customize-selection':
								echo '<span class="tc-color-error">' . esc_html__( 'None', 'woocommerce-tm-extra-product-options' ) . '</span>';
								break;
						}
					} elseif ( ! $tm_meta_apply_mode ) {
						if ( $tm_meta_cat ) {
							if ( empty( $tm_meta ) || ! is_array( $tm_meta ) ) {
								echo '<span class="tc-color-error">' . esc_html__( 'None', 'woocommerce-tm-extra-product-options' ) . '</span>';
							}
						} else {
							$terms = get_the_term_list( $post_id, 'product_cat', '', ' , ', '' );
							if ( ! $terms ) {
								echo '<span class="tc-color-active">' . esc_html__( 'ALL products', 'woocommerce-tm-extra-product-options' ) . '</span>';
							} else {
								echo '<span class="tc-color-error">' . esc_html__( 'None', 'woocommerce-tm-extra-product-options' ) . '</span>';
							}
						}
					}
				}
				break;

			case 'product_exclude_ids':
				$tm_meta = apply_filters( 'wc_epo_tm_meta_product_exclude_ids', themecomplete_get_post_meta( $post_id, 'tm_meta_product_exclude_ids', true ), $post_id );
				if ( is_array( $tm_meta ) && 1 === count( $tm_meta ) && empty( $tm_meta[0] ) ) {
					$tm_meta = false;
				}
				if ( ! empty( $tm_meta ) ) {
					if ( is_array( $tm_meta ) ) {
						if ( 1 === count( $tm_meta ) && ! empty( $tm_meta[0] ) ) {
							$title = get_the_title( $tm_meta[0] );
							echo '<a title="' . esc_attr( $title ) . '" href="' . esc_url( admin_url( 'post.php?action=edit&post=' . esc_attr( $tm_meta[0] ) ) ) . '">' . esc_html( $title ) . '</a>';
						} else {
							$comma_check = false;
							foreach ( $tm_meta as $key => $value ) {
								if ( ! empty( $value ) ) {
									$title = get_the_title( $value );
									if ( $comma_check ) {
										echo ' , ';
									}
									echo '<a class="tm-tooltip" title="' . esc_attr( $title ) . '" href="' . esc_url( admin_url( 'post.php?action=edit&post=' . esc_attr( $value ) ) ) . '">' . esc_html( $value ) . '</a>';
									$comma_check = true;
								}
							}
						}
					}
				} else {
					echo '<span class="tc-color-error">' . esc_html__( 'None', 'woocommerce-tm-extra-product-options' ) . '</span>';
				}
				break;

		}
	}

	/**
	 * Handle meta boxes
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_add_metaboxes() {
		// only continue if we are are on add/edit screen.
		if ( ! $this->tm_list_table instanceof THEMECOMPLETE_EPO_ADMIN_Global_List_Table || ! $this->tm_list_table->current_action() ) {
			return;
		}

		add_screen_option(
			'layout_columns',
			[
				'max'     => 2,
				'default' => 2,
			]
		);

		// WPML meta box.
		THEMECOMPLETE_EPO_WPML()->add_meta_box();

		// Settings meta box.
		add_meta_box( 'settingsdiv', esc_html__( 'Form settings', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_settings_meta_box' ], null, 'side', 'high' );

		// Publish meta box.
		add_meta_box( 'submitdiv', esc_html__( 'Publish' ), [ $this, 'tc_post_submit_meta_box' ], null, 'side', 'high' );

		// Taxonomies meta box.
		THEMECOMPLETE_EPO_WPML()->remove_term_filters();
		foreach ( get_object_taxonomies( $this->tm_list_table->get_screen()->post_type ) as $tax_name ) {
			$taxonomy = get_taxonomy( $tax_name );
			if ( ! $taxonomy instanceof WP_Taxonomy || ! $taxonomy->show_ui ) {
				continue;
			}
			if ( ! property_exists( $taxonomy, 'meta_box_cb' ) || false === $taxonomy->meta_box_cb ) {
				if ( $taxonomy->hierarchical ) {
					$taxonomy->meta_box_cb = 'post_categories_meta_box';
				} else {
					$taxonomy->meta_box_cb = 'post_tags_meta_box';
				}
			}
			$label = $taxonomy->labels->name;
			if ( ! is_taxonomy_hierarchical( $tax_name ) ) {
				$tax_meta_box_id = 'tagsdiv-' . $tax_name;
			} else {
				$tax_meta_box_id = $tax_name . 'div';
			}
			if ( ! is_bool( $taxonomy->meta_box_cb ) ) {
				add_meta_box( $tax_meta_box_id, $label, $taxonomy->meta_box_cb, null, 'side', 'core', [ 'taxonomy' => $tax_name ] );
			}
		}
		THEMECOMPLETE_EPO_WPML()->restore_term_filters();

		// Products include meta box.
		add_meta_box( 'tc-product-search', esc_html__( 'Products', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_product_search_meta_box' ], null, 'side', 'core' );

		// Roles meta box.
		add_meta_box( 'tc-product-roles', esc_html__( 'Roles', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_product_roles_meta_box' ], null, 'side', 'core' );

		// Products exclude meta box.
		add_meta_box( 'tc-product-exclude', esc_html__( 'Exclude Products', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_product_exclude_meta_box' ], null, 'side', 'core' );

		// Description meta box.
		add_meta_box( 'postexcerpt', esc_html__( 'Description', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_description_meta_box' ], null, 'normal', 'core' );

		// Builder meta box.
		add_meta_box( 'tmformfieldsbuilder', esc_html__( 'Extra Product Options Form Builder', 'woocommerce-tm-extra-product-options' ), [ $this, 'tm_form_fields_builder_meta_box' ], null, 'normal', 'core' );
	}

	/**
	 * Description meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_description_meta_box( $post ) {
		$settings = [
			'textarea_name' => 'excerpt',
			'quicktags'     => [ 'buttons' => 'em,strong,link' ],
			'tinymce'       => [
				'theme_advanced_buttons1' => 'bold,italic,strikethrough,separator,bullist,numlist,separator,blockquote,separator,justifyleft,justifycenter,justifyright,separator,link,unlink,separator,undo,redo,separator',
				'theme_advanced_buttons2' => '',
			],
		];

		wp_editor( wp_specialchars_decode( $post->post_excerpt, ENT_COMPAT ), 'excerpt', apply_filters( 'woocommerce_product_short_description_editor_settings', $settings ) );
		echo '<p>' . esc_html__( 'The description will appear under the title.', 'woocommerce-tm-extra-product-options' ) . '</p>';
	}

	/**
	 * Roles meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_product_roles_meta_box( $post ) {
		$disabled = '';
		if ( ! THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type ) ) {
			$disabled = 'disabled="disabled" ';
		}
		$meta           = $this->tm_meta;
		$enabled_roles  = isset( $meta['enabled_roles'] ) ? $meta['enabled_roles'] : '';
		$disabled_roles = isset( $meta['disabled_roles'] ) ? $meta['disabled_roles'] : '';
		$roles          = themecomplete_get_roles();

		if ( ! is_array( $enabled_roles ) ) {
			$enabled_roles = [ $enabled_roles ];
		}
		if ( ! is_array( $disabled_roles ) ) {
			$disabled_roles = [ $disabled_roles ];
		}

		echo '<div class="message0x0 tc-clearfix">' .
			'<div class="message2x1">' .
			'<label for="tc-enabled-options"><span>' . esc_html__( 'Enabled roles for this form', 'woocommerce-tm-extra-product-options' ) . '</span></label>' .
			'</div>' .
			'<div class="message2x2">' .
			'<select id="tc-enabled-options" name="tm_meta_enabled_roles[]" class="multiselect wc-enhanced-select" multiple="multiple">';
		foreach ( $roles as $option_key => $option_text ) {
			echo '<option value="' . esc_attr( $option_key ) . '" ';
			selected( in_array( $option_key, $enabled_roles, true ), 1, true );
			echo '>' . esc_html( $option_text ) . '</option>';
		}

		echo '</select>' .
			'</div>' .
			'</div>';
		echo '<div class="message0x0 tc-clearfix">' .
			'<div class="message2x1">' .
			'<label for="tc-disabled-options"><span>' . esc_html__( 'Disabled roles for this form', 'woocommerce-tm-extra-product-options' ) . '</span></label>' .
			'</div>' .
			'<div class="message2x2">' .
			'<select id="tc-disabled-options" name="tm_meta_disabled_roles[]" class="multiselect wc-enhanced-select" multiple="multiple">';
		foreach ( $roles as $option_key => $option_text ) {
			echo '<option value="' . esc_attr( $option_key ) . '" ';
			selected( in_array( $option_key, $disabled_roles, true ), 1, true );
			echo '>' . esc_html( $option_text ) . '</option>';
		}
		echo '</select>' .
			'</div>' .
			'</div>';
	}

	/**
	 * Exclude meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_product_exclude_meta_box( $post ) {
		$disabled = false;
		$meta     = $this->tm_meta;
		if ( ! THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type ) ) {
			$disabled = true;
		}
		?>
		<label for="tm_product_exclude_ids"><?php esc_html_e( 'Exclude Product(s) from the form', 'woocommerce-tm-extra-product-options' ); ?></label>
		<select class="wc-product-search w100" multiple="multiple" id="tm_product_exclude_ids" name="tm_meta_product_exclude_ids[]" data-placeholder="<?php esc_html_e( 'Search for a product&hellip;', 'woocommerce-tm-extra-product-options' ); ?>" data-action="woocommerce_json_search_products_and_variations">
		<?php
		$_ids        = isset( $meta['product_exclude_ids'] ) ? $meta['product_exclude_ids'] : null;
		$product_ids = ! empty( $_ids ) ? array_map( 'absint', $_ids ) : null;
		if ( $product_ids ) {
			foreach ( $product_ids as $product_id ) {
				$product = wc_get_product( $product_id );
				if ( is_object( $product ) ) {
					echo '<option value="' . esc_attr( (string) $product_id ) . '"' . selected( true, true, false ) . '>' . esc_html( wp_strip_all_tags( $product->get_formatted_name() ) ) . '</option>';
				}
			}
		}
		?>
		</select>
		<?php
	}

	/**
	 * Product search meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_product_search_meta_box( $post ) {
		$meta = $this->tm_meta;
		?>
		<label for="tm_product_ids"><?php esc_html_e( 'Select the Product(s) to apply the options', 'woocommerce-tm-extra-product-options' ); ?></label>
		<?php
		// check for correct saved meta.
		$tm_meta_product_ids = themecomplete_get_post_meta( $post->ID, 'tm_meta_product_ids', true );

		// The below is required since on some systems the ids are saved as strings.
		$array1 = $tm_meta_product_ids;
		if ( ! is_array( $array1 ) ) {
			$array1 = [ $array1 ];
		}
		$array2 = $meta['product_ids'];
		if ( ! is_array( $array2 ) ) {
			$array2 = [ $array2 ];
		}
		$array1 = array_map( 'strval', $array1 );
		$array2 = array_map( 'strval', $array2 );

		if ( 'auto-draft' !== $post->post_status && $array1 !== $array2 ) {
			echo '<div class="tc-info tc-error">';
			esc_html_e( 'Meta data not correctly saved. Please save the product!', 'woocommerce-tm-extra-product-options' );
			echo '</div>';
		}
		?>
		<select class="wc-product-search w100"
				multiple="multiple"
				id="tm_product_ids"
				name="tm_meta_product_ids[]"
				data-placeholder="<?php esc_html_e( 'Search for a product&hellip;', 'woocommerce-tm-extra-product-options' ); ?>"
				data-action="woocommerce_json_search_products_and_variations">
			<?php
			$_ids        = isset( $meta['product_ids'] ) ? $meta['product_ids'] : null;
			$product_ids = ! empty( $_ids ) ? array_map( 'absint', $_ids ) : null;
			if ( $product_ids ) {
				foreach ( $product_ids as $product_id ) {
					$product = wc_get_product( $product_id );
					if ( is_object( $product ) ) {
						echo '<option value="' . esc_attr( (string) $product_id ) . '"' . selected( true, true, false ) . '>' . esc_html( $product->get_formatted_name() ) . '</option>';
					}
				}
			}
			?>
		</select>
		<?php
	}

	/**
	 * Builder meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_form_fields_builder_meta_box( $post ) {

		// used in scripts template.
		$this->post = $post;

		$basetype = $this->basetype;
		if ( false === $basetype ) {
			if ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE === $post->post_type || THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post->post_type ) {
				$basetype = $post->post_type;
			} else {
				$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
			}
		}
		?>
		<div id="tmformfieldsbuilderwrap" class="tc-wrapper">
			<?php
			$wpml_is_original_product = true;
			$id_for_meta              = $post->ID;
			if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
				$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type, $basetype );
				if ( ! $wpml_is_original_product ) {
					$id_for_meta = intval( THEMECOMPLETE_EPO_WPML()->get_original_id( $post->ID, $post->post_type, $basetype ) );
				}
				if ( false === $wpml_is_original_product && $id_for_meta === $post->ID && 'auto-draft' === $post->post_status ) {
					$wpml_is_original_product = true;
				}
			}

			$show_buttons = 'auto-draft' !== $post->post_status;

			// builder toolbar.
			echo '<div class="builder-selector">'
				. '<div class="tc-row">';
			// builder toolbar left.
			echo '<div class="tc-cell tc-col-auto">';
			if ( $wpml_is_original_product ) {
				if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
					echo '<button type="button" class="tc-add-element tc tc-button large" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="tcfa tcfa-plus"></i> ' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
					echo '<button type="button" id="builder_add_section" class="builder_add_section tc tc-button large"><span class="tc-button-label"><i class="tcfa tcfa-layer-group"></i> ' . esc_html__( 'Add section', 'woocommerce-tm-extra-product-options' ) . '</span></button>'
						. '<button type="button" id="builder_add_variation" class="builder_add_variation tc tc-button large tm-hidden"><span class="tc-button-label"><i class="tcfa tcfa-bullseye"></i> ' . esc_html__( 'Style variations', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
				}
			}
			echo '</div>';
			// builder toolbar right.
			echo '<div class="tc-cell tc-col-auto tm-text-right">';
			if ( $show_buttons ) {
				if ( $wpml_is_original_product || ( empty( $_GET['tmparentpostid'] ) && empty( $_GET['tmaddlang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					echo '<button type="button" id="builder_save" class="tc tc-button builder-save"><span class="tc-button-label">' . esc_html__( 'Save', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
					if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
						echo '<button type="button" id="builder_import" class="tc tc-button alt builder-import"><span class="tc-button-label">' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '</span></button>'
						. '<button type="button" id="builder_export" class="tc tc-button alt builder-export"><span class="tc-button-label">' . esc_html__( 'Export CSV', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
					}
				}
				echo '<button type="button" id="builder-fullsize-close" class="tc tc-button alt builder-fullsize-close" title="' . esc_attr__( 'Close', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="tcfa tcfa-times"></i></span></button>';
				echo '<button type="button" id="builder-fullsize" class="tc tc-button alt builder-fullsize" title="' . esc_attr__( 'Fullsize', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="tcfa tcfa-window-maximize"></i></span></button>';

				echo '<input id="builder_import_file" name="builder_import_file" type="file" class="builder-import-file">';
			} elseif ( ! $show_buttons ) {
				if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
					if ( $post->post_type === $basetype ) {
						echo '<div class="tc-warning-text">'
							. esc_html__( 'Please save the form before importing options!', 'woocommerce-tm-extra-product-options' )
							. '</div>';
					} else {
						echo '<div class="tc-warning-text">'
							. esc_html__( 'Please save the product before importing options!', 'woocommerce-tm-extra-product-options' )
							. '</div>';
					}
				} else {
					echo '<button type="button" id="builder-fullsize-close" class="tc tc-button alt builder-fullsize-close" title="' . esc_attr__( 'Close', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="tcfa tcfa-times"></i></span></button>';
					echo '<button type="button" id="builder-fullsize" class="tc tc-button alt builder-fullsize" title="' . esc_attr__( 'Fullsize', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="tcfa tcfa-window-maximize"></i></span></button>';
				}
			}
			echo '</div>'
				. '</div>'
				. '</div>';

			echo '<div class="builder-layout tm-hidden' . ( ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $basetype ) ? ' builder-template' : '' ) . '">';
			THEMECOMPLETE_EPO_ADMIN_BUILDER()->print_saved_elements( $id_for_meta, $post->ID, $wpml_is_original_product );
			echo '</div>';

			if ( $wpml_is_original_product && ( 'product' !== $this->post->post_type || 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_hide_product_builder_mode' ) ) ) {
				echo '<div id="tc-welcome" class="tc-welcome">';
				if ( $show_buttons ) {
					echo '<div class="tc-info-text">'
							. esc_html__( 'No elements found!', 'woocommerce-tm-extra-product-options' )
							. '<br>'
							. esc_html__( 'Start adding elements', 'woocommerce-tm-extra-product-options' )
							. '</div>';
				} else {
					echo '<div class="tc-info-text">'
							. esc_html__( 'No elements found!', 'woocommerce-tm-extra-product-options' )
							. '</div>';
				}

				echo '<div class="tc-buttons">';
				echo '<button type="button" class="tm-animated tc-add-element tc tc-button large" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="ddd"></i>' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
				if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
					echo '<button type="button" class="tm-animated tc-add-section tc tc-button large" title="' . esc_html__( 'Add section', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="ddd"></i>' . esc_html__( 'Add section', 'woocommerce-tm-extra-product-options' ) . '</span></button>'
									. '<button type="button" class="tm-animated builder_add_variation tm-hidden tc tc-button large" href="#"><span class="tc-button-label"><i class="ddd"></i> ' . esc_html__( 'Style variations', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
				}
				if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
					if ( $show_buttons ) {
						echo '<button type="button" class="tm-animated alt tc-add-import-csv tc tc-button large" title="' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="ddd"></i>' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '</span></button>';
					} else {
						echo '<button type="button" class="disabled tm-animated alt tc-add-import-csv tc tc-button large" title="' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' ) . '"><span class="tc-button-label"><i class="ddd"></i>' . esc_html__( 'Import CSV', 'woocommerce-tm-extra-product-options' );
						if ( $post->post_type === $basetype ) {
							echo '<div class="tc-warning-text">'
									. esc_html__( 'Please save the form before importing options!', 'woocommerce-tm-extra-product-options' )
									. '</div>';
						} else {
							echo '<div class="tc-warning-text">'
									. esc_html__( 'Please save the product before importing options!', 'woocommerce-tm-extra-product-options' )
									. '</div>';
						}
						echo '</span></button>';
					}
				}
				echo '</div>';
				echo '</div>';
				if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $basetype ) {
					echo '<div class="builder-add-section-action">'
						. '<div class="tm-add-section-action"><button type="button" title="' . esc_html__( 'Add element in a new section', 'woocommerce-tm-extra-product-options' ) . '" class="builder-add-section-and-element tc-button tc large"><span class="tc-button-label"><i class="tcfa tcfa-plus-square"></i> ' . esc_html__( 'Add element in a new section', 'woocommerce-tm-extra-product-options' ) . '</span></button></div>'
						. '</div>';
				}
			}
			?>
		</div>
		<?php
	}

	/**
	 * Displays post submit form
	 *
	 * @param WP_Post $post The post object.
	 * @param mixed   $obj_class The class object to fetch the tm_meta from.
	 * @return void
	 * @since 6.4
	 */
	public function tc_post_submit_meta_box( $post, $obj_class ) {
		$meta = $this->tm_meta;
		if ( $obj_class && is_object( $obj_class ) && property_exists( $obj_class, 'tm_meta' ) ) {
			$meta = $obj_class->tm_meta;
		}
		?>
		<div class="submitbox" id="submitpost">
			<div id="major-publishing-actions">
				<div id="delete-action">
					<?php
					if ( current_user_can( 'delete_post', $post->ID ) ) {
						if ( ! EMPTY_TRASH_DAYS ) {
							$delete_text = esc_html__( 'Delete Permanently', 'woocommerce-tm-extra-product-options' );
						} else {
							$delete_text = esc_html__( 'Move to Trash', 'woocommerce-tm-extra-product-options' );
						}
						$url = get_delete_post_link( $post->ID );
						if ( ! $url || ! is_string( $url ) ) {
							$url = '#';
						}
						?>
						<a class="submitdelete deletion" href="<?php echo esc_url( $url ); ?>"><?php echo esc_html( $delete_text ); ?></a>
					<?php } ?>
				</div>
				<div id="publishing-action">
					<span class="spinner"></span>
					<?php
					if ( ! in_array( $post->post_status, [ 'publish', 'future', 'private' ], true ) || (int) 0 === (int) $post->ID ) {
						if ( $meta['can_publish'] ) :
							?>
							<input name="original_publish" type="hidden" id="original_publish"
								value="<?php esc_attr_e( 'Publish', 'woocommerce-tm-extra-product-options' ); ?>"/>
							<?php submit_button( esc_html__( 'Publish', 'woocommerce-tm-extra-product-options' ), 'primary button-large', 'publish', false, [ 'accesskey' => 'p' ] ); ?>
							<?php
						endif;
					} else {
						?>
						<input name="original_publish" type="hidden" id="original_publish"
							value="<?php esc_attr_e( 'Update', 'woocommerce-tm-extra-product-options' ); ?>"/>
						<input name="save" type="submit" class="button button-primary button-large" id="publish"
							accesskey="p" value="<?php esc_attr_e( 'Update', 'woocommerce-tm-extra-product-options' ); ?>"/>
						<?php
					}
					?>
				</div>
				<div class="clear"></div>
			</div>
		</div>
		<?php
	}

	/**
	 * Settings meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_settings_meta_box( $post ) {
		$disabled = false;
		$meta     = $this->tm_meta;
		if ( ! THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type ) ) {
			$disabled = true;
		}
		?>
		<div class="prioritybox" id="prioritypost">
			<div id="minor-settings">
				<div id="misc-settings-actions">
					<div class="misc-pub-section">
					<?php if ( THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type ) ) { ?>
						<label class="meta-priority-label" for="tm_meta_priority"><?php esc_html_e( 'Priority', 'woocommerce-tm-extra-product-options' ); ?></label>
						<input type="number" value="<?php echo esc_attr( $meta['priority'] ); ?>" maxlength="3"
								id="tm_meta_priority" name="tm_meta[priority]" class="meta-priority" min="1"
								step="1">
					<?php } ?>
					</div>
					<div class="misc-pub-section major-settings-actions">
						<div class="apply-mode-label">
						<?php esc_html_e( 'Apply mode', 'woocommerce-tm-extra-product-options' ); ?>
						</div>
						<div class="tm-epo-switch-wrapper">
							<input type="radio"<?php disabled( $disabled, true, true ); ?><?php checked( $meta['apply-mode'], 'apply-to-all-products' ); ?> id="apply-to-all-products" value="apply-to-all-products" name="apply-mode" class="apply-mode apply-to-all-products">
							<label for="apply-to-all-products"><span class="tc-radio-text"><?php esc_html_e( 'All products', 'woocommerce-tm-extra-product-options' ); ?></span></label>
							<input type="radio"<?php disabled( $disabled, true, true ); ?><?php checked( $meta['apply-mode'], 'disable-form' ); ?> id="disable-form" value="disable-form" name="apply-mode" class="apply-mode disable-form">
							<label for="disable-form"><span class="tc-radio-text"><?php esc_html_e( 'Disable', 'woocommerce-tm-extra-product-options' ); ?></span></label>
							<input type="radio"<?php disabled( $disabled, true, true ); ?><?php checked( $meta['apply-mode'], 'customize-selection' ); ?> id="customize-selection" value="customize-selection" name="apply-mode" class="apply-mode customize-selection">
							<label for="customize-selection"><span class="tc-radio-text"><?php esc_html_e( 'Customize', 'woocommerce-tm-extra-product-options' ); ?></span></label>
						</div>
						<?php
						if ( ! empty( $disabled ) && (int) 1 === intval( $meta['disable_categories'] ) ) {
							?>
							<input type="hidden" value="1" id="tm_meta_disable_categories" name="tm_meta_disable_categories">
							<?php
						}
						if ( ! empty( $disabled ) ) {
							?>
							<input type="hidden" value="<?php echo esc_attr( $meta['apply-mode'] ); ?>" id="apply-mode" name="apply-mode">
							<?php
						}
						?>
						<input type="hidden"<?php disabled( $disabled, true, true ); ?> value="<?php echo esc_attr( $meta['disable_categories'] ); ?>" id="tm_meta_disable_categories" name="tm_meta_disable_categories" class="meta-disable-categories">
					</div>
				</div>
				<div class="clear"></div>
			</div>
		</div>
		<?php
	}

	/**
	 * Pre-render actions
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_plugins_loaded() {
		if ( ! isset( $_GET['page'] ) || ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return;
		}
		// Remove cforms plugin tinymce buttons.
		remove_action( 'init', 'cforms_addbuttons' );
	}

	/**
	 * Pre-render actions
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_init() {
		if ( ! isset( $_GET['page'] ) || ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return;
		}

		// remove WooCommerce Product Stock Alert actions.
		if ( class_exists( 'WOO_Product_Stock_Alert' ) ) {
			global $WOO_Product_Stock_Alert; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
			if ( $WOO_Product_Stock_Alert && property_exists( $WOO_Product_Stock_Alert, 'admin' ) && $WOO_Product_Stock_Alert->admin ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName
				remove_action( 'save_post', [ $WOO_Product_Stock_Alert->admin, 'check_product_stock_status' ], 5 ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName
			}
		}
	}

	/**
	 * Pre-render actions
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_admin_init() {
		// Custom filters for the edit and delete links.
		add_filter( 'get_edit_post_link', [ $this, 'tm_get_edit_post_link' ], 10, 2 );
		add_filter( 'get_delete_post_link', [ $this, 'tm_get_delete_post_link' ], 10, 2 );

		// Check if we are on the plugin page.
		if ( ! isset( $_GET['page'] ) || ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $_GET['page'] ) ) {
			return;
		}

		// remove annoying messages that mess up the interface.
		remove_all_actions( 'admin_notices' );
		if ( class_exists( 'WC_Admin_Notices' ) && method_exists( 'WC_Admin_Notices', 'remove_all_notices' ) ) {
			WC_Admin_Notices::remove_all_notices();
		}

		// WPML: set correct language according to post.
		THEMECOMPLETE_EPO_WPML()->set_post_lang();

		// save meta data.
		add_action( 'save_post', [ $this, 'tm_save_postdata' ], 1, 2 );

		if ( ! class_exists( 'WP_List_Table' ) ) {
			wp_die( esc_html__( 'Something went wrong with WordPress.', 'woocommerce-tm-extra-product-options' ) );
		}

		global $bulk_counts, $bulk_messages, $general_messages;

		$post_type        = 'product';
		$post_type_object = get_post_type_object( $post_type );
		if ( ! $post_type_object ) {
			wp_die( esc_html__( 'WooCommerce is not enabled!', 'woocommerce-tm-extra-product-options' ) );
		}
		if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) {
			wp_die( esc_html__( 'Cheatin&#8217; uh?', 'woocommerce-tm-extra-product-options' ) );
		}

		$this->tm_list_table = $this->get_wp_list_table();
		$post_type           = $this->tm_list_table->get_screen()->post_type;
		$pagenum             = $this->tm_list_table->get_pagenum();
		$parent_file         = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		$submenu_file        = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		$post_new_file       = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&action=add';
		$doaction            = $this->tm_list_table->current_action();
		$sendback            = remove_query_arg( [ 'trashed', 'untrashed', 'deleted', 'locked', 'ids' ], wp_get_referer() );
		if ( ! $sendback ) {
			$sendback = admin_url( $parent_file );
		}
		$sendback = add_query_arg( 'paged', $pagenum, $sendback );

		$sendback = esc_url_raw( $sendback );

		// Bulk actions.
		if ( $doaction && isset( $_REQUEST['tm_bulk'] ) ) {
			check_admin_referer( 'bulk-posts' );

			if ( 'delete_all' === $doaction && isset( $_REQUEST['post_status'] ) ) {
				$post_status = preg_replace( '/[^a-z0-9_-]+/i', '', sanitize_text_field( wp_unslash( $_REQUEST['post_status'] ) ) );
				if ( get_post_status_object( $post_status ) ) { // Check if the post status exists first.
					$post_ids = THEMECOMPLETE_EPO_HELPER()->get_cached_posts(
						[
							'post_type'   => $post_type,
							'post_status' => [ $post_status ],
							'numberposts' => -1,
							'fields'      => 'ids', // Only get post IDs.
						]
					);
				}
				$doaction = 'delete';
			} elseif ( isset( $_REQUEST['ids'] ) ) {
				$post_ids = explode( ',', wp_unslash( $_REQUEST['ids'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			} elseif ( ! empty( $_REQUEST['post'] ) ) {
				$post_ids = array_map( 'intval', $_REQUEST['post'] );
			}
			if ( ! isset( $post_ids ) ) {
				wp_safe_redirect( $sendback );
				exit;
			}

			switch ( $doaction ) {
				case 'trash':
					$trashed = 0;
					$locked  = 0;

					foreach ( (array) $post_ids as $post_id ) {
						if ( ! current_user_can( 'delete_post', $post_id ) ) {
							wp_die( esc_html__( 'You are not allowed to move this item to the Trash.', 'woocommerce-tm-extra-product-options' ) );
						}
						if ( wp_check_post_lock( $post_id ) ) {
							++$locked;
							continue;
						}

						if ( ! wp_trash_post( $post_id ) ) {
							wp_die( esc_html__( 'Error in moving to Trash.', 'woocommerce-tm-extra-product-options' ) );
						}

						++$trashed;
					}

					$sendback = add_query_arg(
						[
							'from_bulk' => 1,
							'trashed'   => $trashed,
							'ids'       => join( ',', $post_ids ),
							'locked'    => $locked,
						],
						$sendback
					);
					break;
				case 'untrash':
					$untrashed = 0;
					foreach ( (array) $post_ids as $post_id ) {
						if ( ! current_user_can( 'delete_post', $post_id ) ) {
							wp_die( esc_html__( 'You are not allowed to restore this item from the Trash.', 'woocommerce-tm-extra-product-options' ) );
						}

						if ( ! wp_untrash_post( $post_id ) ) {
							wp_die( esc_html__( 'Error in restoring from Trash.', 'woocommerce-tm-extra-product-options' ) );
						}

						++$untrashed;
					}
					$sendback = add_query_arg(
						[
							'from_bulk' => 1,
							'untrashed' => $untrashed,
						],
						$sendback
					);
					break;
				case 'delete':
					$deleted = 0;
					foreach ( (array) $post_ids as $post_id ) {
						$post_del = get_post( $post_id );

						if ( ! current_user_can( 'delete_post', $post_id ) ) {
							wp_die( esc_html__( 'You are not allowed to delete this item.', 'woocommerce-tm-extra-product-options' ) );
						}

						if ( 'attachment' === $post_del->post_type ) {
							if ( ! wp_delete_attachment( $post_id ) ) {
								wp_die( esc_html__( 'Error in deleting.', 'woocommerce-tm-extra-product-options' ) );
							}
						} elseif ( ! wp_delete_post( $post_id ) ) {
							wp_die( esc_html__( 'Error in deleting.', 'woocommerce-tm-extra-product-options' ) );
						}
						++$deleted;
					}
					$sendback = add_query_arg(
						[
							'from_bulk' => 1,
							'deleted'   => $deleted,
						],
						$sendback
					);

					break;
				case 'edit':
					if ( isset( $_REQUEST['bulk_edit'] ) ) {

						$done = bulk_edit_posts( $_REQUEST );

						if ( is_array( $done ) ) {
							$done['updated'] = count( $done['updated'] );
							$done['skipped'] = count( $done['skipped'] );
							$done['locked']  = count( $done['locked'] );
							$sendback        = add_query_arg( $done, $sendback );
						}
					}
					break;
			}

			$sendback = remove_query_arg( [ 'action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view' ], $sendback );
			$sendback = esc_url_raw( $sendback );
			wp_safe_redirect( $sendback );
			exit;
		} elseif ( $doaction && ! isset( $_REQUEST['tm_bulk'] ) ) { // Single actions.

			if ( isset( $_GET['post'] ) ) {
				$post_id = absint( $_GET['post'] );
				$post_ID = $post_id;
			} elseif ( isset( $_POST['post_ID'] ) ) {
				$post_id = absint( $_POST['post_ID'] );
				$post_ID = $post_id;
			} elseif ( isset( $_REQUEST['ids'] ) ) {
				$post_id = absint( $_REQUEST['ids'] );
				$post_ID = $post_id;
			} else {
				$post_id = 0;
				$post_ID = 0;
			}
			global $post;
			$post             = null; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			$post_type        = null;
			$post_type_object = null;

			if ( $post_id ) {
				$post = get_post( $post_id ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			}
			if ( $post ) {
				$post_type = $post->post_type;
				if ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE !== $post_type ) {
					$edit_link = admin_url( 'post.php?action=edit&post=' . $post_id );
					wp_safe_redirect( $edit_link );
					exit;
				}
				$post_type_object = get_post_type_object( $post_type );
			}

			switch ( $doaction ) {
				case 'export':
					$this->tm_export_form_action( $post_id );
					if ( isset( $_SERVER['REQUEST_URI'] ) ) {
						wp_safe_redirect(
							esc_url_raw(
								add_query_arg(
									'message',
									21,
									remove_query_arg(
										[ 'action', 'post', '_wp_http_referer', '_wpnonce' ],
										esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
									)
								)
							)
						);
					}
					exit;
				case 'clone':
					$this->tm_clone_form_action( $post_id );
					if ( isset( $_SERVER['REQUEST_URI'] ) ) {
						wp_safe_redirect(
							esc_url_raw(
								remove_query_arg(
									[ 'action', 'post', '_wp_http_referer', '_wpnonce' ],
									esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
								)
							)
						);
					}
					exit;
				case 'trash':
					check_admin_referer( 'trash-post_' . $post_id );

					if ( ! $post ) {
						wp_die( esc_html__( 'The item you are trying to move to the Trash no longer exists.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! $post_type_object ) {
						wp_die( esc_html__( 'Unknown post type.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! current_user_can( 'delete_post', $post_id ) ) {
						wp_die( esc_html__( 'You are not allowed to move this item to the Trash.', 'woocommerce-tm-extra-product-options' ) );
					}

					$user_id = wp_check_post_lock( $post_id );
					if ( $user_id ) {
						$user     = get_userdata( $user_id );
						$username = esc_html__( 'Someone', 'woocommerce-tm-extra-product-options' );
						if ( $user instanceof WP_User ) {
							$username = $user->display_name;
						}
						/* translators: %s: User's display name. */
						wp_die( sprintf( esc_html__( 'You cannot move this item to the Trash. %s is currently editing.', 'woocommerce-tm-extra-product-options' ), esc_html( $username ) ) );
					}

					if ( ! wp_trash_post( $post_id ) ) {
						wp_die( esc_html__( 'Error in moving to Trash.', 'woocommerce-tm-extra-product-options' ) );
					}

					wp_safe_redirect(
						esc_url_raw(
							add_query_arg(
								[
									'trashed' => 1,
									'ids'     => $post_id,
								],
								$sendback
							)
						)
					);
					exit;

				case 'untrash':
					check_admin_referer( 'untrash-post_' . $post_id );

					if ( ! $post ) {
						wp_die( esc_html__( 'The item you are trying to restore from the Trash no longer exists.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! $post_type_object ) {
						wp_die( esc_html__( 'Unknown post type.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! current_user_can( 'delete_post', $post_id ) ) {
						wp_die( esc_html__( 'You are not allowed to move this item out of the Trash.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! wp_untrash_post( $post_id ) ) {
						wp_die( esc_html__( 'Error in restoring from Trash.', 'woocommerce-tm-extra-product-options' ) );
					}

					wp_safe_redirect( esc_url_raw( add_query_arg( 'untrashed', 1, $sendback ) ) );
					exit;

				case 'delete':
					check_admin_referer( 'delete-post_' . $post_id );

					if ( ! $post ) {
						wp_die( esc_html__( 'This item has already been deleted.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! $post_type_object ) {
						wp_die( esc_html__( 'Unknown post type.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( ! current_user_can( 'delete_post', $post_id ) ) {
						wp_die( esc_html__( 'You are not allowed to delete this item.', 'woocommerce-tm-extra-product-options' ) );
					}

					$force = ! EMPTY_TRASH_DAYS;
					if ( 'attachment' === $post->post_type ) {
						$force = ( $force || ( defined( 'MEDIA_TRASH' ) && ! MEDIA_TRASH ) );
						if ( ! wp_delete_attachment( $post_id, $force ) ) {
							wp_die( esc_html__( 'Error in deleting.', 'woocommerce-tm-extra-product-options' ) );
						}
					} elseif ( ! wp_delete_post( $post_id, $force ) ) {
						wp_die( esc_html__( 'Error in deleting.', 'woocommerce-tm-extra-product-options' ) );
					}

					wp_safe_redirect( esc_url_raw( add_query_arg( 'deleted', 1, $sendback ) ) );
					exit;
				case 'editpost':
					check_admin_referer( 'update-post_' . $post_id );

					$post_id = edit_post();

					// Session cookie flag that the post was saved.
					if ( isset( $_COOKIE[ 'wp-saving-post-' . $post_id ] ) ) {
						setcookie( 'wp-saving-post-' . $post_id, 'saved' );
					}

					$this->redirect_post( $post_id );
					exit;
				case 'edit':
					if ( empty( $post_id ) ) {
						wp_safe_redirect( admin_url( $parent_file ) );
						exit;
					}

					if ( ! $post ) {
						wp_die( esc_html__( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?', 'woocommerce-tm-extra-product-options' ) );
					}
					if ( ! $post_type_object ) {
						wp_die( esc_html__( 'Unknown post type.', 'woocommerce-tm-extra-product-options' ) );
					}
					if ( ! current_user_can( 'edit_post', $post_id ) ) {
						wp_die( esc_html__( 'You are not allowed to edit this item.', 'woocommerce-tm-extra-product-options' ) );
					}

					if ( 'trash' === $post->post_status ) {
						wp_die( esc_html__( 'You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.', 'woocommerce-tm-extra-product-options' ) );
					}
					break;
				case 'add':
					$post_type        = $this->tm_list_table->get_screen()->post_type;
					$post_type_object = get_post_type_object( $post_type );
					if ( ! current_user_can( $post_type_object->cap->edit_posts ) || ! current_user_can( $post_type_object->cap->create_posts ) ) {
						wp_die( esc_html__( 'Cheatin&#8217; uh?', 'woocommerce-tm-extra-product-options' ) );
					}

					break;

				case 'import':
					$this->import();
					break;
				case 'download':
					$this->download();
					break;
			}
		} elseif ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) ) {
			wp_safe_redirect(
				esc_url_raw(
					remove_query_arg(
						[ '_wp_http_referer', '_wpnonce' ],
						esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
					)
				)
			);
			exit;
		}

		// We get here if we are in the list view.
		$bulk_counts = [
			'updated'   => isset( $_REQUEST['updated'] ) ? absint( $_REQUEST['updated'] ) : 0,
			'locked'    => isset( $_REQUEST['locked'] ) ? absint( $_REQUEST['locked'] ) : 0,
			'deleted'   => isset( $_REQUEST['deleted'] ) ? absint( $_REQUEST['deleted'] ) : 0,
			'trashed'   => isset( $_REQUEST['trashed'] ) ? absint( $_REQUEST['trashed'] ) : 0,
			'untrashed' => isset( $_REQUEST['untrashed'] ) ? absint( $_REQUEST['untrashed'] ) : 0,
		];

		$bulk_messages               = [];
		$bulk_messages[ $post_type ] = [
			/* translators: %s: Number of posts. */
			'updated'   => esc_html( _n( '%s post updated.', '%s posts updated.', $bulk_counts['updated'], 'default' ) ),
			/* translators: %s: Number of posts. */
			'locked'    => esc_html( _n( '%s post not updated, somebody is editing it.', '%s posts not updated, somebody is editing them.', $bulk_counts['locked'], 'default' ) ),
			/* translators: %s: Number of posts. */
			'deleted'   => esc_html( _n( '%s post permanently deleted.', '%s posts permanently deleted.', $bulk_counts['deleted'], 'default' ) ),
			/* translators: %s: Number of posts. */
			'trashed'   => esc_html( _n( '%s post moved to the Trash.', '%s posts moved to the Trash.', $bulk_counts['trashed'], 'default' ) ),
			/* translators: %s: Number of posts. */
			'untrashed' => esc_html( _n( '%s post restored from the Trash.', '%s posts restored from the Trash.', $bulk_counts['untrashed'], 'default' ) ),
		];
		$bulk_counts                 = array_filter( $bulk_counts );

		$general_messages               = [];
		$general_messages[ $post_type ] = [
			21 => esc_html__( 'The selected form does not contain any sections', 'woocommerce-tm-extra-product-options' ),
		];
		$general_messages               = array_filter( $general_messages );
	}

	/**
	 * Redirect action
	 *
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	private function redirect_post( $post_id = 0 ) {
		$edit_post_link = admin_url( 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . "&action=edit&post=$post_id" );
		if ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$status = get_post_status( $post_id );

			if ( isset( $_POST['publish'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				switch ( $status ) {
					case 'pending':
						$message = 8;
						break;
					case 'future':
						$message = 9;
						break;
					default:
						$message = 6;
				}
			} else {
				$message = 'draft' === $status ? 10 : 1;
			}

			$location = add_query_arg( 'message', $message, $edit_post_link );

		} else {
			$location = add_query_arg( 'message', 4, $edit_post_link );
		}
		$location = esc_url_raw( $location );

		wp_safe_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) );

		exit;
	}

	/**
	 * Generate delete link
	 *
	 * @param string  $url The delete link.
	 * @param integer $post_id The post id.
	 * @return string
	 * @since 1.0
	 */
	public function tm_get_delete_post_link( $url, $post_id ) {
		// check we're in the right place, otherwise return.
		if ( ! ( ( isset( $_GET['page'] ) && THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK === $_GET['page'] ) || ( isset( $_POST['screen'] ) && THEMECOMPLETE_EPO_GLOBAL_POST_TYPE === $_POST['screen'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return $url;
		}
		$vars        = [];
		$decoded_url = str_replace( '&amp;', '&', $url );
		$decoded_url = str_replace( '?', '&', $decoded_url );
		wp_parse_str( $decoded_url, $vars );
		if ( isset( $vars['action'] ) && isset( $vars['_wpnonce'] ) ) {
			if ( 'delete' === $vars['action'] ) {
				$url = admin_url( 'edit.php?post_type=product&amp;page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . "&amp;action=delete&amp;post=$post_id&amp;_wpnonce=" . $vars['_wpnonce'] );
			}
			if ( 'trash' === $vars['action'] ) {
				$url = admin_url( 'edit.php?post_type=product&amp;page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . "&amp;action=trash&amp;post=$post_id&amp;_wpnonce=" . $vars['_wpnonce'] );
			}
		}

		return $url;
	}

	/**
	 * Generate edit link
	 *
	 * @param string  $url The url link.
	 * @param integer $post_id The post id.
	 * @return string
	 * @since 1.0
	 */
	public function tm_get_edit_post_link( $url, $post_id ) {
		// check we're in the right place, otherwise return.
		if ( ! ( ( isset( $_GET['page'] ) && THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK === $_GET['page'] ) || ( isset( $_POST['screen'] ) && THEMECOMPLETE_EPO_GLOBAL_POST_TYPE === $_POST['screen'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return $url;
		}
		$vars        = [];
		$decoded_url = str_replace( '&amp;', '&', $url );
		$decoded_url = str_replace( '?', '&', $decoded_url );
		wp_parse_str( $decoded_url, $vars );
		if ( isset( $vars['action'] ) ) {
			if ( 'edit' === $vars['action'] ) {
				$url = admin_url( 'edit.php?post_type=product&amp;page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . "&amp;action=edit&amp;post=$post_id" );
			}
		}

		return $url;
	}

	/**
	 * Populate the filter select box.
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_restrict_manage_posts() {
		// check we're in the right place, otherwise return.
		if ( ! isset( $_GET['page'] ) || ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return;
		}

		global $typenow, $wp_query;

		$custom_post_taxonomies = get_object_taxonomies( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE );

		if ( is_array( $custom_post_taxonomies ) && count( $custom_post_taxonomies ) > 0 ) {
			echo '<input class="tc-filter-toggle" type="checkbox" id="tc-filter-toggle">';
			echo '<label class="button tc-filter-label" for=tc-filter-toggle>';
			echo '<span class="tc-filter-show">' . esc_html__( 'Show filters', 'woocommerce-tm-extra-product-options' ) . '</span>';
			echo '<span class="tc-filter-hide">' . esc_html__( 'Hide filters', 'woocommerce-tm-extra-product-options' ) . '</span>';
			echo '</label>';
			echo '<div class="tc-filter-content">';
			foreach ( $custom_post_taxonomies as $tax ) {

				if ( 'translation_priority' === $tax ) {
					continue;
				}

				$args = [
					'pad_counts'         => true,
					'show_count'         => 0,
					'hierarchical'       => 1,
					'hide_empty'         => false,
					'show_uncategorized' => 1,
					'orderby'            => 'name',
					'selected'           => isset( $wp_query->query_vars[ $tax ] ) ? $wp_query->query_vars[ $tax ] : '',
					'menu_order'         => false,
					'show_option_none'   => esc_html__( 'Filter by', 'woocommerce-tm-extra-product-options' ) . ' ' . $tax,
					'option_none_value'  => '',
					'value_field'        => 'slug',
					'taxonomy'           => $tax,
					'name'               => esc_attr( $tax ),
					'class'              => 'dropdown_' . esc_attr( $tax ),
				];

				wp_dropdown_categories( $args );

			}
			echo '</div>';
		}
	}

	/**
	 * Screen option
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_add_option() {
		if ( ! $this->tm_list_table instanceof THEMECOMPLETE_EPO_ADMIN_Global_List_Table ) {
			return;
		}
		// only continue if we are are on list screen.
		if ( $this->tm_list_table->current_action() ) {
			return;
		}
		$option = 'per_page';

		$args = [
			'label'   => esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
			'default' => 20,
			'option'  => 'edit_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE . '_per_page',
		];
		add_screen_option( $option, $args );
	}

	/**
	 * Adds our custom screen id to WooCommerce so that we can load needed WooCommerce files.
	 *
	 * @param array<mixed> $screen_ids The array of screen ids.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_screen_ids( $screen_ids ) {
		$screen_ids[] = 'product_page_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		$screen_ids[] = sanitize_title( esc_attr__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ) ) . '_page_tcepo-settings';
		$screen_ids[] = THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE;
		return $screen_ids;
	}

	/**
	 * Returns the google font URL
	 *
	 * @return string
	 * @since 4.8.5
	 */
	public function admin_font_url() {
		$font_url = '';

		/*
		Translators: If there are characters in your language that are not supported
		by chosen font(s), translate this to 'off'. Do not translate into your own language.
		 */
		if ( 'off' !== esc_html_x( 'on', 'Google font: on or off', 'woocommerce-tm-extra-product-options' ) ) {
			$font_url = add_query_arg( 'family', rawurlencode( 'Roboto:400,100,300,700,900,400italic,700italic&subset=latin,latin-ext' ), '//fonts.googleapis.com/css' );
		}

		return $font_url;
	}

	/**
	 * Enqueue plugin css and dequeue unwanted woocommerce css styles
	 *
	 * @param integer $override true 1 or 0.
	 * @return void
	 * @since 1.0
	 */
	public function register_admin_styles( $override = 0 ) {
		if ( empty( $override ) || (int) 1 !== intval( $override ) ) {
			$screen = get_current_screen();
			if ( 'product_page_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $screen->id ) {
				return;
			}

			wp_dequeue_style( 'jquery-ui-style' );
			wp_dequeue_style( 'wp-color-picker' );
			wp_dequeue_style( 'woocommerce_admin_dashboard_styles' );

		}
		$ext = '.min';
		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}
		wp_enqueue_style( 'themecomplete-pagination', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tcpagination' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION, 'screen' );
		wp_enqueue_style( 'toastr', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/toastr' . $ext . '.css', [], '2.1.4', 'screen' );
		wp_enqueue_style( 'spectrum', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/spectrum' . $ext . '.css', [], '2.0', 'screen' );

		// The version of the fontawesome is customized.
		wp_enqueue_style( 'themecomplete-fontawesome', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/fontawesome' . $ext . '.css', [], '5.12', 'screen' );
		wp_enqueue_style( 'themecomplete-animate', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/animate' . $ext . '.css', [], '1.0' );
		wp_enqueue_style( 'themecomplete-global-epo-admin', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-global-epo-admin' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );

		wp_enqueue_style( 'themecomplete-epo-admin-font', $this->admin_font_url(), [], '1.0.0' );
	}

	/**
	 * Enqueue plugin scripts and dequeue unwanted woocommerce scripts
	 *
	 * @param integer $override true 1 or 0.
	 * @return void
	 * @since 1.0
	 */
	public function register_admin_scripts( $override = 0 ) {
		global $wp_query, $post;
		$ext = '.min';
		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}
		$this->register_admin_styles( $override );
		if ( empty( $override ) || (int) 1 !== intval( $override ) ) {
			$screen = get_current_screen();
			if ( 'product_page_' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK !== $screen->id ) {
				return;
			}
			wp_dequeue_script( 'woocommerce_admin' );
			wp_dequeue_script( 'iris' );
			wp_dequeue_script( 'post-edit-languages' );

			remove_all_filters( 'mce_external_plugins' );
			remove_all_filters( 'mce_buttons' );
		}

		// Dequeue DHVC Woocommerce products choosen scripts.
		wp_dequeue_script( 'dhvc-woo-admin' );

		add_action( 'admin_footer', [ $this, 'script_templates' ] );

		wp_register_script( 'spectrum', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/spectrum' . $ext . '.js', [], '2.0', true );

		wp_register_script( 'themecomplete-api', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-api' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script( 'jquery-tcfloatbox', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tcfloatbox' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script( 'jquery-tctooltip', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctooltip' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script( 'themecomplete-tabs', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctabs' . $ext . '.js', [ 'themecomplete-api' ], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script( 'jquery-tcpagination', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/jquery.tcpagination' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script( 'toastr', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/toastr' . $ext . '.js', [], '2.1.4', true );

		wp_register_script( 'themecomplete-tm-math', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-math' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );

		wp_register_script(
			'themecomplete-global-epo-admin',
			THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/tm-global-epo-admin' . $ext . '.js',
			[
				'jquery',
				'jquery-ui-droppable',
				'jquery-ui-sortable',
				'jquery-ui-tabs',
				'jquery-ui-resizable',
				'json2',
				'wp-util',
				'spectrum',
				'jquery-tcpagination',
				'toastr',
				'themecomplete-api',
				'themecomplete-tabs',
				'jquery-tcfloatbox',
				'jquery-tctooltip',
				'plupload-all',
				'themecomplete-tm-math',
			],
			THEMECOMPLETE_EPO_VERSION,
			true
		);
		$import_url = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&action=import';
		$import_url = admin_url( $import_url );

		$post_id   = isset( $post->ID ) ? floatval( $post->ID ) : '';
		$post_type = isset( $post->post_type ) ? $post->post_type : '';
		$basetype  = $this->basetype;
		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
		}
		$original_post_id         = $post_id;
		$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id, $post_type, $basetype );
		if ( ! $wpml_is_original_product ) {
			$original_post_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id, $post_type, $basetype ) );
		}

		$params = [
			'post_id'                                  => sprintf( '%d', $post_id ),
			'original_post_id'                         => sprintf( '%d', $original_post_id ),
			'is_original_post'                         => $post_id === $original_post_id,
			'get_products_categories_nonce'            => wp_create_nonce( 'get-product-categories' ),
			'search_products_nonce'                    => wp_create_nonce( 'search-products' ),
			'export_nonce'                             => wp_create_nonce( 'export-nonce' ),
			'check_attributes_nonce'                   => wp_create_nonce( 'check_attributes' ),
			'import_nonce'                             => wp_create_nonce( 'import-nonce' ),
			'save_nonce'                               => wp_create_nonce( 'save-nonce' ),
			// WPML 3.3.x fix.
			'ajax_url'                                 => strtok( admin_url( 'admin-ajax' . '.php' ), '?' ), // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
			'plugin_url'                               => THEMECOMPLETE_EPO_PLUGIN_URL,
			'import_url'                               => $import_url,
			'element_data'                             => $this->js_element_data(), // This is internal HTML code so we don't escape it.
			'i18n_builder_delete'                      => esc_html__( 'Are you sure you want to delete this item?', 'woocommerce-tm-extra-product-options' ),
			'i18n_builder_clone'                       => esc_html__( 'Are you sure you want to clone this item?', 'woocommerce-tm-extra-product-options' ),
			'i18n_builder_change_ask_title'            => esc_html__( 'Change Element Type', 'woocommerce-tm-extra-product-options' ),
			'i18n_builder_change_ask'                  => esc_html__( 'Would you like the new element to inherit data from the previous one?', 'woocommerce-tm-extra-product-options' ),
			'i18n_change_element'                      => esc_html__( 'Change Element Type', 'woocommerce-tm-extra-product-options' ),
			'i18n_yes'                                 => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
			'i18n_no'                                  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
			'i18n_update'                              => esc_html__( 'Update', 'woocommerce-tm-extra-product-options' ),
			'i18n_no_variations'                       => esc_html__( 'There are no saved variations yet.', 'woocommerce-tm-extra-product-options' ),
			'i18n_cancel'                              => esc_html__( 'Cancel', 'woocommerce-tm-extra-product-options' ),
			'i18n_edit_settings'                       => esc_html__( 'Edit settings', 'woocommerce-tm-extra-product-options' ),
			'i18n_element_uniqid'                      => esc_html__( 'Element id', 'woocommerce-tm-extra-product-options' ),
			'i18n_section_uniqid'                      => esc_html__( 'Section id', 'woocommerce-tm-extra-product-options' ),
			'i18n_is'                                  => esc_html__( 'is', 'woocommerce-tm-extra-product-options' ),
			'i18n_is_not'                              => esc_html__( 'is not', 'woocommerce-tm-extra-product-options' ),
			'i18n_is_empty'                            => esc_html__( 'is empty', 'woocommerce-tm-extra-product-options' ),
			'i18n_is_not_empty'                        => esc_html__( 'is not empty', 'woocommerce-tm-extra-product-options' ),
			'i18n_starts_with'                         => esc_html__( 'starts with', 'woocommerce-tm-extra-product-options' ),
			'i18n_ends_with'                           => esc_html__( 'ends with', 'woocommerce-tm-extra-product-options' ),
			'i18n_greater_than'                        => esc_html__( 'greater than', 'woocommerce-tm-extra-product-options' ),
			'i18n_less_than'                           => esc_html__( 'less than', 'woocommerce-tm-extra-product-options' ),
			'i18n_greater_than_equal'                  => esc_html__( 'greater than or equal to', 'woocommerce-tm-extra-product-options' ),
			'i18n_less_than_equal'                     => esc_html__( 'less than or equal to', 'woocommerce-tm-extra-product-options' ),
			'i18n_cannot_apply_rules'                  => esc_html__( 'Cannot apply rules on this element or section since there are not any value configured elements on other sections, or no other sections found.', 'woocommerce-tm-extra-product-options' ),
			'i18n_cannot_apply_shippingrules'          => esc_html__( 'An error has occurred! Cannot apply conditions on this element!', 'woocommerce-tm-extra-product-options' ),
			'i18n_invalid_request'                     => esc_html__( 'Invalid request!', 'woocommerce-tm-extra-product-options' ),
			'i18n_populate'                            => esc_html__( 'Populate', 'woocommerce-tm-extra-product-options' ),
			'i18n_invalid_extension'                   => esc_html__( 'Invalid file extension', 'woocommerce-tm-extra-product-options' ),
			'i18n_importing'                           => esc_html__( 'Importing csv...', 'woocommerce-tm-extra-product-options' ),
			'i18n_saving'                              => esc_html__( 'Saving... Please wait.', 'woocommerce-tm-extra-product-options' ),
			'i18n_import_title'                        => esc_html__( 'Importing data', 'woocommerce-tm-extra-product-options' ),
			'i18n_error_title'                         => esc_html__( 'Error', 'woocommerce-tm-extra-product-options' ),
			'i18n_add_element'                         => esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ),
			'i18n_edit_price'                          => esc_html__( 'Edit price', 'woocommerce-tm-extra-product-options' ),
			'i18n_edit_tab'                            => esc_html__( 'Edit tab', 'woocommerce-tm-extra-product-options' ),
			'i18n_save'                                => esc_html__( 'Save', 'woocommerce-tm-extra-product-options' ),
			'i18n_overwrite_existing_elements'         => esc_html__( 'Overwrite existing elements', 'woocommerce-tm-extra-product-options' ),
			'i18n_append_new_elements'                 => esc_html__( 'Append new elements', 'woocommerce-tm-extra-product-options' ),
			'i18n_form_is_applied_to_all'              => esc_html__( 'The form is being applied to all products', 'woocommerce-tm-extra-product-options' ),
			'i18n_form_not_applied_to_all'             => esc_html__( 'The form isn\'t being applied to any products', 'woocommerce-tm-extra-product-options' ),
			'i18n_no_title'                            => esc_html__( '(No title)', 'woocommerce-tm-extra-product-options' ),
			'i18n_epo'                                 => esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
			'i18n_loading'                             => esc_html__( 'Loading ...', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_product_variables'           => esc_html__( 'Product variables', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_special_variables'           => esc_html__( 'Special variables', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_global_variables'            => esc_html__( 'Global variables', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_options_total'               => esc_html__( 'Options Total', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_product_price_plus_options_total' => esc_html__( 'Original product price + Options Total', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_cumulative_total'            => esc_html__( 'Cumulative Total', 'woocommerce-tm-extra-product-options' ),
			'i18n_product_price_plus_cumulative_total' => esc_html__( 'Original product price + Cumulative Total', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_quantity'                    => esc_html__( 'Product quantity', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_product_price'               => esc_html__( 'Original product price', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_dynamic_product_price'       => esc_html__( 'Dynamic product price', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_element'                => esc_html__( 'This element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_value'                  => esc_html__( 'The value of this element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_value_length'           => esc_html__( 'The value length of this element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_count'                  => esc_html__( 'The number of options the user has selected', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_count_quantity'         => esc_html__( 'The total quantity of this element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_this_quantity'               => esc_html__( 'The quantity of this element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_other_elements'              => esc_html__( 'Other elements', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_price'                 => esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_price_tip'             => esc_html__( 'The price of the targeted element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_value'                 => esc_html__( 'Value', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_value_tip'             => esc_html__( 'The value of the targeted element converted to a float', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_text'                  => esc_html__( 'Text', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_text_tip'              => esc_html__( 'The raw value of the targeted element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_text_length'           => esc_html__( 'Text length', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_text_length_tip'       => esc_html__( 'The text length of the targeted element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_quantity'              => esc_html__( 'Quantity', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_quantity_tip'          => esc_html__( 'The total quantity of the targeted element', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_count'                 => esc_html__( 'Count', 'woocommerce-tm-extra-product-options' ),
			'i18n_formula_field_count_tip'             => esc_html__( 'The number of options the user has selected on the targeted element', 'woocommerce-tm-extra-product-options' ),
			'tcAdminNoPagination'                      => apply_filters( 'wc_epo_admin_no_pagination', false ),
			'WP_DEBUG'                                 => 1,
		];
		wp_localize_script( 'themecomplete-global-epo-admin', 'TMEPOGLOBALADMINJS', $params );
		wp_enqueue_script( 'themecomplete-global-epo-admin' );
	}

	/**
	 * Print script templates
	 *
	 * @return void
	 * @since 1.0
	 */
	public function script_templates() {
		// The check is required in case other plugin do things that don't load the wc_get_template function.
		if ( function_exists( 'wc_get_template' ) ) {
			wc_get_template( 'tc-js-admin-templates.php', [], '', THEMECOMPLETE_EPO_PLUGIN_PATH . '/assets/js/admin/' );
			wc_get_template( 'tc-js-admin-builder-templates.php', [], '', THEMECOMPLETE_EPO_PLUGIN_PATH . '/assets/js/admin/' );
		}
	}

	/**
	 * Generate JS element data
	 *
	 * @return string
	 * @since 1.0
	 */
	public function js_element_data() {

		$drag_elements = [];
		$tags          = [];
		foreach ( THEMECOMPLETE_EPO_BUILDER()->get_elements() as $element => $settings ) {

			if ( $settings->show_on_backend ) {
				$tagclass = '';
				if ( $settings->is_addon ) {
					$tags[ $settings->namespace ][ sanitize_title( 'tc-' . $settings->tags ) ] = $settings->tags;
					$tagclass .= ' tc-' . sanitize_title( $settings->tags ) . ' tc-' . sanitize_title( $settings->namespace );
				} else {
					$tag = explode( ' ', $settings->tags );
					foreach ( $tag as $key => $value ) {
						$tags[ $settings->namespace ][ sanitize_title( $value ) ] = $value;
						$tagclass .= ' tc-' . sanitize_title( $value );
					}
				}

				$_drag_elements  = '<li class="transition tm-element-button' . $tagclass . '">';
				$_drag_elements .= '<div data-element="' . $element . '" class="tc-element-button element-' . $element . '">'
								. '<div class="tm-label">'
								. '<div class="tm-icon-wrap"><i class="tmfa tcfa ' . $settings->icon . '"></i></div> '
								. '<div class="tm-name-wrap"><span class="tm-element-name">' . $settings->name . '</span>'
								. '<span class="tm-element-description">' . $settings->description . '</span></div>'
								. '</div></div>';
				$_drag_elements .= '</li>';

				$drag_elements[ $settings->namespace ][] = $_drag_elements;

			}
		}

		$tm_drag_elements = $drag_elements[ THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE ];
		unset( $drag_elements[ THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE ] );
		$drag_elements_html = implode( '', $tm_drag_elements );
		foreach ( $drag_elements as $key => $value ) {
			$drag_elements_html .= implode( '', $value );
		}

		$tm_tags = $tags[ THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE ];
		unset( $tags[ THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE ] );

		$tags = array_map( 'unserialize', array_unique( array_map( 'serialize', $tags ) ) );

		$tag_counter = 1;
		$out         = '<div class="transition tm-tabs tm-tags-container">';

		$out .= '<div class="transition tm-tab-headers">';
		$out .= '<div class="tm-box tma-tab-label">'
				. '<h4 tabindex="0" class="tab-header open" data-tm-tag="' . esc_attr( 'all' ) . '" data-id="tc-tag' . $tag_counter . '-tab">' . esc_html__( 'All', 'woocommerce-tm-extra-product-options' ) . '</h4>'
				. '</div>';
		foreach ( $tm_tags as $key => $value ) {
			++$tag_counter;
			$out .= '<div class="tm-box tma-tab-label">'
					. '<h4 tabindex="0" class="tab-header closed" data-tm-tag="tc-' . esc_attr( $key ) . '" data-id="tc-tag' . $tag_counter . '-tab">' . $value . '</h4>'
					. '</div>';
		}
		foreach ( $tags as $key => $value ) {
			++$tag_counter;
			$out .= '<div class="tm-box tma-tab-label">'
					. '<h4 tabindex="0" class="tab-header closed" data-tm-tag="tc-' . esc_attr( sanitize_title( (string) $key ) ) . '" data-id="tc-tag' . $tag_counter . '-tab">' . $key . '</h4>'
					. '</div>';
		}
		$out .= '</div>';

		$out .= '<div class="transition tm-tab tc-tag' . $tag_counter . '-tab">';
		$out .= '<ul class="tm-elements-container tm-bsbb-all">';
		$out .= $drag_elements_html;
		$out .= '</ul>';
		$out .= '</div>';

		$out .= '</div>';

		return $out;
	}

	/**
	 * Init List table class
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return THEMECOMPLETE_EPO_ADMIN_Global_List_Table
	 * @since 1.0
	 */
	private function get_wp_list_table( $args = [] ) {
		$args['screen'] = convert_to_screen( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE );
		return new THEMECOMPLETE_EPO_ADMIN_Global_List_Table( $args );
	}

	/**
	 * Merage imported data
	 *
	 * @param array<mixed> $tm_metas The array data to save.
	 * @param array<mixed> $import The array added data to save.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function import_array_merge( $tm_metas, $import ) {
		$clean_import = [];
		if ( ! isset( $tm_metas['tm_meta']['tmfbuilder'] ) ) {
			$tm_metas['tm_meta']['tmfbuilder'] = [];
		}
		foreach ( $import['tm_meta']['tmfbuilder'] as $key => $value ) {
			if ( ! isset( $tm_metas['tm_meta']['tmfbuilder'][ $key ] ) ) {
				$tm_metas['tm_meta']['tmfbuilder'][ $key ] = [];
			}
			if ( str_starts_with( $key, 'variations_' ) ) {
				if ( 'variations_disabled' !== $key ) {
					$tm_metas['tm_meta']['tmfbuilder'][ $key ] = $value;
				}
			} else {
				$tm_metas['tm_meta']['tmfbuilder'][ $key ] = array_merge( $tm_metas['tm_meta']['tmfbuilder'][ $key ], $value );
			}
		}

		return $tm_metas;
	}

	/**
	 * Save our meta data
	 *
	 * @param integer $post_id The post id.
	 * @param WP_Post $post_object The post object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_save_postdata( $post_id, $post_object ) {
		if ( empty( $_POST ) || ! isset( $_POST['post_type'] ) || ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE !== $_POST['post_type'] && THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $_POST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return;
		}
		$this->tm_save_postdata_do( $post_id, $post_object );
	}

	/**
	 * Save imported CSV
	 *
	 * @param integer $post_id The post id.
	 * @return mixed
	 * @since 4.8
	 */
	public function save_imported_csv( $post_id ) {
		if ( empty( $post_id ) ) {
			return false;
		}

		$import = get_transient( 'tc_import_csv' );

		$tm_metas = [];

		if ( ! empty( $import ) ) {

			if ( isset( $_REQUEST['tm_uploadmeta'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$tm_metas = wp_unslash( $_REQUEST['tm_uploadmeta'] );// phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				$tm_metas = rawurldecode( $tm_metas );
				$tm_metas = nl2br( $tm_metas );
				$tm_metas = json_decode( $tm_metas, true );
			}

			if ( ! ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) ) {
				$tm_metas = [ 'tm_meta' => [ 'tmfbuilder' => [] ] ];
			}
			$import_override = get_transient( 'tc_import_override' );
			if ( false !== $import_override ) {
				unset( $tm_metas['tm_meta']['tmfbuilder'] );
				$tm_metas = $this->import_array_merge( $tm_metas, $import );
				delete_transient( 'tc_import_override' );
			} else {
				$tm_metas = $this->import_array_merge( $tm_metas, $import );
			}

			delete_transient( 'tc_import_csv' );
		}

		if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
			$tm_meta = $tm_metas['tm_meta'];

			$meta = 'tm_meta';
			$post = get_post( $post_id );
			if ( $post && property_exists( $post, 'ID' ) && property_exists( $post, 'post_type' ) ) {
				$post_type = $post->post_type;
				$basetype  = $this->basetype;
				if ( false === $basetype ) {
					$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
				}
				$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id, $post_type, $basetype );
				$original_post_id         = $post_id;
				if ( ! $wpml_is_original_product ) {
					$meta             = 'tm_meta_wpml';
					$original_post_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post->ID, $post->post_type, $basetype ) );
				}

				$old_data = themecomplete_get_post_meta( $post_id, $meta, true );
				if ( isset( $old_data['priority'] ) ) {
					$tm_meta['priority'] = $old_data['priority'];
				}
				themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, $meta );
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->ajax_print_saved_elements( $original_post_id, $post_id, $wpml_is_original_product );
			}
		}
	}

	/**
	 * Save meta data
	 *
	 * @param integer $post_id The post id.
	 * @param WP_Post $post_object The post object.
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_save_postdata_do( $post_id, $post_object ) {
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
			return $post_id;
		}
		if ( 'revision' === $post_object->post_type ) {
			return;
		}
		check_admin_referer( 'update-post_' . $post_id );

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $post_id;
		}

		$import = get_transient( 'tc_import_csv' );

		if ( isset( $_POST['tm_meta_serialized'] ) ) {
			$tm_metas = wp_unslash( $_POST['tm_meta_serialized'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tm_metas = rawurldecode( $tm_metas );
			$tm_metas = nl2br( $tm_metas );
			$tm_metas = json_decode( $tm_metas, true );

			if ( $tm_metas ) {
				if ( ! empty( $import ) ) {
					$import_override = get_transient( 'tc_import_override' );
					if ( false !== $import_override ) {
						unset( $tm_metas['tm_meta']['tmfbuilder'] );
						$tm_metas = $this->import_array_merge( $tm_metas, $import );
						delete_transient( 'tc_import_override' );
					} else {
						$tm_metas = $this->import_array_merge( $tm_metas, $import );
					}
					delete_transient( 'tc_import_csv' );
				}
				if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
					$tm_meta  = $tm_metas['tm_meta'];
					$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
					themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, 'tm_meta' );
				}
			}
		} elseif ( isset( $_POST['tm_meta_serialized_wpml'] ) ) {
			$tm_metas = wp_unslash( $_POST['tm_meta_serialized_wpml'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tm_metas = rawurldecode( $tm_metas );
			$tm_metas = nl2br( $tm_metas );
			$tm_metas = json_decode( $tm_metas, true );
			if ( $tm_metas ) {

				$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_wpml', true );

				if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
					$tm_meta = $tm_metas['tm_meta'];
					themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, 'tm_meta_wpml' );
				} else {
					themecomplete_save_post_meta( $post_id, false, $old_data, 'tm_meta_wpml' );
				}
			}
		}
		if ( isset( $_POST['tm_meta_product_ids'] ) ) {
			$tm_meta_product_ids = map_deep( wp_unslash( $_POST['tm_meta_product_ids'] ), 'absint' );
			if ( ! is_array( $tm_meta_product_ids ) ) {
				$tm_meta_product_ids = explode( ',', $tm_meta_product_ids );
			}
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_product_ids', true );
			themecomplete_save_post_meta( $post_id, $tm_meta_product_ids, $old_data, 'tm_meta_product_ids' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_product_ids', true );
			themecomplete_save_post_meta( $post_id, [], $old_data, 'tm_meta_product_ids' );
		}
		if ( isset( $_POST['tm_meta_product_exclude_ids'] ) ) {
			$tm_meta_product_exclude_ids = map_deep( wp_unslash( $_POST['tm_meta_product_exclude_ids'] ), 'absint' );
			if ( ! is_array( $tm_meta_product_exclude_ids ) ) {
				$tm_meta_product_exclude_ids = explode( ',', $tm_meta_product_exclude_ids );
			}
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_product_exclude_ids', true );
			themecomplete_save_post_meta( $post_id, $tm_meta_product_exclude_ids, $old_data, 'tm_meta_product_exclude_ids' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_product_exclude_ids', true );
			themecomplete_save_post_meta( $post_id, [], $old_data, 'tm_meta_product_exclude_ids' );
		}
		if ( isset( $_POST['tm_meta_disable_categories'] ) ) {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_disable_categories', true );
			themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST['tm_meta_disable_categories'] ), 'sanitize_key' ), $old_data, 'tm_meta_disable_categories' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_disable_categories', true );
			themecomplete_save_post_meta( $post_id, 0, $old_data, 'tm_meta_disable_categories' );
		}

		if ( isset( $_POST['apply-mode'] ) ) {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_apply_mode', true );
			themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST['apply-mode'] ), 'sanitize_key' ), $old_data, 'tm_meta_apply_mode' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_apply_mode', true );
			themecomplete_save_post_meta( $post_id, 'disable-form', $old_data, 'tm_meta_apply_mode' );
		}

		if ( isset( $_POST['tm_meta_enabled_roles'] ) ) {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_enabled_roles', true );
			themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST['tm_meta_enabled_roles'] ), 'sanitize_text_field' ), $old_data, 'tm_meta_enabled_roles' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_enabled_roles', true );
			themecomplete_save_post_meta( $post_id, [], $old_data, 'tm_meta_enabled_roles' );
		}
		if ( isset( $_POST['tm_meta_disabled_roles'] ) ) {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_disabled_roles', true );
			themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST['tm_meta_disabled_roles'] ), 'sanitize_text_field' ), $old_data, 'tm_meta_disabled_roles' );
		} else {
			$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_disabled_roles', true );
			themecomplete_save_post_meta( $post_id, [], $old_data, 'tm_meta_disabled_roles' );
		}
		// WPML fields.
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			if ( isset( $_POST[ THEMECOMPLETE_EPO_WPML_PARENT_POSTID ] ) ) {
				$old_data = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true );
				themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST[ THEMECOMPLETE_EPO_WPML_PARENT_POSTID ] ), 'absint' ), $old_data, THEMECOMPLETE_EPO_WPML_PARENT_POSTID );
			}
			if ( isset( $_POST[ THEMECOMPLETE_EPO_WPML_LANG_META ] ) && ! empty( $_POST[ THEMECOMPLETE_EPO_WPML_LANG_META ] ) ) {
				$old_data = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
				themecomplete_save_post_meta( $post_id, map_deep( wp_unslash( $_POST[ THEMECOMPLETE_EPO_WPML_LANG_META ] ), 'sanitize_text_field' ), $old_data, THEMECOMPLETE_EPO_WPML_LANG_META );
			} else {
				$old_data = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
				themecomplete_save_post_meta( $post_id, THEMECOMPLETE_EPO_WPML()->get_default_lang(), $old_data, THEMECOMPLETE_EPO_WPML_LANG_META );
			}
		}
	}

	/**
	 * Init List table class
	 *
	 * @return void
	 * @since 1.0
	 */
	public function admin_screen() {
		global $bulk_counts, $bulk_messages, $general_messages;

		if ( ! $this->tm_list_table instanceof THEMECOMPLETE_EPO_ADMIN_Global_List_Table ) {
			return;
		}

		$post_type        = $this->tm_list_table->get_screen()->post_type;
		$post_type_object = get_post_type_object( $post_type );

		$parent_file   = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		$submenu_file  = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		$post_new_file = 'edit.php?post_type=product&page=' . THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK . '&action=add';

		$doaction = $this->tm_list_table->current_action();
		if ( $doaction && in_array( $doaction, [ 'add', 'export', 'clone', 'trash', 'untrash', 'delete', 'editpost', 'edit', 'import', 'download' ], true ) ) {
			$screen = get_current_screen();

			// edit screen.
			if ( isset( $_REQUEST['action'] ) && 'edit' === $_REQUEST['action'] && ( isset( $_REQUEST['post'] ) || isset( $_POST['post_ID'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				if ( isset( $_GET['post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$post_id = intval( $_GET['post'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$post_ID = $post_id;
				} elseif ( isset( $_POST['post_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
					$post_id = intval( $_POST['post_ID'] ); // phpcs:ignore WordPress.Security.NonceVerification
					$post_ID = $post_id;
				} else {
					$post_id = 0;
					$post_ID = 0;
				}
				if ( ! empty( $post_id ) ) {
					$editing = true;
					$post    = get_post( $post_id, OBJECT, 'edit' );
					if ( $post ) {
						$post_type        = $post->post_type;
						$post_type_object = get_post_type_object( $post_type );
						$title            = $post_type_object->labels->edit_item;
						$nonce_action     = 'update-post_' . $post_ID;

						$original_id = $post_ID;
						if ( ! THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type ) ) {
							$original_id   = THEMECOMPLETE_EPO_WPML()->get_original_id( $post->ID, $post->post_type );
							$original_post = get_post( $original_id, OBJECT, 'edit' );
						}
						$_meta                     = themecomplete_get_post_meta( $original_id, 'tm_meta' );
						$_meta_product_ids         = apply_filters( 'wc_epo_tm_meta_product_ids', themecomplete_get_post_meta( $original_id, 'tm_meta_product_ids', true ), $original_id );
						$_meta_product_exclude_ids = apply_filters( 'wc_epo_tm_meta_product_exclude_ids', themecomplete_get_post_meta( $original_id, 'tm_meta_product_exclude_ids', true ), $original_id );
						$_meta_enabled_roles       = themecomplete_get_post_meta( $original_id, 'tm_meta_enabled_roles', true );
						$_meta_disabled_roles      = themecomplete_get_post_meta( $original_id, 'tm_meta_disabled_roles', true );
						$_meta_disable_categories  = themecomplete_get_post_meta( $original_id, 'tm_meta_disable_categories', true );
						$_meta_apply_mode          = themecomplete_get_post_meta( $original_id, 'tm_meta_apply_mode', true );
						if ( empty( $_meta_apply_mode ) ) {
							$terms = get_the_term_list( $original_id, 'product_cat', '', ' , ', '' );
							if ( ! $_meta_disable_categories ) {
								if ( ! is_string( $terms ) ) {
									$_meta_apply_mode = 'apply-to-all-products';
								} else {
									$_meta_apply_mode = 'customize-selection';
								}
							} elseif ( ! empty( $_meta_product_ids ) || ! empty( $_meta_enabled_roles ) ) {
								$_meta_apply_mode = 'customize-selection';
							} else {
								$_meta_apply_mode = 'disable-form';
							}
						}

						$meta_fields = [
							'priority'    => 10,
							'can_publish' => current_user_can( $post_type_object->cap->publish_posts ),
						];

						$meta = [];
						foreach ( $meta_fields as $key => $value ) {
							$meta[ $key ] = isset( $_meta[0][ $key ] ) ? themecomplete_maybe_unserialize( $_meta[0][ $key ] ) : $value;

						}
						unset( $_meta );
						$meta['product_ids']         = $_meta_product_ids;
						$meta['product_exclude_ids'] = $_meta_product_exclude_ids;
						$meta['enabled_roles']       = $_meta_enabled_roles;
						$meta['disabled_roles']      = $_meta_disabled_roles;
						$meta['disable_categories']  = $_meta_disable_categories;
						$meta['apply-mode']          = $_meta_apply_mode;
						$this->tm_meta               = $meta;
						unset( $meta );

						wp_enqueue_script( 'post' );
						include 'views/html-tm-epo-fields-edit.php';
					}
				}
				// add screen.
			} elseif ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$post_type        = $this->tm_list_table->get_screen()->post_type;
				$post_type_object = get_post_type_object( $post_type );

				$parent_post_meta                     = [];
				$parent_post_meta_product_ids         = [];
				$parent_post_meta_product_exclude_ids = [];
				$parent_post_meta_enabled_roles       = [];
				$parent_post_meta_disabled_roles      = [];
				$parent_post_meta_disable_categories  = 1;
				$parent_post_meta_apply_mode          = 'disable-form';

				// WPML.
				if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
					if ( isset( $_GET['tmparentpostid'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$parent_post                          = get_post( intval( $_GET['tmparentpostid'] ), OBJECT, 'edit' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$parent_post_meta                     = themecomplete_get_post_meta( $parent_post->ID, 'tm_meta' );
						$parent_post_meta_product_ids         = apply_filters( 'wc_epo_tm_meta_product_ids', themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_product_ids', true ), $parent_post->ID );
						$parent_post_meta_product_exclude_ids = apply_filters( 'wc_epo_tm_meta_product_exclude_ids', themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_product_exclude_ids', true ), $parent_post->ID );
						$parent_post_meta_enabled_roles       = themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_enabled_roles', true );
						$parent_post_meta_disabled_roles      = themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_disabled_roles', true );
						$parent_post_meta_disable_categories  = themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_disable_categories', true );
						$parent_post_meta_apply_mode          = themecomplete_get_post_meta( $parent_post->ID, 'tm_meta_apply_mode', true );
						THEMECOMPLETE_EPO_WPML()->apply_wp_terms_checklist_args_filter( intval( $_GET['tmparentpostid'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					}
				}

				$post = get_default_post_to_edit( $post_type, true );

				$post_id = $post->ID;
				$post_ID = $post_id;

				// WPML.
				if ( ! empty( $parent_post ) ) {
					$post->post_title   = $parent_post->post_title;
					$post->post_excerpt = $parent_post->post_excerpt;
				}

				$title        = $post_type_object->labels->add_new;
				$nonce_action = 'update-post_' . $post_ID;

				$_meta       = [];
				$meta_fields = array_merge(
					[
						'priority'    => 10,
						'can_publish' => current_user_can( $post_type_object->cap->publish_posts ),
					],
					$parent_post_meta
				);
				$meta        = [];
				foreach ( $meta_fields as $key => $value ) {
					$meta[ $key ] = $value;
				}
				unset( $_meta );
				$meta['product_ids']         = $parent_post_meta_product_ids;
				$meta['product_exclude_ids'] = $parent_post_meta_product_exclude_ids;
				$meta['enabled_roles']       = $parent_post_meta_enabled_roles;
				$meta['disabled_roles']      = $parent_post_meta_disabled_roles;
				$meta['disable_categories']  = $parent_post_meta_disable_categories;
				$meta['apply-mode']          = $parent_post_meta_apply_mode;

				$this->tm_meta = $meta;
				unset( $meta );
				wp_enqueue_script( 'post' );
				include 'views/html-tm-epo-fields-edit.php';

			}
			// list screen.
		} else {
			$this->tm_list_table->prepare_items();
			wp_enqueue_script( 'inline-edit-post' );// list.
			add_action( 'tm_list_table_action', [ $this, 'tm_list_table_action' ], 10, 2 );
			include 'views/html-tm-epo-fields.php';
		}
	}

	/**
	 * List view actions
	 *
	 * @param string       $action The action to perform.
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function tm_list_table_action( $action = '', $args = [] ) {
		if ( ! $action || ! $this->tm_list_table instanceof WP_Posts_List_Table ) {
			return;
		}
		switch ( $action ) {
			case 'views':
				$this->tm_list_table->views();
				break;
			case 'display':
				$this->tm_list_table->display();
				break;
			case 'inline_edit':
				if ( $this->tm_list_table->has_items() ) {
					$this->tm_list_table->inline_edit();
				}
				break;
			case 'search_box':
				$this->tm_list_table->search_box( $args['text'], $args['input_id'] );
				break;
			default:
				break;
		}
	}

	/**
	 * Export form action
	 *
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function tm_export_form_action( $post_id = 0 ) {
		$csv = new THEMECOMPLETE_EPO_ADMIN_CSV();
		$csv->export_by_id( $post_id );
	}


	/**
	 * Clone form action
	 *
	 * @param integer      $post_id The post id.
	 * @param string|false $basetype The post type.
	 * @return void
	 * @since 1.0
	 */
	public function tm_clone_form_action( $post_id = 0, $basetype = false ) {
		// Check the nonce.
		check_ajax_referer( 'tmclone_form_nonce_' . $post_id, 'security' );

		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {

			if ( false === $basetype ) {
				$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
			}

			$main_post_id = 0;
			$tm_meta_lang = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
			if ( empty( $tm_meta_lang ) ) {
				$tm_meta_lang = THEMECOMPLETE_EPO_WPML()->get_default_lang();
				$main_post_id = $post_id;
			}
			if ( empty( $main_post_id ) ) {
				$main_post_id = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true );
			}

			$tm_meta                       = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
			$generate_recreate_element_ids = THEMECOMPLETE_EPO_HELPER()->generate_recreate_element_ids( $tm_meta );

			$id_for_meta = $this->do_clone_form( $main_post_id, $main_post_id, $generate_recreate_element_ids );

			foreach ( THEMECOMPLETE_EPO_WPML()->get_active_languages() as $key => $value ) {
				if ( $key !== $tm_meta_lang || 'all' === THEMECOMPLETE_EPO_WPML()->get_lang() ) {

					if ( THEMECOMPLETE_EPO_WPML()->get_default_lang() === $key ) {
						$query = new WP_Query(
							[
								'post_type'      => $basetype,
								'post_status'    => [ 'publish' ],
								'numberposts'    => -1,
								'posts_per_page' => -1,
								'orderby'        => 'date',
								'order'          => 'asc',
								'no_found_rows'  => true,
								'p'              => $main_post_id,
							]
						);
					} else {

						$meta_query   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $key, '=', 'EXISTS' );
						$meta_query[] = [
							'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
							'value'   => $main_post_id,
							'compare' => '=',
						];

						$query = new WP_Query(
							[
								'post_type'      => $basetype,
								'post_status'    => [ 'publish' ],
								'numberposts'    => -1,
								'posts_per_page' => -1,
								'orderby'        => 'date',
								'order'          => 'asc',
								'no_found_rows'  => true,
								'meta_query'     => $meta_query, // phpcs:ignore WordPress.DB.SlowDBQuery
							]
						);

					}

					if ( ! empty( $query->posts ) ) {
						$clone = $this->do_clone_form( $query->post->ID, $id_for_meta, $generate_recreate_element_ids );
					}
				}
			}
		} else {
			$clone = $this->do_clone_form( $post_id, $post_id );
		}
	}

	/**
	 * Clones a form
	 *
	 * @param integer            $post_id The post id.
	 * @param integer            $id_for_meta The id to use for meta data.
	 * @param array<mixed>|false $generate_recreate_element_ids Array of element ids.
	 * @return integer
	 * @since 1.0
	 */
	public function do_clone_form( $post_id = 0, $id_for_meta = 0, $generate_recreate_element_ids = false ) {
		/**
		 * Get the post as an array.
		 *
		 * @var array<mixed> $duplicate
		 */
		$duplicate = get_post( $post_id, 'ARRAY_A' );

		// Modify some of the elements.
		$duplicate['post_title'] = $duplicate['post_title'] . ' ' . esc_html__( 'Copy', 'woocommerce-tm-extra-product-options' );

		// Set the status.
		$duplicate['post_status'] = 'draft';

		// Set the post date.
		$duplicate['post_date'] = current_datetime()->format( 'Y-m-d H:i:s' );

		// Remove some of the keys.
		if ( isset( $duplicate['ID'] ) ) {
			unset( $duplicate['ID'] );
		}
		if ( isset( $duplicate['guid'] ) ) {
			unset( $duplicate['guid'] );
		}
		if ( isset( $duplicate['comment_count'] ) ) {
			unset( $duplicate['comment_count'] );
		}

		// Insert the post into the database.
		$duplicate_id = wp_insert_post( $duplicate );

		// Duplicate all the taxonomies/terms.
		$taxonomies = get_object_taxonomies( $duplicate['post_type'] );
		foreach ( $taxonomies as $taxonomy ) {
			$terms = wp_get_post_terms( $post_id, $taxonomy, [ 'fields' => 'names' ] );
			if ( is_array( $terms ) ) {
				wp_set_object_terms( $duplicate_id, $terms, $taxonomy );
			}
		}

		// Duplicate all the custom fields.
		$custom_fields = get_post_custom( $post_id );

		foreach ( $custom_fields as $key => $value ) {
			if ( 'tm_meta' === $key || 'tm_meta_wpml' === $key ) {
				themecomplete_update_post_meta( $duplicate_id, $key, THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $value[0], $generate_recreate_element_ids ) );
			} elseif ( THEMECOMPLETE_EPO_WPML_LANG_META !== $key && THEMECOMPLETE_EPO_WPML_PARENT_POSTID !== $key ) {
				themecomplete_update_post_meta( $duplicate_id, $key, themecomplete_maybe_unserialize( $value[0] ) );
			} elseif ( THEMECOMPLETE_EPO_WPML_LANG_META === $key ) {
				themecomplete_update_post_meta( $duplicate_id, $key, themecomplete_maybe_unserialize( $value[0] ) );
			} elseif ( THEMECOMPLETE_EPO_WPML_PARENT_POSTID === $key ) {
				if ( (float) $post_id !== (float) $id_for_meta ) {
					themecomplete_update_post_meta( $duplicate_id, $key, $id_for_meta );
				} else {
					themecomplete_update_post_meta( $duplicate_id, $key, $duplicate_id );
				}
			}
		}

		return $duplicate_id;
	}
}
admin/class-themecomplete-epo-admin-builder-base.php000064400000617705150755142440016535 0ustar00<?php
/**
 * Extra Product Options Admin Builder class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Builder class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_ADMIN_BUILDER_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_ADMIN_BUILDER_Base|null
	 * @since 6.4
	 */
	protected static $instance = null;

	/**
	 * Section element
	 *
	 * @var THEMECOMPLETE_EPO_BUILDER_ELEMENT_SECTION
	 */
	public $section;

	/**
	 * The properties of the choices
	 * This doesn't include the default value
	 *
	 * @var array<string>
	 */
	public $multiple_properties = [];

	/**
	 * Sizes display array
	 *
	 * @var array<string>
	 */
	public $sizer = [];

	/**
	 * Array of JS data to create the builder setting
	 *
	 * @var array<mixed>
	 */
	public $jsbuilder = [];

	/**
	 * Flag to determine is output should happen
	 *
	 * @var boolean
	 */
	public $noecho = false;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_ADMIN_BUILDER_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Init the properties of choices.
		$this->multiple_properties = [
			'title',
			'value',
			'price',
			'sale_price',
			'image',
			'imagec',
			'imagep',
			'imagel',
			'price_type',
			'url',
			'description',
			'enabled',
			'color',
			'fee',
		];

		// element available sizes.
		$this->element_available_sizes();

		// Add admin footer script.
		add_action( 'admin_footer', [ $this, 'admin_footer' ], 9 );

		// Admin Init elements.
		add_action( 'admin_init', [ $this, 'admin_init' ], 9 );
	}

	/**
	 * Available element sizes
	 *
	 * @return void
	 * @since 1.0
	 */
	private function element_available_sizes() {
		$this->sizer = [];
		for ( $x = 1; $x <= 100; $x++ ) {
			$this->sizer[ 'w' . $x ] = $x . '%';
		}
		$this->sizer['w12-5'] = '12.5%';
		$this->sizer['w37-5'] = '37.5%';
		$this->sizer['w62-5'] = '62.5%';
		$this->sizer['w87-5'] = '87.5%';
	}

	/**
	 * Add footer script
	 *
	 * @return void
	 * @since 4.9.12
	 */
	public function admin_footer() {
		wp_register_script( 'themecomplete-footer-admin-js', false, [], THEMECOMPLETE_EPO_VERSION, true );
		wp_localize_script(
			'themecomplete-footer-admin-js',
			'TMEPOOPTIONSJS',
			[
				'data' => $this->jsbuilder,
			]
		);
		wp_enqueue_script( 'themecomplete-footer-admin-js' );
	}

	/**
	 * Init elements
	 *
	 * @return void
	 * @since 5.0
	 */
	public function admin_init() {
		// Init section elements.
		$this->init_section_elements();

		// Init elements.
		$this->init_elements();
	}

	/**
	 * Init section elements
	 *
	 * @return void
	 * @since 1.0
	 */
	private function init_section_elements() {
		$this->section = new THEMECOMPLETE_EPO_BUILDER_ELEMENT_SECTION( 'section' );
		$this->section->set_properties();
	}

	/**
	 * Init elements
	 *
	 * @return void
	 * @since 1.0
	 */
	private function init_elements() {
		$all_elements = THEMECOMPLETE_EPO_BUILDER()->get_elements();
		do_action( 'wc_epo_builder_before_element_set_properties', $all_elements );

		foreach ( $all_elements as $element => $class ) {
			$class->set_properties();
		}

		do_action( 'wc_epo_builder_after_element_set_properties', $all_elements );
	}

	/**
	 * Variation disabled setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_variations_disabled( $name = '' ) {
		// this field must be unique, no multiples allowed or have sense.
		return [
			'id'          => $name . '_disabled',
			'wpmldisable' => 1,
			'nodiv'       => 1,
			'default'     => '5',
			'type'        => 'hidden',
			'tags'        => [
				'class' => 'tm-variations-disabled',
				'id'    => 'builder_' . $name . '_disabled',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_disabled]',
				'value' => '',
			],
			'label'       => '',
			'desc'        => '',
		];
	}

	/**
	 * Pips setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_pips( $name = '' ) {
		return [
			'id'          => $name . '_pips',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'id'   => 'builder_' . $name . '_pips',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_pips][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
					'value' => 'yes',
				],
			],
			'label'       => esc_html__( 'Enable points display?', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'This allows you to generate points along the range picker.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Number of points setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_noofpips( $name = '' ) {
		return [
			'id'          => $name . '_noofpips',
			'wpmldisable' => 1,
			'default'     => '10',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_noofpips',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_noofpips][]',
				'value' => '',
			],
			'label'       => esc_html__( 'Number of points', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter the number of values for the points display.', 'woocommerce-tm-extra-product-options' ),
			'required'    => [
				'#builder_range_pips' => [
					'operator' => 'is',
					'value'    => 'yes',
				],
			],
		];
	}

	/**
	 * Show value on setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_show_picker_value( $name = '' ) {
		return [
			'id'          => $name . '_show_picker_value',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'id'   => 'builder_' . $name . '_show_picker_value',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_show_picker_value][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'Tooltip', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Left side', 'woocommerce-tm-extra-product-options' ),
					'value' => 'left',
				],
				[
					'text'  => esc_html__( 'Right side', 'woocommerce-tm-extra-product-options' ),
					'value' => 'right',
				],
				[
					'text'  => esc_html__( 'Tooltip and Left side', 'woocommerce-tm-extra-product-options' ),
					'value' => 'tleft',
				],
				[
					'text'  => esc_html__( 'Tooltip and Right side', 'woocommerce-tm-extra-product-options' ),
					'value' => 'tright',
				],
			],
			'label'       => esc_html__( 'Show value on', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Select how to show the value of the range picker.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Range picker Min value setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function add_setting_rangemin( $name = '' ) {
		return $this->add_setting_min( $name, [ 'default' => '1' ], false );
	}

	/**
	 * Range picker Max value setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function add_setting_rangemax( $name = '' ) {
		return $this->add_setting_max( $name, [ 'default' => '100' ], false );
	}

	/**
	 * Step value setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_rangestep( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'          => $name . '_step',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'text',
				'tags'        => [
					'id'    => 'builder_' . $name . '_step',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_step][]',
					'value' => '',
				],
				'label'       => esc_html__( 'Step value', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the step for the handle.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);
	}

	/**
	 * Validate as setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_validation1( $name = '' ) {
		return [
			'id'          => $name . '_validation1',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tc-validateas',
				'id'    => 'builder_' . $name . '_validation1',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_validation1][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'No validation', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Email', 'woocommerce-tm-extra-product-options' ),
					'value' => 'email',
				],
				[
					'text'  => esc_html__( 'Url', 'woocommerce-tm-extra-product-options' ),
					'value' => 'url',
				],
				[
					'text'  => esc_html__( 'Number', 'woocommerce-tm-extra-product-options' ),
					'value' => 'number',
				],
				[
					'text'  => esc_html__( 'Digits', 'woocommerce-tm-extra-product-options' ),
					'value' => 'digits',
				],
				[
					'text'  => esc_html__( 'Letters only', 'woocommerce-tm-extra-product-options' ),
					'value' => 'lettersonly',
				],
				[
					'text'  => esc_html__( 'Letters or Space only', 'woocommerce-tm-extra-product-options' ),
					'value' => 'lettersspaceonly',
				],
				[
					'text'  => esc_html__( 'Alphanumeric', 'woocommerce-tm-extra-product-options' ),
					'value' => 'alphanumeric',
				],
				[
					'text'  => esc_html__( 'Alphanumeric Unicode', 'woocommerce-tm-extra-product-options' ),
					'value' => 'alphanumericunicode',
				],
				[
					'text'  => esc_html__( 'Alphanumeric Unicode or Space', 'woocommerce-tm-extra-product-options' ),
					'value' => 'alphanumericunicodespace',
				],
			],
			'label'       => esc_html__( 'Validate as', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether the field will be validated against the choosen method.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Required setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_required( $name = '' ) {
		return [
			'id'          => $name . '_required',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'checkbox',
			'tags'        => [
				'value' => '1',
				'id'    => 'builder_' . $name . '_required',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_required][]',
			],
			'label'       => esc_html__( 'Required', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether the user must fill out this field or not.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Enabled setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_enabled( $name = '' ) {
		return [
			'id'          => $name . '_enabled',
			'wpmldisable' => 1,
			'default'     => '1',
			'type'        => 'checkbox',
			'tags'        => [
				'value' => '1',
				'class' => 'is_enabled',
				'id'    => 'builder_' . $name . '_required',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_enabled][]',
			],
			'label'       => esc_html__( 'Enabled', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether the option is enabled or not.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Price setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'       => $name . '_price',
				'default'  => '',
				'type'     => 'text',
				'tags'     => [
					'class' => 't tc-element-setting-price',
					'id'    => 'builder_' . $name . '_price',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_price][]',
					'value' => '',
					'step'  => 'any',
				],
				'label'    => esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enter the price for this field or leave it blank for no price.', 'woocommerce-tm-extra-product-options' ),
				'required' => [
					'.tm-pricetype-selector' => [
						'operator' => 'isnot',
						'value'    => [ 'currentstep', 'lookuptable' ],
					],
				],
			],
			$args
		);
	}

	/**
	 * Sale price setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_sale_price( $name = '' ) {
		return [
			'id'       => $name . '_sale_price',
			'default'  => '',
			'type'     => 'text',
			'tags'     => [
				'class' => 't tc-element-setting-sale-price',
				'id'    => 'builder_' . $name . '_sale_price',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_sale_price][]',
				'value' => '',
				'step'  => 'any',
			],
			'label'    => esc_html__( 'Sale Price', 'woocommerce-tm-extra-product-options' ),
			'desc'     => esc_html__( 'Enter the sale price for this field or leave it blankto use the default price.', 'woocommerce-tm-extra-product-options' ),
			'required' => [
				'.tm-pricetype-selector' => [
					'operator' => 'isnot',
					'value'    => [ 'currentstep', 'lookuptable' ],
				],
			],
		];
	}

	/**
	 * Text after price setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_text_after_price( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'      => $name . '_text_after_price',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_' . $name . '_text_after_price',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_text_after_price][]',
					'value' => '',
				],
				'label'   => esc_html__( 'Text after Price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a text to display after the price for this field or leave it blank for no text.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);
	}

	/**
	 * Text before price setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_text_before_price( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'      => $name . '_text_before_price',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_' . $name . '_text_before_price',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_text_before_price][]',
					'value' => '',
				],
				'label'   => esc_html__( 'Text before Price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a text to display before the price for this field or leave it blank for no text.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);
	}

	/**
	 * Textarea price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price_type( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Price per word', 'woocommerce-tm-extra-product-options' ),
				'value' => 'word',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per word', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordpercent',
			],
			[
				'text'  => esc_html__( 'Price per word (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordnon',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per word (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordpercentnon',
			],
			[
				'text'  => esc_html__( 'Price per character', 'woocommerce-tm-extra-product-options' ),
				'value' => 'char',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercent',
			],
			[
				'text'  => esc_html__( 'Price per character (no first char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnofirst',
			],
			[
				'text'  => esc_html__( 'Price per character (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnon',
			],
			[
				'text'  => esc_html__( 'Price per character (no n-th char and no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnonnospaces',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no first char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnofirst',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnon',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no n-th char and no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnonnospaces',
			],
			[
				'text'  => esc_html__( 'Price per character (no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnospaces',
			],
			[
				'text'  => esc_html__( 'Price per row', 'woocommerce-tm-extra-product-options' ),
				'value' => 'row',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Price type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Textfield price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price_type2( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Quantity', 'woocommerce-tm-extra-product-options' ),
				'value' => 'step',
			],
			[
				'text'  => esc_html__( 'Current value', 'woocommerce-tm-extra-product-options' ),
				'value' => 'currentstep',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Price per word', 'woocommerce-tm-extra-product-options' ),
				'value' => 'word',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per word', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordpercent',
			],
			[
				'text'  => esc_html__( 'Price per word (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordnon',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per word (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'wordpercentnon',
			],
			[
				'text'  => esc_html__( 'Price per character', 'woocommerce-tm-extra-product-options' ),
				'value' => 'char',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercent',
			],
			[
				'text'  => esc_html__( 'Price per character (no first char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnofirst',
			],
			[
				'text'  => esc_html__( 'Price per character (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnon',
			],
			[
				'text'  => esc_html__( 'Price per character (no n-th char and no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnonnospaces',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no first char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnofirst',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no n-th char)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnon',
			],
			[
				'text'  => esc_html__( 'Percent of the original price per character (no n-th char and no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charpercentnonnospaces',
			],
			[
				'text'  => esc_html__( 'Price per character (no spaces)', 'woocommerce-tm-extra-product-options' ),
				'value' => 'charnospaces',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Price type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Upload price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price_type5( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Price type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Date and time price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price_type6( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Price type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Range picker price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_price_type7( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Step * price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'step',
			],
			[
				'text'  => esc_html__( 'Current value', 'woocommerce-tm-extra-product-options' ),
				'value' => 'currentstep',
			],
			[
				'text'  => esc_html__( 'Price per Interval', 'woocommerce-tm-extra-product-options' ),
				'value' => 'intervalstep',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Price type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Dynamic Calculations price type setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function add_setting_price_type_dynamic( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
				'value' => 'lookuptable',
			],
		];

		$options = apply_filters( 'wc_epo_add_setting_price_type', $options, $name );

		return [
			'id'          => $name . '_price_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'tm-pricetype-selector',
				'id'    => 'builder_' . $name . '_price_type',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_price_type][]',
			],
			'options'     => $options,
			'label'       => esc_html__( 'Calculation type', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Lookuptable setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_lookuptable( $name = '' ) {

		$options = [
			[
				'text'  => esc_html__( 'None', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
		];

		$lookup_tables = THEMECOMPLETE_EPO()->fetch_lookuptables();
		if ( $lookup_tables ) {
			foreach ( $lookup_tables as $table => $tables ) {
				if ( is_array( $tables ) ) {
					$show_num = count( $tables ) > 1;
					foreach ( $tables as $table_num => $data ) {
						$options[] = [
							'text'  => $table . ( $show_num ? ' (' . $table_num . ')' : '' ),
							'value' => $table . '|' . $table_num,
						];
					}
				}
			}
		}

		$options = apply_filters( 'wc_epo_add_setting_lookuptable', $options, $name );

		return [
			'_multiple_values' => [
				[
					'id'          => $name . '_lookuptable',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'class' => 'tm-lookuptable-selector',
						'id'    => 'builder_' . $name . '_lookuptable',
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_lookuptable][]',
					],
					'options'     => $options,
					'label'       => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.tm-pricetype-selector' => [
							'operator' => 'is',
							'value'    => 'lookuptable',
						],
					],
				],
				[
					'id'       => $name . '_lookuptable_x',
					'default'  => '',
					'type'     => 'text',
					'tags'     => [
						'class' => 't tm-lookuptable-x-selector',
						'id'    => 'builder_' . $name . '_lookuptable_x',
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_lookuptable_x][]',
						'value' => '',
						'step'  => 'any',
					],
					'label'    => esc_html__( 'Element ID for x', 'woocommerce-tm-extra-product-options' ),
					'desc'     => esc_html__( 'Enter the element id to use for the x column.', 'woocommerce-tm-extra-product-options' ),
					'required' => [
						'.tm-pricetype-selector' => [
							'operator' => 'is',
							'value'    => 'lookuptable',
						],
					],
				],
				[
					'id'       => $name . '_lookuptable_y',
					'default'  => '',
					'type'     => 'text',
					'tags'     => [
						'class' => 't tm-lookuptable-y-selector',
						'id'    => 'builder_' . $name . '_lookuptable_y',
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_lookuptable_y][]',
						'value' => '',
						'step'  => 'any',
					],
					'label'    => esc_html__( 'Element ID for y', 'woocommerce-tm-extra-product-options' ),
					'desc'     => esc_html__( 'Enter the element id to use for the y column.', 'woocommerce-tm-extra-product-options' ),
					'required' => [
						'.tm-pricetype-selector' => [
							'operator' => 'is',
							'value'    => 'lookuptable',
						],
					],
				],
			],
		];
	}

	/**
	 * Fee setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function add_setting_fee( $name = '', $args = [] ) {
		$setting = array_merge(
			[
				'id'          => $name . '_fee',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'checkbox',
				'tags'        => [
					'class' => 'c tc-element-setting-fee',
					'id'    => 'builder_' . $name . '_fee',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_fee][]',
					'value' => '1',
				],
				'label'       => esc_html__( 'Set to Fee', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Attach the price to the order making it independent of the product quantity.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);

		$setting = apply_filters( 'wc_epo_add_setting_fee', $setting, $name, $args );

		return $setting;
	}

	/**
	 * Free characters setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_freechars( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'          => $name . '_freechars',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'number',
				'tags'        => [
					'class' => 'n',
					'id'    => 'builder_' . $name . '_freechars',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_freechars][]',
					'value' => '',
					'step'  => '1',
				],
				'label'       => esc_html__( 'Free characters', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the number of Free characters.', 'woocommerce-tm-extra-product-options' ),
				'required'    => [
					'.tm-pricetype-selector' => [
						'operator' => 'is',
						'value'    => [
							'wordnon',
							'wordpercentnon',
							'charnon',
							'charnonnospaces',
							'charpercentnon',
							'charpercentnonnospaces',
						],
					],
				],
			],
			$args
		);
	}

	/**
	 * Min value setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @param boolean      $required If the setting is required.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_min( $name = '', $args = [], $required = true ) {
		$min = array_merge(
			[
				'id'          => $name . '_min',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'number',
				'extra_tags'  => [],
				'tags'        => [
					'class' => 'n',
					'id'    => 'builder_' . $name . '_min',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_min][]',
					'value' => '',
					'step'  => 'any',
				],
				'label'       => esc_html__( 'Min value', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the minimum value.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);

		$min['tags'] = array_merge( $min['tags'], $min['extra_tags'] );

		if ( $required ) {
			$min['required'] = [
				'relation'               => 'OR',
				'.tm-pricetype-selector' => [
					'operator' => 'is',
					'value'    => [ 'step', 'currentstep' ],
				],
				'.tc-validateas'         => [
					'operator' => 'is',
					'value'    => [ 'number', 'digits' ],
				],
			];
		}

		return $min;
	}

	/**
	 * Max value setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @param boolean      $required If the setting is required.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_max( $name = '', $args = [], $required = true ) {
		$max = array_merge(
			[
				'id'          => $name . '_max',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'number',
				'extra_tags'  => [],
				'tags'        => [
					'class' => 'n',
					'id'    => 'builder_' . $name . '_max',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_max][]',
					'value' => '',
					'step'  => 'any',
				],
				'label'       => esc_html__( 'Max value', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the maximum value.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);

		$max['tags'] = array_merge( $max['tags'], $max['extra_tags'] );

		if ( $required ) {
			$max['required'] = [
				'relation'               => 'OR',
				'.tm-pricetype-selector' => [
					'operator' => 'is',
					'value'    => [ 'step', 'currentstep' ],
				],
				'.tc-validateas'         => [
					'operator' => 'is',
					'value'    => [ 'number', 'digits' ],
				],
			];
		}

		return $max;
	}

	/**
	 * Date format setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_date_format( $name = '' ) {
		return [
			'id'      => $name . '_format',
			'default' => '0',
			'type'    => 'select',
			'tags'    => [
				'id'   => 'builder_' . $name . '_format',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_format][]',
			],
			'options' => [
				[
					'text'  => esc_html__( 'Day / Month / Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '0',
				],
				[
					'text'  => esc_html__( 'Month / Day / Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '1',
				],
				[
					'text'  => esc_html__( 'Day . Month . Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '2',
				],
				[
					'text'  => esc_html__( 'Month . Day . Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '3',
				],
				[
					'text'  => esc_html__( 'Day - Month - Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '4',
				],
				[
					'text'  => esc_html__( 'Month - Day - Year', 'woocommerce-tm-extra-product-options' ),
					'value' => '5',
				],

				[
					'text'  => esc_html__( 'Year / Month / Day', 'woocommerce-tm-extra-product-options' ),
					'value' => '6',
				],
				[
					'text'  => esc_html__( 'Year / Day / Month', 'woocommerce-tm-extra-product-options' ),
					'value' => '7',
				],
				[
					'text'  => esc_html__( 'Year . Month . Day', 'woocommerce-tm-extra-product-options' ),
					'value' => '8',
				],
				[
					'text'  => esc_html__( 'Year . Day . Month', 'woocommerce-tm-extra-product-options' ),
					'value' => '9',
				],
				[
					'text'  => esc_html__( 'Year - Month - Day', 'woocommerce-tm-extra-product-options' ),
					'value' => '10',
				],
				[
					'text'  => esc_html__( 'Year - Day - Month', 'woocommerce-tm-extra-product-options' ),
					'value' => '11',
				],

			],
			'label'   => esc_html__( 'Date format', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Time format setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_time_format( $name = '', $args = [] ) {
		$time_format = [
			'id'      => $name . '_time_format',
			'default' => '0',
			'type'    => 'select',
			'tags'    => [
				'id'   => 'builder_' . $name . '_format',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_time_format][]',
			],
			'options' => [
				[
					'text'  => esc_html__( 'HH:mm', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:mm',
				],
				[
					'text'  => esc_html__( 'HH:m', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:m',
				],
				[
					'text'  => esc_html__( 'H:mm', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:mm',
				],
				[
					'text'  => esc_html__( 'H:m', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:m',
				],
				[
					'text'  => esc_html__( 'HH:mm:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:mm:ss',
				],
				[
					'text'  => esc_html__( 'HH:m:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:m:ss',
				],
				[
					'text'  => esc_html__( 'H:mm:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:mm:ss',
				],
				[
					'text'  => esc_html__( 'H:m:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:m:ss',
				],
				[
					'text'  => esc_html__( 'HH:mm:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:mm:s',
				],
				[
					'text'  => esc_html__( 'HH:m:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'HH:m:s',
				],
				[
					'text'  => esc_html__( 'H:mm:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:mm:s',
				],
				[
					'text'  => esc_html__( 'H:m:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'H:m:s',
				],

				[
					'text'  => esc_html__( 'hh:mm', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:mm',
				],
				[
					'text'  => esc_html__( 'hh:m', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:m',
				],
				[
					'text'  => esc_html__( 'h:mm', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:mm',
				],
				[
					'text'  => esc_html__( 'h:m', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:m',
				],
				[
					'text'  => esc_html__( 'hh:mm:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:mm:ss',
				],
				[
					'text'  => esc_html__( 'hh:m:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:m:ss',
				],
				[
					'text'  => esc_html__( 'h:mm:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:mm:ss',
				],
				[
					'text'  => esc_html__( 'h:m:ss', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:m:ss',
				],
				[
					'text'  => esc_html__( 'hh:mm:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:mm:s',
				],
				[
					'text'  => esc_html__( 'hh:m:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'hh:m:s',
				],
				[
					'text'  => esc_html__( 'h:mm:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:mm:s',
				],
				[
					'text'  => esc_html__( 'h:m:s', 'woocommerce-tm-extra-product-options' ),
					'value' => 'h:m:s',
				],
			],
			'label'   => esc_html__( 'Time format', 'woocommerce-tm-extra-product-options' ),
		];

		$time_format = array_merge( $time_format, $args );

		return $time_format;
	}

	/**
	 * Custom Time format setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_custom_time_format( $name = '', $args = [] ) {
		$custom_time_format = [
			'id'          => $name . '_custom_time_format',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'text',
			'tags'        => [
				'class' => 't',
				'id'    => 'builder_' . $name . '_custom_time_format',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_custom_time_format][]',
				'value' => '',
			],
			'label'       => esc_html__( 'Custom Time format', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'This will override the time format above.', 'woocommerce-tm-extra-product-options' ),
		];
		$custom_time_format = array_merge( $custom_time_format, $args );

		return $custom_time_format;
	}

	/**
	 * Start year setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_start_year( $name = '' ) {
		return [
			'id'          => $name . '_start_year',
			'wpmldisable' => 1,
			'default'     => '1900',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_start_year',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_start_year][]',
				'value' => '',
			],
			'label'       => esc_html__( 'Start year', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter starting year.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * End year setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_end_year( $name = '' ) {
		return [
			'id'          => $name . '_end_year',
			'wpmldisable' => 1,
			'default'     => ( intval( gmdate( 'Y' ) ) + 10 ),
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_end_year',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_end_year][]',
				'value' => '',
			],
			'label'       => esc_html__( 'End year', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter ending year.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Use URL replacements setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_use_url( $name = '' ) {
		return [
			'id'          => $name . '_use_url',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'use_url',
				'id'    => 'builder_' . $name . '_use_url',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_use_url][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
					'value' => 'url',
				],
			],
			'label'       => esc_html__( 'Use URL replacements', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether to redirect to a URL if the option is click.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Populate options setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_options( $name = '' ) {
		return [
			'id'         => $name . '_options',
			'tmid'       => 'populate',
			'default'    => '',
			'type'       => 'custom_multiple',
			'leftclass'  => 'onerow',
			'rightclass' => 'onerow',
			'html'       => [
				[ $this, 'builder_sub_options' ],
				[ [ 'name' => 'multiple_' . $name . '_options' ] ],
			],
			'label'      => esc_html__( 'Populate options', 'woocommerce-tm-extra-product-options' ),
			'desc'       => ( 'checkboxes' === $name ) ? '' : esc_html__( 'Double click the radio button to remove its selected attribute.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Variation options setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_variations_options( $name = '' ) {
		return [
			'id'         => $name . '_options',
			'default'    => '',
			'type'       => 'custom_multiple',
			'leftclass'  => 'onerow',
			'rightclass' => 'onerow2 tm-all-attributes',
			'html'       => [ [ $this, 'builder_sub_variations_options' ], [ [] ] ],
			'label'      => esc_html__( 'Variation options', 'woocommerce-tm-extra-product-options' ),
			'desc'       => '',
		];
	}

	/**
	 * Replacement mode setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 6.0
	 */
	public function add_setting_replacement_mode( $name = '' ) {
		return [
			'id'               => $name . '_replacement_mode',
			'message0x0_class' => 'tm-replacement-mode tm-epo-switch-wrapper',
			'wpmldisable'      => 1,
			'default'          => 'none',
			'type'             => 'radio',
			'tags'             => [
				'class' => 'replacement-mode',
				'id'    => 'builder_' . $name . '_replacement_mode',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_replacement_mode][]',
			],
			'options'          => [
				[
					'text'  => esc_html__( 'None', 'woocommerce-tm-extra-product-options' ),
					'value' => 'none',
				],
				[
					'text'  => esc_html__( 'Image swatches', 'woocommerce-tm-extra-product-options' ),
					'value' => 'image',
				],
				[
					'text'  => esc_html__( 'Color swatches', 'woocommerce-tm-extra-product-options' ),
					'value' => 'color',
				],
				[
					'text'  => esc_html__( 'Text swatches', 'woocommerce-tm-extra-product-options' ),
					'value' => 'text',
				],
			],
			'label'            => esc_html__( 'Replacement mode', 'woocommerce-tm-extra-product-options' ),
			'desc'             => esc_html__( 'Select how to display the element.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Use image replacements setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_swatch_position( $name = '' ) {
		return [
			'id'               => $name . '_swatch_position',
			'message0x0_class' => 'tm-swatch-position tm-epo-switch-wrapper',
			'wpmldisable'      => 1,
			'default'          => 'center',
			'type'             => 'radio',
			'tags'             => [
				'class' => 'swatch-position',
				'id'    => 'builder_' . $name . '_swatch_position',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_swatch_position][]',
			],
			'options'          => [
				[
					'text'  => esc_html__( 'Start of the label', 'woocommerce-tm-extra-product-options' ),
					'value' => 'start',
				],
				[
					'text'  => esc_html__( 'Center', 'woocommerce-tm-extra-product-options' ),
					'value' => 'center',
				],
				[
					'text'  => esc_html__( 'End of the label', 'woocommerce-tm-extra-product-options' ),
					'value' => 'end',
				],
			],
			'label'            => esc_html__( 'Swatch position', 'woocommerce-tm-extra-product-options' ),
			'desc'             => esc_html__( 'Choose how the swatch will be displayed.', 'woocommerce-tm-extra-product-options' ),
			'required'         => [
				'.replacement-mode' => [
					'operator' => 'is',
					'value'    => [ 'image', 'color' ],
				],
			],
		];
	}

	/**
	 * Use image lightbox setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_use_lightbox( $name = '' ) {
		return [
			'id'          => $name . '_use_lightbox',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'checkbox',
			'tags'        => [
				'value' => 'lightbox',
				'class' => 'use_lightbox tm-use-lightbox',
				'id'    => 'builder_' . $name . '_use_lightbox',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_use_lightbox][]',
			],
			'label'       => esc_html__( 'Use image lightbox', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether to enable the lightbox on the thumbnail.', 'woocommerce-tm-extra-product-options' ),
			'required'    => [
				'.replacement-mode' => [
					'operator' => 'is',
					'value'    => 'image',
				],
			],
		];
	}

	/**
	 * Changes product image setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_changes_product_image( $name = '' ) {
		return [
			'id'          => $name . '_changes_product_image',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'changes-product-image tm-changes-product-image',
				'id'    => 'builder_' . $name . '_changes_product_image',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_changes_product_image][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Use the image replacements', 'woocommerce-tm-extra-product-options' ),
					'value' => 'images',
				],
				[
					'text'  => esc_html__( 'Use custom image', 'woocommerce-tm-extra-product-options' ),
					'value' => 'custom',
				],
			],
			'label'       => esc_html__( 'Changes product image', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Choose whether to change the product image.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Enable Show tooltip setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 6.0
	 */
	public function add_setting_show_tooltip( $name = '' ) {
		return [
			'id'          => $name . '_show_tooltip',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'class' => 'show-tooltip',
				'id'    => 'builder_' . $name . '_show_tooltip',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_show_tooltip][]',
			],
			'options'     => apply_filters(
				'wc_epo_add_setting_show_tooltip',
				[
					[
						'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
						'value' => '',
					],
					[
						'text'  => esc_html__( 'Show label', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch',
					],
					[
						'text'  => esc_html__( 'Show description', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_desc',
					],
					[
						'text'  => esc_html__( 'Show label and description', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_lbl_desc',
					],
					[
						'text'  => esc_html__( 'Show image', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_img',
					],
					[
						'text'  => esc_html__( 'Show image and label', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_img_lbl',
					],
					[
						'text'  => esc_html__( 'Show image and description', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_img_desc',
					],
					[
						'text'  => esc_html__( 'Show image, label and description', 'woocommerce-tm-extra-product-options' ),
						'value' => 'swatch_img_lbl_desc',
					],
				]
			),
			'label'       => esc_html__( 'Show tooltip', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enabling this will show a tooltip over the choice.', 'woocommerce-tm-extra-product-options' ),
			'required'    => [
				'.replacement-mode' => [
					'operator' => 'is',
					'value'    => [ 'image', 'color' ],
				],
			],
		];
	}

	/**
	 * Enable clear options button setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_clear_options( $name = '' ) {
		return [
			'id'          => $name . '_clear_options',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'checkbox',
			'tags'        => [
				'class' => 'clear_options',
				'value' => '1',
				'id'    => 'builder_' . $name . '_clear_options',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_clear_options][]',
			],
			'label'       => esc_html__( 'Enable clear options button', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'This will add a button to clear the selected option.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Items per row setting helper
	 *
	 * @return void
	 * @since 4.8.5
	 */
	public function add_setting_items_per_row_helper() {
		echo "<span class='tc-enable-responsive'>" . esc_html__( 'Show responsive values', 'woocommerce-tm-extra-product-options' ) . " <span class='off tcfa tcfa-desktop'></span><span class='on tcfa tcfa-tablet-alt tm-hidden'></span></span>";
	}

	/**
	 * Items per row setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @param array<mixed> $required If the setting is required.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_items_per_row( $name = '', $args = [], $required = [] ) {

		$per_row = [
			'_multiple_values' => [
				[
					'id'          => $name . '_items_per_row',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'extra'       => [ [ $this, 'add_setting_items_per_row_helper' ], [] ],
					'tags'        => [
						'class'       => 't',
						'id'          => 'builder_' . $name . '_items_per_row',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'       => esc_html__( 'Items per row (Desktops and laptops)', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) {
				[
					'id'               => $name . '_items_per_row_tablets',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_tablets',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_tablets][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (Tablets landscape)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">768px - 1024px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width : 481px) and (max-device-width : 767px) {
				[
					'id'               => $name . '_items_per_row_tablets_small',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_tablets_small',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_tablets_small][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (Tablets portrait)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">481px - 767px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width : 320px) and (max-device-width : 480px) {
				[
					'id'               => $name . '_items_per_row_smartphones',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_smartphones',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_smartphones][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (Smartphones)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">320px - 480px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2) {
				[
					'id'               => $name . '_items_per_row_iphone5',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_iphone5',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_iphone5][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (iPhone 5)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">320px - 568px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2) {
				[
					'id'               => $name . '_items_per_row_iphone6',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_iphone6',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_iphone6][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (iPhone 6)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">375px - 667px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 2) {
				[
					'id'               => $name . '_items_per_row_iphone6_plus',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_iphone6_plus',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_iphone6_plus][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (iPhone 6 +)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">414px - 736px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (device-width: 320px) and (device-height: 640px) and (-webkit-min-device-pixel-ratio: 2) {
				[
					'id'               => $name . '_items_per_row_samsung_galaxy',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_samsung_galaxy',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_samsung_galaxy][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (Samnsung Galaxy)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">320px - 640px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],
				// @media only screen and (min-device-width : 800px) and (max-device-width : 1280px) {
				[
					'id'               => $name . '_items_per_row_tablets_galaxy',
					'message0x0_class' => 'builder_responsive_div tc-hidden',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class'       => 'n',
						'id'          => 'builder_' . $name . '_items_per_row_tablets_galaxy',
						'name'        => 'tm_meta[tmfbuilder][' . $name . '_items_per_row_tablets_galaxy][]',
						'placeholder' => esc_html__( 'auto', 'woocommerce-tm-extra-product-options' ),
					],
					'label'            => esc_html__( 'Items per row (Galaxy Tablets landscape)', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-pixels">800px - 1280px<span>',
					'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
				],

			],
		];

		$per_row = array_merge( $per_row, $args );

		if ( ! empty( $required ) ) {
			$per_row['_multiple_values'][0]['required'] = $required;
			$per_row['_multiple_values'][1]['required'] = $required;
			$per_row['_multiple_values'][2]['required'] = $required;
			$per_row['_multiple_values'][3]['required'] = $required;
			$per_row['_multiple_values'][4]['required'] = $required;
			$per_row['_multiple_values'][5]['required'] = $required;
			$per_row['_multiple_values'][6]['required'] = $required;
			$per_row['_multiple_values'][7]['required'] = $required;
			$per_row['_multiple_values'][8]['required'] = $required;
		}

		return $per_row;
	}

	/**
	 * Limit selection setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_limit_choices( $name = '' ) {
		return [
			'id'          => $name . '_limit_choices',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_limit_choices',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_limit_choices][]',
				'min'   => 0,
			],
			'label'       => esc_html__( 'Limit selection', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter a number above 0 to limit the checkbox selection or leave blank for default behaviour.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Exact selection setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_exactlimit_choices( $name = '' ) {
		return [
			'id'          => $name . '_exactlimit_choices',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_exactlimit_choices',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_exactlimit_choices][]',
				'min'   => 0,
			],
			'label'       => esc_html__( 'Exact selection', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter a number above 0 to have the user select the exact number of checkboxes or leave blank for default behaviour.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Minimum selection setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_minimumlimit_choices( $name = '' ) {
		return [
			'id'          => $name . '_minimumlimit_choices',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_minimumlimit_choices',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_minimumlimit_choices][]',
				'min'   => 0,
			],
			'label'       => esc_html__( 'Minimum selection', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter a number above 0 to have the user select at least that number of checkboxes or leave blank for default behaviour.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Upload button style setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_button_type( $name = '', $args = [] ) {
		$button_type = [
			'id'          => $name . '_button_type',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'select',
			'tags'        => [
				'id'   => 'builder_' . $name . '_button_type',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_button_type][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'Normal browser button', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Styled button', 'woocommerce-tm-extra-product-options' ),
					'value' => 'button',
				],
			],
			'label'       => esc_html__( 'Upload button style', 'woocommerce-tm-extra-product-options' ),
		];

		$button_type = array_merge( $button_type, $args );

		return $button_type;
	}

	/**
	 * Date picker style setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_button_type2( $name = '' ) {
		return [
			'id'          => $name . '_button_type',
			'wpmldisable' => 1,
			'default'     => 'picker',
			'type'        => 'select',
			'tags'        => [
				'id'   => 'builder_' . $name . '_button_type',
				'name' => 'tm_meta[tmfbuilder][' . $name . '_button_type][]',
			],
			'options'     => [
				[
					'text'  => esc_html__( 'Date field', 'woocommerce-tm-extra-product-options' ),
					'value' => '',
				],
				[
					'text'  => esc_html__( 'Date picker', 'woocommerce-tm-extra-product-options' ),
					'value' => 'picker',
				],
				[
					'text'  => esc_html__( 'Date field and picker', 'woocommerce-tm-extra-product-options' ),
					'value' => 'fieldpicker',
				],
			],
			'label'       => esc_html__( 'Date picker style', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Hide price setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_hide_amount( $name = '' ) {
		return [
			'id'               => $name . '_hide_amount',
			'message0x0_class' => 'builder_' . $name . '_hide_amount_div',
			'wpmldisable'      => 1,
			'default'          => '',
			'type'             => 'checkbox',
			'tags'             => [
				'value' => 'hidden',
				'id'    => 'builder_' . $name . '_hide_amount',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_hide_amount][]',
			],
			'label'            => esc_html__( 'Hide price', 'woocommerce-tm-extra-product-options' ),
			'desc'             => esc_html__( 'Choose whether to hide the price or not.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Quantity selector setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_quantity( $name = '' ) {
		return [
			'_multiple_values' => [
				[
					'id'               => $name . '_quantity',
					'message0x0_class' => 'builder_' . $name . '_quantity_div',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'select',
					'tags'             => [
						'id'    => 'builder_' . $name . '_quantity',
						'class' => 'tm-qty-selector',
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_quantity][]',
					],
					'options'          => [
						[
							'text'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => esc_html__( 'Right', 'woocommerce-tm-extra-product-options' ),
							'value' => 'right',
						],
						[
							'text'  => esc_html__( 'Left', 'woocommerce-tm-extra-product-options' ),
							'value' => 'left',
						],
						[
							'text'  => esc_html__( 'Top', 'woocommerce-tm-extra-product-options' ),
							'value' => 'top',
						],
						[
							'text'  => esc_html__( 'Bottom', 'woocommerce-tm-extra-product-options' ),
							'value' => 'bottom',
						],
					],
					'label'            => esc_html__( 'Quantity selector', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'This will show a quantity selector for this option.', 'woocommerce-tm-extra-product-options' ),
				],
				$this->add_setting_min(
					$name . '_quantity',
					[
						'label'            => esc_html__( 'Quantity min value', 'woocommerce-tm-extra-product-options' ),
						'message0x0_class' => 'tm-qty-min',
						'required'         => [
							'.tm-qty-selector' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					],
					false
				),
				$this->add_setting_max(
					$name . '_quantity',
					[
						'label'            => esc_html__( 'Quantity max value', 'woocommerce-tm-extra-product-options' ),
						'message0x0_class' => 'tm-qty-max',
						'required'         => [
							'.tm-qty-selector' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					],
					false
				),
				[
					'id'               => $name . '_quantity_step',
					'message0x0_class' => 'tm-qty-step',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'number',
					'tags'             => [
						'class' => 'n',
						'id'    => 'builder_' . $name . '_min',
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_quantity_step][]',
						'value' => '',
						'step'  => 'any',
						'min'   => 0,
					],
					'label'            => esc_html__( 'Quantity step', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Enter the quantity step.', 'woocommerce-tm-extra-product-options' ),
					'required'         => [
						'.tm-qty-selector' => [
							'operator' => 'isnot',
							'value'    => '',
						],
					],
				],

				$this->add_setting_default_value(
					$name . '_quantity',
					[
						'type'             => 'number',
						'tags'             => [
							'class' => 'n',
							'id'    => 'builder_' . $name . '_quantity_default_value',
							'name'  => 'tm_meta[tmfbuilder][' . $name . '_quantity_default_value][]',
							'value' => '',
						],
						'label'            => esc_html__( 'Quantity Default value', 'woocommerce-tm-extra-product-options' ),
						'message0x0_class' => 'tm-qty-default',
						'desc'             => esc_html__( 'Enter a value to be applied to the Quantity field automatically.', 'woocommerce-tm-extra-product-options' ),
						'required'         => [
							'.tm-qty-selector' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					]
				),
			],
		];
	}

	/**
	 * Placeholder setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_placeholder( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'      => $name . '_placeholder',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_' . $name . '_placeholder',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_placeholder][]',
					'value' => '',
				],
				'label'   => esc_html__( 'Placeholder', 'woocommerce-tm-extra-product-options' ),
				'desc'    => '',
			],
			$args
		);
	}

	/**
	 * Minimum characters setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_min_chars( $name = '' ) {
		return [
			'id'          => $name . '_min_chars',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_min_chars',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_min_chars][]',
				'value' => '',
				'min'   => 0,
			],
			'label'       => esc_html__( 'Minimum characters', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter a value for the minimum characters the user must enter.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Maximum characters setting
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_max_chars( $name = '' ) {
		return [
			'id'          => $name . '_max_chars',
			'wpmldisable' => 1,
			'default'     => '',
			'type'        => 'number',
			'tags'        => [
				'class' => 'n',
				'id'    => 'builder_' . $name . '_max_chars',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_max_chars][]',
				'value' => '',
				'min'   => 0,
			],
			'label'       => esc_html__( 'Maximum characters', 'woocommerce-tm-extra-product-options' ),
			'desc'        => esc_html__( 'Enter a value to limit the maximum characters the user can enter.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Default value setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_default_value( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'      => $name . '_default_value',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_' . $name . '_default_value',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_default_value][]',
					'value' => '',
				],
				'label'   => esc_html__( 'Default value', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a value to be applied to the field automatically.', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);
	}

	/**
	 * Default value setting (for textarea)
	 *
	 * @param string $name Element name.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_setting_default_value_multiple( $name = '' ) {
		return [
			'id'      => $name . '_default_value',
			'default' => '',
			'type'    => 'textarea',
			'tags'    => [
				'class' => 't tm-no-editor',
				'id'    => 'builder_' . $name . '_default_value',
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_default_value][]',
				'value' => '',
			],
			'label'   => esc_html__( 'Default value', 'woocommerce-tm-extra-product-options' ),
			'desc'    => esc_html__( 'Enter a value to be applied to the field automatically.', 'woocommerce-tm-extra-product-options' ),
		];
	}

	/**
	 * Element template
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function template_bitem( $args = [] ) {

		global $post;

		$show_buttons = true;

		if ( ! $post && isset( $_POST['post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post = get_post( absint( $_POST['post_id'] ) ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride, WordPress.Security.NonceVerification
		}

		if ( $post && THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post->post_type ) {
			$show_buttons = false;
		}
		$wpml_is_original_product = true;
		if ( $post && THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post->ID, $post->post_type );
		}

		$is_enabled = isset( $args['is_enabled'] ) ? $args['is_enabled'] : '';
		$is_enabled = '' === $is_enabled ? ' element-is-disabled' : '';
		if ( empty( $this->noecho ) ) {
			echo '<div class="bitem element-' . esc_attr( $args['element'] ) . esc_attr( $is_enabled ) . ' ' . esc_attr( $args['width'] ) . '">';
			if ( ! empty( $args['is_template'] ) ) {
				echo '<input class="builder_element_type" name="tm_meta[tmfbuilder][element_type][]" type="hidden" value="' . esc_attr( $args['element'] ) . '">';
				echo '<input class="div_size" name="tm_meta[tmfbuilder][div_size][]" type="hidden" value="' . esc_attr( $args['width'] ) . '">';
			}
			echo '<div class="hstc2">';
			echo '<div class="bitem-inner">';
			echo '<ul class="bitem-settings">';
			if ( $show_buttons ) {
				echo '<li class="bitem-setting size" title="' . esc_attr__( 'Size', 'woocommerce-tm-extra-product-options' ) . '">';
				echo '<span>' . esc_html( $args['width_display'] ) . '</span>';
				echo '</li>';
				if ( $wpml_is_original_product ) {
					echo '<li class="bitem-setting minus" title="' . esc_attr__( 'Reduce Width', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-minus"></i>';
					echo '</li>';
					echo '<li class="bitem-setting plus" title="' . esc_attr__( 'Increase Width', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-plus"></i>';
					echo '</li>';
				}
			}
			echo '<li class="bitem-setting edit" title="' . esc_attr__( 'Edit Element', 'woocommerce-tm-extra-product-options' ) . '">';
			echo '<i class="tmicon tcfa tcfa-edit"></i>';
			echo '</li>';
			if ( $show_buttons ) {
				if ( $wpml_is_original_product ) {
					echo '<li class="bitem-setting clone" title="' . esc_attr__( 'Duplicate Element', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-copy"></i>';
					echo '</li>';
					echo '<li class="bitem-setting change" title="' . esc_attr__( 'Change Element Type', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-exchange-alt"></i>';
					echo '</li>';
				}
			}
			echo '</ul>';
			echo '</div>';
			echo '<div class="bitem-inner-info">';
			if ( $show_buttons ) {
				echo '<div class="tm-label-move">';
				echo '<button type="button" class="tmicon tcfa tcfa-grip-vertical move"></button>';
				echo '</div>';
			}
			echo '<div class="tm-label-icon">';
			echo '<div class="tm-icon-wrap">';
			echo '<i class="tmfa tcfa ' . esc_attr( $args['icon'] ) . '"></i>';
			echo '</div>';
			echo '</div>';
			echo '<div class="tm-label-info">';
			echo '<div class="tm-label-desc' . ( '' !== $args['internal_name'] ? ' tc-has-value' : ' tc-empty-value' ) . '">';
			echo '<div class="tm-element-label">' . esc_html( $args['label'] ) . '</div>';
			echo '<div class="tm-internal-label">' . esc_html( $args['internal_name'] ) . '</div>';
			echo '</div>';
			echo '<div class="tm-for-bitem tm-label-desc-edit tm-hidden" data-element="' . esc_attr( $args['element'] ) . '">';
			if ( ! empty( $args['is_template'] ) ) {
				echo '<input type="text" value="' . esc_attr( $args['internal_name'] ) . '" name="tm_meta[tmfbuilder][' . esc_attr( $args['element'] ) . '_internal_name][]" class="t tm-internal-name">';
			}
			echo '</div>';
			echo '<div class="tm-label">';
			if ( '&nbsp;' === $args['desc'] || '' === $args['desc'] ) {
				esc_html_e( '(No title)', 'woocommerce-tm-extra-product-options' );
			} else {
				echo esc_html( $args['desc'] );
			}
			echo '</div>';
			echo '<div class="tm-label-line">';
			echo '<div class="tm-label-line-inner"></div>';
			echo '</div>';
			echo '</div>';
			echo '<div class="tm-label-delete">';
			echo '<button type="button" class="tmicon tcfa tcfa-times delete"></button>';
			echo '</div>';
			echo '</div>';
			echo '<div class="inside">';
			echo '<div class="manager">';
			echo '<div class="builder-element-wrap">';
		}
		if ( isset( $args['fields'] ) && is_array( $args['fields'] ) ) {
			if ( empty( $args['is_template'] ) ) {
				$pointer = count( $this->jsbuilder ) - 1;

				if ( $pointer >= 0 ) {
					$fields_pointer = count( $this->jsbuilder[ $pointer ]['fields'] );
					$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ]   = [];
					$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = [
						'id'      => 'element_type',
						'default' => $args['element'],
						'type'    => 'hidden',
						'tags'    => [
							'class' => 'builder_element_type',
							'name'  => 'tm_meta[tmfbuilder][element_type][]',
						],
					];
					$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = [
						'id'      => 'div_size',
						'default' => $args['width'],
						'type'    => 'hidden',
						'tags'    => [
							'class' => 'div_size',
							'name'  => 'tm_meta[tmfbuilder][div_size][]',
						],
					];
					$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = [
						'id'      => $args['element'] . '_internal_name',
						'default' => $args['internal_name'],
						'type'    => 'text',
						'tags'    => [
							'class' => 't tm-internal-name',
							'name'  => 'tm_meta[tmfbuilder][' . $args['element'] . '_internal_name][]',
						],
					];
					$clogic              = false;
					$logicrules          = false;
					$logicrules_pointers = [];
					foreach ( $args['fields'] as $value ) {
						if ( ! empty( $value['clogic'] ) ) {
							$clogic = $value;
						}
						if ( ! empty( $value['logicrules'] ) ) {
							$logicrules          = $value;
							$logicrules_pointers = [
								'pointer'        => $pointer,
								'fields_pointer' => $fields_pointer,
								'jpointer'       => count( $this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ] ),
							];
						}
						if ( isset( $value['type'] ) && 'custom' !== $value['type'] ) {
							if ( 'custom_multiple' === $value['type'] ) {
								if ( isset( $value['html'] ) ) {
									if ( is_array( $value['html'] ) ) {
										$method                     = $value['html'][0];
										$methodargs                 = $value['html'][1];
										$methodargs[0]['return_js'] = true;

										$returned_js = call_user_func_array( $method, $methodargs );

										if ( is_array( $returned_js ) ) {
											$temp_array = [
												'id'       => 'multiple',
												'multiple' => [],
											];
											foreach ( $returned_js as $js_value ) {
												$js_value                 = $this->remove_for_js( $js_value );
												$temp_array['multiple'][] = $js_value;
												if ( 'variations_options' === $value['id'] ) {
													foreach ( $js_value as $js_value_array ) {
														$js_value_array       = $this->remove_for_js( $js_value_array );
														$js_value_array['id'] = $value['id'];
														$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = $js_value_array;
													}
												}
											}
											$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = $temp_array;
										}
									}
								}
							} else {
								if ( isset( $value['fill'] ) ) {
									if ( 'product' === $value['fill'] ) {
										$product_ids = isset( $value['default'] ) ? $value['default'] : [];
										if ( ! is_array( $product_ids ) ) {
											if ( $product_ids ) {
												$product_ids = [ $product_ids ];
											} else {
												$product_ids = [];
											}
										}
										if ( ! isset( $value['options'] ) || ! is_array( $value['options'] ) ) {
											$value['options'] = [];
										}
										foreach ( $product_ids as $product_id ) {
											$product = wc_get_product( $product_id );
											if ( is_object( $product ) ) {
												$value['options'][] = [
													'text' => wp_kses_post( $product->get_formatted_name() ),
													'value' => $product_id,
												];
											}
										}
									} elseif ( 'category' === $value['fill'] ) {
										$category_ids = isset( $value['default'] ) ? $value['default'] : [];
										if ( ! is_array( $category_ids ) ) {
											$category_ids = [];
										}
										if ( ! isset( $value['options'] ) || ! is_array( $value['options'] ) ) {
											$value['options'] = [];
										}
										foreach ( $category_ids as $category_id ) {
											$current_category_id = absint( wc_clean( wp_unslash( $category_id ) ) );
											$current_category    = $current_category_id ? get_term_by( 'id', $current_category_id, 'product_cat' ) : false;
											if ( $current_category instanceof WP_Term ) {
												$value['options'][] = [
													'text' => wp_kses_post( $current_category->name ),
													'value' => $current_category_id,
												];
											}
										}
									}
								}
								if ( 'product_default_value' === $value['id'] ) {
									$temp_product = wc_get_product( $value['default'] );
									if ( $temp_product ) {
										$value['current_selected_text'] = $temp_product->get_title();
									}
								}
								$this->jsbuilder[ $pointer ]['fields'][ $fields_pointer ][] = $this->remove_for_js( $value );
							}
						}
					}
					if ( false !== $clogic && false !== $logicrules && isset( $logicrules_pointers['jpointer'] ) ) {
						if ( isset( $clogic['default'] ) && array_key_exists( 'default', $logicrules ) && null === $logicrules['default'] ) {
							$logicrules['default'] = $clogic['default'];
							$this->jsbuilder[ $logicrules_pointers['pointer'] ]['fields'][ $logicrules_pointers['fields_pointer'] ][ $logicrules_pointers['jpointer'] ] = $this->remove_for_js( $logicrules );
						}
					}
				}
			} elseif ( empty( $this->noecho ) ) {
				foreach ( $args['fields'] as $value ) {
					if ( isset( $value['fill'] ) ) {
						if ( 'product' === $value['type'] ) {
							$product_ids = isset( $value['default'] ) ? $value['default'] : [];
							if ( ! is_array( $product_ids ) ) {
								$product_ids = [];
							}
							if ( ! isset( $value['options'] ) || ! is_array( $value['options'] ) ) {
								$value['options'] = [];
							}
							foreach ( $product_ids as $product_id ) {
								$product = wc_get_product( $product_id );
								if ( is_object( $product ) ) {
									$value['options'][] = [
										'text'  => wp_kses_post( $product->get_formatted_name() ),
										'value' => $product_id,
									];
								}
							}
						} elseif ( 'category' === $value['fill'] ) {
							$category_ids = isset( $value['default'] ) ? $value['default'] : [];
							if ( ! is_array( $category_ids ) ) {
								$category_ids = [];
							}

							if ( ! isset( $value['options'] ) || ! is_array( $value['options'] ) ) {
								$value['options'] = [];
							}
							foreach ( $category_ids as $category_id ) {
								$current_category_id = absint( wc_clean( wp_unslash( $category_id ) ) );
								$current_category    = $current_category_id ? get_term_by( 'id', $current_category_id, 'product_cat' ) : false;
								if ( $current_category instanceof WP_Term ) {
									$value['options'][] = [
										'text'  => wp_kses_post( $current_category->name ),
										'value' => $current_category_id,
									];
								}
							}
						}
					}
					THEMECOMPLETE_EPO_HTML()->create_field( $value, 1 );
				}
			}
		}
		if ( empty( $this->noecho ) ) {
			echo '</div></div></div></div></div>';
		}
	}

	/**
	 * Section elements template
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 * @access private
	 */
	private function section_elements_template( $args = [] ) {

		$args = shortcode_atts(
			[
				'section_fields'           => '',
				'size'                     => '',
				'wpml_is_original_product' => true,
				'sections_internal_name'   => '',
				'is_template'              => false,
			],
			$args
		);
		/**
		 * The section fields
		 *
		 * @var array<mixed>|string $section_fields
		 */
		$section_fields = $args['section_fields'];

		$size                     = $args['size'];
		$wpml_is_original_product = $args['wpml_is_original_product'];
		$sections_internal_name   = $args['sections_internal_name'];

		if ( empty( $args['is_template'] ) ) {
			$pointer                                = count( $this->jsbuilder );
			$this->jsbuilder[ $pointer ]            = [];
			$this->jsbuilder[ $pointer ]['fields']  = [];
			$this->jsbuilder[ $pointer ]['section'] = [];
			$this->jsbuilder[ $pointer ]['size']    = $size;
			$this->jsbuilder[ $pointer ]['sections_internal_name']            = $sections_internal_name;
			$this->jsbuilder[ $pointer ]['section']['sections_internal_name'] = [
				'id'      => 'sections_internal_name',
				'default' => $sections_internal_name,
				'type'    => 'text',
				'tags'    => [
					'class' => 't tm-internal-name',
					'name'  => 'tm_meta[tmfbuilder][sections_internal_name][]',
				],
			];
		}
		if ( empty( $this->noecho ) ) {
			echo '<div class="section_elements closed">';
		}
		if ( is_array( $section_fields ) ) {
			$clogic              = false;
			$logicrules          = false;
			$logicrules_pointers = [];
			foreach ( $section_fields as $section_field ) {
				if ( empty( $args['is_template'] ) ) {
					if ( ! empty( $section_field['clogic'] ) ) {
						$clogic = $section_field;
					}
					if ( ! empty( $section_field['logicrules'] ) ) {
						$logicrules          = $section_field;
						$logicrules_pointers = [
							'pointer'  => $pointer,
							'jpointer' => $section_field['id'],
						];
					}
					if ( 'custom' !== $section_field['type'] ) {
						$this->jsbuilder[ $pointer ]['section'][ $section_field['id'] ] = $this->remove_for_js( $section_field );
					}
				} elseif ( empty( $this->noecho ) ) {
					THEMECOMPLETE_EPO_HTML()->create_field( $section_field, 1 );
				}
			}
			if ( false !== $clogic && false !== $logicrules && isset( $logicrules_pointers['jpointer'] ) ) {
				if ( isset( $clogic['default'] ) && array_key_exists( 'default', $logicrules ) && null === $logicrules['default'] ) {
					$logicrules['default'] = $clogic['default'];
					$this->jsbuilder[ $logicrules_pointers['pointer'] ]['section'][ $logicrules_pointers['jpointer'] ] = $this->remove_for_js( $logicrules );
				}
			}
		}
		if ( empty( $this->noecho ) ) {
			global $post;
			$show_buttons = true;

			if ( ! $post && isset( $_POST['post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				$post = get_post( absint( $_POST['post_id'] ) ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride, WordPress.Security.NonceVerification
			}

			if ( $post && THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post->post_type ) {
				$show_buttons = false;
			}
			echo '</div>';
			echo '<div class="section-inner">';
			if ( $show_buttons ) {
				echo '<ul class="section-settings">';
				echo '<li class="section-setting size" title="' . esc_attr__( 'Size', 'woocommerce-tm-extra-product-options' ) . '">';
				echo '<span>' . esc_html( $size ) . '</span>';
				echo '</li>';
				if ( $wpml_is_original_product ) {
					echo '<li class="section-setting minus" title="' . esc_attr__( 'Reduce Width', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-minus"></i>';
					echo '</li>';
					echo '<li class="section-setting plus" title="' . esc_attr__( 'Increase Width', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-plus"></i>';
					echo '</li>';
				}
				echo '<li class="section-setting edit" title="' . esc_attr__( 'Edit Section', 'woocommerce-tm-extra-product-options' ) . '">';
				echo '<i class="tmicon tcfa tcfa-edit"></i>';
				echo '</li>';
				if ( $wpml_is_original_product ) {
					echo '<li class="bitem-setting clone" title="' . esc_attr__( 'Duplicate Section', 'woocommerce-tm-extra-product-options' ) . '">';
					echo '<i class="tmicon tcfa tcfa-copy"></i>';
					echo '</li>';
				}
				echo '</ul>';
			}
			echo '</div>';
			echo '<div class="btitle">';
			if ( $show_buttons ) {
				if ( $wpml_is_original_product ) {
					echo '<button type="button" class="tmicon tcfa tcfa-grip-vertical move"></button>';
					echo '<button type="button" class="tmicon tcfa tcfa-times delete"></button>';
				}
				echo '<button type="button" class="tmicon tcfa tcfa-caret-down fold"></button>';
				echo '<div class="tm-label-desc' . ( '' !== $sections_internal_name ? ' tc-has-value' : ' tc-empty-value' ) . ' display-flex">';
				echo '<div class="tm-element-label">' . esc_html__( 'Section', 'woocommerce-tm-extra-product-options' ) . '</div>';
				echo '<div class="tm-internal-label">' . esc_html( (string) $sections_internal_name ) . '</div>';
				echo '</div>';
			}
			echo '<div class="tm-for-section tm-label-desc-edit tm-hidden">';
			if ( ! empty( $args['is_template'] ) ) {
				echo '<input type="text" value="' . esc_attr( (string) $sections_internal_name ) . '" name="tm_meta[tmfbuilder][sections_internal_name][]" class="t tm-internal-name">';
			}
			echo '</div>';
			echo '</div>';
		}
	}

	/**
	 * Section template
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 * @access private
	 */
	private function section_template( $args = [] ) {
		global $post;

		$args = shortcode_atts(
			[
				'section_fields'           => '',
				'size'                     => '',
				'section_size'             => '',
				'sections_slides'          => '',
				'sections_tabs_labels'     => '',
				'sections_type'            => '',
				'elements'                 => '',
				'wpml_is_original_product' => true,
				'sections_internal_name'   => false,
				'is_template'              => false,
			],
			$args
		);

		$section_fields           = $args['section_fields'];
		$size                     = $args['size'];
		$section_size             = $args['section_size'];
		$sections_slides          = $args['sections_slides'];
		$sections_type            = $args['sections_type'];
		$wpml_is_original_product = $args['wpml_is_original_product'];
		$sections_internal_name   = $args['sections_internal_name'];

		/**
		 * The section tab labels
		 *
		 * @var array<mixed>|string $sections_tabs_labels
		 */
		$sections_tabs_labels = $args['sections_tabs_labels'];
		if ( is_array( $sections_tabs_labels ) ) {
			$sections_tabs_labels = current( $sections_tabs_labels );
		}
		$sections_tabs_labels = json_decode( $sections_tabs_labels );

		/**
		 * The elements data
		 *
		 * @var array<mixed>|string $elements
		 */
		$elements = $args['elements'];

		if ( false === $sections_internal_name ) {
			$sections_internal_name = esc_html__( 'Section', 'woocommerce-tm-extra-product-options' );
		}

		if ( is_array( $elements ) ) {
			$elements = array_values( $elements );
		}

		if ( ! is_array( $sections_tabs_labels ) ) {
			$sections_tabs_labels = [];
		}

		if ( '' !== $sections_slides && is_array( $elements ) ) {
			if ( empty( $this->noecho ) ) {
				echo '<div class="builder-wrapper tm-slider-wizard ' . esc_attr( $section_size ) . ' is-' . esc_attr( $sections_type ) . '"><div class="builder-section-wrap">';
			}
			$this->section_elements_template(
				[
					'section_fields'           => $section_fields,
					'size'                     => $size,
					'wpml_is_original_product' => $wpml_is_original_product,
					'sections_internal_name'   => $sections_internal_name,
					'is_template'              => $args['is_template'],
				]
			);

			$sections_slides = explode( ',', $sections_slides );

			if ( empty( $this->noecho ) ) {
				echo '<div class="transition tm-slider-wizard-headers">';
				$s = 0;

				foreach ( $sections_slides as $key => $value ) {
					if ( ! isset( $sections_tabs_labels[ $s ] ) ) {
						$sections_tabs_labels[ $s ] = $s + 1;
					}
					echo '<div class="tm-box"><h4 class="tm-slider-wizard-header" data-id="tc-tab-slide' . esc_attr( (string) $s ) . '"><span class="tab-text">' . esc_html( $sections_tabs_labels[ $s ] ) . '</span></h4></div>';

					++$s;

				}
				echo '</div>';
				if ( $wpml_is_original_product && ( ! $post || THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $post->post_type ) ) {
					echo '<div class="bitem-add tc-prepend tma-nomove"><div class="tm-add-element-action"><button type="button" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '" class="builder-add-element tc-button tc-prepend tmfa tcfa tcfa-plus"></button></div></div>';
				}
			}

			$c = 0;
			$s = 0;

			foreach ( $sections_slides as $key => $value ) {

				$value = intval( $value );

				if ( empty( $this->noecho ) ) {
					echo "<div class='bitem-wrapper tc-tab-slide tc-tab-slide" . esc_attr( (string) $s ) . "'>";
				}
				for ( $_s = $c; $_s < ( $c + $value ); $_s++ ) {
					if ( isset( $elements[ $_s ] ) ) {
						$this->template_bitem( $elements[ $_s ] );
					}
				}
				if ( empty( $this->noecho ) ) {
					echo '</div>';
				}

				$c = $c + $value;
				++$s;

			}
			if ( empty( $this->noecho ) ) {
				if ( $wpml_is_original_product && ( ! $post || THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $post->post_type ) ) {
					echo '<div class="bitem-add tc-append tma-nomove"><div class="tm-add-element-action"><button type="button" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '" class="builder-add-element tc-button tc-append tmfa tcfa tcfa-plus"></button></div></div>';
				}
				echo '</div></div>';
			}
		} else {
			if ( empty( $this->noecho ) ) {
				echo "<div class='builder-wrapper " . esc_attr( $section_size ) . "'><div class='builder-section-wrap'>";
			}
			$this->section_elements_template(
				[
					'section_fields'           => $section_fields,
					'size'                     => $size,
					'wpml_is_original_product' => $wpml_is_original_product,
					'sections_internal_name'   => $sections_internal_name,
					'is_template'              => $args['is_template'],
				]
			);
			if ( empty( $this->noecho ) ) {
				if ( $wpml_is_original_product && ( ! $post || THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $post->post_type ) ) {
					echo '<div class="bitem-add tc-prepend tma-nomove"><div class="tm-add-element-action"><button type="button" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '" class="builder-add-element tc-button tc-prepend tmfa tcfa tcfa-plus"></button></div></div>';
				}

				echo "<div class='bitem-wrapper'>";
			}

			if ( is_array( $elements ) ) {
				foreach ( $elements as $value ) {
					$this->template_bitem( $value );
				}
			}

			if ( empty( $this->noecho ) ) {
				echo '</div>';
				if ( $wpml_is_original_product && ( ! $post || THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE !== $post->post_type ) ) {
					echo '<div class="bitem-add tc-append tma-nomove"><div class="tm-add-element-action"><button type="button" title="' . esc_html__( 'Add element', 'woocommerce-tm-extra-product-options' ) . '" class="builder-add-element tc-button tc-append tmfa tcfa tcfa-plus"></button></div></div>';
				}
				echo '</div></div>';
			}
		}
	}

	/**
	 * Generates all hidden sections for use in jQuery.
	 *
	 * @param boolean $wpml_is_original_product If the product is the original product.
	 * @return void
	 * @since 1.0.0
	 * @access public
	 */
	public function template_section_elements( $wpml_is_original_product = true ) {
		$this->section_template(
			[
				'section_fields'           => $this->section->properties,
				'size'                     => $this->sizer['w100'],
				'section_size'             => '',
				'sections_slides'          => '',
				'sections_tabs_labels'     => '',
				'sections_type'            => '',
				'elements'                 => '',
				'wpml_is_original_product' => $wpml_is_original_product,
				'sections_internal_name'   => false,
				'is_template'              => true,
			]
		);
	}

	/**
	 * Generates all hidden elements for use in jQuery.
	 *
	 * @return void
	 * @since 1.0.0
	 * @access public
	 */
	public function template_elements() {
		$all_elements = THEMECOMPLETE_EPO_BUILDER()->get_elements();
		foreach ( $all_elements as $element => $settings ) {

			// double quotes are problematic to json_encode.
			$settings->name = str_replace( '"', "'", $settings->name );
			$fields         = [];

			foreach ( $settings->properties as $key => $value ) {
				// no need to auto fill the product element here
				// since it will always be empty.
				$fields[] = $value;
			}

			$this->template_bitem(
				[
					'element'       => $element,
					'width'         => $settings->width,
					'width_display' => $settings->width_display,
					'internal_name' => $settings->name,
					'label'         => $settings->name,
					'fields'        => $fields,
					'desc'          => '&nbsp;',
					'icon'          => $settings->icon,
					'is_enabled'    => '1',
					'is_template'   => true,
				]
			);

		}
	}

	/**
	 * Clear array values
	 *
	 * @param mixed $val The value to clear.
	 * @return mixed
	 * @since 1.0
	 * @access private
	 */
	private function clear_array_values( $val ) {
		if ( is_array( $val ) ) {
			return array_map( [ $this, 'clear_array_values' ], $val );
		} else {
			return '';
		}
	}

	/**
	 * Set array values to false
	 *
	 * @param mixed $val The value to false.
	 * @return mixed
	 * @since 5.0
	 * @access private
	 */
	private function return_false_array_values( $val ) {
		if ( is_array( $val ) ) {
			return array_map( [ $this, 'return_false_array_values' ], $val );
		} else {
			return false;
		}
	}

	/**
	 * Get current jsbuilder.
	 *
	 * @param integer $post_id The original post id.
	 * @param integer $current_post_id current post id.
	 * @param boolean $wpml_is_original_product If the product is the original product.
	 * @return array<mixed>
	 * @since 5.0
	 * @access public
	 */
	public function get_current_jsbuilder( $post_id = 0, $current_post_id = 0, $wpml_is_original_product = true ) {
		$this->noecho    = true;
		$this->jsbuilder = [];
		$this->print_saved_elements( $post_id, $current_post_id, $wpml_is_original_product );
		$this->noecho = false;

		return $this->jsbuilder;
	}

	/**
	 * Generates all saved elements.
	 * Used when importing CSV files
	 *
	 * @param integer $post_id The original post id.
	 * @param integer $current_post_id current post id.
	 * @param boolean $wpml_is_original_product If the product is the original product.
	 * @return void
	 * @since 5.0
	 * @access public
	 */
	public function ajax_print_saved_elements( $post_id = 0, $current_post_id = 0, $wpml_is_original_product = true ) {
		$this->admin_init();
		$this->print_saved_elements( $post_id, $current_post_id, $wpml_is_original_product );
	}

	/**
	 * Generates all saved elements.
	 *
	 * @param integer $post_id The original post id.
	 * @param integer $current_post_id current post id.
	 * @param boolean $wpml_is_original_product If the product is the original product.
	 * @return void
	 * @since 1.0.0
	 * @access public
	 */
	public function print_saved_elements( $post_id = 0, $current_post_id = 0, $wpml_is_original_product = true ) {
		$builder         = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
		$current_builder = themecomplete_get_post_meta( $current_post_id, 'tm_meta_wpml', true );

		if ( ! $current_builder ) {
			$current_builder = [];
		} else {
			if ( ! isset( $current_builder['tmfbuilder'] ) ) {
				$current_builder['tmfbuilder'] = [];
			}
			$current_builder = $current_builder['tmfbuilder'];
		}

		if ( ! isset( $builder['tmfbuilder'] ) ) {
			if ( ! is_array( $builder ) ) {
				$builder = [];
			}
			$builder['tmfbuilder'] = [];
		}
		$builder = $builder['tmfbuilder'];

		// only check for element_type meta as if it exists div_size will exist too unless database has been compromised.

		if ( ! empty( $post_id ) && is_array( $builder ) && count( $builder ) > 0 && isset( $builder['sections'] ) && isset( $builder['element_type'] ) && is_array( $builder['element_type'] ) && count( $builder['element_type'] ) > 0 ) {
			// All the elements.
			$_elements = $builder['element_type'];
			// All element sizes.
			$_div_size = $builder['div_size'];

			// All sections (holds element count for each section).
			$_sections = $builder['sections'];
			// All section sizes.
			$_sections_size = $builder['sections_size'];

			$_sections_slides      = isset( $builder['sections_slides'] ) ? $builder['sections_slides'] : '';
			$_sections_tabs_labels = isset( $current_builder['sections_tabs_labels'] ) ? $current_builder['sections_tabs_labels'] : ( isset( $builder['sections_tabs_labels'] ) ? $builder['sections_tabs_labels'] : '' );

			$sections_type = $builder['sections_type'];

			if ( ! is_array( $_sections ) ) {
				$_sections = [ count( $_elements ) ];
			}
			if ( ! is_array( $_sections_size ) ) {
				$_sections_size = array_fill( 0, count( $_sections ), 'w100' );
			}

			if ( ! is_array( $_sections_slides ) ) {
				$_sections_slides = array_fill( 0, count( $_sections ), '' );
			}

			if ( ! is_array( $_sections_tabs_labels ) ) {
				$_sections_tabs_labels = array_fill( 0, count( $_sections ), '' );
			}

			$_helper_counter       = 0;
			$additional_currencies = THEMECOMPLETE_EPO_HELPER()->get_additional_currencies();
			$t                     = [];
			$_counter              = [];
			$id_counter            = [];
			$count_sections        = count( $_sections );
			$all_elements          = THEMECOMPLETE_EPO_BUILDER()->get_elements();
			for ( $_s = 0; $_s < $count_sections; $_s++ ) {

				$section_fields          = [];
				$_sections_internal_name = '';
				foreach ( $this->section->properties as $_sk => $_sv ) {
					$transition_counter = $_s;
					$section_use_wpml   = false;
					if ( isset( $current_builder['sections_uniqid'] )
						&& isset( $builder['sections_uniqid'] )
						&& isset( $builder['sections_uniqid'][ $_s ] )
					) {
						// get index of element id in internal array.
						$get_current_builder_uniqid_index = array_search( $builder['sections_uniqid'][ $_s ], $current_builder['sections_uniqid'], true );
						if ( null !== $get_current_builder_uniqid_index && false !== $get_current_builder_uniqid_index ) {
							$transition_counter = $get_current_builder_uniqid_index;
							$section_use_wpml   = true;
						}
					}

					if ( isset( $builder['sections_internal_name'] ) && isset( $builder['sections_internal_name'][ $_s ] ) ) {
						$_sections_internal_name = $builder['sections_internal_name'][ $_s ];
						if ( $section_use_wpml
							&& isset( $current_builder['sections_internal_name'] )
							&& isset( $current_builder['sections_internal_name'][ $transition_counter ] )
						) {
							$_sections_internal_name = $current_builder['sections_internal_name'][ $transition_counter ];
						}
					}

					if ( isset( $builder[ $_sv['id'] ] ) ) {
						if ( isset( $builder[ $_sv['id'] ][ $_s ] ) ) {
							$_sv['default'] = $builder[ $_sv['id'] ][ $_s ];
							if ( $section_use_wpml
								&& isset( $current_builder[ $_sv['id'] ] )
								&& isset( $current_builder[ $_sv['id'] ][ $transition_counter ] )
							) {
								$_sv['default'] = $current_builder[ $_sv['id'] ][ $transition_counter ];
							}
						}
					} elseif ( isset( $_sv['logicrules'] ) ) {
						$_sv['default'] = null;
					}
					if ( isset( $_sv['tags']['id'] ) ) {
						// we assume that $_sv['tags']['name'] exists if tag id is set.
						$_name             = str_replace( [ '[', ']' ], '', $_sv['tags']['name'] );
						$_sv['tags']['id'] = $_name . $_s;
					}
					if ( 'sectionuniqid' === $_sk && ! isset( $builder[ $_sv['id'] ] ) ) {
						$_sv['default'] = THEMECOMPLETE_EPO_HELPER()->tm_uniqid();
					}
					if ( absint( $post_id ) !== absint( $current_post_id ) && ! empty( $_sv['wpmldisable'] ) ) {
						$_sv['disabled'] = 1;
					}
					if ( 'sections_clogic' === $_sv['id'] ) {
						if ( is_object( $_sv['default'] ) ) {
							$_sv['default'] = wp_json_encode( $_sv['default'] );
						}
						$_sv['default'] = wp_unslash( $_sv['default'] );
					}
					if ( 'sections_logicrules' === $_sv['id'] ) {
						if ( is_object( $_sv['default'] ) ) {
							$_sv['default'] = wp_json_encode( $_sv['default'] );
						}
						$_sv['default'] = wp_unslash( $_sv['default'] );
					}
					$section_fields[] = $_sv;
				}

				$elements_html       = '';
				$elements_html_array = [];

				for ( $k0 = $_helper_counter; $k0 < (int) ( $_helper_counter + (int) $_sections[ $_s ] ); $k0++ ) {
					if ( isset( $_elements[ $k0 ] ) ) {
						if ( isset( $all_elements[ $_elements[ $k0 ] ] ) ) {
							$elements_html_array[ $k0 ] = '';
							$regetdefault               = 0;
							if ( ! isset( $_counter[ $_elements[ $k0 ] ] ) ) {
								$_counter[ $_elements[ $k0 ] ] = 0;
							} else {
								++$_counter[ $_elements[ $k0 ] ];
							}

							$transition_counter = $_counter[ $_elements[ $k0 ] ];
							$use_wpml           = false;
							if ( isset( $current_builder[ $_elements[ $k0 ] . '_uniqid' ] )
								&& isset( $builder[ $_elements[ $k0 ] . '_uniqid' ] )
								&& isset( $builder[ $_elements[ $k0 ] . '_uniqid' ][ $_counter[ $_elements[ $k0 ] ] ] )
							) {
								// get index of element id in internal array.
								$get_current_builder_uniqid_index = array_search(
									$builder[ $_elements[ $k0 ] . '_uniqid' ][ $_counter[ $_elements[ $k0 ] ] ],
									$current_builder[ $_elements[ $k0 ] . '_uniqid' ],
									true
								);
								if ( null !== $get_current_builder_uniqid_index && false !== $get_current_builder_uniqid_index ) {
									$transition_counter = $get_current_builder_uniqid_index;
									$use_wpml           = true;
								}
							}

							$internal_name = $all_elements[ $_elements[ $k0 ] ]->name;
							if ( isset( $builder[ $_elements[ $k0 ] . '_internal_name' ] )
								&& isset( $builder[ $_elements[ $k0 ] . '_internal_name' ][ $_counter[ $_elements[ $k0 ] ] ] )
							) {
								$internal_name = $builder[ $_elements[ $k0 ] . '_internal_name' ][ $_counter[ $_elements[ $k0 ] ] ];
								if ( $use_wpml
									&& isset( $current_builder[ $_elements[ $k0 ] . '_internal_name' ] )
									&& isset( $current_builder[ $_elements[ $k0 ] . '_internal_name' ][ $transition_counter ] )
								) {
									$internal_name = $current_builder[ $_elements[ $k0 ] . '_internal_name' ][ $transition_counter ];
								}
							}

							// backwards compatibility.
							if ( isset( $builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
								switch ( $builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
									case 'fee':
										$builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] = '';
										$builder[ $_elements[ $k0 ] . '_fee' ][ $_counter[ $_elements[ $k0 ] ] ]        = '1';
										break;
									case 'stepfee':
										$builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] = 'step';
										$builder[ $_elements[ $k0 ] . '_fee' ][ $_counter[ $_elements[ $k0 ] ] ]        = '1';
										break;
									case 'currentstepfee':
										$builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] = 'currentstep';
										$builder[ $_elements[ $k0 ] . '_fee' ][ $_counter[ $_elements[ $k0 ] ] ]        = '1';
										break;
								}
							}

							// backwards compatibility.
							if ( ! isset( $builder[ $_elements[ $k0 ] . '_show_tooltip' ] ) ) {
								if ( isset( $builder[ $_elements[ $k0 ] . '_swatchmode' ] ) ) {
									$builder[ $_elements[ $k0 ] . '_show_tooltip' ] = $builder[ $_elements[ $k0 ] . '_swatchmode' ];
								} else {
									$builder[ $_elements[ $k0 ] . '_show_tooltip' ] = [];
								}
							}

							// backwards compatibility.
							if ( ! isset( $builder[ $_elements[ $k0 ] . '_replacement_mode' ] ) ) {
								$builder[ $_elements[ $k0 ] . '_replacement_mode' ] = [];
							}
							if ( ! isset( $builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
								if ( isset( $builder[ $_elements[ $k0 ] . '_use_images' ] ) ) {
									if ( '' !== $builder[ $_elements[ $k0 ] . '_use_images' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
										$builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] = 'image';
									} elseif ( '' !== $builder[ $_elements[ $k0 ] . '_use_colors' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
										$builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] = 'color';
									} else {
										$builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] = 'none';
									}
								} else {
									$builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] = 'none';
								}
								$regetdefault = 1;
							}

							// backwards compatibility.
							if ( ! isset( $builder[ $_elements[ $k0 ] . '_swatch_position' ] ) ) {
								$builder[ $_elements[ $k0 ] . '_swatch_position' ] = [];
							}
							if ( ! isset( $builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
								switch ( $builder[ $_elements[ $k0 ] . '_replacement_mode' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
									case 'none':
										$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = 'center';
										break;
									case 'image':
										if ( isset( $builder[ $_elements[ $k0 ] . '_use_images' ] ) && ! empty( $builder[ $_elements[ $k0 ] . '_use_images' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
											switch ( $builder[ $_elements[ $k0 ] . '_use_images' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
												case 'images':
													$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = 'center';
													break;
												default:
													$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = $builder[ $_elements[ $k0 ] . '_use_images' ][ $_counter[ $_elements[ $k0 ] ] ];
													break;
											}
										}
										break;
									case 'color':
										if ( isset( $builder[ $_elements[ $k0 ] . '_use_colors' ] ) && ! empty( $builder[ $_elements[ $k0 ] . '_use_colors' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
											switch ( $builder[ $_elements[ $k0 ] . '_use_colors' ][ $_counter[ $_elements[ $k0 ] ] ] ) {
												case 'color':
													$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = 'center';
													break;
												default:
													$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = $builder[ $_elements[ $k0 ] . '_use_colors' ][ $_counter[ $_elements[ $k0 ] ] ];
													break;
											}
										}
										break;
								}
								if ( ! isset( $builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
									$builder[ $_elements[ $k0 ] . '_swatch_position' ][ $_counter[ $_elements[ $k0 ] ] ] = 'center';
								}
								$regetdefault = 1;
							}

							$fields       = [];
							$element_desc = '&nbsp;';

							foreach ( $all_elements[ $_elements[ $k0 ] ]->properties as $key => $value ) {

								if ( isset( $value['id'] ) ) {
									$_vid = $value['id'];

									if ( ! isset( $t[ $_vid ] ) || $regetdefault ) {
										$t[ $_vid ] = isset( $builder[ $_vid ] )
											? $builder[ $_vid ]
											: null;
										if ( null !== $t[ $_vid ] ) {
											if ( absint( $post_id ) !== absint( $current_post_id ) && ! empty( $value['wpmldisable'] ) ) {
												$value['disabled'] = 1;
											}
										}
									} elseif ( null !== $t[ $_vid ] ) {
										if ( absint( $post_id ) !== absint( $current_post_id ) && ! empty( $value['wpmldisable'] ) ) {
											$value['disabled'] = 1;
										}
									}

									if ( null !== $t[ $_vid ]
										&& is_array( $t[ $_vid ] )
										&& count( $t[ $_vid ] ) > 0
										&& isset( $value['default'] )
										&& isset( $t[ $_vid ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
										$value['default'] = $t[ $_vid ][ $_counter[ $_elements[ $k0 ] ] ];

										if ( empty( $value['wpmldisable'] ) && $use_wpml
											&& isset( $current_builder[ $_vid ] )
											&& isset( $current_builder[ $_vid ][ $transition_counter ] )
										) {
											$value['default'] = $current_builder[ $_vid ][ $transition_counter ];
										}
										if ( 'number' === $value['type'] ) {
											$value['default'] = themecomplete_convert_local_numbers( $value['default'] );
										}
									} elseif ( isset( $value['logicrules'] ) ) {
										$value['default'] = null;
									}

									if ( null !== $t[ $_vid ]
										&& is_string( $t[ $_vid ] )
										&& isset( $value['default'] )
									) {
										$value['default'] = $t[ $_vid ];

										if ( 'number' === $value['type'] ) {
											$value['default'] = themecomplete_convert_local_numbers( $value['default'] );
										}
									}

									if ( ( 'header_title' === $_vid || $_elements[ $k0 ] . '_header_title' === $_vid ) && '' !== $value['default'] ) {
										$element_desc = $value['default'];
									}

									if ( $_elements[ $k0 ] . '_clogic' === $_vid ) {
										if ( is_object( $value['default'] ) ) {
											$value['default'] = wp_json_encode( $value['default'] );
										}
										$value['default'] = wp_unslash( $value['default'] );
									}
									if ( $_elements[ $k0 ] . '_logicrules' === $_vid ) {
										if ( is_object( $value['default'] ) ) {
											$value['default'] = wp_json_encode( $value['default'] );
										}
										$value['default'] = wp_unslash( $value['default'] );
									}
									// backwards compatibility.
									if ( $_vid === $_elements[ $k0 ] . '_clear_options' ) {
										if ( 'clear' === $value['default'] ) {
											$value['default'] = '1';
											if ( isset( $builder[ $_elements[ $k0 ] . '_clear_options' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
												$builder[ $_elements[ $k0 ] . '_clear_options' ][ $_counter[ $_elements[ $k0 ] ] ] = '1';
											}
										}
									}

									// backwards compatibility.
									if ( 'radiobuttons' === $_elements[ $k0 ] && ( 'radiobuttons_fee' === $_vid || 'radiobuttons_subscriptionfee' === $_vid ) ) {
										$_prices_type_base = isset( $builder['multiple_radiobuttons_options_price_type'] )
											? $builder['multiple_radiobuttons_options_price_type']
											: [];

										foreach ( $_prices_type_base as $_extra_key => $_extra_value ) {
											foreach ( $_extra_value as $__key => $__value ) {
												if ( 'radiobuttons_fee' === $_vid && 'fee' === $__value ) {
													$value['default'] = '1';
													break 2;
												}
												if ( 'radiobuttons_subscriptionfee' === $_vid && 'subscriptionfee' === $__value ) {
													$value['default']           = '1';
													$_multiple_prices_type_base = $builder['multiple_radiobuttons_options_price_type'][ $_counter[ $_elements[ $k0 ] ] ];
													if ( is_array( $_multiple_prices_type_base ) ) {
														foreach ( $_multiple_prices_type_base as $_xtra_key => $_xtra_value ) {
															$builder['multiple_radiobuttons_options_price_type'][ $_counter[ $_elements[ $k0 ] ] ][ $_xtra_key ] = '';
														}
													}
													break 2;
												}
											}
										}
									}

									if ( 'selectbox' === $_elements[ $k0 ] && 'selectbox_subscriptionfee' === $_vid ) {
										$_prices_type_base = isset( $builder['selectbox_price_type'] )
											? $builder['selectbox_price_type']
											: [];

										foreach ( $_prices_type_base as $__key => $__value ) {
											if ( 'subscriptionfee' === $__value ) {
												$value['default']           = '1';
												$_multiple_prices_type_base = $builder['multiple_selectbox_options_price_type'][ $_counter[ $_elements[ $k0 ] ] ];
												if ( is_array( $_multiple_prices_type_base ) ) {
													foreach ( $_multiple_prices_type_base as $_extra_key => $_extra_value ) {
														$builder['multiple_selectbox_options_price_type'][ $_counter[ $_elements[ $k0 ] ] ][ $_extra_key ] = '';
													}
												}
												break;
											}
										}
									}

									if ( $_vid === $_elements[ $k0 ] . '_enabled' ) {
										if ( '0' === (string) $value['default'] ) {
											$value['default'] = '';
											if ( isset( $builder[ $_elements[ $k0 ] . '_enabled' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
												$builder[ $_elements[ $k0 ] . '_enabled' ][ $_counter[ $_elements[ $k0 ] ] ] = '';
											}
										}
									}

									if ( $_vid === $_elements[ $k0 ] . '_price_type' ) {
										if ( 'subscriptionfee' === $value['default'] ) {
											$value['default'] = '';
											$builder[ $_elements[ $k0 ] . '_subscriptionfee' ][ $_counter[ $_elements[ $k0 ] ] ] = '1';
											if ( isset( $builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {
												$builder[ $_elements[ $k0 ] . '_price_type' ][ $_counter[ $_elements[ $k0 ] ] ] = '';
											}
										}
									}

									if ( 'variations_options' === $_vid ) {
										if ( $use_wpml && isset( $current_builder[ $_vid ] ) ) {
											$value['html'] = [
												[ $this, 'builder_sub_variations_options' ],
												[
													[
														'meta'       => isset( $current_builder[ $_vid ] ) ? $current_builder[ $_vid ] : null,
														'product_id' => $current_post_id,
													],
												],
											];
										} else {
											$value['html'] = [
												[ $this, 'builder_sub_variations_options' ],
												[
													[
														'meta'       => isset( $builder[ $_vid ] ) ? $builder[ $_vid ] : null,
														'product_id' => $current_post_id,
													],
												],
											];
										}
									} elseif ( ( isset( $value['tmid'] ) && 'populate' === $value['tmid'] ) &&
											( 'multiple' === $all_elements[ $_elements[ $k0 ] ]->type
												|| 'multipleall' === $all_elements[ $_elements[ $k0 ] ]->type
												|| 'multiplesingle' === $all_elements[ $_elements[ $k0 ] ]->type
												|| 'singlemultiple' === $all_elements[ $_elements[ $k0 ] ]->type )
									) {

										// holds the default checked values (cannot be cached in $t[$_vid]).
										$_default_value = isset( $builder[ 'multiple_' . $_vid . '_default_value' ] ) ? $builder[ 'multiple_' . $_vid . '_default_value' ] : null;

										if ( is_null( $t[ $_vid ] ) ) {
											$null_array = [
												'base'    => null,
												'current' => null,
											];
											$properties = [];

											foreach ( $this->multiple_properties as $property ) {
												$properties[ $property ] = $null_array;
											}

											foreach ( $properties as $property => $property_value ) {
												$properties[ $property ]['base'] = isset( $builder[ 'multiple_' . $_vid . '_' . $property ] )
												? $builder[ 'multiple_' . $_vid . '_' . $property ]
												: null;

												$properties[ $property ]['current'] = isset( $builder[ 'multiple_' . $_vid . '_' . $property ] )
												? isset( $current_builder[ 'multiple_' . $_vid . '_' . $property ] )
													? $current_builder[ 'multiple_' . $_vid . '_' . $property ]
													: $builder[ 'multiple_' . $_vid . '_' . $property ]
												: null;
												if ( is_array( $properties[ $property ]['base'] ) && is_array( $properties[ $property ]['current'] ) && count( $properties[ $property ]['current'] ) !== count( $properties[ $property ]['base'] ) ) {
													$properties[ $property ]['current'] = $properties[ $property ]['current'] + $properties[ $property ]['base'];
												}
											}

											$_titles_base = $properties['title']['base'];
											$_titles      = $properties['title']['current'];
											$_values_base = $properties['value']['base'];
											$_prices_base = $properties['price']['base'];

											$c_prices_base      = [];
											$c_prices           = [];
											$c_sale_prices_base = [];
											$c_sale_prices      = [];
											if ( ! empty( $additional_currencies ) && is_array( $additional_currencies ) ) {
												foreach ( $additional_currencies as $ckey => $currency ) {
													$mt_prefix                       = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $currency );
													$c_prices_base[ $currency ]      = isset( $builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ] )
														? $builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ]
														: null;
													$c_prices[ $currency ]           = isset( $builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ] )
														? isset( $current_builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ] )
															? $current_builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ]
															: $builder[ 'multiple_' . $_vid . '_price' . $mt_prefix ]
														: null;
													$c_sale_prices_base[ $currency ] = isset( $builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ] )
														? $builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ]
														: null;
													$c_sale_prices[ $currency ]      = isset( $builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ] )
														? isset( $current_builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ] )
															? $current_builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ]
															: $builder[ 'multiple_' . $_vid . '_sale_price' . $mt_prefix ]
														: null;
												}
											}

											$_extra_options = THEMECOMPLETE_EPO_BUILDER()->extra_multiple_options;

											$_extra_base = [];
											$_extra      = [];
											$_extra_keys = [];
											foreach ( $_extra_options as $__key => $__name ) {
												if ( ( is_array( $__name['type'] ) && in_array( $_elements[ $k0 ], $__name['type'], true ) ) || $_elements[ $k0 ] === $__name['type'] ) {
													$_extra_name   = $__name['name'];
													$_extra_base[] = isset( $builder[ 'multiple_' . $_vid . '_' . $_extra_name ] )
														? $builder[ 'multiple_' . $_vid . '_' . $_extra_name ]
														: null;
													$_extra[]      = isset( $builder[ 'multiple_' . $_vid . '_' . $_extra_name ] )
														? isset( $current_builder[ 'multiple_' . $_vid . '_' . $_extra_name ] )
															? $current_builder[ 'multiple_' . $_vid . '_' . $_extra_name ]
															: $builder[ 'multiple_' . $_vid . '_' . $_extra_name ]
														: null;
													$_extra_keys[] = $__key;
												}
											}

											if ( ! is_null( $_titles_base ) && ! is_null( $_values_base ) && ! is_null( $_prices_base ) ) {
												$t[ $_vid ] = [];
												// backwards combatility.

												foreach ( $properties as $property => $property_value ) {
													if ( is_null( $property_value['base'] ) ) {
														$func = 'clear_array_values';
														if ( 'enabled' === $property ) {
															$func = 'return_false_array_values';
														}
														$properties[ $property ]['base'] = array_map(
															[
																$this,
																$func,
															],
															$_titles_base
														);
													}
													if ( is_null( $property_value['current'] ) ) {
														$properties[ $property ]['current'] = $properties[ $property ]['base'];
													}
												}

												foreach ( $c_prices as $ckey => $cvalue ) {
													if ( is_null( $cvalue ) ) {
														$c_prices[ $ckey ] = $c_prices_base[ $ckey ];
													}
												}

												foreach ( $c_sale_prices as $ckey => $cvalue ) {
													if ( is_null( $cvalue ) ) {
														$c_sale_prices[ $ckey ] = $c_sale_prices_base[ $ckey ];
													}
												}

												foreach ( $_extra_base as $_extra_base_key => $_extra_base_value ) {
													if ( is_null( $_extra_base[ $_extra_base_key ] ) ) {
														$_extra_base[ $_extra_base_key ] = array_map(
															[
																$this,
																'clear_array_values',
															],
															$_titles_base
														);
													}
												}
												foreach ( $_extra as $_extra_key => $_extra_value ) {
													if ( is_null( $_extra_base[ $_extra_key ] ) ) {
														$_extra_base[ $_extra_key ] = array_map(
															[
																$this,
																'clear_array_values',
															],
															$_titles_base
														);
													}
												}

												foreach ( $_titles_base as $option_key => $option_value ) {

													$use_original_builder = false;
													$_option_key          = $option_key;
													if ( isset( $current_builder[ $_elements[ $k0 ] . '_uniqid' ] )
														&& isset( $builder[ $_elements[ $k0 ] . '_uniqid' ] )
														&& isset( $builder[ $_elements[ $k0 ] . '_uniqid' ][ $option_key ] )
													) {
														// get index of element id in internal array.
														$get_current_builder_uniqid_index = array_search( $builder[ $_elements[ $k0 ] . '_uniqid' ][ $option_key ], $current_builder[ $_elements[ $k0 ] . '_uniqid' ], true );
														if ( null !== $get_current_builder_uniqid_index && false !== $get_current_builder_uniqid_index ) {
															$_option_key = $get_current_builder_uniqid_index;
														} else {
															$use_original_builder = true;
														}
													}

													if ( ! isset( $_titles_base[ $_option_key ] ) ) {
														continue;
													}

													foreach ( $properties as $property => $property_value ) {
														$func = 'clear_array_values';
														if ( 'enabled' === $property ) {
															$func = 'return_false_array_values';
														}
														if ( ! isset( $property_value['base'][ $_option_key ] ) ) {
															$properties[ $property ]['base'] = array_map(
																[
																	$this,
																	$func,
																],
																$_titles_base[ $_option_key ]
															);
														}
														if ( ! isset( $property_value['current'][ $_option_key ] ) ) {
															$properties[ $property ]['current'] = array_map(
																[
																	$this,
																	$func,
																],
																$_titles_base[ $_option_key ]
															);
														}
													}

													foreach ( $_extra_base as $_extra_base_key => $_extra_base_value ) {
														if ( ! isset( $_extra_base[ $_extra_base_key ][ $_option_key ] ) ) {
															$_extra_base[ $_extra_base_key ][ $_option_key ] = array_map(
																[
																	$this,
																	'clear_array_values',
																],
																$_titles_base[ $_option_key ]
															);
														}
													}
													foreach ( $_extra as $_extra_key => $_extra_value ) {
														if ( ! isset( $_extra[ $_extra_key ][ $_option_key ] ) ) {
															$_extra[ $_extra_key ][ $_option_key ] = array_map(
																[
																	$this,
																	'clear_array_values',
																],
																$_titles_base[ $_option_key ]
															);
														}
													}

													// backwards compatibility.
													foreach ( $properties['enabled']['base'] as $_extra_key => $_extra_value ) {
														foreach ( $_extra_value as $__key => $__value ) {
															if ( '0' === $__value ) {
																$properties['enabled']['base'][ $_extra_key ][ $__key ] = '';
															}
														}
													}
													foreach ( $properties['enabled']['current'] as $_extra_key => $_extra_value ) {
														foreach ( $_extra_value as $__key => $__value ) {
															if ( '0' === $__value ) {
																$properties['enabled']['current'][ $_extra_key ][ $__key ] = '';
															}
														}
													}
													foreach ( $properties['price_type']['base'] as $_extra_key => $_extra_value ) {
														foreach ( $_extra_value as $__key => $__value ) {
															if ( 'fee' === $__value ) {
																if ( 'checkboxes' === $_elements[ $k0 ] ) {
																	$_fee_base[ $_extra_key ][ $__key ] = '1';
																}

																$properties['price_type']['base'][ $_extra_key ][ $__key ] = '';
															}
														}
													}
													foreach ( $properties['price_type']['current'] as $_extra_key => $_extra_value ) {
														foreach ( $_extra_value as $__key => $__value ) {
															if ( 'fee' === $__value ) {
																if ( 'checkboxes' === $_elements[ $k0 ] ) {
																	$_fee[ $_extra_key ][ $__key ] = '1';
																}

																$properties['price_type']['current'][ $_extra_key ][ $__key ] = '';
															}
														}
													}

													if ( $use_original_builder ) {
														$obvalues = [];
														foreach ( $properties as $property => $property_value ) {
															$obvalues[ $property ] = $property_value['base'][ $_option_key ];
														}
														$obvalues = apply_filters( 'wc_epo_obvalues', $obvalues, $builder, $value, $current_builder, $_titles_base, $_option_key );
														foreach ( $c_prices_base as $ckey => $cvalue ) {
															$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $ckey );
															if ( isset( $cvalue[ $_option_key ] ) ) {
																$obvalues[ 'price' . $mt_prefix ] = $cvalue[ $_option_key ];
															}
														}
														foreach ( $c_sale_prices_base as $ckey => $cvalue ) {
															$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $ckey );
															if ( isset( $cvalue[ $_option_key ] ) ) {
																$obvalues[ 'sale_price' . $mt_prefix ] = $cvalue[ $_option_key ];
															}
														}
														foreach ( $_extra_base as $_extra_base_key => $_extra_base_value ) {
															$obvalues[ $_extra_options[ $_extra_keys[ $_extra_base_key ] ]['name'] ] = $_extra_base_value[ $_option_key ];
														}
														$t[ $_vid ][] = $obvalues;
													} else {
														$cbvalues = [];
														foreach ( $properties as $property => $property_value ) {
															if ( isset( $property_value['current'][ $_option_key ] ) && isset( $property_value['base'][ $_option_key ] ) ) {
																$cbvalues[ $property ] = THEMECOMPLETE_EPO_HELPER()->build_array( $property_value['current'][ $_option_key ], $property_value['base'][ $_option_key ] );
															}
														}
														$cbvalues = apply_filters( 'wc_epo_cbvalues', $cbvalues, $builder, $value, $current_builder, $_titles_base, $_option_key, $option_key );
														foreach ( $c_prices as $ckey => $cvalue ) {
															$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $ckey );
															if ( isset( $cvalue[ $_option_key ] ) ) {
																$cbvalues[ 'price' . $mt_prefix ] = THEMECOMPLETE_EPO_HELPER()->build_array(
																	$cvalue[ $_option_key ],
																	$c_prices_base[ $ckey ][ $option_key ]
																);
															}
														}
														foreach ( $c_sale_prices as $ckey => $cvalue ) {
															$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $ckey );
															if ( isset( $cvalue[ $_option_key ] ) ) {
																$cbvalues[ 'sale_price' . $mt_prefix ] = THEMECOMPLETE_EPO_HELPER()->build_array(
																	$cvalue[ $_option_key ],
																	$c_sale_prices_base[ $ckey ][ $option_key ]
																);
															}
														}
														foreach ( $_extra_base as $_extra_base_key => $_extra_base_value ) {
															$cbvalues[ $_extra_options[ $_extra_keys[ $_extra_base_key ] ]['name'] ] = $_extra_base_value[ $_option_key ];
														}
														$t[ $_vid ][] = $cbvalues;
													}
												}
											}
										}
										if ( ! is_null( $t[ $_vid ] ) && isset( $t[ $_vid ][ $_counter[ $_elements[ $k0 ] ] ] ) ) {

											$value['html'] = [
												[ $this, 'builder_sub_options' ],
												[
													[
														'options'       => $t[ $_vid ][ $_counter[ $_elements[ $k0 ] ] ],
														'name'          => 'multiple_' . $_vid,
														'counter'       => $_counter[ $_elements[ $k0 ] ],
														'default_value' => $_default_value,
													],
												],
											];

										}
									}
								}
								if ( isset( $value['tags']['id'] ) && isset( $value['tags']['name'] ) ) {
									$_name = str_replace( [ '[', ']' ], '', (string) $value['tags']['name'] );
									if ( ! isset( $id_counter[ $_name ] ) ) {
										$id_counter[ $_name ] = 0;
									} else {
										$id_counter[ $_name ] = $id_counter[ $_name ] + 1;
									}
									$value['tags']['id'] = $_name . $id_counter[ $_name ];
								}

								$fields[] = $value;

							}

							$elements_html_array[ $k0 ] = [
								'element'       => $_elements[ $k0 ],
								'width'         => $_div_size[ $k0 ],
								'width_display' => $this->sizer[ $_div_size[ $k0 ] ],
								'internal_name' => $internal_name,
								'fields'        => $fields,
								'label'         => $all_elements[ $_elements[ $k0 ] ]->name,
								'desc'          => $element_desc,
								'icon'          => $all_elements[ $_elements[ $k0 ] ]->icon,
								'is_enabled'    => isset( $builder[ $_elements[ $k0 ] . '_enabled' ][ $_counter[ $_elements[ $k0 ] ] ] ) ? $builder[ $_elements[ $k0 ] . '_enabled' ][ $_counter[ $_elements[ $k0 ] ] ] : '1',
							];
						}
					}
				}

				$this->section_template(
					[
						'section_fields'           => $section_fields,
						'size'                     => $this->sizer[ $_sections_size[ $_s ] ],
						'section_size'             => $_sections_size[ $_s ],
						'sections_slides'          => isset( $_sections_slides[ $_s ] ) ? $_sections_slides[ $_s ] : '',
						'sections_tabs_labels'     => isset( $_sections_tabs_labels[ $_s ] ) ? $_sections_tabs_labels[ $_s ] : '',
						'sections_type'            => $sections_type[ $_s ],
						'elements'                 => $elements_html_array,
						'wpml_is_original_product' => $wpml_is_original_product,
						'sections_internal_name'   => $_sections_internal_name,
					]
				);

				$_helper_counter = intval( $_helper_counter + intval( $_sections[ $_s ] ) );
			}
		}
	}

	/**
	 * Helper to generate html for Image replacement
	 *
	 * @see    builder_sub_variations_options
	 * @since 4.8.5
	 * @param  string $value The image source.
	 * @return void
	 * @access public
	 */
	public function settings_term_variations_image_helper( $value = '' ) {
		if ( '' === $value ) {
			$value = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
		}
		echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the radio button.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span><span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Remove the image.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tm-upload-button-remove cp-button tm-tooltip"><i class="tcfa tcfa-times"></i></span>';
		echo '<span class="tm_upload_image tm_upload_imagep"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $value ) . '" src="' . esc_attr( $value ) . '" /></span>';
	}

	/**
	 * Helper to generate html for Product Image replacement
	 *
	 * @see    builder_sub_variations_options
	 * @since 4.8.5
	 * @param  string $value The image source.
	 * @return void
	 * @access public
	 */
	public function settings_term_variations_imagep_helper( $value = '' ) {
		if ( '' === $value ) {
			$value = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
		}
		echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonp cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span><span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Remove the image.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tm-upload-button-remove cp-button tm-tooltip"><i class="tcfa tcfa-times"></i></span>';
		echo '<span class="tm_upload_image"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $value ) . '" /></span>';
	}

	/**
	 * Generates element sub-options for variations.
	 *
	 * @since 3.0.0
	 * @param  array<mixed> $args Array of arguments.
	 * @return mixed
	 * @access public
	 */
	public function builder_sub_variations_options( $args = [] ) {
		$args = shortcode_atts(
			[
				'meta'       => [],
				'product_id' => 0,
				'return_js'  => false,
			],
			$args
		);

		/**
		 * The data for the variations_options key in the builder
		 *
		 * @var mixed $meta
		 */
		$meta = $args['meta'];
		/**
		 * The product id
		 *
		 * @var mixed $product_id
		 */
		$product_id = $args['product_id'];
		/**
		 * If the $js_object should be returned.
		 *
		 * @var bool $return_js
		 */
		$return_js = $args['return_js'];

		$js_object = [];

		$o     = [];
		$name  = 'tm_builder_variation_options';
		$class = ' withupload';

		$settings_attribute = [
			[
				'id'      => 'variations_display_as',
				'default' => 'select',
				'type'    => 'select',
				'tags'    => [
					'class' => 'variations-display-as',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'options' => [
					[
						'text'  => esc_html__( 'Select boxes', 'woocommerce-tm-extra-product-options' ),
						'value' => 'select',
					],
					[
						'text'  => esc_html__( 'Radio buttons', 'woocommerce-tm-extra-product-options' ),
						'value' => 'radio',
					],
					[
						'text'  => esc_html__( 'Radio buttons and image at start of the label', 'woocommerce-tm-extra-product-options' ),
						'value' => 'radiostart',
					],
					[
						'text'  => esc_html__( 'Radio buttons and image at end of the label', 'woocommerce-tm-extra-product-options' ),
						'value' => 'radioend',
					],
					[
						'text'  => esc_html__( 'Image swatches', 'woocommerce-tm-extra-product-options' ),
						'value' => 'image',
					],
					[
						'text'  => esc_html__( 'Color swatches', 'woocommerce-tm-extra-product-options' ),
						'value' => 'color',
					],
					[
						'text'  => esc_html__( 'Text swatches', 'woocommerce-tm-extra-product-options' ),
						'value' => 'text',
					],
				],
				'label'   => esc_html__( 'Display as', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the display type of this attribute.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'      => 'variations_label',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
					'value' => '',
				],
				'label'   => esc_html__( 'Attribute Label', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Leave blank to use the original attribute label.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_show_reset_button',
				'message0x0_class' => 'tma-hide-for-select-box',
				'default'          => '',
				'type'             => 'select',
				'tags'             => [
					'id'   => 'builder_%id%',
					'name' => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'options'          => [
					[
						'text'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
						'value' => '',
					],
					[
						'text'  => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
						'value' => 'yes',
					],
				],
				'label'            => esc_html__( 'Show reset button', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Enables the display of a reset button for this attribute.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'      => 'variations_class',
				'default' => '',
				'type'    => 'text',
				'tags'    => [
					'class' => 't',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
					'value' => '',
				],
				'label'   => esc_html__( 'Attribute element class name', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter an extra class name to add to this attribute element', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_items_per_row',
				'message0x0_class' => 'tma-hide-for-select-box',
				'default'          => '',
				'type'             => 'number',
				'extra'            => [ [ $this, 'add_setting_items_per_row_helper' ], [] ],
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
					'value' => '',
				],
				'label'            => esc_html__( 'Items per row (Desktops and laptops)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],

			// @media only screen and (min-device-width : 768px) and (max-device-width : 1024px) {
			[
				'id'               => 'variations_items_per_row_tablets',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (Tablets landscape)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width : 481px) and (max-device-width : 767px) {
			[
				'id'               => 'variations_items_per_row_tablets_small',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (Tablets portrait)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width : 320px) and (max-device-width : 480px) {
			[
				'id'               => 'variations_items_per_row_smartphones',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (Smartphones)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2) {
			[
				'id'               => 'variations_items_per_row_iphone5',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (iPhone 5)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2) {
			[
				'id'               => 'variations_items_per_row_iphone6',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (iPhone 6)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 2) {
			[
				'id'               => 'variations_items_per_row_iphone6_plus',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (iPhone 6 +)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (device-width: 320px) and (device-height: 640px) and (-webkit-min-device-pixel-ratio: 2) {
			[
				'id'               => 'variations_items_per_row_samsung_galaxy',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (Samnsung Galaxy)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			// @media only screen and (min-device-width : 800px) and (max-device-width : 1280px) {
			[
				'id'               => 'variations_items_per_row_tablets_galaxy',
				'message0x0_class' => 'builder_responsive_div tc-hidden',
				'wpmldisable'      => 1,
				'default'          => '',
				'type'             => 'number',
				'tags'             => [
					'class' => 'n',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'label'            => esc_html__( 'Items per row (Galaxy Tablets landscape)', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Use this field to make a grid display. Enter how many items per row for the grid or leave blank for normal display.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_item_width',
				'message0x0_class' => 'tma-show-for-swatches tma-hide-for-select-box',
				'default'          => '',
				'type'             => 'text',
				'tags'             => [
					'class' => 't',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
					'value' => '',
				],
				'label'            => esc_html__( 'Width', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Enter the width of the displayed item or leave blank for auto width.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_item_height',
				'message0x0_class' => 'tma-show-for-swatches tma-hide-for-select-box',
				'default'          => '',
				'type'             => 'text',
				'tags'             => [
					'class' => 't',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
					'value' => '',
				],
				'label'            => esc_html__( 'Height', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Enter the height of the displayed item or leave blank for auto height.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'      => 'variations_changes_product_image',
				'default' => '',
				'type'    => 'select',
				'tags'    => [
					'class' => 'tm-changes-product-image',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'options' => [
					[
						'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
						'value' => '',
					],
					[
						'text'  => esc_html__( 'Use the image replacements', 'woocommerce-tm-extra-product-options' ),
						'value' => 'images',
					],
					[
						'text'  => esc_html__( 'Use custom image', 'woocommerce-tm-extra-product-options' ),
						'value' => 'custom',
					],
				],
				'label'   => esc_html__( 'Changes product image', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose whether to change the product image.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_show_name',
				'message0x0_class' => 'tma-show-for-swatches',
				'default'          => 'hide',
				'type'             => 'select',
				'tags'             => [
					'class' => 'variations-show-name',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][%id%]',
				],
				'options'          => [
					[
						'text'  => esc_html__( 'Hide', 'woocommerce-tm-extra-product-options' ),
						'value' => 'hide',
					],
					[
						'text'  => esc_html__( 'Show', 'woocommerce-tm-extra-product-options' ),
						'value' => 'bottom',
					],
					[
						'text'  => esc_html__( 'Tooltip', 'woocommerce-tm-extra-product-options' ),
						'value' => 'tooltip',
					],
				],
				'label'            => esc_html__( 'Show attribute name', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Choose whether to show or hide the attribute name.', 'woocommerce-tm-extra-product-options' ),
			],
		];

		$settings_term = [
			[
				'id'               => 'variations_color',
				'message0x0_class' => 'tma-term-color',
				'default'          => '',
				'type'             => 'text',
				'tags'             => [
					'class' => 'tm-color-picker',
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][[%id%]][%term_id%]',
					'value' => '',
				],
				'label'            => esc_html__( 'Color', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Select the color to use.', 'woocommerce-tm-extra-product-options' ),
			],
			[
				'id'               => 'variations_image',
				'message0x0_class' => 'tma-term-image',
				'default'          => '',
				'type'             => 'hidden',
				'tags'             => [
					'class' => 'n tm_option_image' . $class,
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][[%id%]][%term_id%]',
				],
				'label'            => esc_html__( 'Image replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Select an image for this term.', 'woocommerce-tm-extra-product-options' ),
				'extra'            => [ [ $this, 'settings_term_variations_image_helper' ], [] ],
				'method'           => 'settings_term_variations_image_helper',
			],
			[
				'id'               => 'variations_imagep',
				'message0x0_class' => 'tma-term-custom-image',
				'default'          => '',
				'type'             => 'hidden',
				'tags'             => [
					'class' => 'n tm_option_image tm_option_imagep' . $class,
					'id'    => 'builder_%id%',
					'name'  => 'tm_meta[tmfbuilder][variations_options][%attribute_id%][[%id%]][%term_id%]',
				],
				'label'            => esc_html__( 'Product Image replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'             => esc_html__( 'Select the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ),
				'extra'            => [ [ $this, 'settings_term_variations_imagep_helper' ], [] ],
				'method'           => 'settings_term_variations_imagep_helper',
			],

		];

		$attributes = [];

		if ( ! empty( $product_id ) ) {
			$product = wc_get_product( $product_id );

			if ( $product && is_object( $product ) && is_callable( [ $product, 'get_variation_attributes' ] ) ) {
				$attributes     = $product->get_variation_attributes();
				$all_attributes = $product->get_attributes();
				if ( $attributes ) {
					foreach ( $attributes as $key => $value ) {
						if ( ! $value ) {
							$attributes[ $key ] = array_map( 'trim', explode( '|', $all_attributes[ $key ]['value'] ) );
						}
					}
				}
			}
		}

		if ( empty( $return_js ) ) {
			if ( empty( $attributes ) ) {
				echo '<div class="errortitle"><p><i class="tcfa tcfa-exclamation-triangle"></i> ' . esc_html__( 'No saved variations found.', 'woocommerce-tm-extra-product-options' ) . '</p></div>';
			}
		}
		$d_counter = 0;
		foreach ( $attributes as $name => $options ) {
			$js_object[ $d_counter ] = [];
			if ( empty( $return_js ) ) {
				echo '<div class="tma-handle-wrap tm-attribute">'
					. '<div class="tma-handle"><div class="tma-attribute_label">'
					. esc_html( wc_attribute_label( $name ) )
					. '</div><div class="tmicon tcfa fold tcfa-caret-up"></div></div>'
					. '<div class="tma-handle-wrapper tm-hidden">'
					. '<div class="tma-attribute w100">';
			}

			$attribute_id = sanitize_title( $name );
			foreach ( $settings_attribute as $setting ) {
				$setting['tags']['id']   = str_replace( '%id%', $setting['id'], $setting['tags']['id'] );
				$setting['tags']['name'] = str_replace( '%id%', $setting['id'], $setting['tags']['name'] );
				$setting['tags']['name'] = str_replace( '%attribute_id%', $attribute_id, $setting['tags']['name'] );
				if ( ! empty( $meta )
					&& isset( $meta[ $attribute_id ] )
					&& isset( $meta[ $attribute_id ][ $setting['id'] ] )
				) {
					$setting['default'] = $meta[ $attribute_id ][ $setting['id'] ];
					if ( 'variations_show_name' === $setting['id'] && 'inside' === $setting['default'] ) {
						$setting['default'] = 'bottom';
					}
				}
				if ( empty( $return_js ) ) {
					THEMECOMPLETE_EPO_HTML()->create_field( $setting, 1 );
				} else {
					$js_object[ $d_counter ][] = $this->remove_for_js( $setting );
				}
			}

			if ( is_array( $options ) ) {
				$taxonomy_name = rawurldecode( sanitize_title( $name ) );
				if ( taxonomy_exists( $taxonomy_name ) ) {

					if ( function_exists( 'wc_get_product_terms' ) ) {
						$terms = wc_get_product_terms( $product_id, $name, [ 'fields' => 'all' ] );
					} else {

						$orderby   = wc_attribute_orderby( $taxonomy_name );
						$term_args = [
							'taxonomy'   => $taxonomy_name,
							'hide_empty' => false,
						];
						switch ( $orderby ) {
							case 'name':
								$term_args['orderby']    = 'name';
								$term_args['menu_order'] = false;
								break;
							case 'id':
								$term_args['orderby']    = 'id';
								$term_args['order']      = 'ASC';
								$term_args['menu_order'] = false;
								break;
							case 'menu_order':
								$term_args['menu_order'] = 'ASC';
								break;
						}
						$terms = get_terms( $term_args );
					}
					if ( ! empty( $terms ) && is_array( $terms ) ) {

						foreach ( $terms as $term ) {
							// Get only selected terms.
							$has_term = has_term( intval( $term->term_id ), $taxonomy_name, $product_id );
							if ( ! $has_term ) {
								continue;
							}
							$term_name = THEMECOMPLETE_EPO_HELPER()->entity_decode( $term->name );
							$term_id   = THEMECOMPLETE_EPO_HELPER()->sanitize_key( $term->slug );

							if ( empty( $return_js ) ) {
								echo '<div class="tma-handle-wrap tm-term">'
									. '<div class="tma-handle"><div class="tma-attribute_label">'
									. esc_html( apply_filters( 'woocommerce_variation_option_name', $term_name ) )
									. '</div><div class="tmicon tcfa fold tcfa-caret-up"></div></div>'
									. '<div class="tma-handle-wrapper tm-hidden">'
									. '<div class="tma-attribute w100">';
							}

							foreach ( $settings_term as $setting ) {
								$setting['tags']['id']   = str_replace( '%id%', $setting['id'], $setting['tags']['id'] );
								$setting['tags']['name'] = str_replace( '%id%', $setting['id'], $setting['tags']['name'] );
								$setting['tags']['name'] = str_replace( '%attribute_id%', sanitize_title( THEMECOMPLETE_EPO_HELPER()->sanitize_key( $name ) ), $setting['tags']['name'] );
								$setting['tags']['name'] = str_replace( '%term_id%', esc_attr( $term_id ), $setting['tags']['name'] );

								if ( ! empty( $meta )
									&& isset( $meta[ $attribute_id ] )
									&& isset( $meta[ $attribute_id ][ $setting['id'] ] )
									&& isset( $meta[ $attribute_id ][ $setting['id'] ][ $term_id ] )
								) {
									$setting['default'] = $meta[ $attribute_id ][ $setting['id'] ][ $term_id ];
									if ( isset( $setting['method'] ) ) {
										$setting['extra'] = [
											[ $this, $setting['method'] ],
											[ $meta[ $attribute_id ][ $setting['id'] ][ $term_id ] ],
										];
									}
								}
								if ( empty( $return_js ) ) {
									THEMECOMPLETE_EPO_HTML()->create_field( $setting, 1 );
								} else {
									$js_object[ $d_counter ][] = $this->remove_for_js( $setting );
								}
							}
							if ( empty( $return_js ) ) {
								echo '</div></div></div>';
							}
						}
					}
				} else {

					foreach ( $options as $option ) {
						$optiont = rawurldecode( THEMECOMPLETE_EPO_HELPER()->entity_decode( $option ) );
						$option  = THEMECOMPLETE_EPO_HELPER()->entity_decode( THEMECOMPLETE_EPO_HELPER()->sanitize_key( $option ) );
						if ( empty( $return_js ) ) {
							echo '<div class="tma-handle-wrap tm-term">'
								. '<div class="tma-handle"><div class="tma-attribute_label">'
								. esc_html( apply_filters( 'woocommerce_variation_option_name', $optiont ) )
								. '</div><div class="tmicon tcfa fold tcfa-caret-up"></div></div>'
								. '<div class="tma-handle-wrapper tm-hidden">'
								. '<div class="tma-attribute w100">';
						}

						foreach ( $settings_term as $setting ) {
							$setting['tags']['id']   = str_replace( '%id%', $setting['id'], $setting['tags']['id'] );
							$setting['tags']['name'] = str_replace( '%id%', $setting['id'], $setting['tags']['name'] );
							$setting['tags']['name'] = str_replace( '%attribute_id%', sanitize_title( THEMECOMPLETE_EPO_HELPER()->sanitize_key( $name ) ), $setting['tags']['name'] );
							$setting['tags']['name'] = str_replace( '%term_id%', esc_attr( $option ), $setting['tags']['name'] );

							if ( ! empty( $meta )
								&& isset( $meta[ $attribute_id ] )
								&& isset( $meta[ $attribute_id ][ $setting['id'] ] )
								&& isset( $meta[ $attribute_id ][ $setting['id'] ][ $option ] )
							) {
								$setting['default'] = $meta[ $attribute_id ][ $setting['id'] ][ $option ];
								if ( isset( $setting['method'] ) ) {
									$setting['extra'] = [
										[ $this, $setting['method'] ],
										[ $meta[ $attribute_id ][ $setting['id'] ][ $option ] ],
									];

								}
							}
							if ( empty( $return_js ) ) {
								THEMECOMPLETE_EPO_HTML()->create_field( $setting, 1 );
							} else {
								$js_object[ $d_counter ][] = $this->remove_for_js( $setting );
							}
						}
						if ( empty( $return_js ) ) {
							echo '</div></div></div>';
						}
					}
				}
			}
			if ( empty( $return_js ) ) {
				echo '</div></div></div>';
			}
			++$d_counter;
		}

		if ( ! empty( $return_js ) ) {
			return $js_object;
		}
	}

	/**
	 * Helper to print the upload button for Image replacement
	 *
	 * @param string $name Element name.
	 * @return void
	 * @see    builder_sub_options_image_helper
	 * @since 4.8.5
	 * @access public
	 */
	public function get_builder_sub_options_upload_helper( $name = '' ) {
		if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
			if ( 'multiple_radiobuttons_options' === $name ) {
				echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the radio button.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			} elseif ( 'multiple_checkboxes_options' === $name ) {
				echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the checkbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			}
		}
	}

	/**
	 * Helper to generate html for Image replacement
	 *
	 * @see    builder_sub_options
	 * @since 4.8.5
	 * @param string       $name Element name.
	 * @param string|false $image Image to output.
	 * @return void
	 * @access public
	 */
	public function builder_sub_options_image_helper( $name = '', $image = false ) {
		$this->get_builder_sub_options_upload_helper( $name );

		if ( false !== $image ) {
			if ( '' === $image ) {
				$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
			}
			echo '<span class="s tm_upload_image"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $image ) . '" /><button rel="tc-option-image" class="tc-button small builder-image-delete" type="button"><i class="tcfa tcfa-times"></i></button></span>';
		}
	}

	/**
	 * Helper to print the upload button for checked Image replacement
	 *
	 * @see    builder_sub_options_imagec_helper
	 * @since 4.8.5
	 * @param string $name Element name.
	 * @return void
	 * @access public
	 */
	public function get_builder_sub_options_uploadc_helper( $name = '' ) {
		if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
			if ( 'multiple_radiobuttons_options' === $name ) {
				echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the radio button when it is checked.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			} elseif ( 'multiple_checkboxes_options' === $name ) {
				echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the checkbox when it is checked.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			}
		}
	}

	/**
	 * Helper to generate html for checked Image replacement
	 *
	 * @see    builder_sub_options
	 * @since 4.8.5
	 * @param string       $name Element name.
	 * @param string|false $image Image to output.
	 * @return void
	 * @access public
	 */
	public function builder_sub_options_imagec_helper( $name = '', $image = false ) {
		$this->get_builder_sub_options_uploadc_helper( $name );

		if ( false !== $image ) {
			if ( '' === $image ) {
				$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
			}
			echo '<span class="tm_upload_image tm_upload_imagec"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $image ) . '" /><button rel="tc-option-imagec" class="tc-button small builder-image-delete" type="button"><i class="tcfa tcfa-times"></i></button></span>';
		}
	}

	/**
	 * Helper to print the upload button for Product Image replacement
	 *
	 * @see    builder_sub_options_imagep_helper
	 * @since 4.8.5
	 * @param string $name Element name.
	 * @return void
	 * @access public
	 */
	public function get_builder_sub_options_uploadp_helper( $name = '' ) {
		if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
			echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonp cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
		} elseif ( 'multiple_selectbox_options' === $name ) {
			echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonp cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
		}
	}

	/**
	 * Helper to generate html for Product Image replacement
	 *
	 * @see    builder_sub_options
	 * @since 4.8.5
	 * @param string       $name Element name.
	 * @param string|false $image Image to output.
	 * @return void
	 * @access public
	 */
	public function builder_sub_options_imagep_helper( $name = '', $image = false ) {
		$this->get_builder_sub_options_uploadp_helper( $name );

		if ( false !== $image ) {
			if ( '' === $image ) {
				$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
			}
			echo '<span class="tm_upload_image tm_upload_imagep"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $image ) . '" /><button rel="tc-option-imagep" class="tc-button small builder-image-delete" type="button"><i class="tcfa tcfa-times"></i></button></span>';
		}
	}

	/**
	 * Helper to print the upload button for Lightbox Image
	 *
	 * @see    builder_sub_options_imagel_helper
	 * @since 4.8.5
	 * @param string $name Element name.
	 * @return void
	 * @access public
	 */
	public function get_builder_sub_options_uploadl_helper( $name = '' ) {
		if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
			echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image for the lightbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonl cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
		} elseif ( 'multiple_selectbox_options' === $name ) {
			echo '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image for the lightbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonl cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
		}
	}

	/**
	 * Helper to generate html for Lightbox Image
	 *
	 * @see    builder_sub_options
	 * @since 4.8.5
	 * @param string       $name Element name.
	 * @param string|false $image Image to output.
	 * @return void
	 * @access public
	 */
	public function builder_sub_options_imagel_helper( $name = '', $image = false ) {
		$this->get_builder_sub_options_uploadl_helper( $name );

		if ( false !== $image ) {
			if ( '' === $image ) {
				$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
			}
			echo '<span class="tm_upload_image tm_upload_imagel"><img class="tm_upload_image_img" alt="&nbsp;" src="' . esc_attr( $image ) . '" /><button rel="tc-option-imagel" class="tc-button small builder-image-delete" type="button"><i class="tcfa tcfa-times"></i></button></span>';
		}
	}

	/**
	 * Remove problematic array keys for js output
	 *
	 * @since 4.9.12
	 * @param array<mixed> $setting Array of arguments.
	 * @return array<mixed>
	 * @access public
	 */
	public function remove_for_js( $setting = [] ) {
		unset( $setting['extra'] );

		if ( isset( $setting['type'] ) && 'checkbox' === $setting['type'] ) {
			$setting['checked'] = '' !== checked( ( $setting['default'] === $setting['tags']['value'] ), true, false );
		}

		return $setting;
	}

	/**
	 * Generates element sub-options for selectbox, checkbox and radio buttons.
	 *
	 * @since 1.0.0
	 * @param array<mixed> $args Array of arguments.
	 * @return mixed
	 * @access public
	 */
	public function builder_sub_options( $args = [] ) {
		$args = shortcode_atts(
			[
				'options'       => [],
				'name'          => 'multiple_selectbox_options',
				'counter'       => null,
				'default_value' => null,
				'return_js'     => false,
			],
			$args
		);

		/**
		 * The current option set
		 *
		 * @var mixed $options
		 */
		$options = $args['options'];
		/**
		 * The element type name
		 *
		 * @var mixed $name
		 */
		$name = $args['name'];
		/**
		 * The element type
		 *
		 * @var mixed $type
		 */
		$type = str_replace( [ 'multiple_', '_options' ], '', $name );
		/**
		 * The choice counter
		 *
		 * @var mixed $counter
		 */
		$counter = $args['counter'];
		/**
		 * The default value
		 *
		 * @var mixed $default_value
		 */
		$default_value = $args['default_value'];
		/**
		 * If the $js_object should be returned.
		 *
		 * @var bool $return_js
		 */
		$return_js = $args['return_js'];

		$js_object = [];

		$o                     = [];
		$upload                = '';
		$uploadc               = '';
		$uploadp               = '';
		$uploadl               = '';
		$class                 = '';
		$_extra_options        = THEMECOMPLETE_EPO_BUILDER()->extra_multiple_options;
		$additional_currencies = THEMECOMPLETE_EPO_HELPER()->get_additional_currencies();

		$price_type_options = [
			[
				'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'value' => '',
			],
			[
				'text'  => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percent',
			],
			[
				'text'  => esc_html__( 'Percent of the original price + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'percentcurrenttotal',
			],
			[
				'text'  => esc_html__( 'Math formula', 'woocommerce-tm-extra-product-options' ),
				'value' => 'math',
			],
			[
				'text'  => esc_html__( 'Fixed amount + options', 'woocommerce-tm-extra-product-options' ),
				'value' => 'fixedcurrenttotal',
			],
		];

		if ( 'multiple_selectboxmultiple_options' === $name ) {
			unset( $price_type_options[2] );
			unset( $price_type_options[4] );
			sort( $price_type_options );
		}

		if ( ! $options ) {
			$options = [];
			foreach ( $this->multiple_properties as $property ) {
				$property_value = [];
				if ( 'title' === $property ) {
					$property_value = [ false ];
				}
				$options[ $property ] = $property_value;
			}
			foreach ( $_extra_options as $__key => $__name ) {
				if ( ( is_array( $__name['type'] ) && in_array( $type, $__name['type'], true ) ) || $__name['type'] === $type ) {
					$options[ $__name['name'] ] = [ '' ];
				}
			}
		}

		foreach ( $this->multiple_properties as $property ) {
			if ( ! isset( $options[ $property ] ) ) {
				$options[ $property ] = [];
			}
		}

		if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
			if ( 'multiple_radiobuttons_options' === $name ) {
				$upload  = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the radio button.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
				$uploadc = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the radio button when it is checked.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			} elseif ( 'multiple_checkboxes_options' === $name ) {
				$upload  = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the checkbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
				$uploadc = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to use in place of the checkbox when it is checked.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			}
			$uploadp = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonp cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			$uploadl = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image for the lightbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonl cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			$class   = ' withupload';
		}
		if ( 'multiple_selectbox_options' === $name ) {
			$uploadp = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image to replace the product image with.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonp cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			$uploadl = '&nbsp;<span data-tm-tooltip-html="' . esc_attr( esc_html__( 'Choose the image for the lightbox.', 'woocommerce-tm-extra-product-options' ) ) . '" class="tc-upload-button tc-upload-buttonl cp_button tm-tooltip"><i class="tcfa tcfa-upload"></i></span>';
			$class   = ' withupload';
		}

		foreach ( $options as $property => $property_value ) {
			$o[ $property ] = [
				'id'      => $name . '_' . $property,
				'default' => '',
				'nodiv'   => 1,
				'tags'    => [
					'id'   => $name . '_' . $property,
					'name' => $name . '_' . $property,
				],
			];
		}

		$o['title']['type'] = 'text';
		$o['title']['tags'] = [
			'class' => 't tm_option_title',
			'value' => '',
		];

		$o['value']['type'] = 'text';
		$o['value']['tags'] = [
			'class' => 't tm_option_value',
			'value' => '',
		];

		$o['price']['type'] = 'text';
		$o['price']['tags'] = [
			'class' => 't tm_option_price',
			'value' => '',
		];

		$o['sale_price']['type'] = 'text';
		$o['sale_price']['tags'] = [
			'class' => 't tm_option_sale_price',
			'value' => '',
		];

		$o['image']['type']   = 'hidden';
		$o['image']['tags']   = [
			'class' => 't tm_option_image tc-option-image' . $class,
			'value' => '',
		];
		$o['image']['extra']  = [ [ $this, 'builder_sub_options_image_helper' ], [ $name ] ];
		$o['image']['method'] = 'builder_sub_options_image_helper';

		$o['imagec']['type'] = 'hidden';
		$o['imagec']['tags'] = [
			'class' => 't tm_option_image tm_option_imagec tc-option-imagec' . $class,
			'value' => '',
		];

		$o['imagep']['type'] = 'hidden';
		$o['imagep']['tags'] = [
			'class' => 't tm_option_image tm_option_imagep tc-option-imagep' . $class,
			'value' => '',
		];

		$o['imagel']['type'] = 'hidden';
		$o['imagel']['tags'] = [
			'class' => 't tm_option_image tm_option_imagel tc-option-imagel' . $class,
			'value' => '',
		];

		$o['price_type']['type']    = 'select';
		$o['price_type']['options'] = $price_type_options;
		$o['price_type']['tags']    = [
			'class' => 't tm_option_price_type ' . $name,
		];

		$o['url']['type'] = 'text';
		$o['url']['tags'] = [
			'class' => 't tm_option_url',
			'value' => '',
		];

		$o['description']['type'] = 'text';
		$o['description']['tags'] = [
			'class' => 't tm_option_description',
			'value' => '',
		];

		$o['enabled']['type']    = 'checkbox';
		$o['enabled']['default'] = '1';
		$o['enabled']['tags']    = [
			'class' => 'c tm_option_enabled ' . $name,
			'value' => '1',
		];

		$o['color']['type'] = 'text';
		$o['color']['tags'] = [
			'class' => 'tm-color-picker',
			'value' => '',
		];

		$o['fee']['type'] = 'checkbox';
		$o['fee']['tags'] = [
			'class' => 'c',
			'value' => '1',
		];

		foreach ( $_extra_options as $__key => $__name ) {
			$_extra_name = $__name['name'];
			if ( ( is_array( $__name['type'] ) && in_array( $type, $__name['type'], true ) ) || $__name['type'] === $type ) {
				$o[ $_extra_name ]          = $__name['field'];
				$o[ $_extra_name ]['id']    = $name . '_' . $_extra_name;
				$o[ $_extra_name ]['nodiv'] = 1;
				$o[ $_extra_name ]['tags']  = array_merge(
					$__name['field']['tags'],
					[
						'id'   => $name . '_' . $_extra_name,
						'name' => $name . '_' . $_extra_name,
					]
				);
			}
		}

		$o          = apply_filters( 'wc_epo_builder_after_multiple_element_array', $o, $name );
		$original_o = $o;

		if ( empty( $return_js ) ) {
			echo "<div class='tc-row nopadding multiple_options tc-clearfix'>"
				. "<div class='tc-cell tc-col-auto tm_cell_move'>";

			THEMECOMPLETE_EPO_HTML()->create_button(
				[
					'text' => '',
					'tags' => [
						'href'  => '#move',
						'class' => 'tmicon tcfa tcfa-grip-vertical tm-hidden-inline',
					],
				],
				1
			);
			THEMECOMPLETE_EPO_HTML()->create_button(
				[
					'text' => '',
					'icon' => 'angle-up',
					'tags' => [
						'href'  => '#move',
						'class' => 'tc tc-button small tm-hidden-inline',
					],
				],
				1
			);
			THEMECOMPLETE_EPO_HTML()->create_button(
				[
					'text' => '',
					'icon' => 'angle-down',
					'tags' => [
						'href'  => '#move',
						'class' => 'tc tc-button small tm-hidden-inline',
					],
				],
				1
			);

			echo '</div>'
				. "<div class='tc-cell tc-col-auto tm_cell_delete'><button type='button' class='tc tc-button builder_panel_delete_all'>" . esc_html__( 'Delete all options', 'woocommerce-tm-extra-product-options' ) . '</button></div>'
				. '</div>';
		}
		$total_entries = count( $options['title'] );
		$per_page      = apply_filters( 'tm_choices_shown', 20 );
		if ( $per_page <= 0 ) {
			$per_page = 20;
		}
		if ( $total_entries > $per_page ) {
			$pages = ceil( $total_entries / $per_page );
			if ( empty( $return_js ) ) {
				echo '<div data-perpage="' . esc_attr( (string) $per_page ) . '" data-totalpages="' . esc_attr( (string) $pages ) . '" class="tcpagination tc-clearfix"></div>';
			}
		} elseif ( empty( $return_js ) ) {
			echo '<div data-perpage="' . esc_attr( (string) $per_page ) . '" data-totalpages="0" class="tcpagination tc-clearfix"></div>';
		}
		if ( empty( $return_js ) ) {
			echo "<div class='panels_wrap nof_wrapper'>";
		}

		$d_counter    = 0;
		$show_counter = 0;
		foreach ( $options['title'] as $ar => $el ) {
			$js_object[ $d_counter ] = [];
			$hidden_class            = '';
			if ( $show_counter >= $per_page ) {
				$hidden_class = ' tm-hidden ';
			}
			++$show_counter;

			if ( ! is_array( $options['title'] ) ) {
				$options['title'] = [];
			}
			if ( ! is_array( $options['value'] ) ) {
				$options['value'] = [];
			}
			if ( ! is_array( $options['price'] ) ) {
				$options['price'] = [];
			}
			if ( ! is_array( $options['sale_price'] ) ) {
				$options['sale_price'] = [];
			}
			if ( ! is_array( $options['image'] ) ) {
				$options['image'] = [];
			}
			if ( ! is_array( $options['imagec'] ) ) {
				$options['imagec'] = [];
			}
			if ( ! is_array( $options['imagep'] ) ) {
				$options['imagep'] = [];
			}
			if ( ! is_array( $options['imagel'] ) ) {
				$options['imagel'] = [];
			}
			if ( ! is_array( $options['price_type'] ) ) {
				$options['price_type'] = [];
			}
			if ( ! is_array( $options['url'] ) ) {
				$options['url'] = [];
			}
			if ( ! is_array( $options['description'] ) ) {
				$options['description'] = [];
			}
			if ( ! is_array( $options['enabled'] ) ) {
				$options['enabled'] = [];
			}
			if ( ! is_array( $options['color'] ) ) {
				$options['color'] = [];
			}
			if ( ! is_array( $options['fee'] ) ) {
				$options['fee'] = [];
			}

			if ( false === $options['title'][ $ar ] ) {
				$options['title'][ $ar ] = $original_o['title']['default'];
			}
			if ( ! isset( $options['value'][ $ar ] ) ) {
				$options['value'][ $ar ] = $original_o['value']['default'];
			}
			if ( ! isset( $options['price'][ $ar ] ) ) {
				$options['price'][ $ar ] = $original_o['price']['default'];
			}
			if ( ! isset( $options['sale_price'][ $ar ] ) ) {
				$options['sale_price'][ $ar ] = $original_o['sale_price']['default'];
			}
			if ( ! isset( $options['image'][ $ar ] ) ) {
				$options['image'][ $ar ] = $original_o['image']['default'];
			}
			if ( ! isset( $options['imagec'][ $ar ] ) ) {
				$options['imagec'][ $ar ] = $original_o['imagec']['default'];
			}
			if ( ! isset( $options['imagep'][ $ar ] ) ) {
				$options['imagep'][ $ar ] = $original_o['imagep']['default'];
			}
			if ( ! isset( $options['imagel'][ $ar ] ) ) {
				$options['imagel'][ $ar ] = $original_o['imagel']['default'];
			}
			if ( ! isset( $options['price_type'][ $ar ] ) ) {
				$options['price_type'][ $ar ] = $original_o['price_type']['default'];
			}
			if ( ! isset( $options['url'][ $ar ] ) ) {
				$options['url'][ $ar ] = $original_o['url']['default'];
			}
			if ( ! isset( $options['description'][ $ar ] ) ) {
				$options['description'][ $ar ] = $original_o['description']['default'];
			}

			// backwards compatibility.
			if ( ! isset( $options['enabled'][ $ar ] ) || false === $options['enabled'][ $ar ] ) {
				$options['enabled'][ $ar ] = $original_o['enabled']['default'];
			}
			if ( '0' === $options['enabled'][ $ar ] || '' === $options['enabled'][ $ar ] ) {
				$options['enabled'][ $ar ] = '';
			}

			if ( ! isset( $options['color'][ $ar ] ) ) {
				$options['color'][ $ar ] = $original_o['color']['default'];
			}
			if ( ! isset( $options['fee'][ $ar ] ) ) {
				$options['fee'][ $ar ] = $original_o['fee']['default'];
			}
			foreach ( $_extra_options as $__key => $__name ) {
				if ( ( is_array( $__name['type'] ) && in_array( $type, $__name['type'], true ) ) || $__name['type'] === $type ) {
					$_extra_name = $__name['name'];
					if ( ! isset( $options[ $_extra_name ][ $ar ] ) ) {
						if ( isset( $original_o[ $_extra_name ]['default'] ) ) {
							$options[ $_extra_name ][ $ar ] = $original_o[ $_extra_name ]['default'];
						} else {
							$options[ $_extra_name ][ $ar ] = '';
						}
					}
				}
			}

			$options = apply_filters( 'wc_epo_builder_element_array_in_loop_before', $options, $o, $ar, $name, $counter );

			foreach ( $o as $o_property => $o_value ) {
				if ( isset( $options[ $o_property ] ) ) {
					$o[ $o_property ]['default']      = $options[ $o_property ][ $ar ];
					$o[ $o_property ]['tags']['name'] = 'tm_meta[tmfbuilder][' . $name . '_' . $o_property . '][' . ( is_null( $counter ) ? 0 : $counter ) . '][]';
					$o[ $o_property ]['tags']['id']   = str_replace( [ '[', ']' ], '', $o[ $o_property ]['tags']['name'] ) . '_' . $ar;
				}
			}
			$o['image']['extra']  = [
				[ $this, 'builder_sub_options_image_helper' ],
				[ $name, $options['image'][ $ar ] ],
			];
			$o['imagec']['extra'] = [
				[ $this, 'builder_sub_options_imagec_helper' ],
				[ $name, $options['imagec'][ $ar ] ],
			];
			$o['imagep']['extra'] = [
				[ $this, 'builder_sub_options_imagep_helper' ],
				[ $name, $options['imagep'][ $ar ] ],
			];
			$o['imagel']['extra'] = [
				[ $this, 'builder_sub_options_imagel_helper' ],
				[ $name, $options['imagel'][ $ar ] ],
			];

			foreach ( $_extra_options as $__key => $__name ) {
				if ( ( is_array( $__name['type'] ) && in_array( $type, $__name['type'], true ) ) || $__name['type'] === $type ) {
					$_extra_name                       = $__name['name'];
					$o[ $_extra_name ]['default']      = $options[ $_extra_name ][ $ar ];
					$o[ $_extra_name ]['tags']['name'] = 'tm_meta[tmfbuilder][' . $name . '_' . $_extra_name . '][' . ( is_null( $counter ) ? 0 : $counter ) . '][]';
					$o[ $_extra_name ]['tags']['id']   = str_replace(
						[
							'[',
							']',
						],
						'',
						$o[ $_extra_name ]['tags']['name']
					) . '_' . $ar;
					if ( isset( $o[ $_extra_name ]['admin_class'] ) ) {
						$o[ $_extra_name ]['admin_class'] = 'tc-extra-option ' . $o[ $_extra_name ]['admin_class'];
					} else {
						$o[ $_extra_name ]['admin_class'] = 'tc-extra-option';
					}
				}
			}

			$o = apply_filters( 'wc_epo_builder_element_array_in_loop_after', $o, $options, $ar, $name, $counter );

			$is_enabled = '' === $o['enabled']['default'] ? ' choice-is-disabled' : '';
			if ( empty( $return_js ) ) {
				echo '<div class="options-wrap' . esc_attr( $hidden_class ) . esc_attr( $is_enabled ) . '"><div class="tc-row nopadding tc-clearfix">';

				echo '<div class="tc-cell tc-col-auto tm_cell_move">';

				// Drag button.
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => '',
						'tags' => [
							'href'  => '#move',
							'class' => 'tmicon tcfa tcfa-grip-vertical move',
						],
					],
					1
				);
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => '',
						'icon' => 'angle-up',
						'tags' => [
							'href'  => '#move',
							'class' => 'tc tc-button small builder_panel_up',
						],
					],
					1
				);
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => '',
						'icon' => 'angle-down',
						'tags' => [
							'href'  => '#move',
							'class' => 'tc tc-button small builder_panel_down',
						],
					],
					1
				);

				echo '</div>';
				echo "<div class='tc-cell tc-col-auto tm_cell_default'>";

				// Default_select.
				echo '<span class="tm-hidden-inline">' . ( ( 'multiple_checkboxes_options' === $name || 'multiple_selectboxmultiple_options' === $name ) ? esc_html__( 'Checked', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ) ) . '</span>';
			}
			if ( 'multiple_checkboxes_options' === $name || 'multiple_selectboxmultiple_options' === $name ) {
				if ( empty( $return_js ) ) {
					echo '<input type="checkbox" value="'
						. esc_attr( (string) $d_counter )
						. '" name="tm_meta[tmfbuilder]['
						. esc_attr( $name ) . '_default_value][' . ( is_null( $counter ) ? 0 : esc_attr( $counter ) ) . '][]" class="tm-default-checkbox" ';
					checked(
						( is_null( $counter )
						? ''
						: ( isset( $default_value[ $counter ] )
							? is_array( $default_value[ $counter ] ) && in_array( (string) $d_counter, $default_value[ $counter ] ) // phpcs:ignore WordPress.PHP.StrictInArray
						: '' ) ),
						true,
						true
					);
					echo '>';
				} else {
					$js_object[ $d_counter ][] = [
						'id'      => $name . '_default_value',
						'default' => (string) $d_counter,
						'checked' => ( is_null( $counter )
							? ''
							: ( isset( $default_value[ $counter ] )
								? is_array( $default_value[ $counter ] ) && in_array( (string) $d_counter, $default_value[ $counter ] ) // phpcs:ignore WordPress.PHP.StrictInArray
								: '' ) ),
						'type'    => 'checkbox',
						'tags'    => [
							'name'  => 'tm_meta[tmfbuilder][' . $name . '_default_value][' . ( is_null( $counter ) ? 0 : $counter ) . '][]',
							'class' => 'tm-default-checkbox',
						],
					];
				}
			} elseif ( empty( $return_js ) ) {
				echo '<input type="radio" value="'
					. esc_attr( (string) $d_counter )
					. '" name="tm_meta[tmfbuilder]['
					. esc_attr( $name ) . '_default_value][' . ( is_null( $counter ) ? 0 : esc_attr( $counter ) ) . ']" class="tm-default-radio" ';
				checked(
					( is_null( $counter )
					? ''
					: ( ( isset( $default_value[ $counter ] ) && ! is_array( $default_value[ $counter ] ) )
						? (string) $default_value[ $counter ]
					: '' ) ),
					$d_counter,
					true
				);
				echo '>';
			} else {
				$js_object[ $d_counter ][] = [
					'id'      => $name . '_default_value',
					'default' => (string) $d_counter,
					'checked' => ( is_null( $counter )
						? ''
						: ( ( isset( $default_value[ $counter ] ) && ! is_array( $default_value[ $counter ] ) )
							? (string) $default_value[ $counter ] === (string) $d_counter
							: '' ) ),
					'type'    => 'radio',
					'tags'    => [
						'name'  => 'tm_meta[tmfbuilder][' . $name . '_default_value][' . ( is_null( $counter ) ? 0 : $counter ) . ']',
						'class' => 'tm-default-checkbox',
					],
				];
			}

			if ( empty( $return_js ) ) {
				echo '</div>';
				echo "<div class='tc-cell tc-col-3 tm_cell_title'>";
				echo '<span class="tm-choice-cl">' . esc_html__( 'Choice label', 'woocommerce-tm-extra-product-options' ) . '</span>';
				THEMECOMPLETE_EPO_HTML()->create_field( $o['title'], 1 );
				echo '</div>';
				echo "<div class='tc-cell tc-col-3 tm_cell_images'>";
				THEMECOMPLETE_EPO_HTML()->create_field( $o['image'], 1 );
				THEMECOMPLETE_EPO_HTML()->create_field( $o['imagec'], 1 );
				THEMECOMPLETE_EPO_HTML()->create_field( $o['imagep'], 1 );
				THEMECOMPLETE_EPO_HTML()->create_field( $o['imagel'], 1 );
				if ( 'multiple_selectbox_options' !== $name ) {
					THEMECOMPLETE_EPO_HTML()->create_field( $o['color'], 1 );
				}
				echo '</div>';

				echo "<div class='tc-cell tc-col-0 tc-cell-value'>";
				THEMECOMPLETE_EPO_HTML()->create_field( $o['value'], 1 );
				echo '</div>';
				echo "<div class='tc-cell tc-col-auto tm_cell_price'>";
			} else {
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['title'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['image'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['imagec'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['imagep'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['imagel'] );
				if ( 'multiple_selectbox_options' !== $name ) {
					$js_object[ $d_counter ][] = $this->remove_for_js( $o['color'] );
				}
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['value'] );
			}

			if ( ! empty( $additional_currencies ) && is_array( $additional_currencies ) ) {
				$_copy_value                          = $o['price'];
				$_sale_copy_value                     = $o['sale_price'];
				$o['price']['html_before_field']      = '<span class="tm-choice-currency">' . THEMECOMPLETE_EPO_HELPER()->wc_base_currency() . '</span><span class="tm-choice-regular">' . esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
				$o['sale_price']['html_before_field'] = '<span class="tm-choice-currency">' . THEMECOMPLETE_EPO_HELPER()->wc_base_currency() . '</span><span class="tm-choice-sale">' . esc_html__( 'Sale Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
				if ( empty( $return_js ) ) {
					THEMECOMPLETE_EPO_HTML()->create_field( $o['price'], 1 );
					THEMECOMPLETE_EPO_HTML()->create_field( $o['sale_price'], 1 );
				} else {
					$js_object[ $d_counter ][] = $this->remove_for_js( $o['price'] );
					$js_object[ $d_counter ][] = $this->remove_for_js( $o['sale_price'] );
				}
				foreach ( $additional_currencies as $ckey => $currency ) {
					$mt_prefix             = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $currency );
					$copy_value            = $_copy_value;
					$copy_value['default'] = isset( $options[ 'price_' . $currency ][ $ar ] ) ? $options[ 'price' . $mt_prefix ][ $ar ] : '';
					$copy_value['id']     .= $mt_prefix;

					$copy_value['html_before_field'] = '<span class="tm-choice-currency">' . $currency . '</span><span class="tm-choice-regular">' . esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
					$copy_value['tags']['name']      = 'tm_meta[tmfbuilder][' . $name . '_price' . $mt_prefix . '][' . ( is_null( $counter ) ? 0 : $counter ) . '][]';
					$copy_value['tags']['id']        = str_replace(
						[
							'[',
							']',
						],
						'',
						$copy_value['tags']['name']
					) . '_' . $ar;
					if ( empty( $return_js ) ) {
						THEMECOMPLETE_EPO_HTML()->create_field( $copy_value, 1 );
					} else {
						$js_object[ $d_counter ][] = $copy_value;
					}

					$copy_value            = $_sale_copy_value;
					$copy_value['default'] = isset( $options[ 'sale_price_' . $currency ][ $ar ] ) ? $options[ 'sale_price' . $mt_prefix ][ $ar ] : '';
					$copy_value['id']     .= $mt_prefix;

					$copy_value['html_before_field'] = '<span class="tm-choice-currency">' . $currency . '</span><span class="tm-choice-sale">' . esc_html__( 'Sale Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
					$copy_value['tags']['name']      = 'tm_meta[tmfbuilder][' . $name . '_sale_price' . $mt_prefix . '][' . ( is_null( $counter ) ? 0 : $counter ) . '][]';
					$copy_value['tags']['id']        = str_replace(
						[
							'[',
							']',
						],
						'',
						$copy_value['tags']['name']
					) . '_' . $ar;
					if ( empty( $return_js ) ) {
						THEMECOMPLETE_EPO_HTML()->create_field( $copy_value, 1 );
					} else {
						$js_object[ $d_counter ][] = $copy_value;
					}
				}
			} else {
				$o['price']['html_before_field']      = '<span class="tm-choice-regular">' . esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
				$o['sale_price']['html_before_field'] = '<span class="tm-choice-sale">' . esc_html__( 'Sale Price', 'woocommerce-tm-extra-product-options' ) . '</span>';
				if ( empty( $return_js ) ) {
					THEMECOMPLETE_EPO_HTML()->create_field( $o['price'], 1 );
					THEMECOMPLETE_EPO_HTML()->create_field( $o['sale_price'], 1 );
				} else {
					$js_object[ $d_counter ][] = $this->remove_for_js( $o['price'] );
					$js_object[ $d_counter ][] = $this->remove_for_js( $o['sale_price'] );
				}
			}

			if ( empty( $return_js ) ) {
				echo '<span class="tm-choice-pt">' . esc_html__( 'Price Type', 'woocommerce-tm-extra-product-options' ) . '</span>';
				THEMECOMPLETE_EPO_HTML()->create_field( $o['price_type'], 1 );
				echo '</div>';
				echo "<div class='tc-cell tc-col-auto tm_cell_delete'>";

				// Delete button.
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => '',
						'tags' => [ 'class' => 'tmicon tcfa tcfa-times delete builder_panel_delete' ],
					],
					1
				);

				echo '</div>';

				if ( 'multiple_checkboxes_options' === $name ) {
					echo "<div class='" . esc_attr( apply_filters( 'wc_epo_builder_element_multiple_checkboxes_options_class', 'tc-cell tc-col-12 tm_cell_fee', $o ) ) . "'><span class='tm-inline-label bsbb'>" . esc_html__( 'Set to Fee', 'woocommerce-tm-extra-product-options' ) . '</span>';
					THEMECOMPLETE_EPO_HTML()->create_field( $o['fee'], 1 );
					echo '</div>';

					do_action( 'wc_epo_builder_element_multiple_checkboxes_options', $o );
				}
				if ( 'multiple_selectboxmultiple_options' !== $name ) {
					echo "<div class='tc-cell tc-col-12 tm_cell_description'><span class='tm-inline-label bsbb'>" . esc_html__( 'Description', 'woocommerce-tm-extra-product-options' ) . '</span>';
					THEMECOMPLETE_EPO_HTML()->create_field( $o['description'], 1 );
					echo '</div>';
				}

				echo "<div class='tc-cell tc-col-12 tm_cell_enabled'><span class='tm-inline-label bsbb'>" . esc_html__( 'Enabled', 'woocommerce-tm-extra-product-options' ) . '</span>';
				THEMECOMPLETE_EPO_HTML()->create_field( $o['enabled'], 1 );
				echo '</div>';
			} else {
				if ( 'multiple_checkboxes_options' === $name ) {

					$js_object[ $d_counter ][] = [
						'id'      => $name . '_fee',
						'default' => (string) $o['fee']['default'],
						'checked' => (string) $o['fee']['default'] === (string) $o['fee']['tags']['value'],
						'type'    => 'checkbox',
						'tags'    => [
							'name'  => 'tm_meta[tmfbuilder][' . $name . '_fee][' . ( is_null( $counter ) ? 0 : $counter ) . '][]',
							'value' => $o['fee']['tags']['value'],
						],
					];

					$js_object = apply_filters( 'wc_epo_builder_element_multiple_checkboxes_options_js_object', $js_object, $d_counter, $o, $name, $counter );

				}
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['price_type'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['description'] );
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['enabled'] );
			}

			foreach ( $_extra_options as $__key => $__name ) {
				if ( ( is_array( $__name['type'] ) && in_array( $type, $__name['type'], true ) ) || $__name['type'] === $type ) {
					$_extra_name = $__name['name'];
					if ( empty( $return_js ) ) {
						echo "<div class='tc-cell tc-col-12 " . esc_attr( $__name['admin_class'] ) . "'>";
						echo "<span class='tm-inline-label bsbb'>" . esc_attr( $__name['label'] ) . '</span>';
						THEMECOMPLETE_EPO_HTML()->create_field( $o[ $_extra_name ], 1 );
						echo '</div>';
					} else {
						$js_object[ $d_counter ][] = $this->remove_for_js( $o[ $_extra_name ] );
					}
				}
			}
			if ( empty( $return_js ) ) {
				echo "<div class='tc-cell tc-col-12 tc-cell-url'><span class='tm-inline-label bsbb'>" . esc_html__( 'URL', 'woocommerce-tm-extra-product-options' ) . '</span>';
				THEMECOMPLETE_EPO_HTML()->create_field( $o['url'], 1 );
				echo '</div>';

				echo '</div></div>';
			} else {
				$js_object[ $d_counter ][] = $this->remove_for_js( $o['url'] );
			}
			++$d_counter;
		}
		if ( empty( $return_js ) ) {
			echo '</div>';
			echo ' <button type="button" class="tc tc-button builder-panel-add">' . esc_html__( 'Add item', 'woocommerce-tm-extra-product-options' ) . '</button>';
			if ( 'multiple_radiobuttons_options' === $name || 'multiple_checkboxes_options' === $name ) {
				echo ' <button type="button" class="tc tc-button builder-panel-add-separator">' . esc_html__( 'Add separator', 'woocommerce-tm-extra-product-options' ) . '</button>';
			}
			echo ' <button type="button" class="tc tc-button builder-panel-mass-add">' . esc_html__( 'Mass add', 'woocommerce-tm-extra-product-options' ) . '</button>';
		} else {
			return $js_object;
		}
	}
}
admin/class-themecomplete-epo-admin-base.php000064400000203534150755142440015100 0ustar00<?php
/**
 * Extra Product Options admin setup
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 * phpcs:disable WordPress.DB.DirectDatabaseQuery
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options admin setup
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_Admin_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Admin_Base|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Admin_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Add Admin tab in products.
		add_filter( 'woocommerce_product_data_tabs', [ $this, 'register_data_tab' ] );
		add_action( 'woocommerce_product_data_panels', [ $this, 'register_data_panels' ] );

		// Load css and javascript files.
		add_action( 'admin_enqueue_scripts', [ $this, 'register_admin_scripts' ] );

		// Remove Extra Product Options from deleted Products.
		add_action( 'delete_post', [ $this, 'delete_post' ] );

		// Remove Extra Product Options via remove button.
		add_action( 'wp_ajax_woocommerce_tm_remove_epo', [ $this, 'remove_price' ] );
		add_action( 'wp_ajax_woocommerce_tm_remove_epos', [ $this, 'remove_prices' ] );

		// Load Extra Product Options.
		add_action( 'wp_ajax_woocommerce_tm_load_epos', [ $this, 'load_prices' ] );

		// Add Extra Product Options via add button.
		add_action( 'wp_ajax_woocommerce_tm_add_epo', [ $this, 'add_price' ] );

		// Save Extra Product Options meta data.
		add_action( 'woocommerce_process_product_meta', [ $this, 'save_meta' ], 50 );

		// Duplicate Extra Product Options.
		add_action( 'woocommerce_product_duplicate', [ $this, 'duplicate_product' ], 50, 2 );

		// Show action links on the plugin screen.
		add_filter( 'plugin_row_meta', [ $this, 'plugin_row_meta' ], 10, 2 );
		add_filter( 'plugin_action_links_' . THEMECOMPLETE_EPO_PLUGIN_NAME_HOOK, [ $this, 'plugin_action_links' ] );

		// Display options on admin Order page.
		add_action( 'woocommerce_order_item_line_item_html', [ $this, 'tm_woocommerce_order_item_line_item_html' ], 10, 2 );
		// Update option date on the order upon saving the order on admin Order page.
		add_action( 'woocommerce_saved_order_items', [ $this, 'tm_woocommerce_saved_order_items' ], 10, 2 );

		// For settings page.
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_math', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_css_code', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_js_code', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_separator_cart_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_multiple_separator_cart_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_replacement_free_price_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_global_required_indicator', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_force_select_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_no_zero_priced_products_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_no_negative_priced_products_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_update_cart_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_edit_options_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_additional_options_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_popup_section_button_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_close_button_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_empty_cart_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_final_total_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_options_unit_price_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_options_total_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_vat_options_total_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_fees_total_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_reset_variation_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_closetext', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_currenttext', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_slider_prev_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_slider_next_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_this_field_is_required_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_characters_remaining_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_uploading_files_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_uploading_message_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_select_file_text', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_add_button_text_associated_products', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_remove_button_text_associated_products', [ $this, 'tm_return_raw' ], 10, 3 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_add_button_text_repeater', [ $this, 'tm_return_raw' ], 10, 3 );

		add_action( 'woocommerce_json_search_found_products', [ $this, 'woocommerce_json_search_found_products' ], 10, 1 );

		// Hide associated products in the order.
		add_action( 'woocommerce_order_item_visible', [ $this, 'woocommerce_order_item_visible' ], 10, 2 );

		// Enable shortcodes on various properties.
		add_filter( 'wc_epo_enable_shortocde', [ $this, 'enable_shortcodes' ], 10, 1 );
	}

	/**
	 * Enable shortcodes on an element property
	 *
	 * @param mixed $property The option property.
	 * @return mixed
	 *
	 * @since 6.0.4
	 *
	 * The function has two more shadow parameters:
	 * param mixed   $original_property The original option property.
	 * param integer $post_id The post id where the filter was used.
	 */
	public function enable_shortcodes( $property = '' ) {
		if ( is_array( $property ) ) {
			foreach ( $property as $key => $value ) {
				$property[ $key ] = themecomplete_do_shortcode( $value );
			}
		} else {
			$property = themecomplete_do_shortcode( $property );
		}
		return $property;
	}

	/**
	 * Hide associated products in the order
	 *
	 * @param boolean      $visible If the product should be visible.
	 * @param array<mixed> $order_item The order item object.
	 * @return boolean
	 * @since 6.2
	 */
	public function woocommerce_order_item_visible( $visible, $order_item ) {
		if ( isset( $order_item['_associated_hidden'] ) && ! empty( $order_item['_associated_hidden'] ) ) {
			$visible = false;
		}

		return $visible;
	}

	/**
	 * Filter product rearch results in the builder
	 *
	 * @param object $product The product object.
	 * @return object
	 * @since 5.0
	 */
	public function woocommerce_json_search_found_products( $product ) {
		if ( isset( $_REQUEST['tcmode'] ) && 'builder' === $_REQUEST['tcmode'] ) { // phpcs:ignore WordPress.Security.NonceVerification
			$exclude_ids = ! empty( $_GET['exclude'] ) ? array_map( 'absint', (array) wp_unslash( $_GET['exclude'] ) ) : []; // phpcs:ignore WordPress.Security.NonceVerification
			foreach ( $exclude_ids as $id ) {
				unset( $product[ $id ] );
			}
		}

		return $product;
	}

	/**
	 * Returns the provided raw value
	 *
	 * @param string       $value The value.
	 * @param array<mixed> $option Array of options.
	 * @param string       $raw_value The raw value.
	 * @return string
	 * @since 1.0
	 */
	public function tm_return_raw( $value, $option, $raw_value ) {
		$raw_value = wp_slash( $raw_value );
		return $raw_value;
	}

	/**
	 * Update option date on the order upon saving the order on admin Order page
	 *
	 * @param integer      $order_id The order id.
	 * @param array<mixed> $items The items array.
	 * @return void
	 * @since 1.0
	 */
	public function tm_woocommerce_saved_order_items( $order_id = 0, $items = [] ) {
		if ( apply_filters( 'wc_epo_no_saved_order_items', false ) ) {
			return;
		}

		// @phpstan-ignore-next-line
		if ( isset( $_POST ) && isset( $_POST['order_status'] ) && 'wc-refunded' === $_POST['order_status'] ) { // phpcs:ignore WordPress.Security.NonceVerification
			return;
		}

		if ( is_array( $items ) && isset( $items['tm_epo'] ) ) {

			$order              = THEMECOMPLETE_EPO_HELPER()->tm_get_order_object();
			$order_currency     = $order->get_currency();
			$mt_prefix          = $order_currency;
			$order_items        = $order->get_items();
			$order_taxes        = $order->get_taxes();
			$prices_include_tax = themecomplete_order_get_att( $order, 'prices_include_tax' );

			foreach ( $items['tm_epo'] as $item_id => $epos ) {

				$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

				$qty           = (float) $item_meta['_qty'][0];
				$line_total    = floatval( $item_meta['_line_total'][0] );
				$line_subtotal = isset( $item_meta['_line_subtotal'] ) ? floatval( $item_meta['_line_subtotal'][0] ) : $line_total;

				$has_epo = is_array( $item_meta )
								&& isset( $item_meta['_tmcartepo_data'] )
								&& isset( $item_meta['_tmcartepo_data'][0] )
								&& isset( $item_meta['_tm_epo'] );

				$has_fee = is_array( $item_meta )
						&& isset( $item_meta['_tmcartfee_data'] )
						&& isset( $item_meta['_tmcartfee_data'][0] );

				$saved_epos          = false;
				$original_saved_epos = false;
				if ( $has_epo || $has_fee ) {
					$saved_epos          = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
					$original_saved_epos = $saved_epos;
				}

				$do_update = false;

				if ( $saved_epos ) {

					$_product = themecomplete_get_product_from_item( $order_items[ $item_id ], $order );

					foreach ( $epos as $key => $epo ) {

						if ( isset( $items['tm_item_id'] ) && isset( $items['tm_key'] ) && (string) $items['tm_key'] === (string) $key && (string) $items['tm_item_id'] === (string) $item_id ) {

							$option_price_before = $this->order_price_exluding_tax( $saved_epos[ $key ]['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
							$line_total          = $line_total - $option_price_before;
							$line_subtotal       = $line_subtotal - $option_price_before;
							unset( $saved_epos[ $key ] );
							$do_update = true;

						} else {
							$new_currency             = false;
							$_current_currency_prices = $saved_epos[ $key ]['price_per_currency'];

							if ( '' !== $mt_prefix
								&& '' !== $_current_currency_prices
								&& is_array( $_current_currency_prices )
								&& isset( $_current_currency_prices[ $mt_prefix ] )
								&& '' !== $_current_currency_prices[ $mt_prefix ]
							) {
								// don't change price as it is currency custom.
								$new_currency = true;

							}
							if ( isset( $epo['quantity'] ) && is_array( $original_saved_epos ) && isset( $original_saved_epos[ $key ] ) && isset( $original_saved_epos[ $key ]['quantity'] ) && $epo['quantity'] !== $original_saved_epos[ $key ]['quantity'] ) {
								$epo_qty = $saved_epos[ $key ]['quantity'];

								$option_price_before = $this->order_price_exluding_tax( $saved_epos[ $key ]['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
								$line_total          = $line_total - ( $option_price_before * $qty );
								$line_subtotal       = $line_subtotal - ( $option_price_before * $qty );
								$tax_price           = $this->order_get_tax_price( $option_price_before, false, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );

								$saved_epos_price_of_one = (float) $saved_epos[ $key ]['price'];
								if ( ! empty( $saved_epos[ $key ]['quantity'] ) ) {
									$saved_epos_price_of_one = (float) $saved_epos[ $key ]['price'] / (float) $saved_epos[ $key ]['quantity'];
								}

								$saved_epos[ $key ]['quantity'] = $epo['quantity'];
								$epo_qty                        = $saved_epos[ $key ]['quantity'];

								$saved_epos[ $key ]['price'] = $saved_epos_price_of_one * (float) $saved_epos[ $key ]['quantity'];

								$option_price_after = $this->order_price_exluding_tax( $saved_epos[ $key ]['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
								$line_total         = $line_total + ( $option_price_after * $qty );
								$line_subtotal      = $line_subtotal + ( $option_price_after * $qty );
								$do_update          = true;
								$tax_price          = $this->order_get_tax_price( $option_price_after, false, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );

								if ( $new_currency ) {
									$saved_epos[ $key ]['price_per_currency'][ $mt_prefix ] = $saved_epos[ $key ]['price'];
									$_current_currency_prices[ $mt_prefix ]                 = $saved_epos[ $key ]['price'];
								}
							}

							if ( isset( $epo['price'] ) ) {

								if ( ! $new_currency ) {
									$epo['price']        = $this->order_price_including_tax( $epo['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
									$epo['price']        = apply_filters( 'wc_epo_remove_current_currency_price', $epo['price'], THEMECOMPLETE_EPO()->get_saved_element_price_type( $saved_epos[ $key ] ), get_option( 'woocommerce_currency' ), $order_currency, $_current_currency_prices, isset( $saved_epos[ $key ]['key'] ) ? $saved_epos[ $key ]['key'] : null );
									$option_price_before = $this->order_price_exluding_tax( $saved_epos[ $key ]['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
								} else {
									$option_price_before = $_current_currency_prices[ $mt_prefix ];
									if ( $prices_include_tax ) {
										$option_price_before = $this->order_price_exluding_tax( $option_price_before, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
									}
								}

								$line_total    = $line_total - ( $option_price_before * $qty );
								$line_subtotal = $line_subtotal - ( $option_price_before * $qty );

								$saved_epos[ $key ]['price'] = (float) $epo['price'] * (float) $saved_epos[ $key ]['quantity'];
								if ( ! $new_currency ) {
									$saved_epos[ $key ]['price'] = $this->order_price_exluding_tax( $saved_epos[ $key ]['price'], $prices_include_tax, $order, $order_taxes, $order_items, $item_id );
								}

								$tax_price = $this->order_get_tax_price( $saved_epos[ $key ]['price'], false, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );

								if ( $new_currency ) {
									$saved_epos[ $key ]['price_per_currency'][ $mt_prefix ] = $saved_epos[ $key ]['price'] + $tax_price;
								}
								$option_price_after = $saved_epos[ $key ]['price'];
								if ( ! $new_currency ) {
									$option_price_after = apply_filters( 'wc_epo_get_current_currency_price', $option_price_after, THEMECOMPLETE_EPO()->get_saved_element_price_type( $epo ), null, $order_currency, $_product ? $_product->get_price() : false );
								}

								$line_total    = $line_total + ( $option_price_after * $qty );
								$line_subtotal = $line_subtotal + ( $option_price_after * $qty );

								$saved_epos[ $key ]['price'] = $saved_epos[ $key ]['price'] + $tax_price;
								if ( ! $new_currency ) {
									$saved_epos[ $key ]['price'] = apply_filters( 'wc_epo_get_current_currency_price', $saved_epos[ $key ]['price'], THEMECOMPLETE_EPO()->get_saved_element_price_type( $epo ), null, $order_currency, $_product ? $_product->get_price() : false );
								}
								if ( $new_currency ) {
									$saved_epos[ $key ]['price_per_currency'][ $mt_prefix ] = $saved_epos[ $key ]['price'];
								}
								$do_update = true;

							}

							if ( isset( $epo['value'] ) ) {

								$saved_epos[ $key ]['value'] = $epo['value'];

								if ( isset( $saved_epos[ $key ]['multiple'] ) && isset( $saved_epos[ $key ]['key'] ) ) {

									$current_product_id  = isset( $item_meta['_product_id'][0] ) ? $item_meta['_product_id'][0] : null;
									$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );

									if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && intval( $original_product_id ) !== intval( $current_product_id ) ) {
										$current_product_id = $original_product_id;
									}

									if ( $current_product_id ) {

										$get_saved_order_multiple_keys = THEMECOMPLETE_EPO_HELPER()->get_saved_order_multiple_keys( $current_product_id );

										if ( isset( $get_saved_order_multiple_keys[ 'options_' . $saved_epos[ $key ]['section'] ] ) ) {
											$new_key = array_search( $epo['value'], $get_saved_order_multiple_keys[ 'options_' . $saved_epos[ $key ]['section'] ], true );
											if ( $new_key ) {
												$saved_epos[ $key ]['key'] = $new_key;
											} else {
												$saved_epos[ $key ]['key'] = '';
											}
										}
									} else {
										$saved_epos[ $key ]['key'] = '';
									}
								}

								$do_update = true;

							}
						}
					}
				}

				if ( $do_update ) {

					wc_update_order_item_meta( $item_id, '_line_total', wc_format_decimal( $line_total ) );
					wc_update_order_item_meta( $item_id, '_line_subtotal', wc_format_decimal( $line_subtotal ) );

					wc_update_order_item_meta( $item_id, '_tmcartepo_data', $saved_epos );

					wp_cache_delete( $item_id, 'order_item_meta' );

				}
			}
		}
	}

	/**
	 * Get price with tax
	 *
	 * $price must be without tax
	 *
	 * @param float        $price The price.
	 * @param boolean      $prices_include_tax The order id.
	 * @param WC_Order     $order The order object.
	 * @param array<mixed> $order_taxes The order taxes.
	 * @param array<mixed> $order_items The order items.
	 * @param integer      $item_id The item id.
	 * @return float
	 * @since 1.0
	 */
	public function order_price_including_tax( $price, $prices_include_tax, $order, $order_taxes, $order_items, $item_id ) {
		$tax_price = $this->order_get_tax_price( $price, false, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );

		return (float) $price + (float) $tax_price;
	}

	/**
	 * Get price without tax
	 *
	 * $price must be with tax
	 *
	 * @param float        $price The price.
	 * @param boolean      $prices_include_tax The order id.
	 * @param WC_Order     $order The order object.
	 * @param array<mixed> $order_taxes The order taxes.
	 * @param array<mixed> $order_items The order items.
	 * @param integer      $item_id The item id.
	 * @return float
	 * @since 1.0
	 */
	public function order_price_exluding_tax( $price, $prices_include_tax, $order, $order_taxes, $order_items, $item_id ) {
		$tax_price = $this->order_get_tax_price( $price, true, $prices_include_tax, $order, $order_taxes, $order_items, $item_id );

		return (float) $price - (float) $tax_price;
	}

	/**
	 * Get the tax price
	 *
	 * @param float        $price The price.
	 * @param boolean      $price_has_tax If the price has tax included.
	 * @param boolean      $prices_include_tax The order id.
	 * @param WC_Order     $order The order object.
	 * @param array<mixed> $order_taxes The order taxes.
	 * @param array<mixed> $order_items The order items.
	 * @param integer      $item_id The item id.
	 * @return mixed
	 * @since 1.0
	 */
	public function order_get_tax_price( $price, $price_has_tax, $prices_include_tax, $order, $order_taxes, $order_items, $item_id ) {

		$tax_data  = wc_tax_enabled() ? themecomplete_maybe_unserialize( isset( $order_items[ $item_id ]['line_tax_data'] ) ? $order_items[ $item_id ]['line_tax_data'] : '' ) : false;
		$tax_price = 0;

		if ( ! empty( $tax_data ) && $prices_include_tax ) {

			$tax_based_on = get_option( 'woocommerce_tax_based_on' );

			$default  = '';
			$country  = '';
			$state    = '';
			$postcode = '';
			$city     = '';
			if ( 'billing' === $tax_based_on ) {
				$country  = $order->get_billing_country();
				$state    = $order->get_billing_state();
				$postcode = $order->get_billing_postcode();
				$city     = $order->get_billing_city();
			} elseif ( 'shipping' === $tax_based_on ) {
				$country  = $order->get_shipping_country();
				$state    = $order->get_shipping_state();
				$postcode = $order->get_shipping_postcode();
				$city     = $order->get_shipping_city();
			}

			// Default to base.
			if ( 'base' === $tax_based_on || empty( $country ) ) {
				$default  = wc_get_base_location();
				$country  = $default['country'];
				$state    = $default['state'];
				$postcode = '';
				$city     = '';
			}

			$tax_class = $order_items[ $item_id ]['tax_class'];
			$tax_rates = WC_Tax::find_rates(
				[
					'country'   => $country,
					'state'     => $state,
					'postcode'  => $postcode,
					'city'      => $city,
					'tax_class' => $tax_class,
				]
			);

			$epo_line_taxes = WC_Tax::calc_tax( (float) $price, $tax_rates, $price_has_tax );

			foreach ( $order_taxes as $tax_item ) {
				$tax_item_id = $tax_item['rate_id'];
				if ( $tax_item instanceof WC_Order_Item_Tax && is_callable( [ $tax_item, 'get_rate_id' ] ) ) {
					$tax_item_id = $tax_item->get_rate_id();
				}
				if ( isset( $epo_line_taxes[ $tax_item_id ] ) ) {
					$tax_price = $tax_price + $epo_line_taxes[ $tax_item_id ];
				}
			}
		}

		return $tax_price;
	}

	/**
	 * Display options on admin Order page
	 *
	 * @param integer               $item_id The item id.
	 * @param WC_Order_Item_Product $item The order item object.
	 * @return void
	 * @since 1.0
	 */
	public function tm_woocommerce_order_item_line_item_html( $item_id = 0, $item = null ) {
		if ( is_null( $item ) ) {
			return;
		}
		$get_post_type = get_post_type();
		if ( ! $get_post_type && isset( $_REQUEST['order_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$get_post_type = get_post_type( absint( wp_unslash( $_REQUEST['order_id'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
		}
		if ( ! $get_post_type && isset( $_REQUEST['id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$get_post_type = get_post_type( absint( wp_unslash( $_REQUEST['id'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
		}
		$order_post_types = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_order_post_types' );
		if ( ! is_array( $order_post_types ) ) {
			$order_post_types = [ 'shop_order_placehold', 'shop_order' ];
		}
		if ( ! in_array( $get_post_type, $order_post_types, true ) ) {
			return;
		}

		$order = THEMECOMPLETE_EPO_HELPER()->tm_get_order_object();
		if ( $order ) {
			$order_currency = $order->get_currency();
		} else {
			$order_currency = get_woocommerce_currency();
		}
		$mt_prefix = $order_currency;

		$_product    = themecomplete_get_product_from_item( $item, $order );
		$item_meta   = themecomplete_get_order_item_meta( $item_id, '', false );
		$order_taxes = $order->get_taxes();

		$has_epo = is_array( $item_meta )
				&& isset( $item_meta['_tmcartepo_data'] )
				&& isset( $item_meta['_tmcartepo_data'][0] )
				&& isset( $item_meta['_tm_epo'] );

		$has_fee = is_array( $item_meta )
				&& isset( $item_meta['_tmcartfee_data'] )
				&& isset( $item_meta['_tmcartfee_data'][0] );

		$wpml_translation_by_id = [];

		$item_product_id = $item->get_product_id();
		if ( $has_epo || $has_fee ) {
			$current_product_id  = $item_product_id;
			$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );
			if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && $original_product_id !== $current_product_id ) {
				$current_product_id = $original_product_id;
			}
			$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );
		}

		if ( $has_epo ) {
			$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );

			if ( $epos && is_array( $epos ) ) {

				$header_title = esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' );
				include 'views/html-tm-epo-order-item-header.php';

				foreach ( $epos as $key => $epo ) {
					if ( $epo && is_array( $epo ) ) {
						$epo = THEMECOMPLETE_EPO_API()->parse_epo_order_data(
							$epo,
							[
								'backend_order'          => true,
								'item'                   => $item,
								'product_id'             => $item_product_id,
								'product'                => $_product,
								'item_id'                => $item_id,
								'item_meta'              => $item_meta,
								'order'                  => $order,
								'order_currency'         => $order_currency,
								'wpml_translation_by_id' => $wpml_translation_by_id,
								'mt_prefix'              => $mt_prefix,
							],
							false,
						);

						if ( empty( $epo ) ) {
							continue;
						}

						$type         = THEMECOMPLETE_EPO()->get_saved_element_price_type( $epo );
						$epo_quantity = $epo['quantity_html'];
						$epo_value    = make_clickable( $epo['value'] );
						$epo_value    = wpautop( $epo_value );
						$epo_name     = $epo['name'];

						if ( apply_filters( 'wc_epo_html_tm_epo_order_item_is_other_fee', false, $type ) ) {
							$epo_edit_value    = false;
							$edit_buttons      = false;
							$epo_edit_cost     = false;
							$epo_edit_quantity = false;
							$epo_is_fee        = false;
						} else {
							$epo_edit_value    = true;
							$edit_buttons      = true;
							$epo_edit_cost     = true;
							$epo_edit_quantity = true;
							$epo_is_fee        = false;
						}

						include 'views/html-tm-epo-order-item.php';
					}
				}
			}
		}

		if ( $has_fee ) {
			$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartfee_data'][0] );

			if ( isset( $epos[0] ) ) {
				$epos = $epos[0];
			} else {
				$epos = false;
			}

			if ( $epos && ! empty( $epos[0] ) && is_array( $epos ) ) {

				$header_title = esc_html__( 'Extra Product Options Fees', 'woocommerce-tm-extra-product-options' );
				include 'views/html-tm-epo-order-item-header.php';

				foreach ( $epos as $key => $epo ) {

					if ( $epo && is_array( $epo ) ) {
						if ( ! isset( $epo['quantity'] ) ) {
							$epo['quantity'] = 1;
						}
						if ( isset( $wpml_translation_by_id[ $epo['section'] ] ) ) {
							$epo['name'] = $wpml_translation_by_id[ $epo['section'] ];
						}
						$epo['value'] = apply_filters( 'wc_epo_enable_shortocde', $epo['value'], $epo['value'], false );
						if ( isset( $wpml_translation_by_id[ 'options_' . $epo['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $epo['section'] ] ) && ! empty( $epo['multiple'] ) && ! empty( $epo['key'] ) ) {
							$pos = strrpos( $epo['key'], '_' );
							if ( false !== $pos ) {
								$av = array_values( $wpml_translation_by_id[ 'options_' . $epo['section'] ] );
								if ( isset( $av[ (int) substr( $epo['key'], $pos + 1 ) ] ) ) {
									$epo['value'] = $av[ (int) substr( $epo['key'], $pos + 1 ) ];
									if ( ! empty( $epo['use_images'] ) && ! empty( $epo['images'] ) && 'images' === $epo['use_images'] ) {
										$epo['value'] = '<div class="cpf-img-on-order"><img alt="' . esc_attr( wp_strip_all_tags( $epo['name'] ) ) . '" class="attachment-shop_thumbnail wp-post-image epo-option-image" src="' . apply_filters( 'tm_image_url', $epo['images'] ) . '" /></div>' . $epo['value'];
									}
								}
							}
						}

						$epo_name     = apply_filters( 'tm_translate', $epo['name'] );
						$epo_value    = apply_filters( 'tm_translate', $epo['value'] );
						$epo_value    = make_clickable( $epo_value );
						$epo_quantity = $epo['quantity'];
						$epo_quantity = apply_filters( 'wc_epo_html_tm_epo_order_item_epo_quantity', $epo_quantity, $epo['quantity'], $item, $_product );

						$epo_edit_value    = false;
						$edit_buttons      = false;
						$epo_edit_cost     = false;
						$epo_edit_quantity = false;
						$epo_is_fee        = true;
						$epo['price']      = floatval( $epo['price'] );
						include 'views/html-tm-epo-order-item.php';

					}
				}
			}
		}
	}

	/**
	 * Show action links on the plugin screen.
	 *
	 * @param mixed $links Plugin Action links.
	 *
	 * @return array<mixed>
	 */
	public static function plugin_action_links( $links ) {
		$action_links = [
			'settings' => '<a href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=' . THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID ) ) . '" aria-label="' . esc_attr__( 'View Extra Product Options settings', 'woocommerce-tm-extra-product-options' ) . '">' . esc_html__( 'Settings', 'woocommerce-tm-extra-product-options' ) . '</a>',
		];

		return array_merge( $action_links, $links );
	}

	/**
	 * Show row meta on the plugin screen.
	 *
	 * @param mixed $links Plugin Row Meta.
	 * @param mixed $file  Plugin Base file.
	 *
	 * @return array<mixed>
	 */
	public static function plugin_row_meta( $links, $file ) {
		if ( THEMECOMPLETE_EPO_PLUGIN_NAME_HOOK === $file ) {
			$plugin_name = esc_html__( 'Extra Product Options & Add-Ons for WooCommerce', 'woocommerce-tm-extra-product-options' );
			$row_meta    = [
				'view-details' => sprintf(
					'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
					esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . THEMECOMPLETE_EPO_FILE_SLUG . '&TB_iframe=true&width=772&height=717' ) ),
					/* translators: %s: Plugin name - Extra Product Options & Add-Ons for WooCommerce. */
					esc_attr( sprintf( esc_html__( 'More information about %s', 'woocommerce-tm-extra-product-options' ), $plugin_name ) ),
					esc_attr( $plugin_name ),
					esc_html__( 'View details', 'woocommerce-tm-extra-product-options' )
				),
				'docs'         => '<a href="' . esc_url( 'https://themecomplete.com/documentation/woocommerce-tc-extra-product-options/' ) . '" aria-label="' . esc_attr__( 'View Extra Product Options documentation', 'woocommerce-tm-extra-product-options' ) . '">' . esc_html__( 'Docs', 'woocommerce-tm-extra-product-options' ) . '</a>',
				'support'      => '<a href="' . esc_url( 'https://support.themecomplete.com/forums/forum/extra-product-options/' ) . '" aria-label="' . esc_attr__( 'Visit premium customer support', 'woocommerce-tm-extra-product-options' ) . '">' . esc_html__( 'Premium Support', 'woocommerce-tm-extra-product-options' ) . '</a>',
			];

			return array_merge( $links, $row_meta );
		}
		return (array) $links;
	}

	/**
	 * Get a product from the database to duplicate
	 *
	 * This is needed since the respsective function in woocommerce is private.
	 *
	 * @access private
	 *
	 * @param mixed $id The product id.
	 *
	 * @return WP_Post|boolean
	 * @todo   Returning false? Need to check for it in...
	 * @see    duplicate_product
	 */
	private function get_product_to_duplicate( $id ) {
		$id = absint( $id );

		if ( ! $id ) {
			return false;
		}

		global $wpdb;

		$post = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID=%d", $id ) );

		if ( isset( $post->post_type ) && 'revision' === $post->post_type ) {
			$id   = isset( $post->post_parent ) ? $post->post_parent : 0;
			$post = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID=%d", $id ) );
		}

		return $post[0];
	}

	/**
	 * Function to create the duplicate of the product.
	 *
	 * @param mixed   $post The post object.
	 * @param integer $parent_post_id The parent post id.
	 * @param string  $post_status The post status.
	 *
	 * @return integer
	 */
	public function cloned_duplicate_product( $post, $parent_post_id = 0, $post_status = '' ) {
		global $wpdb;

		if ( ! $post instanceof WP_Post ) {
			return 0;
		}

		$new_post_author   = wp_get_current_user();
		$new_post_date     = current_time( 'mysql' );
		$new_post_date_gmt = get_gmt_from_date( $new_post_date );

		if ( $parent_post_id > 0 ) {
			$post_parent = $parent_post_id;
			$post_status = $post_status ? $post_status : 'publish';
			$suffix      = '';
			$post_title  = $post->post_title;
		} else {
			$post_parent = $post->post_parent;
			$post_status = $post_status ? $post_status : 'draft';
			$suffix      = ' ' . esc_html__( '(Copy)', 'woocommerce' );
			$post_title  = $post->post_title . $suffix;
		}

		// Insert the new template in the post table.
		$wpdb->insert(
			$wpdb->posts,
			[
				'post_author'           => $new_post_author->ID,
				'post_date'             => $new_post_date,
				'post_date_gmt'         => $new_post_date_gmt,
				'post_content'          => $post->post_content,
				'post_content_filtered' => $post->post_content_filtered,
				'post_title'            => $post_title,
				'post_excerpt'          => $post->post_excerpt,
				'post_status'           => $post_status,
				'post_type'             => $post->post_type,
				'comment_status'        => $post->comment_status,
				'ping_status'           => $post->ping_status,
				'post_password'         => $post->post_password,
				'to_ping'               => $post->to_ping,
				'pinged'                => $post->pinged,
				'post_modified'         => $new_post_date,
				'post_modified_gmt'     => $new_post_date_gmt,
				'post_parent'           => $post_parent,
				'menu_order'            => $post->menu_order,
				'post_mime_type'        => $post->post_mime_type,
			]
		);

		$new_post_id = $wpdb->insert_id;

		// Set title for variations.
		if ( 'product_variation' === $post->post_type ) {
			/* translators: %1 variation id %2 parent product title */
			$post_title = sprintf( esc_html__( 'Variation #%1$s of %2$s', 'woocommerce' ), absint( $new_post_id ), esc_html( get_the_title( $post_parent ) ) );
			$wpdb->update(
				$wpdb->posts,
				[
					'post_title' => $post_title,
				],
				[
					'ID' => $new_post_id,
				]
			);
		}

		// Set name and GUID.
		if ( ! in_array( $post_status, [ 'draft', 'pending', 'auto-draft' ], true ) ) {
			$wpdb->update(
				$wpdb->posts,
				[
					'post_name' => wp_unique_post_slug( sanitize_title( $post_title, $new_post_id ), $new_post_id, $post_status, $post->post_type, $post_parent ),
					'guid'      => get_permalink( $new_post_id ),
				],
				[
					'ID' => $new_post_id,
				]
			);
		}

		// Copy the taxonomies.
		$this->cloned_duplicate_post_taxonomies( $post->ID, $new_post_id, $post->post_type );

		// Copy the meta information.
		$this->cloned_duplicate_post_meta( $post->ID, $new_post_id );

		// Copy the children (variations).
		$exclude = apply_filters( 'woocommerce_duplicate_product_exclude_children', false );

		if ( ! $exclude ) {
			$children_products = get_children( 'post_parent=' . $post->ID . '&post_type=product_variation' );
			if ( $children_products ) {
				foreach ( $children_products as $child ) {
					if ( $child instanceof WP_Post ) {
						$this->cloned_duplicate_product( $this->get_product_to_duplicate( $child->ID ), $new_post_id, $child->post_status );
					}
				}
			}
		}

		// Clear cache.
		clean_post_cache( $new_post_id );

		return $new_post_id;
	}

	/**
	 * Copy the taxonomies of a post to another post.
	 *
	 * @param mixed $id The ID(s) of the object(s) to retrieve.
	 * @param mixed $new_id The object to relate to.
	 * @param mixed $post_type The post type.
	 * @return void
	 */
	private function cloned_duplicate_post_taxonomies( $id, $new_id, $post_type ) {
		$exclude    = array_filter( apply_filters( 'woocommerce_duplicate_product_exclude_taxonomies', [] ) );
		$taxonomies = array_diff( get_object_taxonomies( $post_type ), $exclude );

		foreach ( $taxonomies as $taxonomy ) {
			$post_terms = wp_get_object_terms( $id, $taxonomy );
			if ( is_array( $post_terms ) ) {
				$post_terms_count = count( $post_terms );
				for ( $i = 0; $i < $post_terms_count; $i++ ) {
					if ( $post_terms[ $i ] instanceof WP_Term ) {
						wp_set_object_terms( $new_id, $post_terms[ $i ]->slug, $taxonomy, true );
					}
				}
			}
		}
	}

	/**
	 * Copy the meta information of a post to another post.
	 *
	 * @param mixed $id The post id.
	 * @param mixed $new_id The new post id.
	 * @return void
	 */
	private function cloned_duplicate_post_meta( $id, $new_id ) {
		global $wpdb;

		$sql     = "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id = %d";
		$exclude = array_map(
			function ( $value ) {
				return strval( esc_sql( $value ) );
			},
			array_filter(
				apply_filters(
					'woocommerce_duplicate_product_exclude_meta',
					[ 'total_sales', '_wc_average_rating', '_wc_rating_count', '_wc_review_count', '_sku' ]
				)
			)
		);
		if ( count( $exclude ) ) {
			$sql .= " AND meta_key NOT IN ( '" . implode( "','", $exclude ) . "' )";
		}

		$post_meta = $wpdb->get_results( $wpdb->prepare( $sql, absint( $id ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL

		if ( count( $post_meta ) ) {
			$sql_query_sel = [];
			$sql_query     = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";

			foreach ( $post_meta as $post_meta_row ) {
				$sql_query_sel[] = $wpdb->prepare( 'SELECT %d, %s, %s', $new_id, $post_meta_row->meta_key, $post_meta_row->meta_value );
			}

			$sql_query .= implode( ' UNION ALL ', $sql_query_sel );
			$wpdb->query( $sql_query ); // phpcs:ignore WordPress.DB.PreparedSQL
		}
	}

	/**
	 * Copy the options for duplicated products
	 *
	 * @param mixed   $new_id The new post id.
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function duplicate_product( $new_id, $post ) {
		$post_id     = themecomplete_get_id( $post );
		$tm_meta     = themecomplete_get_post_meta( $post_id, 'tm_meta', true );
		$tm_meta_cpf = themecomplete_get_post_meta( $post_id, 'tm_meta_cpf', true );

		// WC 2.7x $new_id isn't numeric.
		if ( is_object( $new_id ) ) {
			$new_id = themecomplete_get_id( $new_id );
		}

		if ( ! empty( $tm_meta )
			&& is_array( $tm_meta )
			&& isset( $tm_meta['tmfbuilder'] )
			&& is_array( $tm_meta['tmfbuilder'] )
		) {
			themecomplete_update_post_meta( $new_id, 'tm_meta', THEMECOMPLETE_EPO_HELPER()->recreate_element_ids( $tm_meta ) );
		}

		if ( ! empty( $tm_meta_cpf )
			&& is_array( $tm_meta_cpf )
		) {
			themecomplete_update_post_meta( $new_id, 'tm_meta_cpf', $tm_meta_cpf );
		}

		if ( class_exists( 'WC_Admin_Duplicate_Product' ) ) {

			$dup = new WC_Admin_Duplicate_Product();

			$children_products = get_children( 'post_parent=' . $post_id . '&post_type=' . THEMECOMPLETE_EPO_LOCAL_POST_TYPE );
			if ( $children_products ) {

				$new_rules_ids = [];

				foreach ( $children_products as $child ) {
					if ( $child instanceof WP_Post ) {
						if ( is_callable( [ $dup, 'duplicate_product' ] ) ) {
							$new_rules_ids[] = $dup->duplicate_product( $child, $new_id, $child->post_status );
						} else {
							$new_rules_ids[] = $this->cloned_duplicate_product( $child, $new_id, $child->post_status );
						}
					}
				}

				$new_rules_ids = array_filter( $new_rules_ids );

				if ( ! empty( $new_rules_ids ) ) {

					$children_products = get_children( 'post_parent=' . $post_id . '&post_type=product_variation&order=ASC' );

					if ( $children_products ) {

						$old_variations_ids = [];

						foreach ( $children_products as $child ) {
							if ( $child instanceof WP_Post ) {
								$old_variations_ids[ $child->menu_order ] = themecomplete_get_id( $child );
							}
						}

						$old_variations_ids = array_filter( $old_variations_ids );
						$children_products  = get_children( 'post_parent=' . $new_id . '&post_type=product_variation&order=ASC' );

						if ( $children_products ) {

							$new_variations_ids = [];

							foreach ( $children_products as $child ) {
								if ( $child instanceof WP_Post ) {
									$new_variations_ids[ $child->menu_order ] = themecomplete_get_id( $child );
								}
							}

							$new_variations_ids = array_filter( $new_variations_ids );

							if ( ! empty( $old_variations_ids ) && ! empty( $new_variations_ids ) ) {

								foreach ( $new_rules_ids as $rule_id ) {

									$_regular_price    = themecomplete_get_post_meta( $rule_id, '_regular_price', true );
									$new_regular_price = [];

									/*
									 * $key = attirbute
									 * $k = variation
									 * $v = price
									 */
									if ( is_array( $_regular_price ) ) {
										foreach ( $_regular_price as $key => $value ) {
											if ( is_array( $value ) ) {
												foreach ( $value as $k => $v ) {
													if ( ! isset( $new_regular_price[ $key ] ) ) {
														$new_regular_price[ $key ] = [];
													}
													$_new_key = array_search( $k, $old_variations_ids ); // phpcs:ignore WordPress.PHP.StrictInArray
													if ( false !== $_new_key && null !== $_new_key ) {
														$_new_key = $new_variations_ids[ $_new_key ];
													}
													if ( false !== $_new_key && null !== $_new_key ) {
														$new_regular_price[ $key ][ $_new_key ] = $v;
													}
												}
											}
										}
									}

									update_post_meta( $rule_id, '_regular_price', $new_regular_price );

								}
							}
						}
					}
				}
			}
		}
	}

	/**
	 * Check if the current user can see backend elements
	 *
	 * @return boolean
	 * @since 6.4
	 */
	public function is_backend_enabled() {
		$enable        = false;
		$enabled_roles = get_option( 'tm_epo_global_hide_product_enabled' );
		if ( false !== $enabled_roles ) {
			if ( ! is_array( $enabled_roles ) ) {
				$enabled_roles = [ $enabled_roles ];
			}
			$current_user = wp_get_current_user();
			if ( $current_user instanceof WP_User ) {
				if ( is_super_admin( $current_user->ID ) ) {
					$enable = true;
				} else {
					$roles = $current_user->roles;
					if ( is_array( $roles ) ) {
						foreach ( $roles as $key => $value ) {
							if ( 'administrator' === $value || in_array( $value, $enabled_roles, true ) ) {
								$enable = true;
								break;
							}
						}
					}
				}
			}
		} else {
			// Revert to default functionality if the tm_epo_global_hide_product_enabled
			// does not exist.
			$enable = true;
		}

		return $enable;
	}

	/**
	 * Add Admin tab in products
	 *
	 * @param array<mixed> $tabs The tabs array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function register_data_tab( $tabs = [] ) {
		if ( $this->is_backend_enabled() ) {
			// Adds the new tab.
			$tabs['tc-admin-extra-product-options'] = [
				'label'  => esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
				'target' => 'tc-admin-extra-product-options',
				'class'  => [ 'tc-epo-woocommerce-tab', 'hide_if_grouped' ],
			];
		}

		return $tabs;
	}

	/**
	 * Add data panel in products
	 *
	 * @return void
	 * @since 1.0
	 */
	public function register_data_panels() {
		global $post, $post_id, $tm_is_ajax;
		$tm_is_ajax = false;
		include 'views/html-tm-global-epo.php';
	}

	/**
	 * Check if we are in a product screen
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function in_product() {
		$screen = get_current_screen();
		if ( $screen instanceof WP_Screen && in_array( $screen->id, apply_filters( 'wc_epo_admin_in_product', [ 'product', 'edit-product', 'shop_order_placehold', 'shop_order' ] ), true ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if we are in a shop order
	 *
	 * @return boolean
	 * @since 5.0.2
	 */
	public function in_shop_order() {
		$in_shop_order = false;
		// required as this runs on ajax order as well.
		if ( function_exists( 'get_current_screen' ) ) {
			$screen = get_current_screen();
			if ( $screen && in_array( $screen->id, apply_filters( 'wc_epo_admin_in_shop_order_screen_ids', [ 'woocommerce_page_wc-orders', 'edit-shop_order', 'shop_order_placehold', 'shop_order' ] ), true ) ) {
				$in_shop_order = true;
			}
		}

		return apply_filters( 'wc_epo_admin_in_shop_order', $in_shop_order );
	}

	/**
	 * Check if we are in settings page
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function in_settings_page() {
		$current_page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
		if ( $current_page ) {
			if ( 'tcepo-settings' === $current_page ) {
				return true;
			}
			if ( 'wc-settings' === $current_page && isset( $_GET['tab'] ) && THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID === $_GET['tab'] ) { // phpcs:ignore WordPress.Security.NonceVerification
				return true;
			}
		}

		return false;
	}

	/**
	 * Register css styles
	 *
	 * @return void
	 * @since 1.0
	 */
	public function register_admin_styles() {

		$ext = '.min';

		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}

		if ( $this->in_shop_order() ) {
			wp_enqueue_style( 'themecomplete-epo-admin-order', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-epo-admin-order' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );
		} elseif ( $this->in_product() ) {
			wp_enqueue_style( 'themecomplete-epo-admin', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-epo-admin' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );
			THEMECOMPLETE_EPO_ADMIN_GLOBAL()->register_admin_styles( 1 );
		} elseif ( $this->in_settings_page() ) {
			remove_all_actions( 'admin_notices' );
			if ( class_exists( 'WC_Admin_Notices' ) && method_exists( 'WC_Admin_Notices', 'remove_all_notices' ) ) {
				WC_Admin_Notices::remove_all_notices();
			}
			// The version of the fontawesome is customized.
			wp_enqueue_style( 'themecomplete-fontawesome', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/fontawesome' . $ext . '.css', [], '5.12', 'screen' );
			wp_enqueue_style( 'themecomplete-animate', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/animate' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );
			wp_enqueue_style( 'toastr', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/toastr' . $ext . '.css', [], '2.1.4', 'screen' );
			wp_enqueue_style( 'spectrum', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/spectrum' . $ext . '.css', [], '2.0', 'screen' );
			wp_enqueue_style( 'themecomplete-epo-admin-font', THEMECOMPLETE_EPO_ADMIN_GLOBAL()->admin_font_url(), [], '1.0.0' );
			wp_enqueue_style( 'themecomplete-epo-admin-settings', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/admin/tm-epo-admin-settings' . $ext . '.css', [], THEMECOMPLETE_EPO_VERSION );
		}
	}

	/**
	 * Add scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function register_admin_scripts() {
		global $wp_query, $post;

		$ext = '.min';

		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}

		$this->register_admin_styles();

		if ( $this->in_shop_order() ) {
			wp_register_script( 'themecomplete-epo-admin-order', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/tm-epo-admin-order' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			wp_enqueue_script( 'themecomplete-epo-admin-order' );
		} elseif ( $this->in_product() ) {
			wp_register_script( 'themecomplete-epo-admin-metaboxes', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/tm-epo-admin' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			$params = [
				'post_id'                => isset( $post->ID ) ? sprintf( '%d', $post->ID ) : '',
				'plugin_url'             => THEMECOMPLETE_EPO_PLUGIN_URL,
				// WPML 3.3.x fix.
				'ajax_url'               => strtok( admin_url( 'admin-ajax' . '.php' ), '?' ), // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
				'add_tm_epo_nonce'       => wp_create_nonce( 'add-tm-epo' ),
				'delete_tm_epo_nonce'    => wp_create_nonce( 'delete-tm-epo' ),
				'check_attributes_nonce' => wp_create_nonce( 'check_attributes' ),
				'load_tm_epo_nonce'      => wp_create_nonce( 'load-tm-epo' ),
				'i18n_no_variations'     => esc_html__( 'There are no saved variations yet.', 'woocommerce-tm-extra-product-options' ),
				'i18n_max_tmcp'          => esc_html__( 'You cannot add any more extra options.', 'woocommerce-tm-extra-product-options' ),
				'i18n_remove_tmcp'       => esc_html__( 'Are you sure you want to remove this option?', 'woocommerce-tm-extra-product-options' ),
				'i18n_missing_tmcp'      => esc_html__( 'Before adding Extra Product Options, add and save some attributes on the Attributes tab.', 'woocommerce-tm-extra-product-options' ),
				'i18n_fixed_type'        => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
				'i18n_percent_type'      => esc_html__( 'Percent of the original price', 'woocommerce-tm-extra-product-options' ),
				'i18n_error_title'       => esc_html__( 'Error', 'woocommerce-tm-extra-product-options' ),
			];
			wp_localize_script( 'themecomplete-epo-admin-metaboxes', 'TMEPOADMINJS', $params );
			wp_enqueue_script( 'themecomplete-epo-admin-metaboxes' );

			THEMECOMPLETE_EPO_ADMIN_GLOBAL()->register_admin_scripts( 1 );
		} elseif ( $this->in_settings_page() ) {
			wp_register_script( 'themecomplete-api', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-api' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
			wp_register_script( 'jquery-tcfloatbox', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tcfloatbox' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
			wp_register_script( 'jquery-tctooltip', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctooltip' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
			wp_register_script( 'themecomplete-tabs', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctabs' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );
			wp_register_script( 'toastr', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/toastr' . $ext . '.js', [], '2.1.4', true );
			wp_register_script( 'spectrum', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/spectrum' . $ext . '.js', [ 'jquery' ], '2.0', true );
			wp_register_script(
				'themecomplete-epo-admin-settings',
				THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/admin/tm-epo-admin-settings' . $ext . '.js',
				[
					'jquery',
					'json2',
					'themecomplete-api',
					'toastr',
					'spectrum',
					'themecomplete-tabs',
					'jquery-tcfloatbox',
					'jquery-tctooltip',
				],
				THEMECOMPLETE_EPO_VERSION,
				true
			);
			$params = [
				'plugin_url'            => THEMECOMPLETE_EPO_PLUGIN_URL,
				'settings_nonce'        => wp_create_nonce( 'settings-nonce' ),
				// WPML 3.3.x fix.
				'ajax_url'              => strtok( admin_url( 'admin-ajax' . '.php' ), '?' ), // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
				'i18n_invalid_request'  => esc_html__( 'Invalid request!', 'woocommerce-tm-extra-product-options' ),
				'i18n_epo'              => esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-product-options' ),
				'i18n_mn_delete_folder' => esc_html__( 'Are you sure you want to delete this folder and all of its contents?', 'woocommerce-tm-extra-product-options' ),
				'i18n_mn_delete_file'   => esc_html__( 'Are you sure you want to delete this file?', 'woocommerce-tm-extra-product-options' ),
				'i18n_error_title'      => esc_html__( 'Error', 'woocommerce-tm-extra-product-options' ),
				'i18n_reset_settings'   => esc_html__( 'Are you sure you want to reset the settings?', 'woocommerce-tm-extra-product-options' ),
				'i18n_yes'              => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
				'i18n_no'               => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
				'i18n_cancel'           => esc_html__( 'Cancel', 'woocommerce-tm-extra-product-options' ),
				'i18n_close'            => esc_html__( 'Close', 'woocommerce-tm-extra-product-options' ),
				'i18n_constant_name'    => esc_html__( 'Constant name', 'woocommerce-tm-extra-product-options' ),
				'i18n_constant_value'   => esc_html__( 'Constant value', 'woocommerce-tm-extra-product-options' ),
				'i18n_must_concent'     => esc_html__( 'Please check the consent checkbox to give your permission to send your data to the server and try again.', 'woocommerce-tm-extra-product-options' ),
				'i18n_sending_data'     => esc_html__( 'Connecting to activation server ...', 'woocommerce-tm-extra-product-options' ),
			];
			wp_localize_script( 'themecomplete-epo-admin-settings', 'TMEPOADMINSETTINGSJS', $params );
			wp_enqueue_script( 'themecomplete-epo-admin-settings' );
		}
	}

	/**
	 * Delete normal mode options when a product is deleted
	 *
	 * @param integer $id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function delete_post( $id ) {

		global $woocommerce, $wpdb;

		if ( ! current_user_can( 'delete_posts' ) ) {
			return;
		}

		if ( $id > 0 ) {
			$post_type = get_post_type( $id );
			switch ( $post_type ) {
				case 'product':
					$child_product_variations = get_children( 'post_parent=' . $id . '&post_type=' . THEMECOMPLETE_EPO_LOCAL_POST_TYPE );
					if ( $child_product_variations ) {
						foreach ( $child_product_variations as $child ) {
							if ( $child instanceof WP_Post ) {
								wp_delete_post( $child->ID, true );
							}
						}
					}
					wc_delete_product_transients();
					break;
				case THEMECOMPLETE_EPO_LOCAL_POST_TYPE:
					wc_delete_product_transients();
					break;
			}
		}
	}

	/**
	 * Remove Extra Product Options via remove button
	 *
	 * @return void
	 * @since 1.0
	 */
	public function remove_price() {
		if ( ! current_user_can( 'delete_posts' ) ) {
			return;
		}

		check_ajax_referer( 'delete-tm-epo', 'security' );

		if ( isset( $_POST['tmcpid'] ) ) {
			$tmcpid = absint( wp_unslash( $_POST['tmcpid'] ) );
			$tmcp   = get_post( $tmcpid );

			if ( $tmcp && THEMECOMPLETE_EPO_LOCAL_POST_TYPE === $tmcp->post_type ) {
				wp_delete_post( $tmcpid );
			}
		}

		die();
	}

	/**
	 * Remove Extra Product Options via remove button
	 *
	 * @return void
	 * @since 1.0
	 */
	public function remove_prices() {
		if ( ! current_user_can( 'delete_posts' ) ) {
			return;
		}

		check_ajax_referer( 'delete-tm-epo', 'security' );

		if ( isset( $_POST['tmcpids'] ) ) {
			$tmcpids = (array) wp_unslash( $_POST['tmcpids'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

			foreach ( $tmcpids as $tmcpid ) {
				$tmcpid = absint( $tmcpid );
				$tmcp   = get_post( $tmcpid );
				if ( $tmcp && THEMECOMPLETE_EPO_LOCAL_POST_TYPE === $tmcp->post_type ) {
					wp_delete_post( $tmcpid );
				}
			}
		}

		die();
	}

	/**
	 * Load Extra Product Options
	 *
	 * @return void
	 * @since 1.0
	 */
	public function load_prices() {
		check_ajax_referer( 'load-tm-epo', 'security' );

		global $post, $post_id, $tm_is_ajax;

		$tm_is_ajax = true;

		if ( isset( $_POST['post_id'] ) ) {
			$post_id = absint( $_POST['post_id'] ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			include 'views/html-tm-epo.php';
		}

		die();
	}

	/**
	 * Add Extra Product Options via add button
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_price() {
		check_ajax_referer( 'add-tm-epo', 'security' );

		if ( isset( $_POST['post_id'] ) && isset( $_POST['loop'] ) && isset( $_POST['att_id'] ) ) {
			$post_id = absint( wp_unslash( $_POST['post_id'] ) );
			$loop    = absint( wp_unslash( $_POST['loop'] ) );
			$att_id  = absint( wp_unslash( $_POST['att_id'] ) );

			$attributes  = themecomplete_get_attributes( $post_id );
			$_attributes = array_keys( $attributes );
			array_walk(
				$_attributes,
				function ( &$value, $key, $attributes ) {
					if ( is_array( $attributes ) && isset( $attributes[ $value ] ) && $attributes[ $value ]['is_variation'] ) {
						$value = '';
					}
				},
				$attributes
			);

			// $_attributes holds the number of all available attributes we can use.
			$_attributes = array_diff( $_attributes, [ '' ] );

			// check if we can insert a post.
			$args = [
				'post_type'   => THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
				'post_status' => [ 'private', 'publish' ],
				'numberposts' => -1,
				'orderby'     => 'menu_order',
				'order'       => 'asc',
				'post_parent' => $post_id,
				// phpcs:ignore WordPress.DB.SlowDBQuery
				'meta_query'  => [
					[
						'key'     => 'tmcp_attribute',
						'value'   => $_attributes,
						'compare' => 'IN',
					],
				],
			];

			$tmepos = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

			if ( is_array( $tmepos ) && is_array( $_attributes ) && count( $tmepos ) >= count( $_attributes ) ) { // @phpstan-ignore-line
				die( 'max' );
			}

			// else add a new extra option.
			$tmcp = [
				'post_title'   => 'Product #' . $post_id . ' Extra Product Option',
				'post_content' => '',
				'post_status'  => 'publish',
				'post_parent'  => $post_id,
				'post_author'  => get_current_user_id(),
				'post_type'    => THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
			];

			$tmcp_id = wp_insert_post( $tmcp );

			if ( $tmcp_id ) {
				update_post_meta( $tmcp_id, 'tmcp_attribute', $att_id );
				update_post_meta( $tmcp_id, 'tmcp_attribute_is_taxonomy', $attributes[ $att_id ]['is_taxonomy'] );
				$tmcp_post_status = 'publish';
				$tmcp_data        = themecomplete_get_post_meta( $tmcp_id );
				$tmcp_required    = 0;
				$tmcp_hide_price  = 0;
				$tmcp_limit       = '';

				// Get Attributes.
				$attributes = themecomplete_get_attributes( $post_id );

				// Get parent data.
				$parent_data = [
					'id'         => $post_id,
					'attributes' => $attributes,
				];

				// Get Variations.
				$args       = [
					'post_type'   => 'product_variation',
					'post_status' => [ 'private', 'publish' ],
					'numberposts' => -1,
					'orderby'     => 'menu_order',
					'order'       => 'asc',
					'post_parent' => $post_id,
				];
				$variations = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

				include 'views/html-tm-epo-admin.php';
			}
		}

		die();
	}

	/**
	 * Save Extra Product Options meta data
	 *
	 * @param mixed $post_id The post id.
	 * @return void|WP_Error
	 * @since 1.0
	 */
	public function save_meta( $post_id ) {
		global $woocommerce, $wpdb;

		$attributes = themecomplete_get_attributes( $post_id );

		if ( isset( $_POST['product-type'] ) || isset( $_POST['variable_sku'] ) || isset( $_POST['_sku'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$_post_id                = isset( $_POST['tmcp_post_id'] ) ? wp_unslash( $_POST['tmcp_post_id'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_regular_price      = isset( $_POST['tmcp_regular_price'] ) ? wp_unslash( $_POST['tmcp_regular_price'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_regular_price_type = isset( $_POST['tmcp_regular_price_type'] ) ? wp_unslash( $_POST['tmcp_regular_price_type'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_enabled            = isset( $_POST['tmcp_enabled'] ) ? wp_unslash( $_POST['tmcp_enabled'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_required           = isset( $_POST['tmcp_required'] ) ? wp_unslash( $_POST['tmcp_required'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_hide_price         = isset( $_POST['tmcp_hide_price'] ) ? wp_unslash( $_POST['tmcp_hide_price'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_limit              = isset( $_POST['tmcp_limit'] ) ? wp_unslash( $_POST['tmcp_limit'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_menu_order         = isset( $_POST['tmcp_menu_order'] ) ? wp_unslash( $_POST['tmcp_menu_order'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_attribute          = isset( $_POST['tmcp_attribute'] ) ? wp_unslash( $_POST['tmcp_attribute'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tmcp_type               = isset( $_POST['tmcp_type'] ) ? wp_unslash( $_POST['tmcp_type'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$tm_meta_cpf             = isset( $_POST['tm_meta_cpf'] ) ? wp_unslash( $_POST['tm_meta_cpf'] ) : []; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

			// update custom product settings.
			themecomplete_update_post_meta( $post_id, 'tm_meta_cpf', $tm_meta_cpf );

			if ( isset( $_POST['tm_meta_serialized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				$tm_metas = wp_unslash( $_POST['tm_meta_serialized'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
				$tm_metas = rawurldecode( $tm_metas );
				$tm_metas = nl2br( $tm_metas );
				$tm_metas = json_decode( $tm_metas, true );

				if ( $tm_metas || ( is_array( $tm_metas ) ) ) {
					$import = get_transient( 'tc_import_csv' );
					if ( false !== $import ) {
						if ( ! empty( $import ) ) {
							$import_override = get_transient( 'tc_import_override' );
							if ( false !== $import_override ) {
								unset( $tm_metas['tm_meta']['tmfbuilder'] );
								$tm_metas = THEMECOMPLETE_EPO_ADMIN_GLOBAL()->import_array_merge( $tm_metas, $import );
								delete_transient( 'tc_import_override' );
							} else {
								$tm_metas = THEMECOMPLETE_EPO_ADMIN_GLOBAL()->import_array_merge( $tm_metas, $import );
							}
							delete_transient( 'tc_import_csv' );
						}
					}

					$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta', true );

					if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
						$tm_meta = $tm_metas['tm_meta'];
						themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, 'tm_meta' );
					} else {
						themecomplete_save_post_meta( $post_id, false, $old_data, 'tm_meta' );
					}
				}
			} elseif ( isset( $_POST['tm_meta_serialized_wpml'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				$tm_metas = wp_unslash( $_POST['tm_meta_serialized_wpml'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
				$tm_metas = rawurldecode( $tm_metas );
				$tm_metas = nl2br( $tm_metas );
				$tm_metas = json_decode( $tm_metas, true );
				if ( $tm_metas ) {

					$old_data = themecomplete_get_post_meta( $post_id, 'tm_meta_wpml', true );

					if ( ! empty( $tm_metas ) && is_array( $tm_metas ) && isset( $tm_metas['tm_meta'] ) && is_array( $tm_metas['tm_meta'] ) ) {
						$tm_meta = $tm_metas['tm_meta'];
						themecomplete_save_post_meta( $post_id, $tm_meta, $old_data, 'tm_meta_wpml' );
					} else {
						themecomplete_save_post_meta( $post_id, false, $old_data, 'tm_meta_wpml' );
					}
				}
			}

			if ( ! empty( $_post_id ) ) {
				global $wpdb;
				if ( ! is_array( $_post_id ) ) { // @phpstan-ignore-line
					$_post_id = [ $_post_id ];
				}
				$max_loop = max( array_keys( $_post_id ) );
				for ( $i = 0; $i <= $max_loop; $i++ ) {

					if ( ! isset( $_post_id[ $i ] ) || ! isset( $tmcp_menu_order[ $i ] ) || ! isset( $tmcp_attribute[ $i ] ) || ! isset( $tmcp_type[ $i ] ) ) { // @phpstan-ignore-line
						continue;
					}

					$tmcp_id = absint( $_post_id[ $i ] );

					if ( $tmcp_id ) {
						// Enabled or disabled.
						$post_status = isset( $tmcp_enabled[ $i ] ) ? 'publish' : 'private';

						// Generate a useful post title.
						/* translators: %1 option id # option title */
						$post_title = sprintf( esc_html__( 'Extra Product Option #%1$s of %2$s', 'woocommerce-tm-extra-product-options' ), absint( $tmcp_id ), esc_html( get_the_title( $post_id ) ) );

						$data  = wp_slash(
							[
								'post_status' => $post_status,
								'post_title'  => $post_title,
								'menu_order'  => $tmcp_menu_order[ $i ],
							]
						);
						$data  = wp_unslash( $data );
						$where = [ 'ID' => $tmcp_id ];
						if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {
							return new WP_Error( 'db_update_error', esc_html__( 'Could not update post in the database', 'woocommerce-tm-extra-product-options' ), $wpdb->last_error );
						}

						// Price handling.
						$clean_prices      = [];
						$clean_prices_type = [];
						if ( isset( $tmcp_regular_price[ $i ] ) && is_array( $tmcp_regular_price[ $i ] ) ) { // @phpstan-ignore-line
							foreach ( $tmcp_regular_price[ $i ] as $key => $value ) {
								foreach ( $value as $k => $v ) {
									if ( '' !== $v ) {
										$clean_prices[ $key ][ $k ] = wc_format_decimal( $v );
									}
								}
							}
						}
						if ( isset( $tmcp_regular_price_type[ $i ] ) && is_array( $tmcp_regular_price_type[ $i ] ) ) { // @phpstan-ignore-line
							foreach ( $tmcp_regular_price_type[ $i ] as $key => $value ) {
								foreach ( $value as $k => $v ) {
									$clean_prices_type[ $key ][ $k ] = $v;
								}
							}
						}

						// Update post meta.
						$regular_price      = $clean_prices;
						$regular_price_type = $clean_prices_type;
						update_post_meta( $tmcp_id, '_regular_price', $regular_price );
						update_post_meta( $tmcp_id, '_regular_price_type', $regular_price_type );

						$post_required   = isset( $tmcp_required[ $i ] ) ? 1 : '';
						$post_hide_price = isset( $tmcp_hide_price[ $i ] ) ? 1 : '';
						$post_limit      = isset( $tmcp_limit[ $i ] ) ? $tmcp_limit[ $i ] : '';
						update_post_meta( $tmcp_id, 'tmcp_required', $post_required );
						update_post_meta( $tmcp_id, 'tmcp_hide_price', $post_hide_price );
						update_post_meta( $tmcp_id, 'tmcp_limit', $post_limit );
						update_post_meta( $tmcp_id, 'tmcp_attribute', $tmcp_attribute[ $i ] );
						update_post_meta( $tmcp_id, 'tmcp_attribute_is_taxonomy', $attributes[ $tmcp_attribute[ $i ] ]['is_taxonomy'] );
						update_post_meta( $tmcp_id, 'tmcp_type', $tmcp_type[ $i ] );

					}
				}
			}
		}
	}
}
admin/class-themecomplete-epo-admin-settings.php000064400000023220150755142440016016 0ustar00<?php
/**
 * Extra Product Options Settings class
 *
 * @package Extra Product Options/Admin
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( class_exists( 'WC_Settings_Page' ) ) {

	/**
	 * Extra Product Options Settings class
	 *
	 * Add the plugin settings to the WooCommerce settings
	 *
	 * @package Extra Product Options/Admin
	 * @version 6.4
	 */
	class THEMECOMPLETE_EPO_ADMIN_SETTINGS extends WC_Settings_Page {

		/**
		 * The admin settings internal id
		 *
		 * @var string
		 */
		public $id = '';

		/**
		 * The admin settings label
		 *
		 * @var string
		 */
		public $label = '';

		/**
		 * Options
		 *
		 * @var array<mixed>
		 */
		public $settings_options = [];

		/**
		 * Settings
		 *
		 * @var array<mixed>
		 */
		public $settings_array = [];

		/**
		 * Tab count
		 *
		 * @var integer
		 */
		private $tab_count = 0;

		/**
		 * The single instance of the class
		 *
		 * @var THEMECOMPLETE_EPO_ADMIN_SETTINGS|null $instance
		 */
		protected static $instance = null;

		/**
		 * Ensures only one instance of the class is loaded or can be loaded.
		 *
		 * @return THEMECOMPLETE_EPO_ADMIN_SETTINGS
		 * @since 1.0
		 * @static
		 */
		public static function instance() {
			if ( is_null( self::$instance ) ) {
				self::$instance = new self();
			}

			return self::$instance;
		}

		/**
		 * Class Constructor
		 *
		 * @since 1.0
		 */
		public function __construct() {

			$this->id               = THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID;
			$this->label            = esc_html__( 'Extra Product Options', 'woocommerce-tm-extra-checkout-options' );
			$this->tab_count        = 0;
			$this->settings_options = THEMECOMPLETE_EPO_SETTINGS()->settings_options();

			foreach ( $this->settings_options as $key => $value ) {
				$this->settings_array[ $key ] = THEMECOMPLETE_EPO_SETTINGS()->create_setting( $key, $value );
			}

			if ( THEMECOMPLETE_EPO_ADMIN()->is_backend_enabled() ) {
				add_filter( 'woocommerce_settings_tabs_array', [ $this, 'add_settings_page' ], 20 );
				add_action( 'woocommerce_settings_' . $this->id, [ $this, 'output' ] );
				add_action( 'woocommerce_settings_save_' . $this->id, [ $this, 'save' ] );
				add_action( 'woocommerce_settings_' . $this->id, [ $this, 'tm_settings_hook_all_end' ] );

				add_action( 'woocommerce_admin_field_tm_tabs_header', [ $this, 'tm_tabs_header_setting' ] );
				add_action( 'woocommerce_admin_field_tm_title', [ $this, 'tm_title_setting' ] );
				add_action( 'woocommerce_admin_field_tm_html', [ $this, 'tm_html_setting' ] );
				add_action( 'woocommerce_admin_field_tm_sectionend', [ $this, 'tm_sectionend_setting' ] );

				add_action( 'tm_woocommerce_settings_epo_page_options', [ $this, 'tm_settings_hook' ] );
				add_action( 'tm_woocommerce_settings_epo_page_options_end', [ $this, 'tm_settings_hook_end' ] );

				add_filter( 'admin_body_class', [ $this, 'admin_body_class' ] );

				add_action( 'admin_footer', [ $this, 'script_templates' ] );
			}
		}

		/**
		 * Print script templates
		 *
		 * @return void
		 * @since 1.0
		 */
		public function script_templates() {
			// The check is required in case other plugins do things that don't load the wc_get_template function.
			if ( function_exists( 'wc_get_template' ) ) {
				wc_get_template( 'tc-js-admin-templates.php', [], '', THEMECOMPLETE_EPO_PLUGIN_PATH . '/assets/js/admin/' );
			}
		}

		/**
		 * Add admin body class
		 *
		 * @param string $classes classes.
		 * @return string
		 * @since 1.0
		 */
		public function admin_body_class( $classes ) {
			if ( isset( $_GET['hidemenu'] ) || ( isset( $_GET['page'] ) && 'tcepo-settings' === $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$classes .= ' tc-hide-nav woocommerce_page_wc-settings';
			}

			return $classes;
		}

		/**
		 * Prints a tab header
		 *
		 * @param integer $counter the counter.
		 * @param mixed   $label the label array.
		 * @return void
		 * @since 1.0
		 */
		public function tm_echo_header( $counter = 0, $label = '' ) {
			?>
			<div class="tm-box">
				<a tabindex="0" class="tab-header <?php echo( 1 === $counter ? 'open' : 'closed' ); ?>" data-id="tmsettings<?php echo esc_attr( (string) $counter ); ?>-tab">
					<?php
					if ( is_array( $label ) ) {
						echo '<i class="tab-header-icon ' . esc_attr( $label[0] ) . '"></i>';
						echo esc_html( $label[1] );
					} else {
						echo esc_html( $label );
					}
					?>
					<span class="tcfa tm-arrow2 tcfa-angle-down2"></span>
				</a>
			</div>
			<?php
		}

		/**
		 * Section tab start
		 *
		 * @param array<mixed> $value the value array.
		 * @return void
		 * @since 1.0
		 */
		public function tm_title_setting( $value ) {
			if ( ! empty( $value['id'] ) ) {
				do_action( 'tm_woocommerce_settings_' . sanitize_title( $value['id'] ) );
			}

			if ( ! empty( $value['title'] ) ) {
				if ( is_array( $value['title'] ) ) {
					$value['title'] = $value['title'][1];
				}
				echo '<div class="tm-section-title">' . esc_html( $value['title'] );
				if ( ! empty( $value['desc'] ) ) {
					// phpcs:ignore WordPress.Security.EscapeOutput
					echo '<div class="tm-section-desc">' . apply_filters(
						'wc_epo_kses',
						wp_kses(
							$value['desc'],
							[
								'span' => [
									'tabindex'  => true,
									'class'     => true,
									'data-menu' => true,
									'data-*'    => true,
								],
							]
						),
						$value['desc'],
						false
					) . '</div>';
				}
				echo '</div>';
			}

			echo '<div class="tm-table-wrap">';
			echo '<table class="form-table">' . "\n\n";
		}

		/**
		 * Setting row
		 *
		 * @param array<mixed> $value the value array.
		 * @return void
		 * @since 1.0
		 */
		public function tm_html_setting( $value ) {
			if ( ! isset( $value['id'] ) ) {
				$value['id'] = '';
			}

			if ( ! isset( $value['title'] ) ) {
				$value['title'] = isset( $value['name'] ) ? $value['name'] : '';
			}

			if ( ! empty( $value['id'] ) ) {
				do_action( 'tm_woocommerce_settings_' . sanitize_title( $value['id'] ) );
			}
			?>
			<tr valign="top">
				<td colspan="2" class="forminp forminp-<?php echo esc_attr( $value['type'] ); ?>">
					<?php
					if ( ! empty( $value['html'] ) ) {
						echo apply_filters( 'wc_epo_kses', wp_kses_post( $value['html'] ), $value['html'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
					}
					?>
				</td>
			</tr>
			<?php
		}

		/**
		 * Section tab end
		 *
		 * @param array<mixed> $value the value array.
		 * @return void
		 * @since 1.0
		 */
		public function tm_sectionend_setting( $value ) {
			echo '</table>';
			echo '</div>'; // .tm-table-wrap

			if ( ! empty( $value['id'] ) ) {
				do_action( 'tm_woocommerce_settings_' . sanitize_title( $value['id'] ) . '_end' );
			}
		}

		/**
		 * Right panel start
		 *
		 * @return void
		 * @since 1.0
		 */
		public function tm_tabs_header_setting() {
			echo '<div class="tm-settings-wrap tc-wrapper">';
			echo '<div class="transition tm-tabs">';
			echo '<div class="transition tm-tab-headers tmsettings-tab">';

			echo '<div class="tm-sidebar-head">';
			echo '<h2>' . esc_html__( 'EPO Control Panel', 'woocommerce-tm-extra-checkout-options' ) . ' <span>' . esc_html( THEMECOMPLETE_EPO_VERSION ) . '</span></h2>';
			echo '</div>';

			$counter = 1;
			foreach ( $this->settings_options as $key => $label ) {
				if ( 'other' === $key ) {
					$_other_settings = THEMECOMPLETE_EPO_SETTINGS()->get_other_settings_headers();
					foreach ( $_other_settings as $h_key => $h_label ) {
						$this->tm_echo_header( $counter, $h_label );
						++$counter;
					}
				} else {
					$this->tm_echo_header( $counter, $label );
					++$counter;
				}
			}

			echo '</div>';
			echo '<div class="tm-tabs-wrapper">';
			echo '<div class="header tm-flexrow tm-justify-content-between"><h3 class="tm-flexcol">' . esc_html__( 'Extra Product Options Settings', 'woocommerce-tm-extra-product-options' ) . '</h3>';
			echo '<div class="tm-flexcol">';
			echo '<button type="submit" class="tc tc-button tc-reset-button tm-flexcol" type="submit">' . esc_html__( 'Reset settings', 'woocommerce-tm-extra-product-options' ) . '</button>';
			echo '&nbsp;<button type="submit" class="tc tc-button tc-save-button tm-flexcol" type="submit">' . esc_html__( 'Save changes', 'woocommerce-tm-extra-product-options' ) . '</button>';
			echo '</div>';
			echo '</div>';
		}

		/**
		 * Section wrap start
		 *
		 * @return void
		 * @since 1.0
		 */
		public function tm_settings_hook() {
			++$this->tab_count;
			echo '<div class="transition tm-tab tmsettings' . esc_attr( (string) $this->tab_count ) . '-tab">';
		}

		/**
		 * Section wrap end
		 *
		 * @return void
		 * @since 1.0
		 */
		public function tm_settings_hook_end() {
			echo '</div>';
		}

		/**
		 * Additional html
		 *
		 * @return void
		 */
		public function tm_settings_hook_all_end() {
			echo '</div>'; // .tm-tabs-wrapper
			echo '<div class="tm-footer">';
			echo '<div class="tm-flexcol">';
			echo '<button type="submit" class="tc tc-button tc-reset-button tm-flexcol" type="submit">' . esc_html__( 'Reset settings', 'woocommerce-tm-extra-product-options' ) . '</button>';
			echo '&nbsp;<button type="submit" class="tc tc-button tc-save-button tm-flexcol" type="submit">' . esc_html__( 'Save changes', 'woocommerce-tm-extra-product-options' ) . '</button>';
			echo '</div>';
			echo '</div>';
			echo '</div>'; // .transition.tm-tabs
			echo '</div>'; // .tm-settings-wrap
		}

		/**
		 * Get settings array
		 *
		 * @return array<mixed>
		 * @since 1.0
		 */
		public function get_settings() {
			$settings = [];
			$settings = array_merge( $settings, [ [ 'type' => 'tm_tabs_header' ] ] );

			foreach ( $this->settings_array as $key => $value ) {
				$settings = array_merge( $settings, $value );
			}

			return apply_filters(
				'tm_' . $this->id . '_settings',
				$settings
			);
		}
	}

}
assets/webfonts/fa-solid-900.eot000064400000573022150755142440012432 0ustar00����LP�Kb32Font Awesome 5 Free Solid
SolidL330.752 (Font Awesome version: 5.12.0)2Font Awesome 5 Free Solid
�PFFTM�����GDEF*��OS/2C�V�X`cmapM%���gasp���glyfk�U�,���head��6hheaC$hmtxo���locaxڴ� maxp)S8 name�'$�h+post7��Ŕ/J��3bK�_<������������������P @��LfGLf��PfEd���A���.�T:� �����@�`�@@��@��@������@@�������@�`@�@����@���@@��������@���@�@��@��������@@���@��@�@������@�@@�����������������������@@��@
@
@
@�@���`�������������@@@@@��@����@����@������@`�������@���������@����@@ ��@��@����������������������������������������������� ���@������� ��@@��@@������� � ��@� �  ����������@@���������@������������ ��@�@���������������@����@��@�������@������
��
��
���@@��@��@�`@������@@�������@��@�����������@�@����@���@@@��@�����������������������@@@�������@�������������� ������������������������@�������������������@@��������@���������������������@��h��������@�@��������@����@��@���@�@��@�����������������������@ @���������@@�����������������������@������������������ ������������@�����@������������@���@������@�@��@������������@��������@�����@���@ ������@���@@�������������������@��@�����@��@���@�@���@���@��������@������������ �������@������ ���������@�����������@�@@� ��� ������������������������������@�������
�
������������>�D�N�[�^�n�|��������������������������������"�.�1�5�:�>�D�F�K�N�Y�^�e���������������������������������-�6�9�I�N�]�l�w�z�������������������������������������(�8�[�]�`�b��������������������������"�$�4�6�:�<�?�A�C�E�G�K�N�P�S�X�]�_�b�f�m�r�t�y���������������������������	�����������������������������������!�0�7�<�A�D�G�J�O�Q�U�X�^�b�f�k�m�o�t�v�y�|�����������������������������������������������"�)�/�=�@�C�G�M�S�V�[�_�i�k�s�}�����������������������������������������������������*�/�>�J�L�P�S�c�m�y�}���������������A�����������!�A�H�P�^�`�p���������������������������
���� �$�0�3�7�=�@�F�J�M�P�[�`�����������������������������
���!�3�8�@�M�Q�l�q�y����������������������������������	��(�7�X�]�`�b��������������������������"�$�3�6�9�<�?�A�C�E�G�K�N�P�S�X�\�_�a�f�h�p�t�w�}�������������������������������������������������������������!�.�7�;�A�D�G�J�O�Q�S�X�]�b�d�i�m�o�t�v�x�{������������������������������������������������"�(�.�;�@�C�G�M�S�V�Z�^�i�k�r�|�����������������������������������������������������)�/�>�J�L�P�S�c�m�y�{���������������A����������������������������������������������������|{zywjihd`]TSRQNEDCA?431,+%" 
�����������������������������jigfH&


�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�

~
}
|
v
h
c
_
]
\
[
Z
R
N
L
J
H
2
'
&
%
$
"
!
 













	������������������������������������|ywvtjihgfeb_]\YWPOMCB=<63.*	����������������������������������������~peda_PG<;87.)
�
�
�
�
�L�`�d���H�p		�
����
<
�D$�L�H���p<���|��p8��\���\� ( p �!!�""\"�"�#D#|#�$0$x$�% %l%�&&�&�'x'�(�) )�)�*H*�++�,`,�,�-�..�/</�0,11t1�33�3�4�4�5<66�6�7088�9\;�<h<�= =�>�?8?�@@�AA�B$B�C|D4D�E�FTF�G<G�H$H�IpJ�J�KDK�L�M�M�NhOO�P0P�P�QlR8S�T�UPU�VTWW�W�W�X$XTX�X�Y,Y\ZZ�[,[�\\] ]�^L_@``�aa�b�cpd8d�eXe�fXf�glg�h|h�ii\i�jj�j�k,k�lXmm(m�n(n�o0p�q�r$r�sTs�t,uu�vtv�w,xx�y<zz�{t{�|�}<}�}�~\~��������$����t���l�(�����H���d�����4���L�h���`�D�(����������\���4���<���h������h����T����0� ���d���������X���T�H����l�������8�D���@���<���X�d���p�`�����X�����D�h����$���d�����$���8����������D�4�����Ũ�0Ƥ����`�T�4���̌� ͨ��8�H��Р�Ѩ�t���T���0Ԕ��ՠ�P�$�x����ـ� ڬ�(���l���d�8���`�(�����`�0���0��4����P������T�0����������p��|��L����8�����l� �����(�����8p�<(x(�h�$�		�
� l�$d��
�p� t��(�8�8��L�|��H�0���p�p�| !�""�#`$4$�%�&�'|'�(l(�))�++�, ,�-\-�.4.�/�0�1�2p3 3�4L4�66d77�8h8�9l9�:�;�<�=d>>�>�?�@@@�BB�C,C�DDE\E�FhGH@II�J\K�L�M(M�N<N�OHO�PTQ Q�RRpS|TT�U�V�W(W�X�YY�Z<Z�[l[�]p^�_�`8`�a�bxb�cxd$d�e8e�f|ghhh�h�i�j0j�j�kXk�l8l�mpn,o@o�pp�qHrr\r�s�t�uLu�v�w�x<x�y\y�zX{${�|�}d}�~`h������ ��� �T����x�����\�D���`�`��|���|�����������������8�����0���X�0�T�0����(���t���x���P�t�������4�������L������0��� �������X��x���$��������(����� �����<°�\ì�@���H��Ƭ�ǘ�P���x����|�$��͔�\���`�L���L��l���,՜�D��׌�l���H��ڜ��ܠ�(���ߤ��4�H�����L���H��h��0�|�D���d����P�������`����T�����������0��l	H
��

�P�hT\�d���T$�,�T��� �!!�"�#%& 'H'�(d*�+,,�-�.H/@/�0$11�2833�4`4�66�8D8�9�:�:�;�=0>?4@�BXC�D�E�F�GpH�I�J`KK�MLNN�P(P�Q�R(SS�UPVPWX(X�Y�Z�[$\�]]d^^h_�`P`�a\a�b�c$c�d�e�f�f�g�hhiDj0j�l m n�o�pp�q�rDr�s�tLt�t�u�v$v�v�w�xXx�y�z4z�{x||�}X}�~�(��`��������� �����`�@�$����������D���h������������32+"546;5'&63!2��8�8������**��� 632"&46325"&4632467�		8P88(�8P88(
	�		��%%6%�K�%%6%
���!%"/&=#"&46232&264&"�d8HVzz�z,
�jKKjKd
,z�zzVH8KjKKj�����"/&6767>�/+�

�+/)k&&k�(|+�

�+|(#	''	��1�62/&?'&6?	(	A�j �� j���&g�	DD
�g&����$"&4622#!"&=46;27jKKjK&7O��O7#L#�KjKKjkO7**7O	�/;GS_kw��2+54+"!54+"#"&546;;2=!;2=54+";2=4+";2=4+";254+";2=4+";254+";2=4+";2=4+";2�

(��(

(@(��((((((����p((((((�
��

P
��((l((l((�``�``�((l((l((���/?32+"&=46#2+"&=46346;2+"&5"&=46;2#(�

�
F

�


�

�
(

�

�
�

�

�

�
��

�


�

�
	��� 0BRbr��+"&=46;2+"&=46;2746;2+"&5#+"&=46;22+"&=46346;2+"&5%"&=46;2#"&=46;2#%46;2+"&5�
e

e
�f

f
 
e

e
 f

f
�

e


e

e
�

e

e

e

��
f

f
�P

P
�
P

�

P

	
P

�
P

P
�

P

�
P

P
�
P

P
h

P

���/?O_7+"&=46;246;2+"&52+"&=463"&=463!2#463!2#!"&5"&=463!2#�
e

e
�
e

e
}

e

�



��


��




�P

P
�

P

�
P

P
�@
P

P
�

P

�
P

P
7'&4?62762"��%p�%��	�$p�$����aq#7"/"/&4?'&4?62762�d		
	dd	
		dd		
	dd	
		�d	
		dd		
	dd	
		dd		
	���5=++"=#"=4;54;232"/&=#"&46232&4&"208 88 8�d8HVzz�z,
d�PpPPp 88 88��d
,z�zzVH8d�pPPpP���%-+"=4;2"/&=#"&46232&4&"20���d8HVzz�z,
d�PpPPp  ��d
,z�zzVH8d�pPPpP����)9#".54>7632654&'.?>+"&=46;2�08�gCrC. 	
bFEc$ _
 

 
�"k=g�BrD)L>	"'EcbG'G	�

�

��h�/?O72+"&=4632+"&=463%2+"&546372+"&546372+"&5463�		0		P		0		0		0		�		0		�		0		�	�		�	`	`		`	�	��		 	`	��		�	`	� 		�	����<D%/'&=&''&'&?&47'&767667547676264&"�	&+"	76
"*	&	**	&	*"	77	"*	&	*�B//B/�
5)1

1)5	$
5)1

1)5
##-/B//B����A�D62+"&=4.+"+"&=%#"/&"#"/&54?62546;2�	p	@		p	����"
Z8,��	
`	`
	�1���JI�����2"&4?6/54+"�Α�Α1
	@0��Α���	'
.����E�"0B%+'4&+"#"&76;;265'32;26/&+"2>5'4&+"3=�	D��bb�((7	.	-bb@4,,�00���+3;3232"/&6;546#!"&=46;2?324&"264&"2�P
X
	��	

X2
�0

�1*1�
|L�
�	��	�
��p

p
11j@�%#!"&=4?>3!23373'8� j
��U{ p {U����

+�@@����<2+"&=46303.#"3267632#".54632'41463��eU'IggID")-.CsB�fIA��/ .g�g"

BrDf�)R���*T4146;2+"&=463.#"+"&545>322676;2#"&'1+"=46;2#'�/�fU':d

1�ZIA�9d
1�Z0n/�fV��/ .O8	Ws)��O8	Ws3$R�/ .���'3?K!"&5463!2"264"264"264754+";254+";254+";2�`���""""""������� `��h""I""I""�  T  T  ����%2#!"&=46;5462#54&"���Y~YP*<*���H?YY?HH**H���'276#"&#"+"&5&54662^0E;?$h>4

"!Gh] �	)#^

�!

#���12+"&=46;254&"6;2+"&/.=4�Ԗ
A-

/!q�q!/

-A
��j0-?
�
"OqqO"
�
?-0j���6/#"&=46;�Yf

fy��Y
�
����#6/#"&=46;.6764'.>�Yf

f�				x��Y
�
)0).��@�'>P6/#"&=46;%.67>54&'.>&'&67>4.'.>.6764'.>�Yf

fB<DD<	!/91	(-)			
)a				y��Y
�
�'~�~'=J';h!�`S	$,.,$6)0).	����#'+=3'3573#75#53'35%3#5##5333#'3#��@����@����@  ` @`@  @  ��@@@�@@@�����@@@� `� �   �#'+/37;?13333333333333333333333333333333			$										���������������������������������������������������=46;2"/&6"264���(��((���(���((����)%"/&=46;2264&""'764/32��(���((2�(��1��(����((���J��(����#/8%#!"&5463!2;2=4+";2=4+"&7!"3�		
��(88(H
���������

X4
8(@(8
nF�  ����
463!2' �@��0p���#'082+#!"&=#"&=4635463!25!%5#"&=#264&"�%	0
��
0	%

	.	@�0	�&%p	`

`	p%�
	.	
��``�`	0�H���"*#!"&546;7>;2324&"26"&462�`X

~X�FdFFd&4H44H0�� !	!�dFFdF�H44H4����-0%2+"&=46;'#32+"&=46;>;2'3'�		�		�		�		�	0	��^/ 	 		 	@@	 		 	j	

	��������%-%+"&=46;#"&=46;2'3264&#264&+MR6�		  		�9L�W  W�?$4F	0	 	0	T9$a`(��!.!p��@�#+32+"&=46;#"&=46;2@	?P/		�		?P/		�	� 	��	 		 	@	 		��C�-I2+"&=#32+"&=46;#+"&=4632"/&6;5#"&?62+0		 	8(		�		(8	 		 PP00PP0�	`		 ��	 		 	0 		`	��PP�PP�����-I2+"&=#32+"&=46;5#+"&=463&=#/&4?63546�		 	x		�		x	 		[PP�PP��	P		p	 		 	p		P	��PP00PP00����/?7"&=463!2#"&=463!2#2#!"&=4632#!"&=463
���		�`		�		�`		`&&&&@	 		 	�	 		 	����/?2#!"&=4632#!"&=463"&=46;2##"&=46;2�		�`		�		�`		\��� 	 		 	�	 		 	@((�((����/?7"&=463!2#2#!"&=4632#!"&=4632#!"&=463		�				�`		������	 		 	�	 		 	�&&�&&����/?%2#!"&=463%2#!"&=463%2#!"&=463%2#!"&=463�		�`		�		�`		�		�`		�		�`		 	 		 	�	 		 	�	 		 	�	 		 	���/?O_72+"&=4632+"&=4632+"&=4632#!"&=4632#!"&=4632#!"&=463P		@		@		@		@		@		�		��		@		��		@		��		P	@		@	@	@		@	�	@		@	�	 		 	@	 		 	�	 		 	����+;K7'&4?62#!"&=463%2+"&=46372+"&=46372#!"&=463e``D		�`		�����		�`		U``�-	 		 	�&&�&&�	 		 	����+;K7&=462#!"&=463%2+"&=46372+"&=46372#!"&=463`5		�`		�����		�`		U�`�	 		 	�&&�&&�	 		 	@�2#!"&54636/5P���"#n��� &�K��")"&5463!2"264!5'&'&�`���.!!.!h�X�8H ��H!.!!.�pX�8H����.5462"�="
p�p
"=6#X$5"PppP"5$X#
����
6462"7264&#�Α��gLllLYΑ�Α@l�l��`�!"&54>762264&#"&54&"�6,!g�g!-5-		!/		B�4_6I&JhhJ&H8^4�@		/!		.B��@�7.?67/&?624?6#!"&5463!2+!�Z�\
��$Z$ �(��(�@mZ�
\� #Z#��(�`(��@����4;276/+"@0�%%�0���
��
�����54;27676//+"(�%�%%�%�(h��
��
��
��
�����7&4?6'7&4?6'�%%@�%%�

�
��
�

�
��
����%&546���13�6������#"&546;2%+"&546;2�`````��0`����2#!"&5463������`���%&546&546��%%@�%%�

�
@
�

�
@
���+"=&=&54654654;2(�%�%%�%�(t����
��
@
��
��@����+"=&54654;2�0�%%�0��X��
�
��������%#!"&=463!2%"&?62#�
��

�
�p�*�@@

@
39��9��%�?62"/&4#�����������%�%"/.?'&6?62�������������#2"&454+54+"#";;2=32�Α�Α�\8\\8\��Α�΃8\\8\\����2"&4!2=4#!"�Α�Αt����Α�Ώ88����#2"&4'76/&'&??6�Α�ΑrBB(	AA	(BB(	AA	(��Α�ΨAA	(BB(	AA	(BB(����"&46276/&'&��Α�΄��Fh'Α�Α����Fh����+3"&462"7>32;2=4>54&"264��Α��`J+	#	

8H &&'Α�ΑR@		



	&*<�&&����'2"&4$"26454+54+";#";2�Α�Α	""@X��Α��#""�d@���(PX%2++"=.'#"=4;>754;2>7#"=4;.'+"=32+54;24"&462�3N.(FeeF(Fe�,?
))
?,(,?
))
?,(�(.N3eF(FeeF�
?,(,?
))
?,(,?
)y����
2"&4.67�Α�Α�`�4&��`�4��&��Α��`&��4`&4������%"/&4?62!2#!��x

��x��s
 
s����762"/&6?!"&=463!'.���x��

x}��s
 
s����7'&4?62&/+"&5#��s
 
s���x��

x����%"/&4?646;27>���s
 
s���x

��x���&='.54>7546��1D2
#02LP4�

X*@+U,,B)	P
����!2C546;2++"%4;2+"=#"52+"=4;543+"&=4;232
|T( |
(T�
|T�|
(T|
(T�
|T�|
(T�
|T����!2C#"&=4;232%+"=4;54;2+"=#"=4;2+"=46;2+�|
(T��
|T((T|
�(
|T
|T(
(T�XT(
||
(����#%2++"&=#"&=46;546;2�

�
 
�

�
 
�
 
�

�
 
�

����%2#!"&=463�

��

�
 

 
����6%/+"&?&/&6?'.?>'&>;276�	�&�	��	�&�	�r	"	T��T	"	NN	"	T��T	"	N����"&462"264';2574&+"��Α��T&&Z0@'Α�Α��&&������
.9C353#"&53#2#!"&=46;&54632>32!3.#"3264&#" ��
�
 
	� 	
,
4$..$4
��V#!� ����
@
P		P
$4 $$ 4$5"$%����@�'&'.7>3264&#"&546;26762"�u8[5	 @Q}G		�upPP/O�BN��	.%,.
/>0"		TPp/)����!"&547632654.676�#11#q�q7%&
"�2,2M/OqqON9U&% "*=%
@�-%#".'&47>22654&"72"&54732654'6=*�[<oV*����<TTxTT<(88O9	�Pa-O5Paa�T<<TTxT�8O99'
	����3J%27#"&'&4767#"'&54?632>32'654&#"654'6320@

4)%[�*i'@_���57[�*
0IT<6I	

'80)
aPQ%=#:�c
aP<9<T98'����H�!%#!"&762"264';2574&+":
� 
�8&&Z0@00���&&�������@�*2++"&?#+"&?'&6;23'&>;2�BBri	B	1g+(	  	(+g1B	i'2'�
�:ll:������	!-9EQo!#!"&%;2=4+";2=4+"';2=4+";2=4+"';2=4+";2=4+"2!546;546;23546;2���@((((�((((�((((P�@0	 	�	 	���((�((t((�((t((�((@000		00		0���;%&=#"/73546%"=4;2'!#+"=4;76;546&5�P;F55 �coF55  �oT�;PPYP(K:9(g8K:9�8�(PP�����2#"'#"&'&>7&54�Ԗ�j83AL9�z�z319JV���?#"&=46;2%+"=46;232".54546;226=46��hY�h��Nt{tO�2<2,PPP|,	Ht;;tG14-44-4;�E/&/&4?62�����=����;�E7'&4?>76"�����C������}�!C%"/&4?625#"/&6;2762+"&="/&4?62"/32vee(�	�
(���
(ee(�	hdd+�
�+
�+dd+���B�.%#!!2"&547#"&547#"&=46;2!2��
 !.!�!.!FF

g
	�� #!!!! W

-�2#!"&546;��`�@@� @D� %#!"&?>3!2%"46;32=I!�pI!��T 	E�@��|
|
8v@0�/?T%"&=46;2#3"&=46;2#!"&=46;2#3"&=46;2#2#!"&546;2M&:&��&:&�		�0
	 	�����FF��@	 	
P		�����-5=M!2#!"&546";2=4#2=4&+"#"3264&"62"&4265463264&#"0��`	t@	���dFFdFTH44H4!	
		&���` 	
`J	-$��FdFFd�4H44H4	
		&���"*#"'+++"&=4?&54>32264&"gI%
(
p
�	/Q0Ig�((Ig(
(

N
�0Q/g((������;C����'&'&?&'#"'&76;67'&767667632+/'>'&/'.=&''&'&?&7'&76766754676276>.6'&'&?&'#"'&76;67'&767667632+/'>'&







&	
&	g"	!
&&	
 
!!
 	&&
 
"{#0#0	







&	
&			
			
	

	>##�
(
""
'
 
'

"	
"&
50#0#�		

				

		>##����B�+#"'#"&'&767&5462#"'#"&'32654'�zV<3+.&z��.+3<@hc�9HB�^")3B^��"
6,qO	Q13�� �
&?'&6?6 � j�A	��HD	�g&�����,%+"/&=#"&546?#"&=463!2+*&
�
�
0&*



*� -
h00h
$<v
0

0
��@�19A232#!"=46;5.'&'&=46;5463!2&'#%5#676(
>0>%0%��%0$>0>
h

��@�@#�
88-"4HH
&"-88
(

(�
)--)
���/7?%#"&=#"&?62+7#!"&=46;;26=324&"264&"2(P
X
	��	

X�
�0

�!P!�
|L@
�	��	�
p

p
!!j�����#7&.7>&>676>.2327>�"		
'BF:;-+
+"		
'BF:;-+
�4j
^�"+
+-;:FB'
		"+
+-;:FB'
	c
j4,^�����#"/&?6>7'&?6���p1;[<0����h0<\:2p����.2#!"&54632654/"#"'&#"���.x�A
%#KF	���`���x	FK#%
A����&%2#!"&=46;5462+"&=4&#"���Y}Z
 
+*���f@ZY?

*+g��@�	!+=!#!"&7;2=4+";2=4+"!5463!2@� ����HH�����X((((00����16"&462+"&5.'"&=463+"&5.'"&=463�%5&&5�	0	wT	
t��	0	ː	
V�sF;5&&5%o
	Tw	0	�t
	��	0	Gr�@�&.%#!"&=463!2'!"7>3!2&"264&"264@� �0� a
a3s�``<�

�`��@�,4$#"/&++"'&547#"&=46;2?632#2@ 	UBUK"%%�UBU	@!TkkT�J�
D5+"#5:%`%5D
��C`C�����;%//&/&?'.?'&6?'&67>7676�.

?>	--	>?

..

?>	--
>?

�-
>?
..
?>
--
>?
//

?>
�'7?%+#*#"&'.=47>763232+"&=46;24&"2d

##GE
	��`
0

0
�
+% $
	�

-+
�

�
��&6>3&'&632#*#"&7.7.7#"&54632+"&=46264&"-�	
EG#('

d�0

0
$
+-

�	
$$#%+

�

�
�������'7?2666+"'.'&54654632+"&=46"264�
+%#$$
�

-+
�

�
��d

'(#G
E
	��`
0

0
������&6>5&547>76;2'''#"&546;2+"&64&"2\
+-

�	
$$#%+

�

�
��	
EG#('

d�0

0
����%"&462'326=4&+764/&"2?64gΑ�Α�L�

�L��8�Α��H

H������%2"&47#";2?64/&"�Α�Α�L�

�L����Α��H

H������%6462"'7;26=2?64/&"2�Α��H

H��YΑ�Α�L�

�L������%"&46254&+"'&"2?64/&"��Α��H

H��'Α�Α�L�

�L��	����
"+17=#>2473#%#&'%#>#64'#&4733"&673%3.P�0:0���Bl#5S��$lSk		r�r		r(�0:0�$lS��l#5S DTT�@  @ �\2K[2\3K�    !>!@"!>!!DTTJ2\3K~\2K�����$'"&4?&67>76264&"�	P&�5%�
J$JDK
�<S$I
�%5�%Q	
KDJ�����+3CSc"/&4?62762"/&4?627622"&4%2#!"&=4632#!"&=4632#!"&=463�I
/
@
H
/
@
\((�		��		 		��		 		��		�	H0
?�
H/	?�((	 		 	@	 		 	�	 		 	�����2/&='&63��P
�����
8��'+%53#!"&=3;2672!546;546;2#5#@��`�	`	��P�@�p0��0		�PP00  �����;%"/&6;5#/&4?635#"&?62+3546&=#32`OO3eOOe3
OO3eOOe3
OOe3OO
3eOOe3OO
3e����&:H6"&462"&4622+.'63*&4622#!"&=46;27'#"&=46;2z4&&4&�4&&4& &
B �\BB\B#0C��C0	!F!�(B
&@�&4&&4&&4&&4F& 
*!B\BB\bC00C
:#
 &�����%K"&4?62?64'&'&5&?66&'&'&?>'&"&'&4?6G,,D,~Y,&	
<C	jY,&	
<C	
,,D,-~,D,Y~,&
	;C<
�Y~,&
	;C<
	-~,D,����%#!"&5467454632632.K5��<T6*^B,J(8�$65KT</JB^,$8(����%%#!"&?5#"&=46;2+3'&=#�(*��*(u

�

��0@,#II#��



�iN
��
����'/7%"/"&46327'#"&462762264&"264&"�		Ft8P88(!!(88P8tF		����	s(88P8!!8P88(s	F������#,!#!"&546;3;#!"&546;#532@
��

H!�
h
��

�y`
(

p
��!X
��

p
I
`������2&6?62&'&6?6?64'&"2?6"++,�"^!!!�@��		�(�3H��-~--�"""_!�?��		�*�K5��-����(#!"&5463!2264&"4/&+";25����6%%6%���>��`��%6%%6h����2#!"&5463������`����/"&=463!2#"&=463!2#"&=463!2#		�		�`		�		�`		�		<	(		(	�	(		(	�	(		(	���'7G2"&42"&42"&4%2#!"&=4632#!"&=4632#!"&=463((((((�		��		@		��		@		��		�((�((�((	 		 	@	 		 	�	 		 	�����*:JZt�7#"'&?63254+"/&?67#"=4;20%2#!"&=463%2#!"&=4632#!"&=463'"=4;5#"54?6;232#"=4>54#"/&763232#>	9�		��		@		��		@		��		�D		


'/		
		�	 		 	�	 		 	��	 		 	�@X�
	���1T%2#!"&=46;&'&54>;2#"'.+"3+"./&54?632;2654&�		� 		f!9"D C	+

B
W^H4D.%
	+


B�	 		 	"9!)

`3I!

	����/?"&=46;2+26=#"&=46;2+"&=2#!"&=463 		�		 /B/ 		�		 ^�^p		�`		�	 		 	�!//!�	 		 	�B^^B���	 		 	���2#!"&54635#75#5#75#��`�����������`��``�``�``�``���'+/?/?/?"/&47627'�    �5555E5555b		��	
U		l	
;W3V`   `555�555�
	��		U
	l		�V3W����'/7<%2+"&5#"&5#"&5463!232264&"264&"75'#p		08P8�8P8@,d�,((\((�d,`	 	(88((88(@0dlp((((�dp��!&+2#!"&546334&#5265#264&"5"75#`

��

@%%@�B//B/`%@@%�
��

@
��%�%�8P88Ph@%�@%W9!2"/&6
	��	
	��	`9	%!"&?62!��
	��	
`	��	'�Y/&4?6�	��	A��
	��	
'�Y546&	��	?
	��	
���2#!"&5463#!#��`�������`����
��3�732"/&6%+"&?62)�ww�w�wwiw
��3�732"/&6)�ww�ww
�4�%#"&?62�ww�ww�:6#!"&=4632>76".#&'&=463!2"��`!y
	v�z4	�	1}��X	
	Ue	Y(&[	����+7#"&=4;2>3#"'&?63264&#"32��0#a6g��g_G
	"	2BIggI+Jb��N'+�͑@		",g�g'!0���7%"/&4?'"/&4?627'"/&4?62762�|(Q		s		.		s		Q(}q�}(Q		s		.		s		Q(|q����D�2#"&?#".?>;2(�.w 
�* ����
�����5EU72+"&=4637#546;5#"&=46;2+32#5##52+"&=463!2+"&=463�

`

H0�(

�

(�0�0H

`

P

`

`
`

`
P0:@
`

`
@:000P
`

`

`

`
����B�-C%'."'0.#""'.&7>75462632#"&'&>3265@57	(74�\\���/!*	�

#+
'"+$
cz



zx�!/
		����/8#"&546;6232#"6"2643+"&546;7#532�h

QJQ
�!*�h
�

�r`
B�
P
  
H!y��

0
h
&`B��`�
 053+"/&46320#41&'&7264&#"26546`�
>	`dKJg,%�%,�		.B		/&&
 GigIB2+00+2�		B.		!/����U$"&462462"7#!"&=4672654&'527267?6/546?6=4&'jKKjK��6J��@0!.!:$00 
$�KjKKj��N5--1KQ!!R

.,, 
*,���BJ2#"&'.=46?6326='.?>326=&7>264&"� gIGg7I?
	9('8
?I73.B!$			P%qEc_DY9�	
	
{(8:'z



	�9X.=+q&%P			���	
!46;235+32#"&546;�����00�`00 ��p�  P�`��������+"&537#!".54767>54675462�4&��	��		H8%:!@%q

	
C,:V

,B&,C������'7"&=463!2+##3264&!"'&763!2�(8
�5KK5 8(�  &&�!	
H@8(�
KjK(8 �&4&�� 	����'3;GSo!54;46;546;23232#";2=432=4+"#"3547#";2=44+";25'3;2=32=4+54+"#"��@
X
p
X
�((�((t(@4((�((
,h
H

H
�� ((@((�TT`(((�����'/KSX%2+"&5#"&5#"&5463!232264&"754+54+"#";;2=32264&"75'#p		08P8�8P8@,d�,((�808808�((�d,`	 	(88((88(@0dlp((�088088�((�dp���
%I3546;2335+32#"&546;4&+54&+"#";;26=3265` � ��@ 	0	 	0		0	 	0	 `00���  P�`���	0		0	 	0		0	����/%#32+535##'53535'575#5#57335#532+3 ``�0u(s0C"0@@0"C0s(u0���PE*EP������".:2#!"&5463!254&+7626=4&"26=4&"p!/Q
��


@	07	�			W			`/!�'
$*

�

(с	�E	�		�		�		�����3#!"&5463!2#"#54&+";26=3;26=4&���`p 	�	 		 	�	 		p��`D	PP		�		PP		�	����+2#!"&546354+54+"#";;2=32���@\8\\8\���`�8\\8\\�a*?62"/&4&4?62"'�``���``ш``
��``�a+7"/&4?'&4?627"/&4?'&4?>2�``���``			��``��``����A�+7"/"/&4?62'62"/"&/&47��``��``			��``���``����A�)7'&4?62762""/&4?62762��``��``��``���``�a?62"/&4 �``�ш``
��a7"/&4?'&4?62�``���``���XA("/"/&4?62��``� �``���X@(7'&4?62762"��``�`�``���@�#2+32#!"&46;7#"&5463!�H

��

H��@���00@�� ������!%%2#!"&=46;;267!463!2!p	&�&	�
=��@�� 	&&	p��P�������2#!"&5463264&"������`�� ��@�2+"&5463264&"�c��`�� ���9%2+"&=46;2+"#2+"&=46;2+"��^B

&��^B

&���B^
0
&@��B^
0
&@���92+"&=46;26=#"&=463#2+"&=46;26=#"&=463�^B

&P�^B

&P��B^
0
&@��B^
0
&@����'/7"&4622"&462"&4 "&4622"&4$2"&42"&40(((((�((��((((B((��((�((�`((�((((�((((B((����2"&4�Α�Α��Α������)2"&4"264&"26464."'.2�Α�ΑU��	
#n#
	-���Α���**6����%2"&4"264&"264>'&"762�Α�ΑU��-�-#n��Α���66*����2"&4"26424+"36264&"�Α�Α������Α���  ��� �`-5=2#"&'##"&46354+54+"#";;2=32264&"6264&"�B^^BC\CB^^BX4444�""W""`^�^^�^�4444@""I""
@�'3?KWco{���)"&5463!254+";2754+";2754+";2754+";2754+";254+";2754+";2754+";2754+";254+";2%54+";2754+";2� ��\((`((`((`((`((��((`((`((`((��(( ��`(( ��((((((((((T((((((((T((((((���.4X.'76#"&#"+"&5&546623256%5'5&'&56765767556�	2	2�;?$i>4

"!Gh0�"(#M'##&>&#7.(!?&#%% *D��	)"^

�!
#�HF
�GH	DDGFFDDHFG������$%"/&4?'&4?62#!"&=463!2����w
��

0
������

 

������+'&76'/&?6/&?'&?6=�=�}	�

�	+		[[			+		[[		+	�

@��*t	�		�	.	PP	/	.	PP	.	�		����@�076&76&'/&4&4?61'��3N>!0#9T�x�mm�

S)F/,UZR
T
��

^^
����	�6.=#"&67�/� �
�/�`�%-���7%2++"&53#"&5#"&=46;546;27#5376�

(
0
�s�
(

(
0
�s�;;`
0
(

�`

0
(

��`;;�����6>FN"&54>75.546267>767.5462$"264264&""264�
- 2
/B//B/9/B/��						�			0**	)!//!�*!//!*�	
 !///			��			7			�����/?%"&4?62?6/&?62/&?64&""'&4?620		-,~Y,-	(-*<-(		-,~Y,-	(-*<-��G�*	-,Y~,-		(-<*-�(	-,Y~,-		(-<*-����G��z�)12+"&=4>7>54&#"/.762"&4�Bn%%
H

,+?F:((:(�Z@ 1


"
![��)9))9����&735#"&=46;232+"&=462"&4p�6<**<*�0�00�*<**<����6"&46246;2+"&5�/B//Bh
^

B
1B//B/G

��


�S2+"&=46;5#"&54?6;2'2+32+"/+"&=46;7'#"&=46;2763�		`			
0	�		!NN!		CPPC		!NN!		CPP 	 		 	`	 		�`	0	pp	0	ss	0	pp	0	ss���S!2+"&=46;5#"&54?6;22+32+"/+"&=46;7'#"&=46;2763�		`			
0	�		!NN!		CPPC		!NN!		CPP	 		 	`	 		��	0	pp	0	ss	0	pp	0	ss�����%32#!"/&4762%37���`(���|PrD��(`(�(1}PC��@�K%2#"&#"".54654&#"&/054&54632>?03261
! $$#%54@p '#$#**")	2�#$##

0	M
2	20Ek��`�<6"&=4627232+"&=46;5.=46;26=463�P88P8@	WA8		�		8AW		B19T	`8(�(88(�(h	0Bc	"				"	iD(		*3NM80	������%F'&?6546326=46;22+"&=46;5.=7z	
��	
�8(,		L		�		8AW4/2


	�

	�-(8,�0		0*&�				"	iD),'"����
+!2#!"&54%#!"=46;54;2354;232�����X0(�(0��,$4444������8@6/&5#+"&=4675*.767&632347264&"��
(
�
)
	<!":
�			�t�

�!5

		L1-			���,4#"&=&/&6?#".54?>;>32264&"�D<b
	3	h1h'dH3 
�""�!2Hd'h
1
h	3
	c=C�""����"&462%2?64/764/&"gΑ�Α���ee�8�Α��V�ff�����2"&4'&"2?64�Α�Αj�ee���Α��V�ff�����6462"2?2?64/&"�Α��V�ff�YΑ�Αj�ee�����"&462764/&"'&"2��Α��V�ff�'Α�Α���ee�����B�BJ7"&?6+5#"=4;5.54632+>7#"&?6+"&'"264
DD#R044$9((7$440R#DD ���`DD'1�(
2(98'2
(�1'DDIWWI ����&2%2#!"&=46;5462+"&=4&#"54&"26���Y}Z
 
+*p""���f@ZY?

*+g�00����2"&4264&"62"&4264&"�Α�Α��ll�l�jKKjKf4&&4&��Α���l�ll��KjKKju&4&&4x�$"&46:"&4$2"&4H*<**<t<**<*��<**<*�<**<**<**<**<**<����2"&<62"462"B<**<**<**<**<**<*<**<t<**<*��<**<*����);2#!"&5463264&"265.'"3;265.'"33���,((�uS<U��~f����`��((Su#U<}�#�f����2"&4>4&/&7�Α�Αl���Α��k�����2#!"&5463!2=4#!"���,�����`��88����!"&5463!2'76/&'&���`��Fh `��b��Fh����*!"&5463!23?6/&7'&"?64���`��9�7g7 `��.�9�8	7��A�@&="'.54>3546463276#!"&546;2+!8�-?0	+-FJ/��
��y	3@�H
';(
O)*>&	H��Y`������>2"&2"&46.?67�GΑ�Αv	�B���Α��B�B����#!"&5463!2?6&+"���`��||�p��`�||����5463!2#!"&%'&;26`��d||�`���||����!2#!"&54676/&0`���||���`��||���B�E%#"&'#"&=4;&7#"&=4;>32'&#"32+32+32767	Mp!oH(>�
��
r&",VF@P,(#	
		 
��@�6%2#!"=4;5#"=4;54632'&#"32+354634��$O=7/			TT{`h(�(B7G#
$

@(3����*�A7+"&="'.?6;2654/.'&6;546;22'&+"�,-:$	 	0&"

B
g".A1	 	0&"

B
	�
T-!'0		0"	


4"1G0		0"	

	��@�4#32++"/&=46;267#"=4;&+"&=43!24I	;5L9�S�T'��)U(`(8F��5 (-(��n�:232+32++"=#"=4;5'#"=4;'&6;236?63_P:Xll8llX:PA77�� % \\ % �qH%#q����)27#32++"=#"=4;5#"=46;54;2'32654&#�\��;4444�@QQ�M$((#� (44( -�O�Qۖ)#"(��@�ENRZdh#32++"/#+"/#"=4;'#"=4;'&6;2376;2376;2327#32>?#;'&'#7#136?#4?FU*
9	+7*
9	)TF>0*
m	,
n
.0�x&Q��'Q (�		��		�( (Q		VV		VV		Q(�66/�  	66�  ����;#!"&546;#532�
�
��

Ƞ�
b8
��

�
z�b����)5>;#!"&546;54+";2=4+";254+";257#532�
�
��

�@������`�
b8
��

�
��LTz�b������5OR72"/&6;46;2%232+"&=4?#"&=4637+"/#+"&54?6;23'�PP0	 	 	=8		�	=8		�	G	;*4 ```0		��@	
F	 		
F	 	U	

	�e0������5OR"&?62++"&5232+"&=4?#"&=4637+"/#+"&54?6;23'PP0	 	`	=8		�	=8		�	G	;*4  ``��		0�	
F	 		
F	 	U	

	�e0�����%5EU%2+"&=463'2"/&6;46;2%2+"&=4632+"&=4632#!"&=4630		@		@PP0	 	0		�		�		�				�		 	 		 	@``0		��	 		 	�	 		 		 		 	�����%5EU%2+"&=463"&?62++"&5!2+"&=4632+"&=4632#!"&=4630		@		�PP0	 	p		�		�		�				�		 	 		 	``��		0	 		 	�	 		 		 		 	������5=S"&54?6;232+"&=46;56&/&767.7>264&"2"/&6;46;20	
0			`		
(>%


	$+
  �PP0	 	`	 		p	 		 	@�1'#2"
=&\``0		��������=S%6&/&767.7>264&"'"&54?6;232+"&=46;5'++"&5#"&?62J(>%


	$+
!	
0			`		�P0	 	0P�1'#2"
=&\�	 		p	 		 	@;`��		0`���D72+"&=463264&"32#+"'&#"&=47>767632h

P

X e#


*!0H#5�
�

�
�y?#.) �M,:$���F46;2+"&56264&""'&'.'&=463276;23+
P

P
(#H0$

#e �

�

2��:,
(+� 
).#?$����$2"&4++"&=#"&?>;732e6%%6%�8
 
80
%%
�%6%%6��h

h�����$2"&42++"&=#"&=46;7E6%%6%p

@

%%�%6%%6k�
�

�
������/72"&4/"/&?'&4?'&67627664&"�P88P8V

^!
d0/d
!^

^!d//d
!cKKjKK 8P88P/d
!^

^!d//d
!^

^!
d�KjKKjK����".5463276EvE�j/7�]>J@EuFj�^6^y*���	%3!#!"&7;2=4+"%2#!"&=463 �
��
�hh 
	� 	
 ��
��
0		0
�����?E%+"/#54+""'"&4?&=#"&546;5'&4623762322#4
7=	
6(33(6
	=7

8/	
6�6
	/8
��\B�
 <
	7 �� 7	
< 
;.
	77	
.;B..����!"&5463!26=4&���`�|| `��d||�����2"&44&"2�Α�ΑH/B//B��Α�ΈB//B/���-C%&/#"&'&54>32+3276'#"&54673267�A>� #�		y�9%�W5Ig=2B.*?>
!	��$!	 	 {7/:gI7Y'3.B7)����:%2+"=&=4?5&=4?54;27676265463t{eP1		71		78�		��		�Fb�dp�)
)
E3)
)
�MH����3<%#!3#5#"&="=435"=435463352#!226&#"Q//4E��	�(B+*7"    "7*+B(�	E5�4
#$#��%@((@%��#$#
p((@����%=2#!"&546322>36754&#!"".'&'3!265����
J(
��
(I	I

���`�5 

 	5		5�

����%9+#!"=#"=4?622#!"=4637335335332!54;��x��
�0
8@@@@@$�`$@XX��

�����#./+"&?&54767'&47%67"&57n���	8	0
�p�p�!'"U<

ss
	"U�,q%%q,
 �`DNe7#?%2#!54+54+"#";&'&767?6'&'6732%463!!"&57;2?3;26/&+"�&�

��@@r			





 ��
��
;		<		9	 	�&&!�
��
@x
	


		



##l
��
8		
����%5EU^n2#!"&546;254&+";26=4&+";2654&+";26=4&+";26=#"&=#'2+"&5463�

��

�
	.	�	 		 		 		 	�	 		 		 		 	0	��

 

 
��

�
	.	
�� 		 		� 		 		y 		 		� 		 		w@	0�@
��

@
����)5=IUa2!54;463!2;2=4+";2=4+"2=4+"354+"754+";2=4+";2=4+";2��@
P
��((((4(t(�(((((( �

�8�((l((�((�TT�((l((l((����)462"6+"&=#+"&5'&462376x*<**<�	_



_	
VfV
Z<**<*P
^��

pp

^
	WW	�����(3?62#"&#"#"&546&.'&>.676.7>.>�L\>&"LM"&>,�/-	�*,�-/	�C_&&_j4--
&A7 !-4
-!7A&7!���6/&=46?7575����������N�
hh
�HNN��P�B���!'+/37%//&=4?54?65'75'57'57'�dhhdad

d"UwfffUUfffVUUfff�	n
2442
n	$l	&&	lI$E�))&��K'O�''*FK'O�''*�����8U7/;2+".?'&6?67&"/&?6276/.?+/&?6326/&?6�	(3
44$6	3)	n|	$	"
j*(	n	(�-`PP`

"
�

Q!(0A"QI

--B
n�5+0PP0!,

���7APa2++"&=!+"&=&=47#"/&6;7>;2%!'.+":>54&"!264&#":�	
 
�
 
	< �"9���9
"N	
		06

  

60		*
& *22
�!	���19BJ%+"&=!+"&=&=46?>;546;232264&"7!'.+"264&"� 
 
�
 
 +
�
+��5
�
�#0$)

  

)%0#U" 

 "�]C�������/%++"&?5#"&?#"&?#"'&?>2++z
�		`		�
P	O
nn
O	F11Z[
uu
[����##".=4632"&= "&= ��]=g<�]=g<���G2G���G2w.+!.+!{g++g1og++g1����&BKO7.4326673#!"&546;&'6'.32767326'&7#532'6�3
O��
��

�&$>$

O�
%+�(6V
	��

�
�
�$/
76 &
>"	�
�������<E;#!"&546;"&'&+"&'&+";27673;2?6.#7#532�
�
��

�9
	

%
%		&
&O�
b8
��

�
�
es		s_
	�		cX		���b����4=;#!"&546;6&+"4'&+";2767;26/7#532�
�
��

�<#%%#<<#"#<��
b8
��

�
�ED
]^=!$^��b����"=72+57#532;#!"&546;4&+";26=:>�

��
7
�
��

�5(!Q�=�
��
��

�
��!,�9����"-#5323#!"&546;"2645'&'&��
b��
��

�j''�(	g((F�b0��

�
�
((�p(h((0����*.O#5322"&5467;#!"&546;3533526/&+535#535#535##3#3#y�
�		w
�
��

h @� 2
           W
���

�
��

�
     ��&W
            a����!/=F;#!"&546;54&#";67764'&7&7647#532�
�
��

�@$$!
		O
	
)@�
b8
��

�
�l�$8$8	;n
N	*u��b����4#532;#!"&546;4&54&+";26=65��
b�
�
��

�`7
p

p
7F�b
��

�
��7&

p

&7����3G`#5323#!"&546;7654/7654/&#"32032?454/0#"764/&#"327��
b��
��

�s((AA5>>�A((F�b0��

�
�
�$$==1��g=$$����
!'2"&4%&'264&"'677&'67'�Α�Α�?�P88P8 @m?�@��Α��@�8P88P�?�@m?����#46#"&'46762654&'&5 QiBrCg�iQ:Ll�lL:��VCrC�gV�b?LllL?b�����6/&=6&'.7�
H
}@
 ���j
��P4M
Q%�,����%7#"'.?>3264&#"+"&=46632/546;2��gXD2@LllLI53�	2Hcg$A

)'͒7(l�l23	�2E��3�

h ����K32+"&=46;5#32+"&=46;#"&=46;2+35#"&=46;2#� 		�		 � 		�		  		�		 � 		�		`��	 		 	��	 		 	@	 		 	��	 		 	 ����!++"&5#+"&=#"&46;2�	0	 	 	 	 B^^B�	� 	��		p��		p^�^	���#Gk%2#!+"&=#"&=46;546;2%2++"&=!"&=463!546;272++"&=#"&=46;546;2�		��	 	P		P	 	P		P	 	��		P	 	P		�	 	�		�	 	@	 				 			�	 				 			�	 				 			����%%2"&547'#"&46327&5462#"'6`(88P8f"(88("f8P88("ff�8P88(
@8P8@
(88P8@

@����5#!"&5463!2"'64'73264&"&#"327264&���`�DD!!.!D!!D!.!!p��`�))!.!!)!.!)!!.!���'/7?O"&4632762?2+"43&2"=&?6'&6/&6463264&#"26�4z�zzV-)4M0.	U	;	��&		(8		h4)-Vzz�z4<+					�&		8(		����%*"&462'7&''77'77'?6'7��Α��a?"'>KK>'#?&U%>>%U&�NN'Α�Α�:T6**6T:B4"MM"4\88\
���!-9EQ]iu�����>#"/&5417&0#"/&54+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2D��D
+W``W+`((`((`((`((`((��((`((`((`((��(( ��`((XD11D

E#
<##<
#E�(((((((((�(((((((�(((((���	3=A#546;246;#+"&=>%+"&=#532%2#546353�`	@	��
` 
`


�
`
 `		��	`	p@�00		w
��

,$;)%-9)G,,

��	w	00	�������#+#54622+#5.=#"&=4637#5462@@0		K5@5K		p@�``
�	 	 6\cc\6 	 	�``
@�&2>JV2#!"&546;54632=#72=4+"3!2=4+"3'2=4+"3!2=4+"372=4#!"3(
�(!
(
(��h�8�h�����
��!

����``((������,'& /&47>2"&4%'&"/&4762{"n��n"W��6%%6%"?�?"W�%"dd"Q99��%6%%6y"

66

"L����/?O_o2#!"&546354&+";26=4&+";2654&+";26=4&+";2654&+";2654&#!"3!26���P&&&&�&&&&�&&��&��`��M&&�&&{&&�&&{��ff������#/7'&?66754621%#".547>"&53z	
��	
�%=8H	�~��		�&�


	�

	p1


V:,C
��	
2�%����!2#!"&=46;76;2!+"&�		�`		x	r	�����	 		 	

�MS������82"&4654/.#"&546326?654'.#"32>�Α�Αm
#'("$
>R$C) 8��Α���"	0 !+#	R=)B&����:F2#".'#"&546326;2>54&#"3276#"&462654&#"j�JL
*,4Q9*- jNLllL6-
	=Jg��Q%$�|d?T91BVy
2JVl�l	(�Α��)) ���#?+'754"/&4?62763~�~-8  �8M
)�)
Ms~�~  8-`8PM
)�)
M�����,70#"&532762#"/&54>76�XF:@@
j UP.
@	'%?�J8@XC			
D:�a5	#8����#4?JU%"&""&#"#"&"#546;5335335332!526226226323"&546523"&546523"&54652�'/''(
'/'@@@@@�@''/''/'
'��
 
r
 
r
 
@      P�������`      @
%&
%&
%&�%2#!"54;2%6!57>��(5Z��W
U@(h����h�r����!�#%2/7+5463&'&676
=��	�
Y���<K`�wZ�S:
�A
�	���+�`\�	�2%2#!"&546;22/"//&?627'&63�		�0
	 	�	 `

I.D

II @	 	
P		�� 	v `		J.E		JJ @�2+"&463264&"264&+�PppP�PppP�KjKKj�5KK5111�p�pp�p�jKKjK�KjK7�7@�2+"&463264&"�PppP�PppP�jKKjK�p�pp�p��KjKKj������8<KQg2'.547'+#"&546327#"&54>;23'#"&=46;263&267#"&?&#"?#654&#"&/5KK54K)V
4E,5KL41
W	r3		@
N��+J(	Q-	!//�J�$�"2/!

-

-,M55JK48&�*6K64K0
			}J&vI/B/`x( 0`0"!/H
	G,���4<LT2+++"&=#+"&="&=#"&=46;5462264&"7!26=4&#!"264&"�


 
�
 



�����0

�
@
P
� 

  

 
�
P
0".."0��]
�

�
p�'?2#!"&5463&546?6'.676/&&546?6'.676/&��`�=@RA?S�>@RA@R��� �%"4./6%"4./6����94&++"&546;2+"&52+"&546;23265463�!p	0	
�8P	0	�	P8�
	0	p!	!��		�
P8�		0	��8P
		�!(	��B�3W%!!2#"&'&7#'.'4>7#"&=46;2!2'#54&+"#";;26=326=4&���
 ! �#
	FF

g
	�/t0		0		0		0		� #! !W

	-��(		(		(		(		��B�3F%!!2#"&'&7#'.'4>7#"&=46;2!2'#54+"#"?6&���
 ! �#
	FF

g
	�/y++DD� #! !W

	-��<<DD����<D%32#"'+".'#"&=463267'&6?546;546;232%7625�=,

X70�#7X

,>
F*
@
�
@
*��v
vK")

;!;

)"F
#�
(

(
�#
�X&&X����26:V%#!"&=467'&6;&5&54767>?6327/77475#"'0326762676�#��%
:@F

F@;
� 2�*2J,42.	�=#--$><!

1"		"1

!�x( �� (�������HWm2'"&547'+#"&7>767&+"&546;23'#"&=46;276;2+6267#"&?&#"%6&#"&/7>4KL64K-

TE,6KH2 8

8E�B		P&-

R ��(	Q)!//�0"1

22"+K46LK4;')-
*6M63H

( 		&*
 
7�K/B/L"2Q
R "0+���$@%"&54672654&'56&"&462"&=46;2732#+"&5pAO�ԖOA!3z�z=3M6%%6%�
&

@
v.(88(.	!!�%6%%6�
``
`

�����
)%3"/3727#'&"'&"#&6?62762@m��^9�$!w1:$f!$&n''n&�,��H		
%i(7		b�	
V(i%((''�� �!)32++"=#"=4;5.5462264&" ?1$$($$1?TxT�/B//B3N4($$(4N3<TTB//B/�� 2/"&46327'&63264&"tQTxTT<*#P�B//B/�OP#*<TTxTQ��/B//B�� �;C%32++"=#"=4;5.547&'&'&6;227676;2264&" ?1$$($$1?3&(
F
(&3�/B//B�3N4($$(4N3C+ /

/ +"B//B/����192/32++"=#"=4;5.546327'&63264&"tQ?1$$($$1?T<*#P�B//B/�OP#*3N((N3<TQ��/B//B����PX2/32++"=#"=4;5.547'/&?'&=4;276627'&63264&"�Q?1$$($$ 3			O	#T#P�B//B/�OP#*3N(((;"*#	O	Q��/B//B���!)W32++"=#"=4;5.5462264&"32++"=#"=4;5&'673264&#"&'632 ?1$$($$1?TxT�/B//B!$$($$"!//!"'2<T?3N4($$(4N3<TTB//B/�4($$(4/B/ T<3N���!N2"/"&46327'&63264&"%2"/#".'672654.#0"1677'&63T
1TxTT<*#0�B//B/�
1T<%?'!/B/%!0�O0#*<TTxT1��/B//BQO0#*<T";$!//!%!1��@�&HP2"/#"'673264&#"&'6327'&63232++"=#"=4;5.54264&"4
1T<2'"!//!"'2*#0�oxT?1$$($$1?oB//B/�O0#*<T /B/1@T<3N4($$(4N3<�/B//B��+32//"&54>327'&?67'&63264&"t			TxT'B'*#	�B//B/�O			#*<TT<'B'			��/B//B��!�,47"&47675#"&=46;5#"&?6+32+64&"�*TxT*(88('//B//�*xTTx*	(88(	�/B//B/0�P(0%&=#+"=#"&462354;2354664&"�		8(	*xTTx*	(�//B//�8(*TxT*(�/B//B/�� �+"=.5462264&" ?1(1?TxT�B//B/3N��N3<TT�/B//B0 P"264&2"&4�B//B/�xTTxT/B//BoTxTTx	���/7?OW_!"&=463!2&"264&"264!"&=463!2&"264&"264!"&=463!2&"264&"264�@

�
3NX�@

�
3NX�@

�
3N 
@

@
X�
@

@
X�
@

@
X����#+?%2++"&=#"&=46;546;2"&4622#!"&=46;27p		@	 	@		@	 	��jKKjK&7O��O7#L#�	 	@		@	 	@		@0KjKKjkO7**7O����#7%//&?'&?676"&4622#!"&=46;27N-..--..��jKKjK&7O��O7#L#�.--..-->KjKKjkO7**7O��+6"&462%2+"&=!+"&546;235463�B//B/.B	 	�	 		 	�	�/B//BQB.�		00		`		А	����'/##!"&?"&546;254&#!"3!26"264�N4?��?4NO1�2N0
��

0
�.!!.!`�'9229''99�p

p
6!.!!.����'7?G##!"&?"&546;254&+";26754&+";26"264$"264�N4?��?4NO1�2N�
h

h
�
h

h
((��((`�'9229''99�p

p

p

p
.(((( �`!%!!535#7232+#!"&=463!5 � �  

��` �@@�
�
�`�� �`!%!!535#7232+#!"&=463!5 � �  

�p�� �@@�
�
�`�� �`!%!!535#7232+#!"&=463#5 � �  

�� �@@�
�
�`�� �`!%!!535#7232+#!"&=463#5 � �  

��� �@@�
�
�`�� �`!!!535#7232+#!"&=463 � �  

� �@@�
�
���D�%#&/&546.j81
5W	w��Y	
�	�����H#"32+72#".'#"&=4632=#"=4;54".=4>32>32T$$T-.T$$T-.�0p(p1((0p(p1(���,8G32+"=!+"=4;#"=4;2!54;2+;2=4+"54++;2�(��((�(����@T
H�@��((@((���H
4��@�+]7+"=4;5#"=4;2!54;2+32+"=732+"=!+"=4;53;26=4&+5354;2+@44 44�4��4�
@

h4�4�44�4@�44H

@
H4����%"!"&5463!2+538
��

�
b
��
�
�

��7b�
���!2#!"&54633#!"&546;������0/��� �`0 �!/������47c%"&5054676762'3#"&505467>762'3'2#!"&=46;&'#"&=46;6232+KjK

<

�H��";#5K

<

ȐH		�`		�&�		�N�		�&p!//!<4&(59	��%/!<

(59	���	 		 	')	 	  	 	)������*02#2#!"&=463467.5"&=4634&"h

D55D

��

D5#7

=V=�

CkkC



Ck8O-

�@;UU;����*062#2#!"&=463467.5"&=463."65#h

D55D

��

D5#7


2<2
���

CkkC



Ck8O-

��$,,$""����*02#!"&=463467.5"&=463!2265#hD55D

��

D5#7

P
�V=��CkkC



Ck8O-



�U;;����*2#!"&=463467.5"&=463!2hD55D

��

D5#7

P
�CkkC



Ck8O-



���?2+"&=4/&=463254632354632354632346�

0�
p p
�t
d+B0�0/ ������82+"&/&>54>32354>323546323546�

�
}
!	 



@�q�!
,���ױ�W���.4635#"&46;5#"&46;5'.7>7>+"�  �в$�	
p�P	""(E
K@
� ��@�&54/&+"&=46;26?6&+"&=463!2�p�
%|

�!
N
� =G
%3	!

	��t���K+"&/&546324/&5463232545'&5463232?>32132?>32�D<"7l
=*&	38&	"
/��!/f9)(�}���		�{
������-159%+"/&>46235462354623462#37#37#3� ��
!	 """"�XX�`��!
,�((a`````������-$2+"./&6?'&>354623546234�" �@K%$E("�P�
p
	�$���   �`G2++"&=#"&=43+"/5#+"/#+"&76;236?6;2U6Ut
6		2		6A	+	+	A`+��+��
�6"UU6�(5 ����*%+5326"&462&'654+";26=3;26ۑΑ��+&jG		
,�8'Α�Α��O2Y
�

HS
����#'2+32#!"&=46;5#"&5463!P�		�`		������ 	 		 	 @�� ������+G!"=46;54;2354;232!2#!"&544+54+"#";;2=325��X0(�(0�L���H<(<<(< $4444$ ���<<(<<����+7!"=46;54;2354;232!2#!"&542=4+"3��X0(�(0�L���<� $4444$ ���((����+G!"=46;54;2354;232!2#!"&5476/&'&??6'��X0(�(0�L���
0			00			00			00			 $4444$ ���0			00			00			00			����+;!"=46;54;2354;232!2#!"&54'&'&?6��X0(�(0�L���Y	j.			R	�	 $4444$ ��`	j/	T�	���6#!"&546;276�
�0

p
���

�

�XD�� �	727"/2"&4724#"2546pxTTxT�&6(��!!�TxTTx6&(�����$9#!"&=46;546;23253+"&2#!"/&?6;53�+	�

�	 	�	�@	 	�

�	++	�@k,	
P
			�9pp		
P
	,,	  ��@�
4>?&576
�����	
�J
8��?
0�@�����
8����2+&=#"&5463�&&�}
`&&�&��&^T& &����'2"&454&+";26754&+";26�Α�Α�	0		0	p	0		0	��Α�η�		�		�		�		����2"&454&+";26�Α�ΑX	�		�	��Α�η�		�		����!)3#!"&535462#354&"264&"264&"``/!��!/`KjK��&4&�� ��!//! 5KK5  &&���@�*6BN%+#!"&/#"&=46;7>3'&>3254&"26754&"26'54&"26@

��

CkP�PkC
��p��
��

�mm��p

p

p

p

p

p
������CG+32++"&?#+"&?#"&?6;7#"&?6;76;2376;2327#�
OK
P
(b
)K
OK
P
(b
)K�c

�	(
V
	RV
	R	(
�	(
V
	RV
	R	���������-6"&462&"2642"&4264&"32+"&76�\BB\B\((�\BB\B\((h ��"	p�B\BB\^((�B\BB\^((��0
�
����G"264$2"&462"&46"264>."'&67673>'.56V�zz�z��Α�Α��pp�p�RHLH5	




	�z�zz���Α��Yp�pp�DM

/A.!!.A/����B#"/67'&/"&462&/&#".?5#"&=76;2|}~�?$$$ofB6

= ?��Ú
X<$$��'l�	
��P
_O		�7G7#76772+57#!"&5463!2'&+";2?3;2>74.+";26�		�/��`���9	$9	4	�-99.5�

1b_�� ��		T+�4����!3CS.676#"#'7232#"/&764'&?67/&764'&?6/&764'&?6a@-.?
@ 8  8 @�		_--
	%%	
&

;@��@
(
QZZQ
(�"V6�6
	-t-	7#X#
	B	��'/7?GOW_6"&4622"&42"&42"&42"&42"&42"&42"&42"&42"&42"&42"&4�%6%%6(6%%6%�6%%6%6%%6%��6%%6%�s%6%%6��s%6%%6��s%6%%6��S���8@H`d7"&5462"&54&"&2#"&4632654>54&""&542"&42"&4%"&54=.'.7>'7�/B/1�g?-FdFSmQ@
	Qf��"P"�!//!
�gI+	-?%&2FF2I�m�Do	�V�"P"������2At�&2#2#'&/&?6766766&#"32763&%.6767&'&>767'.7>7"'&63"&7>376"#32654&# !=+^C,:)
F
"(-+
%

	
p:)
F
"(	-+
	 !=+\C�

3

	!Y	!JZ9
	


A
4!JZ9

	


3

	!G�����8DQ7"&5462"&54&"&2#"&4632654>54&""&54%/&?6"/&?6�/B/1�g?-FdF�		W	W	��		�
		��!//!
�gI+	-?%&2FF2I�	W	W		��	�	�	������2?k46;5#"&546;5#"&546;5#"&746;'.>+"&7'&6767154/&'&6767'&6767'&676'&>[
>~��}�
	|PkI%		

�
={4	
N^
	_M
	g$Z
��.

#

0ZC	
cy
	zb
	�&����@�-E%&'#"/&'&767'&6?6632654&#"6"326591W+
��)w
}q<1W+
5(*Y��"P8*&�T+:
e	
��:��(fT+:
H
W�'38P	
=���� (/7W2&/76'&"&'&4757633#"&5:64&"3#&"264///#576;?�
	7�

P
"


b	
�`@
)			��`
				�
		
 	5[7	
TR;�	7�vI
!Z@�
			)�
@			

	&
R�7	K<���F#!"&547670>321&0#".'&'&2>767654'�`)||)B#G
G#	$FF$ Z		Z B3		32


2����'/D#32+32+#!"&5463!232&"26454&+"'#";26���@�4&&4&0'*
	�	
 @(@(0�0( &4&&4�"��@�+7CO2#!"&5463"26454&+"'#";26754+";2=4+";2=4+";2� �4&&4&0'*'
	�	
����������``&4&&4�""=HH����2"&4$"26427.#""'&#"�Α�ΑH44H4��94 ( 4��Α��14H44H��D!!����#72#!"&5463";264&#"26454&+"'#";26P��`		`		4&&4&0'*'
	�	
��`� 				�&4&&4�""��@�	+7?R2!5463!#!"&%;2=4+";2=4+";2=4+"&"264;26'.+"'#"��0@� `�������4&&4&�
�
"*��p0���HH�&4&&4�
�����3C#0#"&54754622654.'54&"37"&5475462� K55J 8P8`!/(%A%6%  `�%05KL50$�(88�h/!			��
		%P%%%�

������"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%�

�0%05KL50$�(88(��			��
		%/�����"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%i

i0%05KL50$�(88(��			��
		%/�����"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%)

)0%05KL50$�(88(��			��
		%/�����;6"&4627#0#"&54754624.'54&";26�%6%%6E K55J 8P8(%!/[6%%6%%05KL50$�(88(��			��
		%/���'/7?GOW_gow�$2"&462"&4"&462"&462&2"&46"&462462"&2"&42"&462"&42"&42"&42"&42"&462"&47"/&4?.547'&#"#+"&54632632762)			)			7			)			7			�			@			 			i			)			7						7						I			&�

	 	I22
	�			i			7			)			7			)			 			@						)			7						7						I			��
.
$��		/4M
		���M75!+"&=!+"&=.%2#!"&=46;54632662"/&47&7'&" �
	 	�	 	
�		� 		)-#
i
@00))				))�				�)
i
#,	�����+QY"'.542''&546'&'&7654&2&767>54.#"'.542"&4J�u.W=9R0;)%5��F8%,!+6Ig*$9E�6%%6%)U,,U�
+>=UQ9A,
()95%+�]BlN.5, gH-NlB]%6%%6���2#!"&546354#!"��`������`�TT��`%2#!"&=463��``  ���!)+54&+5463!2#!"&5463!24+"30/!� ��� D������!/0��� 04	���/?O_o�+"&546;2++53232++53232++53232++53232%3#"=#"=4;5473#"=#"=4;5473#"=#"=4;5473#"=#"=4;54���`********�********��`�N0f0f0f00`0`0`0�������%/&/"/+"&="/&4?5/.?/&?'.?>7'&/&6?'&?6'&>?65'&4?6546;2762?>76/76�!?5

 	
6?!"F@@F"!?6	 	6?!
"F@@Fg

G$N5
(		(
6N$G

%%

G$N5
(		(
5N$G

%%����	�'"/&4?&67>�(0$X%�	3	�
$1��*�1$
�	3	�%X$0����*<+"&?.5476227>56227562.>32+"&7�% 

@

,,,y,"*9

8�_"&7�

�*"_�G;����#VLB&
�0

����&2#"'&?632676&+"&=466CrC�g_G
	(0?FaeEB0*�
$G�BsCg�@	(*bEGc,*
�$E����	!-E!#!"&26=4&"26=4&"26=4&"%2#!"&=46;76;2 ���				`				`				@		�`		x	r	P���		�		�		�		�		�		�	 		 	

����:&#"+"&7>3276+"&73232>76;2#"'&=46s1B:[
9�ZcH$
��׆*1B&D0	
9�ZcH$;-G8		WsE$�
y*-!9%		WsE$�
����"0%"&54675#"=4;2+7654&+";2�z�zeKx8,			"�((�VzzVMu"(("	$			3b������1%&=#"&=46;546+"&=46;2+";2��

����T(88(TT

T��`
`
`��8(�(8(
�
���1!#"=4;26=4&+"=4;2'&=#"&=46;546�TT

TT(88W��

�(
�
(8(�(8��`
`
`����$276+"&?&'&3276#"&46dG$
�*0BEeaF?0(	
G_g���E$�
*,cGEb*(	@�Α���08DL%#!"&5467&546;&546;2654'6323232$"2646&+"26&264&"�#*��*#*&!/	(8&*����<8<%O(**(#*&/!8(&*#[x  `��@�!)4%#!"&546;3%#!"&5463!24&"2!5'&'&���/!������((D`X�( �!/PD((`0pX�(�����
!(/&?62'6&?6?6&5#75�.	o		.(<�	o		��z\
�

�$$ @2.		o	.<(		o	��z 
�

�h0@ $�����&?'762#���r
�9�9(c���
r)(9�9�����	!'762&7>?'/&?62�9�9(�US�"r/7"�fw!v(9�9(TS�"7/r"�fv
����732"/&6;4;2�.VV.8fVV.��M�37/&4?6!2#�VV.�.VV.8M�3%546&=!"=43:VV���.VV.8
����#"&?62++"5X.VV.8VV������;%+"&?'+"&=467'&=46;27'&6;2/76�
p$kk$p
$kk$
p$kk$p
$kk$hp
$kk$
p$kk$p
$kk$
p$kk$����)#!"&546;46232&"26454+";2���P&4&P�H��P��`&&4d��M346&=#/&4?63zVV�VV�VV..VV.
����72"/&6;5#"&?62+�VV..VV.FVV�VV�����"&462#"?6&+54+"��Α�ΓGssG@'Α�Α�tsst����"&462'#54&6=32=4gΑ�Α�tsst8�Α�ΓGssG@����2"&43?6/&#"�Α�Α�tsst��Α�ΓGssG@����6462"75326/&;;2�Α�ΓGssG@YΑ�Α�tsst���4%2#!"&546;2+!54632/"/&4?'&63�	���		�@	X
$��$�	�`	 	��p	@
�$��$����##!"&5463!2#"?6=4&���`Xp �			� p��`$ �			� p
���+5463!546&=!"&2#!/&4?6
hPP��
�

��PP
0PP0�

0PP0����1%#!"&54674546326326&+54&+"#"7.K5��<T6*^B,J(8�A	0	Aj�$65KT</JB^,$8(ip		pj����1%#!"&546745463263226/&;;26=.K5��<T6*^B,J(8�jjA	0	�$65KT</JB^,$8(Njjp		p��@�#'#!7#3#3'!"'?3&�ZeE0E��E�PEee{G�C{e������� ����B������E�%"/&6;#"/&6;232:hh
@T8�
@8pp8
������E�++"&?6;#"&?62:
@
�8T@
hH��
8p��@�&2+"&=4&#"32#!"&=46;54i}Z
 
+*0����Y?P

P*+G��F@����.5462"&264&"�="
p�p
"=B//B/6#X$5"PppP"5$X#
�/B//B��`�0R232+"&=46;5.=46;26=463"&=462#";#";#";P	WA8		�		8AW		B19T	hP88P8UUUUUU	0Bc	"				"	iD(		*3NM80	�8(�(88(  (��@�#2+"&5463264&"74+";2�c�����`�� Y8����-27?DI%2+"=4;5#"/&54?6;2%2#!"&546334&#5265#264&"5"75#`@

��

@%%@�P88P8p%@@%�7
X�
��

@
��%�%�B\BB\b@%�@%������
(%67#"/&?6'&?667'&?6Py�p�
��	

a<0heC>Wh0�

�

	��$%2p������+2#!"&5463"26454&+"'#";26P���4&&4&0'*'
	�	
��`��&4&&4�""����� 76&7>.'/&4�4PL20#	.6"��

P	)B,,U2&
X
�����'.54>?62>7'�.=9*M@'	�Kc�l?sSC)C_�G
P�F%�lJ����#2#!"&5463264&"74#!"3!2�������H��`�� Y8����@�
&.BLT2#!"'&54%"32?4761.264&"6264&"%6.'&3654'73264&#"264&"��'	�D	' 		
			�C
=#	n	L


.��wNCCNwi		

���5
		�%�@�/!!$3#!"&=264&#5463!2"'4&#!"3!265�@���� �L
��

P
 �t(``(``8

�

���$"&4622#!"&=46;27<xTTxT5K�`K57#L#�TxTTxtK55K���+2#!"&5463'76/&'&??6��`LCC		(		BB		(		CC		(		BB		(	���`��BB		(		CC		(		BB		(		CC		(	������'?'&6;2//&+"&=4676c!p
c�c!p
cc
p!cbc
p!c����(7+"&=4676?'&6;2//&�]!p
]]!p]�]
p!]k]p!]���� &,%#"'67'&477&'6267&'%6'77&7p!HddH 66 H�H 67���T'FF'!D�D!&FF&!D�D"MM
CC�MM
BD����
 &+'6'676'7&'%'67%&'667�*N5i.9S?��N7M
<.�4b�.8S?^N7M
��.�4b�*N5�M7N,�.Fb4"N*E�.�?S,.Fb4"N*E�.�?S�M7N,����2"&4264&"6264&"264&"�Α�Αk`��Α��'Z����;Ss{�7'&546;5#"=4;54;232+3232+#65#"&=463+"&=4?546;27'&=4;2354;2354;2#7354&"+"&=4?546;2J"	99	"
		�		�		�			�	t6~/ 		w		�			�	�Z	  	Z		A??A		�
		
		�
;;
RP  		�
		
		��@�#37467.546;22?#5&2#!"&=463G*
@
&!ld8�8(		��		�5�"

=le<+C,,]	 		 	 ���#'+/37;?CGKOSW[_cgkosw{#53#7#53#'3##53#5#5#535#5353#5353#53353%3##53533#753'533#%3##5353'#5373#3#'#553%#53#@�@@�@�@@�@@�@�@��@�@@@@�@@@@��@�@�@��@@@@@@@�@@�@@@@@@�@@�@@�@�@@�@@�@@@@@��@@@@�@@@@�@@�@�@@@@@�@@�@@@�@@@@��@@@@@@�@@�@@�@�@@�@@�@@@@@��@@�@@@�@�@@@@@�@@�@����6!2#!"&=4632!'&546;5#"=4;54;232+�		��		p		J��J
�((0((	 		 	 		��
00((00����'/?7.=4?'&54;2!54>?>=#"'4"2642#!"&=463	�Oq��9
	(		��		�	�
	pP�

2���	 		 	��@�#37.546232+#6=#"&=4632#!"&=463i=V=		�		�		��		�/+==+/	 	P++P	 	�	 		 	���I"&4622#!"&=463!'&54?6323>546;22676;232676.!!.!x		��		�f��f

' '

P!.!!.��	 		 	��	



����#+;2!65'546;23546;23546354&"2#!"&=463p	@
��
@	8	0	P	0	X�		��		�	� VJJV �		00		00	��@

@�	 		 	����/S2+"&=#"=4;54632++"&546;2'2+"&=#+"&546;235463h

0

@
0

0
�

0
�
0

0
�
`
��

h0h
�0h



h�
�p

��

�

��
����
Q'&'&'&'>7'&'&'&??6/7?6/7?6/76/&�
�63�4
�63�g��gf�45��[45��o��o�T����#-8B73+"+"=4&+"&%#.54622654''4''32674''326`�

(

@$�-5z�z�H
@ 


�5,&]7Vzz�/

M�<62"'67"&5�Ԗ�Ԗ7��7�Ԗ�P88P8((n(88(����#5%/6?6&67>32"&54>'7>76W
�65_<Q	"..C.�
�";V"�
�m($*
 pJ�/B//!A
�+m7+�	���!!�@����	�
'%&'762&/"/&4?'.72"&4�0q"�8?�?/�)$Y5g#	>P88P8� /�8??/��$g5Y#Q"�8P88P������
(2@7.'>7'&67&'.'667&'>7#"&'6#0#6&�-V!	`D$>_GE#�707%0344�LS)(F�>/Ov�]&K
�0K*,-'�p4/Gr 2Oc?Q�&�6�'2�U(
1)+*WR"/�D_5E�������:BJRZbjr2+"/&>5462;2=462;2=462;2=4264&"6264&"264&"6264&"264&"264&"6264&"��}
!	�							I							I			)			)			P
�q�!
!�

��

��

�H
��			W			�			W			)			I			w			 �`	'/746;#"&52+!&"264"264&"264"264&``&@&&`��Fn &��&&�&@��@���RnR���	0#532'#617>3!#!"&5����3c�`�
!������@�)>%2+"&=46;75%"&=46;7532#2+"&=46;750		�		P  ��		P  P		�		�		P  �	�		�	``@	�	``	�	@	�		�	``���92#!"&546;546;2'3554+54+"#";;2=32��`P��� 808808@�� 00   �088088����
"&5462654'�Ukk�kj,T6``�M�:^vv^:���5*8ii8*��G�%/%#"/&'"&=46326763254&"7'&#"+'$<"�B\BB.-@
$<"��(#RA�']1�
�.BB.�.B>,!1�pp-:]	)����-2#!"&546;462&"2646/&'&7P��P&4&6a			j.			R	���`&&�	j/	T����%-5AMY2#!"&546;462264&"6264&"6264&"6"26454+";2=4+";2=4+";2P��P&4&��h���������`&&��RR���hh����3;CK[$"&462&"&462'&67676563267'&'#5&$"264&"264&"&4622#!"&=463�			�H44H4��7VJ<E /

27�81
7n�			�		��		�			G4H44H�	
 #
	[[n			�	 		 	������<AGM>7.'&6;2!676;23&'67+"'&'!+"&67#7!36!&'# B--B 
 8 

*M1,"
 *9
 �� 
�$����	��
�./DIID/

(?9@$Z8		h����B�5=%'&>?7'76&'.'&7#"&=46;276264&"&5>!=!=<���D-+,\Y		pd-���((��cc�5)G,8,7#	 	��$G�((����B7"&546;7532#2+"&547#"&547#"&5#"&=46;2�		�00�		 		S(�(S	0		`	�		�  �	�	@	 				p	 		������6#532;#!"&546;4+54+"#";;2=325y�
7
�
��

�@808808W
��
��

�
��88088����/8;#!"&=32?3264&+'&"'&+"=4;546;#532 
�
��
F#
9Z		F#
9�8
ș�
8
��

�Fr,		Fr(�
i
���@�	
)346;#"&5!%;;2=32=4+54+"#"%2+00�@�808808P0p�@0��@�088088������@�%1=Ieq}2#!"&546;546;254+";2=4+";254+";2=4+";2754+54+"#";;2=3254+";2=4+";2 
	��	
�
�
�((((�((((�((((`
��		p
@

@��((�((t((�((���((�((���#2"&454+"#54+";2=3;2�Ԗ�Ԗp0`00`0��Ԗ����XX�XX��@�.82#!"&546;35"26426'.+"'#"3#546;2� ��F4&&4&
"*
��
@
���```�&4&&4�


�``
����9E2#!"&546;462&"26454+54+"#";;2=32=4+";2P��P&4&6H808808�����`&&��088088�����8<@7"&=46;7532##32#!"&=46;5#"&=463!25#!5#�		p@@p		�00		��		00		`		������	�	�  �	�	�@	 		 	@	 		 	@@@@@��D�'2"&=454&"7.7>/&76B\BB\B�(��/vT"�S	#�/�B.�.BB.�.�pp�#	Sv/7Tv/�"����!15!#!"&=32=4+532=4+532=4#72#!"&=463 @
�
xxxxx�

��

@��

@@@�
0

0
����52#!"&=463!#!"&7;;2=32=4+54+"#"h

��

@
�
@808808�
0

0
� `��
�088088����#?G%2+"&=!+"&546;235463'"=4;276232+'"/"&462.B	 	�	 		 	�	��2f		z2L4&&4&�B.�		00		`		�	�(c		7		,c		7�&4&&4����IQY^%2+"&5#"&=32=4+"=4;2=4+"=4;2=4#!"=4;5463!232264&"264&"75'#p		08P8�8P8�������8,d�,((\((�d,`	 	(88((88(�00dlp((((�dp����#37NZ%2+"=43+"=4&'&=4;22#!"&=4635#+"=4'&=4;22+"=43x0).0$0p		��`�0$<0X0`��	W1&B%>>��	�	@p@@B9!,*AB>,��������>7//&?'&??6/7?6'7//&?67'&?6�@��&@BC87-8�-I"�"9-A��CB@&87.8�-J"�"8-������$.2#!"&562#".'463/&76.76dx[	��	/	[<7*T	#�/F�/vT	#M::c:M$1kTv/�#F�#	Tv/�����(#"&4?57?6/7?6/7?6/7>�#�dYY-22-22-23.M�!R�YYe.32.32.32.������/#"'&6?'&?67'�"�+/�"FO�"�$ R�"�EO�����';?"=4;2+"&=3352#!"&=463"=4;2+"&=335H�/B/0@�		��		X�/B/0@�00�!//!�``��	 		 	�00�!//!�``����#A%2#!"=432#!"=43%2#!"5743%+"=4&#!"+"547%62���p��p���P��P`00`00�00� ���

�W q���!22#!"&546;2654'"&462'"2654'76.�&&��&&q�qd�^^�^�""�&��&&@&-3OqqO3-�^�^^�:O����3}62"&4"&4622#!"&=4632#!"&=46;!'54+532=4+54+"#";#";#";#"26=3264&+532=4+532�			�			�		��		`		��		0`�hhhh��hh@(@(@hh�@						�	 		 	�@	 		 	`���    ((  ������"-%2?/.=32?7/76!6/.7��
��
�@@��\����\��'�66�'kkp8� 

 �8�����$,2#"'#"&'&>7&54264&"264&"264&"�Ԗ�j83AL9s���z�z319JVv������$747#"'#"&767&'&?6632@	E&(83AL,9:
��	

iI`j�9��
3
4+9�

�

	R5zVH:��974&+463!2#"!%2+"&=!+"&=&546;2!5463�& 8(@(8 &���& 	@	��	@	 & 
�
�&(88(&@`&$y				y$&
``
���Fh$"&462'+"&;26=>54&/&546;2?6&'&'54&+"2#!"&=46;#"3!2=4+67V�zz�z�"?
&
	
">
'

�

�@

 +?

l

@, z�zz��$!




$!



��
`

`
''�����	)1&'67673+#&'&6?&'&54762546264&" N5 
,pp ^BMA
k.�U}N/			;1%
E8K@�B^8H$Qh=7	
EX<!/`			��A�%%#!"&=46;76;2+";2?625���		7/ *�N		v]	x
	y	`	&		J��A�8%'&6767>"#!"&=46;76;2+";2?62m=<m���		7/ *�N		v]	�rHHrH
	y	`	&		J��A�Eo.'&67546;2'&+"+"&=&'&5474?6;254'#!"&=46;7>;2+";2?62 

	$	6
 
	$	����		7/
,�
N		v]	0%			%		�

y	`	&
		J����"E7+"'&/&=4622?6/&>$2+"&=4?>2?54�9	�i
Z
&�
i�	9&

Z�M"+p		�
�

�l
	3�
�
�		p+"M
3	
l�
������%@2+++&/&6?54?26=%54&+"&=4?6;76�


&�gPPA*<*,P!�"!gg
0
@
&<�.0$'z**8%.!X~	
<�����5++"&=47'#"&7>7#6;5#462#327#4'
	�		�
�	
.C)>t0pQ^Qp0t>?X
��		
��
$A,Dl��RnnR��lDT������en"&462"&462#"/?#"#.?6?'#&/&/"#"&/&?676546;2?676.7�((d((N)
C
	


+3�3+



C$
	�	
#��)`((((�pE.d L]
\1G
!!
G1\]L P 
'"
`		`
"'
 �.E
����@�CKZ%2++"&=#+"&=.5#"&7>32+";>;26;264&"'"4&54621&#0		1
	@	�	@	("
+X:�, 
i			�8P8�	�	
Q		00		Q'0&	7I"L@			�(88(������)?/.%'.4>?6762'67&"uO[D	�	E
�
,
"k
,"O4!Z!�Xf#	II@&W;���&.;C%2#!673264&+"&46;&5462#"3"2642.54264&"�(88(���

`(88(--8P80`

m�xP80 5S�8P8!8P8@ (88(P�8(P&V(H���2+"&="&5%3&'>@]�	 	]��@tU+)2;`�]�		��]@V�	=/*���#'2#!+"&5#"&=46;546;25!�		��	 	0		0	 	 @�	 	��		p	 	0		0��������"/<62"4&"276'.#"?62&276&"�Α��7�

%
&�-�-

#nYΑ�Α						o66*����!2"&42#!"&462&264&"�4&&4&�		�p]����C�P88P8&4&&4�	 	����]^B@8P88P������)17'&>?7'72&!#"&'/&7%46264&"21M>M2�LB.-A�w
Z�((H�\]�:~�p.B?-l.^D
�@((����)19?G%+"&547##"'#"&5463!232264&"264&"%3'&#264&"m	/B/�/!((!/
�
&��0\+�V	!//!!/  /!P

`��0+�������&/'&?632576%5#!"&z

���%	

N� n"��n
��

	�!

	=��K�
���
����%�2+"546;5.?4>;2��(4@�	@4uW7��7Wu������!'&?6>323!"&=46z
��	

�M2<T!�0���O


�

	i/=T<0&3�
7O����.6RZb7"&=46;>3232+"&'7;26=4&+"/?+54&+"#"&=46722"&4&2#54@		P0.%			P`P8(0(8�H$$$$�3EP
�
PE30p			W	 �	`	+5$	`	+55+X(88(Y$$$�L3
@

@
3L`					00����+$"&4622#!"&=46;27%/&?676jKKjK&7O��O7#L#T	�	Q			-i	�KjKKjkO7**7O��	R			-h	����+3$2"&454+54+";2'!"&=46;2732&"&462�xTTxT�
&


<
�(#��O7#L#
+jKKjK�TxTTxB
6

L
,L*7O&HKjKKj����;CKv%/'&=&''&'&?&7'&767667547676264&"&"&462#!"&=46;2732332?b
!!

!!
�((�jKKjKI��O7#L#


	K    0((tKjKKj��
*7O

'����$/$"&4622!"&=46;277&7%'?62jKKjK&;)N��O7#L#>�G�=*H%�KjKKjk.M=
*7O��G��*H&����#76"&4622#!"&=46;27$"&4622+46=4'6;27�\BB\B#0C��C0	!F!P88P80.B�(*�B\BB\bC00C 8P88PXB.'9+����:%#!"&=467&4?6"&547'+"&?&5475?6K��K6_���`KjKB*M6

6M_P..5KK55
>	>
;����3;C$"&462!"&=46;2730%2+"&=46;5462264&"754&"jKKjK 	��O7#L# 

�

 /B/]@�KjKKj��*7O
�

�
P!//!P�}P

P����+%2+"&=463"&4622#!"&=46;27p		�		�jKKjK&7O��O7#L#�	 		 	0KjKKjkO7**7O����%-%#!"&=467'47&52>32#"&'7"34&#E4G��G4e�++1#5KK5,Cg
�
�L4**4Lf�33(KjK5)`

����7%'.54?6>7'&"&462#!"&=46;273230n$"5Ps!;`�jKKjK 7,	
��O7#L#�$@/&sN-�N:&KjKKjsDm#*7O������!'&?6>324>7!"&5z
��	

�#8!5K0&��3��


�

	r 6K5)B
� 9%�����+@%"/&=46;22>4.#"'".54632#!"&=46;2732w	
\		[O\
�#;"K5#;"KK:��O7#L#S		]		[O
E
X";#5K";#5Ko(:*7O����$"&462#!"&=4677'3jKKjK 5K��K50  `  �KjKKjlN5**5N��88�����;CKb��%/'&=&''&'&?&7'&767667547676264&"$"&462"&5462"'&#""#"&=46;323630#3273'#"&=46;2b
!!

!!
�((��4&&4&�.BA]B	

f�D/	!##
�(B
&@k    0((t&4&&4FB..BB."�


0C '	�:#
 &������*BE[^!2+"&5&'&/&6?&5463276%#"&505467>762'3'1"&50546767623'		�	�
�/!.v
�  ";#5K


<
SȐH��
KjK

<f�H	 		W0+!/(',!�ِ%/!<�
�j(59	!//!<4&��������+>AWZ46;&/.?>632/+"&5'054676762"&73'0546767621"&73'`	� �
v.!/�
�	�	`

<
SKjK8�H

<

KjK8�H	'!,'(/!+0��		�	96(�!//1���	95(&4<!//1����;?%2#!"&=463264&"";#";#";!'#"&=463!3'#�%
��
%sH���ri�	g��QQF@% 

 %`�@@@`�@����@�"6#.5476'&'"&546
�OM{O�
����'	l	//	��	'R	����$9Kil"'&476;2#'+"'&476;2%+".7>&'&>;22+"&764'&63&/#/.7&54>23'�"		_		#
#		#		#y"		R�1�1�"p`06
,
�4]+	9|9	9|9	)[6@6
,
d��
vv
:�t����)%/6?6&67>3%'7>76W
�65_<Q�	�";V"�
�m)$*
 pJ�
	�+m6+�	����
!#463!2#2#!"&=463!53`@�@P		��		����x��`��	 		 	@@������472+"&54632276&"&4622+&'3533!&#5463�/A�A/(P88P8P�	L�@��!`B//B 8P88P��&@@ 2.����-7@%#54&"#54?5#"&=46;546;232+46?#"&5%+5�`%6%`p0		0	 	0		0��mp	m	p�	�`%%`�	D3	 	0		0	 	3�	/�	�d	����	(085 7"&5"&46232>7"&5%567$2"&4&'67==q�q��qq�q�h:&H>q�q�?!#���pp�p�0n37++++&&@&4&&4�4&&)?+	�/B//B	"%+����2"&44635"264&"62"&4�Α�ΑX^BOq�P88P8S��Α��gB^ qO`8P88PH����)12/"#"+/#&54754632264&" (8`M=),'&,ayt/!'J�%PAepxhx=	%!/ H����;!2#!"&=4632#"'!'#"&4626?&5462?&54		�`		�(H��H(HR(RH	 		 	@(��(

+��+

����(08@HP2+"&=7>'264&"'"/&4?62264&"264&"6264&"6264&"264&"P��	
�(��(����.�1��(��(���rr�����'/72#!"&5463264&"6264&"264&"264&"6264&"�%%��%%3ss�%��%%@%���ss�����'/2#!"&5463264&"6264&"264&"6264&"�%%��%%3��%��%%@%���������2#!"&5463264&"�%%��%%��%��%%@%�����'/7?2#!"&5463264&"6264&"6264&"264&"6264&"6264&"�%%��%%3��%��%%@%��MM�MM����'2#!"&5463264&"264&"264&"�%%��%%3ss�%��%%@%�ss����2#!"&5463264&"264&"�%%��%%3��%��%%@%������62"&46"&4622#!"&=463�6%%6%[6%%6%�

��

`%6%%6�%6%%6U
 

 
����!!2#!"&=46;463!2&264&"p		��		p m	 		 	��s�����"*!2+#5326!"&=46;467264&"p		�`p���		P
�	 	�@����!	 	m�0�P%2#!"&=463%2#!"&=463�

��

�

��

�
 

 
�
 

 
���"33&'"&476&&67>7>�'
!�b'�bGE:B�)!.,_Q�'g9,'1B�5t*"-,!����@�9A32+'6.'&"?632#!"&54>7>2264&"�:)
�b6
	Zw	F#
 #& #O
	��&5HX0,:,S_#Vi
	~,
	B0
	%1]L<%%%C���@D!2#!"&=463'.=4&+!46;23226=.='&4?625#P		��		�/!%��&�&$4&��	 		 	U� +,p`&&�4$ 

�>&�����@�CP]%+"&/#+"&=4?>/&6323632'&'&&/&6?67&#";26%5&#";26>C0%.B$B.%0C-
C$'));7J7;))'$C
��##%$%6$%##%�F/C=,'',=C/F�&%
	��	
%&��)

%%

)������%&/&6?'.?>n��	��
	�"	�	ff
	����(.?>&/&6?2#!"&=4637

.��

��

�p

T
xx
D�
0

0
������&,>%"/&6;235#"&=463!2+2#'3.#!"&=463!260
V� 	(+а		�		�]�
�}#4�!#��		F
@
s@l:@	 		 	@�]
�|4#��	 	 �`)2#"'#"&4632627&#"!2>54&#"�FccFQFFQFccFQFF�////!+L+///`^�^OO^�^OO�@@&
&@@����@�4@D%"#"/#"+"&=#"'+"&=.54>76;2264&#"5@
JLL				,4$0	TFCP
.Ew
	h��1	;		16		JY4)D&
0.=K	
�c	����%'%&=467%6m
	��3	�Z
	�"	�	f����&7&=47%6'2#!"&=4637.


��

D

�p

�xDD
B
0

0
�� $H!5>4&'5463!25#35#35#5!#54&"#54&"#54&"#54&"���
@
�`@�@�@�`�@		�		�		�		=	cc#

��������``







������5U'&?65462#";#";#36=46;22+"&=46;5.=7z	
��	
�8P8UUUUU),		L		�		8AW4
<)2


	�

	�-(88(   0		0*&�				"	iD)(9'"����&,4:@#"'&#"#"'&54632326322>7&.#6264&"575&'m	+1>�>?5
+1>�>?��$"%�B//B/` ���	
>=
>d=��$8P88PT:�1
#����&#"'&#"#"'&5463232632264&"m	+1>�>?5
+1>�>?��B//B/���	
>=
>��8P88P����	%1=G1!#!"&%;26=4&+";2=4+"%3!2=4#!";2=4+"2!5463�
��
�	`		`	pp��0����0	��	@��
� 		 		Xh@	00	����KWco2#!"&54632>54&/&546;2?6'&'54+"+"'&;25754+";2754+";2=4#!"3!2`

��

�	-	-	�pp�PP���
��

�
��	



 h����3%#32+/&?#"&=46;7#"&=463!7632�bK�

�S	

37

�K�

R


4
�`
 
j		
C
 
`
 
j		
C
 
�����%-56+".7>264&"6264&"6264&"264&"�P�U&P&(/hP)
n/3���=N&@";*P}CJm��m-S����"*2#!"&5463264&+";26=72+5����(88(`		 	0

0���`��8P8	�		0�@����"&462"&467"/&4762�%6%%6%�%%6%%F

��





%%%6%%�%6%%6%�

��





����$4%2+"&=4633#"'#"&=46;2%2+"&=463�

�

@��@$I`

�
�

�

�
�

�
  @0p �
�

�

�
����%1=I6/"/"/&54676276254+";2=4+";2=4+";2f&6
66
6&&6
66
6�������	
� 
	------	
�
	-----��hh����	!+/3=AK73#"&=46%#!"&546;5462324&"326#37#374&"326#37+532   

&��&/!pp!/��"@@`@@h"@@�
  
�
�
0��&&!/@

@/q"o   �"o ��
�������7&/&6??6/7?6/7?6/7?6/7?6/76|�PE<
<87<<77<
;E���'ef/0ff/0ff'���#G7&546;2#";#";#"32#!"'73;2=3;2=3;2=��
`
88888x

�@�)@@�)��

 @@@
`
�888888@@@72#!"&=46;;2=3;2=3;2=3;2=3;2= 

�

0@@@@@
�

�
XXXXXXXXXX���/73+"&546;2#";#";#";#"�X
�

�
XXXXXXX @

�

@@@@����	/7A546;#"&52+"=4;27#54&+"#4?62264&"%2+
@P	h0��	`	��3B//B/p
	P�
��	@@(@
���		�u
k�/B//B
��	@���	#.'7562"/&47�@`>SS�>+u5�@�SS>�+>u5����!4"&46;46;#"%2'&/52>76#"'.#57676�%% �%  ,IfHM-4#-:+0�MH2N/80+:-#3 %6%���6%��2.&B

�	 B&, 	�
���*2:2+54+"#54+"#"&?6'.54264&"264&"�Ԗ*	N@N		,2�4&&4&�4&&4&��]"A6B8888B Z4]�&4&&4&&4&&4���	/J7546;#"&2"&427735654&#"32+'2+"'.#".'46;2`	`v	6Ԗ�Ԗ=2��$q| 3$qO=2|�		#,#�@	`	7�Ԗ���$2=Oq�  o2=Oq$|	@	���t�3#"'"'"'#"'.?63!22767#!".=327!5Z&/,XX-/&A	�				
�@					
�I(Z!!!!!!Z(h���
		�dd������
%%53#!"&53%#!"&?63!23+"&@@
�
@�
��U	�	%@	 	@��

��""����		���/"&=463!2#2#!"&=4632#!"&=463		�		@		�`		`		�`		@	@		@	P	@		@	�	@		@	�����7'7'772"&464/76/&'7?6/76/&'&'76/&'&'76/&'&?'&?'&??6/7??6/7??6/76/&'77'7�---�-------jԖ�Ԗ�.""--"!-.""--"!-�---�---D---�---q�Ԗ�Ԓ-"!-.""--"!-.""-3---���+/M%#54&+"#54&+"#54?6;546;232'5#53#!"&=3;26=3;26�	�	 	�	 	�	.	
3�3
	����
�@
�	 	�	 	�	
S				S
	.	PP		@@�`

`				������%/&#!"&=4&&/&6?267w9
9
�
99�?L?`
r		�

�		r
`��C�:I"&462/&/&/&/&?.?67>327"&4?6�((.		-
<"	#8	�(	;
	2
`((�E2Y


JB"<	 	*"�4
,"	<	
2	���$2#!"&5463!2#!"3264&"��s%%p	��		C@�%@%			�����$6O2"&42654':12764./&>'&"67627>'.3232654'�Α�Α�P
�b FbP
��Α��W


	�&&�

	��@�"2!2+"&=4&"+"&=46;!2#!"&=4630		�	8P8	�				��			 		�(88(�		 	`���	 		 		����	#:BJ%6?#&''#>#6&'37.'#!"&5463!2"2645!"3>-''-V
."'--'L
�

��)77)F�jKKjK ��
�1) )#*)1�1))*#�	4
	7)@)7&KjKKj��@������,x�7327/"&?#'&/32767672>367'&"&'.'&'.'&764'&7>76767676276&2654.#"a4%4	
.
	!
	4%4	
J
		
	

	

�7N7+'U
�&p
Y&�



	
	

	�P88(,����-2#!"/&4?63'76/&'&??6@%%���		�>>>>>>>>�%�%�

��>>>>>>>>����'7M]2+"&=463#>7##"&46322+"&=4632#"&'##&'6=3>2+"&=463p

`

@629*P
%% %

`

%% P*926U 

`

�
`

`
8H'?0O	
%6%�
`

`
%6%O0?'H��
`

`
����1;#"'&54675#"&=46;2+7'&?6/'!&/5#.�&4,		�		'	4	+�%%`@!,34Y�	 
	 
�'	4	+.53,!�''
������	#2!54635!+"&=#"&"264`
��
 �%@%6%@%��
��
��  %@%%@%M���4@HR\d2+++"&=#+"&="&=#"&=46;5462%;2=4+"264&"75#";26=4&+264&"�


 
�
 



�������=�p

�p

ps@
P
� 

  

 
�
P
0".."08��]�
`

`
�������[%#"##"'&'+"=#"'&767"#"'&4767.'4546320454>762>7632�		<I		%((%		I<		 ,+	"S!!	
!S"+-X	@@		!V#

)5p(
.0F!)
	#V!	�����'"/&4?62762'&?62762"����(o���p-
7�
-����(p��p-7�-�����@�-2+"546;5'&63!22#"'73264&#"#>(�8�n��<TT<(#$(88(,
4J}��}�TxT$	8P8+5�)!4675#"&=46;2+2#!"&=463 Rn�@nR		`		�		� 		=~TT~				��	 		 	�����%-5=%/././&54?>?6264&"6264&"264&"�$
E'*M+7
$!E'*M*7
��3��*'E
$
7+L
E"$7+��������#+3;%/././&54?>?63264&"6264&"264&"�#
E'*M+7
$!E&*J5J��3��*&E
$
7+L
E"$4J5Jq�����1%2++"&5#5323#"&5#"&=46;546;2�

(
0
��
���
(

(
0
`
0
(

H`
�H��`

0
(
 �`'3?K[g2#!"&546354+";2';2=4+";2=4+";2=4+";2=4+"754&+";2654+";2`

��

���@@@(	�		�	��`
�


�H00		0		y����!)A2"&4>/7>.'&7264&"7'76.'&?>�Α�Α�
c4&&4&���Α��>
�&4&&4����@H%/67#"'".5'7&'&6?67&5462'0"0"132676&"264�767,RL\142G6G!	D8P84#03C#"9d
�h`:_~)= {:|"

v(88(Y$
Xt7/

����3N54&"54&"&'54&"&=4>3276322654.'#"/&54?&#"�QH4<<4H0>R-97n		�Vz'v		IVz8_F9�. f

wh

hw

f .�-

G
	�%
M
/&��@� *62"&=46/627.#"75&"26>54&'���8DF;<<"} @ &4&/&:!D8�K5�5KK5�5S,
&&

�

&&m&
,���!33#"&476&67>	-jQ�e:K? 9�2D[OV,�}n5119�."3W8.����)T];#!"&546;;2=4+";2=4+""'.'&"+";26?212?62;264&##532�
�
��

ȠPPPP�	+"		
/		I�
8
��

�
HH�	)6		2
			
�����'0;#!"&546;6&+54&+"#"27#532�
�
��

�LA	 	A`��
8
��

�
��P		P`R
���G�3#532&=#53546;#!"&546;;#"��
b�`@@��	�
��

�
��	F�b�`A@A|	�

�
�
�	���	373#"&=46%#532;#!"&=3?6/&#46;pp		��
7
�
��
�``�
Ƞ@	 	�
��
��

�A``A
����*6BR%#5%#532;#!"&546;;2=4+";2=4+"54+";254&+";265 ��
7
�
��

ȠPPPPPP	�		�	�@@�
��
��

�
HH���		`		����&2m#532;#!"&546;;2=4+";2=4+">54./&546;2?6'&'54+"+"'&;25y�
7
�
��

ȠPPPP�	-	-	W
��
��

�
HX��





����;CL;#!"&546;&'654&+";26=3??6/76/#5327#532�
�
��

�E!!%P			;�00		ɀ
b8
��

�
��!&%	�		0;7 		��b��A�7@EO7;#!"&546;;&'.'&"+";26??62#5327#%'762��
��

�
��	+"		��
b`�D�ED
(

�
�
/R	)6		2

(�b�D��D����'0;#!"&546;26/&";;26=7#532�
�
��

�A``A	 	��
8
��

�
��``P		P�
����&%"/&4?'&?67627'"/�		�Pu_VVR		[1�;;		;Q�		�uP_VVR		��0�;;		;R
��@�
"1%"&546?"/&4?'&?67627'"/@%6% 		�Pu_VVR		[1�;;		;Q�]#%%@		�uP_VVR		��0�;;		;R
�����
-A\n�62#"&76'47'.76'4&'".76'&6&'.76'&767'.76'.'".676#"&54'&676'&'.#&#0#"&=&762�+>		";I		
(�Lm

Q9		



'"&(X<9

GKl>60�
rn	ik
`<*MK	
GH  ML	
FI)<
#.><	
79?1:kJ55
897O
z,
	'
V		<9R
fHJ*�� @`$2#"&'&?'&6>264&#"G0a@((@a0>p&X	
W&p�		`)7337)<*B
nn
B*<�	
����'/$2"&4&2"&462"&4264&"24+"36264&"N�Α�ΑP*<**<���<**<*�ΑΑ��)<**<*�  h*<**<����'2"&4264&"6'.#"7626264&"�Α�Α��	
=("
	14)��Α��*�	"
	������32+"546;5'&63!2!!��8�8��J��0����**0����j2"&446;.'+";2;2/&+";232?676?6?6=4&+"/&6?63232?65�Α�Α�	Y;		Z
	/
 	
	
	��Α��G	:R				 	
	
����_n2"&4654/&+.#"/&54?632;26/&54?6;2?6/&?6//2?676767654'�Α�ΑJ		
C	
	
G 	
	
_
��Α���
			


		G&
	
			 
	
/d/*����8m2"&4762;2=4/&4?&#"32?6;26=4/&?63254/&=4+"+"/&+";237632;2?6�Α�Α�	3Su>
		�'

	��Α��_N
	&
uS-			f



	
����!%)-15=DK2"&45#375#"6264&"5#75#5#75#5#75#6264&"5#326=4&+�Α�Α�(

 5000p000p000`(

��Α��(
8(
��((8((8((8((8((8((h�(%
(����&2"&4"264&"2642676&"'&�Α�ΑU�`Y
	/�/
��Α���6'	
'����#22"&4%2767&'&"2767&'&"2676&"'&�Α�Α8�+`Y
	/�/
��Α��!"		!"		!"		!"	��6'	
'����+92"&4$"?626'&'"?626'.2676&"'&�Α�Α[&#
&
	
�#
&
	
`Y
	/�/	
��Α��)))��6'		'����-AP"&5476227"&4632&"?626'&'"?626'.2676&"'&�(**0	�Α�gJ>/L&#
&
	
�#
&
	
`Y
	/�/
@77<03g��Α)!.)))��6'	
'����':2"&4?6&'&'&2676&"'&%>'.'.7�Α�ΑZFi`Y
	/�/	
	��Α��F

��6'		'�	
F����#12"&46/764.?64/&2676&"'&�Α�ΑP!!�!!PPX`Y
	/�/	
��Α��-0((	((00��6'		'�����/<JZ"&767622"&47667'676&&>'?6&/.?6.>'&26�*��)!)y�G!)y�G�	Z

4]Z

4�"k,<@PH)��H)
G�y) G�y) ([
4
�

Z`"a$,k���� .G2"&4?6/76&/&"2676&"'&%6&/&"?6/�Α�Α_#
F`Y
	/�/	
'#
#��Α��	##	  ��6'		'�	  	##������6FVd72"&476"'&'&61"&'?676&>32&'&&"?626'."?626'&2676&"'&f)S)
Hr s�s 
�_?lE
K&#
&
	
�&#
&
	
`Y
	/�/	
�H))GR9DD9R]:e=b)))�6'		'����%-K26=676&"'&.54264&"264&":#".=6362?>�ΑYH	*
	/�/	
*	HY��&

��gO~.$		$.~OgW�@%
?	����;HU%:#".=6362?>26=676&"'&.5464/&?'76&6%&

�ΑYH	*
	/�/	
*	HY�P!!�!!
	PPI@%
?	l�gO~.$		$.~OgA0((((00����%8@^2"&4&26=676&"'&.546'.#"?62264&":#".=6362?>N�ΑYH	*
	/�/	
*	HY�
%
&�4&&4&
&

��gO~.$		$.~OgP						0&4&&4�@%
?	����"1<62"4&"276'.#"?62&2676."�Α��7�
%
&�	
Y`Y
/�YΑ�Α						a	'66'
 �`/?O_72+"&=46;2+"&=46;2+"&=463%2+"&=46;2+"&=46;2+"&=463`

@

�

@

�

@

�

@

�

@

�

@

�
@

@

@

@

@

@
�
@

@

@

@

@

@
��@�/?O_2+"&=4632+"&=4632+"&=4632+"&=4632+"&=4632+"&=463`

@

@

@

@

@



@

@

@

@

@

�
@

@
�
@

@
�
@

@
@
@

@
�
@

@
�
@

@
���"@72+".=4>;2+"&=4632+"&=4&#"+"&=6�

�%

�Ҕ		zV8`8		�
�
@&@
�
�ip		pVz8`8p		pi���F7+"&=46;2#"&=46;22+"&46;23265454&"+"&=6�
%%
�

%%�Ҕ5%� fz�z		�p
%0%�
p
%0%`�i�%5(�VzzV		i��!�77/'7'&54%'76DC#)�#+3`3
����+ FC##�*
3`3+�+ǩ����';GS_ks&'&'&6;2+"'&'&'&6;2+"2#!"&=46;254+";2754+";2754+";2754+";2"&462�+
+
n+
+
�
%��%%+o�```��6%%6%($>($>($>($>@
�%%�%
S�pppppppp@%6%%6��@�-=M]ms��#32+54&+"#"&=46;#"&=463!2;26=4&+";26=4&+"';26=4&+"26=4&+"334&"%54&+";26=4&+";260		�	 	�				 		��&&&&�&&3&3�8P8&&&&���	 	P		P	 	�	 		 	-&&e&&[&&�&&�(88e&&e&&����7DQ&=4;2+"=46#"'6+"=4.'&=4;22#"./2!2+"&/�<0(0��$qY��Z�).00�vYuV


v*AB>,9!,��P8!W1/'
%>>��
�
�
p

	�����-52"&4264&"4'654.'&7>264&"�Α�Α��##")��Α��W�

			�����5G2"&465."?624'654.'&7>765.#"?62�Α�Α�#&#	
&
h##")A#	
&
��Α��K))�

			�!)����&.Ma%/&>7676#"&462&#.&264&"4'654.'&7>?626'.#"�S
�/4g��ΑT��##
)
'	

.!	S	T�Α�g.,%#�

			�						
	����%2"&4"264&"2642676&#!"3�Α�ΑU�87Q
��
Q7��Α���H66H����.<2"&4?626'.#"?626'.#"6&#!";26�Α�Α

&
	
#�

&
	

��
Q77Q��Α��6)!!w6HH����#12"&46/764.?64/&6&#!";26�Α�ΑP!!�!!PP
��
Q77Q��Α��0((	((00�6HH����!/2"&4?626'.#"&"2646&#!";26�Α�Α
&	
%Z�
��
Q77Q��Α��5						
6HH����	ALP7"&=46;%+5322+"&547#"&547#"&5#"&=46;2#46;25#�

 @
  
0		S(�(S	0		`	`�`0`�
�
� 
�
�	 		p	 		�� �000��@�#/2"'&547.=462767'5%6�hJrr�w��,!�!/	
��J4>��>4�0�?�	�(%�@�%(��
8 ��@�!+72"'&54264&"7.=462767'5%6�hJrrm""�w��,!�!/	
��J4>��>4^""I0�?�	�(%�@�%(��
8 ����� ?&7>'7'/&?6276^K�K"r/7�5��bWi!%�K�K"7/rD5K��bWh$�����	4'&6;2%2&'7632"&46&/&"?6/�?/o	
o
U
	o/?E
ʒgg�g
44&	//	=
+��+
s�g�gg�6
//
%4		4����2"&4264&"264&"�Α�Α����Α��W����!32"&42654'"&54724+"362654'"&547�Α�ΑX&4&""���4&""��Α��G&&&

�  p&&

&����*!2#!"&=463!6?654&+";26p		��		�MM0FF	 		 	[��;LL�&&���	+#76322++"&767.5#"&=463�d��				C6
�
6C		�c�$�	 	<a  a<	 	���0#!"&=463!22+2+"&=463546;265�
��

`
 %8(�

@

%�
@

`

 %@(8 
�

�
 %
	����	-9AF673&.'3'>76732#!"&5463264&+"36264&"7#&�-''-V.
'j

��%%		�		;jKKjK�-'1) )**h*#f)1
�@
%�%�`				`KjKKj�1)���?'73264&"'766'OTc!�]
];1#]$�b�!cT;]
]�'T(�b���&7'73264&"'>%'762���+
���
(�]
o9�9(5+��]�(
�		B(9�9�����$67'&4?622?'762'&?%"/7?md		Z		">>,�.q.(-�q��k�		Z		d�,>>�d		Z		">>,.q.-(q��k		Z		e�,>>����.!2#!"&=4637&=46'46'%&'p		��		

'f0
A	db+
(&+��	 		 	�
e		C�	�1N
������1!2#!"&=4637'&6?627'&6?63276+"p		��		AM(Hh�A�c++.,���	 		 	kS$4b!R21'$�����*2%//&?'#+"&546;276%3264&#-NNNN�	 		�(80$TN��`

`NNNN�P			8($6TN�@����.6J254&""'54&".546'.#"?62264&"76'.#"?62�ΑA7		.d.		7A�

%
&9((�
%
&	��gBq!�		��		�!qBgG						�&4&&4�							����#.2"&4"2642654'&"6264&">'&#"32�Α�ΑU�(**3�-F7��Α���77��6 ����!)-59%+"&5#"&5#"&5463!235#264&"75#264&"'3'#u
 8P8�8P8 

��R``L((�`�((0�PB�
o
(88((88(
 
�`��((�``�((�`����=2##"'&7#"&?6&&/&?6>76327>o
)"(
C#+M�

b:

7:&
*KJ6
E=	 8=�	�'
	%#3hG6!'����'92"&4?626'.#"6&"'&276'.#"?62�Α�Αp

&
	
#�

#n#

-�3
#	
&
��Α��F)�**6�!)����(,048<@!2+"&=4>;53#!"&54>3!23'7#?#3'#73'3'#�		�	0��7		��7	���
�
�j�
`����
gFrj	 
	   ���		
B1``�pp�``�p�``�p����A�,2"'.543267>&'&'6768'S�S''?D++D?'��!FG"%;?QQ?;%$'88'$oo==o����"%/&&?6/&6?6�%">H6 F&3
&)'H!.L	�C>"(	4949/!=	���	!)19AIQ#546;22"&42#!"&=463264&""&4622"&4&2"&462"&42"&4�
@
��(8
�
8(B//B/��Mss�``
m
8(�

�(8�/B//B3s����*5!2#!"&=46;26=4'&5463 �@(8
�@
8(C	D-+@@@8( 

 (8(2,:+ *$
�����'#"/#"&?'&6?627//�
j��j
�A	(	ARr3f&g�DD�g&���Qg��6r����#/;I2++"&=#+"&=#"&=46354+";2=4+";2'#546;2#5P	 	�	 	�����0`0 �				��h�PPPP����2"&4264&"264&"6264&"�Α�Α�C4&&4&���Α��*�&4&&4����
%-1573622#!>?"&546;2264&"75#75#�		�K		�

����8P8
�
j8@@@		�L		�
�
� ��(88(�
�[�@@�@@ �hT\7&'76?6/&"'&+""2+"'"'"'+"&=46;276;2276;2276;23$"&462�	DP(1d"dq
0

0�		:&&t&&t&&:		%JJ%�1B//B/�b9
"&
P			 	 	      	 	`/B//B����4j%2+"'"'"'+"&=46;276;2276;2276;23%"'&'5462+"&=4&"35462+"&=4&"#5#p		:&&t&&t&&:		%JJ%��
8P8	 	�8P8	 	
� 	 	      	 	 	
�(88(		

``(88(		

�
	`������ '&?66762%47#"&z	
��	
�(-6,!��2BIg


	�

	�>@4_6I&(&�-h����#22"&46/764.?64/&"7626'&�Α�ΑP!!�!!PP�RM	)�)��Α��-0((	((00�>-
-������3#"./.""&/&'&'&7>76676/676�%

	""
%2" #d
	

0)"2`>1(CS9"

�

�


"9SC(2="3	@#3����	1.7>>327/6'&2#!"&=46;7s-�G'I!`+
.#:?f		��		�I<A78;Z=L_�[�,�H	%]J��	 		 	�����/37;?W#2+"&5#+"&=4635"&=46;2346;235!355#!5#=#"&=#+3235463


`
�
`



`
�
`
` ��  �  
�
  
�
@
�
`



`
�
`



     ��    `�
  
�
  
�����$%#!"&7>;&5463232&264&"��`I<8(,<	�))$(8,����%�"2+"546;5.?4>;23'��(4@�	@4r�uW7��7Wu�PP������/7;%+32#!"&=46;5#"&?#"&?&5462+&"264#3{	�p		��		p�	^1
r(r
1V			`��
 	`		`	 
a	~~	�			�y ������"5#"'&"#"'&'&767676676'#'&7676763_'$+A
 
A+$'*$$*?#/++G0:

:0G++/#

%
$
	����
#+6=DLT_72"&467'"'".'&7&766267&'&'767"&#">"6727&'6264&"6''6'&#"#�		�77W$|$("
77W$|$W��%,� 2 B//B/�%�		
`5KK54
VV5KK54
VV
��	
#�
#
�%��%K/B//B?
#
	�#
	 �`O%#"&'4.#!"#"&=46764'.=46323!2>5>32W,'
��',,
	',�
$,

,$

$,

,$���+"&462'&'.=46%2.=476`8P88P>
F|�<|E
D�P88P8��#��"�)��@�%K2#"&'#"&547.547&5467&5463021>#"'#"&546320212�&*&*(&"�*&*&"&(�&��**	(.(	&��(	**x%&	(��+5HY%+"&=!+"&=&=46?>;2%!'.+":>54&#"!264&#":�
 
�
 
 �"9���9
"N	
�!06

  

60!2
& 222
�!	�#/K2#!"&546;546;23546;254+";2%54+54+"#";;2=32�

�@

 	`	�	`	�pp((((@
�


0		00		0�((((������*fz��7&?6/.?6/&6?>?6/.?'/&'&?&'&?676?676767676%&>76&'&'&/&#"&>76�#
NA	2M
+= %�




	�
	
 {
�}
	
	{	 �l)

�.M
+=
NA	28+$�/4
C

4.+!	5d
	)6!+.O
����$,04<2+"&5#"&5#"&=46?>;2264&"75#;'#264&" (8	08P8�8P80	0!�
m�|((xM&��MY�((8(P	(88((88(	p"z
��((�```��((��@�Qh!2#!"&=46332'.=4&+!46;2327>=.=46;5462354626&+76&+";327P		��			2"'��%�%$4

			 		��:D;	 		 	@	 *x!..p`%%�4$
v* 	0		00		`3	kS���'%"/&4?626/&#";2=37�		�

�		�

{U
p
 `
�

�		�

�		�N6
P@6����'8@HPX`%2#"'##"&5475&546323632#0#23'"1"&46;7#264&"64&"2$"264264&"264&"�%%%�%%  %%�%%%''���&%%&��			w			��			 			@			`%6%  %%�%%  %6%A A	@%6%@b			�			 			��			 			����7AE%'&?67&?'&?6'2#!"&=46;;267!463!2!�::$$U$$::	&�&	�
=��@���;;$$$$;;�	&&	p��P��������0&4?62'%/&4?2?/&4?2?������;��:��:��,jjjjjII�jjII���!;G7"&=463546;22++"&=2#!"&5463!264&#52%"=4;2#�

	@	

	(	$	� 	5KK5Oq1����
�
		
�
		�		KjK@qOI7  �`26A6#!"&='.=4>3235#"&=46;2+325'46?"&v�	
��
F		�88		�		892��0�
+$ �

/_	0				0A?>]
+>���0%#!"&5467&546;&546;2654'6323232�#*��*#*%!/
(8%*O(**(#*%/!8(%*#���'62"&4%+".?>22+"&=463KjKKjK��
kP

�

�KjKKj�%
	���
�

�
������7%/+"&=&/&6?'.?>546;276� 
�	@	�
 �� 
�	@�
 �r
8O�		�O8
NN
8O�	�O8
N	����+9GUcq2#!"&546354&+"26=4&";2654&+"26=4&";2654&+"26=4&";2654&+"26=4&";26 (88(�@(88(@	@	((	@	�	P	!.!!.!	P	�	P	!.!!.!	P	�	@	((	@	�8(��(88(@(8��@		@�@@		q8		8!!�X!!X		q8		8!!�X!!X		y@		@�@@		
����+9GWes��2#!"&=46354&";26754&";26754&";26754&";262#!"&=46354&+"26754&+"26754&+"26754&+"26 (8%�%8(@(	@	�!.!	P	�!.!	P	�(	@	%8(�@(8%`	@	(�	P	!.!�	P	!.!�	@	(�8(@%%@(8�  		8!!8		8!!8		  		�% (88( %P 		 		!!		!! 		 ������(6HT\j7&>#"./&67632*#"0&'&567%.?>766676.67&'7676.'&6� ]F&
#YJ gu$$ dY�,
� SaAO6 ��,
 SF
.�"�,�+-2# $D&�'
91+
	
�)H!A`)��	�,'*(O	����.6>F3"&'.535.535.53546;23264&"6264&"6264&"�@	F\F	%@$@$@
�
@�((((((
&%,99,	2 &
1&
1 

 %&�((d((d((����15����%2+.#"#."#"&=46;546;546;232%3'#2+/+"&=&'/&?&'#"&=46;67'&?667546;276264&"'2+/+"&=&'/&?&'#"&=46;67'&?667546;276264&"p		'0&CBCLC			�
q
SJ
���3Q0	
	 	
		
	 	
((�	
	 	
		
	 	
((�	 	"""	 	P	`

h
@`@�� 	
		
	 	
		
P((4	 
		
	 	
		
P((����7;CK%2+"&547#"&547#"&=46;546;546;232%3'264&"264&"p		2B\BDB\B2		
�
q
m0
���M�((<((�	 	.BB..BB.	 	@
�

�
@�``��((((�
3K?62"&472#!"&546326/.+";2?33754&+"&#"327;26����`�	6	6	F�		**
	�55��� ��
�	�
�		$*<*	��@�#/%2++"&=#"&=46;&5462&">54(

`
 
`

-%JlJ%E,�
 
�

�
 
;5AOOA5;�"9!(����:B%#!"&5463!2;;26=326=4&+54&+"#"5!"3�

��)77)F��	0	 	0		0	 	0	��
Z	4
	7)@)7v 	p		p	 	0		0	��@����/3B$2"&454+54+";2'"!546;546;232&'5#!"&=33�xTTxT�
&


<
@7.�uP�P	������	�TxTTxB
6

L
� P001`  �*&�0	����-9EQ]iu�����2#!"&546;546;23546;23546;254+";2=4+";2=4+";254+";2=4+";2=4+";254+";2=4+";2=4+";254+";2=4+";2h

��

(		@		@
�
��((((((�((((((�((((((�((((
��

h
P		PP		PH

��((l((l((�((l((l((T((l((l((��((l((���T2#"'#"547>7&54>'./&54;2?6&'&'54&+"+"'&;265�Ԗ�j83AL92	 		2	 		�z�z329JV�%						��B�Og#"'#"54767&5462;2=>54./&54>;2?6'&'54+"+"'&#"'#"&'32654'�zV<3+.&z�f-	-	Z.+3<@hc�9HB�^)3B^�	



�
6,qO

P23����#2++"&=#"&=46;546;2`

`
@
`

`
@
@
@
�

�
@
`

`
���W]ciou}���%2#'"/+"&57&'"/&4?&'"&=46367'&4?6267'46;2762'7&'67#677&'7&'6264&"67'367'?&'�

$
/;		;/
$

$
/;		;/
$�
+Y%+
l@	L1	C
+2:%+
l@	@1	�		;/
$

$
/;		;/
$

$
/;@	11	%
L%+
�@	1w�1	%
H%+
���-T7"&=46;2#546;2+"&2?#!"&=%5!'54767546;>3232�		�		�	�		�	F4��`�`��`NN�				P				r��՗�
F��F

,		,�!2#!"&546;54&+";26��`�@`	�		�	@� @�				�52#!"&546;54&+54&+"#";;26=326��`�@`	H		H		H		H	@� @�	H		H		H		H	������Z/&='&63!22"&4>54&/&546;2?6'&'54+""+"'&;25�?R;#P��y�^^�^�-		-	gCQ9	<��''�^�^^��

	

���eoy%2+5#5#5#33#54&+"#53535####"&=46;546;546;54623546235462354623232'354&+"54&+"�		P     P	@	P     P						@		@		@				�0		8	 	`	�	��``��P		P��``��	�	p	P	p								p	P	p�00		�@		@���1?G%"/&5476;5462;2=462;2=4623226?."62"&4�	f8�8f	@ 

 

 @��00200=�
	n<<n	
��

��

�Ѐ $ <�����2D%/#"/#"&57"#"&?'&6?'&676276'7'7''77'�
bK	
lDDl
Kb
n*^""^*/$/5--5/$4!!�5S
qYYq
S5h
<k

k<
h}(2332(6**6��0��%#"#.'3'&'45473'>76327#"'&54?'&4?'&543243127632#"/>7654.'&547654'&54763231!�QM(;/)	?$
:)9+****%5:
	$?	)/;`HXWE;

)+_G+%7-D	A!		! ��!		!A5%
# 
+G`*);�����%#!"&5463!2!"3!0#"/267#1"'&54?<14'#"54?.''312545'764/7454#"#'4"'"#"32?.547.547#"/�
��)77)FC��
�%	=N=	%	


		


F	4
	7)@)7�� &11& 	
#	
po	!

��A� .=KY%&546?626"/.=54&?6754&3766=4/&'6=4/&*����
	� ,�

��PP�``�PP�``l1PP1
OmR�66�"-$���nv~/612#".5'"&5475#"&46307'/&'&6765'&?.5467'&?7>54'&54764'6'76/�82
5P/
))
	

/P8
/<		&!M,;;,L"&	U

�~s?'$=
*!
	

		!*
AE� 	

(/(F6$	33	55	33	$6F(/(	t &&""&&���'7#!"&=4?62335335332!546;2#!"&=463�
	� 	
��@`@`@	�@	�		� 		d%		%Z������	00	`	 		 	��@�'9=L:767#!"&=72"#".'.'5463%2+5.+54635#%#5463!2#"�*+ @
�
@ �
,)"	),


�$`
 @��`
@
�& 0�

�0�
!	"
`
�
�! 
�@@` �

`&����	'2=HS^it�2#546;2#546;2#546;2#54636"&546?"&546?"&546?"&546?"&546?"&546?"&546?546;2+32#!"&=46;5#"&=46;2;546;2326�	@	�	@	�	@	�	@	} s s s s s s 	 	8(��		�`		��(8	 	
�	 	�
@	��		��		��		��	 
 .

 .

 .

 .

 .

 .

 .
Ӑ		�(8@	 		 	@8(�		�
�		�����	CP3+"&%!&5476?2+54&"#54&/#54&"#"&=463#5467�
@
C��XE++EX

 @@ 

��  @��
�C8+5

5+8C<
�
@

@H$
&H@

@
�
@!  0
�����h�'&4?6"2#".5'546326=4&"+#".5463264&+&/&6;264&#"/&47632?6#".'&66iR;;%'
#/
)K5*A$!1 &&!			 

(8%	/
q%
&'5��;)d$4
&+	d
!5K01&4& (&
$'$
�	
$	

���������$&#".'&'32#".'"'#"&463267&'#"'&&'&4>7>6767&'#".'&#"&463232>7'.5462627&5462327>32#"#"'7>"264$"264g
!	 

(

(

 	!



*#%6%:%6%#*


�			��			h	

#8-%%-8#
	

!4"%%%%%%%%"4!

'							����2"&44&'657677�Α�Α�WA��Y&s3&�+E(���Α��gCg�g)�rG"ir	"?3N,/)g����	/%+54>?#"&5%#54&"#54?54?6m	p�	mp	�`%6%`0	LL	Q	d	�L	/�	�	�`%%`�	s	KK	s����/?2#!"&546354&+";26754&+";26754&+";26���p	 		 	`	 		 	`	 		 	���`���		�		�		�		@		@		����/?%#!"&5463!2326=4&+"326=4&+"326=4&+"���`���		�		�		�		@		@		`p	 		 	`	 		 	`	 		 	����("&462'+"&46;'.?67676&6%%6%_#n�\- 1&(':!
X!@%6%%6�An1"#G!\!./
!H
����)R2#"&=46?54?03>26=4#"/.=46226=4/&67621/&�
	Zu
M		z�&/		M
u
�'?
/`
Q��M		P
�`/
?'�

P		M�
�Q����1NV%#!"&5463!2"3237232/76&#/&"'"327654#0"#"&463:1324#&5!"3�

��)77)F�;/DD/'88'u��
Z	4
	7)@)7xCC`C8N8��@���$_%"/&=#"&462322654.#"7+"=&'&?6;2654/.54>354;2'&+"�d8HVzz�z,
��xT'B'<T�	-	d
,z�zzVH8	T<'C&TxE



���$0;%"/&=#"&462322654.#"62"'&54264&"�d8HVzz�z,
��xT'B'<Tq>+CCJ
d
,z�zzVH8	T<'C&Tx�+$OO$5
�����%57#"&'&6?535#546;272#546353#"&'&67�( .
W��
��
�
 �s -
�^)!HA���  

  
���=W!H��G�;%//&?'&?67672+#"/#"&=46;2>3;........

�b X,

Q
:U�........�
0
���
0
jC
���92#"&4632#0&#"3267#"/#"&?'&6?62T	+.j��j.,
W||W�7
DD
7L""	�Ԗ
|�|�6L$$L6EE������ &),/25%+"/#"&?'&6;76232#'#3373'7#73'�5k8*8k55k8*8kB( 5p55p8.�((�.�(�Y$^^$YY$^^$!7XXX&8!!�!&8!����	'E762#547!#762'#54&#4?6'76&+'&"#";2?326F&�r�&�`-`�H''''�+���

�+�f
��`'&]z
f�((((����FRUX^%'37'$2"&54737!;32?327654/7654&+'&#1"#"$2"&54#''73@$Q��((�|�����	<<	<<s((�$,B!!B!!R��
�@

�
�����`11
1

111
1

1�
�@

�
o8888���7;?267+32++"&=!+"&=#"&=46;5#"&=3355#xP
 0		0	 	�	 	0		0 
P`�`�
`
@	 	�		��		�	 	@
`
`@@@@@������@DH%+"&=#+"&=#+"&='&'&?5'&4?5'&6?%35!5!y7	 	�	 	�	 	7Y7		w��w		7����@��/
0		00		00		0
1@2@VV@2@�@@�@���-6/#"&=46;//&?'&?676�Yf

fP-..--..y��Y
�
`.--..--����%2"&4264&"&264&#"3"&462"&4�Α�Α�P88(PppP(8S��Α���m8P8p�p8P�����@�4DL";#";#";!!&'.7>/762#!"&=463264&"����ri����p'
FF'--[%
��
%��@@@`@��
M�N	
?JJp% 

 %`����0LT\"&462#!"&5463!2";26=654??6/76/&'&5!"3"&462			�

��)77)F�B/ 	@	 �GGbbFFbb���
w			8			�	4
	7)@)7& 
		
 �++**�@8			���� #!2#!"&=46;'&?676%3p		��		�5	

))


	5��t�	 		 	JJ
		
88
		
J�������-7?G327+"&=32+"&54&"&4632>?"&=264&"264&"#!*	 	� 
	�&
(833�@8P8@			Y			&�		�`
	&
8(V'`@�(88(�@P							������7#546;2#54'#5##5#+"&=!+"&="&?63!2p0K5@5K0(000(N	 	�	 	
j@��5KK5��.������p		pp		p ��B�<%+"&54674&5463263276&'654&#"&'&54632W*/!�(8$8(,
&�5T%8(
qO#)m_.!/8(1
(8&'A$(8
Pp
F)F[����DQ%#!"&54674&454632632%&?'&4?'&676276&'&"74632.?$8(��(84%B."6&�R	L	
SS
	X))X	

	!\B1#)
;
'z
1(88(&6.B$
&
	X))X	
SS
	Y
!B\.#1$D/
������ '0:EKO7'"&?&=46&63''&4?6#76276/&>2".=7#'3'kl�MA�rQ�	=m__}LP��uj�ddd�8�.�BY1b	����z�b��WBߜŰ�����#'&4?66&='46/&5����  � ���� R
ww
e��&]

�mt�

]& �� �4<%+"&=#+"&=.54623%+'54632324&"2*�	@	�	@	$
�& �5	@	p			�6�		pp		�
1
p &$.�				������CI7&?>#"&?#!"&547>7.='&4?'&6;2+"/#77		u*x�[ #H0�

GU�Z-3<<>�
K	@�uW+*)EB<#/@
_6m
2

c	

	%����.&#"+"'&7'&54>32?547>32�3HV(	#2"(?).F�3I	X!
)#"	(VO?
��� 0@P`p�����7+".767>%+"/&67622+"&=4632+"&=463/.7676"'&'&?6#''&'&?>2+"&=4632+"&=463'62+"5'67+"5+"5�
a%*%@�		`		`		`		�		S*
�
S
*S		$
*I		`		`		`		�

@��

.+�
hh
��	@		@	�	@		@		3$�

3+.
�3	Z�	@		@	�	@		@	�����������-Ohq;#!"&546;54+";2=4+"&=46;22654/&54;2=4+"+"374+"276=4+"&57#532�
�
��

�`		,`$$y�
8
��

�
�� 	 	`x7''7�
�����DP`p#"546;2!5'&=;27;2732?>72=4+"&546;2'&+546;2"&=46;2#3"&=46;2#0	 	�$�%   
#	p&  	 	��		 		@		 		 �		�X'$@@%5N	(			%?p		�	�		�		�		�	����&.6/&/&"/&&546264&"264&"�Rt
+))+
l��qQ��	0..0	Pv�����G�'%/&?'/&='6276"&47%;Z$1Z/�/-	��1�4%��Z	1-//-$1�%4�����'/mx��������32#54#32#54;2#54;2#54#54;2!32#54!2+32#!"&=46;5#"&=46;2;546;2326=4636"&546?"&546?%".546?"&546?"&546?2"&546?"&546?"&546?"&546?� 8 � H ` �H 	8(��		�`		��(8	 	
�	 	�
	���(
C�2(
 xxxxxxxxxxxx	p(8@	 		 	@8(p		p
�		�
p	 

'

' 

'0

'

'

'

'

'

'���$,!2#!"&=4637#7>?#?/7?/�		� 		��o�8V�@@  @�    	 		 	@ �"	k�


�   @@ �   ������JR7#"'.7/.?>2+"&=#"/1"&='&54?>3235463&"&462Q#4@:!�			0
/W	 /#	\((�5e
�b"+	��		�	P/S

SV

k/	@((����>F2#+"&=#+"&="'+"&=4632546;2632>264&"E
	 	�	@	3z3	@	pPI7

#�			`\
 		 �		GG		�B^)1

	P			��A�KS&/0+"&='+"/&54?&5457+"&=4636;46;2264&"@
! 	@	�	B		4$+�K5x	G			sM

	&f-!�		�@idD)
8		8$4!5K	 			����G�43+'7'#"&=265%/&/&7%62546;2 �	�(h�<h%�	���
e	@	M��	7@�w@I	�H�

��

Z4		�����Z%#32+;2?6+".'&7#"&=46;7#"&=46;7654&+"&/&6?6;232pd"�		�	T	%O#	*		d"�		�	T	%O2*		� 	 				
.0	 	 	 				
.0	 	����!+2#"/&"#"&7676276'&"276'&"A�J2??&'&@OarJO^!		!^!		1^!		!^!		�mIWH
8&&8�P`,�)))))))������#!"&'&5476273{	�� 
"
f&@U	
	�L�&@����KOSW%+32+"&=46;5!32+"&=46;5#"&=463!5#"&=46;2+!2%35#5#!5#�	h8

�

8��8

�

8h		H

�

H	����@`�`�	(
�

�
((
�

�
(		(
�

�
(	x@��@@@@������>FN2+32+'32+";2+"&'&76=46;76;2"264267#7`
8(\7
	PK�@
	�		p

l0(pP8�
9			Mwf�
 (82n
	�P
			%*&.PpX
			W;7�2"&=4$"6265427&"�ړ�ԖP�pI�I��9�9:��R>b;SS;b>/!

**

!Z����B"&462+"&46;%2+"/#"'.?'.?'&.6?6$((�

 M

C

6
 >U
%
(
'%,G*`((��)N$	f
W2
.W
(5����
&2#"&=4&54'!2!!2#!265(P	-P(8�� P	B.��(8�P	@�&'p8(� 	.B8(������#7?G/&/&6?'.?>76'.5462+"&76"264&"264�
��
��
��
�� &TxT& ~
��
ZZ
EE
ZZ
E�:"5KK5":

�������&?6S��	
M	
=�

	�9

����G�o�'&54?>#/#+"&='"&547+"&=4?#/&?6;'&/&?637>23?632/&6?6#'&'��	

	0/=		J7R7J		=/0	

	4
NE
5	

	2=$
$
$=2	

	5
EN
s6NH(�		
Ha	N		Iw
(==(wI		N	aH
		O	P		
L44L
		P	�HN6	����@�$,4<DL!#!"&7>=46264&"264&"264&"264&"62"&4264&"�	��
	8			I			I			I			�P88P8S�:J)�1
	
�Pp�															�p�pp��%6%%6����muz$2"&4264&"2&#"#+"/+"&=&'"/&4?&'#"&=46;67'&4?6546;2354762264&"73'#�H44H4Nh
	3;$Q
	
	,	
	

	�	8f	
�oB//B/fn)kp4H44H<
3
	30	
	

	
	,	

�
�(.$

(�/B//B�``����
 (<#>32#7"&547367#'547"&%2+'72+654&+'327ZR@(\gB6jK���b�P0
*q7OP/!F*#L#�D$,P2�K5

5w�0*=)�D(`�O7*!/`��$,2+"./&"+"&5463264&"264&"`

�

:
 �

e6%%6%e6%%6%�
��
	==
@
�%6%%6%%6%%6��
� A[72#"&'&6;232>'.+"&=4635"&=463!2676&#"+".7>#2&'&6;23264&+&'�%9:+#5
 
�				N !26(	:-06D
/+H
"
t�/$,A,"

		 	 	 	
	'(.G T7.
+'
(&���'"/&4?>7&?67'�M�5Z�N#L��zZzwL#N�Z5�M�^zZz���-W62"&4$2"&4'#"'"'#"'&7&47&66266+&'&#&""#"&5467&54632632:12((�((G2$2#�8(+	<	+(8%B. 5%!/(`((((2

2#$�P8
	
8(2

.B!/!	��B�8ER_l%#!"&5467<146326326#"&"'.'&'>32#"'&?>#"'&?>#"'&?>#"'&?>^%/!�!/%8(1,�+E+T:

%2�$	%
[$	%
[$	%
[$	%
�,!//!,(8(%5#+:P
5.�@@@@@@@@���+;J2#!"&5467&54632632:62"&546762#"&546762"&54>�(88(��(8%B. 5%!/��"("�"

"�"(@8P88(2

.B!/!	�232
32
 �����
)7Ec6#"'.?>#"'.?6&#"'.?6$#"'.?6&#"'.?672#!"&5467&54632632:�@	@m@	@�@	@�@	@S@	@;(88(��(8%B. 5%!/Q
p
p
p
p
p
p
p
p
p
p�8P88(2

.B!/!	����@�EP]jw�%#!"&5467<146326321&?'&4?'&6762760"1"&7&54632#"'&?>#"'&?>#"'&?>#"'&?>�%/!�!/$8(1"��;GGK##K	% Ib&D$	%
[$	%
[$	%
[$	%
�,!//!,(8(5K##KGGP&
�@@@@@@@@������1Jc|�%'.'!'+"/&?67&'.7676326&#/&""?65'76&#/&""?65'76&#/&""?65'5!+"&=#+"&}	

	��6&

	K	+*
Q�&C��
�
�
��`	@	�	@	�
		
	Nl#	c#
	+**Q$ 





퐐		PP		���
1U]emy2+"&54327.5>7327&'.5>7&'327&'.5>676.264&"6264&"264&"7264&"	 	,>&3=1S?AW3+O-%>&3=+O-%&.T,+O-.	5!6H+O-%&.T,1N.1(A( 4$)�							I						�
�0		�
��$
E	V>		
=	t!E		
�

	(			/	


9	


/	

���)1<I#"&546726767632676324&"2'#"&462".54632� LBQ!Qr!D�[a	�KjKKj5		
 	�a[�D!rQ!QBL 	��jKKjK�		Y	��@�	5=RYf53+"&2+"/#".='0&5#".=46;2&"&462753"&5#"&'#"&?'46;#%2+"&5�@	 	 

:)
	
		&-Y((��

�
 @`
	 	0��		Q=
8
		8+e
		�`&-`((D �`


��
��
�0		�����M%2#"&?#".576;27+76'&+76&+"#"&5467&546;2654'632324X;
D|+/!


D0!/+
&!/	(8&p�	ax
	Ao.!/"x/!.&/!8(&��@�<Z6+"&=4&'&+"&=466+"&=4&'&+"&=466+"&=4&"+"&=46S�S	 	oSf�	 	�lW�	 	B19T	 	_N5 	 		 	+�K�Q�		�V�
�e�		�t�ZtV�		�3NM8�		�JrW0�		�

�		�#9����	";T�!546;26&/&"?6/76&/&"?6/76&/&"?6/2'.=#+"&=#+"&=!26=463 ��^B�B^��

�

�

�	)) 	`	�	`	 			@@B^^,





�	@'1 +p		PP		�p		@	����/G%2#!"&=4632+"&=463!2#!"&=463'"&4632632632+"'p		��		@		�		 		��		P<TT<=++=(D.BB.<%^%P				`								�TxT--*"B\B  ���/A2"&4264&""&54754622654'54&"7"&54675462xP88P8S� TxT B\B�B/ ( `(		�8P88PH�(2<TT<1)�.BB��/!(��(!N�		���/A2"&4264&""&54754622654'54&"7"&54675462xP88P8S� TxT B\B�B/ ( `(		�8P88PH�(2<TT<1)�.BB��/!(��(!N		����+;%2#!"&=46;#"3!2=4+5!4>3!2?6/&'&`

��

@

�

 ��	@
��J�_)�
`

`
@@@@	
�K^)��@�,X�%#&'"'"'"&=46767>7>7627#&'"'"'"&=46767>7>7627#&'"'"'"&=46767>7>7622+$)l+)l+)
!
X

Y
!+$)l+)l+#,
!
X

Y
!+$)l+)l+#,
!
X

Y
@	 
	 				�	 	 				�	 	 				������%="&462#"/&4?7#"'.?'6#5&/.>2?6�B//B/�


0	.=u.	0


�)�) )'b') /B//B��'
!
@9339@
!
' � 

 		���2:B!46762+"&547"'"&54>7&5!5463264&" 4&"2�o�0+!h		0<"/B/!F!/B/<�&��`��6`"
\	 	@K8+!//!
		
!//!!8K@&������B�
 go"&'62&.'632767632&7'&'&'&''&4767>.&76767&547632>54'&6264&" 	'V'	�%,5�4,$k6+`2+=66>+2`+6
)F2!7 )
�((P

��P/C**C/P� =	Xb	  bX= ?13H!8"0@�((��� 4I7&=46;22654.'&=467+"&5.'.=46+"&5.'".=46�:D
	<)Ej
0
(	0z�	 	�a	
Sv	 	S9
�d=)<	WD�

�
2��z
	a�	 	`vS
:R 
����	7!#!"&7;26=4&+"%2!546;546;23546;2���@	`		`	P�@0	 	�	 	���`		`		�000		00		0����	7!#!"&73!26=4&#!"%2!546;546;23546;2���@	 		��	P�@0	 	�	 	���@		@		�000		00		0�����")-15;C#"/&67%>'&#"#"/&6?63267'7'?'?'77&'67'�)6��
 a				!%,.O��=�<�<Q	-
$=d9w!�6�718>=��'''�.
	�	�����*'&&'&7276/>76/&67*."'f91��3
7S�DX!"&#b.&291B		
28 &"!XD
�����+;K[_o���%#!"&=4?>;5#"&=463!2+32;26=4&+"";26=4&#'#";26=4&'35#26=4&+"3;26=4&+"54+";2754&+";26754&+";26�	�@
U`				`��				 				0				���(				 				���				0				E[	
[�@	`		`	@				G				P				� �				@				�x				W				���+@V72/"/&4?'&637"&=46762#/&=46;26+"&?'&4?62�
c
c!�
c
c!cc
p��
p!c
c�
p!c
c@
p!c
c�c
c!p
p
c
c����B�C#'32%#73#5"&?6;2++"&=!+"&='#"&=46;'!0ac	��~�~��	c�			 	��	 			 �`������`�@	 	�				�	 	  ������	%?N^#53##7/32210'&/&"&?6;#+"&='#"&=46;'%"&54676>'&'&'32�=d�~!c
�'	c�51�	 			%4^�^D4('?3&X���H
>``� K7H6		�	 	 !`A]]A&m/$(�?/S!('1�32+5##5##5##5##"&=46;546;546;232�		P @ @ @ P		0	0	�	0		�	��������	�	0	0		0	0����7>Eeoy7#"&546;'&?6'&6?67>763253#"&53#2#5+#546;&54632632#3&#"7654&#"36�
	�


			  
		)��
�

��
( 7!!7 (�5	�	5��
`
	


	66

��`��`
 
`��`
,KK,
0		0������9=A%'&6?'#"&/#"'/&7>7.?>76767'7'�
'(??('
�'%WrrW%'��_$�p$_C	h.'KK'.h	C	fW(�
00
�(Wf	G'@..@'�����2#!".'&63!!�8��8���9���e@�����cs�2"&44&#"+;2=732;2?6;2;2=4?6=46;2+";2;6$;2?6=4&">7#"/&+'&+";2�Α�Α�uS(	

	% 

		 ��
	}5W
	
+ +	��Α��gSu	

	
		
			!�
	��8-
%

` %2#!"&=463%2#!"&=463�		� 		�		� 		�	 		 	�	 		 	 ����+"&546;2+"&546;2`	 		 	�	 		 	0		�		� 		�		�����+3.767>7676?6?62264&"�		/$L
#
#kS#&"7L/		��((�		/L7"&"Sk##
L%/		��((�����"/&6?>'7'6�$!��!$"b&`�0`"&a"v%i(��(i%#W@��@h#������@j"&4622462"&"&462&54'&>367>'&'&636762'&'.7676&'"'6'&5<546�((@(((((@	72		94�	27	
	49	((((`((�=3


:2
	�
1:
+3	

���/7%+"/#"&'.+"&=4>?6264&"�.	
3
./	7")�
%B0�
0%zt(	
@
 &R
Q?bU;K
6!8�����"'"/"/"'&63!2�WB.".,$W���,l����}��@�'08!>32#47%#534'3+#."#553#"&62#54@��'~J�`Bp?��B��
� 2:F:2���
�P8��~;E��C=�_��=C@`
 �##��``�8(``(������%2#!"&=463$!'&>76p		��		e(H��0@te
 	@		@	�"5W�:e@:����(:B&'&'&6;2+"7&'&'4>;2+"2++"&=463264&+#

n#
�.BB.8(�(8
p.#1,#1, B\B(88(�
�(`������"/%4'7>#"'.?2&"&462%"&5>76H&Q,6	�Q7|7Q-((��	6,Q&�,� `8
D�

� ((
8` �,����&.6>%4'7>#27"'.7'"&7676"&462"264"&4628*4�$*"H"C
4*�Α�Α��ll�l��#C*B6

C

y
B*C#��Α��l�ll�l ����)9V"&462"&462++"&=#"&?6727%2+"&5463++"&=#"&=4672�4&&4&Z4&&4&?7
0
7.8��		 		|

P

8@&4&&4&&4&&4��h

h��	� 		�	��
�

�
������@DH%"//"&46327'&67>327'&4?6;2762%7''�a		P
k
l	
)&
Q		a	

	P0

/

0Q	��IEI2EID�a		Q
&)
! l
k	Q		a		Q0

/

0P	hIEJ�EIE�����4O.7>7&5462#"'%1+"&5.'.=4>3210+".5.'"&=4632119�bu
C 
�a	z�Z S9		Sv b�9t
+	a�	 �z:R
 	v����
2#!"&575#35#35#@&&�&� 0�0�0�&��&&@��``````����
#*.546;#!"&575#354&+326=#35#;5'!5%35#"&��&�&�@�
  
�@�
 @�@ 
�&���&&�@@ 
@�@
 @@ 
@`@@@ @������(2O2"&42+"&46;264!6"/&627"&4?"&46;2"1"&='&6?|(()	`		`	��'DD
=\		0

�R=N�((�\				DD�	\	
�1S=Y

SN8�����$C"&462#"'%.>7'&776'&76776/&//'�((%�x			�.Kk(

1���#>R04	: s/`((���fEK5(#JFa 3		
9��@�.BN"&4622#!"&46;0&5&6?63232647'.?'&3737#"/d((�*� 

+6
(%,G*,
F
�U
%
'4>+�!
 =`((��
*
(5
�"Q2
.W
���

[�)N$	L����C%#!"&=463!2654/&?6%5"&46;2;26=32###5##5.e,��			



��

&"	/= &`

8(@�@*6a&'		


w�	,&@`(80004E�����6Wy2#"'#"&'&>7&542654/&54;2=4+"+"3754&+"'&+";2=2?;232654/&54;2=4+"+"3�Ԗ�j83AL9��	

	
0�z�z319JV�h		##		hD88D�����EQ"&462'76#"'%&'&>&'&6?54?'&/&>#"'&7�((TB4Z		��!&
J#*		?o
�<U�`((�?'f"�!			
5(:4S

--=

�����T\dlt�+"'.547&507'.?>54>;2167&5462704=46;276$264&"264&"6264&"6264&"7654&"6264&"��!	#%c
!&,�	8	
8P8
	8		
��			)																(7
"-.QC(?,
7	.!(88(".		*			��			7			7			O			2			����[`l62"&462"&462"&462"&4"/&=##!"&54>7546;546;2354?623'264&#!"3n^^^$
%)+B.�.B� O@)%
$��@zD:�H#%
$*:.BB.(	[p�
3:*$
% f S`@���((����2++"=#"=43%2#!"=43t�8�h�� 8��8�88����%19#+"&?.5475#"&=463!2;2=4+"264&"p /(�(/ 		`		��006tRRtR��2TGGT2�				������/9A%"/.7'#'76'"'&7>76'&"&4?264&"�5
uk>`@�k04
R*I%JDK
	�|5%�u45u0k�@`>k6R=+	KDJ$JR {%5�������)-15="&462232#!"&=46;5"#"'&67%65#%35+3"&462-��

��

�����``�``c�
<\
�

�
S;���`````` ����"&54676>'&'&'32D4H���_I9*
$:\K8+�0�+_��_6�D5: ��Y'	Cu ((8E����A�,X7'&67670767>767632%"#"/67>7>7>767�

5#$	
$7E #3

	%.&%
L	
$7E %C(

	%.
	 !5#p
!#
J$'

	%
%&!�
J6'/

	%&!!	!����2:%#!"&5463!2;;2=32=4+54+"#"5!"3�

��)77)F��808808��
Z	4
	7)@)7�088088��@��@�2##!"&5".546 AoH(#��	��2;�

	>k���	5!#!"&5!%630
�@
,Y{���

��Z�����A�,H3#!"&=26554+54+"#";;2=327#"/&"#"/&547%62 �	�`	;808808���M��		�D088088����

���02#"'#"547>7&5454+54+"#";;2=32�Ԗ�j83AL9`808808�z�z31:IVn088088�����%."/&4?627"/&4?6?7'76�
�7-nxf
fn-7
D
P	�
�7-nf
fxn-7{
D
	P����2"&546�b]2p�p2�u�7PppP7����'/7?%2#!"&4632#!"&=4637"&7>2#&"264&"264"264��`�	&��&	~�~>			�			�			�((�	&&	�42BB24p			)						 ����@%+"&/&=46?2=4>3762=463212=46�4�/
	


'$�S4J	L� �� 2	�#%!5467546;272#!"&=463�@B5)	`	)5B		� 		�@@;aRp		pRa�	 		 	�����AKU#"&5467>264&"2767>7>7>7>76'.?6&/�		��
"!/
`
!!(	
 ' ' 	
 ' ' �|�3��3�!
��
/!"
`	i
' ' 
' ' �3��3� ����2#!"&46;&5462'!"&p��TxT�cc ((<TT<��������%)A7"=4;54;232++"=%!463!2!2#!"&=46;;267�80880 ��@���	&�&	�
=�088088���P���`	&&	�#32#!"&54635#"3754&+326754&#!"3!26�&&��&&`P		�	PP	�
��

@
�&�&&&��0			0	�@

@
���1%3#"&4632>77'#5'6326'&54?632Kk%Kj�L!!1$5�6YK$(
�'"G@)!.!#+2-,&B9N"+
$7���&.6.'7>#"&5476264&"6264&"264&"�Z�b9R�]
3X�K��
rC{�	_�Y]�P9qJ�Vi
L�{����	7!+"&7;;26=326/&"72#!"&=46;76;25��E9	 	9Z�		�`		x	r	S���p		p^�	 		 	

����	7!#!"&7;;26=326/&"72#!"&=46;76;2 ���[9	 	9Z�		�`		x	r	P���p		p^�	 		 	

���� <D%#!"&54676"&=46?62';;2=32=4+54+"#"26=?6K"��"K6_5jK	U

U	�(/B/�N6""6N_oK5n	  	n5�]!//!����-#"&5#+"&=46;546;23546;2+ܘ`�		p�`�		p \�	 	����	 	�����'/7?G"&462'"&='&54?63232+"2"&4264&"$2"&4264&"�((4);*Rp		G5

@6jKKjKf4&&4&��jKKjKf4&&4&`((�!2
�

o6
	`9 KjKKju&4&&4�KjKKju&4&&4����2#!"&5463#3'#335#35#�

��

`������������
��

�
@�����������/?O_o��������/?O72+"&=46;2+"&=46;2+"&=463!2+"&=4632+"&=46;2+"&=46;2+"&=46372+"&=46372+"&=4632+"&=46372+"&=4632+"&=4632+"&=46;2+"&=46;2+"&=4632+"&=4632+"&=46372+"&=46372+"&=46372+"&=46;2+"&=463�		 		�		 		�		 		�		 		�		 		�		 		�		 		 		 		 		 		�		 		 		 		@		 		�		 		�		 		�		 		��		 		 		 		 		 		 		 		 		 		�		 		�	 		 		 		 		 		 		 		 	�	 		 		 		 		 		 	`	 		 	�	 		 	�	 		 	�	 		 	��	 		 	�	 		 		 		 		 		 	�	 		 	�	 		 	`	 		 	�	 		 	`	 		 		 		 	����/?O_o�72+"&=463#2+"&=46;2+"&=46372+"&=4632+"&=4632+"&=4632+"&=46372#!+"&5463�		 		@		 		�		 		�		 		 		 		 		 		 		 		 		��	 	
 	 		 		 		 		 		 	�	 		 	`	 		 	`	 		 	 	 		 	`	 	��		�
�����$,2/&?#"&'&6&546766264&"a=Z{
%A'#*=Z{
Q<#D@Q<#*(E-{
Q<#*=Z{
������.6Lj7'&6767>"2+"&=46;7>;2264&"%2"&?#"&?6;26"&46325"&46325467ua5

5a�
�0H[,,�\
>L'&5%%p&5%%�c>>c`�
�

�,,V�Sk	3`�(0l(k���#%#"54>?6327632�
���	h0	<h21Vh	�
p12h<	����/2#!"&5463454/&#".'7654/&#"#327���P	FA&
A�x���`��
&AF	x�����(4@PX_2+##546354+";254+";2=4+";2=4+";22#!"&5463"2645''`

���
H				`												�

��

M`� @�
��
@@`
g			�			q			q			0
��

 
@�``� @ ����;?%2+"&=46;7#"'&54?6325463!2+"&=#'7#P		�		 C	5��s	�		 	v1C v 	 		 	P4*�Y,		`		 �4`������5OR72"/&6;46;27"&=4?#"&=46;232#+"/#+"&54?6;23'�PP0	 	�	=8		�	=8			G	;*4 ```0		�Ѐ	
F	 		
F	 	�	

	�e0������5OR"&?62++"&5"&=4?#"&=46;232#+"/#+"&54?6;23'PP0	 	�	=8		�	=8			G	;*4  ``��		0@	
F	 		
F	 	�	

	�e0�����/?U"&=46;2#"&=46;2#2#!"&=4635"&=46;2#!2"/&6;46;2�		@		@		�		�		�				�		�PP0	 	`	 		 	�	 		 	�	 		 	@	 		 	``0		�������/?U"&=46;2#"&=46;2#2#!"&=4635"&=46;2#%"&?62++"&5�		@		@		�		�		�				�		�`PP0	 	`	 		 	�	 		 	�	 		 	@	 		 	�``��		0������5JR72"/&6;46;22+"&=46;5#"&54?6;26&/&767.7>264&"�PP0	 			`			
0	6(>*,


	$+
!```0		��@	 		 	@	 		p}1'3>=&\������5JR++"&5#"&?622+"&=46;5#"&54?6;26&/&767.7>264&"kP0	 	0P)		`			
0	6(>*,


	$+
!�`��		0`��	 		 	@	 		p}1'3>=&\��A�'DG\%"&=46;2#'3264&#3264&#'+"/#+"&54?>;23'"/&4?62762		K 2	
2!3(

(8

�D	X	D	
	?.��p-
7�
�	�	*	# +�0`0��	$$	�

�E�
�p
-8� �@&2#!"&4623.546264&"264&"�<TT<��<TTxT
p
T��/B//B`B//B/@TxTTxTT<//<ToB//B/�/B//B����
5%"'63227632".'&5463232>7632�G�G';(;�4Bt�tB4	!47K'6d?7���	D5++5D	

������-%3!"'&7>32#"./&#"7>?632b!-9<&��Z:5)=1$+b6@�%�U!FV ,$	T+A!)����	=!+"&#546;2#5�^B@B^��^B@B^�`��B^^�� B^^B �����2"&4264&"2"&4264&"�V==V=^OΑ�Α�jKKjK(=V==VC�Α���KjKKj����"*:D$2"&42#!"&5#"&5463!2264&"754&+";2654&+"�			�		��8P8 &&`B^�l((p
�

�
�
@
�			g	 	(88(&&^B�p((�@

@
s�

�����#-6>FNV%2#!."#"&5463!2%54+"6754+"6254+"54+"354+" 2"&4264&"p		��>T>2			�@qlo���B//B/C�	 	)77)	 		�Ll�YY(�lD����/B//BAV6�� �H&�
,v�3m��	4	2Q	
�	@�	2	Lb	,�	
X	.�	&�	
'	29	&�	
�Copyright (c) Font AwesomeCopyright (c) Font AwesomeFont Awesome 5 Free SolidFont Awesome 5 Free SolidSolidSolidFont Awesome 5 Free Solid-5.12.0Font Awesome 5 Free Solid-5.12.0Font Awesome 5 Free SolidFont Awesome 5 Free Solid330.752 (Font Awesome version: 5.12.0)330.752 (Font Awesome version: 5.12.0)FontAwesome5Free-SolidFontAwesome5Free-SolidThe web's most popular icon set and toolkit.The web's most popular icon set and toolkit.https://fontawesome.comhttps://fontawesome.comFont Awesome 5 FreeFont Awesome 5 FreeSolidSolidFont Awesome 5 Free SolidFont Awesome 5 Free SolidFont Awesome 5 FreeFont Awesome 5 FreeSolidSolid���	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU�
VWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������������������������������������������������������������������������"���������������������������������������������	

 !"#$%&'()�*+,-./0123456�#789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs��tuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCD�EFGHIJKLMN�OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@�ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������
glass-martinimusicsearchheartstaruserfilmth-largethth-listchecktimessearch-plussearch-minus	power-offsignalcoghomeclockroaddownloadinboxredosynclist-altlockflag
headphones
volume-offvolume-down	volume-upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext-height
text-width
align-leftalign-centeralign-right
align-justifylistoutdentindentvideoimage
map-markeradjusttintedit
step-backward
fast-backwardbackwardplaypausestopforwardfast-forwardstep-forwardejectchevron-left
chevron-rightplus-circleminus-circletimes-circlecheck-circlequestion-circleinfo-circle
crosshairsban
arrow-leftarrow-rightarrow-up
arrow-downshareexpandcompressexclamation-circlegiftleaffireeye	eye-slashexclamation-triangleplanecalendar-altrandomcommentmagnet
chevron-upchevron-downretweet
shopping-cartfolderfolder-open	chart-barcamera-retrokeycogscomments	star-half	thumbtacktrophyuploadlemonphonephone-squareunlockcredit-cardrsshddbullhorncertificatehand-point-righthand-point-left
hand-point-uphand-point-downarrow-circle-leftarrow-circle-rightarrow-circle-uparrow-circle-downglobewrenchtasksfilter	briefcase
arrows-altuserslinkcloudflaskcutcopy	paperclipsavesquarebarslist-ullist-ol
strikethrough	underlinetablemagictruck
money-bill
caret-downcaret-up
caret-leftcaret-rightcolumnssort	sort-downsort-upenvelopeundogavelboltsitemapumbrellapaste	lightbulbuser-mdstethoscopesuitcasebellcoffeehospital	ambulancemedkitfighter-jetbeerh-squareplus-squareangle-double-leftangle-double-rightangle-double-upangle-double-down
angle-leftangle-rightangle-up
angle-downdesktoplaptoptabletmobile
quote-leftquote-rightspinnercirclesmilefrownmehgamepadkeyboardflag-checkeredterminalcode	reply-alllocation-arrowcropcode-branchunlinkinfoexclamationsuperscript	subscripteraserpuzzle-piece
microphonemicrophone-slashcalendarfire-extinguisherrocketchevron-circle-leftchevron-circle-rightchevron-circle-upchevron-circle-downanchor
unlock-altbullseye
ellipsis-h
ellipsis-v
rss-squareplay-circleminus-squarecheck-square
pen-squareshare-squarecompasscaret-square-downcaret-square-upcaret-square-right	euro-sign
pound-signdollar-sign
rupee-signyen-sign
ruble-signwon-signfilefile-altsort-alpha-down
sort-alpha-upsort-amount-downsort-amount-upsort-numeric-downsort-numeric-up	thumbs-upthumbs-downfemalemalesunmoonarchivebugcaret-square-left
dot-circle
wheelchair	lira-sign
space-shuttleenvelope-square
universitygraduation-caplanguagefaxbuildingchildpawcubecubesrecyclecartaxitreedatabasefile-pdf	file-word
file-excelfile-powerpoint
file-imagefile-archive
file-audio
file-video	file-code	life-ringcircle-notchpaper-planehistoryheading	sliders-h	share-altshare-alt-squarebombfutboltty
binocularsplug	newspaperwifi
calculator
bell-slashtrasheye-dropperpaint-brush
birthday-cake
chart-area	chart-pie
chart-line
toggle-off	toggle-onbicyclebusclosed-captioningshekel-sign	cart-pluscart-arrow-downshipuser-secret
motorcyclestreet-view	heartbeatvenusmarsmercurytransgendertransgender-altvenus-doublemars-double
venus-marsmars-stroke
mars-stroke-v
mars-stroke-hneuter
genderlessserver	user-plus
user-timesbedtrainsubwaybattery-fullbattery-three-quartersbattery-halfbattery-quarter
battery-empty
mouse-pointeri-cursorobject-groupobject-ungroupsticky-noteclone
balance-scalehourglass-starthourglass-half
hourglass-end	hourglass	hand-rock
hand-paper
hand-scissorshand-lizard
hand-spockhand-pointer
hand-peacetv
calendar-pluscalendar-minuscalendar-timescalendar-checkindustrymap-pin	map-signsmapcomment-altpause-circlestop-circleshopping-bagshopping-baskethashtaguniversal-accessblindaudio-descriptionphone-volumebrailleassistive-listening-systems#american-sign-language-interpretingdeaf
sign-language
low-vision	handshake
envelope-openaddress-bookaddress-carduser-circleid-badgeid-cardthermometer-fullthermometer-three-quartersthermometer-halfthermometer-quarterthermometer-emptyshowerbathpodcastwindow-maximizewindow-minimizewindow-restore	microchip	snowflake
utensil-spoonutensilsundo-alt	trash-altsync-alt	stopwatchsign-out-altsign-in-altredo-altpooimages
pencil-altpenpen-altlong-arrow-alt-downlong-arrow-alt-leftlong-arrow-alt-rightlong-arrow-alt-upexpand-arrows-alt	clipboardarrows-alt-harrows-alt-varrow-alt-circle-downarrow-alt-circle-leftarrow-alt-circle-rightarrow-alt-circle-upexternal-link-altexternal-link-square-altexchange-altcloud-download-altcloud-upload-altgemlevel-down-altlevel-up-alt	lock-openmap-marker-altmicrophone-alt
mobile-altmoney-bill-altphone-slashportraitreply
shield-alt
tablet-alttachometer-alt
ticket-altuser-altwindow-closecompress-alt
expand-alt
baseball-ballbasketball-ballbowling-ballchesschess-bishopchess-board
chess-kingchess-knight
chess-pawnchess-queen
chess-rookdumbbell
football-ball	golf-ballhockey-puck	quidditchsquare-fulltable-tennisvolleyball-ball	allergiesband-aidboxboxesbriefcase-medicalburncapsulesclipboard-checkclipboard-list	diagnosesdnadolly
dolly-flatbedfile-medicalfile-medical-alt	first-aidhospital-althospital-symbolid-card-alt
notes-medicalpalletpillsprescription-bottleprescription-bottle-alt
procedures
shipping-fastsmokingsyringetabletsthermometervialvials	warehouseweightx-raybox-opencomment-dots
comment-slashcouchdonatedovehand-holdinghand-holding-hearthand-holding-usdhands
hands-helping
parachute-boxpeople-carry
piggy-bankribbonrouteseedlingsign
smile-winktape
truck-loadingtruck-movingvideo-slash
wine-glassuser-alt-slashuser-astronaut
user-check
user-clockuser-cog	user-edituser-friends
user-graduate	user-lock
user-minus
user-ninjauser-shield
user-slashuser-taguser-tie	users-cogbalance-scale-leftbalance-scale-rightblender	book-openbroadcast-towerbroom
chalkboardchalkboard-teacherchurchcoinscompact-disccrowcrowndice	dice-five	dice-fourdice-onedice-six
dice-threedice-twodoor-closed	door-openequalsfeatherfroggas-pumpglassesgreater-thangreater-than-equal
helicopter	kiwi-bird	less-thanless-than-equalmemorymicrophone-alt-slashmoney-bill-wavemoney-bill-wave-altmoney-checkmoney-check-alt	not-equalpaletteparking
percentageproject-diagramreceiptrobotrulerruler-combinedruler-horizontalruler-verticalschoolscrewdrivershoe-printsskullsmoking-banstore	store-altstreamstroopwafeltoolboxtshirtwalkingwalletangryarchwayatlasaward	backspacebezier-curvebongbrushbus-altcannabischeck-doublecocktailconcierge-bellcookiecookie-bitecrop-altdigital-tachographdizzydrafting-compassdrum
drum-steelpanfeather-alt
file-contract
file-downloadfile-exportfile-importfile-invoicefile-invoice-dollarfile-prescriptionfile-signaturefile-uploadfill	fill-dripfingerprintfishflushed
frown-openglass-martini-altglobe-africaglobe-americas
globe-asiagrimacegringrin-alt	grin-beamgrin-beam-sweatgrin-heartsgrin-squintgrin-squint-tears
grin-stars
grin-tearsgrin-tonguegrin-tongue-squintgrin-tongue-wink	grin-winkgrip-horizontal
grip-verticalheadphones-altheadsethighlighterhot-tubhoteljointkiss	kiss-beamkiss-wink-heartlaugh
laugh-beamlaugh-squint
laugh-winkluggage-cart
map-markedmap-marked-altmarkermedal	meh-blankmeh-rolling-eyesmonument
mortar-pestlepaint-rollerpassport	pen-fancypen-nibpencil-ruler
plane-arrivalplane-departureprescriptionsad-crysad-tearshuttle-van	signature
smile-beamsolar-panelspasplotch	spray-canstamp
star-half-altsuitcase-rollingsurprise
swatchbookswimmer
swimming-pool
tint-slashtiredtoothumbrella-beach
vector-squareweight-hangingwine-glass-alt
air-freshener	apple-altatombonebook-readerbraincar-altcar-battery	car-crashcar-sidecharging-station
directionsdraw-polygonlaptop-codelayer-group
microscopeoil-canpoopshapesstar-of-lifeteeth
teeth-open
theater-masks
traffic-light
truck-monstertruck-pickupadankhbible
business-timecitycomment-dollarcomments-dollarcrossdharmachakraenvelope-open-textfolder-minusfolder-plus
funnel-dollargopuramhamsabahaijedijournal-whillskaabakhandalandmark	mail-bulkmenorahmosqueompastafarianismpeaceplace-of-worshippollpoll-hpray
praying-handsquran
search-dollarsearch-locationsockssquare-root-altstar-and-crescent
star-of-david	synagoguetorah
torii-gateviharavolume-muteyin-yang
blender-phone	book-dead
campgroundcatchair
cloud-moon	cloud-sundice-d20dice-d6dogdragondrumstick-bitedungeonfile-csvfist-raisedghosthammerhanukiah
hat-wizardhikinghippohorsehouse-damagehryvniamaskmountain
network-wiredotterrunningscrollskull-crossbonesspidertoilet-papertractoruser-injuredvr-cardboardwindwine-bottlecloud-meatballcloud-moon-rain
cloud-raincloud-showers-heavycloud-sun-raindemocratflag-usameteorperson-booth	poo-stormrainbow
republicansmogtemperature-hightemperature-lowvote-yeawaterbaby
baby-carriage	biohazardblogcalendar-day
calendar-week
candy-canecarrot
cash-registercompress-arrows-altdumpster
dumpster-fireethernetgiftsglass-cheers
glass-whiskeyglobe-europe
grip-linesgrip-lines-verticalguitarheart-brokenholly-berry
horse-headiciclesigloomittenmug-hot	radiation
radiation-altrestroom	satellitesatellite-dishsd-cardsim-cardskatingskiing
skiing-nordicsleighsmssnowboardingsnowmansnowplowtengetoilettoolstramfire-altbaconbook-medicalbread-slicecheeseclinic-medicalcomment-medicalcrutchegg	hamburgerhand-middle-fingerhard-hathotdog	ice-creamlaptop-medicalpager
pepper-hotpizza-slice
trash-restoretrash-restore-alt
user-nursewave-squarebiking
border-allborder-noneborder-stylefanicons	phone-altphone-square-altphoto-video
remove-formatsort-alpha-down-altsort-alpha-up-altsort-amount-down-altsort-amount-up-altsort-numeric-down-altsort-numeric-up-altspell-check	voicemail
hat-cowboyhat-cowboy-sidemouserecord-vinylcaravantrailer����k%�����assets/webfonts/fa-regular-400.ttf000064400000102454150755142440012757 0ustar00
�PFFTM����GDEF*���OS/2A�SX`cmapǠ���gasp����glyfDڭ�	 n�head��6hhea5�$hmtx�t�Tloca��F�6maxp��8 name2�4(w�[post�iA�}<�J��l�Ϊ_<�������������������@��LfGLf��PfEd�������.�T:� ���@��@@����@@��@��@@�����`������@���@���������������������@���@�����@����������@��@��@����@�@���������������������������������*����"�$�.�>�D�Y�n�p�s�u�|�����������������������3�D�F�J�N�R�\�e����������������
�I�M�[�]�t�z����������������(�[�������V�g�z������������������"�$�.�>�D�W�n�p�s�u�{�����������������������3�D�F�J�M�P�[�d���������������
�G�M�T�]�q�y���������������(�X�������V�g�y�������������������������������|zwZYB81-(�����������}zpf`USC
�
�
�
�
�
�
�
�
�
�
�
�
�
�
m
H
��g��$
�
�
�
�
�
�
�@|��n��*��b���H�*N�b�b�	^	�

:
�
�:�6��

�N��D��>n�8�(f��L�D�L�l�.l�D��f���Z�h�D��f�  f �!!H!�!�"d"�#L#�$$h$�$�%%N&@&�''N'�'�'�(&(j(�)")�)�*L*�+4+|+�,H,�--�..d//�0*0�11�2
2n2�3�3�484�4�55�66X6�77`�����$"/.676>64'&'.7�$�,�$+u**u$O##O$��UN��OT$	**	�W"##"W���1�"/&?'&6?627/7j �� j�A	(	Ad�>>�d||&g�	DD
�g&���b~~b�BB����"*2%2#!"&=46322654&#"#"&#"6"&462&"264:7O��O7
344b3#99#3�xTTxThP88P8�O77O�#33#�TxTTx�8P88P����2"&4264&"'&=4;2�Α�Α��uu�uU C	��Α���u�uu�
>��0

���'3?GOW2#!"&5463254#!"3%+"=4;25+"=4;25+"=4;2"&462"&462"&462��`��lj����������`�pT��\TT	uu���(8276#"&#"+"&5&5466325#"&#"63232P,A+=C%gA?		')%g�E;f9-4Lf9p
�( S		� ��   � ����
2'4634#!"7P�� �����0pp��Tv��T�#.2#!"&5463254#!"362"&457676��`��l9""((xX��� �����""�0((xXP��A�*/7%76#!"&5463!2+!547&?62'7'&76� 
�� �`���Z
0+t:�A�+:g �`
 ��r��
Z+10:�A
+:����+2"&4264&"%//&?'&?676�Α�Α��uu�u.>>	>>	>>	>>	��Α���u�uu��>>	>>	>>	>>����2"&4$"264/&?676�Α�ΑK�uu�u<		�	[			;�	��Α��au�uu�
	�		[	=�	����8@2"&4264&"%+"&=4>7>54&#"/&7632"&462�Α�Α��uu�u3.
				%@&?A""��Α���u�uu�� 		
64�""@�#/2"&54732654'6#".'&47>2267." /AA]A
!-*�[<oV*����J%%�%J[0A]AA.!
aPa-O5Paa�MCCMMC,A#������3F#"'&54?632632#"&'7"'632'67.27#"&'&4767z
��
-AY-Ap/54<oV&%J/54[�*&%��?-r?-�$-O5)"!CM��$aP)"!CM����#/;Ggo7#"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;27#!"&546;54;2354;232!3!2�((`((`((`((`((�((`��0(�(00��T�(((((�(((((��`4444��*�������&2#"'#"&7>7&54264&"6?�Ԗ�j/.AJ
5Vzz�z(
&�z�z.%8FV�^�^^B3*

�2#!"&546;25#"/#��`�
	7��
	7�@� 	7���	7��H�"&%2#!"&546;32%763!54+'#"7!P�p�@��P?�@��P��M�1� @0j�h*@���/DT%"&=46;2+"&=46;2#3"&=46;2#2#!"&546;27"&=46;2#��J�		�0
		=`������0		
P		��0FF����E�#6M%#"'#"&'&'#"&767&54632%3264&"67654&'32?&/
A<@g;B
,zV@hKe�KA__�_x@1/R21R>
'6,'#+7B^6,	Y<71B\BB.# /#$;(E,2 �� �%&?'&6?63 � j�A	>�d?7D	�g&�D~b������#AQ&.7>&>6766&&7>2>7>&6&.7>76�*

'>D88(%6*

'>D88(%5
,36<FD 
,*(32;" �
	)`

t7�*6%(88D>&
*6%(88D>&
i+
 DF<63+
	!"F<63
`)	

7t��@� ,82#!"&5463"!54#2=!37+"=4;2+"=4;2

� �� �HH����

��`0**����d((((@�%-%#!"&=4?>3!2!'5!$"&462"&4627	� 	i

��N�Ni� �M����		pp��M���2U]2++"&++"&=46;2327167>322654&+4654#";2'>'>'4&"2�"1
$5."S
	
@

@
			*2V�,
 **=
	
�61"

"(3(�$/$v,#$�= 
&
����2V^546;&546321;6;2+"'#"+"&'&7&'#"&7;;2675&'&'.#"#""2641"V2*			
@	
@
	
S".5$"10[
	
=L 
,�
	��"1$/$�(3("
1"
&
 =&�$#,

�����3U]46326+"&=4754'1&'.5463274&#""&#"3>=4.."264j1"'
"(3(
�
/$v,#$�&= 
&
�m"1'$5."S
	
@		
@
			

*2V�,
 L=
	
�����1S["&=#"&54>76716=&=46;2''26=6767=4&'#3263264&"�"1$/
�(3("
1"
&
 =&�$#,�@1"V2*


			
@

@
	
S".5$"10[
	
=L 
,������*9B++"&546;546;22=#"&=#"3%2=#"&=#"354/&+�P�P�t`JTX
j�0
~��0@0�>*���`�
X��
0@����+3;#!"&5463!2#3254/+"&=#"362"&4264&"���N��zN
�
*�H44H4G"">��`"P��Nd

h���4H44HL""����2#!"&5463254#!"3���Z�����`�pT��� 22#!"&5463!32>567!5".'&'��`��`#dd#�`�#FF#��� 0)N		N��7

7��`�B2#""&54653+"/&2#4767654&#"#.'&546�		&		8(�	N	PIg,0+ K54L +0,ep		&		(8��++%%�gIB25=1$05KJ60$1=%
2BGi������%39%#!".54767>54675462!&5414&"0"&53�	��		H8%:!��8,B\B�4&�V

	
C,:V

,B&,C;d.BB.d�%����#/Ka}754;2+"3"=4;2#+"=4;2"=4;2#!54;46;546;23232%354;23#+"&=#7#54+"#";;2=32=4�((�(t((L(��@
X
p
X
��p(p@
p
@��((((T(4((|$${	(

(	��CC_

0����+7%++"=#"=4;54;2327#!"&5463!24#!"3!2`X XX X`��`0��T� XX XX���`��T������2"&4264&"�Α�Α��uu�u��Α���u�uu�����/2"&4264&"6"&462"&462>"'&>2�Α�Α��uu�u��/�/!f��Α���u�uu�c\
99
'����02"&4264&"6"&46262"&42&'&".7�Α�Α��uu�u�so~)R��Α���u�uu�c-m1
����+2"&4264&"6"&46262"&42+"&463�Α�Α��uu�u�s(

�

��Α���u�uu�c-}@�'3?KWco{����2#!"&54634#!"3!2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2� �� ���```�����````b����� �� ���n������'2#!"&546;54;2354;225!3���0(�(*�����`4444�p*������%.=46"&462264&"t�	4�Α���u�uu��e
	�Α�Α��uu�u����'7"=4;2#7#!"&5463!24#!"3!2l�l��`0��T�  ��`��T������#2#!"&5463!%/&?676���`��<�	[			;�		���`�p`���		[	=�			��A�2Y&='.54767675467'".>7676#!"&546;2+"3!2=42�;1+6(-$50I;"��!0<*&>))
���VT"(� 6  )K-;(!9 ����h)A'%
�+`	
��	����
%6&?6764&"2"&4264&"\B�B9ZΑ�Α��uu�u>�B�\�Α���u�uu�����
&732/&6%#!"&5463!24#!"3!2}�ccK��`0��T�cc���`��T������
&%#"&?67#!"&5463!24#!"3!2C�ccu��`0��T�cc�`��T������
&7546&#!"&5463!24#!"3!2�cc��`0��T]�cc��`��T������#!"&546;2'!#"&=#r���.L� h
�^���rLL�� 
h����),5%+"=4;22+"=43%#!"&546;2'3#"&=# ������T�Lh
��T����T<L�� 
h�`����.T\%#*#".#+"&=46;>7>3232>'2654&+4654.#+2;2'>4&"2�3&-E/@

c
-3	$(Kh	
m&%@

���!$*

�
 #	:/45'N)
9

G%�&B"U����.6[%+#".'.'#+"&=46;232>3:32264&"2>54&#6&'6&'6+"#322>54&5�2$$	3-0

@

@	.G-88�]b



@%&m"(�"454/:?	
�
3,$h	
)"B&�#6G

9���(8@H%/"/&?'&4?'&6762767'7''77&2"&4264&"�<G(
+(G<<G(,(G5MM[44[MM[44[�V==V=Q.!!.!�+)G<<F)+)G<<G54[MM[44\MM�=V==Vc!.!!.����&"&463276"3267&5467&j��j	%a>!"$h;VzzV0UT�2*@�Ԗ#(
>$?P9-2�z�z)$mU2T����
&/&?67#!"&5463!24#!"3!2cc���`0��T#�ccE��`��T������"264$2"&42"&4S�uu�u��Α�Α�B//B/�u�uu���Α��/B//B����#/;GYe54;2+"3"=4;2#"=4;2#3"=4;2#+"=4;2"=4;2#!54;463!232%354;23%�((�(�(X(t((L(��@
P
��p(p��,((((`((((T(4((|$$�

�HCC�����7=DJQ#!"&546;2'!#"&=##"''&76767&766>77"6467&'6&7r���.L� h
��

6'.
$
3�N-

x^���rLL�� 
h��D
.0*[�"�
#����R#!"&546;2'!#"&=#32+"'&/+"'.'&6;2476;21676r���.L� h
��


	


	
^���rLL�� 
h�&b		+	H		78	
`b		aa
����B#!"&546;2'!#"&=#2+"'&'+"&?'&6;26763r���.L� h
��#...		^���rLL�� 
h�=N7NN($����6>#!"&546;2'!#"&=#54;2*#+"73264&+r���.L� h
�HE#	
0

^���rLL�� 
h���%
/c����(0#!"&546;2'!#"&=#57676&2"&4r���.L� h
� ((X�((^���rLL�� 
h��@((X��((
����!$1@LP3#7#53#3#57#!"&546;23#"&=##5#7#"&?53322654."7#5�  @    @ ����Lh
0 P�
 
-		@   �      ���&L�� 
h�`�W'a  �

�  ����/=#!"&546;2'!#"&=#/#"&=46;7664'&>.r���.L� h
��$$)
	^���rLL�� 
h��$8$Y

:����7#!"&546;2'!#"&=#6/+"&=46;2r���.L� h
��5hh^���rLL�� 
h�p4%h%����$'0<M7#"/&?67#!"&546;23#"&=#7/&?6&?6/5&?�99!����Lh
��	7		7!99!c66����&L�� 
h�`�	�		�O66����$+"&46227''64&"264''&"67&7gΑ�Α��/p/522�/B//B�5/p/522�58�Α��D5UB//B//p/522�5/p/522�����!6#"/&='.77'76�2<
	p+) r�%%�;�`l���!�|.;T0<�2$��-�	����� '.5#"&'&676326767'7&'7'757/?'#� ^a&'O� ^a&'4_H:'G,4%=/@G�<&
G@]+G'%e:@,O+
b� ^Mb� *N�
*/%L=�4J/}45/J��>J%?4I0==	@�+/;GS_2#!"&546;>32=#!7"=4;2#'3554;2+"754;2+"=4;2+"54;2+"(

�!
+@�`=�lPx���hhhhhh�
��
!
���� ��x``P((��<������8@'&?63!"&54767>57"'675462'&5414&"&53z


��


��>��				.	|"&&%:!;B.&�


�


��0

	
*#D�

,B&7&/.B�`%����42"&4264&"#"&54>32'&#"3276�Α�Α��uu�u3)?=O$@(;&!$*$$
��Α���u�uu�)Q<'@%#	%"2�3K2#!"&5463254#!"37&546'&76&546'&76��`��l�R@AR@=�R@AR@>��� ����V6/.4"%6/.4"%	���+/37;Ocgo#32+"=!+"=4;#"=4;2!54;2'35!355#!5#'#"=!+32!543'2+"=#"=4;2'355#+�H��HH@H@ �@  � ��@�T���`8L@�HHHH@    ��    @���4�4pp�pL
��@�CGKOSgk���%#32+"=#+"=4;5#+"=4;5#"=4;2354;2+354;2'35355#5#354;5#"=#+325#%5#"=#32+"=#3235435#5#4H�HXHH�HXH�   ��   @��� 8XHX�4   �HHH�HHH�  �       ����  @�XH@    ����%#!"&5463!27#!3546;�T��`�LLP���
hdT`��L��h
���(42+#!"&546;54632=#"&=#"3%254#!"3�0��0��*������0@0�0*���`4������%+132#!"=4;467.5#"=43!2#!2654&"p2//2��2//2h��KjKKjK�?ss??ss?LllL�`LllL���)p6+"&5<&4&/&=46>62654&+"&=4&+"&=4&+"&=4&#"/&=4&354?6�$C	+
�
b'8#I$@:H							a�+q,(rd	!

U"49#,)(
�r

		

		(
)		

t	)

9U
d������Y6+"/&676546>654&+"&=4&+"&=4&+"&=4&/.376u.�
w!3 P4			

	
s�O)��
�7~!($%)!ф


L		�
�		�
�		�
�	&	�w��� ]"&7.7#"&463'.>6#'32?6=4/&#"/&+";2+";2#""(
X++^O8�+1b"wFFw	b
�
�
	��		

		

 6 
#+<+	88857'�%0�7@	;

			��@�A%#5'&+"&546;7#"&=463!254/&#!";2+";2-�d�!4$r�!/!&'v�
��
�	r�

c�$|H&!$40/!!!��L�
@	'���3g+"./.5476'&5467&546767>3266&&?6&"/././&;267�:	I*k	\((!&+ /+ $
	4
[
+k.L	�(:	V	R
+*
6	Rh
��

��iz"$0V$������^p��6+"/&676546266&;2?6=4&+"&=4&+".=4&+"&=4&'546;2+"&7546;2+"&754;2+"f!9%�"m!'7'!-��m	�			DL		K
(#Tw�7�''J
w

�wT

	

	#

#	�

�	R`		`	`		`		``������#^6+"/&7'&676'462654&+"&=4&+"&=4&+"/.;2?6j(%�'758%	+<+#0			

;@7�#Fw"b1+�8O^++X�F

		

		��	
��
b	w����,52"&4264&"+"/#+"&=46;2'254.+�Α�Α��uu�u6+0 'Of(: ��Α���u�uu�#ZT�U3)!

@����;C%++"=#"=4;54;2327#!"&546;54;2354;232!3!2PLLLLp��0(�(00��T�LLLL���`4444��*������+37"=4;2#7#!"&546;54;2354;232!3!2|�|��0(�(00��Tx��`4444��*������;C%//&?'&?6767#!"&546;54;2354;232!3!28	66	66	66	66���0(�(00��TI66	66	66	66���`4444��*������'72#!"&546;54;2354;225!3%/&?676���0(�(*���	K			,o		���`4444�p*��Ɏ	K	-n			��@�!%*/2#"/#"&54>?6327673#0

�



��

�



����������	��
5=?	Z
5=?:��.��/,�!/�����*2+#"=#"&54634&#!";?326�&&�}`&&�	��		�C
�	�&��&^T& &�� 		��	<2
	����/2"&4264&"%+"&=46;2+"&=46;2�Α�Α��uu�u(	0		0	p	0		0	��Α���u�uu���		�		�		�		����"&462264&"+"&=46;2��Α���u�uu��	�		�	'Α�Α��uu�ux�		�		����#+Lfn3#"&5#'#"'&/#+376;2264&"6/&'&6?#"##36???5#'&+"6?6264&"y@
:#;U			@v0��Q			�l	-	'9>*a!
%		�-=TA7
gn			@�

 	L		0��

		
W	;#>�X

 
$I�><3
S0

		
���5`#!"&54767>254'&'"."#3!2'#".'&'&?6232>7676��`(_dQ4/V� 
7
7
	7

7	��!K
	O���B)
	%F��
-

-
	,


,	����'+3H#32+32+#!"&5463!232!6"&462"&=463232632#���@P���4&&4&�	
''
	 @(@(0�0(����`�&4&&4�""��@�0<HT2#!"&5463!6"&462"&=463232632#7"=4;2#'"=4;2#'"=4;2#� � �4&&4&�	
''
	>ppppp���`�p`���&4&&4�""@@@����"42"&4264&"&2"&427&'#"'%654&"6322632�P88P8L((7Α�Α��8.-%%u�u%)@%$%@X8P88PX((ԑΑ���0&

'$4@SuuS@44

����'<2#!"&5463!"&46;2#"&462"&=463232632#P�� ��`		`		4&&4&�	
''
	��`��0��``				�&4&&4�""��@�$0<HP2#!"&5463!3&54632326327"=4;2#'"=4;2#'"=4;2#"&462� � !''9ppppp�4&&4&���`�p ��""P@@`&4&&4���2#!"&54635!3!2��`��`����`�v���� !"&463!2�@

�
 ���&2+#!"&546;54635!%!32�0��0��������0@0�0��`@0��������%/&//+"&=/&4?5/.?&/&?'.?>7'&/&6?'&?6'&6?65'&?6546;276?>76/76�'	H;		:H	'
'"PHHP"''	H:		:H	(
'"PHHP"]"Q*T;.		.<T*Q#	**	"Q*T;.		.<T*Q#	**	����08<H%"=4;2#2+#!"&5#"&=46;7>;2'3'&+"!7"=4;2#�		��		R"d"��^��L ��P		��P		9	9�`P��0����@�$4<G%#!"&546;#"3!2=!"3!2=452#!"&5463"&4627676!���
tZ��t��x""1((hH�� 0�
P��0�_""�((hHP����12#!"&546;462&"2644++"=#"3!2P��P&4&6x*�*���`&&�lT$$������"2"&4264&"74;232/&6;�Α�Α��uu�u�(CddC��Α���u�uu��tdd����"6462"$4&"27+/&?632�Α��/u�uu�-tddtYΑ�Α��uu�u�(CddC����""&462264&"54;546&=#"��Α���u�uu�-tddt'Α�Α��uu�u�(CddC����""&462"264#"=#"&?6+gΑ�Α��uu�u�(CddC8�Α��/u�uu��tddt����C�!$2"'&?63#3%3'#37'377#�d����dM94D��4�4�?D4dxD3aax4����U�0``````�������%5E2"&454+54+"327#";22#!"&54635"&5!#2!46P88P8�@�

��

0%�`%%�%0B\BB\fX
7
��

@
��%%�%%���72#!"&54634#!"3!2'//&?'&?676��`��l�l==			==			==			==		���`�vT���==			==			==			==		�����+>62"&462"&462"&4&2#"'#"&7>7&54264&"6?����Ԗ�j/.AJ
5Vzz�z(
&��z�z.%8FV�^�^^B3*

����'92"&4264&"$"'&>276&"&46272/&"&7>�Α�Α��uu�u6/�/!f!��%
&	��Α���u�uu�$
99
''A)				
���� 3H2"&4264&"62&'&".?"&547'.>6"&5"'&>?6�Α�Α��uu�u�j">'	

P	
�
	P
��Α���u�uu�)
q

	

@	

	����+GO2"&4264&"6"/"&4?'&4627626"/"&4?'&462762"&4�Α�Α��uu�u���4&&4&��Α���u�uu�kL�&4&&4	����'/7?K2"&4264&"$2"&4264&"62"&4&"&462264&"62"&42+"&463�Α�Α��uu�uB//B/<((&X/B//B5((&�

�

��Α���u�uu��/B//BQ((,B//B/�((,�����-2"&4264&"6"&46:"&42'&"&76�Α�Α��uu�u��N<=
	141	
��Α���u�uu��]"		
����/6=AEIMT[2"&4264&"6"&462"&4622+"&=4635#375#"5#75#5#75#5#326=4&+�Α�Α��uu�u���(		h000p000h(		��Α���u�uu�c#  `	(	((((		����'/2"&4264&"%6#".'&62&"&462"&462�Α�Α��uu�u2M)6()�����Α���u�uu�"
".&

N����
#+97"'&'6762"'&'6762&2"&4264&"%6"&'&62�q�Α�Α��uu�u2MRM)��		""		""		""		""ڑΑ���u�uu�"
".."

����4E2"&4264&"%6#".'&62'&7>32/&"7&7>2/&"�Α�Α��uu�u2M)6()��#
	
&
	�#&#
	
&
	��Α���u�uu�"
".&

V)))����
+EZ"&5476".'&62766/&"'&7>27"&4632&#"2654'2$"'&7>32/�,..�6')�)M`
	
&
	#&#d�Α�gC:2:Suu�u��&
	#
	 "EE��%


".�)),%(g��Α" u�uuS!)����
4<D%6"&'&62/.7>7>7/&67676&2"&4264&"bMRM)�pF�F	
�Α�Α��uu�u�
".."

>
FDF	
��Α���u�uu�����,:2"&4264&"%6#".'&62.?'&63'&4?6�Α�Α��uu�u2M)6()��
!!PP�PP	!!
��Α���u�uu�"
".&

/((0000((�����/;JYh76"&4767&67632&#"%67#"'67327>'&76762+&/.?"'&?6367>'&676u/")7Hg<5/6S:.{$9Ig30)-S:1C/"��
	
4

Z4	

4

&.:T&@R"/6D�6I;-�E�9I;0�TR"/s
Z	
4Z	
4p/%T:����6P2"&4264&"%6"&'&62'7'&6?62/&%/&?'&6?62�Α�Α��uu�u2MRM)��#
##
��Α���u�uu�"
".."

G#		#N	##	������%5CTi76"&476"'&'&6"&'6726%&>2&.""&'&62766/&"'&7>2&"'&7>32/u/"M"/Rl#l~l#_r_��'Em~mE&p�p�RM)�)
	
&
	#&#�&
	#
	�R"//"RP 2;;2 1;;�>f;;f?	H``�."


"|))")����;CK2"&45'&"/.32>>54&"&=&'&6276&2"&462"&4�Α�Α8%1;u�u;1)�)����Α��,		+'_9SuuS9_,


,�����;HU2"&45'&"/.32>>54&"&=&'&6276/&4?&?'&6�Α�Α8%1;u�u;1)�)!!
	PP�P	
!!��Α��,		+'_9SuuS9_,


,((0000((����!)1Ge2/&"&7>2"&4264&"62"&4&2"&45'&"/.32>>54&"&=&'&6276�

&
%�B//B/<((&�Α�Α8%1;u�u;1)�)
					4/B//BQ((,��Α��,		+'_9SuuS9_,


,����%-52/&"&76"&4626"&'&622"&4264&"4(%
&
Z�MRM)��Α�Α��uu�u						$T
".."

6�Α���u�uu�����)19A2"&4#"'&?64/&4?64/&762"&4264&"$2"&4��##)�Α�Α��uu�uq				%�Α���u�uu������#EU2/&"&7>&2"&4264&"%#"'&?64/&4?64/&7662/&"&76�#
&
	
Α�Α��uu�u##)&#
&
	
()��Α���u�uu�				�)����!4<Ol%#"'&?64/&4?64/&7637&"&7>32'&462"/&>7676#"&4632&#&'654&"320##)F&

%�ZS
�/4g��gg�
u�uuS-�					L

		�!	S	1(�Α�g.,
 Suu�u����-2"&464&"6"&462"&4622+"&'&63�Α�ΑKuu�uu���E..E��Α���u�uu�u�S	-<<-	����/=2"&464&"2/&"&76&7>2/&"2+"&'&63�Α�ΑKuu�uu�&#
&
	
�
#&#	
&
�E..E��Α���u�uu�u0)#))M	-<<-	����)72"&464&"/&4?6&?'&62+"&'&63�Α�ΑKuu�uu�!PP�	
!!P�E..E��Α���u�uu�u(00b((0R	-<<-	����!)72"&464&"2/&"&7>"&4622+"&'&63�Α�ΑKuu�uu�
&	l�E..E��Α���u�uu�u$
				2S	-<<-	����2"&4264&"62"&462"&4�Α�Α��uu�uk���Α���u�uu������)1CO2"&4264&"$2"&42654'"&547&"&4622654'"&5472+"&463�Α�Α��uu�u<**<*7"@*<**<F"�

�

��Α���u�uu��*<**<F

/<**<*H

�����!3CK2"&4654&"5462275462&/&"&7>3262/&"&762"&4�Α�Α�8u�u8-f-�	&

%p(%
&
>.!!.!��Α���:PSuuSP:r

��

2						
*				D&4&&4����&.92"&4264&"72&'&#"&46&"&46262"&46"&54�Α�Α��uu�u�<&&
As�$"��Α���u�uu�#.@-P1����4E2"&4264&"%>"'&>2''&7>32/&"62/&"'&76�Α�Α��uu�u/�/!f�	#
	
&�&#
	
&
	��Α���u�uu�
99
'�)%)����'2"&4264&"62"&46"&46:"&4�Α�Α��uu�u�4&&4&���Α���u�uu�;&4&&4{����)82"&4264&"$/&4?&?'&62'&".76�Α�Α��uu�uC
!!
	PP�P	
!!PHC
#r#��Α���u�uu��((0030((0J6'	
'V6��"^&�!
,��1U���	4	6Q	�	D�	6&	Lz	0�	
X:	.�	&		E	6]	&�	�Copyright (c) Font AwesomeCopyright (c) Font AwesomeFont Awesome 5 Free RegularFont Awesome 5 Free RegularRegularRegularFont Awesome 5 Free Regular-5.12.0Font Awesome 5 Free Regular-5.12.0Font Awesome 5 Free RegularFont Awesome 5 Free Regular330.752 (Font Awesome version: 5.12.0)330.752 (Font Awesome version: 5.12.0)FontAwesome5Free-RegularFontAwesome5Free-RegularThe web's most popular icon set and toolkit.The web's most popular icon set and toolkit.https://fontawesome.comhttps://fontawesome.comFont Awesome 5 FreeFont Awesome 5 FreeRegularRegularFont Awesome 5 Free RegularFont Awesome 5 Free RegularFont Awesome 5 FreeFont Awesome 5 FreeRegularRegular���	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ�KLMNOPQRSTUVW�XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������������heartstaruserclocklist-altflagbookmarkimageedittimes-circlecheck-circlequestion-circleeye	eye-slashcalendar-altcommentfolderfolder-open	chart-barcomments	star-halflemoncredit-cardhddhand-point-righthand-point-left
hand-point-uphand-point-downcopysavesquareenvelope	lightbulbbellhospitalplus-squarecirclesmilefrownmehkeyboardcalendarplay-circleminus-squarecheck-squareshare-squarecompasscaret-square-downcaret-square-upcaret-square-rightfilefile-alt	thumbs-upthumbs-downsunmooncaret-square-left
dot-circlebuildingfile-pdf	file-word
file-excelfile-powerpoint
file-imagefile-archive
file-audio
file-video	file-code	life-ringpaper-planefutbol	newspaper
bell-slashclosed-captioningobject-groupobject-ungroupsticky-noteclone	hourglass	hand-rock
hand-paper
hand-scissorshand-lizard
hand-spockhand-pointer
hand-peace
calendar-pluscalendar-minuscalendar-timescalendar-checkmapcomment-altpause-circlestop-circle	handshake
envelope-openaddress-bookaddress-carduser-circleid-badgeid-cardwindow-maximizewindow-minimizewindow-restore	snowflake	trash-altimages	clipboardarrow-alt-circle-downarrow-alt-circle-leftarrow-alt-circle-rightarrow-alt-circle-upgemmoney-bill-altwindow-closecomment-dots
smile-winkangrydizzyflushed
frown-opengrimacegringrin-alt	grin-beamgrin-beam-sweatgrin-heartsgrin-squintgrin-squint-tears
grin-stars
grin-tearsgrin-tonguegrin-tongue-squintgrin-tongue-wink	grin-winkkiss	kiss-beamkiss-wink-heartlaugh
laugh-beamlaugh-squint
laugh-wink	meh-blankmeh-rolling-eyessad-crysad-tear
smile-beamsurprisetired����k%�����assets/webfonts/fa-regular-400.woff000064400000040640150755142440013121 0ustar00wOFFA�
�,J��FFTM0���GDEFL*�OS/2lL`A�Scmap���Ǡ��gasp���glyf�5Fn�Dڭ�head8�36�hhea9$5�hmtx98�T�tloca9�66��Fmaxp;  ��name;@[2�4(post=TI��iA�x�c```d��٪?A�-��PZD���x�c`a|�8�����ч1����Je�dha``b`ef�
�\S>�|=�x�=�3!@aF���R ���{56x����K�q��>n
ϳ3c��)<HP]:u0�
��ݶ�C�0*��Ƞ�����,a�.i�A!T*�^$,(|��pf��I��Ak��f�/��scL���
�q�)4��Ng���䚕���x	��B^�비�(W�q>ɵ\�|��q7s+?�>��_����\
d���F�*�d���R/W�M�奼�Q��i�QW�h�F���И^��X��S��}���E~ԏ���d[r�6f/��6n�m��}�1β��XOͳ���y֥XKe�D吜��ڝe�Xw�cZ3k�e�ց�u_��ƞ�7l�}��JiJ������Kt���5�M�N
t��Q-Ũ��S�:ZC���S>�����8�#8���؀�1�UX��w���0��L��[x�>$�nA#��#��E"�H��ܻ�z��7�N�S��r�~��P�ɀCN0�샿���~3S��x��}�Wu`���W���ꮮ������z�;�|4�X���4��B��ma	c�06x��0�Cd�u�C��K�DkXYpH6��&:�s�6q�l={߫��Ꞟ�I䞪z�^��������W�͟m�
��Ǹ0��8�D8�pfM�z�n;�ȩW��,N!��ad7��r1{�C���c����r�c�l6q,�� h}�����B���V�s�ؘr)��Le�C8�yU�9Q�8�炛��3�\�˰��c�ixWa*�{�zy�oL�z�p���w
)��0S�]�n=�WQ��S�Y\|�)硇����OD�5y�Q��G��G>r����Y��g�>޽y�\�;ƕ9._������LaU땲]�;�j!���=�z�P��m���ܭ�ݍc	��a%�5�j��JVؕL���>����ꙕ�ٕ�s�q+���c��F<[	�*��U�䃳�	'p���e��pAn������k��"�j���>0D�����}���?~?��IzJ߯�0A�y��i����V`QĿ���+5��9��sh�2��
����;ƽ
h_������QNP��J>j���@m�k��{pw��E�{s���7��ݥ����~MF�h�%.<O7�b�
�?�o��zL_����#�-c��K�7K���&�p���v��P�֝$r��E�Gj��T)�����q{a���w�BBD�%�f�狣��O^1��3�k��LO�lBM�_�#���DQz�HD�LA�I0�ɽ�J�~Ky�u�A�Х�0�{�o�+q�"����s.���g)I���M@�w�R^���u6�Ynj�l��Skԇ����]��8�,�< �'�:4�����0L
��m��J�v+�;���0�0����-����e����Lת
w�#��ȶH1��b�{���H�j�	’(�x�Gh�C͟�`%x�7��<���e2�{��N�"~��5*<�ܸW�z�*��n�'�qs�������=�̿��/Oش��i1Ѵy䳻����,;�����I�*uO��5�JtH��	9O��$�:��W�g�FE����'+޻os�"�����^��^Y�1�k�[�C����I3~�o,
L<.Mt���@I*v�&ҔD䰪˲"5SW��Pp~��g�@f` �M�w;)#$c�Iѭ�<.�!�k
��^�}h�щ��	�?͸�����^��𕁲�)�jc�r�1�2�$y��޻��b�p�$�&a��_"A/>�ԏ�~8������7�4�;
��c��@��6y�����?�7�I��0~���
w��$;j��e3E���UʎD��0�TldH� �\��Pn8�&�]�K�D��XTE����w�$M���_ώg��kU~{����U��X�Ƒ��:<�m��}���{��<�E\�F3��#�KPs�J���Wwj��(>:�4�z�kd3--e5:�!��6�6
��C5��J�\�3
�,]>?��#�����Wj	���d%J�
�Q6������}�����^���h�����7���S#\��70�t�0K`�%w
E�|�q��~�;O>y���ޫC��RC܉|��K�������!�7��ك'��-��r˾ʘ���� �+�[�?��r�_���Q��{.k����J��W��ZJXm��4�/]��%oN�~�`�uDY�ݱS���GaփG�l5҄%�c�y����Tk��1Q��һ0:��|�K3�u�}#��t�>���uN��a��*�۵��<�<�.g+=eg@6z��J�,�����W�K�w��0}�Ю_���gv�J��.�Pb�#�ž�X����8����'Y����<غ�.��)�0��DQ+�P�g���PQrnRfr
ӈ�HDC��;�L.����}A]���X:;���a+6���[�~k2E;�H.͠�k�3��,3j�bp� -Q$�	^(&4+;��wK}B�~�1#�}7��7���!��P67���R���`�p���(�d���,�J�Z�(�7�-j��iP�q�ԅ�#��H�������"�c��^��9�@��.`��@���"��Oq��Q0Dn�Po�̽B�5}j
ʠ#џ�i��E��x`vv$/�-55u�4+���RF��c#���P��7xU]�P��㾆�>;V�����ł&ʼжԼ&<�j���J��I:�aE3���QE�r�>�S���K�+!�R܄k�K��:'3�`�e��JG�J�g�;�k>�0�StR��}	L�~�~H��E*�����H��  ?�	|�'96O�FA�
qyn���<�A���x�e��H-�yfA�<������P�ӣ�G_����#��v���5
ү��Pt]<{�ʉ#��ʓ�e�:�f�ceab��Sy1��b�Wc��K��$5�IN�9�E�<�,."��U��C���	8I3�c�B��h�*(��@$EP��"��xh�̟0�Q�C���4+5h��E����RfX�a��L�L:]��TFdS�ݔc�"�霮�)jQ2ae�a9l���^ �`����v`�vb��-W�H�R�JgƞC�d�~a��Q,4
E*t,h�m���]�Q��h��f����gr�dN��P\��U(�DS${�x&:UC���\f�5n���]]�Ɩ����I!U��	(=���̌��Ñ6"1Y"�4jeT}&cD�B �"�����򰙵&���`$��w푊;��9B�C;�4\���`��3��Ȉ�4��O���E�/�����%�B�g{��5���vk���
������ݓ��zH1�`4Ї���Xq]��pǹ9Ρ8ReR�.
�Pf�ȯ���e���"�np�
@��4����A��Af[v��^�|�,5b�	-�_/7V�0P�\�	D�j��<���YLjz��b8��g���gn�8j������B2K)�uC��H�
><��3֊g��Y˸�@�Sc�j܅�w�������Lf.������a�:^�_3ԓ�
q*�,yr`�_%
~flgj�o�l��>�t��-���2�'�u�8��� ����]���C�+�+�]p]�ndV�/a$��S�a�gh`�*m��\z7>���l�mc
��-]0n`A�]�Ƴ-]/E#o�=K��XI�R^�k`�k��bfJ����h�eO%pb#q*�\Cك������`�;lQME�#:����
d�ABBj5���<�q�y0��GYj����D������YݍF-*?��)�H��@-�xf��Ȇ����V�:=a�O�U�S��$E,y���,�-��c#��w��Kb����^<}վr���0�+�_]/�f���Z�w�k(���D_��[��^�2�N�4��U�4<7���+�4�9Ì��v��b�?P�Fs]	�
⃦uhTm~w�2�|�}hvL�wW�'Tl䠬�H�O�>�E���0�?��)4f#:���A�#�l�s�qo��s��R�8��./�W�D��	�$��w5+�|�[4��)��R_��,�Ys0���<����c�ҹ�-,��c�%�Z�IC=� ,�y�,�8��j����]��=}�g.��s�-<����-�>B�ۈ�4߉��~tk�V�J�����l�
���Q4j�yf��h�]�F��57�e����S�����N�U����~�|�ut����'�#�
�t�s<�����-=�B�w&��~�)��w���7����e���<�>?�����wv���H�`�I�ٵ�X^.����=\-���u6�Nʸ��V��Ȏ��(��zm����Iv�g��R���a"��>��^�z���X�	/����hۘF����^����{����q��GG��0�M�g�ki��_���bO|�i���͔,�Kr�	=��o�ߩy�=�u���Cc�t��W:�z��^׼$�[w[��^�~t�6��y]�X�'W�a�z�bK����݊�1׏��%�E9{���:gq	�k�f��fs�=WO�lGt��_PBZLGU?�}�$ȫE!��h�q�O�i�縆O��$�����}��o�|����7�;�\tS�N�y⋺#��Ykn���Ȼ��B�я:��h���^�'@�2w=�)=AoL
\�t8�ߎ�(F3���Z�N�g�ťue��]����a�s�f�e����%k���̹s��X!�HD9�h*�[P?��VXN0
��1}��b$K���'�F�fPؕ���?<w� ���E;���*���,2ޢ�.*���lL�
�]�-�`Ә��4�H	���u��هn�-�O�ι�]L���WC����i�>�t��P�[9u�]��4�٨��Օz~V{�Wd���;�4��2�KA�ޗ��۰��w�/a�e��������s�w_z�寮/�dG;��B�g��}t�a���/�/d����A,x]�
i�u�нFK�~�2��_D�3���n��S�;nͽ��T��C�t���J��Qn��y6�'G�gkB���}�]�{��R�3:���|����"�&�W]��yH��|��Zo�:7ŭr7Q�I�T|v��Pe�Q
����n���4��*��USB��7�˶�[��o��d#�RB��Ӧ`j�߾C�
��>48YQr��pi$h��!I��"	{P��)�T]m~��N'sÉ��R�H�@�����{�Zs���?Uc�ZX��+C$?{���d�k~��4V���qļ�<�lO�nUvS��2��t���V�P�?x��L���G��j���e�s9�298�ZI%j؍7���r�2;�l)Լ�
�ܮ���PP���{4=3"�ٌ����♪�ԪӻEm�bD�-�21�K�a4�ŠSG���Wx>[�CWʪe"��޺8~a+��<�	x�u�L;���T����b�I�!4	��z���b0�r$0��\M��<�KB�>�UՎ	�X����ϟXX8�p�T:=���>��^
�O�G�:ڙi��=\k?~=����4�� ��O`|m*M$f��aPh|K@.ʠ�r�����( �'��+�Dm%2��m�L��܉<Q�nh���Xd���<)��5��۳��]��2z�gͅ���2;q���
��م��e;��me��/r����#��q����T��7=�o=ʴ�ǘJr�i]+Wg�:�ܫ9.�����<hJ��9��?Î'���ъ�1n^B>7xM��'�uC��\o����������thg-q�.��T�Yl 8�:�Q72\W	�)b�n�D�m4��T�֋�:/M��r����ϒ�?�#AHN�a=��~[U�|I�{�$;��*E�|���d�2,�3��|�����Z6���^w����+���*�@�� e� ٥�@3@�mp�^Hļ:��1�'� �ye@兀!�d�<P�Py!k{�_�X�]Q��MY9�(Zc���& C�m�|���}�ŵR��U�p-�H��.z�[e�C��զ�""?��\qʭ��b	d[�.�x�<�u,4��t�^�G���u?un��&]��`���[�G� pH�"���Ր��K1-�b۳����CZ8�a�G��#�[�������k��m�LѤ�����Db$�=l�Z-�_Jж �[p	 Q5��i.�̀�\�V@�U��F4[#p�_���C:��Ϛ
Ǧ	@�!�

��PS�ʀ����RK�=|ˏJ��v���a!
K���NF�`�P�R(�ZO��.�
-�B���W^
c��R�
i$@�}:��٧.�A�]��T�e[���(K�]t3�����r	�J��I�QBT%�[�ߞɛς��iV�s�����X��jr�7_/�������3Z�m`�{bY���gd�������d���Z�r��m��y�E��y�q�`I,����⎬C٦�c�xN��A�I�MA�]��"��8���̳�"4x���&��w`~u�:!a���_�g�����|^�Q>O�{�|;����`=��E%��(��C�)Ӏ�Ac�N�!�r@O���$i~x��t�\~;�C�=4T�F�n�b�Yf�`��1����ڲ��������c0�GOL��|�j�9[t"�C�\�>/���rv�Mݛ����1�\���ZT~=o��͇
Ss���WK�|��`����*�kT���n���@�7�������l���zmI��P����"�(��l�	
�І���%��R��V({d����ڭKQT�r`��_�^��/��K7�Ǯ,���w/���Q�?H��DZ��RǦ���V��i��V�fO_ݼ�x���S�*)-���v�������ܭ}"z�	]ǤQ)���c�ֈ�J�[�Ȑ��gA�f�I�4\
�Х�Z`1ȻWp3E.�g�Z��.�F�A!�#��,��ɡT�����[y�%k����<;�n�t�����O����hEw�E*N�%t��b�,Sҿ���%,�-^�PWUU��'�i�Ӌ�a�R�)��Pa��hs¾�xa�L:j@�U�mvj�/EP�5�e�}dh@�m5
ӎ���5��f���T���{k���:n*h���F�3�?L������=�rK#s�-����c�\RTE0�����k�K��(	��Ѽ�)�HE�'G���y=�A�4��L���n`�z�_�1~���k�qriaX�%�n
����bl�m2�O�bB�OOU�����f�Π����s�˃���:i�;���f��,���?�	����tk*й��?���(-�F�!�	4�۝u:��9О�ҡ��`�!�y�fY��h	K�&X�b
܄P� V��3��f�e�����]3+�Ɍ�%����x�:hUv��={��N�4���<�� E=�=^�*���i�1ڡJ�C�Z�u�JGXD+~j	�'�C�s���K�
��P����/���V�Y��by�!|��v���"E����)4�|S���U����1v�Z�Jmr�|Cp�+Z��pz�h��6�d�M|1/f��|i�̉�Hڬ�it�X�g]�//�47.�F?E#�^ �j��2
57�Zh� _
0B�7SYZ�9�^���R2ؔ,A����b�ec��&�`���bw�J��K_AUְ����
��h�P��	odR�	�.�%�
�hj:[��.���O��]#Pͯ��0�й=oL&߸������^n��ck����s��YfU1W���3/��2�m`{Ǧ;�p�,`_&q��[�a�<Va����ʸ	�<A�^���W��%;��P<�B��',)wn��'�K�
���{c�SJ��Q�@`���u���<:b9���{C�@�����@h�e���@h�]wQD,ʣ�ᮤu�W�>�n�|�O�<z}�F,�L�4tk�K�!j��GW��4(Y*�:�hJJ
��צ��l�+��5\Gs�D�@���*&�d�AQW��Ư�r:&�&q�whF�ڍPT[zD��yy4�珀�,Sl��5U�Mz�yz�z�z�M�(,���?�f����f�ldY�ks
3��A'n�&P�3 J�5 ر�&4�l���;�,\#.3��L����-džb�����3�g��7��A�sP�=����;���
�t�0B��X$G=A��"UO�Yk|~\�h��1m��hD��p�� _B�B��Ԑ�A��+�#~N�t�0ʶ��р������֊67���9�4��M{�	81܀Gx�(ˌF4{���\:%��8�j�������+�oҟ ��w�H�/"6��`_�k:�#����[C��������Ӳ�N7_���~Z 2^R�1e�(ł���5̂/��>�|I�[����Sӏ�xnz|����dK#Iީ�z��PXh�_�t��u�F�
D1����W�߭\5�Z�'q�&�a+1F(�Dqѐ{8����4�8 �C��RB\��CbJ�J9U�Z�7�M��F�ᨬ�hd7т�	���hR�VS� �ưH�u'4���6!�3	�njȡ�>$V�c�l�&$Y�39IJ��O�fn�Nr��\��v�S���<��t�]����Ԟ�l���z��v�K���թ�^��K�;ӻ�A)�<���ar��(e'�?%Q���sAa�#"�ZRB��pX"�''�c��N�P�E���6��HvU&ov�O3���D���Z��ڛU1�>-���t�A�
�ҫ(MY���,��}z�/ H�]��pM��'v���Z����]zgi�5�����̣�LY���4N�?����+:2����b����j���&���-u�V*tM�É^BxP���
J]�#kd4��>3��ЬF��ȱ[��:)�O��wK��tR?����H��]br=�ي�/Ƕ<�d�c=Q���2
��%����y�D(��TeY<v��;%�C��NN��
�4���D����hZ
�K�yЃ`���r;�0C+�2�@t�tv��d�5ӗ��aǘV�eo�۲l���m����W;�҇n��>W�T���6k*r�.+�LOrWi}{�����+5_)4����3�v���Έ~�"f�=�g�=;�H��d�0K�|����⦮nN�%=��V(
�,>�."�A��$����H&ɚ|	��*=�¿g?!]��'כ/>�����PH��XW�� ,�A
A7tJ��ߟB��?L��D������a��ߎ�<
s5Zi}�f�p$Vt|]�
�soD}�^�s�u*P��l],�[x}���J�]r��2_V�<��=�}2D�=d�S�,#
)�w��l�[�|t�Vw���zRڜ�7����~��*�`z����ɯ�u�+��2w'�:�z���kYL�K��g�?�ebլ��w\K���X*�`��*���f{LݿZ��~�^�o�d��<������丞5#I;��9�)��,��r��1��������JxrH�x��	hq,q��VCyEIư��� ���2�Q��5M��E�u��K�\$PSA��B&Y��\)j��%��U���=���'U1I5��U닼6�-� \�!W��Xb�u��C���zV#h�P*'E�{�X(�Q�1x���-�"]K4���ŀEm��6 �t�A�l���ȭBX��6����SM
N�1��	�z�)Ym��f�>0`�Q���AYi�hS�B
E���Ϙ!v0}X�X:rP	
ǚ_h�QG�u%�?��&��J&u�ݵ��D+`"�$��:� �oL��C4�
����9T~C=�ୌb�
�	��9�)��u�׊.�聥�4/>_-��(&�x0ŀ�RK A�\9�.m����"���b�>�qM��2���Ed��p�d��l��7��^�~��;B���+�R3��EY>���ya+2KrH�_��Onw�3nM�B[�5
�( y��Ŷ�����_d��Yf��
&j~�ll*��@�<H��蒐��%t�}q�$[g��'�J^UQ1W]:~��Ǘ�UU�|�t�N��O�����B��9+��^��y�ce�}��bg�
MQfAk
�&}���}||��f�?�o��_�g�d��z��F�Ѯ-��d�m� �v��+��d��ىkl��E[����r��(*�z���GL�h���؟��f�4@@�%ɡ�pLy;l�c�C,�j��$��7�Q6�[���������/����h;1��+�Ώн򈭻�e|��O�Qoi����W�G�&u���|:׊��iݪz۲e��n�5����z6o�}���]�	�$C��q�0]�Ă �FQA<�X磇�@jڀ�CDm(��Ey
	�"��Lx*WZ�\��.�̺�1��P��4��ӈ�}O7�:x˲��d�ۏ�k�V�+]��o*ע!ί�]�=�u����(�F���@B4L_�uG����i�����q��7��+��M�H+��f�N��"�����M*�Ɖ����b�����\����fpL?%�1�\��0/�"|�yi�5Ny�5Vؗ�s��]��5�khhHA�ҼPr�v�׏�ܩW2��77�l�KÏ�ۗ�Z�Tn}6���l����N	����
��ؙMvv��gs��ќ��C�K)&�G����V��'f�&׺u+��h���f������>�1�>�K��	�_u�\�ӟ���ճ��:1�=ۼ����ܤ�n�;��h��N/S���g���/c�,���������t�����}�,�L4�XB+���Ufݡi��d�����}P|��-~Ef�_���;y���ݮE�˺��޷myW+#�o}C���G/���S��q���#���#~�g/8`�%Y����pϸ��)��])fI�A�b�i�F��ExE�.4o:��z��o�/U���@��*��f>PE��4G�u���Jk�߹���xc��ֺ�OE�ǮqW@���3�W���XYo3h9�E��E*�p#]�����lyY��2ՙ��:3���4)`0�6�D?�rӝ!��,�����_���#з͗6���]�����UW��d�ր����E�eN��(]�^[�Kp�?��z%�n}�ȵc�i�������+�:�;���?>��%�����|�(u����ݵU��v�6��ݓ@�N��b�xWP�k?j��j��(�U��+`5�x�X������XX�%�I��[��S���e_h��=�,��FѪS��vw�Sy`?�+�n_�,F��"�$%�ꊢ
�sXUT�%���ҳ�tp���j�lS�(��o��U�	�j.ELAVdZoJ
8�4���q��ʭ��[&2�~���Y��n���'�_����Y=��a���}~K�{�vפ���۴]ޮ�G<��t��-�/'�]�[���Glϭ�Wvz���Kߛg~c���,��a��[7
������L};��u_������c��3�.����k:�(����bʧشx�PG�$Pf�3JI�0��Ȃ�3��.����o��E�s�^�WqG�U�7�{ӻ�GƲX,�Ҩ����R���Ε2[x-��>vf�1_)6��X�(gJ��Y�;3��kl���ل�R8��d���"��b�_L�)�p#�G����:�W� �
=�w�R��td4^x����R� gU�LY[V��Q�]|`�2��A�o�ޠ��NW��f��	� E�ktOo�*}e+����/�b�d�-��nEc*C��B�*�:.G�"���W"��8e�bG� $kF�D�<
J�P��	�_��?��CWI"bӶM��$9�)��*�S5X�@�6�TL��(��qwv�[�=L�na��0��Ga)A�b9�j�&����!S��E��(�x��
�p;�S�N��m���)m�x�^�.��Tf q��]�h���w(�A#��O���iJ�L"���:�ܻ>
u��0������s���hz�(�
�c�� ���I��o��]x�`Ȑ��Nt����w��yK4CJX��6t�G>��u?.�š`��2B����0/��
��a�B�&�^��v_���U��*R}[a[�[_ؙw? �41��W��LhM`v��##rP*	�Pb�Ȭ
|�&�<�"���s�����uۧ4�
`@���r"�7܌p�'���zc�ƨtǢ����4X�fZW�a�j���m�l�~� =�΄"���p�q��|�H�㻧,�!+�u��J�����gB�;���� IU�Wo�*��W.LEĠ�v�cD
K�H�FB��P��Ɂ��W
F��ɇ�����*IXs�_[�4{�Jn�ޫ�x��N��t|����Q^a��h�wie��o�z��D����y��"d�︣>,���� H� �}V�8F�8<,�HtKX�׮����lLT�4,�)b,+I|(�KGYA��%�ӊ~�hss��W�ߒz���xM7I�E}b;��F��Y�����[4bOo���-���D�6v:ƻ�p��ݝ
k��{k�Z_q���t��ۢ��^I�?�	ŋ�p�w-}�J*X��+S3ss����;���ܣ�Ckk/�4er�n���QF�"�Q�a�Z���tS�a&�����, ?�H��R���lX��o���x8i&f��fD��?D�̾���ٜP$M�	�5MR��Es�ܺ��~�u��&�X�5���o���w���?�_�������4�/�)(*C*P�S��I��(�U�z5��/�&7���Qn�4�;�}���o���T �]OZS�a!��-�̇~I�!]�t��Ɗ�U�89��!�N�l���S\w����q�K�n��Iu�Bp��1��]�����ca�H�J8Ǹx�',=���@�t�"m�cjё���.Ӳ3X�I�ږ����g���$�<�f4j�"=b���`X��d͝�!�lðC�c�(`�h<Q��l�D��t���D��W�y�[>��8�A���A�����T�\9�c�퀲T�?ˣ���-	�L=��l�2t��Ǔ�?���R=��M�+�^%)4Z�*���]�e�.��`t����Uo���UXs��2*�A�wy=d�nD�e6l�b����#��n&DA
X㧫`��>����$�2�|�1;h�A���Ԁ3Uw@�eU��2%�a>�#���G�i����HH���a��	!�
��?��k����g�c�t_��8�׋��ô�/���G2WLSW����?m��>ms\����X��d��{�	��'��0�í$;�w���OYVGm���1*빖e�,=����tP�!��H[�O@��N���M�����.����Vo��n�|���6��0�����y�pē��w_�;P���X<���(����gQ��[��.�ڎՐ��P]��_�����6W��[Kb���6f�Ϗ�͏52N��̇��h�A�]qq���缆���"�-��eN���NW��V��?�i��c˶q�,{�Nj�����ޫ�M�Gg�Yx�䝓p�d+�'!#�ȳ=:�}��C�_v�P�ce�����
z.{*_�K��!|�<�1Lrn��
H�����}+�b�bAl�c��|d�������wa���$wO��<
,�>C�"�333#[e`�8[�7C���ں���]F����V*P���ب�ՍL��+����|w̭��)�0s�c�~���L�|1�n���ؿe��kK.���~?[>���O�j�t|��u\���~	�${oV�������G��x���Y �U\��T���x�c`d``�:МsS�+���+7�=�
���������$�����
�x�c`d``<�S�7@��(�&��	x��Q�
�0t��'�tF�<Lх��D0��I
�H'Ǘ�k�3�9e��g:�E�4)�E�5ޠ9�L/��AD�Z��k<���?�)��;�F�f��X�C��÷�6�HZ�b��-���K�
>h��s��k��������;�Y��i�I݋<[-�K���̾�o���O���[�@|��n��*��b���H�*N�b�b�	^	�

:
�
�:�6��

�N��D��>n�8�(f��L�D�L�l�.l�D��f���Z�h�D��f�  f �!!H!�!�"d"�#L#�$$h$�$�%%N&@&�''N'�'�'�(&(j(�)")�)�*L*�+4+|+�,H,�--�..d//�0*0�11�2
2n2�3�3�484�4�55�66X6�77`x�c`d``�Ű�������$��3$��x����NQ�ϝ) !��uquQ��N��;�v�F�ƍ&C�	m�d�B�o�^�p�҅;_��0�0����b�t�{����|g����Aa򻍖�B���ჰ�{�.��^
Ϡ�>��sWx��7‹��|^�
�!��9���*��[�5j��S��0�Ճ���;~"�`	�]<�G�Z�$<����,����;m�Ex�'�e��y�,���W�r_�Q�^x���؁A�S$��CetQ����(���!R����c��$�.w+�cFVo���yvٟ4��dB�V�{8���{��N�z7���=�7�*O=4��X�ҹ�{��W��P�|�la�5��[���c�u�+ڹ�y�
�mֽ-���S�'a�Ff�֓�� ��Y��E����_=���%�-+��
�,f8g	�^�*��y7��<sE��g�}C�5�y���8��H�ФV�&�u�5#��V�m�E����ZZ�|-5>��0�J��Cʭ��v�v�\�$��5ÿ��}�}?��6���Oȓ��x�mTgw�6Ԝ$��d��.��ޙ�{�$W$N A�e9�'w��C�Z~L��l?G�	�Y��b�#����Ή����t���衏%,#@��a�c
��Q��c8�3qN�l��sq����b\�Kq.��W�j\�k�:\�p#n�͸��6܎;p'��ݸ��>܏� ��x��1<�'�$����x��9<��"^��x��5��9�7�&���x��=���#A
�rp��JHT؄��A�-̰�9v�!>����3|�/�%�����;|�S8��#~����7��?�'���Ĕ�i�T�֤����4\��	ӛ���ӂ�i�,��܌/HG	W��Q�S2m�x�&m�,[ܥ9��i�t>J��2e�U_NdQPi�&R����#��a�[^Q�T�.ҡ#�LL��
Y�D	Si7Oӵ��iTI^�H�,7�}	A�����T��^"�yO�-Zқ5SP�E’	���"��$D�K]q�İ����K�f���v�([�[PLiKK0�ݷ}��w�V�rQ�mb��>����bZ�۝�i���@��6`߄��
��:��.bm��ȕ���R���z6H�i�q�E�ˬ�V���3�ҁ�h;!1nf匔on3�3jh�$�[��Y�rل[<%ٔLd�>q{(�a�*+۸��&���K�i��#i��n��)������#���D��u�ڂ��phE�L�Q)
9՗�V���C�
e�0hT���G'\k���#�w��6�te׏�Te�5�XB+�;Ѭ.�W��ڃ^݂U���G�Nm��BVm�Y[�LieW��K#���������f�,�{�<�vK3Z機�xi�l�|������V3RQ�K9��ŔB��i8�K��u�^yc�Z�M�_��;�u�;~(�}�P�����J�ys+ץ����h�}V�z�=�i�Y-�)�ٙ/O��d������)���z�Yn��AL�/�Hψ���F�Ml�d���/���փ&c��6�Yf5m��W������zS���

1���M_�:�~�FM��m󾢽���m��"%��6���5��P�=ݶ��\�kU)��o����"���assets/webfonts/fa-solid-900.ttf000064400000572364150755142440012450 0ustar00
�PFFTM�����GDEF*��OS/2C�V�X`cmapM%���gasp���glyfk�U�,���head��6hheaC$hmtxo���locaxڴ� maxp)S8 name�'$�h+post7��Ŕ/J��3f�4_<������������������P @��LfGLf��PfEd���A���.�T:� �����@�`�@@��@��@������@@�������@�`@�@����@���@@��������@���@�@��@��������@@���@��@�@������@�@@�����������������������@@��@
@
@
@�@���`�������������@@@@@��@����@����@������@`�������@���������@����@@ ��@��@����������������������������������������������� ���@������� ��@@��@@������� � ��@� �  ����������@@���������@������������ ��@�@���������������@����@��@�������@������
��
��
���@@��@��@�`@������@@�������@��@�����������@�@����@���@@@��@�����������������������@@@�������@�������������� ������������������������@�������������������@@��������@���������������������@��h��������@�@��������@����@��@���@�@��@�����������������������@ @���������@@�����������������������@������������������ ������������@�����@������������@���@������@�@��@������������@��������@�����@���@ ������@���@@�������������������@��@�����@��@���@�@���@���@��������@������������ �������@������ ���������@�����������@�@@� ��� ������������������������������@�������
�
������������>�D�N�[�^�n�|��������������������������������"�.�1�5�:�>�D�F�K�N�Y�^�e���������������������������������-�6�9�I�N�]�l�w�z�������������������������������������(�8�[�]�`�b��������������������������"�$�4�6�:�<�?�A�C�E�G�K�N�P�S�X�]�_�b�f�m�r�t�y���������������������������	�����������������������������������!�0�7�<�A�D�G�J�O�Q�U�X�^�b�f�k�m�o�t�v�y�|�����������������������������������������������"�)�/�=�@�C�G�M�S�V�[�_�i�k�s�}�����������������������������������������������������*�/�>�J�L�P�S�c�m�y�}���������������A�����������!�A�H�P�^�`�p���������������������������
���� �$�0�3�7�=�@�F�J�M�P�[�`�����������������������������
���!�3�8�@�M�Q�l�q�y����������������������������������	��(�7�X�]�`�b��������������������������"�$�3�6�9�<�?�A�C�E�G�K�N�P�S�X�\�_�a�f�h�p�t�w�}�������������������������������������������������������������!�.�7�;�A�D�G�J�O�Q�S�X�]�b�d�i�m�o�t�v�x�{������������������������������������������������"�(�.�;�@�C�G�M�S�V�Z�^�i�k�r�|�����������������������������������������������������)�/�>�J�L�P�S�c�m�y�{���������������A����������������������������������������������������|{zywjihd`]TSRQNEDCA?431,+%" 
�����������������������������jigfH&


�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�

~
}
|
v
h
c
_
]
\
[
Z
R
N
L
J
H
2
'
&
%
$
"
!
 













	������������������������������������|ywvtjihgfeb_]\YWPOMCB=<63.*	����������������������������������������~peda_PG<;87.)
�
�
�
�
�L�`�d���H�p		�
����
<
�D$�L�H���p<���|��p8��\���\� ( p �!!�""\"�"�#D#|#�$0$x$�% %l%�&&�&�'x'�(�) )�)�*H*�++�,`,�,�-�..�/</�0,11t1�33�3�4�4�5<66�6�7088�9\;�<h<�= =�>�?8?�@@�AA�B$B�C|D4D�E�FTF�G<G�H$H�IpJ�J�KDK�L�M�M�NhOO�P0P�P�QlR8S�T�UPU�VTWW�W�W�X$XTX�X�Y,Y\ZZ�[,[�\\] ]�^L_@``�aa�b�cpd8d�eXe�fXf�glg�h|h�ii\i�jj�j�k,k�lXmm(m�n(n�o0p�q�r$r�sTs�t,uu�vtv�w,xx�y<zz�{t{�|�}<}�}�~\~��������$����t���l�(�����H���d�����4���L�h���`�D�(����������\���4���<���h������h����T����0� ���d���������X���T�H����l�������8�D���@���<���X�d���p�`�����X�����D�h����$���d�����$���8����������D�4�����Ũ�0Ƥ����`�T�4���̌� ͨ��8�H��Р�Ѩ�t���T���0Ԕ��ՠ�P�$�x����ـ� ڬ�(���l���d�8���`�(�����`�0���0��4����P������T�0����������p��|��L����8�����l� �����(�����8p�<(x(�h�$�		�
� l�$d��
�p� t��(�8�8��L�|��H�0���p�p�| !�""�#`$4$�%�&�'|'�(l(�))�++�, ,�-\-�.4.�/�0�1�2p3 3�4L4�66d77�8h8�9l9�:�;�<�=d>>�>�?�@@@�BB�C,C�DDE\E�FhGH@II�J\K�L�M(M�N<N�OHO�PTQ Q�RRpS|TT�U�V�W(W�X�YY�Z<Z�[l[�]p^�_�`8`�a�bxb�cxd$d�e8e�f|ghhh�h�i�j0j�j�kXk�l8l�mpn,o@o�pp�qHrr\r�s�t�uLu�v�w�x<x�y\y�zX{${�|�}d}�~`h������ ��� �T����x�����\�D���`�`��|���|�����������������8�����0���X�0�T�0����(���t���x���P�t�������4�������L������0��� �������X��x���$��������(����� �����<°�\ì�@���H��Ƭ�ǘ�P���x����|�$��͔�\���`�L���L��l���,՜�D��׌�l���H��ڜ��ܠ�(���ߤ��4�H�����L���H��h��0�|�D���d����P�������`����T�����������0��l	H
��

�P�hT\�d���T$�,�T��� �!!�"�#%& 'H'�(d*�+,,�-�.H/@/�0$11�2833�4`4�66�8D8�9�:�:�;�=0>?4@�BXC�D�E�F�GpH�I�J`KK�MLNN�P(P�Q�R(SS�UPVPWX(X�Y�Z�[$\�]]d^^h_�`P`�a\a�b�c$c�d�e�f�f�g�hhiDj0j�l m n�o�pp�q�rDr�s�tLt�t�u�v$v�v�w�xXx�y�z4z�{x||�}X}�~�(��`��������� �����`�@�$����������D���h������������32+"546;5'&63!2��8�8������**��� 632"&46325"&4632467�		8P88(�8P88(
	�		��%%6%�K�%%6%
���!%"/&=#"&46232&264&"�d8HVzz�z,
�jKKjKd
,z�zzVH8KjKKj�����"/&6767>�/+�

�+/)k&&k�(|+�

�+|(#	''	��1�62/&?'&6?	(	A�j �� j���&g�	DD
�g&����$"&4622#!"&=46;27jKKjK&7O��O7#L#�KjKKjkO7**7O	�/;GS_kw��2+54+"!54+"#"&546;;2=!;2=54+";2=4+";2=4+";254+";2=4+";254+";2=4+";2=4+";2�

(��(

(@(��((((((����p((((((�
��

P
��((l((l((�``�``�((l((l((���/?32+"&=46#2+"&=46346;2+"&5"&=46;2#(�

�
F

�


�

�
(

�

�
�

�

�

�
��

�


�

�
	��� 0BRbr��+"&=46;2+"&=46;2746;2+"&5#+"&=46;22+"&=46346;2+"&5%"&=46;2#"&=46;2#%46;2+"&5�
e

e
�f

f
 
e

e
 f

f
�

e


e

e
�

e

e

e

��
f

f
�P

P
�
P

�

P

	
P

�
P

P
�

P

�
P

P
�
P

P
h

P

���/?O_7+"&=46;246;2+"&52+"&=463"&=463!2#463!2#!"&5"&=463!2#�
e

e
�
e

e
}

e

�



��


��




�P

P
�

P

�
P

P
�@
P

P
�

P

�
P

P
7'&4?62762"��%p�%��	�$p�$����aq#7"/"/&4?'&4?62762�d		
	dd	
		dd		
	dd	
		�d	
		dd		
	dd	
		dd		
	���5=++"=#"=4;54;232"/&=#"&46232&4&"208 88 8�d8HVzz�z,
d�PpPPp 88 88��d
,z�zzVH8d�pPPpP���%-+"=4;2"/&=#"&46232&4&"20���d8HVzz�z,
d�PpPPp  ��d
,z�zzVH8d�pPPpP����)9#".54>7632654&'.?>+"&=46;2�08�gCrC. 	
bFEc$ _
 

 
�"k=g�BrD)L>	"'EcbG'G	�

�

��h�/?O72+"&=4632+"&=463%2+"&546372+"&546372+"&5463�		0		P		0		0		0		�		0		�		0		�	�		�	`	`		`	�	��		 	`	��		�	`	� 		�	����<D%/'&=&''&'&?&47'&767667547676264&"�	&+"	76
"*	&	**	&	*"	77	"*	&	*�B//B/�
5)1

1)5	$
5)1

1)5
##-/B//B����A�D62+"&=4.+"+"&=%#"/&"#"/&54?62546;2�	p	@		p	����"
Z8,��	
`	`
	�1���JI�����2"&4?6/54+"�Α�Α1
	@0��Α���	'
.����E�"0B%+'4&+"#"&76;;265'32;26/&+"2>5'4&+"3=�	D��bb�((7	.	-bb@4,,�00���+3;3232"/&6;546#!"&=46;2?324&"264&"2�P
X
	��	

X2
�0

�1*1�
|L�
�	��	�
��p

p
11j@�%#!"&=4?>3!23373'8� j
��U{ p {U����

+�@@����<2+"&=46303.#"3267632#".54632'41463��eU'IggID")-.CsB�fIA��/ .g�g"

BrDf�)R���*T4146;2+"&=463.#"+"&545>322676;2#"&'1+"=46;2#'�/�fU':d

1�ZIA�9d
1�Z0n/�fV��/ .O8	Ws)��O8	Ws3$R�/ .���'3?K!"&5463!2"264"264"264754+";254+";254+";2�`���""""""������� `��h""I""I""�  T  T  ����%2#!"&=46;5462#54&"���Y~YP*<*���H?YY?HH**H���'276#"&#"+"&5&54662^0E;?$h>4

"!Gh] �	)#^

�!

#���12+"&=46;254&"6;2+"&/.=4�Ԗ
A-

/!q�q!/

-A
��j0-?
�
"OqqO"
�
?-0j���6/#"&=46;�Yf

fy��Y
�
����#6/#"&=46;.6764'.>�Yf

f�				x��Y
�
)0).��@�'>P6/#"&=46;%.67>54&'.>&'&67>4.'.>.6764'.>�Yf

fB<DD<	!/91	(-)			
)a				y��Y
�
�'~�~'=J';h!�`S	$,.,$6)0).	����#'+=3'3573#75#53'35%3#5##5333#'3#��@����@����@  ` @`@  @  ��@@@�@@@�����@@@� `� �   �#'+/37;?13333333333333333333333333333333			$										���������������������������������������������������=46;2"/&6"264���(��((���(���((����)%"/&=46;2264&""'764/32��(���((2�(��1��(����((���J��(����#/8%#!"&5463!2;2=4+";2=4+"&7!"3�		
��(88(H
���������

X4
8(@(8
nF�  ����
463!2' �@��0p���#'082+#!"&=#"&=4635463!25!%5#"&=#264&"�%	0
��
0	%

	.	@�0	�&%p	`

`	p%�
	.	
��``�`	0�H���"*#!"&546;7>;2324&"26"&462�`X

~X�FdFFd&4H44H0�� !	!�dFFdF�H44H4����-0%2+"&=46;'#32+"&=46;>;2'3'�		�		�		�		�	0	��^/ 	 		 	@@	 		 	j	

	��������%-%+"&=46;#"&=46;2'3264&#264&+MR6�		  		�9L�W  W�?$4F	0	 	0	T9$a`(��!.!p��@�#+32+"&=46;#"&=46;2@	?P/		�		?P/		�	� 	��	 		 	@	 		��C�-I2+"&=#32+"&=46;#+"&=4632"/&6;5#"&?62+0		 	8(		�		(8	 		 PP00PP0�	`		 ��	 		 	0 		`	��PP�PP�����-I2+"&=#32+"&=46;5#+"&=463&=#/&4?63546�		 	x		�		x	 		[PP�PP��	P		p	 		 	p		P	��PP00PP00����/?7"&=463!2#"&=463!2#2#!"&=4632#!"&=463
���		�`		�		�`		`&&&&@	 		 	�	 		 	����/?2#!"&=4632#!"&=463"&=46;2##"&=46;2�		�`		�		�`		\��� 	 		 	�	 		 	@((�((����/?7"&=463!2#2#!"&=4632#!"&=4632#!"&=463		�				�`		������	 		 	�	 		 	�&&�&&����/?%2#!"&=463%2#!"&=463%2#!"&=463%2#!"&=463�		�`		�		�`		�		�`		�		�`		 	 		 	�	 		 	�	 		 	�	 		 	���/?O_72+"&=4632+"&=4632+"&=4632#!"&=4632#!"&=4632#!"&=463P		@		@		@		@		@		�		��		@		��		@		��		P	@		@	@	@		@	�	@		@	�	 		 	@	 		 	�	 		 	����+;K7'&4?62#!"&=463%2+"&=46372+"&=46372#!"&=463e``D		�`		�����		�`		U``�-	 		 	�&&�&&�	 		 	����+;K7&=462#!"&=463%2+"&=46372+"&=46372#!"&=463`5		�`		�����		�`		U�`�	 		 	�&&�&&�	 		 	@�2#!"&54636/5P���"#n��� &�K��")"&5463!2"264!5'&'&�`���.!!.!h�X�8H ��H!.!!.�pX�8H����.5462"�="
p�p
"=6#X$5"PppP"5$X#
����
6462"7264&#�Α��gLllLYΑ�Α@l�l��`�!"&54>762264&#"&54&"�6,!g�g!-5-		!/		B�4_6I&JhhJ&H8^4�@		/!		.B��@�7.?67/&?624?6#!"&5463!2+!�Z�\
��$Z$ �(��(�@mZ�
\� #Z#��(�`(��@����4;276/+"@0�%%�0���
��
�����54;27676//+"(�%�%%�%�(h��
��
��
��
�����7&4?6'7&4?6'�%%@�%%�

�
��
�

�
��
����%&546���13�6������#"&546;2%+"&546;2�`````��0`����2#!"&5463������`���%&546&546��%%@�%%�

�
@
�

�
@
���+"=&=&54654654;2(�%�%%�%�(t����
��
@
��
��@����+"=&54654;2�0�%%�0��X��
�
��������%#!"&=463!2%"&?62#�
��

�
�p�*�@@

@
39��9��%�?62"/&4#�����������%�%"/.?'&6?62�������������#2"&454+54+"#";;2=32�Α�Α�\8\\8\��Α�΃8\\8\\����2"&4!2=4#!"�Α�Αt����Α�Ώ88����#2"&4'76/&'&??6�Α�ΑrBB(	AA	(BB(	AA	(��Α�ΨAA	(BB(	AA	(BB(����"&46276/&'&��Α�΄��Fh'Α�Α����Fh����+3"&462"7>32;2=4>54&"264��Α��`J+	#	

8H &&'Α�ΑR@		



	&*<�&&����'2"&4$"26454+54+";#";2�Α�Α	""@X��Α��#""�d@���(PX%2++"=.'#"=4;>754;2>7#"=4;.'+"=32+54;24"&462�3N.(FeeF(Fe�,?
))
?,(,?
))
?,(�(.N3eF(FeeF�
?,(,?
))
?,(,?
)y����
2"&4.67�Α�Α�`�4&��`�4��&��Α��`&��4`&4������%"/&4?62!2#!��x

��x��s
 
s����762"/&6?!"&=463!'.���x��

x}��s
 
s����7'&4?62&/+"&5#��s
 
s���x��

x����%"/&4?646;27>���s
 
s���x

��x���&='.54>7546��1D2
#02LP4�

X*@+U,,B)	P
����!2C546;2++"%4;2+"=#"52+"=4;543+"&=4;232
|T( |
(T�
|T�|
(T|
(T�
|T�|
(T�
|T����!2C#"&=4;232%+"=4;54;2+"=#"=4;2+"=46;2+�|
(T��
|T((T|
�(
|T
|T(
(T�XT(
||
(����#%2++"&=#"&=46;546;2�

�
 
�

�
 
�
 
�

�
 
�

����%2#!"&=463�

��

�
 

 
����6%/+"&?&/&6?'.?>'&>;276�	�&�	��	�&�	�r	"	T��T	"	NN	"	T��T	"	N����"&462"264';2574&+"��Α��T&&Z0@'Α�Α��&&������
.9C353#"&53#2#!"&=46;&54632>32!3.#"3264&#" ��
�
 
	� 	
,
4$..$4
��V#!� ����
@
P		P
$4 $$ 4$5"$%����@�'&'.7>3264&#"&546;26762"�u8[5	 @Q}G		�upPP/O�BN��	.%,.
/>0"		TPp/)����!"&547632654.676�#11#q�q7%&
"�2,2M/OqqON9U&% "*=%
@�-%#".'&47>22654&"72"&54732654'6=*�[<oV*����<TTxTT<(88O9	�Pa-O5Paa�T<<TTxT�8O99'
	����3J%27#"&'&4767#"'&54?632>32'654&#"654'6320@

4)%[�*i'@_���57[�*
0IT<6I	

'80)
aPQ%=#:�c
aP<9<T98'����H�!%#!"&762"264';2574&+":
� 
�8&&Z0@00���&&�������@�*2++"&?#+"&?'&6;23'&>;2�BBri	B	1g+(	  	(+g1B	i'2'�
�:ll:������	!-9EQo!#!"&%;2=4+";2=4+"';2=4+";2=4+"';2=4+";2=4+"2!546;546;23546;2���@((((�((((�((((P�@0	 	�	 	���((�((t((�((t((�((@000		00		0���;%&=#"/73546%"=4;2'!#+"=4;76;546&5�P;F55 �coF55  �oT�;PPYP(K:9(g8K:9�8�(PP�����2#"'#"&'&>7&54�Ԗ�j83AL9�z�z319JV���?#"&=46;2%+"=46;232".54546;226=46��hY�h��Nt{tO�2<2,PPP|,	Ht;;tG14-44-4;�E/&/&4?62�����=����;�E7'&4?>76"�����C������}�!C%"/&4?625#"/&6;2762+"&="/&4?62"/32vee(�	�
(���
(ee(�	hdd+�
�+
�+dd+���B�.%#!!2"&547#"&547#"&=46;2!2��
 !.!�!.!FF

g
	�� #!!!! W

-�2#!"&546;��`�@@� @D� %#!"&?>3!2%"46;32=I!�pI!��T 	E�@��|
|
8v@0�/?T%"&=46;2#3"&=46;2#!"&=46;2#3"&=46;2#2#!"&546;2M&:&��&:&�		�0
	 	�����FF��@	 	
P		�����-5=M!2#!"&546";2=4#2=4&+"#"3264&"62"&4265463264&#"0��`	t@	���dFFdFTH44H4!	
		&���` 	
`J	-$��FdFFd�4H44H4	
		&���"*#"'+++"&=4?&54>32264&"gI%
(
p
�	/Q0Ig�((Ig(
(

N
�0Q/g((������;C����'&'&?&'#"'&76;67'&767667632+/'>'&/'.=&''&'&?&7'&76766754676276>.6'&'&?&'#"'&76;67'&767667632+/'>'&







&	
&	g"	!
&&	
 
!!
 	&&
 
"{#0#0	







&	
&			
			
	

	>##�
(
""
'
 
'

"	
"&
50#0#�		

				

		>##����B�+#"'#"&'&767&5462#"'#"&'32654'�zV<3+.&z��.+3<@hc�9HB�^")3B^��"
6,qO	Q13�� �
&?'&6?6 � j�A	��HD	�g&�����,%+"/&=#"&546?#"&=463!2+*&
�
�
0&*



*� -
h00h
$<v
0

0
��@�19A232#!"=46;5.'&'&=46;5463!2&'#%5#676(
>0>%0%��%0$>0>
h

��@�@#�
88-"4HH
&"-88
(

(�
)--)
���/7?%#"&=#"&?62+7#!"&=46;;26=324&"264&"2(P
X
	��	

X�
�0

�!P!�
|L@
�	��	�
p

p
!!j�����#7&.7>&>676>.2327>�"		
'BF:;-+
+"		
'BF:;-+
�4j
^�"+
+-;:FB'
		"+
+-;:FB'
	c
j4,^�����#"/&?6>7'&?6���p1;[<0����h0<\:2p����.2#!"&54632654/"#"'&#"���.x�A
%#KF	���`���x	FK#%
A����&%2#!"&=46;5462+"&=4&#"���Y}Z
 
+*���f@ZY?

*+g��@�	!+=!#!"&7;2=4+";2=4+"!5463!2@� ����HH�����X((((00����16"&462+"&5.'"&=463+"&5.'"&=463�%5&&5�	0	wT	
t��	0	ː	
V�sF;5&&5%o
	Tw	0	�t
	��	0	Gr�@�&.%#!"&=463!2'!"7>3!2&"264&"264@� �0� a
a3s�``<�

�`��@�,4$#"/&++"'&547#"&=46;2?632#2@ 	UBUK"%%�UBU	@!TkkT�J�
D5+"#5:%`%5D
��C`C�����;%//&/&?'.?'&6?'&67>7676�.

?>	--	>?

..

?>	--
>?

�-
>?
..
?>
--
>?
//

?>
�'7?%+#*#"&'.=47>763232+"&=46;24&"2d

##GE
	��`
0

0
�
+% $
	�

-+
�

�
��&6>3&'&632#*#"&7.7.7#"&54632+"&=46264&"-�	
EG#('

d�0

0
$
+-

�	
$$#%+

�

�
�������'7?2666+"'.'&54654632+"&=46"264�
+%#$$
�

-+
�

�
��d

'(#G
E
	��`
0

0
������&6>5&547>76;2'''#"&546;2+"&64&"2\
+-

�	
$$#%+

�

�
��	
EG#('

d�0

0
����%"&462'326=4&+764/&"2?64gΑ�Α�L�

�L��8�Α��H

H������%2"&47#";2?64/&"�Α�Α�L�

�L����Α��H

H������%6462"'7;26=2?64/&"2�Α��H

H��YΑ�Α�L�

�L������%"&46254&+"'&"2?64/&"��Α��H

H��'Α�Α�L�

�L��	����
"+17=#>2473#%#&'%#>#64'#&4733"&673%3.P�0:0���Bl#5S��$lSk		r�r		r(�0:0�$lS��l#5S DTT�@  @ �\2K[2\3K�    !>!@"!>!!DTTJ2\3K~\2K�����$'"&4?&67>76264&"�	P&�5%�
J$JDK
�<S$I
�%5�%Q	
KDJ�����+3CSc"/&4?62762"/&4?627622"&4%2#!"&=4632#!"&=4632#!"&=463�I
/
@
H
/
@
\((�		��		 		��		 		��		�	H0
?�
H/	?�((	 		 	@	 		 	�	 		 	�����2/&='&63��P
�����
8��'+%53#!"&=3;2672!546;546;2#5#@��`�	`	��P�@�p0��0		�PP00  �����;%"/&6;5#/&4?635#"&?62+3546&=#32`OO3eOOe3
OO3eOOe3
OOe3OO
3eOOe3OO
3e����&:H6"&462"&4622+.'63*&4622#!"&=46;27'#"&=46;2z4&&4&�4&&4& &
B �\BB\B#0C��C0	!F!�(B
&@�&4&&4&&4&&4F& 
*!B\BB\bC00C
:#
 &�����%K"&4?62?64'&'&5&?66&'&'&?>'&"&'&4?6G,,D,~Y,&	
<C	jY,&	
<C	
,,D,-~,D,Y~,&
	;C<
�Y~,&
	;C<
	-~,D,����%#!"&5467454632632.K5��<T6*^B,J(8�$65KT</JB^,$8(����%%#!"&?5#"&=46;2+3'&=#�(*��*(u

�

��0@,#II#��



�iN
��
����'/7%"/"&46327'#"&462762264&"264&"�		Ft8P88(!!(88P8tF		����	s(88P8!!8P88(s	F������#,!#!"&546;3;#!"&546;#532@
��

H!�
h
��

�y`
(

p
��!X
��

p
I
`������2&6?62&'&6?6?64'&"2?6"++,�"^!!!�@��		�(�3H��-~--�"""_!�?��		�*�K5��-����(#!"&5463!2264&"4/&+";25����6%%6%���>��`��%6%%6h����2#!"&5463������`����/"&=463!2#"&=463!2#"&=463!2#		�		�`		�		�`		�		<	(		(	�	(		(	�	(		(	���'7G2"&42"&42"&4%2#!"&=4632#!"&=4632#!"&=463((((((�		��		@		��		@		��		�((�((�((	 		 	@	 		 	�	 		 	�����*:JZt�7#"'&?63254+"/&?67#"=4;20%2#!"&=463%2#!"&=4632#!"&=463'"=4;5#"54?6;232#"=4>54#"/&763232#>	9�		��		@		��		@		��		�D		


'/		
		�	 		 	�	 		 	��	 		 	�@X�
	���1T%2#!"&=46;&'&54>;2#"'.+"3+"./&54?632;2654&�		� 		f!9"D C	+

B
W^H4D.%
	+


B�	 		 	"9!)

`3I!

	����/?"&=46;2+26=#"&=46;2+"&=2#!"&=463 		�		 /B/ 		�		 ^�^p		�`		�	 		 	�!//!�	 		 	�B^^B���	 		 	���2#!"&54635#75#5#75#��`�����������`��``�``�``�``���'+/?/?/?"/&47627'�    �5555E5555b		��	
U		l	
;W3V`   `555�555�
	��		U
	l		�V3W����'/7<%2+"&5#"&5#"&5463!232264&"264&"75'#p		08P8�8P8@,d�,((\((�d,`	 	(88((88(@0dlp((((�dp��!&+2#!"&546334&#5265#264&"5"75#`

��

@%%@�B//B/`%@@%�
��

@
��%�%�8P88Ph@%�@%W9!2"/&6
	��	
	��	`9	%!"&?62!��
	��	
`	��	'�Y/&4?6�	��	A��
	��	
'�Y546&	��	?
	��	
���2#!"&5463#!#��`�������`����
��3�732"/&6%+"&?62)�ww�w�wwiw
��3�732"/&6)�ww�ww
�4�%#"&?62�ww�ww�:6#!"&=4632>76".#&'&=463!2"��`!y
	v�z4	�	1}��X	
	Ue	Y(&[	����+7#"&=4;2>3#"'&?63264&#"32��0#a6g��g_G
	"	2BIggI+Jb��N'+�͑@		",g�g'!0���7%"/&4?'"/&4?627'"/&4?62762�|(Q		s		.		s		Q(}q�}(Q		s		.		s		Q(|q����D�2#"&?#".?>;2(�.w 
�* ����
�����5EU72+"&=4637#546;5#"&=46;2+32#5##52+"&=463!2+"&=463�

`

H0�(

�

(�0�0H

`

P

`

`
`

`
P0:@
`

`
@:000P
`

`

`

`
����B�-C%'."'0.#""'.&7>75462632#"&'&>3265@57	(74�\\���/!*	�

#+
'"+$
cz



zx�!/
		����/8#"&546;6232#"6"2643+"&546;7#532�h

QJQ
�!*�h
�

�r`
B�
P
  
H!y��

0
h
&`B��`�
 053+"/&46320#41&'&7264&#"26546`�
>	`dKJg,%�%,�		.B		/&&
 GigIB2+00+2�		B.		!/����U$"&462462"7#!"&=4672654&'527267?6/546?6=4&'jKKjK��6J��@0!.!:$00 
$�KjKKj��N5--1KQ!!R

.,, 
*,���BJ2#"&'.=46?6326='.?>326=&7>264&"� gIGg7I?
	9('8
?I73.B!$			P%qEc_DY9�	
	
{(8:'z



	�9X.=+q&%P			���	
!46;235+32#"&546;�����00�`00 ��p�  P�`��������+"&537#!".54767>54675462�4&��	��		H8%:!@%q

	
C,:V

,B&,C������'7"&=463!2+##3264&!"'&763!2�(8
�5KK5 8(�  &&�!	
H@8(�
KjK(8 �&4&�� 	����'3;GSo!54;46;546;23232#";2=432=4+"#"3547#";2=44+";25'3;2=32=4+54+"#"��@
X
p
X
�((�((t(@4((�((
,h
H

H
�� ((@((�TT`(((�����'/KSX%2+"&5#"&5#"&5463!232264&"754+54+"#";;2=32264&"75'#p		08P8�8P8@,d�,((�808808�((�d,`	 	(88((88(@0dlp((�088088�((�dp���
%I3546;2335+32#"&546;4&+54&+"#";;26=3265` � ��@ 	0	 	0		0	 	0	 `00���  P�`���	0		0	 	0		0	����/%#32+535##'53535'575#5#57335#532+3 ``�0u(s0C"0@@0"C0s(u0���PE*EP������".:2#!"&5463!254&+7626=4&"26=4&"p!/Q
��


@	07	�			W			`/!�'
$*

�

(с	�E	�		�		�		�����3#!"&5463!2#"#54&+";26=3;26=4&���`p 	�	 		 	�	 		p��`D	PP		�		PP		�	����+2#!"&546354+54+"#";;2=32���@\8\\8\���`�8\\8\\�a*?62"/&4&4?62"'�``���``ш``
��``�a+7"/&4?'&4?627"/&4?'&4?>2�``���``			��``��``����A�+7"/"/&4?62'62"/"&/&47��``��``			��``���``����A�)7'&4?62762""/&4?62762��``��``��``���``�a?62"/&4 �``�ш``
��a7"/&4?'&4?62�``���``���XA("/"/&4?62��``� �``���X@(7'&4?62762"��``�`�``���@�#2+32#!"&46;7#"&5463!�H

��

H��@���00@�� ������!%%2#!"&=46;;267!463!2!p	&�&	�
=��@�� 	&&	p��P�������2#!"&5463264&"������`�� ��@�2+"&5463264&"�c��`�� ���9%2+"&=46;2+"#2+"&=46;2+"��^B

&��^B

&���B^
0
&@��B^
0
&@���92+"&=46;26=#"&=463#2+"&=46;26=#"&=463�^B

&P�^B

&P��B^
0
&@��B^
0
&@����'/7"&4622"&462"&4 "&4622"&4$2"&42"&40(((((�((��((((B((��((�((�`((�((((�((((B((����2"&4�Α�Α��Α������)2"&4"264&"26464."'.2�Α�ΑU��	
#n#
	-���Α���**6����%2"&4"264&"264>'&"762�Α�ΑU��-�-#n��Α���66*����2"&4"26424+"36264&"�Α�Α������Α���  ��� �`-5=2#"&'##"&46354+54+"#";;2=32264&"6264&"�B^^BC\CB^^BX4444�""W""`^�^^�^�4444@""I""
@�'3?KWco{���)"&5463!254+";2754+";2754+";2754+";2754+";254+";2754+";2754+";2754+";254+";2%54+";2754+";2� ��\((`((`((`((`((��((`((`((`((��(( ��`(( ��((((((((((T((((((((T((((((���.4X.'76#"&#"+"&5&546623256%5'5&'&56765767556�	2	2�;?$i>4

"!Gh0�"(#M'##&>&#7.(!?&#%% *D��	)"^

�!
#�HF
�GH	DDGFFDDHFG������$%"/&4?'&4?62#!"&=463!2����w
��

0
������

 

������+'&76'/&?6/&?'&?6=�=�}	�

�	+		[[			+		[[		+	�

@��*t	�		�	.	PP	/	.	PP	.	�		����@�076&76&'/&4&4?61'��3N>!0#9T�x�mm�

S)F/,UZR
T
��

^^
����	�6.=#"&67�/� �
�/�`�%-���7%2++"&53#"&5#"&=46;546;27#5376�

(
0
�s�
(

(
0
�s�;;`
0
(

�`

0
(

��`;;�����6>FN"&54>75.546267>767.5462$"264264&""264�
- 2
/B//B/9/B/��						�			0**	)!//!�*!//!*�	
 !///			��			7			�����/?%"&4?62?6/&?62/&?64&""'&4?620		-,~Y,-	(-*<-(		-,~Y,-	(-*<-��G�*	-,Y~,-		(-<*-�(	-,Y~,-		(-<*-����G��z�)12+"&=4>7>54&#"/.762"&4�Bn%%
H

,+?F:((:(�Z@ 1


"
![��)9))9����&735#"&=46;232+"&=462"&4p�6<**<*�0�00�*<**<����6"&46246;2+"&5�/B//Bh
^

B
1B//B/G

��


�S2+"&=46;5#"&54?6;2'2+32+"/+"&=46;7'#"&=46;2763�		`			
0	�		!NN!		CPPC		!NN!		CPP 	 		 	`	 		�`	0	pp	0	ss	0	pp	0	ss���S!2+"&=46;5#"&54?6;22+32+"/+"&=46;7'#"&=46;2763�		`			
0	�		!NN!		CPPC		!NN!		CPP	 		 	`	 		��	0	pp	0	ss	0	pp	0	ss�����%32#!"/&4762%37���`(���|PrD��(`(�(1}PC��@�K%2#"&#"".54654&#"&/054&54632>?03261
! $$#%54@p '#$#**")	2�#$##

0	M
2	20Ek��`�<6"&=4627232+"&=46;5.=46;26=463�P88P8@	WA8		�		8AW		B19T	`8(�(88(�(h	0Bc	"				"	iD(		*3NM80	������%F'&?6546326=46;22+"&=46;5.=7z	
��	
�8(,		L		�		8AW4/2


	�

	�-(8,�0		0*&�				"	iD),'"����
+!2#!"&54%#!"=46;54;2354;232�����X0(�(0��,$4444������8@6/&5#+"&=4675*.767&632347264&"��
(
�
)
	<!":
�			�t�

�!5

		L1-			���,4#"&=&/&6?#".54?>;>32264&"�D<b
	3	h1h'dH3 
�""�!2Hd'h
1
h	3
	c=C�""����"&462%2?64/764/&"gΑ�Α���ee�8�Α��V�ff�����2"&4'&"2?64�Α�Αj�ee���Α��V�ff�����6462"2?2?64/&"�Α��V�ff�YΑ�Αj�ee�����"&462764/&"'&"2��Α��V�ff�'Α�Α���ee�����B�BJ7"&?6+5#"=4;5.54632+>7#"&?6+"&'"264
DD#R044$9((7$440R#DD ���`DD'1�(
2(98'2
(�1'DDIWWI ����&2%2#!"&=46;5462+"&=4&#"54&"26���Y}Z
 
+*p""���f@ZY?

*+g�00����2"&4264&"62"&4264&"�Α�Α��ll�l�jKKjKf4&&4&��Α���l�ll��KjKKju&4&&4x�$"&46:"&4$2"&4H*<**<t<**<*��<**<*�<**<**<**<**<**<����2"&<62"462"B<**<**<**<**<**<*<**<t<**<*��<**<*����);2#!"&5463264&"265.'"3;265.'"33���,((�uS<U��~f����`��((Su#U<}�#�f����2"&4>4&/&7�Α�Αl���Α��k�����2#!"&5463!2=4#!"���,�����`��88����!"&5463!2'76/&'&���`��Fh `��b��Fh����*!"&5463!23?6/&7'&"?64���`��9�7g7 `��.�9�8	7��A�@&="'.54>3546463276#!"&546;2+!8�-?0	+-FJ/��
��y	3@�H
';(
O)*>&	H��Y`������>2"&2"&46.?67�GΑ�Αv	�B���Α��B�B����#!"&5463!2?6&+"���`��||�p��`�||����5463!2#!"&%'&;26`��d||�`���||����!2#!"&54676/&0`���||���`��||���B�E%#"&'#"&=4;&7#"&=4;>32'&#"32+32+32767	Mp!oH(>�
��
r&",VF@P,(#	
		 
��@�6%2#!"=4;5#"=4;54632'&#"32+354634��$O=7/			TT{`h(�(B7G#
$

@(3����*�A7+"&="'.?6;2654/.'&6;546;22'&+"�,-:$	 	0&"

B
g".A1	 	0&"

B
	�
T-!'0		0"	


4"1G0		0"	

	��@�4#32++"/&=46;267#"=4;&+"&=43!24I	;5L9�S�T'��)U(`(8F��5 (-(��n�:232+32++"=#"=4;5'#"=4;'&6;236?63_P:Xll8llX:PA77�� % \\ % �qH%#q����)27#32++"=#"=4;5#"=46;54;2'32654&#�\��;4444�@QQ�M$((#� (44( -�O�Qۖ)#"(��@�ENRZdh#32++"/#+"/#"=4;'#"=4;'&6;2376;2376;2327#32>?#;'&'#7#136?#4?FU*
9	+7*
9	)TF>0*
m	,
n
.0�x&Q��'Q (�		��		�( (Q		VV		VV		Q(�66/�  	66�  ����;#!"&546;#532�
�
��

Ƞ�
b8
��

�
z�b����)5>;#!"&546;54+";2=4+";254+";257#532�
�
��

�@������`�
b8
��

�
��LTz�b������5OR72"/&6;46;2%232+"&=4?#"&=4637+"/#+"&54?6;23'�PP0	 	 	=8		�	=8		�	G	;*4 ```0		��@	
F	 		
F	 	U	

	�e0������5OR"&?62++"&5232+"&=4?#"&=4637+"/#+"&54?6;23'PP0	 	`	=8		�	=8		�	G	;*4  ``��		0�	
F	 		
F	 	U	

	�e0�����%5EU%2+"&=463'2"/&6;46;2%2+"&=4632+"&=4632#!"&=4630		@		@PP0	 	0		�		�		�				�		 	 		 	@``0		��	 		 	�	 		 		 		 	�����%5EU%2+"&=463"&?62++"&5!2+"&=4632+"&=4632#!"&=4630		@		�PP0	 	p		�		�		�				�		 	 		 	``��		0	 		 	�	 		 		 		 	������5=S"&54?6;232+"&=46;56&/&767.7>264&"2"/&6;46;20	
0			`		
(>%


	$+
  �PP0	 	`	 		p	 		 	@�1'#2"
=&\``0		��������=S%6&/&767.7>264&"'"&54?6;232+"&=46;5'++"&5#"&?62J(>%


	$+
!	
0			`		�P0	 	0P�1'#2"
=&\�	 		p	 		 	@;`��		0`���D72+"&=463264&"32#+"'&#"&=47>767632h

P

X e#


*!0H#5�
�

�
�y?#.) �M,:$���F46;2+"&56264&""'&'.'&=463276;23+
P

P
(#H0$

#e �

�

2��:,
(+� 
).#?$����$2"&4++"&=#"&?>;732e6%%6%�8
 
80
%%
�%6%%6��h

h�����$2"&42++"&=#"&=46;7E6%%6%p

@

%%�%6%%6k�
�

�
������/72"&4/"/&?'&4?'&67627664&"�P88P8V

^!
d0/d
!^

^!d//d
!cKKjKK 8P88P/d
!^

^!d//d
!^

^!
d�KjKKjK����".5463276EvE�j/7�]>J@EuFj�^6^y*���	%3!#!"&7;2=4+"%2#!"&=463 �
��
�hh 
	� 	
 ��
��
0		0
�����?E%+"/#54+""'"&4?&=#"&546;5'&4623762322#4
7=	
6(33(6
	=7

8/	
6�6
	/8
��\B�
 <
	7 �� 7	
< 
;.
	77	
.;B..����!"&5463!26=4&���`�|| `��d||�����2"&44&"2�Α�ΑH/B//B��Α�ΈB//B/���-C%&/#"&'&54>32+3276'#"&54673267�A>� #�		y�9%�W5Ig=2B.*?>
!	��$!	 	 {7/:gI7Y'3.B7)����:%2+"=&=4?5&=4?54;27676265463t{eP1		71		78�		��		�Fb�dp�)
)
E3)
)
�MH����3<%#!3#5#"&="=435"=435463352#!226&#"Q//4E��	�(B+*7"    "7*+B(�	E5�4
#$#��%@((@%��#$#
p((@����%=2#!"&546322>36754&#!"".'&'3!265����
J(
��
(I	I

���`�5 

 	5		5�

����%9+#!"=#"=4?622#!"=4637335335332!54;��x��
�0
8@@@@@$�`$@XX��

�����#./+"&?&54767'&47%67"&57n���	8	0
�p�p�!'"U<

ss
	"U�,q%%q,
 �`DNe7#?%2#!54+54+"#";&'&767?6'&'6732%463!!"&57;2?3;26/&+"�&�

��@@r			





 ��
��
;		<		9	 	�&&!�
��
@x
	


		



##l
��
8		
����%5EU^n2#!"&546;254&+";26=4&+";2654&+";26=4&+";26=#"&=#'2+"&5463�

��

�
	.	�	 		 		 		 	�	 		 		 		 	0	��

 

 
��

�
	.	
�� 		 		� 		 		y 		 		� 		 		w@	0�@
��

@
����)5=IUa2!54;463!2;2=4+";2=4+"2=4+"354+"754+";2=4+";2=4+";2��@
P
��((((4(t(�(((((( �

�8�((l((�((�TT�((l((l((����)462"6+"&=#+"&5'&462376x*<**<�	_



_	
VfV
Z<**<*P
^��

pp

^
	WW	�����(3?62#"&#"#"&546&.'&>.676.7>.>�L\>&"LM"&>,�/-	�*,�-/	�C_&&_j4--
&A7 !-4
-!7A&7!���6/&=46?7575����������N�
hh
�HNN��P�B���!'+/37%//&=4?54?65'75'57'57'�dhhdad

d"UwfffUUfffVUUfff�	n
2442
n	$l	&&	lI$E�))&��K'O�''*FK'O�''*�����8U7/;2+".?'&6?67&"/&?6276/.?+/&?6326/&?6�	(3
44$6	3)	n|	$	"
j*(	n	(�-`PP`

"
�

Q!(0A"QI

--B
n�5+0PP0!,

���7APa2++"&=!+"&=&=47#"/&6;7>;2%!'.+":>54&"!264&#":�	
 
�
 
	< �"9���9
"N	
		06

  

60		*
& *22
�!	���19BJ%+"&=!+"&=&=46?>;546;232264&"7!'.+"264&"� 
 
�
 
 +
�
+��5
�
�#0$)

  

)%0#U" 

 "�]C�������/%++"&?5#"&?#"&?#"'&?>2++z
�		`		�
P	O
nn
O	F11Z[
uu
[����##".=4632"&= "&= ��]=g<�]=g<���G2G���G2w.+!.+!{g++g1og++g1����&BKO7.4326673#!"&546;&'6'.32767326'&7#532'6�3
O��
��

�&$>$

O�
%+�(6V
	��

�
�
�$/
76 &
>"	�
�������<E;#!"&546;"&'&+"&'&+";27673;2?6.#7#532�
�
��

�9
	

%
%		&
&O�
b8
��

�
�
es		s_
	�		cX		���b����4=;#!"&546;6&+"4'&+";2767;26/7#532�
�
��

�<#%%#<<#"#<��
b8
��

�
�ED
]^=!$^��b����"=72+57#532;#!"&546;4&+";26=:>�

��
7
�
��

�5(!Q�=�
��
��

�
��!,�9����"-#5323#!"&546;"2645'&'&��
b��
��

�j''�(	g((F�b0��

�
�
((�p(h((0����*.O#5322"&5467;#!"&546;3533526/&+535#535#535##3#3#y�
�		w
�
��

h @� 2
           W
���

�
��

�
     ��&W
            a����!/=F;#!"&546;54&#";67764'&7&7647#532�
�
��

�@$$!
		O
	
)@�
b8
��

�
�l�$8$8	;n
N	*u��b����4#532;#!"&546;4&54&+";26=65��
b�
�
��

�`7
p

p
7F�b
��

�
��7&

p

&7����3G`#5323#!"&546;7654/7654/&#"32032?454/0#"764/&#"327��
b��
��

�s((AA5>>�A((F�b0��

�
�
�$$==1��g=$$����
!'2"&4%&'264&"'677&'67'�Α�Α�?�P88P8 @m?�@��Α��@�8P88P�?�@m?����#46#"&'46762654&'&5 QiBrCg�iQ:Ll�lL:��VCrC�gV�b?LllL?b�����6/&=6&'.7�
H
}@
 ���j
��P4M
Q%�,����%7#"'.?>3264&#"+"&=46632/546;2��gXD2@LllLI53�	2Hcg$A

)'͒7(l�l23	�2E��3�

h ����K32+"&=46;5#32+"&=46;#"&=46;2+35#"&=46;2#� 		�		 � 		�		  		�		 � 		�		`��	 		 	��	 		 	@	 		 	��	 		 	 ����!++"&5#+"&=#"&46;2�	0	 	 	 	 B^^B�	� 	��		p��		p^�^	���#Gk%2#!+"&=#"&=46;546;2%2++"&=!"&=463!546;272++"&=#"&=46;546;2�		��	 	P		P	 	P		P	 	��		P	 	P		�	 	�		�	 	@	 				 			�	 				 			�	 				 			����%%2"&547'#"&46327&5462#"'6`(88P8f"(88("f8P88("ff�8P88(
@8P8@
(88P8@

@����5#!"&5463!2"'64'73264&"&#"327264&���`�DD!!.!D!!D!.!!p��`�))!.!!)!.!)!!.!���'/7?O"&4632762?2+"43&2"=&?6'&6/&6463264&#"26�4z�zzV-)4M0.	U	;	��&		(8		h4)-Vzz�z4<+					�&		8(		����%*"&462'7&''77'77'?6'7��Α��a?"'>KK>'#?&U%>>%U&�NN'Α�Α�:T6**6T:B4"MM"4\88\
���!-9EQ]iu�����>#"/&5417&0#"/&54+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2D��D
+W``W+`((`((`((`((`((��((`((`((`((��(( ��`((XD11D

E#
<##<
#E�(((((((((�(((((((�(((((���	3=A#546;246;#+"&=>%+"&=#532%2#546353�`	@	��
` 
`


�
`
 `		��	`	p@�00		w
��

,$;)%-9)G,,

��	w	00	�������#+#54622+#5.=#"&=4637#5462@@0		K5@5K		p@�``
�	 	 6\cc\6 	 	�``
@�&2>JV2#!"&546;54632=#72=4+"3!2=4+"3'2=4+"3!2=4+"372=4#!"3(
�(!
(
(��h�8�h�����
��!

����``((������,'& /&47>2"&4%'&"/&4762{"n��n"W��6%%6%"?�?"W�%"dd"Q99��%6%%6y"

66

"L����/?O_o2#!"&546354&+";26=4&+";2654&+";26=4&+";2654&+";2654&#!"3!26���P&&&&�&&&&�&&��&��`��M&&�&&{&&�&&{��ff������#/7'&?66754621%#".547>"&53z	
��	
�%=8H	�~��		�&�


	�

	p1


V:,C
��	
2�%����!2#!"&=46;76;2!+"&�		�`		x	r	�����	 		 	

�MS������82"&4654/.#"&546326?654'.#"32>�Α�Αm
#'("$
>R$C) 8��Α���"	0 !+#	R=)B&����:F2#".'#"&546326;2>54&#"3276#"&462654&#"j�JL
*,4Q9*- jNLllL6-
	=Jg��Q%$�|d?T91BVy
2JVl�l	(�Α��)) ���#?+'754"/&4?62763~�~-8  �8M
)�)
Ms~�~  8-`8PM
)�)
M�����,70#"&532762#"/&54>76�XF:@@
j UP.
@	'%?�J8@XC			
D:�a5	#8����#4?JU%"&""&#"#"&"#546;5335335332!526226226323"&546523"&546523"&54652�'/''(
'/'@@@@@�@''/''/'
'��
 
r
 
r
 
@      P�������`      @
%&
%&
%&�%2#!"54;2%6!57>��(5Z��W
U@(h����h�r����!�#%2/7+5463&'&676
=��	�
Y���<K`�wZ�S:
�A
�	���+�`\�	�2%2#!"&546;22/"//&?627'&63�		�0
	 	�	 `

I.D

II @	 	
P		�� 	v `		J.E		JJ @�2+"&463264&"264&+�PppP�PppP�KjKKj�5KK5111�p�pp�p�jKKjK�KjK7�7@�2+"&463264&"�PppP�PppP�jKKjK�p�pp�p��KjKKj������8<KQg2'.547'+#"&546327#"&54>;23'#"&=46;263&267#"&?&#"?#654&#"&/5KK54K)V
4E,5KL41
W	r3		@
N��+J(	Q-	!//�J�$�"2/!

-

-,M55JK48&�*6K64K0
			}J&vI/B/`x( 0`0"!/H
	G,���4<LT2+++"&=#+"&="&=#"&=46;5462264&"7!26=4&#!"264&"�


 
�
 



�����0

�
@
P
� 

  

 
�
P
0".."0��]
�

�
p�'?2#!"&5463&546?6'.676/&&546?6'.676/&��`�=@RA?S�>@RA@R��� �%"4./6%"4./6����94&++"&546;2+"&52+"&546;23265463�!p	0	
�8P	0	�	P8�
	0	p!	!��		�
P8�		0	��8P
		�!(	��B�3W%!!2#"&'&7#'.'4>7#"&=46;2!2'#54&+"#";;26=326=4&���
 ! �#
	FF

g
	�/t0		0		0		0		� #! !W

	-��(		(		(		(		��B�3F%!!2#"&'&7#'.'4>7#"&=46;2!2'#54+"#"?6&���
 ! �#
	FF

g
	�/y++DD� #! !W

	-��<<DD����<D%32#"'+".'#"&=463267'&6?546;546;232%7625�=,

X70�#7X

,>
F*
@
�
@
*��v
vK")

;!;

)"F
#�
(

(
�#
�X&&X����26:V%#!"&=467'&6;&5&54767>?6327/77475#"'0326762676�#��%
:@F

F@;
� 2�*2J,42.	�=#--$><!

1"		"1

!�x( �� (�������HWm2'"&547'+#"&7>767&+"&546;23'#"&=46;276;2+6267#"&?&#"%6&#"&/7>4KL64K-

TE,6KH2 8

8E�B		P&-

R ��(	Q)!//�0"1

22"+K46LK4;')-
*6M63H

( 		&*
 
7�K/B/L"2Q
R "0+���$@%"&54672654&'56&"&462"&=46;2732#+"&5pAO�ԖOA!3z�z=3M6%%6%�
&

@
v.(88(.	!!�%6%%6�
``
`

�����
)%3"/3727#'&"'&"#&6?62762@m��^9�$!w1:$f!$&n''n&�,��H		
%i(7		b�	
V(i%((''�� �!)32++"=#"=4;5.5462264&" ?1$$($$1?TxT�/B//B3N4($$(4N3<TTB//B/�� 2/"&46327'&63264&"tQTxTT<*#P�B//B/�OP#*<TTxTQ��/B//B�� �;C%32++"=#"=4;5.547&'&'&6;227676;2264&" ?1$$($$1?3&(
F
(&3�/B//B�3N4($$(4N3C+ /

/ +"B//B/����192/32++"=#"=4;5.546327'&63264&"tQ?1$$($$1?T<*#P�B//B/�OP#*3N((N3<TQ��/B//B����PX2/32++"=#"=4;5.547'/&?'&=4;276627'&63264&"�Q?1$$($$ 3			O	#T#P�B//B/�OP#*3N(((;"*#	O	Q��/B//B���!)W32++"=#"=4;5.5462264&"32++"=#"=4;5&'673264&#"&'632 ?1$$($$1?TxT�/B//B!$$($$"!//!"'2<T?3N4($$(4N3<TTB//B/�4($$(4/B/ T<3N���!N2"/"&46327'&63264&"%2"/#".'672654.#0"1677'&63T
1TxTT<*#0�B//B/�
1T<%?'!/B/%!0�O0#*<TTxT1��/B//BQO0#*<T";$!//!%!1��@�&HP2"/#"'673264&#"&'6327'&63232++"=#"=4;5.54264&"4
1T<2'"!//!"'2*#0�oxT?1$$($$1?oB//B/�O0#*<T /B/1@T<3N4($$(4N3<�/B//B��+32//"&54>327'&?67'&63264&"t			TxT'B'*#	�B//B/�O			#*<TT<'B'			��/B//B��!�,47"&47675#"&=46;5#"&?6+32+64&"�*TxT*(88('//B//�*xTTx*	(88(	�/B//B/0�P(0%&=#+"=#"&462354;2354664&"�		8(	*xTTx*	(�//B//�8(*TxT*(�/B//B/�� �+"=.5462264&" ?1(1?TxT�B//B/3N��N3<TT�/B//B0 P"264&2"&4�B//B/�xTTxT/B//BoTxTTx	���/7?OW_!"&=463!2&"264&"264!"&=463!2&"264&"264!"&=463!2&"264&"264�@

�
3NX�@

�
3NX�@

�
3N 
@

@
X�
@

@
X�
@

@
X����#+?%2++"&=#"&=46;546;2"&4622#!"&=46;27p		@	 	@		@	 	��jKKjK&7O��O7#L#�	 	@		@	 	@		@0KjKKjkO7**7O����#7%//&?'&?676"&4622#!"&=46;27N-..--..��jKKjK&7O��O7#L#�.--..-->KjKKjkO7**7O��+6"&462%2+"&=!+"&546;235463�B//B/.B	 	�	 		 	�	�/B//BQB.�		00		`		А	����'/##!"&?"&546;254&#!"3!26"264�N4?��?4NO1�2N0
��

0
�.!!.!`�'9229''99�p

p
6!.!!.����'7?G##!"&?"&546;254&+";26754&+";26"264$"264�N4?��?4NO1�2N�
h

h
�
h

h
((��((`�'9229''99�p

p

p

p
.(((( �`!%!!535#7232+#!"&=463!5 � �  

��` �@@�
�
�`�� �`!%!!535#7232+#!"&=463!5 � �  

�p�� �@@�
�
�`�� �`!%!!535#7232+#!"&=463#5 � �  

�� �@@�
�
�`�� �`!%!!535#7232+#!"&=463#5 � �  

��� �@@�
�
�`�� �`!!!535#7232+#!"&=463 � �  

� �@@�
�
���D�%#&/&546.j81
5W	w��Y	
�	�����H#"32+72#".'#"&=4632=#"=4;54".=4>32>32T$$T-.T$$T-.�0p(p1((0p(p1(���,8G32+"=!+"=4;#"=4;2!54;2+;2=4+"54++;2�(��((�(����@T
H�@��((@((���H
4��@�+]7+"=4;5#"=4;2!54;2+32+"=732+"=!+"=4;53;26=4&+5354;2+@44 44�4��4�
@

h4�4�44�4@�44H

@
H4����%"!"&5463!2+538
��

�
b
��
�
�

��7b�
���!2#!"&54633#!"&546;������0/��� �`0 �!/������47c%"&5054676762'3#"&505467>762'3'2#!"&=46;&'#"&=46;6232+KjK

<

�H��";#5K

<

ȐH		�`		�&�		�N�		�&p!//!<4&(59	��%/!<

(59	���	 		 	')	 	  	 	)������*02#2#!"&=463467.5"&=4634&"h

D55D

��

D5#7

=V=�

CkkC



Ck8O-

�@;UU;����*062#2#!"&=463467.5"&=463."65#h

D55D

��

D5#7


2<2
���

CkkC



Ck8O-

��$,,$""����*02#!"&=463467.5"&=463!2265#hD55D

��

D5#7

P
�V=��CkkC



Ck8O-



�U;;����*2#!"&=463467.5"&=463!2hD55D

��

D5#7

P
�CkkC



Ck8O-



���?2+"&=4/&=463254632354632354632346�

0�
p p
�t
d+B0�0/ ������82+"&/&>54>32354>323546323546�

�
}
!	 



@�q�!
,���ױ�W���.4635#"&46;5#"&46;5'.7>7>+"�  �в$�	
p�P	""(E
K@
� ��@�&54/&+"&=46;26?6&+"&=463!2�p�
%|

�!
N
� =G
%3	!

	��t���K+"&/&546324/&5463232545'&5463232?>32132?>32�D<"7l
=*&	38&	"
/��!/f9)(�}���		�{
������-159%+"/&>46235462354623462#37#37#3� ��
!	 """"�XX�`��!
,�((a`````������-$2+"./&6?'&>354623546234�" �@K%$E("�P�
p
	�$���   �`G2++"&=#"&=43+"/5#+"/#+"&76;236?6;2U6Ut
6		2		6A	+	+	A`+��+��
�6"UU6�(5 ����*%+5326"&462&'654+";26=3;26ۑΑ��+&jG		
,�8'Α�Α��O2Y
�

HS
����#'2+32#!"&=46;5#"&5463!P�		�`		������ 	 		 	 @�� ������+G!"=46;54;2354;232!2#!"&544+54+"#";;2=325��X0(�(0�L���H<(<<(< $4444$ ���<<(<<����+7!"=46;54;2354;232!2#!"&542=4+"3��X0(�(0�L���<� $4444$ ���((����+G!"=46;54;2354;232!2#!"&5476/&'&??6'��X0(�(0�L���
0			00			00			00			 $4444$ ���0			00			00			00			����+;!"=46;54;2354;232!2#!"&54'&'&?6��X0(�(0�L���Y	j.			R	�	 $4444$ ��`	j/	T�	���6#!"&546;276�
�0

p
���

�

�XD�� �	727"/2"&4724#"2546pxTTxT�&6(��!!�TxTTx6&(�����$9#!"&=46;546;23253+"&2#!"/&?6;53�+	�

�	 	�	�@	 	�

�	++	�@k,	
P
			�9pp		
P
	,,	  ��@�
4>?&576
�����	
�J
8��?
0�@�����
8����2+&=#"&5463�&&�}
`&&�&��&^T& &����'2"&454&+";26754&+";26�Α�Α�	0		0	p	0		0	��Α�η�		�		�		�		����2"&454&+";26�Α�ΑX	�		�	��Α�η�		�		����!)3#!"&535462#354&"264&"264&"``/!��!/`KjK��&4&�� ��!//! 5KK5  &&���@�*6BN%+#!"&/#"&=46;7>3'&>3254&"26754&"26'54&"26@

��

CkP�PkC
��p��
��

�mm��p

p

p

p

p

p
������CG+32++"&?#+"&?#"&?6;7#"&?6;76;2376;2327#�
OK
P
(b
)K
OK
P
(b
)K�c

�	(
V
	RV
	R	(
�	(
V
	RV
	R	���������-6"&462&"2642"&4264&"32+"&76�\BB\B\((�\BB\B\((h ��"	p�B\BB\^((�B\BB\^((��0
�
����G"264$2"&462"&46"264>."'&67673>'.56V�zz�z��Α�Α��pp�p�RHLH5	




	�z�zz���Α��Yp�pp�DM

/A.!!.A/����B#"/67'&/"&462&/&#".?5#"&=76;2|}~�?$$$ofB6

= ?��Ú
X<$$��'l�	
��P
_O		�7G7#76772+57#!"&5463!2'&+";2?3;2>74.+";26�		�/��`���9	$9	4	�-99.5�

1b_�� ��		T+�4����!3CS.676#"#'7232#"/&764'&?67/&764'&?6/&764'&?6a@-.?
@ 8  8 @�		_--
	%%	
&

;@��@
(
QZZQ
(�"V6�6
	-t-	7#X#
	B	��'/7?GOW_6"&4622"&42"&42"&42"&42"&42"&42"&42"&42"&42"&42"&4�%6%%6(6%%6%�6%%6%6%%6%��6%%6%�s%6%%6��s%6%%6��s%6%%6��S���8@H`d7"&5462"&54&"&2#"&4632654>54&""&542"&42"&4%"&54=.'.7>'7�/B/1�g?-FdFSmQ@
	Qf��"P"�!//!
�gI+	-?%&2FF2I�m�Do	�V�"P"������2At�&2#2#'&/&?6766766&#"32763&%.6767&'&>767'.7>7"'&63"&7>376"#32654&# !=+^C,:)
F
"(-+
%

	
p:)
F
"(	-+
	 !=+\C�

3

	!Y	!JZ9
	


A
4!JZ9

	


3

	!G�����8DQ7"&5462"&54&"&2#"&4632654>54&""&54%/&?6"/&?6�/B/1�g?-FdF�		W	W	��		�
		��!//!
�gI+	-?%&2FF2I�	W	W		��	�	�	������2?k46;5#"&546;5#"&546;5#"&746;'.>+"&7'&6767154/&'&6767'&6767'&676'&>[
>~��}�
	|PkI%		

�
={4	
N^
	_M
	g$Z
��.

#

0ZC	
cy
	zb
	�&����@�-E%&'#"/&'&767'&6?6632654&#"6"326591W+
��)w
}q<1W+
5(*Y��"P8*&�T+:
e	
��:��(fT+:
H
W�'38P	
=���� (/7W2&/76'&"&'&4757633#"&5:64&"3#&"264///#576;?�
	7�

P
"


b	
�`@
)			��`
				�
		
 	5[7	
TR;�	7�vI
!Z@�
			)�
@			

	&
R�7	K<���F#!"&547670>321&0#".'&'&2>767654'�`)||)B#G
G#	$FF$ Z		Z B3		32


2����'/D#32+32+#!"&5463!232&"26454&+"'#";26���@�4&&4&0'*
	�	
 @(@(0�0( &4&&4�"��@�+7CO2#!"&5463"26454&+"'#";26754+";2=4+";2=4+";2� �4&&4&0'*'
	�	
����������``&4&&4�""=HH����2"&4$"26427.#""'&#"�Α�ΑH44H4��94 ( 4��Α��14H44H��D!!����#72#!"&5463";264&#"26454&+"'#";26P��`		`		4&&4&0'*'
	�	
��`� 				�&4&&4�""��@�	+7?R2!5463!#!"&%;2=4+";2=4+";2=4+"&"264;26'.+"'#"��0@� `�������4&&4&�
�
"*��p0���HH�&4&&4�
�����3C#0#"&54754622654.'54&"37"&5475462� K55J 8P8`!/(%A%6%  `�%05KL50$�(88�h/!			��
		%P%%%�

������"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%�

�0%05KL50$�(88(��			��
		%/�����"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%i

i0%05KL50$�(88(��			��
		%/�����"C7"&54754627#0#"&54754624.'54&";26�%6%    K55J 8P8(%!/@%%%)

)0%05KL50$�(88(��			��
		%/�����;6"&4627#0#"&54754624.'54&";26�%6%%6E K55J 8P8(%!/[6%%6%%05KL50$�(88(��			��
		%/���'/7?GOW_gow�$2"&462"&4"&462"&462&2"&46"&462462"&2"&42"&462"&42"&42"&42"&42"&462"&47"/&4?.547'&#"#+"&54632632762)			)			7			)			7			�			@			 			i			)			7						7						I			&�

	 	I22
	�			i			7			)			7			)			 			@						)			7						7						I			��
.
$��		/4M
		���M75!+"&=!+"&=.%2#!"&=46;54632662"/&47&7'&" �
	 	�	 	
�		� 		)-#
i
@00))				))�				�)
i
#,	�����+QY"'.542''&546'&'&7654&2&767>54.#"'.542"&4J�u.W=9R0;)%5��F8%,!+6Ig*$9E�6%%6%)U,,U�
+>=UQ9A,
()95%+�]BlN.5, gH-NlB]%6%%6���2#!"&546354#!"��`������`�TT��`%2#!"&=463��``  ���!)+54&+5463!2#!"&5463!24+"30/!� ��� D������!/0��� 04	���/?O_o�+"&546;2++53232++53232++53232++53232%3#"=#"=4;5473#"=#"=4;5473#"=#"=4;5473#"=#"=4;54���`********�********��`�N0f0f0f00`0`0`0�������%/&/"/+"&="/&4?5/.?/&?'.?>7'&/&6?'&?6'&>?65'&4?6546;2762?>76/76�!?5

 	
6?!"F@@F"!?6	 	6?!
"F@@Fg

G$N5
(		(
6N$G

%%

G$N5
(		(
5N$G

%%����	�'"/&4?&67>�(0$X%�	3	�
$1��*�1$
�	3	�%X$0����*<+"&?.5476227>56227562.>32+"&7�% 

@

,,,y,"*9

8�_"&7�

�*"_�G;����#VLB&
�0

����&2#"'&?632676&+"&=466CrC�g_G
	(0?FaeEB0*�
$G�BsCg�@	(*bEGc,*
�$E����	!-E!#!"&26=4&"26=4&"26=4&"%2#!"&=46;76;2 ���				`				`				@		�`		x	r	P���		�		�		�		�		�		�	 		 	

����:&#"+"&7>3276+"&73232>76;2#"'&=46s1B:[
9�ZcH$
��׆*1B&D0	
9�ZcH$;-G8		WsE$�
y*-!9%		WsE$�
����"0%"&54675#"=4;2+7654&+";2�z�zeKx8,			"�((�VzzVMu"(("	$			3b������1%&=#"&=46;546+"&=46;2+";2��

����T(88(TT

T��`
`
`��8(�(8(
�
���1!#"=4;26=4&+"=4;2'&=#"&=46;546�TT

TT(88W��

�(
�
(8(�(8��`
`
`����$276+"&?&'&3276#"&46dG$
�*0BEeaF?0(	
G_g���E$�
*,cGEb*(	@�Α���08DL%#!"&5467&546;&546;2654'6323232$"2646&+"26&264&"�#*��*#*&!/	(8&*����<8<%O(**(#*&/!8(&*#[x  `��@�!)4%#!"&546;3%#!"&5463!24&"2!5'&'&���/!������((D`X�( �!/PD((`0pX�(�����
!(/&?62'6&?6?6&5#75�.	o		.(<�	o		��z\
�

�$$ @2.		o	.<(		o	��z 
�

�h0@ $�����&?'762#���r
�9�9(c���
r)(9�9�����	!'762&7>?'/&?62�9�9(�US�"r/7"�fw!v(9�9(TS�"7/r"�fv
����732"/&6;4;2�.VV.8fVV.��M�37/&4?6!2#�VV.�.VV.8M�3%546&=!"=43:VV���.VV.8
����#"&?62++"5X.VV.8VV������;%+"&?'+"&=467'&=46;27'&6;2/76�
p$kk$p
$kk$
p$kk$p
$kk$hp
$kk$
p$kk$p
$kk$
p$kk$����)#!"&546;46232&"26454+";2���P&4&P�H��P��`&&4d��M346&=#/&4?63zVV�VV�VV..VV.
����72"/&6;5#"&?62+�VV..VV.FVV�VV�����"&462#"?6&+54+"��Α�ΓGssG@'Α�Α�tsst����"&462'#54&6=32=4gΑ�Α�tsst8�Α�ΓGssG@����2"&43?6/&#"�Α�Α�tsst��Α�ΓGssG@����6462"75326/&;;2�Α�ΓGssG@YΑ�Α�tsst���4%2#!"&546;2+!54632/"/&4?'&63�	���		�@	X
$��$�	�`	 	��p	@
�$��$����##!"&5463!2#"?6=4&���`Xp �			� p��`$ �			� p
���+5463!546&=!"&2#!/&4?6
hPP��
�

��PP
0PP0�

0PP0����1%#!"&54674546326326&+54&+"#"7.K5��<T6*^B,J(8�A	0	Aj�$65KT</JB^,$8(ip		pj����1%#!"&546745463263226/&;;26=.K5��<T6*^B,J(8�jjA	0	�$65KT</JB^,$8(Njjp		p��@�#'#!7#3#3'!"'?3&�ZeE0E��E�PEee{G�C{e������� ����B������E�%"/&6;#"/&6;232:hh
@T8�
@8pp8
������E�++"&?6;#"&?62:
@
�8T@
hH��
8p��@�&2+"&=4&#"32#!"&=46;54i}Z
 
+*0����Y?P

P*+G��F@����.5462"&264&"�="
p�p
"=B//B/6#X$5"PppP"5$X#
�/B//B��`�0R232+"&=46;5.=46;26=463"&=462#";#";#";P	WA8		�		8AW		B19T	hP88P8UUUUUU	0Bc	"				"	iD(		*3NM80	�8(�(88(  (��@�#2+"&5463264&"74+";2�c�����`�� Y8����-27?DI%2+"=4;5#"/&54?6;2%2#!"&546334&#5265#264&"5"75#`@

��

@%%@�P88P8p%@@%�7
X�
��

@
��%�%�B\BB\b@%�@%������
(%67#"/&?6'&?667'&?6Py�p�
��	

a<0heC>Wh0�

�

	��$%2p������+2#!"&5463"26454&+"'#";26P���4&&4&0'*'
	�	
��`��&4&&4�""����� 76&7>.'/&4�4PL20#	.6"��

P	)B,,U2&
X
�����'.54>?62>7'�.=9*M@'	�Kc�l?sSC)C_�G
P�F%�lJ����#2#!"&5463264&"74#!"3!2�������H��`�� Y8����@�
&.BLT2#!"'&54%"32?4761.264&"6264&"%6.'&3654'73264&#"264&"��'	�D	' 		
			�C
=#	n	L


.��wNCCNwi		

���5
		�%�@�/!!$3#!"&=264&#5463!2"'4&#!"3!265�@���� �L
��

P
 �t(``(``8

�

���$"&4622#!"&=46;27<xTTxT5K�`K57#L#�TxTTxtK55K���+2#!"&5463'76/&'&??6��`LCC		(		BB		(		CC		(		BB		(	���`��BB		(		CC		(		BB		(		CC		(	������'?'&6;2//&+"&=4676c!p
c�c!p
cc
p!cbc
p!c����(7+"&=4676?'&6;2//&�]!p
]]!p]�]
p!]k]p!]���� &,%#"'67'&477&'6267&'%6'77&7p!HddH 66 H�H 67���T'FF'!D�D!&FF&!D�D"MM
CC�MM
BD����
 &+'6'676'7&'%'67%&'667�*N5i.9S?��N7M
<.�4b�.8S?^N7M
��.�4b�*N5�M7N,�.Fb4"N*E�.�?S,.Fb4"N*E�.�?S�M7N,����2"&4264&"6264&"264&"�Α�Αk`��Α��'Z����;Ss{�7'&546;5#"=4;54;232+3232+#65#"&=463+"&=4?546;27'&=4;2354;2354;2#7354&"+"&=4?546;2J"	99	"
		�		�		�			�	t6~/ 		w		�			�	�Z	  	Z		A??A		�
		
		�
;;
RP  		�
		
		��@�#37467.546;22?#5&2#!"&=463G*
@
&!ld8�8(		��		�5�"

=le<+C,,]	 		 	 ���#'+/37;?CGKOSW[_cgkosw{#53#7#53#'3##53#5#5#535#5353#5353#53353%3##53533#753'533#%3##5353'#5373#3#'#553%#53#@�@@�@�@@�@@�@�@��@�@@@@�@@@@��@�@�@��@@@@@@@�@@�@@@@@@�@@�@@�@�@@�@@�@@@@@��@@@@�@@@@�@@�@�@@@@@�@@�@@@�@@@@��@@@@@@�@@�@@�@�@@�@@�@@@@@��@@�@@@�@�@@@@@�@@�@����6!2#!"&=4632!'&546;5#"=4;54;232+�		��		p		J��J
�((0((	 		 	 		��
00((00����'/?7.=4?'&54;2!54>?>=#"'4"2642#!"&=463	�Oq��9
	(		��		�	�
	pP�

2���	 		 	��@�#37.546232+#6=#"&=4632#!"&=463i=V=		�		�		��		�/+==+/	 	P++P	 	�	 		 	���I"&4622#!"&=463!'&54?6323>546;22676;232676.!!.!x		��		�f��f

' '

P!.!!.��	 		 	��	



����#+;2!65'546;23546;23546354&"2#!"&=463p	@
��
@	8	0	P	0	X�		��		�	� VJJV �		00		00	��@

@�	 		 	����/S2+"&=#"=4;54632++"&546;2'2+"&=#+"&546;235463h

0

@
0

0
�

0
�
0

0
�
`
��

h0h
�0h



h�
�p

��

�

��
����
Q'&'&'&'>7'&'&'&??6/7?6/7?6/76/&�
�63�4
�63�g��gf�45��[45��o��o�T����#-8B73+"+"=4&+"&%#.54622654''4''32674''326`�

(

@$�-5z�z�H
@ 


�5,&]7Vzz�/

M�<62"'67"&5�Ԗ�Ԗ7��7�Ԗ�P88P8((n(88(����#5%/6?6&67>32"&54>'7>76W
�65_<Q	"..C.�
�";V"�
�m($*
 pJ�/B//!A
�+m7+�	���!!�@����	�
'%&'762&/"/&4?'.72"&4�0q"�8?�?/�)$Y5g#	>P88P8� /�8??/��$g5Y#Q"�8P88P������
(2@7.'>7'&67&'.'667&'>7#"&'6#0#6&�-V!	`D$>_GE#�707%0344�LS)(F�>/Ov�]&K
�0K*,-'�p4/Gr 2Oc?Q�&�6�'2�U(
1)+*WR"/�D_5E�������:BJRZbjr2+"/&>5462;2=462;2=462;2=4264&"6264&"264&"6264&"264&"264&"6264&"��}
!	�							I							I			)			)			P
�q�!
!�

��

��

�H
��			W			�			W			)			I			w			 �`	'/746;#"&52+!&"264"264&"264"264&``&@&&`��Fn &��&&�&@��@���RnR���	0#532'#617>3!#!"&5����3c�`�
!������@�)>%2+"&=46;75%"&=46;7532#2+"&=46;750		�		P  ��		P  P		�		�		P  �	�		�	``@	�	``	�	@	�		�	``���92#!"&546;546;2'3554+54+"#";;2=32��`P��� 808808@�� 00   �088088����
"&5462654'�Ukk�kj,T6``�M�:^vv^:���5*8ii8*��G�%/%#"/&'"&=46326763254&"7'&#"+'$<"�B\BB.-@
$<"��(#RA�']1�
�.BB.�.B>,!1�pp-:]	)����-2#!"&546;462&"2646/&'&7P��P&4&6a			j.			R	���`&&�	j/	T����%-5AMY2#!"&546;462264&"6264&"6264&"6"26454+";2=4+";2=4+";2P��P&4&��h���������`&&��RR���hh����3;CK[$"&462&"&462'&67676563267'&'#5&$"264&"264&"&4622#!"&=463�			�H44H4��7VJ<E /

27�81
7n�			�		��		�			G4H44H�	
 #
	[[n			�	 		 	������<AGM>7.'&6;2!676;23&'67+"'&'!+"&67#7!36!&'# B--B 
 8 

*M1,"
 *9
 �� 
�$����	��
�./DIID/

(?9@$Z8		h����B�5=%'&>?7'76&'.'&7#"&=46;276264&"&5>!=!=<���D-+,\Y		pd-���((��cc�5)G,8,7#	 	��$G�((����B7"&546;7532#2+"&547#"&547#"&5#"&=46;2�		�00�		 		S(�(S	0		`	�		�  �	�	@	 				p	 		������6#532;#!"&546;4+54+"#";;2=325y�
7
�
��

�@808808W
��
��

�
��88088����/8;#!"&=32?3264&+'&"'&+"=4;546;#532 
�
��
F#
9Z		F#
9�8
ș�
8
��

�Fr,		Fr(�
i
���@�	
)346;#"&5!%;;2=32=4+54+"#"%2+00�@�808808P0p�@0��@�088088������@�%1=Ieq}2#!"&546;546;254+";2=4+";254+";2=4+";2754+54+"#";;2=3254+";2=4+";2 
	��	
�
�
�((((�((((�((((`
��		p
@

@��((�((t((�((���((�((���#2"&454+"#54+";2=3;2�Ԗ�Ԗp0`00`0��Ԗ����XX�XX��@�.82#!"&546;35"26426'.+"'#"3#546;2� ��F4&&4&
"*
��
@
���```�&4&&4�


�``
����9E2#!"&546;462&"26454+54+"#";;2=32=4+";2P��P&4&6H808808�����`&&��088088�����8<@7"&=46;7532##32#!"&=46;5#"&=463!25#!5#�		p@@p		�00		��		00		`		������	�	�  �	�	�@	 		 	@	 		 	@@@@@��D�'2"&=454&"7.7>/&76B\BB\B�(��/vT"�S	#�/�B.�.BB.�.�pp�#	Sv/7Tv/�"����!15!#!"&=32=4+532=4+532=4#72#!"&=463 @
�
xxxxx�

��

@��

@@@�
0

0
����52#!"&=463!#!"&7;;2=32=4+54+"#"h

��

@
�
@808808�
0

0
� `��
�088088����#?G%2+"&=!+"&546;235463'"=4;276232+'"/"&462.B	 	�	 		 	�	��2f		z2L4&&4&�B.�		00		`		�	�(c		7		,c		7�&4&&4����IQY^%2+"&5#"&=32=4+"=4;2=4+"=4;2=4#!"=4;5463!232264&"264&"75'#p		08P8�8P8�������8,d�,((\((�d,`	 	(88((88(�00dlp((((�dp����#37NZ%2+"=43+"=4&'&=4;22#!"&=4635#+"=4'&=4;22+"=43x0).0$0p		��`�0$<0X0`��	W1&B%>>��	�	@p@@B9!,*AB>,��������>7//&?'&??6/7?6'7//&?67'&?6�@��&@BC87-8�-I"�"9-A��CB@&87.8�-J"�"8-������$.2#!"&562#".'463/&76.76dx[	��	/	[<7*T	#�/F�/vT	#M::c:M$1kTv/�#F�#	Tv/�����(#"&4?57?6/7?6/7?6/7>�#�dYY-22-22-23.M�!R�YYe.32.32.32.������/#"'&6?'&?67'�"�+/�"FO�"�$ R�"�EO�����';?"=4;2+"&=3352#!"&=463"=4;2+"&=335H�/B/0@�		��		X�/B/0@�00�!//!�``��	 		 	�00�!//!�``����#A%2#!"=432#!"=43%2#!"5743%+"=4&#!"+"547%62���p��p���P��P`00`00�00� ���

�W q���!22#!"&546;2654'"&462'"2654'76.�&&��&&q�qd�^^�^�""�&��&&@&-3OqqO3-�^�^^�:O����3}62"&4"&4622#!"&=4632#!"&=46;!'54+532=4+54+"#";#";#";#"26=3264&+532=4+532�			�			�		��		`		��		0`�hhhh��hh@(@(@hh�@						�	 		 	�@	 		 	`���    ((  ������"-%2?/.=32?7/76!6/.7��
��
�@@��\����\��'�66�'kkp8� 

 �8�����$,2#"'#"&'&>7&54264&"264&"264&"�Ԗ�j83AL9s���z�z319JVv������$747#"'#"&767&'&?6632@	E&(83AL,9:
��	

iI`j�9��
3
4+9�

�

	R5zVH:��974&+463!2#"!%2+"&=!+"&=&546;2!5463�& 8(@(8 &���& 	@	��	@	 & 
�
�&(88(&@`&$y				y$&
``
���Fh$"&462'+"&;26=>54&/&546;2?6&'&'54&+"2#!"&=46;#"3!2=4+67V�zz�z�"?
&
	
">
'

�

�@

 +?

l

@, z�zz��$!




$!



��
`

`
''�����	)1&'67673+#&'&6?&'&54762546264&" N5 
,pp ^BMA
k.�U}N/			;1%
E8K@�B^8H$Qh=7	
EX<!/`			��A�%%#!"&=46;76;2+";2?625���		7/ *�N		v]	x
	y	`	&		J��A�8%'&6767>"#!"&=46;76;2+";2?62m=<m���		7/ *�N		v]	�rHHrH
	y	`	&		J��A�Eo.'&67546;2'&+"+"&=&'&5474?6;254'#!"&=46;7>;2+";2?62 

	$	6
 
	$	����		7/
,�
N		v]	0%			%		�

y	`	&
		J����"E7+"'&/&=4622?6/&>$2+"&=4?>2?54�9	�i
Z
&�
i�	9&

Z�M"+p		�
�

�l
	3�
�
�		p+"M
3	
l�
������%@2+++&/&6?54?26=%54&+"&=4?6;76�


&�gPPA*<*,P!�"!gg
0
@
&<�.0$'z**8%.!X~	
<�����5++"&=47'#"&7>7#6;5#462#327#4'
	�		�
�	
.C)>t0pQ^Qp0t>?X
��		
��
$A,Dl��RnnR��lDT������en"&462"&462#"/?#"#.?6?'#&/&/"#"&/&?676546;2?676.7�((d((N)
C
	


+3�3+



C$
	�	
#��)`((((�pE.d L]
\1G
!!
G1\]L P 
'"
`		`
"'
 �.E
����@�CKZ%2++"&=#+"&=.5#"&7>32+";>;26;264&"'"4&54621&#0		1
	@	�	@	("
+X:�, 
i			�8P8�	�	
Q		00		Q'0&	7I"L@			�(88(������)?/.%'.4>?6762'67&"uO[D	�	E
�
,
"k
,"O4!Z!�Xf#	II@&W;���&.;C%2#!673264&+"&46;&5462#"3"2642.54264&"�(88(���

`(88(--8P80`

m�xP80 5S�8P8!8P8@ (88(P�8(P&V(H���2+"&="&5%3&'>@]�	 	]��@tU+)2;`�]�		��]@V�	=/*���#'2#!+"&5#"&=46;546;25!�		��	 	0		0	 	 @�	 	��		p	 	0		0��������"/<62"4&"276'.#"?62&276&"�Α��7�

%
&�-�-

#nYΑ�Α						o66*����!2"&42#!"&462&264&"�4&&4&�		�p]����C�P88P8&4&&4�	 	����]^B@8P88P������)17'&>?7'72&!#"&'/&7%46264&"21M>M2�LB.-A�w
Z�((H�\]�:~�p.B?-l.^D
�@((����)19?G%+"&547##"'#"&5463!232264&"264&"%3'&#264&"m	/B/�/!((!/
�
&��0\+�V	!//!!/  /!P

`��0+�������&/'&?632576%5#!"&z

���%	

N� n"��n
��

	�!

	=��K�
���
����%�2+"546;5.?4>;2��(4@�	@4uW7��7Wu������!'&?6>323!"&=46z
��	

�M2<T!�0���O


�

	i/=T<0&3�
7O����.6RZb7"&=46;>3232+"&'7;26=4&+"/?+54&+"#"&=46722"&4&2#54@		P0.%			P`P8(0(8�H$$$$�3EP
�
PE30p			W	 �	`	+5$	`	+55+X(88(Y$$$�L3
@

@
3L`					00����+$"&4622#!"&=46;27%/&?676jKKjK&7O��O7#L#T	�	Q			-i	�KjKKjkO7**7O��	R			-h	����+3$2"&454+54+";2'!"&=46;2732&"&462�xTTxT�
&


<
�(#��O7#L#
+jKKjK�TxTTxB
6

L
,L*7O&HKjKKj����;CKv%/'&=&''&'&?&7'&767667547676264&"&"&462#!"&=46;2732332?b
!!

!!
�((�jKKjKI��O7#L#


	K    0((tKjKKj��
*7O

'����$/$"&4622!"&=46;277&7%'?62jKKjK&;)N��O7#L#>�G�=*H%�KjKKjk.M=
*7O��G��*H&����#76"&4622#!"&=46;27$"&4622+46=4'6;27�\BB\B#0C��C0	!F!P88P80.B�(*�B\BB\bC00C 8P88PXB.'9+����:%#!"&=467&4?6"&547'+"&?&5475?6K��K6_���`KjKB*M6

6M_P..5KK55
>	>
;����3;C$"&462!"&=46;2730%2+"&=46;5462264&"754&"jKKjK 	��O7#L# 

�

 /B/]@�KjKKj��*7O
�

�
P!//!P�}P

P����+%2+"&=463"&4622#!"&=46;27p		�		�jKKjK&7O��O7#L#�	 		 	0KjKKjkO7**7O����%-%#!"&=467'47&52>32#"&'7"34&#E4G��G4e�++1#5KK5,Cg
�
�L4**4Lf�33(KjK5)`

����7%'.54?6>7'&"&462#!"&=46;273230n$"5Ps!;`�jKKjK 7,	
��O7#L#�$@/&sN-�N:&KjKKjsDm#*7O������!'&?6>324>7!"&5z
��	

�#8!5K0&��3��


�

	r 6K5)B
� 9%�����+@%"/&=46;22>4.#"'".54632#!"&=46;2732w	
\		[O\
�#;"K5#;"KK:��O7#L#S		]		[O
E
X";#5K";#5Ko(:*7O����$"&462#!"&=4677'3jKKjK 5K��K50  `  �KjKKjlN5**5N��88�����;CKb��%/'&=&''&'&?&7'&767667547676264&"$"&462"&5462"'&#""#"&=46;323630#3273'#"&=46;2b
!!

!!
�((��4&&4&�.BA]B	

f�D/	!##
�(B
&@k    0((t&4&&4FB..BB."�


0C '	�:#
 &������*BE[^!2+"&5&'&/&6?&5463276%#"&505467>762'3'1"&50546767623'		�	�
�/!.v
�  ";#5K


<
SȐH��
KjK

<f�H	 		W0+!/(',!�ِ%/!<�
�j(59	!//!<4&��������+>AWZ46;&/.?>632/+"&5'054676762"&73'0546767621"&73'`	� �
v.!/�
�	�	`

<
SKjK8�H

<

KjK8�H	'!,'(/!+0��		�	96(�!//1���	95(&4<!//1����;?%2#!"&=463264&"";#";#";!'#"&=463!3'#�%
��
%sH���ri�	g��QQF@% 

 %`�@@@`�@����@�"6#.5476'&'"&546
�OM{O�
����'	l	//	��	'R	����$9Kil"'&476;2#'+"'&476;2%+".7>&'&>;22+"&764'&63&/#/.7&54>23'�"		_		#
#		#		#y"		R�1�1�"p`06
,
�4]+	9|9	9|9	)[6@6
,
d��
vv
:�t����)%/6?6&67>3%'7>76W
�65_<Q�	�";V"�
�m)$*
 pJ�
	�+m6+�	����
!#463!2#2#!"&=463!53`@�@P		��		����x��`��	 		 	@@������472+"&54632276&"&4622+&'3533!&#5463�/A�A/(P88P8P�	L�@��!`B//B 8P88P��&@@ 2.����-7@%#54&"#54?5#"&=46;546;232+46?#"&5%+5�`%6%`p0		0	 	0		0��mp	m	p�	�`%%`�	D3	 	0		0	 	3�	/�	�d	����	(085 7"&5"&46232>7"&5%567$2"&4&'67==q�q��qq�q�h:&H>q�q�?!#���pp�p�0n37++++&&@&4&&4�4&&)?+	�/B//B	"%+����2"&44635"264&"62"&4�Α�ΑX^BOq�P88P8S��Α��gB^ qO`8P88PH����)12/"#"+/#&54754632264&" (8`M=),'&,ayt/!'J�%PAepxhx=	%!/ H����;!2#!"&=4632#"'!'#"&4626?&5462?&54		�`		�(H��H(HR(RH	 		 	@(��(

+��+

����(08@HP2+"&=7>'264&"'"/&4?62264&"264&"6264&"6264&"264&"P��	
�(��(����.�1��(��(���rr�����'/72#!"&5463264&"6264&"264&"264&"6264&"�%%��%%3ss�%��%%@%���ss�����'/2#!"&5463264&"6264&"264&"6264&"�%%��%%3��%��%%@%���������2#!"&5463264&"�%%��%%��%��%%@%�����'/7?2#!"&5463264&"6264&"6264&"264&"6264&"6264&"�%%��%%3��%��%%@%��MM�MM����'2#!"&5463264&"264&"264&"�%%��%%3ss�%��%%@%�ss����2#!"&5463264&"264&"�%%��%%3��%��%%@%������62"&46"&4622#!"&=463�6%%6%[6%%6%�

��

`%6%%6�%6%%6U
 

 
����!!2#!"&=46;463!2&264&"p		��		p m	 		 	��s�����"*!2+#5326!"&=46;467264&"p		�`p���		P
�	 	�@����!	 	m�0�P%2#!"&=463%2#!"&=463�

��

�

��

�
 

 
�
 

 
���"33&'"&476&&67>7>�'
!�b'�bGE:B�)!.,_Q�'g9,'1B�5t*"-,!����@�9A32+'6.'&"?632#!"&54>7>2264&"�:)
�b6
	Zw	F#
 #& #O
	��&5HX0,:,S_#Vi
	~,
	B0
	%1]L<%%%C���@D!2#!"&=463'.=4&+!46;23226=.='&4?625#P		��		�/!%��&�&$4&��	 		 	U� +,p`&&�4$ 

�>&�����@�CP]%+"&/#+"&=4?>/&6323632'&'&&/&6?67&#";26%5&#";26>C0%.B$B.%0C-
C$'));7J7;))'$C
��##%$%6$%##%�F/C=,'',=C/F�&%
	��	
%&��)

%%

)������%&/&6?'.?>n��	��
	�"	�	ff
	����(.?>&/&6?2#!"&=4637

.��

��

�p

T
xx
D�
0

0
������&,>%"/&6;235#"&=463!2+2#'3.#!"&=463!260
V� 	(+а		�		�]�
�}#4�!#��		F
@
s@l:@	 		 	@�]
�|4#��	 	 �`)2#"'#"&4632627&#"!2>54&#"�FccFQFFQFccFQFF�////!+L+///`^�^OO^�^OO�@@&
&@@����@�4@D%"#"/#"+"&=#"'+"&=.54>76;2264&#"5@
JLL				,4$0	TFCP
.Ew
	h��1	;		16		JY4)D&
0.=K	
�c	����%'%&=467%6m
	��3	�Z
	�"	�	f����&7&=47%6'2#!"&=4637.


��

D

�p

�xDD
B
0

0
�� $H!5>4&'5463!25#35#35#5!#54&"#54&"#54&"#54&"���
@
�`@�@�@�`�@		�		�		�		=	cc#

��������``







������5U'&?65462#";#";#36=46;22+"&=46;5.=7z	
��	
�8P8UUUUU),		L		�		8AW4
<)2


	�

	�-(88(   0		0*&�				"	iD)(9'"����&,4:@#"'&#"#"'&54632326322>7&.#6264&"575&'m	+1>�>?5
+1>�>?��$"%�B//B/` ���	
>=
>d=��$8P88PT:�1
#����&#"'&#"#"'&5463232632264&"m	+1>�>?5
+1>�>?��B//B/���	
>=
>��8P88P����	%1=G1!#!"&%;26=4&+";2=4+"%3!2=4#!";2=4+"2!5463�
��
�	`		`	pp��0����0	��	@��
� 		 		Xh@	00	����KWco2#!"&54632>54&/&546;2?6'&'54+"+"'&;25754+";2754+";2=4#!"3!2`

��

�	-	-	�pp�PP���
��

�
��	



 h����3%#32+/&?#"&=46;7#"&=463!7632�bK�

�S	

37

�K�

R


4
�`
 
j		
C
 
`
 
j		
C
 
�����%-56+".7>264&"6264&"6264&"264&"�P�U&P&(/hP)
n/3���=N&@";*P}CJm��m-S����"*2#!"&5463264&+";26=72+5����(88(`		 	0

0���`��8P8	�		0�@����"&462"&467"/&4762�%6%%6%�%%6%%F

��





%%%6%%�%6%%6%�

��





����$4%2+"&=4633#"'#"&=46;2%2+"&=463�

�

@��@$I`

�
�

�

�
�

�
  @0p �
�

�

�
����%1=I6/"/"/&54676276254+";2=4+";2=4+";2f&6
66
6&&6
66
6�������	
� 
	------	
�
	-----��hh����	!+/3=AK73#"&=46%#!"&546;5462324&"326#37#374&"326#37+532   

&��&/!pp!/��"@@`@@h"@@�
  
�
�
0��&&!/@

@/q"o   �"o ��
�������7&/&6??6/7?6/7?6/7?6/7?6/76|�PE<
<87<<77<
;E���'ef/0ff/0ff'���#G7&546;2#";#";#"32#!"'73;2=3;2=3;2=��
`
88888x

�@�)@@�)��

 @@@
`
�888888@@@72#!"&=46;;2=3;2=3;2=3;2=3;2= 

�

0@@@@@
�

�
XXXXXXXXXX���/73+"&546;2#";#";#";#"�X
�

�
XXXXXXX @

�

@@@@����	/7A546;#"&52+"=4;27#54&+"#4?62264&"%2+
@P	h0��	`	��3B//B/p
	P�
��	@@(@
���		�u
k�/B//B
��	@���	#.'7562"/&47�@`>SS�>+u5�@�SS>�+>u5����!4"&46;46;#"%2'&/52>76#"'.#57676�%% �%  ,IfHM-4#-:+0�MH2N/80+:-#3 %6%���6%��2.&B

�	 B&, 	�
���*2:2+54+"#54+"#"&?6'.54264&"264&"�Ԗ*	N@N		,2�4&&4&�4&&4&��]"A6B8888B Z4]�&4&&4&&4&&4���	/J7546;#"&2"&427735654&#"32+'2+"'.#".'46;2`	`v	6Ԗ�Ԗ=2��$q| 3$qO=2|�		#,#�@	`	7�Ԗ���$2=Oq�  o2=Oq$|	@	���t�3#"'"'"'#"'.?63!22767#!".=327!5Z&/,XX-/&A	�				
�@					
�I(Z!!!!!!Z(h���
		�dd������
%%53#!"&53%#!"&?63!23+"&@@
�
@�
��U	�	%@	 	@��

��""����		���/"&=463!2#2#!"&=4632#!"&=463		�		@		�`		`		�`		@	@		@	P	@		@	�	@		@	�����7'7'772"&464/76/&'7?6/76/&'&'76/&'&'76/&'&?'&?'&??6/7??6/7??6/76/&'77'7�---�-------jԖ�Ԗ�.""--"!-.""--"!-�---�---D---�---q�Ԗ�Ԓ-"!-.""--"!-.""-3---���+/M%#54&+"#54&+"#54?6;546;232'5#53#!"&=3;26=3;26�	�	 	�	 	�	.	
3�3
	����
�@
�	 	�	 	�	
S				S
	.	PP		@@�`

`				������%/&#!"&=4&&/&6?267w9
9
�
99�?L?`
r		�

�		r
`��C�:I"&462/&/&/&/&?.?67>327"&4?6�((.		-
<"	#8	�(	;
	2
`((�E2Y


JB"<	 	*"�4
,"	<	
2	���$2#!"&5463!2#!"3264&"��s%%p	��		C@�%@%			�����$6O2"&42654':12764./&>'&"67627>'.3232654'�Α�Α�P
�b FbP
��Α��W


	�&&�

	��@�"2!2+"&=4&"+"&=46;!2#!"&=4630		�	8P8	�				��			 		�(88(�		 	`���	 		 		����	#:BJ%6?#&''#>#6&'37.'#!"&5463!2"2645!"3>-''-V
."'--'L
�

��)77)F�jKKjK ��
�1) )#*)1�1))*#�	4
	7)@)7&KjKKj��@������,x�7327/"&?#'&/32767672>367'&"&'.'&'.'&764'&7>76767676276&2654.#"a4%4	
.
	!
	4%4	
J
		
	

	

�7N7+'U
�&p
Y&�



	
	

	�P88(,����-2#!"/&4?63'76/&'&??6@%%���		�>>>>>>>>�%�%�

��>>>>>>>>����'7M]2+"&=463#>7##"&46322+"&=4632#"&'##&'6=3>2+"&=463p

`

@629*P
%% %

`

%% P*926U 

`

�
`

`
8H'?0O	
%6%�
`

`
%6%O0?'H��
`

`
����1;#"'&54675#"&=46;2+7'&?6/'!&/5#.�&4,		�		'	4	+�%%`@!,34Y�	 
	 
�'	4	+.53,!�''
������	#2!54635!+"&=#"&"264`
��
 �%@%6%@%��
��
��  %@%%@%M���4@HR\d2+++"&=#+"&="&=#"&=46;5462%;2=4+"264&"75#";26=4&+264&"�


 
�
 



�������=�p

�p

ps@
P
� 

  

 
�
P
0".."08��]�
`

`
�������[%#"##"'&'+"=#"'&767"#"'&4767.'4546320454>762>7632�		<I		%((%		I<		 ,+	"S!!	
!S"+-X	@@		!V#

)5p(
.0F!)
	#V!	�����'"/&4?62762'&?62762"����(o���p-
7�
-����(p��p-7�-�����@�-2+"546;5'&63!22#"'73264&#"#>(�8�n��<TT<(#$(88(,
4J}��}�TxT$	8P8+5�)!4675#"&=46;2+2#!"&=463 Rn�@nR		`		�		� 		=~TT~				��	 		 	�����%-5=%/././&54?>?6264&"6264&"264&"�$
E'*M+7
$!E'*M*7
��3��*'E
$
7+L
E"$7+��������#+3;%/././&54?>?63264&"6264&"264&"�#
E'*M+7
$!E&*J5J��3��*&E
$
7+L
E"$4J5Jq�����1%2++"&5#5323#"&5#"&=46;546;2�

(
0
��
���
(

(
0
`
0
(

H`
�H��`

0
(
 �`'3?K[g2#!"&546354+";2';2=4+";2=4+";2=4+";2=4+"754&+";2654+";2`

��

���@@@(	�		�	��`
�


�H00		0		y����!)A2"&4>/7>.'&7264&"7'76.'&?>�Α�Α�
c4&&4&���Α��>
�&4&&4����@H%/67#"'".5'7&'&6?67&5462'0"0"132676&"264�767,RL\142G6G!	D8P84#03C#"9d
�h`:_~)= {:|"

v(88(Y$
Xt7/

����3N54&"54&"&'54&"&=4>3276322654.'#"/&54?&#"�QH4<<4H0>R-97n		�Vz'v		IVz8_F9�. f

wh

hw

f .�-

G
	�%
M
/&��@� *62"&=46/627.#"75&"26>54&'���8DF;<<"} @ &4&/&:!D8�K5�5KK5�5S,
&&

�

&&m&
,���!33#"&476&67>	-jQ�e:K? 9�2D[OV,�}n5119�."3W8.����)T];#!"&546;;2=4+";2=4+""'.'&"+";26?212?62;264&##532�
�
��

ȠPPPP�	+"		
/		I�
8
��

�
HH�	)6		2
			
�����'0;#!"&546;6&+54&+"#"27#532�
�
��

�LA	 	A`��
8
��

�
��P		P`R
���G�3#532&=#53546;#!"&546;;#"��
b�`@@��	�
��

�
��	F�b�`A@A|	�

�
�
�	���	373#"&=46%#532;#!"&=3?6/&#46;pp		��
7
�
��
�``�
Ƞ@	 	�
��
��

�A``A
����*6BR%#5%#532;#!"&546;;2=4+";2=4+"54+";254&+";265 ��
7
�
��

ȠPPPPPP	�		�	�@@�
��
��

�
HH���		`		����&2m#532;#!"&546;;2=4+";2=4+">54./&546;2?6'&'54+"+"'&;25y�
7
�
��

ȠPPPP�	-	-	W
��
��

�
HX��





����;CL;#!"&546;&'654&+";26=3??6/76/#5327#532�
�
��

�E!!%P			;�00		ɀ
b8
��

�
��!&%	�		0;7 		��b��A�7@EO7;#!"&546;;&'.'&"+";26??62#5327#%'762��
��

�
��	+"		��
b`�D�ED
(

�
�
/R	)6		2

(�b�D��D����'0;#!"&546;26/&";;26=7#532�
�
��

�A``A	 	��
8
��

�
��``P		P�
����&%"/&4?'&?67627'"/�		�Pu_VVR		[1�;;		;Q�		�uP_VVR		��0�;;		;R
��@�
"1%"&546?"/&4?'&?67627'"/@%6% 		�Pu_VVR		[1�;;		;Q�]#%%@		�uP_VVR		��0�;;		;R
�����
-A\n�62#"&76'47'.76'4&'".76'&6&'.76'&767'.76'.'".676#"&54'&676'&'.#&#0#"&=&762�+>		";I		
(�Lm

Q9		



'"&(X<9

GKl>60�
rn	ik
`<*MK	
GH  ML	
FI)<
#.><	
79?1:kJ55
897O
z,
	'
V		<9R
fHJ*�� @`$2#"&'&?'&6>264&#"G0a@((@a0>p&X	
W&p�		`)7337)<*B
nn
B*<�	
����'/$2"&4&2"&462"&4264&"24+"36264&"N�Α�ΑP*<**<���<**<*�ΑΑ��)<**<*�  h*<**<����'2"&4264&"6'.#"7626264&"�Α�Α��	
=("
	14)��Α��*�	"
	������32+"546;5'&63!2!!��8�8��J��0����**0����j2"&446;.'+";2;2/&+";232?676?6?6=4&+"/&6?63232?65�Α�Α�	Y;		Z
	/
 	
	
	��Α��G	:R				 	
	
����_n2"&4654/&+.#"/&54?632;26/&54?6;2?6/&?6//2?676767654'�Α�ΑJ		
C	
	
G 	
	
_
��Α���
			


		G&
	
			 
	
/d/*����8m2"&4762;2=4/&4?&#"32?6;26=4/&?63254/&=4+"+"/&+";237632;2?6�Α�Α�	3Su>
		�'

	��Α��_N
	&
uS-			f



	
����!%)-15=DK2"&45#375#"6264&"5#75#5#75#5#75#6264&"5#326=4&+�Α�Α�(

 5000p000p000`(

��Α��(
8(
��((8((8((8((8((8((h�(%
(����&2"&4"264&"2642676&"'&�Α�ΑU�`Y
	/�/
��Α���6'	
'����#22"&4%2767&'&"2767&'&"2676&"'&�Α�Α8�+`Y
	/�/
��Α��!"		!"		!"		!"	��6'	
'����+92"&4$"?626'&'"?626'.2676&"'&�Α�Α[&#
&
	
�#
&
	
`Y
	/�/	
��Α��)))��6'		'����-AP"&5476227"&4632&"?626'&'"?626'.2676&"'&�(**0	�Α�gJ>/L&#
&
	
�#
&
	
`Y
	/�/
@77<03g��Α)!.)))��6'	
'����':2"&4?6&'&'&2676&"'&%>'.'.7�Α�ΑZFi`Y
	/�/	
	��Α��F

��6'		'�	
F����#12"&46/764.?64/&2676&"'&�Α�ΑP!!�!!PPX`Y
	/�/	
��Α��-0((	((00��6'		'�����/<JZ"&767622"&47667'676&&>'?6&/.?6.>'&26�*��)!)y�G!)y�G�	Z

4]Z

4�"k,<@PH)��H)
G�y) G�y) ([
4
�

Z`"a$,k���� .G2"&4?6/76&/&"2676&"'&%6&/&"?6/�Α�Α_#
F`Y
	/�/	
'#
#��Α��	##	  ��6'		'�	  	##������6FVd72"&476"'&'&61"&'?676&>32&'&&"?626'."?626'&2676&"'&f)S)
Hr s�s 
�_?lE
K&#
&
	
�&#
&
	
`Y
	/�/	
�H))GR9DD9R]:e=b)))�6'		'����%-K26=676&"'&.54264&"264&":#".=6362?>�ΑYH	*
	/�/	
*	HY��&

��gO~.$		$.~OgW�@%
?	����;HU%:#".=6362?>26=676&"'&.5464/&?'76&6%&

�ΑYH	*
	/�/	
*	HY�P!!�!!
	PPI@%
?	l�gO~.$		$.~OgA0((((00����%8@^2"&4&26=676&"'&.546'.#"?62264&":#".=6362?>N�ΑYH	*
	/�/	
*	HY�
%
&�4&&4&
&

��gO~.$		$.~OgP						0&4&&4�@%
?	����"1<62"4&"276'.#"?62&2676."�Α��7�
%
&�	
Y`Y
/�YΑ�Α						a	'66'
 �`/?O_72+"&=46;2+"&=46;2+"&=463%2+"&=46;2+"&=46;2+"&=463`

@

�

@

�

@

�

@

�

@

�

@

�
@

@

@

@

@

@
�
@

@

@

@

@

@
��@�/?O_2+"&=4632+"&=4632+"&=4632+"&=4632+"&=4632+"&=463`

@

@

@

@

@



@

@

@

@

@

�
@

@
�
@

@
�
@

@
@
@

@
�
@

@
�
@

@
���"@72+".=4>;2+"&=4632+"&=4&#"+"&=6�

�%

�Ҕ		zV8`8		�
�
@&@
�
�ip		pVz8`8p		pi���F7+"&=46;2#"&=46;22+"&46;23265454&"+"&=6�
%%
�

%%�Ҕ5%� fz�z		�p
%0%�
p
%0%`�i�%5(�VzzV		i��!�77/'7'&54%'76DC#)�#+3`3
����+ FC##�*
3`3+�+ǩ����';GS_ks&'&'&6;2+"'&'&'&6;2+"2#!"&=46;254+";2754+";2754+";2754+";2"&462�+
+
n+
+
�
%��%%+o�```��6%%6%($>($>($>($>@
�%%�%
S�pppppppp@%6%%6��@�-=M]ms��#32+54&+"#"&=46;#"&=463!2;26=4&+";26=4&+"';26=4&+"26=4&+"334&"%54&+";26=4&+";260		�	 	�				 		��&&&&�&&3&3�8P8&&&&���	 	P		P	 	�	 		 	-&&e&&[&&�&&�(88e&&e&&����7DQ&=4;2+"=46#"'6+"=4.'&=4;22#"./2!2+"&/�<0(0��$qY��Z�).00�vYuV


v*AB>,9!,��P8!W1/'
%>>��
�
�
p

	�����-52"&4264&"4'654.'&7>264&"�Α�Α��##")��Α��W�

			�����5G2"&465."?624'654.'&7>765.#"?62�Α�Α�#&#	
&
h##")A#	
&
��Α��K))�

			�!)����&.Ma%/&>7676#"&462&#.&264&"4'654.'&7>?626'.#"�S
�/4g��ΑT��##
)
'	

.!	S	T�Α�g.,%#�

			�						
	����%2"&4"264&"2642676&#!"3�Α�ΑU�87Q
��
Q7��Α���H66H����.<2"&4?626'.#"?626'.#"6&#!";26�Α�Α

&
	
#�

&
	

��
Q77Q��Α��6)!!w6HH����#12"&46/764.?64/&6&#!";26�Α�ΑP!!�!!PP
��
Q77Q��Α��0((	((00�6HH����!/2"&4?626'.#"&"2646&#!";26�Α�Α
&	
%Z�
��
Q77Q��Α��5						
6HH����	ALP7"&=46;%+5322+"&547#"&547#"&5#"&=46;2#46;25#�

 @
  
0		S(�(S	0		`	`�`0`�
�
� 
�
�	 		p	 		�� �000��@�#/2"'&547.=462767'5%6�hJrr�w��,!�!/	
��J4>��>4�0�?�	�(%�@�%(��
8 ��@�!+72"'&54264&"7.=462767'5%6�hJrrm""�w��,!�!/	
��J4>��>4^""I0�?�	�(%�@�%(��
8 ����� ?&7>'7'/&?6276^K�K"r/7�5��bWi!%�K�K"7/rD5K��bWh$�����	4'&6;2%2&'7632"&46&/&"?6/�?/o	
o
U
	o/?E
ʒgg�g
44&	//	=
+��+
s�g�gg�6
//
%4		4����2"&4264&"264&"�Α�Α����Α��W����!32"&42654'"&54724+"362654'"&547�Α�ΑX&4&""���4&""��Α��G&&&

�  p&&

&����*!2#!"&=463!6?654&+";26p		��		�MM0FF	 		 	[��;LL�&&���	+#76322++"&767.5#"&=463�d��				C6
�
6C		�c�$�	 	<a  a<	 	���0#!"&=463!22+2+"&=463546;265�
��

`
 %8(�

@

%�
@

`

 %@(8 
�

�
 %
	����	-9AF673&.'3'>76732#!"&5463264&+"36264&"7#&�-''-V.
'j

��%%		�		;jKKjK�-'1) )**h*#f)1
�@
%�%�`				`KjKKj�1)���?'73264&"'766'OTc!�]
];1#]$�b�!cT;]
]�'T(�b���&7'73264&"'>%'762���+
���
(�]
o9�9(5+��]�(
�		B(9�9�����$67'&4?622?'762'&?%"/7?md		Z		">>,�.q.(-�q��k�		Z		d�,>>�d		Z		">>,.q.-(q��k		Z		e�,>>����.!2#!"&=4637&=46'46'%&'p		��		

'f0
A	db+
(&+��	 		 	�
e		C�	�1N
������1!2#!"&=4637'&6?627'&6?63276+"p		��		AM(Hh�A�c++.,���	 		 	kS$4b!R21'$�����*2%//&?'#+"&546;276%3264&#-NNNN�	 		�(80$TN��`

`NNNN�P			8($6TN�@����.6J254&""'54&".546'.#"?62264&"76'.#"?62�ΑA7		.d.		7A�

%
&9((�
%
&	��gBq!�		��		�!qBgG						�&4&&4�							����#.2"&4"2642654'&"6264&">'&#"32�Α�ΑU�(**3�-F7��Α���77��6 ����!)-59%+"&5#"&5#"&5463!235#264&"75#264&"'3'#u
 8P8�8P8 

��R``L((�`�((0�PB�
o
(88((88(
 
�`��((�``�((�`����=2##"'&7#"&?6&&/&?6>76327>o
)"(
C#+M�

b:

7:&
*KJ6
E=	 8=�	�'
	%#3hG6!'����'92"&4?626'.#"6&"'&276'.#"?62�Α�Αp

&
	
#�

#n#

-�3
#	
&
��Α��F)�**6�!)����(,048<@!2+"&=4>;53#!"&54>3!23'7#?#3'#73'3'#�		�	0��7		��7	���
�
�j�
`����
gFrj	 
	   ���		
B1``�pp�``�p�``�p����A�,2"'.543267>&'&'6768'S�S''?D++D?'��!FG"%;?QQ?;%$'88'$oo==o����"%/&&?6/&6?6�%">H6 F&3
&)'H!.L	�C>"(	4949/!=	���	!)19AIQ#546;22"&42#!"&=463264&""&4622"&4&2"&462"&42"&4�
@
��(8
�
8(B//B/��Mss�``
m
8(�

�(8�/B//B3s����*5!2#!"&=46;26=4'&5463 �@(8
�@
8(C	D-+@@@8( 

 (8(2,:+ *$
�����'#"/#"&?'&6?627//�
j��j
�A	(	ARr3f&g�DD�g&���Qg��6r����#/;I2++"&=#+"&=#"&=46354+";2=4+";2'#546;2#5P	 	�	 	�����0`0 �				��h�PPPP����2"&4264&"264&"6264&"�Α�Α�C4&&4&���Α��*�&4&&4����
%-1573622#!>?"&546;2264&"75#75#�		�K		�

����8P8
�
j8@@@		�L		�
�
� ��(88(�
�[�@@�@@ �hT\7&'76?6/&"'&+""2+"'"'"'+"&=46;276;2276;2276;23$"&462�	DP(1d"dq
0

0�		:&&t&&t&&:		%JJ%�1B//B/�b9
"&
P			 	 	      	 	`/B//B����4j%2+"'"'"'+"&=46;276;2276;2276;23%"'&'5462+"&=4&"35462+"&=4&"#5#p		:&&t&&t&&:		%JJ%��
8P8	 	�8P8	 	
� 	 	      	 	 	
�(88(		

``(88(		

�
	`������ '&?66762%47#"&z	
��	
�(-6,!��2BIg


	�

	�>@4_6I&(&�-h����#22"&46/764.?64/&"7626'&�Α�ΑP!!�!!PP�RM	)�)��Α��-0((	((00�>-
-������3#"./.""&/&'&'&7>76676/676�%

	""
%2" #d
	

0)"2`>1(CS9"

�

�


"9SC(2="3	@#3����	1.7>>327/6'&2#!"&=46;7s-�G'I!`+
.#:?f		��		�I<A78;Z=L_�[�,�H	%]J��	 		 	�����/37;?W#2+"&5#+"&=4635"&=46;2346;235!355#!5#=#"&=#+3235463


`
�
`



`
�
`
` ��  �  
�
  
�
@
�
`



`
�
`



     ��    `�
  
�
  
�����$%#!"&7>;&5463232&264&"��`I<8(,<	�))$(8,����%�"2+"546;5.?4>;23'��(4@�	@4r�uW7��7Wu�PP������/7;%+32#!"&=46;5#"&?#"&?&5462+&"264#3{	�p		��		p�	^1
r(r
1V			`��
 	`		`	 
a	~~	�			�y ������"5#"'&"#"'&'&767676676'#'&7676763_'$+A
 
A+$'*$$*?#/++G0:

:0G++/#

%
$
	����
#+6=DLT_72"&467'"'".'&7&766267&'&'767"&#">"6727&'6264&"6''6'&#"#�		�77W$|$("
77W$|$W��%,� 2 B//B/�%�		
`5KK54
VV5KK54
VV
��	
#�
#
�%��%K/B//B?
#
	�#
	 �`O%#"&'4.#!"#"&=46764'.=46323!2>5>32W,'
��',,
	',�
$,

,$

$,

,$���+"&462'&'.=46%2.=476`8P88P>
F|�<|E
D�P88P8��#��"�)��@�%K2#"&'#"&547.547&5467&5463021>#"'#"&546320212�&*&*(&"�*&*&"&(�&��**	(.(	&��(	**x%&	(��+5HY%+"&=!+"&=&=46?>;2%!'.+":>54&#"!264&#":�
 
�
 
 �"9���9
"N	
�!06

  

60!2
& 222
�!	�#/K2#!"&546;546;23546;254+";2%54+54+"#";;2=32�

�@

 	`	�	`	�pp((((@
�


0		00		0�((((������*fz��7&?6/.?6/&6?>?6/.?'/&'&?&'&?676?676767676%&>76&'&'&/&#"&>76�#
NA	2M
+= %�




	�
	
 {
�}
	
	{	 �l)

�.M
+=
NA	28+$�/4
C

4.+!	5d
	)6!+.O
����$,04<2+"&5#"&5#"&=46?>;2264&"75#;'#264&" (8	08P8�8P80	0!�
m�|((xM&��MY�((8(P	(88((88(	p"z
��((�```��((��@�Qh!2#!"&=46332'.=4&+!46;2327>=.=46;5462354626&+76&+";327P		��			2"'��%�%$4

			 		��:D;	 		 	@	 *x!..p`%%�4$
v* 	0		00		`3	kS���'%"/&4?626/&#";2=37�		�

�		�

{U
p
 `
�

�		�

�		�N6
P@6����'8@HPX`%2#"'##"&5475&546323632#0#23'"1"&46;7#264&"64&"2$"264264&"264&"�%%%�%%  %%�%%%''���&%%&��			w			��			 			@			`%6%  %%�%%  %6%A A	@%6%@b			�			 			��			 			����7AE%'&?67&?'&?6'2#!"&=46;;267!463!2!�::$$U$$::	&�&	�
=��@���;;$$$$;;�	&&	p��P��������0&4?62'%/&4?2?/&4?2?������;��:��:��,jjjjjII�jjII���!;G7"&=463546;22++"&=2#!"&5463!264&#52%"=4;2#�

	@	

	(	$	� 	5KK5Oq1����
�
		
�
		�		KjK@qOI7  �`26A6#!"&='.=4>3235#"&=46;2+325'46?"&v�	
��
F		�88		�		892��0�
+$ �

/_	0				0A?>]
+>���0%#!"&5467&546;&546;2654'6323232�#*��*#*%!/
(8%*O(**(#*%/!8(%*#���'62"&4%+".?>22+"&=463KjKKjK��
kP

�

�KjKKj�%
	���
�

�
������7%/+"&=&/&6?'.?>546;276� 
�	@	�
 �� 
�	@�
 �r
8O�		�O8
NN
8O�	�O8
N	����+9GUcq2#!"&546354&+"26=4&";2654&+"26=4&";2654&+"26=4&";2654&+"26=4&";26 (88(�@(88(@	@	((	@	�	P	!.!!.!	P	�	P	!.!!.!	P	�	@	((	@	�8(��(88(@(8��@		@�@@		q8		8!!�X!!X		q8		8!!�X!!X		y@		@�@@		
����+9GWes��2#!"&=46354&";26754&";26754&";26754&";262#!"&=46354&+"26754&+"26754&+"26754&+"26 (8%�%8(@(	@	�!.!	P	�!.!	P	�(	@	%8(�@(8%`	@	(�	P	!.!�	P	!.!�	@	(�8(@%%@(8�  		8!!8		8!!8		  		�% (88( %P 		 		!!		!! 		 ������(6HT\j7&>#"./&67632*#"0&'&567%.?>766676.67&'7676.'&6� ]F&
#YJ gu$$ dY�,
� SaAO6 ��,
 SF
.�"�,�+-2# $D&�'
91+
	
�)H!A`)��	�,'*(O	����.6>F3"&'.535.535.53546;23264&"6264&"6264&"�@	F\F	%@$@$@
�
@�((((((
&%,99,	2 &
1&
1 

 %&�((d((d((����15����%2+.#"#."#"&=46;546;546;232%3'#2+/+"&=&'/&?&'#"&=46;67'&?667546;276264&"'2+/+"&=&'/&?&'#"&=46;67'&?667546;276264&"p		'0&CBCLC			�
q
SJ
���3Q0	
	 	
		
	 	
((�	
	 	
		
	 	
((�	 	"""	 	P	`

h
@`@�� 	
		
	 	
		
P((4	 
		
	 	
		
P((����7;CK%2+"&547#"&547#"&=46;546;546;232%3'264&"264&"p		2B\BDB\B2		
�
q
m0
���M�((<((�	 	.BB..BB.	 	@
�

�
@�``��((((�
3K?62"&472#!"&546326/.+";2?33754&+"&#"327;26����`�	6	6	F�		**
	�55��� ��
�	�
�		$*<*	��@�#/%2++"&=#"&=46;&5462&">54(

`
 
`

-%JlJ%E,�
 
�

�
 
;5AOOA5;�"9!(����:B%#!"&5463!2;;26=326=4&+54&+"#"5!"3�

��)77)F��	0	 	0		0	 	0	��
Z	4
	7)@)7v 	p		p	 	0		0	��@����/3B$2"&454+54+";2'"!546;546;232&'5#!"&=33�xTTxT�
&


<
@7.�uP�P	������	�TxTTxB
6

L
� P001`  �*&�0	����-9EQ]iu�����2#!"&546;546;23546;23546;254+";2=4+";2=4+";254+";2=4+";2=4+";254+";2=4+";2=4+";254+";2=4+";2h

��

(		@		@
�
��((((((�((((((�((((((�((((
��

h
P		PP		PH

��((l((l((�((l((l((T((l((l((��((l((���T2#"'#"547>7&54>'./&54;2?6&'&'54&+"+"'&;265�Ԗ�j83AL92	 		2	 		�z�z329JV�%						��B�Og#"'#"54767&5462;2=>54./&54>;2?6'&'54+"+"'&#"'#"&'32654'�zV<3+.&z�f-	-	Z.+3<@hc�9HB�^)3B^�	



�
6,qO

P23����#2++"&=#"&=46;546;2`

`
@
`

`
@
@
@
�

�
@
`

`
���W]ciou}���%2#'"/+"&57&'"/&4?&'"&=46367'&4?6267'46;2762'7&'67#677&'7&'6264&"67'367'?&'�

$
/;		;/
$

$
/;		;/
$�
+Y%+
l@	L1	C
+2:%+
l@	@1	�		;/
$

$
/;		;/
$

$
/;@	11	%
L%+
�@	1w�1	%
H%+
���-T7"&=46;2#546;2+"&2?#!"&=%5!'54767546;>3232�		�		�	�		�	F4��`�`��`NN�				P				r��՗�
F��F

,		,�!2#!"&546;54&+";26��`�@`	�		�	@� @�				�52#!"&546;54&+54&+"#";;26=326��`�@`	H		H		H		H	@� @�	H		H		H		H	������Z/&='&63!22"&4>54&/&546;2?6'&'54+""+"'&;25�?R;#P��y�^^�^�-		-	gCQ9	<��''�^�^^��

	

���eoy%2+5#5#5#33#54&+"#53535####"&=46;546;546;54623546235462354623232'354&+"54&+"�		P     P	@	P     P						@		@		@				�0		8	 	`	�	��``��P		P��``��	�	p	P	p								p	P	p�00		�@		@���1?G%"/&5476;5462;2=462;2=4623226?."62"&4�	f8�8f	@ 

 

 @��00200=�
	n<<n	
��

��

�Ѐ $ <�����2D%/#"/#"&57"#"&?'&6?'&676276'7'7''77'�
bK	
lDDl
Kb
n*^""^*/$/5--5/$4!!�5S
qYYq
S5h
<k

k<
h}(2332(6**6��0��%#"#.'3'&'45473'>76327#"'&54?'&4?'&543243127632#"/>7654.'&547654'&54763231!�QM(;/)	?$
:)9+****%5:
	$?	)/;`HXWE;

)+_G+%7-D	A!		! ��!		!A5%
# 
+G`*);�����%#!"&5463!2!"3!0#"/267#1"'&54?<14'#"54?.''312545'764/7454#"#'4"'"#"32?.547.547#"/�
��)77)FC��
�%	=N=	%	


		


F	4
	7)@)7�� &11& 	
#	
po	!

��A� .=KY%&546?626"/.=54&?6754&3766=4/&'6=4/&*����
	� ,�

��PP�``�PP�``l1PP1
OmR�66�"-$���nv~/612#".5'"&5475#"&46307'/&'&6765'&?.5467'&?7>54'&54764'6'76/�82
5P/
))
	

/P8
/<		&!M,;;,L"&	U

�~s?'$=
*!
	

		!*
AE� 	

(/(F6$	33	55	33	$6F(/(	t &&""&&���'7#!"&=4?62335335332!546;2#!"&=463�
	� 	
��@`@`@	�@	�		� 		d%		%Z������	00	`	 		 	��@�'9=L:767#!"&=72"#".'.'5463%2+5.+54635#%#5463!2#"�*+ @
�
@ �
,)"	),


�$`
 @��`
@
�& 0�

�0�
!	"
`
�
�! 
�@@` �

`&����	'2=HS^it�2#546;2#546;2#546;2#54636"&546?"&546?"&546?"&546?"&546?"&546?"&546?546;2+32#!"&=46;5#"&=46;2;546;2326�	@	�	@	�	@	�	@	} s s s s s s 	 	8(��		�`		��(8	 	
�	 	�
@	��		��		��		��	 
 .

 .

 .

 .

 .

 .

 .
Ӑ		�(8@	 		 	@8(�		�
�		�����	CP3+"&%!&5476?2+54&"#54&/#54&"#"&=463#5467�
@
C��XE++EX

 @@ 

��  @��
�C8+5

5+8C<
�
@

@H$
&H@

@
�
@!  0
�����h�'&4?6"2#".5'546326=4&"+#".5463264&+&/&6;264&#"/&47632?6#".'&66iR;;%'
#/
)K5*A$!1 &&!			 

(8%	/
q%
&'5��;)d$4
&+	d
!5K01&4& (&
$'$
�	
$	

���������$&#".'&'32#".'"'#"&463267&'#"'&&'&4>7>6767&'#".'&#"&463232>7'.5462627&5462327>32#"#"'7>"264$"264g
!	 

(

(

 	!



*#%6%:%6%#*


�			��			h	

#8-%%-8#
	

!4"%%%%%%%%"4!

'							����2"&44&'657677�Α�Α�WA��Y&s3&�+E(���Α��gCg�g)�rG"ir	"?3N,/)g����	/%+54>?#"&5%#54&"#54?54?6m	p�	mp	�`%6%`0	LL	Q	d	�L	/�	�	�`%%`�	s	KK	s����/?2#!"&546354&+";26754&+";26754&+";26���p	 		 	`	 		 	`	 		 	���`���		�		�		�		@		@		����/?%#!"&5463!2326=4&+"326=4&+"326=4&+"���`���		�		�		�		@		@		`p	 		 	`	 		 	`	 		 	����("&462'+"&46;'.?67676&6%%6%_#n�\- 1&(':!
X!@%6%%6�An1"#G!\!./
!H
����)R2#"&=46?54?03>26=4#"/.=46226=4/&67621/&�
	Zu
M		z�&/		M
u
�'?
/`
Q��M		P
�`/
?'�

P		M�
�Q����1NV%#!"&5463!2"3237232/76&#/&"'"327654#0"#"&463:1324#&5!"3�

��)77)F�;/DD/'88'u��
Z	4
	7)@)7xCC`C8N8��@���$_%"/&=#"&462322654.#"7+"=&'&?6;2654/.54>354;2'&+"�d8HVzz�z,
��xT'B'<T�	-	d
,z�zzVH8	T<'C&TxE



���$0;%"/&=#"&462322654.#"62"'&54264&"�d8HVzz�z,
��xT'B'<Tq>+CCJ
d
,z�zzVH8	T<'C&Tx�+$OO$5
�����%57#"&'&6?535#546;272#546353#"&'&67�( .
W��
��
�
 �s -
�^)!HA���  

  
���=W!H��G�;%//&?'&?67672+#"/#"&=46;2>3;........

�b X,

Q
:U�........�
0
���
0
jC
���92#"&4632#0&#"3267#"/#"&?'&6?62T	+.j��j.,
W||W�7
DD
7L""	�Ԗ
|�|�6L$$L6EE������ &),/25%+"/#"&?'&6;76232#'#3373'7#73'�5k8*8k55k8*8kB( 5p55p8.�((�.�(�Y$^^$YY$^^$!7XXX&8!!�!&8!����	'E762#547!#762'#54&#4?6'76&+'&"#";2?326F&�r�&�`-`�H''''�+���

�+�f
��`'&]z
f�((((����FRUX^%'37'$2"&54737!;32?327654/7654&+'&#1"#"$2"&54#''73@$Q��((�|�����	<<	<<s((�$,B!!B!!R��
�@

�
�����`11
1

111
1

1�
�@

�
o8888���7;?267+32++"&=!+"&=#"&=46;5#"&=3355#xP
 0		0	 	�	 	0		0 
P`�`�
`
@	 	�		��		�	 	@
`
`@@@@@������@DH%+"&=#+"&=#+"&='&'&?5'&4?5'&6?%35!5!y7	 	�	 	�	 	7Y7		w��w		7����@��/
0		00		00		0
1@2@VV@2@�@@�@���-6/#"&=46;//&?'&?676�Yf

fP-..--..y��Y
�
`.--..--����%2"&4264&"&264&#"3"&462"&4�Α�Α�P88(PppP(8S��Α���m8P8p�p8P�����@�4DL";#";#";!!&'.7>/762#!"&=463264&"����ri����p'
FF'--[%
��
%��@@@`@��
M�N	
?JJp% 

 %`����0LT\"&462#!"&5463!2";26=654??6/76/&'&5!"3"&462			�

��)77)F�B/ 	@	 �GGbbFFbb���
w			8			�	4
	7)@)7& 
		
 �++**�@8			���� #!2#!"&=46;'&?676%3p		��		�5	

))


	5��t�	 		 	JJ
		
88
		
J�������-7?G327+"&=32+"&54&"&4632>?"&=264&"264&"#!*	 	� 
	�&
(833�@8P8@			Y			&�		�`
	&
8(V'`@�(88(�@P							������7#546;2#54'#5##5#+"&=!+"&="&?63!2p0K5@5K0(000(N	 	�	 	
j@��5KK5��.������p		pp		p ��B�<%+"&54674&5463263276&'654&#"&'&54632W*/!�(8$8(,
&�5T%8(
qO#)m_.!/8(1
(8&'A$(8
Pp
F)F[����DQ%#!"&54674&454632632%&?'&4?'&676276&'&"74632.?$8(��(84%B."6&�R	L	
SS
	X))X	

	!\B1#)
;
'z
1(88(&6.B$
&
	X))X	
SS
	Y
!B\.#1$D/
������ '0:EKO7'"&?&=46&63''&4?6#76276/&>2".=7#'3'kl�MA�rQ�	=m__}LP��uj�ddd�8�.�BY1b	����z�b��WBߜŰ�����#'&4?66&='46/&5����  � ���� R
ww
e��&]

�mt�

]& �� �4<%+"&=#+"&=.54623%+'54632324&"2*�	@	�	@	$
�& �5	@	p			�6�		pp		�
1
p &$.�				������CI7&?>#"&?#!"&547>7.='&4?'&6;2+"/#77		u*x�[ #H0�

GU�Z-3<<>�
K	@�uW+*)EB<#/@
_6m
2

c	

	%����.&#"+"'&7'&54>32?547>32�3HV(	#2"(?).F�3I	X!
)#"	(VO?
��� 0@P`p�����7+".767>%+"/&67622+"&=4632+"&=463/.7676"'&'&?6#''&'&?>2+"&=4632+"&=463'62+"5'67+"5+"5�
a%*%@�		`		`		`		�		S*
�
S
*S		$
*I		`		`		`		�

@��

.+�
hh
��	@		@	�	@		@		3$�

3+.
�3	Z�	@		@	�	@		@	�����������-Ohq;#!"&546;54+";2=4+"&=46;22654/&54;2=4+"+"374+"276=4+"&57#532�
�
��

�`		,`$$y�
8
��

�
�� 	 	`x7''7�
�����DP`p#"546;2!5'&=;27;2732?>72=4+"&546;2'&+546;2"&=46;2#3"&=46;2#0	 	�$�%   
#	p&  	 	��		 		@		 		 �		�X'$@@%5N	(			%?p		�	�		�		�		�	����&.6/&/&"/&&546264&"264&"�Rt
+))+
l��qQ��	0..0	Pv�����G�'%/&?'/&='6276"&47%;Z$1Z/�/-	��1�4%��Z	1-//-$1�%4�����'/mx��������32#54#32#54;2#54;2#54#54;2!32#54!2+32#!"&=46;5#"&=46;2;546;2326=4636"&546?"&546?%".546?"&546?"&546?2"&546?"&546?"&546?"&546?� 8 � H ` �H 	8(��		�`		��(8	 	
�	 	�
	���(
C�2(
 xxxxxxxxxxxx	p(8@	 		 	@8(p		p
�		�
p	 

'

' 

'0

'

'

'

'

'

'���$,!2#!"&=4637#7>?#?/7?/�		� 		��o�8V�@@  @�    	 		 	@ �"	k�


�   @@ �   ������JR7#"'.7/.?>2+"&=#"/1"&='&54?>3235463&"&462Q#4@:!�			0
/W	 /#	\((�5e
�b"+	��		�	P/S

SV

k/	@((����>F2#+"&=#+"&="'+"&=4632546;2632>264&"E
	 	�	@	3z3	@	pPI7

#�			`\
 		 �		GG		�B^)1

	P			��A�KS&/0+"&='+"/&54?&5457+"&=4636;46;2264&"@
! 	@	�	B		4$+�K5x	G			sM

	&f-!�		�@idD)
8		8$4!5K	 			����G�43+'7'#"&=265%/&/&7%62546;2 �	�(h�<h%�	���
e	@	M��	7@�w@I	�H�

��

Z4		�����Z%#32+;2?6+".'&7#"&=46;7#"&=46;7654&+"&/&6?6;232pd"�		�	T	%O#	*		d"�		�	T	%O2*		� 	 				
.0	 	 	 				
.0	 	����!+2#"/&"#"&7676276'&"276'&"A�J2??&'&@OarJO^!		!^!		1^!		!^!		�mIWH
8&&8�P`,�)))))))������#!"&'&5476273{	�� 
"
f&@U	
	�L�&@����KOSW%+32+"&=46;5!32+"&=46;5#"&=463!5#"&=46;2+!2%35#5#!5#�	h8

�

8��8

�

8h		H

�

H	����@`�`�	(
�

�
((
�

�
(		(
�

�
(	x@��@@@@������>FN2+32+'32+";2+"&'&76=46;76;2"264267#7`
8(\7
	PK�@
	�		p

l0(pP8�
9			Mwf�
 (82n
	�P
			%*&.PpX
			W;7�2"&=4$"6265427&"�ړ�ԖP�pI�I��9�9:��R>b;SS;b>/!

**

!Z����B"&462+"&46;%2+"/#"'.?'.?'&.6?6$((�

 M

C

6
 >U
%
(
'%,G*`((��)N$	f
W2
.W
(5����
&2#"&=4&54'!2!!2#!265(P	-P(8�� P	B.��(8�P	@�&'p8(� 	.B8(������#7?G/&/&6?'.?>76'.5462+"&76"264&"264�
��
��
��
�� &TxT& ~
��
ZZ
EE
ZZ
E�:"5KK5":

�������&?6S��	
M	
=�

	�9

����G�o�'&54?>#/#+"&='"&547+"&=4?#/&?6;'&/&?637>23?632/&6?6#'&'��	

	0/=		J7R7J		=/0	

	4
NE
5	

	2=$
$
$=2	

	5
EN
s6NH(�		
Ha	N		Iw
(==(wI		N	aH
		O	P		
L44L
		P	�HN6	����@�$,4<DL!#!"&7>=46264&"264&"264&"264&"62"&4264&"�	��
	8			I			I			I			�P88P8S�:J)�1
	
�Pp�															�p�pp��%6%%6����muz$2"&4264&"2&#"#+"/+"&=&'"/&4?&'#"&=46;67'&4?6546;2354762264&"73'#�H44H4Nh
	3;$Q
	
	,	
	

	�	8f	
�oB//B/fn)kp4H44H<
3
	30	
	

	
	,	

�
�(.$

(�/B//B�``����
 (<#>32#7"&547367#'547"&%2+'72+654&+'327ZR@(\gB6jK���b�P0
*q7OP/!F*#L#�D$,P2�K5

5w�0*=)�D(`�O7*!/`��$,2+"./&"+"&5463264&"264&"`

�

:
 �

e6%%6%e6%%6%�
��
	==
@
�%6%%6%%6%%6��
� A[72#"&'&6;232>'.+"&=4635"&=463!2676&#"+".7>#2&'&6;23264&+&'�%9:+#5
 
�				N !26(	:-06D
/+H
"
t�/$,A,"

		 	 	 	
	'(.G T7.
+'
(&���'"/&4?>7&?67'�M�5Z�N#L��zZzwL#N�Z5�M�^zZz���-W62"&4$2"&4'#"'"'#"'&7&47&66266+&'&#&""#"&5467&54632632:12((�((G2$2#�8(+	<	+(8%B. 5%!/(`((((2

2#$�P8
	
8(2

.B!/!	��B�8ER_l%#!"&5467<146326326#"&"'.'&'>32#"'&?>#"'&?>#"'&?>#"'&?>^%/!�!/%8(1,�+E+T:

%2�$	%
[$	%
[$	%
[$	%
�,!//!,(8(%5#+:P
5.�@@@@@@@@���+;J2#!"&5467&54632632:62"&546762#"&546762"&54>�(88(��(8%B. 5%!/��"("�"

"�"(@8P88(2

.B!/!	�232
32
 �����
)7Ec6#"'.?>#"'.?6&#"'.?6$#"'.?6&#"'.?672#!"&5467&54632632:�@	@m@	@�@	@�@	@S@	@;(88(��(8%B. 5%!/Q
p
p
p
p
p
p
p
p
p
p�8P88(2

.B!/!	����@�EP]jw�%#!"&5467<146326321&?'&4?'&6762760"1"&7&54632#"'&?>#"'&?>#"'&?>#"'&?>�%/!�!/$8(1"��;GGK##K	% Ib&D$	%
[$	%
[$	%
[$	%
�,!//!,(8(5K##KGGP&
�@@@@@@@@������1Jc|�%'.'!'+"/&?67&'.7676326&#/&""?65'76&#/&""?65'76&#/&""?65'5!+"&=#+"&}	

	��6&

	K	+*
Q�&C��
�
�
��`	@	�	@	�
		
	Nl#	c#
	+**Q$ 





퐐		PP		���
1U]emy2+"&54327.5>7327&'.5>7&'327&'.5>676.264&"6264&"264&"7264&"	 	,>&3=1S?AW3+O-%>&3=+O-%&.T,+O-.	5!6H+O-%&.T,1N.1(A( 4$)�							I						�
�0		�
��$
E	V>		
=	t!E		
�

	(			/	


9	


/	

���)1<I#"&546726767632676324&"2'#"&462".54632� LBQ!Qr!D�[a	�KjKKj5		
 	�a[�D!rQ!QBL 	��jKKjK�		Y	��@�	5=RYf53+"&2+"/#".='0&5#".=46;2&"&462753"&5#"&'#"&?'46;#%2+"&5�@	 	 

:)
	
		&-Y((��

�
 @`
	 	0��		Q=
8
		8+e
		�`&-`((D �`


��
��
�0		�����M%2#"&?#".576;27+76'&+76&+"#"&5467&546;2654'632324X;
D|+/!


D0!/+
&!/	(8&p�	ax
	Ao.!/"x/!.&/!8(&��@�<Z6+"&=4&'&+"&=466+"&=4&'&+"&=466+"&=4&"+"&=46S�S	 	oSf�	 	�lW�	 	B19T	 	_N5 	 		 	+�K�Q�		�V�
�e�		�t�ZtV�		�3NM8�		�JrW0�		�

�		�#9����	";T�!546;26&/&"?6/76&/&"?6/76&/&"?6/2'.=#+"&=#+"&=!26=463 ��^B�B^��

�

�

�	)) 	`	�	`	 			@@B^^,





�	@'1 +p		PP		�p		@	����/G%2#!"&=4632+"&=463!2#!"&=463'"&4632632632+"'p		��		@		�		 		��		P<TT<=++=(D.BB.<%^%P				`								�TxT--*"B\B  ���/A2"&4264&""&54754622654'54&"7"&54675462xP88P8S� TxT B\B�B/ ( `(		�8P88PH�(2<TT<1)�.BB��/!(��(!N�		���/A2"&4264&""&54754622654'54&"7"&54675462xP88P8S� TxT B\B�B/ ( `(		�8P88PH�(2<TT<1)�.BB��/!(��(!N		����+;%2#!"&=46;#"3!2=4+5!4>3!2?6/&'&`

��

@

�

 ��	@
��J�_)�
`

`
@@@@	
�K^)��@�,X�%#&'"'"'"&=46767>7>7627#&'"'"'"&=46767>7>7627#&'"'"'"&=46767>7>7622+$)l+)l+)
!
X

Y
!+$)l+)l+#,
!
X

Y
!+$)l+)l+#,
!
X

Y
@	 
	 				�	 	 				�	 	 				������%="&462#"/&4?7#"'.?'6#5&/.>2?6�B//B/�


0	.=u.	0


�)�) )'b') /B//B��'
!
@9339@
!
' � 

 		���2:B!46762+"&547"'"&54>7&5!5463264&" 4&"2�o�0+!h		0<"/B/!F!/B/<�&��`��6`"
\	 	@K8+!//!
		
!//!!8K@&������B�
 go"&'62&.'632767632&7'&'&'&''&4767>.&76767&547632>54'&6264&" 	'V'	�%,5�4,$k6+`2+=66>+2`+6
)F2!7 )
�((P

��P/C**C/P� =	Xb	  bX= ?13H!8"0@�((��� 4I7&=46;22654.'&=467+"&5.'.=46+"&5.'".=46�:D
	<)Ej
0
(	0z�	 	�a	
Sv	 	S9
�d=)<	WD�

�
2��z
	a�	 	`vS
:R 
����	7!#!"&7;26=4&+"%2!546;546;23546;2���@	`		`	P�@0	 	�	 	���`		`		�000		00		0����	7!#!"&73!26=4&#!"%2!546;546;23546;2���@	 		��	P�@0	 	�	 	���@		@		�000		00		0�����")-15;C#"/&67%>'&#"#"/&6?63267'7'?'?'77&'67'�)6��
 a				!%,.O��=�<�<Q	-
$=d9w!�6�718>=��'''�.
	�	�����*'&&'&7276/>76/&67*."'f91��3
7S�DX!"&#b.&291B		
28 &"!XD
�����+;K[_o���%#!"&=4?>;5#"&=463!2+32;26=4&+"";26=4&#'#";26=4&'35#26=4&+"3;26=4&+"54+";2754&+";26754&+";26�	�@
U`				`��				 				0				���(				 				���				0				E[	
[�@	`		`	@				G				P				� �				@				�x				W				���+@V72/"/&4?'&637"&=46762#/&=46;26+"&?'&4?62�
c
c!�
c
c!cc
p��
p!c
c�
p!c
c@
p!c
c�c
c!p
p
c
c����B�C#'32%#73#5"&?6;2++"&=!+"&='#"&=46;'!0ac	��~�~��	c�			 	��	 			 �`������`�@	 	�				�	 	  ������	%?N^#53##7/32210'&/&"&?6;#+"&='#"&=46;'%"&54676>'&'&'32�=d�~!c
�'	c�51�	 			%4^�^D4('?3&X���H
>``� K7H6		�	 	 !`A]]A&m/$(�?/S!('1�32+5##5##5##5##"&=46;546;546;232�		P @ @ @ P		0	0	�	0		�	��������	�	0	0		0	0����7>Eeoy7#"&546;'&?6'&6?67>763253#"&53#2#5+#546;&54632632#3&#"7654&#"36�
	�


			  
		)��
�

��
( 7!!7 (�5	�	5��
`
	


	66

��`��`
 
`��`
,KK,
0		0������9=A%'&6?'#"&/#"'/&7>7.?>76767'7'�
'(??('
�'%WrrW%'��_$�p$_C	h.'KK'.h	C	fW(�
00
�(Wf	G'@..@'�����2#!".'&63!!�8��8���9���e@�����cs�2"&44&#"+;2=732;2?6;2;2=4?6=46;2+";2;6$;2?6=4&">7#"/&+'&+";2�Α�Α�uS(	

	% 

		 ��
	}5W
	
+ +	��Α��gSu	

	
		
			!�
	��8-
%

` %2#!"&=463%2#!"&=463�		� 		�		� 		�	 		 	�	 		 	 ����+"&546;2+"&546;2`	 		 	�	 		 	0		�		� 		�		�����+3.767>7676?6?62264&"�		/$L
#
#kS#&"7L/		��((�		/L7"&"Sk##
L%/		��((�����"/&6?>'7'6�$!��!$"b&`�0`"&a"v%i(��(i%#W@��@h#������@j"&4622462"&"&462&54'&>367>'&'&636762'&'.7676&'"'6'&5<546�((@(((((@	72		94�	27	
	49	((((`((�=3


:2
	�
1:
+3	

���/7%+"/#"&'.+"&=4>?6264&"�.	
3
./	7")�
%B0�
0%zt(	
@
 &R
Q?bU;K
6!8�����"'"/"/"'&63!2�WB.".,$W���,l����}��@�'08!>32#47%#534'3+#."#553#"&62#54@��'~J�`Bp?��B��
� 2:F:2���
�P8��~;E��C=�_��=C@`
 �##��``�8(``(������%2#!"&=463$!'&>76p		��		e(H��0@te
 	@		@	�"5W�:e@:����(:B&'&'&6;2+"7&'&'4>;2+"2++"&=463264&+#

n#
�.BB.8(�(8
p.#1,#1, B\B(88(�
�(`������"/%4'7>#"'.?2&"&462%"&5>76H&Q,6	�Q7|7Q-((��	6,Q&�,� `8
D�

� ((
8` �,����&.6>%4'7>#27"'.7'"&7676"&462"264"&4628*4�$*"H"C
4*�Α�Α��ll�l��#C*B6

C

y
B*C#��Α��l�ll�l ����)9V"&462"&462++"&=#"&?6727%2+"&5463++"&=#"&=4672�4&&4&Z4&&4&?7
0
7.8��		 		|

P

8@&4&&4&&4&&4��h

h��	� 		�	��
�

�
������@DH%"//"&46327'&67>327'&4?6;2762%7''�a		P
k
l	
)&
Q		a	

	P0

/

0Q	��IEI2EID�a		Q
&)
! l
k	Q		a		Q0

/

0P	hIEJ�EIE�����4O.7>7&5462#"'%1+"&5.'.=4>3210+".5.'"&=4632119�bu
C 
�a	z�Z S9		Sv b�9t
+	a�	 �z:R
 	v����
2#!"&575#35#35#@&&�&� 0�0�0�&��&&@��``````����
#*.546;#!"&575#354&+326=#35#;5'!5%35#"&��&�&�@�
  
�@�
 @�@ 
�&���&&�@@ 
@�@
 @@ 
@`@@@ @������(2O2"&42+"&46;264!6"/&627"&4?"&46;2"1"&='&6?|(()	`		`	��'DD
=\		0

�R=N�((�\				DD�	\	
�1S=Y

SN8�����$C"&462#"'%.>7'&776'&76776/&//'�((%�x			�.Kk(

1���#>R04	: s/`((���fEK5(#JFa 3		
9��@�.BN"&4622#!"&46;0&5&6?63232647'.?'&3737#"/d((�*� 

+6
(%,G*,
F
�U
%
'4>+�!
 =`((��
*
(5
�"Q2
.W
���

[�)N$	L����C%#!"&=463!2654/&?6%5"&46;2;26=32###5##5.e,��			



��

&"	/= &`

8(@�@*6a&'		


w�	,&@`(80004E�����6Wy2#"'#"&'&>7&542654/&54;2=4+"+"3754&+"'&+";2=2?;232654/&54;2=4+"+"3�Ԗ�j83AL9��	

	
0�z�z319JV�h		##		hD88D�����EQ"&462'76#"'%&'&>&'&6?54?'&/&>#"'&7�((TB4Z		��!&
J#*		?o
�<U�`((�?'f"�!			
5(:4S

--=

�����T\dlt�+"'.547&507'.?>54>;2167&5462704=46;276$264&"264&"6264&"6264&"7654&"6264&"��!	#%c
!&,�	8	
8P8
	8		
��			)																(7
"-.QC(?,
7	.!(88(".		*			��			7			7			O			2			����[`l62"&462"&462"&462"&4"/&=##!"&54>7546;546;2354?623'264&#!"3n^^^$
%)+B.�.B� O@)%
$��@zD:�H#%
$*:.BB.(	[p�
3:*$
% f S`@���((����2++"=#"=43%2#!"=43t�8�h�� 8��8�88����%19#+"&?.5475#"&=463!2;2=4+"264&"p /(�(/ 		`		��006tRRtR��2TGGT2�				������/9A%"/.7'#'76'"'&7>76'&"&4?264&"�5
uk>`@�k04
R*I%JDK
	�|5%�u45u0k�@`>k6R=+	KDJ$JR {%5�������)-15="&462232#!"&=46;5"#"'&67%65#%35+3"&462-��

��

�����``�``c�
<\
�

�
S;���`````` ����"&54676>'&'&'32D4H���_I9*
$:\K8+�0�+_��_6�D5: ��Y'	Cu ((8E����A�,X7'&67670767>767632%"#"/67>7>7>767�

5#$	
$7E #3

	%.&%
L	
$7E %C(

	%.
	 !5#p
!#
J$'

	%
%&!�
J6'/

	%&!!	!����2:%#!"&5463!2;;2=32=4+54+"#"5!"3�

��)77)F��808808��
Z	4
	7)@)7�088088��@��@�2##!"&5".546 AoH(#��	��2;�

	>k���	5!#!"&5!%630
�@
,Y{���

��Z�����A�,H3#!"&=26554+54+"#";;2=327#"/&"#"/&547%62 �	�`	;808808���M��		�D088088����

���02#"'#"547>7&5454+54+"#";;2=32�Ԗ�j83AL9`808808�z�z31:IVn088088�����%."/&4?627"/&4?6?7'76�
�7-nxf
fn-7
D
P	�
�7-nf
fxn-7{
D
	P����2"&546�b]2p�p2�u�7PppP7����'/7?%2#!"&4632#!"&=4637"&7>2#&"264&"264"264��`�	&��&	~�~>			�			�			�((�	&&	�42BB24p			)						 ����@%+"&/&=46?2=4>3762=463212=46�4�/
	


'$�S4J	L� �� 2	�#%!5467546;272#!"&=463�@B5)	`	)5B		� 		�@@;aRp		pRa�	 		 	�����AKU#"&5467>264&"2767>7>7>7>76'.?6&/�		��
"!/
`
!!(	
 ' ' 	
 ' ' �|�3��3�!
��
/!"
`	i
' ' 
' ' �3��3� ����2#!"&46;&5462'!"&p��TxT�cc ((<TT<��������%)A7"=4;54;232++"=%!463!2!2#!"&=46;;267�80880 ��@���	&�&	�
=�088088���P���`	&&	�#32#!"&54635#"3754&+326754&#!"3!26�&&��&&`P		�	PP	�
��

@
�&�&&&��0			0	�@

@
���1%3#"&4632>77'#5'6326'&54?632Kk%Kj�L!!1$5�6YK$(
�'"G@)!.!#+2-,&B9N"+
$7���&.6.'7>#"&5476264&"6264&"264&"�Z�b9R�]
3X�K��
rC{�	_�Y]�P9qJ�Vi
L�{����	7!+"&7;;26=326/&"72#!"&=46;76;25��E9	 	9Z�		�`		x	r	S���p		p^�	 		 	

����	7!#!"&7;;26=326/&"72#!"&=46;76;2 ���[9	 	9Z�		�`		x	r	P���p		p^�	 		 	

���� <D%#!"&54676"&=46?62';;2=32=4+54+"#"26=?6K"��"K6_5jK	U

U	�(/B/�N6""6N_oK5n	  	n5�]!//!����-#"&5#+"&=46;546;23546;2+ܘ`�		p�`�		p \�	 	����	 	�����'/7?G"&462'"&='&54?63232+"2"&4264&"$2"&4264&"�((4);*Rp		G5

@6jKKjKf4&&4&��jKKjKf4&&4&`((�!2
�

o6
	`9 KjKKju&4&&4�KjKKju&4&&4����2#!"&5463#3'#335#35#�

��

`������������
��

�
@�����������/?O_o��������/?O72+"&=46;2+"&=46;2+"&=463!2+"&=4632+"&=46;2+"&=46;2+"&=46372+"&=46372+"&=4632+"&=46372+"&=4632+"&=4632+"&=46;2+"&=46;2+"&=4632+"&=4632+"&=46372+"&=46372+"&=46372+"&=46;2+"&=463�		 		�		 		�		 		�		 		�		 		�		 		�		 		 		 		 		 		�		 		 		 		@		 		�		 		�		 		�		 		��		 		 		 		 		 		 		 		 		 		�		 		�	 		 		 		 		 		 		 		 	�	 		 		 		 		 		 	`	 		 	�	 		 	�	 		 	�	 		 	��	 		 	�	 		 		 		 		 		 	�	 		 	�	 		 	`	 		 	�	 		 	`	 		 		 		 	����/?O_o�72+"&=463#2+"&=46;2+"&=46372+"&=4632+"&=4632+"&=4632+"&=46372#!+"&5463�		 		@		 		�		 		�		 		 		 		 		 		 		 		 		��	 	
 	 		 		 		 		 		 	�	 		 	`	 		 	`	 		 	 	 		 	`	 	��		�
�����$,2/&?#"&'&6&546766264&"a=Z{
%A'#*=Z{
Q<#D@Q<#*(E-{
Q<#*=Z{
������.6Lj7'&6767>"2+"&=46;7>;2264&"%2"&?#"&?6;26"&46325"&46325467ua5

5a�
�0H[,,�\
>L'&5%%p&5%%�c>>c`�
�

�,,V�Sk	3`�(0l(k���#%#"54>?6327632�
���	h0	<h21Vh	�
p12h<	����/2#!"&5463454/&#".'7654/&#"#327���P	FA&
A�x���`��
&AF	x�����(4@PX_2+##546354+";254+";2=4+";2=4+";22#!"&5463"2645''`

���
H				`												�

��

M`� @�
��
@@`
g			�			q			q			0
��

 
@�``� @ ����;?%2+"&=46;7#"'&54?6325463!2+"&=#'7#P		�		 C	5��s	�		 	v1C v 	 		 	P4*�Y,		`		 �4`������5OR72"/&6;46;27"&=4?#"&=46;232#+"/#+"&54?6;23'�PP0	 	�	=8		�	=8			G	;*4 ```0		�Ѐ	
F	 		
F	 	�	

	�e0������5OR"&?62++"&5"&=4?#"&=46;232#+"/#+"&54?6;23'PP0	 	�	=8		�	=8			G	;*4  ``��		0@	
F	 		
F	 	�	

	�e0�����/?U"&=46;2#"&=46;2#2#!"&=4635"&=46;2#!2"/&6;46;2�		@		@		�		�		�				�		�PP0	 	`	 		 	�	 		 	�	 		 	@	 		 	``0		�������/?U"&=46;2#"&=46;2#2#!"&=4635"&=46;2#%"&?62++"&5�		@		@		�		�		�				�		�`PP0	 	`	 		 	�	 		 	�	 		 	@	 		 	�``��		0������5JR72"/&6;46;22+"&=46;5#"&54?6;26&/&767.7>264&"�PP0	 			`			
0	6(>*,


	$+
!```0		��@	 		 	@	 		p}1'3>=&\������5JR++"&5#"&?622+"&=46;5#"&54?6;26&/&767.7>264&"kP0	 	0P)		`			
0	6(>*,


	$+
!�`��		0`��	 		 	@	 		p}1'3>=&\��A�'DG\%"&=46;2#'3264&#3264&#'+"/#+"&54?>;23'"/&4?62762		K 2	
2!3(

(8

�D	X	D	
	?.��p-
7�
�	�	*	# +�0`0��	$$	�

�E�
�p
-8� �@&2#!"&4623.546264&"264&"�<TT<��<TTxT
p
T��/B//B`B//B/@TxTTxTT<//<ToB//B/�/B//B����
5%"'63227632".'&5463232>7632�G�G';(;�4Bt�tB4	!47K'6d?7���	D5++5D	

������-%3!"'&7>32#"./&#"7>?632b!-9<&��Z:5)=1$+b6@�%�U!FV ,$	T+A!)����	=!+"&#546;2#5�^B@B^��^B@B^�`��B^^�� B^^B �����2"&4264&"2"&4264&"�V==V=^OΑ�Α�jKKjK(=V==VC�Α���KjKKj����"*:D$2"&42#!"&5#"&5463!2264&"754&+";2654&+"�			�		��8P8 &&`B^�l((p
�

�
�
@
�			g	 	(88(&&^B�p((�@

@
s�

�����#-6>FNV%2#!."#"&5463!2%54+"6754+"6254+"54+"354+" 2"&4264&"p		��>T>2			�@qlo���B//B/C�	 	)77)	 		�Ll�YY(�lD����/B//BAV6�� �H&�
,v�3m��	4	2Q	
�	@�	2	Lb	,�	
X	.�	&�	
'	29	&�	
�Copyright (c) Font AwesomeCopyright (c) Font AwesomeFont Awesome 5 Free SolidFont Awesome 5 Free SolidSolidSolidFont Awesome 5 Free Solid-5.12.0Font Awesome 5 Free Solid-5.12.0Font Awesome 5 Free SolidFont Awesome 5 Free Solid330.752 (Font Awesome version: 5.12.0)330.752 (Font Awesome version: 5.12.0)FontAwesome5Free-SolidFontAwesome5Free-SolidThe web's most popular icon set and toolkit.The web's most popular icon set and toolkit.https://fontawesome.comhttps://fontawesome.comFont Awesome 5 FreeFont Awesome 5 FreeSolidSolidFont Awesome 5 Free SolidFont Awesome 5 Free SolidFont Awesome 5 FreeFont Awesome 5 FreeSolidSolid���	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU�
VWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������������������������������������������������������������������������"���������������������������������������������	

 !"#$%&'()�*+,-./0123456�#789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs��tuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCD�EFGHIJKLMN�OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@�ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������
glass-martinimusicsearchheartstaruserfilmth-largethth-listchecktimessearch-plussearch-minus	power-offsignalcoghomeclockroaddownloadinboxredosynclist-altlockflag
headphones
volume-offvolume-down	volume-upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalictext-height
text-width
align-leftalign-centeralign-right
align-justifylistoutdentindentvideoimage
map-markeradjusttintedit
step-backward
fast-backwardbackwardplaypausestopforwardfast-forwardstep-forwardejectchevron-left
chevron-rightplus-circleminus-circletimes-circlecheck-circlequestion-circleinfo-circle
crosshairsban
arrow-leftarrow-rightarrow-up
arrow-downshareexpandcompressexclamation-circlegiftleaffireeye	eye-slashexclamation-triangleplanecalendar-altrandomcommentmagnet
chevron-upchevron-downretweet
shopping-cartfolderfolder-open	chart-barcamera-retrokeycogscomments	star-half	thumbtacktrophyuploadlemonphonephone-squareunlockcredit-cardrsshddbullhorncertificatehand-point-righthand-point-left
hand-point-uphand-point-downarrow-circle-leftarrow-circle-rightarrow-circle-uparrow-circle-downglobewrenchtasksfilter	briefcase
arrows-altuserslinkcloudflaskcutcopy	paperclipsavesquarebarslist-ullist-ol
strikethrough	underlinetablemagictruck
money-bill
caret-downcaret-up
caret-leftcaret-rightcolumnssort	sort-downsort-upenvelopeundogavelboltsitemapumbrellapaste	lightbulbuser-mdstethoscopesuitcasebellcoffeehospital	ambulancemedkitfighter-jetbeerh-squareplus-squareangle-double-leftangle-double-rightangle-double-upangle-double-down
angle-leftangle-rightangle-up
angle-downdesktoplaptoptabletmobile
quote-leftquote-rightspinnercirclesmilefrownmehgamepadkeyboardflag-checkeredterminalcode	reply-alllocation-arrowcropcode-branchunlinkinfoexclamationsuperscript	subscripteraserpuzzle-piece
microphonemicrophone-slashcalendarfire-extinguisherrocketchevron-circle-leftchevron-circle-rightchevron-circle-upchevron-circle-downanchor
unlock-altbullseye
ellipsis-h
ellipsis-v
rss-squareplay-circleminus-squarecheck-square
pen-squareshare-squarecompasscaret-square-downcaret-square-upcaret-square-right	euro-sign
pound-signdollar-sign
rupee-signyen-sign
ruble-signwon-signfilefile-altsort-alpha-down
sort-alpha-upsort-amount-downsort-amount-upsort-numeric-downsort-numeric-up	thumbs-upthumbs-downfemalemalesunmoonarchivebugcaret-square-left
dot-circle
wheelchair	lira-sign
space-shuttleenvelope-square
universitygraduation-caplanguagefaxbuildingchildpawcubecubesrecyclecartaxitreedatabasefile-pdf	file-word
file-excelfile-powerpoint
file-imagefile-archive
file-audio
file-video	file-code	life-ringcircle-notchpaper-planehistoryheading	sliders-h	share-altshare-alt-squarebombfutboltty
binocularsplug	newspaperwifi
calculator
bell-slashtrasheye-dropperpaint-brush
birthday-cake
chart-area	chart-pie
chart-line
toggle-off	toggle-onbicyclebusclosed-captioningshekel-sign	cart-pluscart-arrow-downshipuser-secret
motorcyclestreet-view	heartbeatvenusmarsmercurytransgendertransgender-altvenus-doublemars-double
venus-marsmars-stroke
mars-stroke-v
mars-stroke-hneuter
genderlessserver	user-plus
user-timesbedtrainsubwaybattery-fullbattery-three-quartersbattery-halfbattery-quarter
battery-empty
mouse-pointeri-cursorobject-groupobject-ungroupsticky-noteclone
balance-scalehourglass-starthourglass-half
hourglass-end	hourglass	hand-rock
hand-paper
hand-scissorshand-lizard
hand-spockhand-pointer
hand-peacetv
calendar-pluscalendar-minuscalendar-timescalendar-checkindustrymap-pin	map-signsmapcomment-altpause-circlestop-circleshopping-bagshopping-baskethashtaguniversal-accessblindaudio-descriptionphone-volumebrailleassistive-listening-systems#american-sign-language-interpretingdeaf
sign-language
low-vision	handshake
envelope-openaddress-bookaddress-carduser-circleid-badgeid-cardthermometer-fullthermometer-three-quartersthermometer-halfthermometer-quarterthermometer-emptyshowerbathpodcastwindow-maximizewindow-minimizewindow-restore	microchip	snowflake
utensil-spoonutensilsundo-alt	trash-altsync-alt	stopwatchsign-out-altsign-in-altredo-altpooimages
pencil-altpenpen-altlong-arrow-alt-downlong-arrow-alt-leftlong-arrow-alt-rightlong-arrow-alt-upexpand-arrows-alt	clipboardarrows-alt-harrows-alt-varrow-alt-circle-downarrow-alt-circle-leftarrow-alt-circle-rightarrow-alt-circle-upexternal-link-altexternal-link-square-altexchange-altcloud-download-altcloud-upload-altgemlevel-down-altlevel-up-alt	lock-openmap-marker-altmicrophone-alt
mobile-altmoney-bill-altphone-slashportraitreply
shield-alt
tablet-alttachometer-alt
ticket-altuser-altwindow-closecompress-alt
expand-alt
baseball-ballbasketball-ballbowling-ballchesschess-bishopchess-board
chess-kingchess-knight
chess-pawnchess-queen
chess-rookdumbbell
football-ball	golf-ballhockey-puck	quidditchsquare-fulltable-tennisvolleyball-ball	allergiesband-aidboxboxesbriefcase-medicalburncapsulesclipboard-checkclipboard-list	diagnosesdnadolly
dolly-flatbedfile-medicalfile-medical-alt	first-aidhospital-althospital-symbolid-card-alt
notes-medicalpalletpillsprescription-bottleprescription-bottle-alt
procedures
shipping-fastsmokingsyringetabletsthermometervialvials	warehouseweightx-raybox-opencomment-dots
comment-slashcouchdonatedovehand-holdinghand-holding-hearthand-holding-usdhands
hands-helping
parachute-boxpeople-carry
piggy-bankribbonrouteseedlingsign
smile-winktape
truck-loadingtruck-movingvideo-slash
wine-glassuser-alt-slashuser-astronaut
user-check
user-clockuser-cog	user-edituser-friends
user-graduate	user-lock
user-minus
user-ninjauser-shield
user-slashuser-taguser-tie	users-cogbalance-scale-leftbalance-scale-rightblender	book-openbroadcast-towerbroom
chalkboardchalkboard-teacherchurchcoinscompact-disccrowcrowndice	dice-five	dice-fourdice-onedice-six
dice-threedice-twodoor-closed	door-openequalsfeatherfroggas-pumpglassesgreater-thangreater-than-equal
helicopter	kiwi-bird	less-thanless-than-equalmemorymicrophone-alt-slashmoney-bill-wavemoney-bill-wave-altmoney-checkmoney-check-alt	not-equalpaletteparking
percentageproject-diagramreceiptrobotrulerruler-combinedruler-horizontalruler-verticalschoolscrewdrivershoe-printsskullsmoking-banstore	store-altstreamstroopwafeltoolboxtshirtwalkingwalletangryarchwayatlasaward	backspacebezier-curvebongbrushbus-altcannabischeck-doublecocktailconcierge-bellcookiecookie-bitecrop-altdigital-tachographdizzydrafting-compassdrum
drum-steelpanfeather-alt
file-contract
file-downloadfile-exportfile-importfile-invoicefile-invoice-dollarfile-prescriptionfile-signaturefile-uploadfill	fill-dripfingerprintfishflushed
frown-openglass-martini-altglobe-africaglobe-americas
globe-asiagrimacegringrin-alt	grin-beamgrin-beam-sweatgrin-heartsgrin-squintgrin-squint-tears
grin-stars
grin-tearsgrin-tonguegrin-tongue-squintgrin-tongue-wink	grin-winkgrip-horizontal
grip-verticalheadphones-altheadsethighlighterhot-tubhoteljointkiss	kiss-beamkiss-wink-heartlaugh
laugh-beamlaugh-squint
laugh-winkluggage-cart
map-markedmap-marked-altmarkermedal	meh-blankmeh-rolling-eyesmonument
mortar-pestlepaint-rollerpassport	pen-fancypen-nibpencil-ruler
plane-arrivalplane-departureprescriptionsad-crysad-tearshuttle-van	signature
smile-beamsolar-panelspasplotch	spray-canstamp
star-half-altsuitcase-rollingsurprise
swatchbookswimmer
swimming-pool
tint-slashtiredtoothumbrella-beach
vector-squareweight-hangingwine-glass-alt
air-freshener	apple-altatombonebook-readerbraincar-altcar-battery	car-crashcar-sidecharging-station
directionsdraw-polygonlaptop-codelayer-group
microscopeoil-canpoopshapesstar-of-lifeteeth
teeth-open
theater-masks
traffic-light
truck-monstertruck-pickupadankhbible
business-timecitycomment-dollarcomments-dollarcrossdharmachakraenvelope-open-textfolder-minusfolder-plus
funnel-dollargopuramhamsabahaijedijournal-whillskaabakhandalandmark	mail-bulkmenorahmosqueompastafarianismpeaceplace-of-worshippollpoll-hpray
praying-handsquran
search-dollarsearch-locationsockssquare-root-altstar-and-crescent
star-of-david	synagoguetorah
torii-gateviharavolume-muteyin-yang
blender-phone	book-dead
campgroundcatchair
cloud-moon	cloud-sundice-d20dice-d6dogdragondrumstick-bitedungeonfile-csvfist-raisedghosthammerhanukiah
hat-wizardhikinghippohorsehouse-damagehryvniamaskmountain
network-wiredotterrunningscrollskull-crossbonesspidertoilet-papertractoruser-injuredvr-cardboardwindwine-bottlecloud-meatballcloud-moon-rain
cloud-raincloud-showers-heavycloud-sun-raindemocratflag-usameteorperson-booth	poo-stormrainbow
republicansmogtemperature-hightemperature-lowvote-yeawaterbaby
baby-carriage	biohazardblogcalendar-day
calendar-week
candy-canecarrot
cash-registercompress-arrows-altdumpster
dumpster-fireethernetgiftsglass-cheers
glass-whiskeyglobe-europe
grip-linesgrip-lines-verticalguitarheart-brokenholly-berry
horse-headiciclesigloomittenmug-hot	radiation
radiation-altrestroom	satellitesatellite-dishsd-cardsim-cardskatingskiing
skiing-nordicsleighsmssnowboardingsnowmansnowplowtengetoilettoolstramfire-altbaconbook-medicalbread-slicecheeseclinic-medicalcomment-medicalcrutchegg	hamburgerhand-middle-fingerhard-hathotdog	ice-creamlaptop-medicalpager
pepper-hotpizza-slice
trash-restoretrash-restore-alt
user-nursewave-squarebiking
border-allborder-noneborder-stylefanicons	phone-altphone-square-altphoto-video
remove-formatsort-alpha-down-altsort-alpha-up-altsort-amount-down-altsort-amount-up-altsort-numeric-down-altsort-numeric-up-altspell-check	voicemail
hat-cowboyhat-cowboy-sidemouserecord-vinylcaravantrailer����k%�����assets/webfonts/fa-solid-900.woff2000064400000224464150755142440012671 0ustar00wOF2)4
��(�J��?FFTM`�.
��@��$6$��  �+�[�X���fH��Qe�O����$y�,Q�f��[U� ��������Vr�6i[��CE�E*��L2��ŔK�PMj�C��d�b�	m^�֢� �dDDI?)�{w����(/�Zk��
��΋jQEyd����%{Xٻ�Iou��gp:���&i��"LPP�֥����ո��b7�S6ħ;fdr�T����9��w��i�&D_�6�uӤ��DB����.g���U2�0�ӭ��7���-��	�aK�
�t�3F�Ko�	��� ���<�����{���U����p��!���%D2w��D��K�e�Gy�0�U
�}�����6s���/k�I�ySo�")A�Dh[*$B�lB.<�o��>3�"}��|��e�̇��WѼ@��^���@ՠ�w�elo1]%ߔur�0_�(oݙ����x�6�zn��HD���t!��St����+_�ph�a���n�u�NS:�N)2��#-�)0C�=�b�<�:L�=����6��8IX`���t�g^
�}E��}ƀ}�m����'�R`;�u�
t����͸�I����C(ob���ꬊ�Acb�6C"2�����*zw���|-|	�0�
x)���Ԃf�# �`x~n���5�1�=ؠuE�6`��Q"J
���0Q��(��D�S��N�h�;=�0.�K@a'j	�������X�c��(��8� #�}fB�@��Z�K�r̜�#�@K�Gb�ZE�*��@ u����G>	Sgw��>Y`r���F���Ro��ߣ=3�C�����l�v�+�^�_j �\�9HF����⯀o��^����h;�o�"���G�N���sj�K�N7yh�0$<0!p!m6�?����Z�{@�2���dl�����U��f�*��=��l���_�a57��q�^l�-0�C��3 (�m�V��ζ;�����N{��aý�S��:C>�AM%����6�+nc���l�lDLd�8��TRӔ�gK�vD�M���L�l�����Ü��{^�Zۅb+�!ӒH.w�K��[G�SL��^+{��u�~�������43��g�w�cY�c�4��H�d!gdp���oi� Y�sf$�H6&���q���+����+��~������_��/���H��闢!M�%�v��*���j��{_=fw���u�\����.��#"���L��)���'��H��D�H��Wd;IU�V�ql��"AJ-ReTƯ���ڸZ_����p��n-�g�JF	���r�-�v��l�E���P��N/����!蛑F�hw��dW.�LDĝ�w�Ϥ��w�!�U��"��1"��O�3�b�A%�D�`�����ݫ��U�m��P��@�$����&���t�l�Rڂ��2��y/s�O�^k��<��J�P�@ m&����/P�{���z�P��BW�d��%�2ZEGN_H�+:���Ku:��n���?T*���0c��}�؆�y�����u`����M� �je,؁���s�8���öMV���A���7�'񿗅-��k
wd�`�M��ly;2<���Q����𿖄g��H��ӈzハf��N�%RX\���T�2y�OAY�q|~����N�k�ѿ�|�\m�6��_�p�=��E*�
#^����G�4�@b�ڝ>S�b��h�9]_[\���J�r�{v�S8��QR^��Wo���@���HB�������;/`p(d,Jz6.� T,"2�]�v��k7lٹo��Μ�p���mں߭���b�Tk�ZAq9%Um}c+Gg7O�UR�56�tv��M�����g`jek��]۳��Ǎ�o҂�hRh@HTBrFNYECWπ��������򪦶�n�p"5=�����s_���oZG��|�C�����؄����^Mjv;�\��=(GF�L�l��]���՚_M����k����T�z�IZ`<��}����Xx*��~�e�1���V�g<Oy,�6 sB~T�(\�ug+g�䈍�	��n}8o���6�B��q��T�M��4y��.����	p_��I��KJ��:�k��e�7m�u?�L/������ϜhL��C��ǂ��m�tfx���V���?0s~���o�g?|�٣נr�d?|PZ���L��h|�z��&����>z6~��K�de`~|���ų�n3��B&	d�����f���J��I%B���9�6�\&rYD�~|y����ѵ����O_}����VUQ^V������:ۛjs�C�PVRگ�_5q�����bG���ޟ
�<K�0�=�2tU�X�$0^_o�9��c����$���n��q5,�..���F4�/�JCbܯۺL]]y���:ǒ�m�<�Y�đ�X�������<��nj�y�-��3���e�����wM�gAp����ȔD�{yh��sX�=�LF���aʸ�Q�U�ʗs�Z�����iӕ���|@�Y��k;_�����x<�7��p!H�[x�^\��'x�D��EmSk'��ᅲ4�e�szJ�
KR�:�k_�eD\ב�E,�ؑ����m�2�z�=�;��mrU?�,M/���2%�|ĕJu�\��m�����z���C�v\1d�G<Y�61���O��Ư]��dB��{-E�%�u��W;��mQf��#�f[�A�|�Syo�v�ߚ7�m1���+���֨o�'1s`Z6�C���	!I��r�?�LY�q/t	�LL�:L썞�)��
�9�R�%���Gj&�z݆�5�q�D7�r煮�^}F���
)�����*�)�4K��H 3ZR�7�/�9�S��pq3�T���9"z��;�����r^�i޶j���==���3��7c"�U�c���;�������~�kh�=j^V��<�e�O@���-7t�-ªE�ޱ���Ub��M���,�
�
d����oǃ�uπ݃�����Yn` �9�'�a��z`:�Y�@5����Bw~�b�2��8�`�; I�C岚�$��N�UN�ѐ1㜡�īQ{��U���8���\� k\�e��}���l��6߾	�K	��lN-z�7A�dYb[�1��V]�Vo6]�`L�hP�@��8���w"�� ��u&�JȇS�5��lDΜK6����W@�(����C�L'��ڌY&�޹�E9b�H	�a1��t�Ô�M&',����@r���i��g���J�q��ʯ`ˀ�1��^������_����C��L���������|Obw��Fp��:�b�b"9p���2�!h;�	=Ӽ�	/�~�s}�&�W�0�.v����N��&f�3�ΐ�Es!�ث���̴inl�%�|c�;N˳�Mhَ�ld�@ΑB�K�B�e�ob�g�`��jЛ�p�������?C !t���T��Q����w�:�hp�~��7�'�`/5��0��{`
�_U����.O&������}���g�Թ=�I�:.��B�%�\��Cb�Ư*L��;�)����hC:��|�_�\<�shS��Ǿ;8���aX"�[�+LM��=�6�AVh�w4K���k�c��`A�)����^<8F���,�X�;פ�J���vp?
�_vS��]-f�`	*
�D�׭�d���.a@�D�t��A&�<Lc|C�4��k�	y`�r�Ĥ?�Dʭ�ȱ�V�<�A�|�XykD^?��3�2R�Z�rEfD��<"���a�"��o3��<,�$�{e�Xż#�-*@�C�;��_i���|��^o/@���(��$�P0��8	�XZ
"+�p�C[` ^)�!�a��/�|����_�j�p�2���鯂�֢9SF���9U�ehs���z��@d�	r��Z��mbL^<�
si���eX^�K�0"���<�k�Y�l�(�R���4}�#� Ҁ���,��$�|����7x,;�3�zf��.|77Q�xy 2xfᷮ��
F��i�a�E�>�i�9�����ee�l�T'-N�gs@�!�х�P�]Uva���xtAP�~Y�i
u�%�.!V�[��e��C��n��=�#+
�5�C�R@�T��Vi�11�s�,�����7����0N�?4�9W���rG��i6��B��f�3a�B�QM0���X���W���a�8�-K����Mm�|b��x�BC���/
P�e���>B�TwP�:o���
����lNTW���js
� _�K�UC:)	�ʪ[~T�=D>�>T��m���0�-��c�pi���	���3�#�/�oa�eBfODo�����D��s��W����"����|R�T�����J���:��m��#p^�$q�*��&"��v^�:ڭ���DZ��0�s�������"�\8�(O?�ңzLn+���ı�#�,�8]�y^X�S�8����.B��@TϾ����9��Ʌ'���{���{�RE����VmT@h��v�^K����1��<4�+�L����\Z��e�Sz�IV@D��k`�9�P�G '�XYG��ש�9A_�3�%k��;�)�Ugm)O�t ���Q����|>���t�fe��:�B�(t��t���.Z]^��TYŢ��-���ܸ��?��#�eƖ7�0�Leus�G4�U1�(>S"�_�D�T"��ȇcHi"���'��
�k���d�x�� �;�"�4�����������n8��B�A�/So3 �fD]�I]o"���,?P��TL��r��%0 $-���i@.Q�7��2~�(�R�Mr�N�\8z�V;˘{
(��N�a^p�Z�����qD>I!Đ��E�T�!�C�X@qdl����QQW���$�j��PF7�i���rM��Н��5<���n���4��3s��v�k�^n�.�Q��c�ǪQm8�5�4'����.����'��4"�i�H�͘�Ϗ�O����3D�P1ˑ�@xrI��)��]�?�(]�O=R���YЕB��HF2WSHLy3}ڇ}�-���2ʻE�bN{UGt�PIK+PAa��^6[{)�����|�t\|QT���yc�/)1�3��J||�X��n��g�Ne"{�0�r���ckd4��'���Ӥt��D�+��DDam�<�7
�Q6(�@��
�Ş�O�Iyo�A�B(��=Ӓ�z�bbe�ip�Y���<|y�z4�����Tn��;��:}����m1CT��1����K� Hs�K��>��d!|��א�cS"�Ti0�����wd]K�@����v-L
#�o3g����Ҡ6k
�,��^i��hRn�{j*m4@e��N��1	k*���z~_�u���c^��TC��Y>B�]�bzsRt�l:=�k'�:�����x&;�p%ʳ��Ӷ��`H��,{�g] ���uc� ��(�3�̐���%�fi�uߺ�b�mo�%u��7W͕���}��sc0D <
,�R�X�F�.1���*��Q����c���R�"�ΜU��s���AL1V�<Q��l=���\���a:�-�.��%��:HoBA��<��2XZ��޹P�ͦ�P�V>�!u
�[�7�ߝ�?�/�W]Y27��� ��Z��ǜ��|��c%^�&�����Cvt�� ��eZK��W��Tb[�P��ԍ#C���h��Zʱ�ј��d�i
OD�;�2ԞȢ��iQ�e�E�O�k�P$��9)�R�p�3۱��K�u��RO�nL����ϕ�R}B�1�۴�pRC���6�zE��㞱oOL�]t�a��O����[��3��J��o���r��{��7Vp�o��t�˖g�$Ƙ�� I�P*]W���J��gM�'iQty��X��*�H��� LK4O��[�Q-��%�(����;�~73	-���rXe�G���c4�jf6�`�juM��1��#}_��y���囤(�D���4�����C�a0 Ͱ.:㿌�&���%�tJ����m��:���7'�ѐ�SN��EB&��`�K�����*@�B�����&�
�G���a��W�:������8��~�B��~v.7Nw��ⲻ��/|�B2gv>�y���Q��K��w��R�UCTu����1ۍ�5��c]ޖ��w��%T�
4����zzX��	�S,�T)Űɞ�y`^��B�4��G����dc�BR7�'7̬�q"�6>3&�@���ѕ�׺�b�ܠ5
�����,i�(V�@m��oz��v�|�q��Q!��_s��Rb��ǕWG������99��Ií3
2
��Q0T��.�F���-�;�.�'T;G���!�fr��^	dv9zkG��3��v��:��|��"re��A�!��7��b�7|��}�	f輍�۳���q;�L�9
L��#-�G���jg`r�-�@-"8ש��7ޗM���+L��b���K�����=�`NI<�a��H?f��xf��6�s���$�x������p�=�ʮ܍1���k���b��U&�H��{��Z�$5��)B�j��&��n)0����܃��nS$~��]���v~p�b48.�ѩ��z��
K�F+�A��#�ud4m���Z23��ǩ�����L@u����ƂZ�ϙ+|\A��_BB���$�j����"#�8T2�+kOT$��IN5)E����A����p%����V��<�KJ���G�6(}E�Ɋ��^��
.��T�~�����z盠
,?B�o��!����s����JC�[�V�'y�+T<{u.���U,!�7���|����$������%��j�pgYs3�sr&R*hr`��r1UCy��˕&r��Bޙ�bW�����=aI��L���6�va�V���wʥ�{����H���ޢz�3��V*����ef3�- �&D�I8���^aD��2�&��VF�ڵ������֨��Ȧ�u��q�O�/�����!C��ӎ�ҡ�0A���h�"���q�g���\�v�z��|���5�w�+WWn�H�_��~S�����&�����YTb-����I�x�$�M}�ƦU^8E&���x�P����W�5UЈM�iq,�hI�xXX�g�Z������[�<���.���Q�n���Н!��"5�k���ijq��7�e�QXcv�}�)��X;���UH�F������RZp}|~����DL���2#7UG$�+n
��ݹ�COb�]��ހ6@ݽ�r�^�u��Ebڣ��n��i�C���@�`O��y��yn�*k'��܃||�wk|X��+�Ȅ�Ѣ��]E���me�[lw1���v�n�rӞ�^�nF��s��ꕙ�9�s��N�1ctRޙ���U����S�����ȉz<������A��	��ƴ��0�<��z�+D"܊]����7YNuˡʥ� �`�i(j�fbc�>M}	�0�|Z�Ql�5�M4V��dY%��o�\�3�<�8�����^)�Ӓ56kb5�1�@ː�}��.��R�->���j8Ƌ�i�|1u=X�h�Ɉ
�7l����Yj\>0y#@���!�UA��N[hv�җ
��?�]3U]3���C3�j�蛬��d�����Jٮ��ʊ+��ϧ�g����VoT+V���
0@�:����Eq����B�@�O$L�;PTU]}#R
�]-���uw?�(YU���̒	Ivp�����������g���o�ym��O���c��`ec_n�ʼn}���K�Vn�2�*'P�x�x��}c5�)�5��
Z�����;��X�<V?QaT�/)Uz�6W1^ATL^�)!����lIQ��]�G
���4/���3�C��;=ޡ귑��Ɂ7N���l�#uM������b�G��q�c�=vǹ��H�� ��v�AN`�Y�;O�Qi	�9����{:ں:���{#Cwn/�>��)���ڌ�i��1����$�0����/�4��ő�Kc��G�4x��e=��sUc_k�RW�͓�&FB8hl#����J���-P����8?7Z�DG��=��B �}��7�=��
��[cS��f����t
�%bc��Zײ��(K�G4�"����J,�"�K�����r���,j���h�r���g�J����0�{AT�ZD�W�}�]����
�7?z�IWXsD�%��J��i��ͩ��,��p�1��+�'��T��$��H	�11�R:6v�W��}�Ko��E�ʅϤN�mik���4�N[��})�	��n��pF��%������.A�ݺ����&�D��0�)H�+v+��O�By������`W�'n�����<c�?�J1�v&`�Rqʚ l�GOv�o핳?������)p�Q��*a�z�C@�ӵ�e�V�j����l۞��W_�/��j&[����POt���T���V����!DK�c��.�m�K� ��Pώ�y�	��՗��{-��i�OS�`�@��>�o�� ��d��[͸W Y��1`R���X�V�bE�)Ž"V?�^-���\MJ���i��-�����15�p�2���9��
��k�ĕ`hl��=�gK�1�(�u��c��IvK�M��6r�p��m�}�p�2i��%�
1�|5�I�D�ވ�L0B٥P�H�5u{'�e��:���;�u�2�j(�x��S��;4��vm��%\}
�T��;�~����	Ľ�?4�-T4]ׁ7��7��S��0�gjB���$�		X&�`�m��m
�i�Q��k
�m�_�ǎ����S�_���?���k��{u=��o3ݎJ�/�������'u�c��q=�C�QI�wB+�_<��;����E�=�!p��۫��Cv^Ⱥ�,�še���	u!��s���$�k�F�����Y�,یE�J�3��ޠ�`tc��]�=�g|�[s�y�i��Ԓ��u�,�{�/j$��xim7zaw:�����h��|!�D�����Tn�/�c:@̜�rV�Jƾ]�m�xtOlMN�WͱU�����b�=$�Y	rs{۷F�X���b��np���Vu������
�Q��,�s8��^����eFG?��:W{S�x��+��;�=�����|�'��`B�3-��R�����^��H��ט?s�wg0p1'�f� @��~��}�^�5�=�d�||랳E�TjT�;���D��\�zC��d5�B2���ND�/\��`�]��:� 줼�z��q]�Nă<hVQ�t�j(����d@�*a�2��uO��3�9�9-pG�ћ˽E��!��}�b��y�Z��]{��v����v'oH���*B�51k�[������ˑ'�5�[��
�_�+���o�r��.�ѝI��}��A�,��y��-��Ґ�lXC�_�"-���	XR%=/��@�
��i�RvSS_������(;�>�ڒ�jy^t����4�Ҏ�h���3�!�{(ꋛ��;���E�;���W��ܦwdy�i�E�eO��vͫV�Lx��Ky�r�d�b�Q��h�n�<M|>+�ϟ@w����(�hj�A.Z
��gBH؅���r��V�g�d�;ԕ������i�$>h!��VI��ܥ3��J�[���.���O�J�՝���<�\LZ�?�*/�)i�,'����o��L��t~���M+�7I�2b�z�=�L�7��R'��0�u�4MjZ�l�X��o�b���m�(����bE���Θ��!��Z��Ԙ,��)���YT"~�����g��u�����XB��x!T�N.� ��j�t�N��;�O㴎I�N@�Z��%\a�c�<`����J�ϡ��g��~��O��}��m~p�K��k�.��r��Q�/ ={Y�>��QA��]	��9х�T�?��K�a�4S������L�b�#e�^�t_�2��3Y���`մ���}�ȯ��\����\ml�~s:�Q��o����k��C�ȈX��,�z�B�w��I)1Ϻz�X��A��N�,�W!����q�����Jl�3�7%P�@km��gA�^�$�&Jړ�Z��K�}we���->�gB�P���Vh����H�9�j]bSdK���@L���5�%�'�4�ny���@j����h`FQ��Ϧ[>�yN/�
��@YZ��fa�K��x�)8OBM�5(��4��B�z�@�a}��y����q��2 ��{��:��e�N�Ӈ��'1X��X�+W����&k_J{�U�ft�%�pP,�������ҫI�F=<^Ϗ$�]���y���@�JI����fx>@����uj���R��՟_�v�8wζɸ\Jx�3�e�X���� �%�Wn���ab���ѦTG�G2�A^t�6�����!ځ2���^�}�;lD�#�\J����ܿ��W3{R_0y����6N@��ߏ_����g�$v1S{¿e��m�K�=�^��0�_Q���w7�N4T
����: }���V��]�;T>��j��^7�닝_�=NI�J!cLyP�;�Z��e�yz|��u��>:y(�!v�LL��8�-�h���ʨwQ1�lcm��T��.��JL K�Tp�VF�d�W?܅!5R������!u���oq�eX�Ă�Xxi��D^�!�.�B$��m������d���l��3QOP�Y!����f�UB��IB_�0F�����l)��$�a��&�O|����{���������cRߴ�򇎂5�=�1i�I�rh-�=�>�A9?b@���#�T�\i�ԧ{,O�C�j�Cy����s���ꉽ�
t]R&N�-BQ�2�S��]��q:m���IEӸ�U?��N騭��v�qD+��+����CZJ���z�Dz��ӎU�
��sg?���~0�e|3���$!ֆ����5�C�/]6�;�O��]�B���&��g�)��J1y"�Lj`�t�S��Wf���o�6�i��Di����c�0��#�ߑJ�:Y������Ry�Z���L�ʪ��R9eY���ӌ0S����؏��y��f����…���`3x
�P�8��)�"��0�Q���Or5�!�db��K�
yMb[�;}L_掺J�w�4�E�,<� ���L��s3�D0��P���"Q�`��\�f���PaB
¨"ӛ
�`R)�7��I�B&���$�3Q��2��~��i�<����ш����tnf�	P2�ɰ����xhZ����6�;��x�MF��:�X��%!�|θ`t�s���q��_�`Ld+�Z�^T��T[A6��C@�l�`F�a~��767Wu��zҺ]O�*��/��d��WEv����0�a�x�誅Qc=���kc
�ͺ��/T�6	zƆ���I�;��{���w�oj�2G��N���o���m�u��k՛�4!>�2�z�U�񚾏��>c�gmO���6��'޲1�
)�${�>3&T�Ā/j���T��?);��c���m�xV��R��mL�VRg�d~h���\�vG�h{{����Gt��g��?���P&�U��r�w���al��wd��3�tӻnE��'}E=�km�ArY1�C�Ĝ|68螽�k��͓>i�uç5�5Tڢ�B2֌���g��Z�Hp�`�Gװ��s-��fE�I�h�M+����|��]z���bDu�����h
����E쭿2Y�Ic���`��b;��vh`��u��������B/�)�y�E�m4a��?�v>�I���|�>�r^��M�
p;��jyx����4»I_Q_�U5
���{��Gq�i�25�#�=�����a��>�e�=���1�Q�@�~�o�x kS}�-�5f�K6��h�ޫ�\zBnɴ=���8��+���_gG���0�Kƴ>90�Q�j��=�"����_�}C��[}�ʣ~�����]��l�:��tٜ�M��e�v�0��M⤶B�F����+�����(z<�9�_[�B���*�+;r䅠+����ʾ$�����B�[������0Q��u��f	L���)���{E��"D��a�]�9�Z��q��I�9k�(�Ê�Ը��'6H����ӆ(�V1�`��j@�m�Nȡ�UV��3���j�bٮej�4,���c
�T�i֡��`�B��X4��5R���vÐ�0֥)���X�V�e�~=�r�zHGz�W[<r?7?��3��8M=i�-��\}6v	-���J�5�h�ȹ��d���m�b�$7
���
0����;
Ы�ѳu��L\[��ҵ�ub�L���܉���	s(�D��7��+s���!���A���g�V_���@�F�㧦�t�]Ju_�K�nC��g�|5�!���Ɠ���(-ޡ�Ww�����q,���
���i ]+al������~�-J�Tk�j��7�j3d`$/�r�ba��~���g����m����~��W9$P��\��1ح��{�!u��(wG�T��Juox,��r��P�AN(q�̻Z����ؙ^E]�h?3�Ͽ~��p�V�UĐC>����/WR��"��;��-�����av_�xֱ�/~�F����|�	��mH\��O.2�H+4�����!˸�-�P�L��~l��,������~z����M}dj�T���R=�&��ehv�K(�7�S
P��~3���>QU���y�����0��>�5������ћ��NG8��̒T@��?"�X<!�NmƄ��n�qFR}��k.�.��8Li�M����@�G�M�/�(����x��3t�B�'/�!��Lp-ƒGO1@�����4���+�<�zo+��nӒ�o���)��#�y��_@�!7Q�@��XzKi2�W�𣰮Qw�f[��>Z]�f4�j���詤[iBg}����r^x�p~���E�I��7����p�H�9��Kˆ�dU�#�M�"�fd���Jͦ�c><i�"���9i�pD����b�:����{�'�a	�xB4���%��ZA�7�q��ڦ�FzD�$��&��^��觼h�s�$9��0��kM�J�k�U�ɥsΛ��+�P̖�Ű��Y �ؐ\�b�$���uь�a����7�Źd�%�Uh�M<�ϓ����vkD��4Ά�H�35�W0��arc^jJp[K�ew:�� ���?{�6�����(!�A�Q��c��4�V$;[�@X��qj��{����mF
���D���.�U��x�����u���\6��?�[�?��T`�4����A�ڧ����ļP��ay��8�Ҋ��T>hG�~6_.�zSZڱ\$*��p-g�Y���s�sC��m�$�Ax,��}1�]�:%�e�Z��d�p�zZDm�6s:�N�x$t{�[P���>ǁ|aW�_�=%Qگ-��H����#�U�{�whJyމ`g{.�-��=�yIui�Z����Q2��H�6�O�҄Y$KUTJ5ƞ��^��,��h��7���0�r�۴,$��,��ΰZ^c~��`Z�B���͂ougU4�#�6����遞���$f��l�5D.�ɫ^�n�*a'R�B!�{��D?K�篗S�p�V�<���Z��˕)Z@:s�ܕ�.�ߞb��s}qg���(�v����n)��҉w��]�\:��h߿/�N��氧�������V�!�eG��"�e���a�h��SS�d��˘�k��zШ��2�ã^y��v��G|r�1=�^��G$ ��+4�� �gj�du\���G����2iY�g��Q�۽|���%�j9�_kM���SU|oB�wh��`S���ѳ�=y����$:�n^l-�|jD�u�����j�4�c���c�槒5y8�������I���
�|�B���FKZ�R=������ �lDo��fQ[��oX墊c��‡g�_�#y���ɀ3�$0�
���@N?�Lg/u�(K9���w�җs��Z8;KW8�����{��)@�Yp�wR$:�,h�u��0��RZwQ�%P�I;�<3U9Vm��ls�n/��pt����6!n����DNJ���ۅ}���]�1*!�j2�أ��cU@y�g��dc��	�R2�@��0F��YY�[��Im�+����2F�v�o�a�Y�:�'���r�xf�ʹ��P�k���B����9M+m��Qlؠ�D�l�x��GJ��9KN͍~�6��e�l\Y?���~F�p��n�u7�&o8��Ϯ���I���`�X �4Ĝ�-��9$�tY�_L�$b�&'�]�T�E��I����@t��-�L;�a�%JU>|��#}"�H�c��;�����u�2�ccw�9NJ���Ԡ�:��R\r�ۜ�0��~k�G�RW���?H1��J1��\�=Z�-�j�R
���R��o��켘+R���3~}�j�}�;�ZK"�Vu�F�	���yb��>f&00�k�*&h׼\�i
4E3���Ɛ1�L����Z�a$�&	n�  �h9�'�B��9!�+����_P�f:�~�-�	�pj����Y:��.�i�K0�Y�Q�lnu����n��”��i�!�7�+��-���� ڧY�`�lY�
c�V��m�>۬�Ȗ=�! 0�nieSB>�7,A}SH_��nB�=1��ҒZ��,C�����vN�7Ke�e�ł&�מY������BF�F&��	��v�%խ��u,��c���ȼ�5���3����b��U��i�sc%�o4�&���}Ի������+��Ь�$7s��Ln��T�:�
L=�8���;�a
�ϸ���::2��S=�����
�a�@��k�WZ�}�rh�j]����B�t;wi*�Y����W�+�t�g�}�6�j�<Z�SZ�830>Xu�{��d�`�f�Ӽt�k����*�=�Yg��{r�6��	O�Wͳ�WN�_y��{��z��wI����7�qo����G����ƕ���L��~�Ҏ�T�9�~���-��\h4eh�W#1��Ṗ����A�ւ�o���?D~��(��`P��w�W� Ѫ-d�`d�/E�`��J�5$AEu��uO���c-Ӹ�B3�e�m�47�lW;e�Wߢ�{��*+���$�9���b�����f7=jla�����?Ee��w=ȠOEߍ*��A`G�j�"h�{C��P�?㻩:q��fu�g�o��˙u=a��/wƠ�U_�����o_>Ͼ*ꞓ�f�\("�X��=�ap����Ȳy@i�n�}�*sC=}}mT0ݒ����WZ=.�2�-��&��ԏ�Vh�ۤ���5(�ś����]�%�0;���@㐻�G��	=��[�kq���W%,�d_W3��De:�_A�r/�q.�>�c�N�_�_N��X��z~�f�;�.]"���Yk�'�腐l�����=�h������*��I6�@n_�%
c� :)��%mm��EŊ~�Yi��еW?�5<�G"�:d\/�gAoX_����e�@�+�M�3�@8�5�B��AŬ�vZڈ�%��v7�G�k�*շ�;I~��Pk���q�k��R�^M1�F����<�@��r7�T�bLI���T~o����[�6	����$O+JM���Y���j�25
y��A��e������Mi�4Q�Z;J.#�W�Y���AkFYk���喜R�J8����I�Z�s��8^�^^�����w��a�lC4l���1��6�7�[GķBL�j%�����#�U�t���>��4�ؕ��\!}����Q^��|�l����LX"���P�/��]��&M�e^�k����Q��7@�ꁔ?=�Et�n�O�����?�cU�ʪ������--��;������0�f�dS�}�D�E0��
�z)n	#�-6۩�^�0IfG�M�C�fCn�t���Y|��.,H��
����v�>�#�\M���V�C��`f���	��[���~z�q��흼I�yu��j-:5�'������Ę]��љ�J*����
\��{M{�I���JY�W��T���Q��ɬ1y
}A:>ϫ�մ�h�ıJ�'i>�	N�Db�L��ĊGf�iqe֚�~et߯A��ka*�%�?�YWI����W�X��k�v�ɹJ���jD���tK�k�-sO��J�a���JQ���b?��ٚ���s��pG�.�
2x>'
�43��}���߾�
��������ͭ]W%�)��Pذ���B�t�֋w� $Ev�Bqc�������D]^��o;9���>y��t}6�X��y}V�d�����P��j�e��ú�K�U�žrA��Kϩ�$����z���?X�-'��b(ٴ��}�A�H笮Fy��p]u��Vc�C�a�;��ar�~kJ�{�A/Y�m�I��TE�qO��X

���X	��r$.K�s�.:D�0����C�&���4�(k�SJ�*���8��]�ެHE����V憐�'�	C���B}���ɚ?�#)�2��4	rk��#��.nq_����B��|��e��@���+yᔊ��g���S빵�Ţ���x6C��7n4��8���-��
��?�8 �wߟRW�E����6d�;O���!F����s�<�V̮'D�=�+�X�z9��?�N�M�t�F�:~K��x���&E����BmL;rGc�{�0ŕ1{y����v,�F��ǰ��I_��q��2����e+��O�4���J�l>��bRihJɦ�����JI�Y���Nm�Ub�D���2�".&G$�%ؓ6��U��k�9��������/�Jt�6���7z��ک�u���&<7i��3��X{"M�$%m+e���[;�Y�D����B�#J[�U����}��sg�~��*�ˠ ���};\�Ԃ�ma�H~n�;���A�k��$e�Xl}�di� ��rw������3��WrJ�井pb���A�z�b�r���k��'�N��(��t頓6�K�-�
��D.�㝧>�yɞtv��KWXJ�����?36�'�}&�{�h���6=Ǟ0+@40f�y��<�J�>T(�%�)Ĩ�5��͈ɤN�k8��La(���w����ܕ�g��bݣ�_I[I��͐,"7�F��7�O�ݴ�W�_����tj���iF<>o�8��b.���.k�V��y��0z}8$�҇��܌�+S�#X�\���v1LYmS_M�jF8���LƁ�"�`��q>5T�Y�t�~�|�� .��\F�i�)-��D�	�,۸�
MKXr|L�kA0�B�G`zA!�~sb�D��]n�L]`
���9���V
��y�5�UQ�
�7���;<��m�kM4��f^_�4牣�����J��~z�c�o��e3��ϙfSv�3h ]�z2 ��>2_�-,}h�p�%Wl�GR|���F�)%�KӶ
p�K�Ev?�Z7�0�����R�FWA��\Q�ldIu�=� ��nk��FI���Bk�]U�3pZ�ʊo�J��	a\�A�߬t���B�>��r�T���l-'T��>��+>�hrzw�������z�n�g�!F�!���-_�>D��| ���K����d!�H��H���a.sHp��2B\a�
Q��XA��|�R�6����0\��]�nj�ΨtX ���,,*��%����c=��浨y���LfZ}�3ѻ�G^��:Y����PJ��kv���:���x3��$;Gɑؼ��ʋ�rE��i'OR�~�rM2���E��}#��<*=<�&^�}�^��d'���"Xj��G���$r�u�������9�B|��	��$��v�8��$�9���JG�.P���T?"ϩN�W�f��ݤ���$�+Τ#]��gl8rK-����>�7���)��N��H���s��HSTC�_x��:0`b81�fU��K�Ǭ�|Fb�G��PmUv�]�tAdȒn�$�<�B����l�=�;�S�$�ۚ2U?R�>8�:o��!]��ܡ"i�z�����l.;L���̐��m!������[�@��5>7�Y�"K2*Ȃv�x���Q�?.�
[��P�T��iy�x}�=���W�/�~���C3�����X���,xBcZW8�R��c��Y�FHu5�w�\����<�aoCˌ�l�r��[�`ða�T0�(��՞T㹆�*4<aUux}��Y����H�}_}.�FF~����o�����U�FR1�\�Ñ@b�!�LB(s��c���.q_Z�ᝊ�V��G��6	�P�/;���ܢ+���.�(Ud�v�r�����|�I�,[=~�o�d��%��2!4�c��=���}=D����Gs�Ӷ�^��<����$��R�u.U��y�ET4��)�����f/K�m���].ts��63)��+���C�ݗ�l���O���W:L�,��ܻ+.��Z}�V��|���8lX>(�+�s���_�8j�p���z.�l$�a�������9��F�0���A�����$ql�/T/�t���f-��'� 2�*i�����B\#��!&H�b�!'jQ^��̋%DO$i��1V�N�5J$uL�'x
�D��<�x��)$��-��dms^hZ��)��!�'ŸN��|��U��W�UN��p����-�P�}�d����|FŌ������K�����)~�ݕ���6:�OKpª��f�fwI�DZ�	�-K�iSz�)�X�D��oZGd���D����
�z�À�>��m�l =�p�,P���9��0Vs�uh_������z�<YѲˠ:��g!$ѯ�]b��`iZ%
�/�[�?5���g�T5�X�G�iRʂ�J������+��c)WC/ߟK|��b;.W�����AJ�r�U����A�r�_6s�q�=.��J��g�
�irڝ��4�3��Q�d�A�ac-��M��(Ȳ4bl�˻�3��V㣟#o��S��
�61��X�L%�mMN�龶@l9�^�;Ҳ9׭�9���JC�Da�Ɖ�Ȓ;
�7u�9�t-sM�\Cd��!A��aI͕��V9b���X��zjsz��\P�l%)�+�^�G��\�� �;�Y?bs��q�N�#�?�9�	����F�Z�ae�;��M��sI�����jPG?h�*��é;�P�@�N��.�V9�0�'B�`;�)X�$v3�o�EB��U��ֵK��`�} ��90|}�^W_�V��[�fpx���"Q��:��,�pH��h$���{%��uv��-�Cm=&������jqp�j�AfWDNܱ]��9�M˴p��>kYH3ߦfEJ�!�z��[��~�}'ﻛT�H�m�w|"�;C��
�jm�C�a�\��Ⱥ��C�!nԁ�YQ�Iu�����{�Y�Yc�43��a��Ƀ4��v�7�B��]Ǽ�3<w����J�fE�0��U����+�,0��J�ö[sщ�S�$ʐ�Ck8�$� z�ۖ�}&���]�@��
���Amm�M@�`�qV�������RO�T =䡄�V!z�"�*^!
ǡ�塿c?,����1qY��Ӈx�9Z&DY}�_�d���+fM��*{��O��7Q������p;/R����ѐeIt�'Lm�mP����ߝ�}�7��i��ݾ���fz��_=��;�Ձ��o��L��>�||�b^��r��:��cg��w���_�DY�`>�'�q���V��!1�go`�l:d�$�G�d
�������QT�<���
r�q��ך1�NLE�J��Keӣ�@Z�GD���o��%�`��[x�R=����@�wf�ŀ�	�7Eר�A�p�0��<��zp���e�/�$���	��]c|��ne�:�ny-/
��F�1���9!i�0�	P,	�*^d����T�Xk:"Yc�#Qӎ�@u�w�-�e�Ʉ�e��0iKrt�)�5���)SAnh�x�@R#a��k�g�i]ضN*�a+����=��[8�Ws�R]|6���{����m�1��T�㺓}ml�:���٧�%K�g���Yٟ�˿.�6_���+|�[h��]���|�O��"�k����Ǥ���̠��q�W����[KB���sF��[�o#���
�z��d�:�ˌ�yQ
hB`�d5����
���I�b���6T>-��i?E����kB��ao��$��ۺRW��z$�,��h0X��1!!ܟ��+^�wz`�3^2�0����C>�3��
�y�*�V*8�O6��+W(�q��Gt��Ru,�Ȯ#ݓֳ�i�5?LF�u��R�Ip�at!2�̠�U�O^�.�^�����?���_����
S��%>�)y�+u+`�����'2�,
�C�og����%w*;���Wy֙��׀r�[,�Z=~^4�^�iy~(��t�(s���G��(���Z��͏�(
�D�Z��a_���Q�xNf�F/
:�T�
�ѧ���n���U�q�(�ܦ��9�0p9�0���O��YA5O�v4vQ�r�B�47����2xn�0�L1��R^��k}�A�y��P�b_�����~�#�|2�/MW���}�#�#ӧ�z�����
�b/Z[�+�OlL�_Sd����]ӆ��Դ2���Cdm�ZkZK����f��&C��Z�}�(���q�����\�ǐn��Of��'�/��;�x���J��N��{v�s+�z�V_d��ʖX�_ ]��{��ʂ���a��R��1������՚��Vq�e�d�Xm�x��ʁ�R�"v����q�����©}gy3cL.�-��	1�xi�R#��?�=0JV��Zɑ�r�Y��O�9����՘[��jk�\�����6Iu0�-Y>�l3�y�@��6�a����oKw;`
͈D|R��f&�b<�O�:`�N�!R�)f�<T���1Ƶ��S)_?�}rQ�qA�$'�e�Yg=NU;��������)E���M��db�I��b,W�5���V����'����D/�֚��K6.��k��b~[Y�	B����q
��
��y���qM'(�cu�H��C��v.�HT+Qc��5�}�n��G�w�_�P�E��5�mI�LI��J��z���g�5q�w9
��N|]
��%�k��J�F	�,q�4+���|�u��D��#0��ށ�ы_��/on�T+s�DV�{咾�$o�3��އ��~�<�T�V�ꟼE-YMZ/�E�!�&�
~\
=�-:�L���4QS��|ڛ���@��v�����Lc�~�άw[��_|LܑE�./`g���7
c��پ����2oG&k�7NGz ��7L���hK��|x�֧��IS�b�;7&TZ�9˹���c��W���ei�
��Z������8Z�[��k�?���l�S��+�ߗ�5T6]�C>�$����v�E����vĢ��meZ����nDf�6_\ZWj�Ӑk��H�� @�c
�ٗ���g�kO�31{!�����mP����x���:��'L��?Ѵù'rZ|%��hJh��;����=(U ʠJ�j��)2��f
���H��e���K��/���t�ʑ��ִ#7�[=oNjG�WԲ���Q�I|���zx��u�xb�X<�{L$9_��`	�y�4d5�{8_t�}�ԇ?�ה�����GZc�c��}�o�T.�����3.	�G1U��e���C�ko9�k/�I�fv�[\�pD:�%i023"ev\�I
�UD�`�f	M^�n�JK�%�}�Q/�_ܣ_�k������
��놬^��ڧPDud�B.¦�=ͳ�E	��v��W�kX7��	��)�dP�V�{���֖��8�#��~�!�4\�C�BF��.��"-k�ev�= �h����A	�%����Y���r�[AMp�,r>4���\��SB����"c.s�v�B���m%)%)�n,^B�3�Y�@/�����K�}h.U$�
p��t�Ť��q��k��B�߂�S����]��s�O�pgo.�!��P��HbI!�b`Ea��6#Œ|֫�\e�L�*��*���c-#WV1�ZBԑPyT<n>�c�s�i�)?��Ȋ��>���&{_��!\��H%�a�{k<�޵�
]p}j�������%0�/�V�3���j
]�H�到���ݙקks�)��VEK���P
C��gb�D�W�(aPn��9�&s���
�*�<�ɸ[�X!�8@�aa�]�O�{�2^�e�y���h�FU���"x~�l_f���#:�y'��
Q?�
�+�ש�Y{	H� ��eՍ;��T$��m�C��xT'�l��/g,�i�&��aN��	С݆8n�o9$���1���
'�	���4������b>.�?'�tkM���_X�…�›��i�:�e�`8����ӵ�������UNg��f^��ڋ���D�热�r��`�Zl.x+��(�^ɂ�Јغ����Q3�6RE���x�m걣��/���#CN>�50�����<O�L�r��>x���q$yV�%�P�[�\Ō~z�8D��U��3c� s�9&��5=�����+�@����{����Y����FP��
���������\.���0��p�vش�o1;(ޘО���b-��
���{[h���u%�K�2vf�������mК,x�ݶ5|�W�����_c׽�,c����2����=���V�o���0Jn��+�G������2[�=�[�*�Tߔ n�V�֘E�1pM$:"��l�x,CD)�ؠ�B@�Iɶo�2$�H�kg�"����^J�W�N�X([NB�F�=ٞ�8#_�e�k����R�[�$ovML*�����Nķ8?ߧ�1��/j5 ��(S��|���wEP��[��;x�)�Y�a6T\\L��2�A�a�ǂ�=41qsd����c�[���j��XA6w�LLAW��^ZY��~�$���`}��Q�x�� ~vϙ�cP�_�6�V���#�m+��N��37�H�^[c�����R��)K�T��l�2+}��F=���	ӌ
֊p[EU'䀴�ƥ���$����=�4�'A�妅j�	��%
�Dt	��V�f^�)!}/P��Q��C�y]R�mF�-8�PV�B�64�%�%-��	�x\��/��o�*�x{���UPO�p�7i�fW}���(Y��
��n	2�{��>_���k��K�й��[��B@L3�h�W�%*f�u���ZOW�k��K͎
ݬd�rc��i�g���"ܗQa�΅?:��&1�y�f���.g�ހ�ǭ�'�����Il?�DW�<�ϡ�R��O��Ǖdg`9�Q}���c��7����XJĒI�Hg�9Z�ϊ�A�ApmXaS�"�=��Ő�8��$�|�n:|��6v�JĎ�/u\y����y��4^�jJ٬�N���oX9B,E�ttzw2I�8�G�����_��
%��̛��+��J��������|��n~]� [�A^�z>okO�P�%s�yG��$y.5!ͷ�6���/�}E4C_�.���Q����y�<Z.Sf���BHK��HI�s*�S�>M�W;Z8��榦�+<َ
rT<��Z�kը�j����(��hQ�x{ђ�@�Q[��^��V"4�S&����:�[�Ӹ,�wݙ���s�%.�f�&}v��df�
�X�a��ï߬_�*���)�p�Di�~�ڳ3�p���7tY�n����ەU��m.!&���}����2�;��6����9E�m� ~Am��-N��,��5�0�N#u$�;���-\�b�HC�[LC��⁃�N���L���P�[w���0�XF#7t,��caLA��8 "�F�Ok��\�a��6�sNHB���[xH�dP��1�<!jpg�qr�i�"Lm�E֥.WxD�3�7�
c�ֱ���d<0�
�mo2P�
��g�Hc�B~��.��=*Mr�=���8��@�n�12��^����I��;���=�
6��>	��@���#�û�&+��F���_�6FCv�Y�0e�
�k9�W�$���8��k(�� �(E{�Z�s%���H�D�` �SC7B��0,��m�{d�HA`h6�c)RWMX��S��O��mX�C6��}�����\�g.�ڳD���T��qL����%xY��S�4�`3l���^���3��EJ����j|)�A~�++��/}�����"7�̣�}^
��B�{�+�����k��!Bx���)�Y^消�jl�$�,�NAq�Ȃ�;��O�k~�}؈S~ʜ+P��XKJy��c�Z�����Xc<ŐB�~�*�f�ßLM�1�\�a6o���%0`���"��?�O���u8�W���N��X�>N�t\mцp�ґT��k�B�,,�	���Li�s���z��	��
�rd��y0Ň�qĝ�ג���#��6r׸�ԯ�T��<	bseց�d�rx�ZVo#护n��\�y|�M�+�f�c�M���Ӣ<Q�/G*#��QX0k�,J�2�x&F��ApHG�B�}��W�+l��鶗��?��/"D�PH��Tm�VFT��cy�5��y<}lq�X��i�����
hb���cV��b�����*�UUiIF8��KB0Gmu�<���<AR�%���B�X82U�1�<u��`d�:]�p�����p���2�� j^�ǢJ}����%��8��r��}��Z�����q���$ݼ�2P�3��2D�)͊7��>����]m=��LLQ�#��%M:�����8���:���a����`�[�o�ڨ(Į"R�����u����sT[A�ÊW\��n����D+���nM!*�����R��N�Q��ϖ�-��U�$��[�9�즨�j7+�nYl�Fhf=o�l7H���6�}%��図Ǘ5��CNȀ�fG��9�J]6nD�X۴�:��dʷ��Y��OHL�7w3����:'�=ɿfr@m��Hr��g�ߢ�@�W˕��Z�	����F�
���Ie���k<�Q��]�Vk'��X��X+�/@�?�	���\�S%ܙy�#�·z�wJ��,�.�[���κ���������E��;]1a��9:�/:l�>
S�w'�"]rҨ�#&I���	�N�4�'����͇^��ߢ<�J��5���dc8�1�[��}Z���u���{t3Oߒ0��- u���Wd�;dzݡ�oKv�������Do��(��=�i���Z�܌i���pܧv��Y�
@��/�0���¸�:{�`�@�!���L��"���Et�z(��S�E�m�x?��1vL���h�9	 (��P.j��"�<H�4�+��s
Il�Ű�V(��Ս�/En+(�<
�"�׍M����;s�P`H"C��6���oVu������m��&pZ%S��]�=k�B5��o7{*8����]�`3-�Y+��G%_0K�Iѱ���<3��U�����R� ��&`�X�]�4�M�("]�ʟ�p-�����ܫ/ȫ�R��;�q�G�z��&4f;+b/`jP�3qS2���#�8"ӍR��
�_���i�O�w��L{��Ke'X�E$����i5-e�hh��V�G��w�\�J�ގk��+��\�`�N(�VŶ�d�20�It�{!����ߚ���<|�xw�y�R#�_�y`���%�O4�1o�)������_p?�}7N��J6�1Z�;?��2�����nۨ�R&t��Q���}S�I=��Q�<��ƺ�c��H�p�zBO$�`dXEp��E�G�u��0�i�7]���;U���� |�	yV���QwL"՜F8��=V�ʻ'�#��� |�
YJ�b]�L����a^�O�7�)~�a��y5B�|���Yۊ.�Rr����c)ߥIjm{��0��l��m��mH�B�)y�ij�x2qŚ��M��7��#�Y1�����/�ˡ^C��੣��񴺴ֱg���l��|�q�ꙩ@�|�>���;G�z�*'�1;R���I[���r�]�*S\�W�(�hED�ӻ`�TЀC�qՉ:x�o���k���[j��EU��mi
^jV��o�)�<������f�P��g����i�q]�/�j?_��b�q��};W� 6��"���B�T���LQ���I�����'�R�;H2l)���*fNyle�3.����y�k>�Yz̰m��)tj�nT!�-�:���n�j�Խ)|�4���S*������+�o�.��	��tE�!U�PK��>����T����	7I�����`Sn�k�����}��,&�88N3夒�8�+�s��Q}F7>J��Z���['HF`�'_5
��]���1t�P���a�,��+9��~YӚ�)4����ɹ���%�+��-�ۗ3>�u��ؚ*�
�	Pꁋs���`r�#!	�ka��5�~v�g�GG�j�FN�X�n}-�^����_@د	�,�9-��JG���K64�VE��~���{�OS�4��
r7�z�T� ��.htn1�伐�t�d�N�? ���t�
A�8�Q_g/%ڎ�`�����;����9�ѡl��)�N8�<�z+��4,��0��dž�2ܢ<2>i�_@i�F�Cۿ���ׂ��ݐQ�R��C��y�0�E�V���D
��<�c����/�ɂ��MW�GM�F‘���:���i�i=G�$M1ʸ�I�k�H�~ȷZ6��\�2�/�V��{;�EI0_R�G�-a7��j�~��ʈ.�"}s�<vx�;�ML���v$d3�TO��\���|�˨�r��aL1�۸5���iY��y9kVZ�	�h� ck
���sE_^�s�"�EUr�d5���z��
rS(-R���������2mv�R�,Zm�lh�Ϯ�
�-Ө�n-5�d��#���
� s�Y;iJ�:����u���q�)�W��{����P�h�o`���g\�'[BC���G@.e��E��jx�)�v7�.Z_S����o��_�yZ��@�[^�͐}B
�r%
�[�:� '�ĕ �ș��B���$��B���@��㡥4F��jԸgS�50S�I�
+��Vw�+�uP�j�.�f���gM9ȀX��FM;�鍃��V��?x��(x�Q��Pl��8�n��[e�q�C��9~�F-ʕ�?8Y"1��A��<��o�<���w%����M_��݁��{����f���1G������a]
��]˰��z�%���E�g��~V>���Gv�sܑe�o��� ����
��Fk6.i�}f��~���@��I`����������*����1O�/�>7w���8��}v�	9<�<t�-�:�HBy��=�)�hZu��d�����\a�]E���Mx���V����3��a�%��K}68֍��`*v�}�@��x�\�s��IcP�OcRi��a&��L^L3�b%�N�ǮZQ!�rc�F->�r#���U�:v��4"Kd]�Iqo�h&����J�n����t�ˋ���S!RQ�Yi
/��^Y�O�5�W�X�����)V4vj�_'����QWjŒ�&�^�#�!T�b2
j��������b���|o{�������~�a/ح��e���%�g����1��n��nn�
K����5�J#���cd�(�VR+�rw��G@㵠@�$yh?��vO+H�P���	k��3��mM��S�|&r�
�[�ʆ'I�F1,A(�}�h	��?N5��7�#��k���C쮺
�f4ٍCƣ7X�C�)��o7���i�~�y�@�$]"���=�A�H �,<�w=�ZD
��[
����e���(��`�O�NtQ���sM�H���\� �����f'=
|�a����g
4����L��ڲ-
tH?��Z�*�5�q���Έt2o=��]��^���)�r�d�
tש�[�Ss�ip�z�9ǁ��'�%���(M�-�h�G��ujf��ͺ���;X�ie��gɇ�dE�km���(B�T��Qw�Ț~�]0�ؓ?K������&��b�Ĩ��G}��j"G�~�e$l/~�KRXԴ���^�Q�ڻ���{yr�/f�\Զ]LK�K�覟ևԅNe����$v"�������KF�t�'Ĥ��?����h�1�$���zJ����˧��]s��<G;��_cURucʓ&�f��5;�e��0m��.=�fM�%k*���_�K�����D&�/<���m=ѠV���) ��E�ښ'|>�/r���vvAF-A�-
��O[���q��_m���!�c/��/�z��|#D�K���|_����4���X�.> �2Iځ�eɯ8k��u���խ�5g������_�j��CJ.G.�5%T�*�(Rc�l�_�h��S��<|�6$ߒ�'u���&��*���������+~/�Ļ7�U�	�@nP��I5"����F̾�����٩�d?Y�3�y�|�ꍝ������xmZ�
�g�?�%��r��ns�qe�8�Z�^�ʊ�_z��h���wŵ?|����$�>	�:�%��"�E���f�ǩ���#��"���8�q��
���?{�A-[~�	��X����WF�$����#�9���j�|�*�.�|�P�]��yl|�C�V�^��z�G��1Ls��\�޴#YMlvvl0g�c�tp�����<N6CO�C�*�TJ�9]*ʼnpR�c\�S�W�T�?
��[Q0D�Q�8��$Arp(�i�
`�$�aUpMy�/�f��!��,!�U5t�7�;�i�O�'\Dժ�}DQNNV���<�XZ��On޾ʣ#'��"�"�E�m�{�8x���ZW��m+ש�C.s��
����-�TT�o�m툚�~:&�R��T7�+���#g�7�&��R
���z嘧�[3�����7hu
� ���K
���FV����k,+O6����'����'�PzW�8���!���dӡ=1f	z�jv;���9��[�/�oڿWI^8�d-9R��{q~!^��[ �tڒM�O_��;'g<T��'P�D‘'6�<P=�A��c��H,�#���~�T���jA��96��S�'�W����@�uQZ�A���`сo;;��ʱ��ǧ-�o9����~����y3/�ˈ�_aē�.2��Vh��r��3����ƃ�D��� :�DH��c	6b;1����xp�N3����nϦMV�zt<ݴ����������]�}���<>w2l����/�e,�s�j.d̝�]��{�J�-	�s͝�j�J�y�� \S�.�+񶼰�4�c]�T���+2
OP1�bԣ��}�V�`p�]���PE΂E����y"�T^L�!O�Ⱦ, G�;c0H���8��9�"�n�)@�(gD�PZ�R�&k��>5Kw�S�4y�'����H8��E`���Q���R5��:�Ts�oOR�o*��Mi������T89��<NF�,-�� ���x,�OIqJ�|rkÆ%��t��& ���VA��T_���MXLDJ�a�d�;M���ܮ���������d�S�m�vE���MV�G��h�v�d�g,ѹ�s�hW��_��1�g�UK�z�&�9���Au�9{h�gi@Jj�Ґ���r!diT�z��]n͓��r��K�4�F�%�H�v�Ď��%�[5�e�s{�Ip�D�<F� F��fY	�Tp��3��!�7o�+Ư^�qϽ��b�
>�'A:���#y��>ۜ�����ڑ�,X�N3o��U�b*������J8����	]�M*��@F]��s}�P&2��!��Ӥ4t�ڕ!�>��{�̦y�=4M�����퓥p�-`:��d2�Cq����S�
9��+�ƣ[�%U�I`�eB�vQW����/���&)Iފ�~_�)
w��v��[�1�)]$�xF��3r�o����Jˑޅ��h�z4&MD�p�D�J@G�:�x$qJ��iwU(�$�AGl�4��Lj���QKE�T� 7�ygH[��cA}���o2���;cKҊu���Fh%�1$-�DDk���Z�Ы�vYV�!8
_
PI�'��>j�K�X"l\WD��bM�-�=�	Q��Ѡ%�zAq;�M���Rb��m5���E$�ͮ�oljq�����/>+�ϸ�o��5?�H��&I�SR�W�����������RR���Ƥ�.Ξs
������f���Nׇ]4NE�K�&s���+�n�#��$U��p�˄�咔��T��F ����#�k�`N��"���yO1�T���ݱ�1 �r8�G
H�g�Z�/��Xd��K�Z�	?�(���h�~���_�7G��#�:'p�.��[�2K$
urlY,Л��.{O�����W������̷]�A���Uds�}����(B�S0�y���>艡�K
�=>�„�h\�Y%�$�<	~���1�֝;��8��c��+��zٝ;���ۍ#
�W�}Q�:e
�:�t�lZ
�R䯦�}Z5m��jWi�m��M7|��γxΉ�O��߰�h��^���9`;a�%}�pYв�c�4�y:�W�e����ڷ��)���Ȱ�a��#4ў�ٯ�JE�TW����
>?�(��Έ�ʊ��z0#���l� 75�M�=�fK�����)%�/�l��-2D���l��h��M����"��jI���r�5(nmt���U�<���N��������P�eO�B���}Ǵ�Z7�:�(�΂i�׉Y�y��>ZA��+͌3��뼊(q�\^�2�������K�_�S�=̗D��M��U�i����HD>4(	$��)�r�����Kt�~��Y�s�;��9e��`;KMh�-Y��ޖ;'��f�1���C+��)T%�����ѣ}}4��ot׬X�BsI�2������'�v=��rp����,�p��x¹�:�T�K@�}>���O6ó��vg�e,��?c��#�$��͹>�#�$����6���ۏ��fFݏVv��C�Ud��D̈��~E��{���rDd�d/I�j�>����7I��I��	%'�U���L�@Z�I�3�AVPG;�!+�d2�u���P�{i|L�3jYT�UW���u��mj�#q�ߏqs�K���h����gd�Ɗ˃�O�/��w��vn}$櫕G�@���)$���p0�
x$�Za��S9���9x)��P*G�D\���e�_�ޢ�&�n&
g��UJV\A�ҭ�����dj�(	*czZ�D���:�5X��@����utފN�L��2Z��,�&N�Feb�0~��I�kb�	��a`T�̌��R����oܮ��A85��)a.۲�R�?pȪc'������y��4+˜�]�2����
⣘~�1�R���ȟ�q��93?o������a�@XŖ�h����A<�R3n0J�fȘ�\}�ꄿ��~,Y`�}��iKS��b�����X�?KVf�l��%ho�e��	�`��`g��#�^��-WZKG*����L$6W�j46�ҧ��ñ-'��U�*s;(\��c$���
�B0!��Hc�>�I�)��d��b�Mv�ر�[n6�+݅A|ysʌY����%u��R�B��"Q��-Rg=�u�.���~�.�Y��N��H����Bץ�}�Oɢ��!�w@ߒ�7?��g���ݟ�ҟ�GI�~�\N�����^זܗ������@��A��[�IH�5A�#��,m�s@�u~j�C.���U��H! �KfO�OR�|���
U��#v�����$�=�I�XYo��S̑*��Ez����'^Z�Z�x!�z��V�E'{����va�՞�,�eV���
W0��(s\ܣ��`LU�����?U�%R�Fޏ�{�Gqq�Z���b�;Թ�E�#<���
Q�$�@2�*#l�у,�\�s��|�<a��Gn�j���v\~���g��rKM�^��i�n�z	KM�2u*x�ޟ=�`����N]`]ć������#�
��Fa��ڨ�Q:K��1bqP^�4=]���$F��d,���3���"p��E�
5H�c��_�;N�܉�#
*�s6]���0��Ω�	A�*�p�hc�5:/��L�RB"!��%�@�P�膚��vml2�ۚ��^�Պݚ��`�
�ٞb���?O��NTc���E��(�Yr�~I�����,��k�Vo
�v�����/I@��^���Z��<�2
�ܣ� $��ۧ��������m���A�_��?`�=�[�`��n�"��l�yz���<��#��=z7v"\��c���Y�gH�g~5�6���ޔ�r�@/s�F%� :u��aeƦ�B�3���_ψ��Գ���c�WT��=�֗<V�:��z+{k��>�&Q������+c�,F1��~�i�]�6�x���^yv����O��������\
5|{U�
�m�����z�W���mfo��KU���:������ �a������6�|6x��!`��%�?��[2�!�>"7���Ј��S�[K/�3�s�#i%�9� k���H�4J&K���5�'�%��B]iN�}����s�S��SnݒF���n_d����qe���t�^ONO3��Ѐ�3����O�OMyE����7*���d�N�uV����Y��"�R3�d(oi��xJ���_5Ś�%��V���?y���z���������N��P�h
�掭��TZ�+Q�[�Ov���P��3���J�\=�q����Ɔm�lIm}C=2��YPFȦ�ǿK�
�M�jߕ�2�N��)`�>*#�q��d�N盒�2B� ��̂a�~�+���VG �ܡp|c �I�Π6����uئ
ZWu��=�xs�otzzt=�<�����n�T]hZ���hU��ޘ�����#���&����A��c�#�
�}h���={<�m�mM�;K�j�V* 3��
U=�;z�=��ԯ��:2�5�A���`7��j��b[��L�ۉdX��:z��������������N�W
�Y��:��z����w�7g�vT���-���s��O �3��cx��K���*�*V��U,L�BH�<����z{7$`��4E��-���[<��7nPY��O�
�R���t������ �h�WW|�S(x�Cƾ�E���3���_.D��R��O!��aQ�^ղ�yCH�O'w~}o6ЁdT��ia�`oQ
���N�`���{$* ����c��h��B��4�b��JIU�7�u.�d='.@��1��NQ��wz3�_�����Q���a!�tg�e��b�ի�$4�W�Ŷ;=}7 �QyزB���aw^�$K¹|�ԚD�Zy��
�ԁp�9�"�2�3^Q1Ω�Yw�Q�H��:B����ꬓ�	�U��E�7ou/�/9�S/j���.fXZ���"V]��h���f�ԑ��i��p���hpq
�hmmiqpr���W�tQmR_��+�Ə�z4���~p[���#�� :��tV�w�pͽݘم�˨lW���e�yŘ�j�
����lN:[n�q�,P;��iK�t{���"]#�7$M�.��CIp��J9���Z؎l�q䵚�V���؈��j6�]���vΛKS��2��D��ވ�����B�εB'J������AF�]��RLJe��U��
�k��l�cY+��%�Y;���N�l�,_C�����s���-�rj��I-� N���%$V���հI������˼�������	iJ��W�^�8]lQ�>��̦=�?U_�a0))���Y[�V��^�''���1'3Wy���)���ݡ�Ӈrѡ��hz����
B�ݏ�W�-iY�a����"5�-�Zv5�]�k
'���S	_a� ~o�O(����A*�|����i���т}����u*K�[��Q���(��kR㷐6���oA����s�فs^���f���p��%>�`�p<�'\�Ҁ!��l���t�x��#.�[2b�\iWr�{����S���E�;�4�Mz��v�[��b�ý��&o�h�l�(T�*^E,l��κ��S���.Ѐ�_Bp�����F@c8�*�sɄ���*��`5��B� RѨNnr�2ͣ�l&*�{;��P�-��\�i�Uy���84��M�<�.Q���������i@�k����<�H6��q1&��]
.��DEv+u&i�F����qJ6�Ku&�n���jW<�
&���B��4�p�v�f��B�NV/>n�g^��·U�kx�:�!�2��y^�.���&�T�ޞQ6���_tR(�l��6��ݨ��â�K�N:_��\5_x�jѦZDZ�?�R`�H�IpD}
�v��`7�f"c$�ܶ��D.b8���ԉfy��$� �!B���{KQ�&���:30�֋����A������OO*�g�����
ᤖ��_��d�1̠���&ЭyQ`�\��/�"�:�R+�$i#K�jЩBy�C�Y�/$;7�(�K֪�f��.ɧ��\�ڧ㒓mJy���|;��N�����D$�똣���$�x�D�S����*U�n���D�4�P(?U���Iɋ�]�dsc�T[Ӕ�~����^�'�B�{4>��	��S��59��i���l�?|��Z��ّb���

�n�R$��׏$7
;~��%U���dž�]�o�w��gs��У�������;��~;��48q^S[��e��������؄�=�pU�g�N0�o,2�?�sOb���S��J�YrIy������]w���Nm�G.�Z�ГG���������XCC^���+: u
&��֭k���<�0>���������o%�];�����^Ո0��
^Y��H5��e�s�64>�>�7�e E8Āx-r凘N@��+�sc����I=I���a<l5�?+up'Ob�C\��E��3]��B�qT*�w������a/�X��鬾Y҂���愶�6xx����ð�T︥��l�7	�H �9�ɏɥ��A~D�
2�Y@D�,ó&��JM�\c����˪�S���dS�m2�������U�:��Jθ�6������o�Iʹ�L�F�8lg�<��rpL�B��z��	���z���WI,��G����Y�g9��_8�[*�hXL��k�p�.��a��|�dnU����i�!��嗣�4��Ȓ'=�(�_mP�ÃU�,����8x&����ʸ-'3/-�>��hUOm��M]��J��@���s2P\�/��_�q����T*>�r�#!M�T��W� ����v�3��	��}���B�Î�ϑOŢ��G�%/Ex_bCw�آE �1�'�~�='Y�f�}��Q����մO�;��m{��w�K;�mU�Оb��,�yH��k+t��k۷���W�i�eN�s�«��
b��؉�}��줯N"��e��X�^!D�W��$�����V�i(���X�￈���"�
O}�3Py���{۝����>F�~b!L��l-�i8�6)��	)2�t�v�TQ��j�U5c %��葇�E�R�L�����*
qA�}#�;����<����P���%z��]�
��U��kqU��M_�SB-��9>�~�>��.ց(��̠��>-���N���"�l=�N�s,���'/�-moW��z<��ΦJ�Ыл�iᅧ����!9�DbҲ���A�g�4r��T�j������.%P�X6����l����QEP�(�S{�H��'8�,llݭEk��ӵkJT��U��޹s[[�/��R���ґYeo��E� ��
�λ�:+��ɽ�T.����|K��4�z�V�y���z����ˉՄ)^�.o�c�ȍ��S���C Q��p�����f'O��~ٴΥ7D$����`4�•皫Z�僺�gBs��XR��35�'�ٽ�'���xF����H%���I#��N[�&�\�)�a\F�R8� ��E�^F{��.��ʵ.!�:�+"�� �t�iCa��P-��am���8E�B1g�i�l:���1�����#L��x�d�_�;�*�iRP�{���l��Ps��l��`cV@����$3M]��l֠�r<I|<V�U?G�d��I!J�_M&��U@
%�����9�X�g��.����to-J���e�-
�ETQ�{���c���s}V�Yꀤ'��=�8���^�Mt��dGY��ʩi�3B��\��M�T�wn�T�g�g�]6�vf�,��$c�r�k{'�zQ�3S�(^���I�M�ST��	 �}~�\Z:���Ďl�ṣ)\.��M�/��<�'��]/��`"�zf�J�9�z ��O���%�+���v�
��%M��l�d���t��>�V�V�P�	�I�Dh��#�Ă6���U^R��S?i4��lѡm�0>8e�8�����!J����}Ű��	L�M�F>��G'~~�(9̈��u���9Tt�;wtR=F�˗zU���a�Ӧ���q��*[ױ�����0E)��<��HVW��x�|P(pD�	4%�ws��4�����S�%Ao�*$S�yi�S+$]�'H*�����v�mç�UL�ו�Ec4��8�`hN��ef򂊆�ʟb�Ɣ�m��lX`�?�4�Q�Cg�S8a&$V<2��*F)MC�V�"i����Վ�;ߥ����S��u\}$Ab�;ѥ���׳����h�P֙�m�?
�M��5����f6}��CYR*9�]2i�J�X(~�g�<E�0�h�o��2�٦%09&n��r�hcv~|4)R�ؤBVB���Ř���PƬ��U̩�2S����e� ���2cLҗ����!�||Ws֛\���w�Q~�~k���V�t׺*�qs��P�@!� ��>G�U�vi���.��kT�1N�`�0
�'c-|��5�H����IS���ߓ�r�as��^���O�(� ż�"��a5S��0Bо,v@
Z�ځ��	���}��:���0 �+�����a����}�F�
8^Al��	����Cg�^T��z�~�Fo��7�p�$D�NT(�T��A�F�K�s��VT������P4�x���o���E.��N
�4}KJ Og������V+H|�4n�@��$@K�`e�`J1R.i�OԮ���rA+��P��]���{X�*i���sE���R���M����F���צ�rF�T
KC@�G�'�t�Uo�w��npO�,�M*��J�2lV��K:U(�x�L�#)�ƃjtvҩm޿|�Dcf��fM���o^�[O%�F���̊a�_��֐���p-�6�x�{�3����>c@��2FR�#Y(�+�5-�Ղ���^3y��?��V�ϛ�Um��US���Eׯ��E��-�1U
`������'7�m��S�	�5Y��C^�Kۢ̽*6���(sǒ��3��Ĺ��V{ݯ�N�>Ss&H۶�;H0���2C�3`��[~��sUdgS�=}zjlg#��6r6L���,
'�G)�-��J�QJ��M�����jb�4}�_L�t�ɟ	[���9�>�҈}�r��x3�Mǟ�tR�^Vn�#��+���ʀ߃�����dJ��\n^���[A�<_Zˮ��Ct�M�;�0�!����ͧ�뱫Iv������ͦ"1����b��)�g4K-D�4Z7O�����b@G��.
�:��('�u�Osw��deT�L�W�Gy<&�����>�9ۚ�k�my����M�!�c��
K/�ީc�M��t��Y�������>�0W��ĭ�5
H>dA�'�J��^�jn�>YFR��)��@���}8y.>{iq3O�o��!H`��ez����)�S
�ށ $�M2��vÝ�I�.zJM��'��1nөC��Y�Z)[SL��Z�1j��6�s��n�8K�4F`c�0�f}kk���*�(Ae�]}4��2\	Q"Dhe˷����,"��Wԋ8f��'�Ͳ���<���;3�V_@�;f�T'���(��Ξѳ�`�@�@O�*�3���{�A�6����!o<�.8���ё����!MM�Q-2Ҙx�������&��*剕0�K���z��w��l�+8��ow�O�}mĿ�ռTXD�9l�T/��ktzg�Pڡz���3��dqz3�Z��5�5��a�G/�}S���4�[�fZ��D��;-��%�Q�M�Zg�>���o�T��m����:�(k!���`�*��Ƃ�Yh�'������b�P	��%�Q���.���<���(d#���THdFdmĬ�b�^']O|]��TZ~�*�z��^!]���(f�H�,b`1���_���yr���֩*FeQ�5s'�Td�C�:�[1l!�جʤPoU�,�)x��l�|k*�60��*�g�`���=��U!Db�t�7��䲪n<NB!�oTI�?m��6�2��y󻢓Gn���)Ɋ5�|�]�^\i���lH��$��]4芤�i,<mW�T�����R�a�U[���^%�%�"�1+���P�ck!(��$}t%c��p��^tE5;�j��Q�;�p��IlgP7����Q�E(�XC�%1�%�hEz1�x��\nHBv<;���6��qx�	�?!��P�X�n)�z�L��дɡ�B��P=���QL,���>�C���Hn3��8�b��.C~ƫ�U��ځd:,g� �DK��sͱ4﵊KpD��{:��1�Ϝk�t/S\1X0fҭ]�S�����}.��d)�v�%xD��߶���Ȩ]�=��qs��S��S	�{B�W�x<k���?ȹp�J�͑lR���a��@�a� ��6�b���ɂ$��Ԭ�[�I��d��z2���3[ヹj����jZ��8}�5;��3����R�^z9ݹ߂��T1����I�j�4d�|���JEa���a�}�V�pf��My(�c�������l�Q��j
�̓W��Q����y��������.�h��1���/T�| �.�N�E��4��{҉���D�>jw%�`VC�m+3\e�?<r��Ӹj�5w�%ƽ���'����awu~g��:���f"%��۷��P��)�
\.��-[�����c���aKZVQ��t<�U�FLQ-%t��
u�S��1ټޠ�Z7I��p�\˱���	r��&����쉖kX��Ef���i�2=]��uy
M}�>m�:#]͏}I'�O��t��nI��d�+M�����Z�憦6�B�p����n���1�R�7~䵡)�М+9�K��X:}X!t��KyL%�-��B��*����#U�c@�R���1�~�̠^:��/ɤ�͍���U�G��oQ�'D��?�C��K}���?��
��+Ǡ�z�nj�8�)n����`��&��T$
~�X�dj�	���(�ԣo��o�~s�W�g]¯E5mR6V+j������m��$ď:)�	J>�w%�m�š�|ݜ�~{M�f��{��3��m+K�PQ�G+��+��ϴ|^8K�%k�j!��΅���b��[�
N��1R���[�Ν���w\7R9��|�m�/���;F�Fĭi�p9�c��}�M:���q�f.�[�m��%�R)����a�/]�>�ސ��l���L6%�i��$��qQg|�Y����L�n-rR�P}�9�k�	�,�\�٬HG��k�.���nP�Bs/g��"-�������QJv��bC�-�(��>Jik���S��%��Z�oʼ��p��9i g�C��i9����`x�dƱSV�QyK}R��q�Rոj���q��e�S��V��V��t�q��@PM�"��`�,��ɓ�T���!��ڇb*��0�!'���pI�2���i
ȁ�郣��l�L��^Q��
z��WӪ�6�_���-NApfo��Ȫ!C�06�
�y?~-
ΙHno=��JA$m��1(�I!�c�m�	Y�I���KF��]��]i�;�!~R�`�̨c���@ۃ���,���M+7�/t�Lp܄'ɞը��1��2���4�s^�@�IQ3Sw^�y��NM[(�~���+npx{s����>�ig��� )P����e�׭mW�<�3����S��<jr���.��J+�Sa���Y�6����ހ���۹s ����2�o���i�6�?Z^_�r��i\���:
�SPW�l���	�bqE��,���~�n�\�3@T�0�S�NK�7�O;=r�����f�U��Fu48�o^=�̓(���y�ig	4'-��Ϣ��Jbp�3�"Z�E�Fu)��zr)���_������.�6gY_̢ ��ѧ�4#G��8`R`�)��w��]��=�2���i���}� nDMl�|j9��\��/l+�~N�vz�.lZ�5R�ߓ���\����8�0�����b��92�ˑF⾭�p*{*�{�~Ԅwi�e<�y��y.U� ��w�pt�~�ɶG4}�R��%�!pj����Od���N욅66^2�w]��S^�{&���5�q~��7>�}��U�+HWoʚ�g���*ii�]{ҭ��2�3e
�Q�j
��5Cut��^ӹV.j��2Zj��k�Z�zu�٨#��6�a�$&��s�&z��w]%�.���Lz]�(�_�	�h���ĭ��EZ֗������6*��c�
q����7Dǹ�a��([<�mİ�1���*��ൔ�|��>b7r�<�`�6t'~�?�R�����A��b��w�C������v��	K虜�zlG�:��������l��/�i�����	7��J��	0�D�[�|��u�C����Q�D6�N6y^�N����_�޷���W���L����_	:��C4�Q�!�y"	�`�.�	3�Cg����0̗�|����?G���G���ZF�o�;'n3ӯsF\���pN�yV�[+`'���&G�L�·f�{G�u*@SW�y�U���?�5
�C�h�EK(��p�hlH�g��a*�߬��!�Jm���b(dxIfG�O��E��q1>|x	�Ct�d����O̚�IZ
~���s>���g��Dդ�^�_�_��	�0�Z��~�h�S��=HH�μ�a�$���T�^d�)+���_1�k3>qĂ9�kmz��Nxڇ�<q���ޚ�̍(�
��O����}��n�mo]����XEoC;sD������8��fVS�f��L��*�ʭr9�w+�Us�􀇾�!�ޏ�U��=o/գhd�g�^H���n���"���Xw����H�{D�>�e��Xl��R�$Уs���KP�]�e�^��@���鴼���QH7%�%�.�_�Qf(�am�����A�Ӄ��ϧSkY{��N�tj�����1���9�9g^=y:�������#���dओ��se��$��n��T�i�r��D2D�%C�N'���\�K��Q�T8gs/�r���ϝymUJ��������8�!cv�C��>�xw��5��X2��C��� �6�e{Ck,"`4go�/e>J��G�孩�M90q�MG���o��_���ޝ�ܓ����\b@�xh3��gUE:��,����M��9��~��	[�2[Rv5UB���V	Wq���y�<��z��R<������'��[�X���CR�W�W�|�y�㹾s.��a�~�R|���L������9񱙌Ê�	Tf��S���P�f,��QG�:��H�����$&vu�J���Lwv���5�9���؝��p��nk�3^�l�v|���G~ |����fM�J�ǒ�b�a���z�ZV#p�q�=,�ᢟ��ߓ�ބ����y^�;�^Q��0Qz)-gI��V�'����J,��3��Z�i[<�5�V�����L��	�6.�k?��j���:I�-YH�W��4R�1��r�ۢ<�k��C&f���e~�{}eZZr���P3ȝI���L &�^�օI�u���4��d�Wn�\��&C�����⳦�5ry�bb�=�]]*��p�g/�
t	����T�JeP\����S��f�|*B���x�1�F�ҹE�Y���2��@�S'
�eM�/ko�=�5��9�1y�9E�Y*]u`���iY�QS�fn\V^]:[�Y��	hs,!P�	PA�;5�en~��毚�
����>Kg2y9-����;T�X��u:u�����y*���-dk.�â�L�*G�~���4��:j�M��hzS*�+��-~_cʊ�i�5vP�A��^�����k��.Ҧ��+f��ֿ_��)1ި,���:<�<Kz�(Z����M#H�fn�{�z]s������(�=���[`pE�*&/�7F2�k�c�}33y�x,��ƻ�
���Fi�n�	�?}�؂2oB`p ��F���IGI_F/�b���cɻL0
x���p'����Sב�H��uC������2Y���I�
5�Ny��^��KIs]���ZDP���X�Qh��α!P�{x[���~��ǝ�/g	]�S�AGw�G�eD+�����6���"A��ڿ
<*&Nx��VˊB�k0rQ��c�~����������:�ۄ�ۯ`������|�xZy�(vI�����)��2tLy�h�BL4!&S�s�'��N��UtՁ��Ʋ���E�{���s�U���N͌�r��lQ�}�zZ��Q%Kq5��*�����kkq��)ȇ{{��W[�/�h�~@��r��UV�0i8+���iy�Pw(?��?7�ޟk|0yR~޹�3�A�1�μ�kS�_�5p�x��E�������p)!Y�>ʠ�;��H
ʊ��a�p�~�
�uS/z_�M�k��Lթ�5�4f��;�0)\]dA�>�J}N���=��<��YT"��6b�2��lL�VxF���[�`�8Pp�4'4���;�"n���q+��lC��P7񪱊(u����5�V2w��s	a�N����6�s'��Y���&s��6����;;Ш�A�`���<u�Q���Qj���:/�
��;Y��EOM��@"�ٞw��a�N�]
E�1PTXv2J�������4��7�VPʯ$��Q�*^��cȸ�`��[��Ky�Ɬ-���]�U�q�Q���;��6�6Ꝝ<J��imm�K�l/9\^q�dr�{��"�<�.C���
��Po���͌��Iو�d4��GC�Pu	��w�xb5~@EE�A�pg�g�m�U���zɧ%n��A3	K���t����i��{Kێ�G�e�x'AAp��^���}���v�r(;�{�s#'����hU��$]*��m�`�f�����_qp⩼ie�Q���pŽ@�c*K������Ti[S���Np�UW�ȷǷ����/��z�O�x�_D|���4�a&N�>9tɟU�^�����'�G�Fl�@Z��@#w�zФi�%��6��������㞶�3�=����q�"�1�0�{�)��.�z$�Q��S02�O�r��������\��q�<���,���ܜ���
1�}�f�407m�ʠ3���Y~`CIxj�Vk��VkF��é�\`��p�jv���[_�b�%�������dVU#Q��e�ć�{��z��`O
�ͥ���3|L5��R�!�r��J
P�n�?õ)����3\����[��9.�kllm�+�+�S��T����.^�|�#~�"�}"�8���]�rӣY�t�E���vG��k�ߣ0W���&Ο�i�D�Ĺ灀p]e��]���������Úry�����G�\�ZJ�cڴ�����,��Gz/iQo��W�2^�ۼP%���F�I�_��ct�Y��h�wֵrZ���"y���/"��P�h�oj	�.��g�������f�	f:%{�D�|<MF��o�񶂁1L�9{�]_)+F`�U����\S7!9"P9�
r$����=�Q?�Bt.d<����r¬�N!���ʺ�<ݏ��Im�������{�㷜��4�㊝y���8���JWidT?��N���&8C �ц�{��Te�x��ο�����4��$�<����L��T�0���\f15q�����w`��uvB_���Բ�ɛ��[��լ3��ќ�*��O�aHKW`X��.��C�(9�O���\'P$�X��\=s5ӧ<c�vfu�C�����b�:��iR�#5�X
f�����1�#���������Ц?�^����Q�,�� �W9=�?�w��<�ϕ]�?e�[��=��0��Ȁ�VNOyn�A��|�S��3��oe�����Q�ͻ�A1�~�Pg�'���{�f5��-Wn��dn��ʨ�j<�z���0�o��0-C2$n߶m2.��!d<ֈ�X
��YyF5�K�lEr%c03(����8��KN���ēW�~E��B���-��8��b2��r6��x��ڴv�z"�(���0�8�H?�kYn��,��e���G繳Eotr�ڝ�)����R���L�9�\E�@��>t4�>p
Աh=�hfG4�2�=��)�(b4���5�ָu�:p��"K0�Cи���ͮ������^����F}�N����i����	u�R��+�bI)k���Hd��a_�[o��3��ڙ�c+w�E�^5��Q��j����X�\���(d,,D�T/���<gh���h5�<9���@F�UQX�~�Ƴ�n(YG��vbkA1��l�Z	���c�c^�@[��)X%�\\��	䁆&�]ӄ&�O줨8�+3.W�g�MQR��\G1���q�Ղ�a��i\�(�Ѧ�������+QtY��q�[����^�-�%2sS��~�޴�ܫ�V�i���L^^��:�?f��K�\f�2��
cU�V+~>e7#�n�^5�D��DO}tU=%�\�=��.��%�[�bf��׽d�va������0ӸR�y��9���
��;���/��տ�� mL]i��� ��3�n�>�=�?�c��^݆n=�rH�h��.R	_��0���v�D���͛�o�y�w�汲|,��*t�3�+��Q(���I�چ�!��kǬu?��/B�m
z��?{��|5ݜ�� �n��oB���d����2s�誡{F�Z����?˲�}e���'��z�W�ޥ�J��>�>x�A��1��!���	~���$Lw�Ŝ\����6���x�o�/k�ztf��H�-4hP�]f5�U+�d�,�#�E֜1C7�ގ���=���%������'�]Nf��&���l��OS�F���j�YzBX\��J�S�t^���#�?]@i^f��ҚY��-M��;�1//8�V�����{Sj.$!�NO+��$&�?
�ma��F/�:��Y�>ꥡ�xt�rRT=�kU����4k�����3�5�}r�y�yVmr��Cjg�v �$�m䢢-�8��%o��'�x5U����$7���o��q9�ZX�~�Oy�ӒFچ�1�
��|{%�
�},�kS���G�qq3$����>t	�����;S�v]�|��+�
��2h���:!��T�:�>��I\3�h�������I݋��7%�8���E�M<�+���)x�9��)����Z�p�e?������#��-Ǹ���������	�T�	��\t9����:7�����w�X���Ƹ����eڟ,5��츆�b|�U�eV]7.�Bw��� �aW.cW�(::��":cw�17X[;.��v�
&3Ѷ��dz��a�,�Y��A��[6�;랽;Dg��DjR����i�{�.�}
��k����
o������%��]�W:��ܺ ��F�����\J�f1�N��A�P74�L�lX�ݖd�_|���~�����?���
Ov�.��34�ޢ�G�B��m���d��,X��"t��{Ik.&���$]XQ�)�F�v�N3�"�c#��8q��l�
ʘ�:}謵ʝ31ץ��֖�긮l��
5_��7F)-�/ˏ�0_������_<�)u�6t7�e�աC(�]{����иSZݗ���<pQ�A�ۏ�����
F��.�s����W޿�
��Q��c�iyV��&M�������3�ެ�Kf֊S⌸��r)�83ɷ�k(s"���^zpCHF�xA|�	n����oqa��3�q���V^�j+�3��$�G�F�Fv�޿�� �2�ۻ�F#3/zm4dgwu�|ؑ�.�w���;垒��P�+'�n�zi�:Չ#e�{�[�PRPf�D��Х�O3o��!��=��% Y�n 	����jWm���r
��{�N��,+c�/��q�����q��K����k�F62*�.#0�T�8X]	$5��3��8%('�YQ	�5���(d��S�����w��]���-��M
��y[3����#�%��=d�>ظ,��|�05f�+�8��%�h�0�S�p/��7�_���SmIU�k6��O�DJQ(�O��AD{m�Ҁ�g�az č(��������C@{@�Sꋋn��[/��0��俬�d]X=�(PO����O!Ea'J*�)�������;�5d�ɵ�Гw�X��H_�2/��D]z��|]��Z�K�h�hg���1��c�W��O�{�e�\��T������ë��c_��ǐ��&S���[��)i��y����M�Pq�80`=Z�簷^��X���#8ݒ�?��nh1^�Oz"��aJ�����KO:/����S��=x���qjo
_�l������6$/ʰ�R]�l+��w}��h�a�{NΜ [ת-�i0�V/�	�.��BB��e��9�=f�GM_OV�5/(LZ���=kLˋ��1�)�G�s��vƅlx��`�]���
���xd�������źI���E/���D�F�0T�j��ֻ��g|���R��Ի���������`.J�)�+kM������*RE]�.�4Zy���A#��ۇ$W�Jr�rk�Ļ�r�f߷����p�XD���(�c��]�\}i�_v��d����Gu�#�XBCƜ��@'���sޖ��2�P2[�.M^\�q��s��j��)%doAj���\���1��)��8��fVڃ��fW=�EKe�!'w�A$�����aQM*+$�dw��
%mJ]27;?!S�o��e�x���vM��s톨v"u�
�6�^m(rR\��gŭ��S������ʃ�����> '�B}����Ě��SP�}��Nr��m}	�#�h2'�~i��/?3����e��8[HP_;��{���:�EM{.�؁��L���`J&gש��'��ew��f��*d�G'{{�7��7M5Ф��¾��u�09Y|8�j�������R(�����B����5"ƔS�
D,�l���w��C͒1]Vҟ�a��3�{'6p�I�g�brNpGx^���9�5�ɌC��
�Sb;�W$k�ggM�ۗU���z�@A(�R~Y����
��4+]hR+�7��uv;C�^E�B	��qN'�xJ���#��X/3d���]�hW�!C�==�$:��]+%J�9*>]����+[=fK��t�g�����H�m�kZ*�,�q\�g��o���%>�I9�
N�O~гh���ۦҮ���D:�om�VU���Y�V�v)�>���=�z	��ꎈ��o�o���d�#ܟ}Ll=#�&�o�ᚏw'�b�I^Ҥ;ꛑ�*+��\KJ`�F����IN�t\��O��v������ J6.�����S�
����|�w;A�(Kzf9�s�c�3-��ߙno�
S�\y�농�Ї2�3��Pˈ>N��{�#�p��T��}T���Sحxys�שw�k#Ō�>��|�H�)k�;�����PJ3�&���
��rl�����P�UY5rIu�*�rݜs��#P���'�:l�`���_Ds_nd05f�x���ɿ���m��Q�I�!���b�u�H����ߺ�������g�+/|�K�C#�xD�%S<"Oq1Sd���&��@�[C��C$
��]�C�%	�$}�b��{�>5��_9]��}��)H����~�AϾ�826%�\�1��Q�TeB^{1�kOfW�� U��䢉�w�^!���:w���z/��	�~�o/+�Tx�幫"�QB��J�\����
wΒ���m����!}���09yKf\99�r���I\m�4v����[5��H`z�_���b�6�1�,�3|cc!WpY�l;��A�*"���pjl#�FZrO�Wjo)l	�����ϿՆ+�WȺn�w~u�"�l��t4R��)+!���bp�%�F�4p�91�o����,dW2"�#�9Tm�-��&Ԓ*2��W�j�WM��
C͡G^�F
�3;�*�W�C��+���~�M��]M�'���G�'����G����-��8 \F�i��a�X/˰<��)gm$+;j�dȮ�k�ä]�^�19u��&��]�_��tr�ɗ��wY*;��"lG��+��
��J�t�j#�(��ꂗ$+�%�v�&�s���=�y��~&�FQ�=�_�T�\��zc��Xbq��a}�ӫ�S鮲�#�5ֆ�E���@n%ҭ!��_��e�)
WkdF�ή���S� O!�U��r�*4?C!�'������u+�����3�!�5�\���AIڟ�i��DzAO�D�,�1����s���]GBZ1X,&P����%�8�d�l
�f�e�k�F�HI��_Ք%[qhʨ�ŕ-ӑ�S���-������9<ߑ�x���x2Z,z��{��
���p>V<���׊ײ*��Oh�*���l?&����A+Y5e�q����n·��r�@��
b`���W�6�%pQ���粦+����u��կ��H8g��j}��_W�ێ�s�pL/��a1�O�|�uK�8����kd��>�Ar��B�[���}
P�U�E�8�k��<年*̣�R�����Z�ğN��c-������|
v���A�W>����G�,J)�F���3R��r4�h��ֱ2DA�GyR���؝>ސ0W/�S����p�*@����w��Ș۲�5u�f�pr�N�����$��DQ�2�N��C�n�$�i)�f�9or�����J��>-1h��*?�ȽY.��-�����`�Dž�˒d�G\�A4�����apf�f��s������<�J<�Tݯ��)y�i_u�a��M�T�ٌ��a�>�w����8�y� ~�I��@����^�`���QVD�nM�&��ϛ?�?j����gzɴ�~p%�O]¦d�1�XTE>z�m4��ɤZEO*��=������G�Xrl�g����$W'�/("�c�b��T��D��z沌�039ܐԒ~��"[�d��
P���Q�#�	���a��ȸ|�x�rf*���מ��8����,�!�U᮸%��?�U�Q��B��瀫ED�wE�I�~(bWm�5��R��N.F���țDZ�&XFN~?i��8���G�T1�R��aa����E�� ~��&D=����"���{ H���:�fk��Gi��.�JH���e�*FY�gm� M-8��'��mM ��@���5��Lp����iG��r�>��e�~+�ɽP���l}W"���>K}�}̙����+[�t�:Ϣt�7�f�e��ۨt��.61V'�-�YEf�����?:�L&�<���6�6<$�DQ��u�6v��] �#�[Be��;s*#\�%
p(Sz�@�o�{�L�
���Y�F,����. "�e7��e9��% ?%fM��#�>blV�5}0��f�2$��5A�BgXO3b�?8~=.籐C3Q	jc
g�A�H��c+Ԩ����kφӲ���ybeL���Ī_���m5#3?k���g�"�BWvٕPe�Z�m;��e�B��Ԫ��F���ۂ4�0���]��B��B�
Q��E?<���|
95�IU�ء�ϜU/��3�,���{k�9�QS�������9�(�t†'���L�W��#ǭ��'[���}�
���n���p9%�(d$�*2\���D�R������_�L|��D�G��EY�����W����1?��ҏޢ�R��"Y
k�<u9.;��ʆ�a��<Y����L5������<�fk�<�1��!A��dr�n�ܑ	�D4s�0Mbϝ�8�.�?dD��1��D�R��pę*�I���6Ɋ^ء�����9F���mB��Y�Y���m_���t_c���&�p���?�}(�ʓ+���0�(�9��Z���\�A�d	�p�>��1m<9�`8�v,����У�i�'vz-�Ⱥz�XW��	���1`Yf-7V)��yg�4����$cy��h����n�Z�U��WZ��q����vT�T�r赛U4�F���5�]��Ә`�I��5�.�V4�"���^5��9j8\R�y��2z~@���Æ�yN����Aù~
�0�҆�Pf��Dmu�/����(n��V2u"H�ZNXx�:�?��ʱn���ex����������pW��zʂa_A�@�k�wD�o�O��\�?�����e{�8G��߽o_�V�=�ύα���&���p�z��Q�òy�{��!���-���C��"v`F��H3���A]���E��zm#>��� �>t��@A����è��jQ	���$9�P�`�P�/���Q	�ϛI�vy�,����#I���N]���%���H�F+6P�"�|�G�B,"�^8���9||�`���=RUTR&Y(��祾��|�j�_ڊl�s�F+���q�=�C;�u�� �H�ZI�Do�w���v*�+�[�LP�P�qC��CR�������_"5��H�c*�$�5��mV|񓌜�]�}Y�KW„`�Q3w�eF��K�ֲ�l�� >�#[TjU��ͱ��ؑ}�jFds����VI����ڂ<��(��ۏT➺�w��S��c����Uf9�\����P�)�zz��Շ��)K����
���|�F"C5��d��l�s�%XH�P��H��/|��;9l���&�t,X嗣 [L���`^+F�&k���Ðr^;@�Q��;��CW�'�q���1�
��_���W@���n��fplڨ��N_����a<w:��8˜�<;Ф�#�x��+T
��[x�K��ij�,���F��h!�i����ƀ���)���irC��|���|c&����j1���E?�7,�|4�6<�
�g�z敕��]���H�Lj(
�7g#.--:ړ����3#��Ǭ�@��(Һ�9	j憟°�~�BIJ�kڕ(���@�h(2-sӤ�B���=�`V���F�@��U~0�gol����łX�
�Pc��-Ϗ)��ߟ�T"�T����K�\#~Z�\J�QW9��V�~�1A�b�1U���Q�oF��54D_�fޥ/r�~:}�皽��SĎ
��u�j��Շ&��H����{�B=ǎ�6#9�@�Y�9��t1v�����0+S�'��d�����2!k^)�f�)=z4�,����y?o����F��ɤ�s\�
vҼ���1#�&L��exm�z
�������B�(</t�4���uʪ�t�$���O�.2_[�ͷ2��S�RՉO]�6:��x�,5saj.6*�n�瘠>p�[ ��N�"��Ry�{��3�[G�=��5Zl6�p��77|�����mU�E�LK�u
�2ZC�
d�;s[�^�;I�=N��y�~6[���-1��MV��ȱoѢ�Ы�$�Z��ddpq�S^�o�����I�Ӈʫ�"f��N����w!ތ�d���gul���s�4��[��ʆKp��=Uqխ8�I�kA�9 V��x�n`#�~޹C�߱�(���:�|b�nKH�#6��bJ]����ۏ�g||�<�܌ݥ�Vk��k�'\�c�����1E�~�呁�S��ė(2�`�7��_q�ɘ�Zc���SC���.鸸��#^�d��۽�pA��Ћf��^��
��h�TGGl#L�/��g��}A��΃�:�y�Ds����B��oa3sv	W��ɏI��^}k�k+����Q�C��6n82�VO���-�J�R�Ӧ7�����Ү��(l����u�E�e	^���Jؘ�-����8�~�yM",�RȠ�w.O*䛴�����~D$��B�.J����wg�U8��/{������V�����"�m�L��a�/���B��<7�|�0O�
V��B�֒s�
�y�MD�O�Ҥ(ȇ]��ɘ{a�
�c)�	��g��/Dg�I>*DJ���\L�miڭ�,��#��;{�!R�O,Q���	��7�g�0�$��jU5����?6t����;}n��8y�ʹ�ୣ��'����$���1��zii�e_JDڗ9�hz�0�Ι����!b�g��$Ie?�s��s�ɐA*�g�Ƒ��"A�պb!�`���p4<���N���X���CꙒ:���VCd,�*�QZ�Dd�6�k>(0MJku$X�~�d�'
�⣦Y{BB'�i[�ddƆ(~�����0�1
��M�KW�a��x0����`��>�� <�:�yL��;�<�綂��e֎�?
���iyp�*���,������S�r�|g������듓]�#�!F�>[�|��ad6������n�'��nn�Ƌ񙥭��av�C��2~R�w��'�����
͡�"�;!ȟdm���	A��ͦ�4�F��\l ���)���	s�BT��Y	8�[��}mm��Ɋj��l_��@^1������ݩ֓"��ݝ�xE��
t��|hc
��H���M������(e�
iw�J��i�,\N�T��e��o��f��/$��Wh��Jh�ks��R2ފ���K+��~4�=�}K'>�v�#MY����o��rnG�pz���+"Z�7=G��ڜ��)�Ŝ�͹ɷl��p��a�|�ss��>ۃ�0���(OD��4���`�G�A��g ��6ȕ�+T�F�.{bs��K$���.I���Y��GL4k����� �+�$&�E�&Z_Aӆ����FGn'BQ��M7�>]l�S햜��c��a��-;���;��0�Ә(�v��Td�1�qe��܍��zx���p�8[l�-n�[
�\�Kd)�n��4�[����#dĊ��`z����XK���@�m��Ƣ������lү9D�w���K��_:��r��=�f7C�GY�z b@�z�
��]C�ԙ9��$�<x����T:��~W�K�H.�bB�}IT��r�4�6	̈́(�hIo0ŁG�[G��e�8N���9���6�LE��J�/^��;�ݏ�a�_�YEKOs&�k�&&�Lۍ�4Җ�|���#c}Psh1�+���h����f~��܏3T\O��|Ҳ
���;O�����!��	�V��p�*x9!�!�a����7�d^.�:?�N�	r1���`6�6���9�|���T�M`����/�_�H��kN��nWH�6��)�?v`D���V��
��&�&j��)$�(9��$�ٶ�5�*]cOz�u=D�=4NJ�(욗x$Le�|�/)	��`��۔e��9Dj�rO(�J�V���'7,5ҍ:���U�Z"���19�!7�7��+C�B�?�h����=���o�v��
�гT|�/OOw��WG=3�Zo��߽��*+���?����v�
�
�@J������:Vo��.��������w�����hC�=v��._k�4�-&��y�*�$q��b�a"����o9��ŧK�'�K,ZK�L��Br�V��7ЇҚ�10�;i��/N�����*�7]�^F%U@z�/����%��[����)!OgOJ�R1�A{Q�VE���JFl:�p��'B>N�;ǬB�;��B{��b�v�5J�������Vks%�����C	�)S,瀘cS����l%N>Ň�{�xY���1��
�8��"ʛ�:H�Ӫ��-�f
�S�ֽg���Sh��
��ST�Y�)�&5�9W_�QT��.���+5�BV��m�˖;Nm5�_���޿}M�"]i�i�D��Qd��b�L���9�⬛��9Z��c�kj��#S����e��M�$O�z`)�ܳ�F���cҮ;�"�EYYe*K"��ht��չ�:ޫss-k
�i�b���=��_ި��r���z��X2k�,����rM�1^�����QiEu��㫃���/�	��=Ȭ��z�A�"�}�y�?[m�(�T��^�i�����7יl:0�)�!	>���n����T�H�LZ����/��%w7林	�]�Z�#r�'�E���	��)����W�׮3&�n��Sw�*Hv}�2j�-KZg�dF�1�x��-��;F�%�zE�L��p1Zh���W�$�V2��	r]
�na/�fGl��l<��ds"6��Ϻ�g0��y��++��̟�0�T�����t�=]��TB3C7vc�f�ZZ��3Y=K������,��;�>��������)O!`��;2��k~O�r��n(�P����sꩉ|'���V�����3	�,�F1ؙe�@5��Y5z��T��([�
��_��?��KZy��a�}�z��m��t�b�Vӣ��ͯ���x��I	:-���Q�I%UѬ�8`t��C�c!b��.�Ɗ��f��	9	�5�to�¢�#s��#�ܸ�H�x������� �;t�����b���.���`)��X�/��7�T����r,r�s��M;*����|�e��O|�����:ᴮ���5a��K�H�om���t:k�k�K,�~���\Z��67j7ٳ>��G����;�GT�YG��H.E2䆷.��D��+'sR&!}I�{��� )A�ѻ�s�AH%C�:x~˓,ޖ��cWп\���
�C������Vhr���|�|Z�g�!
�M�ˋ���Ԣ�?K2l�!����b��-�bR�{�U�)P�$�iMΗ�:��1�`�ArC��z�X����}�&��d�/����Op�:�?�FI�!�89'Ü[�?���͸���K4f ��q��|��u�P�(���S푔u�
��z�x��^G��vI15۲����4ݱ�tA�J��	�,��hh�ΩYP��Ѵ9~ժ���U��~��TI��t�)HRg^�[��݊I���$�<^D���v�����F�9!�U%F<�6�ƥ�0���b�@�
ξ��b��e@�-9���~gK�t�T���ra�a_����3�b=�"4�$��񉘖��077����Xr�l��8� 4��Oz��.W�s	}o(O��v(��̅�P���%�tk��\�XDm����W�	j�X��+���嵯�9���i�,���`�*�3�6Q��'���?Έ��}^����
���|%����9Gʽ.:ښ��%H��C2�p�"��'��
�M�
�,�r���ggM�P�^.=ӫ3�hѣ�K��K&}-��E8�F�\Kޗ,����˭�*��t7y�k�.����[Z{��qw����p���Ww�N��X��?�Hp��n]����|QEٹ
�y��E�Ჵv���X��%ys$�TS�@����p�Y�#�y�q3q�T"3?p�����0F�.#��о�]۾��1l�M{�̶ko���H�$:iuC�(ل?��������"�&��B:o����QJK�OB�R��:�"!�M]%�;�
̨��y96}(|��!�x�[�-��fίVk^�����i2ð����B�`�i�W|C,�����o-N��] Y�p�~��
~+1��^����#WjĚb�.�;��������ըT�2p:��T���fz��ҡ��>�j���1�߽��1��S̳�9v�/�����+�Mm�	�n���CDKSg���.z'�)Ev�GՈ4Jl�c�!�1�yx�u�v�].��);�Qm��{$��C��>�yJϸ#Р�����B.�����x:��4B8m-�HA
�ڭM��;�w�^.va��`Vp��Vn�.��;�sC>\�i��v�m�͹0��۞�(V��d����IS��&:\`�K����ԟ��L��͙;MjU�&}�H���'���A��	~
�?��=�zS�!�JNT\�l��������7���0��Ks�f3�N	�5F������V�a5��7+ ��ûq��08Le��w�W�;~?��!��oe�}��Y�->R��b���l4�V��7�͂���/�$��a��1d��E<���l^X�_���x"|`�Zp�i�.9��,[a����W��JP�)���}���L�����D�{:̛�'��:��:�~���	�OA4TCa(�8�0Tc[a���@$�v=���[I���%�ǍcA�zJ�
<{~l�[i�z-<�(E		\�����#�i�n�ֵ�J�}{��& !Q�b����k��-��bx%?z3�$$,v���0�ܜ�L=�H8�G�|_���]�"{�\�m�
K�֦e���6:�0��Wp�=�~D|�L��1k$���5�!��;�EhFb��x6N���H�q��-Y��)�����e- �D��M"ߵ�l�R`j���vst�uq�4��>6�h]�< �X���M���b ҆�5C0I�!h�� �%��u"+YO�Ŗ����c�~��?�^W5��g�9Y�^�d��";/��8�	t+Ȥ
S��!�ә�Ԯ��r�1�
�B3�N��Ju��}@�A(�x�
���z���"�M8�4�_�UH0���}mV��+32��+�uˌQdK5G�ƾ����,�a�d74ipUilPg_�x����:�o|d��zJ2������!٠x��k5���Or��6	G���>:@���>�_���š��w)�6%���z��7D�S.�M[/���2��#C��k�sȟBf%�o�H}fs浮لt% ��;P(:�yT=��bi��.RqK]��Aku���2�橚1��\�� Y#���JZ�ed2������˗�:ʥ��##�x��q��[��e4�X�:=����|\=���B���Q����K]?;=�L},}t#ș�<>5ѯ&I�$��Wf9��žJ�����ȔW��\�TH����B�2q�}
��(�@&Ex�O.��"���[�����Ć��c��d�e��n�Vb�0�EnQ�0(�����QM	��K�4��,�1vFȃ���)�MX�?�D���l��DNX���&�ge2t�D�p��ǘ��0�c6/�]���;���~&�k�~8�#�:�;�x;��p�;���0�
�;<��%!Jث0U�}|��g���`��e-��.���ÚT޻Mi���`��gԂ�~��H��px�H��_�oIn��޼ɴ�x@r�o�kyk�?49����S��f"��5��i�j��X�"�b�֪�D3�ƟI�ؼ&��72���#��C��=��OQ�<Nv���*�����l|�]_%���,�xr��gv,��-0��F�z:��G(dFBf4�#�~��b����Zv�>9��o����^��?�Ɉ�ʌ��vQ��k���˒�.?�۷�׊.����Q�~.j�t��,�g�[�#�R�r)�A��bZ������e�G��GdW�
��rI��w�U�P�	�^�m�B�e/�1��8�&����لV`���D;`��������B)
�����E�֞�뺉뜊L�5-��m��X�ߩ��M���1�U�� ��{����zqR-�F�M�6?��k7ݴ6GMإ�4[��Y��{�/P>�*��V�c9'R������%�J��r�N��J6��a����|�5�����h���?�4Iݜ��;qK)�H��7v�2��f�$w��"=m�=7�yN��Kj2yYb�<S"٧�[Z�	J��
�|y�s.������P�q����?w�-�(2���r._7E��E������绩��r��C�u(�$7����E�Y>�{v�-ص���[0d�rc�O���ك���5�x,ĸ��|k��^Ľe�?�Ro�W$/mn�n��s 6ÑHڛlС�w��nG�ݥ��ɖ��F��{�>CT`VhD����H]?(&22<Z�Z�>q��w(ݓ�>0���ЛC�:ӓm���'�Ja#�x�T�
><9Sݓ#ڞ,���'��T��<):c�^�Vؔ���e	��4�S�T��)�6�_F�o��+�ȟ�qpBE>��̓��Y��xQM��;¬sf���|;�O�<^�&�{���,�̅5E�6.���v|�@�3��u�b,����LI	���!v�>A�����r-�[L`kvk 8,�N�in,��j�c���:�,�ͤG�����@`p��*'򮘈�Ec��P�l��G�~��~q�.[
K� NS�+P7��'��N-D�I��]B����P_�SI��J�e��n f�^>�n�Y~%H8�0�A���$�.����E�Bu��;�������)��ksԄ�
рɦ`���Y@־�{�����s��?
�`�UxjF�*ĞA�3Ȩ2��pg.wz���;�O���TniAd�uA���9biU�'b��A�r傣�5�
%�������dg����)��xq�Uu�1�n��t��`�}㔫J��2<��l�1큸�tt[{�=��e��i����w�G����}����}I�1`t4��!%�Q�E�I�b�ԍ��0�'�N��hgB��@�5��ړu[U�JIU�(6s"�7�o5�|!jG{5x
P�L��*��O)��	"5*ѲŜ�-��5���� �9'��<AG�	a9�k�$k�=_Ad��~�^��Q�}���9a
��]MQbw3��3�;7,r31��ږ�u�ܞ1tQ����C�u#��'.j��
�c���s���wZR�C�]"<�,O����S˂�F�Sn�1��Af�7���%���^o��i+�,����}�b_y2�7i�ަ�W@ʢ���ܷ�<�.�K�~I����VE~�<�H�mb"�ݳl�n�Wua^�&B�ҝE��nz�[�T^��eK.;9��z��CJ{g�k��@�϶��U�w�S����G�Bt�S�陷������L�kIl�c�7�\_gb���:�1(���W}�;Q�ˣu���+���Eq�gܷ)oe�)�rͬ�MG1���[���Jf8�ߧ���G��+��?�[�q�?r��Lз~��k\|,�k���E"�a�~\�U�_�PhV"x��2�G��=�t_t�\�H3i�f�۴��+��X��#�`��|>��ccu͏�ma��q++�0`]�Hr�-�2�=���gmT3��MS��"?}[Kh����W�Y��� J�� �H�}����)���q�u\��I\a)�������3܅:ڕ��A��.kn�����z2d��b��D+<E����7�yȰ��MTǐ�kŞ����]�5�5����	$�b��8*�~�C�,�z�D�ΐbR����㠠�+1��zi�KŬj��3��F��7���7���}��`��4Z�2,�����M�8G���R6��%:(�	�x������2�-m��͉�
3�ܔsQ�������7e�a�(h�1,��h��u��"�ŜM�?��z-u�<Yh�{(Q�\2�0��,S��?�x�\!y��!6�2y��`!
�<!u���.W���膘X��U��ڎ�cR0�����C��B�a
26��a	��C�����~�B/�����s~k)VK�eY�^��?�1r)�iB#@<ZuB(8D-��z���OnX�v�Uq�n>��K���g�y04�{z����Nfi�j\���B�,y3ֳxl��4������u���ljG��
��W�T�Ix��
���
O?4:*�Fi��r�P����Z�,�Z���%�lȓk��"�v�K��Ư�8�S[nj-�NlP3�9�g��kb�Ǔi%֯�O���j:�R���v���T
^�0lBƸ{�	�@�Wق�PY
���5"��D��g��F+�-Ԏ��o��q��'��q�(��w9���
sJ.F�����Au����S�=��ꦚӪ#�������o�]�C3�C��<�Rw���>8���7f�R�˫���QC<���5��RٍtT�	�f�hH_vr-mx#.J��$�d��F��C>���tye1 u�=�)L$�}�達��Ͽ:p��Oo)=&��=UY�޻�DK�x��Mo�k�4L�#YO��9c��Y�.�L��Kk>����e�^w�Gd�i�����”�cbM����������2�l
!i��?J����:�bu�@�{
	�q�Q�����"�.�.̨�n�h����V�U�a�V�B���gQ(R8:iHUR�V7�ָP;:
������$2f�7����5�M��B���@�k}�̜6>+��R���.x��`�ұa�e�3fe�$<��s�u���rn1Gb�d��.܏v05�^� �/�h�e�[AH��|޾�yL�����\1�_�]�y��;��[U% h���Ef�����������oF��d��� �*�98Uc΄[p���%�z�{��5
��B���.'I�PvAw���є���`1M�׭{W$��Moc}�����9���յ1e�^�ġ6i�V��X��#�x���l���r	i�W]�|oeDJD�=��}�t��Z|h�ڜZ�{�4���&�$�#"RV޻|e�*{3��V�V]�{eedƅ�.nݏ_|�c�+�Bd�J~�UjSu������8�O��f�������H��{�G�0�f����Q���*:�r��E4��9�H4�TXf���d�#�d9k�1 �7�9BVb�;%3iR��摮%j,D�	ʞa����T���;ϡ:����wT��?}F6���<���3�YJ�?��]�P�ߌf
:f����㯺>Sa�n�{��9?�������%�c��y�덋f���l�m���i�3<�G"����]<yӘ���%٠lc���V
�nK;X�'��U��P���x���V�J���o3,��W��?5����X
ѯ�q6u��G��W�S%��8\*)n-^�6�Ͻ4�)�w��Rr�]�P4�
���D���ӳ��m�fH�c=�p="#��j`�c��"@�݅�Er�ddz��6���x<�x9��ҭ:6�U���}��UR�a�5$A�gJ�ެ�JH�s���<Y��x��?���c�4�d�ֿ*��?�|�>�����8��H�W���5%�Ρ^���}�S�|��;_�B�G�K�$;_��8A/,�
ӾS�s��<&�{Fq����p��_�B��	�t�{&��x,T���ΑS�j��%^��%�"�n�F�%-��L]������x�fp?_��,�@*�+H�7���1HLb��o!:�
�r<�3l.�輅V!�-���G�w|�WV��SJ����l{��n�����r�=L:,]����v���ߘͿ�u�&-�I���g��sp\�DN���Ÿ?W��i���3+�O*��F�w��'r��.���E�I
��l�R�Ո����O-��
M�~laMG��e&��_���	Y��y(�~��֨�
&mYV�=�z-5N��?fD�Le��������(xv�Z�x�f������'1�b� ;sm���������@��2�!N��󃥼v�B8�	n��C��n�ˉy��i	�q�ee-�ݧ!��O�{�J�|o���P�]
;
��A�d�o+����I�*�'O���z��cP�?�H,�H����d����'�2<�Ջl��1ѹ3�}VM����e�������V��p��Ϟ�2��	\��V��x,�
�y�g.�!WQ7-��nY��Ϧ�S6��X�+���1v��6d��N����e�P+/0mՠSO�7�u!~<�+X{e���J��FΛ��K��6�,����,.��-	�ڕ̣�9=���ߨ
y6�����
�YD�A�AY&<8I�b����i���*h��.�ޏQ�F~��0�s���h>�Q�g˺%`h�;�27�o@0'��<�F���a~���Љ�(1�s�hW@h�ӑ���t/hm�hm-��9�Dhn#J�)�]��~�"��Bݐ��f�5�_�}��[�\�B��h�"�
��6dG�����~��,	���j�321'`����Q����LPm�W��Kkֽ1�_a�Y�'�پ�)��{+k�kV���g~�l;N�%���'6��M�'�IԵ?��܉7wJǼQ�A;�"�S�=��ќZ��b
�I��"��
��oo�ϩ���!�f�[��ɫ6ad�WفW*;�~ն:.n��n6�<�UY`xy]}��i��b�H�V�U�TƔ(?�G)��wL�m}q}uip�-7�+�<�mZ��֝�t��Cn_D@������	�N�
u��Ĉ{�r;��!J�n�-�0k!��Ci9�%����U��!�o���T�Ek*�P�NJnE����&��~z�1�w�fj
����Db�&�L�;����{�]��w����.=�'xv�Y�P���y��U�l=��=#�D��(�m����H����2��qq�.���f�'��6��Z�x�g�{Q�ô"����=�g�J��<a����R|�V�@ְ��t�U�v�AC��ME�l�l��Q�h�K'�&D�]W6-~�w����!�<��e�<`�#;�'�ZF�F���?}�5���o��@�����ȷA+]�fE�n�^�m�Ԋ_��_�̛ݛ�V�����s4�Vw��z��r�?{���:[A�m��mͻ�eU����*� V�Ǧ��I�荪l�کS�pzZ��vr�K���/ȓgN�1��%r 3���n�]@�+7U*5Y���V�UR�2WHE�|n_Y����7���r��=�����C��j���>��+�f�����	�=jg;�g�b`0�i0'��=W+I����MI�7�$�~A��K�ƶSH_P��H0�M^�C�X��B�s�x���n3���3$w���T޸CW.�=|_(�Jc��o(r�j�H���EGa�4yU���ɥr�尺0MM$��V�gL^�ظbc���w$���qp��a���sФ%M��$�Ld��Hv���x��u����D�ϻ(b$�;$B^B��<$#�4�i��8�O�ԋ�n��R��]~�Jl@:h�ݧ���S����o� ��洞�6R��i��X��n���&�11#��������6�rN�Fښ{�qR�kV�:+#��ƣ��r��?S`��y����KYe��|�f͚W�r~�b;�ְ�Qh�u�^j�|��,瑐�%�Z{���`rB�� X���,��BK'7}�~4/���޴TTi��\b9�s�kQ�
�Ð�j���^+7ym�t��M��zh*d�)��'q���_������&�Y4���<m�o_�wy�Go���C��_O�M���6�r�-	����a�y*'�99e�\��Q3ߐ���m�?�v�yM.t��u��z��X=^�X쎢�K^G�r�&Lk#�v7M�q/�*��h�.��Y���q��IX���Ǖ����XR3q3Ĥ�L��)Q�4��?�vq�"�� ���zsü�����Kv#w$��سz�74gƼ-��+1l��v��F�Fro��.z�#H'{�O��+	C��5��#4W�*�
��ڠ"Q��L�������!��DE2��d(�5v��㮎�>���6��\�V��|IG�O��<��^a�r?W��a�{D���D3�Ȟj�3	XK$�Ѱf���o��&r���l���i�X����M�
��35�`HM��._�T�$��+ִ��ʘ�b~367��3�3��1��|���]����T98(���f^�&�W$�<�cD.D$鰙&�u�Ľv�ݽ��!x
TҎ~�7?A�H�ק뮱� �A	j*��Ԝ�]t��j���r��;8�ן��d��%�(t���x6���]%&�7BTj�n��H���kQp�a~�1��9�j�zq�Bْ/�����u�U�6eZ�q��Qeߨ�gJd���-�Va�K�ϱ�����^J�޾y��p���X���GYB��@���4�J�n���u(�i�_�f|��3r-*�`��C^S���	�г^e�g�b�%��q_|�ae�Bi�xj떭�Z�k�rم���咄{
�A�D���]BT�9����f]�͞����
a���q,V9��G�
�l2�ݰ�0��^g�ֱ��Z��E38U�o��yg��c!6�y�ʻ�2�<n��V^��i�h�d=A���9�%]��M3s�%�ފP�C�p��<b>����r3r��`�x,M���JjN��[������a

�,��L�pSeG-�>��w��c߲�j�ߨ~{]]�xLxDw��\�G�9Ѳ�����Q�}N/���$7�&ʉR��f����#����E��f��o�ԱH=��Sr&�xM��:�GQWIW�}�:�7ޕ`V�
�>�_�|y��:]L���fd�;*<w679��G�&7��ygQ�m��^|��5[XB�|Qu4�{�����555�m�	�&��K�R�[,����Բ0�����[�N�[.}�e�92wΧ&k���<��9b_e���%e?$Nbe�n�{(�aK
�N7?qY����N L�����C�dOפ��-Zv�o�����T���AR\<�0��8^W��<�gǥ�B�}q�2���$���iR%P��Di	��b��?�L�~'/*2lX_^�hϸ��X���}�.|�T~�h1��4K�:-���q��9e����~S��v�oJ�A�p�1�:(A�/�L�+A6Fݼ��B�w1��BMz��/���r��2@Du��TϿ�S�
WA��@M��}�Z�PQǎKڑ�o��~�iY��f8z�Y���1c3fH��
��nc�5	[k�W&=�����{����Zf��)͑]�DF��A���Q�#�2�l3���l�
�^>���Hų�M�Iu���Q�f��il���I�w��󦟑N:���L���ɳ�^Կ�I�+À���K_y$��s��*�_?':�&j�F�}u%�������ߨ^U����;l�z��ҿ�ٺi޴�j5��f�x�ŴJ�28��'��,`�?m����F �.�pF�@0����ʿ�,b�X��C,5ăL�kE������A��h�P"ݸk�6kS�.C�g��NO�KO��Y��d_�z.�놤���,�鼵>LkaQv�_��w8=���Iz-�[�Ā��)-�&B��
kpS,�V��`^񶼈�/
ӗ`�s�%Xb�i��j��œ9B|��W1�w6S�)d�fg��̹=vC�b�M[�xԛ:��g�F���=f�O���3kЂg�-�w	����if����y̥3p
��2B���00�طʎ�a�>	`M��Y�޽c�}f����=21���ک�e�q�߷�Rl/J����^]�Y�6�;�#.,�F���s��E/n��5���bۏ�O�w��ӈ��X��f~�a�
��HY�BŞ�F�!�`ƀ�� ̀���	LpR�y.4P?�r>X`@C+�OC�9��fgM2��R��N��~]�!5i
�͛�m���^����Q&\��[�?+8�����
�ğ_�:�V�F+\�.Y���r�9��-x��dO�W��]��S����
�:f�t���g;����;���	�f�5@H[�:�)��c(�CeN'��F!D��)
�%/6�Hp���k}\j�pXc�A釩/oY2�O̍��}�����%��նK��4LS신
��25g햝3�l.��;.�ФS�P}NX��04�r�]^�-�.�Jlk�y������y+?��%#!��eBl7~"��1j֗C;׃M�wdַ󝂡�h�-��^�A�����"ۡ�vx�=��O$�5�@�5&�!�
��9���cqb�_�e����)��[��1��!G
��Pk��+y�_�$�ɋ�y���TA� ���NÅ,pn�$�3q�Q$�Y���o̚BM3� [��^-H�]��Ya�(~	c%�PA�a��*�V��IX`������̖�@=0�S�z9���	�nkYet��\ʻu+�n,�&Ds�E׮�|�����,+�-F�P�
;��-��4����;F�$�p�dh܊�{sL�R��A=���9Z$C����T���#�.�����Zu7?ϴ4�8����p�9�w��F�Q����ڲ]���za�P4Ot��k����:�0�:4�~'��=@�n��H{����s�%�G�Q�a��U��y&�@��l�	��6�_ߴG�pG8'�bI��m��=X��!ͅ=X��fJ+�-c�-�<Z�	����s�o{7��vI��{=��Ѡ��j�KKY�=Ct���w(t	��'C�х�8Ym�y�s��[��&|{���S��96���'c���,��\1���D�ٱ��K�g$�|^�
D�1f'������k��cù��v���,"00s���z�� 9Vʼ0Ũ$�l�ܚ����[z�7D�f��ʠ����ɔlu���
A�wҙ���(�Ίge�PL{��ڲ���/i���X�z�zk��@�4엄4ݵ��)=��/;2�K5P�}�}��Cu/K�ļ&gCj���3v��况�Y�*�]�W�5MY�5xgv/WV\�0�81�	��H�\
b.�ocr��G�"�t�qGɮ���ܦ{��qD�@�Nlu9̕+KF���6�:d�}J��r�Ε�@����3�,�yAn�<�o�zH���RX�����fj����}��u\�2�T�l�#���L�zK��~�$:�ߙ�'K���0[z�{ע�}��Չ��R�Q��\G��`��:W?i���R�
�d����DâBd)/�Pv��|uT�Q
)0`���Dp�+�;�|V�V�hoKcK%�捺L�9'������P�N��w�8��g'�@��d�3|vΐ5%_q�*�W��������ñ����j��
���5����c2T�8���3�Q��
Ve>�;�4��6J{)r�Q�"B�. ��������q^�/#l�SP�M��
�;,��bRT�l��8���\٥�y
U�-�uLT��l�
��7�<:��	�8����%25DHWU�����0�Ez��u72U.��)v��T!_fS�T�Pa�Bt� �tш%v(�v�OKd��8ʮ�q~`9�.e�^�Q���`Og�})C�̝
�P}dMV���0x8PM�p*�A亂�j�����[�S�<P�+��U;�+G�#GQYV2�@w��;��&��w��^٨��F���y�A����
�r1;�]B��IϙM9��;��V6�2&��OG��47I��+�8���[�Y�m�L༧�%�\S]w��>��� j2H�Y�������j ��y���n�;:�)'�~��ui�<Js�F(���~�ˠ��EǞ֜ʙU��J�;�?'Z�S��i�?����٠��-%r�"ɖb��9�;K?q��?���U��!��%ufD��N�V�w��S���>�p�H��x�h���ƭ�/�@�О2��خ��"̙��#�<'��r�Q�pw1�N����蟹�	� ���(D��Sם���Z�:�4m�>_<�^/�w��QYx�rT�U]Q8�"��3E�8�y�/g�ߛ4[���r���r��J1 �7euW�J{�����Z�D1����fevGY���=Ϛ���mFê�֪|���T�a0綝�c|ug�c͞ATֹ=��0���r��ɴ�Z��>f�7P�<�7�����Oͨ��g��^
js�c͸�w������Y�<�d7ul)^�MU|�ݸ���u�3g_™-���|����
/n�`��}R�\��Y)"�=j���2�Ԫlvm6�k��Q���-����R��?���ŵz{�5b�-)(����`��r
�|��ҟ#�W�4[E�����S5���o����7f7���
�V�F�~��C%LqWw������Q���K���X똎S3r$���&���]��L����]���ʚ�|����L�o�GF���ό.��;��ˠ��{t����h�*��h����B��V�9�wk���R�{�.��3b|��Z�#+hւ��M��7���� 3���43��p��Mt-�K����%�c���G�p�'e�ƻ�vƐ�[c�����X�j���ݶ|�n��~�;�u?��{B�W͵F.� �=�
�7}��>��*@p��!�'Xz�c�a�K�2�
�A�z�dKv�B�&o�آ=t��߽���.D���ne^���;XV�DZLϼgP��i���2�b���u�֊^U�T��QL0�+j��Y�M1��I�׽��7�u�1���q{S�D'(~ΈB7�
Z��@�?�C�[�e�n(���hYӿW%�;Y6�z��K҉��>"��Q�R�km��}��[JyR;�WQL-OW�Уժ�KܐkZ�S���l+�x�$�?k�O-��e+!��I�8�qET�*�$!��&3K9ex��AG��'$�ГCf�6K1!��䪰`խ3kFVm8�Oע�:t������Ɣ�߀9��	�7H,~�����k`
!A�1�8��Ric�ʸ�J븞�Q��Y^�Uݴ]?�Ӽ��~�������ߘ�9Q�D�1X�@$��k�B��L����B�X"��J�Z���
F��b��N���6��/����I���(Ɋ��iَ�A�I��EY�M��8�˺��y���!�ˤ�0��_�B��̽?����B�X"��J�Z���
F��b�ٗ��f��ǔ���
��i�N�����	������B�X"��A�T�5Z��`4��z��������?��	����Q�U�
Ӳ��0��4ˋ�����Q�(�G��b��N����g/��2�@ap��`qx�D�Pit���py|�P$�Her�R��huz��d�Xmv���U���ʸ�dE�tôl�� ��$����a��e��j���1e)j�ul�$-=#3+;g��y��� „2.���:��a'i�eU7m��4/��u?/?��w���H�����"�L���&�����H,���
�J������l���������!A1� )�a9^%YQ5�0-�q=?�8I��(��i�~�yY��8/��@�	e\H��j�aZ��z~Fq�fyQVu�v�0N�n�r��lw���5ɑdU�
Ӳ��D�PƅT�X�� ��$����a��e�����o��C�08�Bc�8<���$+���e;��a'i�eU7m��4/��u�?�_^��	����Q�U�
Ӳ��0��4ˋ�����q�]��:��EJ��[5����
j�O���{_�韊��̃�-�v�	D�+d�6���zHN�Rx^-��&΍{� Y��,c�����a�g��,���.���(�a�%�щ�X����|��Ng�f�=�_Ś�cﭐ�o
�n�=�uYE��ؼ~�i#sj�B.q*�qp��X��_u�|��d�ɗϏ�Bq��ߦ��O����t��{����>���a�i J���=��\So�^|��q����`2��Kj2�
�Ө��Gg�49g�,��Ρ�������\��?e�"�L�Xr�#�'���_�y��05��/b��f+�CF*�Jc:�����4O
|��v;PR/�%��v��;VUT��f_�I���4��m�7V㪂��B&���`��
�ޮĺww�.���,�c����_@,y��"	=l��(�AV��̉trC�$�D�r`�<�ƄE�z��j���
��*����ƒ�;֫�s��M�U�5 g'x>���c��NR��1-��i7�'�;l浪LB��*��� ]�>���d�?�ړ�6��C�Y;b�_��ƞ9P��ݳ>��-����m֚�I�B��F�����}�Z3%�)�)Xn^�M��q
��4r9(�Mm��5�N�$v��o.XZ6�U��a�D�E(�L!�KUg�ư�,�Q��z�?'���D���G'�sk`��ƽ�-���x׃�Zs5t��b�f� ��~O%f	s&ǿϓ��>I!�	�|��A=�xD��3�[��E�_�vG�ȵ=J�6���qڝ>�I���<��r��S�-1-&@���t����9ζ��6�G;q�(�ݽ
?���e�3������3*pǶ�u�-�v��S����n�=�zǤ����E�q�a��(�>YR^M#U��t-p�ĵ�ݺ�֌�g��>H-j9|@?�/�m�F:g���)�4��x�Z����W�=C��6)A�y�|[I�帑����/�ߎq�=]s�lP�}�LՑ�����bt�ؒ�a�w7�O�4zY/9A#�h���1)q�ϙ':��f��F`q:��{�L�d����eL��v���5��VD��[����5���_U��
�By�X����5��������靴ħh]ơ�]7��_kܑ�Y�7nhi�U:���7ݸs����.^knqW�)�2=߂��q�3=�
�˛�׽�S�����3�z�©H�mn�O#���z�-�+2�����VD���V���_àr�i7�[$~$�!+t�
��=��t1I�J�!t���6��ԋ`I�L�u�=��(� ��\�U�Ή%�i@�Dj�Iq�ҿ�&H��ޟ��?+�j]#Kj<՚�3?v���ի�N �ɑ�ܐS��y�S�h�� �E�N[���ZO�J�$�JE��*�Y�5�8:V��-n���F	��*E򄠍��A�W��[��k�rLb�/�|{�[������>�����á��Ժ��S��
�2I"}�+@��L(��64�H8��ͱ�n�W�����N:޸/�Y�t�=<��T�7f���Z�E??x�w����#PS�D���ֲ�t���e�S;���i��Aڏ/�jU��n�^�<�w��~V���]����t~`C��c��fc�{�Z~'�H�H���q�T)��llŬ�M?
SQ�6&kh�vIҌ#�S�C�Z�ry����!�	��4׫��������S�E�@݅�
?�Uk�W3�#��m��V���E�"��"�[d@)���
\�Z�u\X���b^��8$W�q�
��1lE�	<QB%�%���(�$��?pd��9�V�h���̴'%3`�-Phj���[�cF�ԝ��#_�{��I����5Mǯ�Rt|��������!m�v��q%�~ ���/��Ir�>kѼ*
��vq-ǀQ?/.�s�Eb��V�C���#U��G¶��.�V=>�q���}�P�p�H�X�Z��k+6�ؘ�X8&E�0�~�%�;�G�x�*T�G��i�[#
�n28�C����+���~�k��E�x8����|;'d����:b
C?J��-�(9 t(l0px苚�0�s���o�4x9
:{zrPox'�ǀ��]�%Ac�4V3������iu���׏�B�.��zc���+�~��&���cԈ�М�����8�ZFO�ae<8�����4������y���S`Ҩiɯ�A��|,�s��D�-׭�ޟOb^�Ε��_�/jrǍ.Ȏ���R��mV���Z��(R�q�L�U�E�Y�e�V���%�ֱ_/S��
�J/8�d�9Sv��_�����,��n:0���e=,џ�T8vێ��M٤�1gC��G���Yyb|��N=v�+|Mm��<���7��������H�ɪ�ҩd�H�����Q�`��]�u��&Y�!��4.�֊��	��_�~`)����m	PPx��V-�Ԩ�$�]7��JP�:��La�ڲ΃��`�%���	�wrNփ	�ט��l���Y%,�N=H��jGh>;pM�J���4�ӘC��{-'Nˢ��]b� �e���t����HJlw4��s6����y�B%�%3Q:.��Q��ؓ��X�4�2�1ta��_�|#~q�u��S2_o�UQBVC�C³�>J o�$���W�V����"ƙ��蠲�H�OX��4�H�8�����}�4�>�ψ���׵N�Z��4졠o�m�'�uF����0�ޏ��5�ͽ��:�����octr��p��O��a��뱥�.��^��7Y@_G�!nv��0�2�c$��c���?`Z�`r'"���7&5�8fzdU�@*̊{������f� ޟE(}wqk�[ő�
��\�^��Zy¦�IZ��&D%p(TY����H&�!A)��@�-��Vj=>�"�ʕ��O[�ZԻ�Po�l&4�^ր���+�b�@W�40�f��nf�-� ��kؒ��Y�M4���2CͯWՋ��X�.�XH3�q�n��?9`y6���/��2{F1�wV<֠�����—���:5�ֹ/�]�����3~J\1��*"'��ݎ�>��q�?�x��wl��G~��}y����ҍ(��pxX�@��ɤ�@?[;��VJ#��-��ۅ������D��搴q��Y��Uv��G�0nN3q��WB���
۟���J��JPD������~��~�,[��!p{Z؂>h_.a��wŕ�һ�\#�\yelyz�v�~R&�e��ذ�O�[x-_}�8�:��1�hNY���9c�i!w��H��/�^��`B�+p�l_#o���;jw�>,�N�KX��L3J�^"i�0;���0H���أ�m w���i.Piy#?BӔ����O�3; ����"r��NÁtʄ1�E~�9o���з���q0�~t�,܏ʼnDQ-��%�ף��b4B�96�õ�;��߭H�t層�ܱ��B��z͏�r���aܕ �UE�`[�?I��l%!h�X��Uwv��$V���$�sNL>���a���ʷT�}I��=�TUJq{?���i�r�ɹ��!��Td�y ��N����>Ҥ��"� �kt���^���F~�Y*d�>�l��׫Dh	L}�S�bN�6Rq;�hohlk`=�n+":�کd���Q_��"�����㊛⏕�	�|vE"HRS`v�i���^Wz{]�q*�Ɗ��0��ǧ!�`7
��/��7P�����nC�0p���*�m�����0�jA)��R�+�6��V[�Ѥ��U�
9��C�$Y���,��`!�9;�q����u5	�k�I#�Yl�E�x�4�.�k>)T���y�R�é=ZQ�3��v�$�ɋ"(�
RuPW�w�G�zJ�	<���hTO���Z�ZQ��m����9�Z��ܵ��N�rwN�-�� ��-�{��c�(�ռu�;i�s+�������ֵ�u5��h�Z�Ŏ�:��-ҕ�#�?Y�������B�v�E���V�/�#�_ɳ
Y�Y�\.L�A�N�'���}�ש��S&���J�d+��Խ�<�澚���"5	;����'��{���>�r�Q�ο���mЩ�T�����
XU�.�v���ɅL�Q�Wq�!O�8����`��O��p����ZV�mS0��+��Κ{L(�%0�Q )SZ��ЮN{([a1s�_LC×ʽ�~�0��+�R��J*���6��F	"�%�|��F��o���Q�o2%d�;��]u܏���L��/��z�$�w������da<r�mȝ����a!��k-[f�Ch|�}����}�*[;���7�O�i?���rᱦ[$���p،Q?D��>	�w�����	E��R�O��ָ{�ۇ�#V�;�C�~�"L�,�Z	 ��"%&r��Ã-�����c���Lj�7�Rb:�3��
޺=�<��@�p�1v�~!�I��q�-)��币�1t�᳝ߡ,P��uO��dt�^%�yFqd�������<��]�H[���*�Kx�{��Ž�	̺���\)�nq��Q俹^a�?4M�`a�놅iÄI���Ž�٦�Xq=v�b�������X5��\�	�(]&assets/webfonts/index.php000064400000000126150755142440011523 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/webfonts/fa-regular-400.woff2000064400000032410150755142440013177 0ustar00wOF25
�,4�J��?FFTM`�Z
��@��J6$�T�6 �[�+k%㘥���!�X�(�����8:���$-�_AE����dU	TʕRT5����-a�|4k$�Jy����p�T�06�p�=J�5��d��W�*a߯�����=mbt��M���ڽ_f���E�OW�4��H$*[�t�
%y~C�[M�nʦ���$�
���K0�PzI(-�%(z Q�B�`9D8	����r��[�Y��w굊�O_�؝d�1�J��*.]�8����T�,
�
`i�C;��=�w��Eq�@�gA`���$�d�a�e�D�w�~k%�+g�0%w�|�[�e�$��`���6��IJ}J�u��ܜ�P�p���@����-m�zc~~|���K�Qdkvw�K�C�ʩ5s�ʹ?���v����|�z�Z~|���K�ղm�V���i�e,�<�b]p���08/�
��Fw��Y�0�!&�2����[���K�__,۲��I'f���I{3�06�D��O�ސS{)���w�u�mj�h��1E�ݳ+pUv�ø�_�޻g-٣Bh$Ǯ���׶hD���ϻ�|��?�ϟ2�:�\�`�u�������i�
����Q��7Xܣݳ������2�s
�1�0:�h����'����Z`�8��� C��1R�,$�l>���԰�&��d3��f����g>�|ʕ��hcM4�t�,�ݍ~�e�{�g��7�=~J(���nE���H���Mg���~8�e'���7��~��9�b�7����٥�˹q��;~�B)͵�5���5�j�~Y��t������kܧ۹�����|�����⣇�o�٭��ɶ+Oۭp��˻9�o���3O=�#���DK.�Q �K���/�����rG����O��.�&=�,K%^���|8wdW��L���gћ�>}�N�wӛ���"h�
j+�&�1��i�4����l����
l�����s����sb����"0v�#�CG��`&���j*��85'r�E$�ǎ�i.�qD/%'�����b�h?�J)�l��
1F6F�Q�Aߝ��mI�>{V��jl1A���X1�"�1Dd�h뗸
M\M���p����ݔFu�����Ӯ7����Ѩy�@V0D��&A�q�Z���,=�T˪��X�	4��������(���k��J��>jj�
��T8�Vq(���S�t	�����kJ�^d�Ǩ��9ը����Z6Eq������a�)�'`�G34`��P�A[��+�{L��B�i{_�dٕ�+�/k(鄨2r:����Sn�	%A��������}u���t!����*��*�>Y��cE�U5AB����.!OL:%c
��0~Q%pø�*$r��1�/������I*�F�Gcj���t�jV'N��u�������6��0kM��8�f����z'M,q&O�G�L��O�0L��%���ف��}`B�F��x�%(a�$4�c�����q~��0��4q|�=j�l<.��J��i��4|����x
�����n�'���TR�ğٙ��1�N01�i
X=���v�
(]�Ȅ���	�ª��7�`팇�_h���&��RבX���*���F���4�Y�~[�Z\׶�ÆAF��phP���t�P�z���g@�G�3(�CGj���Ƀ#�Э\1�f%	��tڭz(@��|��ED���]w�^����&��9VB���V–��GO4�3hBb����(����LѾ4��RGW�h���ږ7�^�R�~džV+�(ͯ{�-QM�X��"ҩg٤�����fHN�u%�0)���u�p#)���1j��&ӯ!Lu�S��?��Ni��}R�c0�F�!��2*�v�A'���Ɓ��G�%�_T�ׁ�>�;ˆdX���Sx��\��u�x�О6A
V͕̏D�Q��6pc,�|L�����ܾ�0�
+��6�B�/�q��6���Υ��Sgφ/ûw�]U��ϧ��.$o����oz��wC���=w6U����}�b��\8!�2�j�����/$;䷴Q��%HI������N6��/'�ơ鿎�P���c��?{����{TZu�r�p�%z>paV�}o:La��I/�z(&
 :(0	�X�(��X4��q��i�:�e6�op./���q�a�N.�&�!7t5��v�	͒6��m>���z��<l.��Z
��+�����8�����+������G���M4�� &m1�8�ȽQ��k4�Fq�{	tlME\S"�=M�5��>����6h���	�nؑ�y�Q��X�z[�iW�~:�~TY�ʰ�I,�lv�G�^ᖹ^�h�m�!U{�R�q7Վ>o$z�z�����V5��-��N�Ći�U����_����N�m�0mZ\��B�6�6o`�2�_�_�
�ZSen�):Z�z�r�!���<
�leh�ʴ�b�F�Fv1��ʖI��� 0|�}�e��!�1)q��T�*�R��xv@HV��E����㋚(���1�;s" �$��P��:P�"����;R'�^V�s���=lg��N�	/+y�X6�LCh)�_V�ꍎ�W�HfSێ^����r��,<�P�hSN�~m�t�(��u����~AL�]Ӡp$~��YgrB�$�q��W���^3eUS��kGn+W^���hP��E�l��H�b�2�M���"�v���z��u���t�F�arO�@<)%��ר�c���iT�Q��7�n�y(J=sÎ����l���tt"�H�s� j��p�+K�p�E�Y59�l���h˴|cD�1-����T4�fi�����~3�x*u�P{��"�7�\7H=V��./Lb�ER�_b���%˕�&�h6�j�0]ζ���KU�%��kʉ󚸭<�L�E�/i/����}������V���r	
�Ȱ�n�<R��'!.ñag��U�嬍��^����?`Ղ���U�g�۩y�"����h8b��9��=ʠS��6�OfZ7�hG�Va6��%�
�dEC$k�e0��i&��Q�w,��,�UD��Yw�O�G�j�J�;�-��=�v�����o�鴜�㋫��-=�E\��Jǘћ�'M���>XL��9x

�P[�/��]�	�ˆ!�:��Qm����#)Wn�L�T
@�`�_/�ao��[D���v+���q�]#Bіu��� V�G����'@��}h�4$OؐGL^i!N�	L�
�!���K_&�k3m���{ȥS:��|�mX���[, �����)�{opm��++7��!���&�:��u@���ݷ�9>M�~�;��8G�Ig��K�Y7ܕ���2���#�?,��RG+����Nz��o�ϛ[>1G��n���и�[qB��/2�>�l�al"�w����p�����Ų֞�d>ڳb3��-�'V&�{%EV޴)�8�F)���h�[L&��Ϲ�0d���"d5}j����[X|�{R��ݐ�{�ܭV���,bq��:�x�������ܬe�F@��V�"�����!�hPw�/Z���
��&U+�/Z��0H���37���^j9��t�-��(:�}�l���ɇ�]F��Q	�ay�3qfp
�K�
\���n����:�,,{R�9�,�x�9���;�p�t4�P��`0[�\h\�����d���~ӄ#4k:^||&YТτhօ6�$�������E���4�en4\ϴ�U��>�v�N&�30{՟�o�	�l�ăg���b"��y��;�y�ʓ�yg�9
��2C=�N$th����V3U�r��Gٕj�A�	$�_�A�{��F>-��}m��c��R�Ø6N�S�Ց��z󗫀b�Q�3��� ��-��?��}o�e�c��[ɮ!;u�`M�x�`��h�2�~}
`�~Q�����Q@/]�>�H��}�c���[�״cD ��Iu���Ͱ
S��Dk�u��?5�e�uyD���ƴ�3r���U#�d[�9�	|�+�,d^>�+�~
!�(�cK4����h�LJ1J��/��{�8;6�d�u�)��D
|�XAJB��K��t�\���rB�n7�B�:��X������4�c�5��錯�u�ҙU�oq�+)f*ϻ�k!�������P����_�xy�YJ�jS�\܀\�n%u���Wq}E�����[��*���T�(&W����25�����T���C9-��vDӭ�zo��<��ŕ�
�;=)!�=-�g*����A��܆f{1٣�������t�6P��q�XF��f��x픻;�D>�9bJ�L|RG���C�;�[o��)��^0�	�",яk�K3�(�#n���h�����-S
6�����M�[��3�$4���;8��i�я��`�n�/[�kV'��S�.�j����?]������蒫�	�;��I��� �|sse�Z�k��s�LV]&9:+S>*m޾�pm�6j�&��ru�U�
ñ��#������,|��W�F�8�k8B�.~1�e�-�&�����*�/ֻ��6F����š�*D0@�V��8/@����pa8��L��}�\�y끏P��
ܣ�iᮚ�9�6��J�(PU��e$l���r��,2:V��A�L��aq:ӗ%�N�ө��6�8�F�tgf��K��N+H躐"O���D��qX��T�jE�p��e���ż�ʙ�
�+}p@8���AI��6�<h��a��|=l`��
'.XQ��džP���X�v�8*�%�}wk�X^�V\�0.��<��o8"}��
/
�<?g�´�Mr�d��x�_Hu���8	�k����ju�I���0�/�4I1K���Ě۶���R����E��N@�Ff�֎|ڏ=�����P�}��c$���:��L��ӲDM���>�<�	"�ht��U��G��q����on�ۊ�;�	Z��]���"���;z�����#	֮J��ٰ���`���KOcy�XL�ɠ�s����<���v�P����Oշ�]~��R���e8 �>�#��ֲ�����8�%�i��OL���1,:�snϺZ��GF5{3t��~�RD��IB���kJ�a4"�y2`Ln�w�[��\MM%�9� �>I,���v	�8�*`�0�Ȇ~$ш'A~�����
g�ɛI@bQM��_�){�h��dL�c��u�a4\� 	�N.'��.Un��v��O<B�M%�.��xd�4��J�g`;�4k|�m���rG�^6�B���~[$C�)�:��h�<D��VA�߉=R�6�͠�^��
�8o�`����c�_�$O��ӄ&5,T�9`�x�k6D��&�C�ϯVd���W��>����!��2o��f�dK��m"��A�>�&]���Y�To{�N�J���R!���Ġ�XvI�f9ξF�a�1C����~ĄнI/7.d�=S�}uh6h�?�o�g*۴��j|__�eL_�T�Kŝ�O��Sf^?pH"T����";�G��E��ŝw�}ꨲ�S��,k�h��p-#bՠ�ޭ��
�� �����e�3m��ʒjm� W"�`����0^���L����ot:a`��݀�)���:1G衝"�q>�R�/�Z&ŋn2���̃l���r����{��{G;9��^�P�����~��_�����M����OW�=�@/���1��2�a�`�w��{���d	'���ɓ�'A7��ZbJS�e����3��&��w��b�3>�\���i=�Y�&�����灛��u��l�*���MP�3�Bh{�r��ot�頿{k����[72�{j��iwv,kGje�q�D[�	WǾ�����Hy�oX�t	/�Q'����89z�d��ӣ���~8��J��ז�iώ�>Ӎ�]N0(:]����i/P؀MY�<��K�7��r�?����F��w����Q�.~�wot9bP�2Ð�_��T�[�1���`�B~�2�`�&��gQ��ڲ��o�	q%"/��k�7��M�2YfYI�r���ʨ��z2M�#�V]!�wY�Dz�0�Klú;�2x{K�~��bŔ.8�vb}��0.6c�W�>��,���Q�zM��#>��	-s�9�ע6�]��ԙ����u���.�{@�����,t��qJ����%046$7��V���,b�+^�!�&��y�b�tL��d�/�&�b,$�	`D,
���S#G�z�욆'�����oӣ�¢��3tMC"�$+<�H���+� 2O���,�<v�
�Hq�K�a�L��D�{ը�)�E��°=�7	�{��G=�Zf�>�;
�8�7|>����O�}V,wF.��	W�.�#���1�^hA�_>��}��pi���6�55ۗ/�W� 9�<٦H|V
�i�*��;�7��X� �z�K:I��+�˅��o�Q;�M�I]W�iV9�B,�RsS*�*�L�4�t2�+v�d�q�5b �_�?�Ky��p8J�)N�#b:�:�y��
;0�8�ޠa�xK���M�z�ǔa������AԦ�g�H��Ǹ�?;�SPτO��E������4�#؝��D�%���=�Qp�2�'��g"��xu��@�''�Gy��5Cq�uc�$�}� |�3��g.-Zbb�f����0�VJ�`�tK]+a�%<��{T�!T���|39���|��Kx_�5i�d�$q�/���꺱��O�	�e*�$��YN(�/����FL��?DZy����L�������r1�$��Z��=af�C���g�sh�a�3�!]h�b�3������~��� S�,�1k��f��>��D8!B��
�T����TO� ,���R��l��\�W9rl��dY�5�"!���,��&T���SP#����#�^�����c�1��5��rڻ��>%��
�Eq�\��eN���@��:��J���&��C���!0+�s�&1Q�NJ
��ĂC��CQq%e`�҉�=(M�׫�H'�x3����YVx��\1�3�_�Ĉ��y,�掕��<22O_��J:��ͼ&h��cN^ou��I�}�5HOI���#b��
q%*)�">"40�
P����WZu�� �nT����1�:!D���Ss��&�N�XjN�:�)��{������T~��x��u�{e&dϷeUP鏗�n�`��*3��o/���~+�S�~p-���
g��2�!�si'��ȭ��Q
K���[���`��Q�}B�+]�c���������(i�i?a��jD��RG��TA��O^��_�6����./���q\W粸�R4%�����bv���%/����'�U*��?�2�OǺ�d�Ȼ��_��io����b��XY�`	Ua^"L�$k�@n�QUndW�ήH�fn��O�8��S�|_`.*r:㼛�uPTW��^=�Ɂ�-^�|�1/�܋.˟b&�֊_cN/KJJ�0�e;�7\�#�n��ލ�LĹ��z�LS���1�~��M��_}i��C�G3���$YL��^����[%�7x�
�]ʩ�`qS���(�LZ��%���Gq�cg�G�vIc^K||}t�ȑ�h�!���W̐J��I0�ƨd�[�A�2�uH��m,#��^s�H�w8�=���Dn��
ރ��3B���.��#!5�Y򲓞�|�q����;N�U�{��%7�<԰��Sr��H~��`�A��ȳ:Y������U�*��70�U�\�;�[�5gc�tcio�r[�a1�X���$E���8	�������-�1�Κ��K,)M�b@w�q?������;���.+�sZ@c�ᨻ�K.��;N�"���G�ӻ]��߰R{�ӽf�}��~̽�#&��JqJ�>�=��*�Y�5�k4��#��q��?r�I���ݑ�
.�h��5��[8���풽B���!x9�{���D/+��؅2��a��(�1l^�}{.���S4�����1��7�\��G��F�W1���F��tI��w��x*Zq����AE�
�uG@��Bw�V����e�N+h)i
<����7��tgTWBҌ���ŵ���8y1h
OA�׿�&i���*��e���ߌ�s�_�/˲3�}kkF���{{|�ϯ9�H��0��?�/C��-E����)-]c?�1�bA��jZ)�{���fY�8��U�����v{`;�迯�>��l6��1:Y7*oDGFRG�<�Я086�-bAk�a��R�w��o�y�bl��]"SoK��/�u|wTú��"(��	r����������y��LH���^&D�P��?�&��;+�6m^w���<���XV	E_��'�	�~��8}؀M3���L���i�?hӳB7�	w"���
�r��(s���H'I),[��
w�G��G-���|d�C� #��^�gg'�^��\|&�u��?��W��sU%x�{�z��ɻ%��P]ڈTc���قt�_�����f��=R�CU�j>�����?e���Ӱ�*�:U�%� kL�~�\x��ɕH���E���_���Ь?k�\���,D��G����D��(΁�]�GS˥:�|3��+�+�*�&#H2��w�I3�Y�,�O��ӃB��ik�^:�́R�&�+L��Uxm'�]�W'��Ƌ/�1wb�
T�m�j'/���p>����ⷨ]��.��]Ze�?���-��F�S''�/���&���ڨ@Y�-�x��,&��',��`P(�\��'i����2t��nT����g�\z�4�����Y�?�Z�K�x�p�w���%>�����@u��m�9-d�;�@��_k��H�E~�3(���"�d��ON.��mH��_xQh+|�z!�[���>�s|�(��T�h���pkC������d	�����S=�83�W��v�
C=���ϕ�r�1�X4�~��R���
C_���ᰶl��@!��&u�#���i#pgUa|�g#¯SYdc����/�Qb�v�*i���(�맫�8��Pϓ�d�?���(&�a6Νb��v:�F>W�{�r�/IC�xμ;������c�]��a��';-��_q��J��C��*r�Ӡ�u�!J�6}D�q���S�q������>!(ӞӧJ�{��֏��Ʋ�s,W�tT9��,P��:$f<�[��>,^���&����D�#�
T�H_��V �p�*�֢�f��`Êq�x"�3<'�.�J//D��+��l�#�O��u��`�S�Y����Mp.v�lK��F�(4�,��]�Š�iZ�D��ú�;�B�_y���;5 �#�bK�,�6x����%�چ
�Fc�i����>V�0��GW�Ɠ�oKb{�2�,M��>�l���`����?p�X�ݢ���*��4��9��<���ѩ�ugVnp>Y�xt��):���Թ�u��4�+���Wc�/m��Q��x�����J������@I}���D��}�{
1�|����^��{���EZp�$�����+�EX1�hm�U��&�u����H~;$8�0W�q�ラ�M��n�H[.�^����'���Y
�P�9�@�p����������IvQ\�-�XsyF;��
��k.��������Q�O���o��1��M��E3uL�����Е��c�ѫ�t�j�BHx�%����
��+�ޣ)��ia/<�-.N�F���#碾xPN+����C�w����t�߼��Vl3��%��?�k/��mx����]WE���ׁ�LS�6�D7 !�X�­s�N�-�=�&\�38�|l/�ڋ�r�+@���e����F� �ނT�aUhM`"�I���yR��m'��K��ƚ���9�.��u&}�e��[u�iF�H-�}�,�p�V�-Gbã�y`ۮF8#a<�οf��1�֊�<��o��LN�"��IB��I��U�9S�?�X�)�gժ{�f,��,mēi��7�ݷw�=	.9�h��w�ݻOEQ���F�/Ҟ�x����d��I[�Z�6<�.�8Z�Ʊ�[%Ta��3q�������RIp�p����G�5&i�f:'kR�����s��_��`N��$Ef�r��7!+�F!B�/�T�!f�}�ĐX.��,�孄t8�G�g��qC�d�v��ͼS��d���� ���!�^�kׅ�Y��D;�q]D���1�=J��ˋ�U#��D>
Wd���-��'!u���Y�H�:#�/�NV�SY��VT�Q�������.�~Pe�ɫi�#B
�
cXd� ,�QJ��iYx<6���Y^u�餅E������ң�UPݼh^ܱa{VOWt��׮�:,u.��u��Z��W������G�u�%�Jn�φ2t¿�5ʘq"��y�n��.�+�'�0k#w1��>}\���~����-�鄍vK���6���X<>���C���u��"o���4�n���ݔS�ܺkJH�������b�8�3Y�cR7��5��'M81�ro���v�*%/�t"�jEMi��O|�!�4U�SF!��#��.���`-���	������ؼ�cxN9ߖJQ�(;29؟k��a��oiM)yp�b�g��;��38����J�|��p�X
!R��0C6:��t�|�O��#�
��AO���ыG��:�T�۽�h�U�,�3�tbZ���#2Gr�{��M�3���2�i���~�-��""������[���ƛ?���}��c����RK������8y�����c�q�
;��6(�)�)>'
m֟�
P��ٱ�4��5]1�X3����;�K��j���zE�y�$�=䊏w�~)�m
6m�R]Q�lS�W��X����Ww3z�Y�8zS$���|*����h�S����D)6m�Mej,6�W"�I�1��wR�Lқ��V���ƤP��(���<ˁ���${��HiX�.�Tn8�-*��Z,�>�T0�*"o�ۑ]���"
��*��Q���,{��hȆ>'��ak+� ��Dn ���$��rc���~~�<{�j�YA
*',�8�t�'yr�E?��E���b?���6n����$<��vo���Eq;T*oio�f1n�"�tF�k�d��l�zs���a8�4�!o���`W%+8�E[;��<q�P�W<�$)�xn���v��.�A&�H�ˏ�>�k��ĭ��I�A�j3�Y�ɖ�n����Xǒ��ko��J���'ǂ51I{|�lա휓i�FU��ě݃扸�C�����#c���P���e��s��b=W;ΰ�r����ۅ���Bu��5�cu��W�o(���E/�S�y�pupKg�b}[�:7��Y���y��S�a�⺚��?�)��ٔ6H�	��Y{d��ʍ�;��;�Pϋﻋ
���L��ð��_�9����'�:��F����(;������{�~��-���u\H�����\�/ہ�9G+���qj�Cb�-:!�w0jjD+}�̩���g�Cff��!�3�����!v�W�g;�;(5�P�&6�\�׫=���bw�X���O�Pm�6L%4�~�Q	�Q���$�S�5\,8�k�;�~p���tA�aP�7(�4LY��o$OkK5���,1�WJ�I�8��e"k�Q�r��/I�ߌ�������^P��z��T�,m=uէ�?I/+ �&X�S;��ޚ�`��>5�?����v��	�C����-73��9��߭.~��AMj��!���l�� H��f�%h �ȇ9 �5E�H
o�5`~��}�AT�ȫC���s��-�����tU���VԣA��:5�k��èҖ_ߤ4�6V����F5�4b�N��3d���5!�G�/VF@����--��MMB}��uRF썲�����P^_.Q��Q���Le��G���T%�-T^o���>�֕�X\���I���[�Z�7�3_���
*2��Tj�̧2cu������c�*���k�
Y람p���j��
�KM!�'�z#A�ٷo�&b^,�S��S��BT0ũ�P_ʍ��
2�e����M�y⳱A5������J�now�nV9�)vb��`ʃ�j�&�k�����ڤ|2;��;�C|hu��	I��v���5yco�Q���O%7�+0™��!��VQ�I,��� R��ϩF��	���F
Vmi�E[� �T"�}��+���*qĪq�����=�pM�J��5��B��۝﫡ه>󾓑=�_�싗�
����i�����"L(�B*m��A�I��EY�M��8�˺��y��� 0
�#�(t�,O ��O�4:#&�����H,���
%eU5u
M-m]=}C#cS3sK��f������z�?�����z�vVA�f��g�d��ne؆EdO�{O	6�0P�+%4�I=��#�=��U���{��h2gg�9�
^��KJ��a���F'��#hu��ic
'qx���ɫ�s4<��#��P�n����qQƵ���ZIx�A.��Rn����@q�|F��#��K�[�y�b�*�T��K)���[",�Z�Z��a��"�ah2�P7��$ʹ�d�E��F�f�5ɛ���|+�6j��n%�a��kli�tⴆEܒgk�K"Y8T��S�*�)��ʛ o	��/��d���#�%x�ڲ�4d��>�_ڡ���3�⪽�32��?��M
�+k����bQ��;�aU�ó�T��k
�,��TZy
�Z�����o.K��(�q��tc0��_��5���;m��Dmr3ݡ�ޤy@ɨ�<�y�c�Ҿ�M(@��	�4����ͰC@d)>�x>���K�EӨ�!(��)l�1�95C��h
n���у1�|�Prq	�����7|ͣhUG�(�2�8V��$�.��3�1��� ��
�8���ԛ������
�k��7���X��p��m�R�4=�K�h�!oz������"�c8rQ�E7�;���
M�u-��
vvA������'o��r�uA�r�7�`���J�~�l���MXwF
��v2WL��#I�{���F��ÈdYH��0����zj*̔7�7��Ap^o�ueU��l��Eɰ��assets/webfonts/fa-regular-400.eot000064400000103126150755142440012746 0ustar00V�,��LP��l6Font Awesome 5 Free RegularRegularL330.752 (Font Awesome version: 5.12.0)6Font Awesome 5 Free Regular
�PFFTM����GDEF*���OS/2A�SX`cmapǠ���gasp����glyfDڭ�	 n�head��6hhea5�$hmtx�t�Tloca��F�6maxp��8 name2�4(w�[post�iA�}<�J��l��_<�������������������@��LfGLf��PfEd�������.�T:� ���@��@@����@@��@��@@�����`������@���@���������������������@���@�����@����������@��@��@����@�@���������������������������������*����"�$�.�>�D�Y�n�p�s�u�|�����������������������3�D�F�J�N�R�\�e����������������
�I�M�[�]�t�z����������������(�[�������V�g�z������������������"�$�.�>�D�W�n�p�s�u�{�����������������������3�D�F�J�M�P�[�d���������������
�G�M�T�]�q�y���������������(�X�������V�g�y�������������������������������|zwZYB81-(�����������}zpf`USC
�
�
�
�
�
�
�
�
�
�
�
�
�
�
m
H
��g��$
�
�
�
�
�
�
�@|��n��*��b���H�*N�b�b�	^	�

:
�
�:�6��

�N��D��>n�8�(f��L�D�L�l�.l�D��f���Z�h�D��f�  f �!!H!�!�"d"�#L#�$$h$�$�%%N&@&�''N'�'�'�(&(j(�)")�)�*L*�+4+|+�,H,�--�..d//�0*0�11�2
2n2�3�3�484�4�55�66X6�77`�����$"/.676>64'&'.7�$�,�$+u**u$O##O$��UN��OT$	**	�W"##"W���1�"/&?'&6?627/7j �� j�A	(	Ad�>>�d||&g�	DD
�g&���b~~b�BB����"*2%2#!"&=46322654&#"#"&#"6"&462&"264:7O��O7
344b3#99#3�xTTxThP88P8�O77O�#33#�TxTTx�8P88P����2"&4264&"'&=4;2�Α�Α��uu�uU C	��Α���u�uu�
>��0

���'3?GOW2#!"&5463254#!"3%+"=4;25+"=4;25+"=4;2"&462"&462"&462��`��lj����������`�pT��\TT	uu���(8276#"&#"+"&5&5466325#"&#"63232P,A+=C%gA?		')%g�E;f9-4Lf9p
�( S		� ��   � ����
2'4634#!"7P�� �����0pp��Tv��T�#.2#!"&5463254#!"362"&457676��`��l9""((xX��� �����""�0((xXP��A�*/7%76#!"&5463!2+!547&?62'7'&76� 
�� �`���Z
0+t:�A�+:g �`
 ��r��
Z+10:�A
+:����+2"&4264&"%//&?'&?676�Α�Α��uu�u.>>	>>	>>	>>	��Α���u�uu��>>	>>	>>	>>����2"&4$"264/&?676�Α�ΑK�uu�u<		�	[			;�	��Α��au�uu�
	�		[	=�	����8@2"&4264&"%+"&=4>7>54&#"/&7632"&462�Α�Α��uu�u3.
				%@&?A""��Α���u�uu�� 		
64�""@�#/2"&54732654'6#".'&47>2267." /AA]A
!-*�[<oV*����J%%�%J[0A]AA.!
aPa-O5Paa�MCCMMC,A#������3F#"'&54?632632#"&'7"'632'67.27#"&'&4767z
��
-AY-Ap/54<oV&%J/54[�*&%��?-r?-�$-O5)"!CM��$aP)"!CM����#/;Ggo7#"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;27#!"&546;54;2354;232!3!2�((`((`((`((`((�((`��0(�(00��T�(((((�(((((��`4444��*�������&2#"'#"&7>7&54264&"6?�Ԗ�j/.AJ
5Vzz�z(
&�z�z.%8FV�^�^^B3*

�2#!"&546;25#"/#��`�
	7��
	7�@� 	7���	7��H�"&%2#!"&546;32%763!54+'#"7!P�p�@��P?�@��P��M�1� @0j�h*@���/DT%"&=46;2+"&=46;2#3"&=46;2#2#!"&546;27"&=46;2#��J�		�0
		=`������0		
P		��0FF����E�#6M%#"'#"&'&'#"&767&54632%3264&"67654&'32?&/
A<@g;B
,zV@hKe�KA__�_x@1/R21R>
'6,'#+7B^6,	Y<71B\BB.# /#$;(E,2 �� �%&?'&6?63 � j�A	>�d?7D	�g&�D~b������#AQ&.7>&>6766&&7>2>7>&6&.7>76�*

'>D88(%6*

'>D88(%5
,36<FD 
,*(32;" �
	)`

t7�*6%(88D>&
*6%(88D>&
i+
 DF<63+
	!"F<63
`)	

7t��@� ,82#!"&5463"!54#2=!37+"=4;2+"=4;2

� �� �HH����

��`0**����d((((@�%-%#!"&=4?>3!2!'5!$"&462"&4627	� 	i

��N�Ni� �M����		pp��M���2U]2++"&++"&=46;2327167>322654&+4654#";2'>'>'4&"2�"1
$5."S
	
@

@
			*2V�,
 **=
	
�61"

"(3(�$/$v,#$�= 
&
����2V^546;&546321;6;2+"'#"+"&'&7&'#"&7;;2675&'&'.#"#""2641"V2*			
@	
@
	
S".5$"10[
	
=L 
,�
	��"1$/$�(3("
1"
&
 =&�$#,

�����3U]46326+"&=4754'1&'.5463274&#""&#"3>=4.."264j1"'
"(3(
�
/$v,#$�&= 
&
�m"1'$5."S
	
@		
@
			

*2V�,
 L=
	
�����1S["&=#"&54>76716=&=46;2''26=6767=4&'#3263264&"�"1$/
�(3("
1"
&
 =&�$#,�@1"V2*


			
@

@
	
S".5$"10[
	
=L 
,������*9B++"&546;546;22=#"&=#"3%2=#"&=#"354/&+�P�P�t`JTX
j�0
~��0@0�>*���`�
X��
0@����+3;#!"&5463!2#3254/+"&=#"362"&4264&"���N��zN
�
*�H44H4G"">��`"P��Nd

h���4H44HL""����2#!"&5463254#!"3���Z�����`�pT��� 22#!"&5463!32>567!5".'&'��`��`#dd#�`�#FF#��� 0)N		N��7

7��`�B2#""&54653+"/&2#4767654&#"#.'&546�		&		8(�	N	PIg,0+ K54L +0,ep		&		(8��++%%�gIB25=1$05KJ60$1=%
2BGi������%39%#!".54767>54675462!&5414&"0"&53�	��		H8%:!��8,B\B�4&�V

	
C,:V

,B&,C;d.BB.d�%����#/Ka}754;2+"3"=4;2#+"=4;2"=4;2#!54;46;546;23232%354;23#+"&=#7#54+"#";;2=32=4�((�(t((L(��@
X
p
X
��p(p@
p
@��((((T(4((|$${	(

(	��CC_

0����+7%++"=#"=4;54;2327#!"&5463!24#!"3!2`X XX X`��`0��T� XX XX���`��T������2"&4264&"�Α�Α��uu�u��Α���u�uu�����/2"&4264&"6"&462"&462>"'&>2�Α�Α��uu�u��/�/!f��Α���u�uu�c\
99
'����02"&4264&"6"&46262"&42&'&".7�Α�Α��uu�u�so~)R��Α���u�uu�c-m1
����+2"&4264&"6"&46262"&42+"&463�Α�Α��uu�u�s(

�

��Α���u�uu�c-}@�'3?KWco{����2#!"&54634#!"3!2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2� �� ���```�����````b����� �� ���n������'2#!"&546;54;2354;225!3���0(�(*�����`4444�p*������%.=46"&462264&"t�	4�Α���u�uu��e
	�Α�Α��uu�u����'7"=4;2#7#!"&5463!24#!"3!2l�l��`0��T�  ��`��T������#2#!"&5463!%/&?676���`��<�	[			;�		���`�p`���		[	=�			��A�2Y&='.54767675467'".>7676#!"&546;2+"3!2=42�;1+6(-$50I;"��!0<*&>))
���VT"(� 6  )K-;(!9 ����h)A'%
�+`	
��	����
%6&?6764&"2"&4264&"\B�B9ZΑ�Α��uu�u>�B�\�Α���u�uu�����
&732/&6%#!"&5463!24#!"3!2}�ccK��`0��T�cc���`��T������
&%#"&?67#!"&5463!24#!"3!2C�ccu��`0��T�cc�`��T������
&7546&#!"&5463!24#!"3!2�cc��`0��T]�cc��`��T������#!"&546;2'!#"&=#r���.L� h
�^���rLL�� 
h����),5%+"=4;22+"=43%#!"&546;2'3#"&=# ������T�Lh
��T����T<L�� 
h�`����.T\%#*#".#+"&=46;>7>3232>'2654&+4654.#+2;2'>4&"2�3&-E/@

c
-3	$(Kh	
m&%@

���!$*

�
 #	:/45'N)
9

G%�&B"U����.6[%+#".'.'#+"&=46;232>3:32264&"2>54&#6&'6&'6+"#322>54&5�2$$	3-0

@

@	.G-88�]b



@%&m"(�"454/:?	
�
3,$h	
)"B&�#6G

9���(8@H%/"/&?'&4?'&6762767'7''77&2"&4264&"�<G(
+(G<<G(,(G5MM[44[MM[44[�V==V=Q.!!.!�+)G<<F)+)G<<G54[MM[44\MM�=V==Vc!.!!.����&"&463276"3267&5467&j��j	%a>!"$h;VzzV0UT�2*@�Ԗ#(
>$?P9-2�z�z)$mU2T����
&/&?67#!"&5463!24#!"3!2cc���`0��T#�ccE��`��T������"264$2"&42"&4S�uu�u��Α�Α�B//B/�u�uu���Α��/B//B����#/;GYe54;2+"3"=4;2#"=4;2#3"=4;2#+"=4;2"=4;2#!54;463!232%354;23%�((�(�(X(t((L(��@
P
��p(p��,((((`((((T(4((|$$�

�HCC�����7=DJQ#!"&546;2'!#"&=##"''&76767&766>77"6467&'6&7r���.L� h
��

6'.
$
3�N-

x^���rLL�� 
h��D
.0*[�"�
#����R#!"&546;2'!#"&=#32+"'&/+"'.'&6;2476;21676r���.L� h
��


	


	
^���rLL�� 
h�&b		+	H		78	
`b		aa
����B#!"&546;2'!#"&=#2+"'&'+"&?'&6;26763r���.L� h
��#...		^���rLL�� 
h�=N7NN($����6>#!"&546;2'!#"&=#54;2*#+"73264&+r���.L� h
�HE#	
0

^���rLL�� 
h���%
/c����(0#!"&546;2'!#"&=#57676&2"&4r���.L� h
� ((X�((^���rLL�� 
h��@((X��((
����!$1@LP3#7#53#3#57#!"&546;23#"&=##5#7#"&?53322654."7#5�  @    @ ����Lh
0 P�
 
-		@   �      ���&L�� 
h�`�W'a  �

�  ����/=#!"&546;2'!#"&=#/#"&=46;7664'&>.r���.L� h
��$$)
	^���rLL�� 
h��$8$Y

:����7#!"&546;2'!#"&=#6/+"&=46;2r���.L� h
��5hh^���rLL�� 
h�p4%h%����$'0<M7#"/&?67#!"&546;23#"&=#7/&?6&?6/5&?�99!����Lh
��	7		7!99!c66����&L�� 
h�`�	�		�O66����$+"&46227''64&"264''&"67&7gΑ�Α��/p/522�/B//B�5/p/522�58�Α��D5UB//B//p/522�5/p/522�����!6#"/&='.77'76�2<
	p+) r�%%�;�`l���!�|.;T0<�2$��-�	����� '.5#"&'&676326767'7&'7'757/?'#� ^a&'O� ^a&'4_H:'G,4%=/@G�<&
G@]+G'%e:@,O+
b� ^Mb� *N�
*/%L=�4J/}45/J��>J%?4I0==	@�+/;GS_2#!"&546;>32=#!7"=4;2#'3554;2+"754;2+"=4;2+"54;2+"(

�!
+@�`=�lPx���hhhhhh�
��
!
���� ��x``P((��<������8@'&?63!"&54767>57"'675462'&5414&"&53z


��


��>��				.	|"&&%:!;B.&�


�


��0

	
*#D�

,B&7&/.B�`%����42"&4264&"#"&54>32'&#"3276�Α�Α��uu�u3)?=O$@(;&!$*$$
��Α���u�uu�)Q<'@%#	%"2�3K2#!"&5463254#!"37&546'&76&546'&76��`��l�R@AR@=�R@AR@>��� ����V6/.4"%6/.4"%	���+/37;Ocgo#32+"=!+"=4;#"=4;2!54;2'35!355#!5#'#"=!+32!543'2+"=#"=4;2'355#+�H��HH@H@ �@  � ��@�T���`8L@�HHHH@    ��    @���4�4pp�pL
��@�CGKOSgk���%#32+"=#+"=4;5#+"=4;5#"=4;2354;2+354;2'35355#5#354;5#"=#+325#%5#"=#32+"=#3235435#5#4H�HXHH�HXH�   ��   @��� 8XHX�4   �HHH�HHH�  �       ����  @�XH@    ����%#!"&5463!27#!3546;�T��`�LLP���
hdT`��L��h
���(42+#!"&546;54632=#"&=#"3%254#!"3�0��0��*������0@0�0*���`4������%+132#!"=4;467.5#"=43!2#!2654&"p2//2��2//2h��KjKKjK�?ss??ss?LllL�`LllL���)p6+"&5<&4&/&=46>62654&+"&=4&+"&=4&+"&=4&#"/&=4&354?6�$C	+
�
b'8#I$@:H							a�+q,(rd	!

U"49#,)(
�r

		

		(
)		

t	)

9U
d������Y6+"/&676546>654&+"&=4&+"&=4&+"&=4&/.376u.�
w!3 P4			

	
s�O)��
�7~!($%)!ф


L		�
�		�
�		�
�	&	�w��� ]"&7.7#"&463'.>6#'32?6=4/&#"/&+";2+";2#""(
X++^O8�+1b"wFFw	b
�
�
	��		

		

 6 
#+<+	88857'�%0�7@	;

			��@�A%#5'&+"&546;7#"&=463!254/&#!";2+";2-�d�!4$r�!/!&'v�
��
�	r�

c�$|H&!$40/!!!��L�
@	'���3g+"./.5476'&5467&546767>3266&&?6&"/././&;267�:	I*k	\((!&+ /+ $
	4
[
+k.L	�(:	V	R
+*
6	Rh
��

��iz"$0V$������^p��6+"/&676546266&;2?6=4&+"&=4&+".=4&+"&=4&'546;2+"&7546;2+"&754;2+"f!9%�"m!'7'!-��m	�			DL		K
(#Tw�7�''J
w

�wT

	

	#

#	�

�	R`		`	`		`		``������#^6+"/&7'&676'462654&+"&=4&+"&=4&+"/.;2?6j(%�'758%	+<+#0			

;@7�#Fw"b1+�8O^++X�F

		

		��	
��
b	w����,52"&4264&"+"/#+"&=46;2'254.+�Α�Α��uu�u6+0 'Of(: ��Α���u�uu�#ZT�U3)!

@����;C%++"=#"=4;54;2327#!"&546;54;2354;232!3!2PLLLLp��0(�(00��T�LLLL���`4444��*������+37"=4;2#7#!"&546;54;2354;232!3!2|�|��0(�(00��Tx��`4444��*������;C%//&?'&?6767#!"&546;54;2354;232!3!28	66	66	66	66���0(�(00��TI66	66	66	66���`4444��*������'72#!"&546;54;2354;225!3%/&?676���0(�(*���	K			,o		���`4444�p*��Ɏ	K	-n			��@�!%*/2#"/#"&54>?6327673#0

�



��

�



����������	��
5=?	Z
5=?:��.��/,�!/�����*2+#"=#"&54634&#!";?326�&&�}`&&�	��		�C
�	�&��&^T& &�� 		��	<2
	����/2"&4264&"%+"&=46;2+"&=46;2�Α�Α��uu�u(	0		0	p	0		0	��Α���u�uu���		�		�		�		����"&462264&"+"&=46;2��Α���u�uu��	�		�	'Α�Α��uu�ux�		�		����#+Lfn3#"&5#'#"'&/#+376;2264&"6/&'&6?#"##36???5#'&+"6?6264&"y@
:#;U			@v0��Q			�l	-	'9>*a!
%		�-=TA7
gn			@�

 	L		0��

		
W	;#>�X

 
$I�><3
S0

		
���5`#!"&54767>254'&'"."#3!2'#".'&'&?6232>7676��`(_dQ4/V� 
7
7
	7

7	��!K
	O���B)
	%F��
-

-
	,


,	����'+3H#32+32+#!"&5463!232!6"&462"&=463232632#���@P���4&&4&�	
''
	 @(@(0�0(����`�&4&&4�""��@�0<HT2#!"&5463!6"&462"&=463232632#7"=4;2#'"=4;2#'"=4;2#� � �4&&4&�	
''
	>ppppp���`�p`���&4&&4�""@@@����"42"&4264&"&2"&427&'#"'%654&"6322632�P88P8L((7Α�Α��8.-%%u�u%)@%$%@X8P88PX((ԑΑ���0&

'$4@SuuS@44

����'<2#!"&5463!"&46;2#"&462"&=463232632#P�� ��`		`		4&&4&�	
''
	��`��0��``				�&4&&4�""��@�$0<HP2#!"&5463!3&54632326327"=4;2#'"=4;2#'"=4;2#"&462� � !''9ppppp�4&&4&���`�p ��""P@@`&4&&4���2#!"&54635!3!2��`��`����`�v���� !"&463!2�@

�
 ���&2+#!"&546;54635!%!32�0��0��������0@0�0��`@0��������%/&//+"&=/&4?5/.?&/&?'.?>7'&/&6?'&?6'&6?65'&?6546;276?>76/76�'	H;		:H	'
'"PHHP"''	H:		:H	(
'"PHHP"]"Q*T;.		.<T*Q#	**	"Q*T;.		.<T*Q#	**	����08<H%"=4;2#2+#!"&5#"&=46;7>;2'3'&+"!7"=4;2#�		��		R"d"��^��L ��P		��P		9	9�`P��0����@�$4<G%#!"&546;#"3!2=!"3!2=452#!"&5463"&4627676!���
tZ��t��x""1((hH�� 0�
P��0�_""�((hHP����12#!"&546;462&"2644++"=#"3!2P��P&4&6x*�*���`&&�lT$$������"2"&4264&"74;232/&6;�Α�Α��uu�u�(CddC��Α���u�uu��tdd����"6462"$4&"27+/&?632�Α��/u�uu�-tddtYΑ�Α��uu�u�(CddC����""&462264&"54;546&=#"��Α���u�uu�-tddt'Α�Α��uu�u�(CddC����""&462"264#"=#"&?6+gΑ�Α��uu�u�(CddC8�Α��/u�uu��tddt����C�!$2"'&?63#3%3'#37'377#�d����dM94D��4�4�?D4dxD3aax4����U�0``````�������%5E2"&454+54+"327#";22#!"&54635"&5!#2!46P88P8�@�

��

0%�`%%�%0B\BB\fX
7
��

@
��%%�%%���72#!"&54634#!"3!2'//&?'&?676��`��l�l==			==			==			==		���`�vT���==			==			==			==		�����+>62"&462"&462"&4&2#"'#"&7>7&54264&"6?����Ԗ�j/.AJ
5Vzz�z(
&��z�z.%8FV�^�^^B3*

����'92"&4264&"$"'&>276&"&46272/&"&7>�Α�Α��uu�u6/�/!f!��%
&	��Α���u�uu�$
99
''A)				
���� 3H2"&4264&"62&'&".?"&547'.>6"&5"'&>?6�Α�Α��uu�u�j">'	

P	
�
	P
��Α���u�uu�)
q

	

@	

	����+GO2"&4264&"6"/"&4?'&4627626"/"&4?'&462762"&4�Α�Α��uu�u���4&&4&��Α���u�uu�kL�&4&&4	����'/7?K2"&4264&"$2"&4264&"62"&4&"&462264&"62"&42+"&463�Α�Α��uu�uB//B/<((&X/B//B5((&�

�

��Α���u�uu��/B//BQ((,B//B/�((,�����-2"&4264&"6"&46:"&42'&"&76�Α�Α��uu�u��N<=
	141	
��Α���u�uu��]"		
����/6=AEIMT[2"&4264&"6"&462"&4622+"&=4635#375#"5#75#5#75#5#326=4&+�Α�Α��uu�u���(		h000p000h(		��Α���u�uu�c#  `	(	((((		����'/2"&4264&"%6#".'&62&"&462"&462�Α�Α��uu�u2M)6()�����Α���u�uu�"
".&

N����
#+97"'&'6762"'&'6762&2"&4264&"%6"&'&62�q�Α�Α��uu�u2MRM)��		""		""		""		""ڑΑ���u�uu�"
".."

����4E2"&4264&"%6#".'&62'&7>32/&"7&7>2/&"�Α�Α��uu�u2M)6()��#
	
&
	�#&#
	
&
	��Α���u�uu�"
".&

V)))����
+EZ"&5476".'&62766/&"'&7>27"&4632&#"2654'2$"'&7>32/�,..�6')�)M`
	
&
	#&#d�Α�gC:2:Suu�u��&
	#
	 "EE��%


".�)),%(g��Α" u�uuS!)����
4<D%6"&'&62/.7>7>7/&67676&2"&4264&"bMRM)�pF�F	
�Α�Α��uu�u�
".."

>
FDF	
��Α���u�uu�����,:2"&4264&"%6#".'&62.?'&63'&4?6�Α�Α��uu�u2M)6()��
!!PP�PP	!!
��Α���u�uu�"
".&

/((0000((�����/;JYh76"&4767&67632&#"%67#"'67327>'&76762+&/.?"'&?6367>'&676u/")7Hg<5/6S:.{$9Ig30)-S:1C/"��
	
4

Z4	

4

&.:T&@R"/6D�6I;-�E�9I;0�TR"/s
Z	
4Z	
4p/%T:����6P2"&4264&"%6"&'&62'7'&6?62/&%/&?'&6?62�Α�Α��uu�u2MRM)��#
##
��Α���u�uu�"
".."

G#		#N	##	������%5CTi76"&476"'&'&6"&'6726%&>2&.""&'&62766/&"'&7>2&"'&7>32/u/"M"/Rl#l~l#_r_��'Em~mE&p�p�RM)�)
	
&
	#&#�&
	#
	�R"//"RP 2;;2 1;;�>f;;f?	H``�."


"|))")����;CK2"&45'&"/.32>>54&"&=&'&6276&2"&462"&4�Α�Α8%1;u�u;1)�)����Α��,		+'_9SuuS9_,


,�����;HU2"&45'&"/.32>>54&"&=&'&6276/&4?&?'&6�Α�Α8%1;u�u;1)�)!!
	PP�P	
!!��Α��,		+'_9SuuS9_,


,((0000((����!)1Ge2/&"&7>2"&4264&"62"&4&2"&45'&"/.32>>54&"&=&'&6276�

&
%�B//B/<((&�Α�Α8%1;u�u;1)�)
					4/B//BQ((,��Α��,		+'_9SuuS9_,


,����%-52/&"&76"&4626"&'&622"&4264&"4(%
&
Z�MRM)��Α�Α��uu�u						$T
".."

6�Α���u�uu�����)19A2"&4#"'&?64/&4?64/&762"&4264&"$2"&4��##)�Α�Α��uu�uq				%�Α���u�uu������#EU2/&"&7>&2"&4264&"%#"'&?64/&4?64/&7662/&"&76�#
&
	
Α�Α��uu�u##)&#
&
	
()��Α���u�uu�				�)����!4<Ol%#"'&?64/&4?64/&7637&"&7>32'&462"/&>7676#"&4632&#&'654&"320##)F&

%�ZS
�/4g��gg�
u�uuS-�					L

		�!	S	1(�Α�g.,
 Suu�u����-2"&464&"6"&462"&4622+"&'&63�Α�ΑKuu�uu���E..E��Α���u�uu�u�S	-<<-	����/=2"&464&"2/&"&76&7>2/&"2+"&'&63�Α�ΑKuu�uu�&#
&
	
�
#&#	
&
�E..E��Α���u�uu�u0)#))M	-<<-	����)72"&464&"/&4?6&?'&62+"&'&63�Α�ΑKuu�uu�!PP�	
!!P�E..E��Α���u�uu�u(00b((0R	-<<-	����!)72"&464&"2/&"&7>"&4622+"&'&63�Α�ΑKuu�uu�
&	l�E..E��Α���u�uu�u$
				2S	-<<-	����2"&4264&"62"&462"&4�Α�Α��uu�uk���Α���u�uu������)1CO2"&4264&"$2"&42654'"&547&"&4622654'"&5472+"&463�Α�Α��uu�u<**<*7"@*<**<F"�

�

��Α���u�uu��*<**<F

/<**<*H

�����!3CK2"&4654&"5462275462&/&"&7>3262/&"&762"&4�Α�Α�8u�u8-f-�	&

%p(%
&
>.!!.!��Α���:PSuuSP:r

��

2						
*				D&4&&4����&.92"&4264&"72&'&#"&46&"&46262"&46"&54�Α�Α��uu�u�<&&
As�$"��Α���u�uu�#.@-P1����4E2"&4264&"%>"'&>2''&7>32/&"62/&"'&76�Α�Α��uu�u/�/!f�	#
	
&�&#
	
&
	��Α���u�uu�
99
'�)%)����'2"&4264&"62"&46"&46:"&4�Α�Α��uu�u�4&&4&���Α���u�uu�;&4&&4{����)82"&4264&"$/&4?&?'&62'&".76�Α�Α��uu�uC
!!
	PP�P	
!!PHC
#r#��Α���u�uu��((0030((0J6'	
'V6��"^&�!
,��1U���	4	6Q	�	D�	6&	Lz	0�	
X:	.�	&		E	6]	&�	�Copyright (c) Font AwesomeCopyright (c) Font AwesomeFont Awesome 5 Free RegularFont Awesome 5 Free RegularRegularRegularFont Awesome 5 Free Regular-5.12.0Font Awesome 5 Free Regular-5.12.0Font Awesome 5 Free RegularFont Awesome 5 Free Regular330.752 (Font Awesome version: 5.12.0)330.752 (Font Awesome version: 5.12.0)FontAwesome5Free-RegularFontAwesome5Free-RegularThe web's most popular icon set and toolkit.The web's most popular icon set and toolkit.https://fontawesome.comhttps://fontawesome.comFont Awesome 5 FreeFont Awesome 5 FreeRegularRegularFont Awesome 5 Free RegularFont Awesome 5 Free RegularFont Awesome 5 FreeFont Awesome 5 FreeRegularRegular���	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ�KLMNOPQRSTUVW�XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�����������������������heartstaruserclocklist-altflagbookmarkimageedittimes-circlecheck-circlequestion-circleeye	eye-slashcalendar-altcommentfolderfolder-open	chart-barcomments	star-halflemoncredit-cardhddhand-point-righthand-point-left
hand-point-uphand-point-downcopysavesquareenvelope	lightbulbbellhospitalplus-squarecirclesmilefrownmehkeyboardcalendarplay-circleminus-squarecheck-squareshare-squarecompasscaret-square-downcaret-square-upcaret-square-rightfilefile-alt	thumbs-upthumbs-downsunmooncaret-square-left
dot-circlebuildingfile-pdf	file-word
file-excelfile-powerpoint
file-imagefile-archive
file-audio
file-video	file-code	life-ringpaper-planefutbol	newspaper
bell-slashclosed-captioningobject-groupobject-ungroupsticky-noteclone	hourglass	hand-rock
hand-paper
hand-scissorshand-lizard
hand-spockhand-pointer
hand-peace
calendar-pluscalendar-minuscalendar-timescalendar-checkmapcomment-altpause-circlestop-circle	handshake
envelope-openaddress-bookaddress-carduser-circleid-badgeid-cardwindow-maximizewindow-minimizewindow-restore	snowflake	trash-altimages	clipboardarrow-alt-circle-downarrow-alt-circle-leftarrow-alt-circle-rightarrow-alt-circle-upgemmoney-bill-altwindow-closecomment-dots
smile-winkangrydizzyflushed
frown-opengrimacegringrin-alt	grin-beamgrin-beam-sweatgrin-heartsgrin-squintgrin-squint-tears
grin-stars
grin-tearsgrin-tonguegrin-tongue-squintgrin-tongue-wink	grin-winkkiss	kiss-beamkiss-wink-heartlaugh
laugh-beamlaugh-squint
laugh-wink	meh-blankmeh-rolling-eyessad-crysad-tear
smile-beamsurprisetired����k%�����assets/webfonts/fa-solid-900.woff000064400000301264150755142440012601 0ustar00wOFF��
��J��FFTM0���GDEFL*�OS/2lL`C�V�cmap���M%�gaspT��glyf\O
��k�U�headWh56�hheaW� $ChmtxW��o��loca[�	� xڴmaxpeX )Snameex+�'$postg�)/7��x�c```d��٪?A�-��PZD���x�c`a�������Ø�����2H2�0001�23`i�)
~:2��A��CP�$�hŸH)00l�
�x���}T����/�1��s?�iL[�ʱ�m�M-�i�Y�,D�����GGbb���ZJ���J>��p@$�������S����������T�m��:�9��ss�eY��/V/+�ۭ�o
�ϝC[Vpn�e}���g�;�w�^<��#y���x
��ʗ�L��s��<���"����ü���-�2W�]��E/."D�xP�\<"�����q#��T�P,�"G�o�U�Hl;D��/��q� ��y�*�h�A2D�S�˟��a�+#���\��|Mf�e2G�]���A�%�L��*Y/��FyN^���)���d��Ŧv�}�=Ȏ��I�d;�^k��5�~��>l������+�u��ݡnS>��������U�j�zL�R�����x���d5M�T/��*Y-Pi*C�����P+T�ڢv�RU�*U��V��cuR�V-NW'�Y�v�;ۜ��b�ܩqj�z�s�ip���Y�S�s��sC�tw}����@=DG�z������o�x=QO���z�������d���t�D/�o�|�^o�[�LW�J]���c��>�O�&ݢ������n3����0�Ä����o���f�eƚ8�[oM�y����7�&�,6��7�r����f��d��.Sj�M��25�#So�#���7�檑�1�|憸>�����{�{�;��>�ƺq�s�L7ٝ惡n�����pO�ע;:,�[�3�>�g�Ͼ<��汞�I|��sa�g��s%��k�V^���f~�s�
K���>��x@D��b��#ƊX/&�4�Hd|��<��E��u~��⌸�t�%;�P�C�P��Qr�.��q��?�d�ϥ~��d�\/w|��!y�K�B:~��vW�ρ����T�g���|����|��9]��|�U�U�J�|f��jy�g�*���|UM�Y]wœl���)tv8��Rg��ϩs|6}�g��|Fz>��3�������=��3<�o꼀�]����n��l�s���������H3�&�Ϙ�~�/��Yh^�|f�}��,0��Ӕx>w{>��~s����&�]\�|�y>�����T7���+��N�`_���l�6���A�6
�x[�^�s،g�46�Il�xkq����
,�R,�b܎�p+��E�7c!n�
�p
��|\�阂��%Lƹ8�p:N�I����8|
�a>�#qF�F��1ލ��!C`7X��\��d�]e-�,;�N�Fv�c�>��U�*����2�>{�mcyl[�f�$�<��F�{c�BY�̂@���Sp�P�P��6�zX�VC>��JxނXY�2�u�+,�H����e�)0��s�	0��x
b�	��g�#��~}��p�z�����v��t�m��H[h=E�Z�!��U��V�RZB��.���K��f���ut--�kh>ͣ�t͢�t1͠�4�&ӹt�Mg�$:�>O�ѩt2M�	t}�����'�X:����C�E#�}�7���I{��QJ���NnC��+��\&I39KI9A����r�ԑZ��O>$5��|@�H�I��"����dYE���M��4�2�E��)�Y�Hb�(2�&��@I���Pz9to�/��[��[�m���A�H
���`뛻e�;P��o~�7 �M��x���	�G}(��W�5==�=�s��;�ޣ���յ��,k�l�8�ږ-a#�1�� <�mbL��@����p^���<����BD򜼼^b���U�=�3�����v�����>�wqh��k���8����g�1g���Q)7�8��g�"���F枱".�c7���̚Q�����56�?�q�y� Ь�dQ,�ȅ�,�݆�#��zF�TS�[���Z�:�yB*���t��,�_>�/̃$-*p<��uZF��s\)\�F�H.��I�1Q�iΖ��~�q;��[�����k���/n:x�Dg0�Ѭ	xq��s$����/����I.
�,�Ji���aԚG�iy�1-�=6.O����8�נ{�w�?�iO��]-�ǩ��'��[�c\����0O�r��4�ry�ޅ��V��;�ySR�E��HNH�d����q�l��vս{��}�q���I��XC��\��FX�<B�\��S�0�gZ(F[\n]�q:�N��V�xQq�6�5��ƜL�k]jY$_�e�V�in;w�J��5���s�6@à���,L�!�����)-�lG3;Q�{��Xhs�t�4�K�=����U����P�D��3�,�I��wr�+��9���a8�gjh��|�&�9�>�l����
o9N�q:��ʅ�a��]Ћu6H�:H�`] =ًkH�Xzc��k�����{���U��h��V����<�
%z�t�u�q5n�{ww�6�~��c�*�������Xk��E���v�J����@��2�H��"����\/:'bE���"i�����؞���:����P�>�>I�E�{�{��h�} r��=�}O���a�\
��k
�`��i{ϼ?O~��@��o�v��J�=�~���ދg����n��ý�v�=?z����^,;;8�+�@�+��]d�D-���g��)'�Sb�����p�($No�o��:Fע[�"��G�;�,�sr��1U�k)��15��U����#�C�B�\Js
n'T���(�	{#t:����o�͎,R�2=��3�f�9�y�?�p��/�\Z:��@2c���v�"	�uԹ7�Ց����a��_���sx��y��(����0Ë�)�yD׸�M!���3��l�2�v�y���A����w|�m{RS95&Y���dD�n���GrX-)v���������[�m��E�,�%*C�Jl��]P� !E��*}�$��H�K,s��[�\kp��������֋���U׈���Z�{fߪ����e//8k*_�h|g�VX G���c�9�un���OX����[�@3��hR��u��g5[��VӅ��]�t�a_� �P�HYV�����
�1U.GuL��u��i��7�������{E�1�Ťkl�x��-���hC����H���^kb�X��&y@���a��
{g���.�޾9E�(�7N%��a2�a�|O������">��XO�� x�E!)J��?!�
�,&���
KsF<��'�����FF�T��-�L���y�qA&_=���0�~��Z���&8��(�pP��P��.��~��{�>�E�Um5CB��G⾅Պ���
�S�^�����>��
��Q��Wfː��bxˆvb'�m6*.CG���rg����1�dQ�߉��'t���?��(�u�$d�w��|F���*c�*nA�eU���&���d���P�v�Eמ��E��g$E�Ɋ"�Ca%�Cĸq��'gSX	';i��]׍��"Ido�jz����r$��ɖ������h�Y�l	���<��w�aXQ����IHɓpXuN�$i��o1o"i�?C?����0�`7lZ<9e]	��z�^���sNF�IY�+w�s�M���7��������I�R�W���S�'y�����}�M��N��"�Ͳդ�5�cS`*����𡟑�$q�
�ÕǏ��uDQ�h�NN9{n_�����a��%�����:~��TT���,�
v��wG�W 	{x�1�ԒHO�@UYE1�f��M զ:Ԛ���B��*Y��u1�J�
�v,ہ�#ﺊ��[��4��w]U�eX&�]��jjZt�
�DW���A7Ty�@B��\8
*0/wq��{y�m�7��g+�����GOw��@��e:�)�n���A���� 5��`t�Mw �~��Ƈng$-�J��b����5��m��I\��+��v���8k$��+�ܵ���.����y���U8�!oL�b�s�����;0�P:Z�Κ�w��H�Ϛ��e!p�������FQG��Q
W�-2��#���EJs`c��5aԇ��^[� �i4���yPSL~�$�g�[?zk~�&w��Ӄ7Ք��'w�`���[o��/��I,F��M���Kġ{��XM:�Ɍf������W2��Q7���Я4����1���~[��k�.�����Y����N,��)�*��8��?�����%cʐ��t�}
���A�n�[ڬ�R��y�c�B$W���y��v�ݻCqtQ�O��nQEݩN��6��=٪�9�赃m�T��޷Td�r���+�O�%ǒ_~eR�Ֆ�����C�#��ln�p���_h�lX	E�q�ۉ�J��h�c�V�C
.A�E���
��V�+k�t��r��\{����Y�n��^R�Jny-����8�K[	������0
{KN�]�%R���GU5����hZ%�R�t��S�iE+��_��#\��]ne�Ojo��8�t���7�*<�f2���t2�B$<�ΐ�.���9�O�c��;%�X*0ۦ�S��K��=N��gH�gS�?�B��#�@�?-�w ���O��p����"����1�����/�6�M��V���hM@�G�ssU�Ś����� t�!dۡ#�guE��ҵ�s�v�#ˎ����\.g�lFcE�I�uϞ
[����tî���ALJ̭iGw�BO�b�7hV��X�A�1ч���%@A�Pg-d&RJ�!d��)�����5TvL�1WJ��L���ti5dC�P�,/�����IRұf{w
 �1�]�׽��/d���	y�砑��;b�����pB6�8�S�����<�8;��j���D��ɫ�1�g��&�g�e{�$��N�J���yD)_v�^A-����x(�tC�ۅ�ZS��۟=:�S1E��i�{~t�
��O���z��bx9�8x�E�
�;�b��0���tF�^�6͙����__AO�\.q�_�v���($��ǡ�#�.����O�O���,jC��.M66>Pmٵ4��A?:
u���5ۧY���>?0�#J��:���2i#�M���P�\���ĩ�y��s��,����(z��U��u�T���P��/I�v�v=^;�֛;��ЎF;M�&%.�G��5g�*ܙ�Χĝ^�Ы��S�u�W���GT��歆�G��m�ҥ[��Á��/��@8Dp:$��#�:��h��_V�2y
��]`��s=�f�,0lЏ�+�D���X��	�l��r�W��T%��Y�z��Կ���`��U4P�O�7��U2�Wz=��M�;��_n�\�{.��W^�Ki���qz�f>H�a�E�|�=]m�s9���:tOD��K����W{�3wO�ZOh��x�A��x�K;�U���	W��@��%i;�;8������˰�,���+��q�M���%�G�u�t�_�=ih�6���hk�B��[/�==�P����?J>��@Khc�ʏ�B1|Z�F�R�#�:�D�e0��CzD��F��t�oT�aD~��OL���?�V�(ʩ9EYdŰ"�b���'��>o���t9Ν��E` ����TA	'WO
!��ڙ��f��H#^HF�N�\�$��ȑ��O�q\�r��B�B4
%g���/��;�7?t�O�XF�N�<5+PI���<�j��S1�Ŀe5'���?��lXx�%Ñ�VMu}z����'N\X^�;:�!z:ORL-x����gDڂF��08�.�٢'6��p��b�`E�聫0��ղ.#���u}c��sƽbU
���Ud�*H�`ׯ�O4�\�l9�H�)F�s�P�e��ðT;klL��c�).caܥ�?�(o�����J�'�㠇
��BQ���DC�����/`.��P��<�2�s3��#��#$�G���	�x�#����A�~;q>`0��['���6&�i%�7c�d����e�U?��`�������'�
�$�w�ÉDg��R����4�6���M�>�c�W>N�	��*��R�qdh�i�P���'q��Ķ�?��agvnnX�A
Z����a�.k
���:�{}�ځ����|��R1�C1ˎ�8�/��6�(���PpHi��!�s����	%s%8��;G�Y�����l����h����j>YJ�l_Dk�u�t��99���1��3��p�M��S��Y֚���Gz�'��>Dx�,O���f��c�1��8q<�|�qL}E�aH2�W��H	G���0�1�$�?�,���W�y�+EC�U�>��|NWs�����(���^�n�%�w!k��H���y?��1�9�Wi�;G�amh�.�N��~�-,(JUQw�V��B�����<<_�/:������a�
���:<�:��zt~�Q]wuO'����%��nθ@�њ�ț�M�K���N�x��|ḬU���Pd(�F��pj1WN��i�
�h-���lSi���E�%ըUN��x>M�r\�„^��W��dFx3ßj!�,$M�;aW ����YL�W?I�#o�=�-��-qGd��#�Ǟ��xr
��*d��!��C
/��p�})h�جׯd���%S���A�BH�a?|qb�6j�ڮ	���)�N���%u����&��ɧ�@���+@�B5�,j!��O/��E�ܹ�����w�e��Y���Y�ɒ��_��?�_z�l']�7�O;va+�
Sq�߉��6���S����C���F˰=��бu�����`�S��0��|�2$�o�+��CA�v�L��TaÝ#��ʎ+�e���_��ԕ�a�0��Dt�#�(����~?��G�w	��$Sp`g�P	�E�K�yE9cd��qCbL/ֲ3-�f�Cyi���'��ㆩ$OL,�&U�i>헝���3���4|v�'�S����pO�y���O;�	��L�n�8D�לq�f���~Ë��n:��n�9��r�"�F�`����#�p�N��Jۃ>��9ۭ3
�jK���ۄ��A�C~
�M6*(�]bX���X%G�i;�٧{��#��ʍ��]�9{m�>м�2��K6���lRz+�N��k�h���䏆�b�߰/�8ՏTI�%G�M�zY7��1����^a���M�Ղ*ɇ~G7M�w�m�K���I�ņ�b�w���yQq���h1�
��:D�����,�%���Ѓh픮��1�qoJ��a�ⶒUo���)K�^�y�e*bw	3�p��u��7�"H��5ĭўg�HvhB��N��SّY���Q=��q݈�%WVm{�
��%�,���Ffs##���i�!y����H��j�6�w���\���'Vk^���l�5[�Ӳx�ܫ�
[J&tI͵/{����rii�҄d�/.\�/��Tib�е����c<d�K'�G�./�	��:]��1��۔HDƿ_ܲ�x�Gom��R*]�SC�Ki�pffb��i�R�d�aD�˥t$���v�š��B��I��Q�)"���LSA92
Z켃��+M~� �=���<C<_|�;��Сչ�K����dT�/�������A��ۡ4�s�bk%d��2�.o���׹�zk���Oj�l�Y^�e�*�H��Q˥��RU"���yS���ڡ��h�U�	��Z���5��H�$��G�g%�h�h�P-v�<�#ִ�iU椚0�]��O
]V�Y�饤,�ox��{���:4��mn�$h�\��>Z�Eh���,�3�e���㷅ҙN.�=gΙ��RS�Z�V�Łņ�;�a��d3���S�=�2c��a����.,do{��.(*��Di��!JK�Ƿ $��*�q��ʣJ?�M6��oVy�#�"ʣ�V���T��ì����.�^K8�yy-���Yy��tS�7���zo�_�W�A	��s����8�1�BV�9@��OS0�;��G�[�ޙ�%s��+l���w1qr<M��K�떼C�J���h����T��,��풸���e����Z����(�Ixl��K4��,�Un�Z��8���"x�U$QK^���O;|����y����<��Ms���"�;������]v]�%��z��>>�א�#?J���1Q�O+FX�1�H�Sٲ���A}�!�>|"dt%�2h��"t�o��R���̎�&�����K�,6h�n,M��wl�~���B����?�Gؒ���>�f�–�fg4d����6ڹ	Z>�������t
���Ƽ�l���/�7�{a
��E�O9Cii֖<�b'�G$<`9V��_�~ ���*��4�
Aw���'��k���"��h��u�&�t�`/��D�2�QV��&��-��@F!���\~*�����T%��U�.��sQ=.������y�"�
*�+�Q��3�v���Ǩr�'�@)n�m�����Gg�K��92p>��
�	�%�ޱ|(c��y�Ý�����6��!�:�}$s؍>|w�Nę�i�z��78'ui��tJ�2��y���`J�b���Hۺ��W6��[ʭ��q&�Ab������u���0��B��<ݧ���S��1\+.�O�t�45��q�qf��z�iz�w�"M�cN�r ��Ī|�,����>�nY~�
h�yjG�*�SNs*ֈP̲|!V�IyD�<O?�M?fU}a����(=�I���(H�)��,��Ňy����z�ԪT��:}Y��3TlY�i�
��L�K4�;�L���<":=�X��6�'p���~�����]�e��W�.er�4{��=�z��n�T�%_L���)7 ��
�f��I�ǝ����9����9EҢ�")�l�H�n�ͨ&)�u޷�hY
��x!��|(�Md
�\V���P$��p$/�����P2��岈e����M1^�ũ�Я^�LU�VM#�Gm-l�U����*�!Y�(͎�a@x፠�¼i�}6�٩jX��������XDWҶ�
�t%�Y1����$+bAw,�*g �p#^+ƥu?5P���bC�V��	��7}!tv/,�����#�`|	J4c��vc=ā���p����$�X�|�#?��]����;�'Q��.��{�&�\�Na��p�so��d�9��z��F/�Rg�vx�+(�aRD���|�zꮻU��Yܫ��}�Ͳ�7��=��N\���nW,�2�W/���̀ƒe��N���	tJ3kec��,����Lj�	���b��O��Ȏ��M�*��	n(y�6�ُ=1�=�O�Q���*"�]XW1��(����|m~�TK����R�&�#$��N��u>a�:)���]$
�ss�<_̦�7�]�r&���zOH��\ךUB����K1͵�<Gѣ�$��էKcj!;7ӧ@�
O����?կO��W�P|m
�ʀ>�/�f�\�p_9*7�2,��-��q�A�wl����L}���_PU�ǼVYؿm��x(<�!��2t<{��I�yCԎ���á����/T4H��ꆘ�y=K��YK"2&�R8���o��z�$qރn&�s��6]���sk���쓖�e���;L\Sl�{���y�>a+5l�H_�mF���J�|��K���M���F�"�\�9ðW�^ �ƃ�Ʃ;?m�F�&f�\*�� �]��(�|�N6��4n�`�$����h�G�#x�c\�ܚ���
o���vdzCc���Hpnl_u�.����x�x����C��Ri�7/[��(����f�5k�)�V�E�x�(�h�9��S'x`�Dž�=�>N��p�/e�zT�)T����!NX)5���w�`���C���;>����$x�Gn߿�$*�k�|�
2}�?y	��.��#�/�r#Y����J��[L�huYU�Z�{�����Y�k�JG׆�ar;u{���}T��>y�2c؟�?g{�7�q#�:�TU�Cj*[������V_�͸|;gY�zx�pFL�9v�Q�|!]*�� N�-��?����F?���ކe��b��ͲJ��t��ǵ>�R�=�{8��'P؊�dߨB3dGL�Y5���z�^F1�)�]Q�1�-!�NN���71�+�hS�o�t��Z hb��~�6�vz:�UZ�����U�ݙ̭����0cT#�ꩴ�rl�H�<\�
�wi�KG��PT3L�*�K.^U���>pRMR+��,����y���B��hII��#
���B���x���]C_a�t��e���
=��!,�%`���)D��	-
��Sv�TI��ʾap���ՊlZ��E�i���f�������=

? �02RTJ��x(����!����޺'7�5�f7�.��e�1��9�
!��O������N��V9_����ȕ*I�^l\]ү���n�P�lFPQt��h�+&"tm����V���~Y�f�����`;��T�T��ڠڷp����,:N9?��K$�/]�h�b�#��9��@��f����o~��?6��s~[.=�D�{e�e�Ez<�\�/�Viu!(��<R�r�L�<o�6���rq���`�+)����P�)t�R��ԓ�9(S�|�$���pN�����<݁Zu�b�Xܡ$c�%�\l�V��a(�[7a*��<K��;��������+���ps��xe�_F̛�D�Q����6��t�o:��Pn�COP��իg������~�9���Ϸ�p�o�$������:/�?�2����^xs��N9���|ݗ_�N:�T���(��
E���`A�P�{P
uv0��W��ECߵK
���eCiG�C������y/SxḮ���=��=�+��=�&$
�b���7�7�:_Dj�=A85qZ�!�mA#��8w5�^�S�Pצ���[�*.Z�P��¢�%~"^�rTExQH�%�KhF�	�{�E!�0��Pr��g-C�r�XҾ�=���/�!eN1������8F���>_�1.iԽE�ڄA��P{m��,�CkT��=���!{�j���AĐ}�p��K�P�D�r9&#�uJc�ޥ�:A�~���x:#h�RXq�B��7�b|�1tC�
�Gǻ^C�)�P��h���
�� �m�"�[�,�ۏG��6�c��V��=���ry��~�>r��Z��c��za��bm�/�SS����V���]N�Sg������ʅlw,����Ԇ�:T�cY!k[�A�:&}^"R�
��5#W���Kp��x��6#v�;%I���{t���މ�\9Q�6B��C1����$	`���|/5�9“o�Ǖo����N�،m��!ݎ�$�JԈi֙�Vi���O���l�5��)'��SCS郍����cG&.�%��s+�4����vL_����#�\5J�Ÿl�Mj����x�B�%���^a�J}!^�<5V�����z���#5�-O(~���^}����j
[��O�
J� 0;])8�3ת�ϸ��A_ѧ+���T5�?qGS�qX��e\��N�/T���b�}JU��ۓ�(M��yD��F 2���i�����%���>��'^��Fҧ���=�ڦ֡d��Ô�Â����R�Njf�n��p��C.c��.�7��2u�iۤ�2U���7��4g��q4����|>��x;C�D�*�K�Y
�U���|��>2����['�W(��W��t����?镯Xc�p��Q�3�׍3��8��ϭR�G�@�T�){�â���%<���&��*
���x�@�'u~�%��{K$2DHa�0�_A�Z���k�^�g�
Zɒ^$к:��ڡb�xX���&^.������D.����=��9���{q]$t���7ྔ�Z^��w֎�)r!ww�ǵ<{N����P	VF��Hg���xQձ�pœd+�dIO̭���n�@x�3=��R-Λf"�TY�t����HH���*�V]B�nZUKQ��K	����'��{c3��a-dꨢ(ӢmDa?W5UB�T�,�7:���M�3�,{����J�.F��!*�"c���6��N����>-�qh*9�f��5äs�M$����:9�(�8���R;nV����<gs�V�F�G�����=a8����Th!�����Z���*i�KA3B^M��,��G����#Ű��^6Y���F�1Ul]R�D{�	��6�\d)�D�����4����t t�ޣ�d`q4�V������.=����D����6Rq4$�%$��n�Y]]E+���./��^9����%���h�.aĞX�̂�E[�<��
>k�r�VӍF~h����)�������h����e�$�����-ER���	���/�_������;��T���ܞ��3�0������b��R�c{~풶��p�cfg��tmɬ�X�#A�-�K�qj�Թ�d`s��q�$��`r�PZ�CmʖIOn��l�؀Q�VR�穩�ֈk�K�t��oԸZo��V��;��!�s&]Z-��#@��	H~��.Q;O�h+q:���Èi�=�%ߣj�K�|I���2|�R]�|�@�N���r�7d���+i9����B��{�7���7LчA$�'��u�al
l��H1��_���Y?8�G�K��Z��)O�,`������߀���7�
��W���쫉Y�7P�W��䈾i_��\����Y4K�@9i�v��~�weE����d�#+�g��V����9�,�ɣ0� ,��Ȼf<��Q+jX��Jq�4�kVeJ��7���"�<�o���(��#|T
�6TC8|��Ʈ�b�&�m�_Su�z��+�V@�|ճ�Z�;Ι�o�;OB�5�xm�it��k.�Ԃ��,�b�&��0>��'
��8��[��Ux�L��x%�����<<���B�t�~-B��l���X����Fc�z�����iu�=�˪�'�of�\ҭ$�s��c�q �OҐ>��D&�l�n/|�����R��dNcA����{oL<UM���a
So���r@��C���yڈ�+~N�$[[�O�BmM6�}��:�X��,6pu��Qlj���T��V�57��U�q�?����b�=Z�z��g�^�m��^�톷�j��^L����-���qTKC&V{jS�Z�+��r��Q~bI�`Tl"t�������h�W�G��#b�5�V{�Հ�]���w�˚�'��H���c��L˄��`(C74E�013XS��K��ZG���4ͷ姇��j����b��dǺ
�0�X�d�֑[�Z:��d���BM�^�0z�f�r�c�r�z�3:zʼ��)�2�ӹA$�H����$�k�ppP���.�Nu�C�^3���D&+E�e��Nj���"���b�Y˫RD��GԨ�|���'J��pi�S�&�r��))�L)(w���X��!T����UO1
k.�;��p�"��kygQpl�L�բ\i�8�@�H$$�*��%�5=�C�=�x�̟�����Sv��T�q�S�x��3��@�sX��b�j6��B#f����/iLک�=��r�4d�{Hz/h�NIC&`���B:�Lf3"�Xa>464!�x�z�[ �"؛��u�dP�C�#vzJ%<QK�ܲ,O��2��h6�;~��|뀮��,^�uuxk�27��P+�Bv)����M-�qL-E������f�~���!ހ/-�A~Sun[�.�����(ć�m=b��R;�o��S�%��m��0�\"�vE�X��R�1b��g�}����V֘�ug��I�rn~��rK뜓A˙�ù^�&���y#�(�՝V�^��q�ٟkv�>�V�/f�+P�&��aEE|8�,�Pږw"a��b�
b�[CCB8�gb��z����X(O�I��c��G_#4�J����"3�d穀�!@k�J:�8x����B�R�r���
�s�_�RJi�U��L�u�9�[)ϖ;+�F�J٨��f�Ԯ$���Z�l�v&���'�_��={8��B�.��S>|�}O �Q�w��7A�c��i[�G�x�b����o�����)Yf�	�1lL���ej��P��k�R��˞�u~��>�8��7�~8��1��y���/�XS���LJ_:���g��s=�����FO�X�r#=���9W�D8|]6_���j6�st	�Β5hYDY��̢f�h��҃��!o�vV7[���S/�IO3��'���`�Q��
<�J$�ߪ�۠�ݺ�疗Wj��Uc�ۭڞ����횢�Ԭ�c������x̲�o�\�Y�2��>}铆�~+��H8�S��-�h������2c>3S�?:��N�.�)�D��
�l�_���lS]��ߓ�h#Lz�4����=X}4)�S1��>9�z�e;R/L�����vGs����0d��v���^��^/-u+���e�|�����+}��/���\�F����i̷�@�,�a�}�<��+gO18}yY�([��_Ƹ˴3�}�����.}��i�h�{�x��P�f�%q�Շv0����{v��
�UU�`������sϣ݀?��l���9S	*�`�Z�-϶��EJ�U�����Y���et�H�M��}/��/V{�
��t��c��6��
��׳t�7�ù��ѻ#�@�T{�F#��P�܆�=��W��ioҙ�����
S�-�`똚��OE�Gx��Y�<�8R�ڌ�������;���u�vmE0[Oy��*{�tJb��@ʄ���p�����	�4���Ǩm�zTl|�����"aع�P�W�2
O��ތj����OPmO׼U'���X~���/t�}E���?_vZ{��]��^h7L���dt�'st��W�*o�Y�����Q*_UN�7��	m(�G�o�S�%�S��%OTw �l����µ�����{\._O(�|;(ޓ�F��*������5c���,�IZ�)��}Jb����:�2U]n�g'�ɀ1|��@�����Hߺ�Y��1�L��3�����G��(��X��(j�,N��+�
��~@Ա�Kcc�`]ln�C�<u�j9,g�v�I���QI�|Ϥ�#�x�&�C-����q�?�[�e�©7�z�R��Č-kͲ��,�3�܊��D�/s�=h �I���Z���z�K�����E��c_m���c�H��{|�Zֿ��h��G3L�{�>Hc̶&���JW6;ݽ	�
�z���Ľ�{���F{|�;�Z/�/�
�K�H�[=��L�j��-���9�^�,��{�}&7޲�;��a�w`��g	�hg��B���7��qr�@}7dk��+W�J��bZ�����8xZ�h�T�	���Y�v�W'{���0BR����?�Etq�X,��ݚ�T�r�Tʍ��G���w�A!�w���!�(�â�z�yQV���^]��G�f�E1�ߑ/��nV�=����qґ�ub�gu�o�67��
<�S7�V�5��$r��������@����
��EaA�Ⱦ���c��+^F�NC<%�߬��5����^�K�����Q�@�<:c���NU}��N��Ғ�Nw}S�����r)B���$��8Y�Y�x2x���:�ʼn��*����%�ZQ�����2��Nj<��]W~��"�^)�F�OON*�q�+�C��y愬�8��	|�bF���Wy��SiB/��	����jf���˺g�i�ElL�11�T�LiR����x��Ay"6s\g�A�9�Hp����J�n������ZN��dΙXR�!����۩���?��QYt"�������bb:���e�o��S�3J��ٚ�i�o�̗����V�	M�23�&���i3e%��9�LlM$�XG�T�Q�ܥ�0��S�R�-�")�h����q�I<�&��>�˼�����E!n��;;����-D�Ǹ��xW���Y1�+�30
:K%�l�@��ѥ����N��Ij�n26�#6�(Vu�过5ع�-TXӘ��|$Ri�c��V7��|�o�b�<��˜�E�[�B��\L�'�u
�XQ����?�|�T���A3Cö��O$�!',�ʸ"Ȼ�o�V�U��U�ܖ��e2m�x!m��X8�	�H��������ѭ]8�#p>�A�Z�~�ր…_�q�PN*}>Ns��؎��iC����xOp��c���l�;C�P����ݯ�Eu�^%v���lj�����/��a�@�`e��\���rX��%=�$xU��c�פi����U鵜 �u&mCEO,@�xK�jX��)�K.��j�(�Ғ���$.h�|YŢ�#r-�T���I�qv��x0�c����_�m��m۬eD:�E���K&o�"�%��w�aȁY�V��y�i��|�1�Mqf�\5;r��m{?�^b�lb b�[޼���K�x�A�O{�ot%��R0y��yk�p,`�!bl���!����d�j�߅jX��4yMC)gK$E� h���p�)�#C��Ύ�O�*�Tq$V+�z�Ug>fE�őd�2DA�e+�ŒCF*vU�A�(��5}F�qSY(��D��Eq�k����2�r�'�G���G�Mn6`L.����`��'�-sm�^�{���gn�0�X]ز�̄��*���VO�x-\��K��W壟�c�KD�������e��p.����$�W<�û��n3P���UJ*L–
��2TG3^�#����jj"%�tZ�`�g���46g��������A�7���$R�B>V^�o
MM��R��B���R[�����'�l�u�
��`c3<�Ik��^Ʃy,�DqF���	�q2}!?j����i�s\�+�B����l�Lx�7%f@��*S��l�{����}}k�p���L��bVN�QR%��*bv���f
�6�v<
)��Eex+-F��|��|CI󂬅lCU��^No�L[|�;�پ�|�Sf�-F(�r�����+����ƻ��9޻�ү��t��)��"�=�uY�"��D��b=��bX�g�3��*'BIi�`j'\H[��j\ֱ,]�
�s�?�p��.V���V�j}��<��΃��g)�
7�R��4�.'�x#{�N��߳��kxT�<r�M���헐���fw�
��)����s�
����uK@U�SQۤ�d�ƞ��i~`5�o<�Cf�i��w)4��:��Ũm����^��Yګ({%Y)����e4��Zm�df�}��+�b/M�z��k!��8��,:\�"
���W�"4W��$z=���-?Ձ+�8�r��֞��Kּ���#�?��Iv��y���#��9�g+?��#�|�C7���i�ȴ��,�f��T�uT�қ�N�'�W7�f�6���)Pw��:N?�n��X�{�[o��;xV]ޛ���"ec\��(��ܴiw�I-�q���u_L���3?%b�u����㰨���x��
D2�%�^�:	�E]<�C�қ?��ߨ���X`Ϙ�i��Ώ��Y�,ÿ3F"ᛎ~�`��l�O�f?3��g��x_�|��u޳2�o�bx�-��A�ߧ<�X���Gi�i���蕕!��҄0"��Ra#b6��
�*���xJ����(���Y�b���[8�Nm�d2$��,`q��!�Ӆ�w�?��M�@��01`��W
ijTܲ�����[&�����Z�ux<3����!���[�d��w�UI��D���(|J7�Eͭl�!��ttl�W-C���p:#P�+�FG�pܻkB���7�����Rs
�)��]��|�i����֥�1��-JbF�t�bI‚��6�#��w.Q�'f涏E��݊r7����}��UO
}��	��%�t���7��z9[��@���L�霦����K%��tN�<�9J��t�]�]
�dy�R�TPv}_V s
�T^�_|��J؈!>�|���ɴ(���X�:o�[�H�x��w��.��Q����X�NKY��$!:/V��<�ٮ*gT;�|�n��gw������S�ϸWsS�4{<-�:�÷�}�h3���tgkZ�CXͦՈ�c�az������Z�6�ȶ�h!S!2Ho�Kطۃ���M�����5�̃��t_-�R�_�P�p���>�~{b�2��0防��M��H�xaJwo�7�2��M�+�M�Yɔ��"����f[.�W-!Ї
.[l���)8O��g�Ve>�	N������0�E[? ��+%�w�94\�>f�;��a�����诹��o�aჂԐp.
1i,MR<��}�u���i{�!��P�Lz��xÿX��i�׉Ld]�����0�87��p6��s�0�-	�V�V�7�-AA�����3Jip��I�H��yP6𭋥�]�YDd�F	��*��#�էD�`��7*<�߮��a|C71�	�<���.���#�jq����/�P����Ҹt�<8Z,T9_��M��%�+���c�	2Z�e	�
T�z���;��
>�ޕZEr�<LТKW�2v[EX�[H]~v�����mU��{���د�F-
�i|��^��x��צ`e�5�s�Q�e���U.�ߖ���{��!�Y|Fi��T�K�G;�j\&��嗳�tD<�lN�{r9U7��ͦ�0����<����J�Ǎ:����Y"	�u�����Y��a4���G)��iͼK^�8O^��sƼAm�l��p����э֦���������*�y!;Q�q���޹��]
����n���Ԗ<rE?��gԮ�i�ӧK�sq�r&x�#S܄����^V���!'
A�@�$��.�c�8����hˀl՘-ж�����#�u��y2�t����@m�n�F;h�+t!�*m�6�q���Fv���}����H����i*�Z���U�3��pÝ�5�@p6���\���9�#�:u�������A�e�͗�Na���6y�<���'_z;78�/�N2g���9L%
=��½���6�alFr"�,�Ǜ�=i�G�z�o�:o��r�פ����kR.G�'}x�9�S�׻�?�o��řB��e',I������lRG=�V��B�Z:o[*/��o�=M8t�f�i�2�u�w{���yZ��fݰ=0��]�5��|�ݨI�U�p(�LLyװ�S;vl7����&9O�v���e�~���
ɢ�1$k�lhc�!��X��4,S7=���{�a�*��]Nl;2qF�T�4����g$!vq8<�M
�lh�~�����j4=YR�
1:J[6C�*�p-���vJ���p��.��43����bM�%G
i�d�7�\8#fS�����w��6U�#T[9$��h�u�Uv�-�]��HX"𘴾�'彍�hv|�"o�ʼn�{5�%�4�(�j�0�R�RIWB<Z�f!:bD騜�kX�D<�X>_����>��֙xk-邏15��ښiifƁҼ�^�q����~�v��D"�0f2m]*�c�=yQ���o|�	�m��bLt���a�XM�K��4K�%QbX?6-�Q�j�A����	�<)Y���:��d8d`�g�op�QZ93؇�T�?J�{��oJ����[����H���^���EޒRG�G���rv��Dlv�8�޽="h�sаCο�o�`l'��H��l����d
ٞ��&vQ,��'Q%=-=`��5��&��:Sx���	����_��9'�2w�vJkV�F¨W�Z�Vw���c����q�s!���W/��X(j�v��V�g��\�$�1���!��>E�и��6���6�6P����?�	�"w.j7`.�	�=j�"eq{��S��ݥI�0���&�$�<MMORQbԑ�=F/�љ\qM��[q׿����3Q�m��Q>�&��LZ���h�Q�W��[K���T�Ɓ�;gD)9�05�K���!!/��;,��b4Ah$i
E�<��s:~�͋����ZW�ᩅ֨O#���0�bԔ�w�%̇F���L���٩Gw�����-������=�|'u�_��5,;i<�C�od}�>è16�{>v�}�a��֩=�8T��d�Dw�R��`.�$Vo�dP���i���#������c����X�`9b�.�X���B�)8��a�+��g�	MV�#��J)�NT�����JbY;Y�*m��NZ�$/���Ă��<��-�(�	=;.��SB��Y�a.7AB��PD	ka%��B��D��T+�!�@�)��ӿ��$���K�m7�S#
dȪ(�����2�4Rg�ԙ����E�)u�"��*�t�[�k����������,ѳRB3�NM1��6�7bt��Զ���X�#|�/��Ph�sk��8���=�^�Hm8�[j��~j�ʷV@/�"Z�9\*:�r�-�h�]�	���R�9EE)�B�Z4�\���3O��4�ˣ�\�+���"�v;6|�fE�T,���ĭ�����|��9��0�F�p7-��./���DHư�yٍ�2�4��wB���o±]"Y�̔��E�o�ј(��^�	�5�*{qF���aܦ�T��द;���G#�C<Z(��u�30E�g5s;�e�Uu��&�VAͩ�w��|l��/Ծ�b��-#�tUE����:�͐��7޾��:<�j��+JPn=���r�lX�B�	4����`�b�2����ҫ�ِ���)5��m���83WW���ȉ
���d�:�&g��M��@��V�A�%���|��N��ѵ0����=��9�r{qL�|�sPi�~�y�)���٠`�,}�1x_�ˑu��}g����L�U�`�А	�3�ˋ]�0%���X�Ԓ`�Ove3{�Ɲ����z��B�E�kTp���k�*�\\����%�{�$�c�(����Z�O83$�\��Je͹f@�Hf�o9N��
����(G��tA�x<6�􄿹��r!y��8Y(�'-'nf]Iq&>:=u�᤬��c�M8��fߛp��ӎ*Fb��{�)���d6U���IIГ�Ԥ6d�w�d1��凥��!m2I�y���l��V:��{��6�K�8mz��Ln�)���j���H�i3�~::1�*���Y�DN��
�����	�Z�/�����;|��@9��2��"�4��+◅��vQY�&��
���+�Z�J������',��^������o�������.����&o�k3�2;�(3Z���:rsR-KRYMތ��{E�ΗV.�P�2��{Y�_���M����?��o�,��-ʞ��N=d��la
j���;{&G�L8_�j��EmB�i���*�yz�:�Fe���h��XU�
I^�o����pb2���%�X�β��X��_�Br�2+OĎv.KI1����&�emhrr!)��[0�BLJ}�m�g(�����[��'�w`��h�i7�D��1��4g�w};�o�j�̶Y	�=�fx?/x7"�{(cNV؆��'KP��E��u�>���
2�K�"+��F��C�-%�3��ɺ��B��K�h�T]`v]4#'T{���6�Kw�f4Q�Մ����Q����̄"�?@��%��2Q�UEY�Q��r��e)1q�s�@�a�A�nW�늮�L�T<��8����xZ��_��8�|��k(A���!��xJ,��{�״�h������O�����=�b~�b!2�_G���l��4<�9�a�X�u:B��]�~WVT�eU���{�8��N����kz��`0�3�3� 0O�%��nX�D�`I��C�|D�e���Il�q�Ѯi=ǖ���l�0��8���u�ڼ</�x��������@ZJ���#1�������U_}��/h�AK?�TU�Ւ��ҫ
U
�ԭ`�N�;9���x�ۼ2e^e��J�(���W�)O�v�%Qn��Z"R\"�ĽYy�5[NL��3o�E&v��w$3��p�����̉�;ܽ��s�*XBL(��W8����'b����m9Z��)@��X*���45��x��R������gDQTU;nU�^��T�#mՅ-�ؖ"��j;�����]}3�t�0B)h1�jqp�:�Z*(ƒG�#�+�Xm��Æ�d�o4l������]
31)�׃?���D��!�n_�����:z�<U�%ԝRd)a����I��L �Ȉ�)����h�����mIT4�X��.%	��^2�a��zZ��qc:x��ߥu_g���~�r��2����k��1	�u4Uh{$��pj͙b��_�i����E��<��pT�9못~�Z��]
��\˒[�\�]�}��~�*��<ԺΑK��C�~�D1�ˊ2�)5`��a��+_��I�J�BI�rBQK�T�;��c��ԡ{.7$J��,,�6���ꨧ&�X=�a�
E�/��S-��@q����a_?���N�{��5�D������,c}8�fS�[dNB�1��Pc#t����J�m-q���R��i9X:R��M�-�/^�W�U�؎
�hwT��מ'���l�D��D��/���|d}��
�4��RͥR�Q�wY�U�N}h���- ;^�anzk;'Q����$Dqc<D������AM1��`�Г��6Slw��V��n�H���Io{XS�>k��S�)3����1���i��ۥ�͔���C��-u�I�Y�Gɚ{ê�q��o��1�v����q�N��ʀ:_/��l�T�qX��zU�]��E{3��A	��M`���X��I���X<�p�V�'�[��wň��/�a��VQ��X�*�Ɍ���x�[w��gS&��c�8![DY�B���`g��	�#��,ז?غ����X*Ì�� �s�/[f	v��'?Kͦ��C�x6k�ӷc��1��-����(���4/�11�����8ǻ6�(�,CD�)}�c�*�F�C7�ݹ��c��Cf4�i�m�߶oS��߲��[�l�s۩G��l+QB����}�ׇ����p��5�!$Z�~�\����¦�:�q�K�-ƍ74���&7��[�/�p�9oZ��>D�
�^R3^��o�emZt��y7}����ɂ� �b��-����؉c�5��j�N4��0⥙�Q=F'v?ѧƴ��غAUR�λ�4Ί����D��t���щ�g4I�<̩����'��Z=aa��H��Ջ�5,��l��"�O��M��K~�oc�|�'YWޙ㼠_��)�x�Ȋ����Y�&?�p
�ч�,��o�V��F
�6���^��j}�վ����x[e��f��js���XU�����K7�̷˜��v�7�c�%�_Q��ϊ�7�q
�`����q(y,k���h��M�<��S7���	����ш�D�a�X�%,�C�R]{)O�l���av|a
h/��E\��t*�.��C	'�ɹ	2�a�����M7�Cy�eQ��'_lcb�"��N��`�?K4+?Y)�8 Ϧ3�A�SL
����.OOvS�<����1���oYI�K&G������	�����R
>[��윜h���#��D”vOZ��4�$9�G���{E���_I�صS��m�}�_Ģr��u`��:۱i�Mu�zy�q�p��>!�J͆��{�^{�\ͦJ�����L�x�Vz1s�@�uy1��T���Fk��M��ɼ�?�E���I�ꩩ�����B��{�p��Z�M�;��$|��L�:�.F�>^/Qg�O��8�.)�J�ʿ����U����
mP1%騩.,��QI2�A�b��trl���v#�C#9@��i�Dۡ(ڷ.�_f���Sׅ㳶`V
w"� {Uh������6i��Ҿ�rx�'�hu�\���UK�H���D�������s�k�� ��@}o ��"�����éލv

A��n��&V꼰��ɷR6zu�H��(�s�|(�l�i4��(�C{���^$����j���P�j�q�������A]���M��hF�#YG�m"N�����|����mߏ
D�eIJ��!�@(�K�zܲ�I�M��_�@a�l,�s@��1>���⋚�z���y�
�%��}��a�6�E�)��(�����PtO��S�	�u��7�W7��j��+�џ��<�O�>1��'Eن�n�[>�qc��"�~��6�Z�0�	e��Ӌ	P�0<����E�χ[�X�}%��ul��w��wl�~cf�%,M�xX=��E{��[e��J�n���A
6D�	�����w��mf:�w�Ȯ�#�bL��ý:�3����6�t�}������݀�Jt�|�_��`m+�ǩ�R8�ᨻ8�Я�M��J�H�a�����Ùp�ޮ�[�L\�l"�$�2(�xĈ�t�3���Kq�'��D��5"D���e�M�:m7�|�D���e����T'�#*���wO�Kb�dID	�	�P���dSJ���d��X*0si߶
٩����3Y���̖t���c��`R�$)2�4���[6̕��N��M Q �ξ�X��?X�\[u5�p����ǔ�zQne�
ny�}��cK����䡍b
[���+���,Vj�Z��xe}˞�=v(^����y��7�&j�
'6��IXa�@�H�{��UK�"QK����7zfCo4�!��|��"��:d|H��Q�|�~��������f�S���1��#|؟��g�S��daj
��)Vw����#��Uw�x���^����������#;75��MɔS�D־|~İ:ѴX�\��D޾��S�c�D��ɦt"��WI�hL�C�)�Nu�\Y��0ɨ����3��S"�U^�o�q�&�
,��&��*t�ʺI�b�G��r��7,e�c!4�@(Z��gG���l��4k$"wv�\�5�xn����Y�Y�
��D�_�<����jy1��Q��0W����N�$21U��l.���T�T���ʒ򅓏)D����>�%1��ƾ`�0�7J�(dŸЊݜb�.���b���b���N���?��B���$��+��l��6��R�,qK�}%(����ﰈ���)����60�p��]�önc&�����-P3fv�H�����vH^�5�PåN|��<X"��,VZ���C��ړ�P�n`�1L�&=.RC�]�����4��8��%4J���=>>N������R�6�wս��ݿ��-��=��޽��]Pظ;�x�%FY�����?��6��-!�� ��0��GK�!���B+%��U`���m�(�7N�h�vNu2D$ս��N��<B�採��}l�7ljңT�3XA�=�h>���$��C��
kznt��{��}�K��ќaK�P�p��!"�V���ON��o7j{k�{�1�PM�X�$�N�o����]�%�����}�ٱq,�w�;�쎻���Cn�	�O����A)�!e��6tزF�兖���.k��B"$�f[*� Wp�r�ɇ��P�ͨr#L��aKB2����3�ٶ"���˘=�ɏ5�q5�҂m�1�Z��6kl�T�,�F@暨����qk>ѻ��Q�(u]�u���,���ef��!�׸�[��2��7d`��v;�|<)�I�&GFkJZ��U��>��|���g/�a�%���5|�s�DZ�'��1�4�秞0l���tJ�N��ek�6;�U405�X��w�ku���G!���^�z�V������0j�C�6G��m�H%��l.���n����5���	��bP�>b�Ҩ|����M.e#fW��䲉�p(	0|�q3T�Q��*�21�D�q��:_��3��w�}];�����V�lP��Z���ix³��u�4xK3��G!_F施��O'�^�6K:��V<as1�"�*y��2�=V7�2K�B7��㡙�NKD
D�i�a�j>r�b(���o��nN����\&��((���(�����B��J�X:��)�������#��D;��U������$�q]1�%]%N��&�Ux�X%*��5��g;��S�F��.��6E;�n�0Ҷ�6���وl��lr�&�{ԡɉ`�e;SE[�=	U{4�������D�5�7���y]QlJmE���`}�뵵d4{e%��$��j2��Ij8���r�Xk�����휶%�2��ڢ��8thq�%�W�^u�U]m*�ԔΩ�X��g`�Mr�{�>6��)���q��s56��HD�Pv
��Ԏ���P�l�D��Ð{i6�|/�����	���f'Mw�:�t�{��w���Mu�������Uv�D�uنa�gq`Z�
=F��Lw<i�%l�ۗ�)Yc������Dq��b�7�Ǵ��	'n��4�����"��Y�z�}�{������x�-m?��,��Y�R؊��T`=�k$�a#F,]v�`�Qr��:�s(`��h��,���-�N�Ź9+���B��N�J��D��+�[�:6=N�H�5�|���F9&�y���7�㛔��wSN�J���K>�>��A]'���u]��!�8�sQ��O���-?�,�M6p��8}��/H���}��Ǹl؍����Y��0'�|0�4T��\8/H F_R�Bw9ގ�%�d�|��VP	J�'�(̇U���[�2��/�'�w8q(��+X
oݟe�b3�B\���G��.��[���o]�����~C���N',�F�J�R��
o�sk�c۠$eG͈c�`�ДѬ,�y�mT�9��}.�u.�p��ԪF\i5"�i�~-w���kSƹ����&rޜ�r�
.]p\tS�����[���JO"ӵ��G��RPm5��Z[B�
�_�[���B(����F�v��9�P��}�?#G_�(Q.P��[j_v��/2�r���T�t���w�xyb���E�܏�'h,՛d��lW�����O?!^�﫮	��>���+b=�F1�Ύ��X~h/_���!�ǽ<M�>��>�P��tq�,�2,3^LHA)׃��;*T
�yC|�
o�CTi��oD�fI㙜��-�=�:�ج:�����c�z��i�yΧ����Ώ�n����w��i�z���mzS���
�Bk�����x�A�I������`�_	e��(�BY׏غ��5;��<W(D�8찟ز��J��#�I�Y�D��t�ZM+Β�:��sQ(#�m������\*�e��h �˳X�=0����9�e���X׺o�GO![2ȋ�]x�ҟugh�1�d^�|iD�a�qU�3N���Xs����L!�{��]I�ƺ<�Uвb����jj�M��蓈��U�(���M`wGZ�)�`��ꅏq�7x�e�����_�(T�0	�Uw�����}1^�zp=�Q�:V;�8| /*A+:���<9�lx-�
:%��W��1x�m��`(<��+�nӌ%��"f�˰��#�j
c'xx2.�k��ͿGQW�~��'���
�V��1���z�>r����P�]��˜s��@v;ε�u<0lY�i����cY�G��W�3�u�f֩.��GA�Z�06�vE�I�O���_��d�����N9�947���58gNQ�g/�"a�h�Y���*�g�JVL�ʒ�<�J��䁃�+������p^(o��LS��X&,��M�]#��eo���ڮ��ɯ'��:���w���h��ް�m'9a�g<�����ތ�b�x�c�Hy|!�s`<[��|�!��mf��l6�G(2d�JpC-��J�����P��E�YXZ��y�͕�ǟW���Bg/����=��҅'v<�e<��o��3�^�Kd;��g�%t`+��D��eJR�8
HգZ¡�1�>Lm)!*�MW�E���k�i��&�c�gN����huO��8R[lI��|�$�^"3"ؒ8�Kĉ@��c���G"#��y��J�$K��Q��-��yq� �!E‘��I/�]�&��)�V�yvH��cޭz	�gv��`�2Jۃ2����8|)��м�%c�&<Ͳ�4�ö�S���-�h�?�f;�?l�6���'b�
�0�]��5��ߦ_�ͪ���hlߺ��N�j*��ɶ�+�m�Ŝ�Ճ���x��K�
c����ٍ��]���
�]VBځ߀�jPO4w�I�K�%�9�!#�/֯��6�>،��j$•�*rW��3^bl�[j7�.$�`Hfԁq�$.$W]��d��y�](�L��t�Vn*�OAd�ֹJ9�����C/6t/��	��L*��R=���S���B�e*����{��S�Cmۉ�%
!"Nu�B[ڇ��",���LO�R���ƄN�O�؊��F<�0�3�S�s>��rh���QBͿ��\^2<�g��&��J&1l��X�������v����Q���Çn9�����zۭ�ȭ�0�[S�1�ll����~;1�K��f���j!�\�NJ`bz"�y�|95[��#B&�Ϭm��\-γۀ�Y�������Ȗ3d�b��ͩ�7o���./�&����2��=�?c�Y�{㛺��'sō:�������@<��i�Iϱ�o1������h'o�E�D%j��A�
=�s�tOl�>��1؎f1��'9���>�'�#��D��|^'He�U�$�7���-u��i8�X2�gYV8���2U�	��$i��}N�5���=i�J`�XV2����j����T(��>N�1��Q@�H��U]��־<"��7\��C��	g�<�T��SVH���藺�f��ee>���a?�i�;�XW �{{-�6��q�NHY�}K>G��D�����D�n�!'
&�K�e�۰�ݯ�"RB2�{Gr�H��n��.�f�U�P�a�&�7_r�w��?	��1��{����G'��d�\r�Y`�4�p���x�1D��߮M�L�C��p��b
�N�r�Q�
q�Z��DMK��U5��T{$'v�h��r���MV8�7�R�0��
�F��%�h��CM{Z�uQ�����"N���g+°0.T1f��i^Gs��Ju�vJ!^��?v�����Ĭ%���C���ÿ3�����}�ĠS<��$la���a��:
}.�����A#ʼ�k+H~+�`�Ω�%5�b�b��V@X���<VF1��@���h_0y��P�[�.�1
��{c���TH�Zp{��X�n�y��ֆ�}Q�N�*�S��P���&��ItbҌ�O�bo��";���$��U�CD�%}�I�c5�0�/Pe�j~'`����]N��L���ojV��5s��oc}O$��J�R��:m4k�Kz�'n�-�AR�e��a������z�,7���A19q�m�����I���.�_Y+��'��EF舁�!K�l3O��1���>�lG����q��P��IoVGeauP:b�(QY%�^�����e�5�2AE�;����ge�!^m�c>�P�+��ϸ��ud�{ںx�V<s�g;vF��T���\���1]Ok��J��:�.Z��p��5��O�ր�����
��[FPN~�����뽐ֵ[F5V[��So�s�v�B��U�E	����b�ј+�y��EҚm��|��c,c{��AG�#�POL�㨋�����h��f��b8NȖ�H���e�j�7K��%G~��d-Y+Y�+:���p����P��~8�5�S6#J��B
�^�p�G\5��mY���|��	��s\@���b��7ȭ�9��=����ܸ2X�`�>�Y�
~���`Ê0<	��a�O���1�4�� ������압O�:��G�q��4+�Yj4�ȗEIS��d	��]�6�C=h���@(�SoP� +�T�l�t�L�av�M�V�l�ڏ`�|��?��`�(��t
�?��r�lm:mũ/�ʤ��ȱ��k�۶�YA��7h;V��|������ ������[��,�&K�Cq�S��y��,�fY������.��6�Մ9�r��Q[�珶�uW
���L0�����K�}i�a��@�j�'�-�P��V-�������DJ�u�x���,�=���ϚQӉ|�(�6�Pʼ�v3��w�Ϭ#�mo<���+�6lC�o�E��.NK����AUo%<d�6D=Q(��ht�*ш1�
��!bl`��^�����3�q�ƒ��G]�7p�&�)��*��}�k|��)�tF^\q��D!���_������z�jR?�K��ڶ�|�Zy�L�sp�Zeݗ&MY���,r��^	��Z�+�3�"'�<���{�y�a�4gF�3�F�0��-��5r�I��l~�h��x<�T��Iw��MM���]5D�Hِ#R�VEC�{�)p}�#8خ@{��q�~?�T�E0EK�MR[QUP@��b�dt먌�⋸��n62�"ku��+;	qq���Kfq)h��Vr�Iy�(*�4��Y�Lv)}r_*՗�C5�7Q&�sr��Rj!���B��Gg��=�.���.ô���\�5-��K�$�")����'�}4~󺃌�(-�`����v!"���aq�)�ϔ9�}�3�>Ɂ�<�zJE�Dר�
�N��)��?7�z�&m$DR�]�&5I�U����FK��U&�F�+9~�um�^��Oh��*Kz&�+�pf�
�dk�_���&�MF#+l<_&�B!wZ-�U�>��nN4�p�%����:�~�2��W5�Gf
����l2��Nb�Y�5�>�������b^7<��������n�P٧�QM567��O�֯�t�T��R5I���K�á|H!�
���L�����i�wk����
�j���FU6OX��p�5�<��]�F�[����e5�ܷ�s/���Kh�׏��
Z�=��/�D�d��a�
��𮿇�x%Y��bɩ-�C�>��XOw�'<�FK<60�h�[����Eyo�"�#O�
�\�H���r��$X�-����u"�g��P�Jd����v�S��ߎ[Q`�P�4$Q�-��M����|�p
�԰g��c'.�LŢ��,� ��*FK];wN��Kފ�};n�rDB�ߑ�㦢�D�~���(���o�o#��V�n�!6�(D�,��H���֬�p�`�n=@� Ɂ�i��W�UJ�DPD$F ��A�Ul�n��Mq+܍�ZH �kgR��$i�f�9��v��!-�i��SKآ��!�E���A%^4���
����z����@�jx���J
��)dU]]'��dE�"��\��M	�:�h�4�1`ĕ�aЭ�a��ɐ�Y2`u�T:o��]žƸ,��O�7��n�[�g1�BGt���c`G/�;�/�Q��Ҵ���6[v�G6$�i������+������#�l-�ݵ��k�>� N;���De�D�JO
Q�j�X�wl<�G�E��__�@�4~U80�F+6��Zx�!!�㽆l'���Ak>��
]R���'�@�}��y]<>ɲ����$Cw�u�~Lh'	;�>+��-+�6f7	�0H�F�VT�ʡ�����%a�`h"	c�ue���D%�t����!����[KV��y�����_e|�;�3E/K*��F�����4���|�j�7Tk��S:~tP��c~�|)N$6�
��5�`�T��>���J%��H��"]����2n�blQ'i�F=�|A�6�I8�T�M�d��n���˕�y=�uE���Im��h�Kh��%d�~���Z����`E�5w��d��(�S���&�YX�k	=W�U��~�*�W�"�aL�?z]�ߕ�%����^|m��n� �/�,D:��Q����P�z�	WcWE�z��	1��׿�H�$MK�/!�hZ9�\�5`o��g���JǴ�
�%����l]�����-]�W�Z�:��.�1�P�.���-��>Jz�/!<((�	4��ɲ(p�+��i��4�N�~CdN��]pLC�@D�U��.J};ń��cq�N�;�$�M��+�i��+�vrN��+�P5u�T�e�EYJM�a#��#,N�$Y��!�?�C䯖-h;���t�Zvo�Jfk@,��I�iP���,��2f}#����Jt �Dz#��z�dA=���$�vr	Sí~+��kZ�;�LS��,�	����f�>:���~�oDn�M�>6���z��X��)m�_'(�����$�~ �k�}[au�J_�Z��I����-�� H"�XKһ''wO~ꩍ�dV��qY�NڮPb|�6��;G(%�n?�aг�[�UO�bH�H����f�'�^+�غ���򡺴�e�I����f�^�����p�n��Ԋ�Q�N�?�QvYC�Y����}��lLl�oL�~���О���4��{ivW>s���X�'�^�]�~�,-ڥif�ϣ+dd\��8�f����$$�-W=��M������8�8��[%�=We!7*��U#`ݦA$WQ��[�
�d�?Ǫ{�U��S��T��hN�m�e����O#s�T�4^L��~1��f�G|u
y����׼B\Z��+^}��ʇ֯:ɍ6x5>�xd��ͳ����u�o�:���:o�(��:S6nn�X_Q]��/��W�"3�J*ru	����p�p��'�i�p%��.�ȵ$_n�wv�ں�j�y��W������l�Xa�3��%�pg|���&����<L�7�)�I_�ے,B�eK��@�6�IYN��ᒉ�D�Hu[�n]eE��7��y�5鬯&Κ2Κ�%����YlV��hw�K}N�/��ytr?[�٬�*�-�(�ú��l�Ts�β|����7��WZ_��1�YGŨO���!v Jk��
�І�գE��55�f�K�bj�j��E6X��f����7�Oo��X,��+�J��b�?ާC0�xH��y��'m��C{�]$ 
�6�`}�F�K�ZB�a6�H���`7j��_���Q��d�VQm*+#G�l���c�LmU�ټ�XE�7T"��P$7XK_rb�Ob���q�7p\np��˝�!��O*����-��⡍[�T-h�JO����X-������-�rw,y`��:����=| )J�.Y�o���ɂk��k��U�*��#�S��Ʌa��nQXϑ���wYHǐ��r�޶�X���9�J��>�j�FΊT��͝���8���Ϭ_�S�q&7
��{|��1˚�|V<�K?N׃��x�h+G����U�L�̅_�q�/���&����gx�Fԁ��о���i5�ڦ�6�X�����M�[�Bz��	�����7Y{�1�P��ų��-8�ݠu���Vx>'�D\�Vk����%2�W�b4�Zo[
\��M�_��D[�aDž�
�*I!j�TQU��E��U$r�P!����(�٨h��*�9��4;���(��l4vR�ȢJSy[㷒9(k*�Y�[ӌ!��q���E,���½h`�{��Jw��R�)�"Uw��r��Q^�ځ�]*e�[j*F�-J��T��Qve�݁F��
j%C�$�~��q?��ޏ��b�C��/�:���<�&(�>g	�#9��;V\�����?B���F�*��������6��l��xhQ$���̦�xb�>#Vk��5KDG��w�k�L��
���0�$�
��!�}u"K��,)�?��l�hbS&;���؅�ύ`���3��_�S�]�I(��M�j>W8�o���"B�w��W�9�$^�(���JT]�L�mwn{��u��_��fw���w̍
�V�m��1�v�����vⱆ�JЁ�w�:N�Ѐ�����,�o���b,��i��8��4L�H���]���ICB|!�б#���v!2�<�(��E�l>�	w�i�ƨ��_�{��Z]u��	��s}�*�u�����6]e��F���#W���W�o`;0>W�>��*@6��u��];����?c�6;���!��am�G�O���>�z��~+�8���ܸ7mY�YVzj�m�zH�4z{X�֩#<pd�k�<7���}�h`����5M~���ȯY���}�qV���q�CDX�v��Ox��8y�	3�c�f�'h�Y�0��0����'�;/�Ƃa/��{��>aM���O�ZE+�h��D]i7�#�5��O���+#�_UM�,��U8J��f������hg�8�;��AdW��_�)�r�0F�D�aW�g����W�Ӵ~��u݉��E�nw��!B���q�e���c����C��>)��!���ES�#�˧��'v�ACT��)y&*_K2�S��B�g c'J�Pn4���S��*%��@�B��Q�ӲB���"����٤�����@�'U�u�ũ�`���d
W��>�R9��.p��ܒq�k�۵t��T��X܋$J�97%g�X�"4�#��¶�4��N�i�Ì�e�\U@�l�K�c���bal�-�uA��_�8����d�6�]"V�O�c��8)(Vl���_����>b����0��VDL\3>`�__��m��]�Cc�X��4���J�끬[��X#k�q;�>���@�dd9ʸ�,,5��N+D��m{��F�tr��HȺ��/�1���+���\�Z��Em�
�/�%����/�F��Q���ܹ	���5s���Y���:zg���M���=������3R\�t*:��"Gب;†È5eݔa��(CF,�~a?��*x=06�#��g�m�⏯���_a׳���t+CTN'�z�B6�;(���{4�kY��=�RZ7q��,{�C=��� �ltU��~4Iy5����-�˵ٳ��#�H��]�&v�����O�E��o���"���\(���(����1֢��eA�k��-�mmn�4Ybc�3h6�[����,�Zс�`z��n��jL��f��H��O3-��ǯ���e+A�o��A�o�e�
A�Q��]���A�߿�mv�}h��!>��!o��6�.���wi�z��ݥ��.�a��o�;�@���Zm����y�#^��E�:�Wȉ57�Z�I��ٲ�GGVQ��k8��5�t5��5W*V�����Z�k���u޾��yb-�(��èN�v ��Q�+��	д���8�=���u(�%��%�.y]���,B��X��K�J��?����Xڅu�;�~cq�������t�Wӿ�����/�^���ty�fm�6!\u�r�������&�ANf�yJ�zܰ9f�q/�$C�=�j4��p�=q�~'uv�|k������E&��qY��ې��WL��t�6OM�
\;7�'���z;�̭hڻ���-�������=<=�'�Hs�����#7�"R,Ơ�+�KGt]C֯����Ҫ�u9�����Gb#�ds����N�\pr�B����I9I͗gI�Qx�W޸clG�w,�������"�G؊y��n�;�ȣ���_��(�o~U�~}^�����db g�ͧ^\JX���'�Nj1�a��	`^�n؍�5��i�f	�SJ�u��{Z�{;m��5v�mn�.}t�&��m|�m$�0��O!���T�d�1��"n�|֭BG4�� ��L���p%B�
fz���٘�bL(���`fW:��h�����	_�
��3��<�(9.�drK*o���E)`�S[�4C��Z�X_5��
�o�+���+�x5�}��4�oiu�!�ѥP	Nj���q�+g�>��G�N��ڧ�E����:=���.7�˽X/�;�����~�v��T��)��<տ�.-�eݟ���ާ��H)٪ ��q=��a��=��t�8�NY�Z�S5��"���,���bB��I�0,L��f�p������pG3�H���ºM\{��)ռgK�X�,hZC�B|��rP��FB��{	�G����b�ylE�Ȓ�Ⲇ
�:�Ъ�cg�񦛧�������Z_��p��]D^�	��|��Xcku��2h	�pH�C�ZD�`t���F�e���"ʭx��MǴ���ۨ9s�%�1j?"��e�ob$����fx1�$���R�[.��r�YP�->��)�A>�c6?� $Fqu��]������ғ�&2c3.�l�dFj��uZ#��F 8O�
sCC�wi��;Q�r,0�	>C�@�����Z���3(i�1��v(3�ec:��(K
��F�"{����mJ28{�e�6���v�C�T�Ш8/�͝ŏܶ�#^�l���76X;Ŧ~r�M����	�j�����K�SF�9��� 
�-QC	�S�d�6>B<`��tW�%��S�@+��=���?^�#���L��#�u]$R�X�m��!D����t�W��>#�BQG����{`[0���:D�4�D3�<��*�����?-��`�'�`�mځ�
8��D�h.��co��p��W={�|�D�r*��¬�YW����ϞdW�fk}����xH>^��ʠ�"�Sd}�Bս�����
��Jv��*�Gv2Z<�{�3*a�}!�]ؾm�t�_���p�qԩ"k�t�2�ҭ�%�"�ְe�Aѹ��1JV�E�r)�s�B���evY䫫s��{��c�eu���9��w�ݬ��,�N�ޭ�__�~�5��2M�AM��y�5��aƭ�������ʲQ6֜GT,�t����ɾ�\��i��Uv�N���7ܰ;�	�k�t�'����l�'��ջ���]]����tue���ޝ;{�v.��?n��KvX�s�p����ol�v�m�Qk�K�W �%Ԑ���J�507+lDC� �q�e�EP ���'��<��\6�ȁ�~�L�|pR��}#S�e��Z�j~�����3����ld��d�����wG>8{�8�*���P�c�m���ͣ.5+�;�n�"��R@T�/%˘u%f�n�
(��Y�L�Kx��n�[�-�dWK麺z6��\�b�bN��A72��ǣ�x�'T��r���,����w���N7&5-��md�Ƽ������g]���l��]��R����T�Kz�(�{Y�^h��箔$�g�{צSI�Y����[1�k�H���![��{Wܰ7s !�m�������הu����WX�x��b0u'�Ab�dsP�Pm�0�V�v
�6�f)w�(Z"o�Z�"Ȅ6Q'�\��6a�0�R��X!Ko��
_���m}w��
2:ᰱЋ���l��0�q3��o��_&���'�[�;X_�����xF+q�e�2�a�\����M7�(�<ãπ���Q��{�}�M�9(���l�s�/�=�Z�w�z�c�?���6WXkC8�%�4!3����F���׭�s��xq���d���{���+
_-xE��
O��_ܩ  �V[U��1Hr�����
������
,C�kmL��$	���|��������n���.���,Ư����Π���A�2b>��
�zƪR���|MsŊY�P�ƒ��Րe1���]��RX���,[��+�@���(]�	S13AU�?���#�
�q��+!�����v�=gUMoNto9��;х#5y:j)8��:k�vn�2�=j�s����y��l�F��5���������ַ�Uh�*3.5pp��p��q@�>��8oj��I�=��&�DS�R6E)�M3ް�h���	հ�<bK6��4E��瞓%]	i�$����D"dhJ�G"&�������BcN�V-��;R�5X\��d��@�
�ܦ��N�q{�w߫-���=�gϑ��6`'l�g9&kGx_7�谾{���kk��M����;!D���GEЭ1Æ)�6�������R;�%��Y�$d�K|�a���Σ��O�� �U��}�DN�uR*��K�-���(����{{;�ʮ�cl�� P�d��|	?~��wSOZU,E�qҪj�j:ѣ����%o������U|��;�-���i��ӣ(��R�t��R��&�2�G
°0��
~*�%�@,�b�i�%u�	���٤������h ��hܓ���K�x����|ڎ&hOL۝PL'�9v���,�!��I���]*��k�Gxࡨ�h��u��cȉ�~~���BD�	�ٗ��{���{�c�o��v/�����d�_
�$��_Ę��B��/���	A���rXw#.ψQPf�T��l1""���P�[kU�^'��tWO��4��##�F�D�
�$���tI��>`����`�@ E'�(S���$b��.�IXdk��Ԡb�B�����-%ΉB��C��D��3жX(��̓�Pp�)�#��y�sc��oj�����/TsCO�jX���D�G��l�dz�QVfv�M�$"=)%�w��2a��Bϡ�G1�� ��_���_du�i�>��� u6�F��D|>a!P��>��p\_�^�#�ע1�&q�ۮ����`0����f��
��Q�n}�ԋc��ɷ�lC����{��=o﹦Գ�����C�D-�gq28�ugv�`��S���ݵ�ʶ:��	1�7�S�����ƺ���(ygx�uU"{Ǜ��5�SO����=¥•��-�4xd�k"�}\(�Zꑸ���|��T���%�V.��<�ۿA�#�gJ�O�
��|4p:{M(��s�`>�iO�iM{�=�h�W��Q�>�Ko��Kߋ[�˃\�[9`��]{Q�m��My���z��qja!U�o]h�%��6ڈ�j_�[�+�J��T	�+�<������;lju�sx�c��ĵq 4��gH���w�[��`��+t�s�#��hA#�BF�"T�?BL� �p�=�L��T��O�@�+)��)�.j�q�-��wj���`��/4Z)L4:϶���zx����ݙ��0PW~�.��g>[��W�����!F�H�o}�*��l6����6���4�b�e(�3#k+��z�'n�e�pma���M��sϵ��������7O
�|�.�^=B�sEM���2�ͅ�dT�Px�3
�>��8�*��M��LU��7�@d4_ǐ¥[��!+B����鎏��w�;;273����g^oqx�5	���u�Q������n�%tH�u���j��_�pm�+�`�RHb�!FoiC]���v}��FUa��l�ׯ�j��ڻ5�����o�	����:��k^���oD��S�m~�#'}[7�4����ъ��5xKj�ŬR����U�o�	���Q4��*歾5�ڽv5�����>�I6?��eF��#{�w(�Q;�d�)c�~vj�H����}�SkF���$��Я�\7�����&�
R"`�O�m*j&z�Uь���~��חѧ�+�+�4��w%>#�I�
ϔ�3�2e�@������%r�%j�V/$깄S�I�R��Jvvnxx.kKĠY[E2�6v�D42�LJ��l���0	"5�u��]_z)���_�֏����~d��G�_��s��85m�04ۤ��ٍ��D�%��}WN���b/i��X2y2
5τ@�
��sw0�z�F�i�Sg�RF��%��0�i��>�D�9ъ�ɦ��3�-�-�L���a�ɶM��*���W��ݡ7���Zb�h���eY�$v<v<N��HJ-��@Mi�Д�e�ǯ�h~���b�|�E�oc9Ɛ[o����M���SpA���8��;�v�^&��I���en���"�.�e��N"XF����d�=�<�u��B|fV7�\
�������M���"�6VM*G.��ɰA�ϖ~gX��E��&E�__%os�u�
���k�v���W{�m�dgA4č�+�y:&*�`�cU|?�aͱNO��;���}�����}3�[�ٖ�����f��[m�Դ�^Eo�fs)�Q�H㼰���䎑E�%
��f�s�u�|�ky|K���h�D�Qx��q�t߹@~�"\ą�1��_:��Kh�|^�f�o�RSjLa2�N�ϑ�h�y�K�Q.i>����ݾ�g|wQS��N	��Bf��7���)Yd�~`�9�iǎi�yv�
��-�pd�U߀�d-�N�r�&*�x��H~ �S+;QY���P.���K(�i�Qs�L�r7�
������#���7q5ы|���	����ٳ���w!���ӎN���u �h)D�n =]ˈ;���r� �J�ϱv��F-�����O�<-�?H���diy�uNN!�hO�$��u�����/��Q“��˷�A�3�Cˏ�eF�黔��sX˫_�L/(�9���edUa�AΨf��JA��QZ?�6�T�q�s`����TӥD�B}����!&�}�v��;���2�A�m��J[��F��5k��-���E(%��ռZ��K|�nf����˓V̪��Q��^NT������]�*<0;�]�Q\/��.k�;16!���M��@�p���u4���K�%����C�?/�8:�%��{��-�e(��
J^�U�B�-vQYq�c��}�Z.�y`�����%�,�^���o��7��b�
vs�J�h�K7-`[��~K�������m���I��n��9r����WvXqU$Tܻ�϶v5&��m0䉯���㻝x�w�w�����-����p�h���f�cXօ� z���eJs�hqF�f���]M��4�2d.�1%���αC?�
�_���(��� u�����Cv]���x 3	�Dn��Y���t�s(��F���J���|�*_��H	?��\�L�[�ӴB�a��F��{
���+����=
�N���O
s�8_���oa�b"���>7nW��VZq���e�U��.-��p�U:Q��I��(�\5���E{#!dtq�sH�!�ob���8����H*�i!�ƝH�۱B��zڀ-s#Β�����!�'�t�+h̦WO`kL���ڕ����ܥ问�v�^q�Hpb�>��=�K���|�Ϳ].�3|o�l��˔�T��5�%38�ۭf~aⱶ��{�������f^`��+��w|O˞a	y�B
����s	�DV�er�r�q�C�1���Jr�b�3H�7|na��ST�>�g&J���c��(��r�^~�����C�5����d��/2�����{����h�Z�n>dGY"CBZ��б��{��m~\�^�)�ݍ�Z�Ԉ�X��pM�����|+�^!*�`��%ئR���kR7���k�r�r�q�˒�+�I#U�|�kV���B�M��[ZU�Ԏ��q�*���F$Y��]�(.W��A'��v�r��J��R:����R���L�� G��X���=|R�N����،���\�i�SA��O��@��T��|��,�8��X��
p�X3@�<�S�!���� �+��da�Wq���I�<�^sr�^�W#�N>A�Gl�o���#*Mۍ�}NV�oZ�տ����Q�~u�j}SS�����j�\���Seѹ�Vg���l>�%�A����hS�'����0b���Fa�\=˥�^j�]��5�-S����t"�pZ�x;�۷%�<�@�"�
��'6�9r�*\V��j���>YW�:�k���ꘃ�c����~x�"KC�FqS���͗,��gR�_ъ!On<�ai|i��#�7	�/f��u�[�w&��u�ZJ��-��,�R٩~��B=YN��:m�~���,;�h�l�<J)�X(������W��J���:1=��S8ٖC��X
��2�y����
n �!�,˥2w[a���8�pp����1U��h�ЕOFg-������hR�&5Xnl�2�2�9�4TK��"�#�f3�����f��L���A�R��@>Ǯ3$���a��'dMi��n�6�.��u�q<}����]���G�u����W�	��\�	����K���,�����b�ڹ�[
��E�N%—�东yÁ��v�6�5��1���<w�&�!�/>trK]7vS�s�����b�
K/���y@x݃"?�u�U�X�I4�@}4;���b�:�8�k��}FF��Fq[)��V�=���ɭĭ�-"��/�Jg8N��_V%H�vGJ9[⦙�v����Mҿ�b߼3�;S��Pb���;���j��+���T I�Cw�O���
�����z����DC�8��w��z3����W�a0���l�A#Ԉ�Q������f�";�h��S�L��l���dL�
'�b�"�.��Dİ*�%AɎ�p����g?n�A�k*3
Hb��<y��1v����,��xh
�5�c�1�Bw4(�Tn�X���ƔN�bI��`��J�V�VҤD��35n��d��ꩍZ*!�F@��+�??Ȗ&���V �C��MU�Y���
�0�-8M�
��P1��������_��hd)-�n�/&1G�-a��,O�FHH8��O�B���ۛ�9v�������I���ZKk�]�jI=3==�}�i��������؀1��c�����!��	c�fIx�'YH�@y@��-7ּ��Α��{�ν��fZg�s�SU��o�ޠ�𲄵呝��h�ާ�c���
pE��NS��H��UKIӵQ�rD�/��4��V�Q%��M!~�����Y
>�[���EI)^��'Ȝ1絊�,"DJ�ʃ�I���U$L�[ʼ�ڙK^zə¯�,�H�c�B�V8�1��4���>n�ĭ��X��{՞8ň��d<X*�ȭ�e��
A$��3wp	�p�"@5i<��"�9���-3����H�p�i�x"
�'��{��}�5]�r�Sqb��SF�a#�7&,�uI[դzcg��Ud<ң��;�]�N��MMԶf��,~�{c\ZJj"���=)r����u��Ӳ������5�?�y!!o��V�%f����G��圡[�JAe�j��t#��iw���I�G	b�l}W��!��b�h�k�w�T�z�m�8��R*<`mϖ��B?kD);��wخ&<�$MIB��9��&�+��`{x2�o�B��x���Q㒾B��RK����K1ITD�i�
GY��~����@(�]���bD��w�u2.�-U~Q�S���Y���Z.`��W��=
�>�9eo���c������#�4��x���*/�w���!�BNH�F�UL���.%�~0�ʗo��Ѿ�	x�
�+�`N�-���r�P�-DŁz�gE���z�;��S:��}���)҃��!�P0p��ki��k0�|P<�G�ٷs��L��eU?�
���Ƽ��`R����#�Z��p�%�}�,�N�i�~�e��56�
uΞ���Ϟn�ZQ�ϤƳN�n�ec�Z/�qc�{���3;p�a�����!"+3�7k��讝;�1����\���ԬP�>2�aE�eV 
�T�1-�)ULwbj��#KR���pT��6�&��,&�i�ۊ$+d�KCQE�4D��&Y���>��I�oE�3�l`� �kT�� �9}����*�d��O��⳧_��͜�x�!rm�񔭾
x.�KeD�D6�.��P��عY����ɥ�Q��#��XCGPd���N���38]�>HIځO���^b��C֒?������3ӻvL����e�h��v۾�W��p��[�Ԧ�Oa<잁:�$�x�R.Ԋ��ef����L�:4T�ϸ"O��;,��^2!J<=~�M�Š,��E�a�����2�v��!9	�\/�/�ei�P�.PH��^[,�.5���C�<��[KT�;��L�V�����j8`R���<��*�m�Ğz����G�(�����C~T�8�%�)4�@�@)'IY�o;����9��hX8')�؞�=G��.���S�$����]��`�ʰ~�QHdV�|��oZ ��E?:�x��O��~޽/�9�ȯ���~�b�V��k���:����~�%t��#��V,m?��II�5�� y�[@d��X�����V���<GM���̌.׆�KY���:���B�V]���e裐�}�m����2aow9��[�����v����Q6x�a&G�ac�!J�	cv%�]�oґ��0�,iz��4����/7���8q��Pn������[Ǚ��x�))�Ke��r	u��z�"���n>�m�x�m��2�儬�e�FY	�1�]��1|�~r`���^�V�Vx��Ӹ̧ղ���\��@P1G3����h��.]m��՞<2�׋+����s�=n�n�l�@�3���V��X+��[4�(]Z D{TH�� ���#���y�}KFY��NC�i.�4]	�ڔ��!��N1)��bNJ<�����$W<ALW��0�"1%<D�����$�R��8����ɺ*��QY<l�R.)p����KYlZ���I<d*��������}F��&Bg�� "N�]x�����A�6uy��Z�&d�TC���ݶ�c2�H�(h��C��.k%1? �p��o���mW5�f���0���0~@(c	|G����7/2B3���@*�ڏ���X����kJ~_	te�M���>���a�������0L���n���e��]ӱ�G+[&,�K��|9b~a�Q��N-���I��zK\0�1��q���hfS�p�o���c�ϛf�$]e��5�+��0����M��6�rנe>�O´���0�-��
@�_$A�d��u�i�?������5O����{�K=�'���>�t��7��EC�QuY�O�u�M>��uձ�nڮA��d�K���t�}]��#}�tGa]���EF3�R��_ی:>�׌�6���M�H7���|�ܘ�:�?�+R� ���Ϟ��k��xh���[�ܭgn0�U�
��<{��ׇ��U;�Hecَ�Is��>�R��pO�b�a0��c�M(ZM�n�F3�G���;5M�o:��akRQC�	�}GG�3�!�;�E� ��:���о�s�-E! .R�y��Jx"��'-�A�X�w�Ņ|�p���p}�t��D�pG�9B:f��-%�o���V94o���Q�OG<��槙�U)L#?�:��A�{��^��/!���Ѩy<}��a�I�i>[�V8܀���V�u�?I�pZ!�I'cw/�M2c��m��a������&�i���Ќ\?�Z�:�l��F-���rlR��;�`�q���D�\.�Ql;X7���2Dm��X;��z��\��W��\��A8e�S�s�f��������VBg�~��k��TnZ�޵��.�� YQ�3w�t>��3�䋜�!�أ�
��f��f��.�ک����[*���5
�GI!Qԓ�%UU�:�Dȃ͑uW����HH#M���n})2���<V�}�p�}�2�}�j	;�
1j�g�Qh�J�"�kw<6K�zt#�^��U,�C�9���
��O{w�go�r(GG���0$n[4N"�G�^,5���fS��x��|�.�'I#�'&d.?S���,�ɼ�ˇ�8�doQ7�I3�� �Շo�6�$D��K�����~�鏉�Rdg�r�mќhN��C��oLc����@�P�5գzy�z2�P���-�B�H�7c�W9]�ۛ�Ϡ8CX�!a�Q5���N m_x����)(qSY��NE3?�kd�H\�:���	�#d�F5��>A�"�ķ4����`N"-�}�{)�-
RT�_�dD�%X��w�zT�^�ZƋ��}�����b�RD���R*����,�/�6Y~s�Y~�s>��@}x�v��\��k��t)ϥK'�=�����X���J@˾Cs`;�B?�8MH3waZ@����5c���"��G_�-���'f�����}=*WxNѫafFP���"GutŒ"%�}��O�!7���+#�/ȏƬE`_���B�Y!�+4i)��ibFR
�c>
5$9mֱ��ף"f�-"'Y�=�M��,�zAV8Y���<AQ���N	ZQ!�)8��%DK'm�����}��}�(e%��}d��ɑ�ߧ9�B�9ө���j�4C�O�e���	�R�ܻE�$ؒ�i��G:������t48Q��nI$����1'됿؇^M�Y/:v�h�ҋ}L�$2�E����CCy���6%N��8x�)`��h�_F�Q�wڞ��s��r���^C+�U�Z��t@�5m�I���S����W�$��\����3裧gvR̵�3��y&L0�ޟ(�#+���H>��q3wf�L�@�p����0Yx�(7��G��)�ߵ�~����E����}�q���8,�^����;�f�c�	�T}��&�Bxc�;;�
%���*�8�쩯W��Rq��5���+k��_�~�J�#�D�S0
D@- �+-5 ���]��ori;������;�w;�u#���,ŠhuG�L���i�ѯ�[�	��E�[ɴ6��C��mhB�-��"P)xbi"��FYY�X�Le�#犗�:~�c�ݞC�ܰ륹ۏw���?K��쓑�Y
��)�?.����V��Y]�\u�st���%taq�����^g
���3�J��]-��坯���Y�^{#�mǎc)������\H~ڶC$�͐ł���u5�3�*K���?w!^<�]9 ��iH8���Qr=!��B��4��_D��HU'?�N+�%a���	U��q{��vd�U��x9d{�9—P�g�
'yj��s}��HdnهM| ��<�քi~ĪZa�Ӳwl��c%(�c.N?�M|�^�p��d�O��t{Gh�Jo�cֆ��/�j����+0��k���ܔ�m]߳)��ӥ�*3�흡�}���I=_t-_�vϼ�z=3P�A��MrE7y�7y����x�w���y���P�7��"}p4�}fCI`��F�����5�����n$��+��|��'>s�g�憞����e���uT���bY�V�s�vh����e������h$���7x}�H`�cz%�s�a1��0"yo�g��}\E����ח�"t�e?��x�Ý3���d���,���~���X���B���Y�-Z��Qx�Dj��Y��%6d�Z�w
u��n[�`�?&^�@Q@-T'<c��@|�d|������_=SQ�g��+�6����.pG��i���p~z�Kл+7l��+��Y�v��8��T���Raj2�R��y?�p�F3g,�d���u��4�|��_*1�K���̄���5���e��6!*��p����e�:ig������p��t��i��&Mn�<�V�kb	�hf�W�V�84�J�xJM*ɔe�Jנ���=}d�$�J��:���6�ހ���P�-p*�;��u:����A��.�|��3�t�s��rj5U�G�?�)�D��}54j/s�������A`���Gs��H|�̒X}�>ޏ�|<���ѧ�6݂//���X&..����O6~�f_�NR-P"��R���f	-�%nw�4���Gy~�t����Rw��D��lcF-[���mkjm��5�$r�d��V�����h6^�eQs�T,
(+ų�����'+���g����K�"��$�8��S)����%��	�D�T�˘a���i�dcnz��f�?�<�%tV&�X�%0c���p��zR4%E��2�����x����$e�zR��zR6L�k��d�~�rFw���$��XO[X��iM{^�3-�a<�E1Fa�Х��RV���b��kE]�Cžs�h5�3��E�܏�_f�����0eS��Osn����	�f��VsH���8��ЋB��>��o��ϊR�p���>���Ɲ�Wɺ�5Kx���~�ޑ�b��h
Yb�����D24WF�C�2�M<C��$��x�>��b��_��}��3C���	tDODM<�%���7��q�9�n�:U�t;���}9�������H��M�:Ҟg�)�H�R$�%ʈ�!�y
	sm��Tᐮ9�xp�䆆��|f��R.ݷ{Y��BZTQ���~��hVS�Q?.$5a(y�؞rF����Ä �"���rG���yt��>@D�)�K��y�����M2�Q=�W������N��D��"�~0@��0�=M��}�0�A����������g�0d�`�5k)����x�EF�\A&�y�|c	B�p�8������Cb��{n�5�_1�Q�58*�0,���l+���)�)[I��/�٤X���o��IK�*�7n}�
�k��H�!�Jcs{�N�f�@�l7ǧ�N[��=`��m2����c�bJ��-v��ϳ���yuq�svT�V�u�{h*�q�3��P����+���x��E@D��
�^��5�I}l&��J�o����� S�X_�X��s��'�iT8p�aW�N����%�����O�v4(t6;~��Z�ֹ�t��J���P'�F�T��Cr��e�]�XJ�	�݌���˦�q��ԨCu�n��.��*?T�^;^����C����#�٦���eA��P܅�`$2��>�?F% �X<��/�G�p+������F��rwEF5Y�>�������Ѧ��	��&qE����_�?W��[�Ñ�#/�^��3���aq���2iByi���Kk��5�t��'*xX�55�,f�$	:�M��9�ܤ�9����H�V��t�۲n+֐h�(��aQC�(ݤ8��A�F�!��uB��} S?$��,l��f?
�'Z���B?;�IC�����ߤ��N�P8?DΞ�P&�&Bc7=�X�lY?;�i��Iw)�6�>��i,��B�K����L�^.W+52s��a�:C%���P�����t,]n2�D<���݇n�|n��)�=�^����q\5{�Ÿ$-���X��	���j�`�ϑ��×�V�x��K�e�Y�I��o��N~�J����Mi��v��Ԅ��(٣-�kvϟ�r�\M�eu�ob4����7����b�+�J=g�ML��s�Q�`�/`"��Ii.׮��%n��a@+4����6"���З�c	Ѝ�b�����Q��U�I7�u��?��>')j7�*��ϳ)A��%�?�m+����}{;�>�h����zH_d�@'$2��3XB'�r9��9�Ź��ϐAt&?��W�<���v��n��?��|����Z�9�&��3��p�v?��F~x58\]I��-���ެ��d�E}o�Mxֺܽ����%I߻(`��gZ��[������~�$��?�o�EK��+�@D��Gf�6r����p^!�G"~�!#!�Tl�[�{aWZ�Wc�~�}��p��^�B9�7�B��ձߐ8D׊\�BJ�ν/��+���l�5��ڦ�f���ʗn����C�����g��lP�bG��]��q�f����~�7��k�E��;#�FCs��}������u��}�(�e��)܄-��\a_���m:���sd�]��Ӷ,W۪�}+�f@w9�͢�?����f�9�]�ƗB��.l��A�h�H�Z��t��ɵ��D�.-�54�����l|r铉�%RJ
�Zϧ��t-��vY�H��[��	{ r�AsS�H�ANs��3P�i����h���N���f&,������,�\k"�u�XG9P�v�G6ks��]�*p���)z%�]��xNW���^j<2�Q�M�M����9���mo�;��8���p�t��;�s�S��`�kgOv6㚻��"L
�r��U�?GM~e�e�	8�3�Cd$3d3R���G�<
;���
����Kye.�ŠI�[vU��������d�V��sݟ��~o�������{�¨)N����Ë�#���X�(�EA��ώ"mn����r��`?z/
�ZB�I�e&m^"{"�;i׫iN�:��Ts����C�aR=~�EM��z��\��8��"+Ɠ��+��oxJ�3��N%��U��
�1�|�(��Vlt�z��������hY�F��*�5��U!��ȸ8��n�S;}��
7꽕�/1��zN��A���5�>��F��=�(%��i����EV��.���f�
S�����X^�A�Sq��`=^��W2�Cv�N��_"����Hx̱|n����!�WZ�G���ݜ�1�y"���O/�>�����k�~�����"�٩���M�7�!���Aէpq���q
S>����b�����y���=F��#��C>@>�v:���K����y��V'��]���};�U-|D��C^�A��F?�V�'�G�g
ss	�ӊQ��YuCypem����b����
�I�|�Z�~�f��[�c0J�}������i~
�5��o�
q�l��o�[$�	җ�GvX�����gE�R~FQ�/�B���S�x��9����n�!�&$��"�6�
&�S�SJ([K��d�� �,��R�]�=:�+zR�<Et�4!�)��
ڢ'[)]��А,IvA�cG1M\\Еo��)*�Ԕ�̩~��G�$�Sӓ��9;��$�8d黒�EM�L
�b�L��I��ÿ:�NteQqS���̰���Ri>0Y���Cl�&�1R��ȓ�]���O����GbfQ��0��-�a���H3r<���lE�dy����KLHD�%��aeyp�W�i���zȇ��<@�!��(��5�a�������ks���]+Z��eL�G'��o�����00�)H���8I���8D\��<yA�B�	�[4��<|������@$
y�n�7�u���X4Y;�HO������<�}��M�w��퀎��L��ʱ$hd�Ꮤ$L&N�\IT��W\"#�^�ROЄ\ŋQwƠf���0�n���$O�\���S�U&s�*�syjJ�pG����g*ǩ���X�5���XtR�K���l|x,76ϊ�b<;�
��>�ˎc(y��y]Ul�$_n��Reo�'�h&
�<ϟ�<:���E&#���%�#0&Էw�'	O�L��W�?�p��&�cL*W��Bǀ��l�M����Q����=�牁;ŦTfcx��%�Qg�pc�yE�u���yU�/I?�D�	•*a����ѕ!EϨ� �>!I�E�:��(I��̩N"�������d^
]�U�x�X+9��\WWd^*s�|F`�_)�\�H�+j�W:T��$a�d�����b;����c�y2��SlQ�	K0�S���H8����x$��X&�/5�bv�>�"��)U/��kS����G�Q7��KK��е�%���3��X�%�5�>�v7��?[�ۭ��(؍��$�#������:B��+����"d����w��x��(5�9m�2�[�
M��p�w���E��[�9�)]�s��U���>L���v<�X�D��D�Ȧ%���<Mt��_�c>����<��曭FH�P^/Q-���G+΃@X���)GS�TTv<ZQt]��y�U&ҩ�ߔ�4�i�'��W&�K�����{u��On$��V��n�'��'*���O�R���~�U��7���sB�E��]�v�`l�Iw�����Kb�5�Q��%:�ڥ���b����~'"/�\�wep���j�x_Ih����Z�l=_1�b�Rȷ�peZz�g��1��v����1�0ݞ�]�ڦ����,�ö��J�k���Bm�j�,����x"#$��a�-郫i$H~�P8)�8S�0�u
E����H�QJ���<��S�(!�/q4��NvQY<�(��cs|	lt�ϑ3^��ࢢ�&3�`i���|B����m#��!�~Q��L]!��H�Q���t[��
�Xq#䂣�O5"�:�X�G�3Ucў����(5�rH��x*��i��'B�F��������`O�S"P��(�_`�6���1���m�I1��]�
���`�S����\1���#w�3�a��3�6%��GEqJӟffb������S�����AX��z��R����'?'{����[]{bm��K��Q7V�ژ���oxB�f�'ހ����G��H%&�\PI꽐E�dbfa�ĭ��'l�2G�C�`�:۵7^z�5�o�톢 6�9	}ͷ�@V����C��Q��HD�pK�bwTt=uoe��3����s樜��d<ݏ�l;��/�W���+��X��FK��Q���VA�2i�>�S���I� ��H�׷�@ �^,q���ܢ�y���P�P�/7Tm�|��ϓoݾi���!�#/
�>��¼�C-
1U%�RLJU���`[�v���Ё�:�y�]�6��"t�Bzq�)r�&9��zT7�Vc��&�~+l�E�|N&�gF�f����H'��v�a�'4���C>�b��S����}2R��}��%D�o�!�e�l���E=��3
_�j	1��a�8��У
�!��˩z�r"Yr�=�E�%�*a�%$���S���ػ@��z�y:�d��FJp0�5[�Uz:M�\��B�g� �J�P+�b�q&~0S�7Z��ٚ<�>����M"��x��y���fl�N��>_��9nw�����H�?�	scg�,��5�Ƕ���{H����f
��۲�ޝ`��+G�+^��fl	��}©�\�cY9b�ϑ��%I��m���j��?� ��X��\��d���jK'��-�[Q���=�J�nQPD��SC��Y��޲:��&�k,�����Y��������T���<6ȯ�_-�՘-�er*�3\9v~�Mq��\dr� �.�:;xM"��CĠV�L}(��� ��O��	�M�J-�ٷ-��8"��
�v��������E�����D��5N�'�r�+�v��%���v��T�|�g�DY�L'ù���D���8��G���2��(S7]b��~���#;r[���� ����I���[����[z~��.�/_���� �c�=��wC
��n�3���"5vzs�v����)R΅s����DT�0M"�GyY*����9��TA�M^O�@�u�S ��J|�|D�BN-�)+�b�#s*R,I�1�Ϫ��B�k���m�Pp(�bk��em']�wj��M�ÛԳ��^��1�Et�U�ى�Sz�Qk�l�9E���3o@�O�:��u��K@���x޵�3���v�pi�S���>I��>�k�W�MP�6�^�<Ԑ�(8�>�]}�*�Y��Je����Hjg��{�ܺ4=+����+0��Ⓝyz�����j�?�g|D�d�<�E$�d�޴V��Ew��@�5�ܘ^h`Ȣ��#٬�ۏnL8��;��=�r`B>�rd.r�Es"��>t��g���\��Rh��Ѥl)/�}k��K��WP&��}���Q���0�M\��V�����pd���fc��Q}ecR+�i�y��e�Rz�g��mY��Z6K6�4���lέ��_%���t��sֶe�j�)���� C�#t.qꀍQ�{A��w�Mf:��/@t�7jιA{��VdC ��W´`E��M�}����[{޿��2{28.iF5D(f�t��i-�Z�҆�����[�����/�����&~���ئ47����]�Y���UJk;����l�и�r�d����۪`���a� ��mf9sW&s�)��;u@Nfk�6%�V�]b��?���͐{��MTsGnR�?��M騲�!���ڤj�@%�刼�W!.��ȡ/X���E���7��J�^�З"�cwF^�5�+4r,Nu)�V�2OFj�"�?���!A�����,C�
/A����uc���X�����t��r�K�y�X&?C7jt"?��e���LnD�Z�弉%�#�T��P�Kf��9�ƙm;hq�����}��-HB��DVG�l�ڊ#j��J����TAe�`�D=[(W�W,nAX��j���_5�Ԭ����qk4���f��Ǐq�����C���#�&�꾃c�)Õ��K�<���eǬ��|�FC&U�Յ-��H�ԘÉ�d&U�R*��p��SrL�'�����Đ�I����!d�S}K�Țm"k1�W���4B�O`Q�D?��]��_V[:S�B�q�$S//�y�kY��<ꌵ�zklq|��[oU5�k|�SA��5Ƅ��� 6�D"|u�7�Q�ދ�<F՚OѭCE����������m���?��T~c�܍���z�?����)��|
�з�����۳n��#C�����ӓ��u%]0�]E���~�y��;��fj/�����.:�gm�C���C�jh��Sk�=k��K5&��)��
?J�[�-�E�,����5{�`:�a����A�7X���5�ܦHIY�y��|�$��*V��(j�9/	x��%�) q.�`Y�<�y���R��܏��'�8&���^�B~U�t��x,iq;mz9����l�+	�O
�F��,B�x��dAe�4�k(&vσ�1O�^�/��&��0�x�zsM�D���$�6�4B�����bh�1r��Q�L����d��Gx�4��%Q�,ĩt9���*jڰ�[��\R�Ud9�[�BM�s"�07$��h���s�5��,�x��*d�����q������+d+���EQ�D,6��_'[�̸ċYɔ��@�-�ٳd�|9��1�ޣ#$�#�H{֣��XRƤ�F ��+�V�-������C2'�2!�|}d��]�]^�<A���%I��s�ēn�I�HF��W$B�'<�Ɇ(YXT��#���1U�8�/�w����H���g���aA'��@�M�!�6'�<��"?H~
�m#�W&���GJD~�"k8h{��s��E���}�I3�C��E�R�=��z``���y���l�9Jo�Z�ahʝ�Z:�o���t�����s����ߍLo*W������o��.�=�+�~�Ph�_��v��d��<6#��~��P������G^me���H|�g��<�v����g�M�`!dIq��>0p6�i��D�W�
����\cKqK���	S�5�]���B��R��W���Ϋz�PxqϺ�S$k���՘,LA��X�H8"��c�3=�q��~��JU�e�?B?G_�h4��N@��)���k1�!��1[�/�:�M53���xM��zá%y���}썴3����.�
�KcQ3?-�)	�&���&o��������K�'ǡ�gi��|��@��h��u�h�d.&8�9$p�L�r�혶)
fT��0dڎ�8be�('���2'�zG�29!d�p8>m��Dֵ!A��lhe�+�g�AK�1hv��ҦC-%I˲��y^����)/Ӣ+6aS��DK�VE�h�*[b�v��.��[�#�q�"��(�DqĘ�I��Xqy��T��j_��H�Sa�D^�R�� �sM�^B�5�6��/�㱬�7��b�{|?��:~���B$�y�N��!���o
IO�
�͓d!�/�Ѳ(�����g{�H��_K�.t\�ZR9��!q^�#?x��D:���b$O�������\db,zc�7�~��M��A��u#�/��f����Sd�##���ϋE��־�7[�](��!b��d)|�H�H��$���$�!����JP*�M�q�D���9��л�ɀW�$2!��R0r�T�h�P�ȃY���L�u�H���;Iߚ�$���rw>pgqC:�������+Z,sx�6}y�41�wk���Ч��'��oٳg��dlp��7m}�v��\{aj���A�L���`��H	 �H��,:o�lITr���W�/#|�G^��q��i\9p寅jAL�PN��F��g�S�Ƞ��ӱ�tz4��hz:K��
����rDlm�K�3d�P*c,c�[׶m�s]�pm��6�c����V��s�MT�`#޾i<�BB�
��/��t���$r�N�u���/Q,���^�K�k^�w�/Kd�F�mH͡=@-�ƅ��L%��_��˃9<������CbC���M�o;&=C=�ɲ0�q�3[���W��%��c9G�����&a�Y�T"�Q��H�Q�=�H�'�d��>���
��/p?��a~�;b�^^��ج]���ڽ�����8_ߦ��s�J1g��]5z�C޻���ټs�~�.��	g�j�	��z�sT���
kҠ^�!��K��ֆ�o|�=<5&�sj��@��UdJ��r
�,8��+)^ՙS�����+p�F��i����γ)TQV2ec�1��$Ħ�a�}����ԷQ��3�b���=����3�~[K��_w��u}�K
N�t~�;u�=��wTP�<�y���H$��p�}���M��R���=��ɱ��D�S78�jq��>�u{����]Dv���6ȵ	Q�?D�����Z0s����%�l�#'�8�9r'�	L5�y=ۍe�"��*
_��B�r'z����HŶ��nݤ�CЇ]��6wn��w6�u?CCՑYM�.am����[d�'?E�6��6
z���M1S�SO�[H��sTtz�}��P�p�c༲>���u�����x7x��X�
�{�~Á�]��X�u���a�W^_�9�6������`����zw��wtu��Ѓ������c��9���"{"��(���J"/6G ^�N,��Y�h��]Π�Ph�B���U�L����C�_���U�y��l�Rvm��+a{B��n��n����3A>�_��o&���3�'g*F/=Yh����QMCyh�:O�,z������0�!`��+���%n@9�x�NjE��xɉ�Q�-9��Jzƛ~$a�	�52x�$��8��d��P\����~P�����ƀ�q�����{�{���sE*W(Fٸ�����(����>��D�?�h{>I��͑���?Iۢ4����˂��4m(K�$�X<\[.�U|A\��T4�/��M�;ѓ*��8�;�����f������J��cŢ�mRm��{�V���q��u�?Y�Ѽ���gs�k+�hi�2��
ӓ|�+f���ițwӗ�d�Sc�"o�D�]H��Q�b��u��B� ���*—���C����X�p�:��td1��	K�~߆ToP"�*�ѯ�MZݓ`��>}����0)$��_I�u�_�fX����)��װ����KmZ���P۬��E4S�Tp��/��M�fm�oVA���B�禌X�*�2��i��"�Q��zL�з��P��
ndg��b{����$������e��/��q����A�`��~�'yŸ�_�ۓ>@y���2�N,S��,B�����2�����$��o��!�w��j~,�%4��E��!��@�h����T��4^�I�5H����Cw��x�;^�͇Y�O���hFR���oCk������QK$���?��۝j��O����xY�IW���;��K�fZ�5��Q^|
o)$������$�|�EՖ��(�.5�r��܇�����T,�㥇W��m$��;��\�^�k���R��x�}pCKD�>s��8w�.��u}4�f��k�G���B"�� N�LX�Գ�n��<�c�6IQo���2U�n�ٱW���n��]7 C���C�X�
ҥ�IG
ڮN���ض#�Ƅz��z|�)H��xF&�,��#�$��|d��K���s�M���md�Mbx�F�7���\(��O��L
a�\��]��wX�N��8�}6�;3PPN����N�ʎo�g���&��fD��.K���� ���%���P�	a�^�*ڦ�Gt���Wa��P�11�E��E8�I1j��}��{����=����`G�����͘H(�9B(�Xs7C�8��_ł<�2�.�,��a]ǹt�e�~M(��o�����3�:�X`ޏ����8��ҥ��jO�PJ������+��Յ\n+�^���>X�'yವ�C;�=��MT!L�x7[u�]���a'0�zS,�׏5��g��(��DC��@��Q��h�����^�1�f�o�#���E������'��r�ٱ��1�S2��~Nh�2,��P5��~�җ�E��i:^ɸ>-n�l�tb���~ ��K-r~F<���G-$T��V?ym?.h[lˠ �M\�0wI�->��ʄ0dt�o=�j4E���u�ò���Ls���j���ʣfR<m="R��>b�!Q#k�.r�2iLS@[�!�I3���q�Et��@����X�C�y�����:E�JI+�%I"�%�4ٝ�}�<j���ݿ�Y�9}��s�[&�(�ҟ^GN�RȷD�-�(|�|��%_r9[�Ygw���%�����7�oe.q5��4������	��ʕ0��a���\_3�
ݵ�a�Z��3�>M�W�x���Yޝ�mY�^YKk��YMӏ��
]�ָ�o���nR��S��PD#�1�8C0i�R;���\d��.	�NA���~����Pқ�~Ǵ�u���b7:-�
y�?1����h�=���_���U��9�X�/[/+�u�\4�tĥ8?DSǨ��c�+��J�F�pu�6z)+�~�Ŝ����X����Bu�)^ʊ������h���=Գ�6� �t�=�*P��B����������M�mk�'6f��Ba:���~L<�n��U�*�?��}�
�ץ���?���ɗ1�����7JO]/�w#�
d(E���
�Q��X$�K�(N��ր�wz.�����s���4��[���t�.�m���b�^8AgW�"w�F���HO#���&��N��է;?��ڻ�w��pn3\������S�}�›�Y��1ʿ��g!:4�0!%
J���e�BJbh,�,g!ڳ(�p����݆U�P�c����8�%ţ���k��⤹U2��l�2[ˮ1~�P܍��4-�T�nG��XDNlH�&3�ߢd͟�q�"�R�PJ�X�߸�IV��#G=mH����U׸e��b@J���]�u6�H�lP��/h��"�N���hG���N�~Ǐ�M�C�lP"G���H52I������ۃX&L�ߨ��(u6��
�%�+|��w�"���h�
9��eB�j+�h)��L��SF�ң�ϩoS����ާv�>�=�)�g��M�y	��@�s�����]����N�|�̙�Ng����8��>��D�MV�I9�
zx�o��4�	���ܦ �]�-ȒU>����K��ʎ=�	ϛ���Q��M��}��?YH%QD�J�v$/�$�c[ɒEk4]YX��G-�a/�޶����~�/��;���j�%�-�l27�F��]�
KN�d��ܾr���r|�r �NQl<��舕Y*����-e~dKjh~x/q����ߞ�O�ì��lQ��*D@P��E��\�ն��&��K�W���V(�o����-TG$������Mҿt`�`(��B�J��G�G(@"r�z(!�2�<�׉T@$����l4Q3�
P4��9�ֆ���Pݭ;��gjxB�����mY�2��ꂣ����*�ù���;A�0����7�)�,%O��sd�s��!o=��MI>f��Y,�1>y�e��ީT���w$�z�zW@1�l��.+!��#$�w�`������7��%�����޼#9���m�v]<w�"�A� �V��A#JX�9;�Eu���>Yc����_���!d���������3�}�wS��ٍ����u��^�n�C��K��*Z�URP��]�|(�A�O����HI)P��ϐ�>�dݣ�MԵ`��aS�A�E�7f���gP��*�;�^M�~��^�s9���7���4��\Pi16��Td� /���U@C���ڭ�׃������^��^�&�{����=��&���ZC����\~5����gɵ۱�C��,��b�Z[�2�&�B9!$�`,sqE�<%G�O����Q�O��u?�x�y��/�ϴ�T�}́5����MK��h�_h�ʐj���4�BǶ��]��9Ő�c�=�r˝��҉DB��@�5�������.ͷD�8��>CV�)�nN�Q�7]���:x�@��_Yj'��4�%ͩ����q��z����qgi�����'��HT���ư���Q��4%i"�8��NQ����'���`me6>�J�X����zA�!��Ie-�Y���dC��
W2ly;�p�Tʒ�}��+^G�D�VQm�0�:K���'�4CR�[�h�x�jZa���չ텺��m�M���&����Wh��0ȃ.����w>��Z�������Ą����H�3a��C����)_����>D܏.�D-ޖ���U۵#�λ�����
_:}(�}�/+�Q���-��r�K
��@$諏BJ�z�P����[o8�J���_i���f�:���|�T���+�N;�H^o%�$�j_�vvJ'|/����`��=J�{г-��r/G;f^�}<��ngh�mQ�xgҢLFɗ�"�%�ƒhT7m��@�Y��˩>N<��3���yAN�{��A�	�mǓ��=�:�m"���[l�߁��>��]�孧DI��S����*YC��I��f��Z�����Ԡ���q6��@��u�zE7b�Q:��<d��Kg5�!�L����)� ;w�Mj<�O͑��/s�7j���i�w��Һ������_@_�؈
�?���Q��N��=ž7+p1(���@���$2��щ�6�βwN��$����&���#�g��	.=@��v�������VU�խ��3#E,h`��J�$"3:���rm/���!��?�� �4i���&S/�,�ypbaa��pI�_% �"nMUO&yC��9rE�=��'*M�����9�o�(��l���|��Q-^-���˻�%�I��F0Nh���7�v�.�B�5N,�	�Gȍ��oS�d@7��S����j��:JD��H,�t���_�0�����t��A�7��{��Q,�8���8�K�~2o����I�9�P�E�5F���
Dn\KA��r���dv�"K��U��(K���+C�Ʉ�n���"�EEOB��'�ͫ�q9;���u�U�9/3���j�ó�;$Al���� �;��/�`�'��7�K��Xs1�A������]���^͊��Eٔ-�޽�*I{�4���O�,%di��H��.��f!\������XS�>ρœt-��<�Ρ�zmnv	Q��}��~g��H'>%w��S��W�X̎�D�*�=����?�@�Y㲗/���Υʜ���h���>��7`�T�ӞMV�S�x��4=��7�E�M���rJ��}Q��e2`Ρҧ�ȁȕT*��|�����[�R��Γ^����� L7��CvI���V�>�y8aT‹�1)��9+�-z���1��Is�Ln�I�0_0in-t�3ų!�R2~���P�ه�kF�j�<��Y�Z�ͥ����xI��c����)��s���_
d��P�� ̽��dV���=K��gh�C�X�Z=���n�G|��LA�d��a�*CŶ�T�{�jD<�=����KD��>rO��{	�#���
{�S`@�E��g"�1d�؝��Z�@}���Z� ��1�T/_*���P�,��eֆT	�u��n)+x	��N]䊢�Y�zL�ŝ
��tTE�„���k��紡��!��nr�1K�s����8��&lj�.+j4'J��e�q��;f�4x��w߀
U&�
�tBs���!��$^/aœrzUfL@�����H��i��P���.`~�ģ�>��?�E[����*�R\��u�����&��c�\"$�Ō�S��u��C"�k<�9�Q0ǒM��b������)HY0xDo
r��֨��[i�t&"Ƴ�դ/�m��SCrq2�|M0Z�x
��g�a���T�ڣ����+?NO@��L���
&�5�D��@����>�:/�ܸ���_B��\$�)�Y*�p����g�j����m`��ϵ�yN9Pl�$�
��봔^M����A�"��E�K��0ު�_أ!B��m`*�|8]9٥����y~:���P���6?�1�s����T�BaS�#juQVn�IQ{k�v��P?�`��㜚Rϱ��%�2^=c�rN�_�ݏ$�/�M�X��vS�H8�u��=��H�J�t�)��S�q�4+\�q���sb«W
���U$S�W�.
�>c��=4r�\�~+J��\ﰔFY���9K~��hA�i�z�r��a���]s��#� ��/6K;���S�-�)k���}w��������%}��եv�V��SBexq=��Z�����yr9�U׷RT��Q�ع,8��Bb�,GRe�s��nFї��L��2��ʧ�i�6��~�����]x/��rA��w,t��$U�u�E�S����?Gm�&i`�����
tl�y`���Q@v�9Ow�d�o�C����[��hR�H7q�M�#�O��&qXJ�e�p���p�G{�'�_P7hC�Pjf�+��
��z9�bE�	A3r����*����LJP��|�����Dv�Wh�	S�W(&>�e�t�}�񃭜�����;G䌝4[�0���GEŏ����߆���\lT�"�á�	w� q���>�"C��ZX�g��b�sݵ�IB�&��I�#F��U]cF�5���d���Z�ɝ;���m/y�d2��W�\�7[Y�x��W�����˩�x��pv��Ϛ�R���X�X]��t)�Q��qr���p=u<O�]��U�9}̡��������%YY’��%��x7�1�C	�0I!/$(�HLB�Ip6$!��$,�gIp�o���>������d��J�UOU=u?�<��s'�z:71�K�e���p���L1鉝z$ZIg݉\yӶ	�ɵu�v���E���9Q��wE�7|���*�d7��K,W��M���Ut'�}"��n��S����ܵ3��l�b·b^N��bFm�U,I��O�6��蒄�xbd5+��eK����{ὼ��;Ty9~|d�D��-���KY�����6��c[p�J����m .t�.L9)�3�xA#t�-N�+^���y�F��=f��ӡ]�;`�ŗ���o;K'���X��-����o�<�w��v�Z3h��o�y/y[g�)���<�J�/@\Ww�d�Ot�$����Jzy�p��}X>wx�[�޹X`iP�'t6��[�XI��^HW�
�-��P{X��2\���R]xa�P�=�a�!y	�GHu�Ã��~p�YB&��Cq/�Y�h����~"l�����fu�FT�Xhcn�Y`�T�Y�b�N�P>T�RD*_�X�E����B2�S���_-�p2"�MYz��`�@Nݲ��)�Y�=O�
�[ȤOҧ_[��FE�p'��Ҥwr��ĜQ.��Տ{5};�$+�,B�z�%7��Dp�x�㇋ƾ��{9)��|�Mc���T-L�O`ň��ݨ��!�fD顸-�g%0n�����P��
���T���7�Ѽ��鐖�t3c����N�}�VG��`&�QK�z�4�ھ}J�+T��<���5N7T/�ڷ�L�vk��罁~��o���xE��l��o(�5�
(����$��!O����,�ք���AH~��k����sUԮ5R������~?��k�\t��R���`@x]�$j�8���XX���h6C�Y�}X���[e1���V�3N)�+�r�l�e˵�;]����_����<��Xs��U��"-��G��כ�g��H��:ṛ�׬
<��;'.޴(`ӹP�\����]�g�����|ezqqZ1sNyg�=x�OЧ�F�鵑0�]B�H�7�<ʢ\�T�J�b���l#�%S���`�S
PͶ�h��X��1�#6^��TM\m�R�J� jjԔ�C�d~�I��	�_�R`�b��pT;��%~P�cK}k��Q-�����c�Į	��0.uø�+0�G�<�.`�30k�p<�m����P�V9r����T.fx���lx�w���8����b)��7�u'7��\c9���$T�fW⩡�k���Ql�!���&V���ip�hf(������t�<J/��y���^�?�J�,aX5M��ba0b�d�"%Rlm�c¤�� Zy|�D�x���GN?�WuS�w��t�����uW�쒛�>�{q��f�4r�4T^4�]?����ͺ��;���K��D5�^����5C�A��B���CT*{��.��_}~�׭m�����q����sf[��Ϣ˧�~P[ͺ��w�-jmXt��1�0=�����и?�V���'�Xs��5��,���q*��x�2c�=��F�82�N�3WY G��b)�ܑʠ�}�����%��c��D�x;JYILD�F�[E�Q1�)��"	S7�[��y�m��$S�q���>!VѤADeZӔ4�el�P,�l�%�KX��N��0r�\?����fh�"�gf[}^pԊ�"̘��3��h����՜�VE߮>���{\�4����ۧZ��dsW��D̾�-h�a���s�$}A~��x�-��������ӱqA��-���ߜd=�\�_zB�cKsMa���ն�T��4�E���Ñb�^��G6��i�;C{��h_p�
^)�Vx#�i�XP�Q��e�@,�H�6�e��:��z&-�@4Ma~P�E����e6�+�G�u�o�Vi�);���Kt�D�1KA�/ۊ1�i$G[��C�e_V�15:�%?w�ߑ#�d�JnҊ��ᮤ�ެ&�g��X�Ž��f6��y�++=F�9�av�\���;���Y�ą���e���'�O�A��h�*�֨�T�␮4��u�*z5����{��\N��š��b8��C�ޟp��OP6F%��cg��A;P�����x���1liP���@��w~�N�>��Cz¶�x)��C�h!�2Fx����bn����6&�=�.+�v�6Μk�5`!�\�~hx1†s����"?ۨ�q�y�����W^���P��g�x�C���,`^��h��;-�/�>0?w�Sho��ս��T�Β��H�C��h��;w�u�.n	��9�բ��Q�S΋����h�.3�3_��j�7����}�ᚎ�׋�,�l6إ��G$�V�{M����I��=��J�a��j��pR��1׭F���,�()�9�C���~��ȏ�I��=n恍�5��[^�r�����������LWH��E��$���<�Ya/��+��C���9���(7�d����/�C}=+i�;��$��&
	=��]���
�T�s|Ʃ�ނ��ݻk׽�E����H8����Wt�q�?�+Л���t� �|�<'-�tt�AA|=��&�a,8�o��d?"���Mj	�z��3�b�zT���eCU�XU
�nQ4u�警b�;���s%9%�Ιqebfl���8�⭙�y�X��q딞�/U
r���P_���S-�FΝV��˲��E�֝��'չl���S�usabb���8��^O�
�Hʐ�I?�y�j����Ll�N��pN�:��b��l)y��7g�<��}�"�c
�x8�|k��Ydd@��,�-&�������2B3���1�0�������bZeQD�	B&�HŜI�\���+Y��Xi�����Б$k�<�W�A����g�3w�qE��ɛ�IJ���TT�T��h�b�0E�vhZQU䡂��/yH]�GZӊ��BTe�tB������h*�s���Vy�b4N��W��5ӋÃcxo�Ά}��g�R�0-�l��ma>}��V���鋤o���K����!ÓM@[��+�F���_ۨ~��j&�>[�T*sk�����Do_�(�$�bZvb�n�7E!Y�IRL��Ѧo�D�kT$!��Vshu+M�"?=��&
����A�U� TeU�UOu�@��a���F�H�ʨQ�L8RY�'B�ރl'�,�ǮB���=��HQr�U3V,B�V
n��q{��I����B���T�Da�÷Pm��w�
���{�Q/\ʡf{!�XD5��%q��k��Ҿc�)�F1�'��ɰ{X^���eLG�e|/�~�2-����K�,��Q鄢�#��~ӈJ�� E�o�YA>������LL�%IF)1�`�G�Ŵ�2�t[J�
�}}�
/^�2_G͡R/3c��b��
-a-ajA��(, ���-�|B{�6P��2�"��zm�x�@��S1� ���Μ��[����QtDV�<�@,�8�4Pe��쒡v<=9�ˠ#P�Z�f��K�sI,�;w�O=�˧T	O+U��cxAZ�,��e�&i��{kc�u</"['�0�-rZ����h&���XߗH��QS��3�C�B|�h�H3�kF��ZD3"�\��jd,����d����V��[*�f��o�%��Ϙ3�
D��Qq���;Ѧ�&��������ʗ���?�s�e�g����F
C�A?�
�x����2�Y���uh�gEs:(�5�")1�L�vK�Q���[,#��UX�GL��OLL¨�na�rI05.�4����2��JcI��,t���y���T��7���7�U�rq���5eK1š�"sK<�,,���.�ruĖXYz_s���sT�|P�X��8�&�u��0`�!��w�
��1�#���&�p�Y�zlzi��J���j��=9�M��ƛ��V�_,NE���F.\`�ᛦ�R�9�>�w�O/�i�����Z�eWw�pG����mF�Y)��Q��g<Lxݱe���"/���5���_r��>����Ξ=8����rV��MP�IC�;�f�$Տ�T�,�n��e�;�-]oMv��w�L1��y�#��W��|�'�u��B!���9�/|A��;���~��(�؜�6�C����9�"�-ANjr�����X?=	3"�\ �[�;*�R��Ћ}I�	����kwk���<cx^NOf����ľ��!#�p��:*j�#ksG-]Oa���+)E��Dt*��$%�U|'�{���lS�������Τ�������s¤�%y2����|6_l�7f�`Q�{y�:_EjA�d�����U]
Ƽژ�|7��1ڡ��z���Ue5�X����_~Y�ς0)yU���%��'�m��	)CB�f��V��
��{�r��,�{��Wàx��h��4fj��}ȏ
���2��F��Vx{�$��s���*��~�3G�¬�)�/FĠ��˱;Y`�[ЊI��1L/�1	��t��Ǫ����N�Tm�Y�K$�HF���B�p�;ҮAKe�f"�z�j�Nz�DL2Y�Wը�D�W6��^�J"�f�-�Q�С4���"�V�e ��l؊D���E��)�J��DU�IemE�:��њN���ђXIB|��TT��PNV�Rt��Y6��`�;�"EQ%T�/���Q�[�1	}�]�Z��"~�[hK`�Bt�̾W_���@���Ƀ���a�ۋ��������ҋ��Jh��<>53����F�g�\��R�!3�11s�a����=��{T*Y��ES8zځ��e��3�c�I)��N��c����O���q��1-���5M�x>�8Y|��F
"X~�2��,K�0]Yﱗ�,��AU���/�`}o���&�D��z+�'�S��R����~�Kp��ǽ
�j�k��
��aR.��/
Fn<�b����*J3pۛ�{]/�t4�7m+�c��j=Q�a=�:kC��/g��������xSQ�s�3��,�ui3gB>T@�� ��V��q�0�K	ǔ�0������(��
I)w��qYvK��y��nR(�У����ǫ3tp��5�z���$���W�A��L���l⢡`�2^��a�'�m$X6<4��18*f��&��Ha������an<׭g���u�遍�%�ߜk����c�(�b-�e/P��Q���4KW͗���}���A��}�p�Bb�@�Ιf<W!���tj��q�����>�˲Mʦ)'��,���������I�-�o+
}Iar�֣�w����\ sj�ҷ���q�\���I���
Ơ=`dd!��l������!'�����}�#�N9:�_~�tm�����X2�:��W�I�Q�Q��͎���y�B�!�8�3E��u�;D;����z���J"Kq��C�dU�%��6����C<��sh����$F���V��|��T�D�l��[����	I:1�oA8��z'�v��*`�oېZ
�=�R��5ep{�]Ht��E�/��
�i+͝Y�t�k<v-�=@�m�mo̝��ɠx��wq��6���s���\|:�;r�o^����4�a8�:lԀ{3"�K6��[�H�ȥ�H�I%�i�4=Ͱ�F�$>+.8���)X8��;^ ƌ/lU=\���7t��F/��+F_����E�����s����7=gc�|��܁�i��ON���'_2=eJ�E�3�x���<�䶅�,J�����,�c%ɔJ1
���W�t�D���W� S^8Fk��!�[�Md� <c��sz�Y� Ti�<EG�9h6"0���vr�qp'��؎D�$h�f-h���z�e��]c����Fk��b=^h��Z+�`�S�x�K0}�_��;��s��P�}��YdW;����ct��S�ӑk��.)Jf�
4
@5�S��*��rD���l?o�����ay�E�M��#�W���3���ًܲv]Q�jI�Q�&I����+�d��o@��7�3�(�=�G��/gk�\M�=��;���E�.�uE�c��TދR��)�1��Y�"�ԚmR��1�v@G	%Z�"�
L�;��C��h�-ϲ[=	�T���ԍ�������������pc��A���%)��LmW�&��2���K�rc��"��6��|��i�h��u��{
�����(X��U�j���q�#{=�M�r�u���@��Fm#��~|V�� kz$�����H�R����^(��S�W��r�j��P���)W�9^@�1]��h]�pz*0In�3,�؀�bJs�u�L��«�V����r!��N�:2m���ۚ�pK䓟$N?�i���e4������LK>�˪��vcr\��:ؑ��N���]�^��?�}_$�Mn$M�|F:U�9�a����<����6��5��4�mXB/7L��1��YX��V�¥�8��Q�VO��
�_A��Z�d�6u�ө/��,�;�F�{�Ŝj�t�:+�+��O
�g��ݥr*��B&�FH��y1Z$,�
B��,#���tp�l
\0zBU�{���.v���8ڿ�z��b֨8zH<�&����s[:��TЍ�z
���t�>t�-w��h���k�|��6	b�5�r䈂̕J��5�+��<�Q	�.i�u� �Z^�L��i_Cpѹ���ޫ$��؀x#`:��&����3��>/�����YRo�U�3r��p�sI�av�a��[s�T����[n!�jU��$�V��I6�&&$�� �����=:����܉�цAn�4G�2��miV����u:�Z���=�Y9bi�fu:lv��k���0�d�~im�F`[��!þ���*#�=�^��
���M�,ʼnL���E_�F.�����q��̇���w#�Q^���W����sٵ��cT?)�S�.[�����C�xwi�Z!2,��a����7..�W��0�R��5�R�Ǖ��V�u�Qo4ut\q��ډc]
�Ku{=���/<����"iUʧ�H��
���]�l1����<?��g�0�����0}4�	���3����3��Xu��)+�JU��u:Z�k�(�ŗ��ư����Y��g:���N�z'Ī�h�j��1l���\Z��%���1�p��٘�6_��pɸ�����.�Q�>��a��|HI�F���X�ާ�1_A�ӥۉ���mċh�4KʞR�SY��Ύ+1e�,]��Z�]�i13[N��;U����g����%4�8��ic�}G���
��x���Vq���l:;@զA����)�M�O��t
a���G;�A��!�.�.4�5�&qk�Oř��72#UY�'����D�A�&�&��u��T����5�$Q�C"�Rߩh��{n�|�+E�cΒ(面~�ϋ�$>���>������g}U��?'�h�["�eED��"Y�UҔw}HU?�El��h�m2�[E���g�
z��?#��.^d�7i��%��X��v�A>&p���B���]Y�`��	Y-<�:Ϩ��8�St���?L'w��?%)��V�*�~�E������*���wQ@?O�˽�[H(����.s�?�8 ���M<�z�U��5��J;��H[��$ذ��K����9mD�wY)��c�O��VT��lֳ0���1����`�:�`:1�Da�'�@ �^��[`���`�`3pk~І��v�Դ���G"_�'�=V(���F�Ru��|�m�]��k�$+��G���j��2]ǰ%�p�5*�<d��ɉ�89���*�tuՖ�hR�ݼpO���䜬[�i�J2��3�Ō"䆱��c�;�C���Bh\��l��6YT�E��ї�b�p*�rY�#^W�hry.�%?�d�8�G�{��i7{��yuTK���q�7�d9�� ���d-R���^;���q��P�_`WX���'\�-�����n#_k/�������3�~����Hq���>cF�U�1��n��~��jTы2t��B�\�̃«���D��2\��(J�T��*W$L�݋!~���CS5�p�O`K�gKD�B�mz��	E§XeL����[cU7u��8���`sz�X�m�K��IJ��h�;
�Nl�j�Һ-��^DSŪF�����B�ܶ-�.�xr��?�m�I4Zż�(R�[[�D��W��l��SUQڌ=;�o��A�?!�)���� �mHS�X���V��[��>�71}���]��0���#�H��fbmҗl�	[�_U�שL��Uu*��}�0U���hmL��1:w����	��v�Sp�4-}�Q)D[2�w�8��DBW�QU�]S�Zۣ�|*���q��<���� �3i��Y��b8����
��4�g{���k,�C�a�ܴ����/��c��tEU��0̴��H�E:,�X��V�VR�B4���C�3l<�� ����g�5s��MWZ�%�ͧ�X]%YREYK�cH�GH��^��-�{ �l�4}N��c�W�k�U�P�3��9m���k����O�8}��1��I��0���\�Y_z���c��0�iE�6͆��T�@��˾��/Dd\��^X��PA�<������ޅ�W|�
��zFv,5��0�m)-K�u�{�2���|%.\V��)yfF��R�Zo,k�:++���?�}9#yL_�&�������{�	>+�����5瘐\���=2<�P���Q���
�׋��Y�F�������-�jӯ�С?���e@��CIt�O�FRq��8�����P���+�:�ac?_�)>�۴�G跾ŏ~1�8��`�<�ݵ�r�1pZ�k��KB;�pe���I��i��(l�
4�+��>X�:��^4C�6�#(��j8uѹp�G>ӑ�uO;�n���
�C#wY��NI��t�2�X�U��5V�)p{��¾/-�\�x@ʥڴ؆�y��ZQ�����f�������7���Q
����5dY5��h���%�Rw	��4,ݏ����h(���LY#71�c�M�;���G� aU�5_REO���т%��X<N]�[�|W<���0�t�硇`z[��$6��ڄ̺��Q{�aj�h:�-��@�|���+KW�m���h$^N�$��q�{9���d������ ������Y�lIG�����N�G�S��=F��3���F�>]6N3��Vo��<z#�fg�HWѕ���:87�<�H���hJIQN�Q����������#�����U����,E3��<�V��͓A�Ūi�NT�8�%�r9T��<*��b�5��?6�a��?��=���Z"�Y_Ge�Aϧ�
����[��F�_F��w캳���p��4<��a|�ԩH�3g���k~��&Z��Ƈ�Wk��":l�	�������7��E?��K��
t�)�iB��\�����`:��H���K!��µ�x'v@�r{�q8�f���ְ��$ND��VN�嬖&`�����y���t��EktkB�c=a�47�o�=�7��/�Q���"c��੆�~�qN-`*�1��@�о�82�O���VSf�LV�'nq����8WԴ"L��z�w��g�N5�v�XZ���TN��1M|5�b�8�pW[��8mO������"k�k�#��Z�Kz�|������$�B�h-9��jw4nl������0s�[���n�� �f�,�X�"�&���:��G�db[�04��a���]���.���O��N�U-��s�G����_�o�A�w|$��۩��1k�>�K��4ޝ"����f�JW�2�7�30�/��.�/���kݝk($W_Y�+���kmg�I*�<l��K�ޙ��� /,�G��d'r�iqi�Jײ��L�ޙi��]�-%˼��"Ҩ���y��#�����O~�I���b\�ի�����o���A�k�ܺ�ԩ����-kb²�7Ar�+��d:�҇�3>��3��)A4:ӎa�D!��F!;���؀��fJW��5�l��,C��Y���T�$�(�)e^�E�J�2�zʑ�Zeꪉx
-����2�e����_z�������E)a�����3���T�K�������N�W�>��b�� �נ�F�A1D-�.=��*�\��栥z��(������.A�W��X�*+�,ZI���e��,Ӌ�z��~���ne�bu%x��j=&�!��&�W�I,K�d)���E2~�[�X�B��#��,�T]|��;E�*}��q�
�f���^����%0>�vDSz$��s�¸�B�|�9),?`� �T��/^��!~;���U�W��i݁����!�>ڕ��.g��p}����r'��Ey���#�^s��R8�Y��\��ޙ�r�hbc13z�fY�֘٭���ؾ�-aee�LC�-K�ף�ꤥY�����EɌe"D��vϱ�-�<�H�;�
�R:�ء�r��R��>\�8�˶�j��[T�8� W?���w�����r\So9l�*�	;!kK����<v�H$p�|�ۺ��	�#��)*a������0fO�0� �dp��2o�[�l�a���{'ݨ�n�/l�K�P&���B�����:�u{W_1�Ci=�k�#�IΦR��j)�5"��~di�҈f��/VVWVV/p
�
���>$<���1�BR���^�����
�A���
�A,�b���D~��|7���Y+{�;����g�,wҁ��L�;Ief�(�I+v�Ҧ4+b+8F��-�6�A;���^��r�|N�(��Z���{��Z���b�-(�ZMKk�
�܇���xF���֧ǰ���_9��dy�c�r�)��g\H
��0lI�k�m��MȞX�*d�{�j8<Ԇ�Ja�F�JȻ��H����E�Ʌ� ����[{K�x	`�&^�>A;Xg�xh�����'�M-�yt�%Y��z�H_kL�_����r�D{"��Sře�	1�׬��Ad-�O���L����o�Z�I�ik��V.S�`��(��\����;���xN�3�5V�6	c�_�:�}n��۞#KTC^[��!�7�>`&G�f�=b�OQe��(k��|��{+�e�c��¢�L�zDEb�|+�L�:n�EэD6�*#������,2��<lK�Z�e;o�A#�636�o�D��c���������ZԨ���*�n禱>Y�
*A�J55�=�e�Vo��u]�b���Ѯ�}zv�ɼ�m�7��2��ǘ)���Gox=�����i��E+D�k8!�9ZAX�3�~`ȴ�~j��@�a��a|��|�ʩ�h'�$O�?)��n��$�4;�}�ͨ6��̨��s&�Q3��c	��,��S�Ě��vџ�'�JV\�.��D�8#"T_A���>QK
Ɋ��c�g�c���Y�z~N7���b&;S���m��dv��µ���ݛ=���
�=���`���%�a����"sP<�t.[�)^�3�t�>�ub٩�+�4yPR�(�Yי�N�,ETRy�2�1[�
H�Պd����Le�33���ꝺZI#Un!䖓d�ݱ$"]��r�����UE:��Џ*��@��	ܘL]���B���v���֗�V�lV��o��)�q����Y��L������/�_0��^6�9M����5\�
VhA��|�/�~��T=(�F��Q�}]Z�nX�!��?�	}̔�.�9����=�>�a	�e��
K;��ѝ�^QE*��`��,����#�[TS8(,	/^"<2�s~E9����ϒ�
Oh�fK�r&a�V�=�W�}�e�����%��N��WrU�J�G˲#���U�X)d�NenMǼj*�Ё��O.�k�8����
/ �r*��3�n&U�3?�q�C��j�}A����m�+����6Mj^�FBK4?�ƞ6#�>P¤�0� Ω�!'��[���W�H�WjV��$��LYV���BU��Q��HQ%S�29!�)GN~����VDR���$��+���c��>Z	>����4[������w�5�ĸ
�f�J|�����+DD,y�âH���,Ώ���y^)-c�<Ңc������A��s.��0~��m��h��֭=�o�56�����<?ؼ:�,�����:� ��7�;��Sm�͞ڻ�Ls�Ķ
,¼:}z�ΧM�nZŅÃu�ǧg���B~~l��傫'�Cb��X}W�����$�<Փܨ�<HO}���ӈ��jt7]~P�Ht�+��-#b�u��J��eF�t��Φ��e,��XEw1�If�����Qf��7�qF'���s��C,�I��� ��r��
��"'�'�/&�Bz�$ٔ�|�-�D4����dUUe��*��-7�Z�,���W�x?=BBD��DCr
Y���>���,]Ow�U�hr(�tY�pK�Me���'��/whU�AZ-D�4�-/\�d�����j��uҞ��a�y��h�\�>0�õ�q�Z��ǢWZf�m�3���b�lO�SQ���4A}�8�m��n��X�]ՙD�VZ]NU�m\�;P�j13D��u�][oL����XL�5�����2���\���aLX���N��G��g�AP���
�����+�3ŜjYV�8�p���(�L�j
��5@�ꊉ������Gt
ﻏ��پ�'���<"��ӢMU����Tt`w�D�/9ڂ�ja�lɉ!k�
.�`���[7�\ڰ���z����N���s��װ���Ӭp��\�0��d�I�~|�'Y��u�7���`������c�75���+���gp����]���\�ƚ|���4�D���B<V��ICG��|6Ȱ�cuB3΂�<xt��C�Xx�ҹ�K��$QN[HEVZ�����H�NM�����DK��q΅�Ʀ"se$t����MQuONJRRFD��eY�,Q���s=}yݠ�����p�!W�X���G�jsp��)�j�ǹ&*
�Vf*��X�S"2�%�8Y�u��ݓ���b� 煮�,�C�-��'O?rz۶���x�b�0�4�p�X����w�Od_y��L����M���Z�@�Z�g��ř�
�v��b,Ct�ѨfF]�9������f�XO��`-Q/W�(G�ʟ�����]~���'�g���c��*�ئ)F�9����a�?�=��V]_��wt�/�{�fb�����#*y��&U��q��BRMȺ�4%�.�b*��֛TrTUSIJUύ� 6��˴}�0%�
u�	��!c��Ȁ���B�)�Ķ7W�1u�9�*D��{��E�=����0Rz�lV���3FZO7T+O�_�Jt��b\�S�a�@]�!9��Z��OU����]5�?�,�_�ں/T��"�<$�;�O�x�ܚ<p�-0[�ʭ*D���mp��7f�}}VW,Ê�
U��д�6L�fP�l��bӞv5�ۊ[��k���mT`��WkVQW���6�7����zѪ�%S�3Q#�7���Q�l:��Fd���{��H�nP���Y�C�B�����T����90qB!�'�,4&�"b.�ƮT�^�\<T���IGw�^5��xx>��G�K:�����������i�	�Xї;G��j�ۃ���9/�/���H�A<� �H�2� ���Ԥ*M�Z�K���ۨ�A7�`[�3�Q����<k��@�9*ê�C�6�����a�*$3q�v]M�g~�2%�i���y1
C��ݵ�LَL.ϥ&#qBv/$�������djny2b˦�-$�8-�Cs�v�P�q\�	7*.�N2M:z���I�?�LN�W���t�vc�8Z*}�֔&#��H2)�����[ϦSjT!xw�����Y�x�y��)���+�n:��6��	��]�Y�93�!�n.�d���r�z
X:7�+��q��v�|	���Sm-m<�Q�^=~�-X�ɩ��E��vB����4�́�AL����c���9�o���*���
|�t��/;E{��ZE!r��#X���,/Z�}��\.�AQY���|�N�]�y֮~7o� ]9�g�E~e��B#��F܀S��u����.?��B\$��#�l���Օ��i2��qac��юM�=�B����簮-t�Ry�0��@j��O¯�ј�PU�?���P՘^ �D���h1MM�tZ$��T��O��t<ǎ8�;�������來m��1"�F"F�o��e�Y0S������Q9�6R�	f;����j�$��c5���=miﲝ8ĻC�mwb��Go��.ߞa\5>GЅ��&�KA�v~�a(���jL��^S��l�O�.w �?[TKr5렲�4�`���ۗge�i:"s�b���D�lU.�ų����f�F��@9*�(�L{�DŽ��#|,^0�C�9/_�
�
ȦfM�aX���7��5[�`#K3�xoT�G��\F �@b3J����% �}�lF�?\�Cy�1�߶�V�.���zQ������AE�� 3ݨ(�fd�+�F����W��J��*��Mw�'�1q���gF��a��4kC}c]�9	��3h�,��U;4sV\&ʾ����u�7��.���9#�b)IE��h�Υ+�8�)J�0o�9[_qL������V�mu�2�۽r�찦��'B�4<e8�r�}U0��a�G�k���Wn7�rK)�P2�)��^w�׊Dlܒ�͔H��U�o�^տ�j(!�������і���|6�..���
=sY5{쟩.�=n�YEG�y�L�b� ��,�^4!C%���q��2Z��,ӛPfX(��m@8	�Jm����ʈCU�z�KXFes�|6���׽*���A[b�?�#FЯ
n��Z���Ie�������]1iڒR۫��f5��&���{�eڅ ��F:Ϟ@�h��†;��s�^��}�{f����	�9��nm��g��d͑�8��:�ۊa'D� _w���7��%�6�V���
a�g�鸸G88@�n��Քy:aV2�x�� fh=��l��p�b9ʓs'�0W7t��F�r��^���6�шYD�%PѲ9*�jv��`S��Y��"�lɚ,�\6����V-��X��"Eh).��"����Z^�45�K�i&��ܗ�3.E#�6E_�,K���fa����zxK�d?��t��=Z��؃�if����V#��$��i��DǺ�_Ked�
�7�h3�+� �a{,t�=��@4��'0��c�9U�Vį���׈Ǎ�ud���%�爄s�_��380���?^��N�����_��&�~Y��v'��=J��;5����qL��O��?��r�!����3����j���n
�p�vE�Di-�Hl|��D�]�ѥ�+v�X&����Jэ���ߔG�Ѫo���$m;�;l��&l�Z�Mx@��
�s<Eq����#�C=�xs��N6����Ī1�8�-�
�a"�=(M_@����.m�!���C��$f%��d"�E�N�zE#�.�"�Ѕ�F*2���"�����V�I��v��hRꕭ3IKUb��N�тiL�1߉����z�eHT�݉��%b]��$I4�U�T��`�(��eM�aBEM-��Ա���|DN�� u�)Q�b���J�v��1�}˴�)0����ˣI ��zyu=�N��_�Rh#��o�g������<Nc��x�u����7��$�=y�u��rZd*f��0{G���=�ձc�b��Gr�|�)����	GJ�w̔�-����k���E2�y�v)��]M��Sw�2r�]��X�~ښ�%�������!���0�f��$��kT�E5&��#�W��T���]��X.Uo)��U^\�kE��+R�d�t/�w�I���/�Ź��.pF�#st�A1f���y	WA�ރ��@I_hrx;����Γh��Rm�Vm�B!�*{�� `O�g��y%$��[}p�DH{NsQ$�Vm�W��%���\��5�<
d�Z�Q�"��a�ܟ󋻛�B"��f�a)Y��w�)*�7qbἬ��"�;gd�7�w'����+��J�s\0�gӭ?�4f�ixW�\{a00p�@���!�{Z���>�'�3&�$S�"�Ҹ�ƾc�Ne��E]�^%Ce!��#u��Z��,J��d�"��ɹ�ɽ��`g쨬/dd��C���A�ǝ�.�$&�&�.�{����h�%�L����u�Z�E��Oa��Ư�Ɵy���X$>W�/Z�ҀA[R��B7��@t�ʐ�����{d�ƽ��P�����BD��c�UG"_^Ρŕ��-�V��V�0�qhGt���g��[ꬡ��j�����Jݼ�۽�k��p�˖���ea9f/��ܩ//CN��������u��X�LZ5)��x����D��԰��a�ha=���V���;�Hww��~`W��6�jm�Ǿ!�(ڰn@o5Xpwƈ�Cᡂ�cr���N��(�y^��ɪ<����p:��z��*+`�q�t�-����):�%@2�`��`�5�]�O��N/�1��[�֐Juu��M�@�AX?��ܠ���nyF��WOJ6�Z�5�ٓ��ۯhcI:�&�O��m:@-La[:Y]�J�$�;D?����X�g���Ig� K���
�N>��,7�����B�2����Kl�x��,?��0 �trR���W�1g�^r�p�^�~�#2�#�D�ٰ������?�,�kew?�E�ۂ��"���~�N'�0��-���(7�m��0��׆}�8���[��p�x#��н�MN
0�nF���=_���l�1�̸�6#�4N$:���د0�&�K:�'�Du�l_�����|w��O���H�/����O�P�	 �L�NJ��.8d��4,Â�������=/�s�m�v�P!W��.��[�຤G����rW��T
q�n*�kA"��W���v�f!K[j�}F�'������h����t���ԫ�V�`R����*����K�H���v���5t�{Fo,i�;�>x��>H��{�?E��ߢ�< �(>#�t�!����g�a���thl�$Nӈ�c�|N��b�l��X�JfeD� �4�¹\�:��),z�70rX�(ʩ�^ȩ�EG.��>�����4����ғ��=��.���2�w\��`��/�E���܄y��f�C]�/�,���B�G���j�߃���[]f����~�������[���`p�6;.�Y���Ӱ��WlU���?��*�\e�..]���5�kp!k]X��ua;+V^��\�oC̱���]�����q���6��/��2��Y�U	�kX������T|C�`อe��W�_�Vi��f`P�ݘ�n�R�����R�{-B�m���E�C����F���엶}���4����Bw�uO�=�׳l���N,:��~�1�	
��b>��U�ߋ~{�0Ç*ې%
&2�E3/�X^(�T��a��I���Ѱ�j�;}4P�[�>�D2N��Nɒ(�
oϵ��Λ��4w�0)<0�&Œ���8I�_��V�<�[u�l9d�	�%�e�v�F"_0�~3��	
g5zw�Qs0�vٽM����݅�b��j�:Lw� 4�����d��ɔ=�6�ngw���=�����\UI��)ˍ��w������=f̟�r��s�#�2���zn�fY�H�����~̎�N��d�����t�Ƌaݱ0O��T�b����

�

��V�"sR��v>O)����xGV�r���NPQANZ�|��z<�Z�'����2x��]�N,�T�5ft�
C%�eZ��9A>��
�) {X�w�Ƽq���!��p&�Ep�R��>,�A�rm`�f5΄H��y�!M�(S=!���{[��I\�c1Y�7Jw��D�-ꆔ���o(S���5¢
>�r�>�;U�@G�;ԭk
C,O�����w#Bz�%F1Pt�W�8�"&3k7} �~��T�%R�x�$��ï�=�8�$�l��ؚ�-�F"����\�D�t�4�#剨�e��H��ޤw�!��c�kW,��?�6�_ۛ����\R;����,jjQlL�@N��Q��#e�漧:�Դnm�w�J��}�.b�E:�����ƒ�c���+��~|�L�2DF�Um5��,r��E���3�C��#m̯��@�մئ`��91�`�,*�
H.�Z��x�ŬbuJFo�!�O2qg�h����o� ]�`K�_b��W��9�I��Y_PǦ�F�,ZNi��ɤ�z��{��l�V"�`��ʊ"jd� b�� ܗRf$@h��,XF'���b����D�A%�s�\�s��Y*���+��x���Sa�"͌l�V�F�C+�f�e����^����b�Ș����T�'������u�ғ�_(�'��x�n�e,����e��v�)�W��{L�p�$�S~=���Pm*�I�j�;&'����rw���@!v�^pY������|���XGo��A�|�١?�i����@��Τ�G�o苆�Pf���B�ǜ"���ߨx��C���0S��~�渲_�)0�i���jC�^{�ע�uܹө�"�T���9�y�.�\oOs��᳈
��g����%�\k���p��>a��	�v�P~�H��0Zz�x(�w�Y��7��y-�H_]!�r�8pT�D-�v�n��|�۪�O=��弑3Zݹ���]�s��F�kwO��h�GG��I�7m���J�}�׸��}-����}�z�;=�8G�i	�Ke1ޮf<��@��ƴ��J���E@���ES	F�p���HX�-/����k�⮛\��:[&6QO�"�Qa�W��&۬�m�r�C/�Ƚ\����_{���'��K��7�t&v�3���x���ox���Z;
��K]_ӌ���z�����!�Ĺ�G��i�	5�衊7�b���!Aϖ����{Z��-?a[���x0#K1�Pn��T��Jn���`b�����+���:��G3F�Q��P�G[�+f9^,�����%j����X�dbDOU��s�_Ԉ�j3�p���k��J��p�(l䨄���b�`a�!6��D�/���*���ڡbG
g�\Lo��v��8��	� $2���8�*��p���"�'"^$�h?���s;���e� �-7��%�s���	��,цZX���l�GJGS�����\e9�hUy�
I�_�>:~;��^G���Ӕ��a���9���ĭ,�4@�B2ڹ���"{
!�7S�&xZ|:$��U�����ߡ�$��2��L�o�2x �66Ȭ�^�������2�hy㥆��*Iw\}ݽ�jԎ�#��3�6ڋF�p����#��犾�G���(���{��#�w>M�{��-���EwIC�V	Z�m�W�L���?��?�]Yl����ٝ=�Kr�\ZQuX�D��[
%+v����B��
m���r€ۂm�^	�u��A��Ҡ�z�H��$E��H��&}h��@�>�})��M��]R#�
����3�3������"�X��hL��^#O�.z.�>�_Z^ʃՇ.�	�y����̞�FQ�)���G(Rh�A:,$���zid�&썽m�r[�"��%�ԗ��唙h���ԷR6��ᡍ�	�<��OO�c��������\�%�=�UvҜ#�|OYD>0�;X�:I�ɱ䟭�PJӕ���
S(�b���v(�,tk�Gn�ZFJ3oRb�y���3����i�ވu���k�5���KH�+��ȁn$��P�C���u�u�2]�։��t�a�R�w*~�����zv#��P���+XW��f��3�(* ���
��ű5��C".�OW���y�d���dPb�/*�q*��ed�
T�LG�OTBPw�9IL�i��1����G�"K{>ȁ�@��FF�w5�3F��bw��
uQʥ���Z-���Y|'����y�W�2n'6A�����C�ed�n�,�.c���O��	G��w D��r��[��5�T��~�w��fIl
�Xؠ��D2���s�Y����H�.�_tkdAw(�t�c�	#
�������=b}���fGLR^�-��.��8�<�7ono���Ù|	P[3-V���7Yf�xfA���1g�0uK�c�ĉ����Fq�(8Q!VK� �E�\b�7]��z�ٻ/v2�s��3Kh�G�N�tl��/�a�x�!��.�.�u�ҟٓ�e�C��D�5������胝<����Pw9���6切bZ�8��#K�>���)�:A4it���gNk@�иx��I��۾>+��
������y��=L厧�!S��'�3Ǐ˺t��х���T�|�����O6EVD!#0�X&46��#~�d������E�l�a���AF�8�*�����/r�yA��MY����Ϭ��W��䑍!�q]"��V��^S�Ҡƺ��;)]̹+�#��u��|l/c�=M�}��ם�O>Gx:���)e/�\_��J��It͖�(�=�+GՄzT�_�Cx���l�7<=\�o.%�����;�-ޣD��(���rO�ka�d�8�������K}��v
^gv��
�Q���2�m>���a/m���L�>$���v�327�CMְ�`�t�E���
O͈C��'��� &�#����r�H�V���_��a�c
;���{�|���{Kj�T�H'�4@�!���LC��u��Ѣ<K��Rfm�QT��+0���Tk�U꫇SQ�&���`��3{�-��%�y���m�o܇��tf>��[��|�-��έ#���}y�}y���@��5�?ܺ�ۖo��U����Z�>�<]ϵJ�[���~n�o������n}�����Y��OAm���ݿU[��ui�w�������·��Z�>�it�7��_�a�iJ�'��)��	|����.��O�q�a��G��Ӻa��M�Y<ح`�<q��੉�h�b�g*�t�g���O�g�>S�v�n����}Ez6�W�(շ�8��.3��./�����2��!.&^�&��sM`��q�A5�u�R��N�|�.Z�j�o��ǵ0!E��s�Ȃ�nD&�nߝL�N�'�,�C�OLJD�vXB|<g�z�==�-y[S����d,
-M�`46?�a�ۄ�
o���T���|"x��)@��L�Q���Dϳ�9=Z��S���*�	��⊔����� �^��>�/$���U�*T�Y^K#���9�E�����g@x�2��\��F�g��
���Y�<B�1��GB�����{Y/2��ȵ攃� �Tj�� )�<��_��M$�o^��S���b
��u���!a�����(3�m�e6@��d�{�1:6������T�����b�76a���F%�����m�煺����j-]��(x�*|�;饯��t_D
΀8I�>�f��<��W(���{��^ّ�o�ˁ�VlV�r����\]P�P@Qb�!����<��?H=<z �p�t����]�^�2�v{����c�N�ڏ���>Be��Y��Nő�T�A�����;�+�0�2e<��;r!��!4�gsi,��Z���U�˥�"��xH�]XT��/c�p5&W!��1@���5<�E
��W� �O���B�"���}~�U�,*}h�� ����/��~��R?��+��`���
R��g3��ᣴ�8J�f�V��|�e+�����i��J����MO��Ko1��_����=-[�N��V?]W�_���~	^��OY���6�O	l\e��R��\�ӹ���@lA|XT�/�M�B�
C��=��L*��a}S��l��(�q~	|I�i�I����"q�7�:��[|B]-gë`�B~��Z�z�^�Vm�-u�6�"Ro��?TV
8 ������#D�E:1���b�l�����m���a�X��Md����t^PT��g
}�1�o/Iߙa�H�
�,����~���nK�,?%��*՜R��*Y�҃o�1�J�����ww����J�z�?�A��7C�}
B�g�ƺA��S�]��A�(���Y�|$[p��w�e�^�7�%՘w��J(@� ���a���g����;�ƅ(O�����r����]{��BR*�'r|p�C�}Q��3����@0Ʀ���cYZ� �:3c��\�sח#"������E�Rə��`q&�u$Yyيئj%R!Q��nH��B^�')2]����t� ��E56���q�ә���5n�<~]�':��X�h�`r��REKB�uE��ṣ��n�m"Bzw�N�#;g~���2b?H�7�R(Xss8�躑��+Ӌ++lS�զ�W�x3�^e�;���?�/i���w&&&��-ԥ�UjE}���3�_j(���ͫ��#VB�r�~�ޖ
V��Q�]5G�;�>x���ɢ��wno�̫Ӌ�yj[�s5�R��U�v'
�h��������O�e�j���	�
����>�wXh��`1!����4eb�g���H�L�ۦ�;��49?)�I��c�K|�p���8��K���۴1[8�zd%�Gl�z�<B5��B�@_
�ϼ��K�K{�Ր��KL�x�c`d``�:�l��'���+7�=�
������i*�Y ������?
�x�c`d``<�S�7@r*P0�-Px��W�m1���/F���l),�ǔ�RrN[BJP� Nl�3�seD�`�Kr��
��`��:=��e.�qZu�ezL�۹��;�C㻹��>Wd^��2O�$��$;��}.����Ql�jvU�]�����sͶi~Z�3�B"�^��:nHF������vј�l/(�}hMt��
4{Z��^��ש�v&�����-x~4GQ�c�%���x��ӵ:�XΡ澟��%�>�֮��Jš��j9Ԍrq��!�}��{�.2�z�c�%*���:x����Sl(����g�cS;I4^��p#�X�q�W�\���`\����	��y,��hmP�\�p��u�W��s8����M�O��m���.��>��u5�d�ޅ�:<�5e��)g�E|��a����d>D��o�/�_���_�X��Qγ�2�K����N����v����j{r���u��	8���?Ȧ&��O�7�<#�n=n�꾷X�]}��o6�=�X9?Q�.�l�|?��D����.�\�ᤜ�~�s�:�-�K�}���Gա�(VF����:�
C�e�[�_Ur��p?��x�E�r�g��@�}�4�������������v��gn^=��P�!��(!���M�w�5�����X,�(_���.�
S���5�\l'�n����W�����t��k��F��/�����%���͹���t>�%�&�g�ꠋ���Xݷ��X��ß��7�>��L��gİ�5c�g�g��~3��AΛ5K5���7x�{õ�!��:�)�j��C��~�`�Қ�~]�P匇->m���X��^ۯX#;�����J���M�S	�)C��1O�L�}���������S�o?�;@�&�u��qf�_ͩ�g���po<y���!f#Ɨr�0��=˘��z���r�k޹��\W��,w#��m��x�e�y����"��H�F
��IQIJ��F�y�&Mv�&I	�C�NGQ�!�B�D!D�8q��IW��ߧ�Z��ϳֽ�^�}�����^��HJ�l�5"-q���|��E\�W쏸��8Q`LDA�OE\�#�Y�y�E�6�"
��(RE���#c[DQ�E�=Q�~q8%�PWRϒx�<q�Tq.�r��
yW4�J��(�'�l!�k9q傈��o��P]ȯ�:�����+�X�y%���FTƭ���FT�#r�WU#�j��]�pD5��NDT�_CN
�jx�����ɧ��#2��Ig&}׬���{-�Ԧ�6O�dFԵWw�8Q/������������6����
�^�_C\�ш���s��&�4�WS�o�ύ|lVV��	�M�"��As�n��E}�wK\n�.vE�ү��ֿ
���kKk;>�3��;�ׁ���Do'�:�֙��<�·�8t��;�v�nӧ==p�a=���+�~��,�=�ғ�^8�ʋ��7����Kc_��ܡۛEd�w����/w�q�� ��%�b«�x
�o�9��}�a�w熫��;�C��F����m�u��Ѵ��ӝb,�c厣a�ǫ�k�~�v��.{�f���$O6���8��өf0�����q�s�<3̣1ϝ�[���ә�f��	��f�5K�,~�vg�3�;;��\��3�yfx/���|���~.0��.��B�<��E��Z��5K�.uO���r������A>�ym+`>̃��y�J=f^���8.��zŒV������}�SjV����>C�3�<+
_�3���|���kqY+�0�^Ǜ��z�����
�6��hF/��M�I��|܌�+j_��U:��ۂ�V����=x��_s�:��`����to7�7���[�ަ�m��4ם4����ޕ�����۽�Ï=��|@�0������}�OϏ�k?������>�.�����P��4}�3w�s�W��x��4~�ח�|��a�q�Z��y���#zq~�zԻ|�cz���~����<?��w�}/�{��|R��ˏ�O��?���z��=;�W��7�����~0���x���;q��<<���DC1F��$mI��"7����"�0'��J����"�DR��8�ŋ"���!�FR�y�Ab�p~���j�/�+�"r��>g���IQ}��/�G1�ŭ��Ñ�h/���*p�ls$���J�+"��@$�����'Ԕѫ��e�圕[ɕ�")�BF$aWһ�H*gGR��8�U�T�I5yլ�i��F!�&��;"ɤ!S�k���R�7'�MKk]8��]O�ߚ�>
��7�'xsN�o�׆45ҧѹH���
���D^S����T�ߙ�Y3�9>�WGrs�0�-"i�K�3����[�m#�
>m����n^w��ќ;�Չ�����G��.p����n|�s�e�����p顾߲��	���^�z��MG�ݑ�U�//���g�e6?��[ܩ|h��3�ད�k(�9擃C��H��s��c��;��#Ԍ�o�>�x0��Ѵ�1�1�r'Mc�K�X����"�`�1�����ߊd��I�&ß��>N�{�L�{�;2��3��3�<z�1�_3���:�s��\���x}�žo>��_�~�w YH�<Zd]��b^-����_��r�.��Aw�!~��{����<"�Q��$���	�p�ʜV�w��NOѵ�s$O�{��ga������ܡH��<��i�y��y���p��ˋb��]��K|xY�M�l����ۂ�������p��y��m0ߠg;��;�Go��a�;hz��r�޶����<ޅ�.|���]��5��x�[����>��i���{i�K���}���n~�n?��ݙ�݉O��8|t~ΧzJ�g�?�������K�_�k���gG���u��^�i?n��ܙ�y|��?�������?�_?�E����o���34���Y{���;'��r��?WE��4���"�_G��•�i�֑^�>�Bk"����_�s�E�W�ȬH3r"-�=�b}"-��Z�i���^n���+��͑�Ό��ܲeŢH�9+w2�+�,﹂�����J�"�\*ҫ<W�i5|����W˭	#�������Z�k7{#��_]uuFzm�H�ɫ�i�l�"��48i��\����8�
��𢩚�G���Y�޼5��"m��-�Z�����H۬��-�v���_���v�A��v�.`v�����h��Gg���xd�Ϣ���^��ƽ̾������~��]�l5�fҟ�������po�:�!'"�c��a4�L���Ǒb������<��;�>V�X���xƛ�x�&�2Q��f:�7w�ˏ\��h�̣�G#���T\��0�4z�ÚA���xtL���q��l..s��`��|��ݧ��/�w?My���H���b���Kp_�y�U���x�c`d``>����L@��`>"T�x����n�@����?4(��Y�Gj�ԩ�Ȋ�RĂ
j��:��X�3�=M�@<�,�g�X��!X�;W�A�)��f�s��]�,,��x"l��7�6� �@�p	5�pu���vY��={&��G�7�
l;�›(;]�-ԜXx�9���Jw��â��-xx)l�흰�g�,\�g=.�5^Þ�]�����:\�����MT���<����[�*s��	��"��0<�&�hq�36-V�1G���#Ntr�Fc��Ö��Q��0�1cwmR�ɔ��N�>��[n	(_��0T�z1t+KV�_�͈����=nm�=��Ϊ[��������t�֟�r����ź��Ts�p�Y��=��u�²������ŋ��Wޖ��x�r��Q���ړ��\Q$���԰0U��EF�و��znv��Np6�<42�̨D'W� U�POULG�h=����Kih��@���Ko�Rona3ݘ$���`ѕ;��ֿ�����.�Jk��d�ex�mZ�������ᙅ;��v8Q�8��q�af�F��Ftji��vȱ�8q��9v��������U�fw���TՒZ��W��gM�ٿ�~s���>��X�B
J�D[tDW�D_�P�ĺ��bK���Q�hq�8V'�'������%�%ťĥ�I�dqqYq9qyqqEq%qeqቫ���S��ũ���Z�4qmqq]q=q}qqCq#q�������������8C�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�}m}�k#qqOq/qoqq_q?q��@� ዱD(�����D,��HD*2��B�0���sqH,�a�`��P�0�p�q�8K<R<J<Z<F<V�-'���������I��d��T�4�t��L�,�l��\�<�|��B�"�b��R�2�r�
�J�*�j��Z�:�z��F�&q��H�Y�E�U�M�]�C�S�K�[�G�W�O�_|@|P|H|X|D|T|L|\|B|R|J|Z|F|V|N|^|a�$�E�%�e��U�5�u�
�M�-�m��]�=�}��C�#�c��S�3�s��K�+�k��[�;�{��G�'�g��W�7�w��O�/�o��_�f %I%[�-;�+{�/r(Gr]n�M�%���(y�<F+������b�����R���$y����������������J���*ғW�W��ȫ�S�5�5��ik箝,�-�#�+�'�/o o(o$O�7�7�7�7�7���g�[�[�[���������;�;�;�;˻Ȼʻɻ�{�{�{�{�������I_�e C��DNe$cy@�d"S��\�,�Y;o�Y�Zn˹<$�|�|�|�|�|�|�<S��֕����������g���s��<�x�y�|�|��@>Y>E>U>M>]>C>S>K>[>G>W>O>_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I^(/�o�o�o�o�o���������������������������������_�_�_�_�_�_�_�_�ߐߔߒߖߑߕߓߗ?�?�?�?�?�?�?�?�������������������������������������5$�HQ��ԡ.��O҈�i�6i���~:���c�X:����D�]�.A��Kѥ�$:�.C������
tE�]��B]��F����T�]��E�ѵ�:t]�]�n@7���tc�	ݔnF7_{݂Π[ҭ��t�-ݎnOwX���Hw�;�]�t7�;݃�I��{�}�t?�?=�H"��PH�&4��b:@3J(��r*� �d����iN�hA���z(=�N��3�,z$=�M������8:�Υ����:��HO����z*=��NϠgҳ���z.=��O/�ҋ���z)��^N��Wҫ���z-��^Oo�7қ�B���Lo�������z'���M����� }�>L�������	�$}�>M���������"}��L_�������
�&}��Mߡ�����!��~L?��������%��~M��������#���L��������'���M����5%�T��j��ꨮꩾ���u��6Ֆڧ������u�:N�NP'�����K�K�K�K�����2��r���
��J���*�SWUWS����S�5�5յ�i���:��z����F�tu�o��������S7W�Pg�[�[�[�۪ۨ۩۫;�;�;�;���������{�{�{�{�����������)_�U�B��DMU�bu@�T�R��\�*�Q��ն��Cj�����������G�3�Y��Q���1��l�8u�:W������WOTOR�'���������g�g�g�g�����������������W�W�W�W�רתש׫7�7�7��E���-ꭣi��~Y�Y�Jkm��2�ZN�2�_���RM�$�V����T�*���D:���8�f���6�FN�6�"����'������P�cv�T��$f�����,�Њ�q~H�:̕YdA���I�콓ğ��ya�6��<�S͝�;�5r]��A��طg���¿Q�<�u��	���2Ϊv৺��$�*\O�v\�I*}��"O��o�yVQצ���I5tb��J���|���jSœ��t�
qc;��ڎC���ԟ�~�� 3]���RX�J�0�F�҅7����/���Ǭ,��RPE�/Z��E���Eg���>��/�S���TC��v�����������2H�Ю�R���T�!4��Zc���8����ܘȏKCc?�e���kN�/�:�.�뼦-<U�>T�Y�
�(�1�� �S�ujO`-ڟ�nKMz�{���=:j�����l���-��Dg�_���K�%O;xOʋ���t�_NM]�L[���\k,R�E�M�Ԟ��`����z�W��yx��i�
^a��L��ϋ�dҫ�:WX�6�,�E�.��$:ͳ����=z�`�STg�*��d��/	�4���R'I��� �p�I��ތ0T��ain�7V�A��u�z�Ǿ��ͽ�ߞ�垦���]�i��u{^�T�ffڀ�So\�z�F;k0�>-�%��f�"u�2�u��,��/4:�e�m�vS�0�c�N�9O�Ye<�UT�4��p��j|������VU���	�o'IӪ�t�cu�5f'ڱÆF�Q&/���X�.�:��	�C��yk��M}���+
D�b�K�$>��K�S,��s���U��[wMW<Wj�G��Q�..�e=?Ń~�v��Y\
&�z9�yZ�ݨ�"�N޲^����;K���,�j/��#���Vl��������P������R�s̽����ljn�1�,t:�j���&���Ru�p���6���K<\���4�Dq�蕺H��d����Z����#���
V��+�205,�e\`�뱓��y�ڰ��X�X���;e��^u����X�!�]��Dg	/��%�x�QG���:��.�|�g��c�˾v5ڇEŅ����}`ˮ�����]hƒS���e���Fa����-�;��~�ƞ��طG�����=��"�#Yq�p��5�Xm��?���mڶy�ژ��.x��I���|�%��.6���Χ�W�V�D�8p#��R�
�A#�5����@��T��Y�U��i\O�N�x?̫e��GZ'�X`Bkd
?�P�������\�:C�%g�>-��n�)�h1��Mh��%�I�@�w���q8�`��>�P����p^ؼ��"��0�˰o%��N6�Uf�6��K�
�b�ѻv��܉�>�.��&�M"����*�6x6�w"�~^.:L#qc�$裄U��9b�7w$o9�tܞ����j��YK����^��ƾD�W
������3#��8`2��q3���踬M4�e��A�D�2��oH��i��ԯ�)�%����8vK0��FIntȋȋ���3�X{��K`�F�޳�Y�Dq1���hp�
Qð�"�`I+L���l�0�>(����Z[a�A].if��c�Ɗ�3:��7�a�O5r�]�׌��3=Z���=Z��t
���B�0%L�g���[ɒU�� ��乿��
�/�	 &��e�jv�a2��T�����ӢZ��F;n�P{�
8�03�� �z�ԙU1�q0[���t(���Fh�0�oDy]�L�a����vU�@oG�Y�����[��q&�
>���ć
�M����]z�yu�t�j{�C�y^�w4���]�B��8�8��=>�!�4hh�5��,S�b�e�\���Ɗb;<��f�d~�A{h��-�E��Fa�CC�]��A(��'b������3H�9ٷ��0�-qѳ�\��
�u��\�'����vQ,0���`�!�2��;
�v�n��8�Xé�ġ��Y��H������ڰ׈��ˆ����kk��t�DmF�_�!�e�1�|bL)>��=ά���`C�,�v=��sp.>��8a�˳n��.`6���I�=�`���>�|h�I47�g�^��@�mC�a��E�Ug����Ѧ
�1�3��fy�m�Gш8�Ro7=�q�aY�p�ыV��w�X�_���r���O�?�c�~�&,�;noK���za�S��i�����(�\�i�p��D�v�}��օ��l�뻥����k���wWvr*���ܷY�cV-K�L:���w��}�q�ج�3)��`��?��H��ʁ�{�pI5b��M<>l8T�ч�|�8�I�z3�G|8#ѠQx�N�Y��̖��Ҕ5���Κ��Q!( Ӆ�$�w_ޛ���J��)��+����q��YQƀ����f� ��������t�v�qH�P��l��rC�к��05"�ƎI;H_��+{a�O3L��0�[̼#{����	��qMߛ��5�7\���2[�|G1��kЀ�]2�f�I���U��d��/��¤����A|�a��#�>6�p��cҜW�cL(u�Y���ڎ���ӛc"f��y���bv�/���-G��F&�_i��څ�(�t{ߪ�Y޵���6a��A
t£~	��b��������E���S�����e<�Yt��]�uȖ�l�dsho�m
1�e�ိ�ii����q7�>О%"�K'tW��[�ו�f֜��9n�O��*��JX(�*M���M���²'"|�*k��5;pq�П6B�:2��}{(��{�\�a�X���m�xc̵l��^Ł�=O��'3�*�vE�(ֆ�Q�5���Xt�A��\j����)�����4�^�J�L'��P�
6���j�#�K�a���m
�HLgq��̧ݩ��Ӣc�O���#~�oU���}�Z��f�< �a����icGr��S�"�:jo<pK��
���n�k�&��"[��t���=�ϵ@x(���pƫ�O9k��? �U��u{�%���t���(/��9:I���\Ce�1�@�&����%�O�Z9�U0-300a�k9fd����i��rv�3˙�S�G8m���Ug����9mpiΉ�Ŵ�
��������p̣��!}E�n��rCAe3�)θ���*�� sB�v�J">_�	k����!���m(ƤQ+�^l��?�l9ܕvTX���f4@����Y@o�Q?h�%4����8���*q�����*���l���
����U�]o��p�'�j��%�~i��0yd>����h�hk�>�����N��%�ߨ&�;�$5�
��k�V@Z�n�H��c�V��o�����Z�TJ�ĶT;�mu�T0�Z�[��G7W��ݗ��_R����K�_�ݎ�ز��� F&��܉�U=nᬓ��.�yh�n�Vⷹ!���F}{�7��>�i�ۇI=�r"�u���p��Z��vd���'�T�S�l����V�`F��#3����`
�1H>]���Df϶����|b�����E��M�abd�M���~��P��6�1`�A���kД�m?���j��-r�m…tB��
�LQ�Ì����$W�j����۠k�^q,�yvR��gU���e!+.������lO�W�h��8�cBg�g}�X�c��!|�E���<e��Z��
�X�N�6�x��k�/\���r9�{C�ɕ��M�+[�DXҳd���9��,�y6p;�xya�E^�(o�T:9�0Rb!3���O<�7��eUԷG�	# ���)�c�5��Ix�FK֔ˆC�Z�B�`�Qk�GjL��8�*���.�dh�X�6z�n�C����߷�����ُ�Di�9��Ѥ�2��qg�i^�� ���[c?�cudl�xg��vk�c�=c��s�8dO륈!޸Nf|a^�Q;�aZ��:�c��w_c��l}i�Lf•a��m�>x�b��`渭���l�Р��F[�ش���X��Z�r���1}��՗��`�=��i����8Ʊ7ł��c̭���Aʄ��-`ޣ�
z
'a��N�&����j��|�e�\��9�ԙ�kᩧt�p���
c���sд�B{;a���g���mD*�N8^k���jc�R���zc��?\�r_;��L�8�Ɂ�%�b��`�l҉��v��ͷkw3�y�L�J�3t�Ο��uJ���`�RϚ!��i#y���B��m�c�{^:N�\�ۥ��,5V��,V�4m��.8���wg���5���f6m݊!{��3��n

���v�6~�S9|�����փ�{��}�Mʼ_��K�
dn�Y�OX\�8�m�6$����{���j�#>��V��K��I>�Bs�Q�Z�`EYhQ]����u�Х�\�,��5vJL\N(��h)x����̷��-����c�@���Q<���!2��V�
���`�$x���C��1��Ad��Ӛ/H؉�8@^Њ��NcXR�Ikxv^�����{G;RSݳ�8�L&BW��w$N���q����S+t�̯�q�bΆ����S��C�X��skx6ه��Y�ψ�s�;\��,�C^b,8��
Y�)(w�
��7����Cb%���3k؄A��K�ީ^e��Kz:�E�K�]��?��0Ἇ�(��#\���<�)�֛@�t�*`_%�f�����+�6%ڭ=�-���Ɗ
l���dlq�?�ZƎ�:1��4��	of-䅙��dy���RY���m�Jx�6'��]�#�]n��r�QG��ld�,7�?���|�^��'�[g3���"8�Y��F���-��3���1�l�0C���`3�v+Q�assets/index.php000064400000000126150755142440007674 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/css/tm-epo.css000064400000347577150755142440010607 0ustar00/* stylelint-disable no-descending-specificity */
/* stylelint-disable selector-class-pattern */

/**
 * This file contains the styling for the plugin.
 *
 * Please do not make alterations to this file as you
 * will loose them when updating the plugin.
 *
 * This file contents are outlined below.
 *
 * 1. Grid system
 * 2. Containers
 * 3. Elements
 * 4. Floatbox
 * 5. Floating totals box
 * 6. Validation errors
 * 7. Lightbox
 * 8. Datepicker and Timepicker
 * 9. Checkbox and Radio button
 * 10. Checkbox and Radio button custom styles
 * 11. Checkbox and Radio button swatches
 * 12. Product element
 * 13. Tooltip
 * 14. Cart and Order styles
 * 15. Various styles
 * 16. Theme fixes
 *
 * @package Extra Product Options/CSS
 * @version 6.0
 */

/* 1. Grid system */

:root {
	--tcgaprow: 15px;
	--tcgapcolumn: 15px;
	--tcinnergaprow: calc(var(--tcgaprow) / 2);
	--tcinnergapcolumn: calc(var(--tcgapcolumn) / 2);
	--tcgap: var(--tcgaprow) var(--tcgapcolumn);
	--tcinnergap: var(--tcinnergaprow) var(--tcinnergapcolumn);
	--tcinlinesize: 3em;
	--flex-items: 1;
	--swatch-border-radius: 0;
	--swatch-border-color: transparent;
	--swatch-active-border-color: inherit;
	--text-swatch-border-color: inherit;
	--text-swatch-border-width: 1px;
	--text-swatch-active-border-width: 1px;
	--swatch-border-width: 2px;
	--swatch-active-border-width: 2px;
}

.tm-extra-product-options .tc-container,
.tc-container {
	display: block;
	width: 100%;
	padding: 0 var(--tcgapcolumn);
	margin: 0;
}

.tm-extra-product-options .tc-row,
.tc-row {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-align: stretch;
	-ms-flex-align: stretch;
	align-items: stretch;
	-ms-flex-line-pack: start;
	align-content: flex-start;
	margin: 0;
	gap: var(--tcgap);
}

.tm-extra-product-options .tc-element-inner-wrap .tc-row {
	gap: var(--tcinnergap);
}

.tc-row > *,
.tmcp-field-wrap-inner > *,
.tc-label-wrap > *,
.tm-epo-element-label > * {
	-webkit-box-ordinal-group: 11;
	-ms-flex-order: 10;
	order: 10;
}

.tc-section-inner-wrap > .tc-row {
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
}

.tm-extra-product-options .tc-cell,
.tc-extra-product-options .tmcp-field-wrap label.tc-cell,
.tc-cell {
	position: relative;
	padding: 0;
	min-height: 1px;
	overflow: visible;
	width: 100%;
	margin-left: 0 !important;
	margin-right: 0 !important;
}

.tm-extra-product-options .cpf-type-dynamic .tc-cell,
.tc-extra-product-options .cpf-type-dynamic .tmcp-field-wrap label.tc-cell,
.cpf-type-dynamic .tc-cell,
.cpf-type-dynamic.tc-cell {
	min-height: 0;
}


.cpf-section.tc-cell {
	margin: 0;
}

.cpf-section.section-disabled {
	display: none;
}

.tc-container.nopadding {
	padding-left: 0;
	padding-right: 0;
}

.nomargin .tc-cell {
	margin: 0;
}

.tc-row .cpf-section.tc-row {
	margin: 0;
}

.tm-extra-product-options .tc-row.tc-col-12,
.tm-extra-product-options .tc-row.tc-col-12 .tc-row.tc-col-12 {
	margin: 0 -1em;
	min-width: 100% !important;
	max-width: 100%;
	overflow: visible;
	position: relative;
}

.tm-extra-product-options .tc-col,
.tm-extra-product-options .tc-cell.tc-col,
.tc-cell.tc-col,
.tc-col {
	-webkit-box-flex: 1;
	-ms-flex: 1 1 0;
	flex: 1 1 0;
	max-width: 100%;
}

.tm-extra-product-options .tc-col-auto,
.tm-extra-product-options .tc-cell.tc-col-auto,
.tc-cell.tc-col-auto,
.tc-col-auto {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	width: auto;
	max-width: 100%;
}

.tm-extra-product-options .tc-col-0,
.tm-extra-product-options .tc-cell.tc-col-0,
.tc-cell.tc-col-0,
.tc-col-0 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 0%;
	flex: 0 0 0%;
	max-width: 0%;
}

.tm-extra-product-options .tc-col-1,
.tm-extra-product-options .tc-cell.tc-col-1,
.tc-cell.tc-col-1,
.tc-col-1 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 8.3334%;
	flex: 0 0 8.3334%;
	max-width: 8.3334%;
}

.tm-extra-product-options .tc-col-1-5,
.tm-extra-product-options .tc-cell.tc-col-1-5,
.tc-cell.tc-col-1-5,
.tc-col-1-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 12.5%;
	flex: 0 0 12.5%;
	max-width: 12.5%;
}

.tm-extra-product-options .tc-col-2,
.tm-extra-product-options .tc-cell.tc-col-2,
.tc-cell.tc-col-2,
.tc-col-2 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 16.6667%;
	flex: 0 0 16.6667%;
	max-width: 16.6667%;
}

.tm-extra-product-options .tc-col-2-5,
.tm-extra-product-options .tc-cell.tc-col-2-5,
.tc-cell.tc-col-2-5,
.tc-col-2-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 20%;
	flex: 0 0 20%;
	max-width: 20%;
}

.tm-extra-product-options .tc-col-3,
.tm-extra-product-options .tc-cell.tc-col-3,
.tc-cell.tc-col-3,
.tc-col-3 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 25%;
	flex: 0 0 25%;
	max-width: 25%;
}

.tm-extra-product-options .tc-col-4,
.tm-extra-product-options .tc-cell.tc-col-4,
.tc-cell.tc-col-4,
.tc-col-4 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 33.3334%;
	flex: 0 0 33.3334%;
	max-width: 33.3334%;
}

.tm-extra-product-options .tc-col-4-5,
.tm-extra-product-options .tc-cell.tc-col-4-5,
.tc-cell.tc-col-4-5,
.tc-col-4-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 37.5%;
	flex: 0 0 37.5%;
	max-width: 37.5%;
}

.tm-extra-product-options .tc-col-5,
.tm-extra-product-options .tc-cell.tc-col-5,
.tc-cell.tc-col-5,
.tc-col-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 41.6667%;
	flex: 0 0 41.6667%;
	max-width: 41.6667%;
}

.tm-extra-product-options .tc-col-6,
.tm-extra-product-options .tc-cell.tc-col-6,
.tc-cell.tc-col-6,
.tc-col-6 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 50%;
	flex: 0 0 50%;
	max-width: 50%;
}

.tm-extra-product-options .tc-col-7,
.tm-extra-product-options .tc-cell.tc-col-7,
.tc-cell.tc-col-7,
.tc-col-7 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 58.3334%;
	flex: 0 0 58.3334%;
	max-width: 58.3334%;
}

.tm-extra-product-options .tc-col-7-5,
.tm-extra-product-options .tc-cell.tc-col-7-5,
.tc-cell.tc-col-7-5,
.tc-col-7-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 62.5%;
	flex: 0 0 62.5%;
	max-width: 62.5%;
}

.tm-extra-product-options .tc-col-8,
.tm-extra-product-options .tc-cell.tc-col-8,
.tc-cell.tc-col-8,
.tc-col-8 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 66.6667%;
	flex: 0 0 66.6667%;
	max-width: 66.6667%;
}

.tm-extra-product-options .tc-col-9,
.tm-extra-product-options .tc-cell.tc-col-9,
.tc-cell.tc-col-9,
.tc-col-9 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 75%;
	flex: 0 0 75%;
	max-width: 75%;
}

.tm-extra-product-options .tc-col-10,
.tm-extra-product-options .tc-cell.tc-col-10,
.tc-cell.tc-col-10,
.tc-col-10 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 83.3334%;
	flex: 0 0 83.3334%;
	max-width: 83.3334%;
}

.tm-extra-product-options .tc-col-10-5,
.tm-extra-product-options .tc-cell.tc-col-10-5,
.tc-cell.tc-col-10-5,
.tc-col-10-5 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 87.5%;
	flex: 0 0 87.5%;
	max-width: 87.5%;
}

.tm-extra-product-options .tc-col-11,
.tm-extra-product-options .tc-cell.tc-col-11,
.tc-cell.tc-col-11,
.tc-col-11 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 91.6667%;
	flex: 0 0 91.6667%;
	max-width: 91.6667%;
}

.tm-extra-product-options .tc-col-12,
.tm-extra-product-options .tc-cell.tc-col-12,
.tc-cell.tc-col-12,
.tc-col-12 {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
}

.tcwidth {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
	flex: 0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
	max-width: calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
}

.tcwidth-1 {
	--flex-items: 100;
}

.tcwidth-2 {
	--flex-items: 50;
}

.tcwidth-3 {
	--flex-items: calc(100 / 3);
}

.tcwidth-4 {
	--flex-items: 25;
}

.tcwidth-5 {
	--flex-items: 20;
}

.tcwidth-6 {
	--flex-items: calc(100 / 6);
}

.tcwidth-7 {
	--flex-items: calc(100 / 7);
}

.tcwidth-8 {
	--flex-items: calc(100 / 8);
}

.tcwidth-9 {
	--flex-items: calc(100 / 9);
}

.tcwidth-10 {
	--flex-items: 10;
}

.tcwidth-11 {
	--flex-items: calc(100 / 11);
}

.tcwidth-12 {
	--flex-items: calc(100 / 12);
}

.tcwidth-12-5 {
	--flex-items: calc(100 / 12.5%);
}

.tcwidth-13 {
	--flex-items: calc(100 / 13);
}

.tcwidth-14 {
	--flex-items: calc(100 / 14);
}

.tcwidth-15 {
	--flex-items: calc(100 / 15);
}

.tcwidth-16 {
	--flex-items: calc(100 / 16);
}

.tcwidth-17 {
	--flex-items: calc(100 / 17);
}

.tcwidth-18 {
	--flex-items: calc(100 / 18);
}

.tcwidth-19 {
	--flex-items: calc(100 / 19);
}

.tcwidth-20 {
	--flex-items: 5;
}

.tcwidth-21 {
	--flex-items: calc(100 / 21);
}

.tcwidth-22 {
	--flex-items: calc(100 / 22);
}

.tcwidth-23 {
	--flex-items: calc(100 / 23);
}

.tcwidth-24 {
	--flex-items: calc(100 / 24);
}

.tcwidth-25 {
	--flex-items: 4;
}

.tcwidth-26 {
	--flex-items: calc(100 / 26);
}

.tcwidth-27 {
	--flex-items: calc(100 / 27);
}

.tcwidth-28 {
	--flex-items: calc(100 / 28);
}

.tcwidth-29 {
	--flex-items: calc(100 / 29);
}

.tcwidth-30 {
	--flex-items: calc(100 / 30);
}

.tcwidth-31 {
	--flex-items: calc(100 / 31);
}

.tcwidth-32 {
	--flex-items: calc(100 / 32);
}

.tcwidth-33 {
	--flex-items: calc(100 / 33);
}

.tcwidth-34 {
	--flex-items: calc(100 / 34);
}

.tcwidth-35 {
	--flex-items: calc(100 / 35);
}

.tcwidth-36 {
	--flex-items: calc(100 / 36);
}

.tcwidth-37 {
	--flex-items: calc(100 / 37);
}

.tcwidth-37-5 {
	--flex-items: calc(100 / 37.5%);
}

.tcwidth-38 {
	--flex-items: calc(100 / 38);
}

.tcwidth-39 {
	--flex-items: calc(100 / 39);
}

.tcwidth-40 {
	--flex-items: calc(100 / 40);
}

.tcwidth-41 {
	--flex-items: calc(100 / 41);
}

.tcwidth-42 {
	--flex-items: calc(100 / 42);
}

.tcwidth-43 {
	--flex-items: calc(100 / 43);
}

.tcwidth-44 {
	--flex-items: calc(100 / 44);
}

.tcwidth-45 {
	--flex-items: calc(100 / 45);
}

.tcwidth-46 {
	--flex-items: calc(100 / 46);
}

.tcwidth-47 {
	--flex-items: calc(100 / 47);
}

.tcwidth-48 {
	--flex-items: calc(100 / 48);
}

.tcwidth-49 {
	--flex-items: calc(100 / 49);
}

.tcwidth-50 {
	--flex-items: 2;
}

.tcwidth-51 {
	--flex-items: calc(100 / 51);
}

.tcwidth-52 {
	--flex-items: calc(100 / 52);
}

.tcwidth-53 {
	--flex-items: calc(100 / 53);
}

.tcwidth-54 {
	--flex-items: calc(100 / 54);
}

.tcwidth-55 {
	--flex-items: calc(100 / 55);
}

.tcwidth-56 {
	--flex-items: calc(100 / 56);
}

.tcwidth-57 {
	--flex-items: calc(100 / 57);
}

.tcwidth-58 {
	--flex-items: calc(100 / 58);
}

.tcwidth-59 {
	--flex-items: calc(100 / 59);
}

.tcwidth-60 {
	--flex-items: calc(100 / 60);
}

.tcwidth-61 {
	--flex-items: calc(100 / 61);
}

.tcwidth-62 {
	--flex-items: calc(100 / 62);
}

.tcwidth-62-5 {
	--flex-items: calc(100 / 62.5%);
}

.tcwidth-63 {
	--flex-items: calc(100 / 63);
}

.tcwidth-64 {
	--flex-items: calc(100 / 64);
}

.tcwidth-65 {
	--flex-items: calc(100 / 65);
}

.tcwidth-66 {
	--flex-items: calc(100 / 66);
}

.tcwidth-67 {
	--flex-items: calc(100 / 67);
}

.tcwidth-68 {
	--flex-items: calc(100 / 68);
}

.tcwidth-69 {
	--flex-items: calc(100 / 69);
}

.tcwidth-70 {
	--flex-items: calc(100 / 70);
}

.tcwidth-71 {
	--flex-items: calc(100 / 71);
}

.tcwidth-72 {
	--flex-items: calc(100 / 72);
}

.tcwidth-73 {
	--flex-items: calc(100 / 73);
}

.tcwidth-74 {
	--flex-items: calc(100 / 74);
}

.tcwidth-75 {
	--flex-items: calc(100 / 75);
}

.tcwidth-76 {
	--flex-items: calc(100 / 76);
}

.tcwidth-77 {
	--flex-items: calc(100 / 77);
}

.tcwidth-78 {
	--flex-items: calc(100 / 78);
}

.tcwidth-79 {
	--flex-items: calc(100 / 79);
}

.tcwidth-80 {
	--flex-items: calc(100 / 80);
}

.tcwidth-81 {
	--flex-items: calc(100 / 81);
}

.tcwidth-82 {
	--flex-items: calc(100 / 82);
}

.tcwidth-83 {
	--flex-items: calc(100 / 83);
}

.tcwidth-84 {
	--flex-items: calc(100 / 84);
}

.tcwidth-85 {
	--flex-items: calc(100 / 85);
}

.tcwidth-86 {
	--flex-items: calc(100 / 86);
}

.tcwidth-87 {
	--flex-items: calc(100 / 87);
}

.tcwidth-87-5 {
	--flex-items: calc(100 / 37.5%);
}

.tcwidth-88 {
	--flex-items: calc(100 / 88);
}

.tcwidth-89 {
	--flex-items: calc(100 / 89);
}

.tcwidth-90 {
	--flex-items: calc(100 / 90);
}

.tcwidth-91 {
	--flex-items: calc(100 / 91);
}

.tcwidth-92 {
	--flex-items: calc(100 / 92);
}

.tcwidth-93 {
	--flex-items: calc(100 / 93);
}

.tcwidth-94 {
	--flex-items: calc(100 / 94);
}

.tcwidth-95 {
	--flex-items: calc(100 / 95);
}

.tcwidth-96 {
	--flex-items: calc(100 / 96);
}

.tcwidth-97 {
	--flex-items: calc(100 / 97);
}

.tcwidth-98 {
	--flex-items: calc(100 / 98);
}

.tcwidth-99 {
	--flex-items: calc(100 / 99);
}

.tcwidth-100 {
	--flex-items: 1;
}

/* 2. Containers */

.tc-extra-product-options {
	visibility: hidden;
}

.tc-extra-product-options.tc-show,
.tc-extra-product-options.tc-show-override {
	display: block;
	clear: both;
	visibility: visible;
}

.tc-extra-product-options.tc-show-hidden {
	display: block;
	clear: both;
	visibility: hidden !important;
}

.tm-extra-product-options,
.tm-extra-product-options .tm-extra-product-options-fields,
.tm-extra-product-options .tc-element-container,
.tm-extra-product-options .tmcp-ul-wrap,
.tm-extra-product-options .tmcp-field,
.tm-extra-product-options .tm-epo-field,
.tm-extra-product-options li.tmcp-field-wrap,
.tm-extra-product-options .tmcp-field-wrap-inner,
.tm-extra-product-options .tc-cell,
.tm-extra-product-options .tc-row,
.tm-collapse,
.tm-collapse-wrap,
.tc-epo-label,
.tm-show-picker-value,
.tm-bsbb,
.tm-bsbb-all,
.tm-bsbb-all *,
.tc-container,
.tc-row,
.tc-cell,
.tm-box,
.flasho,
.flasho div,
.tm-button,
.tm-epo-style,
.tc-lightbox img,
.tm-extra-product-options .tc-image {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tm-extra-product-options {
	max-width: 100%;
	width: 100%;
}

.tm-extra-product-options .tmcp-ul-wrap {
	overflow: visible;
	max-width: 100%;
	width: 100%;
	margin-bottom: 0;
}

.tm-extra-product-options .tc-element-container {
	overflow: visible;
	margin-bottom: 0;
}

.tm-extra-product-options .tm-extra-product-options-fields,
.tm-extra-product-options .tmcp-ul-wrap {
	clear: both;
	list-style: none outside none;
	margin: 0;
	padding: 0;
}

.tm-extra-product-options .tc-repeater-element,
.tc-repeater-delete,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	gap: var(--tcinnergap);
	max-width: 100%;
}

.tc-element-container {
	gap: var(--tcgap);
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tc-field-label-wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	gap: 0 var(--tcinnergapcolumn);
	max-width: 100%;
	width: 100%;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap {
	display: grid;
	grid-template-columns: auto auto;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap {
	grid-template-columns: 1fr auto;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.no-price {
	grid-template-columns: auto;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-price {
	grid-template-columns: 1fr;
}

.tm-extra-product-options .cpf-type-select .tm-epo-field-label {
	display: grid;
	grid-template-columns: auto auto;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul .tm-epo-field-label {
	grid-template-columns: 1fr auto;
}

.tm-extra-product-options .cpf-type-select li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label {
	grid-template-columns: auto;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label,
.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.desc-inline .tm-epo-field-label {
	grid-template-columns: 1fr;
}

.tm-extra-product-options .tc-repeater-element,
.tc-repeater-delete {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tm-extra-product-options .tc-repeater-element {
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

.tm-extra-product-options .tc-repeater-element .tmcp-ul-wrap {
	-webkit-box-flex: 1 !important;
	-ms-flex-positive: 1 !important;
	flex-grow: 1 !important;
	-ms-flex-preferred-size: 0 !important;
	flex-basis: 0 !important;
	width: auto !important;
}

.tc-repeater-delete {
	-webkit-box-flex: 0;
	-ms-flex-positive: 0;
	flex-grow: 0;
	-ms-flex-preferred-size: 0;
	flex-basis: 0;
	width: auto;
	padding: 0;
}

.tc-price-wrap {
	padding: 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	gap: calc(1ch / 2);
}

.tm-extra-product-options .tmcp-ul-wrap + .tmcp-ul-wrap {
	margin: 0.5em 0 0 0;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner {
	width: 100%;
	list-style: none outside none !important;
	position: relative;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-align: stretch;
	-ms-flex-align: stretch;
	align-items: stretch;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,
.tm-extra-product-options .cpf-type-radio ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,
.tm-extra-product-options .cpf-type-checkbox ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner {
	width: auto;
}

.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tmcp-field-wrap-inner .tc-price-wrap {
	justify-self: flex-end;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap {
	padding: 0;
	margin: 0;
}

.tc-epo-element-product-li-container {
	width: 100%;
	max-width: 100%;
	overflow-x: auto;
	overflow-y: hidden;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap:last-child {
	margin: 0;
}

.tc-totals-form {
	clear: both;
	display: none;
	width: 100%;
}

.tc-totals-form.tc-show {
	display: block;
}

.tm-epo-totals {
	clear: both;
	padding-bottom: 1em;
	padding-top: 1em;
}

.tm-epo-totals:empty {
	display: none;
}

.tc-epo-totals.hidden,
.tc-extra-product-options.hidden {
	display: none;
}

html .tc-extra-product-options .tc-hidden.tc-cell,
.tc-hidden,
.tm-hidden,
.tm-extra-product-options .tc-mode-text .tc-input-wrap,
.tm-extra-product-options .tc-mode-color .tc-input-wrap,
.tm-extra-product-options .tc-mode-images .tc-input-wrap,
.tm-extra-product-options .tc-mode-color input.use_images,
.tm-extra-product-options .tc-mode-images input.use_images {
	display: none !important;
}

.tm-box,
.tm-collapse {
	border: 1px solid rgba(0, 0, 0, 0.035);
	background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.01)), color-stop(50%, rgba(0, 0, 0, 0.01)), color-stop(50%, rgba(0, 0, 0, 0.02)), to(rgba(0, 0, 0, 0.01)));
	background-image: linear-gradient(to top, rgba(0, 0, 0, 0.01) 0%, rgba(0, 0, 0, 0.01) 50%, rgba(0, 0, 0, 0.02) 50%, rgba(0, 0, 0, 0.01) 100%);
	margin: 0;
	width: 100%;
	max-width: 100%;
}

.tm-box {
	padding: var(--tcgap);
}

.tm-collapse {
	padding: 0;
}


.tm-extra-product-options .cpf-section.tc-cell.tm-owl-slider-section .tm-box .tc-row {
	padding-bottom: var(--tcgap);
}

.tm-arrow {
	cursor: pointer;
	height: 1em;
	text-align: center;
	width: 1em;
	display: -webkit-box !important;
	display: -ms-flexbox !important;
	display: flex !important;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-ordinal-group: 101;
	-ms-flex-order: 100;
	order: 100;
}

.tm-extra-product-options .tc-epo-label .tm-arrow {
	margin-left: auto;
}

.tm-toggle {
	padding-right: 2em;
	position: relative;
	cursor: pointer;
}

.tm-collapse .tm-toggle {
	clear: both;
}

.tc-row.tm-collapse {
	gap: 0;
}

.tm-collapse > .tc-cell {
	margin-bottom: 0;
}

.tm-collapse-wrap {
	float: left;
	padding: calc(var(--tcgaprow) / 2) var(--tcgapcolumn);
	overflow: visible;
	width: 100%;
}

.tc-totals-form dl.tm-extra-product-options-totals {
	margin-left: 0;
	margin-right: 0;
}

dl.tm-extra-product-options-totals {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	line-height: 1.5;
}

dl.tm-extra-product-options-totals dt,
dl.tm-extra-product-options-totals dd {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
	width: auto;
	text-align: unset;
	display: initial;
	border: 0;
	padding: 0;
}

dl.tm-extra-product-options-totals dd {
	padding-bottom: var(--tcinnergaprow);
}

.tm-extra-product-options .tm-box .tm-section-label,
.tm-extra-product-options .tm-collapse .tm-section-label,
.tm-extra-product-options .tm-box .tc-epo-label.tm-section-label,
.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label {
	margin: 0;
	position: relative;
	border: 0;
	outline: 0;
	width: 100%;
}

.tm-extra-product-options .tm-collapse .tm-section-label,
.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label {
	padding: calc(var(--tcgaprow) / 2) var(--tcgapcolumn);
}

.tm-extra-product-options .tm-collapse .tm-section-description {
	padding: calc(var(--tcgaprow) / 2) var(--tcgapcolumn);
}

.tc-styled-variations {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

/* 3. Elements */

/* Required indicator */

.tm-epo-required {
	color: #f00;
}

.tmcp-field-wrap .tm-epo-required {
	position: static;
	left: auto;
	top: auto;
}

/* Element containers and labels */

label.tm-epo-field-label {
	-ms-flex-item-align: center;
	align-self: center;
	margin: 0;
}

.tc-epo-element-product-thumbnailmultiple label.tm-epo-field-label,
.tc-epo-element-product-thumbnail label.tm-epo-field-label,
.tc-mode-images label.tm-epo-field-label,
.tc-mode-color label.tm-epo-field-label {
	-ms-flex-item-align: start;
	align-self: flex-start;
}

.tc-left,
.tc-above,
.tc-top {
	-webkit-box-ordinal-group: 2;
	-ms-flex-order: 1;
	order: 1;
}

.tc-right,
.tc-below,
.tc-bottom {
	-webkit-box-ordinal-group: 100;
	-ms-flex-order: 99;
	order: 99;
}

.tc-first {
	-webkit-box-ordinal-group: 1;
	-ms-flex-order: 0;
	order: 0;
}

.tm-extra-product-options ul.tm-extra-product-options-fields li::before,
.tm-extra-product-options ul.tm-extra-product-options-fields li::after,
.tm-extra-product-options ul.tmcp-ul-wrap li::before,
.tm-extra-product-options ul.tmcp-ul-wrap li::after {
	display: none;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label {
	margin: 0;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-radio .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-checkbox .tm-label {
	padding: 0 !important;
	margin: 0 !important;
	display: inline !important;
	vertical-align: middle;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label.tc-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label.tc-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label.tc-label {
	vertical-align: initial;
	-ms-flex-item-align: center;
	align-self: center;
}

.tc-label-inner {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	max-width: 100%;
	gap: 0 var(--tcinnergapcolumn);
}

.fullwidth-ul .tc-label-inner:not(.tc-mode-text .tc-label-inner) {
	display: grid;
	grid-template-columns: auto auto 1fr;
}

.fullwidth-ul .tc-label-inner.desc-inline:not(.tc-mode-text .tc-label-inner),
.fullwidth-ul .tc-label-inner.no-desc:not(.tc-mode-text .tc-label-inner) {
	grid-template-columns: auto 1fr;
}

.tc-mode-text .tc-label-inner {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),
.tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner) {
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.fullwidth-ul .tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),
.fullwidth-ul .tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner) {
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	grid-template-columns: 1fr;
	justify-items: center;
	gap: var(--tcinnergaprow) 0;
}

.tc-mode-color .radio-image-label,
.tc-mode-images .radio-image-label,
.tc-mode-color .checkbox-image-label,
.tc-mode-images .checkbox-image-label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcinnergap);
}

.tc-label-text {
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	max-width: 100%;
	gap: 0 var(--tcinnergapcolumn);
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label:empty,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label:empty,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label:empty {
	padding: 0 !important;
}

.tm-extra-product-options .tm-extra-product-options-field {
	clear: both;
	padding: 0;
}

.tm-extra-product-options .tm-extra-product-options-field.tc-normal-mode {
	margin: 0 0 1em;
}

.tm-extra-product-options .tc-active .tc-label-text,
.tm-extra-product-options li.tmcp-field-wrap.tc-active .price.tc-price .amount,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label input[type="radio"]:checked ~ .tc-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label input[type="checkbox"]:checked ~ .tc-label {
	font-weight: 700;
	background: none !important;
}

.tc-extra-product-options .tmcp-field-wrap label,
.tm-epo-variation-section .tmhexcolorimage-li-nowh label,
.tm-epo-variation-section .tmhexcolorimage-li label {
	padding: 0;
	float: none;
	max-width: 100%;
	width: auto;
	overflow-wrap: break-word;
}

.tm-extra-product-options .tmcp-field-wrap label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	max-width: 100%;
	min-width: 0; /* So that select boxes don't overflow. */
	gap: var(--tcinnergap);
}

.tm-extra-product-options .tmcp-field-wrap label:not(.fullwidth) {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
}

.tm-extra-product-options .cpf-type-variations .tmcp-field-wrap label.fullwidth select,
.tc-extra-product-options .cpf-type-product .tmcp-field-wrap label.fullwidth select,
/* For custom select box wrappers */
.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth select,
.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth > *,
.tc-extra-product-options .cpf-type-selectmultiple .tmcp-field-wrap label.fullwidth select,
.tc-extra-product-options .cpf-type-time .tmcp-field-wrap label.fullwidth .tm-epo-field,
.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label.fullwidth .tm-epo-field,
.tc-extra-product-options .cpf-type-textfield .tmcp-field-wrap label.fullwidth .tm-epo-field {
	width: 100%;
}

.tc-extra-product-options .cpf-type-textarea .tmcp-field-wrap label.fullwidth .tm-epo-field {
	width: 100% !important; /* Disable user manually changing width. */
}

.tm-extra-product-options .tc-images-container .tmcp-field-wrap label,
.tm-extra-product-options .tc-colors-container .tmcp-field-wrap label,
.tm-epo-variation-section .tmhexcolorimage-li-nowh label,
.tm-epo-variation-section .tmhexcolorimage-li label {
	cursor: pointer;
	width: 100%;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-startcolor,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startimages,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startcolor {
	text-align: initial;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	-ms-flex-direction: row;
	flex-direction: row;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-endcolor,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endcolor,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endimages {
	text-align: initial;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	-ms-flex-direction: row;
	flex-direction: row;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-images .tc-field-label-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
	gap: var(--tcinnergap);
}

/* Divider element */

.tm-extra-product-options .tc-cell hr {
	margin: var(--tcgaprow) 0;
}

.tm-extra-product-options .tm_divider {
	border-style: solid;
	border-width: 1px;
	margin: var(--tcgaprow) 0;
	clear: both;
}

.tm-extra-product-options .cpf-element .tm_divider.tc-cell {
	margin: var(--tcgaprow) 0;
}

.tm-extra-product-options .tm_padding {
	padding: var(--tcgaprow) 0;
}

.tm-extra-product-options .cpf-element .tm_padding.tc-cell {
	margin-left: var(--tcgapcolumn);
	margin-right: var(--tcgapcolumn);
}

/* Textarea element */

.tm-extra-product-options textarea.tm-epo-field {
	height: auto;
	width: 100%;
	max-width: 100%;
}

/* Textfield element */

.tm-extra-product-options .tmcp-textfield.tm-epo-field {
	width: auto;
	max-width: 100%;
}

/* Checkboxes and radio button elements */

.tm-extra-product-options .tm-epo-field.tmcp-checkbox,
.tm-extra-product-options .tm-epo-field.tmcp-radio {
	margin: 0 !important;
	padding: 0 !important;
	vertical-align: middle;
	position: relative;
	width: auto;
	float: none;
	top: 1px;
}

.tm-extra-product-options .tc-epo-label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	position: relative;
	float: none;
	width: 100%;
	margin-bottom: 0;
	gap: var(--tcinnergap);
}

.tm-extra-product-options .tc-epo-label.tm-section-label {
	margin: 0;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tc-section-label-text {
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
}

.float-editbox .section_popup .tm-section-label {
	display: none;
}

/* Select box element */

.tm-epo-field.tmcp-select {
	width: 100%;
	max-width: 100%;
	display: initial;
}

.tc-repeater-element .tm-epo-field.tmcp-select,
.tc-repeater-element .tm-epo-field.tmcp-selectmultiple {
	width: 100%;
}

/* Upload element */

.tm-extra-product-options input.tm-epo-field.tmcp-upload {
	width: 100%;
	font-size: inherit;
}

.tc-extra-product-options .tmcp-field-wrap .cpf-upload-text {
	width: 100%;
	display: inline-block;
	text-align: center;
}

.tc-upload-preview {
	display: grid;
	margin: 1em 0;
	width: 100%;
	gap: 1em;
	grid-template-columns: minmax(100px, -webkit-max-content);
	grid-template-columns: minmax(100px, max-content);
	grid-template-rows: 1fr;
}

.tc-upload-preview:empty {
	display: none;
}

.tc-upload-preview.multiple {
	grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}

.tc-upload-file {
	border-radius: 5px;
	padding: 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 100%;
	margin: 0;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.tc-upload-preview.multiple .tc-upload-file {
	max-height: 100%;
	min-height: 100px;
}

.tc-upload-image {
	position: relative;
	border: 1px solid;
	padding: 2%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	border-radius: 5px;
	background: rgba(0, 0, 0, 0.7);
	min-width: 100%;
	min-height: 100px;
}

.tc-upload-preview.multiple .tc-upload-image {
	min-height: 100%;
}

.woocommerce .tc-upload-preview img {
	height: auto;
	max-width: 100%;
	width: auto;
	border-radius: 5px;
	border: 1px solid rgba(0, 0, 0, 0.1);
	padding: 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.woocommerce .tc-upload-preview.multiple img {
	height: 96%;
	width: 96%;
	-o-object-fit: scale-down;
	object-fit: scale-down;
	max-height: 100%;
	position: absolute;
}

.tc-file-size {
	position: absolute;
	color: #fff;
	font-size: 0.625em;
	top: calc(2% + 0.5078125em);
	left: calc(2% + 0.5078125em);
	background: rgba(0, 0, 0, 0.5);
	padding: 0 3px;
	z-index: 1;
}

.tc-file-ext-overlay {
	background: rgba(0, 0, 0, 0.2);
	width: 96%;
	height: 96%;
	position: absolute;
	border-radius: 5px 12px 5px 5px;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	left: 2%;
	top: 2%;
}

.tc-file-ext {
	position: absolute;
	padding: 2px;
	background: rgba(0, 0, 0, 0.5);
	color: #fff;
	min-width: 30%;
	text-align: center;
	text-transform: uppercase;
	font-size: 0.825em;
}

.tc-file-name {
	max-width: 94%;
	position: absolute;
	color: #fff;
	background: rgba(0, 0, 0, 0.5);
	bottom: 0;
	font-size: 0.625em;
	padding: 0.25em 0.5em;
	text-overflow: ellipsis;
	overflow: hidden;
	max-height: 2em;
	line-height: 2;
}

.tc-upload-remove {
	cursor: pointer;
	position: absolute;
	right: 2%;
	top: 2%;
	font-size: 1em;
	width: 1.625em;
	height: 1.625em;
	font-family: inherit;
	line-height: inherit;
	margin: 0;
	padding: 0;
	border: none;
	outline: none;
	color: #fff;
	border-radius: 50%;
	background-color: rgba(0, 0, 0, 0.5);
	background-image: none;
	-webkit-box-shadow: 0 0 0 0 hsl(0deg 0% 100% / 0%);
	box-shadow: 0 0 0 0 hsl(0deg 0% 100% / 0%);
	z-index: 2;
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease;
}

.tc-upload-remove:hover,
.tc-upload-remove:focus {
	-webkit-box-shadow: 0 0 0 0.125em rgb(255 255 255 / 90%);
	box-shadow: 0 0 0 0.125em rgb(255 255 255 / 90%);
	background: rgba(0, 0, 0, 0.5);
	color: #fff;
}

.tc-upload-remove svg {
	width: 100%;
	height: 100%;
	font-size: inherit;
	-webkit-box-sizing: inherit;
	box-sizing: inherit;
	line-height: inherit;
}

.cpf-upload-container-basic,
.cpf-upload-container {
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tc-max-file-size {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container-basic .cpf-upload-wrap {
	display: block !important;
	position: relative;
	vertical-align: middle;
	cursor: pointer;
}

.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container .cpf-upload-wrap {
	border: 1px solid;
	display: block !important;
	font-size: 1em;
	height: auto;
	overflow: hidden;
	padding: 0.5em 1em;
	position: relative;
	vertical-align: middle;
	margin: 0 0.5em 0 0;
	cursor: pointer;
}

.cpf-upload-container [type="file"] {
	cursor: inherit;
	display: block;
	font-size: 0.01px;
	min-height: 100%;
	min-width: 100%;
	opacity: 0;
	position: absolute;
	right: 0;
	text-align: right;
	top: 0;
}

.cpf-upload-container + small::before,
.cpf-upload-container-basic + small::before {
	content: "";
	display: block;
}

.tm-filename {
	display: block;
	-ms-flex-item-align: center;
	align-self: center;
}

.tm-filename:empty {
	display: none;
}

.tc-upload-messages {
	padding: var(--tcgaprow) 0;
}

.tc-upload-message {
	font-size: 1.2em;
	margin-bottom: var(--tcgap);
}

/* Range picker element */

.tm-extra-product-options .cpf-type-range .tc-epo-label {
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range {
	clear: both;
	position: relative;
}

.tm-range-picker {
	margin: 1em 14px;
	max-width: 100%;
	width: auto;
	-webkit-box-flex: 1;
	-ms-flex: 1 1 auto;
	flex: 1 1 auto;
}

.tm-range-picker.noui-show-tooltip {
	margin: calc(1em + 22px) 14px;
}

.tm-range-picker.pips,
.tm-range-picker.noui-show-tooltip.pips {
	margin: calc(50px - 1em) 14px 50px 14px;
}

.tm-range-picker .noui-tooltip {
	line-height: 1;
	font-size: 10px;
}

.tc-extra-product-options .tm-show-picker-left,
.tc-extra-product-options .tm-show-picker-tleft,
.tc-extra-product-options .tm-show-picker-right,
.tc-extra-product-options .tm-show-picker-tright {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: justify !important;
	-ms-flex-pack: justify !important;
	justify-content: space-between !important;
}

.tc-extra-product-options .tm-show-picker-left .tm-range-picker,
.tc-extra-product-options .tm-show-picker-tleft .tm-range-picker,
.tc-extra-product-options .tm-show-picker-right .tm-range-picker,
.tc-extra-product-options .tm-show-picker-tright .tm-range-picker {
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
}

.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,
.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value,
.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value,
.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value {
	position: relative;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
	border: 1px solid;
	border-radius: 5px;
	padding: 0 1em;
	display: inline-block;
	max-width: 20%;
	min-width: 4em;
	text-align: center;
	line-height: normal;
}

.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,
.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value {
	-webkit-box-ordinal-group: 1;
	-ms-flex-order: 0;
	order: 0;
}

.tc-extra-product-options .tm-show-picker-left .tc-price-wrap,
.tc-extra-product-options .tm-show-picker-tleft .tc-price-wrap,
.tc-extra-product-options .tm-show-picker-right .tc-price-wrap,
.tc-extra-product-options .tm-show-picker-tright .tc-price-wrap {
	-webkit-box-ordinal-group: 10;
	-ms-flex-order: 9;
	order: 9;
}

.tm-extra-product-options .tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range .tm-range-picker-value {
	display: inline-block;
	float: right;
	margin-left: 0;
	margin-top: -3px;
	position: absolute;
	right: 0;
	text-align: center;
	top: 1em;
	vertical-align: top;
	width: 19%;
}

input.tm-show-picker-value-edit {
	max-width: 100%;
	width: 4em;
	text-align: center;
	padding: 0;
	border: 1px solid;
	margin: 0;
}

.tm-show-picker-value-edit-wrap {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,
.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap,
.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value-edit-wrap,
.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value-edit-wrap {
	max-width: 20%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	position: relative;
	text-align: center;
	top: 0;
	font-size: 0.8em;
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
	-ms-flex-item-align: center;
	align-self: center;
}

.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,
.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap {
	-webkit-box-ordinal-group: 1;
	-ms-flex-order: 0;
	order: 0;
}

/* Variation element */

.tm-extra-product-options .tc-epo-label.tm-has-undo-button {
	padding-right: 2em;
}

.tm-epo-reset-variation,
.tm-extra-product-options .tm-epo-reset-radio {
	text-align: center;
	cursor: pointer;
	position: absolute;
	right: 0;
	top: 0;
	width: 1em;
	height: 1em;
	line-height: 1;
	padding: 0.2em;
	border: 2px solid;
	color: inherit;
	-webkit-box-sizing: content-box !important;
	box-sizing: content-box !important;
	background: rgba(255, 255, 255, 0.8);
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	z-index: 10000;
}

.round .tm-epo-reset-variation,
.round .tm-epo-reset-radio {
	border-radius: 5px;
}

.square .tm-epo-reset-variation,
.square .tm-epo-reset-radio {
	border-radius: 0;
}

.circle .tm-epo-reset-variation,
.circle .tm-epo-reset-radio {
	border-radius: 100%;
}

.thinline .tm-epo-reset-variation,
.thinline .tm-epo-reset-radio {
	border-width: 1px;
	border-radius: 0;
}

.shadow .tm-epo-reset-variation,
.shadow .tm-epo-reset-radio {
	border-width: 1px;
	border-radius: 0;
}

.tm-epo-reset-variation .tcfa,
.tm-epo-reset-radio .tcfa {
	font-size: 0.8em;
	position: relative;
}

.tm-epo-variation-section .reset_variations {
	clear: both;
	display: block;
	width: 100%;
	position: static;
	visibility: hidden;
}

/* Element prices */

.tm-extra-product-options .tmcp-field-wrap .tc-price {
	font-size: 1em !important;
	width: auto !important;
	display: inline-block !important;
	float: none !important;
	margin: 0 !important;
	padding: 0 !important;
}

.tc-extra-product-options .tmcp-field-wrap .price.tc-price,
.after-amount,
.before-amount {
	font-size: 1em !important;
	background: none !important;
}

.tc-extra-product-options .tmcp-field-wrap .price.tc-price .amount {
	font-size: 1em !important;
	display: inline !important;
	background: none !important;
	white-space: nowrap;
}

.tm-extra-product-options .tmcp-field-wrap .tc-chars + .tc-price .amount {
	margin-left: 0;
}

.tm-extra-product-options .tc-images-container .tmcp-field-wrap .amount {
	margin-left: 0;
}

.tm-extra-product-options .amount.hidden,
.tm-extra-product-options .tmcp-field-wrap .price.amount.hidden,
.tm-extra-product-options .tmcp-field-wrap .tc-price.hidden,
.tm-extra-product-options .before-amount.hidden,
.tm-extra-product-options .after-amount.hidden,
.tm-extra-product-options .tmperiod.hidden {
	display: none !important;
}

.tm-extra-product-options .cpf-type-textarea .tmcp-field-wrap .amount,
.tm-extra-product-options .cpf-type-textfield .tmcp-field-wrap .amount {
	margin-left: 0;
}

/* Final Totals box */

.tm-extra-product-options-totals .price.amount.options,
.tm-extra-product-options-totals .price.amount.fees,
.tm-extra-product-options-totals .price.amount.subscription-fee {
	font-size: 1.25em;
}

.tm-extra-product-options-totals .amount {
	background: none;
}

.tm-extra-product-options-totals .amount.options,
.tm-extra-product-options-totals .amount.fees,
.tm-extra-product-options-totals .amount.subscription-fee {
	font-weight: 700;
}

.tm-extra-product-options-totals .amount.final {
	font-size: 1.5em;
	font-weight: 700;
}

.tm-extra-product-options-totals .price.amount {
	display: inline-block !important;
	width: auto;
	margin: 0;
}

.tm-unit-price,
.tm-fee-totals,
.tm-final-totals,
.tm-options-totals,
.tm-subscription-fee {
	padding: 0;
	margin: 0;
	border: 0 none;
	float: none;
}

.tm-extra-product-options .tmcp-field-wrap .tc-price del {
	font-size: 75% !important;
	margin: 0 !important;
}

.tm-extra-product-options .tmcp-field-wrap .price:empty {
	display: none !important;
}

/* Quantity selector */
.tc-quantity-right .tm-quantity,
.tc-quantity-left .tm-quantity {
	-ms-flex-item-align: center;
	align-self: center;
}

.tm-extra-product-options .cpf-type-checkbox .tc-quantity-right .tm-quantity,
.tm-extra-product-options .cpf-type-checkbox .tc-quantity-left .tm-quantity,
.tm-extra-product-options .cpf-type-radio .tc-quantity-right .tm-quantity,
.tm-extra-product-options .cpf-type-radio .tc-quantity-left .tm-quantity {
	-ms-flex-item-align: unset;
	align-self: unset;
}

.cpf-type-textfield .tc-quantity-right .tm-quantity,
.cpf-type-textfield .tc-quantity-left .tm-quantity {
	-ms-flex-item-align: initial;
	align-self: initial;
}

.tc-quantity-wrapper {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.tc-row.tc-quantity-right,
.tc-row.tc-quantity-left {
	-ms-flex-wrap: nowrap;
	flex-wrap: nowrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
}

.tc-quantity-right .tm-quantity,
.tc-quantity-bottom .tm-quantity {
	-webkit-box-ordinal-group: 100;
	-ms-flex-order: 99;
	order: 99;
}

.tc-quantity-left .tm-quantity,
.tc-quantity-top .tm-quantity {
	-webkit-box-ordinal-group: 1;
	-ms-flex-order: 0;
	order: 0;
}

.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-top,
.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-bottom {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tc-row.tc-quantity-top .tm-quantity,
.tc-row.tc-quantity-bottom .tm-quantity {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
}

.tm-quantity {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	text-align: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-extra-product-options-radio .tm-quantity,
.tm-extra-product-options-checkbox .tm-quantity {
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
}

.tm-quantity input.tm-qty {
	margin: 0;
	max-width: 100%;
	min-width: 3em;
	width: 4em;
	text-align: center;
	padding: 0.25em;
	line-height: 1;
}

.tm-quantity-alt input.tm-qty-alt {
	margin: 0;
	max-width: 100%;
	min-width: 50px;
	text-align: center;
	width: 5em !important;
	font-size: 100%;
	display: inline-block !important;
	padding: 0.358em 1em;
}

.tc-extra-product-options .cpf-type-product .tc-epo-element-product-li-container .tc-epo-element-product-container .single_add_to_cart_product,
.single_add_to_cart_product {
	vertical-align: baseline;
	float: none;
}

.tc-row.tc-quantity-right .tc-cell,
.tc-row.tc-quantity-left .tc-cell,
.tm-quantity.tm-bottom {
	margin-bottom: 0;
}

/* Description */

.tm-description p:last-child {
	margin-bottom: 0 !important;
}

.tm-description {
	clear: both;
}

.tm-section-description {
	margin: 0;
}

/* 4. Floatbox */

.fl-overlay {
	background: #f5f5f5;
	position: fixed;
	display: block;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	z-index: 101000;
}


.flasho {
	background: #fff;
	color: #000;
	border: 1px solid #fff;
	left: 0;
	position: absolute;
	top: 0;
	z-index: 101001;
	-webkit-box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	max-height: 100%;
	border-radius: 0;
	max-width: 100%;
	overflow: hidden;
	display: grid;
	grid-template-rows: minmax(1em, auto) minmax(33%, 1fr) minmax(1em, auto);
	gap: var(--tcgaprow) 0;
	padding: var(--tcgap);
}

.float-editbox {
	position: relative;
	overflow: auto;
	overflow-x: hidden;
	overflow-y: auto;
}

.flasho .header {
	line-height: 2;
	width: 100%;
	border-bottom: 1px solid #ecf0f1;
	padding-bottom: var(--tcgaprow);
}

.flasho .header h3 {
	color: #63728b;
	font-size: 22px;
	font-weight: 400;
	line-height: 28px;
	margin: 0;
	letter-spacing: 1px;
}

.flasho .footer {
	margin: 0;
	padding: 0;
	text-align: right;
}

.flasho .footer .inner {
	border-top: 1px solid #ecf0f1;
	padding-top: var(--tcgaprow);
}

.tm-section-pop {
	display: none;
}

.tm-section-pop-up {
	height: 80%;
	left: 10% !important;
	position: fixed !important;
	top: 10% !important;
	width: 80%;
}

#tm-section-pop-up > .tc-epo-label.tm-section-label {
	display: none;
}

.tm-section-pop-up.single .tc-cell.section_popup {
	width: 100% !important;
	max-width: 100%;
	--flex-items: 1 !important;
}

.tm-section-pop-up.single .tc-cell.section_popup .tm-section-pop {
	padding-top: 1em;
	padding-bottom: 1em;
}

.tm-extra-product-options.tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel,
.tc-extra-product-options .tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel {
	float: none;
}

.noanimated {
	-webkit-animation-fill-mode: none !important;
	animation-fill-mode: none !important;
	opacity: 1 !important;
	z-index: auto !important;
	position: static !important;
	-webkit-transform: none !important;
	transform: none !important;
}

/* 5. Floating totals box */

.tm-floating-box {
	width: auto;
	height: auto;
	padding: 1em;
	position: fixed;
	right: 0;
	top: 0;
	bottom: 0;
	left: 0;
	background: rgba(255, 255, 255, 0.99);
	z-index: 99999;
	max-height: 100%;
	overflow: hidden;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	max-width: 20vw;
	gap: var(--tcgap);
	line-height: normal;
	border: 2px solid rgba(0, 0, 0, 0.05);
}

.tm-floating-box .tc-row,
.tm-floating-box .tm-extra-product-options-totals {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

.tm-floating-box.right {
	left: auto;
	right: 0;
}

.tm-floating-box.left {
	right: auto;
	left: 0;
}

.tm-floating-box.bottom {
	bottom: 0;
	top: auto;
}

.tm-floating-box.top {
	top: 0;
	bottom: auto;
}

.tm-fb {
	font-size: 12px;
	line-height: 18px;
	max-height: 200px;
	max-width: 100%;
	overflow-y: auto;
	overflow-x: hidden;
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	gap: 0;
}

.tm-fb dt {
	margin: 0;
	padding: 0;
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.tm-fb dd {
	margin: 0 0 var(--tcinnergaprow) 0;
	padding: 0;
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.tm-fb-title {
	font-weight: 700;
}

.tm-fb-value {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcinnergap);
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-fb-value > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
}

.tm-floating-box-alt .tm-floating-box {
	background: none;
	padding: 0;
	position: static;
	max-width: 100%;
	border: 0;
}

.tm-floating-box-nks .tm-floating-box {
	bottom: 0 !important;
	left: 0 !important;
	padding: 5%;
	position: absolute !important;
	right: 0 !important;
	top: 0 !important;
	width: 100%;
}

.tm-floating-box-nks .tm-fb {
	max-height: 90% !important;
	max-width: 90% !important;
}

.tc-row.tm-fb-labels {
	border-bottom: 1px solid;
	font-weight: 700;
	margin-bottom: 1.65em;
	padding: 0 0 1em 0;
}

.tc-row.tm-fb-labels .tm-fb-price,
.tc-row.tm-fb-data .tm-fb-price {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
}

.tc-row.tm-fb-labels .tm-fb-quantity,
.tc-row.tm-fb-data .tm-fb-quantity {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.tc-img-floating .tmhexcolorimage.tc-center .tc-image,
.tc-img-floating .tc-image {
	max-width: calc(var(--tcinlinesize) * 2) !important;
	margin: 0;
	max-height: calc(var(--tcinlinesize) * 2) !important;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tc-img-floating .tmhexcolorimage.tc-center .tc-image {
	padding-top: calc((var(--tcinlinesize) * 2) - (2px * 2)) !important;
}

.tc-img-floating .tm-transparent-swatch .tc-image {
	border-style: dotted;
	border-color: inherit;
}

/* 6. Validation errors */

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap label.tm-error,
.tm-extra-product-options ul.tmcp-ul-wrap + .tm-error,
.tm-extra-product-options .tc-element-container > .tm-error {
	color: #f00;
	display: block !important;
	font-size: 80%;
	font-weight: 700;
	padding: 0 !important;
	margin: 1em 0 !important;
}

.tm-extra-product-options .tc-cell.tm-error {
	color: #f00;
	display: block;
	font-size: 80%;
	font-weight: 700;
	margin: 1em 0 !important;
}

.tm-epo-field.tmcp-textfield.tm-error,
.tm-epo-field.tmcp-textarea.tm-error {
	border: 1px solid #c0392b;
	color: #e74c3c;
	outline: 0;
}

/* 7. Lightbox */

.tc-transition {
	-webkit-transition: all 0.3s ease 0s;
	transition: all 0.3s ease 0s;
}

.tc-lightbox {
	background: rgba(0, 0, 0, 0.5) none repeat scroll 0 0;
	height: auto !important;
	left: 50% !important;
	max-height: 100% !important;
	max-width: 100% !important;
	position: fixed;
	text-align: center;
	top: 50% !important;
	-webkit-transform: translateX(-50%) translateY(-50%);
	transform: translateX(-50%) translateY(-50%);
	width: auto !important;
	z-index: 100100;
	-webkit-transform-style: preserve-3d;
	transform-style: preserve-3d;
	display: block;
	padding: 0;
}

.tc-lightbox-image-wrap {
	position: relative;
}

.tc-lightbox-wrap {
	position: absolute;
	right: 0;
	bottom: 0;
	width: 1em;
	height: 1em;
	left: auto;
	top: auto;
	font-size: 1.5em;
}

.tc-lightbox-button {
	background: rgba(0, 0, 0, 0.2) none repeat scroll 0 0;
	top: 0;
	color: #fff;
	font-size: 1em !important;
	padding: 0;
	position: absolute;
	right: 0;
	z-index: 2;
	opacity: 0.5;
	cursor: -webkit-zoom-in;
	cursor: zoom-in;
	margin: auto;
	bottom: 0;
	left: 0;
}

.circle .tc-lightbox-button {
	border-radius: 100%;
}

.round .tc-lightbox-button {
	border-radius: 5px;
}

.tc-lightbox-wrap:hover .tc-lightbox-button {
	opacity: 1;
}

.tc-lightbox img {
	border: 0 none;
	cursor: -webkit-zoom-out;
	cursor: zoom-out;
	display: block;
	height: auto;
	line-height: 0;
	margin: 0;
	padding: 0;
	position: relative;
	width: auto;
}

.tc-lightbox-button-close {
	background: rgba(255, 255, 255, 0.3) none repeat scroll 0 0;
	color: #000 !important;
	float: left;
	height: 2em;
	line-height: 2;
	position: absolute;
	right: 0;
	text-align: center;
	top: 0;
	width: 2em;
	z-index: 2;
	cursor: pointer;
}

@-webkit-keyframes tc-lightbox-zoomin {

	0% {
		opacity: 0;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(0.3);
		transform: translateX(-50%) translateY(-50%) scale(0.3);
	}

	50% {
		opacity: 1;
	}
}

@keyframes tc-lightbox-zoomin {

	0% {
		opacity: 0;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(0.3);
		transform: translateX(-50%) translateY(-50%) scale(0.3);
	}

	50% {
		opacity: 1;
	}
}

.tc-lightbox-zoomin {
	-webkit-animation-name: tc-lightbox-zoomin;
	animation-name: tc-lightbox-zoomin;
}

@-webkit-keyframes tc-lightbox-zoomout {

	0% {
		opacity: 1;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(1);
		transform: translateX(-50%) translateY(-50%) scale(1);
	}

	50% {
		opacity: 0;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(0.3);
		transform: translateX(-50%) translateY(-50%) scale(0.3);
	}

	100% {
		opacity: 0;
	}
}

@keyframes tc-lightbox-zoomout {

	0% {
		opacity: 1;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(1);
		transform: translateX(-50%) translateY(-50%) scale(1);
	}

	50% {
		opacity: 0;
		-webkit-transform: translateX(-50%) translateY(-50%) scale(0.3);
		transform: translateX(-50%) translateY(-50%) scale(0.3);
	}

	100% {
		opacity: 0;
	}
}

.tc-lightbox-zoomout {
	-webkit-animation-name: tc-lightbox-zoomout;
	animation-name: tc-lightbox-zoomout;
}

/* 8. Datepicker and Timepicker*/

.tm-static {
	position: static;
}

.tmcp-date-select {
	max-width: 100%;
}

.tm-epo-field.tmcp-date {
	min-height: 2.5em !important;
	height: auto;
}

.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label:not(.fullwidth) .tm-epo-field.tmcp-date {
	width: auto !important;
}


.tm-epo-datepicker-label-container,
.tm-epo-timepicker-label-container {
	display: inline-block !important;
	vertical-align: baseline;
	position: relative;
	max-width: 100%;
}

.tm-extra-product-options .tm-epo-datepicker,
.tm-extra-product-options .tm-epo-timepicker {
	display: inline-block !important;
	line-height: normal !important;
	margin: 0 !important;
	max-width: 100% !important;
	padding-right: 2.5em !important;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tc-epo-label.tc-left + .tc-element-container .tm-epo-datepicker-label-container,
.tc-epo-label.tc-right + .tc-element-container .tm-epo-datepicker-label-container {
	margin-top: 0;
}

/* datepicker skin */

.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger,
.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger {
	font-family: tc-fontawesome, sans-serif !important;
	-webkit-box-shadow: none;
	box-shadow: none;
	border-radius: 0;
	background: transparent none repeat scroll 0 0 !important;
	border-width: 0;
	color: inherit !important;
	cursor: pointer;
	display: inline-block;
	font-size: inherit !important;
	line-height: inherit !important;
	margin: 0;
	padding: 0 !important;
	position: absolute;
	right: 0;
	top: 0;
	height: 100% !important;

}

.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:hover,
.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:active,
.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:focus,
.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:hover,
.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:active,
.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:focus {
	background: none repeat scroll 0 0 transparent;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger::before {
	content: "\f073";
	padding: calc(0.75em - 2px);
	border-width: 0 0 0 1px;
	border-style: solid;
}

.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger::before {
	content: "\f017";
	padding: calc(0.75em - 2px);
	border-width: 0 0 0 1px;
	border-style: solid;
}

.tm-datepicker {
	margin: 2px 0 0 0;
	z-index: 101002 !important;
	width: auto !important;
	height: auto !important;
	padding: 0;
}

.tm-datepicker a {
	text-decoration: none;
}

.tm-ui-dp,
.tm-ui-dp-overlay {
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

.tm-ui-dp-header.ui-widget-header {
	line-height: 2;
	background: none;
	border: 0 none;
	color: inherit;
	font-weight: 700;
}

.tm-ui-dp {
	max-width: 98%;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 2;
	text-shadow: none;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}

.tm-ui-dp:focus {
	outline: 0;
}

.tm-ui-dp-container {
	min-width: 300px;
	overflow: hidden;
	text-align: center;
	font-size: 16px;
}

.tm-datepicker-small .tm-ui-dp-container {
	font-size: 12px;
	min-width: 240px;
}

.tm-datepicker-medium .tm-ui-dp-container {
	font-size: 16px;
	min-width: 330px;
}

.tm-datepicker-large .tm-ui-dp-container {
	font-size: 20px;
	min-width: 400px;
}

.tm-datepicker.tm-datepicker-top .tm-ui-dp-title,
.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-title {
	font-size: 1.125em;
}

.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-container,
.tm-datepicker.tm-datepicker-top .tm-ui-dp-container {
	min-width: 100% !important;
}

.tm-ui-dp-wrap,
.tm-ui-dp-overlay {
	width: 100%;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
}

.tm-ui-dp-wrap {
	z-index: 99998;
}

.tm-ui-dp-overlay {
	z-index: 1;
	background: rgba(0, 0, 0, 0.7);
}

.tm-datepicker-top .tm-ui-dp,
.tm-datepicker-bottom .tm-ui-dp {
	width: 100%;
	max-width: 100%;
}

.tm-ui-dp-main-cell-inner {
	position: relative;
	height: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

.tm-ui-dp-main-wrap {
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
}

.tm-ui-dp-ui {
	display: inline-block;
	vertical-align: middle;
	width: 100%;
}

.tm-ui-dp-main {
	width: auto;
}

.tm-ui-dp-main table {
	width: 100%;
	height: 100%;
	border-collapse: collapse;
	table-layout: fixed;
	margin: 0;
	background: none;
	border: 0;
}

.tm-ui-dp-main-table {
	height: 100%;
	width: 100%;
	display: table;
	table-layout: fixed;
}

.tm-ui-dp-main-row {
	white-space: nowrap;
	display: table-row;
}

.tm-ui-dp-main-cell {
	line-height: 1.875;
	text-align: center;
	width: 14.2857%;
	height: 16.6666%;
	position: relative;
	display: table-cell;
	vertical-align: middle;
	cursor: pointer;
}

.tm-ui-dp-main-cell.ui-datepicker-unselectable,
.tm-ui-dp-main-cell.ui-state-disabled {
	cursor: default;
}

.tm-ui-dp-main-cell .tm-ui-dp-main-cell-inner {
	overflow: visible;
}

.tm-ui-dp-main-cell-content {
	position: relative;
	z-index: 2;
	padding: 5px;
}

.tm-datepicker .tm-ui-dp-main-wrap {
	padding: 0.5em;
}

.tm-datepicker .tm-ui-dp-main-header th {
	font-size: 0.6875em;
	font-weight: 400;
	line-height: 2.225;
	text-align: center;
	border: 0;
}

.tm-datepicker .tm-ui-dp-main-cell-content {
	font-size: 0.8125em;
}

.tm-ui-dp-inner-container,
.tm-ui-dp-main-wrap,
.tm-ui-dp-main-content {
	position: relative;
}

.tm-datepicker.tm-datepicker-bottom,
.tm-datepicker.tm-datepicker-top {
	bottom: 0 !important;
	height: 100% !important;
	left: 0 !important;
	position: fixed !important;
	right: 0 !important;
	top: 0 !important;
	width: 100% !important;
	margin: 0 !important;
	background: transparent !important;
	border: 0 none !important;
}

.tm-datepicker.tm-datepicker-bottom .tm-ui-dp {
	bottom: 0;
	top: auto;
}

.tm-datepicker.tm-datepicker-top .tm-ui-dp {
	top: 0;
	bottom: auto;
}

.tm-datepicker .ui-tm-datepicker-prev,
.tm-datepicker .ui-tm-datepicker-next,
.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-prev,
.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-prev,
.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-next,
.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-next {
	display: none !important;
}

.tm-ui-dp-title {
	position: relative;
	font-size: 1em;
}

.tm-ui-dp-title .tm-ui-dp-month,
.tm-ui-dp-title .tm-ui-dp-year {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	margin: 0 2em;
	white-space: nowrap;
}

.tm-ui-dp-title-button {
	width: 50%;
	display: inline-block;
	white-space: nowrap;
	vertical-align: top;
	position: relative;
	height: 2em;
}

.tm-ui-dp-button-prev {
	left: 0;
}

.tm-ui-dp-button-next {
	right: 0;
}

.tm-ui-dp-button {
	margin: 0;
	position: absolute;
	top: 0;
	width: 2em;
	overflow: hidden;
	display: block;
	text-decoration: none;
	white-space: nowrap;
	text-overflow: ellipsis;
	vertical-align: top;
	height: 2em;
	line-height: 2;
	color: #4eccc4;
	text-transform: uppercase;
	padding: 0;
}

.tm-ui-dp-button .tm-ui-dp-button-arrow,
.tm-ui-dp-month,
.tm-ui-dp-year {
	cursor: pointer;
}

.tm-datepicker .tm-ui-dp-button-arrow {
	color: #4eccc4;
	font-size: 1em;
	line-height: 2;
	overflow: hidden;
	width: 2em;
}

.tm-ui-dp-button-arrow::before {
	display: block;
}

.tm-ui-dp-buttonpane {
	display: block;
	overflow: hidden;
	padding: 0 0.5em 0.5em;
	text-align: right;
	width: 100%;
}

.tm-ui-dp-btn-wrap {
	display: block;
	float: right;
	position: relative;
	vertical-align: top;
	z-index: 5;
}

.tm-ui-dp-btn {
	height: 2.5em;
	line-height: 2.5;
	padding: 0 1em;
	text-transform: uppercase;
	cursor: pointer;
	display: block;
	overflow: hidden;
	text-decoration: none;
	text-overflow: ellipsis;
	vertical-align: top;
	white-space: nowrap;
}

.tm-ui-dp-button-disabled {
	opacity: 0.3;
	cursor: default;
}

/* datepicker skins */

/* epo black skin */

.tm-ui-skin-epo-black .tm-ui-dp-container {
	font-family: Helvetica, Arial, sans-serif !important;
	border: 1px solid #000 !important;
	-webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.2);
	box-shadow: 0 1px 10px rgba(0, 0, 0, 0.2);
	background: #000 none repeat scroll 0 0;
	background: rgba(0, 0, 0, 0.9) none repeat scroll 0 0;
	color: #fff;
}

/* normal cell text*/

.tm-ui-skin-epo-black .tm-ui-dp-main-cell .ui-state-default {
	color: #ecf0f1;
}

.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default {
	color: #777;
}

/* selected day */

.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day,
.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover {
	background-color: #1abc9c;
}

.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,
.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default {
	color: #fff;
}

.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover {
	background-color: #fff;
}

.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover .ui-state-default {
	color: #000;
}

/* unselectable cell text*/

.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,
.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default {
	color: #222;
}

/* disabled and unselectable cell*/

.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable,
.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled {
	background-color: #000;
	background-color: rgba(255, 255, 255, 0.02);
}

.tm-ui-skin-epo-black .tm-ui-dp-btn {
	color: #1abc9c;
}

.tm-ui-skin-epo-black .tm-ui-dp-btn:hover {
	color: #fff;
}

.tm-ui-skin-epo-black .tm-ui-dp-button-arrow,
.tm-ui-skin-epo-black .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover {
	color: #1abc9c;
}

.tm-ui-skin-epo-black .tm-ui-dp-button-arrow:hover {
	color: #fff;
}

.tm-ui-skin-epo-black .tm-ui-dp-main-header {
	color: #1abc9c;
	border-bottom: 1px solid #1abc9c;
}

/* epo white skin */

.tm-ui-skin-epo.tm-datepicker .tm-ui-dp-main-wrap {
	padding: 0;
}

.tm-ui-skin-epo .tm-ui-dp-container {
	font-family: Helvetica, Arial, sans-serif !important;
	border: 1px solid #ddd !important;
	-webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.2);
	box-shadow: 0 1px 10px rgba(0, 0, 0, 0.2);
	background: #fff none repeat scroll 0 0;
	color: #2c3e50;
}

/* normal cell text*/

.tm-ui-skin-epo .tm-ui-dp-main-cell .ui-state-default {
	color: #2c3e50;
	background: none;
	border: 0 none;
}

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-other-month .ui-state-default {
	color: #aaa;
}

/* current day cell text*/

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-current-day .ui-state-default {
	color: #0a0;
}

/* normal cell text in other month */

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default {
	color: #95a5a6;
}

/* selected day */

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day,
.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover {
	background-color: #9b59b6;
}

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,
.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default {
	color: #fff;
}

/* cell hover */

.tm-ui-skin-epo .tm-ui-dp-main-cell:hover {
	background-color: #ecf0f1;
}

.tm-ui-skin-epo .tm-ui-dp-main-cell:hover .ui-state-default {
	color: #000;
}

/* unselectable cell text*/

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,
.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default {
	color: #eee;
}

/* disabled and unselectable cell*/

.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable,
.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled {
	background-color: #fff;
}

.tm-ui-skin-epo .tm-ui-dp-btn {
	color: #2c3e50;
}

.tm-ui-skin-epo .tm-ui-dp-btn:hover {
	color: #8e44ad;
}

.tm-ui-skin-epo .tm-ui-dp-button-arrow,
.tm-ui-skin-epo .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover {
	color: #2c3e50;
}

.tm-ui-skin-epo .tm-ui-dp-button-arrow:hover {
	color: #34495e;
}

.tm-ui-skin-epo .tm-ui-dp-main-header {
	background: #f9f9f9 none repeat scroll 0 0;
	border-bottom: 1px solid #eee;
	border-top: 1px solid #eee;
	color: #7f8c8d;
	padding: 0.25em 0;
}

.tm-ui-skin-epo .tm-ui-dp-title {
	padding: 0.5em 0;
}

.ui-tm-timepicker-div .tm-ui-widget-header,
.ui-tm-timepicker-div .ui_tpicker_time_label,
.tm-timepicker .tm-ui-dp-current {
	display: none;
}

.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle {
	border-radius: 100%;
	background: #ecf0f1;
	border: 1px solid #bdc3c7;
	cursor: default;
	height: 1.2em;
	position: absolute;
	width: 1.2em;
	z-index: 2;
}

.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle.ui-state-hover {
	background: #fff;
}

.ui-tm-timepicker-div .ui-slider {
	position: relative;
}

.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal {
	border-color: #aaa;
	-o-border-image: none;
	border-image: none;
	border-radius: 0;
	border-style: solid;
	border-width: 0 0 1px;
	height: 1px;
	margin: 1em 0;
	padding: 0.2em 0 0;
}

.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal .ui-slider-handle {
	margin-left: -0.6em;
	top: -0.3em;
}

.ui-tm-timepicker-div .ui-widget-header {
	margin-bottom: 8px;
}

.ui-tm-timepicker-div dl {
	text-align: left;
	margin: 0;
}

.ui-tm-timepicker-div dl dt {
	clear: left;
	float: left;
	margin: 0.725em 0 0;
	padding: 0;
}

.ui-tm-timepicker-div dl dd {
	display: block;
	margin: 0 1em 0.5em 30%;
	padding: 1px 0;
	float: none;
}

.ui-tm-timepicker-div td {
	font-size: 90%;
}

.ui-tpicker-grid-label {
	background: none;
	border: none;
	margin: 0;
	padding: 0;
}

.ui-tm-timepicker-div .ui_tpicker_unit_hide {
	display: none;
}

.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input {
	background: none;
	color: inherit;
	border: none;
	outline: none;
	border-bottom: 0 none;
	width: 95%;
}

.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus {
	border-bottom-color: #aaa;
}

.ui-tm-timepicker-rtl {
	direction: rtl;
}

.ui-tm-timepicker-rtl dl {
	text-align: right;
}

.ui-tm-timepicker-rtl dl dt {
	float: right;
	clear: right;
}

.ui-tm-timepicker-rtl dl dd {
	margin: 0 30% 0.5em 1em;
}

/* Shortened version style */

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine {
	padding-right: 2px;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time,
.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dt {
	display: none;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time_label {
	display: block;
	padding-top: 2px;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl {
	text-align: right;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd,
.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd > div {
	display: inline-block;
	margin: 0;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_minute::before,
.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_second::before {
	content: ":";
	display: inline-block;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_millisec::before,
.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_microsec::before {
	content: ".";
	display: inline-block;
}

.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide,
.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide::before {
	display: none;
}

.ui-tm-timepicker-div {
	padding: 1em 1em 0;
}

.tm-ui-tp-title {
	padding: 0.5em 0;
}

/* 9. Checkbox and Radio button */
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: start !important;
	-ms-flex-pack: start !important;
	justify-content: flex-start !important;
	float: none;
	max-width: none;
	width: auto;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	margin: 0;
	gap: var(--tcgap);
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox li.tmcp-field-wrap,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio li.tmcp-field-wrap {
	padding: 0;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	margin: 0;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tm-auto-row {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
	width: auto;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap.tm-auto-row,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap.tm-auto-row {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
	flex: 0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
	width: auto;
	max-width: calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));
	--flex-items: 4;
}

.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startcolor,
.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endcolor,
.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startimages,
.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endimages {
	width: 100%;
}

.tc-label-wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	gap: var(--tcinnergap);
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.fullwidth-ul .tc-label-wrap {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.fullwidth-ul .tc-label-inner .tc-price-wrap {
	justify-self: flex-end;
}

.fullwidth-ul .tc-mode-color .tc-label-inner .tc-price-wrap,
.fullwidth-ul .tc-mode-images .tc-label-inner .tc-price-wrap {
	justify-self: center;
}

.tc-input-wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tc-mode-images .tc-label-wrap,
.tc-mode-color .tc-label-wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
	gap: var(--tcinnergap);
}

.tc-mode-images .tc-inline-description,
.tc-mode-color .tc-inline-description {
	text-align: center;
}

.tc-inline-description:empty {
	display: none;
}

.radio-image-label,
.checkbox-image-label {
	display: block;
	text-align: center;
	line-height: 1.5;
	width: 100%;
}

.tc-label.tm-label .radio-image-label,
.tc-label.tm-label .checkbox-image-label {
	display: inline;
	margin-right: 0.5em;
}

.tc-label.tm-label .radio-image-label:empty,
.tc-label.tm-label .checkbox-image-label:empty {
	margin-right: 0;
}

.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-label-wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: nowrap;
	flex-wrap: nowrap;
	gap: var(--tcinnergap);
}

.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .fullwidth .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .fullwidth .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .fullwidth .tc-label-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .fullwidth .tc-label-wrap {
	-webkit-box-flex: 1;
	-ms-flex-positive: 1;
	flex-grow: 1;
}

.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-epo-style-wrapper,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-input-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-epo-style-wrapper,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-input-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-epo-style-wrapper,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-input-wrap,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-epo-style-wrapper,
.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-input-wrap {
	display: none;
}

li.tmcp-field-wrap.tm-per-row.is-separator {
	-webkit-box-flex: 0 !important;
	-ms-flex: 0 0 100% !important;
	flex: 0 0 100% !important;
	max-width: 100% !important;
}

.tm-extra-product-options .is-separator .tc-label-wrap.tc-separator {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	-ms-flex: 1 1 0;
	flex: 1 1 0;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.is-separator .tc-label.tc-separator-label {
	padding: 0 !important;
	width: 100%;
}

.tm-extra-product-options .is-separator .tc-tooltip {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 0;
	flex: 0 1 0;
	margin: 0;
}

/* 10. Checkbox and Radio button custom styles */

.tc-epo-style-wrapper + .tmhexcolorimage,
.tc-epo-style-wrapper + .tc-label-wrap .tmhexcolorimage:first-child {
	margin: 0 0.5em;
	vertical-align: middle;
}

.tc-epo-style-wrapper .tc-input-wrap .tm-epo-field {
	position: absolute !important;
	top: calc(var(--tc-radio-size) / 2);
	left: calc(var(--tc-radio-size) / 2);
	-webkit-transform: translate(-50%, -50%);
	transform: translate(-50%, -50%);
	opacity: 0;
}

.tc-active .tc-epo-style-wrapper .tm-epo-style::after {
	opacity: 1;
}

.tc-epo-style-wrapper {
	height: auto;
	width: auto;
	position: relative;
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	font-size: 1em;
	-webkit-transform: translate(0%, 50%);
	transform: translate(0%, 50%);
	top: calc(var(--tc-radio-size) / -2);
	letter-spacing: 0;
	word-spacing: 0;
	-webkit-font-kerning: none;
	font-kerning: none;
	font-family: none;
	--tc-radio-size: 1.5em;
	--tc-radio-font-size: 1em;
}

.tm-epo-style {
	position: relative;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	background: transparent none repeat scroll 0 0;
	border: 1px solid;
	cursor: pointer;
	height: var(--tc-radio-size);
	line-height: 1;
	margin: 0;
	padding: 0;
	width: var(--tc-radio-size);
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	font-size: var(--tc-radio-font-size);
}

.tm-epo-style::after {
	content: "\f00c";
	background: transparent none repeat scroll 0 0;
	font-family: tc-fontawesome, sans-serif !important;
	font-weight: 900;
	height: 1em !important;
	opacity: 0;
	display: inline-block !important;
	text-align: center !important;
	width: 1em !important;
	color: inherit !important;
	font-size: inherit !important;
	bottom: auto !important;
	line-height: 1 !important;
}

.tc-epo-style-wrapper.tc-radio .tm-epo-style::after {
	content: "\f111";
}

.tm-epo-style:hover::after {
	opacity: 0.5;
}

.tm-epo-style.circle,
.tm-epo-style.circle2 {
	border-radius: 100%;
}

.tm-epo-style.round,
.tm-epo-style.round2 {
	border-radius: 5px;
}

.tm-epo-style.circle2,
.tm-epo-style.round2,
.tm-epo-style.square2 {
	border-width: 2px;
}

.tc-epo-style-wrapper.square .tm-epo-style::after {
	font-size: 0.6em !important;
}

.tc-epo-style-wrapper.circle2 .tm-epo-style::after,
.tc-epo-style-wrapper.round2 .tm-epo-style::after,
.tc-epo-style-wrapper.square2 .tm-epo-style::after {
	font-size: 0.5em !important;
}


/* 11. Checkbox and Radio button swatches */

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper {
	padding: var(--tcinnergap);
	gap: var(--tcgap);
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper label {
	cursor: pointer;
	-webkit-box-flex: 1;
	-ms-flex: 1 1 100%;
	flex: 1 1 100%;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.tc-epo-text-label-wrapper {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	gap: var(--tcinnergap);
	-ms-flex-wrap: nowrap;
	flex-wrap: nowrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	width: auto;
	max-width: -webkit-fit-content;
	max-width: -moz-fit-content;
	max-width: fit-content;
	min-width: var(--tcinlinesize);
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images .tmcp-field-wrap-inner,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color .tmcp-field-wrap-inner {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text .tmcp-field-wrap-inner {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	width: auto;
}

.tc-epo-text-wrapper input[type="checkbox"].tm-epo-field,
.tc-epo-text-wrapper input[type="radio"].tm-epo-field {
	visibility: hidden;
	position: absolute;
	display: inline !important;
}

.tmhexcolorimage {
	display: block;
	height: 100% !important;
	max-height: 100% !important;
	max-width: 100% !important;
	width: 100%;
}

.tm-floating-box .tmhexcolorimage {
	min-width: 50px !important;
	min-height: 50px !important;
}

.tm-floating-box .radio-image-label,
.tm-floating-box .checkbox-image-label {
	text-align: initial;
}

.tmhexcolorimage.tc-center .tc-image {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: auto !important;
	height: auto !important;
	padding-top: calc(100% - (2px * 2)) !important;
	max-width: calc(100% - (2px * 2)) !important;
	vertical-align: middle;
	-webkit-box-sizing: content-box;
	box-sizing: content-box;
	min-width: min(var(--tcinlinesize), calc(100% - (2px * 2)));
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap input.use_images + label {
	display: inline-block;
	padding: 0 !important;
	max-width: 100%;
	border: 0 solid;
	position: relative;
	line-height: 0;
	margin: 0 !important;
	height: auto !important;
	background: none !important;
}

.tc-image {
	border-width: 2px;
	border-style: solid;
	border-color: transparent;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin: auto;
	padding: 0;
	pointer-events: none !important;
	height: auto;
	max-width: 100%;
}

.tm-extra-product-options .tc-active .tc-image {
	border-style: solid;
}

.tc-image.tc-image-inline,
.tc-image-inline {
	position: relative;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	background: transparent none repeat scroll 0 0;
	border: 2px solid transparent;
	cursor: pointer;
	height: var(--tcinlinesize);
	line-height: 1;
	margin: 0;
	padding: 0;
	width: auto;
	min-width: var(--tcinlinesize);
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	font-size: 1em;
}

.tc-epo-style-space::after {
	content: "\00a0";
	display: inline;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	position: relative;
	margin-left: calc(-1ch / 2);
	font-family: sans-serif;
}

.tc-center .tc-epo-style-space::after {
	display: none;
}

.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tmhexcolorimage-inline {
	width: auto !important;
	padding: 0 !important;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	margin: 0;
	-webkit-transform: translate(0, 50%);
	transform: translate(0, 50%);
	top: calc(var(--tcinlinesize) / -2);
	position: relative;
	height: auto !important;
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	font-size: 1em;
}

.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tc-image-inline {
	max-height: var(--tcinlinesize) !important;
	-ms-flex-item-align: start;
	align-self: flex-start;
	-ms-flex-negative: 0;
	flex-shrink: 0;
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text {
	border-style: solid;
	cursor: pointer;
	border-color: var(--text-swatch-border-color);
	border-width: var(--text-swatch-border-width);
	border-radius: var(--swatch-border-radius);
}

.tc-image,
.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image {
	border-color: var(--swatch-border-color);
	border-width: var(--swatch-border-width);
	border-radius: var(--swatch-border-radius);
}

.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text,
.tm-extra-product-options .tmcp-field-wrap.tc-active .tc-label-wrap .tc-image {
	border-color: var(--swatch-active-border-color);
	border-width: var(--swatch-active-border-width);
}

.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text {
	outline-width: 1px;
	outline-style: solid;
	outline-color: var(--swatch-active-border-color);
	border-width: var(--text-swatch-active-border-width);
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.round,
.round .tc-image,
.round.tc-image,
.tm-extra-product-options .tmcp-field-wrap.round .tc-label-wrap .tc-image {
	--swatch-border-radius: 5px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.circle .tc-image,
.circle.tc-image,
.tm-extra-product-options .tmcp-field-wrap.circle .tc-label-wrap .tc-image {
	--swatch-border-radius: 100%;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.circle {
	--swatch-border-radius: 18px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.square,
.square .tc-image,
.square.tc-image,
.tm-extra-product-options .tmcp-field-wrap.square .tc-label-wrap .tc-image {
	--swatch-border-radius: 0;
	--swatch-border-width: 2px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.shadow,
.shadow .tc-image,
.shadow.tc-image,
.tm-extra-product-options .tmcp-field-wrap.shadow .tc-label-wrap .tc-image {
	--swatch-border-radius: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow.tc-mode-text,
.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow .tc-label-wrap .tc-image {
	-webkit-box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.5);
	box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.5);
}

.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.thinline,
.thinline .tc-image,
.thinline.tc-image,
.tm-extra-product-options .tmcp-field-wrap.thinline .tc-label-wrap .tc-image {
	--swatch-border-radius: 0;
	--swatch-border-width: 1px;
	border-style: groove;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image.tm-transparent-swatch,
.tm-transparent-swatch .tc-image,
.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tm-transparent-swatch .tc-image {
	border-style: dotted;
	border-color: inherit;
}

.tm-extra-product-options input.use_images + label + .amount {
	display: block;
	text-align: center;
}

.radio-image-label-inline,
.checkbox-image-label-inline {
	display: inline;
}

.tc-label.tm-label .radio-image-label + .tmhexcolorimage,
.tc-label.tm-label .checkbox-image-label + .tmhexcolorimage {
	vertical-align: middle;
}

.tm-hide-label + .radio-image-label,
.tm-hide-label + * + .radio-image-label,
.tm-hide-label + .checkbox-image-label,
.tm-hide-label + * + .checkbox-image-label {
	display: none !important;
}

/* 12. Product element */

.tm-extra-product-options .tmcp-ul-wrap.tm-extra-product-options-product {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcgap);
}

.tm-extra-product-options-product > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

li.tc-epo-element-product-holder {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tc-epo-element-product-container-wrap:empty {
	margin: 0;
}

.tc-epo-element-product-container {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: justify !important;
	-ms-flex-pack: justify !important;
	justify-content: space-between !important;
}

.tc-epo-element-product-container-left,
.tc-epo-element-product-container-right,
.tc-epo-element-product-container-full {
	padding: 0;
	margin: 0;
}

.tc-epo-element-product-container-cart {
	display: grid;
	gap: var(--tcgap);
}

.tc-epo-element-product-container-cart > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
	margin: 0 !important;
}

.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-cart > .stock {
	text-align: center;
}

.tc-extra-product-options-inline {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcgap);
}

.tc-extra-product-options-inline > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

.tc-extra-product-options-inline:not(:has(.tc-extra-product-options)) {
	display: none;
}

.tc-epo-element-product-container-wrap .product-title,
.tc-epo-element-product-container-wrap .product-price,
.tc-epo-element-product-container-wrap .product-description,
.tc-epo-element-product-container-wrap .product-meta,
.tc-epo-element-product-container-wrap .tc-extra-product-options-inline {
	margin: 0;
	padding: 0;
}

.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity,
.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity-alt {
	max-width: none;
	text-align: center;
}

/* The first selector is to take into account some Elementor configurations. */
.woocommerce div.product .tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity,
.tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity {
	float: none;
	display: inline-block !important;
	font-size: inherit;
	margin: 0;
}

.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product > li.tc-epo-element-product-li-container,
.tm-extra-product-options .cpf-type-product-dropdown ul.tmcp-ul-wrap.tm-element-ul-product > li.tc-epo-element-product-li-container {
	padding: 0;
	margin: 0;
	list-style: none outside none !important;
	position: relative;
}

.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > .tc-field-label-wrap,
.tm-extra-product-options .cpf-type-product-checkbox ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner .tc-field-label-wrap {
	gap: var(--tcinnergap);
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tc-epo-element-product-li-container,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tc-epo-element-product-li-container {
	padding: var(--tcgaprow) 0;
	max-width: 100%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	list-style: none outside none !important;
	position: relative;
	margin: 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tc-epo-element-product-li-container {
	padding: var(--tcgap);
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap label,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap label {
	cursor: pointer;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap .tm-epo-field.tmcp-radio,
.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap .tc-epo-style-wrapper,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > label .tm-epo-field.tmcp-checkbox,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > label .tc-epo-style-wrapper,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > label .tm-epo-field.tmcp-checkbox,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > label .tc-epo-style-wrapper {
	display: none;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	-ms-flex-align: stretch;
	align-items: stretch;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: start !important;
	-ms-flex-pack: start !important;
	justify-content: flex-start !important;
	margin: 0;
	float: none;
	max-width: none;
	width: auto;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap {
	max-width: 100%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	margin: 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	gap: 0;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner {
	max-width: 100%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	margin: 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	display: grid;
	grid-template-columns: 1fr;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > .tm-epo-field-label,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > .tm-epo-field-label {
	text-align: center;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap .tm-epo-reset-radio {
	right: var(--tcgapcolumn);
	top: var(--tcgaprow);
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap img.wp-post-image,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap img.wp-post-image {
	max-width: 100%;
	height: auto;
	margin: 0 auto;
	display: block;
	width: auto;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > label .tc-label-wrap,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > label .tc-label-wrap,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > label .tc-label-wrap {
	display: block;
}

.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > .tm-epo-field-label,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > .tmcp-field-wrap-inner > label.tm-epo-field-label,
.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product > li.tmcp-field-wrap > label.tm-epo-field-label {
	width: 100%;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tc-epo-element-variable-product {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcgap);
}

.tc-epo-element-variable-product > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

table.tc-epo-element-variations {
	margin: 0 !important;
}

.woocommerce table.tc-epo-element-variations {
	margin-bottom: 1em;
	border: 0;
	width: 100%;
}

.woocommerce table.tc-epo-element-variations td,
.woocommerce table.tc-epo-element-variations th {
	border: 0;
	vertical-align: top;
	line-height: 2;
}

.woocommerce table.tc-epo-element-variations label {
	font-weight: 700;
}

.woocommerce table.tc-epo-element-variations select {
	max-width: 100%;
	min-width: 75%;
	display: inline-block;
	margin-right: 1em;
}

.woocommerce table.tc-epo-element-variations td.label {
	padding-right: 1em;
}

.woocommerce .tc-epo-element-variable-product .woocommerce-variation-description p {
	margin-bottom: 1em;
}

.woocommerce .tc-epo-element-variable-product .tc-epo-element-variable-reset-variations {
	visibility: hidden;
	font-size: 0.83em;
}

.woocommerce .tc-epo-element-variable-product .wc-no-matching-variations {
	display: none;
}

.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden,
.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden .tmcp-field-wrap-inner {
	display: none;
}

.tc-product-image {
	margin: 0;
}

/* 13. Tooltip */

#tm-tooltip {
	font-size: 0.875em;
	text-align: center;
	text-shadow: 0 1px rgba(0, 0, 0, 0.5);
	line-height: 1.5;
	color: var(--tooltip-color);
	background: var(--tooltip-background-color);
	border-radius: 5px;
	position: absolute;
	z-index: 145400;
	padding: 15px;
	pointer-events: none;
	bottom: auto !important;
	top: auto;
	left: auto;
	right: auto;
	border: 1px solid var(--tooltip-border-color);
	--tooltip-background-color: rgba(0, 0, 0, 0.8);
	--tooltip-border-color: rgba(255, 255, 255, 0.5);
	--tooltip-color: #fff;
}

#tm-tooltip p:last-child {
	margin-top: 0;
	margin-bottom: 0;
}

#tm-tooltip::after {
	width: 0;
	height: 0;
	border-left: 10px solid transparent;
	border-right: 10px solid transparent;
	border-top: 10px solid var(--tooltip-background-color);
	content: "";
	position: absolute;
	left: 50%;
	bottom: -9px;
	margin-left: -10px;
}

#tm-tooltip::before {
	width: 0;
	height: 0;
	border-left: 10px solid transparent;
	border-right: 10px solid transparent;
	border-top: 10px solid var(--tooltip-border-color);
	content: "";
	position: absolute;
	left: 50%;
	bottom: -10px;
	margin-left: -10px;
}

#tm-tooltip.top::after {
	border-top-color: transparent;
	border-bottom: 10px solid var(--tooltip-background-color);
	top: -19px;
	bottom: auto;
}

#tm-tooltip.top::before {
	border-top-color: transparent;
	border-bottom: 10px solid var(--tooltip-border-color);
	top: -20px;
	bottom: auto;
}

#tm-tooltip.left::after {
	left: 10px;
	margin: 0;
}

#tm-tooltip.right::after {
	right: 10px;
	left: auto;
	margin: 0;
}

#tm-tooltip img {
	max-width: 100%;
}

#tm-tooltip.tc-error {
	--tooltip-background-color: #ff4500;
	--tooltip-border-color: rgba(255, 255, 255, 0.5);
	--tooltip-color: #fff;
}

.tc-tooltip {
	color: #2980b9;
	cursor: help;
	font-size: 1em;
	margin: 0;
}

.tc-epo-style-space.tc-tooltip {
	line-height: inherit !important;
}

.tc-icontooltipleft {
	-webkit-box-ordinal-group: 1;
	-ms-flex-order: 0;
	order: 0;
}

.tc-icontooltipright {
	-webkit-box-ordinal-group: 100;
	-ms-flex-order: 99;
	order: 99;
}

/* 14. Cart and Order styles */

.woocommerce #content table.cart img.epo-option-image,
.woocommerce table.cart img.epo-option-image,
.woocommerce-page #content table.cart img.epo-option-image,
.woocommerce-page table.cart img.epo-option-image,
.epo-option-image {
	max-height: 100px;
	max-width: 70% !important;
	height: auto !important;
	width: auto !important;
	display: block;
}

.woocommerce-mini-cart img.epo-upload-image,
.woocommerce #content table.cart img.epo-upload-image,
.woocommerce table.cart img.epo-upload-image,
.woocommerce-page #content table.cart img.epo-upload-image,
.woocommerce-page table.cart img.epo-upload-image,
.epo-upload-image {
	max-height: none !important;
	max-width: 70% !important;
	width: auto !important;
	height: 100% !important;
}

.woocommerce td.product-name dl.variation dt.tc-hidden-variation {
	margin: 0;
}

.tc-row.tm-cart-row {
	border-color: #eee;
	border-radius: 0;
	border-style: none none dotted;
	border-width: 0 0 1px;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	padding: var(--tcgap);
}

.tm-cart-row-header {
	font-weight: 700;
	position: sticky;
	top: 0;
	background: #fff;
	z-index: 2;
}

.tc-row.tm-cart-row:last-child {
	border: 0 none;
}

.tc-row.tm-cart-row .tc-cell.cpf-name {
	font-weight: 700;
}

.tc-row.tm-cart-row .tc-cell.cpf-price,
.tc-row.tm-cart-row .tc-cell.cpf-total-price {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
}

.tc-row.tm-cart-row .tc-cell.cpf-quantity {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.woocommerce td.product-name dl.variation.tc-epo-metadata,
.woocommerce .wc-item-meta {
	word-break: break-word;
}

.woocommerce td.product-name dl.variation.tc-epo-metadata .tc-hidden-variation {
	display: none;
}

.cpf-img-on-cart img {
	position: static !important;
	height: auto !important;
	width: auto !important;
	max-height: 3em;
	-o-object-fit: cover;
	object-fit: cover;
}

.cpf-data-on-cart::before {
	content: "\f14a";
	font-family: tc-fontawesome, sans-serif;
	font-weight: 900;
	font-size: 1em;
	vertical-align: middle;
	position: absolute;
}

.cpf-data-on-cart > .cpf-data-value {
	margin: 0 1.5em;
}

.cpf-img-on-cart .cpf-data-on-cart::before {
	content: "";
	display: none;
}

.cpf-data-on-cart {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	margin-bottom: 0.5em;
	width: 100%;
	-webkit-box-align: baseline;
	-ms-flex-align: baseline;
	align-items: baseline;
}

.cpf-img-on-cart {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-ms-flex-line-pack: start;
	align-content: flex-start;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	width: calc(100% - var(--tcgapcolumn));
	gap: var(--tcgap);
}

.cpf-data-on-cart:last-of-type,
.cpf-img-on-cart:last-of-type {
	border-bottom: 0;
	margin-bottom: 0;
}

.cpf-img-on-order {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-ms-flex-line-pack: start;
	align-content: flex-start;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	width: calc(100% - var(--tcgapcolumn));
	gap: var(--tcgap);
}

.cpf-img-on-order img {
	-o-object-fit: cover;
	object-fit: cover;
	display: block;
	width: 100% !important;
	height: auto !important;
	max-width: unset !important;
	max-height: unset !important;
}

.cpf-img-on-order > * {
	display: block;
}

.woocommerce #content table.cart img.epo-option-image,
.woocommerce table.cart img.epo-option-image,
.woocommerce-page #content table.cart img.epo-option-image,
.woocommerce-page table.cart img.epo-option-image,
.woocommerce-mini-cart .cpf-img-on-cart .epo-option-image,
.woocommerce-checkout-review-order .cpf-img-on-cart .epo-option-image,
.woocommerce-order-details .cpf-img-on-cart .epo-option-image,
.epo-option-image,
.cpf-img-on-order > * {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
}

.woocommerce-mini-cart .cpf-img-on-cart img {
	max-width: 50px !important;
}

.cpf-color-on-cart {
	width: 1em;
	height: 1em;
	display: inline-block;
	border: 1px solid;
	vertical-align: middle;
	position: relative;
	top: -1px;
}

td.product-name a.tm-cart-edit-options,
.tm-cart-edit-options {
	display: block;
	font-size: 0.7em;
	font-style: italic;
	font-weight: 700;
}

.tm-epo-cart-option-mobile {
	display: none;
}

.shop_table tbody tr.tm-epo-cart-row {
	height: auto;
}

.woocommerce table.shop_table .tm-epo-cart-row td {
	border-top: 1px dashed rgba(0, 0, 0, 0.1);
}

.tm-epo-cart-option-label,
.tm-epo-cart-option-value.tm-epo-cart-no-label {
	font-weight: 700;
}

.woocommerce table.shop_table .tm-epo-cart-row-product td {
	border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}

.woocommerce table.shop_table .tm-epo-cart-row-product + .tm-epo-cart-row td {
	border-top: 0 none;
}


.woocommerce table.shop_table_responsive tr.tm-epo-cart-row td::before,
.woocommerce-page table.shop_table_responsive tr.tm-epo-cart-row td::before {
	display: none !important;
}

.tc-price-in-cart,
.tc-quantity-in-cart {
	font-size: smaller;
}

.tc-associated-table-product .tc-associated-table-product-indent {
	padding-left: 2em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	-ms-flex-direction: column;
	flex-direction: column;
	-webkit-box-align: start;
	-ms-flex-align: start;
	align-items: flex-start;
}

.tc-associated-table-product .tc-associated-table-product-price::after {
	font-family: tc-fontawesome, sans-serif;
	font-size: 1em;
	content: "\f3be";
	font-weight: 900;
	margin: 0 0.5em;
	padding: 0;
	opacity: 0.3;
	display: inline-block;
	-webkit-transform: rotate(90deg);
	transform: rotate(90deg);
}

.tc-associated-table-product .tc-associated-table-product-indent * {
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
}

.tc-associated-table-product-name {
	font-weight: 700;
	-webkit-box-ordinal-group: 2 !important;
	-ms-flex-order: 1 !important;
	order: 1 !important;
}

/* 15. Various styles */

.tm-dpd-label {
	display: block;
	font-size: 80%;
}

.tm-animated {
	-webkit-animation-duration: 0.3s;
	animation-duration: 0.3s;
}

.tc-chars {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	font-size: x-small;
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	width: 100%;
	max-width: 100%;
	gap: calc(1ch / 2);
}

.tm-button {
	border-radius: 3px;
	border-style: solid;
	border-width: 1px;
	cursor: pointer;
	display: inline-block;
	font-size: 13px !important;
	margin: 0;
	height: 30px;
	line-height: 28px !important;
	padding: 0 12px 2px !important;
	text-decoration: none;
	white-space: nowrap;
	background: none repeat scroll 0 0 #f7f7f7;
	border-color: #ccc;
	-webkit-box-shadow: 0 1px 0 #fff inset, 0 1px 0 rgba(0, 0, 0, 0.08);
	box-shadow: 0 1px 0 #fff inset, 0 1px 0 rgba(0, 0, 0, 0.08);
	color: #555;
	vertical-align: top;
}

.tm-button:hover {
	background: none repeat scroll 0 0 #fafafa;
	border-color: #999;
	color: #222;
}

.tc-hide-add-to-cart-button {
	display: none !important;
}

.tc-clearfix::after {
	content: "";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
	overflow: hidden;
}

.tm-preloader-img {
	position: absolute !important;
	z-index: 2;
	opacity: 0.6;
}

button.tmicon {
	display: inline-block;
	left: auto !important;
	position: relative;
	right: auto !important;
	overflow: hidden;
	width: 30px !important;
	height: 30px !important;
	line-height: 30px !important;
	font-size: 14px;
	text-align: center;
	cursor: pointer;
	vertical-align: middle;
	margin: 0;
	padding: 0;
	-ms-flex-negative: 0;
	flex-shrink: 0;
	background: none;
	border: none;
	-webkit-transition: all 0.3s ease 0s;
	transition: all 0.3s ease 0s;
}

button.tmicon.delete {
	color: #ff4500;
	border-radius: 100%;
}

button.tmicon.delete:hover {
	color: #fff;
	background: #ff4500;
}

.pointereventsoff {
	pointer-events: none;
}

.tm-hide {
	visibility: hidden !important;
	padding: 0 !important;
	height: 0 !important;
	width: 0 !important;
	margin: 0 !important;
	min-height: 0 !important;
	min-width: 0 !important;
	opacity: 0 !important;
}

.tm-show {
	display: block !important;
}

.tm-extra-product-options .tc-row.tm-show,
.tc-row.tm-show {
	display: -webkit-box !important;
	display: -ms-flexbox !important;
	display: flex !important;
}

@-webkit-keyframes appear {

	0% {
		opacity: 0;
	}

	100% {
		opacity: 1;
	}
}

@keyframes appear {

	0% {
		opacity: 0;
	}

	100% {
		opacity: 1;
	}
}

.appear {
	-webkit-animation-name: appear;
	animation-name: appear;
}

.tc-tabs {
	width: 100%;
}

.tc-tabs.tc-cell {
	margin-bottom: 0;
}

.has-scroll-arrows.tc-tab-headers {
	padding: 0;
	max-width: calc(100% - 4em - 1px) !important;
	left: 2em;
}

.tc-tabs-wrap .tc-row .tc-cell:last-of-type {
	margin-bottom: 0;
}

.tc-tab-headers-wrap {
	position: relative;
}

.tc-scroll-left-arrow,
.tc-scroll-right-arrow {
	position: absolute;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	display: none;
	cursor: pointer;
	padding: 0;
	line-height: 1;
	width: 1em;
	text-align: center;
	height: 100%;
	top: 0;
	z-index: 2;
}

.tc-scroll-left-arrow.scroll-arrow-show,
.tc-scroll-right-arrow.scroll-arrow-show {
	display: block;
	border: 1px solid;
	height: 100%;
	width: calc(2em + 1px);
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tc-scroll-left-arrow {
	left: 0;
}

.tc-scroll-right-arrow {
	right: 0;
}

.tc-scroll-left-arrow::before,
.tc-scroll-right-arrow::before {
	line-height: 1;
	-webkit-transform: translateY(-50%);
	transform: translateY(-50%);
	top: 50%;
	padding: 0;
	margin: 0;
	position: absolute;
	left: 0;
	right: 0;
}

.tc-scroll-left-arrow::before {
	content: "\25C0";
}

.tc-scroll-right-arrow::before {
	content: "\25B6";
}

.tc-tab-headers {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
	-webkit-box-align: stretch;
	-ms-flex-align: stretch;
	align-items: stretch;
	-ms-flex-line-pack: center;
	align-content: center;
	gap: 1em;
	margin: 0;
	padding: 0;
	overflow: hidden !important;
	position: relative;
	width: 100%;
	min-height: 1px;
}

.tab-header {
	font-weight: 400;
	cursor: pointer;
	white-space: nowrap;
	padding: var(--tcgap);
	position: relative;
	margin: 0;
}

.tab-header.open {
	border-width: 1px 1px 0 1px;
	border-style: solid;
}

.tab-header.open::before,
.tab-header.open::after {
	content: "";
	display: block;
	position: absolute;
	border-bottom: 1px solid;
	bottom: 0;
	height: 0;
	width: 999em;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tab-header.open::before {
	right: 100%;
}

.tab-header.open::after {
	left: 100%;
}

.tc-tab-content.tcwidth-100 {
	padding: var(--tcgap);
	border-width: 0 1px 1px 1px;
	border-style: solid;
}

.tc-tab-header {
	-ms-flex-negative: 0;
	flex-shrink: 0;
}

.tab-header.open,
.tab-header.open:focus {
	font-weight: 700;
}

/* 16. Theme fixes */

/* nielsen theme fix */

.tc-extra-product-options .sbHolder .sbSelector {
	background-color: #fff;
	height: 35px;
	padding: 5px 10px;
}

/* Aurum theme fix */

.tc-images-container .replaced-checkboxes + label::before,
.tc-images-container .replaced-radio-buttons + label::before,
.replaced-checkboxes + label.tm-epo-style::before,
.replaced-radio-buttons + label.tm-epo-style::before {
	display: none;
}

/* Salient minimal form fix */

body[data-form-style="minimal"] .tc-extra-product-options .minimal-form-input label {
	pointer-events: auto !important;
}

/* Woomart theme quick shop view fix */

.has-options .quick-shop-wrapper .woocommerce-variation-add-to-cart {
	display: block !important;
	width: 100%;
	max-width: 100%;
	padding: 0;
	margin: 0;
}

/* Elementor and theme fixes */
.thb-product-main-row .summary form.cart,
.woocommerce .oxy-woo-element div.product.tm-has-options .woocommerce-variation-add-to-cart,
.tm-has-options .fullwidth-button .cart:not(.variations_form),
.tm-has-options .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,
.single-product div.product.tm-has-options form.cart,
.single-product div.product.tm-has-options .single-button-wrapper,
.single-product div.product.tm-has-options .entry-summary form.cart:not(.variations_form):not(.grouped_form),
.single-product div.product.tm-has-options .variations_button,
.woocommerce div.product.elementor.tm-has-options form.cart.variations_form .woocommerce-variation-add-to-cart,
.woocommerce div.product.elementor.tm-has-options form.cart:not(.grouped_form):not(.variations_form),
.woocommerce .oxy-woo-element div.product.tm-variations-only .woocommerce-variation-add-to-cart,
.tm-variations-only .fullwidth-button .cart:not(.variations_form),
.tm-variations-only .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,
.single-product div.product.tm-variations-only form.cart,
.single-product div.product.tm-variations-only .single-button-wrapper,
.single-product div.product.tm-variations-only .entry-summary form.cart:not(.variations_form):not(.grouped_form),
.single-product div.product.tm-variations-only .variations_button,
.woocommerce div.product.elementor.tm-variations-only form.cart.variations_form .woocommerce-variation-add-to-cart,
.woocommerce div.product.elementor.tm-variations-only form.cart:not(.grouped_form):not(.variations_form) {
	-ms-flex-wrap: wrap !important;
	flex-wrap: wrap !important;
	max-width: 100%;
}
assets/css/fontawesome.css000064400000215516150755142440011720 0ustar00/*!
 * Font Awesome Free 5.12.0 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 */
.tcfa,
.tcfas,
.tcfar,
.tcfal,
.tcfad {
	-moz-osx-font-smoothing: grayscale;
	-webkit-font-smoothing: antialiased;
	display: inline-block;
	font-style: normal;
	font-variant: normal;
	text-rendering: auto;
	line-height: 1;
}

.tcfa-lg {
	font-size: 1.33333em;
	line-height: 0.75;
	vertical-align: -0.0667em;
}

.tcfa-xs {
	font-size: 0.75em;
}

.tcfa-sm {
	font-size: 0.875em;
}

.tcfa-1x {
	font-size: 1em;
}

.tcfa-2x {
	font-size: 2em;
}

.tcfa-3x {
	font-size: 3em;
}

.tcfa-4x {
	font-size: 4em;
}

.tcfa-5x {
	font-size: 5em;
}

.tcfa-6x {
	font-size: 6em;
}

.tcfa-7x {
	font-size: 7em;
}

.tcfa-8x {
	font-size: 8em;
}

.tcfa-9x {
	font-size: 9em;
}

.tcfa-10x {
	font-size: 10em;
}

.tcfa-fw {
	text-align: center;
	width: 1.25em;
}

.tcfa-ul {
	list-style-type: none;
	margin-left: 2.5em;
	padding-left: 0;
}

.tcfa-ul > li {
	position: relative;
}

.tcfa-li {
	left: -2em;
	position: absolute;
	text-align: center;
	width: 2em;
	line-height: inherit;
}

.tcfa-border {
	border: solid 0.08em #eee;
	border-radius: 0.1em;
	padding: 0.2em 0.25em 0.15em;
}

.tcfa-pull-left {
	float: left;
}

.tcfa-pull-right {
	float: right;
}

.tcfa.tcfa-pull-left,
.tcfas.tcfa-pull-left,
.tcfar.tcfa-pull-left,
.tcfal.tcfa-pull-left {
	margin-right: 0.3em;
}

.tcfa.tcfa-pull-right,
.tcfas.tcfa-pull-right,
.tcfar.tcfa-pull-right,
.tcfal.tcfa-pull-right {
	margin-left: 0.3em;
}

.tcfa-spin {
	-webkit-animation: fa-spin 2s infinite linear;
	animation: fa-spin 2s infinite linear;
}

.tcfa-pulse {
	-webkit-animation: fa-spin 1s infinite steps(8);
	animation: fa-spin 1s infinite steps(8);
}

@-webkit-keyframes fa-spin {

	0% {
		-webkit-transform: rotate(0deg);
		transform: rotate(0deg);
	}

	100% {
		-webkit-transform: rotate(360deg);
		transform: rotate(360deg);
	}
}

@keyframes fa-spin {

	0% {
		-webkit-transform: rotate(0deg);
		transform: rotate(0deg);
	}

	100% {
		-webkit-transform: rotate(360deg);
		transform: rotate(360deg);
	}
}

.tcfa-rotate-90 {
	-webkit-transform: rotate(90deg);
	transform: rotate(90deg);
}

.tcfa-rotate-180 {
	-webkit-transform: rotate(180deg);
	transform: rotate(180deg);
}

.tcfa-rotate-270 {
	-webkit-transform: rotate(270deg);
	transform: rotate(270deg);
}

.tcfa-flip-horizontal {
	-webkit-transform: scale(-1, 1);
	transform: scale(-1, 1);
}

.tcfa-flip-vertical {
	-webkit-transform: scale(1, -1);
	transform: scale(1, -1);
}

.tcfa-flip-both,
.tcfa-flip-horizontal.tcfa-flip-vertical {
	-webkit-transform: scale(-1, -1);
	transform: scale(-1, -1);
}

:root .tcfa-rotate-90,
:root .tcfa-rotate-180,
:root .tcfa-rotate-270,
:root .tcfa-flip-horizontal,
:root .tcfa-flip-vertical,
:root .tcfa-flip-both {
	-webkit-filter: none;
	filter: none;
}

.tcfa-stack {
	display: inline-block;
	height: 2em;
	line-height: 2;
	position: relative;
	vertical-align: middle;
	width: 2.5em;
}

.tcfa-stack-1x,
.tcfa-stack-2x {
	left: 0;
	position: absolute;
	text-align: center;
	width: 100%;
}

.tcfa-stack-1x {
	line-height: inherit;
}

.tcfa-stack-2x {
	font-size: 2em;
}

.tcfa-inverse {
	color: #fff;
}

/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.tcfa-500px::before {
	content: "\f26e";
}

.tcfa-accessible-icon::before {
	content: "\f368";
}

.tcfa-accusoft::before {
	content: "\f369";
}

.tcfa-acquisitions-incorporated::before {
	content: "\f6af";
}

.tcfa-ad::before {
	content: "\f641";
}

.tcfa-address-book::before {
	content: "\f2b9";
}

.tcfa-address-card::before {
	content: "\f2bb";
}

.tcfa-adjust::before {
	content: "\f042";
}

.tcfa-adn::before {
	content: "\f170";
}

.tcfa-adobe::before {
	content: "\f778";
}

.tcfa-adversal::before {
	content: "\f36a";
}

.tcfa-affiliatetheme::before {
	content: "\f36b";
}

.tcfa-air-freshener::before {
	content: "\f5d0";
}

.tcfa-airbnb::before {
	content: "\f834";
}

.tcfa-algolia::before {
	content: "\f36c";
}

.tcfa-align-center::before {
	content: "\f037";
}

.tcfa-align-justify::before {
	content: "\f039";
}

.tcfa-align-left::before {
	content: "\f036";
}

.tcfa-align-right::before {
	content: "\f038";
}

.tcfa-alipay::before {
	content: "\f642";
}

.tcfa-allergies::before {
	content: "\f461";
}

.tcfa-amazon::before {
	content: "\f270";
}

.tcfa-amazon-pay::before {
	content: "\f42c";
}

.tcfa-ambulance::before {
	content: "\f0f9";
}

.tcfa-american-sign-language-interpreting::before {
	content: "\f2a3";
}

.tcfa-amilia::before {
	content: "\f36d";
}

.tcfa-anchor::before {
	content: "\f13d";
}

.tcfa-android::before {
	content: "\f17b";
}

.tcfa-angellist::before {
	content: "\f209";
}

.tcfa-angle-double-down::before {
	content: "\f103";
}

.tcfa-angle-double-left::before {
	content: "\f100";
}

.tcfa-angle-double-right::before {
	content: "\f101";
}

.tcfa-angle-double-up::before {
	content: "\f102";
}

.tcfa-angle-down::before {
	content: "\f107";
}

.tcfa-angle-left::before {
	content: "\f104";
}

.tcfa-angle-right::before {
	content: "\f105";
}

.tcfa-angle-up::before {
	content: "\f106";
}

.tcfa-angry::before {
	content: "\f556";
}

.tcfa-angrycreative::before {
	content: "\f36e";
}

.tcfa-angular::before {
	content: "\f420";
}

.tcfa-ankh::before {
	content: "\f644";
}

.tcfa-app-store::before {
	content: "\f36f";
}

.tcfa-app-store-ios::before {
	content: "\f370";
}

.tcfa-apper::before {
	content: "\f371";
}

.tcfa-apple::before {
	content: "\f179";
}

.tcfa-apple-alt::before {
	content: "\f5d1";
}

.tcfa-apple-pay::before {
	content: "\f415";
}

.tcfa-archive::before {
	content: "\f187";
}

.tcfa-archway::before {
	content: "\f557";
}

.tcfa-arrow-alt-circle-down::before {
	content: "\f358";
}

.tcfa-arrow-alt-circle-left::before {
	content: "\f359";
}

.tcfa-arrow-alt-circle-right::before {
	content: "\f35a";
}

.tcfa-arrow-alt-circle-up::before {
	content: "\f35b";
}

.tcfa-arrow-circle-down::before {
	content: "\f0ab";
}

.tcfa-arrow-circle-left::before {
	content: "\f0a8";
}

.tcfa-arrow-circle-right::before {
	content: "\f0a9";
}

.tcfa-arrow-circle-up::before {
	content: "\f0aa";
}

.tcfa-arrow-down::before {
	content: "\f063";
}

.tcfa-arrow-left::before {
	content: "\f060";
}

.tcfa-arrow-right::before {
	content: "\f061";
}

.tcfa-arrow-up::before {
	content: "\f062";
}

.tcfa-arrows-alt::before {
	content: "\f0b2";
}

.tcfa-arrows-alt-h::before {
	content: "\f337";
}

.tcfa-arrows-alt-v::before {
	content: "\f338";
}

.tcfa-artstation::before {
	content: "\f77a";
}

.tcfa-assistive-listening-systems::before {
	content: "\f2a2";
}

.tcfa-asterisk::before {
	content: "\f069";
}

.tcfa-asymmetrik::before {
	content: "\f372";
}

.tcfa-at::before {
	content: "\f1fa";
}

.tcfa-atlas::before {
	content: "\f558";
}

.tcfa-atlassian::before {
	content: "\f77b";
}

.tcfa-atom::before {
	content: "\f5d2";
}

.tcfa-audible::before {
	content: "\f373";
}

.tcfa-audio-description::before {
	content: "\f29e";
}

.tcfa-autoprefixer::before {
	content: "\f41c";
}

.tcfa-avianex::before {
	content: "\f374";
}

.tcfa-aviato::before {
	content: "\f421";
}

.tcfa-award::before {
	content: "\f559";
}

.tcfa-aws::before {
	content: "\f375";
}

.tcfa-baby::before {
	content: "\f77c";
}

.tcfa-baby-carriage::before {
	content: "\f77d";
}

.tcfa-backspace::before {
	content: "\f55a";
}

.tcfa-backward::before {
	content: "\f04a";
}

.tcfa-bacon::before {
	content: "\f7e5";
}

.tcfa-bahai::before {
	content: "\f666";
}

.tcfa-balance-scale::before {
	content: "\f24e";
}

.tcfa-balance-scale-left::before {
	content: "\f515";
}

.tcfa-balance-scale-right::before {
	content: "\f516";
}

.tcfa-ban::before {
	content: "\f05e";
}

.tcfa-band-aid::before {
	content: "\f462";
}

.tcfa-bandcamp::before {
	content: "\f2d5";
}

.tcfa-barcode::before {
	content: "\f02a";
}

.tcfa-bars::before {
	content: "\f0c9";
}

.tcfa-baseball-ball::before {
	content: "\f433";
}

.tcfa-basketball-ball::before {
	content: "\f434";
}

.tcfa-bath::before {
	content: "\f2cd";
}

.tcfa-battery-empty::before {
	content: "\f244";
}

.tcfa-battery-full::before {
	content: "\f240";
}

.tcfa-battery-half::before {
	content: "\f242";
}

.tcfa-battery-quarter::before {
	content: "\f243";
}

.tcfa-battery-three-quarters::before {
	content: "\f241";
}

.tcfa-battle-net::before {
	content: "\f835";
}

.tcfa-bed::before {
	content: "\f236";
}

.tcfa-beer::before {
	content: "\f0fc";
}

.tcfa-behance::before {
	content: "\f1b4";
}

.tcfa-behance-square::before {
	content: "\f1b5";
}

.tcfa-bell::before {
	content: "\f0f3";
}

.tcfa-bell-slash::before {
	content: "\f1f6";
}

.tcfa-bezier-curve::before {
	content: "\f55b";
}

.tcfa-bible::before {
	content: "\f647";
}

.tcfa-bicycle::before {
	content: "\f206";
}

.tcfa-biking::before {
	content: "\f84a";
}

.tcfa-bimobject::before {
	content: "\f378";
}

.tcfa-binoculars::before {
	content: "\f1e5";
}

.tcfa-biohazard::before {
	content: "\f780";
}

.tcfa-birthday-cake::before {
	content: "\f1fd";
}

.tcfa-bitbucket::before {
	content: "\f171";
}

.tcfa-bitcoin::before {
	content: "\f379";
}

.tcfa-bity::before {
	content: "\f37a";
}

.tcfa-black-tie::before {
	content: "\f27e";
}

.tcfa-blackberry::before {
	content: "\f37b";
}

.tcfa-blender::before {
	content: "\f517";
}

.tcfa-blender-phone::before {
	content: "\f6b6";
}

.tcfa-blind::before {
	content: "\f29d";
}

.tcfa-blog::before {
	content: "\f781";
}

.tcfa-blogger::before {
	content: "\f37c";
}

.tcfa-blogger-b::before {
	content: "\f37d";
}

.tcfa-bluetooth::before {
	content: "\f293";
}

.tcfa-bluetooth-b::before {
	content: "\f294";
}

.tcfa-bold::before {
	content: "\f032";
}

.tcfa-bolt::before {
	content: "\f0e7";
}

.tcfa-bomb::before {
	content: "\f1e2";
}

.tcfa-bone::before {
	content: "\f5d7";
}

.tcfa-bong::before {
	content: "\f55c";
}

.tcfa-book::before {
	content: "\f02d";
}

.tcfa-book-dead::before {
	content: "\f6b7";
}

.tcfa-book-medical::before {
	content: "\f7e6";
}

.tcfa-book-open::before {
	content: "\f518";
}

.tcfa-book-reader::before {
	content: "\f5da";
}

.tcfa-bookmark::before {
	content: "\f02e";
}

.tcfa-bootstrap::before {
	content: "\f836";
}

.tcfa-border-all::before {
	content: "\f84c";
}

.tcfa-border-none::before {
	content: "\f850";
}

.tcfa-border-style::before {
	content: "\f853";
}

.tcfa-bowling-ball::before {
	content: "\f436";
}

.tcfa-box::before {
	content: "\f466";
}

.tcfa-box-open::before {
	content: "\f49e";
}

.tcfa-boxes::before {
	content: "\f468";
}

.tcfa-braille::before {
	content: "\f2a1";
}

.tcfa-brain::before {
	content: "\f5dc";
}

.tcfa-bread-slice::before {
	content: "\f7ec";
}

.tcfa-briefcase::before {
	content: "\f0b1";
}

.tcfa-briefcase-medical::before {
	content: "\f469";
}

.tcfa-broadcast-tower::before {
	content: "\f519";
}

.tcfa-broom::before {
	content: "\f51a";
}

.tcfa-brush::before {
	content: "\f55d";
}

.tcfa-btc::before {
	content: "\f15a";
}

.tcfa-buffer::before {
	content: "\f837";
}

.tcfa-bug::before {
	content: "\f188";
}

.tcfa-building::before {
	content: "\f1ad";
}

.tcfa-bullhorn::before {
	content: "\f0a1";
}

.tcfa-bullseye::before {
	content: "\f140";
}

.tcfa-burn::before {
	content: "\f46a";
}

.tcfa-buromobelexperte::before {
	content: "\f37f";
}

.tcfa-bus::before {
	content: "\f207";
}

.tcfa-bus-alt::before {
	content: "\f55e";
}

.tcfa-business-time::before {
	content: "\f64a";
}

.tcfa-buy-n-large::before {
	content: "\f8a6";
}

.tcfa-buysellads::before {
	content: "\f20d";
}

.tcfa-calculator::before {
	content: "\f1ec";
}

.tcfa-calendar::before {
	content: "\f133";
}

.tcfa-calendar-alt::before {
	content: "\f073";
}

.tcfa-calendar-check::before {
	content: "\f274";
}

.tcfa-calendar-day::before {
	content: "\f783";
}

.tcfa-calendar-minus::before {
	content: "\f272";
}

.tcfa-calendar-plus::before {
	content: "\f271";
}

.tcfa-calendar-times::before {
	content: "\f273";
}

.tcfa-calendar-week::before {
	content: "\f784";
}

.tcfa-camera::before {
	content: "\f030";
}

.tcfa-camera-retro::before {
	content: "\f083";
}

.tcfa-campground::before {
	content: "\f6bb";
}

.tcfa-canadian-maple-leaf::before {
	content: "\f785";
}

.tcfa-candy-cane::before {
	content: "\f786";
}

.tcfa-cannabis::before {
	content: "\f55f";
}

.tcfa-capsules::before {
	content: "\f46b";
}

.tcfa-car::before {
	content: "\f1b9";
}

.tcfa-car-alt::before {
	content: "\f5de";
}

.tcfa-car-battery::before {
	content: "\f5df";
}

.tcfa-car-crash::before {
	content: "\f5e1";
}

.tcfa-car-side::before {
	content: "\f5e4";
}

.tcfa-caravan::before {
	content: "\f8ff";
}

.tcfa-caret-down::before {
	content: "\f0d7";
}

.tcfa-caret-left::before {
	content: "\f0d9";
}

.tcfa-caret-right::before {
	content: "\f0da";
}

.tcfa-caret-square-down::before {
	content: "\f150";
}

.tcfa-caret-square-left::before {
	content: "\f191";
}

.tcfa-caret-square-right::before {
	content: "\f152";
}

.tcfa-caret-square-up::before {
	content: "\f151";
}

.tcfa-caret-up::before {
	content: "\f0d8";
}

.tcfa-carrot::before {
	content: "\f787";
}

.tcfa-cart-arrow-down::before {
	content: "\f218";
}

.tcfa-cart-plus::before {
	content: "\f217";
}

.tcfa-cash-register::before {
	content: "\f788";
}

.tcfa-cat::before {
	content: "\f6be";
}

.tcfa-cc-amazon-pay::before {
	content: "\f42d";
}

.tcfa-cc-amex::before {
	content: "\f1f3";
}

.tcfa-cc-apple-pay::before {
	content: "\f416";
}

.tcfa-cc-diners-club::before {
	content: "\f24c";
}

.tcfa-cc-discover::before {
	content: "\f1f2";
}

.tcfa-cc-jcb::before {
	content: "\f24b";
}

.tcfa-cc-mastercard::before {
	content: "\f1f1";
}

.tcfa-cc-paypal::before {
	content: "\f1f4";
}

.tcfa-cc-stripe::before {
	content: "\f1f5";
}

.tcfa-cc-visa::before {
	content: "\f1f0";
}

.tcfa-centercode::before {
	content: "\f380";
}

.tcfa-centos::before {
	content: "\f789";
}

.tcfa-certificate::before {
	content: "\f0a3";
}

.tcfa-chair::before {
	content: "\f6c0";
}

.tcfa-chalkboard::before {
	content: "\f51b";
}

.tcfa-chalkboard-teacher::before {
	content: "\f51c";
}

.tcfa-charging-station::before {
	content: "\f5e7";
}

.tcfa-chart-area::before {
	content: "\f1fe";
}

.tcfa-chart-bar::before {
	content: "\f080";
}

.tcfa-chart-line::before {
	content: "\f201";
}

.tcfa-chart-pie::before {
	content: "\f200";
}

.tcfa-check::before {
	content: "\f00c";
}

.tcfa-check-circle::before {
	content: "\f058";
}

.tcfa-check-double::before {
	content: "\f560";
}

.tcfa-check-square::before {
	content: "\f14a";
}

.tcfa-cheese::before {
	content: "\f7ef";
}

.tcfa-chess::before {
	content: "\f439";
}

.tcfa-chess-bishop::before {
	content: "\f43a";
}

.tcfa-chess-board::before {
	content: "\f43c";
}

.tcfa-chess-king::before {
	content: "\f43f";
}

.tcfa-chess-knight::before {
	content: "\f441";
}

.tcfa-chess-pawn::before {
	content: "\f443";
}

.tcfa-chess-queen::before {
	content: "\f445";
}

.tcfa-chess-rook::before {
	content: "\f447";
}

.tcfa-chevron-circle-down::before {
	content: "\f13a";
}

.tcfa-chevron-circle-left::before {
	content: "\f137";
}

.tcfa-chevron-circle-right::before {
	content: "\f138";
}

.tcfa-chevron-circle-up::before {
	content: "\f139";
}

.tcfa-chevron-down::before {
	content: "\f078";
}

.tcfa-chevron-left::before {
	content: "\f053";
}

.tcfa-chevron-right::before {
	content: "\f054";
}

.tcfa-chevron-up::before {
	content: "\f077";
}

.tcfa-child::before {
	content: "\f1ae";
}

.tcfa-chrome::before {
	content: "\f268";
}

.tcfa-chromecast::before {
	content: "\f838";
}

.tcfa-church::before {
	content: "\f51d";
}

.tcfa-circle::before {
	content: "\f111";
}

.tcfa-circle-notch::before {
	content: "\f1ce";
}

.tcfa-city::before {
	content: "\f64f";
}

.tcfa-clinic-medical::before {
	content: "\f7f2";
}

.tcfa-clipboard::before {
	content: "\f328";
}

.tcfa-clipboard-check::before {
	content: "\f46c";
}

.tcfa-clipboard-list::before {
	content: "\f46d";
}

.tcfa-clock::before {
	content: "\f017";
}

.tcfa-clone::before {
	content: "\f24d";
}

.tcfa-closed-captioning::before {
	content: "\f20a";
}

.tcfa-cloud::before {
	content: "\f0c2";
}

.tcfa-cloud-download-alt::before {
	content: "\f381";
}

.tcfa-cloud-meatball::before {
	content: "\f73b";
}

.tcfa-cloud-moon::before {
	content: "\f6c3";
}

.tcfa-cloud-moon-rain::before {
	content: "\f73c";
}

.tcfa-cloud-rain::before {
	content: "\f73d";
}

.tcfa-cloud-showers-heavy::before {
	content: "\f740";
}

.tcfa-cloud-sun::before {
	content: "\f6c4";
}

.tcfa-cloud-sun-rain::before {
	content: "\f743";
}

.tcfa-cloud-upload-alt::before {
	content: "\f382";
}

.tcfa-cloudscale::before {
	content: "\f383";
}

.tcfa-cloudsmith::before {
	content: "\f384";
}

.tcfa-cloudversify::before {
	content: "\f385";
}

.tcfa-cocktail::before {
	content: "\f561";
}

.tcfa-code::before {
	content: "\f121";
}

.tcfa-code-branch::before {
	content: "\f126";
}

.tcfa-codepen::before {
	content: "\f1cb";
}

.tcfa-codiepie::before {
	content: "\f284";
}

.tcfa-coffee::before {
	content: "\f0f4";
}

.tcfa-cog::before {
	content: "\f013";
}

.tcfa-cogs::before {
	content: "\f085";
}

.tcfa-coins::before {
	content: "\f51e";
}

.tcfa-columns::before {
	content: "\f0db";
}

.tcfa-comment::before {
	content: "\f075";
}

.tcfa-comment-alt::before {
	content: "\f27a";
}

.tcfa-comment-dollar::before {
	content: "\f651";
}

.tcfa-comment-dots::before {
	content: "\f4ad";
}

.tcfa-comment-medical::before {
	content: "\f7f5";
}

.tcfa-comment-slash::before {
	content: "\f4b3";
}

.tcfa-comments::before {
	content: "\f086";
}

.tcfa-comments-dollar::before {
	content: "\f653";
}

.tcfa-compact-disc::before {
	content: "\f51f";
}

.tcfa-compass::before {
	content: "\f14e";
}

.tcfa-compress::before {
	content: "\f066";
}

.tcfa-compress-alt::before {
	content: "\f422";
}

.tcfa-compress-arrows-alt::before {
	content: "\f78c";
}

.tcfa-concierge-bell::before {
	content: "\f562";
}

.tcfa-confluence::before {
	content: "\f78d";
}

.tcfa-connectdevelop::before {
	content: "\f20e";
}

.tcfa-contao::before {
	content: "\f26d";
}

.tcfa-cookie::before {
	content: "\f563";
}

.tcfa-cookie-bite::before {
	content: "\f564";
}

.tcfa-copy::before {
	content: "\f0c5";
}

.tcfa-copyright::before {
	content: "\f1f9";
}

.tcfa-cotton-bureau::before {
	content: "\f89e";
}

.tcfa-couch::before {
	content: "\f4b8";
}

.tcfa-cpanel::before {
	content: "\f388";
}

.tcfa-creative-commons::before {
	content: "\f25e";
}

.tcfa-creative-commons-by::before {
	content: "\f4e7";
}

.tcfa-creative-commons-nc::before {
	content: "\f4e8";
}

.tcfa-creative-commons-nc-eu::before {
	content: "\f4e9";
}

.tcfa-creative-commons-nc-jp::before {
	content: "\f4ea";
}

.tcfa-creative-commons-nd::before {
	content: "\f4eb";
}

.tcfa-creative-commons-pd::before {
	content: "\f4ec";
}

.tcfa-creative-commons-pd-alt::before {
	content: "\f4ed";
}

.tcfa-creative-commons-remix::before {
	content: "\f4ee";
}

.tcfa-creative-commons-sa::before {
	content: "\f4ef";
}

.tcfa-creative-commons-sampling::before {
	content: "\f4f0";
}

.tcfa-creative-commons-sampling-plus::before {
	content: "\f4f1";
}

.tcfa-creative-commons-share::before {
	content: "\f4f2";
}

.tcfa-creative-commons-zero::before {
	content: "\f4f3";
}

.tcfa-credit-card::before {
	content: "\f09d";
}

.tcfa-critical-role::before {
	content: "\f6c9";
}

.tcfa-crop::before {
	content: "\f125";
}

.tcfa-crop-alt::before {
	content: "\f565";
}

.tcfa-cross::before {
	content: "\f654";
}

.tcfa-crosshairs::before {
	content: "\f05b";
}

.tcfa-crow::before {
	content: "\f520";
}

.tcfa-crown::before {
	content: "\f521";
}

.tcfa-crutch::before {
	content: "\f7f7";
}

.tcfa-css3::before {
	content: "\f13c";
}

.tcfa-css3-alt::before {
	content: "\f38b";
}

.tcfa-cube::before {
	content: "\f1b2";
}

.tcfa-cubes::before {
	content: "\f1b3";
}

.tcfa-cut::before {
	content: "\f0c4";
}

.tcfa-cuttlefish::before {
	content: "\f38c";
}

.tcfa-d-and-d::before {
	content: "\f38d";
}

.tcfa-d-and-d-beyond::before {
	content: "\f6ca";
}

.tcfa-dashcube::before {
	content: "\f210";
}

.tcfa-database::before {
	content: "\f1c0";
}

.tcfa-deaf::before {
	content: "\f2a4";
}

.tcfa-delicious::before {
	content: "\f1a5";
}

.tcfa-democrat::before {
	content: "\f747";
}

.tcfa-deploydog::before {
	content: "\f38e";
}

.tcfa-deskpro::before {
	content: "\f38f";
}

.tcfa-desktop::before {
	content: "\f108";
}

.tcfa-dev::before {
	content: "\f6cc";
}

.tcfa-deviantart::before {
	content: "\f1bd";
}

.tcfa-dharmachakra::before {
	content: "\f655";
}

.tcfa-dhl::before {
	content: "\f790";
}

.tcfa-diagnoses::before {
	content: "\f470";
}

.tcfa-diaspora::before {
	content: "\f791";
}

.tcfa-dice::before {
	content: "\f522";
}

.tcfa-dice-d20::before {
	content: "\f6cf";
}

.tcfa-dice-d6::before {
	content: "\f6d1";
}

.tcfa-dice-five::before {
	content: "\f523";
}

.tcfa-dice-four::before {
	content: "\f524";
}

.tcfa-dice-one::before {
	content: "\f525";
}

.tcfa-dice-six::before {
	content: "\f526";
}

.tcfa-dice-three::before {
	content: "\f527";
}

.tcfa-dice-two::before {
	content: "\f528";
}

.tcfa-digg::before {
	content: "\f1a6";
}

.tcfa-digital-ocean::before {
	content: "\f391";
}

.tcfa-digital-tachograph::before {
	content: "\f566";
}

.tcfa-directions::before {
	content: "\f5eb";
}

.tcfa-discord::before {
	content: "\f392";
}

.tcfa-discourse::before {
	content: "\f393";
}

.tcfa-divide::before {
	content: "\f529";
}

.tcfa-dizzy::before {
	content: "\f567";
}

.tcfa-dna::before {
	content: "\f471";
}

.tcfa-dochub::before {
	content: "\f394";
}

.tcfa-docker::before {
	content: "\f395";
}

.tcfa-dog::before {
	content: "\f6d3";
}

.tcfa-dollar-sign::before {
	content: "\f155";
}

.tcfa-dolly::before {
	content: "\f472";
}

.tcfa-dolly-flatbed::before {
	content: "\f474";
}

.tcfa-donate::before {
	content: "\f4b9";
}

.tcfa-door-closed::before {
	content: "\f52a";
}

.tcfa-door-open::before {
	content: "\f52b";
}

.tcfa-dot-circle::before {
	content: "\f192";
}

.tcfa-dove::before {
	content: "\f4ba";
}

.tcfa-download::before {
	content: "\f019";
}

.tcfa-draft2digital::before {
	content: "\f396";
}

.tcfa-drafting-compass::before {
	content: "\f568";
}

.tcfa-dragon::before {
	content: "\f6d5";
}

.tcfa-draw-polygon::before {
	content: "\f5ee";
}

.tcfa-dribbble::before {
	content: "\f17d";
}

.tcfa-dribbble-square::before {
	content: "\f397";
}

.tcfa-dropbox::before {
	content: "\f16b";
}

.tcfa-drum::before {
	content: "\f569";
}

.tcfa-drum-steelpan::before {
	content: "\f56a";
}

.tcfa-drumstick-bite::before {
	content: "\f6d7";
}

.tcfa-drupal::before {
	content: "\f1a9";
}

.tcfa-dumbbell::before {
	content: "\f44b";
}

.tcfa-dumpster::before {
	content: "\f793";
}

.tcfa-dumpster-fire::before {
	content: "\f794";
}

.tcfa-dungeon::before {
	content: "\f6d9";
}

.tcfa-dyalog::before {
	content: "\f399";
}

.tcfa-earlybirds::before {
	content: "\f39a";
}

.tcfa-ebay::before {
	content: "\f4f4";
}

.tcfa-edge::before {
	content: "\f282";
}

.tcfa-edit::before {
	content: "\f044";
}

.tcfa-egg::before {
	content: "\f7fb";
}

.tcfa-eject::before {
	content: "\f052";
}

.tcfa-elementor::before {
	content: "\f430";
}

.tcfa-ellipsis-h::before {
	content: "\f141";
}

.tcfa-ellipsis-v::before {
	content: "\f142";
}

.tcfa-ello::before {
	content: "\f5f1";
}

.tcfa-ember::before {
	content: "\f423";
}

.tcfa-empire::before {
	content: "\f1d1";
}

.tcfa-envelope::before {
	content: "\f0e0";
}

.tcfa-envelope-open::before {
	content: "\f2b6";
}

.tcfa-envelope-open-text::before {
	content: "\f658";
}

.tcfa-envelope-square::before {
	content: "\f199";
}

.tcfa-envira::before {
	content: "\f299";
}

.tcfa-equals::before {
	content: "\f52c";
}

.tcfa-eraser::before {
	content: "\f12d";
}

.tcfa-erlang::before {
	content: "\f39d";
}

.tcfa-ethereum::before {
	content: "\f42e";
}

.tcfa-ethernet::before {
	content: "\f796";
}

.tcfa-etsy::before {
	content: "\f2d7";
}

.tcfa-euro-sign::before {
	content: "\f153";
}

.tcfa-evernote::before {
	content: "\f839";
}

.tcfa-exchange-alt::before {
	content: "\f362";
}

.tcfa-exclamation::before {
	content: "\f12a";
}

.tcfa-exclamation-circle::before {
	content: "\f06a";
}

.tcfa-exclamation-triangle::before {
	content: "\f071";
}

.tcfa-expand::before {
	content: "\f065";
}

.tcfa-expand-alt::before {
	content: "\f424";
}

.tcfa-expand-arrows-alt::before {
	content: "\f31e";
}

.tcfa-expeditedssl::before {
	content: "\f23e";
}

.tcfa-external-link-alt::before {
	content: "\f35d";
}

.tcfa-external-link-square-alt::before {
	content: "\f360";
}

.tcfa-eye::before {
	content: "\f06e";
}

.tcfa-eye-dropper::before {
	content: "\f1fb";
}

.tcfa-eye-slash::before {
	content: "\f070";
}

.tcfa-facebook::before {
	content: "\f09a";
}

.tcfa-facebook-f::before {
	content: "\f39e";
}

.tcfa-facebook-messenger::before {
	content: "\f39f";
}

.tcfa-facebook-square::before {
	content: "\f082";
}

.tcfa-fan::before {
	content: "\f863";
}

.tcfa-fantasy-flight-games::before {
	content: "\f6dc";
}

.tcfa-fast-backward::before {
	content: "\f049";
}

.tcfa-fast-forward::before {
	content: "\f050";
}

.tcfa-fax::before {
	content: "\f1ac";
}

.tcfa-feather::before {
	content: "\f52d";
}

.tcfa-feather-alt::before {
	content: "\f56b";
}

.tcfa-fedex::before {
	content: "\f797";
}

.tcfa-fedora::before {
	content: "\f798";
}

.tcfa-female::before {
	content: "\f182";
}

.tcfa-fighter-jet::before {
	content: "\f0fb";
}

.tcfa-figma::before {
	content: "\f799";
}

.tcfa-file::before {
	content: "\f15b";
}

.tcfa-file-alt::before {
	content: "\f15c";
}

.tcfa-file-archive::before {
	content: "\f1c6";
}

.tcfa-file-audio::before {
	content: "\f1c7";
}

.tcfa-file-code::before {
	content: "\f1c9";
}

.tcfa-file-contract::before {
	content: "\f56c";
}

.tcfa-file-csv::before {
	content: "\f6dd";
}

.tcfa-file-download::before {
	content: "\f56d";
}

.tcfa-file-excel::before {
	content: "\f1c3";
}

.tcfa-file-export::before {
	content: "\f56e";
}

.tcfa-file-image::before {
	content: "\f1c5";
}

.tcfa-file-import::before {
	content: "\f56f";
}

.tcfa-file-invoice::before {
	content: "\f570";
}

.tcfa-file-invoice-dollar::before {
	content: "\f571";
}

.tcfa-file-medical::before {
	content: "\f477";
}

.tcfa-file-medical-alt::before {
	content: "\f478";
}

.tcfa-file-pdf::before {
	content: "\f1c1";
}

.tcfa-file-powerpoint::before {
	content: "\f1c4";
}

.tcfa-file-prescription::before {
	content: "\f572";
}

.tcfa-file-signature::before {
	content: "\f573";
}

.tcfa-file-upload::before {
	content: "\f574";
}

.tcfa-file-video::before {
	content: "\f1c8";
}

.tcfa-file-word::before {
	content: "\f1c2";
}

.tcfa-fill::before {
	content: "\f575";
}

.tcfa-fill-drip::before {
	content: "\f576";
}

.tcfa-film::before {
	content: "\f008";
}

.tcfa-filter::before {
	content: "\f0b0";
}

.tcfa-fingerprint::before {
	content: "\f577";
}

.tcfa-fire::before {
	content: "\f06d";
}

.tcfa-fire-alt::before {
	content: "\f7e4";
}

.tcfa-fire-extinguisher::before {
	content: "\f134";
}

.tcfa-firefox::before {
	content: "\f269";
}

.tcfa-firefox-browser::before {
	content: "\f907";
}

.tcfa-first-aid::before {
	content: "\f479";
}

.tcfa-first-order::before {
	content: "\f2b0";
}

.tcfa-first-order-alt::before {
	content: "\f50a";
}

.tcfa-firstdraft::before {
	content: "\f3a1";
}

.tcfa-fish::before {
	content: "\f578";
}

.tcfa-fist-raised::before {
	content: "\f6de";
}

.tcfa-flag::before {
	content: "\f024";
}

.tcfa-flag-checkered::before {
	content: "\f11e";
}

.tcfa-flag-usa::before {
	content: "\f74d";
}

.tcfa-flask::before {
	content: "\f0c3";
}

.tcfa-flickr::before {
	content: "\f16e";
}

.tcfa-flipboard::before {
	content: "\f44d";
}

.tcfa-flushed::before {
	content: "\f579";
}

.tcfa-fly::before {
	content: "\f417";
}

.tcfa-folder::before {
	content: "\f07b";
}

.tcfa-folder-minus::before {
	content: "\f65d";
}

.tcfa-folder-open::before {
	content: "\f07c";
}

.tcfa-folder-plus::before {
	content: "\f65e";
}

.tcfa-font::before {
	content: "\f031";
}

.tcfa-font-awesome::before {
	content: "\f2b4";
}

.tcfa-font-awesome-alt::before {
	content: "\f35c";
}

.tcfa-font-awesome-flag::before {
	content: "\f425";
}

.tcfa-font-awesome-logo-full::before {
	content: "\f4e6";
}

.tcfa-fonticons::before {
	content: "\f280";
}

.tcfa-fonticons-fi::before {
	content: "\f3a2";
}

.tcfa-football-ball::before {
	content: "\f44e";
}

.tcfa-fort-awesome::before {
	content: "\f286";
}

.tcfa-fort-awesome-alt::before {
	content: "\f3a3";
}

.tcfa-forumbee::before {
	content: "\f211";
}

.tcfa-forward::before {
	content: "\f04e";
}

.tcfa-foursquare::before {
	content: "\f180";
}

.tcfa-free-code-camp::before {
	content: "\f2c5";
}

.tcfa-freebsd::before {
	content: "\f3a4";
}

.tcfa-frog::before {
	content: "\f52e";
}

.tcfa-frown::before {
	content: "\f119";
}

.tcfa-frown-open::before {
	content: "\f57a";
}

.tcfa-fulcrum::before {
	content: "\f50b";
}

.tcfa-funnel-dollar::before {
	content: "\f662";
}

.tcfa-futbol::before {
	content: "\f1e3";
}

.tcfa-galactic-republic::before {
	content: "\f50c";
}

.tcfa-galactic-senate::before {
	content: "\f50d";
}

.tcfa-gamepad::before {
	content: "\f11b";
}

.tcfa-gas-pump::before {
	content: "\f52f";
}

.tcfa-gavel::before {
	content: "\f0e3";
}

.tcfa-gem::before {
	content: "\f3a5";
}

.tcfa-genderless::before {
	content: "\f22d";
}

.tcfa-get-pocket::before {
	content: "\f265";
}

.tcfa-gg::before {
	content: "\f260";
}

.tcfa-gg-circle::before {
	content: "\f261";
}

.tcfa-ghost::before {
	content: "\f6e2";
}

.tcfa-gift::before {
	content: "\f06b";
}

.tcfa-gifts::before {
	content: "\f79c";
}

.tcfa-git::before {
	content: "\f1d3";
}

.tcfa-git-alt::before {
	content: "\f841";
}

.tcfa-git-square::before {
	content: "\f1d2";
}

.tcfa-github::before {
	content: "\f09b";
}

.tcfa-github-alt::before {
	content: "\f113";
}

.tcfa-github-square::before {
	content: "\f092";
}

.tcfa-gitkraken::before {
	content: "\f3a6";
}

.tcfa-gitlab::before {
	content: "\f296";
}

.tcfa-gitter::before {
	content: "\f426";
}

.tcfa-glass-cheers::before {
	content: "\f79f";
}

.tcfa-glass-martini::before {
	content: "\f000";
}

.tcfa-glass-martini-alt::before {
	content: "\f57b";
}

.tcfa-glass-whiskey::before {
	content: "\f7a0";
}

.tcfa-glasses::before {
	content: "\f530";
}

.tcfa-glide::before {
	content: "\f2a5";
}

.tcfa-glide-g::before {
	content: "\f2a6";
}

.tcfa-globe::before {
	content: "\f0ac";
}

.tcfa-globe-africa::before {
	content: "\f57c";
}

.tcfa-globe-americas::before {
	content: "\f57d";
}

.tcfa-globe-asia::before {
	content: "\f57e";
}

.tcfa-globe-europe::before {
	content: "\f7a2";
}

.tcfa-gofore::before {
	content: "\f3a7";
}

.tcfa-golf-ball::before {
	content: "\f450";
}

.tcfa-goodreads::before {
	content: "\f3a8";
}

.tcfa-goodreads-g::before {
	content: "\f3a9";
}

.tcfa-google::before {
	content: "\f1a0";
}

.tcfa-google-drive::before {
	content: "\f3aa";
}

.tcfa-google-play::before {
	content: "\f3ab";
}

.tcfa-google-plus::before {
	content: "\f2b3";
}

.tcfa-google-plus-g::before {
	content: "\f0d5";
}

.tcfa-google-plus-square::before {
	content: "\f0d4";
}

.tcfa-google-wallet::before {
	content: "\f1ee";
}

.tcfa-gopuram::before {
	content: "\f664";
}

.tcfa-graduation-cap::before {
	content: "\f19d";
}

.tcfa-gratipay::before {
	content: "\f184";
}

.tcfa-grav::before {
	content: "\f2d6";
}

.tcfa-greater-than::before {
	content: "\f531";
}

.tcfa-greater-than-equal::before {
	content: "\f532";
}

.tcfa-grimace::before {
	content: "\f57f";
}

.tcfa-grin::before {
	content: "\f580";
}

.tcfa-grin-alt::before {
	content: "\f581";
}

.tcfa-grin-beam::before {
	content: "\f582";
}

.tcfa-grin-beam-sweat::before {
	content: "\f583";
}

.tcfa-grin-hearts::before {
	content: "\f584";
}

.tcfa-grin-squint::before {
	content: "\f585";
}

.tcfa-grin-squint-tears::before {
	content: "\f586";
}

.tcfa-grin-stars::before {
	content: "\f587";
}

.tcfa-grin-tears::before {
	content: "\f588";
}

.tcfa-grin-tongue::before {
	content: "\f589";
}

.tcfa-grin-tongue-squint::before {
	content: "\f58a";
}

.tcfa-grin-tongue-wink::before {
	content: "\f58b";
}

.tcfa-grin-wink::before {
	content: "\f58c";
}

.tcfa-grip-horizontal::before {
	content: "\f58d";
}

.tcfa-grip-lines::before {
	content: "\f7a4";
}

.tcfa-grip-lines-vertical::before {
	content: "\f7a5";
}

.tcfa-grip-vertical::before {
	content: "\f58e";
}

.tcfa-gripfire::before {
	content: "\f3ac";
}

.tcfa-grunt::before {
	content: "\f3ad";
}

.tcfa-guitar::before {
	content: "\f7a6";
}

.tcfa-gulp::before {
	content: "\f3ae";
}

.tcfa-h-square::before {
	content: "\f0fd";
}

.tcfa-hacker-news::before {
	content: "\f1d4";
}

.tcfa-hacker-news-square::before {
	content: "\f3af";
}

.tcfa-hackerrank::before {
	content: "\f5f7";
}

.tcfa-hamburger::before {
	content: "\f805";
}

.tcfa-hammer::before {
	content: "\f6e3";
}

.tcfa-hamsa::before {
	content: "\f665";
}

.tcfa-hand-holding::before {
	content: "\f4bd";
}

.tcfa-hand-holding-heart::before {
	content: "\f4be";
}

.tcfa-hand-holding-usd::before {
	content: "\f4c0";
}

.tcfa-hand-lizard::before {
	content: "\f258";
}

.tcfa-hand-middle-finger::before {
	content: "\f806";
}

.tcfa-hand-paper::before {
	content: "\f256";
}

.tcfa-hand-peace::before {
	content: "\f25b";
}

.tcfa-hand-point-down::before {
	content: "\f0a7";
}

.tcfa-hand-point-left::before {
	content: "\f0a5";
}

.tcfa-hand-point-right::before {
	content: "\f0a4";
}

.tcfa-hand-point-up::before {
	content: "\f0a6";
}

.tcfa-hand-pointer::before {
	content: "\f25a";
}

.tcfa-hand-rock::before {
	content: "\f255";
}

.tcfa-hand-scissors::before {
	content: "\f257";
}

.tcfa-hand-spock::before {
	content: "\f259";
}

.tcfa-hands::before {
	content: "\f4c2";
}

.tcfa-hands-helping::before {
	content: "\f4c4";
}

.tcfa-handshake::before {
	content: "\f2b5";
}

.tcfa-hanukiah::before {
	content: "\f6e6";
}

.tcfa-hard-hat::before {
	content: "\f807";
}

.tcfa-hashtag::before {
	content: "\f292";
}

.tcfa-hat-cowboy::before {
	content: "\f8c0";
}

.tcfa-hat-cowboy-side::before {
	content: "\f8c1";
}

.tcfa-hat-wizard::before {
	content: "\f6e8";
}

.tcfa-hdd::before {
	content: "\f0a0";
}

.tcfa-heading::before {
	content: "\f1dc";
}

.tcfa-headphones::before {
	content: "\f025";
}

.tcfa-headphones-alt::before {
	content: "\f58f";
}

.tcfa-headset::before {
	content: "\f590";
}

.tcfa-heart::before {
	content: "\f004";
}

.tcfa-heart-broken::before {
	content: "\f7a9";
}

.tcfa-heartbeat::before {
	content: "\f21e";
}

.tcfa-helicopter::before {
	content: "\f533";
}

.tcfa-highlighter::before {
	content: "\f591";
}

.tcfa-hiking::before {
	content: "\f6ec";
}

.tcfa-hippo::before {
	content: "\f6ed";
}

.tcfa-hips::before {
	content: "\f452";
}

.tcfa-hire-a-helper::before {
	content: "\f3b0";
}

.tcfa-history::before {
	content: "\f1da";
}

.tcfa-hockey-puck::before {
	content: "\f453";
}

.tcfa-holly-berry::before {
	content: "\f7aa";
}

.tcfa-home::before {
	content: "\f015";
}

.tcfa-hooli::before {
	content: "\f427";
}

.tcfa-hornbill::before {
	content: "\f592";
}

.tcfa-horse::before {
	content: "\f6f0";
}

.tcfa-horse-head::before {
	content: "\f7ab";
}

.tcfa-hospital::before {
	content: "\f0f8";
}

.tcfa-hospital-alt::before {
	content: "\f47d";
}

.tcfa-hospital-symbol::before {
	content: "\f47e";
}

.tcfa-hot-tub::before {
	content: "\f593";
}

.tcfa-hotdog::before {
	content: "\f80f";
}

.tcfa-hotel::before {
	content: "\f594";
}

.tcfa-hotjar::before {
	content: "\f3b1";
}

.tcfa-hourglass::before {
	content: "\f254";
}

.tcfa-hourglass-end::before {
	content: "\f253";
}

.tcfa-hourglass-half::before {
	content: "\f252";
}

.tcfa-hourglass-start::before {
	content: "\f251";
}

.tcfa-house-damage::before {
	content: "\f6f1";
}

.tcfa-houzz::before {
	content: "\f27c";
}

.tcfa-hryvnia::before {
	content: "\f6f2";
}

.tcfa-html5::before {
	content: "\f13b";
}

.tcfa-hubspot::before {
	content: "\f3b2";
}

.tcfa-i-cursor::before {
	content: "\f246";
}

.tcfa-ice-cream::before {
	content: "\f810";
}

.tcfa-icicles::before {
	content: "\f7ad";
}

.tcfa-icons::before {
	content: "\f86d";
}

.tcfa-id-badge::before {
	content: "\f2c1";
}

.tcfa-id-card::before {
	content: "\f2c2";
}

.tcfa-id-card-alt::before {
	content: "\f47f";
}

.tcfa-ideal::before {
	content: "\f913";
}

.tcfa-igloo::before {
	content: "\f7ae";
}

.tcfa-image::before {
	content: "\f03e";
}

.tcfa-images::before {
	content: "\f302";
}

.tcfa-imdb::before {
	content: "\f2d8";
}

.tcfa-inbox::before {
	content: "\f01c";
}

.tcfa-indent::before {
	content: "\f03c";
}

.tcfa-industry::before {
	content: "\f275";
}

.tcfa-infinity::before {
	content: "\f534";
}

.tcfa-info::before {
	content: "\f129";
}

.tcfa-info-circle::before {
	content: "\f05a";
}

.tcfa-instagram::before {
	content: "\f16d";
}

.tcfa-intercom::before {
	content: "\f7af";
}

.tcfa-internet-explorer::before {
	content: "\f26b";
}

.tcfa-invision::before {
	content: "\f7b0";
}

.tcfa-ioxhost::before {
	content: "\f208";
}

.tcfa-italic::before {
	content: "\f033";
}

.tcfa-itch-io::before {
	content: "\f83a";
}

.tcfa-itunes::before {
	content: "\f3b4";
}

.tcfa-itunes-note::before {
	content: "\f3b5";
}

.tcfa-java::before {
	content: "\f4e4";
}

.tcfa-jedi::before {
	content: "\f669";
}

.tcfa-jedi-order::before {
	content: "\f50e";
}

.tcfa-jenkins::before {
	content: "\f3b6";
}

.tcfa-jira::before {
	content: "\f7b1";
}

.tcfa-joget::before {
	content: "\f3b7";
}

.tcfa-joint::before {
	content: "\f595";
}

.tcfa-joomla::before {
	content: "\f1aa";
}

.tcfa-journal-whills::before {
	content: "\f66a";
}

.tcfa-js::before {
	content: "\f3b8";
}

.tcfa-js-square::before {
	content: "\f3b9";
}

.tcfa-jsfiddle::before {
	content: "\f1cc";
}

.tcfa-kaaba::before {
	content: "\f66b";
}

.tcfa-kaggle::before {
	content: "\f5fa";
}

.tcfa-key::before {
	content: "\f084";
}

.tcfa-keybase::before {
	content: "\f4f5";
}

.tcfa-keyboard::before {
	content: "\f11c";
}

.tcfa-keycdn::before {
	content: "\f3ba";
}

.tcfa-khanda::before {
	content: "\f66d";
}

.tcfa-kickstarter::before {
	content: "\f3bb";
}

.tcfa-kickstarter-k::before {
	content: "\f3bc";
}

.tcfa-kiss::before {
	content: "\f596";
}

.tcfa-kiss-beam::before {
	content: "\f597";
}

.tcfa-kiss-wink-heart::before {
	content: "\f598";
}

.tcfa-kiwi-bird::before {
	content: "\f535";
}

.tcfa-korvue::before {
	content: "\f42f";
}

.tcfa-landmark::before {
	content: "\f66f";
}

.tcfa-language::before {
	content: "\f1ab";
}

.tcfa-laptop::before {
	content: "\f109";
}

.tcfa-laptop-code::before {
	content: "\f5fc";
}

.tcfa-laptop-medical::before {
	content: "\f812";
}

.tcfa-laravel::before {
	content: "\f3bd";
}

.tcfa-lastfm::before {
	content: "\f202";
}

.tcfa-lastfm-square::before {
	content: "\f203";
}

.tcfa-laugh::before {
	content: "\f599";
}

.tcfa-laugh-beam::before {
	content: "\f59a";
}

.tcfa-laugh-squint::before {
	content: "\f59b";
}

.tcfa-laugh-wink::before {
	content: "\f59c";
}

.tcfa-layer-group::before {
	content: "\f5fd";
}

.tcfa-leaf::before {
	content: "\f06c";
}

.tcfa-leanpub::before {
	content: "\f212";
}

.tcfa-lemon::before {
	content: "\f094";
}

.tcfa-less::before {
	content: "\f41d";
}

.tcfa-less-than::before {
	content: "\f536";
}

.tcfa-less-than-equal::before {
	content: "\f537";
}

.tcfa-level-down-alt::before {
	content: "\f3be";
}

.tcfa-level-up-alt::before {
	content: "\f3bf";
}

.tcfa-life-ring::before {
	content: "\f1cd";
}

.tcfa-lightbulb::before {
	content: "\f0eb";
}

.tcfa-line::before {
	content: "\f3c0";
}

.tcfa-link::before {
	content: "\f0c1";
}

.tcfa-linkedin::before {
	content: "\f08c";
}

.tcfa-linkedin-in::before {
	content: "\f0e1";
}

.tcfa-linode::before {
	content: "\f2b8";
}

.tcfa-linux::before {
	content: "\f17c";
}

.tcfa-lira-sign::before {
	content: "\f195";
}

.tcfa-list::before {
	content: "\f03a";
}

.tcfa-list-alt::before {
	content: "\f022";
}

.tcfa-list-ol::before {
	content: "\f0cb";
}

.tcfa-list-ul::before {
	content: "\f0ca";
}

.tcfa-location-arrow::before {
	content: "\f124";
}

.tcfa-lock::before {
	content: "\f023";
}

.tcfa-lock-open::before {
	content: "\f3c1";
}

.tcfa-long-arrow-alt-down::before {
	content: "\f309";
}

.tcfa-long-arrow-alt-left::before {
	content: "\f30a";
}

.tcfa-long-arrow-alt-right::before {
	content: "\f30b";
}

.tcfa-long-arrow-alt-up::before {
	content: "\f30c";
}

.tcfa-low-vision::before {
	content: "\f2a8";
}

.tcfa-luggage-cart::before {
	content: "\f59d";
}

.tcfa-lyft::before {
	content: "\f3c3";
}

.tcfa-magento::before {
	content: "\f3c4";
}

.tcfa-magic::before {
	content: "\f0d0";
}

.tcfa-magnet::before {
	content: "\f076";
}

.tcfa-mail-bulk::before {
	content: "\f674";
}

.tcfa-mailchimp::before {
	content: "\f59e";
}

.tcfa-male::before {
	content: "\f183";
}

.tcfa-mandalorian::before {
	content: "\f50f";
}

.tcfa-map::before {
	content: "\f279";
}

.tcfa-map-marked::before {
	content: "\f59f";
}

.tcfa-map-marked-alt::before {
	content: "\f5a0";
}

.tcfa-map-marker::before {
	content: "\f041";
}

.tcfa-map-marker-alt::before {
	content: "\f3c5";
}

.tcfa-map-pin::before {
	content: "\f276";
}

.tcfa-map-signs::before {
	content: "\f277";
}

.tcfa-markdown::before {
	content: "\f60f";
}

.tcfa-marker::before {
	content: "\f5a1";
}

.tcfa-mars::before {
	content: "\f222";
}

.tcfa-mars-double::before {
	content: "\f227";
}

.tcfa-mars-stroke::before {
	content: "\f229";
}

.tcfa-mars-stroke-h::before {
	content: "\f22b";
}

.tcfa-mars-stroke-v::before {
	content: "\f22a";
}

.tcfa-mask::before {
	content: "\f6fa";
}

.tcfa-mastodon::before {
	content: "\f4f6";
}

.tcfa-maxcdn::before {
	content: "\f136";
}

.tcfa-mdb::before {
	content: "\f8ca";
}

.tcfa-medal::before {
	content: "\f5a2";
}

.tcfa-medapps::before {
	content: "\f3c6";
}

.tcfa-medium::before {
	content: "\f23a";
}

.tcfa-medium-m::before {
	content: "\f3c7";
}

.tcfa-medkit::before {
	content: "\f0fa";
}

.tcfa-medrt::before {
	content: "\f3c8";
}

.tcfa-meetup::before {
	content: "\f2e0";
}

.tcfa-megaport::before {
	content: "\f5a3";
}

.tcfa-meh::before {
	content: "\f11a";
}

.tcfa-meh-blank::before {
	content: "\f5a4";
}

.tcfa-meh-rolling-eyes::before {
	content: "\f5a5";
}

.tcfa-memory::before {
	content: "\f538";
}

.tcfa-mendeley::before {
	content: "\f7b3";
}

.tcfa-menorah::before {
	content: "\f676";
}

.tcfa-mercury::before {
	content: "\f223";
}

.tcfa-meteor::before {
	content: "\f753";
}

.tcfa-microblog::before {
	content: "\f91a";
}

.tcfa-microchip::before {
	content: "\f2db";
}

.tcfa-microphone::before {
	content: "\f130";
}

.tcfa-microphone-alt::before {
	content: "\f3c9";
}

.tcfa-microphone-alt-slash::before {
	content: "\f539";
}

.tcfa-microphone-slash::before {
	content: "\f131";
}

.tcfa-microscope::before {
	content: "\f610";
}

.tcfa-microsoft::before {
	content: "\f3ca";
}

.tcfa-minus::before {
	content: "\f068";
}

.tcfa-minus-circle::before {
	content: "\f056";
}

.tcfa-minus-square::before {
	content: "\f146";
}

.tcfa-mitten::before {
	content: "\f7b5";
}

.tcfa-mix::before {
	content: "\f3cb";
}

.tcfa-mixcloud::before {
	content: "\f289";
}

.tcfa-mizuni::before {
	content: "\f3cc";
}

.tcfa-mobile::before {
	content: "\f10b";
}

.tcfa-mobile-alt::before {
	content: "\f3cd";
}

.tcfa-modx::before {
	content: "\f285";
}

.tcfa-monero::before {
	content: "\f3d0";
}

.tcfa-money-bill::before {
	content: "\f0d6";
}

.tcfa-money-bill-alt::before {
	content: "\f3d1";
}

.tcfa-money-bill-wave::before {
	content: "\f53a";
}

.tcfa-money-bill-wave-alt::before {
	content: "\f53b";
}

.tcfa-money-check::before {
	content: "\f53c";
}

.tcfa-money-check-alt::before {
	content: "\f53d";
}

.tcfa-monument::before {
	content: "\f5a6";
}

.tcfa-moon::before {
	content: "\f186";
}

.tcfa-mortar-pestle::before {
	content: "\f5a7";
}

.tcfa-mosque::before {
	content: "\f678";
}

.tcfa-motorcycle::before {
	content: "\f21c";
}

.tcfa-mountain::before {
	content: "\f6fc";
}

.tcfa-mouse::before {
	content: "\f8cc";
}

.tcfa-mouse-pointer::before {
	content: "\f245";
}

.tcfa-mug-hot::before {
	content: "\f7b6";
}

.tcfa-music::before {
	content: "\f001";
}

.tcfa-napster::before {
	content: "\f3d2";
}

.tcfa-neos::before {
	content: "\f612";
}

.tcfa-network-wired::before {
	content: "\f6ff";
}

.tcfa-neuter::before {
	content: "\f22c";
}

.tcfa-newspaper::before {
	content: "\f1ea";
}

.tcfa-nimblr::before {
	content: "\f5a8";
}

.tcfa-node::before {
	content: "\f419";
}

.tcfa-node-js::before {
	content: "\f3d3";
}

.tcfa-not-equal::before {
	content: "\f53e";
}

.tcfa-notes-medical::before {
	content: "\f481";
}

.tcfa-npm::before {
	content: "\f3d4";
}

.tcfa-ns8::before {
	content: "\f3d5";
}

.tcfa-nutritionix::before {
	content: "\f3d6";
}

.tcfa-object-group::before {
	content: "\f247";
}

.tcfa-object-ungroup::before {
	content: "\f248";
}

.tcfa-odnoklassniki::before {
	content: "\f263";
}

.tcfa-odnoklassniki-square::before {
	content: "\f264";
}

.tcfa-oil-can::before {
	content: "\f613";
}

.tcfa-old-republic::before {
	content: "\f510";
}

.tcfa-om::before {
	content: "\f679";
}

.tcfa-opencart::before {
	content: "\f23d";
}

.tcfa-openid::before {
	content: "\f19b";
}

.tcfa-opera::before {
	content: "\f26a";
}

.tcfa-optin-monster::before {
	content: "\f23c";
}

.tcfa-orcid::before {
	content: "\f8d2";
}

.tcfa-osi::before {
	content: "\f41a";
}

.tcfa-otter::before {
	content: "\f700";
}

.tcfa-outdent::before {
	content: "\f03b";
}

.tcfa-page4::before {
	content: "\f3d7";
}

.tcfa-pagelines::before {
	content: "\f18c";
}

.tcfa-pager::before {
	content: "\f815";
}

.tcfa-paint-brush::before {
	content: "\f1fc";
}

.tcfa-paint-roller::before {
	content: "\f5aa";
}

.tcfa-palette::before {
	content: "\f53f";
}

.tcfa-palfed::before {
	content: "\f3d8";
}

.tcfa-pallet::before {
	content: "\f482";
}

.tcfa-paper-plane::before {
	content: "\f1d8";
}

.tcfa-paperclip::before {
	content: "\f0c6";
}

.tcfa-parachute-box::before {
	content: "\f4cd";
}

.tcfa-paragraph::before {
	content: "\f1dd";
}

.tcfa-parking::before {
	content: "\f540";
}

.tcfa-passport::before {
	content: "\f5ab";
}

.tcfa-pastafarianism::before {
	content: "\f67b";
}

.tcfa-paste::before {
	content: "\f0ea";
}

.tcfa-patreon::before {
	content: "\f3d9";
}

.tcfa-pause::before {
	content: "\f04c";
}

.tcfa-pause-circle::before {
	content: "\f28b";
}

.tcfa-paw::before {
	content: "\f1b0";
}

.tcfa-paypal::before {
	content: "\f1ed";
}

.tcfa-peace::before {
	content: "\f67c";
}

.tcfa-pen::before {
	content: "\f304";
}

.tcfa-pen-alt::before {
	content: "\f305";
}

.tcfa-pen-fancy::before {
	content: "\f5ac";
}

.tcfa-pen-nib::before {
	content: "\f5ad";
}

.tcfa-pen-square::before {
	content: "\f14b";
}

.tcfa-pencil-alt::before {
	content: "\f303";
}

.tcfa-pencil-ruler::before {
	content: "\f5ae";
}

.tcfa-penny-arcade::before {
	content: "\f704";
}

.tcfa-people-carry::before {
	content: "\f4ce";
}

.tcfa-pepper-hot::before {
	content: "\f816";
}

.tcfa-percent::before {
	content: "\f295";
}

.tcfa-percentage::before {
	content: "\f541";
}

.tcfa-periscope::before {
	content: "\f3da";
}

.tcfa-person-booth::before {
	content: "\f756";
}

.tcfa-phabricator::before {
	content: "\f3db";
}

.tcfa-phoenix-framework::before {
	content: "\f3dc";
}

.tcfa-phoenix-squadron::before {
	content: "\f511";
}

.tcfa-phone::before {
	content: "\f095";
}

.tcfa-phone-alt::before {
	content: "\f879";
}

.tcfa-phone-slash::before {
	content: "\f3dd";
}

.tcfa-phone-square::before {
	content: "\f098";
}

.tcfa-phone-square-alt::before {
	content: "\f87b";
}

.tcfa-phone-volume::before {
	content: "\f2a0";
}

.tcfa-photo-video::before {
	content: "\f87c";
}

.tcfa-php::before {
	content: "\f457";
}

.tcfa-pied-piper::before {
	content: "\f2ae";
}

.tcfa-pied-piper-alt::before {
	content: "\f1a8";
}

.tcfa-pied-piper-hat::before {
	content: "\f4e5";
}

.tcfa-pied-piper-pp::before {
	content: "\f1a7";
}

.tcfa-pied-piper-square::before {
	content: "\f91e";
}

.tcfa-piggy-bank::before {
	content: "\f4d3";
}

.tcfa-pills::before {
	content: "\f484";
}

.tcfa-pinterest::before {
	content: "\f0d2";
}

.tcfa-pinterest-p::before {
	content: "\f231";
}

.tcfa-pinterest-square::before {
	content: "\f0d3";
}

.tcfa-pizza-slice::before {
	content: "\f818";
}

.tcfa-place-of-worship::before {
	content: "\f67f";
}

.tcfa-plane::before {
	content: "\f072";
}

.tcfa-plane-arrival::before {
	content: "\f5af";
}

.tcfa-plane-departure::before {
	content: "\f5b0";
}

.tcfa-play::before {
	content: "\f04b";
}

.tcfa-play-circle::before {
	content: "\f144";
}

.tcfa-playstation::before {
	content: "\f3df";
}

.tcfa-plug::before {
	content: "\f1e6";
}

.tcfa-plus::before {
	content: "\f067";
}

.tcfa-plus-circle::before {
	content: "\f055";
}

.tcfa-plus-square::before {
	content: "\f0fe";
}

.tcfa-podcast::before {
	content: "\f2ce";
}

.tcfa-poll::before {
	content: "\f681";
}

.tcfa-poll-h::before {
	content: "\f682";
}

.tcfa-poo::before {
	content: "\f2fe";
}

.tcfa-poo-storm::before {
	content: "\f75a";
}

.tcfa-poop::before {
	content: "\f619";
}

.tcfa-portrait::before {
	content: "\f3e0";
}

.tcfa-pound-sign::before {
	content: "\f154";
}

.tcfa-power-off::before {
	content: "\f011";
}

.tcfa-pray::before {
	content: "\f683";
}

.tcfa-praying-hands::before {
	content: "\f684";
}

.tcfa-prescription::before {
	content: "\f5b1";
}

.tcfa-prescription-bottle::before {
	content: "\f485";
}

.tcfa-prescription-bottle-alt::before {
	content: "\f486";
}

.tcfa-print::before {
	content: "\f02f";
}

.tcfa-procedures::before {
	content: "\f487";
}

.tcfa-product-hunt::before {
	content: "\f288";
}

.tcfa-project-diagram::before {
	content: "\f542";
}

.tcfa-pushed::before {
	content: "\f3e1";
}

.tcfa-puzzle-piece::before {
	content: "\f12e";
}

.tcfa-python::before {
	content: "\f3e2";
}

.tcfa-qq::before {
	content: "\f1d6";
}

.tcfa-qrcode::before {
	content: "\f029";
}

.tcfa-question::before {
	content: "\f128";
}

.tcfa-question-circle::before {
	content: "\f059";
}

.tcfa-quidditch::before {
	content: "\f458";
}

.tcfa-quinscape::before {
	content: "\f459";
}

.tcfa-quora::before {
	content: "\f2c4";
}

.tcfa-quote-left::before {
	content: "\f10d";
}

.tcfa-quote-right::before {
	content: "\f10e";
}

.tcfa-quran::before {
	content: "\f687";
}

.tcfa-r-project::before {
	content: "\f4f7";
}

.tcfa-radiation::before {
	content: "\f7b9";
}

.tcfa-radiation-alt::before {
	content: "\f7ba";
}

.tcfa-rainbow::before {
	content: "\f75b";
}

.tcfa-random::before {
	content: "\f074";
}

.tcfa-raspberry-pi::before {
	content: "\f7bb";
}

.tcfa-ravelry::before {
	content: "\f2d9";
}

.tcfa-react::before {
	content: "\f41b";
}

.tcfa-reacteurope::before {
	content: "\f75d";
}

.tcfa-readme::before {
	content: "\f4d5";
}

.tcfa-rebel::before {
	content: "\f1d0";
}

.tcfa-receipt::before {
	content: "\f543";
}

.tcfa-record-vinyl::before {
	content: "\f8d9";
}

.tcfa-recycle::before {
	content: "\f1b8";
}

.tcfa-red-river::before {
	content: "\f3e3";
}

.tcfa-reddit::before {
	content: "\f1a1";
}

.tcfa-reddit-alien::before {
	content: "\f281";
}

.tcfa-reddit-square::before {
	content: "\f1a2";
}

.tcfa-redhat::before {
	content: "\f7bc";
}

.tcfa-redo::before {
	content: "\f01e";
}

.tcfa-redo-alt::before {
	content: "\f2f9";
}

.tcfa-registered::before {
	content: "\f25d";
}

.tcfa-remove-format::before {
	content: "\f87d";
}

.tcfa-renren::before {
	content: "\f18b";
}

.tcfa-reply::before {
	content: "\f3e5";
}

.tcfa-reply-all::before {
	content: "\f122";
}

.tcfa-replyd::before {
	content: "\f3e6";
}

.tcfa-republican::before {
	content: "\f75e";
}

.tcfa-researchgate::before {
	content: "\f4f8";
}

.tcfa-resolving::before {
	content: "\f3e7";
}

.tcfa-restroom::before {
	content: "\f7bd";
}

.tcfa-retweet::before {
	content: "\f079";
}

.tcfa-rev::before {
	content: "\f5b2";
}

.tcfa-ribbon::before {
	content: "\f4d6";
}

.tcfa-ring::before {
	content: "\f70b";
}

.tcfa-road::before {
	content: "\f018";
}

.tcfa-robot::before {
	content: "\f544";
}

.tcfa-rocket::before {
	content: "\f135";
}

.tcfa-rocketchat::before {
	content: "\f3e8";
}

.tcfa-rockrms::before {
	content: "\f3e9";
}

.tcfa-route::before {
	content: "\f4d7";
}

.tcfa-rss::before {
	content: "\f09e";
}

.tcfa-rss-square::before {
	content: "\f143";
}

.tcfa-ruble-sign::before {
	content: "\f158";
}

.tcfa-ruler::before {
	content: "\f545";
}

.tcfa-ruler-combined::before {
	content: "\f546";
}

.tcfa-ruler-horizontal::before {
	content: "\f547";
}

.tcfa-ruler-vertical::before {
	content: "\f548";
}

.tcfa-running::before {
	content: "\f70c";
}

.tcfa-rupee-sign::before {
	content: "\f156";
}

.tcfa-sad-cry::before {
	content: "\f5b3";
}

.tcfa-sad-tear::before {
	content: "\f5b4";
}

.tcfa-safari::before {
	content: "\f267";
}

.tcfa-salesforce::before {
	content: "\f83b";
}

.tcfa-sass::before {
	content: "\f41e";
}

.tcfa-satellite::before {
	content: "\f7bf";
}

.tcfa-satellite-dish::before {
	content: "\f7c0";
}

.tcfa-save::before {
	content: "\f0c7";
}

.tcfa-schlix::before {
	content: "\f3ea";
}

.tcfa-school::before {
	content: "\f549";
}

.tcfa-screwdriver::before {
	content: "\f54a";
}

.tcfa-scribd::before {
	content: "\f28a";
}

.tcfa-scroll::before {
	content: "\f70e";
}

.tcfa-sd-card::before {
	content: "\f7c2";
}

.tcfa-search::before {
	content: "\f002";
}

.tcfa-search-dollar::before {
	content: "\f688";
}

.tcfa-search-location::before {
	content: "\f689";
}

.tcfa-search-minus::before {
	content: "\f010";
}

.tcfa-search-plus::before {
	content: "\f00e";
}

.tcfa-searchengin::before {
	content: "\f3eb";
}

.tcfa-seedling::before {
	content: "\f4d8";
}

.tcfa-sellcast::before {
	content: "\f2da";
}

.tcfa-sellsy::before {
	content: "\f213";
}

.tcfa-server::before {
	content: "\f233";
}

.tcfa-servicestack::before {
	content: "\f3ec";
}

.tcfa-shapes::before {
	content: "\f61f";
}

.tcfa-share::before {
	content: "\f064";
}

.tcfa-share-alt::before {
	content: "\f1e0";
}

.tcfa-share-alt-square::before {
	content: "\f1e1";
}

.tcfa-share-square::before {
	content: "\f14d";
}

.tcfa-shekel-sign::before {
	content: "\f20b";
}

.tcfa-shield-alt::before {
	content: "\f3ed";
}

.tcfa-ship::before {
	content: "\f21a";
}

.tcfa-shipping-fast::before {
	content: "\f48b";
}

.tcfa-shirtsinbulk::before {
	content: "\f214";
}

.tcfa-shoe-prints::before {
	content: "\f54b";
}

.tcfa-shopping-bag::before {
	content: "\f290";
}

.tcfa-shopping-basket::before {
	content: "\f291";
}

.tcfa-shopping-cart::before {
	content: "\f07a";
}

.tcfa-shopware::before {
	content: "\f5b5";
}

.tcfa-shower::before {
	content: "\f2cc";
}

.tcfa-shuttle-van::before {
	content: "\f5b6";
}

.tcfa-sign::before {
	content: "\f4d9";
}

.tcfa-sign-in-alt::before {
	content: "\f2f6";
}

.tcfa-sign-language::before {
	content: "\f2a7";
}

.tcfa-sign-out-alt::before {
	content: "\f2f5";
}

.tcfa-signal::before {
	content: "\f012";
}

.tcfa-signature::before {
	content: "\f5b7";
}

.tcfa-sim-card::before {
	content: "\f7c4";
}

.tcfa-simplybuilt::before {
	content: "\f215";
}

.tcfa-sistrix::before {
	content: "\f3ee";
}

.tcfa-sitemap::before {
	content: "\f0e8";
}

.tcfa-sith::before {
	content: "\f512";
}

.tcfa-skating::before {
	content: "\f7c5";
}

.tcfa-sketch::before {
	content: "\f7c6";
}

.tcfa-skiing::before {
	content: "\f7c9";
}

.tcfa-skiing-nordic::before {
	content: "\f7ca";
}

.tcfa-skull::before {
	content: "\f54c";
}

.tcfa-skull-crossbones::before {
	content: "\f714";
}

.tcfa-skyatlas::before {
	content: "\f216";
}

.tcfa-skype::before {
	content: "\f17e";
}

.tcfa-slack::before {
	content: "\f198";
}

.tcfa-slack-hash::before {
	content: "\f3ef";
}

.tcfa-slash::before {
	content: "\f715";
}

.tcfa-sleigh::before {
	content: "\f7cc";
}

.tcfa-sliders-h::before {
	content: "\f1de";
}

.tcfa-slideshare::before {
	content: "\f1e7";
}

.tcfa-smile::before {
	content: "\f118";
}

.tcfa-smile-beam::before {
	content: "\f5b8";
}

.tcfa-smile-wink::before {
	content: "\f4da";
}

.tcfa-smog::before {
	content: "\f75f";
}

.tcfa-smoking::before {
	content: "\f48d";
}

.tcfa-smoking-ban::before {
	content: "\f54d";
}

.tcfa-sms::before {
	content: "\f7cd";
}

.tcfa-snapchat::before {
	content: "\f2ab";
}

.tcfa-snapchat-ghost::before {
	content: "\f2ac";
}

.tcfa-snapchat-square::before {
	content: "\f2ad";
}

.tcfa-snowboarding::before {
	content: "\f7ce";
}

.tcfa-snowflake::before {
	content: "\f2dc";
}

.tcfa-snowman::before {
	content: "\f7d0";
}

.tcfa-snowplow::before {
	content: "\f7d2";
}

.tcfa-socks::before {
	content: "\f696";
}

.tcfa-solar-panel::before {
	content: "\f5ba";
}

.tcfa-sort::before {
	content: "\f0dc";
}

.tcfa-sort-alpha-down::before {
	content: "\f15d";
}

.tcfa-sort-alpha-down-alt::before {
	content: "\f881";
}

.tcfa-sort-alpha-up::before {
	content: "\f15e";
}

.tcfa-sort-alpha-up-alt::before {
	content: "\f882";
}

.tcfa-sort-amount-down::before {
	content: "\f160";
}

.tcfa-sort-amount-down-alt::before {
	content: "\f884";
}

.tcfa-sort-amount-up::before {
	content: "\f161";
}

.tcfa-sort-amount-up-alt::before {
	content: "\f885";
}

.tcfa-sort-down::before {
	content: "\f0dd";
}

.tcfa-sort-numeric-down::before {
	content: "\f162";
}

.tcfa-sort-numeric-down-alt::before {
	content: "\f886";
}

.tcfa-sort-numeric-up::before {
	content: "\f163";
}

.tcfa-sort-numeric-up-alt::before {
	content: "\f887";
}

.tcfa-sort-up::before {
	content: "\f0de";
}

.tcfa-soundcloud::before {
	content: "\f1be";
}

.tcfa-sourcetree::before {
	content: "\f7d3";
}

.tcfa-spa::before {
	content: "\f5bb";
}

.tcfa-space-shuttle::before {
	content: "\f197";
}

.tcfa-speakap::before {
	content: "\f3f3";
}

.tcfa-speaker-deck::before {
	content: "\f83c";
}

.tcfa-spell-check::before {
	content: "\f891";
}

.tcfa-spider::before {
	content: "\f717";
}

.tcfa-spinner::before {
	content: "\f110";
}

.tcfa-splotch::before {
	content: "\f5bc";
}

.tcfa-spotify::before {
	content: "\f1bc";
}

.tcfa-spray-can::before {
	content: "\f5bd";
}

.tcfa-square::before {
	content: "\f0c8";
}

.tcfa-square-full::before {
	content: "\f45c";
}

.tcfa-square-root-alt::before {
	content: "\f698";
}

.tcfa-squarespace::before {
	content: "\f5be";
}

.tcfa-stack-exchange::before {
	content: "\f18d";
}

.tcfa-stack-overflow::before {
	content: "\f16c";
}

.tcfa-stackpath::before {
	content: "\f842";
}

.tcfa-stamp::before {
	content: "\f5bf";
}

.tcfa-star::before {
	content: "\f005";
}

.tcfa-star-and-crescent::before {
	content: "\f699";
}

.tcfa-star-half::before {
	content: "\f089";
}

.tcfa-star-half-alt::before {
	content: "\f5c0";
}

.tcfa-star-of-david::before {
	content: "\f69a";
}

.tcfa-star-of-life::before {
	content: "\f621";
}

.tcfa-staylinked::before {
	content: "\f3f5";
}

.tcfa-steam::before {
	content: "\f1b6";
}

.tcfa-steam-square::before {
	content: "\f1b7";
}

.tcfa-steam-symbol::before {
	content: "\f3f6";
}

.tcfa-step-backward::before {
	content: "\f048";
}

.tcfa-step-forward::before {
	content: "\f051";
}

.tcfa-stethoscope::before {
	content: "\f0f1";
}

.tcfa-sticker-mule::before {
	content: "\f3f7";
}

.tcfa-sticky-note::before {
	content: "\f249";
}

.tcfa-stop::before {
	content: "\f04d";
}

.tcfa-stop-circle::before {
	content: "\f28d";
}

.tcfa-stopwatch::before {
	content: "\f2f2";
}

.tcfa-store::before {
	content: "\f54e";
}

.tcfa-store-alt::before {
	content: "\f54f";
}

.tcfa-strava::before {
	content: "\f428";
}

.tcfa-stream::before {
	content: "\f550";
}

.tcfa-street-view::before {
	content: "\f21d";
}

.tcfa-strikethrough::before {
	content: "\f0cc";
}

.tcfa-stripe::before {
	content: "\f429";
}

.tcfa-stripe-s::before {
	content: "\f42a";
}

.tcfa-stroopwafel::before {
	content: "\f551";
}

.tcfa-studiovinari::before {
	content: "\f3f8";
}

.tcfa-stumbleupon::before {
	content: "\f1a4";
}

.tcfa-stumbleupon-circle::before {
	content: "\f1a3";
}

.tcfa-subscript::before {
	content: "\f12c";
}

.tcfa-subway::before {
	content: "\f239";
}

.tcfa-suitcase::before {
	content: "\f0f2";
}

.tcfa-suitcase-rolling::before {
	content: "\f5c1";
}

.tcfa-sun::before {
	content: "\f185";
}

.tcfa-superpowers::before {
	content: "\f2dd";
}

.tcfa-superscript::before {
	content: "\f12b";
}

.tcfa-supple::before {
	content: "\f3f9";
}

.tcfa-surprise::before {
	content: "\f5c2";
}

.tcfa-suse::before {
	content: "\f7d6";
}

.tcfa-swatchbook::before {
	content: "\f5c3";
}

.tcfa-swift::before {
	content: "\f8e1";
}

.tcfa-swimmer::before {
	content: "\f5c4";
}

.tcfa-swimming-pool::before {
	content: "\f5c5";
}

.tcfa-symfony::before {
	content: "\f83d";
}

.tcfa-synagogue::before {
	content: "\f69b";
}

.tcfa-sync::before {
	content: "\f021";
}

.tcfa-sync-alt::before {
	content: "\f2f1";
}

.tcfa-syringe::before {
	content: "\f48e";
}

.tcfa-table::before {
	content: "\f0ce";
}

.tcfa-table-tennis::before {
	content: "\f45d";
}

.tcfa-tablet::before {
	content: "\f10a";
}

.tcfa-tablet-alt::before {
	content: "\f3fa";
}

.tcfa-tablets::before {
	content: "\f490";
}

.tcfa-tachometer-alt::before {
	content: "\f3fd";
}

.tcfa-tag::before {
	content: "\f02b";
}

.tcfa-tags::before {
	content: "\f02c";
}

.tcfa-tape::before {
	content: "\f4db";
}

.tcfa-tasks::before {
	content: "\f0ae";
}

.tcfa-taxi::before {
	content: "\f1ba";
}

.tcfa-teamspeak::before {
	content: "\f4f9";
}

.tcfa-teeth::before {
	content: "\f62e";
}

.tcfa-teeth-open::before {
	content: "\f62f";
}

.tcfa-telegram::before {
	content: "\f2c6";
}

.tcfa-telegram-plane::before {
	content: "\f3fe";
}

.tcfa-temperature-high::before {
	content: "\f769";
}

.tcfa-temperature-low::before {
	content: "\f76b";
}

.tcfa-tencent-weibo::before {
	content: "\f1d5";
}

.tcfa-tenge::before {
	content: "\f7d7";
}

.tcfa-terminal::before {
	content: "\f120";
}

.tcfa-text-height::before {
	content: "\f034";
}

.tcfa-text-width::before {
	content: "\f035";
}

.tcfa-th::before {
	content: "\f00a";
}

.tcfa-th-large::before {
	content: "\f009";
}

.tcfa-th-list::before {
	content: "\f00b";
}

.tcfa-the-red-yeti::before {
	content: "\f69d";
}

.tcfa-theater-masks::before {
	content: "\f630";
}

.tcfa-themeco::before {
	content: "\f5c6";
}

.tcfa-themeisle::before {
	content: "\f2b2";
}

.tcfa-thermometer::before {
	content: "\f491";
}

.tcfa-thermometer-empty::before {
	content: "\f2cb";
}

.tcfa-thermometer-full::before {
	content: "\f2c7";
}

.tcfa-thermometer-half::before {
	content: "\f2c9";
}

.tcfa-thermometer-quarter::before {
	content: "\f2ca";
}

.tcfa-thermometer-three-quarters::before {
	content: "\f2c8";
}

.tcfa-think-peaks::before {
	content: "\f731";
}

.tcfa-thumbs-down::before {
	content: "\f165";
}

.tcfa-thumbs-up::before {
	content: "\f164";
}

.tcfa-thumbtack::before {
	content: "\f08d";
}

.tcfa-ticket-alt::before {
	content: "\f3ff";
}

.tcfa-times::before {
	content: "\f00d";
}

.tcfa-times-circle::before {
	content: "\f057";
}

.tcfa-tint::before {
	content: "\f043";
}

.tcfa-tint-slash::before {
	content: "\f5c7";
}

.tcfa-tired::before {
	content: "\f5c8";
}

.tcfa-toggle-off::before {
	content: "\f204";
}

.tcfa-toggle-on::before {
	content: "\f205";
}

.tcfa-toilet::before {
	content: "\f7d8";
}

.tcfa-toilet-paper::before {
	content: "\f71e";
}

.tcfa-toolbox::before {
	content: "\f552";
}

.tcfa-tools::before {
	content: "\f7d9";
}

.tcfa-tooth::before {
	content: "\f5c9";
}

.tcfa-torah::before {
	content: "\f6a0";
}

.tcfa-torii-gate::before {
	content: "\f6a1";
}

.tcfa-tractor::before {
	content: "\f722";
}

.tcfa-trade-federation::before {
	content: "\f513";
}

.tcfa-trademark::before {
	content: "\f25c";
}

.tcfa-traffic-light::before {
	content: "\f637";
}

.tcfa-trailer::before {
	content: "\f941";
}

.tcfa-train::before {
	content: "\f238";
}

.tcfa-tram::before {
	content: "\f7da";
}

.tcfa-transgender::before {
	content: "\f224";
}

.tcfa-transgender-alt::before {
	content: "\f225";
}

.tcfa-trash::before {
	content: "\f1f8";
}

.tcfa-trash-alt::before {
	content: "\f2ed";
}

.tcfa-trash-restore::before {
	content: "\f829";
}

.tcfa-trash-restore-alt::before {
	content: "\f82a";
}

.tcfa-tree::before {
	content: "\f1bb";
}

.tcfa-trello::before {
	content: "\f181";
}

.tcfa-tripadvisor::before {
	content: "\f262";
}

.tcfa-trophy::before {
	content: "\f091";
}

.tcfa-truck::before {
	content: "\f0d1";
}

.tcfa-truck-loading::before {
	content: "\f4de";
}

.tcfa-truck-monster::before {
	content: "\f63b";
}

.tcfa-truck-moving::before {
	content: "\f4df";
}

.tcfa-truck-pickup::before {
	content: "\f63c";
}

.tcfa-tshirt::before {
	content: "\f553";
}

.tcfa-tty::before {
	content: "\f1e4";
}

.tcfa-tumblr::before {
	content: "\f173";
}

.tcfa-tumblr-square::before {
	content: "\f174";
}

.tcfa-tv::before {
	content: "\f26c";
}

.tcfa-twitch::before {
	content: "\f1e8";
}

.tcfa-twitter::before {
	content: "\f099";
}

.tcfa-twitter-square::before {
	content: "\f081";
}

.tcfa-typo3::before {
	content: "\f42b";
}

.tcfa-uber::before {
	content: "\f402";
}

.tcfa-ubuntu::before {
	content: "\f7df";
}

.tcfa-uikit::before {
	content: "\f403";
}

.tcfa-umbraco::before {
	content: "\f8e8";
}

.tcfa-umbrella::before {
	content: "\f0e9";
}

.tcfa-umbrella-beach::before {
	content: "\f5ca";
}

.tcfa-underline::before {
	content: "\f0cd";
}

.tcfa-undo::before {
	content: "\f0e2";
}

.tcfa-undo-alt::before {
	content: "\f2ea";
}

.tcfa-uniregistry::before {
	content: "\f404";
}

.tcfa-unity::before {
	content: "\f949";
}

.tcfa-universal-access::before {
	content: "\f29a";
}

.tcfa-university::before {
	content: "\f19c";
}

.tcfa-unlink::before {
	content: "\f127";
}

.tcfa-unlock::before {
	content: "\f09c";
}

.tcfa-unlock-alt::before {
	content: "\f13e";
}

.tcfa-untappd::before {
	content: "\f405";
}

.tcfa-upload::before {
	content: "\f093";
}

.tcfa-ups::before {
	content: "\f7e0";
}

.tcfa-usb::before {
	content: "\f287";
}

.tcfa-user::before {
	content: "\f007";
}

.tcfa-user-alt::before {
	content: "\f406";
}

.tcfa-user-alt-slash::before {
	content: "\f4fa";
}

.tcfa-user-astronaut::before {
	content: "\f4fb";
}

.tcfa-user-check::before {
	content: "\f4fc";
}

.tcfa-user-circle::before {
	content: "\f2bd";
}

.tcfa-user-clock::before {
	content: "\f4fd";
}

.tcfa-user-cog::before {
	content: "\f4fe";
}

.tcfa-user-edit::before {
	content: "\f4ff";
}

.tcfa-user-friends::before {
	content: "\f500";
}

.tcfa-user-graduate::before {
	content: "\f501";
}

.tcfa-user-injured::before {
	content: "\f728";
}

.tcfa-user-lock::before {
	content: "\f502";
}

.tcfa-user-md::before {
	content: "\f0f0";
}

.tcfa-user-minus::before {
	content: "\f503";
}

.tcfa-user-ninja::before {
	content: "\f504";
}

.tcfa-user-nurse::before {
	content: "\f82f";
}

.tcfa-user-plus::before {
	content: "\f234";
}

.tcfa-user-secret::before {
	content: "\f21b";
}

.tcfa-user-shield::before {
	content: "\f505";
}

.tcfa-user-slash::before {
	content: "\f506";
}

.tcfa-user-tag::before {
	content: "\f507";
}

.tcfa-user-tie::before {
	content: "\f508";
}

.tcfa-user-times::before {
	content: "\f235";
}

.tcfa-users::before {
	content: "\f0c0";
}

.tcfa-users-cog::before {
	content: "\f509";
}

.tcfa-usps::before {
	content: "\f7e1";
}

.tcfa-ussunnah::before {
	content: "\f407";
}

.tcfa-utensil-spoon::before {
	content: "\f2e5";
}

.tcfa-utensils::before {
	content: "\f2e7";
}

.tcfa-vaadin::before {
	content: "\f408";
}

.tcfa-vector-square::before {
	content: "\f5cb";
}

.tcfa-venus::before {
	content: "\f221";
}

.tcfa-venus-double::before {
	content: "\f226";
}

.tcfa-venus-mars::before {
	content: "\f228";
}

.tcfa-viacoin::before {
	content: "\f237";
}

.tcfa-viadeo::before {
	content: "\f2a9";
}

.tcfa-viadeo-square::before {
	content: "\f2aa";
}

.tcfa-vial::before {
	content: "\f492";
}

.tcfa-vials::before {
	content: "\f493";
}

.tcfa-viber::before {
	content: "\f409";
}

.tcfa-video::before {
	content: "\f03d";
}

.tcfa-video-slash::before {
	content: "\f4e2";
}

.tcfa-vihara::before {
	content: "\f6a7";
}

.tcfa-vimeo::before {
	content: "\f40a";
}

.tcfa-vimeo-square::before {
	content: "\f194";
}

.tcfa-vimeo-v::before {
	content: "\f27d";
}

.tcfa-vine::before {
	content: "\f1ca";
}

.tcfa-vk::before {
	content: "\f189";
}

.tcfa-vnv::before {
	content: "\f40b";
}

.tcfa-voicemail::before {
	content: "\f897";
}

.tcfa-volleyball-ball::before {
	content: "\f45f";
}

.tcfa-volume-down::before {
	content: "\f027";
}

.tcfa-volume-mute::before {
	content: "\f6a9";
}

.tcfa-volume-off::before {
	content: "\f026";
}

.tcfa-volume-up::before {
	content: "\f028";
}

.tcfa-vote-yea::before {
	content: "\f772";
}

.tcfa-vr-cardboard::before {
	content: "\f729";
}

.tcfa-vuejs::before {
	content: "\f41f";
}

.tcfa-walking::before {
	content: "\f554";
}

.tcfa-wallet::before {
	content: "\f555";
}

.tcfa-warehouse::before {
	content: "\f494";
}

.tcfa-water::before {
	content: "\f773";
}

.tcfa-wave-square::before {
	content: "\f83e";
}

.tcfa-waze::before {
	content: "\f83f";
}

.tcfa-weebly::before {
	content: "\f5cc";
}

.tcfa-weibo::before {
	content: "\f18a";
}

.tcfa-weight::before {
	content: "\f496";
}

.tcfa-weight-hanging::before {
	content: "\f5cd";
}

.tcfa-weixin::before {
	content: "\f1d7";
}

.tcfa-whatsapp::before {
	content: "\f232";
}

.tcfa-whatsapp-square::before {
	content: "\f40c";
}

.tcfa-wheelchair::before {
	content: "\f193";
}

.tcfa-whmcs::before {
	content: "\f40d";
}

.tcfa-wifi::before {
	content: "\f1eb";
}

.tcfa-wikipedia-w::before {
	content: "\f266";
}

.tcfa-wind::before {
	content: "\f72e";
}

.tcfa-window-close::before {
	content: "\f410";
}

.tcfa-window-maximize::before {
	content: "\f2d0";
}

.tcfa-window-minimize::before {
	content: "\f2d1";
}

.tcfa-window-restore::before {
	content: "\f2d2";
}

.tcfa-windows::before {
	content: "\f17a";
}

.tcfa-wine-bottle::before {
	content: "\f72f";
}

.tcfa-wine-glass::before {
	content: "\f4e3";
}

.tcfa-wine-glass-alt::before {
	content: "\f5ce";
}

.tcfa-wix::before {
	content: "\f5cf";
}

.tcfa-wizards-of-the-coast::before {
	content: "\f730";
}

.tcfa-wolf-pack-battalion::before {
	content: "\f514";
}

.tcfa-won-sign::before {
	content: "\f159";
}

.tcfa-wordpress::before {
	content: "\f19a";
}

.tcfa-wordpress-simple::before {
	content: "\f411";
}

.tcfa-wpbeginner::before {
	content: "\f297";
}

.tcfa-wpexplorer::before {
	content: "\f2de";
}

.tcfa-wpforms::before {
	content: "\f298";
}

.tcfa-wpressr::before {
	content: "\f3e4";
}

.tcfa-wrench::before {
	content: "\f0ad";
}

.tcfa-x-ray::before {
	content: "\f497";
}

.tcfa-xbox::before {
	content: "\f412";
}

.tcfa-xing::before {
	content: "\f168";
}

.tcfa-xing-square::before {
	content: "\f169";
}

.tcfa-y-combinator::before {
	content: "\f23b";
}

.tcfa-yahoo::before {
	content: "\f19e";
}

.tcfa-yammer::before {
	content: "\f840";
}

.tcfa-yandex::before {
	content: "\f413";
}

.tcfa-yandex-international::before {
	content: "\f414";
}

.tcfa-yarn::before {
	content: "\f7e3";
}

.tcfa-yelp::before {
	content: "\f1e9";
}

.tcfa-yen-sign::before {
	content: "\f157";
}

.tcfa-yin-yang::before {
	content: "\f6ad";
}

.tcfa-yoast::before {
	content: "\f2b1";
}

.tcfa-youtube::before {
	content: "\f167";
}

.tcfa-youtube-square::before {
	content: "\f431";
}

.tcfa-zhihu::before {
	content: "\f63f";
}

.sr-only {
	border: 0;
	clip: rect(0, 0, 0, 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}

.sr-only-focusable:active,
.sr-only-focusable:focus {
	clip: auto;
	height: auto;
	margin: 0;
	overflow: visible;
	position: static;
	width: auto;
}

@font-face {
	font-family: tc-fontawesome;
	font-style: normal;
	font-weight: 400;
	font-display: auto;
	src: url(../webfonts/fa-regular-400.eot);
	src: url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"), url(../webfonts/fa-regular-400.woff2) format("woff2"), url(../webfonts/fa-regular-400.woff) format("woff"), url(../webfonts/fa-regular-400.ttf) format("truetype");
}

@font-face {
	font-family: tc-fontawesome;
	font-style: normal;
	font-weight: 900;
	font-display: auto;
	src: url(../webfonts/fa-solid-900.eot);
	src: url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"), url(../webfonts/fa-solid-900.woff2) format("woff2"), url(../webfonts/fa-solid-900.woff) format("woff"), url(../webfonts/fa-solid-900.ttf) format("truetype");
}

.tcfa,
.tcfas {
	font-family: tc-fontawesome, Arial, Helvetica, sans-serif !important;
	font-weight: 900;
}

.tcfar {
	font-family: tc-fontawesome, Arial, Helvetica, sans-serif !important;
	font-weight: 400;
}
assets/css/admin/tcpagination.css000064400000003212150755142440013125 0ustar00/* stylelint-disable no-descending-specificity */
.tcpagination {
	display: inline-block;
	padding-left: 0;
	margin: 1em 0;
	border-radius: 4px;
}

.tcpagination ul {
	margin: 0;
}

.tcpagination ul > li {
	display: inline;
	margin: 0;
}

.tcpagination ul > li > a,
.tcpagination ul > li > span {
	position: relative;
	float: left;
	padding: 6px 12px;
	margin-left: -1px;
	line-height: 1.42857143;
	color: #b8b5c6;
	text-decoration: none;
	background-color: #fff;
	border: 1px solid #ddd;
}

.tcpagination ul > li:first-child > a,
.tcpagination ul > li:first-child > span {
	margin-left: 0;
	border-top-left-radius: 5px;
	border-bottom-left-radius: 5px;
}

.tcpagination ul > li:last-child > a,
.tcpagination ul > li:last-child > span {
	border-top-right-radius: 5px;
	border-bottom-right-radius: 5px;
}

.tcpagination ul > li > a:hover,
.tcpagination ul > li > span:hover,
.tcpagination ul > li > a:focus,
.tcpagination ul > li > span:focus {
	z-index: 3;
	color: #683ebd;
	background-color: #eee;
	border-color: #ddd;
}

.tcpagination ul > .active > a,
.tcpagination ul > .active > span,
.tcpagination ul > .active > a:hover,
.tcpagination ul > .active > span:hover,
.tcpagination ul > .active > a:focus,
.tcpagination ul > .active > span:focus {
	z-index: 2;
	color: #fff;
	cursor: default;
	background-color: #3d72de;
	border-color: #3d72de;
}

.tcpagination ul > .disabled > span,
.tcpagination ul > .disabled > span:hover,
.tcpagination ul > .disabled > span:focus,
.tcpagination ul > .disabled > a,
.tcpagination ul > .disabled > a:hover,
.tcpagination ul > .disabled > a:focus {
	color: #f2f1fa;
	cursor: not-allowed;
	background-color: #fff;
	border-color: #ddd;
}
assets/css/admin/toastr.min.css000064400000013333150755142440012550 0ustar00.toast-title{font-weight:700}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-0.3em;top:-0.3em;float:right;font-size:20px;font-weight:700;color:#fff;text-shadow:0 1px 0 #fff;opacity:.8;line-height:1}.toast-close-button:hover,.toast-close-button:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4}.rtl .toast-close-button{left:-0.3em;float:left;right:.3em}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}#toast-container{position:fixed;z-index:999999;pointer-events:none}#toast-container *{-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;pointer-events:auto;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;-webkit-box-shadow:0 0 12px #999;box-shadow:0 0 12px #999;color:#fff;opacity:.8}#toast-container>div.rtl{direction:rtl;padding:15px 50px 15px 15px;background-position:right 15px center}#toast-container>div:hover{-webkit-box-shadow:0 0 12px #000;box-shadow:0 0 12px #000;opacity:1;cursor:pointer}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=) !important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=) !important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==) !important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=) !important}#toast-container.toast-top-center>div,#toast-container.toast-bottom-center>div{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#030303}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4}@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}#toast-container .rtl .toast-close-button{left:-0.2em;right:.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}#toast-container .rtl .toast-close-button{left:-0.2em;right:.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}#toast-container>div.rtl{padding:15px 50px 15px 15px}}assets/css/admin/tm-epo-admin-order.min.css000064400000006256150755142440014642 0ustar00:root{--tcgap:15px}.tm-order-line-option .edit{display:none}.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view{min-width:100px}.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit input{float:left;width:70%}.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit small{float:right;width:20%}.woocommerce-tmcp-attributes.wc-metabox-content{background:#fdfdfd}.woocommerce-tmcp-attributes.wc-metabox-content .data{padding:10px 20px}.form-row .tm-hide-price label,.form-row .tm-required label,.form-row .tm-enabled label{display:inline}.form-row .tm-hide-price,.form-row .tm-required,.form-row .tm-enabled{display:inline-block;line-height:28px;padding:2px}.missing h3,.missing .tm-att-value{color:#e74c3c}.tm-50{float:left;width:50%;min-height:1px;overflow:auto;word-break:break-word}.rtl .tm-50{float:right}.tm-header .tm-50{font-size:.9em;font-weight:700}.tm-c input.value{width:100%}.tm-c.name{border-left:0 none !important}.tm-order-line-option.item{background:#fafafa none repeat scroll 0 0;color:#2c3e50}.tm-order-line{background:#95a5a6 none repeat scroll 0 0;color:#fff}.woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line-option td{border-bottom-style:dashed}.woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line-option:last-child td{border-bottom-style:none}.woocommerce_order_items_wrapper table.woocommerce_order_items td.tm-epo-order-data{padding:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.tm-order-line-option td{border-color:#ebebeb}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line td{cursor:default;font-size:.9em;font-weight:700;vertical-align:bottom;border-color:#7f8c8d}.tm-order-header{background:#fff none repeat scroll 0 0;color:#7f8c8d;display:inline-block;margin-bottom:1em;padding:0 .5em}#woocommerce-order-items .wc-order-edit-line-item-actions .tm-delete-order-item::before{content:"\f158";font-family:Dashicons,Arial,Helvetica,sans-serif;font-variant:normal;font-weight:400;height:100%;left:0;line-height:1;margin:0;position:relative;text-align:center;text-indent:0;text-transform:none;top:0;width:100%}#woocommerce-order-items .wc-order-edit-line-item-actions .tm-delete-order-item:hover::before{color:#a00}.cpf-data-on-cart{border-bottom:1px dotted rgba(0,0,0,0.2);margin-bottom:.5em;display:block}.cpf-img-on-order{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:calc(100% - var(--tcgap));gap:var(--tcgap)}.cpf-img-on-order img{-o-object-fit:cover;object-fit:cover;display:block;width:100%;height:auto}.cpf-img-on-order>*{max-width:calc(50% - var(--tcgap)) !important;max-height:none !important;display:block;-webkit-box-flex:0 !important;-ms-flex:0 0 calc(50% - var(--tcgap)) !important;flex:0 0 calc(50% - var(--tcgap)) !important}assets/css/admin/index.php000064400000000126150755142440011554 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/css/admin/tm-epo-admin-settings.min.css000064400000100365150755142440015363 0ustar00.tc-row{margin:0 -1em;position:relative;overflow:auto}.nopadding .tc-row,.nopadding.tc-row{margin:0}.tc-cell{position:relative;padding:0 1em;margin:0 0 1.65em;min-height:1px;overflow:hidden}.nomargin .tc-cell{margin:0}.nopadding .tc-cell{padding:0}.tc-col-auto{width:auto}.tc-cell.tc-col-auto{padding:0 1em !important}.tc-col-1{width:8.3334%}.tc-col-2{width:16.6667%}.tc-col-3{width:25%}.tc-col-4{width:33.3334%}.tc-col-5{width:41.6667%}.tc-col-6{width:50%}.tc-col-7{width:58.3334%}.tc-col-8{width:66.6667%}.tc-col-9{width:75%}.tc-col-10{width:83.3334%}.tc-col-11{width:91.6667%}.tc-col-12{width:100%}.wauto{width:100% !important}.w25{width:25%}.w50{width:50%}.w75{width:75%}.w100{width:100%}.w33{width:33.3333333332%}.w66{width:66.6666666665%}.tc-button{display:inline-block;margin-bottom:0;font-weight:600;text-align:center;vertical-align:middle;cursor:pointer;border:1px solid transparent;background:0;white-space:nowrap;padding:0 16px;font-size:13px;line-height:34px;overflow:hidden;position:relative;outline:0 !important;border-radius:3px;-webkit-transition:all .15s ease;transition:all .15s ease}.tc-button+.tc-button{margin-left:2px}.tc-button.large{font-size:16px;font-weight:400;padding:12px 26px 10px}.tc-button.small{font-size:10px;padding:0 !important;line-height:21px;width:21px}.tc-button.tc{color:#4732f9;background:#fff;border-color:#4732f9}.tc.tc-button.floatbox-update{color:#fff;background:#4732f9}.tc-button.tc:hover,.tc-button.tc:focus{z-index:2;background:#fff;color:#4732f9;-o-border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch;border-image:-webkit-gradient(linear,left top,right top,from(#f00),color-stop(#ffa600),color-stop(#ff0),color-stop(#008000),color-stop(#0ff),color-stop(#00f),to(#ee82ee)) 1 1 stretch;border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch}.tc-button.tc.tc-reset-button{background:#fee;color:red;border-color:red}.tm-settings-wrap a{color:#ffa811;text-decoration:none}.tm-settings-wrap a:hover,.tm-settings-wrap a:active,.tm-settings-wrap a:focus{color:#ffdb11;text-decoration:none;outline:0;-webkit-box-shadow:none;box-shadow:none;border-bottom:1px solid;-o-border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch;border-image:-webkit-gradient(linear,left top,right top,from(#f00),color-stop(#ffa600),color-stop(#ff0),color-stop(#008000),color-stop(#0ff),color-stop(#00f),to(#ee82ee)) 1 1 stretch;border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch}.tm-epo-switch-wrapper input[type="checkbox"],.tm-epo-switch-wrapper input[type="radio"]{opacity:0;left:50%;position:absolute;top:50%}.tm-epo-switch-wrapper .tm-epo-switch{position:relative;display:inline-block;min-width:54px;cursor:pointer;font-weight:500;text-align:left;margin:0 !important;padding:0;min-height:28px}.tm-epo-switch-wrapper .tm-epo-switch::before,.tm-epo-switch-wrapper .tm-epo-switch::after{content:"";position:absolute;margin:0;outline:0;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);-webkit-transition:all .3s ease;transition:all .3s ease}.tm-epo-switch-wrapper .tm-epo-switch::before{left:0;width:54px;height:28px;background-color:#c9d4e3;border-radius:20px;border:1px solid #aaa}.tm-epo-switch-wrapper .tm-epo-switch::after{left:3px;width:22px;height:22px;border-radius:16px}.tm-epo-switch-wrapper input:checked+.tm-epo-switch::after{-webkit-transform:translate(80%,-50%);transform:translate(80%,-50%);left:12px}.tm-epo-switch-wrapper .tm-epo-switch.tc::after{border:1px solid #aaa;background-color:#fafafa;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.098),0 1px 5px 0 rgba(0,0,0,0.084);box-shadow:0 3px 1px -2px rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.098),0 1px 5px 0 rgba(0,0,0,0.084)}.tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::before{background-color:#38bb5d}.tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::after{background-color:#fff}.tm-epo-switch-wrapper input:focus+.tm-epo-switch.tc::before{border:1px solid #3d30ba}.tm-epo-switch-wrapper{position:relative;width:54px;max-width:54px;display:-webkit-box;display:-ms-flexbox;display:flex}.woocommerce .tc-wrapper table.form-table #tm_epo_css_selected_border+.select2-container{display:inline-block}.tm-border-type{background:none repeat scroll 0 0 #fff;border:0 solid;height:36px;display:inline-block;line-height:36px;width:36px;border-color:inherit;border-width:1px;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.3);vertical-align:middle;margin:8px 1em}.tm-border-type.circle{border-radius:100%;border-width:1px;-webkit-box-shadow:none;box-shadow:none}.tm-border-type.round{border-radius:5px;border-width:1px;-webkit-box-shadow:none;box-shadow:none}.tm-border-type.square{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-width:2px}.tm-border-type.shadow{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,0.5);box-shadow:0 1px 4px 0 rgba(0,0,0,0.5);border-width:1px}.tm-border-type.thinline{border-width:1px;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-style:groove}.woocommerce .tc-wrapper table.form-table #tm_epo_css_styles_style+.select2-container{display:inline-block}.tm-epo-field-label{border:0 solid;display:inline-block;border-color:inherit;vertical-align:middle;margin:8px 1em}.tc-epo-style-wrapper input[type="checkbox"],.tc-epo-style-wrapper input[type="radio"]{visibility:hidden;display:inline !important}.tc-epo-style-wrapper input[type="checkbox"]:checked+.tm-epo-style::after,.tc-epo-style-wrapper input[type="radio"]:checked+.tm-epo-style::after{opacity:1}.tc-epo-style-wrapper{height:2em;width:2em;position:relative;display:inline-block;vertical-align:middle}.tc-epo-style-wrapper input[type="radio"]+.tm-epo-style::after{content:"\f111"}.tm-epo-style:hover::after{opacity:.5}.tm-epo-style::after{background:transparent none repeat scroll 0 0;font-family:tc-fontawesome,Arial,Helvetica,sans-serif;content:"\f00c";font-weight:900;height:1em;left:50%;margin-left:-0.5em;margin-top:-0.5em;opacity:0;position:absolute;text-align:center;top:50%;width:1em;line-height:1}.tc-epo-style-wrapper.circle2,.tc-epo-style-wrapper.round2,.tc-epo-style-wrapper.square2{height:1em;width:1em;padding:5px;vertical-align:middle}.tm-epo-style.circle2,.tm-epo-style.round2,.tm-epo-style.square2{height:100%;width:100%;background:transparent none repeat scroll 0 0;border:2px solid;cursor:pointer;left:0;line-height:1;margin:0;padding:0;position:absolute;top:0}.tc-epo-style-wrapper.circle2 .tm-epo-style::after,.tc-epo-style-wrapper.round2 .tm-epo-style::after,.tc-epo-style-wrapper.square2 .tm-epo-style::after{font-size:.7em;margin-top:-0.5em}.tm-epo-style.circle,.tm-epo-style.round,.tm-epo-style.square{background:transparent none repeat scroll 0 0;border:1px solid;cursor:pointer;height:2em;left:0;line-height:1;margin:0;padding:0;position:absolute;top:0;width:2em}.tm-epo-style.circle,.tm-epo-style.circle2{border-radius:100%}.tm-epo-style.round,.tm-epo-style.round2{border-radius:5px}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple,.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single,.woocommerce .tc-wrapper table.form-table input.regular-input,.woocommerce .tc-wrapper table.form-table input[type="date"],.woocommerce .tc-wrapper table.form-table input[type="datetime-local"],.woocommerce .tc-wrapper table.form-table input[type="datetime"],.woocommerce .tc-wrapper table.form-table input[type="email"],.woocommerce .tc-wrapper table.form-table input[type="number"],.woocommerce .tc-wrapper table.form-table input[type="password"],.woocommerce .tc-wrapper table.form-table input[type="tel"],.woocommerce .tc-wrapper table.form-table input[type="text"],.woocommerce .tc-wrapper table.form-table input[type="time"],.woocommerce .tc-wrapper table.form-table input[type="url"],.woocommerce .tc-wrapper table.form-table input[type="week"],.woocommerce .tc-wrapper table.form-table textarea{border-radius:3px !important;background:#f5f7fb !important;-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;border:1px solid #e4e4ef !important;padding:8px 16px !important;line-height:36px;font-size:13px;height:auto;color:#727a92 !important;margin:1px;outline:0;-webkit-transition:.05s border-color ease-in-out;transition:.05s border-color ease-in-out;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:60%}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple,.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single{width:100%;padding:8px 16px;line-height:36px}.woocommerce .tc-wrapper table.form-table input[type="number"]{padding-right:6px}#tm_epo_css_code,#tm_epo_js_code{min-height:200px;min-width:80%}.woocommerce .tc-wrapper table.form-table .select2-container{font-size:13px !important;display:block;height:auto !important;line-height:36px !important;padding:0 !important;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:10%;width:60% !important}.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection--single{border-radius:3px !important;background:#fff !important;-webkit-box-shadow:0 4px 10px 4px rgba(0,0,0,0.02) !important;box-shadow:0 4px 10px 4px rgba(0,0,0,0.02) !important;border:1px solid #e3e5ed;padding:0 16px;line-height:36px;font-size:14px;height:auto}.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection__rendered{min-height:36px !important;height:auto !important;padding:0 36px 0 0 !important;display:block !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#727a92 !important;line-height:36px !important}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow{height:36px !important;line-height:36px !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#6a7a90 !important;width:36px;background:0;position:absolute;border:0;top:9px;right:17px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow::after{font-weight:900;font-family:tc-fontawesome,Arial,Helvetica,sans-serif;content:"\f107"}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow::after{color:#4732f9}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow b{display:none;border-color:transparent}.woocommerce_page_wc-settings .select2-container--open .select2-dropdown{border:1px solid #4732f9 !important;margin-top:0;margin-left:1px;padding:16px;-webkit-box-shadow:none !important;box-shadow:none !important;background:#fff}.woocommerce_page_wc-settings .select2-container--open .select2-dropdown .select2-search--dropdown{padding:0 0 8px 0;position:relative}.woocommerce_page_wc-settings .select2-container--open .select2-dropdown::after{background:#fff}.woocommerce_page_wc-settings .select2-results{padding:0;margin:0}.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown::before{content:"\f179";position:absolute;right:16px;font-family:dashicons,Arial,Helvetica,sans-serif;font-size:16px;width:16px;height:16px;line-height:16px;display:block;top:10px;color:#ccc}.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown input{height:36px !important;padding:0 28px 0 8px;border:1px solid #d2dae3;margin:0 !important;background:0;border-radius:3px;-webkit-box-shadow:none;box-shadow:none}.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #4732f9;color:#4732f9}.woocommerce_page_wc-settings .select2-results li{margin:8px 2px 8px 0;border-radius:3px;color:#777c82}.woocommerce_page_wc-settings .select2-container--default .select2-results__option .select2-results__option{padding:0 8px;line-height:36px;height:36px;outline:none !important}.woocommerce_page_wc-settings .select2-container--default .select2-results__option[aria-selected="true"],.woocommerce_page_wc-settings .select2-container--default .select2-results__option[data-selected="true"]{background-color:transparent;color:#4732f9}.woocommerce_page_wc-settings .select2-container--default .select2-results__option--highlighted[aria-selected]{background:-webkit-gradient(linear,left top,right top,from(#3d30ba),to(#0000ba));background:linear-gradient(to right,#3d30ba,#0000ba);color:#fff}.woocommerce_page_wc-settings .select2-container--default .select2-results__option:focus,.woocommerce_page_wc-settings .select2-container--default .select2-results>.select2-results__options:focus{outline:none !important}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--single,.woocommerce .tc-wrapper table.form-table textarea:focus,.woocommerce .tc-wrapper table.form-table input.regular-input:focus,.woocommerce .tc-wrapper table.form-table input[type="date"]:focus,.woocommerce .tc-wrapper table.form-table input[type="datetime-local"]:focus,.woocommerce .tc-wrapper table.form-table input[type="datetime"]:focus,.woocommerce .tc-wrapper table.form-table input[type="email"]:focus,.woocommerce .tc-wrapper table.form-table input[type="number"]:focus,.woocommerce .tc-wrapper table.form-table input[type="password"]:focus,.woocommerce .tc-wrapper table.form-table input[type="tel"]:focus,.woocommerce .tc-wrapper table.form-table input[type="text"]:focus,.woocommerce .tc-wrapper table.form-table input[type="time"]:focus,.woocommerce .tc-wrapper table.form-table input[type="url"]:focus,.woocommerce .tc-wrapper table.form-table input[type="week"]:focus{-webkit-box-shadow:0 1px 8px 1px rgba(0,0,0,0.1) !important;box-shadow:0 1px 8px 1px rgba(0,0,0,0.1) !important;color:#4732f9 !important;border:1px solid #4732f9 !important}.woocommerce .tc-wrapper table.form-table input::-webkit-input-placeholder{color:#ccc}.woocommerce .tc-wrapper table.form-table input::-moz-placeholder{color:#ccc}.woocommerce .tc-wrapper table.form-table input:-ms-input-placeholder{color:#ccc}.woocommerce .tc-wrapper table.form-table input::-ms-input-placeholder{color:#ccc}.woocommerce .tc-wrapper table.form-table input::placeholder{color:#ccc}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--multiple{border:solid #4732f9 1px !important;outline:0}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--single,.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single{border:solid #4732f9 1px !important;outline:0}.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice{line-height:16px;margin:5px 5px 5px 0;padding:.5em;border:1px solid #aac1eb;background:-webkit-gradient(linear,left top,right top,from(#e7edff),to(#e8edf6));background:linear-gradient(to right,#e7edff,#e8edf6);-webkit-box-shadow:none;box-shadow:none;color:#4732f9}.woocommerce .tc-wrapper table.form-table .select2-container--default .select2-selection--multiple .select2-selection__rendered li{line-height:16px;margin:5px 1px 5px 0;padding:.5em;border:1px solid transparent;background:0;-webkit-box-shadow:none;box-shadow:none;color:#683ebd}.woocommerce .tc-wrapper table.form-table .select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#e51e1b;cursor:pointer;display:inline-block;font-weight:700;float:right;margin-left:.5em;position:static;border:0}.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection--multiple .select2-search__field{-webkit-box-shadow:none !important;box-shadow:none !important;border:0 !important;margin:1px -0.5em;padding:0 .5em !important;width:1em !important;min-height:0 !important;line-height:1 !important}.tm-hidden{display:none !important}.tm-hide{visibility:hidden !important;padding:0 !important;height:0 !important;width:0 !important;margin:0 !important;min-height:0 !important;min-width:0 !important;opacity:0 !important}.tm-show{display:block !important}.tm-animated{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.15s;animation-duration:.15s}.transition{-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}@-webkit-keyframes appear{0%{opacity:0;-webkit-transform:translate3d(5%,0,0);transform:translate3d(5%,0,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes appear{0%{opacity:0;-webkit-transform:translate3d(5%,0,0);transform:translate3d(5%,0,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.appear{-webkit-animation-name:appear;animation-name:appear}.tm-flexrow{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-flexcol{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.tm-justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tm-settings-wrap,.flasho{font-size:14px;line-height:1.42857143;font-family:Roboto,"Open Sans",Helvetica,Arial,sans-serif}.tc-wrapper,.tc-wrapper div,.flasho,.flasho div,.bsbb,.tm-bsbb-all *{-webkit-box-sizing:border-box;box-sizing:border-box}.flasho2{padding:1em;background:none repeat scroll 0 0 #fff;height:100%;overflow:auto;width:100%}.flasho{background:-webkit-gradient(linear,left top,right top,from(#fcfcfd),to(#fbfbfc));background:linear-gradient(to right,#fcfcfd,#fbfbfc);color:#fff;border:1px solid #ededee;left:0;position:absolute;top:0;z-index:101;-webkit-box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);max-height:100%;border-radius:2px;max-width:100%;overflow:hidden;display:grid;grid-template-rows:minmax(1em,auto) minmax(33%,1fr) minmax(1em,auto);gap:0}.flasho.tc-color-error{-webkit-box-shadow:0 0 1px 4px rgba(255,0,0,0.1),0 0 50px 13px rgba(255,0,0,0.05);box-shadow:0 0 1px 4px rgba(255,0,0,0.1),0 0 50px 13px rgba(255,0,0,0.05);border:4px solid #d00}.tc-color-error.flasho .header h3{color:#d00}.tc-color-error.flasho .tc-button.tc{color:#d00;background:#fff;border-color:#d00}.flasho.tc-wrapper .message0x0,.tc-options-group .message0x0{border-radius:0;border-width:0;border-color:#ecf0f1;border-style:none none dotted;margin:0;height:auto;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.flasho.tc-wrapper .message0x0:last-child{border:0}.flasho .header{line-height:2;padding:1.5em 2em;width:100%}.flasho .header h3{color:#63728b;font-size:22px;font-weight:400;line-height:28px;margin:0;letter-spacing:1px}.flasho .footer{margin:0;padding:0;text-align:right;background:#f4f6f9}.flasho .footer .inner{border-top:1px solid #dbe1eb;padding:1em 2em;position:relative}.float-editbox{position:relative}.tm-inner{margin:1em 2.2em}.tm-error .tm-inner{color:#c0392b}.tc-question.flasho{border:0;-webkit-box-shadow:0 0 1px 10px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 10px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);background:transparent;width:auto !important;grid-template-rows:minmax(1em,auto) minmax(1em,auto)}.tc-question.flasho .header,.tc-question.flasho .footer{position:static;background:#fff;text-align:center;border-radius:0}.tc-question.flasho .float-editbox{display:none}.tc-question.flasho .header h3{width:100%;text-align:center;float:none}.tc-question.flasho .footer .inner{border:0}.fl-overlay{background:#000;position:fixed;display:block;top:0;left:0;width:100%;height:100%}.fl-overlay.forfullsize{background:#eee}.tm-settings-wrap{margin-top:1em}.tm-settings-wrap .tm-tabs{background:#fff;overflow:hidden;position:relative;border:1px solid #e7e8f1;-o-border-image:linear-gradient(to bottom,transparent,#aaa 6%,#4732f9,#ccc,#bbb,#aaa 96%,transparent) 1 stretch;border-image:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(6%,#aaa),color-stop(#4732f9),color-stop(#ccc),color-stop(#bbb),color-stop(96%,#aaa),to(transparent)) 1 stretch;border-image:linear-gradient(to bottom,transparent,#aaa 6%,#4732f9,#ccc,#bbb,#aaa 96%,transparent) 1 stretch}.tm-settings-wrap .tm-tab-headers::after{content:"";display:block;height:100%;position:absolute;width:20%;background:#f5f7fb;border-right:1px solid #e7e8f1;margin-left:-1px}.tm-settings-wrap .tm-tab-headers{float:left;height:100%;position:static;width:20%;z-index:100;background:#f5f7fb;border:0;border-right:1px solid #e7e8f1}.tm-tabs-wrapper{float:left;width:80%}.tm-settings-wrap .header{padding:40px;margin:0;border-bottom:1px solid;-o-border-image:linear-gradient(to right,transparent,#fff 6%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch;border-image:-webkit-gradient(linear,left top,right top,from(transparent),color-stop(6%,#fff),color-stop(#00f),color-stop(#ee82ee),color-stop(96%,#fff),to(transparent)) 25 25 stretch;border-image:linear-gradient(to right,transparent,#fff 6%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch}.tm-settings-wrap .header h3{color:#4732f9;margin:0;font-weight:400;font-size:24px;line-height:36px}.tm-settings-wrap .tm-tab{display:none;position:relative;z-index:1;margin:0 40px}.tm-settings-wrap .tm-section-title{font-size:24px;line-height:32px;color:#4732f9;margin:0 -40px;font-weight:400;padding:40px;background:#fff}.tm-table-wrap{margin:0}.tm-settings-wrap .tm-tab .form-table{display:table}.tc-hide-nav #screen-meta-links,.tc-hide-nav .nav-tab-wrapper,.tc-hide-nav .woo-nav-tab-wrapper,.tm-settings-wrap .form-table,.tm-settings-wrap+p.submit{display:none}.tm-settings-wrap .tm-footer{background:#fff;padding:16px 32px 16px 32px;clear:both;text-align:right;border-top:1px solid #ccc;-o-border-image:linear-gradient(to right,transparent,#fff 22%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch;border-image:-webkit-gradient(linear,left top,right top,from(transparent),color-stop(22%,#fff),color-stop(#00f),color-stop(#ee82ee),color-stop(96%,#fff),to(transparent)) 25 25 stretch;border-image:linear-gradient(to right,transparent,#fff 22%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch}.tm-settings-wrap .tm-footer.full{-o-border-image:linear-gradient(to right,transparent,#fff 6%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch;border-image:-webkit-gradient(linear,left top,right top,from(transparent),color-stop(6%,#fff),color-stop(#00f),color-stop(#ee82ee),color-stop(96%,#fff),to(transparent)) 25 25 stretch;border-image:linear-gradient(to right,transparent,#fff 6%,#00f,#ee82ee,#fff 96%,transparent) 25 25 stretch}.tm-sidebar-head{text-align:left;padding:40px 0 40px 40px;border-bottom:1px solid #e7e8f1;-o-border-image:linear-gradient(to right,transparent,#f5f7fb 6%,#e7e8f1,#f5f7fb 94%,transparent) 25 25 stretch;border-image:-webkit-gradient(linear,left top,right top,from(transparent),color-stop(6%,#f5f7fb),color-stop(#e7e8f1),color-stop(94%,#f5f7fb),to(transparent)) 25 25 stretch;border-image:linear-gradient(to right,transparent,#f5f7fb 6%,#e7e8f1,#f5f7fb 94%,transparent) 25 25 stretch;margin-bottom:20px}.tm-sidebar-head h2{margin:0;color:#565a6b;font-size:14px;font-weight:700;letter-spacing:2px;line-height:40px}.tm-sidebar-head h2 span{font-weight:400;color:#99a1b3;letter-spacing:1px;font-size:10px;line-height:10px}.tm-settings-wrap .tm-box{display:block;margin:0;overflow:hidden;padding:0;position:relative;width:100%;border:0}.tm-settings-wrap .tm-box .tab-header{display:inline-block;color:#a6adc6;cursor:pointer;padding:12px 0;font-size:15px;font-weight:400;position:relative;margin:0 40px;-webkit-transition:all .15s ease;transition:all .15s ease;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:0 !important}.tm-settings-wrap .tm-box .tab-header:focus{outline:0;-webkit-box-shadow:none;box-shadow:none;color:#4732f9}.tm-settings-wrap .tm-box .tab-header.open{color:#4732f9 !important;font-weight:700}.tm-settings-wrap .tm-box .tab-header:hover{color:#1f2539}.tm-settings-wrap .tm-box .tab-header:hover .tab-header-icon{color:#1f2539}.tm-settings-wrap .tm-box .tab-header:focus .tab-header-icon{color:#4732f9}.tab-header-icon,.tab-header-icon.tcfa,.tab-header-icon.tcfas,.tab-header-icon.tcfar,.tab-header-icon.tcfal,.tcfad{margin-right:20px;width:2.5em;height:2.5em;text-align:center;line-height:2.5;border:1px solid transparent;border-radius:8px;color:#a6adc6;background:-webkit-gradient(linear,left top,right top,from(#e8edf6),to(#fafafa));background:linear-gradient(to right,#e8edf6,#fafafa);-ms-flex-negative:0;flex-shrink:0}.tm-settings-wrap .tm-box .tab-header.open .tab-header-icon{color:#4732f9 !important;-o-border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch;border-image:-webkit-gradient(linear,left top,right top,from(#f00),color-stop(#ffa600),color-stop(#ff0),color-stop(#008000),color-stop(#0ff),color-stop(#00f),to(#ee82ee)) 1 1 stretch;border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch;background:#fff}.tm-section-desc{padding:20px 0 0 0}.tm-section-menu-item{padding:0 0 1px;display:inline-block;cursor:pointer;color:#9b9fb0;margin-right:1em;font-weight:400;font-style:normal;font-size:14px;-webkit-transition:color .15s ease;transition:color .15s ease}.tm-section-menu-item:focus{color:#4732f9;outline:0;-webkit-box-shadow:none;box-shadow:none}.tm-section-menu-item:hover{color:#4732f9}.tm-section-menu-item.active{color:#4732f9;font-weight:700;border-bottom:1px solid #29cae4;-o-border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch;border-image:-webkit-gradient(linear,left top,right top,from(#f00),color-stop(#ffa600),color-stop(#ff0),color-stop(#008000),color-stop(#0ff),color-stop(#00f),to(#ee82ee)) 1 1 stretch;border-image:linear-gradient(to right,#f00,#ffa600,#ff0,#008000,#0ff,#00f,#ee82ee) 1 1 stretch}.woocommerce .tm-settings-wrap table.form-table th span.description{font-weight:400;font-size:12px;margin:8px 0 0 0;color:#9b9fb0;display:block;font-style:normal;line-height:18px}.woocommerce .tm-settings-wrap table.form-table th{padding:20px 0 !important;vertical-align:middle;width:30%}.tm-settings-wrap .form-table td{padding:2em !important;vertical-align:top}.tm-settings-wrap .form-table tr:last-child{border:0 none}.tm-settings-wrap .description>div{margin-top:1em}.tm-settings-wrap .form-table,.tm-settings-wrap .form-table td,.tm-settings-wrap .form-table td p,.tm-settings-wrap .form-table th,.tm-settings-wrap .form-wrap label{font-size:1em;color:#777c82}.tm-license-button{margin:0;display:inline-block;width:auto !important}.tm-license-result{margin-top:1em}.tm-settings-wrap .tm-license-result div{background:0;border:0;-webkit-box-shadow:none;box-shadow:none;font-size:15px;padding:0;margin:0 !important}.tm-settings-wrap .tm-license-result div.activated p{color:#83b73b}.tm-settings-wrap .tm-license-result div.deactivated p{color:#dd433c}.tm-settings-wrap .tm-license-result div.error p{color:#fa36ab}.tm-settings-wrap .tm-license-result div p{font-style:normal;padding:0;margin:0 !important}.tm-settings-wrap .tm-tab .form-table th,.tm-settings-wrap .tm-tab .form-wrap label{color:#313a56;font-weight:400;font-size:15px}.tm-settings-wrap .forminp-checkbox label{color:#888;font-size:.8em}.tm-settings-wrap .forminp-select span.description,.tm-settings-wrap .forminp-multiselect span.description,.tm-settings-wrap .forminp-text span.description{display:block}#tm_epo_envato_purchasecode,#tm_epo_envato_username,#tm_epo_envato_apikey{min-width:50%}.tm-settings-wrap .form-table tr{border-color:#f6f6f6;border-radius:0;border-style:none none solid;border-width:0 0 1px}.tm-settings-wrap .form-table td.forminp-tm_html{padding:0 !important;position:relative}.tm-mn-header{position:relative;overflow:hidden;padding:0;border-top:1px solid #dadfe8}.tm-mn-path{bottom:1em;line-height:1.5;width:100%;padding:16px 0}.tm-mn-wrap-heading,.tm-mn-wrap-dir,.tm-mn-wrap-file{padding:1em 0}.tm-mn-wrap-heading{border-bottom:1px solid #eff2f1}.tm-mn-wrap-dir,.tm-mn-wrap-file{border-bottom:1px solid #f3f5f5}.tm-mime{display:inline;height:auto;margin-right:.5em;vertical-align:middle;width:1em}.tm-mn-header .tm-mn-movetodir,.tm-mn-header .tm-mn-movetodir:hover,.tm-mn-header .tm-mn-movetodir:active{text-decoration:none}.tm-mn-currentdir{color:#2ecc71}.tm-mn-movetodir .tm-icon{margin:0 .5em}a.tm-mn-deldir,a.tm-mn-delfile{color:#e51e1b}.toast-success{background-color:#5d21d2;opacity:1 !important}.toast-error{background-color:#ff4500}#toast-container>div{-webkit-box-shadow:none;box-shadow:none}.toast-title{color:#fff}.toast-success .toast-message{color:#eee}ul.select2-results__options::-webkit-scrollbar,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar{background:#e8edf6;width:8px}ul.select2-results__options::-webkit-scrollbar-button,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-button{background:#e8edf6}ul.select2-results__options::-webkit-scrollbar-thumb,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-thumb{background:-webkit-gradient(linear,left bottom,left top,from(#7886ff),to(#4732f9));background:linear-gradient(to top,#7886ff,#4732f9)}ul.select2-results__options::-webkit-resizer,.woocommerce .tc-wrapper table.form-table textarea::-webkit-resizer{background:transparent}ul.select2-results__options::-webkit-scrollbar-corner,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-corner{background:transparent}ul.select2-results__options,.woocommerce .tc-wrapper table.form-table textarea{scrollbar-color:#4732f9 #e8edf6;scrollbar-width:thin}body.tc-hide-nav{background:#d7deeb}.blockUI.blockOverlay{background:#fff !important}.constant-name,.constant-value{width:100% !important}.tm-mn-wrap-heading,.tm-mn-wrap-file,.tm-mn-wrap-dir,.tm-mn-op,.constant-value-wrap,.tc-constant-delete{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tm-mn-name,.tm-mn-size{-webkit-box-flex:0;-ms-flex:0 1 50%;flex:0 1 50%}.tm-mn-op{-webkit-box-flex:0;-ms-flex:0 1 40px;flex:0 1 40px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tc-constant-delete{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-preferred-size:0;flex-basis:0;width:auto;padding:0 4px}.tc-constant-delete .delete{cursor:pointer}.constant-value-text{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.constant-value-delete{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;margin:19px 1em 0 1em}.woocommerce .tm-settings-wrap table.form-table .constantrow th{padding:10px 0 !important}.tm-settings-wrap .form-table .constantrow td{padding:10px !important}.constant-label-wrap{font-size:10px;font-weight:700;text-transform:uppercase;color:#a6adc6}.woocommerce .tc-wrapper table.form-table .tm-error label{color:#c0392b !important}.woocommerce .tc-wrapper table.form-table .tm-error input[type="text"]{border:1px solid #c0392b !important;color:#e74c3c !important;outline:0;background:#fee !important}button.tmicon{display:inline-block;left:auto !important;position:relative;right:auto !important;overflow:hidden;width:30px !important;height:30px !important;line-height:30px !important;font-size:14px;text-align:center;cursor:pointer;vertical-align:middle;margin:0;padding:0;-ms-flex-negative:0;flex-shrink:0;background:0;border:0;-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}button.tmicon.delete{color:#ff4500;border-radius:100%}button.tmicon.delete:hover{color:#fff;background:#ff4500}assets/css/admin/tm-epo-admin.min.css000064400000017150150755142440013524 0ustar00#tc-admin-extra-product-options{background:none repeat scroll 0 0 #fff;border:0 none !important;-webkit-box-shadow:none !important;box-shadow:none !important;border-radius:0 !important;margin:0 !important;font-family:Roboto,"Open Sans",Helvetica,Arial,sans-serif}#tc-admin-extra-product-options *{-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-product-data ul.wc-tabs li.tc-epo-woocommerce-tab a::before{font-family:tc-fontawesome,sans-serif;content:"\f009";font-weight:900}#tc-admin-extra-product-options .wc-enhanced-select input{display:block}#tc-admin-extra-product-options .select2-container,#tc-admin-extra-product-options .text{width:100% !important}#tc-admin-extra-product-options .overflow-show{overflow:visible !important}.tmcp-pricing label{width:100%}.tm-options>label{width:100%;font-weight:700}.tc-options-group label{display:inline-block;float:none !important;margin:0 !important;max-width:80% !important;padding:0 !important;vertical-align:top;width:auto !important}.woocommerce-tmcp-attributes .form-row>label{font-weight:700}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x2{width:auto;-webkit-box-flex:0;-ms-flex:0 0 66%;flex:0 0 66%;max-width:66%;display:-webkit-box;display:-ms-flexbox;display:flex}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x2 label{-webkit-box-flex:0;-ms-flex:0 0 calc(25% + 1px);flex:0 0 calc(25% + 1px);max-width:calc(25% + 1px) !important;margin-left:-1px !important}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.tm-epo-switch-wrapper .message2x2 label .tc-radio-text{min-width:100%}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x3,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x4,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x5{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:34%;max-width:15%;display:none;position:relative;margin-top:2em;min-width:25%}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x4,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x5{margin-left:4%}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-from,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-to,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-sale,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-regular{top:-17px;margin-left:1px}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .tm-choice-from,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .tm-choice-from,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .tm-choice-regular{display:none}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .message2x3,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .message2x5,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .message2x3,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .message2x5,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .message2x3,#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .message2x4{display:block}#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .text{padding:1em 16px;line-height:1;font-size:1em;text-align:center}.tm-mode-builder .builder-selector{border-width:0 0 1px 0;margin:0}.tm-mode-builder .builder-layout{border-width:1px 0}.epo-option-image{max-height:100px;height:auto;width:auto}.tmcp-price-input{width:100px !important}.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox h3{padding:10px 20px !important;cursor:pointer;line-height:30px}.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox .woocommerce-tmcp-attributes.wc-metabox-content{padding:10px 20px !important}.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox .tmicon{float:right}.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox.closed .fold::before{content:"\f0d7"}.tc-normal-epos .tmicon.fold{background:0;color:#b4b9c7;border-radius:100%}.tc-normal-epos .tmicon.fold:hover{background:#b4b9c7;color:#fff}.wc-metaboxes-wrapper .wc-metabox select.tmcp-price-input-type{position:relative;top:-2px;width:auto !important}.tm-mode-select{text-align:center}.tm-mode-select.title{font-size:1.5em;font-weight:300;margin-top:2em}.tc-select-mode{-webkit-box-shadow:none !important;box-shadow:none !important;border-radius:0 !important;background:none repeat scroll 0 0 transparent !important;border-color:#f5f5f4 !important;-o-border-image:none !important;border-image:none !important;border-style:solid !important;border-width:0 0 1px !important;color:#b8c4d6 !important;font-size:3em !important;height:3em !important;line-height:3 !important;margin:20px 0 !important;padding:0 !important;text-align:center;width:50%;display:none !important}.tm-mode-builder,.tm-mode-local{display:none}.tm-mode-local.tc-wrapper{background:#fff}.tc-options-group{background:none repeat scroll 0 0 #fff;border-top:0 solid #ecf0f1;margin-top:0;padding:0 !important;margin-right:0;margin-left:0;margin-bottom:0;width:100% !important}.tc-options-group .woocommerce-help-tip{float:right;top:3px}.tc-options-group .woocommerce-help-tip::after{content:"\f059";font-family:tc-fontawesome,sans-serif}.tm-mode-selector+div+div+.tc-options-group{display:none}.tm-mode-selector.tc-active+div+div+.tc-options-group{display:block}.tm-mode-selector.tc-active .tm-mode-select.title{display:none}.tm-mode-selector.tc-active .tm-mode-select{margin:0;padding:20px 20px 0 20px;display:-webkit-box;display:-ms-flexbox;display:flex;border-bottom:1px solid #c3c4c7;height:80px}.tm-mode-selector.tc-active .tc-select-mode{border-radius:0 !important;border:0 none !important;font-size:15px !important;font-weight:400;height:60px !important;line-height:60px !important;margin:0 !important;width:20% !important;display:block !important}.tm-mode-selector.tc-active .tc-select-mode.tc-settings-select{width:20% !important}.tm-mode-selector.tc-active .tc-select-mode:hover{color:var(--tc-color) !important}.tm-mode-selector.tc-active .tm-hidden{display:none !important}.tm-mode-selector.tc-active .tc-select-mode.button-primary{background:none repeat scroll 0 0 #fff !important;color:var(--tc-color) !important;border-radius:3px 3px 0 0 !important;border-color:#c3c4c7 #c3c4c7 #fff #c3c4c7 !important;border-style:solid !important;border-width:1px !important;z-index:4;text-shadow:none !important}.tc-select-mode .tcfa{margin-right:10px}#tc-admin-extra-product-options-inner{overflow:hidden}#tc-admin-extra-product-options-inner .form-field{float:none}.tm-mode-selector.tc-active{padding:0 !important;margin:0}.tc-wrapper .message2x2 .wp-tab-panel li{border-bottom:1px dotted #eee;padding-bottom:2px;padding-top:1px}.tc-wrapper .message2x2 .wp-tab-panel li:last-child{border-bottom:0 none}.tc-wrapper .message2x2 .wp-tab-panel li input[type="checkbox"],.tc-wrapper .message2x2 .wp-tab-panel li input[type="radio"]{margin:0 4px 0 0 !important;vertical-align:middle;border:1px solid #b4b9be;float:none}.wc-metaboxes-wrapper .tc-wrapper .wc-metabox table table{border-top:0 none;padding:0}.tmcp-attr-list{margin-right:5px}.tm-mode-local.tc-wrapper .toolbar{text-align:right;font-size:12px;font-weight:400;font-style:italic;padding:10px 20px !important}.tm-mode-local.tc-wrapper .toolbar a{text-decoration:none}.tm-att-value{color:#1e8cbe;font-weight:400}.tm-att-label{font-weight:300;font-size:10px}.tm-att-id{font-weight:700;font-size:.8em}.tm-type,.tm-att-value{margin-right:1em}.tm-att-label,.tm-att-id{margin-right:1px}assets/css/admin/tm-global-admin-menu.min.css000064400000000440150755142440015135 0ustar00.toplevel_page_tcepo .wp-submenu .wp-first-item,.product_page_tm-global-epo #postexcerpt,.post-type-tm_template_cp #postexcerpt,.post-type-tm_lookuptable_cp #postexcerpt{display:none}.post-type-tm_template_cp .handle-actions,.post-type-tm_lookuptable_cp .handle-actions{visibility:hidden}assets/css/admin/toastr.css000064400000015026150755142440011767 0ustar00.toast-title {
	font-weight: 700;
}

.toast-message {
	word-wrap: break-word;
}

.toast-message a,
.toast-message label {
	color: #fff;
}

.toast-message a:hover {
	color: #ccc;
	text-decoration: none;
}

.toast-close-button {
	position: relative;
	right: -0.3em;
	top: -0.3em;
	float: right;
	font-size: 20px;
	font-weight: 700;
	color: #fff;
	text-shadow: 0 1px 0 #fff;
	opacity: 0.8;
	line-height: 1;
}

.toast-close-button:hover,
.toast-close-button:focus {
	color: #000;
	text-decoration: none;
	cursor: pointer;
	opacity: 0.4;
}

.rtl .toast-close-button {
	left: -0.3em;
	float: left;
	right: 0.3em;
}

/*Additional properties for button version
 iOS requires the button element instead of an anchor tag.
 If you want the anchor version, it requires `href="#"`.*/
button.toast-close-button {
	padding: 0;
	cursor: pointer;
	background: transparent;
	border: 0;
	-webkit-appearance: none;
}

.toast-top-center {
	top: 0;
	right: 0;
	width: 100%;
}

.toast-bottom-center {
	bottom: 0;
	right: 0;
	width: 100%;
}

.toast-top-full-width {
	top: 0;
	right: 0;
	width: 100%;
}

.toast-bottom-full-width {
	bottom: 0;
	right: 0;
	width: 100%;
}

.toast-top-left {
	top: 12px;
	left: 12px;
}

.toast-top-right {
	top: 12px;
	right: 12px;
}

.toast-bottom-right {
	right: 12px;
	bottom: 12px;
}

.toast-bottom-left {
	bottom: 12px;
	left: 12px;
}


.toast-success {
	background-color: #51a351;
}

.toast-error {
	background-color: #bd362f;
}

.toast-info {
	background-color: #2f96b4;
}

.toast-warning {
	background-color: #f89406;
}

#toast-container {
	position: fixed;
	z-index: 999999;
	pointer-events: none;
}

#toast-container * {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

#toast-container > div {
	position: relative;
	pointer-events: auto;
	overflow: hidden;
	margin: 0 0 6px;
	padding: 15px 15px 15px 50px;
	width: 300px;
	border-radius: 3px 3px 3px 3px;
	background-position: 15px center;
	background-repeat: no-repeat;
	-webkit-box-shadow: 0 0 12px #999;
	box-shadow: 0 0 12px #999;
	color: #fff;
	opacity: 0.8;
}

#toast-container > div.rtl {
	direction: rtl;
	padding: 15px 50px 15px 15px;
	background-position: right 15px center;
}

#toast-container > div:hover {
	-webkit-box-shadow: 0 0 12px #000;
	box-shadow: 0 0 12px #000;
	opacity: 1;
	cursor: pointer;
}

#toast-container > .toast-info {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=) !important;
}

#toast-container > .toast-error {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=) !important;
}

#toast-container > .toast-success {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==) !important;
}

#toast-container > .toast-warning {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=) !important;
}

#toast-container.toast-top-center > div,
#toast-container.toast-bottom-center > div {
	width: 300px;
	margin-left: auto;
	margin-right: auto;
}

#toast-container.toast-top-full-width > div,
#toast-container.toast-bottom-full-width > div {
	width: 96%;
	margin-left: auto;
	margin-right: auto;
}

.toast {
	background-color: #030303;
}

.toast-progress {
	position: absolute;
	left: 0;
	bottom: 0;
	height: 4px;
	background-color: #000;
	opacity: 0.4;
}

/*Responsive Design*/
@media all and (max-width: 240px) {

	#toast-container > div {
		padding: 8px 8px 8px 50px;
		width: 11em;
	}

	#toast-container > div.rtl {
		padding: 8px 50px 8px 8px;
	}

	#toast-container .toast-close-button {
		right: -0.2em;
		top: -0.2em;
	}

	#toast-container .rtl .toast-close-button {
		left: -0.2em;
		right: 0.2em;
	}
}

@media all and (min-width: 241px) and (max-width: 480px) {

	#toast-container > div {
		padding: 8px 8px 8px 50px;
		width: 18em;
	}

	#toast-container > div.rtl {
		padding: 8px 50px 8px 8px;
	}

	#toast-container .toast-close-button {
		right: -0.2em;
		top: -0.2em;
	}

	#toast-container .rtl .toast-close-button {
		left: -0.2em;
		right: 0.2em;
	}
}

@media all and (min-width: 481px) and (max-width: 768px) {

	#toast-container > div {
		padding: 15px 15px 15px 50px;
		width: 25em;
	}

	#toast-container > div.rtl {
		padding: 15px 50px 15px 15px;
	}
}
assets/css/admin/tm-global-epo-admin.min.css000064400000220114150755142440014756 0ustar00.wp-admin{--tc-color:#000}.admin-color-fresh{--tc-color:#2271b1}.admin-color-light{--tc-color:#04a4cc}.admin-color-modern{--tc-color:#3858e9}.admin-color-blue{--tc-color:#e1a948}.admin-color-coffee{--tc-color:#c7a589}.admin-color-ectoplasm{--tc-color:#a3b745}.admin-color-midnight{--tc-color:#e14d43}.admin-color-ocean{--tc-color:#9ebaa0}.admin-color-sunrise{--tc-color:#dd823b}.admin-color-classic-dark{--tc-color:#c9356e}.admin-color-aquatic{--tc-color:#008763}.admin-color-classic-blue{--tc-color:#b26200}.admin-color-classic-bright{--tc-color:#cd4177}.admin-color-contrast{--tc-color:##045489}.admin-color-nightfall{--tc-color:#0675c4}.admin-color-powder-snow{--tc-color:#067ed3}.admin-color-sakura{--tc-color:#0675c4}.admin-color-sunset{--tc-color:#b26200}body{--tc-color:var(--tc-color)}#tmformfieldsbuilderwrap .ui-resizable{position:relative}.ui-resizable-autohide .ui-resizable-handle{display:none}#tmformfieldsbuilderwrap .ui-resizable-handle{position:absolute;font-size:.1px;display:block}#tmformfieldsbuilderwrap .ui-resizable-disabled .ui-resizable-handle{display:none}#tmformfieldsbuilderwrap .ui-resizable-e{cursor:e-resize;width:7px;right:7px;top:0;height:100%}#tmformfieldsbuilderwrap .ui-resizable-n,#tmformfieldsbuilderwrap .ui-resizable-s,#tmformfieldsbuilderwrap .ui-resizable-w,#tmformfieldsbuilderwrap .ui-resizable-se,#tmformfieldsbuilderwrap .ui-resizable-sw,#tmformfieldsbuilderwrap .ui-resizable-nw,#tmformfieldsbuilderwrap .ui-resizable-ne{display:none !important}#tmformfieldsbuilderwrap .ui-resizable-se{cursor:e-resize;width:11px;right:5px;top:calc(50% - 5.5px);height:11px;bottom:auto;left:auto;background:#fff;border-radius:100%;border:2px solid var(--tc-color);z-index:10000 !important}#tmformfieldsbuilderwrap .ui-resizable-resizing .ui-resizable-se{background:var(--tc-color)}#tmformfieldsbuilderwrap .builder-wrapper:hover>.ui-resizable-se,#tmformfieldsbuilderwrap .bitem:hover .ui-resizable-se{display:block !important;-webkit-animation:element-outline .95s;animation:element-outline .95s}#tmformfieldsbuilderwrap .builder-wrapper.ui-sortable-helper .ui-resizable-se,#tmformfieldsbuilderwrap .bitem.ui-sortable-helper .ui-resizable-se,#tmformfieldsbuilderwrap .builder-wrapper.ui-sortable-helper:hover .ui-resizable-se,#tmformfieldsbuilderwrap .bitem.ui-sortable-helper:hover .ui-resizable-se,#tmformfieldsbuilderwrap .ui-sortable-helper .bitem-inner{display:none !important}.builder-wrapper.ui-sortable-helper,.bitem.ui-sortable-helper{z-index:100000}.bitem.ui-resizable-resizing,.builder-wrapper.ui-resizable-resizing{opacity:.5}.bitem.ui-resizable-resizing.ui-highlight,.builder-wrapper.ui-resizable-resizing.ui-highlight{opacity:1}label.tm-epo-switch-wrapper-label{vertical-align:unset}.tm-epo-switch-wrapper input[type="checkbox"],.tm-epo-switch-wrapper input[type="radio"]{opacity:0;left:50%;position:absolute;top:50%;pointer-events:none}.tm-epo-switch-wrapper .tm-epo-switch{position:relative;display:inline-block;min-width:44px;cursor:pointer;margin:0 !important;padding:0;min-height:24px;top:.5em}.tm-epo-switch-wrapper .tm-epo-switch::before,.tm-epo-switch-wrapper .tm-epo-switch::after{content:"";position:absolute;margin:0;outline:0;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);-webkit-transition:all .3s ease;transition:all .3s ease}.tm-epo-switch-wrapper .tm-epo-switch::before{left:0;width:44px;height:23px;background-color:#d0d5dd;border-radius:20px;border:1px solid rgba(0,0,0,0.1)}.tm-epo-switch-wrapper .tm-epo-switch::after{left:2px;width:18px;height:18px;border-radius:16px}.tm-epo-switch-wrapper input:checked+.tm-epo-switch::after{-webkit-transform:translate(80%,-50%);transform:translate(80%,-50%);left:8px;border-color:transparent}.tm-epo-switch-wrapper .tm-epo-switch.tc::after{border:1px solid transparent;background-color:#fafafa;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.098),0 -2px 2px 0 rgba(0,0,0,0.198);box-shadow:0 3px 1px -2px rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.098),0 -2px 2px 0 rgba(0,0,0,0.198)}.tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::before{background-color:var(--tc-color)}.tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::after{background-color:#fff}.tm-epo-switch-wrapper input:focus+.tm-epo-switch.tc::before{border:1px solid var(--tc-color)}.tm-epo-switch-wrapper{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex}.tm-epo-switch-wrapper-label .tm-epo-switch-wrapper{width:44px;max-width:44px;display:inline-block}.message0x0.tm-epo-switch-wrapper{max-width:none;width:auto}.tm-setting-row-disabled .tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::before,.tm-setting-row-disabled .tm-epo-switch-wrapper .tm-epo-switch::before{background-color:#ecf0f1;border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.tm-setting-row-disabled .tm-epo-switch-wrapper .tm-epo-switch.tc::after,.tm-setting-row-disabled .tm-epo-switch-wrapper input:checked+.tm-epo-switch.tc::after{background-color:#ecf0f1;border-color:#ccc;-webkit-box-shadow:none;box-shadow:none}.tm-epo-switch-wrapper .tc-radio-text{position:relative;display:inline-block;min-width:44px;cursor:pointer;font-weight:400;text-align:center;margin:0 -1px 0 0 !important;padding:1em;background:#fff;color:var(--tc-color);border:1px solid #e3e5ed;-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important}.tm-epo-switch-wrapper .tc-radio-text:hover{background:#f2f1fa}.tm-epo-switch-wrapper input:checked+label .tc-radio-text{font-weight:700;background:var(--tc-color);color:#fff}.tm-epo-switch-wrapper input:first-of-type+label .tc-radio-text{border-radius:10px 0 0 10px}.tm-epo-switch-wrapper input:last-of-type+label .tc-radio-text{border-radius:0 10px 10px 0}.tm-setting-row-disabled.tm-epo-switch-wrapper .tc-radio-text{background:#ecf0f1 !important;color:#ccc !important}.tm-setting-row-disabled.tm-epo-switch-wrapper input:checked+label .tc-radio-text{color:#3b3460 !important}.tc-wrapper,.tc-wrapper div,.flasho,.flasho div,.bsbb,.tm-bsbb-all *{-webkit-box-sizing:border-box;box-sizing:border-box}.tc-hidden,.tm-hidden{display:none !important}.tm-show{display:block !important}.tm-text-right{text-align:right;margin-left:auto !important}.tm-animated,.bitem,.builder-wrapper{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.transition,.tmicon{-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}@-webkit-keyframes appear{0%{opacity:0;-webkit-transform:translate3d(5%,0,0);transform:translate3d(5%,0,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes appear{0%{opacity:0;-webkit-transform:translate3d(5%,0,0);transform:translate3d(5%,0,0)}100%{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.appear{-webkit-animation-name:appear;animation-name:appear}.tc-clearfix::after{content:"";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}[class^="icon-"]::before,[class*=" icon-"]::before,.tcfa::before{cursor:inherit !important}.bitem.element-is-disabled:not(.ui-sortable-helper),.choice-is-disabled{-webkit-transition:all .3s linear;transition:all .3s linear}.tc-wrapper .options-wrap.choice-is-disabled{opacity:.7;border:1px dashed #d00;background:#fff}.bitem.element-is-disabled .hstc2{opacity:.4}.bitem.element-is-disabled:hover .hstc2{opacity:1;background:transparent}.choice-is-disabled:hover{opacity:1}.bitem .clone:hover,.bitem .edit:hover,.bitem .delete:hover,.bitem .plus:hover,.bitem .minus:hover{-webkit-transition:all .2s linear;transition:all .2s linear}.tm-hide,.tm-hide-bitems .bitem-wrapper,.tm-hide-bitems .bitem-add,.tm-hide-bitems .tc-tab-headers-wrap,.tm-hide-bitems .tm-slider-wizard-headers{visibility:hidden !important;padding:0 !important;height:0 !important;width:0 !important;margin:0 !important;min-height:0 !important;min-width:0 !important;opacity:0 !important}.tc-cell-value,.tc-cell-url{display:none}.overflow{overflow:hidden}.clearboth,.builder-element-wrap .clear{clear:both;display:block;font-size:0;height:0;line-height:0;width:100%}#tc-floatbox-content .wc_error_tip{line-height:1.5}#tc-floatbox-content-pop{overflow:auto}.tmicon{display:inline-block;left:auto !important;position:relative;right:auto !important;overflow:hidden;width:30px !important;height:30px !important;line-height:30px !important;font-size:14px;text-align:center;cursor:pointer;vertical-align:middle;margin:0;padding:0;-ms-flex-negative:0;flex-shrink:0}.tc-button .tmicon{width:1em !important;height:1em !important;line-height:1 !important}button.tmicon{background:0;border:0}.tmicon.move{color:#c7c7d2}.tmicon.move:hover{color:var(--tc-color)}.tmicon.size{font-weight:700;font-size:10px;cursor:default;width:auto !important;background:none !important;border:none !important;min-width:30px}.tmicon.delete{color:#949eb0}.tmicon.delete:hover{color:#d00}.builder-section-wrap .tmicon.fold{margin:0 5px}.tma-handle .tmicon.fold{right:5px !important;top:5px !important;background:none repeat scroll 0 0 transparent;position:absolute}.tma-handle .tmicon.fold:hover{background:none repeat scroll 0 0 #fff;color:var(--tc-color)}.tc-button{display:inline-block;margin-bottom:0;font-weight:700;text-align:center;vertical-align:middle;cursor:pointer;border:1px solid transparent;background:0;white-space:nowrap;padding:0 1.5em;font-size:12px;line-height:30px;overflow:hidden;position:relative;outline:0 !important;border-radius:3px;-webkit-transition:all .3s ease;transition:all .3s ease}.tc-button+.tc-button{margin-left:5px}.tc-button.large{font-size:14px;padding:10px 14px}.tc-button.small{font-size:10px;padding:0 !important;line-height:21px;width:21px}.tc-button.tc{color:#fff;background-color:var(--tc-color)}.tc-button.tc:hover{z-index:2}.tc-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:start;align-content:flex-start;margin:0 -1em;position:relative;overflow:auto}.nopadding .tc-row,.nopadding.tc-row{margin:0}.nomargin .tc-cell{margin:0}.tc-cell{position:relative;padding:0 1em;margin:0 0 1.65em;float:left;min-height:1px;overflow:hidden}.nopadding .tc-cell{padding:0}.tc-col-auto{width:auto}.tc-cell.tc-col-auto{padding:0 1em !important}.tc-col-1{width:8.3334%}.tc-col-2{width:16.6667%}.tc-col-3{width:25%}.tc-col-4{width:33.3334%}.tc-col-5{width:41.6667%}.tc-col-6{width:50%}.tc-col-7{width:58.3334%}.tc-col-8{width:66.6667%}.tc-col-9{width:75%}.tc-col-10{width:83.3334%}.tc-col-11{width:91.6667%}.tc-col-12{width:100%}.wauto{width:100% !important}.w12-5{width:12.5%}.w37-5{width:37.5%}.w62-5{width:62.5%}.w87-5{width:87.5%}.w1{width:1%}.w2{width:2%}.w3{width:3%}.w4{width:4%}.w5{width:5%}.w6{width:6%}.w7{width:7%}.w8{width:8%}.w9{width:9%}.w10{width:10%}.w11{width:11%}.w12{width:12%}.w13{width:13%}.w14{width:14%}.w15{width:15%}.w16{width:16%}.w17{width:17%}.w18{width:18%}.w19{width:19%}.w20{width:20%}.w21{width:21%}.w22{width:22%}.w23{width:23%}.w24{width:24%}.w25{width:25%}.w26{width:26%}.w27{width:27%}.w28{width:28%}.w29{width:29%}.w30{width:30%}.w31{width:31%}.w32{width:32%}.w33{width:33.3333333332%}.w34{width:34%}.w35{width:35%}.w36{width:36%}.w37{width:37%}.w38{width:38%}.w39{width:39%}.w40{width:40%}.w41{width:41%}.w42{width:42%}.w43{width:43%}.w44{width:44%}.w45{width:45%}.w46{width:46%}.w47{width:47%}.w48{width:48%}.w49{width:49%}.w50{width:50%}.w51{width:51%}.w52{width:52%}.w53{width:53%}.w54{width:54%}.w55{width:55%}.w56{width:56%}.w57{width:57%}.w58{width:58%}.w59{width:59%}.w60{width:60%}.w61{width:61%}.w62{width:62%}.w63{width:63%}.w64{width:64%}.w65{width:65%}.w66{width:66.6666666665%}.w67{width:67%}.w68{width:68%}.w69{width:69%}.w70{width:70%}.w71{width:71%}.w72{width:72%}.w73{width:73%}.w74{width:74%}.w75{width:75%}.w76{width:76%}.w77{width:77%}.w78{width:78%}.w79{width:79%}.w80{width:80%}.w81{width:81%}.w82{width:82%}.w83{width:83%}.w84{width:84%}.w85{width:85%}.w86{width:86%}.w87{width:87%}.w88{width:88%}.w89{width:89%}.w90{width:90%}.w91{width:91%}.w92{width:92%}.w93{width:93%}.w94{width:94%}.w95{width:95%}.w96{width:96%}.w97{width:97%}.w98{width:98%}.w99{width:99%}.w100{width:100%}.options-wrap .tc-row.nopadding{overflow:visible}.tc-wrapper .options-wrap .tc-cell{height:auto;line-height:40px;margin:0;text-align:center}.multiple_options .tc-cell{font-weight:700;height:40px;line-height:40px;margin:0}.tc-wrapper .options-wrap .tc-cell.tc-extra-option{height:auto;padding:1em 1em 0;text-align:left}.tc-wrapper .options-wrap .tc-cell.tm_cell_images{text-align:left}.tc-wrapper .options-wrap .tc-cell.tm_cell_title,.tc-wrapper .options-wrap .tc-cell.tm_cell_defalt{overflow:visible}.options-wrap .tc-cell.tm_cell_image{text-align:left}.options-wrap .tc-cell.tm_cell_price{height:auto;max-width:95%;overflow:visible;text-align:left}.tc-wrapper .options-wrap .tc-cell.tm_cell_subscriptionfee,.tc-wrapper .options-wrap .tc-cell.tm_cell_fee,.tc-wrapper .options-wrap .tc-cell.tc-cell-url,.tc-wrapper .options-wrap .tc-cell.tm_cell_description,.tc-wrapper .options-wrap .tc-cell.tm_cell_display,.tc-wrapper .options-wrap .tc-cell.tm_cell_enabled{height:auto;padding:1em 1em 0;text-align:left}.tc-wrapper .options-wrap .tc-cell.tm_cell_subscriptionfee .tm-inline-label{width:auto}.tm-logic-rule .tc-cell{margin:0;padding:0 1px !important}.tm-logic-rule .tc-cell select,.tm-logic-rule .tc-cell input{width:100% !important}.tm-logic-rule .tm-logic-func{margin-left:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.tc-cell.tm-logic-value{-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%}.tc-cell.tm-logic-operator{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;min-width:100px}.tc-cell.tm-logic-element{-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%}.tc-hidden-no-events{pointer-events:none !important;display:none !important}#tmformfieldsbuilder,#tmformfieldsbuilderwrap,.flasho,.tm-internal-name,.tc-info-box{font-family:Roboto,"Open Sans",Helvetica,Arial,sans-serif}#tmformfieldsbuilder{font-size:14px;line-height:1.42857143;background:none repeat scroll 0 0 #fff;padding:20px;float:none;width:auto}#tmformfieldsbuilder h2{font-weight:700;font-size:16px;line-height:18px;color:#2f353b;padding:0;border:0}#tmformfieldsbuilder .inside{padding:0 !important;margin:0 !important}#tmformfieldsbuilder .handlediv{top:4px;position:relative}#wp-excerpt-editor-container .wp-editor-area{height:175px;width:100%}.builder-selector{overflow:hidden;padding:20px;display:none;width:100%;border:1px solid #c3c4c7;margin:20px 0;background:#fff}.builder-selector .tc-cell{margin:0}.builder-selector .tc-row,.builder-selector .tc-cell{overflow:visible}.tc-button.tc.alt{background-color:#f6f7f7 !important;color:var(--tc-color) !important;border-color:#dddee4}.tc.tc-button.alt.floatbox-edit-cancel,.tc.tc-button.alt.floatbox-cancel{color:#aeb0b9 !important;border:0 !important;background:none !important}.builder_hidden_elements,.builder_hidden_section{display:none}.section_elements.closed{display:none}.bitem:hover .tmicon,.builder-wrapper:hover .builder-section-wrap .btitle .tmicon,.btitle .tmicon{visibility:visible}.builder-wrapper{margin:10px 0;padding:0;position:relative;vertical-align:top;display:inline-block;height:auto !important;z-index:1}.builder-wrapper:hover{z-index:5 !important}.builder-wrapper .btitle{margin-top:0;min-height:54px;padding:10px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden}.builder-wrapper .minus.disabled,.builder-wrapper .plus.disabled{background-color:#d82545 !important;color:#fff !important}.builder-section-wrap{margin:0 10px;background:#f6f8fa;position:relative}.builder-layout{padding:0;margin:-10px}.tm-mode-builder .builder-layout{margin:10px}.bitem-wrapper{margin:0;padding:10px 10px;min-height:50px}.bitem-wrapper:empty{min-height:0}.bitem-wrapper.highlight{background:transparent}.bitem.ui-sortable-helper{z-index:10000 !important}.bitem.ui-sortable-helper .hstc2{background:var(--tc-color);border:1px solid var(--tc-color);color:#fff;-webkit-box-shadow:0 2px 20px 0 rgba(85,58,254,0.2);box-shadow:0 2px 20px 0 rgba(85,58,254,0.2);max-width:300px}.bitem.ui-sortable-helper .tm-label-delete{display:none !important}.bitem.ui-sortable-helper .tm-label-desc,.bitem.ui-sortable-helper .tm-label,.bitem.ui-sortable-helper .tmicon.move{color:#fff}.bitem.ui-sortable-helper .tm-icon-wrap{background:#fff !important}.bitem.ui-sortable-helper .tm-icon-wrap .tmfa{color:var(--tc-color)}.bitem-add+.bitem-wrapper:empty+.bitem-add,.bitem-wrapper.tm-show:empty ~ .bitem-add{display:none}.bitem{display:inline-block;position:static;margin:0 0 20px;vertical-align:top;height:auto}.hstc2{background:#fff;color:#000;min-width:1% !important;position:relative;margin:0 10px 0 10px;border-radius:5px}.hstc2:hover{-webkit-box-shadow:6px 11px 24px #dfe0e7;box-shadow:6px 11px 24px #dfe0e7}.hstc2 .inside{display:none !important}.bitem.element-variations .hstc2{margin-top:10px}@-webkit-keyframes element-outline{0%{opacity:0}100%{opacity:1}}@keyframes element-outline{0%{opacity:0}100%{opacity:1}}.bitem-inner,.section-inner{border:0;position:absolute;top:0;right:0;left:0;bottom:0;letter-spacing:0;z-index:9998;pointer-events:none}.bitem-inner::after,.section-inner::after{content:"";width:100%;height:100%;position:absolute;left:0;right:0;top:0;bottom:0;border:1px solid #c3c4c7;-webkit-animation:element-outline .75s;animation:element-outline .75s;-webkit-box-sizing:border-box;box-sizing:border-box}.bitem-inner::after{border-color:#ebecf0}.builder-wrapper.tma-variations-wrap .builder-section-wrap .bitem-inner::after{border:1px solid #ed8458}.builder-wrapper.tma-variations-wrap .builder-section-wrap .section-inner::after{border-color:#dddee4}.bitem.element-is-disabled .bitem-inner::after{border:1px dashed #d3d9e2}.bitem:hover .bitem-inner::after,.builder-wrapper:hover .section-inner::after{content:""}.bitem:hover .bitem-inner::after,.builder-wrapper:hover .section-inner::after,.builder-wrapper.tma-variations-wrap .bitem:hover .bitem-inner::after,.builder-wrapper.tma-variations-wrap:hover .builder-section-wrap .section-inner::after{border-color:var(--tc-color)}.hstc2:not(:hover)>.bitem-inner .bitem-settings:not(.show),.builder-section-wrap:not(:hover)>.section-inner .section-settings:not(.show){height:0;visibility:hidden;z-index:-1;padding:0 5px}.bitem-settings,.section-settings{padding:1px 5px;word-break:normal;clear:unset;letter-spacing:normal;top:0;left:0;-webkit-transform:translateX(0) translateY(-100%);transform:translateX(0) translateY(-100%);-webkit-transition:all .2s cubic-bezier(0.19,0.83,0.57,0.91);transition:all .2s cubic-bezier(0.19,0.83,0.57,0.91);background-color:var(--tc-color);border-radius:5px 5px 0 0;-webkit-box-shadow:0 -2px 8px rgba(0,0,0,0.05);box-shadow:0 -2px 8px rgba(0,0,0,0.05);position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;height:30px;list-style:none;margin:0;font-size:13px;font-weight:400;font-style:normal;line-height:1;z-index:1;pointer-events:all;-webkit-animation:element-outline .25s;animation:element-outline .25s;border-width:1px 1px 0 1px;border-style:solid;border-color:rgba(255,255,255,0.5)}.bitem-setting,.section-setting{cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0;margin:0 2px;font-size:11px;color:#fff;width:25px;opacity:.7}.bitem-setting:hover,.section-setting:hover,.section-setting.size,.bitem-setting.size{opacity:1}.bitem-setting.size,.section-setting.size{cursor:default}.bitem-setting.size:hover,.section-setting.size:hover{background-color:transparent}.bitem-inner-info{padding:20px 20px 20px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:90px;overflow:hidden}.bitem .tm-label{cursor:default;font-weight:400;font-size:12px;line-height:1.1;overflow:hidden;padding:3px 7px 0 7px;white-space:nowrap;color:#c4c6d0}.tm-label-line{height:2px;float:left;width:100%;display:none}.tm-label-line-inner{color:rgba(0,0,0,0.15);width:100%;float:left;height:2px}.tm-icon-wrap{font-size:22px;text-align:center;height:1.8em;position:relative;width:1.8em;display:inline-block;background:#000;border-radius:100%}.tm-icon-wrap i{font-size:28px}.tm-icon-wrap .tmfa{font-size:16px;position:absolute;top:0;bottom:0;margin:auto;height:1em;left:0;right:0;color:#fff;text-align:center}.bitem.element-variations .tm-icon-wrap{background:#ed8458}.bitem.element-variations .tm-label-desc{color:#ed8458}.bitem.element-header .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="header"] .tm-icon-wrap,.bitem.element-divider .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="divider"] .tm-icon-wrap{border:1px solid rgba(0,0,0,0.1);background:transparent}.bitem.element-header .tm-icon-wrap .tcfa,.tm-elements-container .tc-element-button[data-element="header"] .tcfa{color:#4c5071}.bitem.element-divider .tm-icon-wrap .tcfa,.tm-elements-container .tc-element-button[data-element="divider"] .tcfa{color:silver}.bitem.element-date .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="date"] .tm-icon-wrap{background-color:#0d41e1}.bitem.element-time .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="time"] .tm-icon-wrap{background-color:#09a6f3}.bitem.element-range .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="range"] .tm-icon-wrap{background-color:#a204e6}.bitem.element-color .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="color"] .tm-icon-wrap{background-color:#ea1744}.bitem.element-textarea .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="textarea"] .tm-icon-wrap{background-color:#8d9098}.bitem.element-textfield .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="textfield"] .tm-icon-wrap{background-color:#251f86}.bitem.element-upload .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="upload"] .tm-icon-wrap{background-color:#fd12ff}.bitem.element-selectbox .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="selectbox"] .tm-icon-wrap{background-color:#09a6f3}.bitem.element-selectboxmultiple .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="selectboxmultiple"] .tm-icon-wrap{background-color:#0c63e7}.bitem.element-radiobuttons .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="radiobuttons"] .tm-icon-wrap{background-color:#ff7900}.bitem.element-checkboxes .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="checkboxes"] .tm-icon-wrap{background-color:#ff4800}.bitem.element-product .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="product"] .tm-icon-wrap{background-color:#674399}.bitem.element-template .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="template"] .tm-icon-wrap{background-color:#6917d0}.bitem.element-multiple_file_upload .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="multiple_file_upload"] .tm-icon-wrap{background-color:#ff0080}.bitem.element-dynamic .tm-icon-wrap,.tm-elements-container .tc-element-button[data-element="dynamic"] .tm-icon-wrap{background-color:#04e762}.tm-label-move{-webkit-box-flex:0;-ms-flex:0 0 2em;flex:0 0 2em;text-align:left;width:2em}.tm-label-move .tmicon.move{width:30px !important;text-align:center}.tm-label-icon{-webkit-box-flex:0;-ms-flex:0 0 5em;flex:0 0 5em;width:5em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-label-info{-webkit-box-flex:0;-ms-flex:0 0 calc(100% - 7em - 30px);flex:0 0 calc(100% - 7em - 30px);width:calc(100% - 7em - 30px)}.tm-label-info-hidden .tm-label-info,.tm-label-info-hidden .tm-label-delete,.tm-label-info-hidden .tm-label-icon{visibility:hidden}.w12-5 .tm-label-icon,.w12-5 .tm-label-info,.w20 .tm-label-icon{display:none}.w12-5 .tm-label-delete{-webkit-box-flex:0;-ms-flex:0 0 2em;flex:0 0 2em;width:2em}.w20 .tm-label-info{-webkit-box-flex:0;-ms-flex:0 0 calc(100% - 2em - 30px);flex:0 0 calc(100% - 2em - 30px);width:calc(100% - 2em - 30px)}.w25 .tm-label-icon{-webkit-box-flex:0;-ms-flex:0 0 4em;flex:0 0 4em;width:4em}.w25 .tm-label-info{-webkit-box-flex:0;-ms-flex:0 0 calc(100% - 6em - 30px);flex:0 0 calc(100% - 6em - 30px);width:calc(100% - 6em - 30px)}.tm-label-delete{-webkit-box-flex:0;-ms-flex:0 0 30px;flex:0 0 30px;width:30px}.bitem .inside{left:0;margin:0 0 0 !important;padding:0;width:100%}.bitem .inside .manager{background:none repeat scroll 0 0 #fff;margin-left:0;position:relative}.bitem .builder-element-wrap{overflow:hidden;padding:12px;border-top:1px solid #ccc;background:none repeat scroll 0 0 #f5f5f5}.bitem.pl{border-left:3px dashed var(--tc-color);height:108px !important;margin:-20px 4px 4px 9px;position:relative;width:10px !important}.bitem.pl span{border-color:var(--tc-color) transparent transparent;-o-border-image:none;border-image:none;border-style:solid;border-width:7px;display:block;height:0;left:0;margin-left:-9px;margin-top:15px;position:absolute;top:0;width:0}.bitem.pl2{max-width:100% !important;margin-left:-4px;position:relative}.bitem.pl2::after{content:"";position:absolute;background:#eef6ff none repeat scroll 0 0;width:calc(100% - 30px);height:calc(100% - 4px);margin:2px 18px 0 18px;border:2px dashed #d5dfe7}.bitem .tm-label-desc{font-size:15px;font-weight:700;white-space:nowrap;color:#4c5071;line-height:23px;padding:5px 7px;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.bitem .tm-label-desc:hover{cursor:text}.btitle .tm-label-desc-edit{background:#fff}.tm-label-desc-edit{border-width:0 0 1px 0;border-style:solid;overflow:hidden}.tm-label-desc,.tm-label-desc-edit{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin:0;line-height:33px;padding:0;font-weight:700;white-space:nowrap;color:var(--tc-color);overflow:hidden;font-size:15px;max-width:100%;width:100%;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.btitle .tmicon.move{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.btitle .tmicon.fold{-webkit-box-ordinal-group:15;-ms-flex-order:14;order:14;color:#b4b9c7;border-radius:1000%}.btitle .tmicon.fold:hover{color:var(--tc-color)}.btitle .tmicon.delete{-webkit-box-ordinal-group:16;-ms-flex-order:15;order:15}.tc-epo-style-wrapper input[type="checkbox"],.tc-epo-style-wrapper input[type="radio"]{visibility:hidden;display:inline !important}.tm-settings-wrap .tc-epo-style-wrapper-label{line-height:2}.tc-epo-style-wrapper{height:2em;width:2em;position:relative;display:inline-block;margin-right:5px}#settingsdiv .meta-priority{width:100%}.meta-priority-label{display:block;padding-bottom:6px}.apply-mode-label{padding-bottom:6px}#settingsdiv .inside{padding:0;margin:0}#settingsdiv .tm-epo-switch-wrapper .tc-radio-text{padding:.5em;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;text-overflow:ellipsis;overflow:hidden}#settingsdiv .tm-epo-switch-wrapper label{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:33%}#misc-settings-actions{padding:6px 0 0}.major-settings-actions{background:#f6f7f7;padding:10px;border-top:1px solid #dcdcde}.override-selection{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.override-selection.height50{height:50%}.product_page_tm-global-epo #minor-publishing-actions{display:none}.product_page_tm-global-epo #postexcerpt,.post-type-tm_template_cp #thepostexcerpt{display:none}.t.tm-no-editor{height:200px}.tmfa{font-style:normal;font-variant:normal;text-transform:none;line-height:1}.builder_responsive_div .message2x1{padding-left:2em}.tc-enable-responsive{font-weight:700;margin:0 0 0 1em;padding:4px;cursor:pointer;color:var(--tc-color)}.tc-enable-responsive.active{background:var(--tc-color) none repeat scroll 0 0;color:#fff}#tmformfieldsbuilderwrap.disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff;opacity:.6}.tm-element-label:hover,.tm-internal-label:hover{width:auto;cursor:text}.btitle .tm-element-label:hover,.btitle .tm-internal-label:hover{background:0;cursor:text}.bitem .tm-label-desc-edit{padding:1px 7px;line-height:20px !important}.tc-wrapper .bitem .tm-label-desc-edit .tm-internal-name{line-height:20px !important;height:20px !important}.tc-wrapper .tm-label-desc-edit .tm-internal-name{font-size:15px !important;font-weight:400;padding:0 !important;margin:0 !important;line-height:33px !important;height:33px !important;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;border-width:0 !important;border-radius:0 !important;color:var(--tc-color)}.tc-wrapper .tm-label-desc-edit .tm-internal-name:focus{border-color:var(--tc-color);-webkit-box-shadow:none !important;box-shadow:none !important;outline:none !important}.btitle .tm-internal-name{text-align:right}.tm-internal-label{display:none;overflow:hidden}.tc-has-value .tm-element-label{display:none}.tc-has-value .tm-internal-label{display:inline-block}.tm-wrong-rule .bitem-inner::after,.tm-wrong-rule .section-inner::after{border:1px solid #d00}.bitem.tm-wrong-rule{position:relative}.bitem.tm-wrong-rule::after,.builder-wrapper.tm-wrong-rule::after{background:none repeat scroll 0 0 red;border-radius:100%;-webkit-box-shadow:0 2px 5px rgba(255,0,0,0.4);box-shadow:0 2px 5px rgba(255,0,0,0.4);color:#fff;content:"\f071";font-family:tc-fontawesome,sans-serif;font-size:20px;font-weight:900;z-index:10000;height:32px;line-height:32px;position:absolute;right:50%;margin-right:-16px;text-align:center;top:-16px;width:32px}.selected-menu{margin-right:5px}.builder_caption{color:#555;font-weight:700;font-size:12px;margin:0 6px 0 0;padding:3px}.builder-panel-add,.builder-panel-mass-add,.builder-panel-populate{margin:1em !important}.tm-tags-container{background:#fff}.builder-import-file{visibility:hidden;width:0;height:0}.fullsize #tmformfieldsbuilderwrap{bottom:0;left:0;margin:0;position:fixed;right:0;top:0;z-index:100000;background:#fff;padding:0}.fullsize .edit-post-layout__content{position:absolute}.fullsize #tmformfieldsbuilderwrap .inside{margin:0 !important;padding:0 !important}.tc-button#builder-fullsize,.tc-button#builder-fullsize-close{background:none !important;padding:0;width:30px;height:30px}.fullsize #tmformfieldsbuilderwrap .hndle,.fullsize #tmformfieldsbuilderwrap>.handlediv,#builder-fullsize-close,.fullsize #tmformfieldsbuilderwrap #builder-fullsize{display:none !important}.fullsize #tmformfieldsbuilderwrap #builder-fullsize-close{display:inline-block !important}.fullsize #tmformfieldsbuilderwrap .tc-wrapper{border-top:3px solid #ccc}.fullsize #tmformfieldsbuilderwrap .builder-layout{bottom:88px;overflow:auto;position:fixed;top:117px;width:100%;padding:2em 11px 10px 11px;margin:0}.fullsize #tmformfieldsbuilderwrap .builder-add-section-action{bottom:0;position:fixed;width:100%}.fullsize .builder-selector{margin-top:0;height:97px;max-height:97px}.fullsize .tc-warning-text{color:#d00;font-size:12px;font-weight:400;line-height:1;display:inline-block;white-space:pre-line;margin:0 1em;padding:0}.builder-add-section-action{padding:20px;margin-top:20px;display:none}.tm-mode-builder .builder-add-section-action{margin-top:10px;margin-bottom:20px}.builder-add-section-and-element.tc-button{width:50%}.tm-add-section-action{text-align:center}.tm-add-section-action .tmfa{cursor:pointer;color:var(--tc-color);font-size:3em}.bitem-add.tc-prepend{padding-bottom:10px}.tm-add-element-action{text-align:center;padding:.5em}.tc-prepend .tm-add-element-action{padding-bottom:5px;padding-top:5px}.tc-append .tm-add-element-action{padding-top:5px;padding-bottom:5px}.bitem-add.tc-append{padding-bottom:20px}.tm-add-element-action .tmfa{cursor:pointer;color:#b4b9c7;font-size:1.5em}.tm-add-element-action .tmfa:hover{color:var(--tc-color)}.float-editbox .tm-tags-container .tm-tab{display:block;padding:1em}.tm-tags-container .tm-box h4{padding:1em 2em 1em 1em}.tm-elements-container{margin:0;padding:0 0 1em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-element-button{background:0;border:1px solid transparent;display:inline-block;font-size:1em;margin:0;overflow:hidden;padding:0;-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;width:20%;cursor:pointer}.tm-element-button:hover{border-color:var(--tc-color)}.tc-element-button{display:table;padding:1em;width:100%}.tc-element-button .tm-label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;height:4em;position:relative;vertical-align:middle;white-space:normal;width:100%}.tc-element-button .tm-name-wrap{padding:0 10px;width:calc(100% - 1.8em - 20px)}.tc-element-button .tm-element-name{color:#2c3e50;font-size:1.1em;font-weight:700}.tc-element-button .tm-element-description{color:#95a5a6;display:block;font-size:.8em}.tc-wrapper select{max-width:100%;min-width:20%}.tc-wrapper{padding:0}.tc-wrapper h1{border-bottom:1px solid #292421;color:#292421;font-size:27px;font-weight:400;letter-spacing:4px;margin:0 0 15px;text-align:left;text-transform:uppercase}.tc-wrapper .savebuttonfix{float:right;position:relative;top:-50px}.tc-wrapper .infotitle{color:#228b22}.tc-wrapper .errortitle{color:#dd3d36;margin:5px 0 15px;background:none repeat scroll 0 0 #fff;border-left:4px solid #dd3d36;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);padding:1px 12px}.tc-wrapper .tm-all-attributes .errortitle{margin:0}.tm-logic-wrapper .error{margin:1em 0}.builder-logic-div,.shipping-logic-div{margin:1em 0}.builder-logic-div-what{padding:1em}.builder-logic-div-what,.tm-logic-rule-set{border:1px solid #e8eaee;border-radius:5px}.tm-logic-rule-set{background:#fcfcfd;padding:0 1em;position:relative;margin:1em 0}.tm-logic-wrapper{margin:1em 0}.tm-logic-rule-set legend{text-align:center;background:var(--tc-color);color:#fff;padding:.5em 1em;border-radius:5px;font-weight:700;position:absolute;left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);top:calc(-0.5em - 0.7em - 13px/2 - 1px);font-size:10px}.tm-logic-rule:not(:first-child)::before{background:var(--tc-color);content:"AND";color:#fff;padding:2px 5px;display:block;width:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-radius:5px;font-size:10px;font-weight:700}.tm-logic-rule-set:first-child legend{display:none}.cpf-add-rule{color:var(--tc-color)}.epo-rule-toggle{margin-right:6px}.tc-wrapper .line{border-bottom:1px solid #fff;position:relative}.tc-wrapper .message0x0{border:1px solid #ebebeb;border-radius:5px;margin:9px 0;padding:2.2em;width:100%;min-height:33px}.tc-wrapper .message0x0.tm-setting-row-disabled{background:none repeat scroll 0 0 #f5f7fb !important}.tc-wrapper .message0x0.tm-setting-row-disabled .message2x1,.tc-wrapper .message0x0.tm-setting-row-disabled input,.tc-wrapper .message0x0.tm-setting-row-disabled select,.tc-wrapper .message0x0.tm-setting-row-disabled textarea{color:#ccc !important;background:none repeat scroll 0 0 #f5f7fb !important}.tm-setting-row-disabled .tm-weekdays-picker-wrap,.tm-setting-row-disabled .tm-months-picker-wrap{display:none}.tc-wrapper .message2x1{position:relative;color:#34495e;width:30%;-webkit-box-flex:0;-ms-flex:0 0 30%;flex:0 0 30%;font-size:14px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tc-wrapper .prepend_span{display:inline-block;font-weight:700;line-height:3;height:3em;min-width:50px}.tc-wrapper.horizontal_message .message2x1,.tc-wrapper.horizontal_message .message2x2{width:auto;float:none;margin-bottom:18px}.tc-wrapper.horizontal_message .message0x0{background:0;border:0;border-bottom:1px solid #dfdfdf;border-radius:0;margin:0;width:auto;padding:10px}.tc-wrapper .message2x1 span{color:#2e335a;font-weight:700;vertical-align:middle;font-size:15px;margin:0}.tc-wrapper .message2x1 span:hover{color:var(--tc-color)}.tc-wrapper .message2x1 span.tc-pixels{font-size:12px;font-weight:700;color:red}.tc-wrapper .message2x2{position:relative;color:#34495e;width:66%;-webkit-box-flex:0;-ms-flex:0 0 66%;flex:0 0 66%;margin-left:4%}.tc-wrapper .message2x2 textarea{padding:4px;max-width:100%;width:100%;vertical-align:middle;line-height:24px}.tc-wrapper .message2x2 textarea.tm-panel-populate{display:block;height:200px !important;margin:1em;width:50%}.tc-wrapper .message2x2 input[type="text"],.tc-wrapper .message2x2 select{width:50%}.tc-wrapper .message2x2 .builder-logic-div select,.tc-wrapper .message2x2 .shipping-logic-div select{width:auto;min-width:0}.builder-logic-div select,.shipping-logic-div select{border:1px solid #d4d8df !important;outline:none !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#131924 !important;border-radius:5px !important}.tc-wrapper .message2x2 input[type="number"]{width:20%}.tc-wrapper .message2x2 select{color:#3b3460;padding:0 24px 0 8px;min-height:25px;line-height:1}.tc-wrapper .message2x2 .select2-container{min-width:10%;width:50% !important}.tc-wrapper .message2x2 select.fullwidth+.select2-container{width:80% !important}.tc-wrapper .message2x2 .wc-shipping-methods-search+.select2-container,.tc-wrapper .message2x2 .wc-template-search+.select2-container,.tc-wrapper .message2x2 .wc-product-search+.select2-container,.tc-wrapper .message2x2 .wc-category-search+.select2-container,.tc-wrapper .message2x2 .enhanced-dropdown+.select2-container{width:80% !important}.tc-wrapper .message2x2 input.tm-color-picker{padding-top:9px;padding-bottom:9px}.tc-wrapper .message2x2 .select_wrap select{font-size:inherit !important;font-weight:inherit !important;line-height:inherit !important}.tc-wrapper hr{display:block;height:1px;border:0;background:rgba(0,0,0,0.2);margin:18px 0;padding:0}.tc-wrapper .messagexdesc{clear:both;color:#b1b2c1;font-size:12px;font-weight:400;margin:8px 0 0 0;letter-spacing:.5px;width:100%}.tc-wrapper textarea,.tc-wrapper input,.tc-wrapper select{font-size:12px}.wauto .edit{background:#0bf !important;color:#fff}.padding5{padding:5px}.fl-overlay{background:#000;position:fixed;display:block;top:0;left:0;width:100%;height:100%}.fl-overlay.forfullsize{background:#eee}.flasho2{padding:1em;background:none repeat scroll 0 0 #fff;height:100%;overflow:auto;width:100%}.flasho{background:-webkit-gradient(linear,left top,right top,from(#fcfcfd),to(#fbfbfc));background:linear-gradient(to right,#fcfcfd,#fbfbfc);color:#fff;border:1px solid #ededee;left:0;position:absolute;top:0;z-index:101;-webkit-box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);max-height:100%;border-radius:2px;max-width:100%;overflow:hidden;display:grid;grid-template-rows:minmax(1em,auto) minmax(33%,1fr) minmax(1em,auto);gap:0;font-size:13px;line-height:1.4}.flasho.tc-color-error{border-width:4px}.flasho.tc-wrapper .message0x0,.tc-options-group .message0x0{border-radius:0;border-width:1px;border-color:#f1f1f1;border-style:none none dotted;margin:0;height:auto;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.flasho.tc-wrapper .message0x0.noborder,.tc-options-group .message0x0.noborder{border:0}.flasho.tc-wrapper .message0x0:last-child{border:0}.flasho .header{line-height:2;padding:1.5em 2em;width:100%}.flasho .header h3{color:#63728b;font-size:22px;font-weight:700;line-height:28px;margin:0}.flasho .header .tm-element-uniqid{color:var(--tc-color);font-size:12px;background:#fff;position:absolute;right:-1px;top:-1px;padding:1em;line-height:12px;border:1px solid #edf0f3}.flasho .footer{margin:0;padding:0;text-align:right;background:#f4f6f9}.flasho .footer .inner{border-top:1px solid #dbe1eb;padding:1em 2em;position:relative}.float-editbox{position:relative;overflow:auto;max-width:100%;word-wrap:break-word}.tc-question.flasho{border:0;-webkit-box-shadow:0 0 1px 10px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 10px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);background:transparent;width:auto !important;grid-template-rows:minmax(1em,auto) minmax(1em,auto)}.tc-question.flasho .header,.tc-question.flasho .footer{position:static;background:#fff;text-align:center;border-radius:0}.tc-question.flasho .float-editbox{display:none}.tc-question.flasho .header h3{width:100%;text-align:center;float:none}.tc-question.flasho .footer .inner{border:0}.tm-box{padding:0;margin:0 4px 0 0}.tc-wrapper .tm-box.pl{max-width:100% !important;position:relative;min-height:1em}.tc-wrapper .tm-box.pl::after{content:"";position:absolute;background:#e7f5f4 none repeat scroll 0 0;width:calc(100% - 5px);height:calc(100% - 4px);margin:0;border:2px dotted #26a69a !important}.tm-slider-wizard-headers{background:#fff none repeat scroll 0 0;padding:0;border-top:1px solid #c3c4c7;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;overflow:hidden !important;min-height:47px}.tm-slider-wizard-headers::after{content:"";position:absolute;width:100%;height:0;border-bottom:1px solid #c3c4c7;left:0;bottom:0;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:0}.tm-slider-wizard-headers .tm-box{margin:0 -1px 0 0;-ms-flex-negative:0;flex-shrink:0}.tm-slider-wizard-headers .tm-box:first-child{margin:0 -1px}.tm-add-tab{background:transparent;color:var(--tc-color);margin:0;padding:0;position:absolute;top:0;right:0;width:30px;height:100%;border:1px solid #c3c4c7}.tm-slider-wizard-headers .tab-header.open,.tm-slider-wizard-headers .tm-box h4.open{background:#f6f8fa none repeat scroll 0 0;color:var(--tc-color)}.tm-slider-wizard-headers .tm-box h4:hover .tm-del-tab:hover{background:#d00 none repeat scroll 0 0;color:#fff}.tm-slider-wizard-headers .tm-box .tm-del-tab{color:#b4b9c7;-webkit-box-sizing:content-box !important;box-sizing:content-box !important}.tm-slider-wizard-headers .tm-box h4{background:transparent;color:#b4b9c7;margin:0}.float-editbox .tab-header-label{padding:0 10px}.float-editbox .tm-arrow{text-align:center}.float-editbox .tm-arrow,.float-editbox .tab-header-label,.float-editbox .tab-header-icon{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.float-editbox .tm-box h4:focus{outline:0;color:var(--tc-color);border-width:1px 1px 0 1px;border-color:#c3c4c7;border-style:dotted}.float-editbox .tm-box h4.open,.float-editbox .tm-box h4.open:focus{color:var(--tc-color);background-color:#fff;border-width:1px 1px 0 1px;border-color:#c3c4c7;font-weight:700;border-style:solid;line-height:51px;margin:0 0 -1px 0}.float-editbox .tm-box h4.open::before,.float-editbox .tm-box h4.open::after{content:"";display:block;position:absolute;border-bottom:1px solid #c3c4c7;bottom:0;height:0;width:999em;-webkit-box-sizing:border-box;box-sizing:border-box}.tm-box h4.tm-slider-wizard-header::after{content:"";display:block;position:absolute;border:1px solid #c3c4c7;top:-1px;height:calc(100% + 1px);width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:2;left:0;pointer-events:none}.tm-box h4.tm-slider-wizard-header.open::after{border-bottom-color:#f6f8fa}.float-editbox .ui-sortable-helper .tm-box h4.open::before,.float-editbox .ui-sortable-helper .tm-box h4.open::after{border:0}.ui-sortable-helper.tm-box h4.tm-slider-wizard-header::after{border:1px dotted #c3c4c7}.float-editbox .tm-box h4.open::before{right:100%}.float-editbox .tm-box h4.open::after{left:100%}.tm-box h4.tm-slider-wizard-header{padding:0 2.5em 0 2em;margin:0;position:relative;cursor:pointer;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-edit-tab{margin:0 .5em}.float-editbox .tm-box h4{color:#9b96b5;font-weight:700;line-height:43px;margin:7px 0 -1px 0;padding:0 15px;cursor:pointer;font-size:15px;white-space:nowrap;position:relative;border-width:1px 1px 0 1px;border-style:solid;border-color:#e2e6e7;display:-webkit-box;display:-ms-flexbox;display:flex;letter-spacing:-0.4px;background:#fafafa}.float-editbox .tm-tab-headers{position:relative;z-index:100;width:auto;min-height:auto;padding:0 2.2em;float:none;display:-webkit-box;display:-ms-flexbox;display:flex;height:52px;overflow:hidden !important}.tm-slider-wizard-headers.has-scroll-arrows,.float-editbox .has-scroll-arrows.tm-tab-headers{margin:0;padding:0;max-width:calc(100% - 60px) !important;left:30px}.tc-tab-headers-wrap{position:relative;margin-bottom:20px}.tc-scroll-left-arrow,.tc-scroll-right-arrow{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;cursor:pointer;padding:0;line-height:1;width:1em;text-align:center;height:100%;top:0;z-index:102;color:#9b96b5}.tc-scroll-left-arrow.scroll-arrow-show,.tc-scroll-right-arrow.scroll-arrow-show{display:block;border:1px solid;height:100%;width:30px}.tc-scroll-left-arrow{left:0}.tc-scroll-right-arrow{right:0}.has-add-button .tm-slider-wizard-headers.has-scroll-arrows,.float-editbox .has-add-button .has-scroll-arrows.tm-tab-headers{max-width:calc(100% - 89px) !important}.has-add-button .tc-scroll-right-arrow{right:29px}.tm-add-tab .tmicon,.tc-scroll-left-arrow::before,.tc-scroll-right-arrow::before{line-height:1;-webkit-transform:translateY(-50%);transform:translateY(-50%);top:50%;padding:0;margin:0;position:absolute;left:0;right:0}.tc-scroll-left-arrow::before{content:"\25C0"}.tc-scroll-right-arrow::before{content:"\25B6"}.tm-box h4:hover,.tm-slider-wizard-headers .tm-box h4.open:hover{color:var(--tc-color)}.tm-del-tab{font-size:12px !important;padding:3px !important;position:absolute;right:2px;top:2px;width:1em;height:1em;line-height:1;text-align:center;margin:0;background:transparent}#tc-product-search .inside>h3{font-size:1em}#settingsdiv .inside #misc-publishing-actions label,#tc-product-search .inside>label{display:block;margin-bottom:5px}#tc-product-search .chosen-container-multi,#tc-product-search .select2-container-multi{width:100% !important}#tc-product-search .ajax_chosen_select_tm_product_ids{display:none}.tc-wrapper .message0x0 .onerow+.onerow{margin-top:2%}.tc-wrapper .message0x0 .onerow{float:none;width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0}.tc-wrapper .multiple_options{border-bottom:4px solid #f5f2fc;padding-bottom:1em;padding-left:1em;padding-right:1em}.tc-cell.tm_cell_delete{padding:0 !important;-ms-flex-item-align:start;align-self:flex-start}.tc-wrapper .options-wrap{padding:2em 1em;margin:0 0 2em 0;background:#fdfdfd;border:1px solid #e6e9ed;border-radius:10px}.tc-wrapper .options-wrap.ui-sortable-helper{background:linear-gradient(45deg,#fafcfc 0,#f6f9f9 50%,#f8fbfb 100%) !important;border:1px solid #b6bbc3;color:#fff;-webkit-box-shadow:0 10px 20px 0 rgba(0,0,0,0.2);box-shadow:0 10px 20px 0 rgba(0,0,0,0.2)}.tc-wrapper .panel_wrap.pl{max-width:100% !important;margin-left:-4px;margin-bottom:1em;position:relative;min-height:4em}.tc-wrapper .panel_wrap.pl::after{content:"";position:absolute;background:#e7f5f4 none repeat scroll 0 0;width:calc(100% - 4px);height:calc(100% - 4px);margin:2px 18px 0 4px;border:2px dotted #26a69a}.multiple_options .tm_cell_default{text-align:center}.tc-wrapper .options-wrap .tm-inline-label+input[type="text"],.tc-wrapper .options-wrap .tm-inline-label+input[type="number"]{width:92%}.tm_upload_image{border:1px solid #8c8f94;display:inline-block;height:24px !important;overflow:hidden;position:relative;vertical-align:middle;width:24px !important}.tm-attribute .tm_upload_image{height:5.3em !important;margin-left:1em;position:absolute;top:-1.2em;width:5.3em !important}.tm_upload_image img.tm_upload_image_img{height:auto;left:0;position:absolute;top:0;width:100%;right:0;bottom:0;margin:auto}.withupload+.tc-upload-button+.tm_upload_image{background:#fff}.withupload+.tc-upload-buttonc+.tm_upload_image.tm_upload_imagec{background:#fff}.withupload+.tc-upload-buttonp+.tm_upload_image.tm_upload_imagep{background:#fff}.withupload+.tc-upload-button,.cp-button{border-radius:0 !important;-webkit-box-shadow:none !important;box-shadow:none !important;background-color:#1abc9c;border:1px solid #8c8f94 !important;color:#fff;cursor:pointer;display:inline-block;font-size:10px;height:24px !important;line-height:24px;margin-right:1px;overflow:hidden;padding:0;position:relative;text-align:center;text-transform:uppercase;vertical-align:middle;width:24px !important}.withupload+.tc-upload-buttonp{background-color:#e67e22}.withupload+.tc-upload-buttonl{background-color:#3498db}.withupload{padding-right:63px !important}.builder-image-delete{position:absolute;top:0;right:0;width:100%;background:red;height:100%;line-height:1.5;padding:0 !important;color:#fff;opacity:.9;display:none}.tm_upload_image:hover .builder-image-delete{display:block}.tc-wrapper .options-wrap input.tm_option_price,.tc-wrapper .options-wrap input.tm_option_sale_price{width:90px !important;margin-right:.5em !important}.tc-wrapper .options-wrap select.tm_option_price_type{vertical-align:middle;width:150px !important}.tc-wrapper .options-wrap input.tm_option_price,.tc-wrapper .options-wrap input.tm_option_sale_price,.tc-wrapper .options-wrap input.tm_option_title,.tc-wrapper .options-wrap select.tm_option_price_type{border-top-left-radius:0 !important;border-color:#8c8f94}.tm_cell_delete{margin-left:auto !important}.tm-default-checkbox,.tm-default-radio{left:50%;margin-left:-0.5em !important;position:absolute;top:1em}.tc-cell-url .tm_option_url,.tm_cell_description .tm_option_description,.tm_cell_display .tm_option_display{width:92% !important;margin:0 !important}.tm_cell_enabled .tm_option_enabled{width:auto !important;margin:0 !important}.tm-inline-label{display:inline-block;font-weight:300;padding-right:1em;text-align:right;width:8%}.tm-hidden-inline{display:inline-block;visibility:hidden}.tm_cell_images span.tm_upload_image,.tm_cell_images .withupload+.tc-upload-button{max-width:15% !important}.tm_cell_images .tc-button.small{width:28px;line-height:28px;border-radius:0}.tm-logic-rule{margin:1em 0 !important;gap:1em;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.float-editbox .tm-tab{bottom:0;display:none;left:0;overflow:auto;position:absolute;right:0;top:52px;width:100%;z-index:1;background:#fff}.tm-tabs{overflow:hidden;position:relative}.float-editbox .tm-tabs{bottom:0;left:0;position:absolute;right:0;top:0;width:100%}.tc-progress-bar{padding:1em 2em}.tc-progress-info{padding:2em}.tc-percent{bottom:0;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:2em;height:2em;left:auto;line-height:1;margin:auto;right:.5em;text-align:center;top:0;width:auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-progress-info-content{display:block;font-size:2em;line-height:1;margin:auto;text-align:center}.tc-normalize.tc-progress-info-content{font-size:1em;height:auto;overflow:auto}.tm-inner{margin:1em 2.2em;color:#2e335a}.tm-error .header{background:none repeat scroll 0 0 #dd3d36}.tm-error .header h3{color:#fff}.tm-error .tm-inner{color:#c0392b}.tm-icon{margin-right:.5em}#tm-tooltip{font-family:Roboto,Arial,sans-serif;font-size:.875em;text-align:center;text-shadow:0 1px rgba(0,0,0,0.5);line-height:1.5;color:#fff;background:#333;background:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,0.6)),to(rgba(0,0,0,0.8)));background:linear-gradient(to top,rgba(0,0,0,0.6),rgba(0,0,0,0.8));border-radius:5px;-webkit-box-shadow:0 3px 5px rgba(0,0,0,0.3);box-shadow:0 3px 5px rgba(0,0,0,0.3);position:absolute;z-index:145400;padding:15px;pointer-events:none}#tm-tooltip::after{width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #333;content:"";position:absolute;left:50%;bottom:-10px;margin-left:-10px}#tm-tooltip.top::after{border-top-color:transparent;border-bottom:10px solid #333;border-bottom-color:rgba(0,0,0,0.6);top:-20px;bottom:auto}#tm-tooltip.left::after{left:10px;margin:0}#tm-tooltip.right::after{right:10px;left:auto;margin:0}.builder_actions{float:left;text-align:center;width:20%}.column-tm_icl_translations{text-align:center !important;min-width:64px !important}.tm_icl_translations.column-tm_icl_translations>img{height:auto;width:16px;vertical-align:middle}.tm_icl_translations.column-tm_icl_translations>a.tmwpmllink{display:inline-block;font-size:16px;margin-left:4px;min-width:18px !important;vertical-align:middle}.tm-icl-space{display:inline-block;margin-left:4px;min-width:18px !important;vertical-align:middle}.tc-wmpl-flag{width:16px;height:16px}.tm-meta-wpml-lang{padding:6px 0 8px}.tm-meta-wpml-translation{border-top:1px solid #ddd;padding:6px 0 8px}.tm-title{background:none repeat scroll 0 0 #fcfcfc;clear:both;padding:6px 10px 8px;margin-top:1px}.tm-title.added{background:none repeat scroll 0 0 #f5f5f5}.tm-title:first-child{margin-top:5px}.tm-title .tmwpmllink{float:right}.tm-weekdays-picker{font-size:10px;font-weight:700;border:1px solid transparent;margin:0 3px 0 0;padding:8px;color:#a8b0c0;background:#ececee;border-radius:5px}.tm-months-picker{font-size:10px;font-weight:700;border:1px solid transparent;margin:0 3px 0 0;padding:8px;color:#a8b0c0;background:#e9ebef;border-radius:5px}.tm-weekdays-picker.tm-checked,.tm-months-picker.tm-checked{-webkit-box-shadow:0 6px 8px -8px rgba(0,0,0,0.5);box-shadow:0 6px 8px -8px rgba(0,0,0,0.5);background:none repeat scroll 0 0 var(--tc-color);color:#fff;border:1px solid #dfdfdf}.tm-weekdays-picker>label,.tm-month-picker>label{vertical-align:baseline}input.tm-weekday-picker,input.tm-month-picker{display:none}.tm-weekday-picker,.tm-month-picker{vertical-align:middle}.tm-weekdays-picker span,.tm-months-picker span{vertical-align:middle}.tc-wrapper .message0x0 .onerow2{background:none repeat scroll 0 0 #fcfcfc;float:none;margin:2% 0 0 0;padding:1px;width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}.justify-content-flex-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tma-handle-wrap{background:none repeat scroll 0 0 #fff;border:1px solid #ecf0f1;margin:1em}.tma-handle{background:none repeat scroll 0 0 #ecf0f1;color:#555;cursor:pointer;font-size:12px;height:40px;line-height:40px;padding:0 1em;position:relative}.tm-attribute>.tma-handle{background:none repeat scroll 0 0 #7f8c8d;color:#fff}.tma-attribute_label{font-weight:700}.tm-border-type{background:none repeat scroll 0 0 #fff;border:0 solid;height:50px;margin-top:-25px;position:absolute;right:50px;top:50%;width:50px;border-color:inherit;border-width:1px;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.3)}.tm-border-type.circle{border-radius:100%;border-width:1px;-webkit-box-shadow:none;box-shadow:none}.tm-border-type.round{border-radius:5px;border-width:1px;-webkit-box-shadow:none;box-shadow:none}.tm-border-type.square{border-radius:0;-webkit-box-shadow:none;box-shadow:none;border-width:2px}.tm-border-type.shadow{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,0.5);box-shadow:0 1px 4px 0 rgba(0,0,0,0.5);border-width:1px}.tm-border-type.thinline{border-width:1px;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.tm-choice-currency,.tc-wrapper .message2x1 span.tm-choice-currency{background:#2c3e50 none repeat scroll 0 0;border:1px solid;color:#ecf0f1;font-size:12px;line-height:12px;margin-right:2px;padding:1px 2px;vertical-align:0 !important}.tm-choice-cl,.tm-choice-pt,.tm-choice-from,.tm-choice-to,.tm-choice-sale,.tm-choice-regular{font-size:10px;font-weight:700;line-height:10px;padding:3px 4px;position:absolute;text-align:left;text-transform:uppercase;top:-9px;margin-left:1px;width:auto;border:1px solid #e3e5ed}.tm-choice-sale{border-color:#ff0025;background:#ff0025;color:#fff}.tm-choice-pt{border-color:#3b3460;background:#3b3460;color:#fff}.tm-choice-cl{border-color:#8c8f94;background:#8c8f94;color:#fff}.tm-choice-regular{border-color:#8b65dd;background:#8b65dd;color:#fff}.tc-welcome{padding:40px 0;display:none;background:#fff}.tc-info-text{color:#3b3462;font-size:36px;font-weight:300;line-height:1.5;padding:40px 0;text-align:center}.tm-mode-local .tc-info-text{padding:2em;color:red}.tc-warning-text{color:#d00;font-size:12px;font-weight:400;line-height:1;white-space:pre-line;padding-top:10px}.tc-buttons{text-align:center}.wp-core-ui .tc-wrapper .tc-buttons .tc-button{height:auto;line-height:1;margin:.5em;padding:1.2em 2.5em}.wp-core-ui .tc-wrapper .tc-button.builder-fullsize,.wp-core-ui .tc-wrapper .tc-button.builder-fullsize-close{border:0}.wp-core-ui .tc-wrapper .tc-button.tc.disabled.tc-add-import-csv{pointer-events:none;background:#eee none repeat scroll 0 0 !important;color:#aaa !important}.wp-core-ui .tc-wrapper .tc-button.tc.disabled.tc-add-import-csv .tc-warning-text{color:#d00 !important;max-width:200px}.wp-core-ui .tc-wrapper .tc-button.builder_add_variation{background:#ed8458 none repeat scroll 0 0 !important;color:#fff0e5 !important}.wp-core-ui .tc-wrapper .tc-button.tc::after{-webkit-transition:all .4s cubic-bezier(0.19,0.83,0.57,0.91);transition:all .4s cubic-bezier(0.19,0.83,0.57,0.91);display:block;content:"";background:transparent;width:100%;height:100%;position:absolute;left:0;top:0;-webkit-transform:scale(0);transform:scale(0)}.wp-core-ui .tc-wrapper .tc-button:hover::after{background:rgba(0,0,0,0.1);width:100%;z-index:2;-webkit-transform:scale(2);transform:scale(2)}.tc-info-box,.tc-info{margin-bottom:22px;padding:9px 12px;text-align:center;font-weight:400;border:1px solid;background:0}.tc-info-box.tc-error,.tc-info.tc-error{background-color:#d00;border-color:#d00;color:#fff}.tc-info-box.tc-all-products{background-color:#fff;border-color:var(--tc-color);color:var(--tc-color)}#tc-enabled-options,#tc-disabled-options{width:100% !important}.tc-admin-textarea{width:100%;min-height:150px;font-family:monospace}.tc-color-active{color:#2ecc71}.tc-color-error{color:#d00}.tc-error{background-color:#d00}.tc-color-notice{color:var(--tc-color)}.tc-notice{background:-webkit-gradient(linear,left top,right top,from(#29cae4),to(var(--tc-color)));background:linear-gradient(to right,#29cae4,var(--tc-color))}.tc-color-success{color:#58cfbf}.tc-success{background:#58cfbf}.toast-success{background-color:var(--tc-color);opacity:1 !important}.toast-error{background-color:#d00}#toast-container>div{-webkit-box-shadow:none;box-shadow:none}.toast-title{color:#fff}.toast-success .toast-message{color:#eee}button.tc.tc-button.details-override{background:#d00}.tc-add-element .tcfa,.builder_add_section .tcfa,.builder_add_variation .tcfa{margin-right:5px}.tc-wrapper .tc-element-setting-edit-tab{width:100%}.tc-wrapper .tc-element-setting-edit-price{width:100%;height:10em;font-size:18px;line-height:30px;padding:14px;font-family:monospace}.tc-wrapper .tc-element-setting-edit-price.formula-error{border:2px solid #ff0025;color:#ff0025}.tc-wrapper .tc-element-setting-edit-price.formula-correct{border:2px solid #38bb5d;color:#38bb5d}.tc-price-variables{margin:1em 0 0 0}.tc-var-header{color:var(--tc-color);padding:3px;font-weight:400;font-size:15px;margin:0 0 3px 0}ul.tc-var-list{display:block;margin:0 0 1em 0}li.tc-var-field{width:auto;display:inline-block;margin:1px;cursor:pointer;letter-spacing:0;color:var(--tc-color);border:1px solid #d8e8ff;font-size:.9em;padding:4px 6px;background:#f2f1fa;border-radius:4px}li.tc-var-field:hover{border-color:var(--tc-color)}.floatbox-open{overflow:hidden}.floatbox-loading{color:var(--tc-color);position:absolute;width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default .select2-selection--single,.tc-wrapper input.regular-input,.tc-wrapper input[type="date"],.tc-wrapper input[type="datetime-local"],.tc-wrapper input[type="datetime"],.tc-wrapper input[type="email"],.tc-wrapper input[type="number"],.tc-wrapper input[type="password"],.tc-wrapper input[type="tel"],.tc-wrapper input[type="text"],.tc-wrapper input[type="time"],.tc-wrapper input[type="url"],.tc-wrapper input[type="week"],.tc-wrapper textarea{border-radius:3px !important;background:#fff;-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;border:1px solid #e3e5ed;padding:8px 16px;line-height:36px;font-size:13px;height:auto;color:#3b3460;margin:1px;outline:0;-webkit-transition:.05s border-color ease-in-out;transition:.05s border-color ease-in-out;-webkit-box-sizing:border-box;box-sizing:border-box}.tc-wrapper .options-wrap input[type="text"],.tc-wrapper .options-wrap input[type="number"]{width:98%;line-height:1 !important;padding:0 6px;min-height:25px;margin-top:0;margin-bottom:0;vertical-align:middle}.tc-wrapper input::-webkit-input-placeholder{color:#ccc}.tc-wrapper input::-moz-placeholder{color:#ccc}.tc-wrapper input:-ms-input-placeholder{color:#ccc}.tc-wrapper input::-ms-input-placeholder{color:#ccc}.tc-wrapper input::placeholder{color:#ccc}.tc-wrapper .select2-container.select2-container--disabled .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--disabled .select2-selection--single{background:#ecf0f1 !important}.tc-wrapper input[type="text"]:-webkit-autofill,.tc-wrapper input[type="text"]:-webkit-autofill:hover,.tc-wrapper input[type="text"]:-webkit-autofill:focus,.tc-wrapper input:-webkit-autofill:active{-webkit-box-shadow:0 0 0 1000px #fff inset !important;box-shadow:0 0 0 1000px #fff inset !important}.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default .select2-selection--single{padding:8px 16px;line-height:36px;margin:0}.tc-wrapper input[type="number"]{padding-right:6px}.tc-wrapper .select2-container{font-size:13px !important;display:block;height:auto !important;line-height:36px !important;padding:0 !important;-webkit-box-sizing:border-box;box-sizing:border-box}.tc-wrapper .select2-container .select2-selection--single{border-radius:3px !important;background:#fff !important;-webkit-box-shadow:0 4px 10px 4px rgba(0,0,0,0.02) !important;box-shadow:0 4px 10px 4px rgba(0,0,0,0.02) !important;border:1px solid #e3e5ed;padding:0 16px;line-height:36px;font-size:14px;height:auto}.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__clear{display:none}.tc-wrapper .select2-container .select2-selection__rendered{min-height:36px !important;height:auto !important;padding:0 36px 0 0 !important;display:block !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#3b3460 !important;line-height:36px !important}.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow{height:36px !important;line-height:36px !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#6a7a90 !important;width:36px;background:0;position:absolute;border:0;top:9px;right:17px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow::after{font-weight:900;font-family:tc-fontawesome,sans-serif;content:"\f107"}.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow::after{color:var(--tc-color)}.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow b{display:none;border-color:transparent}.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent}.wp-admin .select2-container--open .select2-dropdown.tc-dropdown{border:1px solid var(--tc-color);margin-top:-1px;padding:16px 8px;-webkit-box-shadow:none;box-shadow:none;background:#fff;z-index:999999 !important}.wp-admin .select2-container--open .select2-dropdown.tc-dropdown.select2-dropdown--above{margin-top:1px}.wp-admin .select2-container--open .select2-dropdown.tc-dropdown .select2-search--dropdown{padding:0 0 8px 0;position:relative}.wp-admin .select2-dropdown.tc-dropdown .select2-results{padding:0;margin:0}.wp-admin .select2-container--default .select2-search--dropdown::before{content:"\f179";position:absolute;right:16px;font-family:dashicons,sans-serif;font-size:16px;width:16px;height:16px;line-height:16px;display:block;top:10px}.wp-admin .select2-container--default .select2-search--dropdown input{height:36px !important;padding:0 28px 0 8px;border:1px solid #d2dae3;margin:0 !important;background:0;border-radius:3px;-webkit-box-shadow:none;box-shadow:none}.wp-admin .select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #d2dae3}.wp-admin .select2-dropdown.tc-dropdown .select2-results li{margin:8px 2px 8px 0;border-radius:3px;padding:0}.wp-admin .select2-dropdown.tc-dropdown .select2-results .select2-results__group,.wp-admin .select2-dropdown.tc-dropdown .select2-results .select2-results__option{margin:0;padding:8px 0}.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option{padding:0 8px;line-height:36px;min-height:36px;height:auto;outline:none !important;margin:0}.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results__option[aria-selected="true"],.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option[data-selected="true"]{background-color:transparent;color:var(--tc-color)}.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option--highlighted[aria-selected]{background-color:var(--tc-color);color:#fff}.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results__option:focus,.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results>.select2-results__options:focus{outline:none !important}.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--single,.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single,.tc-wrapper textarea:focus,.tc-wrapper input.regular-input:focus,.tc-wrapper input[type="date"]:focus,.tc-wrapper input[type="datetime-local"]:focus,.tc-wrapper input[type="datetime"]:focus,.tc-wrapper input[type="email"]:focus,.tc-wrapper input[type="number"]:focus,.tc-wrapper input[type="password"]:focus,.tc-wrapper input[type="tel"]:focus,.tc-wrapper input[type="text"]:focus,.tc-wrapper input[type="time"]:focus,.tc-wrapper input[type="url"]:focus,.tc-wrapper input[type="week"]:focus{-webkit-box-shadow:0 1px 8px 1px rgba(0,0,0,0.1) !important;box-shadow:0 1px 8px 1px rgba(0,0,0,0.1) !important;color:var(--tc-color);border:1px solid var(--tc-color)}.tc-wrapper .select2-container.select2-container--default.select2-container--above.select2-container--open .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--above.select2-container--open .select2-selection--single{border-radius:0 0 3px 3px !important}.tc-wrapper .select2-container.select2-container--default.select2-container--below.select2-container--open .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--below.select2-container--open .select2-selection--single{border-radius:3px 3px 0 0 !important}.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--multiple,.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--single,.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single{-webkit-box-shadow:none;box-shadow:none;outline:0}.tc-wrapper .select2-container.select2-container--disabled.select2-container--focus .select2-selection--single,.tc-wrapper .select2-container.select2-container--disabled.select2-container--open .select2-selection--single{border:solid #e3e5ed 1px !important;outline:0;-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important;box-shadow:0 4px 5px 0 rgba(0,0,0,0.02) !important}.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice{line-height:16px;margin:5px 5px 5px 0;padding:.5em;border:1px solid #b39ce1;background:#f5f2fc;-webkit-box-shadow:none;box-shadow:none;color:var(--tc-color);max-width:100%;text-overflow:ellipsis;overflow:hidden}.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__rendered li{line-height:16px;margin:5px 1px 5px 0;padding:.5em;border:1px solid transparent;background:0;-webkit-box-shadow:none;box-shadow:none;color:var(--tc-color)}.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__rendered li:first-of-type.select2-search.select2-search.select2-search--inline{width:100%}.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#d00;cursor:pointer;display:inline-block;font-weight:700;float:right;margin-left:.5em}.tc-wrapper .select2-container .select2-selection--multiple .select2-search__field{-webkit-box-shadow:none !important;box-shadow:none !important;border:0 !important;margin:1px -0.5em;padding:0 .5em !important;width:100% !important;min-height:0 !important;line-height:1 !important;background-image:none !important}.select2-container--default .tc-dropdown .select2-results__option[aria-disabled="true"]{color:#ddd}.align-self-start{-ms-flex-item-align:start;align-self:start}.formula-field-mode-selector .tc-radio-text{padding:5px 10px;margin:0 -1px 6px 0 !important}.tc-wrapper input.cpf-logic-value{padding:0 8px;line-height:21px;min-height:25px;margin:0;border:1px solid #d4d8df !important;outline:none !important;-webkit-box-shadow:none !important;box-shadow:none !important;color:#131924 !important;border-radius:5px !important}.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar{background:#eae8f2;width:8px}.float-editbox .tm-tab::-webkit-scrollbar{background:#eae8f2;width:14px}.float-editbox .tm-tab::-webkit-scrollbar-button,.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-button,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-button{background:#eae8f2}.float-editbox .tm-tab::-webkit-scrollbar-thumb,.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-thumb,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-thumb{background:var(--tc-color) -webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,0.01)),to(rgba(0,0,0,0.2)));background:var(--tc-color) linear-gradient(to top,rgba(0,0,0,0.01),rgba(0,0,0,0.2))}.float-editbox .tm-tab::-webkit-resizer,.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-resizer,.woocommerce .tc-wrapper table.form-table textarea::-webkit-resizer{background:transparent}.float-editbox .tm-tab::-webkit-scrollbar-corner,.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-corner,.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-corner{background:transparent}.float-editbox .tm-tab,.select2-dropdown.tc-dropdown ul.select2-results__options,.woocommerce .tc-wrapper table.form-table textarea{scrollbar-color:var(--tc-color) #eae8f2;scrollbar-width:thin}.blockUI.blockOverlay{background:#fff !important}.select2-container--open:not(.select2){z-index:199999 !important}.tc-filter-content{position:absolute;width:calc(100% - 44px);margin-top:9px;margin-left:2px;border:1px solid;background:#fff;left:0;padding:.5em 10px;display:none}.tc-filter-content select{margin-top:.5em;margin-bottom:.5em}.button.tc-filter-label{margin:0 8px 0 0;line-height:30px;display:inline-block}input.tc-filter-toggle{display:none}input.tc-filter-toggle:checked+.tc-filter-label+.tc-filter-content{display:block}input.tc-filter-toggle+.tc-filter-label .tc-filter-hide{display:none}input.tc-filter-toggle:checked+.tc-filter-label .tc-filter-hide{display:inline}input.tc-filter-toggle:checked+.tc-filter-label .tc-filter-show{display:none}assets/css/admin/tcpagination.min.css000064400000002534150755142440013715 0ustar00.tcpagination{display:inline-block;padding-left:0;margin:1em 0;border-radius:4px}.tcpagination ul{margin:0}.tcpagination ul>li{display:inline;margin:0}.tcpagination ul>li>a,.tcpagination ul>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#b8b5c6;text-decoration:none;background-color:#fff;border:1px solid #ddd}.tcpagination ul>li:first-child>a,.tcpagination ul>li:first-child>span{margin-left:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.tcpagination ul>li:last-child>a,.tcpagination ul>li:last-child>span{border-top-right-radius:5px;border-bottom-right-radius:5px}.tcpagination ul>li>a:hover,.tcpagination ul>li>span:hover,.tcpagination ul>li>a:focus,.tcpagination ul>li>span:focus{z-index:3;color:#683ebd;background-color:#eee;border-color:#ddd}.tcpagination ul>.active>a,.tcpagination ul>.active>span,.tcpagination ul>.active>a:hover,.tcpagination ul>.active>span:hover,.tcpagination ul>.active>a:focus,.tcpagination ul>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#3d72de;border-color:#3d72de}.tcpagination ul>.disabled>span,.tcpagination ul>.disabled>span:hover,.tcpagination ul>.disabled>span:focus,.tcpagination ul>.disabled>a,.tcpagination ul>.disabled>a:hover,.tcpagination ul>.disabled>a:focus{color:#f2f1fa;cursor:not-allowed;background-color:#fff;border-color:#ddd}assets/css/admin/tm-lookup-table-admin.min.css000064400000003754150755142440015344 0ustar00.builder-layout.builder-lookuptable{margin:2em 0}.builder-import-file{position:absolute}.tc-add-export-csv{display:none}.container-lookup-table{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0}.wrap-lookup-table{width:100%;overflow:auto}.lookuptable-name{font-size:1.5em;background:#fff;padding:.5em;border:1px solid rgba(0,0,0,0.1)}.table-name,.table-index{-webkit-box-flex:0;-ms-flex:0 1 50%;flex:0 1 50%}.table-name,.table-index,.lookuptable-name{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.table-name-label,.table-index-label{font-size:.5em;background:#36304a;color:#fff;display:inline-block;padding:.2em .4em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.table-name-value,.table-index-value{-webkit-box-flex:1;-ms-flex:1 0 100%;flex:1 0 100%}table{width:100%;background-color:#fff;border-collapse:collapse}.row.head th{padding:1em}.row td{padding:1em}.lookup-table-wrap.epo{font-size:1em;margin-bottom:2em;width:100%;overflow:auto}.lookup-table-wrap.epo td{color:gray;line-height:1.4;border:1px solid rgba(0,0,0,0.1);text-align:center;cursor:default}.lookup-table-wrap.epo th,.lookup-table-wrap.epo .ltcell.column1{color:#fff;line-height:1.4;text-align:center;background-color:#36304a;font-weight:700;border:1px solid rgba(255,255,255,0.1)}.lookup-table-wrap.epo th.ltcell,.lookup-table-wrap.epo td.ltcell.column1{pointer-events:none}.lookup-table-wrap.epo .row:hover{background-color:#f2f2f2}.lookup-table-wrap.epo .hov-column-epo{background-color:#f2f2f2}.lookup-table-wrap.epo .hov-column-head-epo{background-color:#484848 !important}.lookup-table-wrap.epo .row td:hover{background-color:#6c7ae0;color:#fff}assets/css/admin/tm-epo-admin.css000064400000021610150755142450012737 0ustar00#tc-admin-extra-product-options {
	background: none repeat scroll 0 0 #fff;
	border: 0 none !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	border-radius: 0 !important;
	margin: 0 !important;
	font-family: Roboto, "Open Sans", Helvetica, Arial, sans-serif;
}

#tc-admin-extra-product-options * {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

#woocommerce-product-data ul.wc-tabs li.tc-epo-woocommerce-tab a::before {
	font-family: tc-fontawesome, sans-serif;
	content: "\f009";
	font-weight: 900;
}

#tc-admin-extra-product-options .wc-enhanced-select input {
	display: block;
}

#tc-admin-extra-product-options .select2-container,
#tc-admin-extra-product-options .text {
	width: 100% !important;
}

#tc-admin-extra-product-options .overflow-show {
	overflow: visible !important;
}

.tmcp-pricing label {
	width: 100%;
}

.tm-options > label {
	width: 100%;
	font-weight: 700;
}

/* !important for 2.3 compatibility */
.tc-options-group label {
	display: inline-block;
	float: none !important;
	margin: 0 !important;
	max-width: 80% !important;
	padding: 0 !important;
	vertical-align: top;
	width: auto !important;
}

.woocommerce-tmcp-attributes .form-row > label {
	font-weight: 700;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x2 {
	width: auto;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 66%;
	flex: 0 0 66%;
	max-width: 66%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x2 label {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 calc(25% + 1px);
	flex: 0 0 calc(25% + 1px);
	max-width: calc(25% + 1px) !important;
	margin-left: -1px !important;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.tm-epo-switch-wrapper .message2x2 label .tc-radio-text {
	min-width: 100%;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x3,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x4,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x5 {
	width: auto;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	margin-left: 34%;
	max-width: 15%;
	display: none;
	position: relative;
	margin-top: 2em;
	min-width: 25%;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x4,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .message2x5 {
	margin-left: 4%;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-from,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-to,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-sale,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .tm-choice-regular {
	top: -17px;
	margin-left: 1px;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .tm-choice-from,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .tm-choice-from,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .tm-choice-regular {
	display: none;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .message2x3,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-price .message2x5,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .message2x3,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-from .message2x5,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .message2x3,
#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap.mode-range .message2x4 {
	display: block;
}

#tc-admin-extra-product-options .tc-wrapper .price-display-mode-wrap .text {
	padding: 1em 16px;
	line-height: 1;
	font-size: 1em;
	text-align: center;
}


.tm-mode-builder .builder-selector {
	border-width: 0 0 1px 0;
	margin: 0;
}

.tm-mode-builder .builder-layout {
	border-width: 1px 0;
}

.epo-option-image {
	max-height: 100px;
	height: auto;
	width: auto;
}

.tmcp-price-input {
	width: 100px !important;
}

.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox h3 {
	padding: 10px 20px !important;
	cursor: pointer;
	line-height: 30px;
}

.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox .woocommerce-tmcp-attributes.wc-metabox-content {
	padding: 10px 20px !important;
}

.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox .tmicon {
	float: right;
}

.wc-metaboxes-wrapper .tc-normal-epo.wc-metabox.closed .fold::before {
	content: "\f0d7";
}

.tc-normal-epos .tmicon.fold {
	background: none;
	color: #b4b9c7;
	border-radius: 100%;
}

.tc-normal-epos .tmicon.fold:hover {
	background: #b4b9c7;
	color: #fff;
}

.wc-metaboxes-wrapper .wc-metabox select.tmcp-price-input-type {
	position: relative;
	top: -2px;
	width: auto !important;
}

.tm-mode-select {
	text-align: center;
}

.tm-mode-select.title {
	font-size: 1.5em;
	font-weight: 300;
	margin-top: 2em;
}

.tc-select-mode {
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	border-radius: 0 !important;
	background: none repeat scroll 0 0 transparent !important;
	border-color: #f5f5f4 !important;
	-o-border-image: none !important;
	border-image: none !important;
	border-style: solid !important;
	border-width: 0 0 1px !important;
	color: #b8c4d6 !important;
	font-size: 3em !important;
	height: 3em !important;
	line-height: 3 !important;
	margin: 20px 0 !important;
	padding: 0 !important;
	text-align: center;
	width: 50%;
	display: none !important;
}

.tm-mode-builder,
.tm-mode-local {
	display: none;
}

.tm-mode-local.tc-wrapper {
	background: #fff;
}

.tc-options-group {
	background: none repeat scroll 0 0 #fff;
	border-top: 0 solid #ecf0f1;
	margin-top: 0;
	padding: 0 !important;
	margin-right: 0;
	margin-left: 0;
	margin-bottom: 0;
	width: 100% !important;
}

.tc-options-group .woocommerce-help-tip {
	float: right;
	top: 3px;
}

.tc-options-group .woocommerce-help-tip::after {
	content: "\f059";
	font-family: tc-fontawesome, sans-serif;
}

.tm-mode-selector + div + div + .tc-options-group {
	display: none;
}

.tm-mode-selector.tc-active + div + div + .tc-options-group {
	display: block;
}

.tm-mode-selector.tc-active .tm-mode-select.title {
	display: none;
}

.tm-mode-selector.tc-active .tm-mode-select {
	margin: 0;
	padding: 20px 20px 0 20px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	border-bottom: 1px solid #c3c4c7;
	height: 80px;
}

.tm-mode-selector.tc-active .tc-select-mode {
	border-radius: 0 !important;
	border: 0 none !important;
	font-size: 15px !important;
	font-weight: 400;
	height: 60px !important;
	line-height: 60px !important;
	margin: 0 !important;
	width: 20% !important;
	display: block !important;
}

.tm-mode-selector.tc-active .tc-select-mode.tc-settings-select {
	width: 20% !important;
}

.tm-mode-selector.tc-active .tc-select-mode:hover {
	color: var(--tc-color) !important;
}

.tm-mode-selector.tc-active .tm-hidden {
	display: none !important;
}

.tm-mode-selector.tc-active .tc-select-mode.button-primary {
	background: none repeat scroll 0 0 #fff !important;
	color: var(--tc-color) !important;
	border-radius: 3px 3px 0 0 !important;
	border-color: #c3c4c7  #c3c4c7  #fff #c3c4c7 !important;
	border-style: solid !important;
	border-width: 1px !important;
	z-index: 4;
	text-shadow: none !important;
}

.tc-select-mode .tcfa {
	margin-right: 10px;
}

#tc-admin-extra-product-options-inner {
	overflow: hidden;
}

#tc-admin-extra-product-options-inner .form-field {
	float: none;
}

.tm-mode-selector.tc-active {
	padding: 0 !important;
	margin: 0;
}

.tc-wrapper .message2x2 .wp-tab-panel li {
	border-bottom: 1px dotted #eee;
	padding-bottom: 2px;
	padding-top: 1px;
}

.tc-wrapper .message2x2 .wp-tab-panel li:last-child {
	border-bottom: 0 none;
}

.tc-wrapper .message2x2 .wp-tab-panel li input[type="checkbox"],
.tc-wrapper .message2x2 .wp-tab-panel li input[type="radio"] {
	margin: 0 4px 0 0 !important;
	vertical-align: middle;
	border: 1px solid #b4b9be;
	float: none;
}

.wc-metaboxes-wrapper .tc-wrapper .wc-metabox table table {
	border-top: 0 none;
	padding: 0;
}

.tmcp-attr-list {
	margin-right: 5px;
}

.tm-mode-local.tc-wrapper .toolbar {
	text-align: right;
	font-size: 12px;
	font-weight: 400;
	font-style: italic;
	padding: 10px 20px !important;
}

.tm-mode-local.tc-wrapper .toolbar a {
	text-decoration: none;
}

.tm-att-value {
	color: #1e8cbe;
	font-weight: 400;
}

.tm-att-label {
	font-weight: 300;
	font-size: 10px;
}

.tm-att-id {
	font-weight: 700;
	font-size: 0.8em;
}

.tm-type,
.tm-att-value {
	margin-right: 1em;
}

.tm-att-label,
.tm-att-id {
	margin-right: 1px;
}
assets/css/admin/tm-epo-admin-settings.css000064400000114577150755142450014614 0ustar00
/* stylelint-disable no-descending-specificity */
/* stylelint-disable selector-class-pattern */
/* stylelint-disable selector-id-pattern */
/* stylelint-disable declaration-block-no-duplicate-properties */

/** Settings css **/

/**
 * Grid system
 */
.tc-row {
	margin: 0 -1em;
	position: relative;
	overflow: auto;
}

.nopadding .tc-row,
.nopadding.tc-row {
	margin: 0;
}

.tc-cell {
	position: relative;
	padding: 0 1em;
	margin: 0 0 1.65em;
	min-height: 1px;
	overflow: hidden;
}

.nomargin .tc-cell {
	margin: 0;
}

.nopadding .tc-cell {
	padding: 0;
}

.tc-col-auto {
	width: auto;
}

.tc-cell.tc-col-auto {
	padding: 0 1em !important;
}

.tc-col-1 {
	width: 8.3334%;
}

.tc-col-2 {
	width: 16.6667%;
}

.tc-col-3 {
	width: 25%;
}

.tc-col-4 {
	width: 33.3334%;
}

.tc-col-5 {
	width: 41.6667%;
}

.tc-col-6 {
	width: 50%;
}

.tc-col-7 {
	width: 58.3334%;
}

.tc-col-8 {
	width: 66.6667%;
}

.tc-col-9 {
	width: 75%;
}

.tc-col-10 {
	width: 83.3334%;
}

.tc-col-11 {
	width: 91.6667%;
}

.tc-col-12 {
	width: 100%;
}

.wauto {
	width: 100% !important;
}

.w25 {
	width: 25%;
}

.w50 {
	width: 50%;
}

.w75 {
	width: 75%;
}

.w100 {
	width: 100%;
}

.w33 {
	width: 33.3333333332%;
}

.w66 {
	width: 66.6666666665%;
}

/* Buttons */
.tc-button {
	display: inline-block;
	margin-bottom: 0;
	font-weight: 600;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	border: 1px solid transparent;
	background: none;
	white-space: nowrap;
	padding: 0 16px;
	font-size: 13px;
	line-height: 34px;
	overflow: hidden;
	position: relative;
	outline: 0 !important;
	border-radius: 3px;
	-webkit-transition: all 0.15s ease;
	transition: all 0.15s ease;
}

.tc-button + .tc-button {
	margin-left: 2px;
}

.tc-button.large {
	font-size: 16px;
	font-weight: 400;
	padding: 12px 26px 10px;
}

.tc-button.small {
	font-size: 10px;
	padding: 0 !important;
	line-height: 21px;
	width: 21px;
}

.tc-button.tc {
	color: #4732f9;
	background: #fff;
	border-color: #4732f9;
}

.tc.tc-button.floatbox-update {
	color: #fff;
	background: #4732f9;
}

.tc-button.tc:hover,
.tc-button.tc:focus {
	z-index: 2;
	background: #fff;
	color: #4732f9;
	-o-border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(#f00), color-stop(#ffa600), color-stop(#ff0), color-stop(#008000), color-stop(#0ff), color-stop(#00f), to(#ee82ee)) 1 1 stretch;
	border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
}

.tc-button.tc.tc-reset-button {
	background: #fee;
	color: #f00;
	border-color: #f00;
}

.tm-settings-wrap a {
	color: #ffa811;
	text-decoration: none;
}

.tm-settings-wrap a:hover,
.tm-settings-wrap a:active,
.tm-settings-wrap a:focus {
	color: #ffdb11;
	text-decoration: none;
	outline: none;
	-webkit-box-shadow: none;
	box-shadow: none;
	border-bottom: 1px solid;
	-o-border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(#f00), color-stop(#ffa600), color-stop(#ff0), color-stop(#008000), color-stop(#0ff), color-stop(#00f), to(#ee82ee)) 1 1 stretch;
	border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
}

/* Checkboxes */
.tm-epo-switch-wrapper input[type="checkbox"],
.tm-epo-switch-wrapper input[type="radio"] {
	opacity: 0;
	left: 50%;
	position: absolute;
	top: 50%;
}

.tm-epo-switch-wrapper .tm-epo-switch {
	position: relative;
	display: inline-block;
	min-width: 54px;
	cursor: pointer;
	font-weight: 500;
	text-align: left;
	margin: 0 !important;
	padding: 0;
	min-height: 28px;
}

.tm-epo-switch-wrapper .tm-epo-switch::before,
.tm-epo-switch-wrapper .tm-epo-switch::after {
	content: "";
	position: absolute;
	margin: 0;
	outline: 0;
	top: 50%;
	-webkit-transform: translate(0, -50%);
	transform: translate(0, -50%);
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;
}

.tm-epo-switch-wrapper .tm-epo-switch::before {
	left: 0;
	width: 54px;
	height: 28px;
	background-color: #c9d4e3;
	border-radius: 20px;
	border: 1px solid #aaa;
}

.tm-epo-switch-wrapper .tm-epo-switch::after {
	left: 3px;
	width: 22px;
	height: 22px;
	border-radius: 16px;
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch::after {
	-webkit-transform: translate(80%, -50%);
	transform: translate(80%, -50%);
	left: 12px;
}

.tm-epo-switch-wrapper .tm-epo-switch.tc::after {
	border: 1px solid #aaa;
	background-color: #fafafa;
	-webkit-box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 1px 5px 0 rgba(0, 0, 0, 0.084);
	box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 1px 5px 0 rgba(0, 0, 0, 0.084);
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::before {
	background-color: #38bb5d;
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::after {
	background-color: #fff;
}

.tm-epo-switch-wrapper input:focus + .tm-epo-switch.tc::before {
	border: 1px solid #3d30ba;
}

.tm-epo-switch-wrapper {
	position: relative;
	width: 54px;
	max-width: 54px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}

/* Border type */
.woocommerce .tc-wrapper table.form-table #tm_epo_css_selected_border + .select2-container {
	display: inline-block;
}

.tm-border-type {
	background: none repeat scroll 0 0 #fff;
	border: 0 solid;
	height: 36px;
	display: inline-block;
	line-height: 36px;
	width: 36px;
	border-color: inherit;
	border-width: 1px;
	-webkit-box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
	box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
	vertical-align: middle;
	margin: 8px 1em;
}

.tm-border-type.circle {
	border-radius: 100%;
	border-width: 1px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-border-type.round {
	border-radius: 5px;
	border-width: 1px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-border-type.square {
	border-radius: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
	border-width: 2px;
}

.tm-border-type.shadow {
	-webkit-box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
	box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
	border-width: 1px;
}

.tm-border-type.thinline {
	border-width: 1px;
	border-radius: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
	border-style: groove;
}

/* Checkbox and rabio button styles setting */
.woocommerce .tc-wrapper table.form-table #tm_epo_css_styles_style + .select2-container {
	display: inline-block;
}

.tm-epo-field-label {
	border: 0 solid;
	display: inline-block;
	border-color: inherit;
	vertical-align: middle;
	margin: 8px 1em;
}

.tc-epo-style-wrapper input[type="checkbox"],
.tc-epo-style-wrapper input[type="radio"] {
	visibility: hidden;
	display: inline !important;
}

.tc-epo-style-wrapper input[type="checkbox"]:checked + .tm-epo-style::after,
.tc-epo-style-wrapper input[type="radio"]:checked + .tm-epo-style::after {
	opacity: 1;
}

.tc-epo-style-wrapper {
	height: 2em;
	width: 2em;
	position: relative;
	display: inline-block;
	vertical-align: middle;
}

.tc-epo-style-wrapper input[type="radio"] + .tm-epo-style::after {
	content: "\f111";
}

.tm-epo-style:hover::after {
	opacity: 0.5;
}

.tm-epo-style::after {
	background: transparent none repeat scroll 0 0;
	font-family: tc-fontawesome, Arial, Helvetica, sans-serif;
	content: "\f00c";
	font-weight: 900;
	height: 1em;
	left: 50%;
	margin-left: -0.5em;
	margin-top: -0.5em;
	opacity: 0;
	position: absolute;
	text-align: center;
	top: 50%;
	width: 1em;
	line-height: 1;
}

.tc-epo-style-wrapper.circle2,
.tc-epo-style-wrapper.round2,
.tc-epo-style-wrapper.square2 {
	height: 1em;
	width: 1em;
	padding: 5px;
	vertical-align: middle;
}

.tm-epo-style.circle2,
.tm-epo-style.round2,
.tm-epo-style.square2 {
	height: 100%;
	width: 100%;
	background: transparent none repeat scroll 0 0;
	border: 2px solid;
	cursor: pointer;
	left: 0;
	line-height: 1;
	margin: 0;
	padding: 0;
	position: absolute;
	top: 0;
}

.tc-epo-style-wrapper.circle2 .tm-epo-style::after,
.tc-epo-style-wrapper.round2 .tm-epo-style::after,
.tc-epo-style-wrapper.square2 .tm-epo-style::after {
	font-size: 0.7em;
	margin-top: -0.5em;
}

.tm-epo-style.circle,
.tm-epo-style.round,
.tm-epo-style.square {
	background: transparent none repeat scroll 0 0;
	border: 1px solid;
	cursor: pointer;
	height: 2em;
	left: 0;
	line-height: 1;
	margin: 0;
	padding: 0;
	position: absolute;
	top: 0;
	width: 2em;
}

.tm-epo-style.circle,
.tm-epo-style.circle2 {
	border-radius: 100%;
}

.tm-epo-style.round,
.tm-epo-style.round2 {
	border-radius: 5px;
}

/* Form controls */
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple,
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single,
.woocommerce .tc-wrapper table.form-table input.regular-input,
.woocommerce .tc-wrapper table.form-table input[type="date"],
.woocommerce .tc-wrapper table.form-table input[type="datetime-local"],
.woocommerce .tc-wrapper table.form-table input[type="datetime"],
.woocommerce .tc-wrapper table.form-table input[type="email"],
.woocommerce .tc-wrapper table.form-table input[type="number"],
.woocommerce .tc-wrapper table.form-table input[type="password"],
.woocommerce .tc-wrapper table.form-table input[type="tel"],
.woocommerce .tc-wrapper table.form-table input[type="text"],
.woocommerce .tc-wrapper table.form-table input[type="time"],
.woocommerce .tc-wrapper table.form-table input[type="url"],
.woocommerce .tc-wrapper table.form-table input[type="week"],
.woocommerce .tc-wrapper table.form-table textarea {
	border-radius: 3px !important;
	background: #f5f7fb !important;
	-webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	border: 1px solid #e4e4ef !important;
	padding: 8px 16px !important;
	line-height: 36px;
	font-size: 13px;
	height: auto;
	color: #727a92 !important;
	margin: 1px;
	outline: none;
	-webkit-transition: 0.05s border-color ease-in-out;
	transition: 0.05s border-color ease-in-out;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	min-width: 60%;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple,
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single {
	width: 100%;
	padding: 8px 16px;
	line-height: 36px;
}

.woocommerce .tc-wrapper table.form-table input[type="number"] {
	padding-right: 6px;
}

#tm_epo_css_code,
#tm_epo_js_code {
	min-height: 200px;
	min-width: 80%;
}

.woocommerce .tc-wrapper table.form-table .select2-container {
	font-size: 13px !important;
	display: block;
	height: auto !important;
	line-height: 36px !important;
	padding: 0 !important;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	min-width: 10%;
	width: 60% !important;
}

.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection--single {
	border-radius: 3px !important;
	background: #fff !important;
	-webkit-box-shadow: 0 4px 10px 4px rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 10px 4px rgba(0, 0, 0, 0.02) !important;
	border: 1px solid #e3e5ed;
	padding: 0 16px;
	line-height: 36px;
	font-size: 14px;
	height: auto;
}

.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection__rendered {
	min-height: 36px !important;
	height: auto !important;
	padding: 0 36px 0 0 !important;
	display: block !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #727a92 !important;
	line-height: 36px !important;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow {
	height: 36px !important;
	line-height: 36px !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #6a7a90 !important;
	width: 36px;
	background: none;
	position: absolute;
	border: 0;
	top: 9px;
	right: 17px;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow::after {
	font-weight: 900;
	font-family: tc-fontawesome, Arial, Helvetica, sans-serif;
	content: "\f107";
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow::after {
	color: #4732f9;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
	border-color: transparent;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow b {
	display: none;
	border-color: transparent;
}

.woocommerce_page_wc-settings .select2-container--open .select2-dropdown {
	border: 1px solid #4732f9 !important;
	margin-top: 0;
	margin-left: 1px;
	padding: 16px;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	background: #fff;
}

.woocommerce_page_wc-settings .select2-container--open .select2-dropdown .select2-search--dropdown {
	padding: 0 0 8px 0;
	position: relative;
}

.woocommerce_page_wc-settings .select2-container--open .select2-dropdown::after {
	background: #fff;
}

.woocommerce_page_wc-settings .select2-results {
	padding: 0;
	margin: 0;
}

.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown::before {
	content: "\f179";
	position: absolute;
	right: 16px;
	font-family: dashicons, Arial, Helvetica, sans-serif;
	font-size: 16px;
	width: 16px;
	height: 16px;
	line-height: 16px;
	display: block;
	top: 10px;
	color: #ccc;
}

.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown input {
	height: 36px !important;
	padding: 0 28px 0 8px;
	border: 1px solid #d2dae3;
	margin: 0 !important;
	background: none;
	border-radius: 3px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.woocommerce_page_wc-settings .select2-container--default .select2-search--dropdown .select2-search__field {
	border: 1px solid #4732f9;
	color: #4732f9;
}

.woocommerce_page_wc-settings .select2-results li {
	margin: 8px 2px 8px 0;
	border-radius: 3px;
	color: #777c82;
}

.woocommerce_page_wc-settings .select2-container--default .select2-results__option .select2-results__option {
	padding: 0 8px;
	line-height: 36px;
	height: 36px;
	outline: none !important;
}

.woocommerce_page_wc-settings .select2-container--default .select2-results__option[aria-selected="true"],
.woocommerce_page_wc-settings .select2-container--default .select2-results__option[data-selected="true"] {
	background-color: transparent;
	color: #4732f9;
}

.woocommerce_page_wc-settings .select2-container--default .select2-results__option--highlighted[aria-selected] {
	background: -webkit-gradient(linear, left top, right top, from(#3d30ba), to(#0000ba));
	background: linear-gradient(to right, #3d30ba, #0000ba);
	color: #fff;
}

.woocommerce_page_wc-settings .select2-container--default .select2-results__option:focus,
.woocommerce_page_wc-settings .select2-container--default .select2-results > .select2-results__options:focus {
	outline: none !important;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--single,
.woocommerce .tc-wrapper table.form-table textarea:focus,
.woocommerce .tc-wrapper table.form-table input.regular-input:focus,
.woocommerce .tc-wrapper table.form-table input[type="date"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="datetime-local"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="datetime"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="email"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="number"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="password"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="tel"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="text"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="time"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="url"]:focus,
.woocommerce .tc-wrapper table.form-table input[type="week"]:focus {
	-webkit-box-shadow: 0 1px 8px 1px rgba(0, 0, 0, 0.1) !important;
	box-shadow: 0 1px 8px 1px rgba(0, 0, 0, 0.1) !important;
	color: #4732f9 !important;
	border: 1px solid #4732f9 !important;
}

.woocommerce .tc-wrapper table.form-table input::-webkit-input-placeholder {
	color: #ccc;
}

.woocommerce .tc-wrapper table.form-table input::-moz-placeholder {
	color: #ccc;
}

.woocommerce .tc-wrapper table.form-table input:-ms-input-placeholder {
	color: #ccc;
}

.woocommerce .tc-wrapper table.form-table input::-ms-input-placeholder {
	color: #ccc;
}

.woocommerce .tc-wrapper table.form-table input::placeholder {
	color: #ccc;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--multiple {
	border: solid #4732f9 1px !important;
	outline: 0;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--focus .select2-selection--single,
.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default.select2-container--open .select2-selection--single {
	border: solid #4732f9 1px !important;
	outline: 0;
}

.woocommerce .tc-wrapper table.form-table .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice {
	line-height: 16px;
	margin: 5px 5px 5px 0;
	padding: 0.5em;
	border: 1px solid #aac1eb;
	background: -webkit-gradient(linear, left top, right top, from(#e7edff), to(#e8edf6));
	background: linear-gradient(to right, #e7edff, #e8edf6);
	-webkit-box-shadow: none;
	box-shadow: none;
	color: #4732f9;
}

.woocommerce .tc-wrapper table.form-table .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
	line-height: 16px;
	margin: 5px 1px 5px 0;
	padding: 0.5em;
	border: 1px solid transparent;
	background: none;
	-webkit-box-shadow: none;
	box-shadow: none;
	color: #683ebd;
}

.woocommerce .tc-wrapper table.form-table .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
	color: #e51e1b;
	cursor: pointer;
	display: inline-block;
	font-weight: 700;
	float: right;
	margin-left: 0.5em;
	position: static;
	border: 0;
}

.woocommerce .tc-wrapper table.form-table .select2-container .select2-selection--multiple .select2-search__field {
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	border: 0 !important;
	margin: 1px -0.5em;
	padding: 0 0.5em !important;
	width: 1em !important;
	min-height: 0 !important;
	line-height: 1 !important;
}

/* General */
.tm-hidden {
	display: none !important;
}

.tm-hide {
	visibility: hidden !important;
	padding: 0 !important;
	height: 0 !important;
	width: 0 !important;
	margin: 0 !important;
	min-height: 0 !important;
	min-width: 0 !important;
	opacity: 0 !important;
}

.tm-show {
	display: block !important;
}

.tm-animated {
	-webkit-animation-fill-mode: both;
	animation-fill-mode: both;
	-webkit-animation-duration: 0.15s;
	animation-duration: 0.15s;
}

.transition {
	-webkit-transition: all 0.3s ease 0s;
	transition: all 0.3s ease 0s;
}

@-webkit-keyframes appear {

	0% {
		opacity: 0;
		-webkit-transform: translate3d(5%, 0, 0);
		transform: translate3d(5%, 0, 0);
	}

	100% {
		opacity: 1;
		-webkit-transform: translate3d(0, 0, 0);
		transform: translate3d(0, 0, 0);
	}
}

@keyframes appear {

	0% {
		opacity: 0;
		-webkit-transform: translate3d(5%, 0, 0);
		transform: translate3d(5%, 0, 0);
	}

	100% {
		opacity: 1;
		-webkit-transform: translate3d(0, 0, 0);
		transform: translate3d(0, 0, 0);
	}
}

.appear {
	-webkit-animation-name: appear;
	animation-name: appear;
}

.tm-flexrow {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tm-flexcol {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	width: auto;
	max-width: none;
}

.tm-justify-content-between {
	-webkit-box-pack: justify !important;
	-ms-flex-pack: justify !important;
	justify-content: space-between !important;
}

.tm-settings-wrap,
.flasho {
	font-size: 14px;
	line-height: 1.42857143;
	font-family: Roboto, "Open Sans", Helvetica, Arial, sans-serif;
}

.tc-wrapper,
.tc-wrapper div,
.flasho,
.flasho div,
.bsbb,
.tm-bsbb-all * {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.flasho2 {
	padding: 1em;
	background: none repeat scroll 0 0 #fff;
	height: 100%;
	overflow: auto;
	width: 100%;
}

.flasho {
	background: -webkit-gradient(linear, left top, right top, from(#fcfcfd), to(#fbfbfc));
	background: linear-gradient(to right, #fcfcfd, #fbfbfc);
	color: #fff;
	border: 1px solid #ededee;
	left: 0;
	position: absolute;
	top: 0;
	z-index: 101;
	-webkit-box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	max-height: 100%;
	border-radius: 2px;
	max-width: 100%;
	overflow: hidden;
	display: grid;
	grid-template-rows: minmax(1em, auto) minmax(33%, 1fr) minmax(1em, auto);
	gap: 0;
}

.flasho.tc-color-error {
	-webkit-box-shadow: 0 0 1px 4px rgba(255, 0, 0, 0.1), 0 0 50px 13px rgba(255, 0, 0, 0.05);
	box-shadow: 0 0 1px 4px rgba(255, 0, 0, 0.1), 0 0 50px 13px rgba(255, 0, 0, 0.05);
	border: 4px solid #d00;
}

.tc-color-error.flasho .header h3 {
	color: #d00;
}

.tc-color-error.flasho .tc-button.tc {
	color: #d00;
	background: #fff;
	border-color: #d00;
}

.flasho.tc-wrapper .message0x0,
.tc-options-group .message0x0 {
	border-radius: 0;
	border-width: 0;
	border-color: #ecf0f1;
	border-style: none none dotted;
	margin: 0;
	height: auto;
	overflow: hidden;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.flasho.tc-wrapper .message0x0:last-child {
	border: 0;
}

.flasho .header {
	line-height: 2;
	padding: 1.5em 2em;
	width: 100%;

}

.flasho .header h3 {
	color: #63728b;
	font-size: 22px;
	font-weight: 400;
	line-height: 28px;
	margin: 0;
	letter-spacing: 1px;
}

.flasho .footer {
	margin: 0;
	padding: 0;
	text-align: right;
	background: #f4f6f9;
}

.flasho .footer .inner {
	border-top: 1px solid #dbe1eb;
	padding: 1em 2em;
	position: relative;
}

.float-editbox {
	position: relative;
}

.tm-inner {
	margin: 1em 2.2em;
}

.tm-error .tm-inner {
	color: #c0392b;
}

.tc-question.flasho {
	border: 0;
	-webkit-box-shadow: 0 0 1px 10px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	box-shadow: 0 0 1px 10px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	background: transparent;
	width: auto !important;
	grid-template-rows: minmax(1em, auto) minmax(1em, auto);
}

.tc-question.flasho .header,
.tc-question.flasho .footer {
	position: static;
	background: #fff;
	text-align: center;
	border-radius: 0;
}

.tc-question.flasho .float-editbox {
	display: none;
}

.tc-question.flasho .header h3 {
	width: 100%;
	text-align: center;
	float: none;
}

.tc-question.flasho .footer .inner {
	border: 0;
}

.fl-overlay {
	background: #000;
	position: fixed;
	display: block;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

.fl-overlay.forfullsize {
	background: #eee;
}

.tm-settings-wrap {
	margin-top: 1em;
}

.tm-settings-wrap .tm-tabs {
	background: #fff;
	overflow: hidden;
	position: relative;
	border: 1px solid #e7e8f1;
	-o-border-image: linear-gradient(to bottom, transparent, #aaa 6%, #4732f9, #ccc, #bbb, #aaa 96%, transparent) 1 stretch;
	border-image: -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(6%, #aaa), color-stop(#4732f9), color-stop(#ccc), color-stop(#bbb), color-stop(96%, #aaa), to(transparent)) 1 stretch;
	border-image: linear-gradient(to bottom, transparent, #aaa 6%, #4732f9, #ccc, #bbb, #aaa 96%, transparent) 1 stretch;
}

.tm-settings-wrap .tm-tab-headers::after {
	content: "";
	display: block;
	height: 100%;
	position: absolute;
	width: 20%;
	background: #f5f7fb;
	border-right: 1px solid #e7e8f1;
	margin-left: -1px;
}

.tm-settings-wrap .tm-tab-headers {
	float: left;
	height: 100%;
	position: static;
	width: 20%;
	z-index: 100;
	background: #f5f7fb;
	border: 0;
	border-right: 1px solid #e7e8f1;
}

.tm-tabs-wrapper {
	float: left;
	width: 80%;
}

.tm-settings-wrap .header {
	padding: 40px;
	margin: 0;
	border-bottom: 1px solid;
	-o-border-image: linear-gradient(to right, transparent, #fff 6%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(6%, #fff), color-stop(#00f), color-stop(#ee82ee), color-stop(96%, #fff), to(transparent)) 25 25 stretch;
	border-image: linear-gradient(to right, transparent, #fff 6%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
}

.tm-settings-wrap .header h3 {
	color: #4732f9;
	margin: 0;
	font-weight: 400;
	font-size: 24px;
	line-height: 36px;
}

.tm-settings-wrap .tm-tab {
	display: none;
	position: relative;
	z-index: 1;
	margin: 0 40px;
}

.tm-settings-wrap .tm-section-title {
	font-size: 24px;
	line-height: 32px;
	color: #4732f9;
	margin: 0 -40px;
	font-weight: 400;
	padding: 40px;
	background: #fff;
}

.tm-table-wrap {
	margin: 0;
}

.tm-settings-wrap .tm-tab .form-table {
	display: table;
}

.tc-hide-nav #screen-meta-links,
.tc-hide-nav .nav-tab-wrapper,
.tc-hide-nav .woo-nav-tab-wrapper,
.tm-settings-wrap .form-table,
.tm-settings-wrap + p.submit {
	display: none;
}

.tm-settings-wrap .tm-footer {
	background: #fff;
	padding: 16px 32px 16px 32px;
	clear: both;
	text-align: right;
	border-top: 1px solid #ccc;
	-o-border-image: linear-gradient(to right, transparent, #fff 22%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(22%, #fff), color-stop(#00f), color-stop(#ee82ee), color-stop(96%, #fff), to(transparent)) 25 25 stretch;
	border-image: linear-gradient(to right, transparent, #fff 22%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
}

.tm-settings-wrap .tm-footer.full {
	-o-border-image: linear-gradient(to right, transparent, #fff 6%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(6%, #fff), color-stop(#00f), color-stop(#ee82ee), color-stop(96%, #fff), to(transparent)) 25 25 stretch;
	border-image: linear-gradient(to right, transparent, #fff 6%, #00f, #ee82ee, #fff 96%, transparent) 25 25 stretch;
}

/*****************/
.tm-sidebar-head {
	text-align: left;
	padding: 40px 0 40px 40px;
	border-bottom: 1px solid #e7e8f1;
	-o-border-image: linear-gradient(to right, transparent, #f5f7fb 6%, #e7e8f1, #f5f7fb 94%, transparent) 25 25 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(6%, #f5f7fb), color-stop(#e7e8f1), color-stop(94%, #f5f7fb), to(transparent)) 25 25 stretch;
	border-image: linear-gradient(to right, transparent, #f5f7fb 6%, #e7e8f1, #f5f7fb 94%, transparent) 25 25 stretch;
	margin-bottom: 20px;
}

.tm-sidebar-head h2 {
	margin: 0;
	color: #565a6b;
	font-size: 14px;
	font-weight: 700;
	letter-spacing: 2px;
	line-height: 40px;
}

.tm-sidebar-head h2 span {
	font-weight: 400;
	color: #99a1b3;
	letter-spacing: 1px;
	font-size: 10px;
	line-height: 10px;
}

.tm-settings-wrap .tm-box {
	display: block;
	margin: 0;
	overflow: hidden;
	padding: 0;
	position: relative;
	width: 100%;
	border: 0;
}

.tm-settings-wrap .tm-box .tab-header {
	display: inline-block;
	color: #a6adc6;
	cursor: pointer;
	padding: 12px 0;
	font-size: 15px;
	font-weight: 400;
	position: relative;
	margin: 0 40px;
	-webkit-transition: all 0.15s ease;
	transition: all 0.15s ease;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	border: 0 !important;
}

.tm-settings-wrap .tm-box .tab-header:focus {
	outline: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
	color: #4732f9;
}

.tm-settings-wrap .tm-box .tab-header.open {
	color: #4732f9 !important;
	font-weight: 700;
}

.tm-settings-wrap .tm-box .tab-header:hover {
	color: #1f2539;
}

.tm-settings-wrap .tm-box .tab-header:hover .tab-header-icon {
	color: #1f2539;
}

.tm-settings-wrap .tm-box .tab-header:focus .tab-header-icon {
	color: #4732f9;
}

.tab-header-icon,
.tab-header-icon.tcfa,
.tab-header-icon.tcfas,
.tab-header-icon.tcfar,
.tab-header-icon.tcfal,
.tcfad {
	margin-right: 20px;
	width: 2.5em;
	height: 2.5em;
	text-align: center;
	line-height: 2.5;
	border: 1px solid transparent;
	border-radius: 8px;
	color: #a6adc6;
	background: -webkit-gradient(linear, left top, right top, from(#e8edf6), to(#fafafa));
	background: linear-gradient(to right, #e8edf6, #fafafa);
	-ms-flex-negative: 0;
	flex-shrink: 0;
}

.tm-settings-wrap .tm-box .tab-header.open .tab-header-icon {
	color: #4732f9 !important;
	-o-border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(#f00), color-stop(#ffa600), color-stop(#ff0), color-stop(#008000), color-stop(#0ff), color-stop(#00f), to(#ee82ee)) 1 1 stretch;
	border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
	background: #fff;
}

.tm-section-desc {
	padding: 20px 0 0 0;
}

.tm-section-menu-item {
	padding: 0 0 1px;
	display: inline-block;
	cursor: pointer;
	color: #9b9fb0;
	margin-right: 1em;
	font-weight: 400;
	font-style: normal;
	font-size: 14px;
	-webkit-transition: color 0.15s ease;
	transition: color 0.15s ease;
}

.tm-section-menu-item:focus {
	color: #4732f9;
	outline: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-section-menu-item:hover {
	color: #4732f9;
}

.tm-section-menu-item.active {
	color: #4732f9;
	font-weight: 700;
	border-bottom: 1px solid #29cae4;
	-o-border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
	border-image: -webkit-gradient(linear, left top, right top, from(#f00), color-stop(#ffa600), color-stop(#ff0), color-stop(#008000), color-stop(#0ff), color-stop(#00f), to(#ee82ee)) 1 1 stretch;
	border-image: linear-gradient(to right, #f00, #ffa600, #ff0, #008000, #0ff, #00f, #ee82ee) 1 1 stretch;
}

.woocommerce .tm-settings-wrap table.form-table th span.description {
	font-weight: 400;
	font-size: 12px;
	margin: 8px 0 0 0;
	color: #9b9fb0;
	display: block;
	font-style: normal;
	line-height: 18px;
}

.woocommerce .tm-settings-wrap table.form-table th {
	padding: 20px 0 !important;
	vertical-align: middle;
	width: 30%;
}

.tm-settings-wrap .form-table td {
	padding: 2em !important;
	vertical-align: top;
}

.tm-settings-wrap .form-table tr:last-child {
	border: 0 none;
}

.tm-settings-wrap .description > div {
	margin-top: 1em;
}

.tm-settings-wrap .form-table,
.tm-settings-wrap .form-table td,
.tm-settings-wrap .form-table td p,
.tm-settings-wrap .form-table th,
.tm-settings-wrap .form-wrap label {
	font-size: 1em;
	color: #777c82;
}

.tm-license-button {
	margin: 0;
	display: inline-block;
	width: auto !important;
}

.tm-license-result {
	margin-top: 1em;
}

.tm-settings-wrap .tm-license-result div {
	background: none;
	border: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
	font-size: 15px;
	padding: 0;
	margin: 0 !important;
}

.tm-settings-wrap .tm-license-result div.activated p {
	color: #83b73b;
}

.tm-settings-wrap .tm-license-result div.deactivated p {
	color: #dd433c;
}

.tm-settings-wrap .tm-license-result div.error p {
	color: #fa36ab;
}

.tm-settings-wrap .tm-license-result div p {
	font-style: normal;
	padding: 0;
	margin: 0 !important;
}

/* admin menu */
.tm-settings-wrap .tm-tab .form-table th,
.tm-settings-wrap .tm-tab .form-wrap label {
	color: #313a56;
	font-weight: 400;
	font-size: 15px;
}

.tm-settings-wrap .forminp-checkbox label {
	color: #888;
	font-size: 0.8em;
}

.tm-settings-wrap .forminp-select span.description,
.tm-settings-wrap .forminp-multiselect span.description,
.tm-settings-wrap .forminp-text span.description {
	display: block;
}

#tm_epo_envato_purchasecode,
#tm_epo_envato_username,
#tm_epo_envato_apikey {
	min-width: 50%;
}

.tm-settings-wrap .form-table tr {
	border-color: #f6f6f6;
	border-radius: 0;
	border-style: none none solid;
	border-width: 0 0 1px;
}

.tm-settings-wrap .form-table td.forminp-tm_html {
	padding: 0 !important;
	position: relative;
}

.tm-mn-header {
	position: relative;
	overflow: hidden;
	padding: 0;
	border-top: 1px solid #dadfe8;
}

.tm-mn-path {
	bottom: 1em;
	line-height: 1.5;
	width: 100%;
	padding: 16px 0;
}

.tm-mn-wrap-heading,
.tm-mn-wrap-dir,
.tm-mn-wrap-file {
	padding: 1em 0;
}

.tm-mn-wrap-heading {
	border-bottom: 1px solid #eff2f1;
}

.tm-mn-wrap-dir,
.tm-mn-wrap-file {
	border-bottom: 1px solid #f3f5f5;
}

.tm-mime {
	display: inline;
	height: auto;
	margin-right: 0.5em;
	vertical-align: middle;
	width: 1em;
}

.tm-mn-header .tm-mn-movetodir,
.tm-mn-header .tm-mn-movetodir:hover,
.tm-mn-header .tm-mn-movetodir:active {
	text-decoration: none;
}

.tm-mn-currentdir {
	color: #2ecc71;
}

.tm-mn-movetodir .tm-icon {
	margin: 0 0.5em;
}

a.tm-mn-deldir,
a.tm-mn-delfile {
	color: #e51e1b;
}

.toast-success {
	background-color: #5d21d2;
	opacity: 1 !important;
}

.toast-error {
	background-color: #ff4500;
}

#toast-container > div {
	-webkit-box-shadow: none;
	box-shadow: none;
}

.toast-title {
	color: #fff;
}

.toast-success .toast-message {
	color: #eee;
}

ul.select2-results__options::-webkit-scrollbar,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar {
	background: #e8edf6;
	width: 8px;
}

ul.select2-results__options::-webkit-scrollbar-button,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-button {
	background: #e8edf6;
}

ul.select2-results__options::-webkit-scrollbar-thumb,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-thumb {
	background: -webkit-gradient(linear, left bottom, left top, from(#7886ff), to(#4732f9));
	background: linear-gradient(to top, #7886ff, #4732f9);
}

ul.select2-results__options::-webkit-resizer,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-resizer {
	background: transparent;
}

ul.select2-results__options::-webkit-scrollbar-corner,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-corner {
	background: transparent;
}

ul.select2-results__options,
.woocommerce .tc-wrapper table.form-table textarea {
	scrollbar-color: #4732f9 #e8edf6;
	scrollbar-width: thin;
}

body.tc-hide-nav {
	background: #d7deeb;
}

.blockUI.blockOverlay {
	background: #fff !important;
}

.constant-name,
.constant-value {
	width: 100% !important;
}

.tm-mn-wrap-heading,
.tm-mn-wrap-file,
.tm-mn-wrap-dir,
.tm-mn-op,
.constant-value-wrap,
.tc-constant-delete {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

.tm-mn-name,
.tm-mn-size {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 50%;
	flex: 0 1 50%;
}

.tm-mn-op {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 40px;
	flex: 0 1 40px;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
}

.tc-constant-delete {
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-flex: 0;
	-ms-flex-positive: 0;
	flex-grow: 0;
	-ms-flex-preferred-size: 0;
	flex-basis: 0;
	width: auto;
	padding: 0 4px;
}

.tc-constant-delete .delete {
	cursor: pointer;
}

.constant-value-text {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
}

.constant-value-delete {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
	margin: 19px 1em 0 1em;
}

.woocommerce .tm-settings-wrap table.form-table .constantrow th {
	padding: 10px 0 !important;
}

.tm-settings-wrap .form-table .constantrow td {
	padding: 10px !important;
}

.constant-label-wrap {
	font-size: 10px;
	font-weight: 700;
	text-transform: uppercase;
	color: #a6adc6;
}

.woocommerce .tc-wrapper table.form-table .tm-error label {
	color: #c0392b !important;
}

.woocommerce .tc-wrapper table.form-table .tm-error input[type="text"] {
	border: 1px solid #c0392b !important;
	color: #e74c3c !important;
	outline: 0;
	background: #fee !important;
}

button.tmicon {
	display: inline-block;
	left: auto !important;
	position: relative;
	right: auto !important;
	overflow: hidden;
	width: 30px !important;
	height: 30px !important;
	line-height: 30px !important;
	font-size: 14px;
	text-align: center;
	cursor: pointer;
	vertical-align: middle;
	margin: 0;
	padding: 0;
	-ms-flex-negative: 0;
	flex-shrink: 0;
	background: none;
	border: none;
	-webkit-transition: all 0.3s ease 0s;
	transition: all 0.3s ease 0s;
}

button.tmicon.delete {
	color: #ff4500;
	border-radius: 100%;
}

button.tmicon.delete:hover {
	color: #fff;
	background: #ff4500;
}
assets/css/admin/tm-epo-admin-order.css000064400000007470150755142450014060 0ustar00/* stylelint-disable selector-class-pattern */

:root {
	--tcgap: 15px;
}

.tm-order-line-option .edit {
	display: none;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity {
	text-align: center;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,
.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view {
	min-width: 100px;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit input {
	float: left;
	width: 70%;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit small {
	float: right;
	width: 20%;
}

.woocommerce-tmcp-attributes.wc-metabox-content {
	background: #fdfdfd;
}

.woocommerce-tmcp-attributes.wc-metabox-content .data {
	padding: 10px 20px;
}

.form-row .tm-hide-price label,
.form-row .tm-required label,
.form-row .tm-enabled label {
	display: inline;
}

.form-row .tm-hide-price,
.form-row .tm-required,
.form-row .tm-enabled {
	display: inline-block;
	line-height: 28px;
	padding: 2px;
}

.missing h3,
.missing .tm-att-value {
	color: #e74c3c;
}

.tm-50 {
	float: left;
	width: 50%;
	min-height: 1px;
	overflow: auto;
	word-break: break-word;
}

.rtl .tm-50 {
	float: right;
}

.tm-header .tm-50 {
	font-size: 0.9em;
	font-weight: 700;
}

.tm-c input.value {
	width: 100%;
}

.tm-c.name {
	border-left: 0 none !important;
}

.tm-order-line-option.item {
	background: #fafafa none repeat scroll 0 0;
	color: #2c3e50;
}

.tm-order-line {
	background: #95a5a6 none repeat scroll 0 0;
	color: #fff;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line-option td {
	border-bottom-style: dashed;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line-option:last-child td {
	border-bottom-style: none;
}

.woocommerce_order_items_wrapper table.woocommerce_order_items td.tm-epo-order-data {
	padding: 0;
}

#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.tm-order-line-option td {
	border-color: #ebebeb;
}

#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr.tm-order-line td {
	cursor: default;
	font-size: 0.9em;
	font-weight: 700;
	vertical-align: bottom;
	border-color: #7f8c8d;
}


.tm-order-header {
	background: #fff none repeat scroll 0 0;
	color: #7f8c8d;
	display: inline-block;
	margin-bottom: 1em;
	padding: 0 0.5em;
}

#woocommerce-order-items .wc-order-edit-line-item-actions .tm-delete-order-item::before {
	content: "\f158";
	font-family: Dashicons, Arial, Helvetica, sans-serif;
	font-variant: normal;
	font-weight: 400;
	height: 100%;
	left: 0;
	line-height: 1;
	margin: 0;
	position: relative;
	text-align: center;
	text-indent: 0;
	text-transform: none;
	top: 0;
	width: 100%;
}

#woocommerce-order-items .wc-order-edit-line-item-actions .tm-delete-order-item:hover::before {
	color: #a00;
}

.cpf-data-on-cart {
	border-bottom: 1px dotted rgba(0, 0, 0, 0.2);
	margin-bottom: 0.5em;
	display: block;
}

.cpf-img-on-order {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-ms-flex-line-pack: start;
	align-content: flex-start;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	width: calc(100% - var(--tcgap));
	gap: var(--tcgap);
}

.cpf-img-on-order img {
	-o-object-fit: cover;
	object-fit: cover;
	display: block;
	width: 100%;
	height: auto;
}

.cpf-img-on-order > * {
	max-width: calc(50% - var(--tcgap)) !important;
	max-height: none !important;
	display: block;
	-webkit-box-flex: 0 !important;
	-ms-flex: 0 0 calc(50% - var(--tcgap)) !important;
	flex: 0 0 calc(50% - var(--tcgap)) !important;
}
assets/css/admin/tm-lookup-table-admin.css000064400000004732150755142450014560 0ustar00.builder-layout.builder-lookuptable {
	margin: 2em 0;
}

.builder-import-file {
	position: absolute;
}

.tc-add-export-csv {
	display: none;
}

.container-lookup-table {
	width: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	padding: 0;
}

.wrap-lookup-table {
	width: 100%;
	overflow: auto;
}

.lookuptable-name {
	font-size: 1.5em;
	background: #fff;
	padding: 0.5em;
	border: 1px solid rgba(0, 0, 0, 0.1);
}

.table-name,
.table-index {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 50%;
	flex: 0 1 50%;
}

.table-name,
.table-index,
.lookuptable-name {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: start;
	-ms-flex-pack: start;
	justify-content: flex-start;
}

.table-name-label,
.table-index-label {
	font-size: 0.5em;
	background: #36304a;
	color: #fff;
	display: inline-block;
	padding: 0.2em 0.4em;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}

.table-name-value,
.table-index-value {
	-webkit-box-flex: 1;
	-ms-flex: 1 0 100%;
	flex: 1 0 100%;
}

table {
	width: 100%;
	background-color: #fff;
	border-collapse: collapse;
}

.row.head th {
	padding: 1em;
}

.row td {
	padding: 1em;
}


.lookup-table-wrap.epo {
	font-size: 1em;
	margin-bottom: 2em;
	width: 100%;
	overflow: auto;
}

.lookup-table-wrap.epo td {
	color: #808080;
	line-height: 1.4;
	border: 1px solid rgba(0, 0, 0, 0.1);
	text-align: center;
	cursor: default;
}

.lookup-table-wrap.epo th,
.lookup-table-wrap.epo .ltcell.column1 {
	color: #fff;
	line-height: 1.4;
	text-align: center;
	background-color: #36304a;
	font-weight: 700;
	border: 1px solid rgba(255, 255, 255, 0.1);
}

.lookup-table-wrap.epo th.ltcell,
.lookup-table-wrap.epo td.ltcell.column1 {
	pointer-events: none;
}

.lookup-table-wrap.epo .row:hover {
	background-color: #f2f2f2;
}

.lookup-table-wrap.epo .hov-column-epo {
	background-color: #f2f2f2;
}

.lookup-table-wrap.epo .hov-column-head-epo {
	background-color: #484848 !important;
}

.lookup-table-wrap.epo .row td:hover {
	background-color: #6c7ae0;
	color: #fff;
}
assets/css/admin/tm-global-epo-admin.css000064400000260137150755142450014206 0ustar00/* stylelint-disable no-descending-specificity */
/* stylelint-disable selector-class-pattern */

/* color skins */
.wp-admin {
	--tc-color: #000;
}

.admin-color-fresh {
	--tc-color: #2271b1;
}

.admin-color-light {
	--tc-color: #04a4cc;
}

.admin-color-modern {
	--tc-color: #3858e9;
}

.admin-color-blue {
	--tc-color: #e1a948;
}

.admin-color-coffee {
	--tc-color: #c7a589;
}

.admin-color-ectoplasm {
	--tc-color: #a3b745;
}

.admin-color-midnight {
	--tc-color: #e14d43;
}

.admin-color-ocean {
	--tc-color: #9ebaa0;
}

.admin-color-sunrise {
	--tc-color: #dd823b;
}

.admin-color-classic-dark {
	--tc-color: #c9356e;
}

.admin-color-aquatic {
	--tc-color: #008763;
}

.admin-color-classic-blue {
	--tc-color: #b26200;
}

.admin-color-classic-bright {
	--tc-color: #cd4177;
}

.admin-color-contrast {
	--tc-color: ##045489;
}

.admin-color-nightfall {
	--tc-color: #0675c4;
}

.admin-color-powder-snow {
	--tc-color: #067ed3;
}

.admin-color-sakura {
	--tc-color: #0675c4;
}

.admin-color-sunset {
	--tc-color: #b26200;
}

body {
	--tc-color: var(--tc-color);
}

/* resizable */
#tmformfieldsbuilderwrap .ui-resizable {
	position: relative;
}

.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}

#tmformfieldsbuilderwrap .ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
}

#tmformfieldsbuilderwrap .ui-resizable-disabled .ui-resizable-handle {
	display: none;
}

#tmformfieldsbuilderwrap .ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: 7px;
	top: 0;
	height: 100%;
}

#tmformfieldsbuilderwrap .ui-resizable-n,
#tmformfieldsbuilderwrap .ui-resizable-s,
#tmformfieldsbuilderwrap .ui-resizable-w,
#tmformfieldsbuilderwrap .ui-resizable-se,
#tmformfieldsbuilderwrap .ui-resizable-sw,
#tmformfieldsbuilderwrap .ui-resizable-nw,
#tmformfieldsbuilderwrap .ui-resizable-ne {
	display: none !important;
}

#tmformfieldsbuilderwrap .ui-resizable-se {
	cursor: e-resize;
	width: 11px;
	right: 5px;
	top: calc(50% - 5.5px);
	height: 11px;
	bottom: auto;
	left: auto;
	background: #fff;
	border-radius: 100%;
	border: 2px solid var(--tc-color);
	z-index: 10000 !important;
}

#tmformfieldsbuilderwrap .ui-resizable-resizing .ui-resizable-se {
	background: var(--tc-color);
}

#tmformfieldsbuilderwrap .builder-wrapper:hover > .ui-resizable-se,
#tmformfieldsbuilderwrap .bitem:hover .ui-resizable-se {
	display: block !important;
	-webkit-animation: element-outline 0.95s;
	animation: element-outline 0.95s;
}

#tmformfieldsbuilderwrap .builder-wrapper.ui-sortable-helper .ui-resizable-se,
#tmformfieldsbuilderwrap .bitem.ui-sortable-helper .ui-resizable-se,
#tmformfieldsbuilderwrap .builder-wrapper.ui-sortable-helper:hover .ui-resizable-se,
#tmformfieldsbuilderwrap .bitem.ui-sortable-helper:hover .ui-resizable-se,
#tmformfieldsbuilderwrap .ui-sortable-helper .bitem-inner {
	display: none !important;
}

.builder-wrapper.ui-sortable-helper,
.bitem.ui-sortable-helper {
	z-index: 100000;
}

.bitem.ui-resizable-resizing,
.builder-wrapper.ui-resizable-resizing {
	opacity: 0.5;
}

.bitem.ui-resizable-resizing.ui-highlight,
.builder-wrapper.ui-resizable-resizing.ui-highlight {
	opacity: 1;
}

/* Checkboxes */
label.tm-epo-switch-wrapper-label {
	vertical-align: unset;
}

.tm-epo-switch-wrapper input[type="checkbox"],
.tm-epo-switch-wrapper input[type="radio"] {
	opacity: 0;
	left: 50%;
	position: absolute;
	top: 50%;
	pointer-events: none;
}

.tm-epo-switch-wrapper .tm-epo-switch {
	position: relative;
	display: inline-block;
	min-width: 44px;
	cursor: pointer;
	margin: 0 !important;
	padding: 0;
	min-height: 24px;
	top: 0.5em;
}

.tm-epo-switch-wrapper .tm-epo-switch::before,
.tm-epo-switch-wrapper .tm-epo-switch::after {
	content: "";
	position: absolute;
	margin: 0;
	outline: 0;
	top: 50%;
	-webkit-transform: translate(0, -50%);
	transform: translate(0, -50%);
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;
}

.tm-epo-switch-wrapper .tm-epo-switch::before {
	left: 0;
	width: 44px;
	height: 23px;
	background-color: #d0d5dd;
	border-radius: 20px;
	border: 1px solid rgba(0, 0, 0, 0.1);
}

.tm-epo-switch-wrapper .tm-epo-switch::after {
	left: 2px;
	width: 18px;
	height: 18px;
	border-radius: 16px;
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch::after {
	-webkit-transform: translate(80%, -50%);
	transform: translate(80%, -50%);
	left: 8px;
	border-color: transparent;
}

.tm-epo-switch-wrapper .tm-epo-switch.tc::after {
	border: 1px solid transparent;
	background-color: #fafafa;
	-webkit-box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 -2px 2px 0 rgba(0, 0, 0, 0.198);
	box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.098), 0 -2px 2px 0 rgba(0, 0, 0, 0.198);
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::before {
	background-color: var(--tc-color);
}

.tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::after {
	background-color: #fff;
}

.tm-epo-switch-wrapper input:focus + .tm-epo-switch.tc::before {
	border: 1px solid var(--tc-color);
}

.tm-epo-switch-wrapper {
	position: relative;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}

.tm-epo-switch-wrapper-label .tm-epo-switch-wrapper {
	width: 44px;
	max-width: 44px;
	display: inline-block;
}

.message0x0.tm-epo-switch-wrapper {
	max-width: none;
	width: auto;
}

.tm-setting-row-disabled .tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::before,
.tm-setting-row-disabled .tm-epo-switch-wrapper .tm-epo-switch::before {
	background-color: #ecf0f1;
	border-color: #ccc;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-setting-row-disabled .tm-epo-switch-wrapper .tm-epo-switch.tc::after,
.tm-setting-row-disabled .tm-epo-switch-wrapper input:checked + .tm-epo-switch.tc::after {
	background-color: #ecf0f1;
	border-color: #ccc;
	-webkit-box-shadow: none;
	box-shadow: none;
}

/* Radio buttons */
.tm-epo-switch-wrapper .tc-radio-text {
	position: relative;
	display: inline-block;
	min-width: 44px;
	cursor: pointer;
	font-weight: 400;
	text-align: center;
	margin: 0 -1px 0 0 !important;
	padding: 1em;
	background: #fff;
	color: var(--tc-color);
	border: 1px solid #e3e5ed;
	-webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
}

.tm-epo-switch-wrapper .tc-radio-text:hover {
	background: #f2f1fa;
}

.tm-epo-switch-wrapper input:checked + label .tc-radio-text {
	font-weight: 700;
	background: var(--tc-color);
	color: #fff;
}

.tm-epo-switch-wrapper input:first-of-type + label .tc-radio-text {
	border-radius: 10px 0 0 10px;
}

.tm-epo-switch-wrapper input:last-of-type + label .tc-radio-text {
	border-radius: 0 10px 10px 0;
}

.tm-setting-row-disabled.tm-epo-switch-wrapper .tc-radio-text {
	background: #ecf0f1 !important;
	color: #ccc !important;
}

.tm-setting-row-disabled.tm-epo-switch-wrapper input:checked + label .tc-radio-text {
	color: #3b3460 !important;
}

/** General styles **/
.tc-wrapper,
.tc-wrapper div,
.flasho,
.flasho div,
.bsbb,
.tm-bsbb-all * {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tc-hidden,
.tm-hidden {
	display: none !important;
}

.tm-show {
	display: block !important;
}

.tm-text-right {
	text-align: right;
	margin-left: auto !important;
}

.tm-animated,
.bitem,
.builder-wrapper {
	-webkit-animation-fill-mode: both;
	animation-fill-mode: both;
	-webkit-animation-duration: 0.3s;
	animation-duration: 0.3s;
}

.transition,
.tmicon {
	-webkit-transition: all 0.3s ease 0s;
	transition: all 0.3s ease 0s;
}

@-webkit-keyframes appear {

	0% {
		opacity: 0;
		-webkit-transform: translate3d(5%, 0, 0);
		transform: translate3d(5%, 0, 0);
	}

	100% {
		opacity: 1;
		-webkit-transform: translate3d(0, 0, 0);
		transform: translate3d(0, 0, 0);
	}
}

@keyframes appear {

	0% {
		opacity: 0;
		-webkit-transform: translate3d(5%, 0, 0);
		transform: translate3d(5%, 0, 0);
	}

	100% {
		opacity: 1;
		-webkit-transform: translate3d(0, 0, 0);
		transform: translate3d(0, 0, 0);
	}
}

.appear {
	-webkit-animation-name: appear;
	animation-name: appear;
}

.tc-clearfix::after {
	content: "";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
	overflow: hidden;
}

[class^="icon-"]::before,
[class*=" icon-"]::before,
.tcfa::before {
	cursor: inherit !important;
}

.bitem.element-is-disabled:not(.ui-sortable-helper),
.choice-is-disabled {
	-webkit-transition: all 0.3s linear;
	transition: all 0.3s linear;
}

.tc-wrapper .options-wrap.choice-is-disabled {
	opacity: 0.7;
	border: 1px dashed #d00;
	background: #fff;
}

.bitem.element-is-disabled .hstc2 {
	opacity: 0.4;
}

.bitem.element-is-disabled:hover .hstc2 {
	opacity: 1;
	background: transparent;
}

.choice-is-disabled:hover {
	opacity: 1;
}

.bitem .clone:hover,
.bitem .edit:hover,
.bitem .delete:hover,
.bitem .plus:hover,
.bitem .minus:hover {
	-webkit-transition: all 0.2s linear;
	transition: all 0.2s linear;
}

.tm-hide,
.tm-hide-bitems .bitem-wrapper,
.tm-hide-bitems .bitem-add,
.tm-hide-bitems .tc-tab-headers-wrap,
.tm-hide-bitems .tm-slider-wizard-headers {
	visibility: hidden !important;
	padding: 0 !important;
	height: 0 !important;
	width: 0 !important;
	margin: 0 !important;
	min-height: 0 !important;
	min-width: 0 !important;
	opacity: 0 !important;
}

.tc-cell-value,
.tc-cell-url {
	display: none;
}

.overflow {
	overflow: hidden;
}

.clearboth,
.builder-element-wrap .clear {
	clear: both;
	display: block;
	font-size: 0;
	height: 0;
	line-height: 0;
	width: 100%;
}

/********************/

#tc-floatbox-content .wc_error_tip {
	line-height: 1.5;
}

#tc-floatbox-content-pop {
	overflow: auto;
}

.tmicon {
	display: inline-block;
	left: auto !important;
	position: relative;
	right: auto !important;
	overflow: hidden;
	width: 30px !important;
	height: 30px !important;
	line-height: 30px !important;
	font-size: 14px;
	text-align: center;
	cursor: pointer;
	vertical-align: middle;
	margin: 0;
	padding: 0;
	-ms-flex-negative: 0;
	flex-shrink: 0;
}

.tc-button .tmicon {
	width: 1em !important;
	height: 1em !important;
	line-height: 1 !important;
}

button.tmicon {
	background: none;
	border: none;
}

.tmicon.move {
	color: #c7c7d2;
}

.tmicon.move:hover {
	color: var(--tc-color);
}

.tmicon.size {
	font-weight: 700;
	font-size: 10px;
	cursor: default;
	width: auto !important;
	background: none !important;
	border: none !important;
	min-width: 30px;
}

.tmicon.delete {
	color: #949eb0;
}

.tmicon.delete:hover {
	color: #d00;
}

.builder-section-wrap .tmicon.fold {
	margin: 0 5px;
}

.tma-handle .tmicon.fold {
	right: 5px !important;
	top: 5px !important;
	background: none repeat scroll 0 0 transparent;
	position: absolute;
}

.tma-handle .tmicon.fold:hover {
	background: none repeat scroll 0 0 #fff;
	color: var(--tc-color);
}

.tc-button {
	display: inline-block;
	margin-bottom: 0;
	font-weight: 700;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	border: 1px solid transparent;
	background: none;
	white-space: nowrap;
	padding: 0 1.5em;
	font-size: 12px;
	line-height: 30px;
	overflow: hidden;
	position: relative;
	outline: 0 !important;
	border-radius: 3px;
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;
}

.tc-button + .tc-button {
	margin-left: 5px;
}

.tc-button.large {
	font-size: 14px;
	padding: 10px 14px;
}

.tc-button.small {
	font-size: 10px;
	padding: 0 !important;
	line-height: 21px;
	width: 21px;
}

.tc-button.tc {
	color: #fff;
	background-color: var(--tc-color);
}

.tc-button.tc:hover {
	z-index: 2;
}

/**
 * Grid system
 */
.tc-row {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: start !important;
	-ms-flex-pack: start !important;
	justify-content: flex-start !important;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-line-pack: start;
	align-content: flex-start;
	margin: 0 -1em;
	position: relative;
	overflow: auto;
}

.nopadding .tc-row,
.nopadding.tc-row {
	margin: 0;
}

.nomargin .tc-cell {
	margin: 0;
}

.tc-cell {
	position: relative;
	padding: 0 1em;
	margin: 0 0 1.65em;
	float: left;
	min-height: 1px;
	overflow: hidden;
}

.nopadding .tc-cell {
	padding: 0;
}

.tc-col-auto {
	width: auto;
}

.tc-cell.tc-col-auto {
	padding: 0 1em !important;
}

.tc-col-1 {
	width: 8.3334%;
}

.tc-col-2 {
	width: 16.6667%;
}

.tc-col-3 {
	width: 25%;
}

.tc-col-4 {
	width: 33.3334%;
}

.tc-col-5 {
	width: 41.6667%;
}

.tc-col-6 {
	width: 50%;
}

.tc-col-7 {
	width: 58.3334%;
}

.tc-col-8 {
	width: 66.6667%;
}

.tc-col-9 {
	width: 75%;
}

.tc-col-10 {
	width: 83.3334%;
}

.tc-col-11 {
	width: 91.6667%;
}

.tc-col-12 {
	width: 100%;
}

.wauto {
	width: 100% !important;
}

.w12-5 {
	width: 12.5%;
}

.w37-5 {
	width: 37.5%;
}

.w62-5 {
	width: 62.5%;
}

.w87-5 {
	width: 87.5%;
}

.w1 {
	width: 1%;
}

.w2 {
	width: 2%;
}

.w3 {
	width: 3%;
}

.w4 {
	width: 4%;
}

.w5 {
	width: 5%;
}

.w6 {
	width: 6%;
}

.w7 {
	width: 7%;
}

.w8 {
	width: 8%;
}

.w9 {
	width: 9%;
}

.w10 {
	width: 10%;
}

.w11 {
	width: 11%;
}

.w12 {
	width: 12%;
}

.w13 {
	width: 13%;
}

.w14 {
	width: 14%;
}

.w15 {
	width: 15%;
}

.w16 {
	width: 16%;
}

.w17 {
	width: 17%;
}

.w18 {
	width: 18%;
}

.w19 {
	width: 19%;
}

.w20 {
	width: 20%;
}

.w21 {
	width: 21%;
}

.w22 {
	width: 22%;
}

.w23 {
	width: 23%;
}

.w24 {
	width: 24%;
}

.w25 {
	width: 25%;
}

.w26 {
	width: 26%;
}

.w27 {
	width: 27%;
}

.w28 {
	width: 28%;
}

.w29 {
	width: 29%;
}

.w30 {
	width: 30%;
}

.w31 {
	width: 31%;
}

.w32 {
	width: 32%;
}

.w33 {
	width: 33.3333333332%;
}

.w34 {
	width: 34%;
}

.w35 {
	width: 35%;
}

.w36 {
	width: 36%;
}

.w37 {
	width: 37%;
}

.w38 {
	width: 38%;
}

.w39 {
	width: 39%;
}

.w40 {
	width: 40%;
}

.w41 {
	width: 41%;
}

.w42 {
	width: 42%;
}

.w43 {
	width: 43%;
}

.w44 {
	width: 44%;
}

.w45 {
	width: 45%;
}

.w46 {
	width: 46%;
}

.w47 {
	width: 47%;
}

.w48 {
	width: 48%;
}

.w49 {
	width: 49%;
}

.w50 {
	width: 50%;
}

.w51 {
	width: 51%;
}

.w52 {
	width: 52%;
}

.w53 {
	width: 53%;
}

.w54 {
	width: 54%;
}

.w55 {
	width: 55%;
}

.w56 {
	width: 56%;
}

.w57 {
	width: 57%;
}

.w58 {
	width: 58%;
}

.w59 {
	width: 59%;
}

.w60 {
	width: 60%;
}

.w61 {
	width: 61%;
}

.w62 {
	width: 62%;
}

.w63 {
	width: 63%;
}

.w64 {
	width: 64%;
}

.w65 {
	width: 65%;
}

.w66 {
	width: 66.6666666665%;
}

.w67 {
	width: 67%;
}

.w68 {
	width: 68%;
}

.w69 {
	width: 69%;
}

.w70 {
	width: 70%;
}

.w71 {
	width: 71%;
}

.w72 {
	width: 72%;
}

.w73 {
	width: 73%;
}

.w74 {
	width: 74%;
}

.w75 {
	width: 75%;
}

.w76 {
	width: 76%;
}

.w77 {
	width: 77%;
}

.w78 {
	width: 78%;
}

.w79 {
	width: 79%;
}

.w80 {
	width: 80%;
}

.w81 {
	width: 81%;
}

.w82 {
	width: 82%;
}

.w83 {
	width: 83%;
}

.w84 {
	width: 84%;
}

.w85 {
	width: 85%;
}

.w86 {
	width: 86%;
}

.w87 {
	width: 87%;
}

.w88 {
	width: 88%;
}

.w89 {
	width: 89%;
}

.w90 {
	width: 90%;
}

.w91 {
	width: 91%;
}

.w92 {
	width: 92%;
}

.w93 {
	width: 93%;
}

.w94 {
	width: 94%;
}

.w95 {
	width: 95%;
}

.w96 {
	width: 96%;
}

.w97 {
	width: 97%;
}

.w98 {
	width: 98%;
}

.w99 {
	width: 99%;
}

.w100 {
	width: 100%;
}

/* Overrides */
.options-wrap .tc-row.nopadding {
	overflow: visible;
}

.tc-wrapper .options-wrap .tc-cell {
	height: auto;
	line-height: 40px;
	margin: 0;
	text-align: center;
}

.multiple_options .tc-cell {
	font-weight: 700;
	height: 40px;
	line-height: 40px;
	margin: 0;
}

.tc-wrapper .options-wrap .tc-cell.tc-extra-option {
	height: auto;
	padding: 1em 1em 0;
	text-align: left;
}

.tc-wrapper .options-wrap .tc-cell.tm_cell_images {
	text-align: left;
}

.tc-wrapper .options-wrap .tc-cell.tm_cell_title,
.tc-wrapper .options-wrap .tc-cell.tm_cell_defalt {
	overflow: visible;
}

.options-wrap .tc-cell.tm_cell_image {
	text-align: left;
}

.options-wrap .tc-cell.tm_cell_price {
	height: auto;
	max-width: 95%;
	overflow: visible;
	text-align: left;
}

.tc-wrapper .options-wrap .tc-cell.tm_cell_subscriptionfee,
.tc-wrapper .options-wrap .tc-cell.tm_cell_fee,
.tc-wrapper .options-wrap .tc-cell.tc-cell-url,
.tc-wrapper .options-wrap .tc-cell.tm_cell_description,
.tc-wrapper .options-wrap .tc-cell.tm_cell_display,
.tc-wrapper .options-wrap .tc-cell.tm_cell_enabled {
	height: auto;
	padding: 1em 1em 0;
	text-align: left;
}

.tc-wrapper .options-wrap .tc-cell.tm_cell_subscriptionfee .tm-inline-label {
	width: auto;
}

.tm-logic-rule .tc-cell {
	margin: 0;
	padding: 0 1px !important;
}

.tm-logic-rule .tc-cell select,
.tm-logic-rule .tc-cell input {
	width: 100% !important;
}

.tm-logic-rule .tm-logic-func {
	margin-left: auto;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
}

.tc-cell.tm-logic-value {
	-webkit-box-flex: 1;
	-ms-flex: 1 1 100%;
	flex: 1 1 100%;
}

.tc-cell.tm-logic-operator {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 auto;
	flex: 0 1 auto;
	min-width: 100px;
}

.tc-cell.tm-logic-element {
	-webkit-box-flex: 1;
	-ms-flex: 1 1 100%;
	flex: 1 1 100%;
}

.tc-hidden-no-events {
	pointer-events: none !important;
	display: none !important;
}

/** Global form builder **/

#tmformfieldsbuilder,
#tmformfieldsbuilderwrap,
.flasho,
.tm-internal-name,
.tc-info-box {
	font-family: Roboto, "Open Sans", Helvetica, Arial, sans-serif;
}

/* meta box layout */
#tmformfieldsbuilder {
	font-size: 14px;
	line-height: 1.42857143;
	background: none repeat scroll 0 0 #fff;
	padding: 20px;
	float: none;
	width: auto;
}

#tmformfieldsbuilder h2 {
	font-weight: 700;
	font-size: 16px;
	line-height: 18px;
	color: #2f353b;
	padding: 0;
	border: none;
}

#tmformfieldsbuilder .inside {
	padding: 0 !important;
	margin: 0 !important;
}

#tmformfieldsbuilder .handlediv {
	top: 4px;
	position: relative;
}

#wp-excerpt-editor-container .wp-editor-area {
	height: 175px;
	width: 100%;
}

/********************/
.builder-selector {
	overflow: hidden;
	padding: 20px;
	display: none;
	width: 100%;
	border: 1px solid #c3c4c7;
	margin: 20px 0;
	background: #fff;
}

.builder-selector .tc-cell {
	margin: 0;
}

.builder-selector .tc-row,
.builder-selector .tc-cell {
	overflow: visible;
}

.tc-button.tc.alt {
	background-color: #f6f7f7 !important;
	color: var(--tc-color) !important;
	border-color: #dddee4;
}

.tc.tc-button.alt.floatbox-edit-cancel,
.tc.tc-button.alt.floatbox-cancel {
	color: #aeb0b9 !important;
	border: 0 !important;
	background: none !important;
}

/*************************/
.builder_hidden_elements,
.builder_hidden_section {
	display: none;
}

.section_elements.closed {
	display: none;
}

.bitem:hover .tmicon,
.builder-wrapper:hover .builder-section-wrap .btitle .tmicon,
.btitle .tmicon {
	visibility: visible;
}

.builder-wrapper {
	margin: 10px 0;
	padding: 0;
	position: relative;
	vertical-align: top;
	display: inline-block;
	height: auto !important;
	z-index: 1;
}

.builder-wrapper:hover {
	z-index: 5 !important;
}

.builder-wrapper .btitle {
	margin-top: 0;
	min-height: 54px;
	padding: 10px 20px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	overflow: hidden;
}

.builder-wrapper .minus.disabled,
.builder-wrapper .plus.disabled {
	background-color: #d82545 !important;
	color: #fff !important;
}

.builder-section-wrap {
	margin: 0 10px;
	background: #f6f8fa;
	position: relative;
}

.builder-layout {
	padding: 0;
	margin: -10px;
}

.tm-mode-builder .builder-layout {
	margin: 10px;
}

.bitem-wrapper {
	margin: 0;
	padding: 10px 10px;
	min-height: 50px;
}

.bitem-wrapper:empty {
	min-height: 0;
}

.bitem-wrapper.highlight {
	background: transparent;
}

.bitem.ui-sortable-helper {
	z-index: 10000 !important;
}

.bitem.ui-sortable-helper .hstc2 {
	background: var(--tc-color);
	border: 1px solid var(--tc-color);
	color: #fff;
	-webkit-box-shadow: 0 2px 20px 0 rgba(85, 58, 254, 0.2);
	box-shadow: 0 2px 20px 0 rgba(85, 58, 254, 0.2);
	max-width: 300px;
}

.bitem.ui-sortable-helper .tm-label-delete {
	display: none !important;
}

.bitem.ui-sortable-helper .tm-label-desc,
.bitem.ui-sortable-helper .tm-label,
.bitem.ui-sortable-helper .tmicon.move {
	color: #fff;
}

.bitem.ui-sortable-helper .tm-icon-wrap {
	background: #fff !important;
}

.bitem.ui-sortable-helper .tm-icon-wrap .tmfa {
	color: var(--tc-color);
}

.bitem-add + .bitem-wrapper:empty + .bitem-add,
.bitem-wrapper.tm-show:empty ~ .bitem-add {
	display: none;
}

.bitem {
	display: inline-block;
	position: static;
	margin: 0 0 20px;
	vertical-align: top;
	height: auto;
}

.hstc2 {
	background: #fff;
	color: #000;
	min-width: 1% !important;
	position: relative;
	margin: 0 10px 0 10px;
	border-radius: 5px;
}

.hstc2:hover {
	-webkit-box-shadow: 6px 11px 24px #dfe0e7;
	box-shadow: 6px 11px 24px #dfe0e7;
}

.hstc2 .inside {
	display: none !important;
}

.bitem.element-variations .hstc2 {
	margin-top: 10px;
}

@-webkit-keyframes element-outline {

	0% {
		opacity: 0;
	}

	100% {
		opacity: 1;
	}
}

@keyframes element-outline {

	0% {
		opacity: 0;
	}

	100% {
		opacity: 1;
	}
}

.bitem-inner,
.section-inner {
	border: 0;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	letter-spacing: 0;
	z-index: 9998;
	pointer-events: none;
}

.bitem-inner::after,
.section-inner::after {
	content: "";
	width: 100%;
	height: 100%;
	position: absolute;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	border: 1px solid #c3c4c7;
	-webkit-animation: element-outline 0.75s;
	animation: element-outline 0.75s;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.bitem-inner::after {
	border-color: #ebecf0;
}

.builder-wrapper.tma-variations-wrap .builder-section-wrap .bitem-inner::after {
	border: 1px solid #ed8458;
}

.builder-wrapper.tma-variations-wrap .builder-section-wrap .section-inner::after {
	border-color: #dddee4;
}

.bitem.element-is-disabled .bitem-inner::after {
	border: 1px dashed #d3d9e2;
}

.bitem:hover .bitem-inner::after,
.builder-wrapper:hover .section-inner::after {
	content: "";
}

.bitem:hover .bitem-inner::after,
.builder-wrapper:hover .section-inner::after,
.builder-wrapper.tma-variations-wrap .bitem:hover .bitem-inner::after,
.builder-wrapper.tma-variations-wrap:hover .builder-section-wrap .section-inner::after {
	border-color: var(--tc-color);
}

.hstc2:not(:hover) > .bitem-inner .bitem-settings:not(.show),
.builder-section-wrap:not(:hover) > .section-inner .section-settings:not(.show) {
	height: 0;
	visibility: hidden;
	z-index: -1;
	padding: 0 5px;
}

.bitem-settings,
.section-settings {
	padding: 1px 5px;
	word-break: normal;
	clear: unset;
	letter-spacing: normal;
	top: 0;
	left: 0;
	-webkit-transform: translateX(0%) translateY(-100%);
	transform: translateX(0%) translateY(-100%);
	-webkit-transition: all 0.2s cubic-bezier(0.19, 0.83, 0.57, 0.91);
	transition: all 0.2s cubic-bezier(0.19, 0.83, 0.57, 0.91);
	background-color: var(--tc-color);
	border-radius: 5px 5px 0 0;
	-webkit-box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
	box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
	position: absolute;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 30px;
	list-style: none;
	margin: 0;
	font-size: 13px;
	font-weight: 400;
	font-style: normal;
	line-height: 1;
	z-index: 1;
	pointer-events: all;
	-webkit-animation: element-outline 0.25s;
	animation: element-outline 0.25s;
	border-width: 1px 1px 0 1px;
	border-style: solid;
	border-color: rgba(255, 255, 255, 0.5);
}

.bitem-setting,
.section-setting {
	cursor: pointer;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	padding: 0;
	margin: 0 2px;
	font-size: 11px;
	color: #fff;
	width: 25px;
	opacity: 0.7;
}

.bitem-setting:hover,
.section-setting:hover,
.section-setting.size,
.bitem-setting.size {
	opacity: 1;
}

.bitem-setting.size,
.section-setting.size {
	cursor: default;
}

.bitem-setting.size:hover,
.section-setting.size:hover {
	background-color: transparent;
}

.bitem-inner-info {
	padding: 20px 20px 20px 20px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	min-height: 90px;
	overflow: hidden;
}

.bitem .tm-label {
	cursor: default;
	font-weight: 400;
	font-size: 12px;
	line-height: 1.1;
	overflow: hidden;
	padding: 3px 7px 0 7px;
	white-space: nowrap;
	color: #c4c6d0;
}

.tm-label-line {
	height: 2px;
	float: left;
	width: 100%;
	display: none;
}

.tm-label-line-inner {
	color: rgba(0, 0, 0, 0.15);
	width: 100%;
	float: left;
	height: 2px;
}

.tm-icon-wrap {
	font-size: 22px;
	text-align: center;
	height: 1.8em;
	position: relative;
	width: 1.8em;
	display: inline-block;
	background: #000;
	border-radius: 100%;
}

.tm-icon-wrap i {
	font-size: 28px;
}

.tm-icon-wrap .tmfa {
	font-size: 16px;
	position: absolute;
	top: 0;
	bottom: 0;
	margin: auto;
	height: 1em;
	left: 0;
	right: 0;
	color: #fff;
	text-align: center;
}

.bitem.element-variations .tm-icon-wrap {
	background: #ed8458;
}

.bitem.element-variations .tm-label-desc {
	color: #ed8458;
}

.bitem.element-header .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="header"] .tm-icon-wrap,
.bitem.element-divider .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="divider"] .tm-icon-wrap {
	border: 1px solid rgba(0, 0, 0, 0.1);
	background: transparent;
}

.bitem.element-header .tm-icon-wrap .tcfa,
.tm-elements-container .tc-element-button[data-element="header"] .tcfa {
	color: #4c5071;
}

.bitem.element-divider .tm-icon-wrap .tcfa,
.tm-elements-container .tc-element-button[data-element="divider"] .tcfa {
	color: #c0c0c0;
}

.bitem.element-date .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="date"] .tm-icon-wrap {
	background-color: #0d41e1;
}

.bitem.element-time .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="time"] .tm-icon-wrap {
	background-color: #09a6f3;
}

.bitem.element-range .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="range"] .tm-icon-wrap {
	background-color: #a204e6;
}

.bitem.element-color .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="color"] .tm-icon-wrap {
	background-color: #ea1744;
}

.bitem.element-textarea .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="textarea"] .tm-icon-wrap {
	background-color: #8d9098;
}

.bitem.element-textfield .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="textfield"] .tm-icon-wrap {
	background-color: #251f86;
}

.bitem.element-upload .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="upload"] .tm-icon-wrap {
	background-color: #fd12ff;
}

.bitem.element-selectbox .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="selectbox"] .tm-icon-wrap {
	background-color: #09a6f3;
}

.bitem.element-selectboxmultiple .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="selectboxmultiple"] .tm-icon-wrap {
	background-color: #0c63e7;
}

.bitem.element-radiobuttons .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="radiobuttons"] .tm-icon-wrap {
	background-color: #ff7900;
}

.bitem.element-checkboxes .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="checkboxes"] .tm-icon-wrap {
	background-color: #ff4800;
}

.bitem.element-product .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="product"] .tm-icon-wrap {
	background-color: #674399;
}

.bitem.element-template .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="template"] .tm-icon-wrap {
	background-color: #6917d0;
}

.bitem.element-multiple_file_upload .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="multiple_file_upload"] .tm-icon-wrap {
	background-color: #ff0080;
}

.bitem.element-dynamic .tm-icon-wrap,
.tm-elements-container .tc-element-button[data-element="dynamic"] .tm-icon-wrap {
	background-color: #04e762;
}

.tm-label-move {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 2em;
	flex: 0 0 2em;
	text-align: left;
	width: 2em;
}

.tm-label-move .tmicon.move {
	width: 30px !important;
	text-align: center;
}

.tm-label-icon {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 5em;
	flex: 0 0 5em;
	width: 5em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-label-info {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 calc(100% - 7em - 30px);
	flex: 0 0 calc(100% - 7em - 30px);
	width: calc(100% - 7em - 30px);
}

.tm-label-info-hidden .tm-label-info,
.tm-label-info-hidden .tm-label-delete,
.tm-label-info-hidden .tm-label-icon {
	visibility: hidden;
}

.w12-5 .tm-label-icon,
.w12-5 .tm-label-info,
.w20 .tm-label-icon {
	display: none;
}

.w12-5 .tm-label-delete {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 2em;
	flex: 0 0 2em;
	width: 2em;
}

.w20 .tm-label-info {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 calc(100% - 2em - 30px);
	flex: 0 0 calc(100% - 2em - 30px);
	width: calc(100% - 2em - 30px);
}

.w25 .tm-label-icon {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 4em;
	flex: 0 0 4em;
	width: 4em;
}

.w25 .tm-label-info {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 calc(100% - 6em - 30px);
	flex: 0 0 calc(100% - 6em - 30px);
	width: calc(100% - 6em - 30px);
}

.tm-label-delete {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 30px;
	flex: 0 0 30px;
	width: 30px;
}

.bitem .inside {
	left: 0;
	margin: 0 0 0 !important;
	padding: 0;
	width: 100%;
}

.bitem .inside .manager {
	background: none repeat scroll 0 0 #fff;
	margin-left: 0;
	position: relative;
}

.bitem .builder-element-wrap {
	overflow: hidden;
	padding: 12px;
	border-top: 1px solid #ccc;
	background: none repeat scroll 0 0 #f5f5f5;
}

.bitem.pl {
	border-left: 3px dashed var(--tc-color);
	height: 108px !important;
	margin: -20px 4px 4px 9px;
	position: relative;
	width: 10px !important;
}

.bitem.pl span {
	border-color: var(--tc-color) transparent transparent;
	-o-border-image: none;
	border-image: none;
	border-style: solid;
	border-width: 7px;
	display: block;
	height: 0;
	left: 0;
	margin-left: -9px;
	margin-top: 15px;
	position: absolute;
	top: 0;
	width: 0;
}

.bitem.pl2 {
	max-width: 100% !important;
	margin-left: -4px;
	position: relative;
}

.bitem.pl2::after {
	content: "";
	position: absolute;
	background: #eef6ff none repeat scroll 0 0;
	width: calc(100% - 30px);
	height: calc(100% - 4px);
	margin: 2px 18px 0 18px;
	border: 2px dashed #d5dfe7;
}

.bitem .tm-label-desc {
	font-size: 15px;
	font-weight: 700;
	white-space: nowrap;
	color: #4c5071;
	line-height: 23px;
	padding: 5px 7px;
	-webkit-box-pack: start !important;
	-ms-flex-pack: start !important;
	justify-content: flex-start !important;
}

.bitem .tm-label-desc:hover {
	cursor: text;
}

.btitle .tm-label-desc-edit {
	background: #fff;
}

.tm-label-desc-edit {
	border-width: 0 0 1px 0;
	border-style: solid;
	overflow: hidden;
}

.tm-label-desc,
.tm-label-desc-edit {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
	margin: 0;
	line-height: 33px;
	padding: 0;
	font-weight: 700;
	white-space: nowrap;
	color: var(--tc-color);
	overflow: hidden;
	font-size: 15px;
	max-width: 100%;
	width: 100%;
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
}

.btitle .tmicon.move {
	-webkit-box-ordinal-group: 0;
	-ms-flex-order: -1;
	order: -1;
}

.btitle .tmicon.fold {
	-webkit-box-ordinal-group: 15;
	-ms-flex-order: 14;
	order: 14;
	color: #b4b9c7;
	border-radius: 1000%;
}

.btitle .tmicon.fold:hover {
	color: var(--tc-color);
}

.btitle .tmicon.delete {
	-webkit-box-ordinal-group: 16;
	-ms-flex-order: 15;
	order: 15;
}

.tc-epo-style-wrapper input[type="checkbox"],
.tc-epo-style-wrapper input[type="radio"] {
	visibility: hidden;
	display: inline !important;
}

.tm-settings-wrap .tc-epo-style-wrapper-label {
	line-height: 2;
}

.tc-epo-style-wrapper {
	height: 2em;
	width: 2em;
	position: relative;
	display: inline-block;
	margin-right: 5px;
}

/******************************************************************************/
#settingsdiv .meta-priority {
	width: 100%;
}

.meta-priority-label {
	display: block;
	padding-bottom: 6px;
}

.apply-mode-label {
	padding-bottom: 6px;
}

#settingsdiv .inside {
	padding: 0;
	margin: 0;
}

#settingsdiv .tm-epo-switch-wrapper .tc-radio-text {
	padding: 0.5em;
	width: 100%;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	display: inline-block;
	text-overflow: ellipsis;
	overflow: hidden;
}

#settingsdiv .tm-epo-switch-wrapper label {
	-webkit-box-flex: 1;
	-ms-flex: 1 1 auto;
	flex: 1 1 auto;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	max-width: 33%;
}

#misc-settings-actions {
	padding: 6px 0 0;
}

.major-settings-actions {
	background: #f6f7f7;
	padding: 10px;
	border-top: 1px solid #dcdcde;
}

.override-selection {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
	height: 100%;
}

.override-selection.height50 {
	height: 50%;
}

.product_page_tm-global-epo #minor-publishing-actions {
	display: none;
}

.product_page_tm-global-epo #postexcerpt,
.post-type-tm_template_cp #thepostexcerpt {
	display: none;
}

.t.tm-no-editor {
	height: 200px;
}

.tmfa {
	font-style: normal;
	font-variant: normal;
	text-transform: none;
	line-height: 1;
}

.builder_responsive_div .message2x1 {
	padding-left: 2em;
}

.tc-enable-responsive {
	font-weight: 700;
	margin: 0 0 0 1em;
	padding: 4px;
	cursor: pointer;
	color: var(--tc-color);
}

.tc-enable-responsive.active {
	background: var(--tc-color) none repeat scroll 0 0;
	color: #fff;
}

#tmformfieldsbuilderwrap.disabled {
	pointer-events: none;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	background: #fff;
	opacity: 0.6;
}

.tm-element-label:hover,
.tm-internal-label:hover {
	width: auto;
	cursor: text;
}

.btitle .tm-element-label:hover,
.btitle .tm-internal-label:hover {
	background: none;
	cursor: text;
}

.bitem .tm-label-desc-edit {
	padding: 1px 7px;
	line-height: 20px !important;
}

.tc-wrapper .bitem .tm-label-desc-edit .tm-internal-name {
	line-height: 20px !important;
	height: 20px !important;
}

.tc-wrapper .tm-label-desc-edit .tm-internal-name {
	font-size: 15px !important;
	font-weight: 400;
	padding: 0 !important;
	margin: 0 !important;
	line-height: 33px !important;
	height: 33px !important;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	width: 100%;
	border-width: 0 !important;
	border-radius: 0 !important;
	color: var(--tc-color);
}

.tc-wrapper .tm-label-desc-edit .tm-internal-name:focus {
	border-color: var(--tc-color);
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	outline: none !important;
}

.btitle .tm-internal-name {
	text-align: right;
}

.tm-internal-label {
	display: none;
	overflow: hidden;
}

.tc-has-value .tm-element-label {
	display: none;
}

.tc-has-value .tm-internal-label {
	display: inline-block;
}

.tm-wrong-rule .bitem-inner::after,
.tm-wrong-rule .section-inner::after {
	border: 1px solid #d00;
}

.bitem.tm-wrong-rule {
	position: relative;
}

.bitem.tm-wrong-rule::after,
.builder-wrapper.tm-wrong-rule::after {
	background: none repeat scroll 0 0 #f00;
	border-radius: 100%;
	-webkit-box-shadow: 0 2px 5px rgba(255, 0, 0, 0.4);
	box-shadow: 0 2px 5px rgba(255, 0, 0, 0.4);
	color: #fff;
	content: "\f071";
	font-family: tc-fontawesome, sans-serif;
	font-size: 20px;
	font-weight: 900;
	z-index: 10000;
	height: 32px;
	line-height: 32px;
	position: absolute;
	right: 50%;
	margin-right: -16px;
	text-align: center;
	top: -16px;
	width: 32px;
}

/**
 * Drag items
 *
 * .bitem = Element inside builder section
 * .hstc2 = Holds the options inside .bitem
 *
 */

.selected-menu {
	margin-right: 5px;
}

.builder_caption {
	color: #555;
	font-weight: 700;
	font-size: 12px;
	margin: 0 6px 0 0;
	padding: 3px;
}

.builder-panel-add,
.builder-panel-mass-add,
.builder-panel-populate {
	margin: 1em !important;
}

.tm-tags-container {
	background: #fff;
}

.builder-import-file {
	visibility: hidden;
	width: 0;
	height: 0;
}

.fullsize #tmformfieldsbuilderwrap {
	bottom: 0;
	left: 0;
	margin: 0;
	position: fixed;
	right: 0;
	top: 0;
	z-index: 100000;
	background: #fff;
	padding: 0;
}

.fullsize .edit-post-layout__content {
	position: absolute;
}

.fullsize #tmformfieldsbuilderwrap .inside {
	margin: 0 !important;
	padding: 0 !important;
}

.tc-button#builder-fullsize,
.tc-button#builder-fullsize-close {
	background: none !important;
	padding: 0;
	width: 30px;
	height: 30px;
}

.fullsize #tmformfieldsbuilderwrap .hndle,
.fullsize #tmformfieldsbuilderwrap > .handlediv,
#builder-fullsize-close,
.fullsize #tmformfieldsbuilderwrap #builder-fullsize {
	display: none !important;
}

.fullsize #tmformfieldsbuilderwrap #builder-fullsize-close {
	display: inline-block !important;
}

.fullsize #tmformfieldsbuilderwrap .tc-wrapper {
	border-top: 3px solid #ccc;
}

.fullsize #tmformfieldsbuilderwrap .builder-layout {
	bottom: 88px;
	overflow: auto;
	position: fixed;
	top: 117px;
	width: 100%;
	padding: 2em 11px 10px 11px;
	margin: 0;
}

.fullsize #tmformfieldsbuilderwrap .builder-add-section-action {
	bottom: 0;
	position: fixed;
	width: 100%;
}

.fullsize .builder-selector {
	margin-top: 0;
	height: 97px;
	max-height: 97px;
}

.fullsize .tc-warning-text {
	color: #d00;
	font-size: 12px;
	font-weight: 400;
	line-height: 1;
	display: inline-block;
	white-space: pre-line;
	margin: 0 1em;
	padding: 0;
}

.builder-add-section-action {
	padding: 20px;
	margin-top: 20px;
	display: none;
}

.tm-mode-builder .builder-add-section-action {
	margin-top: 10px;
	margin-bottom: 20px;
}

.builder-add-section-and-element.tc-button {
	width: 50%;
}

.tm-add-section-action {
	text-align: center;
}

.tm-add-section-action .tmfa {
	cursor: pointer;
	color: var(--tc-color);
	font-size: 3em;
}

.bitem-add.tc-prepend {
	padding-bottom: 10px;
}

.tm-add-element-action {
	text-align: center;
	padding: 0.5em;
}

.tc-prepend .tm-add-element-action {
	padding-bottom: 5px;
	padding-top: 5px;
}

.tc-append .tm-add-element-action {
	padding-top: 5px;
	padding-bottom: 5px;
}

.bitem-add.tc-append {
	padding-bottom: 20px;
}

.tm-add-element-action .tmfa {
	cursor: pointer;
	color: #b4b9c7;
	font-size: 1.5em;
}

.tm-add-element-action .tmfa:hover {
	color: var(--tc-color);
}

.float-editbox .tm-tags-container .tm-tab {
	display: block;
	padding: 1em;
}

.tm-tags-container .tm-box h4 {
	padding: 1em 2em 1em 1em;
}

.tm-elements-container {
	margin: 0;
	padding: 0 0 1em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tm-element-button {
	background: none;
	border: 1px solid transparent;
	display: inline-block;
	font-size: 1em;
	margin: 0;
	overflow: hidden;
	padding: 0;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 20%;
	flex: 0 0 20%;
	width: 20%;
	cursor: pointer;
}

.tm-element-button:hover {
	border-color: var(--tc-color);
}

.tc-element-button {
	display: table;
	padding: 1em;
	width: 100%;
}

.tc-element-button .tm-label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	height: 4em;
	position: relative;
	vertical-align: middle;
	white-space: normal;
	width: 100%;
}

.tc-element-button .tm-name-wrap {
	padding: 0 10px;
	width: calc(100% - 1.8em - 20px);
}

.tc-element-button .tm-element-name {
	color: #2c3e50;
	font-size: 1.1em;
	font-weight: 700;
}

.tc-element-button .tm-element-description {
	color: #95a5a6;
	display: block;
	font-size: 0.8em;
}

.tc-wrapper select {
	max-width: 100%;
	min-width: 20%;
}

.tc-wrapper {
	padding: 0;
}

.tc-wrapper h1 {
	border-bottom: 1px solid #292421;
	color: #292421;
	font-size: 27px;
	font-weight: 400;
	letter-spacing: 4px;
	margin: 0 0 15px;
	text-align: left;
	text-transform: uppercase;
}

.tc-wrapper .savebuttonfix {
	float: right;
	position: relative;
	top: -50px;
}

.tc-wrapper .infotitle {
	color: #228b22;
}

.tc-wrapper .errortitle {
	color: #dd3d36;
	margin: 5px 0 15px;
	background: none repeat scroll 0 0 #fff;
	border-left: 4px solid #dd3d36;
	-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
	padding: 1px 12px;
}

.tc-wrapper .tm-all-attributes .errortitle {
	margin: 0;
}

.tm-logic-wrapper .error {
	margin: 1em 0;
}

.builder-logic-div,
.shipping-logic-div {
	margin: 1em 0;
}

.builder-logic-div-what {
	padding: 1em;
}

.builder-logic-div-what,
.tm-logic-rule-set {
	border: 1px solid #e8eaee;
	border-radius: 5px;
}

.tm-logic-rule-set {
	background: #fcfcfd;
	padding: 0 1em;
	position: relative;
	margin: 1em 0;
}

.tm-logic-wrapper {
	margin: 1em 0;
}

.tm-logic-rule-set legend {
	text-align: center;
	background: var(--tc-color);
	color: #fff;
	padding: 0.5em 1em;
	border-radius: 5px;
	font-weight: 700;
	position: absolute;
	left: 50%;
	-webkit-transform: translate(-50%, 0%);
	transform: translate(-50%, 0%);

	/* padding line-height*1em/2 parent-font-size/2 parent-border-width */
	top: calc(-0.5em - 0.7em - 13px/2 - 1px);
	font-size: 10px;
}

.tm-logic-rule:not(:first-child)::before {
	background: var(--tc-color);
	content: "AND";
	color: #fff;
	padding: 2px 5px;
	display: block;
	width: auto;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 auto;
	flex: 0 0 auto;
	border-radius: 5px;
	font-size: 10px;
	font-weight: 700;
}

.tm-logic-rule-set:first-child legend {
	display: none;
}

.cpf-add-rule {
	color: var(--tc-color);
}

.epo-rule-toggle {
	margin-right: 6px;
}

.tc-wrapper .line {
	border-bottom: 1px solid #fff;
	position: relative;
}

.tc-wrapper .message0x0 {
	border: 1px solid #ebebeb;
	border-radius: 5px;
	margin: 9px 0;
	padding: 2.2em;
	width: 100%;
	min-height: 33px;
}

.tc-wrapper .message0x0.tm-setting-row-disabled {
	background: none repeat scroll 0 0 #f5f7fb !important;
}

.tc-wrapper .message0x0.tm-setting-row-disabled .message2x1,
.tc-wrapper .message0x0.tm-setting-row-disabled input,
.tc-wrapper .message0x0.tm-setting-row-disabled select,
.tc-wrapper .message0x0.tm-setting-row-disabled textarea {
	color: #ccc !important;
	background: none repeat scroll 0 0 #f5f7fb !important;
}

.tm-setting-row-disabled .tm-weekdays-picker-wrap,
.tm-setting-row-disabled .tm-months-picker-wrap {
	display: none;
}

.tc-wrapper .message2x1 {
	position: relative;
	color: #34495e;
	width: 30%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 30%;
	flex: 0 0 30%;
	font-size: 14px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-pack: justify !important;
	-ms-flex-pack: justify !important;
	justify-content: space-between !important;
}

.tc-wrapper .prepend_span {
	display: inline-block;
	font-weight: 700;
	line-height: 3;
	height: 3em;
	min-width: 50px;
}

.tc-wrapper.horizontal_message .message2x1,
.tc-wrapper.horizontal_message .message2x2 {
	width: auto;
	float: none;
	margin-bottom: 18px;
}

.tc-wrapper.horizontal_message .message0x0 {
	background: none;
	border: 0;
	border-bottom: 1px solid #dfdfdf;
	border-radius: 0;
	margin: 0;
	width: auto;
	padding: 10px;
}

.tc-wrapper .message2x1 span {
	color: #2e335a;
	font-weight: 700;
	vertical-align: middle;
	font-size: 15px;
	margin: 0 0% 0 0;
}

.tc-wrapper .message2x1 span:hover {
	color: var(--tc-color);
}

.tc-wrapper .message2x1 span.tc-pixels {
	font-size: 12px;
	font-weight: 700;
	color: #f00;
}

.tc-wrapper .message2x2 {
	position: relative;
	color: #34495e;
	width: 66%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 66%;
	flex: 0 0 66%;
	margin-left: 4%;
}

.tc-wrapper .message2x2 textarea {
	padding: 4px;
	max-width: 100%;
	width: 100%;
	vertical-align: middle;
	line-height: 24px;
}

.tc-wrapper .message2x2 textarea.tm-panel-populate {
	display: block;
	height: 200px !important;
	margin: 1em;
	width: 50%;
}

.tc-wrapper .message2x2 input[type="text"],
.tc-wrapper .message2x2 select {
	width: 50%;
}

.tc-wrapper .message2x2 .builder-logic-div select,
.tc-wrapper .message2x2 .shipping-logic-div select {
	width: auto;
	min-width: 0;
}

.builder-logic-div select,
.shipping-logic-div select {
	border: 1px solid #d4d8df !important;
	outline: none !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #131924 !important;
	border-radius: 5px !important;
}

.tc-wrapper .message2x2 input[type="number"] {
	width: 20%;
}

.tc-wrapper .message2x2 select {
	color: #3b3460;
	padding: 0 24px 0 8px;
	min-height: 25px;
	line-height: 1;
}

.tc-wrapper .message2x2 .select2-container {
	min-width: 10%;
	width: 50% !important;
}

.tc-wrapper .message2x2 select.fullwidth + .select2-container {
	width: 80% !important;
}

.tc-wrapper .message2x2 .wc-shipping-methods-search + .select2-container,
.tc-wrapper .message2x2 .wc-template-search + .select2-container,
.tc-wrapper .message2x2 .wc-product-search + .select2-container,
.tc-wrapper .message2x2 .wc-category-search + .select2-container,
.tc-wrapper .message2x2 .enhanced-dropdown + .select2-container {
	width: 80% !important;
}

.tc-wrapper .message2x2 input.tm-color-picker {
	padding-top: 9px;
	padding-bottom: 9px;
}

.tc-wrapper .message2x2 .select_wrap select {
	font-size: inherit !important;
	font-weight: inherit !important;
	line-height: inherit !important;
}

.tc-wrapper hr {
	display: block;
	height: 1px;
	border: 0;
	background: rgba(0, 0, 0, 0.2);
	margin: 18px 0;
	padding: 0;
}

.tc-wrapper .messagexdesc {
	clear: both;
	color: #b1b2c1;
	font-size: 12px;
	font-weight: 400;
	margin: 8px 0 0 0;
	letter-spacing: 0.5px;
	width: 100%;
}

.tc-wrapper textarea,
.tc-wrapper input,
.tc-wrapper select {
	font-size: 12px;
}

.wauto .edit {
	background: #0bf !important;
	color: #fff;
}

.padding5 {
	padding: 5px;
}

.fl-overlay {
	background: #000;
	position: fixed;
	display: block;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

.fl-overlay.forfullsize {
	background: #eee;
}

.flasho2 {
	padding: 1em;
	background: none repeat scroll 0 0 #fff;
	height: 100%;
	overflow: auto;
	width: 100%;
}

.flasho {
	background: -webkit-gradient(linear, left top, right top, from(#fcfcfd), to(#fbfbfc));
	background: linear-gradient(to right, #fcfcfd, #fbfbfc);
	color: #fff;
	border: 1px solid #ededee;
	left: 0;
	position: absolute;
	top: 0;
	z-index: 101;
	-webkit-box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	box-shadow: 0 0 1px 4px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	max-height: 100%;
	border-radius: 2px;
	max-width: 100%;
	overflow: hidden;
	display: grid;
	grid-template-rows: minmax(1em, auto) minmax(33%, 1fr) minmax(1em, auto);
	gap: 0;
	font-size: 13px;
	line-height: 1.4;
}

.flasho.tc-color-error {
	border-width: 4px;
}

.flasho.tc-wrapper .message0x0,
.tc-options-group .message0x0 {
	border-radius: 0;
	border-width: 1px;
	border-color: #f1f1f1;
	border-style: none none dotted;
	margin: 0;
	height: auto;
	overflow: hidden;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.flasho.tc-wrapper .message0x0.noborder,
.tc-options-group .message0x0.noborder {
	border: 0;
}

.flasho.tc-wrapper .message0x0:last-child {
	border: 0;
}

.flasho .header {
	line-height: 2;
	padding: 1.5em 2em;
	width: 100%;

}

.flasho .header h3 {
	color: #63728b;
	font-size: 22px;
	font-weight: 700;
	line-height: 28px;
	margin: 0;
}

.flasho .header .tm-element-uniqid {
	color: var(--tc-color);
	font-size: 12px;
	background: #fff;
	position: absolute;
	right: -1px;
	top: -1px;
	padding: 1em;
	line-height: 12px;
	border: 1px solid #edf0f3;
}

.flasho .footer {
	margin: 0;
	padding: 0;
	text-align: right;
	background: #f4f6f9;
}

.flasho .footer .inner {
	border-top: 1px solid #dbe1eb;
	padding: 1em 2em;
	position: relative;
}

.float-editbox {
	position: relative;
	overflow: auto;
	max-width: 100%;
	word-wrap: break-word;
}

.tc-question.flasho {
	border: 0;
	-webkit-box-shadow: 0 0 1px 10px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	box-shadow: 0 0 1px 10px rgba(0, 0, 0, 0.1), 0 0 50px 13px rgba(0, 0, 255, 0.05);
	background: transparent;
	width: auto !important;
	grid-template-rows: minmax(1em, auto) minmax(1em, auto);
}

.tc-question.flasho .header,
.tc-question.flasho .footer {
	position: static;
	background: #fff;
	text-align: center;
	border-radius: 0;
}

.tc-question.flasho .float-editbox {
	display: none;
}

.tc-question.flasho .header h3 {
	width: 100%;
	text-align: center;
	float: none;
}

.tc-question.flasho .footer .inner {
	border: 0;
}

.tm-box {
	padding: 0;
	margin: 0 4px 0 0;
}

.tc-wrapper .tm-box.pl {
	max-width: 100% !important;
	position: relative;
	min-height: 1em;
}

.tc-wrapper .tm-box.pl::after {
	content: "";
	position: absolute;
	background: #e7f5f4 none repeat scroll 0 0;
	width: calc(100% - 5px);
	height: calc(100% - 4px);
	margin: 0;
	border: 2px dotted #26a69a !important;
}

.tm-slider-wizard-headers {
	background: #fff none repeat scroll 0 0;
	padding: 0;
	border-top: 1px solid #c3c4c7;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	position: relative;
	overflow: hidden !important;
	min-height: 47px;
}

.tm-slider-wizard-headers::after {
	content: "";
	position: absolute;
	width: 100%;
	height: 0;
	border-bottom: 1px solid #c3c4c7;
	left: 0;
	bottom: 0;
	display: block;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	z-index: 0;
}

.tm-slider-wizard-headers .tm-box {
	margin: 0 -1px 0 0;
	-ms-flex-negative: 0;
	flex-shrink: 0;
}

.tm-slider-wizard-headers .tm-box:first-child {
	margin: 0 -1px;
}

.tm-add-tab {
	background: transparent;
	color: var(--tc-color);
	margin: 0;
	padding: 0;
	position: absolute;
	top: 0;
	right: 0;
	width: 30px;
	height: 100%;
	border: 1px solid #c3c4c7;
}

.tm-slider-wizard-headers .tab-header.open,
.tm-slider-wizard-headers .tm-box h4.open {
	background: #f6f8fa none repeat scroll 0 0;
	color: var(--tc-color);
}

.tm-slider-wizard-headers .tm-box h4:hover .tm-del-tab:hover {
	background: #d00 none repeat scroll 0 0;
	color: #fff;
}

.tm-slider-wizard-headers .tm-box .tm-del-tab {
	color: #b4b9c7;
	-webkit-box-sizing: content-box !important;
	box-sizing: content-box !important;
}

.tm-slider-wizard-headers .tm-box h4 {
	background: transparent;
	color: #b4b9c7;
	margin: 0;
}

.float-editbox .tab-header-label {
	padding: 0 10px;
}

.float-editbox .tm-arrow {
	text-align: center;
}

.float-editbox .tm-arrow,
.float-editbox .tab-header-label,
.float-editbox .tab-header-icon {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.float-editbox .tm-box h4:focus {
	outline: 0;
	color: var(--tc-color);
	border-width: 1px 1px 0 1px;
	border-color: #c3c4c7;
	border-style: dotted;
}

.float-editbox .tm-box h4.open,
.float-editbox .tm-box h4.open:focus {
	color: var(--tc-color);
	background-color: #fff;
	border-width: 1px 1px 0 1px;
	border-color: #c3c4c7;
	font-weight: 700;
	border-style: solid;
	line-height: 51px;
	margin: 0 0 -1px 0;
}

.float-editbox .tm-box h4.open::before,
.float-editbox .tm-box h4.open::after {
	content: "";
	display: block;
	position: absolute;
	border-bottom: 1px solid #c3c4c7;
	bottom: 0;
	height: 0;
	width: 999em;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tm-box h4.tm-slider-wizard-header::after {
	content: "";
	display: block;
	position: absolute;
	border: 1px solid #c3c4c7;
	top: -1px;
	height: calc(100% + 1px);
	width: 100%;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	z-index: 2;
	left: 0;
	pointer-events: none;
}

.tm-box h4.tm-slider-wizard-header.open::after {
	border-bottom-color: #f6f8fa;
}

.float-editbox .ui-sortable-helper .tm-box h4.open::before,
.float-editbox .ui-sortable-helper .tm-box h4.open::after {
	border: none;
}

.ui-sortable-helper.tm-box h4.tm-slider-wizard-header::after {
	border: 1px dotted #c3c4c7;
}

.float-editbox .tm-box h4.open::before {
	right: 100%;
}

.float-editbox .tm-box h4.open::after {
	left: 100%;
}

.tm-box h4.tm-slider-wizard-header {
	padding: 0 2.5em 0 2em;
	margin: 0;
	position: relative;
	cursor: pointer;
	height: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tm-edit-tab {
	margin: 0 0.5em;
}

.float-editbox .tm-box h4 {
	color: #9b96b5;
	font-weight: 700;
	line-height: 43px;
	margin: 7px 0 -1px 0;
	padding: 0 15px;
	cursor: pointer;
	font-size: 15px;
	white-space: nowrap;
	position: relative;
	border-width: 1px 1px 0 1px;
	border-style: solid;
	border-color: #e2e6e7;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	letter-spacing: -0.4px;
	background: #fafafa;
}

.float-editbox .tm-tab-headers {
	position: relative;
	z-index: 100;
	width: auto;
	min-height: auto;
	padding: 0 2.2em;
	float: none;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 52px;
	overflow: hidden !important;
}

.tm-slider-wizard-headers.has-scroll-arrows,
.float-editbox .has-scroll-arrows.tm-tab-headers {
	margin: 0;
	padding: 0;
	max-width: calc(100% - 60px) !important;
	left: 30px;
}

.tc-tab-headers-wrap {
	position: relative;
	margin-bottom: 20px;
}

.tc-scroll-left-arrow,
.tc-scroll-right-arrow {
	position: absolute;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	display: none;
	cursor: pointer;
	padding: 0;
	line-height: 1;
	width: 1em;
	text-align: center;
	height: 100%;
	top: 0;
	z-index: 102;
	color: #9b96b5;
}

.tc-scroll-left-arrow.scroll-arrow-show,
.tc-scroll-right-arrow.scroll-arrow-show {
	display: block;
	border: 1px solid;
	height: 100%;
	width: 30px;
}

.tc-scroll-left-arrow {
	left: 0;
}

.tc-scroll-right-arrow {
	right: 0;
}

.has-add-button .tm-slider-wizard-headers.has-scroll-arrows,
.float-editbox .has-add-button .has-scroll-arrows.tm-tab-headers {
	max-width: calc(100% - 89px) !important;
}

.has-add-button .tc-scroll-right-arrow {
	right: 29px;
}

.tm-add-tab .tmicon,
.tc-scroll-left-arrow::before,
.tc-scroll-right-arrow::before {
	line-height: 1;
	-webkit-transform: translateY(-50%);
	transform: translateY(-50%);
	top: 50%;
	padding: 0;
	margin: 0;
	position: absolute;
	left: 0;
	right: 0;
}

.tc-scroll-left-arrow::before {
	content: "\25C0";
}

.tc-scroll-right-arrow::before {
	content: "\25B6";
}

.tm-box h4:hover,
.tm-slider-wizard-headers .tm-box h4.open:hover {
	color: var(--tc-color);
}

.tm-del-tab {
	font-size: 12px !important;
	padding: 3px !important;
	position: absolute;
	right: 2px;
	top: 2px;
	width: 1em;
	height: 1em;
	line-height: 1;
	text-align: center;
	margin: 0;
	background: transparent;
}

#tc-product-search .inside > h3 {
	font-size: 1em;
}

#settingsdiv .inside #misc-publishing-actions label,
#tc-product-search .inside > label {
	display: block;
	margin-bottom: 5px;
}

#tc-product-search .chosen-container-multi,
#tc-product-search .select2-container-multi {
	width: 100% !important;
}

#tc-product-search .ajax_chosen_select_tm_product_ids {
	display: none;
}

.tc-wrapper .message0x0 .onerow + .onerow {
	margin-top: 2%;
}

.tc-wrapper .message0x0 .onerow {
	float: none;
	width: 100%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	margin: 0;
}

.tc-wrapper .multiple_options {
	border-bottom: 4px solid #f5f2fc;
	padding-bottom: 1em;
	padding-left: 1em;
	padding-right: 1em;
}

.tc-cell.tm_cell_delete {
	padding: 0 !important;
	-ms-flex-item-align: start;
	align-self: flex-start;
}

.tc-wrapper .options-wrap {
	padding: 2em 1em;
	margin: 0 0 2em 0;
	background: #fdfdfd;
	border: 1px solid #e6e9ed;
	border-radius: 10px;
}

.tc-wrapper .options-wrap.ui-sortable-helper {
	background: linear-gradient(45deg, #fafcfc 0, #f6f9f9 50%, #f8fbfb 100%) !important;
	border: 1px solid #b6bbc3;
	color: #fff;
	-webkit-box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.2);
	box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.2);
}

.tc-wrapper .panel_wrap.pl {
	max-width: 100% !important;
	margin-left: -4px;
	margin-bottom: 1em;
	position: relative;
	min-height: 4em;
}

.tc-wrapper .panel_wrap.pl::after {
	content: "";
	position: absolute;
	background: #e7f5f4 none repeat scroll 0 0;
	width: calc(100% - 4px);
	height: calc(100% - 4px);
	margin: 2px 18px 0 4px;
	border: 2px dotted #26a69a;
}

.multiple_options .tm_cell_default {
	text-align: center;
}

.tc-wrapper .options-wrap .tm-inline-label + input[type="text"],
.tc-wrapper .options-wrap .tm-inline-label + input[type="number"] {
	width: 92%;
}

.tm_upload_image {
	border: 1px solid #8c8f94;
	display: inline-block;
	height: 24px !important;
	overflow: hidden;
	position: relative;
	vertical-align: middle;
	width: 24px !important;
}

.tm-attribute .tm_upload_image {
	height: 5.3em !important;
	margin-left: 1em;
	position: absolute;
	top: -1.2em;
	width: 5.3em !important;
}

.tm_upload_image img.tm_upload_image_img {
	height: auto;
	left: 0;
	position: absolute;
	top: 0;
	width: 100%;
	right: 0;
	bottom: 0;
	margin: auto;
}

.withupload + .tc-upload-button + .tm_upload_image {
	background: #fff;
}

.withupload + .tc-upload-buttonc + .tm_upload_image.tm_upload_imagec {
	background: #fff;
}

.withupload + .tc-upload-buttonp + .tm_upload_image.tm_upload_imagep {
	background: #fff;
}

.withupload + .tc-upload-button,
.cp-button {
	border-radius: 0 !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	background-color: #1abc9c;
	border: 1px solid #8c8f94 !important;
	color: #fff;
	cursor: pointer;
	display: inline-block;
	font-size: 10px;
	height: 24px !important;
	line-height: 24px;
	margin-right: 1px;
	overflow: hidden;
	padding: 0;
	position: relative;
	text-align: center;
	text-transform: uppercase;
	vertical-align: middle;
	width: 24px !important;
}

.withupload + .tc-upload-buttonp {
	background-color: #e67e22;
}

.withupload + .tc-upload-buttonl {
	background-color: #3498db;
}

.withupload {
	padding-right: 63px !important;
}

.builder-image-delete {
	position: absolute;
	top: 0;
	right: 0;
	width: 100%;
	background: #f00;
	height: 100%;
	line-height: 1.5;
	padding: 0 !important;
	color: #fff;
	opacity: 0.9;
	display: none;
}

.tm_upload_image:hover .builder-image-delete {
	display: block;
}

.tc-wrapper .options-wrap input.tm_option_price,
.tc-wrapper .options-wrap input.tm_option_sale_price {
	width: 90px !important;
	margin-right: 0.5em !important;
}

.tc-wrapper .options-wrap select.tm_option_price_type {
	vertical-align: middle;
	width: 150px !important;
}

.tc-wrapper .options-wrap input.tm_option_price,
.tc-wrapper .options-wrap input.tm_option_sale_price,
.tc-wrapper .options-wrap input.tm_option_title,
.tc-wrapper .options-wrap select.tm_option_price_type {
	border-top-left-radius: 0 !important;
	border-color: #8c8f94;
}

.tm_cell_delete {
	margin-left: auto !important;
}

.tm-default-checkbox,
.tm-default-radio {
	left: 50%;
	margin-left: -0.5em !important;
	position: absolute;
	top: 1em;
}

.tc-cell-url .tm_option_url,
.tm_cell_description .tm_option_description,
.tm_cell_display .tm_option_display {
	width: 92% !important;
	margin: 0 !important;
}

.tm_cell_enabled .tm_option_enabled {
	width: auto !important;
	margin: 0 !important;
}

.tm-inline-label {
	display: inline-block;
	font-weight: 300;
	padding-right: 1em;
	text-align: right;
	width: 8%;
}

.tm-hidden-inline {
	display: inline-block;
	visibility: hidden;
}

.tm_cell_images span.tm_upload_image,
.tm_cell_images .withupload + .tc-upload-button {
	max-width: 15% !important;
}

.tm_cell_images .tc-button.small {
	width: 28px;
	line-height: 28px;
	border-radius: 0;
}

.tm-logic-rule {
	margin: 1em 0 !important;
	gap: 1em;
	-ms-flex-wrap: nowrap;
	flex-wrap: nowrap;
}

.float-editbox .tm-tab {
	bottom: 0;
	display: none;
	left: 0;
	overflow: auto;
	position: absolute;
	right: 0;
	top: 52px;
	width: 100%;
	z-index: 1;
	background: #fff;
}

.tm-tabs {
	overflow: hidden;
	position: relative;
}

.float-editbox .tm-tabs {
	bottom: 0;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}

.tc-progress-bar {
	padding: 1em 2em;
}

.tc-progress-info {
	padding: 2em;
}

.tc-percent {
	bottom: 0;
	color: #fff;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	font-size: 2em;
	height: 2em;
	left: auto;
	line-height: 1;
	margin: auto;
	right: 0.5em;
	text-align: center;
	top: 0;
	width: auto;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.tc-progress-info-content {
	display: block;
	font-size: 2em;
	line-height: 1;
	margin: auto;
	text-align: center;
}

.tc-normalize.tc-progress-info-content {
	font-size: 1em;
	height: auto;
	overflow: auto;
}

.tm-inner {
	margin: 1em 2.2em;
	color: #2e335a;
}

.tm-error .header {
	background: none repeat scroll 0 0 #dd3d36;
}

.tm-error .header h3 {
	color: #fff;
}

.tm-error .tm-inner {
	color: #c0392b;
}

.tm-icon {
	margin-right: 0.5em;
}

#tm-tooltip {
	font-family: Roboto, Arial, sans-serif;
	font-size: 0.875em;
	text-align: center;
	text-shadow: 0 1px rgba(0, 0, 0, 0.5);
	line-height: 1.5;
	color: #fff;
	background: #333;
	background: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.6)), to(rgba(0, 0, 0, 0.8)));
	background: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.8));
	border-radius: 5px;
	-webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3);
	box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3);
	position: absolute;
	z-index: 145400;
	padding: 15px;
	pointer-events: none;
}

#tm-tooltip::after {
	width: 0;
	height: 0;
	border-left: 10px solid transparent;
	border-right: 10px solid transparent;
	border-top: 10px solid #333;
	content: "";
	position: absolute;
	left: 50%;
	bottom: -10px;
	margin-left: -10px;
}

#tm-tooltip.top::after {
	border-top-color: transparent;
	border-bottom: 10px solid #333;
	border-bottom-color: rgba(0, 0, 0, 0.6);
	top: -20px;
	bottom: auto;
}

#tm-tooltip.left::after {
	left: 10px;
	margin: 0;
}

#tm-tooltip.right::after {
	right: 10px;
	left: auto;
	margin: 0;
}

.builder_actions {
	float: left;
	text-align: center;
	width: 20%;
}

.column-tm_icl_translations {
	text-align: center !important;
	min-width: 64px !important;
}

.tm_icl_translations.column-tm_icl_translations > img {
	height: auto;
	width: 16px;
	vertical-align: middle;
}

.tm_icl_translations.column-tm_icl_translations > a.tmwpmllink {
	display: inline-block;
	font-size: 16px;
	margin-left: 4px;
	min-width: 18px !important;
	vertical-align: middle;
}

.tm-icl-space {
	display: inline-block;
	margin-left: 4px;
	min-width: 18px !important;
	vertical-align: middle;
}

.tc-wmpl-flag {
	width: 16px;
	height: 16px;
}

.tm-meta-wpml-lang {
	padding: 6px 0 8px;
}

.tm-meta-wpml-translation {
	border-top: 1px solid #ddd;
	padding: 6px 0 8px;
}

.tm-title {
	background: none repeat scroll 0 0 #fcfcfc;
	clear: both;
	padding: 6px 10px 8px;
	margin-top: 1px;
}

.tm-title.added {
	background: none repeat scroll 0 0 #f5f5f5;
}

.tm-title:first-child {
	margin-top: 5px;
}

.tm-title .tmwpmllink {
	float: right;
}

.tm-weekdays-picker {
	font-size: 10px;
	font-weight: 700;
	border: 1px solid transparent;
	margin: 0 3px 0 0;
	padding: 8px;
	color: #a8b0c0;
	background: #ececee;
	border-radius: 5px;
}

.tm-months-picker {
	font-size: 10px;
	font-weight: 700;
	border: 1px solid transparent;
	margin: 0 3px 0 0;
	padding: 8px;
	color: #a8b0c0;
	background: #e9ebef;
	border-radius: 5px;
}

.tm-weekdays-picker.tm-checked,
.tm-months-picker.tm-checked {
	-webkit-box-shadow: 0 6px 8px -8px rgba(0, 0, 0, 0.5);
	box-shadow: 0 6px 8px -8px rgba(0, 0, 0, 0.5);
	background: none repeat scroll 0 0 var(--tc-color);
	color: #fff;
	border: 1px solid #dfdfdf;
}

.tm-weekdays-picker > label,
.tm-month-picker > label {
	vertical-align: baseline;
}

input.tm-weekday-picker,
input.tm-month-picker {
	display: none;
}

.tm-weekday-picker,
.tm-month-picker {
	vertical-align: middle;
}

.tm-weekdays-picker span,
.tm-months-picker span {
	vertical-align: middle;
}

.tc-wrapper .message0x0 .onerow2 {
	background: none repeat scroll 0 0 #fcfcfc;
	float: none;
	margin: 2% 0 0 0;
	padding: 1px;
	width: 100%;
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
}

.justify-content-flex-end {
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
}

.tma-handle-wrap {
	background: none repeat scroll 0 0 #fff;
	border: 1px solid #ecf0f1;
	margin: 1em;
}

.tma-handle {
	background: none repeat scroll 0 0 #ecf0f1;
	color: #555;
	cursor: pointer;
	font-size: 12px;
	height: 40px;
	line-height: 40px;
	padding: 0 1em;
	position: relative;
}

.tm-attribute > .tma-handle {
	background: none repeat scroll 0 0 #7f8c8d;
	color: #fff;
}

.tma-attribute_label {
	font-weight: 700;
}

.tm-border-type {
	background: none repeat scroll 0 0 #fff;
	border: 0 solid;
	height: 50px;
	margin-top: -25px;
	position: absolute;
	right: 50px;
	top: 50%;
	width: 50px;
	border-color: inherit;
	border-width: 1px;
	-webkit-box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
	box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
}

.tm-border-type.circle {
	border-radius: 100%;
	border-width: 1px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-border-type.round {
	border-radius: 5px;
	border-width: 1px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-border-type.square {
	border-radius: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
	border-width: 2px;
}

.tm-border-type.shadow {
	-webkit-box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
	box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.5);
	border-width: 1px;
}

.tm-border-type.thinline {
	border-width: 1px;
	border-radius: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-choice-currency,
.tc-wrapper .message2x1 span.tm-choice-currency {
	background: #2c3e50 none repeat scroll 0 0;
	border: 1px solid;
	color: #ecf0f1;
	font-size: 12px;
	line-height: 12px;
	margin-right: 2px;
	padding: 1px 2px;
	vertical-align: 0 !important;
}

.tm-choice-cl,
.tm-choice-pt,
.tm-choice-from,
.tm-choice-to,
.tm-choice-sale,
.tm-choice-regular {
	font-size: 10px;
	font-weight: 700;
	line-height: 10px;
	padding: 3px 4px;
	position: absolute;
	text-align: left;
	text-transform: uppercase;
	top: -9px;
	margin-left: 1px;
	width: auto;
	border: 1px solid #e3e5ed;
}

.tm-choice-sale {
	border-color: #ff0025;
	background: #ff0025;
	color: #fff;
}

.tm-choice-pt {
	border-color: #3b3460;
	background: #3b3460;
	color: #fff;
}

.tm-choice-cl {
	border-color: #8c8f94;
	background: #8c8f94;
	color: #fff;
}

.tm-choice-regular {
	border-color: #8b65dd;
	background: #8b65dd;
	color: #fff;
}

.tc-welcome {
	padding: 40px 0;
	display: none;
	background: #fff;
}

.tc-info-text {
	color: #3b3462;
	font-size: 36px;
	font-weight: 300;
	line-height: 1.5;
	padding: 40px 0;
	text-align: center;
}

.tm-mode-local .tc-info-text {
	padding: 2em;
	color: #f00;
}

.tc-warning-text {
	color: #d00;
	font-size: 12px;
	font-weight: 400;
	line-height: 1;
	white-space: pre-line;
	padding-top: 10px;
}

.tc-buttons {
	text-align: center;
}

.wp-core-ui .tc-wrapper .tc-buttons .tc-button {
	height: auto;
	line-height: 1;
	margin: 0.5em;
	padding: 1.2em 2.5em;
}

.wp-core-ui .tc-wrapper .tc-button.builder-fullsize,
.wp-core-ui .tc-wrapper .tc-button.builder-fullsize-close {
	border: 0;
}

.wp-core-ui .tc-wrapper .tc-button.tc.disabled.tc-add-import-csv {
	pointer-events: none;
	background: #eee none repeat scroll 0 0 !important;
	color: #aaa !important;
}

.wp-core-ui .tc-wrapper .tc-button.tc.disabled.tc-add-import-csv .tc-warning-text {
	color: #d00 !important;
	max-width: 200px;
}

.wp-core-ui .tc-wrapper .tc-button.builder_add_variation {
	background: #ed8458 none repeat scroll 0 0 !important;
	color: #fff0e5 !important;
}

.wp-core-ui .tc-wrapper .tc-button.tc::after {
	-webkit-transition: all 0.4s cubic-bezier(0.19, 0.83, 0.57, 0.91);
	transition: all 0.4s cubic-bezier(0.19, 0.83, 0.57, 0.91);
	display: block;
	content: "";
	background: transparent;
	width: 100%;
	height: 100%;
	position: absolute;
	left: 0;
	top: 0;
	-webkit-transform: scale(0);
	transform: scale(0);
}

.wp-core-ui .tc-wrapper .tc-button:hover::after {
	background: rgba(0, 0, 0, 0.1);
	width: 100%;
	z-index: 2;
	-webkit-transform: scale(2);
	transform: scale(2);
}

.tc-info-box,
.tc-info {
	margin-bottom: 22px;
	padding: 9px 12px;
	text-align: center;
	font-weight: 400;
	border: 1px solid;
	background: none;
}

.tc-info-box.tc-error,
.tc-info.tc-error {
	background-color: #d00;
	border-color: #d00;
	color: #fff;
}

.tc-info-box.tc-all-products {
	background-color: #fff;
	border-color: var(--tc-color);
	color: var(--tc-color);
}

#tc-enabled-options,
#tc-disabled-options {
	width: 100% !important;
}

.tc-admin-textarea {
	width: 100%;
	min-height: 150px;
	font-family: monospace;
}

.tc-color-active {
	color: #2ecc71;
}

.tc-color-error {
	color: #d00;
}

.tc-error {
	background-color: #d00;
}

.tc-color-notice {
	color: var(--tc-color);
}

.tc-notice {
	background: -webkit-gradient(linear, left top, right top, from(#29cae4), to(var(--tc-color)));
	background: linear-gradient(to right, #29cae4, var(--tc-color));
}

.tc-color-success {
	color: #58cfbf;
}

.tc-success {
	background: #58cfbf;
}

.toast-success {
	background-color: var(--tc-color);
	opacity: 1 !important;
}

.toast-error {
	background-color: #d00;
}

#toast-container > div {
	-webkit-box-shadow: none;
	box-shadow: none;
}

.toast-title {
	color: #fff;
}

.toast-success .toast-message {
	color: #eee;
}

button.tc.tc-button.details-override {
	background: #d00;
}

.tc-add-element .tcfa,
.builder_add_section .tcfa,
.builder_add_variation .tcfa {
	margin-right: 5px;
}

.tc-wrapper .tc-element-setting-edit-tab {
	width: 100%;
}

.tc-wrapper .tc-element-setting-edit-price {
	width: 100%;
	height: 10em;
	font-size: 18px;
	line-height: 30px;
	padding: 14px;
	font-family: monospace;
}

.tc-wrapper .tc-element-setting-edit-price.formula-error {
	border: 2px solid #ff0025;
	color: #ff0025;
}

.tc-wrapper .tc-element-setting-edit-price.formula-correct {
	border: 2px solid #38bb5d;
	color: #38bb5d;
}

.tc-price-variables {
	margin: 1em 0 0 0;
}

.tc-var-header {
	color: var(--tc-color);
	padding: 3px;
	font-weight: 400;
	font-size: 15px;
	margin: 0 0 3px 0;
}

ul.tc-var-list {
	display: block;
	margin: 0 0 1em 0;
}

li.tc-var-field {
	width: auto;
	display: inline-block;
	margin: 1px;
	cursor: pointer;
	letter-spacing: 0;
	color: var(--tc-color);
	border: 1px solid #d8e8ff;
	font-size: 0.9em;
	padding: 4px 6px;
	background: #f2f1fa;
	border-radius: 4px;
}

li.tc-var-field:hover {
	border-color: var(--tc-color);
}

.floatbox-open {
	overflow: hidden;
}

.floatbox-loading {
	color: var(--tc-color);
	position: absolute;
	width: 100%;
	height: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-line-pack: center;
	align-content: center;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	-webkit-box-pack: center;
	-ms-flex-pack: center;
	justify-content: center;
}

/* Form controls */
.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default .select2-selection--single,
.tc-wrapper input.regular-input,
.tc-wrapper input[type="date"],
.tc-wrapper input[type="datetime-local"],
.tc-wrapper input[type="datetime"],
.tc-wrapper input[type="email"],
.tc-wrapper input[type="number"],
.tc-wrapper input[type="password"],
.tc-wrapper input[type="tel"],
.tc-wrapper input[type="text"],
.tc-wrapper input[type="time"],
.tc-wrapper input[type="url"],
.tc-wrapper input[type="week"],
.tc-wrapper textarea {
	border-radius: 3px !important;
	background: #fff;
	-webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	border: 1px solid #e3e5ed;
	padding: 8px 16px;
	line-height: 36px;
	font-size: 13px;
	height: auto;
	color: #3b3460;
	margin: 1px;
	outline: none;
	-webkit-transition: 0.05s border-color ease-in-out;
	transition: 0.05s border-color ease-in-out;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tc-wrapper .options-wrap input[type="text"],
.tc-wrapper .options-wrap input[type="number"] {
	width: 98%;
	line-height: 1 !important;
	padding: 0 6px;
	min-height: 25px;
	margin-top: 0;
	margin-bottom: 0;
	vertical-align: middle;
}

.tc-wrapper input::-webkit-input-placeholder {
	color: #ccc;
}

.tc-wrapper input::-moz-placeholder {
	color: #ccc;
}

.tc-wrapper input:-ms-input-placeholder {
	color: #ccc;
}

.tc-wrapper input::-ms-input-placeholder {
	color: #ccc;
}

.tc-wrapper input::placeholder {
	color: #ccc;
}

.tc-wrapper .select2-container.select2-container--disabled .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--disabled .select2-selection--single {
	background: #ecf0f1 !important;
}

.tc-wrapper input[type="text"]:-webkit-autofill,
.tc-wrapper input[type="text"]:-webkit-autofill:hover,
.tc-wrapper input[type="text"]:-webkit-autofill:focus,
.tc-wrapper input:-webkit-autofill:active {
	-webkit-box-shadow: 0 0 0 1000px #fff inset !important;
	box-shadow: 0 0 0 1000px #fff inset !important;
}

.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default .select2-selection--single {
	padding: 8px 16px;
	line-height: 36px;
	margin: 0;
}

.tc-wrapper input[type="number"] {
	padding-right: 6px;
}

.tc-wrapper .select2-container {
	font-size: 13px !important;
	display: block;
	height: auto !important;
	line-height: 36px !important;
	padding: 0 !important;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.tc-wrapper .select2-container .select2-selection--single {
	border-radius: 3px !important;
	background: #fff !important;
	-webkit-box-shadow: 0 4px 10px 4px rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 10px 4px rgba(0, 0, 0, 0.02) !important;
	border: 1px solid #e3e5ed;
	padding: 0 16px;
	line-height: 36px;
	font-size: 14px;
	height: auto;
}

.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__clear {
	display: none;
}

.tc-wrapper .select2-container .select2-selection__rendered {
	min-height: 36px !important;
	height: auto !important;
	padding: 0 36px 0 0 !important;
	display: block !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #3b3460 !important;
	line-height: 36px !important;
}

.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow {
	height: 36px !important;
	line-height: 36px !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #6a7a90 !important;
	width: 36px;
	background: none;
	position: absolute;
	border: 0;
	top: 9px;
	right: 17px;
	-webkit-box-pack: end;
	-ms-flex-pack: end;
	justify-content: flex-end;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}

.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow::after {
	font-weight: 900;
	font-family: tc-fontawesome, sans-serif;
	content: "\f107";
}

.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow::after {
	color: var(--tc-color);
}

.tc-wrapper .select2-container.select2-container--default .select2-selection--single .select2-selection__arrow b {
	display: none;
	border-color: transparent;
}

.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
	border-color: transparent;
}

.wp-admin .select2-container--open .select2-dropdown.tc-dropdown {
	border: 1px solid var(--tc-color);
	margin-top: -1px;
	padding: 16px 8px;
	-webkit-box-shadow: none;
	box-shadow: none;
	background: #fff;
	z-index: 999999 !important;
}

.wp-admin .select2-container--open .select2-dropdown.tc-dropdown.select2-dropdown--above {
	margin-top: 1px;
}

.wp-admin .select2-container--open .select2-dropdown.tc-dropdown .select2-search--dropdown {
	padding: 0 0 8px 0;
	position: relative;
}

.wp-admin .select2-dropdown.tc-dropdown .select2-results {
	padding: 0;
	margin: 0;
}

.wp-admin .select2-container--default .select2-search--dropdown::before {
	content: "\f179";
	position: absolute;
	right: 16px;
	font-family: dashicons, sans-serif;
	font-size: 16px;
	width: 16px;
	height: 16px;
	line-height: 16px;
	display: block;
	top: 10px;
}

.wp-admin .select2-container--default .select2-search--dropdown input {
	height: 36px !important;
	padding: 0 28px 0 8px;
	border: 1px solid #d2dae3;
	margin: 0 !important;
	background: none;
	border-radius: 3px;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.wp-admin .select2-container--default .select2-search--dropdown .select2-search__field {
	border: 1px solid #d2dae3;
}

.wp-admin .select2-dropdown.tc-dropdown .select2-results li {
	margin: 8px 2px 8px 0;
	border-radius: 3px;
	padding: 0;
}

.wp-admin .select2-dropdown.tc-dropdown .select2-results .select2-results__group,
.wp-admin .select2-dropdown.tc-dropdown .select2-results .select2-results__option {
	margin: 0;
	padding: 8px 0;
}

.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option {
	padding: 0 8px;
	line-height: 36px;
	min-height: 36px;
	height: auto;
	outline: none !important;
	margin: 0;
}

.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results__option[aria-selected="true"],
.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option[data-selected="true"] {
	background-color: transparent;
	color: var(--tc-color);
}

.wp-admin .select2-container--default .select2-dropdown.tc-dropdown .select2-results__option--highlighted[aria-selected] {
	background-color: var(--tc-color);
	color: #fff;
}

.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results__option:focus,
.wp-admin .select2-container--default .select2-dropdown.tc-dropdown.select2-results > .select2-results__options:focus {
	outline: none !important;
}

.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--single,
.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single,
.tc-wrapper textarea:focus,
.tc-wrapper input.regular-input:focus,
.tc-wrapper input[type="date"]:focus,
.tc-wrapper input[type="datetime-local"]:focus,
.tc-wrapper input[type="datetime"]:focus,
.tc-wrapper input[type="email"]:focus,
.tc-wrapper input[type="number"]:focus,
.tc-wrapper input[type="password"]:focus,
.tc-wrapper input[type="tel"]:focus,
.tc-wrapper input[type="text"]:focus,
.tc-wrapper input[type="time"]:focus,
.tc-wrapper input[type="url"]:focus,
.tc-wrapper input[type="week"]:focus {
	-webkit-box-shadow: 0 1px 8px 1px rgba(0, 0, 0, 0.1) !important;
	box-shadow: 0 1px 8px 1px rgba(0, 0, 0, 0.1) !important;
	color: var(--tc-color);
	border: 1px solid var(--tc-color);
}

.tc-wrapper .select2-container.select2-container--default.select2-container--above.select2-container--open .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--above.select2-container--open .select2-selection--single {
	border-radius: 0 0 3px 3px !important;
}

.tc-wrapper .select2-container.select2-container--default.select2-container--below.select2-container--open .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--below.select2-container--open .select2-selection--single {
	border-radius: 3px 3px 0 0 !important;
}

.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--multiple,
.tc-wrapper .select2-container.select2-container--default.select2-container--focus .select2-selection--single,
.tc-wrapper .select2-container.select2-container--default.select2-container--open .select2-selection--single {
	-webkit-box-shadow: none;
	box-shadow: none;
	outline: 0;
}

.tc-wrapper .select2-container.select2-container--disabled.select2-container--focus .select2-selection--single,
.tc-wrapper .select2-container.select2-container--disabled.select2-container--open .select2-selection--single {
	border: solid #e3e5ed 1px !important;
	outline: 0;
	-webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
	box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.02) !important;
}

.tc-wrapper .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice {
	line-height: 16px;
	margin: 5px 5px 5px 0;
	padding: 0.5em;
	border: 1px solid #b39ce1;
	background: #f5f2fc;
	-webkit-box-shadow: none;
	box-shadow: none;
	color: var(--tc-color);
	max-width: 100%;
	text-overflow: ellipsis;
	overflow: hidden;
}

.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
	line-height: 16px;
	margin: 5px 1px 5px 0;
	padding: 0.5em;
	border: 1px solid transparent;
	background: none;
	-webkit-box-shadow: none;
	box-shadow: none;
	color: var(--tc-color);
}

.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__rendered li:first-of-type.select2-search.select2-search.select2-search--inline {
	width: 100%;
}

.tc-wrapper .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
	color: #d00;
	cursor: pointer;
	display: inline-block;
	font-weight: 700;
	float: right;
	margin-left: 0.5em;
}

.tc-wrapper .select2-container .select2-selection--multiple .select2-search__field {
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	border: 0 !important;
	margin: 1px -0.5em;
	padding: 0 0.5em !important;
	width: 100% !important;
	min-height: 0 !important;
	line-height: 1 !important;
	background-image: none !important;
}

.select2-container--default .tc-dropdown .select2-results__option[aria-disabled="true"] {
	color: #ddd;
}

.align-self-start {
	-ms-flex-item-align: start;
	align-self: start;
}

.formula-field-mode-selector .tc-radio-text {
	padding: 5px 10px;
	margin: 0 -1px 6px 0 !important;
}

.tc-wrapper input.cpf-logic-value {
	padding: 0 8px;
	line-height: 21px;
	min-height: 25px;
	margin: 0;
	border: 1px solid #d4d8df !important;
	outline: none !important;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	color: #131924 !important;
	border-radius: 5px !important;
}

.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar {
	background: #eae8f2;
	width: 8px;
}

.float-editbox .tm-tab::-webkit-scrollbar {
	background: #eae8f2;
	width: 14px;
}

.float-editbox .tm-tab::-webkit-scrollbar-button,
.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-button,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-button {
	background: #eae8f2;
}

.float-editbox .tm-tab::-webkit-scrollbar-thumb,
.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-thumb,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-thumb {
	background: var(--tc-color) -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.01)), to(rgba(0, 0, 0, 0.2)));
	background: var(--tc-color) linear-gradient(to top, rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 0.2));
}

.float-editbox .tm-tab::-webkit-resizer,
.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-resizer,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-resizer {
	background: transparent;
}

.float-editbox .tm-tab::-webkit-scrollbar-corner,
.select2-dropdown.tc-dropdown ul.select2-results__options::-webkit-scrollbar-corner,
.woocommerce .tc-wrapper table.form-table textarea::-webkit-scrollbar-corner {
	background: transparent;
}

.float-editbox .tm-tab,
.select2-dropdown.tc-dropdown ul.select2-results__options,
.woocommerce .tc-wrapper table.form-table textarea {
	scrollbar-color: var(--tc-color) #eae8f2;
	scrollbar-width: thin;
}

.blockUI.blockOverlay {
	background: #fff !important;
}

.select2-container--open:not(.select2) {
	z-index: 199999 !important;
}

.tc-filter-content {
	position: absolute;
	width: calc(100% - 44px);
	margin-top: 9px;
	margin-left: 2px;
	border: 1px solid;
	background: #fff;
	left: 0;
	padding: 0.5em 10px;
	display: none;
}

.tc-filter-content select {
	margin-top: 0.5em;
	margin-bottom: 0.5em;
}

.button.tc-filter-label {
	margin: 0 8px 0 0;
	line-height: 30px;
	display: inline-block;
}

input.tc-filter-toggle {
	display: none;
}

input.tc-filter-toggle:checked + .tc-filter-label + .tc-filter-content {
	display: block;
}

input.tc-filter-toggle + .tc-filter-label .tc-filter-hide {
	display: none;
}

input.tc-filter-toggle:checked + .tc-filter-label .tc-filter-hide {
	display: inline;
}

input.tc-filter-toggle:checked + .tc-filter-label .tc-filter-show {
	display: none;
}
assets/css/admin/tm-global-admin-menu.css000064400000000556150755142450014364 0ustar00/* stylelint-disable selector-class-pattern */
.toplevel_page_tcepo .wp-submenu .wp-first-item,
.product_page_tm-global-epo #postexcerpt,
.post-type-tm_template_cp #postexcerpt,
.post-type-tm_lookuptable_cp #postexcerpt {
	display: none;
}

.post-type-tm_template_cp .handle-actions,
.post-type-tm_lookuptable_cp .handle-actions {
	visibility: hidden;
}
assets/css/animate.css000064400000002205150755142450010775 0ustar00/*!
 * CCS3 animations
 */

.tm-animated {
	-webkit-animation-duration: 1s;
	animation-duration: 1s;
	-webkit-animation-fill-mode: both;
	animation-fill-mode: both;
}

.tm-animated.infinite {
	-webkit-animation-iteration-count: infinite;
	animation-iteration-count: infinite;
}

@-webkit-keyframes fadein {

	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}

@keyframes fadein {

	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}

.fadein {
	-webkit-animation-name: fadein;
	animation-name: fadein;
}

@-webkit-keyframes fadeout {

	from {
		opacity: 1;
	}

	to {
		opacity: 0;
	}
}

@keyframes fadeout {

	from {
		opacity: 1;
	}

	to {
		opacity: 0;
	}
}

.fadeout {
	-webkit-animation-name: fadeout;
	animation-name: fadeout;
}

@-webkit-keyframes fadeoutdown {

	from {
		opacity: 1;
	}

	to {
		opacity: 0;

		-webkit-transform: translate3d(0, 100%, 0);

		transform: translate3d(0, 100%, 0);
	}
}

@keyframes fadeoutdown {

	from {
		opacity: 1;
	}

	to {
		opacity: 0;

		-webkit-transform: translate3d(0, 100%, 0);

		transform: translate3d(0, 100%, 0);
	}
}

.fadeoutdown {

	-webkit-animation-name: fadeoutdown;

	animation-name: fadeoutdown;
}
assets/css/fontawesome.min.css000064400000166141150755142450012502 0ustar00/*!
 * Font Awesome Free 5.12.0 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 */.tcfa,.tcfas,.tcfar,.tcfal,.tcfad{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.tcfa-lg{font-size:1.33333em;line-height:.75;vertical-align:-0.0667em}.tcfa-xs{font-size:.75em}.tcfa-sm{font-size:.875em}.tcfa-1x{font-size:1em}.tcfa-2x{font-size:2em}.tcfa-3x{font-size:3em}.tcfa-4x{font-size:4em}.tcfa-5x{font-size:5em}.tcfa-6x{font-size:6em}.tcfa-7x{font-size:7em}.tcfa-8x{font-size:8em}.tcfa-9x{font-size:9em}.tcfa-10x{font-size:10em}.tcfa-fw{text-align:center;width:1.25em}.tcfa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.tcfa-ul>li{position:relative}.tcfa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.tcfa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.tcfa-pull-left{float:left}.tcfa-pull-right{float:right}.tcfa.tcfa-pull-left,.tcfas.tcfa-pull-left,.tcfar.tcfa-pull-left,.tcfal.tcfa-pull-left{margin-right:.3em}.tcfa.tcfa-pull-right,.tcfas.tcfa-pull-right,.tcfar.tcfa-pull-right,.tcfal.tcfa-pull-right{margin-left:.3em}.tcfa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.tcfa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.tcfa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.tcfa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.tcfa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.tcfa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.tcfa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.tcfa-flip-both,.tcfa-flip-horizontal.tcfa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .tcfa-rotate-90,:root .tcfa-rotate-180,:root .tcfa-rotate-270,:root .tcfa-flip-horizontal,:root .tcfa-flip-vertical,:root .tcfa-flip-both{-webkit-filter:none;filter:none}.tcfa-stack{display:inline-block;height:2em;line-height:2;position:relative;vertical-align:middle;width:2.5em}.tcfa-stack-1x,.tcfa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.tcfa-stack-1x{line-height:inherit}.tcfa-stack-2x{font-size:2em}.tcfa-inverse{color:#fff}.tcfa-500px::before{content:"\f26e"}.tcfa-accessible-icon::before{content:"\f368"}.tcfa-accusoft::before{content:"\f369"}.tcfa-acquisitions-incorporated::before{content:"\f6af"}.tcfa-ad::before{content:"\f641"}.tcfa-address-book::before{content:"\f2b9"}.tcfa-address-card::before{content:"\f2bb"}.tcfa-adjust::before{content:"\f042"}.tcfa-adn::before{content:"\f170"}.tcfa-adobe::before{content:"\f778"}.tcfa-adversal::before{content:"\f36a"}.tcfa-affiliatetheme::before{content:"\f36b"}.tcfa-air-freshener::before{content:"\f5d0"}.tcfa-airbnb::before{content:"\f834"}.tcfa-algolia::before{content:"\f36c"}.tcfa-align-center::before{content:"\f037"}.tcfa-align-justify::before{content:"\f039"}.tcfa-align-left::before{content:"\f036"}.tcfa-align-right::before{content:"\f038"}.tcfa-alipay::before{content:"\f642"}.tcfa-allergies::before{content:"\f461"}.tcfa-amazon::before{content:"\f270"}.tcfa-amazon-pay::before{content:"\f42c"}.tcfa-ambulance::before{content:"\f0f9"}.tcfa-american-sign-language-interpreting::before{content:"\f2a3"}.tcfa-amilia::before{content:"\f36d"}.tcfa-anchor::before{content:"\f13d"}.tcfa-android::before{content:"\f17b"}.tcfa-angellist::before{content:"\f209"}.tcfa-angle-double-down::before{content:"\f103"}.tcfa-angle-double-left::before{content:"\f100"}.tcfa-angle-double-right::before{content:"\f101"}.tcfa-angle-double-up::before{content:"\f102"}.tcfa-angle-down::before{content:"\f107"}.tcfa-angle-left::before{content:"\f104"}.tcfa-angle-right::before{content:"\f105"}.tcfa-angle-up::before{content:"\f106"}.tcfa-angry::before{content:"\f556"}.tcfa-angrycreative::before{content:"\f36e"}.tcfa-angular::before{content:"\f420"}.tcfa-ankh::before{content:"\f644"}.tcfa-app-store::before{content:"\f36f"}.tcfa-app-store-ios::before{content:"\f370"}.tcfa-apper::before{content:"\f371"}.tcfa-apple::before{content:"\f179"}.tcfa-apple-alt::before{content:"\f5d1"}.tcfa-apple-pay::before{content:"\f415"}.tcfa-archive::before{content:"\f187"}.tcfa-archway::before{content:"\f557"}.tcfa-arrow-alt-circle-down::before{content:"\f358"}.tcfa-arrow-alt-circle-left::before{content:"\f359"}.tcfa-arrow-alt-circle-right::before{content:"\f35a"}.tcfa-arrow-alt-circle-up::before{content:"\f35b"}.tcfa-arrow-circle-down::before{content:"\f0ab"}.tcfa-arrow-circle-left::before{content:"\f0a8"}.tcfa-arrow-circle-right::before{content:"\f0a9"}.tcfa-arrow-circle-up::before{content:"\f0aa"}.tcfa-arrow-down::before{content:"\f063"}.tcfa-arrow-left::before{content:"\f060"}.tcfa-arrow-right::before{content:"\f061"}.tcfa-arrow-up::before{content:"\f062"}.tcfa-arrows-alt::before{content:"\f0b2"}.tcfa-arrows-alt-h::before{content:"\f337"}.tcfa-arrows-alt-v::before{content:"\f338"}.tcfa-artstation::before{content:"\f77a"}.tcfa-assistive-listening-systems::before{content:"\f2a2"}.tcfa-asterisk::before{content:"\f069"}.tcfa-asymmetrik::before{content:"\f372"}.tcfa-at::before{content:"\f1fa"}.tcfa-atlas::before{content:"\f558"}.tcfa-atlassian::before{content:"\f77b"}.tcfa-atom::before{content:"\f5d2"}.tcfa-audible::before{content:"\f373"}.tcfa-audio-description::before{content:"\f29e"}.tcfa-autoprefixer::before{content:"\f41c"}.tcfa-avianex::before{content:"\f374"}.tcfa-aviato::before{content:"\f421"}.tcfa-award::before{content:"\f559"}.tcfa-aws::before{content:"\f375"}.tcfa-baby::before{content:"\f77c"}.tcfa-baby-carriage::before{content:"\f77d"}.tcfa-backspace::before{content:"\f55a"}.tcfa-backward::before{content:"\f04a"}.tcfa-bacon::before{content:"\f7e5"}.tcfa-bahai::before{content:"\f666"}.tcfa-balance-scale::before{content:"\f24e"}.tcfa-balance-scale-left::before{content:"\f515"}.tcfa-balance-scale-right::before{content:"\f516"}.tcfa-ban::before{content:"\f05e"}.tcfa-band-aid::before{content:"\f462"}.tcfa-bandcamp::before{content:"\f2d5"}.tcfa-barcode::before{content:"\f02a"}.tcfa-bars::before{content:"\f0c9"}.tcfa-baseball-ball::before{content:"\f433"}.tcfa-basketball-ball::before{content:"\f434"}.tcfa-bath::before{content:"\f2cd"}.tcfa-battery-empty::before{content:"\f244"}.tcfa-battery-full::before{content:"\f240"}.tcfa-battery-half::before{content:"\f242"}.tcfa-battery-quarter::before{content:"\f243"}.tcfa-battery-three-quarters::before{content:"\f241"}.tcfa-battle-net::before{content:"\f835"}.tcfa-bed::before{content:"\f236"}.tcfa-beer::before{content:"\f0fc"}.tcfa-behance::before{content:"\f1b4"}.tcfa-behance-square::before{content:"\f1b5"}.tcfa-bell::before{content:"\f0f3"}.tcfa-bell-slash::before{content:"\f1f6"}.tcfa-bezier-curve::before{content:"\f55b"}.tcfa-bible::before{content:"\f647"}.tcfa-bicycle::before{content:"\f206"}.tcfa-biking::before{content:"\f84a"}.tcfa-bimobject::before{content:"\f378"}.tcfa-binoculars::before{content:"\f1e5"}.tcfa-biohazard::before{content:"\f780"}.tcfa-birthday-cake::before{content:"\f1fd"}.tcfa-bitbucket::before{content:"\f171"}.tcfa-bitcoin::before{content:"\f379"}.tcfa-bity::before{content:"\f37a"}.tcfa-black-tie::before{content:"\f27e"}.tcfa-blackberry::before{content:"\f37b"}.tcfa-blender::before{content:"\f517"}.tcfa-blender-phone::before{content:"\f6b6"}.tcfa-blind::before{content:"\f29d"}.tcfa-blog::before{content:"\f781"}.tcfa-blogger::before{content:"\f37c"}.tcfa-blogger-b::before{content:"\f37d"}.tcfa-bluetooth::before{content:"\f293"}.tcfa-bluetooth-b::before{content:"\f294"}.tcfa-bold::before{content:"\f032"}.tcfa-bolt::before{content:"\f0e7"}.tcfa-bomb::before{content:"\f1e2"}.tcfa-bone::before{content:"\f5d7"}.tcfa-bong::before{content:"\f55c"}.tcfa-book::before{content:"\f02d"}.tcfa-book-dead::before{content:"\f6b7"}.tcfa-book-medical::before{content:"\f7e6"}.tcfa-book-open::before{content:"\f518"}.tcfa-book-reader::before{content:"\f5da"}.tcfa-bookmark::before{content:"\f02e"}.tcfa-bootstrap::before{content:"\f836"}.tcfa-border-all::before{content:"\f84c"}.tcfa-border-none::before{content:"\f850"}.tcfa-border-style::before{content:"\f853"}.tcfa-bowling-ball::before{content:"\f436"}.tcfa-box::before{content:"\f466"}.tcfa-box-open::before{content:"\f49e"}.tcfa-boxes::before{content:"\f468"}.tcfa-braille::before{content:"\f2a1"}.tcfa-brain::before{content:"\f5dc"}.tcfa-bread-slice::before{content:"\f7ec"}.tcfa-briefcase::before{content:"\f0b1"}.tcfa-briefcase-medical::before{content:"\f469"}.tcfa-broadcast-tower::before{content:"\f519"}.tcfa-broom::before{content:"\f51a"}.tcfa-brush::before{content:"\f55d"}.tcfa-btc::before{content:"\f15a"}.tcfa-buffer::before{content:"\f837"}.tcfa-bug::before{content:"\f188"}.tcfa-building::before{content:"\f1ad"}.tcfa-bullhorn::before{content:"\f0a1"}.tcfa-bullseye::before{content:"\f140"}.tcfa-burn::before{content:"\f46a"}.tcfa-buromobelexperte::before{content:"\f37f"}.tcfa-bus::before{content:"\f207"}.tcfa-bus-alt::before{content:"\f55e"}.tcfa-business-time::before{content:"\f64a"}.tcfa-buy-n-large::before{content:"\f8a6"}.tcfa-buysellads::before{content:"\f20d"}.tcfa-calculator::before{content:"\f1ec"}.tcfa-calendar::before{content:"\f133"}.tcfa-calendar-alt::before{content:"\f073"}.tcfa-calendar-check::before{content:"\f274"}.tcfa-calendar-day::before{content:"\f783"}.tcfa-calendar-minus::before{content:"\f272"}.tcfa-calendar-plus::before{content:"\f271"}.tcfa-calendar-times::before{content:"\f273"}.tcfa-calendar-week::before{content:"\f784"}.tcfa-camera::before{content:"\f030"}.tcfa-camera-retro::before{content:"\f083"}.tcfa-campground::before{content:"\f6bb"}.tcfa-canadian-maple-leaf::before{content:"\f785"}.tcfa-candy-cane::before{content:"\f786"}.tcfa-cannabis::before{content:"\f55f"}.tcfa-capsules::before{content:"\f46b"}.tcfa-car::before{content:"\f1b9"}.tcfa-car-alt::before{content:"\f5de"}.tcfa-car-battery::before{content:"\f5df"}.tcfa-car-crash::before{content:"\f5e1"}.tcfa-car-side::before{content:"\f5e4"}.tcfa-caravan::before{content:"\f8ff"}.tcfa-caret-down::before{content:"\f0d7"}.tcfa-caret-left::before{content:"\f0d9"}.tcfa-caret-right::before{content:"\f0da"}.tcfa-caret-square-down::before{content:"\f150"}.tcfa-caret-square-left::before{content:"\f191"}.tcfa-caret-square-right::before{content:"\f152"}.tcfa-caret-square-up::before{content:"\f151"}.tcfa-caret-up::before{content:"\f0d8"}.tcfa-carrot::before{content:"\f787"}.tcfa-cart-arrow-down::before{content:"\f218"}.tcfa-cart-plus::before{content:"\f217"}.tcfa-cash-register::before{content:"\f788"}.tcfa-cat::before{content:"\f6be"}.tcfa-cc-amazon-pay::before{content:"\f42d"}.tcfa-cc-amex::before{content:"\f1f3"}.tcfa-cc-apple-pay::before{content:"\f416"}.tcfa-cc-diners-club::before{content:"\f24c"}.tcfa-cc-discover::before{content:"\f1f2"}.tcfa-cc-jcb::before{content:"\f24b"}.tcfa-cc-mastercard::before{content:"\f1f1"}.tcfa-cc-paypal::before{content:"\f1f4"}.tcfa-cc-stripe::before{content:"\f1f5"}.tcfa-cc-visa::before{content:"\f1f0"}.tcfa-centercode::before{content:"\f380"}.tcfa-centos::before{content:"\f789"}.tcfa-certificate::before{content:"\f0a3"}.tcfa-chair::before{content:"\f6c0"}.tcfa-chalkboard::before{content:"\f51b"}.tcfa-chalkboard-teacher::before{content:"\f51c"}.tcfa-charging-station::before{content:"\f5e7"}.tcfa-chart-area::before{content:"\f1fe"}.tcfa-chart-bar::before{content:"\f080"}.tcfa-chart-line::before{content:"\f201"}.tcfa-chart-pie::before{content:"\f200"}.tcfa-check::before{content:"\f00c"}.tcfa-check-circle::before{content:"\f058"}.tcfa-check-double::before{content:"\f560"}.tcfa-check-square::before{content:"\f14a"}.tcfa-cheese::before{content:"\f7ef"}.tcfa-chess::before{content:"\f439"}.tcfa-chess-bishop::before{content:"\f43a"}.tcfa-chess-board::before{content:"\f43c"}.tcfa-chess-king::before{content:"\f43f"}.tcfa-chess-knight::before{content:"\f441"}.tcfa-chess-pawn::before{content:"\f443"}.tcfa-chess-queen::before{content:"\f445"}.tcfa-chess-rook::before{content:"\f447"}.tcfa-chevron-circle-down::before{content:"\f13a"}.tcfa-chevron-circle-left::before{content:"\f137"}.tcfa-chevron-circle-right::before{content:"\f138"}.tcfa-chevron-circle-up::before{content:"\f139"}.tcfa-chevron-down::before{content:"\f078"}.tcfa-chevron-left::before{content:"\f053"}.tcfa-chevron-right::before{content:"\f054"}.tcfa-chevron-up::before{content:"\f077"}.tcfa-child::before{content:"\f1ae"}.tcfa-chrome::before{content:"\f268"}.tcfa-chromecast::before{content:"\f838"}.tcfa-church::before{content:"\f51d"}.tcfa-circle::before{content:"\f111"}.tcfa-circle-notch::before{content:"\f1ce"}.tcfa-city::before{content:"\f64f"}.tcfa-clinic-medical::before{content:"\f7f2"}.tcfa-clipboard::before{content:"\f328"}.tcfa-clipboard-check::before{content:"\f46c"}.tcfa-clipboard-list::before{content:"\f46d"}.tcfa-clock::before{content:"\f017"}.tcfa-clone::before{content:"\f24d"}.tcfa-closed-captioning::before{content:"\f20a"}.tcfa-cloud::before{content:"\f0c2"}.tcfa-cloud-download-alt::before{content:"\f381"}.tcfa-cloud-meatball::before{content:"\f73b"}.tcfa-cloud-moon::before{content:"\f6c3"}.tcfa-cloud-moon-rain::before{content:"\f73c"}.tcfa-cloud-rain::before{content:"\f73d"}.tcfa-cloud-showers-heavy::before{content:"\f740"}.tcfa-cloud-sun::before{content:"\f6c4"}.tcfa-cloud-sun-rain::before{content:"\f743"}.tcfa-cloud-upload-alt::before{content:"\f382"}.tcfa-cloudscale::before{content:"\f383"}.tcfa-cloudsmith::before{content:"\f384"}.tcfa-cloudversify::before{content:"\f385"}.tcfa-cocktail::before{content:"\f561"}.tcfa-code::before{content:"\f121"}.tcfa-code-branch::before{content:"\f126"}.tcfa-codepen::before{content:"\f1cb"}.tcfa-codiepie::before{content:"\f284"}.tcfa-coffee::before{content:"\f0f4"}.tcfa-cog::before{content:"\f013"}.tcfa-cogs::before{content:"\f085"}.tcfa-coins::before{content:"\f51e"}.tcfa-columns::before{content:"\f0db"}.tcfa-comment::before{content:"\f075"}.tcfa-comment-alt::before{content:"\f27a"}.tcfa-comment-dollar::before{content:"\f651"}.tcfa-comment-dots::before{content:"\f4ad"}.tcfa-comment-medical::before{content:"\f7f5"}.tcfa-comment-slash::before{content:"\f4b3"}.tcfa-comments::before{content:"\f086"}.tcfa-comments-dollar::before{content:"\f653"}.tcfa-compact-disc::before{content:"\f51f"}.tcfa-compass::before{content:"\f14e"}.tcfa-compress::before{content:"\f066"}.tcfa-compress-alt::before{content:"\f422"}.tcfa-compress-arrows-alt::before{content:"\f78c"}.tcfa-concierge-bell::before{content:"\f562"}.tcfa-confluence::before{content:"\f78d"}.tcfa-connectdevelop::before{content:"\f20e"}.tcfa-contao::before{content:"\f26d"}.tcfa-cookie::before{content:"\f563"}.tcfa-cookie-bite::before{content:"\f564"}.tcfa-copy::before{content:"\f0c5"}.tcfa-copyright::before{content:"\f1f9"}.tcfa-cotton-bureau::before{content:"\f89e"}.tcfa-couch::before{content:"\f4b8"}.tcfa-cpanel::before{content:"\f388"}.tcfa-creative-commons::before{content:"\f25e"}.tcfa-creative-commons-by::before{content:"\f4e7"}.tcfa-creative-commons-nc::before{content:"\f4e8"}.tcfa-creative-commons-nc-eu::before{content:"\f4e9"}.tcfa-creative-commons-nc-jp::before{content:"\f4ea"}.tcfa-creative-commons-nd::before{content:"\f4eb"}.tcfa-creative-commons-pd::before{content:"\f4ec"}.tcfa-creative-commons-pd-alt::before{content:"\f4ed"}.tcfa-creative-commons-remix::before{content:"\f4ee"}.tcfa-creative-commons-sa::before{content:"\f4ef"}.tcfa-creative-commons-sampling::before{content:"\f4f0"}.tcfa-creative-commons-sampling-plus::before{content:"\f4f1"}.tcfa-creative-commons-share::before{content:"\f4f2"}.tcfa-creative-commons-zero::before{content:"\f4f3"}.tcfa-credit-card::before{content:"\f09d"}.tcfa-critical-role::before{content:"\f6c9"}.tcfa-crop::before{content:"\f125"}.tcfa-crop-alt::before{content:"\f565"}.tcfa-cross::before{content:"\f654"}.tcfa-crosshairs::before{content:"\f05b"}.tcfa-crow::before{content:"\f520"}.tcfa-crown::before{content:"\f521"}.tcfa-crutch::before{content:"\f7f7"}.tcfa-css3::before{content:"\f13c"}.tcfa-css3-alt::before{content:"\f38b"}.tcfa-cube::before{content:"\f1b2"}.tcfa-cubes::before{content:"\f1b3"}.tcfa-cut::before{content:"\f0c4"}.tcfa-cuttlefish::before{content:"\f38c"}.tcfa-d-and-d::before{content:"\f38d"}.tcfa-d-and-d-beyond::before{content:"\f6ca"}.tcfa-dashcube::before{content:"\f210"}.tcfa-database::before{content:"\f1c0"}.tcfa-deaf::before{content:"\f2a4"}.tcfa-delicious::before{content:"\f1a5"}.tcfa-democrat::before{content:"\f747"}.tcfa-deploydog::before{content:"\f38e"}.tcfa-deskpro::before{content:"\f38f"}.tcfa-desktop::before{content:"\f108"}.tcfa-dev::before{content:"\f6cc"}.tcfa-deviantart::before{content:"\f1bd"}.tcfa-dharmachakra::before{content:"\f655"}.tcfa-dhl::before{content:"\f790"}.tcfa-diagnoses::before{content:"\f470"}.tcfa-diaspora::before{content:"\f791"}.tcfa-dice::before{content:"\f522"}.tcfa-dice-d20::before{content:"\f6cf"}.tcfa-dice-d6::before{content:"\f6d1"}.tcfa-dice-five::before{content:"\f523"}.tcfa-dice-four::before{content:"\f524"}.tcfa-dice-one::before{content:"\f525"}.tcfa-dice-six::before{content:"\f526"}.tcfa-dice-three::before{content:"\f527"}.tcfa-dice-two::before{content:"\f528"}.tcfa-digg::before{content:"\f1a6"}.tcfa-digital-ocean::before{content:"\f391"}.tcfa-digital-tachograph::before{content:"\f566"}.tcfa-directions::before{content:"\f5eb"}.tcfa-discord::before{content:"\f392"}.tcfa-discourse::before{content:"\f393"}.tcfa-divide::before{content:"\f529"}.tcfa-dizzy::before{content:"\f567"}.tcfa-dna::before{content:"\f471"}.tcfa-dochub::before{content:"\f394"}.tcfa-docker::before{content:"\f395"}.tcfa-dog::before{content:"\f6d3"}.tcfa-dollar-sign::before{content:"\f155"}.tcfa-dolly::before{content:"\f472"}.tcfa-dolly-flatbed::before{content:"\f474"}.tcfa-donate::before{content:"\f4b9"}.tcfa-door-closed::before{content:"\f52a"}.tcfa-door-open::before{content:"\f52b"}.tcfa-dot-circle::before{content:"\f192"}.tcfa-dove::before{content:"\f4ba"}.tcfa-download::before{content:"\f019"}.tcfa-draft2digital::before{content:"\f396"}.tcfa-drafting-compass::before{content:"\f568"}.tcfa-dragon::before{content:"\f6d5"}.tcfa-draw-polygon::before{content:"\f5ee"}.tcfa-dribbble::before{content:"\f17d"}.tcfa-dribbble-square::before{content:"\f397"}.tcfa-dropbox::before{content:"\f16b"}.tcfa-drum::before{content:"\f569"}.tcfa-drum-steelpan::before{content:"\f56a"}.tcfa-drumstick-bite::before{content:"\f6d7"}.tcfa-drupal::before{content:"\f1a9"}.tcfa-dumbbell::before{content:"\f44b"}.tcfa-dumpster::before{content:"\f793"}.tcfa-dumpster-fire::before{content:"\f794"}.tcfa-dungeon::before{content:"\f6d9"}.tcfa-dyalog::before{content:"\f399"}.tcfa-earlybirds::before{content:"\f39a"}.tcfa-ebay::before{content:"\f4f4"}.tcfa-edge::before{content:"\f282"}.tcfa-edit::before{content:"\f044"}.tcfa-egg::before{content:"\f7fb"}.tcfa-eject::before{content:"\f052"}.tcfa-elementor::before{content:"\f430"}.tcfa-ellipsis-h::before{content:"\f141"}.tcfa-ellipsis-v::before{content:"\f142"}.tcfa-ello::before{content:"\f5f1"}.tcfa-ember::before{content:"\f423"}.tcfa-empire::before{content:"\f1d1"}.tcfa-envelope::before{content:"\f0e0"}.tcfa-envelope-open::before{content:"\f2b6"}.tcfa-envelope-open-text::before{content:"\f658"}.tcfa-envelope-square::before{content:"\f199"}.tcfa-envira::before{content:"\f299"}.tcfa-equals::before{content:"\f52c"}.tcfa-eraser::before{content:"\f12d"}.tcfa-erlang::before{content:"\f39d"}.tcfa-ethereum::before{content:"\f42e"}.tcfa-ethernet::before{content:"\f796"}.tcfa-etsy::before{content:"\f2d7"}.tcfa-euro-sign::before{content:"\f153"}.tcfa-evernote::before{content:"\f839"}.tcfa-exchange-alt::before{content:"\f362"}.tcfa-exclamation::before{content:"\f12a"}.tcfa-exclamation-circle::before{content:"\f06a"}.tcfa-exclamation-triangle::before{content:"\f071"}.tcfa-expand::before{content:"\f065"}.tcfa-expand-alt::before{content:"\f424"}.tcfa-expand-arrows-alt::before{content:"\f31e"}.tcfa-expeditedssl::before{content:"\f23e"}.tcfa-external-link-alt::before{content:"\f35d"}.tcfa-external-link-square-alt::before{content:"\f360"}.tcfa-eye::before{content:"\f06e"}.tcfa-eye-dropper::before{content:"\f1fb"}.tcfa-eye-slash::before{content:"\f070"}.tcfa-facebook::before{content:"\f09a"}.tcfa-facebook-f::before{content:"\f39e"}.tcfa-facebook-messenger::before{content:"\f39f"}.tcfa-facebook-square::before{content:"\f082"}.tcfa-fan::before{content:"\f863"}.tcfa-fantasy-flight-games::before{content:"\f6dc"}.tcfa-fast-backward::before{content:"\f049"}.tcfa-fast-forward::before{content:"\f050"}.tcfa-fax::before{content:"\f1ac"}.tcfa-feather::before{content:"\f52d"}.tcfa-feather-alt::before{content:"\f56b"}.tcfa-fedex::before{content:"\f797"}.tcfa-fedora::before{content:"\f798"}.tcfa-female::before{content:"\f182"}.tcfa-fighter-jet::before{content:"\f0fb"}.tcfa-figma::before{content:"\f799"}.tcfa-file::before{content:"\f15b"}.tcfa-file-alt::before{content:"\f15c"}.tcfa-file-archive::before{content:"\f1c6"}.tcfa-file-audio::before{content:"\f1c7"}.tcfa-file-code::before{content:"\f1c9"}.tcfa-file-contract::before{content:"\f56c"}.tcfa-file-csv::before{content:"\f6dd"}.tcfa-file-download::before{content:"\f56d"}.tcfa-file-excel::before{content:"\f1c3"}.tcfa-file-export::before{content:"\f56e"}.tcfa-file-image::before{content:"\f1c5"}.tcfa-file-import::before{content:"\f56f"}.tcfa-file-invoice::before{content:"\f570"}.tcfa-file-invoice-dollar::before{content:"\f571"}.tcfa-file-medical::before{content:"\f477"}.tcfa-file-medical-alt::before{content:"\f478"}.tcfa-file-pdf::before{content:"\f1c1"}.tcfa-file-powerpoint::before{content:"\f1c4"}.tcfa-file-prescription::before{content:"\f572"}.tcfa-file-signature::before{content:"\f573"}.tcfa-file-upload::before{content:"\f574"}.tcfa-file-video::before{content:"\f1c8"}.tcfa-file-word::before{content:"\f1c2"}.tcfa-fill::before{content:"\f575"}.tcfa-fill-drip::before{content:"\f576"}.tcfa-film::before{content:"\f008"}.tcfa-filter::before{content:"\f0b0"}.tcfa-fingerprint::before{content:"\f577"}.tcfa-fire::before{content:"\f06d"}.tcfa-fire-alt::before{content:"\f7e4"}.tcfa-fire-extinguisher::before{content:"\f134"}.tcfa-firefox::before{content:"\f269"}.tcfa-firefox-browser::before{content:"\f907"}.tcfa-first-aid::before{content:"\f479"}.tcfa-first-order::before{content:"\f2b0"}.tcfa-first-order-alt::before{content:"\f50a"}.tcfa-firstdraft::before{content:"\f3a1"}.tcfa-fish::before{content:"\f578"}.tcfa-fist-raised::before{content:"\f6de"}.tcfa-flag::before{content:"\f024"}.tcfa-flag-checkered::before{content:"\f11e"}.tcfa-flag-usa::before{content:"\f74d"}.tcfa-flask::before{content:"\f0c3"}.tcfa-flickr::before{content:"\f16e"}.tcfa-flipboard::before{content:"\f44d"}.tcfa-flushed::before{content:"\f579"}.tcfa-fly::before{content:"\f417"}.tcfa-folder::before{content:"\f07b"}.tcfa-folder-minus::before{content:"\f65d"}.tcfa-folder-open::before{content:"\f07c"}.tcfa-folder-plus::before{content:"\f65e"}.tcfa-font::before{content:"\f031"}.tcfa-font-awesome::before{content:"\f2b4"}.tcfa-font-awesome-alt::before{content:"\f35c"}.tcfa-font-awesome-flag::before{content:"\f425"}.tcfa-font-awesome-logo-full::before{content:"\f4e6"}.tcfa-fonticons::before{content:"\f280"}.tcfa-fonticons-fi::before{content:"\f3a2"}.tcfa-football-ball::before{content:"\f44e"}.tcfa-fort-awesome::before{content:"\f286"}.tcfa-fort-awesome-alt::before{content:"\f3a3"}.tcfa-forumbee::before{content:"\f211"}.tcfa-forward::before{content:"\f04e"}.tcfa-foursquare::before{content:"\f180"}.tcfa-free-code-camp::before{content:"\f2c5"}.tcfa-freebsd::before{content:"\f3a4"}.tcfa-frog::before{content:"\f52e"}.tcfa-frown::before{content:"\f119"}.tcfa-frown-open::before{content:"\f57a"}.tcfa-fulcrum::before{content:"\f50b"}.tcfa-funnel-dollar::before{content:"\f662"}.tcfa-futbol::before{content:"\f1e3"}.tcfa-galactic-republic::before{content:"\f50c"}.tcfa-galactic-senate::before{content:"\f50d"}.tcfa-gamepad::before{content:"\f11b"}.tcfa-gas-pump::before{content:"\f52f"}.tcfa-gavel::before{content:"\f0e3"}.tcfa-gem::before{content:"\f3a5"}.tcfa-genderless::before{content:"\f22d"}.tcfa-get-pocket::before{content:"\f265"}.tcfa-gg::before{content:"\f260"}.tcfa-gg-circle::before{content:"\f261"}.tcfa-ghost::before{content:"\f6e2"}.tcfa-gift::before{content:"\f06b"}.tcfa-gifts::before{content:"\f79c"}.tcfa-git::before{content:"\f1d3"}.tcfa-git-alt::before{content:"\f841"}.tcfa-git-square::before{content:"\f1d2"}.tcfa-github::before{content:"\f09b"}.tcfa-github-alt::before{content:"\f113"}.tcfa-github-square::before{content:"\f092"}.tcfa-gitkraken::before{content:"\f3a6"}.tcfa-gitlab::before{content:"\f296"}.tcfa-gitter::before{content:"\f426"}.tcfa-glass-cheers::before{content:"\f79f"}.tcfa-glass-martini::before{content:"\f000"}.tcfa-glass-martini-alt::before{content:"\f57b"}.tcfa-glass-whiskey::before{content:"\f7a0"}.tcfa-glasses::before{content:"\f530"}.tcfa-glide::before{content:"\f2a5"}.tcfa-glide-g::before{content:"\f2a6"}.tcfa-globe::before{content:"\f0ac"}.tcfa-globe-africa::before{content:"\f57c"}.tcfa-globe-americas::before{content:"\f57d"}.tcfa-globe-asia::before{content:"\f57e"}.tcfa-globe-europe::before{content:"\f7a2"}.tcfa-gofore::before{content:"\f3a7"}.tcfa-golf-ball::before{content:"\f450"}.tcfa-goodreads::before{content:"\f3a8"}.tcfa-goodreads-g::before{content:"\f3a9"}.tcfa-google::before{content:"\f1a0"}.tcfa-google-drive::before{content:"\f3aa"}.tcfa-google-play::before{content:"\f3ab"}.tcfa-google-plus::before{content:"\f2b3"}.tcfa-google-plus-g::before{content:"\f0d5"}.tcfa-google-plus-square::before{content:"\f0d4"}.tcfa-google-wallet::before{content:"\f1ee"}.tcfa-gopuram::before{content:"\f664"}.tcfa-graduation-cap::before{content:"\f19d"}.tcfa-gratipay::before{content:"\f184"}.tcfa-grav::before{content:"\f2d6"}.tcfa-greater-than::before{content:"\f531"}.tcfa-greater-than-equal::before{content:"\f532"}.tcfa-grimace::before{content:"\f57f"}.tcfa-grin::before{content:"\f580"}.tcfa-grin-alt::before{content:"\f581"}.tcfa-grin-beam::before{content:"\f582"}.tcfa-grin-beam-sweat::before{content:"\f583"}.tcfa-grin-hearts::before{content:"\f584"}.tcfa-grin-squint::before{content:"\f585"}.tcfa-grin-squint-tears::before{content:"\f586"}.tcfa-grin-stars::before{content:"\f587"}.tcfa-grin-tears::before{content:"\f588"}.tcfa-grin-tongue::before{content:"\f589"}.tcfa-grin-tongue-squint::before{content:"\f58a"}.tcfa-grin-tongue-wink::before{content:"\f58b"}.tcfa-grin-wink::before{content:"\f58c"}.tcfa-grip-horizontal::before{content:"\f58d"}.tcfa-grip-lines::before{content:"\f7a4"}.tcfa-grip-lines-vertical::before{content:"\f7a5"}.tcfa-grip-vertical::before{content:"\f58e"}.tcfa-gripfire::before{content:"\f3ac"}.tcfa-grunt::before{content:"\f3ad"}.tcfa-guitar::before{content:"\f7a6"}.tcfa-gulp::before{content:"\f3ae"}.tcfa-h-square::before{content:"\f0fd"}.tcfa-hacker-news::before{content:"\f1d4"}.tcfa-hacker-news-square::before{content:"\f3af"}.tcfa-hackerrank::before{content:"\f5f7"}.tcfa-hamburger::before{content:"\f805"}.tcfa-hammer::before{content:"\f6e3"}.tcfa-hamsa::before{content:"\f665"}.tcfa-hand-holding::before{content:"\f4bd"}.tcfa-hand-holding-heart::before{content:"\f4be"}.tcfa-hand-holding-usd::before{content:"\f4c0"}.tcfa-hand-lizard::before{content:"\f258"}.tcfa-hand-middle-finger::before{content:"\f806"}.tcfa-hand-paper::before{content:"\f256"}.tcfa-hand-peace::before{content:"\f25b"}.tcfa-hand-point-down::before{content:"\f0a7"}.tcfa-hand-point-left::before{content:"\f0a5"}.tcfa-hand-point-right::before{content:"\f0a4"}.tcfa-hand-point-up::before{content:"\f0a6"}.tcfa-hand-pointer::before{content:"\f25a"}.tcfa-hand-rock::before{content:"\f255"}.tcfa-hand-scissors::before{content:"\f257"}.tcfa-hand-spock::before{content:"\f259"}.tcfa-hands::before{content:"\f4c2"}.tcfa-hands-helping::before{content:"\f4c4"}.tcfa-handshake::before{content:"\f2b5"}.tcfa-hanukiah::before{content:"\f6e6"}.tcfa-hard-hat::before{content:"\f807"}.tcfa-hashtag::before{content:"\f292"}.tcfa-hat-cowboy::before{content:"\f8c0"}.tcfa-hat-cowboy-side::before{content:"\f8c1"}.tcfa-hat-wizard::before{content:"\f6e8"}.tcfa-hdd::before{content:"\f0a0"}.tcfa-heading::before{content:"\f1dc"}.tcfa-headphones::before{content:"\f025"}.tcfa-headphones-alt::before{content:"\f58f"}.tcfa-headset::before{content:"\f590"}.tcfa-heart::before{content:"\f004"}.tcfa-heart-broken::before{content:"\f7a9"}.tcfa-heartbeat::before{content:"\f21e"}.tcfa-helicopter::before{content:"\f533"}.tcfa-highlighter::before{content:"\f591"}.tcfa-hiking::before{content:"\f6ec"}.tcfa-hippo::before{content:"\f6ed"}.tcfa-hips::before{content:"\f452"}.tcfa-hire-a-helper::before{content:"\f3b0"}.tcfa-history::before{content:"\f1da"}.tcfa-hockey-puck::before{content:"\f453"}.tcfa-holly-berry::before{content:"\f7aa"}.tcfa-home::before{content:"\f015"}.tcfa-hooli::before{content:"\f427"}.tcfa-hornbill::before{content:"\f592"}.tcfa-horse::before{content:"\f6f0"}.tcfa-horse-head::before{content:"\f7ab"}.tcfa-hospital::before{content:"\f0f8"}.tcfa-hospital-alt::before{content:"\f47d"}.tcfa-hospital-symbol::before{content:"\f47e"}.tcfa-hot-tub::before{content:"\f593"}.tcfa-hotdog::before{content:"\f80f"}.tcfa-hotel::before{content:"\f594"}.tcfa-hotjar::before{content:"\f3b1"}.tcfa-hourglass::before{content:"\f254"}.tcfa-hourglass-end::before{content:"\f253"}.tcfa-hourglass-half::before{content:"\f252"}.tcfa-hourglass-start::before{content:"\f251"}.tcfa-house-damage::before{content:"\f6f1"}.tcfa-houzz::before{content:"\f27c"}.tcfa-hryvnia::before{content:"\f6f2"}.tcfa-html5::before{content:"\f13b"}.tcfa-hubspot::before{content:"\f3b2"}.tcfa-i-cursor::before{content:"\f246"}.tcfa-ice-cream::before{content:"\f810"}.tcfa-icicles::before{content:"\f7ad"}.tcfa-icons::before{content:"\f86d"}.tcfa-id-badge::before{content:"\f2c1"}.tcfa-id-card::before{content:"\f2c2"}.tcfa-id-card-alt::before{content:"\f47f"}.tcfa-ideal::before{content:"\f913"}.tcfa-igloo::before{content:"\f7ae"}.tcfa-image::before{content:"\f03e"}.tcfa-images::before{content:"\f302"}.tcfa-imdb::before{content:"\f2d8"}.tcfa-inbox::before{content:"\f01c"}.tcfa-indent::before{content:"\f03c"}.tcfa-industry::before{content:"\f275"}.tcfa-infinity::before{content:"\f534"}.tcfa-info::before{content:"\f129"}.tcfa-info-circle::before{content:"\f05a"}.tcfa-instagram::before{content:"\f16d"}.tcfa-intercom::before{content:"\f7af"}.tcfa-internet-explorer::before{content:"\f26b"}.tcfa-invision::before{content:"\f7b0"}.tcfa-ioxhost::before{content:"\f208"}.tcfa-italic::before{content:"\f033"}.tcfa-itch-io::before{content:"\f83a"}.tcfa-itunes::before{content:"\f3b4"}.tcfa-itunes-note::before{content:"\f3b5"}.tcfa-java::before{content:"\f4e4"}.tcfa-jedi::before{content:"\f669"}.tcfa-jedi-order::before{content:"\f50e"}.tcfa-jenkins::before{content:"\f3b6"}.tcfa-jira::before{content:"\f7b1"}.tcfa-joget::before{content:"\f3b7"}.tcfa-joint::before{content:"\f595"}.tcfa-joomla::before{content:"\f1aa"}.tcfa-journal-whills::before{content:"\f66a"}.tcfa-js::before{content:"\f3b8"}.tcfa-js-square::before{content:"\f3b9"}.tcfa-jsfiddle::before{content:"\f1cc"}.tcfa-kaaba::before{content:"\f66b"}.tcfa-kaggle::before{content:"\f5fa"}.tcfa-key::before{content:"\f084"}.tcfa-keybase::before{content:"\f4f5"}.tcfa-keyboard::before{content:"\f11c"}.tcfa-keycdn::before{content:"\f3ba"}.tcfa-khanda::before{content:"\f66d"}.tcfa-kickstarter::before{content:"\f3bb"}.tcfa-kickstarter-k::before{content:"\f3bc"}.tcfa-kiss::before{content:"\f596"}.tcfa-kiss-beam::before{content:"\f597"}.tcfa-kiss-wink-heart::before{content:"\f598"}.tcfa-kiwi-bird::before{content:"\f535"}.tcfa-korvue::before{content:"\f42f"}.tcfa-landmark::before{content:"\f66f"}.tcfa-language::before{content:"\f1ab"}.tcfa-laptop::before{content:"\f109"}.tcfa-laptop-code::before{content:"\f5fc"}.tcfa-laptop-medical::before{content:"\f812"}.tcfa-laravel::before{content:"\f3bd"}.tcfa-lastfm::before{content:"\f202"}.tcfa-lastfm-square::before{content:"\f203"}.tcfa-laugh::before{content:"\f599"}.tcfa-laugh-beam::before{content:"\f59a"}.tcfa-laugh-squint::before{content:"\f59b"}.tcfa-laugh-wink::before{content:"\f59c"}.tcfa-layer-group::before{content:"\f5fd"}.tcfa-leaf::before{content:"\f06c"}.tcfa-leanpub::before{content:"\f212"}.tcfa-lemon::before{content:"\f094"}.tcfa-less::before{content:"\f41d"}.tcfa-less-than::before{content:"\f536"}.tcfa-less-than-equal::before{content:"\f537"}.tcfa-level-down-alt::before{content:"\f3be"}.tcfa-level-up-alt::before{content:"\f3bf"}.tcfa-life-ring::before{content:"\f1cd"}.tcfa-lightbulb::before{content:"\f0eb"}.tcfa-line::before{content:"\f3c0"}.tcfa-link::before{content:"\f0c1"}.tcfa-linkedin::before{content:"\f08c"}.tcfa-linkedin-in::before{content:"\f0e1"}.tcfa-linode::before{content:"\f2b8"}.tcfa-linux::before{content:"\f17c"}.tcfa-lira-sign::before{content:"\f195"}.tcfa-list::before{content:"\f03a"}.tcfa-list-alt::before{content:"\f022"}.tcfa-list-ol::before{content:"\f0cb"}.tcfa-list-ul::before{content:"\f0ca"}.tcfa-location-arrow::before{content:"\f124"}.tcfa-lock::before{content:"\f023"}.tcfa-lock-open::before{content:"\f3c1"}.tcfa-long-arrow-alt-down::before{content:"\f309"}.tcfa-long-arrow-alt-left::before{content:"\f30a"}.tcfa-long-arrow-alt-right::before{content:"\f30b"}.tcfa-long-arrow-alt-up::before{content:"\f30c"}.tcfa-low-vision::before{content:"\f2a8"}.tcfa-luggage-cart::before{content:"\f59d"}.tcfa-lyft::before{content:"\f3c3"}.tcfa-magento::before{content:"\f3c4"}.tcfa-magic::before{content:"\f0d0"}.tcfa-magnet::before{content:"\f076"}.tcfa-mail-bulk::before{content:"\f674"}.tcfa-mailchimp::before{content:"\f59e"}.tcfa-male::before{content:"\f183"}.tcfa-mandalorian::before{content:"\f50f"}.tcfa-map::before{content:"\f279"}.tcfa-map-marked::before{content:"\f59f"}.tcfa-map-marked-alt::before{content:"\f5a0"}.tcfa-map-marker::before{content:"\f041"}.tcfa-map-marker-alt::before{content:"\f3c5"}.tcfa-map-pin::before{content:"\f276"}.tcfa-map-signs::before{content:"\f277"}.tcfa-markdown::before{content:"\f60f"}.tcfa-marker::before{content:"\f5a1"}.tcfa-mars::before{content:"\f222"}.tcfa-mars-double::before{content:"\f227"}.tcfa-mars-stroke::before{content:"\f229"}.tcfa-mars-stroke-h::before{content:"\f22b"}.tcfa-mars-stroke-v::before{content:"\f22a"}.tcfa-mask::before{content:"\f6fa"}.tcfa-mastodon::before{content:"\f4f6"}.tcfa-maxcdn::before{content:"\f136"}.tcfa-mdb::before{content:"\f8ca"}.tcfa-medal::before{content:"\f5a2"}.tcfa-medapps::before{content:"\f3c6"}.tcfa-medium::before{content:"\f23a"}.tcfa-medium-m::before{content:"\f3c7"}.tcfa-medkit::before{content:"\f0fa"}.tcfa-medrt::before{content:"\f3c8"}.tcfa-meetup::before{content:"\f2e0"}.tcfa-megaport::before{content:"\f5a3"}.tcfa-meh::before{content:"\f11a"}.tcfa-meh-blank::before{content:"\f5a4"}.tcfa-meh-rolling-eyes::before{content:"\f5a5"}.tcfa-memory::before{content:"\f538"}.tcfa-mendeley::before{content:"\f7b3"}.tcfa-menorah::before{content:"\f676"}.tcfa-mercury::before{content:"\f223"}.tcfa-meteor::before{content:"\f753"}.tcfa-microblog::before{content:"\f91a"}.tcfa-microchip::before{content:"\f2db"}.tcfa-microphone::before{content:"\f130"}.tcfa-microphone-alt::before{content:"\f3c9"}.tcfa-microphone-alt-slash::before{content:"\f539"}.tcfa-microphone-slash::before{content:"\f131"}.tcfa-microscope::before{content:"\f610"}.tcfa-microsoft::before{content:"\f3ca"}.tcfa-minus::before{content:"\f068"}.tcfa-minus-circle::before{content:"\f056"}.tcfa-minus-square::before{content:"\f146"}.tcfa-mitten::before{content:"\f7b5"}.tcfa-mix::before{content:"\f3cb"}.tcfa-mixcloud::before{content:"\f289"}.tcfa-mizuni::before{content:"\f3cc"}.tcfa-mobile::before{content:"\f10b"}.tcfa-mobile-alt::before{content:"\f3cd"}.tcfa-modx::before{content:"\f285"}.tcfa-monero::before{content:"\f3d0"}.tcfa-money-bill::before{content:"\f0d6"}.tcfa-money-bill-alt::before{content:"\f3d1"}.tcfa-money-bill-wave::before{content:"\f53a"}.tcfa-money-bill-wave-alt::before{content:"\f53b"}.tcfa-money-check::before{content:"\f53c"}.tcfa-money-check-alt::before{content:"\f53d"}.tcfa-monument::before{content:"\f5a6"}.tcfa-moon::before{content:"\f186"}.tcfa-mortar-pestle::before{content:"\f5a7"}.tcfa-mosque::before{content:"\f678"}.tcfa-motorcycle::before{content:"\f21c"}.tcfa-mountain::before{content:"\f6fc"}.tcfa-mouse::before{content:"\f8cc"}.tcfa-mouse-pointer::before{content:"\f245"}.tcfa-mug-hot::before{content:"\f7b6"}.tcfa-music::before{content:"\f001"}.tcfa-napster::before{content:"\f3d2"}.tcfa-neos::before{content:"\f612"}.tcfa-network-wired::before{content:"\f6ff"}.tcfa-neuter::before{content:"\f22c"}.tcfa-newspaper::before{content:"\f1ea"}.tcfa-nimblr::before{content:"\f5a8"}.tcfa-node::before{content:"\f419"}.tcfa-node-js::before{content:"\f3d3"}.tcfa-not-equal::before{content:"\f53e"}.tcfa-notes-medical::before{content:"\f481"}.tcfa-npm::before{content:"\f3d4"}.tcfa-ns8::before{content:"\f3d5"}.tcfa-nutritionix::before{content:"\f3d6"}.tcfa-object-group::before{content:"\f247"}.tcfa-object-ungroup::before{content:"\f248"}.tcfa-odnoklassniki::before{content:"\f263"}.tcfa-odnoklassniki-square::before{content:"\f264"}.tcfa-oil-can::before{content:"\f613"}.tcfa-old-republic::before{content:"\f510"}.tcfa-om::before{content:"\f679"}.tcfa-opencart::before{content:"\f23d"}.tcfa-openid::before{content:"\f19b"}.tcfa-opera::before{content:"\f26a"}.tcfa-optin-monster::before{content:"\f23c"}.tcfa-orcid::before{content:"\f8d2"}.tcfa-osi::before{content:"\f41a"}.tcfa-otter::before{content:"\f700"}.tcfa-outdent::before{content:"\f03b"}.tcfa-page4::before{content:"\f3d7"}.tcfa-pagelines::before{content:"\f18c"}.tcfa-pager::before{content:"\f815"}.tcfa-paint-brush::before{content:"\f1fc"}.tcfa-paint-roller::before{content:"\f5aa"}.tcfa-palette::before{content:"\f53f"}.tcfa-palfed::before{content:"\f3d8"}.tcfa-pallet::before{content:"\f482"}.tcfa-paper-plane::before{content:"\f1d8"}.tcfa-paperclip::before{content:"\f0c6"}.tcfa-parachute-box::before{content:"\f4cd"}.tcfa-paragraph::before{content:"\f1dd"}.tcfa-parking::before{content:"\f540"}.tcfa-passport::before{content:"\f5ab"}.tcfa-pastafarianism::before{content:"\f67b"}.tcfa-paste::before{content:"\f0ea"}.tcfa-patreon::before{content:"\f3d9"}.tcfa-pause::before{content:"\f04c"}.tcfa-pause-circle::before{content:"\f28b"}.tcfa-paw::before{content:"\f1b0"}.tcfa-paypal::before{content:"\f1ed"}.tcfa-peace::before{content:"\f67c"}.tcfa-pen::before{content:"\f304"}.tcfa-pen-alt::before{content:"\f305"}.tcfa-pen-fancy::before{content:"\f5ac"}.tcfa-pen-nib::before{content:"\f5ad"}.tcfa-pen-square::before{content:"\f14b"}.tcfa-pencil-alt::before{content:"\f303"}.tcfa-pencil-ruler::before{content:"\f5ae"}.tcfa-penny-arcade::before{content:"\f704"}.tcfa-people-carry::before{content:"\f4ce"}.tcfa-pepper-hot::before{content:"\f816"}.tcfa-percent::before{content:"\f295"}.tcfa-percentage::before{content:"\f541"}.tcfa-periscope::before{content:"\f3da"}.tcfa-person-booth::before{content:"\f756"}.tcfa-phabricator::before{content:"\f3db"}.tcfa-phoenix-framework::before{content:"\f3dc"}.tcfa-phoenix-squadron::before{content:"\f511"}.tcfa-phone::before{content:"\f095"}.tcfa-phone-alt::before{content:"\f879"}.tcfa-phone-slash::before{content:"\f3dd"}.tcfa-phone-square::before{content:"\f098"}.tcfa-phone-square-alt::before{content:"\f87b"}.tcfa-phone-volume::before{content:"\f2a0"}.tcfa-photo-video::before{content:"\f87c"}.tcfa-php::before{content:"\f457"}.tcfa-pied-piper::before{content:"\f2ae"}.tcfa-pied-piper-alt::before{content:"\f1a8"}.tcfa-pied-piper-hat::before{content:"\f4e5"}.tcfa-pied-piper-pp::before{content:"\f1a7"}.tcfa-pied-piper-square::before{content:"\f91e"}.tcfa-piggy-bank::before{content:"\f4d3"}.tcfa-pills::before{content:"\f484"}.tcfa-pinterest::before{content:"\f0d2"}.tcfa-pinterest-p::before{content:"\f231"}.tcfa-pinterest-square::before{content:"\f0d3"}.tcfa-pizza-slice::before{content:"\f818"}.tcfa-place-of-worship::before{content:"\f67f"}.tcfa-plane::before{content:"\f072"}.tcfa-plane-arrival::before{content:"\f5af"}.tcfa-plane-departure::before{content:"\f5b0"}.tcfa-play::before{content:"\f04b"}.tcfa-play-circle::before{content:"\f144"}.tcfa-playstation::before{content:"\f3df"}.tcfa-plug::before{content:"\f1e6"}.tcfa-plus::before{content:"\f067"}.tcfa-plus-circle::before{content:"\f055"}.tcfa-plus-square::before{content:"\f0fe"}.tcfa-podcast::before{content:"\f2ce"}.tcfa-poll::before{content:"\f681"}.tcfa-poll-h::before{content:"\f682"}.tcfa-poo::before{content:"\f2fe"}.tcfa-poo-storm::before{content:"\f75a"}.tcfa-poop::before{content:"\f619"}.tcfa-portrait::before{content:"\f3e0"}.tcfa-pound-sign::before{content:"\f154"}.tcfa-power-off::before{content:"\f011"}.tcfa-pray::before{content:"\f683"}.tcfa-praying-hands::before{content:"\f684"}.tcfa-prescription::before{content:"\f5b1"}.tcfa-prescription-bottle::before{content:"\f485"}.tcfa-prescription-bottle-alt::before{content:"\f486"}.tcfa-print::before{content:"\f02f"}.tcfa-procedures::before{content:"\f487"}.tcfa-product-hunt::before{content:"\f288"}.tcfa-project-diagram::before{content:"\f542"}.tcfa-pushed::before{content:"\f3e1"}.tcfa-puzzle-piece::before{content:"\f12e"}.tcfa-python::before{content:"\f3e2"}.tcfa-qq::before{content:"\f1d6"}.tcfa-qrcode::before{content:"\f029"}.tcfa-question::before{content:"\f128"}.tcfa-question-circle::before{content:"\f059"}.tcfa-quidditch::before{content:"\f458"}.tcfa-quinscape::before{content:"\f459"}.tcfa-quora::before{content:"\f2c4"}.tcfa-quote-left::before{content:"\f10d"}.tcfa-quote-right::before{content:"\f10e"}.tcfa-quran::before{content:"\f687"}.tcfa-r-project::before{content:"\f4f7"}.tcfa-radiation::before{content:"\f7b9"}.tcfa-radiation-alt::before{content:"\f7ba"}.tcfa-rainbow::before{content:"\f75b"}.tcfa-random::before{content:"\f074"}.tcfa-raspberry-pi::before{content:"\f7bb"}.tcfa-ravelry::before{content:"\f2d9"}.tcfa-react::before{content:"\f41b"}.tcfa-reacteurope::before{content:"\f75d"}.tcfa-readme::before{content:"\f4d5"}.tcfa-rebel::before{content:"\f1d0"}.tcfa-receipt::before{content:"\f543"}.tcfa-record-vinyl::before{content:"\f8d9"}.tcfa-recycle::before{content:"\f1b8"}.tcfa-red-river::before{content:"\f3e3"}.tcfa-reddit::before{content:"\f1a1"}.tcfa-reddit-alien::before{content:"\f281"}.tcfa-reddit-square::before{content:"\f1a2"}.tcfa-redhat::before{content:"\f7bc"}.tcfa-redo::before{content:"\f01e"}.tcfa-redo-alt::before{content:"\f2f9"}.tcfa-registered::before{content:"\f25d"}.tcfa-remove-format::before{content:"\f87d"}.tcfa-renren::before{content:"\f18b"}.tcfa-reply::before{content:"\f3e5"}.tcfa-reply-all::before{content:"\f122"}.tcfa-replyd::before{content:"\f3e6"}.tcfa-republican::before{content:"\f75e"}.tcfa-researchgate::before{content:"\f4f8"}.tcfa-resolving::before{content:"\f3e7"}.tcfa-restroom::before{content:"\f7bd"}.tcfa-retweet::before{content:"\f079"}.tcfa-rev::before{content:"\f5b2"}.tcfa-ribbon::before{content:"\f4d6"}.tcfa-ring::before{content:"\f70b"}.tcfa-road::before{content:"\f018"}.tcfa-robot::before{content:"\f544"}.tcfa-rocket::before{content:"\f135"}.tcfa-rocketchat::before{content:"\f3e8"}.tcfa-rockrms::before{content:"\f3e9"}.tcfa-route::before{content:"\f4d7"}.tcfa-rss::before{content:"\f09e"}.tcfa-rss-square::before{content:"\f143"}.tcfa-ruble-sign::before{content:"\f158"}.tcfa-ruler::before{content:"\f545"}.tcfa-ruler-combined::before{content:"\f546"}.tcfa-ruler-horizontal::before{content:"\f547"}.tcfa-ruler-vertical::before{content:"\f548"}.tcfa-running::before{content:"\f70c"}.tcfa-rupee-sign::before{content:"\f156"}.tcfa-sad-cry::before{content:"\f5b3"}.tcfa-sad-tear::before{content:"\f5b4"}.tcfa-safari::before{content:"\f267"}.tcfa-salesforce::before{content:"\f83b"}.tcfa-sass::before{content:"\f41e"}.tcfa-satellite::before{content:"\f7bf"}.tcfa-satellite-dish::before{content:"\f7c0"}.tcfa-save::before{content:"\f0c7"}.tcfa-schlix::before{content:"\f3ea"}.tcfa-school::before{content:"\f549"}.tcfa-screwdriver::before{content:"\f54a"}.tcfa-scribd::before{content:"\f28a"}.tcfa-scroll::before{content:"\f70e"}.tcfa-sd-card::before{content:"\f7c2"}.tcfa-search::before{content:"\f002"}.tcfa-search-dollar::before{content:"\f688"}.tcfa-search-location::before{content:"\f689"}.tcfa-search-minus::before{content:"\f010"}.tcfa-search-plus::before{content:"\f00e"}.tcfa-searchengin::before{content:"\f3eb"}.tcfa-seedling::before{content:"\f4d8"}.tcfa-sellcast::before{content:"\f2da"}.tcfa-sellsy::before{content:"\f213"}.tcfa-server::before{content:"\f233"}.tcfa-servicestack::before{content:"\f3ec"}.tcfa-shapes::before{content:"\f61f"}.tcfa-share::before{content:"\f064"}.tcfa-share-alt::before{content:"\f1e0"}.tcfa-share-alt-square::before{content:"\f1e1"}.tcfa-share-square::before{content:"\f14d"}.tcfa-shekel-sign::before{content:"\f20b"}.tcfa-shield-alt::before{content:"\f3ed"}.tcfa-ship::before{content:"\f21a"}.tcfa-shipping-fast::before{content:"\f48b"}.tcfa-shirtsinbulk::before{content:"\f214"}.tcfa-shoe-prints::before{content:"\f54b"}.tcfa-shopping-bag::before{content:"\f290"}.tcfa-shopping-basket::before{content:"\f291"}.tcfa-shopping-cart::before{content:"\f07a"}.tcfa-shopware::before{content:"\f5b5"}.tcfa-shower::before{content:"\f2cc"}.tcfa-shuttle-van::before{content:"\f5b6"}.tcfa-sign::before{content:"\f4d9"}.tcfa-sign-in-alt::before{content:"\f2f6"}.tcfa-sign-language::before{content:"\f2a7"}.tcfa-sign-out-alt::before{content:"\f2f5"}.tcfa-signal::before{content:"\f012"}.tcfa-signature::before{content:"\f5b7"}.tcfa-sim-card::before{content:"\f7c4"}.tcfa-simplybuilt::before{content:"\f215"}.tcfa-sistrix::before{content:"\f3ee"}.tcfa-sitemap::before{content:"\f0e8"}.tcfa-sith::before{content:"\f512"}.tcfa-skating::before{content:"\f7c5"}.tcfa-sketch::before{content:"\f7c6"}.tcfa-skiing::before{content:"\f7c9"}.tcfa-skiing-nordic::before{content:"\f7ca"}.tcfa-skull::before{content:"\f54c"}.tcfa-skull-crossbones::before{content:"\f714"}.tcfa-skyatlas::before{content:"\f216"}.tcfa-skype::before{content:"\f17e"}.tcfa-slack::before{content:"\f198"}.tcfa-slack-hash::before{content:"\f3ef"}.tcfa-slash::before{content:"\f715"}.tcfa-sleigh::before{content:"\f7cc"}.tcfa-sliders-h::before{content:"\f1de"}.tcfa-slideshare::before{content:"\f1e7"}.tcfa-smile::before{content:"\f118"}.tcfa-smile-beam::before{content:"\f5b8"}.tcfa-smile-wink::before{content:"\f4da"}.tcfa-smog::before{content:"\f75f"}.tcfa-smoking::before{content:"\f48d"}.tcfa-smoking-ban::before{content:"\f54d"}.tcfa-sms::before{content:"\f7cd"}.tcfa-snapchat::before{content:"\f2ab"}.tcfa-snapchat-ghost::before{content:"\f2ac"}.tcfa-snapchat-square::before{content:"\f2ad"}.tcfa-snowboarding::before{content:"\f7ce"}.tcfa-snowflake::before{content:"\f2dc"}.tcfa-snowman::before{content:"\f7d0"}.tcfa-snowplow::before{content:"\f7d2"}.tcfa-socks::before{content:"\f696"}.tcfa-solar-panel::before{content:"\f5ba"}.tcfa-sort::before{content:"\f0dc"}.tcfa-sort-alpha-down::before{content:"\f15d"}.tcfa-sort-alpha-down-alt::before{content:"\f881"}.tcfa-sort-alpha-up::before{content:"\f15e"}.tcfa-sort-alpha-up-alt::before{content:"\f882"}.tcfa-sort-amount-down::before{content:"\f160"}.tcfa-sort-amount-down-alt::before{content:"\f884"}.tcfa-sort-amount-up::before{content:"\f161"}.tcfa-sort-amount-up-alt::before{content:"\f885"}.tcfa-sort-down::before{content:"\f0dd"}.tcfa-sort-numeric-down::before{content:"\f162"}.tcfa-sort-numeric-down-alt::before{content:"\f886"}.tcfa-sort-numeric-up::before{content:"\f163"}.tcfa-sort-numeric-up-alt::before{content:"\f887"}.tcfa-sort-up::before{content:"\f0de"}.tcfa-soundcloud::before{content:"\f1be"}.tcfa-sourcetree::before{content:"\f7d3"}.tcfa-spa::before{content:"\f5bb"}.tcfa-space-shuttle::before{content:"\f197"}.tcfa-speakap::before{content:"\f3f3"}.tcfa-speaker-deck::before{content:"\f83c"}.tcfa-spell-check::before{content:"\f891"}.tcfa-spider::before{content:"\f717"}.tcfa-spinner::before{content:"\f110"}.tcfa-splotch::before{content:"\f5bc"}.tcfa-spotify::before{content:"\f1bc"}.tcfa-spray-can::before{content:"\f5bd"}.tcfa-square::before{content:"\f0c8"}.tcfa-square-full::before{content:"\f45c"}.tcfa-square-root-alt::before{content:"\f698"}.tcfa-squarespace::before{content:"\f5be"}.tcfa-stack-exchange::before{content:"\f18d"}.tcfa-stack-overflow::before{content:"\f16c"}.tcfa-stackpath::before{content:"\f842"}.tcfa-stamp::before{content:"\f5bf"}.tcfa-star::before{content:"\f005"}.tcfa-star-and-crescent::before{content:"\f699"}.tcfa-star-half::before{content:"\f089"}.tcfa-star-half-alt::before{content:"\f5c0"}.tcfa-star-of-david::before{content:"\f69a"}.tcfa-star-of-life::before{content:"\f621"}.tcfa-staylinked::before{content:"\f3f5"}.tcfa-steam::before{content:"\f1b6"}.tcfa-steam-square::before{content:"\f1b7"}.tcfa-steam-symbol::before{content:"\f3f6"}.tcfa-step-backward::before{content:"\f048"}.tcfa-step-forward::before{content:"\f051"}.tcfa-stethoscope::before{content:"\f0f1"}.tcfa-sticker-mule::before{content:"\f3f7"}.tcfa-sticky-note::before{content:"\f249"}.tcfa-stop::before{content:"\f04d"}.tcfa-stop-circle::before{content:"\f28d"}.tcfa-stopwatch::before{content:"\f2f2"}.tcfa-store::before{content:"\f54e"}.tcfa-store-alt::before{content:"\f54f"}.tcfa-strava::before{content:"\f428"}.tcfa-stream::before{content:"\f550"}.tcfa-street-view::before{content:"\f21d"}.tcfa-strikethrough::before{content:"\f0cc"}.tcfa-stripe::before{content:"\f429"}.tcfa-stripe-s::before{content:"\f42a"}.tcfa-stroopwafel::before{content:"\f551"}.tcfa-studiovinari::before{content:"\f3f8"}.tcfa-stumbleupon::before{content:"\f1a4"}.tcfa-stumbleupon-circle::before{content:"\f1a3"}.tcfa-subscript::before{content:"\f12c"}.tcfa-subway::before{content:"\f239"}.tcfa-suitcase::before{content:"\f0f2"}.tcfa-suitcase-rolling::before{content:"\f5c1"}.tcfa-sun::before{content:"\f185"}.tcfa-superpowers::before{content:"\f2dd"}.tcfa-superscript::before{content:"\f12b"}.tcfa-supple::before{content:"\f3f9"}.tcfa-surprise::before{content:"\f5c2"}.tcfa-suse::before{content:"\f7d6"}.tcfa-swatchbook::before{content:"\f5c3"}.tcfa-swift::before{content:"\f8e1"}.tcfa-swimmer::before{content:"\f5c4"}.tcfa-swimming-pool::before{content:"\f5c5"}.tcfa-symfony::before{content:"\f83d"}.tcfa-synagogue::before{content:"\f69b"}.tcfa-sync::before{content:"\f021"}.tcfa-sync-alt::before{content:"\f2f1"}.tcfa-syringe::before{content:"\f48e"}.tcfa-table::before{content:"\f0ce"}.tcfa-table-tennis::before{content:"\f45d"}.tcfa-tablet::before{content:"\f10a"}.tcfa-tablet-alt::before{content:"\f3fa"}.tcfa-tablets::before{content:"\f490"}.tcfa-tachometer-alt::before{content:"\f3fd"}.tcfa-tag::before{content:"\f02b"}.tcfa-tags::before{content:"\f02c"}.tcfa-tape::before{content:"\f4db"}.tcfa-tasks::before{content:"\f0ae"}.tcfa-taxi::before{content:"\f1ba"}.tcfa-teamspeak::before{content:"\f4f9"}.tcfa-teeth::before{content:"\f62e"}.tcfa-teeth-open::before{content:"\f62f"}.tcfa-telegram::before{content:"\f2c6"}.tcfa-telegram-plane::before{content:"\f3fe"}.tcfa-temperature-high::before{content:"\f769"}.tcfa-temperature-low::before{content:"\f76b"}.tcfa-tencent-weibo::before{content:"\f1d5"}.tcfa-tenge::before{content:"\f7d7"}.tcfa-terminal::before{content:"\f120"}.tcfa-text-height::before{content:"\f034"}.tcfa-text-width::before{content:"\f035"}.tcfa-th::before{content:"\f00a"}.tcfa-th-large::before{content:"\f009"}.tcfa-th-list::before{content:"\f00b"}.tcfa-the-red-yeti::before{content:"\f69d"}.tcfa-theater-masks::before{content:"\f630"}.tcfa-themeco::before{content:"\f5c6"}.tcfa-themeisle::before{content:"\f2b2"}.tcfa-thermometer::before{content:"\f491"}.tcfa-thermometer-empty::before{content:"\f2cb"}.tcfa-thermometer-full::before{content:"\f2c7"}.tcfa-thermometer-half::before{content:"\f2c9"}.tcfa-thermometer-quarter::before{content:"\f2ca"}.tcfa-thermometer-three-quarters::before{content:"\f2c8"}.tcfa-think-peaks::before{content:"\f731"}.tcfa-thumbs-down::before{content:"\f165"}.tcfa-thumbs-up::before{content:"\f164"}.tcfa-thumbtack::before{content:"\f08d"}.tcfa-ticket-alt::before{content:"\f3ff"}.tcfa-times::before{content:"\f00d"}.tcfa-times-circle::before{content:"\f057"}.tcfa-tint::before{content:"\f043"}.tcfa-tint-slash::before{content:"\f5c7"}.tcfa-tired::before{content:"\f5c8"}.tcfa-toggle-off::before{content:"\f204"}.tcfa-toggle-on::before{content:"\f205"}.tcfa-toilet::before{content:"\f7d8"}.tcfa-toilet-paper::before{content:"\f71e"}.tcfa-toolbox::before{content:"\f552"}.tcfa-tools::before{content:"\f7d9"}.tcfa-tooth::before{content:"\f5c9"}.tcfa-torah::before{content:"\f6a0"}.tcfa-torii-gate::before{content:"\f6a1"}.tcfa-tractor::before{content:"\f722"}.tcfa-trade-federation::before{content:"\f513"}.tcfa-trademark::before{content:"\f25c"}.tcfa-traffic-light::before{content:"\f637"}.tcfa-trailer::before{content:"\f941"}.tcfa-train::before{content:"\f238"}.tcfa-tram::before{content:"\f7da"}.tcfa-transgender::before{content:"\f224"}.tcfa-transgender-alt::before{content:"\f225"}.tcfa-trash::before{content:"\f1f8"}.tcfa-trash-alt::before{content:"\f2ed"}.tcfa-trash-restore::before{content:"\f829"}.tcfa-trash-restore-alt::before{content:"\f82a"}.tcfa-tree::before{content:"\f1bb"}.tcfa-trello::before{content:"\f181"}.tcfa-tripadvisor::before{content:"\f262"}.tcfa-trophy::before{content:"\f091"}.tcfa-truck::before{content:"\f0d1"}.tcfa-truck-loading::before{content:"\f4de"}.tcfa-truck-monster::before{content:"\f63b"}.tcfa-truck-moving::before{content:"\f4df"}.tcfa-truck-pickup::before{content:"\f63c"}.tcfa-tshirt::before{content:"\f553"}.tcfa-tty::before{content:"\f1e4"}.tcfa-tumblr::before{content:"\f173"}.tcfa-tumblr-square::before{content:"\f174"}.tcfa-tv::before{content:"\f26c"}.tcfa-twitch::before{content:"\f1e8"}.tcfa-twitter::before{content:"\f099"}.tcfa-twitter-square::before{content:"\f081"}.tcfa-typo3::before{content:"\f42b"}.tcfa-uber::before{content:"\f402"}.tcfa-ubuntu::before{content:"\f7df"}.tcfa-uikit::before{content:"\f403"}.tcfa-umbraco::before{content:"\f8e8"}.tcfa-umbrella::before{content:"\f0e9"}.tcfa-umbrella-beach::before{content:"\f5ca"}.tcfa-underline::before{content:"\f0cd"}.tcfa-undo::before{content:"\f0e2"}.tcfa-undo-alt::before{content:"\f2ea"}.tcfa-uniregistry::before{content:"\f404"}.tcfa-unity::before{content:"\f949"}.tcfa-universal-access::before{content:"\f29a"}.tcfa-university::before{content:"\f19c"}.tcfa-unlink::before{content:"\f127"}.tcfa-unlock::before{content:"\f09c"}.tcfa-unlock-alt::before{content:"\f13e"}.tcfa-untappd::before{content:"\f405"}.tcfa-upload::before{content:"\f093"}.tcfa-ups::before{content:"\f7e0"}.tcfa-usb::before{content:"\f287"}.tcfa-user::before{content:"\f007"}.tcfa-user-alt::before{content:"\f406"}.tcfa-user-alt-slash::before{content:"\f4fa"}.tcfa-user-astronaut::before{content:"\f4fb"}.tcfa-user-check::before{content:"\f4fc"}.tcfa-user-circle::before{content:"\f2bd"}.tcfa-user-clock::before{content:"\f4fd"}.tcfa-user-cog::before{content:"\f4fe"}.tcfa-user-edit::before{content:"\f4ff"}.tcfa-user-friends::before{content:"\f500"}.tcfa-user-graduate::before{content:"\f501"}.tcfa-user-injured::before{content:"\f728"}.tcfa-user-lock::before{content:"\f502"}.tcfa-user-md::before{content:"\f0f0"}.tcfa-user-minus::before{content:"\f503"}.tcfa-user-ninja::before{content:"\f504"}.tcfa-user-nurse::before{content:"\f82f"}.tcfa-user-plus::before{content:"\f234"}.tcfa-user-secret::before{content:"\f21b"}.tcfa-user-shield::before{content:"\f505"}.tcfa-user-slash::before{content:"\f506"}.tcfa-user-tag::before{content:"\f507"}.tcfa-user-tie::before{content:"\f508"}.tcfa-user-times::before{content:"\f235"}.tcfa-users::before{content:"\f0c0"}.tcfa-users-cog::before{content:"\f509"}.tcfa-usps::before{content:"\f7e1"}.tcfa-ussunnah::before{content:"\f407"}.tcfa-utensil-spoon::before{content:"\f2e5"}.tcfa-utensils::before{content:"\f2e7"}.tcfa-vaadin::before{content:"\f408"}.tcfa-vector-square::before{content:"\f5cb"}.tcfa-venus::before{content:"\f221"}.tcfa-venus-double::before{content:"\f226"}.tcfa-venus-mars::before{content:"\f228"}.tcfa-viacoin::before{content:"\f237"}.tcfa-viadeo::before{content:"\f2a9"}.tcfa-viadeo-square::before{content:"\f2aa"}.tcfa-vial::before{content:"\f492"}.tcfa-vials::before{content:"\f493"}.tcfa-viber::before{content:"\f409"}.tcfa-video::before{content:"\f03d"}.tcfa-video-slash::before{content:"\f4e2"}.tcfa-vihara::before{content:"\f6a7"}.tcfa-vimeo::before{content:"\f40a"}.tcfa-vimeo-square::before{content:"\f194"}.tcfa-vimeo-v::before{content:"\f27d"}.tcfa-vine::before{content:"\f1ca"}.tcfa-vk::before{content:"\f189"}.tcfa-vnv::before{content:"\f40b"}.tcfa-voicemail::before{content:"\f897"}.tcfa-volleyball-ball::before{content:"\f45f"}.tcfa-volume-down::before{content:"\f027"}.tcfa-volume-mute::before{content:"\f6a9"}.tcfa-volume-off::before{content:"\f026"}.tcfa-volume-up::before{content:"\f028"}.tcfa-vote-yea::before{content:"\f772"}.tcfa-vr-cardboard::before{content:"\f729"}.tcfa-vuejs::before{content:"\f41f"}.tcfa-walking::before{content:"\f554"}.tcfa-wallet::before{content:"\f555"}.tcfa-warehouse::before{content:"\f494"}.tcfa-water::before{content:"\f773"}.tcfa-wave-square::before{content:"\f83e"}.tcfa-waze::before{content:"\f83f"}.tcfa-weebly::before{content:"\f5cc"}.tcfa-weibo::before{content:"\f18a"}.tcfa-weight::before{content:"\f496"}.tcfa-weight-hanging::before{content:"\f5cd"}.tcfa-weixin::before{content:"\f1d7"}.tcfa-whatsapp::before{content:"\f232"}.tcfa-whatsapp-square::before{content:"\f40c"}.tcfa-wheelchair::before{content:"\f193"}.tcfa-whmcs::before{content:"\f40d"}.tcfa-wifi::before{content:"\f1eb"}.tcfa-wikipedia-w::before{content:"\f266"}.tcfa-wind::before{content:"\f72e"}.tcfa-window-close::before{content:"\f410"}.tcfa-window-maximize::before{content:"\f2d0"}.tcfa-window-minimize::before{content:"\f2d1"}.tcfa-window-restore::before{content:"\f2d2"}.tcfa-windows::before{content:"\f17a"}.tcfa-wine-bottle::before{content:"\f72f"}.tcfa-wine-glass::before{content:"\f4e3"}.tcfa-wine-glass-alt::before{content:"\f5ce"}.tcfa-wix::before{content:"\f5cf"}.tcfa-wizards-of-the-coast::before{content:"\f730"}.tcfa-wolf-pack-battalion::before{content:"\f514"}.tcfa-won-sign::before{content:"\f159"}.tcfa-wordpress::before{content:"\f19a"}.tcfa-wordpress-simple::before{content:"\f411"}.tcfa-wpbeginner::before{content:"\f297"}.tcfa-wpexplorer::before{content:"\f2de"}.tcfa-wpforms::before{content:"\f298"}.tcfa-wpressr::before{content:"\f3e4"}.tcfa-wrench::before{content:"\f0ad"}.tcfa-x-ray::before{content:"\f497"}.tcfa-xbox::before{content:"\f412"}.tcfa-xing::before{content:"\f168"}.tcfa-xing-square::before{content:"\f169"}.tcfa-y-combinator::before{content:"\f23b"}.tcfa-yahoo::before{content:"\f19e"}.tcfa-yammer::before{content:"\f840"}.tcfa-yandex::before{content:"\f413"}.tcfa-yandex-international::before{content:"\f414"}.tcfa-yarn::before{content:"\f7e3"}.tcfa-yelp::before{content:"\f1e9"}.tcfa-yen-sign::before{content:"\f157"}.tcfa-yin-yang::before{content:"\f6ad"}.tcfa-yoast::before{content:"\f2b1"}.tcfa-youtube::before{content:"\f167"}.tcfa-youtube-square::before{content:"\f431"}.tcfa-zhihu::before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:tc-fontawesome;font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:tc-fontawesome;font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.tcfa,.tcfas{font-family:tc-fontawesome,Arial,Helvetica,sans-serif !important;font-weight:900}.tcfar{font-family:tc-fontawesome,Arial,Helvetica,sans-serif !important;font-weight:400}assets/css/nouislider.css000064400000022467150755142450011550 0ustar00/* stylelint-disable no-descending-specificity */
/* stylelint-disable no-duplicate-selectors */

/*! nouislider - 15.7.1 - 6/14/2023 */

/* Functional styling;
 * These styles are required for noUiSlider to function.
 * You don't need to change these rules to apply your design.
 */
.noui-target,
.noui-target * {
	-webkit-touch-callout: none;
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
	-webkit-user-select: none;
	-ms-touch-action: none;
	touch-action: none;
	-ms-user-select: none;
	-moz-user-select: none;
	user-select: none;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.noui-target {
	position: relative;
}

.noui-base,
.noui-connects {
	width: 100%;
	height: 100%;
	position: relative;
	z-index: 1;
}

/* Wrapper for all connect elements.
  */
.noui-connects {
	overflow: hidden;
	z-index: 0;
}

.noui-connect,
.noui-origin {
	will-change: transform;
	position: absolute;
	z-index: 1;
	top: 0;
	right: 0;
	height: 100%;
	width: 100%;
	-ms-transform-origin: 0 0;
	-webkit-transform-origin: 0 0;
	transform-origin: 0 0;
	-webkit-transform-style: flat;
	transform-style: flat;
}

/* Offset direction
  */
.noui-txt-dir-rtl.noui-horizontal .noui-origin {
	left: 0;
	right: auto;
}

/* Give origins 0 height/width so they don't interfere with clicking the
  * connect elements.
  */
.noui-vertical .noui-origin {
	top: -100%;
	width: 0;
}

.noui-horizontal .noui-origin {
	height: 0;
}

.noui-handle {
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	position: absolute;
}

.noui-touch-area {
	height: 100%;
	width: 100%;
}

.noui-state-tap .noui-connect,
.noui-state-tap .noui-origin {
	-webkit-transition: transform 0.3s;
	-webkit-transition: -webkit-transform 0.3s;
	transition: -webkit-transform 0.3s;
	transition: transform 0.3s;
	transition: transform 0.3s, -webkit-transform 0.3s;
}

.noui-state-drag * {
	cursor: inherit !important;
}

/* Slider size and handle placement;
  */
.noui-horizontal {
	height: 18px;
}

.noui-horizontal .noui-handle {
	width: 34px;
	height: 28px;
	right: -17px;
	top: -6px;
}

.noui-vertical {
	width: 18px;
}

.noui-vertical .noui-handle {
	width: 28px;
	height: 34px;
	right: -6px;
	bottom: -17px;
}

.noui-txt-dir-rtl.noui-horizontal .noui-handle {
	left: -17px;
	right: auto;
}

/* Styling;
  * Giving the connect element a border radius
  * causes issues with using transform: scale
  */
.noui-target {
	background: #fafafa;
	border-radius: 4px;
	border: 1px solid #d3d3d3;
	-webkit-box-shadow: inset 0 1px 1px #f0f0f0, 0 3px 6px -5px #bbb;
	box-shadow: inset 0 1px 1px #f0f0f0, 0 3px 6px -5px #bbb;
}

.noui-connects {
	border-radius: 3px;
}

.noui-connect {
	background: #3fb8af;
}

/* Handles and cursors;
  */
.noui-draggable {
	cursor: ew-resize;
}

.noui-vertical .noui-draggable {
	cursor: ns-resize;
}

.noui-handle {
	border: 1px solid #d9d9d9;
	border-radius: 3px;
	background: #fff;
	cursor: default;
	-webkit-box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ebebeb, 0 3px 6px -3px #bbb;
	box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ebebeb, 0 3px 6px -3px #bbb;
}

.noui-active {
	-webkit-box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ddd, 0 3px 6px -3px #bbb;
	box-shadow: inset 0 0 1px #fff, inset 0 1px 7px #ddd, 0 3px 6px -3px #bbb;
}

/* Handle stripes;
  */
.noui-handle::before,
.noui-handle::after {
	content: "";
	display: block;
	position: absolute;
	height: 14px;
	width: 1px;
	background: #e8e7e6;
	left: 14px;
	top: 6px;
}

.noui-handle::after {
	left: 17px;
}

.noui-vertical .noui-handle::before,
.noui-vertical .noui-handle::after {
	width: 14px;
	height: 1px;
	left: 6px;
	top: 14px;
}

.noui-vertical .noui-handle::after {
	top: 17px;
}

/* Disabled state;
  */
[disabled] .noui-connect {
	background: #b8b8b8;
}

[disabled].noui-target,
[disabled].noui-handle,
[disabled] .noui-handle {
	cursor: not-allowed;
}

/* Base;
  *
  */
.noui-pips,
.noui-pips * {
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.noui-pips {
	position: absolute;
	color: #999;
}

/* Values;
  *
  */
.noui-value {
	position: absolute;
	white-space: nowrap;
	text-align: center;
}

.noui-value-sub {
	color: #ccc;
	font-size: 10px;
}

/* Markings;
  *
  */
.noui-marker {
	position: absolute;
	background: #ccc;
}

.noui-marker-sub {
	background: #aaa;
}

.noui-marker-large {
	background: #aaa;
}

/* Horizontal layout;
  *
  */
.noui-pips-horizontal {
	padding: 10px 0;
	height: 80px;
	top: 100%;
	left: 0;
	width: 100%;
}

.noui-value-horizontal {
	-webkit-transform: translate(-50%, 50%);
	transform: translate(-50%, 50%);
}

.noui-rtl .noui-value-horizontal {
	-webkit-transform: translate(50%, 50%);
	transform: translate(50%, 50%);
}

.noui-marker-horizontal.noui-marker {
	margin-left: -1px;
	width: 2px;
	height: 5px;
}

.noui-marker-horizontal.noui-marker-sub {
	height: 10px;
}

.noui-marker-horizontal.noui-marker-large {
	height: 15px;
}

/* Vertical layout;
  *
  */
.noui-pips-vertical {
	padding: 0 10px;
	height: 100%;
	top: 0;
	left: 100%;
}

.noui-value-vertical {
	-webkit-transform: translate(0, -50%);
	transform: translate(0, -50%);
	padding-left: 25px;
}

.noui-rtl .noui-value-vertical {
	-webkit-transform: translate(0, 50%);
	transform: translate(0, 50%);
}

.noui-marker-vertical.noui-marker {
	width: 5px;
	height: 2px;
	margin-top: -1px;
}

.noui-marker-vertical.noui-marker-sub {
	width: 10px;
}

.noui-marker-vertical.noui-marker-large {
	width: 15px;
}

.noui-tooltip {
	display: block;
	position: absolute;
	border: 1px solid #d9d9d9;
	border-radius: 3px;
	background: #fff;
	color: #000;
	padding: 5px;
	text-align: center;
	white-space: nowrap;
}

.noui-horizontal .noui-tooltip {
	-webkit-transform: translate(-50%, 0);
	transform: translate(-50%, 0);
	left: 50%;
	bottom: 120%;
}

.noui-vertical .noui-tooltip {
	-webkit-transform: translate(0, -50%);
	transform: translate(0, -50%);
	top: 50%;
	right: 120%;
}

.noui-horizontal .noui-origin > .noui-tooltip {
	-webkit-transform: translate(50%, 0);
	transform: translate(50%, 0);
	left: auto;
	bottom: 10px;
}

.noui-vertical .noui-origin > .noui-tooltip {
	-webkit-transform: translate(0, -18px);
	transform: translate(0, -18px);
	top: auto;
	right: 28px;
}

/* Styling;
 * Giving the connect element a border radius
 * causes issues with using transform: scale
 */
.tm-range-picker.noui-target {
	background: var(--slider-background);
	border-radius: 4px;
	border: 0;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-range-picker .noui-connects {
	border-radius: 3px;
}

.tm-range-picker .noui-connect {
	background: var(--slider-active-background);
}

/* Style resets */
.tm-range-picker,
.tm-range-picker .noui-handle {
	-webkit-box-shadow: none;
	box-shadow: none;
}

.tm-range-picker .noui-tooltip {
	background: #3fb8af;
	color: #fff;
	border: 2px solid #fff;
	padding: 0.4em;
	text-align: center;
	white-space: nowrap;
	border-radius: 3px;
	font-size: 1em;
}

.tm-range-picker .noui-active .noui-tooltip {
	display: block;
}

/* Hide markers on slider handles */
.tm-range-picker .noui-handle::before,
.tm-range-picker .noui-handle::after {
	display: none;
}

.noui-marker {
	background: var(--marker-color);
	opacity: 0.8;
}

.noui-marker-sub {
	opacity: 0.5;
	background: var(--marker-color);
}

.noui-marker-large {
	opacity: 1;
	background: var(--marker-color);
}

/* Style resets */


/* Styling the touch area */
.tm-range-picker .noui-handle .noui-touch-area::before {
	content: "";
	position: absolute;
	top: calc(-0.5 * var(--size) + 0.5 * 1em);
	left: calc(-0.5 * var(--size) + 0.5 * 1em);
	right: calc(-0.5 * var(--size) + 0.5 * 1em);
	bottom: calc(-0.5 * var(--size) + 0.5 * 1em);
	width: var(--size);
	height: var(--size);
	border-radius: 100%;
	background: var(--handle-background);
	z-index: -1;
	opacity: 0.2;
	will-change: transform;
	-webkit-transform: scale(0);
	transform: scale(0);
	-webkit-transition: all 0.1s ease-out, border-color 0.2s ease-out;
	transition: all 0.1s ease-out, border-color 0.2s ease-out;
	display: block;
	--size: calc(var(--handle-size) * 1.8);
}

/* Show a border when hovering the area the handle responds to */
.tm-range-picker .noui-handle:hover .noui-touch-area::before {
	border: 0;
	-webkit-transform: scale(0.9);
	transform: scale(0.9);
}

.tm-range-picker .noui-active.noui-handle:hover .noui-touch-area::before {
	border: 0;
	-webkit-transform: scale(1);
	transform: scale(1);
}

/* Styling the touch area */

/* Values */
.tm-range-picker .noui-value {
	position: absolute;
	white-space: nowrap;
	text-align: center;
	font-size: 0.8em;
	margin-top: 0.8em;
}

.tm-range-picker .noui-value-sub {
	color: inherit;
	font-size: 10px;
	margin-top: 0.6em;
	opacity: 0.5;
}

.tm-range-picker .noui-marker-horizontal.noui-marker {
	margin-left: -1px;
	width: 1px;
}

/* Values */

/* Styling round slider */
.tm-range-picker {
	--handle-size: 14px;
	--slider-height: 3px;
	--handle-radius: calc(var(--handle-size) / 2);
	--handle-background: #3fb8af;
	--slider-active-background: #3fb8af;
	--slider-background: #cdcdcd;
	--marker-color: #aaa;
	height: var(--slider-height);
}

.tm-range-picker .noui-handle {
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	border: 0;
	background: var(--handle-background);
	cursor: pointer;
	-webkit-box-shadow: none;
	box-shadow: none;
	outline: none !important;

	height: var(--handle-size);
	width: var(--handle-size);
	top: calc((var(--handle-size) - var(--slider-height)) / -2);
	right: calc(var(--handle-size) / -2);

	/* half the width */
	border-radius: var(--handle-radius);
}

/* Styling round slider */
assets/css/tm-epo-smallscreen.css000064400000004252150755142450013072 0ustar00/* stylelint-disable no-descending-specificity */
/* stylelint-disable selector-class-pattern */

/**
 * This file contains the styling for the plugin.
 *
 * Please do not make alterations to this file as you
 * will loose them when updating the plugin.
 *
 * This file contents are outlined below.
 *
 * 1. Grid system
 * 2. Containers
 * 3. Elements
 * 4. Floatbox
 * 5. Floating totals box
 * 6. Validation errors
 * 7. Lightbox
 * 8. Datepicker and Timepicker
 * 9. Checkbox and Radio button
 * 10. Checkbox and Radio button custom styles
 * 11. Checkbox and Radio button swatches
 * 12. Product element
 * 13. Tooltip
 * 14. Cart and Order styles
 * 15. Various styles
 * 16. Theme fixes
 *
 * @package Extra Product Options/CSS
 * @version 6.0
 */

/* 1. Grid system */

.tm-responsive .tcwidth {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
}

.tm-responsive .tm-extra-product-options ul.tmcp-elements:not(.tm-extra-product-options-variations) li.tmcp-field-wrap:not(.tm-per-row) {
	float: none !important;
	width: 100% !important;
}

.tm-responsive .tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap {
	grid-template-columns: 1fr;
}

.tm-responsive .tm-extra-product-options .tc-col-auto,
.tm-responsive .tm-extra-product-options .tc-cell.tc-col-auto,
.tm-responsive .tc-cell.tc-col-auto,
.tm-responsive .tc-col-auto {
	-webkit-box-flex: 0;
	-ms-flex: 0 0 100%;
	flex: 0 0 100%;
	max-width: 100%;
}


/* 5. Floating totals box */

.tm-floating-box {
	display: none !important;
}

/* 10. Checkbox and Radio button custom styles */

.tm-epo-style:hover::after {
	opacity: 0;
}


/* 14. Cart and Order styles */

.tm-epo-cart-row .product-remove,
.tm-epo-cart-row .product-thumbnail,
.tm-epo-cart-row .product-price,
.tm-epo-cart-row .product-quantity,
.tm-epo-cart-row .product-subtotal,
.tc-epo-cart-row-total .product-remove,
.tc-epo-cart-row-total .product-thumbnail,
.tc-epo-cart-row-total .product-name,
.tc-epo-cart-row-total .product-price {
	display: none !important;
}

.tm-epo-cart-option-mobile {
	display: block;
}
assets/css/tm-epo.min.css000064400000313043150755142450011347 0ustar00:root{--tcgaprow:15px;--tcgapcolumn:15px;--tcinnergaprow:calc(var(--tcgaprow) / 2);--tcinnergapcolumn:calc(var(--tcgapcolumn) / 2);--tcgap:var(--tcgaprow) var(--tcgapcolumn);--tcinnergap:var(--tcinnergaprow) var(--tcinnergapcolumn);--tcinlinesize:3em;--flex-items:1;--swatch-border-radius:0;--swatch-border-color:transparent;--swatch-active-border-color:inherit;--text-swatch-border-color:inherit;--text-swatch-border-width:1px;--text-swatch-active-border-width:1px;--swatch-border-width:2px;--swatch-active-border-width:2px}.tm-extra-product-options .tc-container,.tc-container{display:block;width:100%;padding:0 var(--tcgapcolumn);margin:0}.tm-extra-product-options .tc-row,.tc-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-line-pack:start;align-content:flex-start;margin:0;gap:var(--tcgap)}.tm-extra-product-options .tc-element-inner-wrap .tc-row{gap:var(--tcinnergap)}.tc-row>*,.tmcp-field-wrap-inner>*,.tc-label-wrap>*,.tm-epo-element-label>*{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.tc-section-inner-wrap>.tc-row{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-extra-product-options .tc-cell,.tc-extra-product-options .tmcp-field-wrap label.tc-cell,.tc-cell{position:relative;padding:0;min-height:1px;overflow:visible;width:100%;margin-left:0 !important;margin-right:0 !important}.tm-extra-product-options .cpf-type-dynamic .tc-cell,.tc-extra-product-options .cpf-type-dynamic .tmcp-field-wrap label.tc-cell,.cpf-type-dynamic .tc-cell,.cpf-type-dynamic.tc-cell{min-height:0}.cpf-section.tc-cell{margin:0}.cpf-section.section-disabled{display:none}.tc-container.nopadding{padding-left:0;padding-right:0}.nomargin .tc-cell{margin:0}.tc-row .cpf-section.tc-row{margin:0}.tm-extra-product-options .tc-row.tc-col-12,.tm-extra-product-options .tc-row.tc-col-12 .tc-row.tc-col-12{margin:0 -1em;min-width:100% !important;max-width:100%;overflow:visible;position:relative}.tm-extra-product-options .tc-col,.tm-extra-product-options .tc-cell.tc-col,.tc-cell.tc-col,.tc-col{-webkit-box-flex:1;-ms-flex:1 1 0;flex:1 1 0;max-width:100%}.tm-extra-product-options .tc-col-auto,.tm-extra-product-options .tc-cell.tc-col-auto,.tc-cell.tc-col-auto,.tc-col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.tm-extra-product-options .tc-col-0,.tm-extra-product-options .tc-cell.tc-col-0,.tc-cell.tc-col-0,.tc-col-0{-webkit-box-flex:0;-ms-flex:0;flex:0;max-width:0}.tm-extra-product-options .tc-col-1,.tm-extra-product-options .tc-cell.tc-col-1,.tc-cell.tc-col-1,.tc-col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3334%;flex:0 0 8.3334%;max-width:8.3334%}.tm-extra-product-options .tc-col-1-5,.tm-extra-product-options .tc-cell.tc-col-1-5,.tc-cell.tc-col-1-5,.tc-col-1-5{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.tm-extra-product-options .tc-col-2,.tm-extra-product-options .tc-cell.tc-col-2,.tc-cell.tc-col-2,.tc-col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6667%;flex:0 0 16.6667%;max-width:16.6667%}.tm-extra-product-options .tc-col-2-5,.tm-extra-product-options .tc-cell.tc-col-2-5,.tc-cell.tc-col-2-5,.tc-col-2-5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.tm-extra-product-options .tc-col-3,.tm-extra-product-options .tc-cell.tc-col-3,.tc-cell.tc-col-3,.tc-col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.tm-extra-product-options .tc-col-4,.tm-extra-product-options .tc-cell.tc-col-4,.tc-cell.tc-col-4,.tc-col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3334%;flex:0 0 33.3334%;max-width:33.3334%}.tm-extra-product-options .tc-col-4-5,.tm-extra-product-options .tc-cell.tc-col-4-5,.tc-cell.tc-col-4-5,.tc-col-4-5{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.tm-extra-product-options .tc-col-5,.tm-extra-product-options .tc-cell.tc-col-5,.tc-cell.tc-col-5,.tc-col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6667%;flex:0 0 41.6667%;max-width:41.6667%}.tm-extra-product-options .tc-col-6,.tm-extra-product-options .tc-cell.tc-col-6,.tc-cell.tc-col-6,.tc-col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.tm-extra-product-options .tc-col-7,.tm-extra-product-options .tc-cell.tc-col-7,.tc-cell.tc-col-7,.tc-col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3334%;flex:0 0 58.3334%;max-width:58.3334%}.tm-extra-product-options .tc-col-7-5,.tm-extra-product-options .tc-cell.tc-col-7-5,.tc-cell.tc-col-7-5,.tc-col-7-5{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.tm-extra-product-options .tc-col-8,.tm-extra-product-options .tc-cell.tc-col-8,.tc-cell.tc-col-8,.tc-col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6667%;flex:0 0 66.6667%;max-width:66.6667%}.tm-extra-product-options .tc-col-9,.tm-extra-product-options .tc-cell.tc-col-9,.tc-cell.tc-col-9,.tc-col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.tm-extra-product-options .tc-col-10,.tm-extra-product-options .tc-cell.tc-col-10,.tc-cell.tc-col-10,.tc-col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3334%;flex:0 0 83.3334%;max-width:83.3334%}.tm-extra-product-options .tc-col-10-5,.tm-extra-product-options .tc-cell.tc-col-10-5,.tc-cell.tc-col-10-5,.tc-col-10-5{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.tm-extra-product-options .tc-col-11,.tm-extra-product-options .tc-cell.tc-col-11,.tc-cell.tc-col-11,.tc-col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6667%;flex:0 0 91.6667%;max-width:91.6667%}.tm-extra-product-options .tc-col-12,.tm-extra-product-options .tc-cell.tc-col-12,.tc-cell.tc-col-12,.tc-col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tcwidth{-webkit-box-flex:0;-ms-flex:0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));flex:0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));max-width:calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)))}.tcwidth-1{--flex-items:100}.tcwidth-2{--flex-items:50}.tcwidth-3{--flex-items:calc(100 / 3)}.tcwidth-4{--flex-items:25}.tcwidth-5{--flex-items:20}.tcwidth-6{--flex-items:calc(100 / 6)}.tcwidth-7{--flex-items:calc(100 / 7)}.tcwidth-8{--flex-items:calc(100 / 8)}.tcwidth-9{--flex-items:calc(100 / 9)}.tcwidth-10{--flex-items:10}.tcwidth-11{--flex-items:calc(100 / 11)}.tcwidth-12{--flex-items:calc(100 / 12)}.tcwidth-12-5{--flex-items:calc(100 / 12.5%)}.tcwidth-13{--flex-items:calc(100 / 13)}.tcwidth-14{--flex-items:calc(100 / 14)}.tcwidth-15{--flex-items:calc(100 / 15)}.tcwidth-16{--flex-items:calc(100 / 16)}.tcwidth-17{--flex-items:calc(100 / 17)}.tcwidth-18{--flex-items:calc(100 / 18)}.tcwidth-19{--flex-items:calc(100 / 19)}.tcwidth-20{--flex-items:5}.tcwidth-21{--flex-items:calc(100 / 21)}.tcwidth-22{--flex-items:calc(100 / 22)}.tcwidth-23{--flex-items:calc(100 / 23)}.tcwidth-24{--flex-items:calc(100 / 24)}.tcwidth-25{--flex-items:4}.tcwidth-26{--flex-items:calc(100 / 26)}.tcwidth-27{--flex-items:calc(100 / 27)}.tcwidth-28{--flex-items:calc(100 / 28)}.tcwidth-29{--flex-items:calc(100 / 29)}.tcwidth-30{--flex-items:calc(100 / 30)}.tcwidth-31{--flex-items:calc(100 / 31)}.tcwidth-32{--flex-items:calc(100 / 32)}.tcwidth-33{--flex-items:calc(100 / 33)}.tcwidth-34{--flex-items:calc(100 / 34)}.tcwidth-35{--flex-items:calc(100 / 35)}.tcwidth-36{--flex-items:calc(100 / 36)}.tcwidth-37{--flex-items:calc(100 / 37)}.tcwidth-37-5{--flex-items:calc(100 / 37.5%)}.tcwidth-38{--flex-items:calc(100 / 38)}.tcwidth-39{--flex-items:calc(100 / 39)}.tcwidth-40{--flex-items:calc(100 / 40)}.tcwidth-41{--flex-items:calc(100 / 41)}.tcwidth-42{--flex-items:calc(100 / 42)}.tcwidth-43{--flex-items:calc(100 / 43)}.tcwidth-44{--flex-items:calc(100 / 44)}.tcwidth-45{--flex-items:calc(100 / 45)}.tcwidth-46{--flex-items:calc(100 / 46)}.tcwidth-47{--flex-items:calc(100 / 47)}.tcwidth-48{--flex-items:calc(100 / 48)}.tcwidth-49{--flex-items:calc(100 / 49)}.tcwidth-50{--flex-items:2}.tcwidth-51{--flex-items:calc(100 / 51)}.tcwidth-52{--flex-items:calc(100 / 52)}.tcwidth-53{--flex-items:calc(100 / 53)}.tcwidth-54{--flex-items:calc(100 / 54)}.tcwidth-55{--flex-items:calc(100 / 55)}.tcwidth-56{--flex-items:calc(100 / 56)}.tcwidth-57{--flex-items:calc(100 / 57)}.tcwidth-58{--flex-items:calc(100 / 58)}.tcwidth-59{--flex-items:calc(100 / 59)}.tcwidth-60{--flex-items:calc(100 / 60)}.tcwidth-61{--flex-items:calc(100 / 61)}.tcwidth-62{--flex-items:calc(100 / 62)}.tcwidth-62-5{--flex-items:calc(100 / 62.5%)}.tcwidth-63{--flex-items:calc(100 / 63)}.tcwidth-64{--flex-items:calc(100 / 64)}.tcwidth-65{--flex-items:calc(100 / 65)}.tcwidth-66{--flex-items:calc(100 / 66)}.tcwidth-67{--flex-items:calc(100 / 67)}.tcwidth-68{--flex-items:calc(100 / 68)}.tcwidth-69{--flex-items:calc(100 / 69)}.tcwidth-70{--flex-items:calc(100 / 70)}.tcwidth-71{--flex-items:calc(100 / 71)}.tcwidth-72{--flex-items:calc(100 / 72)}.tcwidth-73{--flex-items:calc(100 / 73)}.tcwidth-74{--flex-items:calc(100 / 74)}.tcwidth-75{--flex-items:calc(100 / 75)}.tcwidth-76{--flex-items:calc(100 / 76)}.tcwidth-77{--flex-items:calc(100 / 77)}.tcwidth-78{--flex-items:calc(100 / 78)}.tcwidth-79{--flex-items:calc(100 / 79)}.tcwidth-80{--flex-items:calc(100 / 80)}.tcwidth-81{--flex-items:calc(100 / 81)}.tcwidth-82{--flex-items:calc(100 / 82)}.tcwidth-83{--flex-items:calc(100 / 83)}.tcwidth-84{--flex-items:calc(100 / 84)}.tcwidth-85{--flex-items:calc(100 / 85)}.tcwidth-86{--flex-items:calc(100 / 86)}.tcwidth-87{--flex-items:calc(100 / 87)}.tcwidth-87-5{--flex-items:calc(100 / 37.5%)}.tcwidth-88{--flex-items:calc(100 / 88)}.tcwidth-89{--flex-items:calc(100 / 89)}.tcwidth-90{--flex-items:calc(100 / 90)}.tcwidth-91{--flex-items:calc(100 / 91)}.tcwidth-92{--flex-items:calc(100 / 92)}.tcwidth-93{--flex-items:calc(100 / 93)}.tcwidth-94{--flex-items:calc(100 / 94)}.tcwidth-95{--flex-items:calc(100 / 95)}.tcwidth-96{--flex-items:calc(100 / 96)}.tcwidth-97{--flex-items:calc(100 / 97)}.tcwidth-98{--flex-items:calc(100 / 98)}.tcwidth-99{--flex-items:calc(100 / 99)}.tcwidth-100{--flex-items:1}.tc-extra-product-options{visibility:hidden}.tc-extra-product-options.tc-show,.tc-extra-product-options.tc-show-override{display:block;clear:both;visibility:visible}.tc-extra-product-options.tc-show-hidden{display:block;clear:both;visibility:hidden !important}.tm-extra-product-options,.tm-extra-product-options .tm-extra-product-options-fields,.tm-extra-product-options .tc-element-container,.tm-extra-product-options .tmcp-ul-wrap,.tm-extra-product-options .tmcp-field,.tm-extra-product-options .tm-epo-field,.tm-extra-product-options li.tmcp-field-wrap,.tm-extra-product-options .tmcp-field-wrap-inner,.tm-extra-product-options .tc-cell,.tm-extra-product-options .tc-row,.tm-collapse,.tm-collapse-wrap,.tc-epo-label,.tm-show-picker-value,.tm-bsbb,.tm-bsbb-all,.tm-bsbb-all *,.tc-container,.tc-row,.tc-cell,.tm-box,.flasho,.flasho div,.tm-button,.tm-epo-style,.tc-lightbox img,.tm-extra-product-options .tc-image{-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options{max-width:100%;width:100%}.tm-extra-product-options .tmcp-ul-wrap{overflow:visible;max-width:100%;width:100%;margin-bottom:0}.tm-extra-product-options .tc-element-container{overflow:visible;margin-bottom:0}.tm-extra-product-options .tm-extra-product-options-fields,.tm-extra-product-options .tmcp-ul-wrap{clear:both;list-style:none outside none;margin:0;padding:0}.tm-extra-product-options .tc-repeater-element,.tc-repeater-delete,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:var(--tcinnergap);max-width:100%}.tc-element-container{gap:var(--tcgap);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-field-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;gap:0 var(--tcinnergapcolumn);max-width:100%;width:100%}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap{display:grid;grid-template-columns:auto auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap{grid-template-columns:1fr auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.no-price{grid-template-columns:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-price{grid-template-columns:1fr}.tm-extra-product-options .cpf-type-select .tm-epo-field-label{display:grid;grid-template-columns:auto auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul .tm-epo-field-label{grid-template-columns:1fr auto}.tm-extra-product-options .cpf-type-select li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label{grid-template-columns:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label,.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.desc-inline .tm-epo-field-label{grid-template-columns:1fr}.tm-extra-product-options .tc-repeater-element,.tc-repeater-delete{-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-extra-product-options .tc-repeater-element{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-extra-product-options .tc-repeater-element .tmcp-ul-wrap{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important;-ms-flex-preferred-size:0 !important;flex-basis:0 !important;width:auto !important}.tc-repeater-delete{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-preferred-size:0;flex-basis:0;width:auto;padding:0}.tc-price-wrap{padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:calc(1ch / 2)}.tm-extra-product-options .tmcp-ul-wrap+.tmcp-ul-wrap{margin:.5em 0 0 0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner{width:100%;list-style:none outside none !important;position:relative;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-radio ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-checkbox ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner{width:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tmcp-field-wrap-inner .tc-price-wrap{justify-self:flex-end}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap{padding:0;margin:0}.tc-epo-element-product-li-container{width:100%;max-width:100%;overflow-x:auto;overflow-y:hidden}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap:last-child{margin:0}.tc-totals-form{clear:both;display:none;width:100%}.tc-totals-form.tc-show{display:block}.tm-epo-totals{clear:both;padding-bottom:1em;padding-top:1em}.tm-epo-totals:empty{display:none}.tc-epo-totals.hidden,.tc-extra-product-options.hidden{display:none}html .tc-extra-product-options .tc-hidden.tc-cell,.tc-hidden,.tm-hidden,.tm-extra-product-options .tc-mode-text .tc-input-wrap,.tm-extra-product-options .tc-mode-color .tc-input-wrap,.tm-extra-product-options .tc-mode-images .tc-input-wrap,.tm-extra-product-options .tc-mode-color input.use_images,.tm-extra-product-options .tc-mode-images input.use_images{display:none !important}.tm-box,.tm-collapse{border:1px solid rgba(0,0,0,0.035);background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,0.01)),color-stop(50%,rgba(0,0,0,0.01)),color-stop(50%,rgba(0,0,0,0.02)),to(rgba(0,0,0,0.01)));background-image:linear-gradient(to top,rgba(0,0,0,0.01) 0,rgba(0,0,0,0.01) 50%,rgba(0,0,0,0.02) 50%,rgba(0,0,0,0.01) 100%);margin:0;width:100%;max-width:100%}.tm-box{padding:var(--tcgap)}.tm-collapse{padding:0}.tm-extra-product-options .cpf-section.tc-cell.tm-owl-slider-section .tm-box .tc-row{padding-bottom:var(--tcgap)}.tm-arrow{cursor:pointer;height:1em;text-align:center;width:1em;display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-ordinal-group:101;-ms-flex-order:100;order:100}.tm-extra-product-options .tc-epo-label .tm-arrow{margin-left:auto}.tm-toggle{padding-right:2em;position:relative;cursor:pointer}.tm-collapse .tm-toggle{clear:both}.tc-row.tm-collapse{gap:0}.tm-collapse>.tc-cell{margin-bottom:0}.tm-collapse-wrap{float:left;padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn);overflow:visible;width:100%}.tc-totals-form dl.tm-extra-product-options-totals{margin-left:0;margin-right:0}dl.tm-extra-product-options-totals{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:1.5}dl.tm-extra-product-options-totals dt,dl.tm-extra-product-options-totals dd{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%;width:auto;text-align:unset;display:initial;border:0;padding:0}dl.tm-extra-product-options-totals dd{padding-bottom:var(--tcinnergaprow)}.tm-extra-product-options .tm-box .tm-section-label,.tm-extra-product-options .tm-collapse .tm-section-label,.tm-extra-product-options .tm-box .tc-epo-label.tm-section-label,.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label{margin:0;position:relative;border:0;outline:0;width:100%}.tm-extra-product-options .tm-collapse .tm-section-label,.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label{padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn)}.tm-extra-product-options .tm-collapse .tm-section-description{padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn)}.tc-styled-variations{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-epo-required{color:red}.tmcp-field-wrap .tm-epo-required{position:static;left:auto;top:auto}label.tm-epo-field-label{-ms-flex-item-align:center;align-self:center;margin:0}.tc-epo-element-product-thumbnailmultiple label.tm-epo-field-label,.tc-epo-element-product-thumbnail label.tm-epo-field-label,.tc-mode-images label.tm-epo-field-label,.tc-mode-color label.tm-epo-field-label{-ms-flex-item-align:start;align-self:flex-start}.tc-left,.tc-above,.tc-top{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.tc-right,.tc-below,.tc-bottom{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.tc-first{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options ul.tm-extra-product-options-fields li::before,.tm-extra-product-options ul.tm-extra-product-options-fields li::after,.tm-extra-product-options ul.tmcp-ul-wrap li::before,.tm-extra-product-options ul.tmcp-ul-wrap li::after{display:none}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label{margin:0}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-radio .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-checkbox .tm-label{padding:0 !important;margin:0 !important;display:inline !important;vertical-align:middle}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label.tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label.tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label.tc-label{vertical-align:initial;-ms-flex-item-align:center;align-self:center}.tc-label-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;max-width:100%;gap:0 var(--tcinnergapcolumn)}.fullwidth-ul .tc-label-inner:not(.tc-mode-text .tc-label-inner){display:grid;grid-template-columns:auto auto 1fr}.fullwidth-ul .tc-label-inner.desc-inline:not(.tc-mode-text .tc-label-inner),.fullwidth-ul .tc-label-inner.no-desc:not(.tc-mode-text .tc-label-inner){grid-template-columns:auto 1fr}.tc-mode-text .tc-label-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),.tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner){-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fullwidth-ul .tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),.fullwidth-ul .tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner){-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:1fr;justify-items:center;gap:var(--tcinnergaprow) 0}.tc-mode-color .radio-image-label,.tc-mode-images .radio-image-label,.tc-mode-color .checkbox-image-label,.tc-mode-images .checkbox-image-label{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcinnergap)}.tc-label-text{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;max-width:100%;gap:0 var(--tcinnergapcolumn);-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label:empty,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label:empty,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label:empty{padding:0 !important}.tm-extra-product-options .tm-extra-product-options-field{clear:both;padding:0}.tm-extra-product-options .tm-extra-product-options-field.tc-normal-mode{margin:0 0 1em}.tm-extra-product-options .tc-active .tc-label-text,.tm-extra-product-options li.tmcp-field-wrap.tc-active .price.tc-price .amount,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label input[type="radio"]:checked ~ .tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label input[type="checkbox"]:checked ~ .tc-label{font-weight:700;background:none !important}.tc-extra-product-options .tmcp-field-wrap label,.tm-epo-variation-section .tmhexcolorimage-li-nowh label,.tm-epo-variation-section .tmhexcolorimage-li label{padding:0;float:none;max-width:100%;width:auto;overflow-wrap:break-word}.tm-extra-product-options .tmcp-field-wrap label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;min-width:0;gap:var(--tcinnergap)}.tm-extra-product-options .tmcp-field-wrap label:not(.fullwidth){-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-extra-product-options .cpf-type-variations .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-product .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth>*,.tc-extra-product-options .cpf-type-selectmultiple .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-time .tmcp-field-wrap label.fullwidth .tm-epo-field,.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label.fullwidth .tm-epo-field,.tc-extra-product-options .cpf-type-textfield .tmcp-field-wrap label.fullwidth .tm-epo-field{width:100%}.tc-extra-product-options .cpf-type-textarea .tmcp-field-wrap label.fullwidth .tm-epo-field{width:100% !important}.tm-extra-product-options .tc-images-container .tmcp-field-wrap label,.tm-extra-product-options .tc-colors-container .tmcp-field-wrap label,.tm-epo-variation-section .tmhexcolorimage-li-nowh label,.tm-epo-variation-section .tmhexcolorimage-li label{cursor:pointer;width:100%}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-startcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startimages,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startcolor{text-align:initial;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endimages{text-align:initial;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-images .tc-field-label-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:var(--tcinnergap)}.tm-extra-product-options .tc-cell hr{margin:var(--tcgaprow) 0}.tm-extra-product-options .tm_divider{border-style:solid;border-width:1px;margin:var(--tcgaprow) 0;clear:both}.tm-extra-product-options .cpf-element .tm_divider.tc-cell{margin:var(--tcgaprow) 0}.tm-extra-product-options .tm_padding{padding:var(--tcgaprow) 0}.tm-extra-product-options .cpf-element .tm_padding.tc-cell{margin-left:var(--tcgapcolumn);margin-right:var(--tcgapcolumn)}.tm-extra-product-options textarea.tm-epo-field{height:auto;width:100%;max-width:100%}.tm-extra-product-options .tmcp-textfield.tm-epo-field{width:auto;max-width:100%}.tm-extra-product-options .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .tm-epo-field.tmcp-radio{margin:0 !important;padding:0 !important;vertical-align:middle;position:relative;width:auto;float:none;top:1px}.tm-extra-product-options .tc-epo-label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:relative;float:none;width:100%;margin-bottom:0;gap:var(--tcinnergap)}.tm-extra-product-options .tc-epo-label.tm-section-label{margin:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-section-label-text{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.float-editbox .section_popup .tm-section-label{display:none}.tm-epo-field.tmcp-select{width:100%;max-width:100%;display:initial}.tc-repeater-element .tm-epo-field.tmcp-select,.tc-repeater-element .tm-epo-field.tmcp-selectmultiple{width:100%}.tm-extra-product-options input.tm-epo-field.tmcp-upload{width:100%;font-size:inherit}.tc-extra-product-options .tmcp-field-wrap .cpf-upload-text{width:100%;display:inline-block;text-align:center}.tc-upload-preview{display:grid;margin:1em 0;width:100%;gap:1em;grid-template-columns:minmax(100px,-webkit-max-content);grid-template-columns:minmax(100px,max-content);grid-template-rows:1fr}.tc-upload-preview:empty{display:none}.tc-upload-preview.multiple{grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}.tc-upload-file{border-radius:5px;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;margin:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-upload-preview.multiple .tc-upload-file{max-height:100%;min-height:100px}.tc-upload-image{position:relative;border:1px solid;padding:2%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:5px;background:rgba(0,0,0,0.7);min-width:100%;min-height:100px}.tc-upload-preview.multiple .tc-upload-image{min-height:100%}.woocommerce .tc-upload-preview img{height:auto;max-width:100%;width:auto;border-radius:5px;border:1px solid rgba(0,0,0,0.1);padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce .tc-upload-preview.multiple img{height:96%;width:96%;-o-object-fit:scale-down;object-fit:scale-down;max-height:100%;position:absolute}.tc-file-size{position:absolute;color:#fff;font-size:.625em;top:calc(2% + 0.5078125em);left:calc(2% + 0.5078125em);background:rgba(0,0,0,0.5);padding:0 3px;z-index:1}.tc-file-ext-overlay{background:rgba(0,0,0,0.2);width:96%;height:96%;position:absolute;border-radius:5px 12px 5px 5px;-webkit-box-sizing:border-box;box-sizing:border-box;left:2%;top:2%}.tc-file-ext{position:absolute;padding:2px;background:rgba(0,0,0,0.5);color:#fff;min-width:30%;text-align:center;text-transform:uppercase;font-size:.825em}.tc-file-name{max-width:94%;position:absolute;color:#fff;background:rgba(0,0,0,0.5);bottom:0;font-size:.625em;padding:.25em .5em;text-overflow:ellipsis;overflow:hidden;max-height:2em;line-height:2}.tc-upload-remove{cursor:pointer;position:absolute;right:2%;top:2%;font-size:1em;width:1.625em;height:1.625em;font-family:inherit;line-height:inherit;margin:0;padding:0;border:0;outline:0;color:#fff;border-radius:50%;background-color:rgba(0,0,0,0.5);background-image:none;-webkit-box-shadow:0 0 0 0 hsl(0 0 100% / 0);box-shadow:0 0 0 0 hsl(0 0 100% / 0);z-index:2;-webkit-transition:all .2s ease;transition:all .2s ease}.tc-upload-remove:hover,.tc-upload-remove:focus{-webkit-box-shadow:0 0 0 .125em rgb(255 255 255 / 90%);box-shadow:0 0 0 .125em rgb(255 255 255 / 90%);background:rgba(0,0,0,0.5);color:#fff}.tc-upload-remove svg{width:100%;height:100%;font-size:inherit;-webkit-box-sizing:inherit;box-sizing:inherit;line-height:inherit}.cpf-upload-container-basic,.cpf-upload-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-max-file-size{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container-basic .cpf-upload-wrap{display:block !important;position:relative;vertical-align:middle;cursor:pointer}.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container .cpf-upload-wrap{border:1px solid;display:block !important;font-size:1em;height:auto;overflow:hidden;padding:.5em 1em;position:relative;vertical-align:middle;margin:0 .5em 0 0;cursor:pointer}.cpf-upload-container [type="file"]{cursor:inherit;display:block;font-size:.01px;min-height:100%;min-width:100%;opacity:0;position:absolute;right:0;text-align:right;top:0}.cpf-upload-container+small::before,.cpf-upload-container-basic+small::before{content:"";display:block}.tm-filename{display:block;-ms-flex-item-align:center;align-self:center}.tm-filename:empty{display:none}.tc-upload-messages{padding:var(--tcgaprow) 0}.tc-upload-message{font-size:1.2em;margin-bottom:var(--tcgap)}.tm-extra-product-options .cpf-type-range .tc-epo-label{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range{clear:both;position:relative}.tm-range-picker{margin:1em 14px;max-width:100%;width:auto;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.tm-range-picker.noui-show-tooltip{margin:calc(1em + 22px) 14px}.tm-range-picker.pips,.tm-range-picker.noui-show-tooltip.pips{margin:calc(50px - 1em) 14px 50px 14px}.tm-range-picker .noui-tooltip{line-height:1;font-size:10px}.tc-extra-product-options .tm-show-picker-left,.tc-extra-product-options .tm-show-picker-tleft,.tc-extra-product-options .tm-show-picker-right,.tc-extra-product-options .tm-show-picker-tright{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tc-extra-product-options .tm-show-picker-left .tm-range-picker,.tc-extra-product-options .tm-show-picker-tleft .tm-range-picker,.tc-extra-product-options .tm-show-picker-right .tm-range-picker,.tc-extra-product-options .tm-show-picker-tright .tm-range-picker{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value{position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;border:1px solid;border-radius:5px;padding:0 1em;display:inline-block;max-width:20%;min-width:4em;text-align:center;line-height:normal}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tc-extra-product-options .tm-show-picker-left .tc-price-wrap,.tc-extra-product-options .tm-show-picker-tleft .tc-price-wrap,.tc-extra-product-options .tm-show-picker-right .tc-price-wrap,.tc-extra-product-options .tm-show-picker-tright .tc-price-wrap{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.tm-extra-product-options .tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range .tm-range-picker-value{display:inline-block;float:right;margin-left:0;margin-top:-3px;position:absolute;right:0;text-align:center;top:1em;vertical-align:top;width:19%}input.tm-show-picker-value-edit{max-width:100%;width:4em;text-align:center;padding:0;border:1px solid;margin:0}.tm-show-picker-value-edit-wrap{-webkit-box-sizing:border-box;box-sizing:border-box}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value-edit-wrap{max-width:20%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;position:relative;text-align:center;top:0;font-size:.8em;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;-ms-flex-item-align:center;align-self:center}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options .tc-epo-label.tm-has-undo-button{padding-right:2em}.tm-epo-reset-variation,.tm-extra-product-options .tm-epo-reset-radio{text-align:center;cursor:pointer;position:absolute;right:0;top:0;width:1em;height:1em;line-height:1;padding:.2em;border:2px solid;color:inherit;-webkit-box-sizing:content-box !important;box-sizing:content-box !important;background:rgba(255,255,255,0.8);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:10000}.round .tm-epo-reset-variation,.round .tm-epo-reset-radio{border-radius:5px}.square .tm-epo-reset-variation,.square .tm-epo-reset-radio{border-radius:0}.circle .tm-epo-reset-variation,.circle .tm-epo-reset-radio{border-radius:100%}.thinline .tm-epo-reset-variation,.thinline .tm-epo-reset-radio{border-width:1px;border-radius:0}.shadow .tm-epo-reset-variation,.shadow .tm-epo-reset-radio{border-width:1px;border-radius:0}.tm-epo-reset-variation .tcfa,.tm-epo-reset-radio .tcfa{font-size:.8em;position:relative}.tm-epo-variation-section .reset_variations{clear:both;display:block;width:100%;position:static;visibility:hidden}.tm-extra-product-options .tmcp-field-wrap .tc-price{font-size:1em !important;width:auto !important;display:inline-block !important;float:none !important;margin:0 !important;padding:0 !important}.tc-extra-product-options .tmcp-field-wrap .price.tc-price,.after-amount,.before-amount{font-size:1em !important;background:none !important}.tc-extra-product-options .tmcp-field-wrap .price.tc-price .amount{font-size:1em !important;display:inline !important;background:none !important;white-space:nowrap}.tm-extra-product-options .tmcp-field-wrap .tc-chars+.tc-price .amount{margin-left:0}.tm-extra-product-options .tc-images-container .tmcp-field-wrap .amount{margin-left:0}.tm-extra-product-options .amount.hidden,.tm-extra-product-options .tmcp-field-wrap .price.amount.hidden,.tm-extra-product-options .tmcp-field-wrap .tc-price.hidden,.tm-extra-product-options .before-amount.hidden,.tm-extra-product-options .after-amount.hidden,.tm-extra-product-options .tmperiod.hidden{display:none !important}.tm-extra-product-options .cpf-type-textarea .tmcp-field-wrap .amount,.tm-extra-product-options .cpf-type-textfield .tmcp-field-wrap .amount{margin-left:0}.tm-extra-product-options-totals .price.amount.options,.tm-extra-product-options-totals .price.amount.fees,.tm-extra-product-options-totals .price.amount.subscription-fee{font-size:1.25em}.tm-extra-product-options-totals .amount{background:0}.tm-extra-product-options-totals .amount.options,.tm-extra-product-options-totals .amount.fees,.tm-extra-product-options-totals .amount.subscription-fee{font-weight:700}.tm-extra-product-options-totals .amount.final{font-size:1.5em;font-weight:700}.tm-extra-product-options-totals .price.amount{display:inline-block !important;width:auto;margin:0}.tm-unit-price,.tm-fee-totals,.tm-final-totals,.tm-options-totals,.tm-subscription-fee{padding:0;margin:0;border:0 none;float:none}.tm-extra-product-options .tmcp-field-wrap .tc-price del{font-size:75% !important;margin:0 !important}.tm-extra-product-options .tmcp-field-wrap .price:empty{display:none !important}.tc-quantity-right .tm-quantity,.tc-quantity-left .tm-quantity{-ms-flex-item-align:center;align-self:center}.tm-extra-product-options .cpf-type-checkbox .tc-quantity-right .tm-quantity,.tm-extra-product-options .cpf-type-checkbox .tc-quantity-left .tm-quantity,.tm-extra-product-options .cpf-type-radio .tc-quantity-right .tm-quantity,.tm-extra-product-options .cpf-type-radio .tc-quantity-left .tm-quantity{-ms-flex-item-align:unset;align-self:unset}.cpf-type-textfield .tc-quantity-right .tm-quantity,.cpf-type-textfield .tc-quantity-left .tm-quantity{-ms-flex-item-align:initial;align-self:initial}.tc-quantity-wrapper{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tc-row.tc-quantity-right,.tc-row.tc-quantity-left{-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tc-quantity-right .tm-quantity,.tc-quantity-bottom .tm-quantity{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.tc-quantity-left .tm-quantity,.tc-quantity-top .tm-quantity{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-top,.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-bottom{-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-row.tc-quantity-top .tm-quantity,.tc-row.tc-quantity-bottom .tm-quantity{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options-radio .tm-quantity,.tm-extra-product-options-checkbox .tm-quantity{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-quantity input.tm-qty{margin:0;max-width:100%;min-width:3em;width:4em;text-align:center;padding:.25em;line-height:1}.tm-quantity-alt input.tm-qty-alt{margin:0;max-width:100%;min-width:50px;text-align:center;width:5em !important;font-size:100%;display:inline-block !important;padding:.358em 1em}.tc-extra-product-options .cpf-type-product .tc-epo-element-product-li-container .tc-epo-element-product-container .single_add_to_cart_product,.single_add_to_cart_product{vertical-align:baseline;float:none}.tc-row.tc-quantity-right .tc-cell,.tc-row.tc-quantity-left .tc-cell,.tm-quantity.tm-bottom{margin-bottom:0}.tm-description p:last-child{margin-bottom:0 !important}.tm-description{clear:both}.tm-section-description{margin:0}.fl-overlay{background:#f5f5f5;position:fixed;display:block;top:0;left:0;width:100%;height:100%;z-index:101000}.flasho{background:#fff;color:#000;border:1px solid #fff;left:0;position:absolute;top:0;z-index:101001;-webkit-box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);max-height:100%;border-radius:0;max-width:100%;overflow:hidden;display:grid;grid-template-rows:minmax(1em,auto) minmax(33%,1fr) minmax(1em,auto);gap:var(--tcgaprow) 0;padding:var(--tcgap)}.float-editbox{position:relative;overflow:auto;overflow-x:hidden;overflow-y:auto}.flasho .header{line-height:2;width:100%;border-bottom:1px solid #ecf0f1;padding-bottom:var(--tcgaprow)}.flasho .header h3{color:#63728b;font-size:22px;font-weight:400;line-height:28px;margin:0;letter-spacing:1px}.flasho .footer{margin:0;padding:0;text-align:right}.flasho .footer .inner{border-top:1px solid #ecf0f1;padding-top:var(--tcgaprow)}.tm-section-pop{display:none}.tm-section-pop-up{height:80%;left:10% !important;position:fixed !important;top:10% !important;width:80%}#tm-section-pop-up>.tc-epo-label.tm-section-label{display:none}.tm-section-pop-up.single .tc-cell.section_popup{width:100% !important;max-width:100%;--flex-items:1 !important}.tm-section-pop-up.single .tc-cell.section_popup .tm-section-pop{padding-top:1em;padding-bottom:1em}.tm-extra-product-options.tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel,.tc-extra-product-options .tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel{float:none}.noanimated{-webkit-animation-fill-mode:none !important;animation-fill-mode:none !important;opacity:1 !important;z-index:auto !important;position:static !important;-webkit-transform:none !important;transform:none !important}.tm-floating-box{width:auto;height:auto;padding:1em;position:fixed;right:0;top:0;bottom:0;left:0;background:rgba(255,255,255,0.99);z-index:99999;max-height:100%;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:20vw;gap:var(--tcgap);line-height:normal;border:2px solid rgba(0,0,0,0.05)}.tm-floating-box .tc-row,.tm-floating-box .tm-extra-product-options-totals{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-floating-box.right{left:auto;right:0}.tm-floating-box.left{right:auto;left:0}.tm-floating-box.bottom{bottom:0;top:auto}.tm-floating-box.top{top:0;bottom:auto}.tm-fb{font-size:12px;line-height:18px;max-height:200px;max-width:100%;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;gap:0}.tm-fb dt{margin:0;padding:0;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-fb dd{margin:0 0 var(--tcinnergaprow) 0;padding:0;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-fb-title{font-weight:700}.tm-fb-value{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcinnergap);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-fb-value>*{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-floating-box-alt .tm-floating-box{background:0;padding:0;position:static;max-width:100%;border:0}.tm-floating-box-nks .tm-floating-box{bottom:0 !important;left:0 !important;padding:5%;position:absolute !important;right:0 !important;top:0 !important;width:100%}.tm-floating-box-nks .tm-fb{max-height:90% !important;max-width:90% !important}.tc-row.tm-fb-labels{border-bottom:1px solid;font-weight:700;margin-bottom:1.65em;padding:0 0 1em 0}.tc-row.tm-fb-labels .tm-fb-price,.tc-row.tm-fb-data .tm-fb-price{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tc-row.tm-fb-labels .tm-fb-quantity,.tc-row.tm-fb-data .tm-fb-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-img-floating .tmhexcolorimage.tc-center .tc-image,.tc-img-floating .tc-image{max-width:calc(var(--tcinlinesize) * 2) !important;margin:0;max-height:calc(var(--tcinlinesize) * 2) !important;-webkit-box-shadow:none;box-shadow:none}.tc-img-floating .tmhexcolorimage.tc-center .tc-image{padding-top:calc((var(--tcinlinesize) * 2) - (2px * 2)) !important}.tc-img-floating .tm-transparent-swatch .tc-image{border-style:dotted;border-color:inherit}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap label.tm-error,.tm-extra-product-options ul.tmcp-ul-wrap+.tm-error,.tm-extra-product-options .tc-element-container>.tm-error{color:red;display:block !important;font-size:80%;font-weight:700;padding:0 !important;margin:1em 0 !important}.tm-extra-product-options .tc-cell.tm-error{color:red;display:block;font-size:80%;font-weight:700;margin:1em 0 !important}.tm-epo-field.tmcp-textfield.tm-error,.tm-epo-field.tmcp-textarea.tm-error{border:1px solid #c0392b;color:#e74c3c;outline:0}.tc-transition{-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}.tc-lightbox{background:rgba(0,0,0,0.5) none repeat scroll 0 0;height:auto !important;left:50% !important;max-height:100% !important;max-width:100% !important;position:fixed;text-align:center;top:50% !important;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:auto !important;z-index:100100;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;display:block;padding:0}.tc-lightbox-image-wrap{position:relative}.tc-lightbox-wrap{position:absolute;right:0;bottom:0;width:1em;height:1em;left:auto;top:auto;font-size:1.5em}.tc-lightbox-button{background:rgba(0,0,0,0.2) none repeat scroll 0 0;top:0;color:#fff;font-size:1em !important;padding:0;position:absolute;right:0;z-index:2;opacity:.5;cursor:-webkit-zoom-in;cursor:zoom-in;margin:auto;bottom:0;left:0}.circle .tc-lightbox-button{border-radius:100%}.round .tc-lightbox-button{border-radius:5px}.tc-lightbox-wrap:hover .tc-lightbox-button{opacity:1}.tc-lightbox img{border:0 none;cursor:-webkit-zoom-out;cursor:zoom-out;display:block;height:auto;line-height:0;margin:0;padding:0;position:relative;width:auto}.tc-lightbox-button-close{background:rgba(255,255,255,0.3) none repeat scroll 0 0;color:#000 !important;float:left;height:2em;line-height:2;position:absolute;right:0;text-align:center;top:0;width:2em;z-index:2;cursor:pointer}@-webkit-keyframes tc-lightbox-zoomin{0%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}50%{opacity:1}}@keyframes tc-lightbox-zoomin{0%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}50%{opacity:1}}.tc-lightbox-zoomin{-webkit-animation-name:tc-lightbox-zoomin;animation-name:tc-lightbox-zoomin}@-webkit-keyframes tc-lightbox-zoomout{0%{opacity:1;-webkit-transform:translateX(-50%) translateY(-50%) scale(1);transform:translateX(-50%) translateY(-50%) scale(1)}50%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}100%{opacity:0}}@keyframes tc-lightbox-zoomout{0%{opacity:1;-webkit-transform:translateX(-50%) translateY(-50%) scale(1);transform:translateX(-50%) translateY(-50%) scale(1)}50%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}100%{opacity:0}}.tc-lightbox-zoomout{-webkit-animation-name:tc-lightbox-zoomout;animation-name:tc-lightbox-zoomout}.tm-static{position:static}.tmcp-date-select{max-width:100%}.tm-epo-field.tmcp-date{min-height:2.5em !important;height:auto}.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label:not(.fullwidth) .tm-epo-field.tmcp-date{width:auto !important}.tm-epo-datepicker-label-container,.tm-epo-timepicker-label-container{display:inline-block !important;vertical-align:baseline;position:relative;max-width:100%}.tm-extra-product-options .tm-epo-datepicker,.tm-extra-product-options .tm-epo-timepicker{display:inline-block !important;line-height:normal !important;margin:0 !important;max-width:100% !important;padding-right:2.5em !important;-webkit-box-shadow:none;box-shadow:none}.tc-epo-label.tc-left+.tc-element-container .tm-epo-datepicker-label-container,.tc-epo-label.tc-right+.tc-element-container .tm-epo-datepicker-label-container{margin-top:0}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger{font-family:tc-fontawesome,sans-serif !important;-webkit-box-shadow:none;box-shadow:none;border-radius:0;background:transparent none repeat scroll 0 0 !important;border-width:0;color:inherit !important;cursor:pointer;display:inline-block;font-size:inherit !important;line-height:inherit !important;margin:0;padding:0 !important;position:absolute;right:0;top:0;height:100% !important}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:hover,.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:active,.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:focus,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:hover,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:active,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:focus{background:none repeat scroll 0 0 transparent;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger::before{content:"\f073";padding:calc(0.75em - 2px);border-width:0 0 0 1px;border-style:solid}.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger::before{content:"\f017";padding:calc(0.75em - 2px);border-width:0 0 0 1px;border-style:solid}.tm-datepicker{margin:2px 0 0 0;z-index:101002 !important;width:auto !important;height:auto !important;padding:0}.tm-datepicker a{text-decoration:none}.tm-ui-dp,.tm-ui-dp-overlay{-webkit-tap-highlight-color:rgba(0,0,0,0)}.tm-ui-dp-header.ui-widget-header{line-height:2;background:0;border:0 none;color:inherit;font-weight:700}.tm-ui-dp{max-width:98%;position:absolute;top:0;left:0;z-index:2;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tm-ui-dp:focus{outline:0}.tm-ui-dp-container{min-width:300px;overflow:hidden;text-align:center;font-size:16px}.tm-datepicker-small .tm-ui-dp-container{font-size:12px;min-width:240px}.tm-datepicker-medium .tm-ui-dp-container{font-size:16px;min-width:330px}.tm-datepicker-large .tm-ui-dp-container{font-size:20px;min-width:400px}.tm-datepicker.tm-datepicker-top .tm-ui-dp-title,.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-title{font-size:1.125em}.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-container,.tm-datepicker.tm-datepicker-top .tm-ui-dp-container{min-width:100% !important}.tm-ui-dp-wrap,.tm-ui-dp-overlay{width:100%;height:100%;position:absolute;top:0;left:0}.tm-ui-dp-wrap{z-index:99998}.tm-ui-dp-overlay{z-index:1;background:rgba(0,0,0,0.7)}.tm-datepicker-top .tm-ui-dp,.tm-datepicker-bottom .tm-ui-dp{width:100%;max-width:100%}.tm-ui-dp-main-cell-inner{position:relative;height:100%;overflow:hidden;text-overflow:ellipsis}.tm-ui-dp-main-wrap{-webkit-backface-visibility:hidden;backface-visibility:hidden}.tm-ui-dp-ui{display:inline-block;vertical-align:middle;width:100%}.tm-ui-dp-main{width:auto}.tm-ui-dp-main table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;margin:0;background:0;border:0}.tm-ui-dp-main-table{height:100%;width:100%;display:table;table-layout:fixed}.tm-ui-dp-main-row{white-space:nowrap;display:table-row}.tm-ui-dp-main-cell{line-height:1.875;text-align:center;width:14.2857%;height:16.6666%;position:relative;display:table-cell;vertical-align:middle;cursor:pointer}.tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-dp-main-cell.ui-state-disabled{cursor:default}.tm-ui-dp-main-cell .tm-ui-dp-main-cell-inner{overflow:visible}.tm-ui-dp-main-cell-content{position:relative;z-index:2;padding:5px}.tm-datepicker .tm-ui-dp-main-wrap{padding:.5em}.tm-datepicker .tm-ui-dp-main-header th{font-size:.6875em;font-weight:400;line-height:2.225;text-align:center;border:0}.tm-datepicker .tm-ui-dp-main-cell-content{font-size:.8125em}.tm-ui-dp-inner-container,.tm-ui-dp-main-wrap,.tm-ui-dp-main-content{position:relative}.tm-datepicker.tm-datepicker-bottom,.tm-datepicker.tm-datepicker-top{bottom:0 !important;height:100% !important;left:0 !important;position:fixed !important;right:0 !important;top:0 !important;width:100% !important;margin:0 !important;background:transparent !important;border:0 none !important}.tm-datepicker.tm-datepicker-bottom .tm-ui-dp{bottom:0;top:auto}.tm-datepicker.tm-datepicker-top .tm-ui-dp{top:0;bottom:auto}.tm-datepicker .ui-tm-datepicker-prev,.tm-datepicker .ui-tm-datepicker-next,.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-prev,.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-prev,.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-next,.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-next{display:none !important}.tm-ui-dp-title{position:relative;font-size:1em}.tm-ui-dp-title .tm-ui-dp-month,.tm-ui-dp-title .tm-ui-dp-year{display:block;overflow:hidden;text-overflow:ellipsis;margin:0 2em;white-space:nowrap}.tm-ui-dp-title-button{width:50%;display:inline-block;white-space:nowrap;vertical-align:top;position:relative;height:2em}.tm-ui-dp-button-prev{left:0}.tm-ui-dp-button-next{right:0}.tm-ui-dp-button{margin:0;position:absolute;top:0;width:2em;overflow:hidden;display:block;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;vertical-align:top;height:2em;line-height:2;color:#4eccc4;text-transform:uppercase;padding:0}.tm-ui-dp-button .tm-ui-dp-button-arrow,.tm-ui-dp-month,.tm-ui-dp-year{cursor:pointer}.tm-datepicker .tm-ui-dp-button-arrow{color:#4eccc4;font-size:1em;line-height:2;overflow:hidden;width:2em}.tm-ui-dp-button-arrow::before{display:block}.tm-ui-dp-buttonpane{display:block;overflow:hidden;padding:0 .5em .5em;text-align:right;width:100%}.tm-ui-dp-btn-wrap{display:block;float:right;position:relative;vertical-align:top;z-index:5}.tm-ui-dp-btn{height:2.5em;line-height:2.5;padding:0 1em;text-transform:uppercase;cursor:pointer;display:block;overflow:hidden;text-decoration:none;text-overflow:ellipsis;vertical-align:top;white-space:nowrap}.tm-ui-dp-button-disabled{opacity:.3;cursor:default}.tm-ui-skin-epo-black .tm-ui-dp-container{font-family:Helvetica,Arial,sans-serif !important;border:1px solid #000 !important;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.2);box-shadow:0 1px 10px rgba(0,0,0,0.2);background:#000 none repeat scroll 0 0;background:rgba(0,0,0,0.9) none repeat scroll 0 0;color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell .ui-state-default{color:#ecf0f1}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default{color:#777}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover{background-color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover{background-color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover .ui-state-default{color:#000}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default{color:#222}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled{background-color:#000;background-color:rgba(255,255,255,0.02)}.tm-ui-skin-epo-black .tm-ui-dp-btn{color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-btn:hover{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-button-arrow,.tm-ui-skin-epo-black .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover{color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-button-arrow:hover{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-header{color:#1abc9c;border-bottom:1px solid #1abc9c}.tm-ui-skin-epo.tm-datepicker .tm-ui-dp-main-wrap{padding:0}.tm-ui-skin-epo .tm-ui-dp-container{font-family:Helvetica,Arial,sans-serif !important;border:1px solid #ddd !important;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.2);box-shadow:0 1px 10px rgba(0,0,0,0.2);background:#fff none repeat scroll 0 0;color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-main-cell .ui-state-default{color:#2c3e50;background:0;border:0 none}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-other-month .ui-state-default{color:#aaa}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-current-day .ui-state-default{color:#0a0}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default{color:#95a5a6}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover{background-color:#9b59b6}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default{color:#fff}.tm-ui-skin-epo .tm-ui-dp-main-cell:hover{background-color:#ecf0f1}.tm-ui-skin-epo .tm-ui-dp-main-cell:hover .ui-state-default{color:#000}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default{color:#eee}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled{background-color:#fff}.tm-ui-skin-epo .tm-ui-dp-btn{color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-btn:hover{color:#8e44ad}.tm-ui-skin-epo .tm-ui-dp-button-arrow,.tm-ui-skin-epo .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover{color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-button-arrow:hover{color:#34495e}.tm-ui-skin-epo .tm-ui-dp-main-header{background:#f9f9f9 none repeat scroll 0 0;border-bottom:1px solid #eee;border-top:1px solid #eee;color:#7f8c8d;padding:.25em 0}.tm-ui-skin-epo .tm-ui-dp-title{padding:.5em 0}.ui-tm-timepicker-div .tm-ui-widget-header,.ui-tm-timepicker-div .ui_tpicker_time_label,.tm-timepicker .tm-ui-dp-current{display:none}.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle{border-radius:100%;background:#ecf0f1;border:1px solid #bdc3c7;cursor:default;height:1.2em;position:absolute;width:1.2em;z-index:2}.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle.ui-state-hover{background:#fff}.ui-tm-timepicker-div .ui-slider{position:relative}.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal{border-color:#aaa;-o-border-image:none;border-image:none;border-radius:0;border-style:solid;border-width:0 0 1px;height:1px;margin:1em 0;padding:.2em 0 0}.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal .ui-slider-handle{margin-left:-0.6em;top:-0.3em}.ui-tm-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-tm-timepicker-div dl{text-align:left;margin:0}.ui-tm-timepicker-div dl dt{clear:left;float:left;margin:.725em 0 0;padding:0}.ui-tm-timepicker-div dl dd{display:block;margin:0 1em .5em 30%;padding:1px 0;float:none}.ui-tm-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0;border:0;margin:0;padding:0}.ui-tm-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input{background:0;color:inherit;border:0;outline:0;border-bottom:0 none;width:95%}.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus{border-bottom-color:#aaa}.ui-tm-timepicker-rtl{direction:rtl}.ui-tm-timepicker-rtl dl{text-align:right}.ui-tm-timepicker-rtl dl dt{float:right;clear:right}.ui-tm-timepicker-rtl dl dd{margin:0 30% .5em 1em}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine{padding-right:2px}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dt{display:none}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl{text-align:right}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_minute::before,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_second::before{content:":";display:inline-block}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_millisec::before,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_microsec::before{content:".";display:inline-block}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide::before{display:none}.ui-tm-timepicker-div{padding:1em 1em 0}.tm-ui-tp-title{padding:.5em 0}.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important;float:none;max-width:none;width:auto;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;gap:var(--tcgap);-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio li.tmcp-field-wrap{padding:0;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tm-auto-row{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:auto}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap.tm-auto-row,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap.tm-auto-row{-webkit-box-flex:0;-ms-flex:0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));flex:0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));width:auto;max-width:calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));--flex-items:4}.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startcolor,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startimages,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endimages{width:100%}.tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--tcinnergap);-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.fullwidth-ul .tc-label-wrap{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.fullwidth-ul .tc-label-inner .tc-price-wrap{justify-self:flex-end}.fullwidth-ul .tc-mode-color .tc-label-inner .tc-price-wrap,.fullwidth-ul .tc-mode-images .tc-label-inner .tc-price-wrap{justify-self:center}.tc-input-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-mode-images .tc-label-wrap,.tc-mode-color .tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%;gap:var(--tcinnergap)}.tc-mode-images .tc-inline-description,.tc-mode-color .tc-inline-description{text-align:center}.tc-inline-description:empty{display:none}.radio-image-label,.checkbox-image-label{display:block;text-align:center;line-height:1.5;width:100%}.tc-label.tm-label .radio-image-label,.tc-label.tm-label .checkbox-image-label{display:inline;margin-right:.5em}.tc-label.tm-label .radio-image-label:empty,.tc-label.tm-label .checkbox-image-label:empty{margin-right:0}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:var(--tcinnergap)}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .fullwidth .tc-label-wrap{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-input-wrap{display:none}li.tmcp-field-wrap.tm-per-row.is-separator{-webkit-box-flex:0 !important;-ms-flex:0 0 100% !important;flex:0 0 100% !important;max-width:100% !important}.tm-extra-product-options .is-separator .tc-label-wrap.tc-separator{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 0;flex:1 1 0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.is-separator .tc-label.tc-separator-label{padding:0 !important;width:100%}.tm-extra-product-options .is-separator .tc-tooltip{-webkit-box-flex:0;-ms-flex:0 1 0;flex:0 1 0;margin:0}.tc-epo-style-wrapper+.tmhexcolorimage,.tc-epo-style-wrapper+.tc-label-wrap .tmhexcolorimage:first-child{margin:0 .5em;vertical-align:middle}.tc-epo-style-wrapper .tc-input-wrap .tm-epo-field{position:absolute !important;top:calc(var(--tc-radio-size) / 2);left:calc(var(--tc-radio-size) / 2);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0}.tc-active .tc-epo-style-wrapper .tm-epo-style::after{opacity:1}.tc-epo-style-wrapper{height:auto;width:auto;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:1em;-webkit-transform:translate(0,50%);transform:translate(0,50%);top:calc(var(--tc-radio-size) / -2);letter-spacing:0;word-spacing:0;-webkit-font-kerning:none;font-kerning:none;font-family:none;--tc-radio-size:1.5em;--tc-radio-font-size:1em}.tm-epo-style{position:relative;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:transparent none repeat scroll 0 0;border:1px solid;cursor:pointer;height:var(--tc-radio-size);line-height:1;margin:0;padding:0;width:var(--tc-radio-size);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:var(--tc-radio-font-size)}.tm-epo-style::after{content:"\f00c";background:transparent none repeat scroll 0 0;font-family:tc-fontawesome,sans-serif !important;font-weight:900;height:1em !important;opacity:0;display:inline-block !important;text-align:center !important;width:1em !important;color:inherit !important;font-size:inherit !important;bottom:auto !important;line-height:1 !important}.tc-epo-style-wrapper.tc-radio .tm-epo-style::after{content:"\f111"}.tm-epo-style:hover::after{opacity:.5}.tm-epo-style.circle,.tm-epo-style.circle2{border-radius:100%}.tm-epo-style.round,.tm-epo-style.round2{border-radius:5px}.tm-epo-style.circle2,.tm-epo-style.round2,.tm-epo-style.square2{border-width:2px}.tc-epo-style-wrapper.square .tm-epo-style::after{font-size:.6em !important}.tc-epo-style-wrapper.circle2 .tm-epo-style::after,.tc-epo-style-wrapper.round2 .tm-epo-style::after,.tc-epo-style-wrapper.square2 .tm-epo-style::after{font-size:.5em !important}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper{padding:var(--tcinnergap);gap:var(--tcgap)}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper label{cursor:pointer;-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-epo-text-label-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--tcinnergap);-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:var(--tcinlinesize)}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images .tmcp-field-wrap-inner,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color .tmcp-field-wrap-inner{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text .tmcp-field-wrap-inner{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;width:auto}.tc-epo-text-wrapper input[type="checkbox"].tm-epo-field,.tc-epo-text-wrapper input[type="radio"].tm-epo-field{visibility:hidden;position:absolute;display:inline !important}.tmhexcolorimage{display:block;height:100% !important;max-height:100% !important;max-width:100% !important;width:100%}.tm-floating-box .tmhexcolorimage{min-width:50px !important;min-height:50px !important}.tm-floating-box .radio-image-label,.tm-floating-box .checkbox-image-label{text-align:initial}.tmhexcolorimage.tc-center .tc-image{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto !important;height:auto !important;padding-top:calc(100% - (2px * 2)) !important;max-width:calc(100% - (2px * 2)) !important;vertical-align:middle;-webkit-box-sizing:content-box;box-sizing:content-box;min-width:min(var(--tcinlinesize),calc(100% - (2px * 2)))}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap input.use_images+label{display:inline-block;padding:0 !important;max-width:100%;border:0 solid;position:relative;line-height:0;margin:0 !important;height:auto !important;background:none !important}.tc-image{border-width:2px;border-style:solid;border-color:transparent;display:-webkit-box;display:-ms-flexbox;display:flex;margin:auto;padding:0;pointer-events:none !important;height:auto;max-width:100%}.tm-extra-product-options .tc-active .tc-image{border-style:solid}.tc-image.tc-image-inline,.tc-image-inline{position:relative;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:transparent none repeat scroll 0 0;border:2px solid transparent;cursor:pointer;height:var(--tcinlinesize);line-height:1;margin:0;padding:0;width:auto;min-width:var(--tcinlinesize);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1em}.tc-epo-style-space::after{content:"\00a0";display:inline;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;margin-left:calc(-1ch / 2);font-family:sans-serif}.tc-center .tc-epo-style-space::after{display:none}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tmhexcolorimage-inline{width:auto !important;padding:0 !important;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;-webkit-transform:translate(0,50%);transform:translate(0,50%);top:calc(var(--tcinlinesize) / -2);position:relative;height:auto !important;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:1em}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tc-image-inline{max-height:var(--tcinlinesize) !important;-ms-flex-item-align:start;align-self:flex-start;-ms-flex-negative:0;flex-shrink:0}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text{border-style:solid;cursor:pointer;border-color:var(--text-swatch-border-color);border-width:var(--text-swatch-border-width);border-radius:var(--swatch-border-radius)}.tc-image,.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image{border-color:var(--swatch-border-color);border-width:var(--swatch-border-width);border-radius:var(--swatch-border-radius)}.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text,.tm-extra-product-options .tmcp-field-wrap.tc-active .tc-label-wrap .tc-image{border-color:var(--swatch-active-border-color);border-width:var(--swatch-active-border-width)}.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text{outline-width:1px;outline-style:solid;outline-color:var(--swatch-active-border-color);border-width:var(--text-swatch-active-border-width)}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.round,.round .tc-image,.round.tc-image,.tm-extra-product-options .tmcp-field-wrap.round .tc-label-wrap .tc-image{--swatch-border-radius:5px;-webkit-box-shadow:none;box-shadow:none}.circle .tc-image,.circle.tc-image,.tm-extra-product-options .tmcp-field-wrap.circle .tc-label-wrap .tc-image{--swatch-border-radius:100%;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.circle{--swatch-border-radius:18px;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.square,.square .tc-image,.square.tc-image,.tm-extra-product-options .tmcp-field-wrap.square .tc-label-wrap .tc-image{--swatch-border-radius:0;--swatch-border-width:2px;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.shadow,.shadow .tc-image,.shadow.tc-image,.tm-extra-product-options .tmcp-field-wrap.shadow .tc-label-wrap .tc-image{--swatch-border-radius:0;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow.tc-mode-text,.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow .tc-label-wrap .tc-image{-webkit-box-shadow:0 0 10px 2px rgba(0,0,0,0.5);box-shadow:0 0 10px 2px rgba(0,0,0,0.5)}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.thinline,.thinline .tc-image,.thinline.tc-image,.tm-extra-product-options .tmcp-field-wrap.thinline .tc-label-wrap .tc-image{--swatch-border-radius:0;--swatch-border-width:1px;border-style:groove;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image.tm-transparent-swatch,.tm-transparent-swatch .tc-image,.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tm-transparent-swatch .tc-image{border-style:dotted;border-color:inherit}.tm-extra-product-options input.use_images+label+.amount{display:block;text-align:center}.radio-image-label-inline,.checkbox-image-label-inline{display:inline}.tc-label.tm-label .radio-image-label+.tmhexcolorimage,.tc-label.tm-label .checkbox-image-label+.tmhexcolorimage{vertical-align:middle}.tm-hide-label+.radio-image-label,.tm-hide-label+*+.radio-image-label,.tm-hide-label+.checkbox-image-label,.tm-hide-label+*+.checkbox-image-label{display:none !important}.tm-extra-product-options .tmcp-ul-wrap.tm-extra-product-options-product{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tm-extra-product-options-product>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}li.tc-epo-element-product-holder{-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-epo-element-product-container-wrap:empty{margin:0}.tc-epo-element-product-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tc-epo-element-product-container-left,.tc-epo-element-product-container-right,.tc-epo-element-product-container-full{padding:0;margin:0}.tc-epo-element-product-container-cart{display:grid;gap:var(--tcgap)}.tc-epo-element-product-container-cart>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%;margin:0 !important}.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-cart>.stock{text-align:center}.tc-extra-product-options-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-extra-product-options-inline>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tc-extra-product-options-inline:not(:has(.tc-extra-product-options)){display:none}.tc-epo-element-product-container-wrap .product-title,.tc-epo-element-product-container-wrap .product-price,.tc-epo-element-product-container-wrap .product-description,.tc-epo-element-product-container-wrap .product-meta,.tc-epo-element-product-container-wrap .tc-extra-product-options-inline{margin:0;padding:0}.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity,.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity-alt{max-width:none;text-align:center}.woocommerce div.product .tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity,.tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity{float:none;display:inline-block !important;font-size:inherit;margin:0}.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container,.tm-extra-product-options .cpf-type-product-dropdown ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:0;margin:0;list-style:none outside none !important;position:relative}.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tc-field-label-wrap,.tm-extra-product-options .cpf-type-product-checkbox ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner .tc-field-label-wrap{gap:var(--tcinnergap)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:var(--tcgaprow) 0;max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;list-style:none outside none !important;position:relative;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:var(--tcgap)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap label{cursor:pointer}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tm-epo-field.tmcp-radio,.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tc-epo-style-wrapper,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-epo-style-wrapper,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tc-epo-style-wrapper{display:none}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important;margin:0;float:none;max-width:none;width:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap{max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:0}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner{max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;display:grid;grid-template-columns:1fr}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label{text-align:center}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tm-epo-reset-radio{right:var(--tcgapcolumn);top:var(--tcgaprow)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap img.wp-post-image,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap img.wp-post-image{max-width:100%;height:auto;margin:0 auto;display:block;width:auto}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-label-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-label-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tc-label-wrap{display:block}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label.tm-epo-field-label{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-epo-element-variable-product{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-epo-element-variable-product>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}table.tc-epo-element-variations{margin:0 !important}.woocommerce table.tc-epo-element-variations{margin-bottom:1em;border:0;width:100%}.woocommerce table.tc-epo-element-variations td,.woocommerce table.tc-epo-element-variations th{border:0;vertical-align:top;line-height:2}.woocommerce table.tc-epo-element-variations label{font-weight:700}.woocommerce table.tc-epo-element-variations select{max-width:100%;min-width:75%;display:inline-block;margin-right:1em}.woocommerce table.tc-epo-element-variations td.label{padding-right:1em}.woocommerce .tc-epo-element-variable-product .woocommerce-variation-description p{margin-bottom:1em}.woocommerce .tc-epo-element-variable-product .tc-epo-element-variable-reset-variations{visibility:hidden;font-size:.83em}.woocommerce .tc-epo-element-variable-product .wc-no-matching-variations{display:none}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden .tmcp-field-wrap-inner{display:none}.tc-product-image{margin:0}#tm-tooltip{font-size:.875em;text-align:center;text-shadow:0 1px rgba(0,0,0,0.5);line-height:1.5;color:var(--tooltip-color);background:var(--tooltip-background-color);border-radius:5px;position:absolute;z-index:145400;padding:15px;pointer-events:none;bottom:auto !important;top:auto;left:auto;right:auto;border:1px solid var(--tooltip-border-color);--tooltip-background-color:rgba(0,0,0,0.8);--tooltip-border-color:rgba(255,255,255,0.5);--tooltip-color:#fff}#tm-tooltip p:last-child{margin-top:0;margin-bottom:0}#tm-tooltip::after{width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid var(--tooltip-background-color);content:"";position:absolute;left:50%;bottom:-9px;margin-left:-10px}#tm-tooltip::before{width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid var(--tooltip-border-color);content:"";position:absolute;left:50%;bottom:-10px;margin-left:-10px}#tm-tooltip.top::after{border-top-color:transparent;border-bottom:10px solid var(--tooltip-background-color);top:-19px;bottom:auto}#tm-tooltip.top::before{border-top-color:transparent;border-bottom:10px solid var(--tooltip-border-color);top:-20px;bottom:auto}#tm-tooltip.left::after{left:10px;margin:0}#tm-tooltip.right::after{right:10px;left:auto;margin:0}#tm-tooltip img{max-width:100%}#tm-tooltip.tc-error{--tooltip-background-color:#ff4500;--tooltip-border-color:rgba(255,255,255,0.5);--tooltip-color:#fff}.tc-tooltip{color:#2980b9;cursor:help;font-size:1em;margin:0}.tc-epo-style-space.tc-tooltip{line-height:inherit !important}.tc-icontooltipleft{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tc-icontooltipright{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.woocommerce #content table.cart img.epo-option-image,.woocommerce table.cart img.epo-option-image,.woocommerce-page #content table.cart img.epo-option-image,.woocommerce-page table.cart img.epo-option-image,.epo-option-image{max-height:100px;max-width:70% !important;height:auto !important;width:auto !important;display:block}.woocommerce-mini-cart img.epo-upload-image,.woocommerce #content table.cart img.epo-upload-image,.woocommerce table.cart img.epo-upload-image,.woocommerce-page #content table.cart img.epo-upload-image,.woocommerce-page table.cart img.epo-upload-image,.epo-upload-image{max-height:none !important;max-width:70% !important;width:auto !important;height:100% !important}.woocommerce td.product-name dl.variation dt.tc-hidden-variation{margin:0}.tc-row.tm-cart-row{border-color:#eee;border-radius:0;border-style:none none dotted;border-width:0 0 1px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:var(--tcgap)}.tm-cart-row-header{font-weight:700;position:sticky;top:0;background:#fff;z-index:2}.tc-row.tm-cart-row:last-child{border:0 none}.tc-row.tm-cart-row .tc-cell.cpf-name{font-weight:700}.tc-row.tm-cart-row .tc-cell.cpf-price,.tc-row.tm-cart-row .tc-cell.cpf-total-price{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tc-row.tm-cart-row .tc-cell.cpf-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.woocommerce td.product-name dl.variation.tc-epo-metadata,.woocommerce .wc-item-meta{word-break:break-word}.woocommerce td.product-name dl.variation.tc-epo-metadata .tc-hidden-variation{display:none}.cpf-img-on-cart img{position:static !important;height:auto !important;width:auto !important;max-height:3em;-o-object-fit:cover;object-fit:cover}.cpf-data-on-cart::before{content:"\f14a";font-family:tc-fontawesome,sans-serif;font-weight:900;font-size:1em;vertical-align:middle;position:absolute}.cpf-data-on-cart>.cpf-data-value{margin:0 1.5em}.cpf-img-on-cart .cpf-data-on-cart::before{content:"";display:none}.cpf-data-on-cart{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:.5em;width:100%;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.cpf-img-on-cart{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:calc(100% - var(--tcgapcolumn));gap:var(--tcgap)}.cpf-data-on-cart:last-of-type,.cpf-img-on-cart:last-of-type{border-bottom:0;margin-bottom:0}.cpf-img-on-order{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:calc(100% - var(--tcgapcolumn));gap:var(--tcgap)}.cpf-img-on-order img{-o-object-fit:cover;object-fit:cover;display:block;width:100% !important;height:auto !important;max-width:unset !important;max-height:unset !important}.cpf-img-on-order>*{display:block}.woocommerce #content table.cart img.epo-option-image,.woocommerce table.cart img.epo-option-image,.woocommerce-page #content table.cart img.epo-option-image,.woocommerce-page table.cart img.epo-option-image,.woocommerce-mini-cart .cpf-img-on-cart .epo-option-image,.woocommerce-checkout-review-order .cpf-img-on-cart .epo-option-image,.woocommerce-order-details .cpf-img-on-cart .epo-option-image,.epo-option-image,.cpf-img-on-order>*{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.woocommerce-mini-cart .cpf-img-on-cart img{max-width:50px !important}.cpf-color-on-cart{width:1em;height:1em;display:inline-block;border:1px solid;vertical-align:middle;position:relative;top:-1px}td.product-name a.tm-cart-edit-options,.tm-cart-edit-options{display:block;font-size:.7em;font-style:italic;font-weight:700}.tm-epo-cart-option-mobile{display:none}.shop_table tbody tr.tm-epo-cart-row{height:auto}.woocommerce table.shop_table .tm-epo-cart-row td{border-top:1px dashed rgba(0,0,0,0.1)}.tm-epo-cart-option-label,.tm-epo-cart-option-value.tm-epo-cart-no-label{font-weight:700}.woocommerce table.shop_table .tm-epo-cart-row-product td{border-bottom:1px solid rgba(0,0,0,0.1)}.woocommerce table.shop_table .tm-epo-cart-row-product+.tm-epo-cart-row td{border-top:0 none}.woocommerce table.shop_table_responsive tr.tm-epo-cart-row td::before,.woocommerce-page table.shop_table_responsive tr.tm-epo-cart-row td::before{display:none !important}.tc-price-in-cart,.tc-quantity-in-cart{font-size:smaller}.tc-associated-table-product .tc-associated-table-product-indent{padding-left:2em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tc-associated-table-product .tc-associated-table-product-price::after{font-family:tc-fontawesome,sans-serif;font-size:1em;content:"\f3be";font-weight:900;margin:0 .5em;padding:0;opacity:.3;display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.tc-associated-table-product .tc-associated-table-product-indent *{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.tc-associated-table-product-name{font-weight:700;-webkit-box-ordinal-group:2 !important;-ms-flex-order:1 !important;order:1 !important}.tm-dpd-label{display:block;font-size:80%}.tm-animated{-webkit-animation-duration:.3s;animation-duration:.3s}.tc-chars{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;font-size:x-small;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;width:100%;max-width:100%;gap:calc(1ch / 2)}.tm-button{border-radius:3px;border-style:solid;border-width:1px;cursor:pointer;display:inline-block;font-size:13px !important;margin:0;height:30px;line-height:28px !important;padding:0 12px 2px !important;text-decoration:none;white-space:nowrap;background:none repeat scroll 0 0 #f7f7f7;border-color:#ccc;-webkit-box-shadow:0 1px 0 #fff inset,0 1px 0 rgba(0,0,0,0.08);box-shadow:0 1px 0 #fff inset,0 1px 0 rgba(0,0,0,0.08);color:#555;vertical-align:top}.tm-button:hover{background:none repeat scroll 0 0 #fafafa;border-color:#999;color:#222}.tc-hide-add-to-cart-button{display:none !important}.tc-clearfix::after{content:"";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}.tm-preloader-img{position:absolute !important;z-index:2;opacity:.6}button.tmicon{display:inline-block;left:auto !important;position:relative;right:auto !important;overflow:hidden;width:30px !important;height:30px !important;line-height:30px !important;font-size:14px;text-align:center;cursor:pointer;vertical-align:middle;margin:0;padding:0;-ms-flex-negative:0;flex-shrink:0;background:0;border:0;-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}button.tmicon.delete{color:#ff4500;border-radius:100%}button.tmicon.delete:hover{color:#fff;background:#ff4500}.pointereventsoff{pointer-events:none}.tm-hide{visibility:hidden !important;padding:0 !important;height:0 !important;width:0 !important;margin:0 !important;min-height:0 !important;min-width:0 !important;opacity:0 !important}.tm-show{display:block !important}.tm-extra-product-options .tc-row.tm-show,.tc-row.tm-show{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}@-webkit-keyframes appear{0%{opacity:0}100%{opacity:1}}@keyframes appear{0%{opacity:0}100%{opacity:1}}.appear{-webkit-animation-name:appear;animation-name:appear}.tc-tabs{width:100%}.tc-tabs.tc-cell{margin-bottom:0}.has-scroll-arrows.tc-tab-headers{padding:0;max-width:calc(100% - 4em - 1px) !important;left:2em}.tc-tabs-wrap .tc-row .tc-cell:last-of-type{margin-bottom:0}.tc-tab-headers-wrap{position:relative}.tc-scroll-left-arrow,.tc-scroll-right-arrow{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;cursor:pointer;padding:0;line-height:1;width:1em;text-align:center;height:100%;top:0;z-index:2}.tc-scroll-left-arrow.scroll-arrow-show,.tc-scroll-right-arrow.scroll-arrow-show{display:block;border:1px solid;height:100%;width:calc(2em + 1px);-webkit-box-sizing:border-box;box-sizing:border-box}.tc-scroll-left-arrow{left:0}.tc-scroll-right-arrow{right:0}.tc-scroll-left-arrow::before,.tc-scroll-right-arrow::before{line-height:1;-webkit-transform:translateY(-50%);transform:translateY(-50%);top:50%;padding:0;margin:0;position:absolute;left:0;right:0}.tc-scroll-left-arrow::before{content:"\25C0"}.tc-scroll-right-arrow::before{content:"\25B6"}.tc-tab-headers{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-line-pack:center;align-content:center;gap:1em;margin:0;padding:0;overflow:hidden !important;position:relative;width:100%;min-height:1px}.tab-header{font-weight:400;cursor:pointer;white-space:nowrap;padding:var(--tcgap);position:relative;margin:0}.tab-header.open{border-width:1px 1px 0 1px;border-style:solid}.tab-header.open::before,.tab-header.open::after{content:"";display:block;position:absolute;border-bottom:1px solid;bottom:0;height:0;width:999em;-webkit-box-sizing:border-box;box-sizing:border-box}.tab-header.open::before{right:100%}.tab-header.open::after{left:100%}.tc-tab-content.tcwidth-100{padding:var(--tcgap);border-width:0 1px 1px 1px;border-style:solid}.tc-tab-header{-ms-flex-negative:0;flex-shrink:0}.tab-header.open,.tab-header.open:focus{font-weight:700}.tc-extra-product-options .sbHolder .sbSelector{background-color:#fff;height:35px;padding:5px 10px}.tc-images-container .replaced-checkboxes+label::before,.tc-images-container .replaced-radio-buttons+label::before,.replaced-checkboxes+label.tm-epo-style::before,.replaced-radio-buttons+label.tm-epo-style::before{display:none}body[data-form-style="minimal"] .tc-extra-product-options .minimal-form-input label{pointer-events:auto !important}.has-options .quick-shop-wrapper .woocommerce-variation-add-to-cart{display:block !important;width:100%;max-width:100%;padding:0;margin:0}.thb-product-main-row .summary form.cart,.woocommerce .oxy-woo-element div.product.tm-has-options .woocommerce-variation-add-to-cart,.tm-has-options .fullwidth-button .cart:not(.variations_form),.tm-has-options .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,.single-product div.product.tm-has-options form.cart,.single-product div.product.tm-has-options .single-button-wrapper,.single-product div.product.tm-has-options .entry-summary form.cart:not(.variations_form):not(.grouped_form),.single-product div.product.tm-has-options .variations_button,.woocommerce div.product.elementor.tm-has-options form.cart.variations_form .woocommerce-variation-add-to-cart,.woocommerce div.product.elementor.tm-has-options form.cart:not(.grouped_form):not(.variations_form),.woocommerce .oxy-woo-element div.product.tm-variations-only .woocommerce-variation-add-to-cart,.tm-variations-only .fullwidth-button .cart:not(.variations_form),.tm-variations-only .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,.single-product div.product.tm-variations-only form.cart,.single-product div.product.tm-variations-only .single-button-wrapper,.single-product div.product.tm-variations-only .entry-summary form.cart:not(.variations_form):not(.grouped_form),.single-product div.product.tm-variations-only .variations_button,.woocommerce div.product.elementor.tm-variations-only form.cart.variations_form .woocommerce-variation-add-to-cart,.woocommerce div.product.elementor.tm-variations-only form.cart:not(.grouped_form):not(.variations_form){-ms-flex-wrap:wrap !important;flex-wrap:wrap !important;max-width:100%}assets/css/owl.carousel.css000064400000015176150755142450012007 0ustar00/**
 * Owl Carousel v2.3.4
 * Copyright 2013-2018 David Deutsch
 * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
 */

/*
 *  Owl Carousel - Core
 */
.tc-extra-product-options .tcowl-carousel {
	display: none;
	width: 100%;
	-webkit-tap-highlight-color: transparent;

	/* position relative and z-index fix webkit rendering fonts issue */
	position: relative;
	z-index: 1;
}

.tc-extra-product-options .tcowl-carousel .owl-stage {
	position: relative;
	-ms-touch-action: manipulation;
	touch-action: manipulation;

	/* fix firefox animation glitch */
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
}

.tc-extra-product-options .tcowl-carousel .owl-stage::after {
	content: ".";
	display: block;
	clear: both;
	visibility: hidden;
	line-height: 0;
	height: 0;
}

.tc-extra-product-options .tcowl-carousel .owl-stage-outer {
	position: relative;
	overflow: hidden;

	/* fix for flashing background */
	-webkit-transform: translate3d(0, 0, 0);
	transform: translate3d(0, 0, 0);
}

.tc-extra-product-options .tcowl-carousel .owl-stage-outer,
.tc-extra-product-options .tcowl-carousel .owl-nav {
	-webkit-box-flex: 0;
	-ms-flex: 0 1 100%;
	flex: 0 1 100%;
	max-width: 100%;
}

.tc-extra-product-options .tcowl-carousel .owl-wrapper,
.tc-extra-product-options .tcowl-carousel .owl-item {
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	-webkit-transform: translate3d(0, 0, 0);
	transform: translate3d(0, 0, 0);
}

.tc-extra-product-options .tcowl-carousel .owl-item {
	position: relative;
	min-height: 1px;
	float: left;
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	-webkit-tap-highlight-color: transparent;
	-webkit-touch-callout: none;
}

.tc-extra-product-options .tcowl-carousel .owl-item img {
	display: block;
	width: 100%;
}

.tc-extra-product-options .tcowl-carousel .owl-nav.disabled,
.tc-extra-product-options .tcowl-carousel .owl-dots.disabled {
	display: none;
}

.tc-extra-product-options .tcowl-carousel .owl-nav .owl-prev,
.tc-extra-product-options .tcowl-carousel .owl-nav .owl-next,
.tc-extra-product-options .tcowl-carousel .owl-dot {
	cursor: pointer;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}

.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-prev,
.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-next,
.tc-extra-product-options .tcowl-carousel button.owl-dot {
	background: none;
	color: inherit;
	border: none;
	padding: 0 !important;
	font: inherit;
}

.tc-extra-product-options .tcowl-carousel-show {
	display: -webkit-box !important;
	display: -ms-flexbox !important;
	display: flex !important;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.tc-extra-product-options .tm-owl-slider,
.tc-extra-product-options .tcowl-carousel.owl-loaded {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	gap: var(--tcgap);
}

.tc-extra-product-options .tcowl-carousel.owl-loading {
	opacity: 0;
	display: block;
}

.tc-extra-product-options .tcowl-carousel.owl-hidden {
	opacity: 0;
}

.tc-extra-product-options .tcowl-carousel.owl-refresh .owl-item {
	visibility: hidden;
}

.tc-extra-product-options .tcowl-carousel.owl-drag .owl-item {
	-ms-touch-action: pan-y;
	touch-action: pan-y;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}

.tc-extra-product-options .tcowl-carousel.owl-grab {
	cursor: move;
	cursor: -webkit-grab;
	cursor: grab;
}

.tc-extra-product-options .tcowl-carousel.owl-rtl {
	direction: rtl;
}

.tc-extra-product-options .tcowl-carousel.owl-rtl .owl-item {
	float: right;
}

.tc-extra-product-options .tcowl-carousel .owl-item:not(.active) {
	visibility: hidden;
}

/* No Js */
.no-js .tc-extra-product-options .tcowl-carousel {
	display: block;
}

/*
 *  Owl Carousel - Animate Plugin
 */
.tc-extra-product-options .tcowl-carousel .animated {
	-webkit-animation-duration: 1000ms;
	animation-duration: 1000ms;
	-webkit-animation-fill-mode: both;
	animation-fill-mode: both;
}

.tc-extra-product-options .tcowl-carousel .owl-animated-in {
	z-index: 0;
}

.tc-extra-product-options .tcowl-carousel .owl-animated-out {
	z-index: 1;
}

.tc-extra-product-options .tcowl-carousel .fadeout {
	-webkit-animation-name: fadeout;
	animation-name: fadeout;
}

@-webkit-keyframes fadeout {

	0% {
		opacity: 1;
	}

	100% {
		opacity: 0;
	}
}

@keyframes fadeout {

	0% {
		opacity: 1;
	}

	100% {
		opacity: 0;
	}
}

/*
 *  Owl Carousel - Auto Height Plugin
 */
.tc-extra-product-options .owl-height {
	-webkit-transition: height 500ms ease-in-out;
	transition: height 500ms ease-in-out;
}

/*
 *  Owl Carousel - Lazy Load Plugin
 */

.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy {
	opacity: 0;
	-webkit-transition: opacity 400ms ease;
	transition: opacity 400ms ease;
}

/**
 * This is introduced due to a bug in IE11 where lazy loading combined
 * with autoheight plugin causes a wrong
 * calculation of the height of the owl-item that breaks page layouts
 */
.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy[src^=""],
.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy:not([src]) {
	max-height: 0;
}

.tc-extra-product-options .tcowl-carousel .owl-item img.owl-lazy {
	-webkit-transform-style: preserve-3d;
	transform-style: preserve-3d;
}

/*
 *  Owl Carousel - Video Plugin
 */
.tc-extra-product-options .tcowl-carousel .owl-video-wrapper {
	position: relative;
	height: 100%;
	background: #000;
}

.tc-extra-product-options .tcowl-carousel .owl-video-play-icon {
	position: absolute;
	height: 80px;
	width: 80px;
	left: 50%;
	top: 50%;
	margin-left: -40px;
	margin-top: -40px;
	background: url(owl.video.play.png) no-repeat;
	cursor: pointer;
	z-index: 1;
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	-webkit-transition: -webkit-transform 100ms ease;
	transition: -webkit-transform 100ms ease;
	transition: transform 100ms ease;
	transition: transform 100ms ease, -webkit-transform 100ms ease;
}

.tc-extra-product-options .tcowl-carousel .owl-video-play-icon:hover {
	-webkit-transform: scale(1.3, 1.3);
	transform: scale(1.3, 1.3);
}

.tc-extra-product-options .tcowl-carousel .owl-video-tn {
	opacity: 0;
	height: 100%;
	background-position: center center;
	background-repeat: no-repeat;
	background-size: contain;
	-webkit-transition: opacity 400ms ease;
	transition: opacity 400ms ease;
}

.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-tn,
.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-play-icon {
	display: none;
}

.tc-extra-product-options .tcowl-carousel .owl-video-frame {
	position: relative;
	z-index: 1;
	height: 100%;
	width: 100%;
}
assets/css/spectrum.min.css000064400000025012150755142450012004 0ustar00.epo.sp-container,.sp-replacer.epo,.epo .sp-preview,.sp-dragger,.sp-slider,.sp-alpha,.sp-clear,.sp-alpha-handle,.epo.sp-container.sp-dragging .sp-input,.epo.sp-container button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font:inherit}.sp-original-input-container{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.sp-original-input-container input{margin:0 !important}.sp-original-input-container .sp-add-on{width:40px;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}input.spectrum.with-add-on{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.sp-original-input-container .sp-add-on .sp-colorize{height:100%;width:100%;border-radius:inherit}.sp-colorize-container{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.epo.sp-container.sp-flat{position:relative}.epo.sp-container,.epo.sp-container *{-webkit-box-sizing:content-box;box-sizing:content-box}.epo .sp-top{position:relative;width:100%;display:inline-block;margin-bottom:10px}.epo .sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}.epo .sp-color{position:absolute;top:0;left:0;bottom:0;right:20px !important}.epo .sp-hue{position:absolute;top:0;right:0;bottom:0;width:12px;height:100%;left:initial !important;background:-webkit-gradient(linear,left top,left bottom,from(#f00),color-stop(17%,#f00),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(#f00));background:linear-gradient(to bottom,#f00 0,#f00 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.epo .sp-clear-enabled .sp-hue{top:15%;height:85%}.epo .sp-fill{padding-top:80%}.epo .sp-sat,.epo .sp-val{position:absolute;top:0;left:0;right:0;bottom:0}.epo .sp-alpha-enabled .sp-top{margin-bottom:28px !important}.epo .sp-alpha-handle{position:absolute;top:-3px;cursor:pointer;height:16px;border-radius:50%;width:16px;margin-right:5px;left:-2px;right:0;background:#f9f9f9;-webkit-box-shadow:0 0 2px 0 #3a3a3a;box-shadow:0 0 2px 0 #3a3a3a}.epo .sp-alpha{display:none;position:absolute;bottom:-18px;right:0;left:0;height:10px}.epo.sp-alpha-enabled .sp-alpha{display:block}.epo.sp-alpha-enabled .sp-picker-container .sp-top{margin-bottom:26px}.epo .sp-alpha-inner{border-radius:4px}.epo .sp-clear{display:none}.epo .sp-clear.sp-clear-display{background-position:center}.epo .sp-clear-enabled .sp-clear{display:block;position:absolute;top:3px;right:0;bottom:0;cursor:pointer;left:initial;height:12px;width:12px}.epo.sp-container.sp-input-disabled .sp-input-container{display:none}.epo.sp-container.sp-buttons-disabled .sp-button-container{display:none}.epo.sp-container.sp-palette-buttons-disabled .sp-palette-button-container{display:none}.sp-palette-only .sp-picker-container{display:none}.sp-palette-disabled .sp-palette-container{display:none}.sp-initial-disabled .sp-initial{display:none}.epo .sp-sat{background-image:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(204,154,129,0)));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0));filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr="#FFFFFFFF",endColorstr="#00CC9A81")}.epo .sp-val{border-radius:4px;background-image:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(204,154,129,0)));background-image:linear-gradient(to top,#000,rgba(204,154,129,0));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00CC9A81",endColorstr="#FF000000")}.epo .sp-1{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffff00")}.epo .sp-2{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffff00",endColorstr="#00ff00")}.epo .sp-3{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ff00",endColorstr="#00ffff")}.epo .sp-4{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ffff",endColorstr="#0000ff")}.epo .sp-5{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#0000ff",endColorstr="#ff00ff")}.epo .sp-6{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff00ff",endColorstr="#ff0000")}.sp-hidden{display:none !important}.epo .sp-cf::before,.epo .sp-cf::after{content:"";display:table}.epo .sp-cf::after{clear:both}.epo .sp-cf{*zoom:1}@media(max-width:480px){.epo .sp-color{right:40%}.epo .sp-hue{left:63%}.epo .sp-fill{padding-top:60%}}.epo .sp-dragger{border-radius:5px;height:10px;width:10px;border:1px solid #fff;cursor:pointer;position:absolute;top:0;left:0;margin-left:3px;margin-top:3px;-webkit-box-shadow:0 0 2px 1px rgba(0,0,0,0.2);box-shadow:0 0 2px 1px rgba(0,0,0,0.2);background:0}.epo .sp-slider{position:absolute;top:0;cursor:pointer;height:16px;border-radius:50%;width:16px;left:-2px;background:#f9f9f9;-webkit-box-shadow:0 0 2px 0 #3a3a3a;box-shadow:0 0 2px 0 #3a3a3a;margin-top:8px;right:auto;border:0;opacity:1}.epo.sp-container{position:absolute;top:0;left:0;z-index:9999994;overflow:hidden;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;border:0;background-color:#fff;padding:0;border-radius:4px;color:#000;-webkit-box-shadow:0 0 0 1px rgba(99,114,130,0.16),0 8px 16px rgba(27,39,51,0.08);box-shadow:0 0 0 1px rgba(99,114,130,0.16),0 8px 16px rgba(27,39,51,0.08)}.epo.sp-container,.epo.sp-container button,.epo.sp-container input,.sp-color,.sp-hue,.sp-clear{font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.epo .sp-color,.epo .sp-hue,.epo .sp-clear,.epo .sp-val,.epo .sp-sat{border-radius:3px;border:0}.epo .sp-input-container{margin-top:-5px;float:none;width:auto}.epo .sp-input-container.sp-cf,.sp-initial.sp-thumb.sp-cf,.sp-button-container.sp-cf{height:25px}.epo .sp-picker-container .sp-cf{margin-bottom:10px}.sp-palette-row-initial>span:first-child{cursor:pointer}.epo.sp-initial-disabled .sp-input-container{width:100%}.epo .sp-input{padding:0 5px !important;margin:0;width:100%;-webkit-box-shadow:none !important;box-shadow:none !important;height:100% !important;background:transparent;color:#3a3a3a;border-radius:2px !important;border:1px solid #e0e0e0 !important;text-align:center;font-family:monospace;font-size:inherit !important}.sp-input:focus{border:1px solid #ffa600}.sp-input.sp-validation-error{border:1px solid red;background:#fdd}.epo .sp-picker-container,.sp-palette-container{position:relative;padding:10px}.epo .sp-picker-container{width:200px;padding-bottom:0;border:0;float:none;margin:0}.sp-palette-container{border-right:solid 1px #ccc}.sp-palette-only .sp-palette-container{border:0}.sp-palette .sp-thumb-el{display:block;position:relative;float:left;width:16px;height:16px;margin:3px;border:0;border-radius:3px;cursor:pointer}.sp-palette .sp-thumb-el:hover,.sp-palette .sp-thumb-el.sp-thumb-active{border-color:#ffa600}.sp-thumb-el{position:relative}.epo .sp-initial{float:left;border:0}.sp-initial span{width:30px;height:25px;border:0;display:block;float:left;margin:0}.sp-initial .spe-thumb-el.sp-thumb-active{border-radius:0 5px 5px 0}.sp-initial .spe-thumb-el{border-radius:5px 0 0 5px}.sp-initial .sp-clear-display{background-position:center}.sp-button-container{float:right}.sp-palette-button-container{margin-top:10px}.sp-replacer.epo{position:relative;overflow:hidden;cursor:pointer;display:inline-block;border-radius:3px;border:1px solid #aaa;color:#666;-webkit-transition:border-color .3s;transition:border-color .3s;vertical-align:middle;width:3.5rem;height:2rem;margin:0;padding:3px;background:#fff;-webkit-box-shadow:none;box-shadow:none}.sp-replacer.epo.sp-disabled{cursor:default;border-color:silver;color:silver}.epo .sp-dd{position:absolute;font-size:10px;right:0;top:0;bottom:0;padding:3px;line-height:calc(2rem - 5px);background-color:#fff;height:auto;float:none}.epo .sp-preview{position:relative;width:100%;height:100%;float:left;z-index:0;border:0;margin:0;padding:0}.epo .sp-preview-inner{-webkit-transition:background-color .2s;transition:background-color .2s}.epo .sp-preview-inner.sp-clear-display{display:none}.epo.sp-container button{border-radius:3px;border:0;background:transparent;line-height:1;padding:0 8px;height:25px;text-transform:capitalize;text-align:center;vertical-align:middle;cursor:pointer;color:#606c72;font-weight:700}.epo.sp-container button.sp-choose{background-color:#3cab3b;color:#fff;margin-left:5px}.epo.sp-container button:hover{opacity:.8}.epo.sp-container button.sp-palette-toggle{width:100%;background-color:#f3f3f3;margin:0}.sp-palette span:hover,.sp-palette span.sp-thumb-active{border-color:#000}.epo .sp-preview,.sp-alpha,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.epo .sp-preview-inner,.sp-alpha-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}.sp-palette .sp-thumb-inner{border-radius:3px;background-position:50% 50%;background-repeat:no-repeat}.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABe0lEQVQokYXSsUtcQRTF4d8Jj+VhHSxkEQuLsEUKK0nhTBFTmLSSUhBCMCAWsmgIwWrBLk0akfwLCaSQKBJmtrIIISwpRFKIhViETScphGMzysMtvOVwvpm5d0bGNCuGWAOPgYdl6S8wSDn9b+bUhDHEKWAdeAFMANg+l/TV9ofcz6cjMIbYBvaBMds7QCqZ58CmpBNgPuV0DvAAIMyFGugWtJr7eTv38xEwkPRPErY7QDeG2LqFkjrAgu0dSd/KDVqSNmxvAZ8lfbS9AHRuYemnLWkv5XRVBrQMbAI/gTXgEzAJtJuwBVS2L2OIle03QA/4Lmkl5XQBXEqqbFcAVYFDYChpFngiqWf7l6TXKaezMt2Zkhk24THwG+jZriX9AFZvUAyxLbRke2D75O5zPAO+ADXwEtizjaRHwDvbTyUtppwOmicCHAJvbXcl9YA1SQDjtseA97YPRz7ATcUQp2y/kjRdevsjaTfldNrMjcDGBjXA3T96L7yvrgFzP69+0Ao/HAAAAABJRU5ErkJggg==)}assets/css/epo.min.css000064400000563110150755142450010733 0ustar00/*!
 * CCS3 animations
 */.tm-animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.tm-animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.fadein{-webkit-animation-name:fadein;animation-name:fadein}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@keyframes fadeout{from{opacity:1}to{opacity:0}}.fadeout{-webkit-animation-name:fadeout;animation-name:fadeout}@-webkit-keyframes fadeoutdown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeoutdown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeoutdown{-webkit-animation-name:fadeoutdown;animation-name:fadeoutdown}
/*!
 * Font Awesome Free 5.12.0 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 */.tcfa,.tcfas,.tcfar,.tcfal,.tcfad{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.tcfa-lg{font-size:1.33333em;line-height:.75;vertical-align:-0.0667em}.tcfa-xs{font-size:.75em}.tcfa-sm{font-size:.875em}.tcfa-1x{font-size:1em}.tcfa-2x{font-size:2em}.tcfa-3x{font-size:3em}.tcfa-4x{font-size:4em}.tcfa-5x{font-size:5em}.tcfa-6x{font-size:6em}.tcfa-7x{font-size:7em}.tcfa-8x{font-size:8em}.tcfa-9x{font-size:9em}.tcfa-10x{font-size:10em}.tcfa-fw{text-align:center;width:1.25em}.tcfa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.tcfa-ul>li{position:relative}.tcfa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.tcfa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.tcfa-pull-left{float:left}.tcfa-pull-right{float:right}.tcfa.tcfa-pull-left,.tcfas.tcfa-pull-left,.tcfar.tcfa-pull-left,.tcfal.tcfa-pull-left{margin-right:.3em}.tcfa.tcfa-pull-right,.tcfas.tcfa-pull-right,.tcfar.tcfa-pull-right,.tcfal.tcfa-pull-right{margin-left:.3em}.tcfa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.tcfa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.tcfa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.tcfa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.tcfa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.tcfa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.tcfa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.tcfa-flip-both,.tcfa-flip-horizontal.tcfa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .tcfa-rotate-90,:root .tcfa-rotate-180,:root .tcfa-rotate-270,:root .tcfa-flip-horizontal,:root .tcfa-flip-vertical,:root .tcfa-flip-both{-webkit-filter:none;filter:none}.tcfa-stack{display:inline-block;height:2em;line-height:2;position:relative;vertical-align:middle;width:2.5em}.tcfa-stack-1x,.tcfa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.tcfa-stack-1x{line-height:inherit}.tcfa-stack-2x{font-size:2em}.tcfa-inverse{color:#fff}.tcfa-500px::before{content:"\f26e"}.tcfa-accessible-icon::before{content:"\f368"}.tcfa-accusoft::before{content:"\f369"}.tcfa-acquisitions-incorporated::before{content:"\f6af"}.tcfa-ad::before{content:"\f641"}.tcfa-address-book::before{content:"\f2b9"}.tcfa-address-card::before{content:"\f2bb"}.tcfa-adjust::before{content:"\f042"}.tcfa-adn::before{content:"\f170"}.tcfa-adobe::before{content:"\f778"}.tcfa-adversal::before{content:"\f36a"}.tcfa-affiliatetheme::before{content:"\f36b"}.tcfa-air-freshener::before{content:"\f5d0"}.tcfa-airbnb::before{content:"\f834"}.tcfa-algolia::before{content:"\f36c"}.tcfa-align-center::before{content:"\f037"}.tcfa-align-justify::before{content:"\f039"}.tcfa-align-left::before{content:"\f036"}.tcfa-align-right::before{content:"\f038"}.tcfa-alipay::before{content:"\f642"}.tcfa-allergies::before{content:"\f461"}.tcfa-amazon::before{content:"\f270"}.tcfa-amazon-pay::before{content:"\f42c"}.tcfa-ambulance::before{content:"\f0f9"}.tcfa-american-sign-language-interpreting::before{content:"\f2a3"}.tcfa-amilia::before{content:"\f36d"}.tcfa-anchor::before{content:"\f13d"}.tcfa-android::before{content:"\f17b"}.tcfa-angellist::before{content:"\f209"}.tcfa-angle-double-down::before{content:"\f103"}.tcfa-angle-double-left::before{content:"\f100"}.tcfa-angle-double-right::before{content:"\f101"}.tcfa-angle-double-up::before{content:"\f102"}.tcfa-angle-down::before{content:"\f107"}.tcfa-angle-left::before{content:"\f104"}.tcfa-angle-right::before{content:"\f105"}.tcfa-angle-up::before{content:"\f106"}.tcfa-angry::before{content:"\f556"}.tcfa-angrycreative::before{content:"\f36e"}.tcfa-angular::before{content:"\f420"}.tcfa-ankh::before{content:"\f644"}.tcfa-app-store::before{content:"\f36f"}.tcfa-app-store-ios::before{content:"\f370"}.tcfa-apper::before{content:"\f371"}.tcfa-apple::before{content:"\f179"}.tcfa-apple-alt::before{content:"\f5d1"}.tcfa-apple-pay::before{content:"\f415"}.tcfa-archive::before{content:"\f187"}.tcfa-archway::before{content:"\f557"}.tcfa-arrow-alt-circle-down::before{content:"\f358"}.tcfa-arrow-alt-circle-left::before{content:"\f359"}.tcfa-arrow-alt-circle-right::before{content:"\f35a"}.tcfa-arrow-alt-circle-up::before{content:"\f35b"}.tcfa-arrow-circle-down::before{content:"\f0ab"}.tcfa-arrow-circle-left::before{content:"\f0a8"}.tcfa-arrow-circle-right::before{content:"\f0a9"}.tcfa-arrow-circle-up::before{content:"\f0aa"}.tcfa-arrow-down::before{content:"\f063"}.tcfa-arrow-left::before{content:"\f060"}.tcfa-arrow-right::before{content:"\f061"}.tcfa-arrow-up::before{content:"\f062"}.tcfa-arrows-alt::before{content:"\f0b2"}.tcfa-arrows-alt-h::before{content:"\f337"}.tcfa-arrows-alt-v::before{content:"\f338"}.tcfa-artstation::before{content:"\f77a"}.tcfa-assistive-listening-systems::before{content:"\f2a2"}.tcfa-asterisk::before{content:"\f069"}.tcfa-asymmetrik::before{content:"\f372"}.tcfa-at::before{content:"\f1fa"}.tcfa-atlas::before{content:"\f558"}.tcfa-atlassian::before{content:"\f77b"}.tcfa-atom::before{content:"\f5d2"}.tcfa-audible::before{content:"\f373"}.tcfa-audio-description::before{content:"\f29e"}.tcfa-autoprefixer::before{content:"\f41c"}.tcfa-avianex::before{content:"\f374"}.tcfa-aviato::before{content:"\f421"}.tcfa-award::before{content:"\f559"}.tcfa-aws::before{content:"\f375"}.tcfa-baby::before{content:"\f77c"}.tcfa-baby-carriage::before{content:"\f77d"}.tcfa-backspace::before{content:"\f55a"}.tcfa-backward::before{content:"\f04a"}.tcfa-bacon::before{content:"\f7e5"}.tcfa-bahai::before{content:"\f666"}.tcfa-balance-scale::before{content:"\f24e"}.tcfa-balance-scale-left::before{content:"\f515"}.tcfa-balance-scale-right::before{content:"\f516"}.tcfa-ban::before{content:"\f05e"}.tcfa-band-aid::before{content:"\f462"}.tcfa-bandcamp::before{content:"\f2d5"}.tcfa-barcode::before{content:"\f02a"}.tcfa-bars::before{content:"\f0c9"}.tcfa-baseball-ball::before{content:"\f433"}.tcfa-basketball-ball::before{content:"\f434"}.tcfa-bath::before{content:"\f2cd"}.tcfa-battery-empty::before{content:"\f244"}.tcfa-battery-full::before{content:"\f240"}.tcfa-battery-half::before{content:"\f242"}.tcfa-battery-quarter::before{content:"\f243"}.tcfa-battery-three-quarters::before{content:"\f241"}.tcfa-battle-net::before{content:"\f835"}.tcfa-bed::before{content:"\f236"}.tcfa-beer::before{content:"\f0fc"}.tcfa-behance::before{content:"\f1b4"}.tcfa-behance-square::before{content:"\f1b5"}.tcfa-bell::before{content:"\f0f3"}.tcfa-bell-slash::before{content:"\f1f6"}.tcfa-bezier-curve::before{content:"\f55b"}.tcfa-bible::before{content:"\f647"}.tcfa-bicycle::before{content:"\f206"}.tcfa-biking::before{content:"\f84a"}.tcfa-bimobject::before{content:"\f378"}.tcfa-binoculars::before{content:"\f1e5"}.tcfa-biohazard::before{content:"\f780"}.tcfa-birthday-cake::before{content:"\f1fd"}.tcfa-bitbucket::before{content:"\f171"}.tcfa-bitcoin::before{content:"\f379"}.tcfa-bity::before{content:"\f37a"}.tcfa-black-tie::before{content:"\f27e"}.tcfa-blackberry::before{content:"\f37b"}.tcfa-blender::before{content:"\f517"}.tcfa-blender-phone::before{content:"\f6b6"}.tcfa-blind::before{content:"\f29d"}.tcfa-blog::before{content:"\f781"}.tcfa-blogger::before{content:"\f37c"}.tcfa-blogger-b::before{content:"\f37d"}.tcfa-bluetooth::before{content:"\f293"}.tcfa-bluetooth-b::before{content:"\f294"}.tcfa-bold::before{content:"\f032"}.tcfa-bolt::before{content:"\f0e7"}.tcfa-bomb::before{content:"\f1e2"}.tcfa-bone::before{content:"\f5d7"}.tcfa-bong::before{content:"\f55c"}.tcfa-book::before{content:"\f02d"}.tcfa-book-dead::before{content:"\f6b7"}.tcfa-book-medical::before{content:"\f7e6"}.tcfa-book-open::before{content:"\f518"}.tcfa-book-reader::before{content:"\f5da"}.tcfa-bookmark::before{content:"\f02e"}.tcfa-bootstrap::before{content:"\f836"}.tcfa-border-all::before{content:"\f84c"}.tcfa-border-none::before{content:"\f850"}.tcfa-border-style::before{content:"\f853"}.tcfa-bowling-ball::before{content:"\f436"}.tcfa-box::before{content:"\f466"}.tcfa-box-open::before{content:"\f49e"}.tcfa-boxes::before{content:"\f468"}.tcfa-braille::before{content:"\f2a1"}.tcfa-brain::before{content:"\f5dc"}.tcfa-bread-slice::before{content:"\f7ec"}.tcfa-briefcase::before{content:"\f0b1"}.tcfa-briefcase-medical::before{content:"\f469"}.tcfa-broadcast-tower::before{content:"\f519"}.tcfa-broom::before{content:"\f51a"}.tcfa-brush::before{content:"\f55d"}.tcfa-btc::before{content:"\f15a"}.tcfa-buffer::before{content:"\f837"}.tcfa-bug::before{content:"\f188"}.tcfa-building::before{content:"\f1ad"}.tcfa-bullhorn::before{content:"\f0a1"}.tcfa-bullseye::before{content:"\f140"}.tcfa-burn::before{content:"\f46a"}.tcfa-buromobelexperte::before{content:"\f37f"}.tcfa-bus::before{content:"\f207"}.tcfa-bus-alt::before{content:"\f55e"}.tcfa-business-time::before{content:"\f64a"}.tcfa-buy-n-large::before{content:"\f8a6"}.tcfa-buysellads::before{content:"\f20d"}.tcfa-calculator::before{content:"\f1ec"}.tcfa-calendar::before{content:"\f133"}.tcfa-calendar-alt::before{content:"\f073"}.tcfa-calendar-check::before{content:"\f274"}.tcfa-calendar-day::before{content:"\f783"}.tcfa-calendar-minus::before{content:"\f272"}.tcfa-calendar-plus::before{content:"\f271"}.tcfa-calendar-times::before{content:"\f273"}.tcfa-calendar-week::before{content:"\f784"}.tcfa-camera::before{content:"\f030"}.tcfa-camera-retro::before{content:"\f083"}.tcfa-campground::before{content:"\f6bb"}.tcfa-canadian-maple-leaf::before{content:"\f785"}.tcfa-candy-cane::before{content:"\f786"}.tcfa-cannabis::before{content:"\f55f"}.tcfa-capsules::before{content:"\f46b"}.tcfa-car::before{content:"\f1b9"}.tcfa-car-alt::before{content:"\f5de"}.tcfa-car-battery::before{content:"\f5df"}.tcfa-car-crash::before{content:"\f5e1"}.tcfa-car-side::before{content:"\f5e4"}.tcfa-caravan::before{content:"\f8ff"}.tcfa-caret-down::before{content:"\f0d7"}.tcfa-caret-left::before{content:"\f0d9"}.tcfa-caret-right::before{content:"\f0da"}.tcfa-caret-square-down::before{content:"\f150"}.tcfa-caret-square-left::before{content:"\f191"}.tcfa-caret-square-right::before{content:"\f152"}.tcfa-caret-square-up::before{content:"\f151"}.tcfa-caret-up::before{content:"\f0d8"}.tcfa-carrot::before{content:"\f787"}.tcfa-cart-arrow-down::before{content:"\f218"}.tcfa-cart-plus::before{content:"\f217"}.tcfa-cash-register::before{content:"\f788"}.tcfa-cat::before{content:"\f6be"}.tcfa-cc-amazon-pay::before{content:"\f42d"}.tcfa-cc-amex::before{content:"\f1f3"}.tcfa-cc-apple-pay::before{content:"\f416"}.tcfa-cc-diners-club::before{content:"\f24c"}.tcfa-cc-discover::before{content:"\f1f2"}.tcfa-cc-jcb::before{content:"\f24b"}.tcfa-cc-mastercard::before{content:"\f1f1"}.tcfa-cc-paypal::before{content:"\f1f4"}.tcfa-cc-stripe::before{content:"\f1f5"}.tcfa-cc-visa::before{content:"\f1f0"}.tcfa-centercode::before{content:"\f380"}.tcfa-centos::before{content:"\f789"}.tcfa-certificate::before{content:"\f0a3"}.tcfa-chair::before{content:"\f6c0"}.tcfa-chalkboard::before{content:"\f51b"}.tcfa-chalkboard-teacher::before{content:"\f51c"}.tcfa-charging-station::before{content:"\f5e7"}.tcfa-chart-area::before{content:"\f1fe"}.tcfa-chart-bar::before{content:"\f080"}.tcfa-chart-line::before{content:"\f201"}.tcfa-chart-pie::before{content:"\f200"}.tcfa-check::before{content:"\f00c"}.tcfa-check-circle::before{content:"\f058"}.tcfa-check-double::before{content:"\f560"}.tcfa-check-square::before{content:"\f14a"}.tcfa-cheese::before{content:"\f7ef"}.tcfa-chess::before{content:"\f439"}.tcfa-chess-bishop::before{content:"\f43a"}.tcfa-chess-board::before{content:"\f43c"}.tcfa-chess-king::before{content:"\f43f"}.tcfa-chess-knight::before{content:"\f441"}.tcfa-chess-pawn::before{content:"\f443"}.tcfa-chess-queen::before{content:"\f445"}.tcfa-chess-rook::before{content:"\f447"}.tcfa-chevron-circle-down::before{content:"\f13a"}.tcfa-chevron-circle-left::before{content:"\f137"}.tcfa-chevron-circle-right::before{content:"\f138"}.tcfa-chevron-circle-up::before{content:"\f139"}.tcfa-chevron-down::before{content:"\f078"}.tcfa-chevron-left::before{content:"\f053"}.tcfa-chevron-right::before{content:"\f054"}.tcfa-chevron-up::before{content:"\f077"}.tcfa-child::before{content:"\f1ae"}.tcfa-chrome::before{content:"\f268"}.tcfa-chromecast::before{content:"\f838"}.tcfa-church::before{content:"\f51d"}.tcfa-circle::before{content:"\f111"}.tcfa-circle-notch::before{content:"\f1ce"}.tcfa-city::before{content:"\f64f"}.tcfa-clinic-medical::before{content:"\f7f2"}.tcfa-clipboard::before{content:"\f328"}.tcfa-clipboard-check::before{content:"\f46c"}.tcfa-clipboard-list::before{content:"\f46d"}.tcfa-clock::before{content:"\f017"}.tcfa-clone::before{content:"\f24d"}.tcfa-closed-captioning::before{content:"\f20a"}.tcfa-cloud::before{content:"\f0c2"}.tcfa-cloud-download-alt::before{content:"\f381"}.tcfa-cloud-meatball::before{content:"\f73b"}.tcfa-cloud-moon::before{content:"\f6c3"}.tcfa-cloud-moon-rain::before{content:"\f73c"}.tcfa-cloud-rain::before{content:"\f73d"}.tcfa-cloud-showers-heavy::before{content:"\f740"}.tcfa-cloud-sun::before{content:"\f6c4"}.tcfa-cloud-sun-rain::before{content:"\f743"}.tcfa-cloud-upload-alt::before{content:"\f382"}.tcfa-cloudscale::before{content:"\f383"}.tcfa-cloudsmith::before{content:"\f384"}.tcfa-cloudversify::before{content:"\f385"}.tcfa-cocktail::before{content:"\f561"}.tcfa-code::before{content:"\f121"}.tcfa-code-branch::before{content:"\f126"}.tcfa-codepen::before{content:"\f1cb"}.tcfa-codiepie::before{content:"\f284"}.tcfa-coffee::before{content:"\f0f4"}.tcfa-cog::before{content:"\f013"}.tcfa-cogs::before{content:"\f085"}.tcfa-coins::before{content:"\f51e"}.tcfa-columns::before{content:"\f0db"}.tcfa-comment::before{content:"\f075"}.tcfa-comment-alt::before{content:"\f27a"}.tcfa-comment-dollar::before{content:"\f651"}.tcfa-comment-dots::before{content:"\f4ad"}.tcfa-comment-medical::before{content:"\f7f5"}.tcfa-comment-slash::before{content:"\f4b3"}.tcfa-comments::before{content:"\f086"}.tcfa-comments-dollar::before{content:"\f653"}.tcfa-compact-disc::before{content:"\f51f"}.tcfa-compass::before{content:"\f14e"}.tcfa-compress::before{content:"\f066"}.tcfa-compress-alt::before{content:"\f422"}.tcfa-compress-arrows-alt::before{content:"\f78c"}.tcfa-concierge-bell::before{content:"\f562"}.tcfa-confluence::before{content:"\f78d"}.tcfa-connectdevelop::before{content:"\f20e"}.tcfa-contao::before{content:"\f26d"}.tcfa-cookie::before{content:"\f563"}.tcfa-cookie-bite::before{content:"\f564"}.tcfa-copy::before{content:"\f0c5"}.tcfa-copyright::before{content:"\f1f9"}.tcfa-cotton-bureau::before{content:"\f89e"}.tcfa-couch::before{content:"\f4b8"}.tcfa-cpanel::before{content:"\f388"}.tcfa-creative-commons::before{content:"\f25e"}.tcfa-creative-commons-by::before{content:"\f4e7"}.tcfa-creative-commons-nc::before{content:"\f4e8"}.tcfa-creative-commons-nc-eu::before{content:"\f4e9"}.tcfa-creative-commons-nc-jp::before{content:"\f4ea"}.tcfa-creative-commons-nd::before{content:"\f4eb"}.tcfa-creative-commons-pd::before{content:"\f4ec"}.tcfa-creative-commons-pd-alt::before{content:"\f4ed"}.tcfa-creative-commons-remix::before{content:"\f4ee"}.tcfa-creative-commons-sa::before{content:"\f4ef"}.tcfa-creative-commons-sampling::before{content:"\f4f0"}.tcfa-creative-commons-sampling-plus::before{content:"\f4f1"}.tcfa-creative-commons-share::before{content:"\f4f2"}.tcfa-creative-commons-zero::before{content:"\f4f3"}.tcfa-credit-card::before{content:"\f09d"}.tcfa-critical-role::before{content:"\f6c9"}.tcfa-crop::before{content:"\f125"}.tcfa-crop-alt::before{content:"\f565"}.tcfa-cross::before{content:"\f654"}.tcfa-crosshairs::before{content:"\f05b"}.tcfa-crow::before{content:"\f520"}.tcfa-crown::before{content:"\f521"}.tcfa-crutch::before{content:"\f7f7"}.tcfa-css3::before{content:"\f13c"}.tcfa-css3-alt::before{content:"\f38b"}.tcfa-cube::before{content:"\f1b2"}.tcfa-cubes::before{content:"\f1b3"}.tcfa-cut::before{content:"\f0c4"}.tcfa-cuttlefish::before{content:"\f38c"}.tcfa-d-and-d::before{content:"\f38d"}.tcfa-d-and-d-beyond::before{content:"\f6ca"}.tcfa-dashcube::before{content:"\f210"}.tcfa-database::before{content:"\f1c0"}.tcfa-deaf::before{content:"\f2a4"}.tcfa-delicious::before{content:"\f1a5"}.tcfa-democrat::before{content:"\f747"}.tcfa-deploydog::before{content:"\f38e"}.tcfa-deskpro::before{content:"\f38f"}.tcfa-desktop::before{content:"\f108"}.tcfa-dev::before{content:"\f6cc"}.tcfa-deviantart::before{content:"\f1bd"}.tcfa-dharmachakra::before{content:"\f655"}.tcfa-dhl::before{content:"\f790"}.tcfa-diagnoses::before{content:"\f470"}.tcfa-diaspora::before{content:"\f791"}.tcfa-dice::before{content:"\f522"}.tcfa-dice-d20::before{content:"\f6cf"}.tcfa-dice-d6::before{content:"\f6d1"}.tcfa-dice-five::before{content:"\f523"}.tcfa-dice-four::before{content:"\f524"}.tcfa-dice-one::before{content:"\f525"}.tcfa-dice-six::before{content:"\f526"}.tcfa-dice-three::before{content:"\f527"}.tcfa-dice-two::before{content:"\f528"}.tcfa-digg::before{content:"\f1a6"}.tcfa-digital-ocean::before{content:"\f391"}.tcfa-digital-tachograph::before{content:"\f566"}.tcfa-directions::before{content:"\f5eb"}.tcfa-discord::before{content:"\f392"}.tcfa-discourse::before{content:"\f393"}.tcfa-divide::before{content:"\f529"}.tcfa-dizzy::before{content:"\f567"}.tcfa-dna::before{content:"\f471"}.tcfa-dochub::before{content:"\f394"}.tcfa-docker::before{content:"\f395"}.tcfa-dog::before{content:"\f6d3"}.tcfa-dollar-sign::before{content:"\f155"}.tcfa-dolly::before{content:"\f472"}.tcfa-dolly-flatbed::before{content:"\f474"}.tcfa-donate::before{content:"\f4b9"}.tcfa-door-closed::before{content:"\f52a"}.tcfa-door-open::before{content:"\f52b"}.tcfa-dot-circle::before{content:"\f192"}.tcfa-dove::before{content:"\f4ba"}.tcfa-download::before{content:"\f019"}.tcfa-draft2digital::before{content:"\f396"}.tcfa-drafting-compass::before{content:"\f568"}.tcfa-dragon::before{content:"\f6d5"}.tcfa-draw-polygon::before{content:"\f5ee"}.tcfa-dribbble::before{content:"\f17d"}.tcfa-dribbble-square::before{content:"\f397"}.tcfa-dropbox::before{content:"\f16b"}.tcfa-drum::before{content:"\f569"}.tcfa-drum-steelpan::before{content:"\f56a"}.tcfa-drumstick-bite::before{content:"\f6d7"}.tcfa-drupal::before{content:"\f1a9"}.tcfa-dumbbell::before{content:"\f44b"}.tcfa-dumpster::before{content:"\f793"}.tcfa-dumpster-fire::before{content:"\f794"}.tcfa-dungeon::before{content:"\f6d9"}.tcfa-dyalog::before{content:"\f399"}.tcfa-earlybirds::before{content:"\f39a"}.tcfa-ebay::before{content:"\f4f4"}.tcfa-edge::before{content:"\f282"}.tcfa-edit::before{content:"\f044"}.tcfa-egg::before{content:"\f7fb"}.tcfa-eject::before{content:"\f052"}.tcfa-elementor::before{content:"\f430"}.tcfa-ellipsis-h::before{content:"\f141"}.tcfa-ellipsis-v::before{content:"\f142"}.tcfa-ello::before{content:"\f5f1"}.tcfa-ember::before{content:"\f423"}.tcfa-empire::before{content:"\f1d1"}.tcfa-envelope::before{content:"\f0e0"}.tcfa-envelope-open::before{content:"\f2b6"}.tcfa-envelope-open-text::before{content:"\f658"}.tcfa-envelope-square::before{content:"\f199"}.tcfa-envira::before{content:"\f299"}.tcfa-equals::before{content:"\f52c"}.tcfa-eraser::before{content:"\f12d"}.tcfa-erlang::before{content:"\f39d"}.tcfa-ethereum::before{content:"\f42e"}.tcfa-ethernet::before{content:"\f796"}.tcfa-etsy::before{content:"\f2d7"}.tcfa-euro-sign::before{content:"\f153"}.tcfa-evernote::before{content:"\f839"}.tcfa-exchange-alt::before{content:"\f362"}.tcfa-exclamation::before{content:"\f12a"}.tcfa-exclamation-circle::before{content:"\f06a"}.tcfa-exclamation-triangle::before{content:"\f071"}.tcfa-expand::before{content:"\f065"}.tcfa-expand-alt::before{content:"\f424"}.tcfa-expand-arrows-alt::before{content:"\f31e"}.tcfa-expeditedssl::before{content:"\f23e"}.tcfa-external-link-alt::before{content:"\f35d"}.tcfa-external-link-square-alt::before{content:"\f360"}.tcfa-eye::before{content:"\f06e"}.tcfa-eye-dropper::before{content:"\f1fb"}.tcfa-eye-slash::before{content:"\f070"}.tcfa-facebook::before{content:"\f09a"}.tcfa-facebook-f::before{content:"\f39e"}.tcfa-facebook-messenger::before{content:"\f39f"}.tcfa-facebook-square::before{content:"\f082"}.tcfa-fan::before{content:"\f863"}.tcfa-fantasy-flight-games::before{content:"\f6dc"}.tcfa-fast-backward::before{content:"\f049"}.tcfa-fast-forward::before{content:"\f050"}.tcfa-fax::before{content:"\f1ac"}.tcfa-feather::before{content:"\f52d"}.tcfa-feather-alt::before{content:"\f56b"}.tcfa-fedex::before{content:"\f797"}.tcfa-fedora::before{content:"\f798"}.tcfa-female::before{content:"\f182"}.tcfa-fighter-jet::before{content:"\f0fb"}.tcfa-figma::before{content:"\f799"}.tcfa-file::before{content:"\f15b"}.tcfa-file-alt::before{content:"\f15c"}.tcfa-file-archive::before{content:"\f1c6"}.tcfa-file-audio::before{content:"\f1c7"}.tcfa-file-code::before{content:"\f1c9"}.tcfa-file-contract::before{content:"\f56c"}.tcfa-file-csv::before{content:"\f6dd"}.tcfa-file-download::before{content:"\f56d"}.tcfa-file-excel::before{content:"\f1c3"}.tcfa-file-export::before{content:"\f56e"}.tcfa-file-image::before{content:"\f1c5"}.tcfa-file-import::before{content:"\f56f"}.tcfa-file-invoice::before{content:"\f570"}.tcfa-file-invoice-dollar::before{content:"\f571"}.tcfa-file-medical::before{content:"\f477"}.tcfa-file-medical-alt::before{content:"\f478"}.tcfa-file-pdf::before{content:"\f1c1"}.tcfa-file-powerpoint::before{content:"\f1c4"}.tcfa-file-prescription::before{content:"\f572"}.tcfa-file-signature::before{content:"\f573"}.tcfa-file-upload::before{content:"\f574"}.tcfa-file-video::before{content:"\f1c8"}.tcfa-file-word::before{content:"\f1c2"}.tcfa-fill::before{content:"\f575"}.tcfa-fill-drip::before{content:"\f576"}.tcfa-film::before{content:"\f008"}.tcfa-filter::before{content:"\f0b0"}.tcfa-fingerprint::before{content:"\f577"}.tcfa-fire::before{content:"\f06d"}.tcfa-fire-alt::before{content:"\f7e4"}.tcfa-fire-extinguisher::before{content:"\f134"}.tcfa-firefox::before{content:"\f269"}.tcfa-firefox-browser::before{content:"\f907"}.tcfa-first-aid::before{content:"\f479"}.tcfa-first-order::before{content:"\f2b0"}.tcfa-first-order-alt::before{content:"\f50a"}.tcfa-firstdraft::before{content:"\f3a1"}.tcfa-fish::before{content:"\f578"}.tcfa-fist-raised::before{content:"\f6de"}.tcfa-flag::before{content:"\f024"}.tcfa-flag-checkered::before{content:"\f11e"}.tcfa-flag-usa::before{content:"\f74d"}.tcfa-flask::before{content:"\f0c3"}.tcfa-flickr::before{content:"\f16e"}.tcfa-flipboard::before{content:"\f44d"}.tcfa-flushed::before{content:"\f579"}.tcfa-fly::before{content:"\f417"}.tcfa-folder::before{content:"\f07b"}.tcfa-folder-minus::before{content:"\f65d"}.tcfa-folder-open::before{content:"\f07c"}.tcfa-folder-plus::before{content:"\f65e"}.tcfa-font::before{content:"\f031"}.tcfa-font-awesome::before{content:"\f2b4"}.tcfa-font-awesome-alt::before{content:"\f35c"}.tcfa-font-awesome-flag::before{content:"\f425"}.tcfa-font-awesome-logo-full::before{content:"\f4e6"}.tcfa-fonticons::before{content:"\f280"}.tcfa-fonticons-fi::before{content:"\f3a2"}.tcfa-football-ball::before{content:"\f44e"}.tcfa-fort-awesome::before{content:"\f286"}.tcfa-fort-awesome-alt::before{content:"\f3a3"}.tcfa-forumbee::before{content:"\f211"}.tcfa-forward::before{content:"\f04e"}.tcfa-foursquare::before{content:"\f180"}.tcfa-free-code-camp::before{content:"\f2c5"}.tcfa-freebsd::before{content:"\f3a4"}.tcfa-frog::before{content:"\f52e"}.tcfa-frown::before{content:"\f119"}.tcfa-frown-open::before{content:"\f57a"}.tcfa-fulcrum::before{content:"\f50b"}.tcfa-funnel-dollar::before{content:"\f662"}.tcfa-futbol::before{content:"\f1e3"}.tcfa-galactic-republic::before{content:"\f50c"}.tcfa-galactic-senate::before{content:"\f50d"}.tcfa-gamepad::before{content:"\f11b"}.tcfa-gas-pump::before{content:"\f52f"}.tcfa-gavel::before{content:"\f0e3"}.tcfa-gem::before{content:"\f3a5"}.tcfa-genderless::before{content:"\f22d"}.tcfa-get-pocket::before{content:"\f265"}.tcfa-gg::before{content:"\f260"}.tcfa-gg-circle::before{content:"\f261"}.tcfa-ghost::before{content:"\f6e2"}.tcfa-gift::before{content:"\f06b"}.tcfa-gifts::before{content:"\f79c"}.tcfa-git::before{content:"\f1d3"}.tcfa-git-alt::before{content:"\f841"}.tcfa-git-square::before{content:"\f1d2"}.tcfa-github::before{content:"\f09b"}.tcfa-github-alt::before{content:"\f113"}.tcfa-github-square::before{content:"\f092"}.tcfa-gitkraken::before{content:"\f3a6"}.tcfa-gitlab::before{content:"\f296"}.tcfa-gitter::before{content:"\f426"}.tcfa-glass-cheers::before{content:"\f79f"}.tcfa-glass-martini::before{content:"\f000"}.tcfa-glass-martini-alt::before{content:"\f57b"}.tcfa-glass-whiskey::before{content:"\f7a0"}.tcfa-glasses::before{content:"\f530"}.tcfa-glide::before{content:"\f2a5"}.tcfa-glide-g::before{content:"\f2a6"}.tcfa-globe::before{content:"\f0ac"}.tcfa-globe-africa::before{content:"\f57c"}.tcfa-globe-americas::before{content:"\f57d"}.tcfa-globe-asia::before{content:"\f57e"}.tcfa-globe-europe::before{content:"\f7a2"}.tcfa-gofore::before{content:"\f3a7"}.tcfa-golf-ball::before{content:"\f450"}.tcfa-goodreads::before{content:"\f3a8"}.tcfa-goodreads-g::before{content:"\f3a9"}.tcfa-google::before{content:"\f1a0"}.tcfa-google-drive::before{content:"\f3aa"}.tcfa-google-play::before{content:"\f3ab"}.tcfa-google-plus::before{content:"\f2b3"}.tcfa-google-plus-g::before{content:"\f0d5"}.tcfa-google-plus-square::before{content:"\f0d4"}.tcfa-google-wallet::before{content:"\f1ee"}.tcfa-gopuram::before{content:"\f664"}.tcfa-graduation-cap::before{content:"\f19d"}.tcfa-gratipay::before{content:"\f184"}.tcfa-grav::before{content:"\f2d6"}.tcfa-greater-than::before{content:"\f531"}.tcfa-greater-than-equal::before{content:"\f532"}.tcfa-grimace::before{content:"\f57f"}.tcfa-grin::before{content:"\f580"}.tcfa-grin-alt::before{content:"\f581"}.tcfa-grin-beam::before{content:"\f582"}.tcfa-grin-beam-sweat::before{content:"\f583"}.tcfa-grin-hearts::before{content:"\f584"}.tcfa-grin-squint::before{content:"\f585"}.tcfa-grin-squint-tears::before{content:"\f586"}.tcfa-grin-stars::before{content:"\f587"}.tcfa-grin-tears::before{content:"\f588"}.tcfa-grin-tongue::before{content:"\f589"}.tcfa-grin-tongue-squint::before{content:"\f58a"}.tcfa-grin-tongue-wink::before{content:"\f58b"}.tcfa-grin-wink::before{content:"\f58c"}.tcfa-grip-horizontal::before{content:"\f58d"}.tcfa-grip-lines::before{content:"\f7a4"}.tcfa-grip-lines-vertical::before{content:"\f7a5"}.tcfa-grip-vertical::before{content:"\f58e"}.tcfa-gripfire::before{content:"\f3ac"}.tcfa-grunt::before{content:"\f3ad"}.tcfa-guitar::before{content:"\f7a6"}.tcfa-gulp::before{content:"\f3ae"}.tcfa-h-square::before{content:"\f0fd"}.tcfa-hacker-news::before{content:"\f1d4"}.tcfa-hacker-news-square::before{content:"\f3af"}.tcfa-hackerrank::before{content:"\f5f7"}.tcfa-hamburger::before{content:"\f805"}.tcfa-hammer::before{content:"\f6e3"}.tcfa-hamsa::before{content:"\f665"}.tcfa-hand-holding::before{content:"\f4bd"}.tcfa-hand-holding-heart::before{content:"\f4be"}.tcfa-hand-holding-usd::before{content:"\f4c0"}.tcfa-hand-lizard::before{content:"\f258"}.tcfa-hand-middle-finger::before{content:"\f806"}.tcfa-hand-paper::before{content:"\f256"}.tcfa-hand-peace::before{content:"\f25b"}.tcfa-hand-point-down::before{content:"\f0a7"}.tcfa-hand-point-left::before{content:"\f0a5"}.tcfa-hand-point-right::before{content:"\f0a4"}.tcfa-hand-point-up::before{content:"\f0a6"}.tcfa-hand-pointer::before{content:"\f25a"}.tcfa-hand-rock::before{content:"\f255"}.tcfa-hand-scissors::before{content:"\f257"}.tcfa-hand-spock::before{content:"\f259"}.tcfa-hands::before{content:"\f4c2"}.tcfa-hands-helping::before{content:"\f4c4"}.tcfa-handshake::before{content:"\f2b5"}.tcfa-hanukiah::before{content:"\f6e6"}.tcfa-hard-hat::before{content:"\f807"}.tcfa-hashtag::before{content:"\f292"}.tcfa-hat-cowboy::before{content:"\f8c0"}.tcfa-hat-cowboy-side::before{content:"\f8c1"}.tcfa-hat-wizard::before{content:"\f6e8"}.tcfa-hdd::before{content:"\f0a0"}.tcfa-heading::before{content:"\f1dc"}.tcfa-headphones::before{content:"\f025"}.tcfa-headphones-alt::before{content:"\f58f"}.tcfa-headset::before{content:"\f590"}.tcfa-heart::before{content:"\f004"}.tcfa-heart-broken::before{content:"\f7a9"}.tcfa-heartbeat::before{content:"\f21e"}.tcfa-helicopter::before{content:"\f533"}.tcfa-highlighter::before{content:"\f591"}.tcfa-hiking::before{content:"\f6ec"}.tcfa-hippo::before{content:"\f6ed"}.tcfa-hips::before{content:"\f452"}.tcfa-hire-a-helper::before{content:"\f3b0"}.tcfa-history::before{content:"\f1da"}.tcfa-hockey-puck::before{content:"\f453"}.tcfa-holly-berry::before{content:"\f7aa"}.tcfa-home::before{content:"\f015"}.tcfa-hooli::before{content:"\f427"}.tcfa-hornbill::before{content:"\f592"}.tcfa-horse::before{content:"\f6f0"}.tcfa-horse-head::before{content:"\f7ab"}.tcfa-hospital::before{content:"\f0f8"}.tcfa-hospital-alt::before{content:"\f47d"}.tcfa-hospital-symbol::before{content:"\f47e"}.tcfa-hot-tub::before{content:"\f593"}.tcfa-hotdog::before{content:"\f80f"}.tcfa-hotel::before{content:"\f594"}.tcfa-hotjar::before{content:"\f3b1"}.tcfa-hourglass::before{content:"\f254"}.tcfa-hourglass-end::before{content:"\f253"}.tcfa-hourglass-half::before{content:"\f252"}.tcfa-hourglass-start::before{content:"\f251"}.tcfa-house-damage::before{content:"\f6f1"}.tcfa-houzz::before{content:"\f27c"}.tcfa-hryvnia::before{content:"\f6f2"}.tcfa-html5::before{content:"\f13b"}.tcfa-hubspot::before{content:"\f3b2"}.tcfa-i-cursor::before{content:"\f246"}.tcfa-ice-cream::before{content:"\f810"}.tcfa-icicles::before{content:"\f7ad"}.tcfa-icons::before{content:"\f86d"}.tcfa-id-badge::before{content:"\f2c1"}.tcfa-id-card::before{content:"\f2c2"}.tcfa-id-card-alt::before{content:"\f47f"}.tcfa-ideal::before{content:"\f913"}.tcfa-igloo::before{content:"\f7ae"}.tcfa-image::before{content:"\f03e"}.tcfa-images::before{content:"\f302"}.tcfa-imdb::before{content:"\f2d8"}.tcfa-inbox::before{content:"\f01c"}.tcfa-indent::before{content:"\f03c"}.tcfa-industry::before{content:"\f275"}.tcfa-infinity::before{content:"\f534"}.tcfa-info::before{content:"\f129"}.tcfa-info-circle::before{content:"\f05a"}.tcfa-instagram::before{content:"\f16d"}.tcfa-intercom::before{content:"\f7af"}.tcfa-internet-explorer::before{content:"\f26b"}.tcfa-invision::before{content:"\f7b0"}.tcfa-ioxhost::before{content:"\f208"}.tcfa-italic::before{content:"\f033"}.tcfa-itch-io::before{content:"\f83a"}.tcfa-itunes::before{content:"\f3b4"}.tcfa-itunes-note::before{content:"\f3b5"}.tcfa-java::before{content:"\f4e4"}.tcfa-jedi::before{content:"\f669"}.tcfa-jedi-order::before{content:"\f50e"}.tcfa-jenkins::before{content:"\f3b6"}.tcfa-jira::before{content:"\f7b1"}.tcfa-joget::before{content:"\f3b7"}.tcfa-joint::before{content:"\f595"}.tcfa-joomla::before{content:"\f1aa"}.tcfa-journal-whills::before{content:"\f66a"}.tcfa-js::before{content:"\f3b8"}.tcfa-js-square::before{content:"\f3b9"}.tcfa-jsfiddle::before{content:"\f1cc"}.tcfa-kaaba::before{content:"\f66b"}.tcfa-kaggle::before{content:"\f5fa"}.tcfa-key::before{content:"\f084"}.tcfa-keybase::before{content:"\f4f5"}.tcfa-keyboard::before{content:"\f11c"}.tcfa-keycdn::before{content:"\f3ba"}.tcfa-khanda::before{content:"\f66d"}.tcfa-kickstarter::before{content:"\f3bb"}.tcfa-kickstarter-k::before{content:"\f3bc"}.tcfa-kiss::before{content:"\f596"}.tcfa-kiss-beam::before{content:"\f597"}.tcfa-kiss-wink-heart::before{content:"\f598"}.tcfa-kiwi-bird::before{content:"\f535"}.tcfa-korvue::before{content:"\f42f"}.tcfa-landmark::before{content:"\f66f"}.tcfa-language::before{content:"\f1ab"}.tcfa-laptop::before{content:"\f109"}.tcfa-laptop-code::before{content:"\f5fc"}.tcfa-laptop-medical::before{content:"\f812"}.tcfa-laravel::before{content:"\f3bd"}.tcfa-lastfm::before{content:"\f202"}.tcfa-lastfm-square::before{content:"\f203"}.tcfa-laugh::before{content:"\f599"}.tcfa-laugh-beam::before{content:"\f59a"}.tcfa-laugh-squint::before{content:"\f59b"}.tcfa-laugh-wink::before{content:"\f59c"}.tcfa-layer-group::before{content:"\f5fd"}.tcfa-leaf::before{content:"\f06c"}.tcfa-leanpub::before{content:"\f212"}.tcfa-lemon::before{content:"\f094"}.tcfa-less::before{content:"\f41d"}.tcfa-less-than::before{content:"\f536"}.tcfa-less-than-equal::before{content:"\f537"}.tcfa-level-down-alt::before{content:"\f3be"}.tcfa-level-up-alt::before{content:"\f3bf"}.tcfa-life-ring::before{content:"\f1cd"}.tcfa-lightbulb::before{content:"\f0eb"}.tcfa-line::before{content:"\f3c0"}.tcfa-link::before{content:"\f0c1"}.tcfa-linkedin::before{content:"\f08c"}.tcfa-linkedin-in::before{content:"\f0e1"}.tcfa-linode::before{content:"\f2b8"}.tcfa-linux::before{content:"\f17c"}.tcfa-lira-sign::before{content:"\f195"}.tcfa-list::before{content:"\f03a"}.tcfa-list-alt::before{content:"\f022"}.tcfa-list-ol::before{content:"\f0cb"}.tcfa-list-ul::before{content:"\f0ca"}.tcfa-location-arrow::before{content:"\f124"}.tcfa-lock::before{content:"\f023"}.tcfa-lock-open::before{content:"\f3c1"}.tcfa-long-arrow-alt-down::before{content:"\f309"}.tcfa-long-arrow-alt-left::before{content:"\f30a"}.tcfa-long-arrow-alt-right::before{content:"\f30b"}.tcfa-long-arrow-alt-up::before{content:"\f30c"}.tcfa-low-vision::before{content:"\f2a8"}.tcfa-luggage-cart::before{content:"\f59d"}.tcfa-lyft::before{content:"\f3c3"}.tcfa-magento::before{content:"\f3c4"}.tcfa-magic::before{content:"\f0d0"}.tcfa-magnet::before{content:"\f076"}.tcfa-mail-bulk::before{content:"\f674"}.tcfa-mailchimp::before{content:"\f59e"}.tcfa-male::before{content:"\f183"}.tcfa-mandalorian::before{content:"\f50f"}.tcfa-map::before{content:"\f279"}.tcfa-map-marked::before{content:"\f59f"}.tcfa-map-marked-alt::before{content:"\f5a0"}.tcfa-map-marker::before{content:"\f041"}.tcfa-map-marker-alt::before{content:"\f3c5"}.tcfa-map-pin::before{content:"\f276"}.tcfa-map-signs::before{content:"\f277"}.tcfa-markdown::before{content:"\f60f"}.tcfa-marker::before{content:"\f5a1"}.tcfa-mars::before{content:"\f222"}.tcfa-mars-double::before{content:"\f227"}.tcfa-mars-stroke::before{content:"\f229"}.tcfa-mars-stroke-h::before{content:"\f22b"}.tcfa-mars-stroke-v::before{content:"\f22a"}.tcfa-mask::before{content:"\f6fa"}.tcfa-mastodon::before{content:"\f4f6"}.tcfa-maxcdn::before{content:"\f136"}.tcfa-mdb::before{content:"\f8ca"}.tcfa-medal::before{content:"\f5a2"}.tcfa-medapps::before{content:"\f3c6"}.tcfa-medium::before{content:"\f23a"}.tcfa-medium-m::before{content:"\f3c7"}.tcfa-medkit::before{content:"\f0fa"}.tcfa-medrt::before{content:"\f3c8"}.tcfa-meetup::before{content:"\f2e0"}.tcfa-megaport::before{content:"\f5a3"}.tcfa-meh::before{content:"\f11a"}.tcfa-meh-blank::before{content:"\f5a4"}.tcfa-meh-rolling-eyes::before{content:"\f5a5"}.tcfa-memory::before{content:"\f538"}.tcfa-mendeley::before{content:"\f7b3"}.tcfa-menorah::before{content:"\f676"}.tcfa-mercury::before{content:"\f223"}.tcfa-meteor::before{content:"\f753"}.tcfa-microblog::before{content:"\f91a"}.tcfa-microchip::before{content:"\f2db"}.tcfa-microphone::before{content:"\f130"}.tcfa-microphone-alt::before{content:"\f3c9"}.tcfa-microphone-alt-slash::before{content:"\f539"}.tcfa-microphone-slash::before{content:"\f131"}.tcfa-microscope::before{content:"\f610"}.tcfa-microsoft::before{content:"\f3ca"}.tcfa-minus::before{content:"\f068"}.tcfa-minus-circle::before{content:"\f056"}.tcfa-minus-square::before{content:"\f146"}.tcfa-mitten::before{content:"\f7b5"}.tcfa-mix::before{content:"\f3cb"}.tcfa-mixcloud::before{content:"\f289"}.tcfa-mizuni::before{content:"\f3cc"}.tcfa-mobile::before{content:"\f10b"}.tcfa-mobile-alt::before{content:"\f3cd"}.tcfa-modx::before{content:"\f285"}.tcfa-monero::before{content:"\f3d0"}.tcfa-money-bill::before{content:"\f0d6"}.tcfa-money-bill-alt::before{content:"\f3d1"}.tcfa-money-bill-wave::before{content:"\f53a"}.tcfa-money-bill-wave-alt::before{content:"\f53b"}.tcfa-money-check::before{content:"\f53c"}.tcfa-money-check-alt::before{content:"\f53d"}.tcfa-monument::before{content:"\f5a6"}.tcfa-moon::before{content:"\f186"}.tcfa-mortar-pestle::before{content:"\f5a7"}.tcfa-mosque::before{content:"\f678"}.tcfa-motorcycle::before{content:"\f21c"}.tcfa-mountain::before{content:"\f6fc"}.tcfa-mouse::before{content:"\f8cc"}.tcfa-mouse-pointer::before{content:"\f245"}.tcfa-mug-hot::before{content:"\f7b6"}.tcfa-music::before{content:"\f001"}.tcfa-napster::before{content:"\f3d2"}.tcfa-neos::before{content:"\f612"}.tcfa-network-wired::before{content:"\f6ff"}.tcfa-neuter::before{content:"\f22c"}.tcfa-newspaper::before{content:"\f1ea"}.tcfa-nimblr::before{content:"\f5a8"}.tcfa-node::before{content:"\f419"}.tcfa-node-js::before{content:"\f3d3"}.tcfa-not-equal::before{content:"\f53e"}.tcfa-notes-medical::before{content:"\f481"}.tcfa-npm::before{content:"\f3d4"}.tcfa-ns8::before{content:"\f3d5"}.tcfa-nutritionix::before{content:"\f3d6"}.tcfa-object-group::before{content:"\f247"}.tcfa-object-ungroup::before{content:"\f248"}.tcfa-odnoklassniki::before{content:"\f263"}.tcfa-odnoklassniki-square::before{content:"\f264"}.tcfa-oil-can::before{content:"\f613"}.tcfa-old-republic::before{content:"\f510"}.tcfa-om::before{content:"\f679"}.tcfa-opencart::before{content:"\f23d"}.tcfa-openid::before{content:"\f19b"}.tcfa-opera::before{content:"\f26a"}.tcfa-optin-monster::before{content:"\f23c"}.tcfa-orcid::before{content:"\f8d2"}.tcfa-osi::before{content:"\f41a"}.tcfa-otter::before{content:"\f700"}.tcfa-outdent::before{content:"\f03b"}.tcfa-page4::before{content:"\f3d7"}.tcfa-pagelines::before{content:"\f18c"}.tcfa-pager::before{content:"\f815"}.tcfa-paint-brush::before{content:"\f1fc"}.tcfa-paint-roller::before{content:"\f5aa"}.tcfa-palette::before{content:"\f53f"}.tcfa-palfed::before{content:"\f3d8"}.tcfa-pallet::before{content:"\f482"}.tcfa-paper-plane::before{content:"\f1d8"}.tcfa-paperclip::before{content:"\f0c6"}.tcfa-parachute-box::before{content:"\f4cd"}.tcfa-paragraph::before{content:"\f1dd"}.tcfa-parking::before{content:"\f540"}.tcfa-passport::before{content:"\f5ab"}.tcfa-pastafarianism::before{content:"\f67b"}.tcfa-paste::before{content:"\f0ea"}.tcfa-patreon::before{content:"\f3d9"}.tcfa-pause::before{content:"\f04c"}.tcfa-pause-circle::before{content:"\f28b"}.tcfa-paw::before{content:"\f1b0"}.tcfa-paypal::before{content:"\f1ed"}.tcfa-peace::before{content:"\f67c"}.tcfa-pen::before{content:"\f304"}.tcfa-pen-alt::before{content:"\f305"}.tcfa-pen-fancy::before{content:"\f5ac"}.tcfa-pen-nib::before{content:"\f5ad"}.tcfa-pen-square::before{content:"\f14b"}.tcfa-pencil-alt::before{content:"\f303"}.tcfa-pencil-ruler::before{content:"\f5ae"}.tcfa-penny-arcade::before{content:"\f704"}.tcfa-people-carry::before{content:"\f4ce"}.tcfa-pepper-hot::before{content:"\f816"}.tcfa-percent::before{content:"\f295"}.tcfa-percentage::before{content:"\f541"}.tcfa-periscope::before{content:"\f3da"}.tcfa-person-booth::before{content:"\f756"}.tcfa-phabricator::before{content:"\f3db"}.tcfa-phoenix-framework::before{content:"\f3dc"}.tcfa-phoenix-squadron::before{content:"\f511"}.tcfa-phone::before{content:"\f095"}.tcfa-phone-alt::before{content:"\f879"}.tcfa-phone-slash::before{content:"\f3dd"}.tcfa-phone-square::before{content:"\f098"}.tcfa-phone-square-alt::before{content:"\f87b"}.tcfa-phone-volume::before{content:"\f2a0"}.tcfa-photo-video::before{content:"\f87c"}.tcfa-php::before{content:"\f457"}.tcfa-pied-piper::before{content:"\f2ae"}.tcfa-pied-piper-alt::before{content:"\f1a8"}.tcfa-pied-piper-hat::before{content:"\f4e5"}.tcfa-pied-piper-pp::before{content:"\f1a7"}.tcfa-pied-piper-square::before{content:"\f91e"}.tcfa-piggy-bank::before{content:"\f4d3"}.tcfa-pills::before{content:"\f484"}.tcfa-pinterest::before{content:"\f0d2"}.tcfa-pinterest-p::before{content:"\f231"}.tcfa-pinterest-square::before{content:"\f0d3"}.tcfa-pizza-slice::before{content:"\f818"}.tcfa-place-of-worship::before{content:"\f67f"}.tcfa-plane::before{content:"\f072"}.tcfa-plane-arrival::before{content:"\f5af"}.tcfa-plane-departure::before{content:"\f5b0"}.tcfa-play::before{content:"\f04b"}.tcfa-play-circle::before{content:"\f144"}.tcfa-playstation::before{content:"\f3df"}.tcfa-plug::before{content:"\f1e6"}.tcfa-plus::before{content:"\f067"}.tcfa-plus-circle::before{content:"\f055"}.tcfa-plus-square::before{content:"\f0fe"}.tcfa-podcast::before{content:"\f2ce"}.tcfa-poll::before{content:"\f681"}.tcfa-poll-h::before{content:"\f682"}.tcfa-poo::before{content:"\f2fe"}.tcfa-poo-storm::before{content:"\f75a"}.tcfa-poop::before{content:"\f619"}.tcfa-portrait::before{content:"\f3e0"}.tcfa-pound-sign::before{content:"\f154"}.tcfa-power-off::before{content:"\f011"}.tcfa-pray::before{content:"\f683"}.tcfa-praying-hands::before{content:"\f684"}.tcfa-prescription::before{content:"\f5b1"}.tcfa-prescription-bottle::before{content:"\f485"}.tcfa-prescription-bottle-alt::before{content:"\f486"}.tcfa-print::before{content:"\f02f"}.tcfa-procedures::before{content:"\f487"}.tcfa-product-hunt::before{content:"\f288"}.tcfa-project-diagram::before{content:"\f542"}.tcfa-pushed::before{content:"\f3e1"}.tcfa-puzzle-piece::before{content:"\f12e"}.tcfa-python::before{content:"\f3e2"}.tcfa-qq::before{content:"\f1d6"}.tcfa-qrcode::before{content:"\f029"}.tcfa-question::before{content:"\f128"}.tcfa-question-circle::before{content:"\f059"}.tcfa-quidditch::before{content:"\f458"}.tcfa-quinscape::before{content:"\f459"}.tcfa-quora::before{content:"\f2c4"}.tcfa-quote-left::before{content:"\f10d"}.tcfa-quote-right::before{content:"\f10e"}.tcfa-quran::before{content:"\f687"}.tcfa-r-project::before{content:"\f4f7"}.tcfa-radiation::before{content:"\f7b9"}.tcfa-radiation-alt::before{content:"\f7ba"}.tcfa-rainbow::before{content:"\f75b"}.tcfa-random::before{content:"\f074"}.tcfa-raspberry-pi::before{content:"\f7bb"}.tcfa-ravelry::before{content:"\f2d9"}.tcfa-react::before{content:"\f41b"}.tcfa-reacteurope::before{content:"\f75d"}.tcfa-readme::before{content:"\f4d5"}.tcfa-rebel::before{content:"\f1d0"}.tcfa-receipt::before{content:"\f543"}.tcfa-record-vinyl::before{content:"\f8d9"}.tcfa-recycle::before{content:"\f1b8"}.tcfa-red-river::before{content:"\f3e3"}.tcfa-reddit::before{content:"\f1a1"}.tcfa-reddit-alien::before{content:"\f281"}.tcfa-reddit-square::before{content:"\f1a2"}.tcfa-redhat::before{content:"\f7bc"}.tcfa-redo::before{content:"\f01e"}.tcfa-redo-alt::before{content:"\f2f9"}.tcfa-registered::before{content:"\f25d"}.tcfa-remove-format::before{content:"\f87d"}.tcfa-renren::before{content:"\f18b"}.tcfa-reply::before{content:"\f3e5"}.tcfa-reply-all::before{content:"\f122"}.tcfa-replyd::before{content:"\f3e6"}.tcfa-republican::before{content:"\f75e"}.tcfa-researchgate::before{content:"\f4f8"}.tcfa-resolving::before{content:"\f3e7"}.tcfa-restroom::before{content:"\f7bd"}.tcfa-retweet::before{content:"\f079"}.tcfa-rev::before{content:"\f5b2"}.tcfa-ribbon::before{content:"\f4d6"}.tcfa-ring::before{content:"\f70b"}.tcfa-road::before{content:"\f018"}.tcfa-robot::before{content:"\f544"}.tcfa-rocket::before{content:"\f135"}.tcfa-rocketchat::before{content:"\f3e8"}.tcfa-rockrms::before{content:"\f3e9"}.tcfa-route::before{content:"\f4d7"}.tcfa-rss::before{content:"\f09e"}.tcfa-rss-square::before{content:"\f143"}.tcfa-ruble-sign::before{content:"\f158"}.tcfa-ruler::before{content:"\f545"}.tcfa-ruler-combined::before{content:"\f546"}.tcfa-ruler-horizontal::before{content:"\f547"}.tcfa-ruler-vertical::before{content:"\f548"}.tcfa-running::before{content:"\f70c"}.tcfa-rupee-sign::before{content:"\f156"}.tcfa-sad-cry::before{content:"\f5b3"}.tcfa-sad-tear::before{content:"\f5b4"}.tcfa-safari::before{content:"\f267"}.tcfa-salesforce::before{content:"\f83b"}.tcfa-sass::before{content:"\f41e"}.tcfa-satellite::before{content:"\f7bf"}.tcfa-satellite-dish::before{content:"\f7c0"}.tcfa-save::before{content:"\f0c7"}.tcfa-schlix::before{content:"\f3ea"}.tcfa-school::before{content:"\f549"}.tcfa-screwdriver::before{content:"\f54a"}.tcfa-scribd::before{content:"\f28a"}.tcfa-scroll::before{content:"\f70e"}.tcfa-sd-card::before{content:"\f7c2"}.tcfa-search::before{content:"\f002"}.tcfa-search-dollar::before{content:"\f688"}.tcfa-search-location::before{content:"\f689"}.tcfa-search-minus::before{content:"\f010"}.tcfa-search-plus::before{content:"\f00e"}.tcfa-searchengin::before{content:"\f3eb"}.tcfa-seedling::before{content:"\f4d8"}.tcfa-sellcast::before{content:"\f2da"}.tcfa-sellsy::before{content:"\f213"}.tcfa-server::before{content:"\f233"}.tcfa-servicestack::before{content:"\f3ec"}.tcfa-shapes::before{content:"\f61f"}.tcfa-share::before{content:"\f064"}.tcfa-share-alt::before{content:"\f1e0"}.tcfa-share-alt-square::before{content:"\f1e1"}.tcfa-share-square::before{content:"\f14d"}.tcfa-shekel-sign::before{content:"\f20b"}.tcfa-shield-alt::before{content:"\f3ed"}.tcfa-ship::before{content:"\f21a"}.tcfa-shipping-fast::before{content:"\f48b"}.tcfa-shirtsinbulk::before{content:"\f214"}.tcfa-shoe-prints::before{content:"\f54b"}.tcfa-shopping-bag::before{content:"\f290"}.tcfa-shopping-basket::before{content:"\f291"}.tcfa-shopping-cart::before{content:"\f07a"}.tcfa-shopware::before{content:"\f5b5"}.tcfa-shower::before{content:"\f2cc"}.tcfa-shuttle-van::before{content:"\f5b6"}.tcfa-sign::before{content:"\f4d9"}.tcfa-sign-in-alt::before{content:"\f2f6"}.tcfa-sign-language::before{content:"\f2a7"}.tcfa-sign-out-alt::before{content:"\f2f5"}.tcfa-signal::before{content:"\f012"}.tcfa-signature::before{content:"\f5b7"}.tcfa-sim-card::before{content:"\f7c4"}.tcfa-simplybuilt::before{content:"\f215"}.tcfa-sistrix::before{content:"\f3ee"}.tcfa-sitemap::before{content:"\f0e8"}.tcfa-sith::before{content:"\f512"}.tcfa-skating::before{content:"\f7c5"}.tcfa-sketch::before{content:"\f7c6"}.tcfa-skiing::before{content:"\f7c9"}.tcfa-skiing-nordic::before{content:"\f7ca"}.tcfa-skull::before{content:"\f54c"}.tcfa-skull-crossbones::before{content:"\f714"}.tcfa-skyatlas::before{content:"\f216"}.tcfa-skype::before{content:"\f17e"}.tcfa-slack::before{content:"\f198"}.tcfa-slack-hash::before{content:"\f3ef"}.tcfa-slash::before{content:"\f715"}.tcfa-sleigh::before{content:"\f7cc"}.tcfa-sliders-h::before{content:"\f1de"}.tcfa-slideshare::before{content:"\f1e7"}.tcfa-smile::before{content:"\f118"}.tcfa-smile-beam::before{content:"\f5b8"}.tcfa-smile-wink::before{content:"\f4da"}.tcfa-smog::before{content:"\f75f"}.tcfa-smoking::before{content:"\f48d"}.tcfa-smoking-ban::before{content:"\f54d"}.tcfa-sms::before{content:"\f7cd"}.tcfa-snapchat::before{content:"\f2ab"}.tcfa-snapchat-ghost::before{content:"\f2ac"}.tcfa-snapchat-square::before{content:"\f2ad"}.tcfa-snowboarding::before{content:"\f7ce"}.tcfa-snowflake::before{content:"\f2dc"}.tcfa-snowman::before{content:"\f7d0"}.tcfa-snowplow::before{content:"\f7d2"}.tcfa-socks::before{content:"\f696"}.tcfa-solar-panel::before{content:"\f5ba"}.tcfa-sort::before{content:"\f0dc"}.tcfa-sort-alpha-down::before{content:"\f15d"}.tcfa-sort-alpha-down-alt::before{content:"\f881"}.tcfa-sort-alpha-up::before{content:"\f15e"}.tcfa-sort-alpha-up-alt::before{content:"\f882"}.tcfa-sort-amount-down::before{content:"\f160"}.tcfa-sort-amount-down-alt::before{content:"\f884"}.tcfa-sort-amount-up::before{content:"\f161"}.tcfa-sort-amount-up-alt::before{content:"\f885"}.tcfa-sort-down::before{content:"\f0dd"}.tcfa-sort-numeric-down::before{content:"\f162"}.tcfa-sort-numeric-down-alt::before{content:"\f886"}.tcfa-sort-numeric-up::before{content:"\f163"}.tcfa-sort-numeric-up-alt::before{content:"\f887"}.tcfa-sort-up::before{content:"\f0de"}.tcfa-soundcloud::before{content:"\f1be"}.tcfa-sourcetree::before{content:"\f7d3"}.tcfa-spa::before{content:"\f5bb"}.tcfa-space-shuttle::before{content:"\f197"}.tcfa-speakap::before{content:"\f3f3"}.tcfa-speaker-deck::before{content:"\f83c"}.tcfa-spell-check::before{content:"\f891"}.tcfa-spider::before{content:"\f717"}.tcfa-spinner::before{content:"\f110"}.tcfa-splotch::before{content:"\f5bc"}.tcfa-spotify::before{content:"\f1bc"}.tcfa-spray-can::before{content:"\f5bd"}.tcfa-square::before{content:"\f0c8"}.tcfa-square-full::before{content:"\f45c"}.tcfa-square-root-alt::before{content:"\f698"}.tcfa-squarespace::before{content:"\f5be"}.tcfa-stack-exchange::before{content:"\f18d"}.tcfa-stack-overflow::before{content:"\f16c"}.tcfa-stackpath::before{content:"\f842"}.tcfa-stamp::before{content:"\f5bf"}.tcfa-star::before{content:"\f005"}.tcfa-star-and-crescent::before{content:"\f699"}.tcfa-star-half::before{content:"\f089"}.tcfa-star-half-alt::before{content:"\f5c0"}.tcfa-star-of-david::before{content:"\f69a"}.tcfa-star-of-life::before{content:"\f621"}.tcfa-staylinked::before{content:"\f3f5"}.tcfa-steam::before{content:"\f1b6"}.tcfa-steam-square::before{content:"\f1b7"}.tcfa-steam-symbol::before{content:"\f3f6"}.tcfa-step-backward::before{content:"\f048"}.tcfa-step-forward::before{content:"\f051"}.tcfa-stethoscope::before{content:"\f0f1"}.tcfa-sticker-mule::before{content:"\f3f7"}.tcfa-sticky-note::before{content:"\f249"}.tcfa-stop::before{content:"\f04d"}.tcfa-stop-circle::before{content:"\f28d"}.tcfa-stopwatch::before{content:"\f2f2"}.tcfa-store::before{content:"\f54e"}.tcfa-store-alt::before{content:"\f54f"}.tcfa-strava::before{content:"\f428"}.tcfa-stream::before{content:"\f550"}.tcfa-street-view::before{content:"\f21d"}.tcfa-strikethrough::before{content:"\f0cc"}.tcfa-stripe::before{content:"\f429"}.tcfa-stripe-s::before{content:"\f42a"}.tcfa-stroopwafel::before{content:"\f551"}.tcfa-studiovinari::before{content:"\f3f8"}.tcfa-stumbleupon::before{content:"\f1a4"}.tcfa-stumbleupon-circle::before{content:"\f1a3"}.tcfa-subscript::before{content:"\f12c"}.tcfa-subway::before{content:"\f239"}.tcfa-suitcase::before{content:"\f0f2"}.tcfa-suitcase-rolling::before{content:"\f5c1"}.tcfa-sun::before{content:"\f185"}.tcfa-superpowers::before{content:"\f2dd"}.tcfa-superscript::before{content:"\f12b"}.tcfa-supple::before{content:"\f3f9"}.tcfa-surprise::before{content:"\f5c2"}.tcfa-suse::before{content:"\f7d6"}.tcfa-swatchbook::before{content:"\f5c3"}.tcfa-swift::before{content:"\f8e1"}.tcfa-swimmer::before{content:"\f5c4"}.tcfa-swimming-pool::before{content:"\f5c5"}.tcfa-symfony::before{content:"\f83d"}.tcfa-synagogue::before{content:"\f69b"}.tcfa-sync::before{content:"\f021"}.tcfa-sync-alt::before{content:"\f2f1"}.tcfa-syringe::before{content:"\f48e"}.tcfa-table::before{content:"\f0ce"}.tcfa-table-tennis::before{content:"\f45d"}.tcfa-tablet::before{content:"\f10a"}.tcfa-tablet-alt::before{content:"\f3fa"}.tcfa-tablets::before{content:"\f490"}.tcfa-tachometer-alt::before{content:"\f3fd"}.tcfa-tag::before{content:"\f02b"}.tcfa-tags::before{content:"\f02c"}.tcfa-tape::before{content:"\f4db"}.tcfa-tasks::before{content:"\f0ae"}.tcfa-taxi::before{content:"\f1ba"}.tcfa-teamspeak::before{content:"\f4f9"}.tcfa-teeth::before{content:"\f62e"}.tcfa-teeth-open::before{content:"\f62f"}.tcfa-telegram::before{content:"\f2c6"}.tcfa-telegram-plane::before{content:"\f3fe"}.tcfa-temperature-high::before{content:"\f769"}.tcfa-temperature-low::before{content:"\f76b"}.tcfa-tencent-weibo::before{content:"\f1d5"}.tcfa-tenge::before{content:"\f7d7"}.tcfa-terminal::before{content:"\f120"}.tcfa-text-height::before{content:"\f034"}.tcfa-text-width::before{content:"\f035"}.tcfa-th::before{content:"\f00a"}.tcfa-th-large::before{content:"\f009"}.tcfa-th-list::before{content:"\f00b"}.tcfa-the-red-yeti::before{content:"\f69d"}.tcfa-theater-masks::before{content:"\f630"}.tcfa-themeco::before{content:"\f5c6"}.tcfa-themeisle::before{content:"\f2b2"}.tcfa-thermometer::before{content:"\f491"}.tcfa-thermometer-empty::before{content:"\f2cb"}.tcfa-thermometer-full::before{content:"\f2c7"}.tcfa-thermometer-half::before{content:"\f2c9"}.tcfa-thermometer-quarter::before{content:"\f2ca"}.tcfa-thermometer-three-quarters::before{content:"\f2c8"}.tcfa-think-peaks::before{content:"\f731"}.tcfa-thumbs-down::before{content:"\f165"}.tcfa-thumbs-up::before{content:"\f164"}.tcfa-thumbtack::before{content:"\f08d"}.tcfa-ticket-alt::before{content:"\f3ff"}.tcfa-times::before{content:"\f00d"}.tcfa-times-circle::before{content:"\f057"}.tcfa-tint::before{content:"\f043"}.tcfa-tint-slash::before{content:"\f5c7"}.tcfa-tired::before{content:"\f5c8"}.tcfa-toggle-off::before{content:"\f204"}.tcfa-toggle-on::before{content:"\f205"}.tcfa-toilet::before{content:"\f7d8"}.tcfa-toilet-paper::before{content:"\f71e"}.tcfa-toolbox::before{content:"\f552"}.tcfa-tools::before{content:"\f7d9"}.tcfa-tooth::before{content:"\f5c9"}.tcfa-torah::before{content:"\f6a0"}.tcfa-torii-gate::before{content:"\f6a1"}.tcfa-tractor::before{content:"\f722"}.tcfa-trade-federation::before{content:"\f513"}.tcfa-trademark::before{content:"\f25c"}.tcfa-traffic-light::before{content:"\f637"}.tcfa-trailer::before{content:"\f941"}.tcfa-train::before{content:"\f238"}.tcfa-tram::before{content:"\f7da"}.tcfa-transgender::before{content:"\f224"}.tcfa-transgender-alt::before{content:"\f225"}.tcfa-trash::before{content:"\f1f8"}.tcfa-trash-alt::before{content:"\f2ed"}.tcfa-trash-restore::before{content:"\f829"}.tcfa-trash-restore-alt::before{content:"\f82a"}.tcfa-tree::before{content:"\f1bb"}.tcfa-trello::before{content:"\f181"}.tcfa-tripadvisor::before{content:"\f262"}.tcfa-trophy::before{content:"\f091"}.tcfa-truck::before{content:"\f0d1"}.tcfa-truck-loading::before{content:"\f4de"}.tcfa-truck-monster::before{content:"\f63b"}.tcfa-truck-moving::before{content:"\f4df"}.tcfa-truck-pickup::before{content:"\f63c"}.tcfa-tshirt::before{content:"\f553"}.tcfa-tty::before{content:"\f1e4"}.tcfa-tumblr::before{content:"\f173"}.tcfa-tumblr-square::before{content:"\f174"}.tcfa-tv::before{content:"\f26c"}.tcfa-twitch::before{content:"\f1e8"}.tcfa-twitter::before{content:"\f099"}.tcfa-twitter-square::before{content:"\f081"}.tcfa-typo3::before{content:"\f42b"}.tcfa-uber::before{content:"\f402"}.tcfa-ubuntu::before{content:"\f7df"}.tcfa-uikit::before{content:"\f403"}.tcfa-umbraco::before{content:"\f8e8"}.tcfa-umbrella::before{content:"\f0e9"}.tcfa-umbrella-beach::before{content:"\f5ca"}.tcfa-underline::before{content:"\f0cd"}.tcfa-undo::before{content:"\f0e2"}.tcfa-undo-alt::before{content:"\f2ea"}.tcfa-uniregistry::before{content:"\f404"}.tcfa-unity::before{content:"\f949"}.tcfa-universal-access::before{content:"\f29a"}.tcfa-university::before{content:"\f19c"}.tcfa-unlink::before{content:"\f127"}.tcfa-unlock::before{content:"\f09c"}.tcfa-unlock-alt::before{content:"\f13e"}.tcfa-untappd::before{content:"\f405"}.tcfa-upload::before{content:"\f093"}.tcfa-ups::before{content:"\f7e0"}.tcfa-usb::before{content:"\f287"}.tcfa-user::before{content:"\f007"}.tcfa-user-alt::before{content:"\f406"}.tcfa-user-alt-slash::before{content:"\f4fa"}.tcfa-user-astronaut::before{content:"\f4fb"}.tcfa-user-check::before{content:"\f4fc"}.tcfa-user-circle::before{content:"\f2bd"}.tcfa-user-clock::before{content:"\f4fd"}.tcfa-user-cog::before{content:"\f4fe"}.tcfa-user-edit::before{content:"\f4ff"}.tcfa-user-friends::before{content:"\f500"}.tcfa-user-graduate::before{content:"\f501"}.tcfa-user-injured::before{content:"\f728"}.tcfa-user-lock::before{content:"\f502"}.tcfa-user-md::before{content:"\f0f0"}.tcfa-user-minus::before{content:"\f503"}.tcfa-user-ninja::before{content:"\f504"}.tcfa-user-nurse::before{content:"\f82f"}.tcfa-user-plus::before{content:"\f234"}.tcfa-user-secret::before{content:"\f21b"}.tcfa-user-shield::before{content:"\f505"}.tcfa-user-slash::before{content:"\f506"}.tcfa-user-tag::before{content:"\f507"}.tcfa-user-tie::before{content:"\f508"}.tcfa-user-times::before{content:"\f235"}.tcfa-users::before{content:"\f0c0"}.tcfa-users-cog::before{content:"\f509"}.tcfa-usps::before{content:"\f7e1"}.tcfa-ussunnah::before{content:"\f407"}.tcfa-utensil-spoon::before{content:"\f2e5"}.tcfa-utensils::before{content:"\f2e7"}.tcfa-vaadin::before{content:"\f408"}.tcfa-vector-square::before{content:"\f5cb"}.tcfa-venus::before{content:"\f221"}.tcfa-venus-double::before{content:"\f226"}.tcfa-venus-mars::before{content:"\f228"}.tcfa-viacoin::before{content:"\f237"}.tcfa-viadeo::before{content:"\f2a9"}.tcfa-viadeo-square::before{content:"\f2aa"}.tcfa-vial::before{content:"\f492"}.tcfa-vials::before{content:"\f493"}.tcfa-viber::before{content:"\f409"}.tcfa-video::before{content:"\f03d"}.tcfa-video-slash::before{content:"\f4e2"}.tcfa-vihara::before{content:"\f6a7"}.tcfa-vimeo::before{content:"\f40a"}.tcfa-vimeo-square::before{content:"\f194"}.tcfa-vimeo-v::before{content:"\f27d"}.tcfa-vine::before{content:"\f1ca"}.tcfa-vk::before{content:"\f189"}.tcfa-vnv::before{content:"\f40b"}.tcfa-voicemail::before{content:"\f897"}.tcfa-volleyball-ball::before{content:"\f45f"}.tcfa-volume-down::before{content:"\f027"}.tcfa-volume-mute::before{content:"\f6a9"}.tcfa-volume-off::before{content:"\f026"}.tcfa-volume-up::before{content:"\f028"}.tcfa-vote-yea::before{content:"\f772"}.tcfa-vr-cardboard::before{content:"\f729"}.tcfa-vuejs::before{content:"\f41f"}.tcfa-walking::before{content:"\f554"}.tcfa-wallet::before{content:"\f555"}.tcfa-warehouse::before{content:"\f494"}.tcfa-water::before{content:"\f773"}.tcfa-wave-square::before{content:"\f83e"}.tcfa-waze::before{content:"\f83f"}.tcfa-weebly::before{content:"\f5cc"}.tcfa-weibo::before{content:"\f18a"}.tcfa-weight::before{content:"\f496"}.tcfa-weight-hanging::before{content:"\f5cd"}.tcfa-weixin::before{content:"\f1d7"}.tcfa-whatsapp::before{content:"\f232"}.tcfa-whatsapp-square::before{content:"\f40c"}.tcfa-wheelchair::before{content:"\f193"}.tcfa-whmcs::before{content:"\f40d"}.tcfa-wifi::before{content:"\f1eb"}.tcfa-wikipedia-w::before{content:"\f266"}.tcfa-wind::before{content:"\f72e"}.tcfa-window-close::before{content:"\f410"}.tcfa-window-maximize::before{content:"\f2d0"}.tcfa-window-minimize::before{content:"\f2d1"}.tcfa-window-restore::before{content:"\f2d2"}.tcfa-windows::before{content:"\f17a"}.tcfa-wine-bottle::before{content:"\f72f"}.tcfa-wine-glass::before{content:"\f4e3"}.tcfa-wine-glass-alt::before{content:"\f5ce"}.tcfa-wix::before{content:"\f5cf"}.tcfa-wizards-of-the-coast::before{content:"\f730"}.tcfa-wolf-pack-battalion::before{content:"\f514"}.tcfa-won-sign::before{content:"\f159"}.tcfa-wordpress::before{content:"\f19a"}.tcfa-wordpress-simple::before{content:"\f411"}.tcfa-wpbeginner::before{content:"\f297"}.tcfa-wpexplorer::before{content:"\f2de"}.tcfa-wpforms::before{content:"\f298"}.tcfa-wpressr::before{content:"\f3e4"}.tcfa-wrench::before{content:"\f0ad"}.tcfa-x-ray::before{content:"\f497"}.tcfa-xbox::before{content:"\f412"}.tcfa-xing::before{content:"\f168"}.tcfa-xing-square::before{content:"\f169"}.tcfa-y-combinator::before{content:"\f23b"}.tcfa-yahoo::before{content:"\f19e"}.tcfa-yammer::before{content:"\f840"}.tcfa-yandex::before{content:"\f413"}.tcfa-yandex-international::before{content:"\f414"}.tcfa-yarn::before{content:"\f7e3"}.tcfa-yelp::before{content:"\f1e9"}.tcfa-yen-sign::before{content:"\f157"}.tcfa-yin-yang::before{content:"\f6ad"}.tcfa-yoast::before{content:"\f2b1"}.tcfa-youtube::before{content:"\f167"}.tcfa-youtube-square::before{content:"\f431"}.tcfa-zhihu::before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:tc-fontawesome;font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:tc-fontawesome;font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.tcfa,.tcfas{font-family:tc-fontawesome,Arial,Helvetica,sans-serif !important;font-weight:900}.tcfar{font-family:tc-fontawesome,Arial,Helvetica,sans-serif !important;font-weight:400}
/*! nouislider - 15.7.1 - 6/14/2023 */.noui-target,.noui-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.noui-target{position:relative}.noui-base,.noui-connects{width:100%;height:100%;position:relative;z-index:1}.noui-connects{overflow:hidden;z-index:0}.noui-connect,.noui-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform-style:flat;transform-style:flat}.noui-txt-dir-rtl.noui-horizontal .noui-origin{left:0;right:auto}.noui-vertical .noui-origin{top:-100%;width:0}.noui-horizontal .noui-origin{height:0}.noui-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noui-touch-area{height:100%;width:100%}.noui-state-tap .noui-connect,.noui-state-tap .noui-origin{-webkit-transition:transform .3s;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.noui-state-drag *{cursor:inherit !important}.noui-horizontal{height:18px}.noui-horizontal .noui-handle{width:34px;height:28px;right:-17px;top:-6px}.noui-vertical{width:18px}.noui-vertical .noui-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noui-txt-dir-rtl.noui-horizontal .noui-handle{left:-17px;right:auto}.noui-target{background:#fafafa;border-radius:4px;border:1px solid #d3d3d3;-webkit-box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noui-connects{border-radius:3px}.noui-connect{background:#3fb8af}.noui-draggable{cursor:ew-resize}.noui-vertical .noui-draggable{cursor:ns-resize}.noui-handle{border:1px solid #d9d9d9;border-radius:3px;background:#fff;cursor:default;-webkit-box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noui-active{-webkit-box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noui-handle::before,.noui-handle::after{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.noui-handle::after{left:17px}.noui-vertical .noui-handle::before,.noui-vertical .noui-handle::after{width:14px;height:1px;left:6px;top:14px}.noui-vertical .noui-handle::after{top:17px}[disabled] .noui-connect{background:#b8b8b8}[disabled].noui-target,[disabled].noui-handle,[disabled] .noui-handle{cursor:not-allowed}.noui-pips,.noui-pips *{-webkit-box-sizing:border-box;box-sizing:border-box}.noui-pips{position:absolute;color:#999}.noui-value{position:absolute;white-space:nowrap;text-align:center}.noui-value-sub{color:#ccc;font-size:10px}.noui-marker{position:absolute;background:#ccc}.noui-marker-sub{background:#aaa}.noui-marker-large{background:#aaa}.noui-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noui-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noui-rtl .noui-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noui-marker-horizontal.noui-marker{margin-left:-1px;width:2px;height:5px}.noui-marker-horizontal.noui-marker-sub{height:10px}.noui-marker-horizontal.noui-marker-large{height:15px}.noui-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noui-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noui-rtl .noui-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noui-marker-vertical.noui-marker{width:5px;height:2px;margin-top:-1px}.noui-marker-vertical.noui-marker-sub{width:10px}.noui-marker-vertical.noui-marker-large{width:15px}.noui-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noui-horizontal .noui-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noui-vertical .noui-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noui-horizontal .noui-origin>.noui-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noui-vertical .noui-origin>.noui-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px}.tm-range-picker.noui-target{background:var(--slider-background);border-radius:4px;border:0;-webkit-box-shadow:none;box-shadow:none}.tm-range-picker .noui-connects{border-radius:3px}.tm-range-picker .noui-connect{background:var(--slider-active-background)}.tm-range-picker,.tm-range-picker .noui-handle{-webkit-box-shadow:none;box-shadow:none}.tm-range-picker .noui-tooltip{background:#3fb8af;color:#fff;border:2px solid #fff;padding:.4em;text-align:center;white-space:nowrap;border-radius:3px;font-size:1em}.tm-range-picker .noui-active .noui-tooltip{display:block}.tm-range-picker .noui-handle::before,.tm-range-picker .noui-handle::after{display:none}.noui-marker{background:var(--marker-color);opacity:.8}.noui-marker-sub{opacity:.5;background:var(--marker-color)}.noui-marker-large{opacity:1;background:var(--marker-color)}.tm-range-picker .noui-handle .noui-touch-area::before{content:"";position:absolute;top:calc(-0.5 * var(--size) + 0.5 * 1em);left:calc(-0.5 * var(--size) + 0.5 * 1em);right:calc(-0.5 * var(--size) + 0.5 * 1em);bottom:calc(-0.5 * var(--size) + 0.5 * 1em);width:var(--size);height:var(--size);border-radius:100%;background:var(--handle-background);z-index:-1;opacity:.2;will-change:transform;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:all .1s ease-out,border-color .2s ease-out;transition:all .1s ease-out,border-color .2s ease-out;display:block;--size:calc(var(--handle-size) * 1.8)}.tm-range-picker .noui-handle:hover .noui-touch-area::before{border:0;-webkit-transform:scale(0.9);transform:scale(0.9)}.tm-range-picker .noui-active.noui-handle:hover .noui-touch-area::before{border:0;-webkit-transform:scale(1);transform:scale(1)}.tm-range-picker .noui-value{position:absolute;white-space:nowrap;text-align:center;font-size:.8em;margin-top:.8em}.tm-range-picker .noui-value-sub{color:inherit;font-size:10px;margin-top:.6em;opacity:.5}.tm-range-picker .noui-marker-horizontal.noui-marker{margin-left:-1px;width:1px}.tm-range-picker{--handle-size:14px;--slider-height:3px;--handle-radius:calc(var(--handle-size) / 2);--handle-background:#3fb8af;--slider-active-background:#3fb8af;--slider-background:#cdcdcd;--marker-color:#aaa;height:var(--slider-height)}.tm-range-picker .noui-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;border:0;background:var(--handle-background);cursor:pointer;-webkit-box-shadow:none;box-shadow:none;outline:none !important;height:var(--handle-size);width:var(--handle-size);top:calc((var(--handle-size) - var(--slider-height)) / -2);right:calc(var(--handle-size) / -2);border-radius:var(--handle-radius)}
.tc-extra-product-options .tcowl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.tc-extra-product-options .tcowl-carousel .owl-stage{position:relative;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-backface-visibility:hidden;backface-visibility:hidden}.tc-extra-product-options .tcowl-carousel .owl-stage::after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.tc-extra-product-options .tcowl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.tc-extra-product-options .tcowl-carousel .owl-stage-outer,.tc-extra-product-options .tcowl-carousel .owl-nav{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tc-extra-product-options .tcowl-carousel .owl-wrapper,.tc-extra-product-options .tcowl-carousel .owl-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.tc-extra-product-options .tcowl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.tc-extra-product-options .tcowl-carousel .owl-item img{display:block;width:100%}.tc-extra-product-options .tcowl-carousel .owl-nav.disabled,.tc-extra-product-options .tcowl-carousel .owl-dots.disabled{display:none}.tc-extra-product-options .tcowl-carousel .owl-nav .owl-prev,.tc-extra-product-options .tcowl-carousel .owl-nav .owl-next,.tc-extra-product-options .tcowl-carousel .owl-dot{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-prev,.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-next,.tc-extra-product-options .tcowl-carousel button.owl-dot{background:0;color:inherit;border:0;padding:0 !important;font:inherit}.tc-extra-product-options .tcowl-carousel-show{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-extra-product-options .tm-owl-slider,.tc-extra-product-options .tcowl-carousel.owl-loaded{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-extra-product-options .tcowl-carousel.owl-loading{opacity:0;display:block}.tc-extra-product-options .tcowl-carousel.owl-hidden{opacity:0}.tc-extra-product-options .tcowl-carousel.owl-refresh .owl-item{visibility:hidden}.tc-extra-product-options .tcowl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tc-extra-product-options .tcowl-carousel.owl-grab{cursor:move;cursor:-webkit-grab;cursor:grab}.tc-extra-product-options .tcowl-carousel.owl-rtl{direction:rtl}.tc-extra-product-options .tcowl-carousel.owl-rtl .owl-item{float:right}.tc-extra-product-options .tcowl-carousel .owl-item:not(.active){visibility:hidden}.no-js .tc-extra-product-options .tcowl-carousel{display:block}.tc-extra-product-options .tcowl-carousel .animated{-webkit-animation-duration:1000ms;animation-duration:1000ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.tc-extra-product-options .tcowl-carousel .owl-animated-in{z-index:0}.tc-extra-product-options .tcowl-carousel .owl-animated-out{z-index:1}.tc-extra-product-options .tcowl-carousel .fadeout{-webkit-animation-name:fadeout;animation-name:fadeout}@-webkit-keyframes fadeout{0%{opacity:1}100%{opacity:0}}@keyframes fadeout{0%{opacity:1}100%{opacity:0}}.tc-extra-product-options .owl-height{-webkit-transition:height 500ms ease-in-out;transition:height 500ms ease-in-out}.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy{opacity:0;-webkit-transition:opacity 400ms ease;transition:opacity 400ms ease}.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy[src^=""],.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy:not([src]){max-height:0}.tc-extra-product-options .tcowl-carousel .owl-item img.owl-lazy{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.tc-extra-product-options .tcowl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.tc-extra-product-options .tcowl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 100ms ease;transition:-webkit-transform 100ms ease;transition:transform 100ms ease;transition:transform 100ms ease,-webkit-transform 100ms ease}.tc-extra-product-options .tcowl-carousel .owl-video-play-icon:hover{-webkit-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.tc-extra-product-options .tcowl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;-webkit-transition:opacity 400ms ease;transition:opacity 400ms ease}.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-tn,.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-play-icon{display:none}.tc-extra-product-options .tcowl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
.tc-extra-product-options .owl-theme .owl-nav{margin-top:10px;text-align:center;-webkit-tap-highlight-color:transparent}.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"]{color:#fff;font-size:14px;margin:5px;padding:4px 7px;background:#d6d6d6;display:inline-block;cursor:pointer;border-radius:3px}.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"]:hover{background:#869791;color:#fff;text-decoration:none}.tc-extra-product-options .owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.tc-extra-product-options .owl-theme .owl-dots{text-align:center;-webkit-tap-highlight-color:transparent}.tc-extra-product-options .owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.tc-extra-product-options .owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.tc-extra-product-options .owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#d6d6d6;display:block;-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-transition:opacity 200ms ease;transition:opacity 200ms ease;border-radius:30px}.tc-extra-product-options .owl-theme .owl-dots .owl-dot.active span,.tc-extra-product-options .owl-theme .owl-dots .owl-dot:hover span{background:#869791}
:root{--tcgaprow:15px;--tcgapcolumn:15px;--tcinnergaprow:calc(var(--tcgaprow) / 2);--tcinnergapcolumn:calc(var(--tcgapcolumn) / 2);--tcgap:var(--tcgaprow) var(--tcgapcolumn);--tcinnergap:var(--tcinnergaprow) var(--tcinnergapcolumn);--tcinlinesize:3em;--flex-items:1;--swatch-border-radius:0;--swatch-border-color:transparent;--swatch-active-border-color:inherit;--text-swatch-border-color:inherit;--text-swatch-border-width:1px;--text-swatch-active-border-width:1px;--swatch-border-width:2px;--swatch-active-border-width:2px}.tm-extra-product-options .tc-container,.tc-container{display:block;width:100%;padding:0 var(--tcgapcolumn);margin:0}.tm-extra-product-options .tc-row,.tc-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-line-pack:start;align-content:flex-start;margin:0;gap:var(--tcgap)}.tm-extra-product-options .tc-element-inner-wrap .tc-row{gap:var(--tcinnergap)}.tc-row>*,.tmcp-field-wrap-inner>*,.tc-label-wrap>*,.tm-epo-element-label>*{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.tc-section-inner-wrap>.tc-row{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-extra-product-options .tc-cell,.tc-extra-product-options .tmcp-field-wrap label.tc-cell,.tc-cell{position:relative;padding:0;min-height:1px;overflow:visible;width:100%;margin-left:0 !important;margin-right:0 !important}.tm-extra-product-options .cpf-type-dynamic .tc-cell,.tc-extra-product-options .cpf-type-dynamic .tmcp-field-wrap label.tc-cell,.cpf-type-dynamic .tc-cell,.cpf-type-dynamic.tc-cell{min-height:0}.cpf-section.tc-cell{margin:0}.cpf-section.section-disabled{display:none}.tc-container.nopadding{padding-left:0;padding-right:0}.nomargin .tc-cell{margin:0}.tc-row .cpf-section.tc-row{margin:0}.tm-extra-product-options .tc-row.tc-col-12,.tm-extra-product-options .tc-row.tc-col-12 .tc-row.tc-col-12{margin:0 -1em;min-width:100% !important;max-width:100%;overflow:visible;position:relative}.tm-extra-product-options .tc-col,.tm-extra-product-options .tc-cell.tc-col,.tc-cell.tc-col,.tc-col{-webkit-box-flex:1;-ms-flex:1 1 0;flex:1 1 0;max-width:100%}.tm-extra-product-options .tc-col-auto,.tm-extra-product-options .tc-cell.tc-col-auto,.tc-cell.tc-col-auto,.tc-col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.tm-extra-product-options .tc-col-0,.tm-extra-product-options .tc-cell.tc-col-0,.tc-cell.tc-col-0,.tc-col-0{-webkit-box-flex:0;-ms-flex:0;flex:0;max-width:0}.tm-extra-product-options .tc-col-1,.tm-extra-product-options .tc-cell.tc-col-1,.tc-cell.tc-col-1,.tc-col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3334%;flex:0 0 8.3334%;max-width:8.3334%}.tm-extra-product-options .tc-col-1-5,.tm-extra-product-options .tc-cell.tc-col-1-5,.tc-cell.tc-col-1-5,.tc-col-1-5{-webkit-box-flex:0;-ms-flex:0 0 12.5%;flex:0 0 12.5%;max-width:12.5%}.tm-extra-product-options .tc-col-2,.tm-extra-product-options .tc-cell.tc-col-2,.tc-cell.tc-col-2,.tc-col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6667%;flex:0 0 16.6667%;max-width:16.6667%}.tm-extra-product-options .tc-col-2-5,.tm-extra-product-options .tc-cell.tc-col-2-5,.tc-cell.tc-col-2-5,.tc-col-2-5{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.tm-extra-product-options .tc-col-3,.tm-extra-product-options .tc-cell.tc-col-3,.tc-cell.tc-col-3,.tc-col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.tm-extra-product-options .tc-col-4,.tm-extra-product-options .tc-cell.tc-col-4,.tc-cell.tc-col-4,.tc-col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3334%;flex:0 0 33.3334%;max-width:33.3334%}.tm-extra-product-options .tc-col-4-5,.tm-extra-product-options .tc-cell.tc-col-4-5,.tc-cell.tc-col-4-5,.tc-col-4-5{-webkit-box-flex:0;-ms-flex:0 0 37.5%;flex:0 0 37.5%;max-width:37.5%}.tm-extra-product-options .tc-col-5,.tm-extra-product-options .tc-cell.tc-col-5,.tc-cell.tc-col-5,.tc-col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6667%;flex:0 0 41.6667%;max-width:41.6667%}.tm-extra-product-options .tc-col-6,.tm-extra-product-options .tc-cell.tc-col-6,.tc-cell.tc-col-6,.tc-col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.tm-extra-product-options .tc-col-7,.tm-extra-product-options .tc-cell.tc-col-7,.tc-cell.tc-col-7,.tc-col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3334%;flex:0 0 58.3334%;max-width:58.3334%}.tm-extra-product-options .tc-col-7-5,.tm-extra-product-options .tc-cell.tc-col-7-5,.tc-cell.tc-col-7-5,.tc-col-7-5{-webkit-box-flex:0;-ms-flex:0 0 62.5%;flex:0 0 62.5%;max-width:62.5%}.tm-extra-product-options .tc-col-8,.tm-extra-product-options .tc-cell.tc-col-8,.tc-cell.tc-col-8,.tc-col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6667%;flex:0 0 66.6667%;max-width:66.6667%}.tm-extra-product-options .tc-col-9,.tm-extra-product-options .tc-cell.tc-col-9,.tc-cell.tc-col-9,.tc-col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.tm-extra-product-options .tc-col-10,.tm-extra-product-options .tc-cell.tc-col-10,.tc-cell.tc-col-10,.tc-col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3334%;flex:0 0 83.3334%;max-width:83.3334%}.tm-extra-product-options .tc-col-10-5,.tm-extra-product-options .tc-cell.tc-col-10-5,.tc-cell.tc-col-10-5,.tc-col-10-5{-webkit-box-flex:0;-ms-flex:0 0 87.5%;flex:0 0 87.5%;max-width:87.5%}.tm-extra-product-options .tc-col-11,.tm-extra-product-options .tc-cell.tc-col-11,.tc-cell.tc-col-11,.tc-col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6667%;flex:0 0 91.6667%;max-width:91.6667%}.tm-extra-product-options .tc-col-12,.tm-extra-product-options .tc-cell.tc-col-12,.tc-cell.tc-col-12,.tc-col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tcwidth{-webkit-box-flex:0;-ms-flex:0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));flex:0 0 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));max-width:calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)))}.tcwidth-1{--flex-items:100}.tcwidth-2{--flex-items:50}.tcwidth-3{--flex-items:calc(100 / 3)}.tcwidth-4{--flex-items:25}.tcwidth-5{--flex-items:20}.tcwidth-6{--flex-items:calc(100 / 6)}.tcwidth-7{--flex-items:calc(100 / 7)}.tcwidth-8{--flex-items:calc(100 / 8)}.tcwidth-9{--flex-items:calc(100 / 9)}.tcwidth-10{--flex-items:10}.tcwidth-11{--flex-items:calc(100 / 11)}.tcwidth-12{--flex-items:calc(100 / 12)}.tcwidth-12-5{--flex-items:calc(100 / 12.5%)}.tcwidth-13{--flex-items:calc(100 / 13)}.tcwidth-14{--flex-items:calc(100 / 14)}.tcwidth-15{--flex-items:calc(100 / 15)}.tcwidth-16{--flex-items:calc(100 / 16)}.tcwidth-17{--flex-items:calc(100 / 17)}.tcwidth-18{--flex-items:calc(100 / 18)}.tcwidth-19{--flex-items:calc(100 / 19)}.tcwidth-20{--flex-items:5}.tcwidth-21{--flex-items:calc(100 / 21)}.tcwidth-22{--flex-items:calc(100 / 22)}.tcwidth-23{--flex-items:calc(100 / 23)}.tcwidth-24{--flex-items:calc(100 / 24)}.tcwidth-25{--flex-items:4}.tcwidth-26{--flex-items:calc(100 / 26)}.tcwidth-27{--flex-items:calc(100 / 27)}.tcwidth-28{--flex-items:calc(100 / 28)}.tcwidth-29{--flex-items:calc(100 / 29)}.tcwidth-30{--flex-items:calc(100 / 30)}.tcwidth-31{--flex-items:calc(100 / 31)}.tcwidth-32{--flex-items:calc(100 / 32)}.tcwidth-33{--flex-items:calc(100 / 33)}.tcwidth-34{--flex-items:calc(100 / 34)}.tcwidth-35{--flex-items:calc(100 / 35)}.tcwidth-36{--flex-items:calc(100 / 36)}.tcwidth-37{--flex-items:calc(100 / 37)}.tcwidth-37-5{--flex-items:calc(100 / 37.5%)}.tcwidth-38{--flex-items:calc(100 / 38)}.tcwidth-39{--flex-items:calc(100 / 39)}.tcwidth-40{--flex-items:calc(100 / 40)}.tcwidth-41{--flex-items:calc(100 / 41)}.tcwidth-42{--flex-items:calc(100 / 42)}.tcwidth-43{--flex-items:calc(100 / 43)}.tcwidth-44{--flex-items:calc(100 / 44)}.tcwidth-45{--flex-items:calc(100 / 45)}.tcwidth-46{--flex-items:calc(100 / 46)}.tcwidth-47{--flex-items:calc(100 / 47)}.tcwidth-48{--flex-items:calc(100 / 48)}.tcwidth-49{--flex-items:calc(100 / 49)}.tcwidth-50{--flex-items:2}.tcwidth-51{--flex-items:calc(100 / 51)}.tcwidth-52{--flex-items:calc(100 / 52)}.tcwidth-53{--flex-items:calc(100 / 53)}.tcwidth-54{--flex-items:calc(100 / 54)}.tcwidth-55{--flex-items:calc(100 / 55)}.tcwidth-56{--flex-items:calc(100 / 56)}.tcwidth-57{--flex-items:calc(100 / 57)}.tcwidth-58{--flex-items:calc(100 / 58)}.tcwidth-59{--flex-items:calc(100 / 59)}.tcwidth-60{--flex-items:calc(100 / 60)}.tcwidth-61{--flex-items:calc(100 / 61)}.tcwidth-62{--flex-items:calc(100 / 62)}.tcwidth-62-5{--flex-items:calc(100 / 62.5%)}.tcwidth-63{--flex-items:calc(100 / 63)}.tcwidth-64{--flex-items:calc(100 / 64)}.tcwidth-65{--flex-items:calc(100 / 65)}.tcwidth-66{--flex-items:calc(100 / 66)}.tcwidth-67{--flex-items:calc(100 / 67)}.tcwidth-68{--flex-items:calc(100 / 68)}.tcwidth-69{--flex-items:calc(100 / 69)}.tcwidth-70{--flex-items:calc(100 / 70)}.tcwidth-71{--flex-items:calc(100 / 71)}.tcwidth-72{--flex-items:calc(100 / 72)}.tcwidth-73{--flex-items:calc(100 / 73)}.tcwidth-74{--flex-items:calc(100 / 74)}.tcwidth-75{--flex-items:calc(100 / 75)}.tcwidth-76{--flex-items:calc(100 / 76)}.tcwidth-77{--flex-items:calc(100 / 77)}.tcwidth-78{--flex-items:calc(100 / 78)}.tcwidth-79{--flex-items:calc(100 / 79)}.tcwidth-80{--flex-items:calc(100 / 80)}.tcwidth-81{--flex-items:calc(100 / 81)}.tcwidth-82{--flex-items:calc(100 / 82)}.tcwidth-83{--flex-items:calc(100 / 83)}.tcwidth-84{--flex-items:calc(100 / 84)}.tcwidth-85{--flex-items:calc(100 / 85)}.tcwidth-86{--flex-items:calc(100 / 86)}.tcwidth-87{--flex-items:calc(100 / 87)}.tcwidth-87-5{--flex-items:calc(100 / 37.5%)}.tcwidth-88{--flex-items:calc(100 / 88)}.tcwidth-89{--flex-items:calc(100 / 89)}.tcwidth-90{--flex-items:calc(100 / 90)}.tcwidth-91{--flex-items:calc(100 / 91)}.tcwidth-92{--flex-items:calc(100 / 92)}.tcwidth-93{--flex-items:calc(100 / 93)}.tcwidth-94{--flex-items:calc(100 / 94)}.tcwidth-95{--flex-items:calc(100 / 95)}.tcwidth-96{--flex-items:calc(100 / 96)}.tcwidth-97{--flex-items:calc(100 / 97)}.tcwidth-98{--flex-items:calc(100 / 98)}.tcwidth-99{--flex-items:calc(100 / 99)}.tcwidth-100{--flex-items:1}.tc-extra-product-options{visibility:hidden}.tc-extra-product-options.tc-show,.tc-extra-product-options.tc-show-override{display:block;clear:both;visibility:visible}.tc-extra-product-options.tc-show-hidden{display:block;clear:both;visibility:hidden !important}.tm-extra-product-options,.tm-extra-product-options .tm-extra-product-options-fields,.tm-extra-product-options .tc-element-container,.tm-extra-product-options .tmcp-ul-wrap,.tm-extra-product-options .tmcp-field,.tm-extra-product-options .tm-epo-field,.tm-extra-product-options li.tmcp-field-wrap,.tm-extra-product-options .tmcp-field-wrap-inner,.tm-extra-product-options .tc-cell,.tm-extra-product-options .tc-row,.tm-collapse,.tm-collapse-wrap,.tc-epo-label,.tm-show-picker-value,.tm-bsbb,.tm-bsbb-all,.tm-bsbb-all *,.tc-container,.tc-row,.tc-cell,.tm-box,.flasho,.flasho div,.tm-button,.tm-epo-style,.tc-lightbox img,.tm-extra-product-options .tc-image{-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options{max-width:100%;width:100%}.tm-extra-product-options .tmcp-ul-wrap{overflow:visible;max-width:100%;width:100%;margin-bottom:0}.tm-extra-product-options .tc-element-container{overflow:visible;margin-bottom:0}.tm-extra-product-options .tm-extra-product-options-fields,.tm-extra-product-options .tmcp-ul-wrap{clear:both;list-style:none outside none;margin:0;padding:0}.tm-extra-product-options .tc-repeater-element,.tc-repeater-delete,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:var(--tcinnergap);max-width:100%}.tc-element-container{gap:var(--tcgap);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-field-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;gap:0 var(--tcinnergapcolumn);max-width:100%;width:100%}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap{display:grid;grid-template-columns:auto auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap{grid-template-columns:1fr auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.no-price{grid-template-columns:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-price{grid-template-columns:1fr}.tm-extra-product-options .cpf-type-select .tm-epo-field-label{display:grid;grid-template-columns:auto auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul .tm-epo-field-label{grid-template-columns:1fr auto}.tm-extra-product-options .cpf-type-select li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label{grid-template-columns:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap.no-desc .tm-epo-field-label,.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap li.tmcp-field-wrap .tc-field-label-wrap.desc-inline .tm-epo-field-label{grid-template-columns:1fr}.tm-extra-product-options .tc-repeater-element,.tc-repeater-delete{-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-extra-product-options .tc-repeater-element{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-extra-product-options .tc-repeater-element .tmcp-ul-wrap{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important;-ms-flex-preferred-size:0 !important;flex-basis:0 !important;width:auto !important}.tc-repeater-delete{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-preferred-size:0;flex-basis:0;width:auto;padding:0}.tc-price-wrap{padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:calc(1ch / 2)}.tm-extra-product-options .tmcp-ul-wrap+.tmcp-ul-wrap{margin:.5em 0 0 0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap .tmcp-field-wrap-inner{width:100%;list-style:none outside none !important;position:relative;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-wrap:wrap;flex-wrap:wrap}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-radio ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-checkbox ul.tmcp-ul-wrap:not(.fullwidth-ul) li.tmcp-field-wrap .tmcp-field-wrap-inner{width:auto}.tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tmcp-field-wrap-inner .tc-price-wrap{justify-self:flex-end}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap{padding:0;margin:0}.tc-epo-element-product-li-container{width:100%;max-width:100%;overflow-x:auto;overflow-y:hidden}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap:last-child{margin:0}.tc-totals-form{clear:both;display:none;width:100%}.tc-totals-form.tc-show{display:block}.tm-epo-totals{clear:both;padding-bottom:1em;padding-top:1em}.tm-epo-totals:empty{display:none}.tc-epo-totals.hidden,.tc-extra-product-options.hidden{display:none}html .tc-extra-product-options .tc-hidden.tc-cell,.tc-hidden,.tm-hidden,.tm-extra-product-options .tc-mode-text .tc-input-wrap,.tm-extra-product-options .tc-mode-color .tc-input-wrap,.tm-extra-product-options .tc-mode-images .tc-input-wrap,.tm-extra-product-options .tc-mode-color input.use_images,.tm-extra-product-options .tc-mode-images input.use_images{display:none !important}.tm-box,.tm-collapse{border:1px solid rgba(0,0,0,0.035);background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,0.01)),color-stop(50%,rgba(0,0,0,0.01)),color-stop(50%,rgba(0,0,0,0.02)),to(rgba(0,0,0,0.01)));background-image:linear-gradient(to top,rgba(0,0,0,0.01) 0,rgba(0,0,0,0.01) 50%,rgba(0,0,0,0.02) 50%,rgba(0,0,0,0.01) 100%);margin:0;width:100%;max-width:100%}.tm-box{padding:var(--tcgap)}.tm-collapse{padding:0}.tm-extra-product-options .cpf-section.tc-cell.tm-owl-slider-section .tm-box .tc-row{padding-bottom:var(--tcgap)}.tm-arrow{cursor:pointer;height:1em;text-align:center;width:1em;display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-ordinal-group:101;-ms-flex-order:100;order:100}.tm-extra-product-options .tc-epo-label .tm-arrow{margin-left:auto}.tm-toggle{padding-right:2em;position:relative;cursor:pointer}.tm-collapse .tm-toggle{clear:both}.tc-row.tm-collapse{gap:0}.tm-collapse>.tc-cell{margin-bottom:0}.tm-collapse-wrap{float:left;padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn);overflow:visible;width:100%}.tc-totals-form dl.tm-extra-product-options-totals{margin-left:0;margin-right:0}dl.tm-extra-product-options-totals{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:1.5}dl.tm-extra-product-options-totals dt,dl.tm-extra-product-options-totals dd{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%;width:auto;text-align:unset;display:initial;border:0;padding:0}dl.tm-extra-product-options-totals dd{padding-bottom:var(--tcinnergaprow)}.tm-extra-product-options .tm-box .tm-section-label,.tm-extra-product-options .tm-collapse .tm-section-label,.tm-extra-product-options .tm-box .tc-epo-label.tm-section-label,.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label{margin:0;position:relative;border:0;outline:0;width:100%}.tm-extra-product-options .tm-collapse .tm-section-label,.tm-extra-product-options .tm-collapse .tc-epo-label.tm-section-label{padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn)}.tm-extra-product-options .tm-collapse .tm-section-description{padding:calc(var(--tcgaprow) / 2) var(--tcgapcolumn)}.tc-styled-variations{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-epo-required{color:red}.tmcp-field-wrap .tm-epo-required{position:static;left:auto;top:auto}label.tm-epo-field-label{-ms-flex-item-align:center;align-self:center;margin:0}.tc-epo-element-product-thumbnailmultiple label.tm-epo-field-label,.tc-epo-element-product-thumbnail label.tm-epo-field-label,.tc-mode-images label.tm-epo-field-label,.tc-mode-color label.tm-epo-field-label{-ms-flex-item-align:start;align-self:flex-start}.tc-left,.tc-above,.tc-top{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.tc-right,.tc-below,.tc-bottom{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.tc-first{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options ul.tm-extra-product-options-fields li::before,.tm-extra-product-options ul.tm-extra-product-options-fields li::after,.tm-extra-product-options ul.tmcp-ul-wrap li::before,.tm-extra-product-options ul.tmcp-ul-wrap li::after{display:none}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label{margin:0}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-radio .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-checkbox .tm-label{padding:0 !important;margin:0 !important;display:inline !important;vertical-align:middle}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label.tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label.tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label.tc-label{vertical-align:initial;-ms-flex-item-align:center;align-self:center}.tc-label-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;max-width:100%;gap:0 var(--tcinnergapcolumn)}.fullwidth-ul .tc-label-inner:not(.tc-mode-text .tc-label-inner){display:grid;grid-template-columns:auto auto 1fr}.fullwidth-ul .tc-label-inner.desc-inline:not(.tc-mode-text .tc-label-inner),.fullwidth-ul .tc-label-inner.no-desc:not(.tc-mode-text .tc-label-inner){grid-template-columns:auto 1fr}.tc-mode-text .tc-label-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),.tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner){-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.fullwidth-ul .tc-mode-color .tc-label-inner:not(.tc-mode-text .tc-label-inner),.fullwidth-ul .tc-mode-images .tc-label-inner:not(.tc-mode-text .tc-label-inner){-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:1fr;justify-items:center;gap:var(--tcinnergaprow) 0}.tc-mode-color .radio-image-label,.tc-mode-images .radio-image-label,.tc-mode-color .checkbox-image-label,.tc-mode-images .checkbox-image-label{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcinnergap)}.tc-label-text{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;max-width:100%;gap:0 var(--tcinnergapcolumn);-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label:empty,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label:empty,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label:empty{padding:0 !important}.tm-extra-product-options .tm-extra-product-options-field{clear:both;padding:0}.tm-extra-product-options .tm-extra-product-options-field.tc-normal-mode{margin:0 0 1em}.tm-extra-product-options .tc-active .tc-label-text,.tm-extra-product-options li.tmcp-field-wrap.tc-active .price.tc-price .amount,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap label input[type="radio"]:checked ~ .tc-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap label input[type="checkbox"]:checked ~ .tc-label{font-weight:700;background:none !important}.tc-extra-product-options .tmcp-field-wrap label,.tm-epo-variation-section .tmhexcolorimage-li-nowh label,.tm-epo-variation-section .tmhexcolorimage-li label{padding:0;float:none;max-width:100%;width:auto;overflow-wrap:break-word}.tm-extra-product-options .tmcp-field-wrap label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;min-width:0;gap:var(--tcinnergap)}.tm-extra-product-options .tmcp-field-wrap label:not(.fullwidth){-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-extra-product-options .cpf-type-variations .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-product .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-select .tmcp-field-wrap label.fullwidth>*,.tc-extra-product-options .cpf-type-selectmultiple .tmcp-field-wrap label.fullwidth select,.tc-extra-product-options .cpf-type-time .tmcp-field-wrap label.fullwidth .tm-epo-field,.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label.fullwidth .tm-epo-field,.tc-extra-product-options .cpf-type-textfield .tmcp-field-wrap label.fullwidth .tm-epo-field{width:100%}.tc-extra-product-options .cpf-type-textarea .tmcp-field-wrap label.fullwidth .tm-epo-field{width:100% !important}.tm-extra-product-options .tc-images-container .tmcp-field-wrap label,.tm-extra-product-options .tc-colors-container .tmcp-field-wrap label,.tm-epo-variation-section .tmhexcolorimage-li-nowh label,.tm-epo-variation-section .tmhexcolorimage-li label{cursor:pointer;width:100%}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-startcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startimages,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-startcolor{text-align:initial;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-endimages{text-align:initial;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tm-extra-product-options ul.tmcp-ul-wrap.tc-colors-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-images .tc-field-label-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tc-images-container li.tmcp-field-wrap.tc-mode-color .tc-field-label-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:var(--tcinnergap)}.tm-extra-product-options .tc-cell hr{margin:var(--tcgaprow) 0}.tm-extra-product-options .tm_divider{border-style:solid;border-width:1px;margin:var(--tcgaprow) 0;clear:both}.tm-extra-product-options .cpf-element .tm_divider.tc-cell{margin:var(--tcgaprow) 0}.tm-extra-product-options .tm_padding{padding:var(--tcgaprow) 0}.tm-extra-product-options .cpf-element .tm_padding.tc-cell{margin-left:var(--tcgapcolumn);margin-right:var(--tcgapcolumn)}.tm-extra-product-options textarea.tm-epo-field{height:auto;width:100%;max-width:100%}.tm-extra-product-options .tmcp-textfield.tm-epo-field{width:auto;max-width:100%}.tm-extra-product-options .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .tm-epo-field.tmcp-radio{margin:0 !important;padding:0 !important;vertical-align:middle;position:relative;width:auto;float:none;top:1px}.tm-extra-product-options .tc-epo-label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:relative;float:none;width:100%;margin-bottom:0;gap:var(--tcinnergap)}.tm-extra-product-options .tc-epo-label.tm-section-label{margin:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-section-label-text{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.float-editbox .section_popup .tm-section-label{display:none}.tm-epo-field.tmcp-select{width:100%;max-width:100%;display:initial}.tc-repeater-element .tm-epo-field.tmcp-select,.tc-repeater-element .tm-epo-field.tmcp-selectmultiple{width:100%}.tm-extra-product-options input.tm-epo-field.tmcp-upload{width:100%;font-size:inherit}.tc-extra-product-options .tmcp-field-wrap .cpf-upload-text{width:100%;display:inline-block;text-align:center}.tc-upload-preview{display:grid;margin:1em 0;width:100%;gap:1em;grid-template-columns:minmax(100px,-webkit-max-content);grid-template-columns:minmax(100px,max-content);grid-template-rows:1fr}.tc-upload-preview:empty{display:none}.tc-upload-preview.multiple{grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}.tc-upload-file{border-radius:5px;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;margin:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-upload-preview.multiple .tc-upload-file{max-height:100%;min-height:100px}.tc-upload-image{position:relative;border:1px solid;padding:2%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:5px;background:rgba(0,0,0,0.7);min-width:100%;min-height:100px}.tc-upload-preview.multiple .tc-upload-image{min-height:100%}.woocommerce .tc-upload-preview img{height:auto;max-width:100%;width:auto;border-radius:5px;border:1px solid rgba(0,0,0,0.1);padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce .tc-upload-preview.multiple img{height:96%;width:96%;-o-object-fit:scale-down;object-fit:scale-down;max-height:100%;position:absolute}.tc-file-size{position:absolute;color:#fff;font-size:.625em;top:calc(2% + 0.5078125em);left:calc(2% + 0.5078125em);background:rgba(0,0,0,0.5);padding:0 3px;z-index:1}.tc-file-ext-overlay{background:rgba(0,0,0,0.2);width:96%;height:96%;position:absolute;border-radius:5px 12px 5px 5px;-webkit-box-sizing:border-box;box-sizing:border-box;left:2%;top:2%}.tc-file-ext{position:absolute;padding:2px;background:rgba(0,0,0,0.5);color:#fff;min-width:30%;text-align:center;text-transform:uppercase;font-size:.825em}.tc-file-name{max-width:94%;position:absolute;color:#fff;background:rgba(0,0,0,0.5);bottom:0;font-size:.625em;padding:.25em .5em;text-overflow:ellipsis;overflow:hidden;max-height:2em;line-height:2}.tc-upload-remove{cursor:pointer;position:absolute;right:2%;top:2%;font-size:1em;width:1.625em;height:1.625em;font-family:inherit;line-height:inherit;margin:0;padding:0;border:0;outline:0;color:#fff;border-radius:50%;background-color:rgba(0,0,0,0.5);background-image:none;-webkit-box-shadow:0 0 0 0 hsl(0 0 100% / 0);box-shadow:0 0 0 0 hsl(0 0 100% / 0);z-index:2;-webkit-transition:all .2s ease;transition:all .2s ease}.tc-upload-remove:hover,.tc-upload-remove:focus{-webkit-box-shadow:0 0 0 .125em rgb(255 255 255 / 90%);box-shadow:0 0 0 .125em rgb(255 255 255 / 90%);background:rgba(0,0,0,0.5);color:#fff}.tc-upload-remove svg{width:100%;height:100%;font-size:inherit;-webkit-box-sizing:inherit;box-sizing:inherit;line-height:inherit}.cpf-upload-container-basic,.cpf-upload-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-max-file-size{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container-basic .cpf-upload-wrap{display:block !important;position:relative;vertical-align:middle;cursor:pointer}.tc-extra-product-options .tmcp-field-wrap label.cpf-upload-container .cpf-upload-wrap{border:1px solid;display:block !important;font-size:1em;height:auto;overflow:hidden;padding:.5em 1em;position:relative;vertical-align:middle;margin:0 .5em 0 0;cursor:pointer}.cpf-upload-container [type="file"]{cursor:inherit;display:block;font-size:.01px;min-height:100%;min-width:100%;opacity:0;position:absolute;right:0;text-align:right;top:0}.cpf-upload-container+small::before,.cpf-upload-container-basic+small::before{content:"";display:block}.tm-filename{display:block;-ms-flex-item-align:center;align-self:center}.tm-filename:empty{display:none}.tc-upload-messages{padding:var(--tcgaprow) 0}.tc-upload-message{font-size:1.2em;margin-bottom:var(--tcgap)}.tm-extra-product-options .cpf-type-range .tc-epo-label{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range{clear:both;position:relative}.tm-range-picker{margin:1em 14px;max-width:100%;width:auto;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.tm-range-picker.noui-show-tooltip{margin:calc(1em + 22px) 14px}.tm-range-picker.pips,.tm-range-picker.noui-show-tooltip.pips{margin:calc(50px - 1em) 14px 50px 14px}.tm-range-picker .noui-tooltip{line-height:1;font-size:10px}.tc-extra-product-options .tm-show-picker-left,.tc-extra-product-options .tm-show-picker-tleft,.tc-extra-product-options .tm-show-picker-right,.tc-extra-product-options .tm-show-picker-tright{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tc-extra-product-options .tm-show-picker-left .tm-range-picker,.tc-extra-product-options .tm-show-picker-tleft .tm-range-picker,.tc-extra-product-options .tm-show-picker-right .tm-range-picker,.tc-extra-product-options .tm-show-picker-tright .tm-range-picker{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value{position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;border:1px solid;border-radius:5px;padding:0 1em;display:inline-block;max-width:20%;min-width:4em;text-align:center;line-height:normal}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tc-extra-product-options .tm-show-picker-left .tc-price-wrap,.tc-extra-product-options .tm-show-picker-tleft .tc-price-wrap,.tc-extra-product-options .tm-show-picker-right .tc-price-wrap,.tc-extra-product-options .tm-show-picker-tright .tc-price-wrap{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.tm-extra-product-options .tmcp-ul-wrap.tmcp-elements.tm-extra-product-options-range .tm-range-picker-value{display:inline-block;float:right;margin-left:0;margin-top:-3px;position:absolute;right:0;text-align:center;top:1em;vertical-align:top;width:19%}input.tm-show-picker-value-edit{max-width:100%;width:4em;text-align:center;padding:0;border:1px solid;margin:0}.tm-show-picker-value-edit-wrap{-webkit-box-sizing:border-box;box-sizing:border-box}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-right .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tright .tm-show-picker-value-edit-wrap{max-width:20%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;position:relative;text-align:center;top:0;font-size:.8em;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;-ms-flex-item-align:center;align-self:center}.tc-extra-product-options .tm-show-picker-left .tm-show-picker-value-edit-wrap,.tc-extra-product-options .tm-show-picker-tleft .tm-show-picker-value-edit-wrap{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options .tc-epo-label.tm-has-undo-button{padding-right:2em}.tm-epo-reset-variation,.tm-extra-product-options .tm-epo-reset-radio{text-align:center;cursor:pointer;position:absolute;right:0;top:0;width:1em;height:1em;line-height:1;padding:.2em;border:2px solid;color:inherit;-webkit-box-sizing:content-box !important;box-sizing:content-box !important;background:rgba(255,255,255,0.8);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:10000}.round .tm-epo-reset-variation,.round .tm-epo-reset-radio{border-radius:5px}.square .tm-epo-reset-variation,.square .tm-epo-reset-radio{border-radius:0}.circle .tm-epo-reset-variation,.circle .tm-epo-reset-radio{border-radius:100%}.thinline .tm-epo-reset-variation,.thinline .tm-epo-reset-radio{border-width:1px;border-radius:0}.shadow .tm-epo-reset-variation,.shadow .tm-epo-reset-radio{border-width:1px;border-radius:0}.tm-epo-reset-variation .tcfa,.tm-epo-reset-radio .tcfa{font-size:.8em;position:relative}.tm-epo-variation-section .reset_variations{clear:both;display:block;width:100%;position:static;visibility:hidden}.tm-extra-product-options .tmcp-field-wrap .tc-price{font-size:1em !important;width:auto !important;display:inline-block !important;float:none !important;margin:0 !important;padding:0 !important}.tc-extra-product-options .tmcp-field-wrap .price.tc-price,.after-amount,.before-amount{font-size:1em !important;background:none !important}.tc-extra-product-options .tmcp-field-wrap .price.tc-price .amount{font-size:1em !important;display:inline !important;background:none !important;white-space:nowrap}.tm-extra-product-options .tmcp-field-wrap .tc-chars+.tc-price .amount{margin-left:0}.tm-extra-product-options .tc-images-container .tmcp-field-wrap .amount{margin-left:0}.tm-extra-product-options .amount.hidden,.tm-extra-product-options .tmcp-field-wrap .price.amount.hidden,.tm-extra-product-options .tmcp-field-wrap .tc-price.hidden,.tm-extra-product-options .before-amount.hidden,.tm-extra-product-options .after-amount.hidden,.tm-extra-product-options .tmperiod.hidden{display:none !important}.tm-extra-product-options .cpf-type-textarea .tmcp-field-wrap .amount,.tm-extra-product-options .cpf-type-textfield .tmcp-field-wrap .amount{margin-left:0}.tm-extra-product-options-totals .price.amount.options,.tm-extra-product-options-totals .price.amount.fees,.tm-extra-product-options-totals .price.amount.subscription-fee{font-size:1.25em}.tm-extra-product-options-totals .amount{background:0}.tm-extra-product-options-totals .amount.options,.tm-extra-product-options-totals .amount.fees,.tm-extra-product-options-totals .amount.subscription-fee{font-weight:700}.tm-extra-product-options-totals .amount.final{font-size:1.5em;font-weight:700}.tm-extra-product-options-totals .price.amount{display:inline-block !important;width:auto;margin:0}.tm-unit-price,.tm-fee-totals,.tm-final-totals,.tm-options-totals,.tm-subscription-fee{padding:0;margin:0;border:0 none;float:none}.tm-extra-product-options .tmcp-field-wrap .tc-price del{font-size:75% !important;margin:0 !important}.tm-extra-product-options .tmcp-field-wrap .price:empty{display:none !important}.tc-quantity-right .tm-quantity,.tc-quantity-left .tm-quantity{-ms-flex-item-align:center;align-self:center}.tm-extra-product-options .cpf-type-checkbox .tc-quantity-right .tm-quantity,.tm-extra-product-options .cpf-type-checkbox .tc-quantity-left .tm-quantity,.tm-extra-product-options .cpf-type-radio .tc-quantity-right .tm-quantity,.tm-extra-product-options .cpf-type-radio .tc-quantity-left .tm-quantity{-ms-flex-item-align:unset;align-self:unset}.cpf-type-textfield .tc-quantity-right .tm-quantity,.cpf-type-textfield .tc-quantity-left .tm-quantity{-ms-flex-item-align:initial;align-self:initial}.tc-quantity-wrapper{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tc-row.tc-quantity-right,.tc-row.tc-quantity-left{-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tc-quantity-right .tm-quantity,.tc-quantity-bottom .tm-quantity{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.tc-quantity-left .tm-quantity,.tc-quantity-top .tm-quantity{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-top,.tm-extra-product-options ul.tmcp-ul-wrap .tc-row.tc-quantity-bottom{-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-row.tc-quantity-top .tm-quantity,.tc-row.tc-quantity-bottom .tm-quantity{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-extra-product-options-radio .tm-quantity,.tm-extra-product-options-checkbox .tm-quantity{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-quantity input.tm-qty{margin:0;max-width:100%;min-width:3em;width:4em;text-align:center;padding:.25em;line-height:1}.tm-quantity-alt input.tm-qty-alt{margin:0;max-width:100%;min-width:50px;text-align:center;width:5em !important;font-size:100%;display:inline-block !important;padding:.358em 1em}.tc-extra-product-options .cpf-type-product .tc-epo-element-product-li-container .tc-epo-element-product-container .single_add_to_cart_product,.single_add_to_cart_product{vertical-align:baseline;float:none}.tc-row.tc-quantity-right .tc-cell,.tc-row.tc-quantity-left .tc-cell,.tm-quantity.tm-bottom{margin-bottom:0}.tm-description p:last-child{margin-bottom:0 !important}.tm-description{clear:both}.tm-section-description{margin:0}.fl-overlay{background:#f5f5f5;position:fixed;display:block;top:0;left:0;width:100%;height:100%;z-index:101000}.flasho{background:#fff;color:#000;border:1px solid #fff;left:0;position:absolute;top:0;z-index:101001;-webkit-box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);box-shadow:0 0 1px 4px rgba(0,0,0,0.1),0 0 50px 13px rgba(0,0,255,0.05);max-height:100%;border-radius:0;max-width:100%;overflow:hidden;display:grid;grid-template-rows:minmax(1em,auto) minmax(33%,1fr) minmax(1em,auto);gap:var(--tcgaprow) 0;padding:var(--tcgap)}.float-editbox{position:relative;overflow:auto;overflow-x:hidden;overflow-y:auto}.flasho .header{line-height:2;width:100%;border-bottom:1px solid #ecf0f1;padding-bottom:var(--tcgaprow)}.flasho .header h3{color:#63728b;font-size:22px;font-weight:400;line-height:28px;margin:0;letter-spacing:1px}.flasho .footer{margin:0;padding:0;text-align:right}.flasho .footer .inner{border-top:1px solid #ecf0f1;padding-top:var(--tcgaprow)}.tm-section-pop{display:none}.tm-section-pop-up{height:80%;left:10% !important;position:fixed !important;top:10% !important;width:80%}#tm-section-pop-up>.tc-epo-label.tm-section-label{display:none}.tm-section-pop-up.single .tc-cell.section_popup{width:100% !important;max-width:100%;--flex-items:1 !important}.tm-section-pop-up.single .tc-cell.section_popup .tm-section-pop{padding-top:1em;padding-bottom:1em}.tm-extra-product-options.tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel,.tc-extra-product-options .tm-section-pop-up.single .footer .inner .tm-button.button.button-secondary.button-large.floatbox-cancel{float:none}.noanimated{-webkit-animation-fill-mode:none !important;animation-fill-mode:none !important;opacity:1 !important;z-index:auto !important;position:static !important;-webkit-transform:none !important;transform:none !important}.tm-floating-box{width:auto;height:auto;padding:1em;position:fixed;right:0;top:0;bottom:0;left:0;background:rgba(255,255,255,0.99);z-index:99999;max-height:100%;overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:20vw;gap:var(--tcgap);line-height:normal;border:2px solid rgba(0,0,0,0.05)}.tm-floating-box .tc-row,.tm-floating-box .tm-extra-product-options-totals{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tm-floating-box.right{left:auto;right:0}.tm-floating-box.left{right:auto;left:0}.tm-floating-box.bottom{bottom:0;top:auto}.tm-floating-box.top{top:0;bottom:auto}.tm-fb{font-size:12px;line-height:18px;max-height:200px;max-width:100%;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;gap:0}.tm-fb dt{margin:0;padding:0;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-fb dd{margin:0 0 var(--tcinnergaprow) 0;padding:0;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-fb-title{font-weight:700}.tm-fb-value{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcinnergap);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tm-fb-value>*{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.tm-floating-box-alt .tm-floating-box{background:0;padding:0;position:static;max-width:100%;border:0}.tm-floating-box-nks .tm-floating-box{bottom:0 !important;left:0 !important;padding:5%;position:absolute !important;right:0 !important;top:0 !important;width:100%}.tm-floating-box-nks .tm-fb{max-height:90% !important;max-width:90% !important}.tc-row.tm-fb-labels{border-bottom:1px solid;font-weight:700;margin-bottom:1.65em;padding:0 0 1em 0}.tc-row.tm-fb-labels .tm-fb-price,.tc-row.tm-fb-data .tm-fb-price{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tc-row.tm-fb-labels .tm-fb-quantity,.tc-row.tm-fb-data .tm-fb-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-img-floating .tmhexcolorimage.tc-center .tc-image,.tc-img-floating .tc-image{max-width:calc(var(--tcinlinesize) * 2) !important;margin:0;max-height:calc(var(--tcinlinesize) * 2) !important;-webkit-box-shadow:none;box-shadow:none}.tc-img-floating .tmhexcolorimage.tc-center .tc-image{padding-top:calc((var(--tcinlinesize) * 2) - (2px * 2)) !important}.tc-img-floating .tm-transparent-swatch .tc-image{border-style:dotted;border-color:inherit}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap label.tm-error,.tm-extra-product-options ul.tmcp-ul-wrap+.tm-error,.tm-extra-product-options .tc-element-container>.tm-error{color:red;display:block !important;font-size:80%;font-weight:700;padding:0 !important;margin:1em 0 !important}.tm-extra-product-options .tc-cell.tm-error{color:red;display:block;font-size:80%;font-weight:700;margin:1em 0 !important}.tm-epo-field.tmcp-textfield.tm-error,.tm-epo-field.tmcp-textarea.tm-error{border:1px solid #c0392b;color:#e74c3c;outline:0}.tc-transition{-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}.tc-lightbox{background:rgba(0,0,0,0.5) none repeat scroll 0 0;height:auto !important;left:50% !important;max-height:100% !important;max-width:100% !important;position:fixed;text-align:center;top:50% !important;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);width:auto !important;z-index:100100;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;display:block;padding:0}.tc-lightbox-image-wrap{position:relative}.tc-lightbox-wrap{position:absolute;right:0;bottom:0;width:1em;height:1em;left:auto;top:auto;font-size:1.5em}.tc-lightbox-button{background:rgba(0,0,0,0.2) none repeat scroll 0 0;top:0;color:#fff;font-size:1em !important;padding:0;position:absolute;right:0;z-index:2;opacity:.5;cursor:-webkit-zoom-in;cursor:zoom-in;margin:auto;bottom:0;left:0}.circle .tc-lightbox-button{border-radius:100%}.round .tc-lightbox-button{border-radius:5px}.tc-lightbox-wrap:hover .tc-lightbox-button{opacity:1}.tc-lightbox img{border:0 none;cursor:-webkit-zoom-out;cursor:zoom-out;display:block;height:auto;line-height:0;margin:0;padding:0;position:relative;width:auto}.tc-lightbox-button-close{background:rgba(255,255,255,0.3) none repeat scroll 0 0;color:#000 !important;float:left;height:2em;line-height:2;position:absolute;right:0;text-align:center;top:0;width:2em;z-index:2;cursor:pointer}@-webkit-keyframes tc-lightbox-zoomin{0%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}50%{opacity:1}}@keyframes tc-lightbox-zoomin{0%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}50%{opacity:1}}.tc-lightbox-zoomin{-webkit-animation-name:tc-lightbox-zoomin;animation-name:tc-lightbox-zoomin}@-webkit-keyframes tc-lightbox-zoomout{0%{opacity:1;-webkit-transform:translateX(-50%) translateY(-50%) scale(1);transform:translateX(-50%) translateY(-50%) scale(1)}50%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}100%{opacity:0}}@keyframes tc-lightbox-zoomout{0%{opacity:1;-webkit-transform:translateX(-50%) translateY(-50%) scale(1);transform:translateX(-50%) translateY(-50%) scale(1)}50%{opacity:0;-webkit-transform:translateX(-50%) translateY(-50%) scale(0.3);transform:translateX(-50%) translateY(-50%) scale(0.3)}100%{opacity:0}}.tc-lightbox-zoomout{-webkit-animation-name:tc-lightbox-zoomout;animation-name:tc-lightbox-zoomout}.tm-static{position:static}.tmcp-date-select{max-width:100%}.tm-epo-field.tmcp-date{min-height:2.5em !important;height:auto}.tc-extra-product-options .cpf-type-date .tmcp-field-wrap label:not(.fullwidth) .tm-epo-field.tmcp-date{width:auto !important}.tm-epo-datepicker-label-container,.tm-epo-timepicker-label-container{display:inline-block !important;vertical-align:baseline;position:relative;max-width:100%}.tm-extra-product-options .tm-epo-datepicker,.tm-extra-product-options .tm-epo-timepicker{display:inline-block !important;line-height:normal !important;margin:0 !important;max-width:100% !important;padding-right:2.5em !important;-webkit-box-shadow:none;box-shadow:none}.tc-epo-label.tc-left+.tc-element-container .tm-epo-datepicker-label-container,.tc-epo-label.tc-right+.tc-element-container .tm-epo-datepicker-label-container{margin-top:0}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger{font-family:tc-fontawesome,sans-serif !important;-webkit-box-shadow:none;box-shadow:none;border-radius:0;background:transparent none repeat scroll 0 0 !important;border-width:0;color:inherit !important;cursor:pointer;display:inline-block;font-size:inherit !important;line-height:inherit !important;margin:0;padding:0 !important;position:absolute;right:0;top:0;height:100% !important}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:hover,.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:active,.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger:focus,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:hover,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:active,.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger:focus{background:none repeat scroll 0 0 transparent;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger::before{content:"\f073";padding:calc(0.75em - 2px);border-width:0 0 0 1px;border-style:solid}.tm-extra-product-options .tm-extra-product-options-time .ui-tm-datepicker-trigger::before{content:"\f017";padding:calc(0.75em - 2px);border-width:0 0 0 1px;border-style:solid}.tm-datepicker{margin:2px 0 0 0;z-index:101002 !important;width:auto !important;height:auto !important;padding:0}.tm-datepicker a{text-decoration:none}.tm-ui-dp,.tm-ui-dp-overlay{-webkit-tap-highlight-color:rgba(0,0,0,0)}.tm-ui-dp-header.ui-widget-header{line-height:2;background:0;border:0 none;color:inherit;font-weight:700}.tm-ui-dp{max-width:98%;position:absolute;top:0;left:0;z-index:2;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tm-ui-dp:focus{outline:0}.tm-ui-dp-container{min-width:300px;overflow:hidden;text-align:center;font-size:16px}.tm-datepicker-small .tm-ui-dp-container{font-size:12px;min-width:240px}.tm-datepicker-medium .tm-ui-dp-container{font-size:16px;min-width:330px}.tm-datepicker-large .tm-ui-dp-container{font-size:20px;min-width:400px}.tm-datepicker.tm-datepicker-top .tm-ui-dp-title,.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-title{font-size:1.125em}.tm-datepicker.tm-datepicker-bottom .tm-ui-dp-container,.tm-datepicker.tm-datepicker-top .tm-ui-dp-container{min-width:100% !important}.tm-ui-dp-wrap,.tm-ui-dp-overlay{width:100%;height:100%;position:absolute;top:0;left:0}.tm-ui-dp-wrap{z-index:99998}.tm-ui-dp-overlay{z-index:1;background:rgba(0,0,0,0.7)}.tm-datepicker-top .tm-ui-dp,.tm-datepicker-bottom .tm-ui-dp{width:100%;max-width:100%}.tm-ui-dp-main-cell-inner{position:relative;height:100%;overflow:hidden;text-overflow:ellipsis}.tm-ui-dp-main-wrap{-webkit-backface-visibility:hidden;backface-visibility:hidden}.tm-ui-dp-ui{display:inline-block;vertical-align:middle;width:100%}.tm-ui-dp-main{width:auto}.tm-ui-dp-main table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;margin:0;background:0;border:0}.tm-ui-dp-main-table{height:100%;width:100%;display:table;table-layout:fixed}.tm-ui-dp-main-row{white-space:nowrap;display:table-row}.tm-ui-dp-main-cell{line-height:1.875;text-align:center;width:14.2857%;height:16.6666%;position:relative;display:table-cell;vertical-align:middle;cursor:pointer}.tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-dp-main-cell.ui-state-disabled{cursor:default}.tm-ui-dp-main-cell .tm-ui-dp-main-cell-inner{overflow:visible}.tm-ui-dp-main-cell-content{position:relative;z-index:2;padding:5px}.tm-datepicker .tm-ui-dp-main-wrap{padding:.5em}.tm-datepicker .tm-ui-dp-main-header th{font-size:.6875em;font-weight:400;line-height:2.225;text-align:center;border:0}.tm-datepicker .tm-ui-dp-main-cell-content{font-size:.8125em}.tm-ui-dp-inner-container,.tm-ui-dp-main-wrap,.tm-ui-dp-main-content{position:relative}.tm-datepicker.tm-datepicker-bottom,.tm-datepicker.tm-datepicker-top{bottom:0 !important;height:100% !important;left:0 !important;position:fixed !important;right:0 !important;top:0 !important;width:100% !important;margin:0 !important;background:transparent !important;border:0 none !important}.tm-datepicker.tm-datepicker-bottom .tm-ui-dp{bottom:0;top:auto}.tm-datepicker.tm-datepicker-top .tm-ui-dp{top:0;bottom:auto}.tm-datepicker .ui-tm-datepicker-prev,.tm-datepicker .ui-tm-datepicker-next,.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-prev,.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-prev,.tm-datepicker.tm-datepicker-bottom .ui-tm-datepicker-next,.tm-datepicker.tm-datepicker-top .ui-tm-datepicker-next{display:none !important}.tm-ui-dp-title{position:relative;font-size:1em}.tm-ui-dp-title .tm-ui-dp-month,.tm-ui-dp-title .tm-ui-dp-year{display:block;overflow:hidden;text-overflow:ellipsis;margin:0 2em;white-space:nowrap}.tm-ui-dp-title-button{width:50%;display:inline-block;white-space:nowrap;vertical-align:top;position:relative;height:2em}.tm-ui-dp-button-prev{left:0}.tm-ui-dp-button-next{right:0}.tm-ui-dp-button{margin:0;position:absolute;top:0;width:2em;overflow:hidden;display:block;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;vertical-align:top;height:2em;line-height:2;color:#4eccc4;text-transform:uppercase;padding:0}.tm-ui-dp-button .tm-ui-dp-button-arrow,.tm-ui-dp-month,.tm-ui-dp-year{cursor:pointer}.tm-datepicker .tm-ui-dp-button-arrow{color:#4eccc4;font-size:1em;line-height:2;overflow:hidden;width:2em}.tm-ui-dp-button-arrow::before{display:block}.tm-ui-dp-buttonpane{display:block;overflow:hidden;padding:0 .5em .5em;text-align:right;width:100%}.tm-ui-dp-btn-wrap{display:block;float:right;position:relative;vertical-align:top;z-index:5}.tm-ui-dp-btn{height:2.5em;line-height:2.5;padding:0 1em;text-transform:uppercase;cursor:pointer;display:block;overflow:hidden;text-decoration:none;text-overflow:ellipsis;vertical-align:top;white-space:nowrap}.tm-ui-dp-button-disabled{opacity:.3;cursor:default}.tm-ui-skin-epo-black .tm-ui-dp-container{font-family:Helvetica,Arial,sans-serif !important;border:1px solid #000 !important;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.2);box-shadow:0 1px 10px rgba(0,0,0,0.2);background:#000 none repeat scroll 0 0;background:rgba(0,0,0,0.9) none repeat scroll 0 0;color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell .ui-state-default{color:#ecf0f1}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default{color:#777}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover{background-color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover{background-color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-cell:hover .ui-state-default{color:#000}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default{color:#222}.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-skin-epo-black .tm-ui-dp-main-cell.ui-state-disabled{background-color:#000;background-color:rgba(255,255,255,0.02)}.tm-ui-skin-epo-black .tm-ui-dp-btn{color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-btn:hover{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-button-arrow,.tm-ui-skin-epo-black .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover{color:#1abc9c}.tm-ui-skin-epo-black .tm-ui-dp-button-arrow:hover{color:#fff}.tm-ui-skin-epo-black .tm-ui-dp-main-header{color:#1abc9c;border-bottom:1px solid #1abc9c}.tm-ui-skin-epo.tm-datepicker .tm-ui-dp-main-wrap{padding:0}.tm-ui-skin-epo .tm-ui-dp-container{font-family:Helvetica,Arial,sans-serif !important;border:1px solid #ddd !important;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.2);box-shadow:0 1px 10px rgba(0,0,0,0.2);background:#fff none repeat scroll 0 0;color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-main-cell .ui-state-default{color:#2c3e50;background:0;border:0 none}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-other-month .ui-state-default{color:#aaa}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-tm-datepicker-current-day .ui-state-default{color:#0a0}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-other-month .ui-state-default{color:#95a5a6}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover{background-color:#9b59b6}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day .ui-state-default,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-current-day:hover .ui-state-default{color:#fff}.tm-ui-skin-epo .tm-ui-dp-main-cell:hover{background-color:#ecf0f1}.tm-ui-skin-epo .tm-ui-dp-main-cell:hover .ui-state-default{color:#000}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable .ui-state-default,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled .ui-state-default{color:#eee}.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-datepicker-unselectable,.tm-ui-skin-epo .tm-ui-dp-main-cell.ui-state-disabled{background-color:#fff}.tm-ui-skin-epo .tm-ui-dp-btn{color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-btn:hover{color:#8e44ad}.tm-ui-skin-epo .tm-ui-dp-button-arrow,.tm-ui-skin-epo .tm-ui-dp-button-arrow.tm-ui-dp-button-disabled:hover{color:#2c3e50}.tm-ui-skin-epo .tm-ui-dp-button-arrow:hover{color:#34495e}.tm-ui-skin-epo .tm-ui-dp-main-header{background:#f9f9f9 none repeat scroll 0 0;border-bottom:1px solid #eee;border-top:1px solid #eee;color:#7f8c8d;padding:.25em 0}.tm-ui-skin-epo .tm-ui-dp-title{padding:.5em 0}.ui-tm-timepicker-div .tm-ui-widget-header,.ui-tm-timepicker-div .ui_tpicker_time_label,.tm-timepicker .tm-ui-dp-current{display:none}.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle{border-radius:100%;background:#ecf0f1;border:1px solid #bdc3c7;cursor:default;height:1.2em;position:absolute;width:1.2em;z-index:2}.tm-timepicker .ui-tm-timepicker-div .ui-slider-handle.ui-state-hover{background:#fff}.ui-tm-timepicker-div .ui-slider{position:relative}.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal{border-color:#aaa;-o-border-image:none;border-image:none;border-radius:0;border-style:solid;border-width:0 0 1px;height:1px;margin:1em 0;padding:.2em 0 0}.ui-tm-timepicker-div .ui-slider.ui-slider-horizontal .ui-slider-handle{margin-left:-0.6em;top:-0.3em}.ui-tm-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-tm-timepicker-div dl{text-align:left;margin:0}.ui-tm-timepicker-div dl dt{clear:left;float:left;margin:.725em 0 0;padding:0}.ui-tm-timepicker-div dl dd{display:block;margin:0 1em .5em 30%;padding:1px 0;float:none}.ui-tm-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0;border:0;margin:0;padding:0}.ui-tm-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input{background:0;color:inherit;border:0;outline:0;border-bottom:0 none;width:95%}.ui-tm-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus{border-bottom-color:#aaa}.ui-tm-timepicker-rtl{direction:rtl}.ui-tm-timepicker-rtl dl{text-align:right}.ui-tm-timepicker-rtl dl dt{float:right;clear:right}.ui-tm-timepicker-rtl dl dd{margin:0 30% .5em 1em}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine{padding-right:2px}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dt{display:none}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl{text-align:right}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_minute::before,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_second::before{content:":";display:inline-block}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_millisec::before,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine dl dd.ui_tpicker_microsec::before{content:".";display:inline-block}.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide,.ui-tm-timepicker-div.ui-tm-timepicker-oneLine .ui_tpicker_unit_hide::before{display:none}.ui-tm-timepicker-div{padding:1em 1em 0}.tm-ui-tp-title{padding:.5em 0}.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important;float:none;max-width:none;width:auto;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;gap:var(--tcgap);-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radiostart li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radioend li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-radio li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-color li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-image li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-variation-ul-text li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-checkbox li.tmcp-field-wrap,.tm-extra-product-options ul.tmcp-ul-wrap.tm-element-ul-radio li.tmcp-field-wrap{padding:0;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tm-auto-row{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:auto}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap.tm-auto-row,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap.tm-auto-row{-webkit-box-flex:0;-ms-flex:0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));flex:0 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));width:auto;max-width:calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--tcgapcolumn)));--flex-items:4}.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startcolor,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endcolor,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-startimages,.tm-extra-product-options ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap.tm-auto-row.tc-mode-endimages{width:100%}.tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--tcinnergap);-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.fullwidth-ul .tc-label-wrap{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.fullwidth-ul .tc-label-inner .tc-price-wrap{justify-self:flex-end}.fullwidth-ul .tc-mode-color .tc-label-inner .tc-price-wrap,.fullwidth-ul .tc-mode-images .tc-label-inner .tc-price-wrap{justify-self:center}.tc-input-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-mode-images .tc-label-wrap,.tc-mode-color .tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%;gap:var(--tcinnergap)}.tc-mode-images .tc-inline-description,.tc-mode-color .tc-inline-description{text-align:center}.tc-inline-description:empty{display:none}.radio-image-label,.checkbox-image-label{display:block;text-align:center;line-height:1.5;width:100%}.tc-label.tm-label .radio-image-label,.tc-label.tm-label .checkbox-image-label{display:inline;margin-right:.5em}.tc-label.tm-label .radio-image-label:empty,.tc-label.tm-label .checkbox-image-label:empty{margin-right:0}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-label-wrap{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:var(--tcinnergap)}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .fullwidth .tc-label-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .fullwidth .tc-label-wrap{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startcolor .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endcolor .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-startimages .tc-input-wrap,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-epo-style-wrapper,.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap.tc-mode-endimages .tc-input-wrap{display:none}li.tmcp-field-wrap.tm-per-row.is-separator{-webkit-box-flex:0 !important;-ms-flex:0 0 100% !important;flex:0 0 100% !important;max-width:100% !important}.tm-extra-product-options .is-separator .tc-label-wrap.tc-separator{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 0;flex:1 1 0}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.is-separator .tc-label.tc-separator-label{padding:0 !important;width:100%}.tm-extra-product-options .is-separator .tc-tooltip{-webkit-box-flex:0;-ms-flex:0 1 0;flex:0 1 0;margin:0}.tc-epo-style-wrapper+.tmhexcolorimage,.tc-epo-style-wrapper+.tc-label-wrap .tmhexcolorimage:first-child{margin:0 .5em;vertical-align:middle}.tc-epo-style-wrapper .tc-input-wrap .tm-epo-field{position:absolute !important;top:calc(var(--tc-radio-size) / 2);left:calc(var(--tc-radio-size) / 2);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0}.tc-active .tc-epo-style-wrapper .tm-epo-style::after{opacity:1}.tc-epo-style-wrapper{height:auto;width:auto;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:1em;-webkit-transform:translate(0,50%);transform:translate(0,50%);top:calc(var(--tc-radio-size) / -2);letter-spacing:0;word-spacing:0;-webkit-font-kerning:none;font-kerning:none;font-family:none;--tc-radio-size:1.5em;--tc-radio-font-size:1em}.tm-epo-style{position:relative;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:transparent none repeat scroll 0 0;border:1px solid;cursor:pointer;height:var(--tc-radio-size);line-height:1;margin:0;padding:0;width:var(--tc-radio-size);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:var(--tc-radio-font-size)}.tm-epo-style::after{content:"\f00c";background:transparent none repeat scroll 0 0;font-family:tc-fontawesome,sans-serif !important;font-weight:900;height:1em !important;opacity:0;display:inline-block !important;text-align:center !important;width:1em !important;color:inherit !important;font-size:inherit !important;bottom:auto !important;line-height:1 !important}.tc-epo-style-wrapper.tc-radio .tm-epo-style::after{content:"\f111"}.tm-epo-style:hover::after{opacity:.5}.tm-epo-style.circle,.tm-epo-style.circle2{border-radius:100%}.tm-epo-style.round,.tm-epo-style.round2{border-radius:5px}.tm-epo-style.circle2,.tm-epo-style.round2,.tm-epo-style.square2{border-width:2px}.tc-epo-style-wrapper.square .tm-epo-style::after{font-size:.6em !important}.tc-epo-style-wrapper.circle2 .tm-epo-style::after,.tc-epo-style-wrapper.round2 .tm-epo-style::after,.tc-epo-style-wrapper.square2 .tm-epo-style::after{font-size:.5em !important}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper{padding:var(--tcinnergap);gap:var(--tcgap)}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-epo-text-wrapper label{cursor:pointer;-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tc-epo-text-label-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;gap:var(--tcinnergap);-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;min-width:var(--tcinlinesize)}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-images .tmcp-field-wrap-inner,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-color .tmcp-field-wrap-inner{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-mode-text .tmcp-field-wrap-inner{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;width:auto}.tc-epo-text-wrapper input[type="checkbox"].tm-epo-field,.tc-epo-text-wrapper input[type="radio"].tm-epo-field{visibility:hidden;position:absolute;display:inline !important}.tmhexcolorimage{display:block;height:100% !important;max-height:100% !important;max-width:100% !important;width:100%}.tm-floating-box .tmhexcolorimage{min-width:50px !important;min-height:50px !important}.tm-floating-box .radio-image-label,.tm-floating-box .checkbox-image-label{text-align:initial}.tmhexcolorimage.tc-center .tc-image{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto !important;height:auto !important;padding-top:calc(100% - (2px * 2)) !important;max-width:calc(100% - (2px * 2)) !important;vertical-align:middle;-webkit-box-sizing:content-box;box-sizing:content-box;min-width:min(var(--tcinlinesize),calc(100% - (2px * 2)))}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap input.use_images+label{display:inline-block;padding:0 !important;max-width:100%;border:0 solid;position:relative;line-height:0;margin:0 !important;height:auto !important;background:none !important}.tc-image{border-width:2px;border-style:solid;border-color:transparent;display:-webkit-box;display:-ms-flexbox;display:flex;margin:auto;padding:0;pointer-events:none !important;height:auto;max-width:100%}.tm-extra-product-options .tc-active .tc-image{border-style:solid}.tc-image.tc-image-inline,.tc-image-inline{position:relative;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background:transparent none repeat scroll 0 0;border:2px solid transparent;cursor:pointer;height:var(--tcinlinesize);line-height:1;margin:0;padding:0;width:auto;min-width:var(--tcinlinesize);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1em}.tc-epo-style-space::after{content:"\00a0";display:inline;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;margin-left:calc(-1ch / 2);font-family:sans-serif}.tc-center .tc-epo-style-space::after{display:none}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tmhexcolorimage-inline{width:auto !important;padding:0 !important;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;-webkit-transform:translate(0,50%);transform:translate(0,50%);top:calc(var(--tcinlinesize) / -2);position:relative;height:auto !important;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:1em}.tm-extra-product-options ul.tmcp-elements li.tmcp-field-wrap .tc-image-inline{max-height:var(--tcinlinesize) !important;-ms-flex-item-align:start;align-self:flex-start;-ms-flex-negative:0;flex-shrink:0}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text{border-style:solid;cursor:pointer;border-color:var(--text-swatch-border-color);border-width:var(--text-swatch-border-width);border-radius:var(--swatch-border-radius)}.tc-image,.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image{border-color:var(--swatch-border-color);border-width:var(--swatch-border-width);border-radius:var(--swatch-border-radius)}.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text,.tm-extra-product-options .tmcp-field-wrap.tc-active .tc-label-wrap .tc-image{border-color:var(--swatch-active-border-color);border-width:var(--swatch-active-border-width)}.tm-extra-product-options .tmcp-field-wrap.tc-active.tc-mode-text{outline-width:1px;outline-style:solid;outline-color:var(--swatch-active-border-color);border-width:var(--text-swatch-active-border-width)}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.round,.round .tc-image,.round.tc-image,.tm-extra-product-options .tmcp-field-wrap.round .tc-label-wrap .tc-image{--swatch-border-radius:5px;-webkit-box-shadow:none;box-shadow:none}.circle .tc-image,.circle.tc-image,.tm-extra-product-options .tmcp-field-wrap.circle .tc-label-wrap .tc-image{--swatch-border-radius:100%;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.circle{--swatch-border-radius:18px;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.square,.square .tc-image,.square.tc-image,.tm-extra-product-options .tmcp-field-wrap.square .tc-label-wrap .tc-image{--swatch-border-radius:0;--swatch-border-width:2px;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.shadow,.shadow .tc-image,.shadow.tc-image,.tm-extra-product-options .tmcp-field-wrap.shadow .tc-label-wrap .tc-image{--swatch-border-radius:0;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow.tc-mode-text,.tm-extra-product-options .tmcp-field-wrap.tc-active.shadow .tc-label-wrap .tc-image{-webkit-box-shadow:0 0 10px 2px rgba(0,0,0,0.5);box-shadow:0 0 10px 2px rgba(0,0,0,0.5)}.tm-extra-product-options .tmcp-field-wrap.tc-mode-text.thinline,.thinline .tc-image,.thinline.tc-image,.tm-extra-product-options .tmcp-field-wrap.thinline .tc-label-wrap .tc-image{--swatch-border-radius:0;--swatch-border-width:1px;border-style:groove;-webkit-box-shadow:none;box-shadow:none}.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tc-image.tm-transparent-swatch,.tm-transparent-swatch .tc-image,.tm-extra-product-options .tmcp-field-wrap .tc-label-wrap .tm-transparent-swatch .tc-image{border-style:dotted;border-color:inherit}.tm-extra-product-options input.use_images+label+.amount{display:block;text-align:center}.radio-image-label-inline,.checkbox-image-label-inline{display:inline}.tc-label.tm-label .radio-image-label+.tmhexcolorimage,.tc-label.tm-label .checkbox-image-label+.tmhexcolorimage{vertical-align:middle}.tm-hide-label+.radio-image-label,.tm-hide-label+*+.radio-image-label,.tm-hide-label+.checkbox-image-label,.tm-hide-label+*+.checkbox-image-label{display:none !important}.tm-extra-product-options .tmcp-ul-wrap.tm-extra-product-options-product{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tm-extra-product-options-product>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}li.tc-epo-element-product-holder{-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-epo-element-product-container-wrap:empty{margin:0}.tc-epo-element-product-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.tc-epo-element-product-container-left,.tc-epo-element-product-container-right,.tc-epo-element-product-container-full{padding:0;margin:0}.tc-epo-element-product-container-cart{display:grid;gap:var(--tcgap)}.tc-epo-element-product-container-cart>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%;margin:0 !important}.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-cart>.stock{text-align:center}.tc-extra-product-options-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-extra-product-options-inline>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tc-extra-product-options-inline:not(:has(.tc-extra-product-options)){display:none}.tc-epo-element-product-container-wrap .product-title,.tc-epo-element-product-container-wrap .product-price,.tc-epo-element-product-container-wrap .product-description,.tc-epo-element-product-container-wrap .product-meta,.tc-epo-element-product-container-wrap .tc-extra-product-options-inline{margin:0;padding:0}.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity,.cpf-type-product-thumbnailmultiple .tc-epo-element-product-container-wrap .tm-quantity-alt{max-width:none;text-align:center}.woocommerce div.product .tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity,.tm-extra-product-options .tc-epo-element-product-container-wrap .tc-epo-element-product-container-cart .tm-quantity-alt .quantity{float:none;display:inline-block !important;font-size:inherit;margin:0}.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container,.tm-extra-product-options .cpf-type-product-dropdown ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:0;margin:0;list-style:none outside none !important;position:relative}.tm-extra-product-options .cpf-type-product-radio ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tc-field-label-wrap,.tm-extra-product-options .cpf-type-product-checkbox ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner .tc-field-label-wrap{gap:var(--tcinnergap)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:var(--tcgaprow) 0;max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;list-style:none outside none !important;position:relative;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tc-epo-element-product-li-container{padding:var(--tcgap)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap label{cursor:pointer}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tm-epo-field.tmcp-radio,.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tc-epo-style-wrapper,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-epo-style-wrapper,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tm-epo-field.tmcp-checkbox,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tc-epo-style-wrapper{display:none}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important;margin:0;float:none;max-width:none;width:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap{max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;gap:0}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner{max-width:100%;-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;display:grid;grid-template-columns:1fr}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label{text-align:center}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap .tm-epo-reset-radio{right:var(--tcgapcolumn);top:var(--tcgaprow)}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap img.wp-post-image,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap img.wp-post-image{max-width:100%;height:auto;margin:0 auto;display:block;width:auto}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-label-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label .tc-label-wrap,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label .tc-label-wrap{display:block}.tm-extra-product-options .cpf-type-product-thumbnail ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>.tmcp-field-wrap-inner>label.tm-epo-field-label,.tm-extra-product-options .cpf-type-product-thumbnailmultiple ul.tmcp-ul-wrap.tm-element-ul-product>li.tmcp-field-wrap>label.tm-epo-field-label{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tc-epo-element-variable-product{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-epo-element-variable-product>*{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}table.tc-epo-element-variations{margin:0 !important}.woocommerce table.tc-epo-element-variations{margin-bottom:1em;border:0;width:100%}.woocommerce table.tc-epo-element-variations td,.woocommerce table.tc-epo-element-variations th{border:0;vertical-align:top;line-height:2}.woocommerce table.tc-epo-element-variations label{font-weight:700}.woocommerce table.tc-epo-element-variations select{max-width:100%;min-width:75%;display:inline-block;margin-right:1em}.woocommerce table.tc-epo-element-variations td.label{padding-right:1em}.woocommerce .tc-epo-element-variable-product .woocommerce-variation-description p{margin-bottom:1em}.woocommerce .tc-epo-element-variable-product .tc-epo-element-variable-reset-variations{visibility:hidden;font-size:.83em}.woocommerce .tc-epo-element-variable-product .wc-no-matching-variations{display:none}.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden,.tm-extra-product-options ul.tmcp-ul-wrap li.tmcp-field-wrap.tc-product-hidden .tmcp-field-wrap-inner{display:none}.tc-product-image{margin:0}#tm-tooltip{font-size:.875em;text-align:center;text-shadow:0 1px rgba(0,0,0,0.5);line-height:1.5;color:var(--tooltip-color);background:var(--tooltip-background-color);border-radius:5px;position:absolute;z-index:145400;padding:15px;pointer-events:none;bottom:auto !important;top:auto;left:auto;right:auto;border:1px solid var(--tooltip-border-color);--tooltip-background-color:rgba(0,0,0,0.8);--tooltip-border-color:rgba(255,255,255,0.5);--tooltip-color:#fff}#tm-tooltip p:last-child{margin-top:0;margin-bottom:0}#tm-tooltip::after{width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid var(--tooltip-background-color);content:"";position:absolute;left:50%;bottom:-9px;margin-left:-10px}#tm-tooltip::before{width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid var(--tooltip-border-color);content:"";position:absolute;left:50%;bottom:-10px;margin-left:-10px}#tm-tooltip.top::after{border-top-color:transparent;border-bottom:10px solid var(--tooltip-background-color);top:-19px;bottom:auto}#tm-tooltip.top::before{border-top-color:transparent;border-bottom:10px solid var(--tooltip-border-color);top:-20px;bottom:auto}#tm-tooltip.left::after{left:10px;margin:0}#tm-tooltip.right::after{right:10px;left:auto;margin:0}#tm-tooltip img{max-width:100%}#tm-tooltip.tc-error{--tooltip-background-color:#ff4500;--tooltip-border-color:rgba(255,255,255,0.5);--tooltip-color:#fff}.tc-tooltip{color:#2980b9;cursor:help;font-size:1em;margin:0}.tc-epo-style-space.tc-tooltip{line-height:inherit !important}.tc-icontooltipleft{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.tc-icontooltipright{-webkit-box-ordinal-group:100;-ms-flex-order:99;order:99}.woocommerce #content table.cart img.epo-option-image,.woocommerce table.cart img.epo-option-image,.woocommerce-page #content table.cart img.epo-option-image,.woocommerce-page table.cart img.epo-option-image,.epo-option-image{max-height:100px;max-width:70% !important;height:auto !important;width:auto !important;display:block}.woocommerce-mini-cart img.epo-upload-image,.woocommerce #content table.cart img.epo-upload-image,.woocommerce table.cart img.epo-upload-image,.woocommerce-page #content table.cart img.epo-upload-image,.woocommerce-page table.cart img.epo-upload-image,.epo-upload-image{max-height:none !important;max-width:70% !important;width:auto !important;height:100% !important}.woocommerce td.product-name dl.variation dt.tc-hidden-variation{margin:0}.tc-row.tm-cart-row{border-color:#eee;border-radius:0;border-style:none none dotted;border-width:0 0 1px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:var(--tcgap)}.tm-cart-row-header{font-weight:700;position:sticky;top:0;background:#fff;z-index:2}.tc-row.tm-cart-row:last-child{border:0 none}.tc-row.tm-cart-row .tc-cell.cpf-name{font-weight:700}.tc-row.tm-cart-row .tc-cell.cpf-price,.tc-row.tm-cart-row .tc-cell.cpf-total-price{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tc-row.tm-cart-row .tc-cell.cpf-quantity{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.woocommerce td.product-name dl.variation.tc-epo-metadata,.woocommerce .wc-item-meta{word-break:break-word}.woocommerce td.product-name dl.variation.tc-epo-metadata .tc-hidden-variation{display:none}.cpf-img-on-cart img{position:static !important;height:auto !important;width:auto !important;max-height:3em;-o-object-fit:cover;object-fit:cover}.cpf-data-on-cart::before{content:"\f14a";font-family:tc-fontawesome,sans-serif;font-weight:900;font-size:1em;vertical-align:middle;position:absolute}.cpf-data-on-cart>.cpf-data-value{margin:0 1.5em}.cpf-img-on-cart .cpf-data-on-cart::before{content:"";display:none}.cpf-data-on-cart{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:.5em;width:100%;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.cpf-img-on-cart{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:calc(100% - var(--tcgapcolumn));gap:var(--tcgap)}.cpf-data-on-cart:last-of-type,.cpf-img-on-cart:last-of-type{border-bottom:0;margin-bottom:0}.cpf-img-on-order{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:calc(100% - var(--tcgapcolumn));gap:var(--tcgap)}.cpf-img-on-order img{-o-object-fit:cover;object-fit:cover;display:block;width:100% !important;height:auto !important;max-width:unset !important;max-height:unset !important}.cpf-img-on-order>*{display:block}.woocommerce #content table.cart img.epo-option-image,.woocommerce table.cart img.epo-option-image,.woocommerce-page #content table.cart img.epo-option-image,.woocommerce-page table.cart img.epo-option-image,.woocommerce-mini-cart .cpf-img-on-cart .epo-option-image,.woocommerce-checkout-review-order .cpf-img-on-cart .epo-option-image,.woocommerce-order-details .cpf-img-on-cart .epo-option-image,.epo-option-image,.cpf-img-on-order>*{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.woocommerce-mini-cart .cpf-img-on-cart img{max-width:50px !important}.cpf-color-on-cart{width:1em;height:1em;display:inline-block;border:1px solid;vertical-align:middle;position:relative;top:-1px}td.product-name a.tm-cart-edit-options,.tm-cart-edit-options{display:block;font-size:.7em;font-style:italic;font-weight:700}.tm-epo-cart-option-mobile{display:none}.shop_table tbody tr.tm-epo-cart-row{height:auto}.woocommerce table.shop_table .tm-epo-cart-row td{border-top:1px dashed rgba(0,0,0,0.1)}.tm-epo-cart-option-label,.tm-epo-cart-option-value.tm-epo-cart-no-label{font-weight:700}.woocommerce table.shop_table .tm-epo-cart-row-product td{border-bottom:1px solid rgba(0,0,0,0.1)}.woocommerce table.shop_table .tm-epo-cart-row-product+.tm-epo-cart-row td{border-top:0 none}.woocommerce table.shop_table_responsive tr.tm-epo-cart-row td::before,.woocommerce-page table.shop_table_responsive tr.tm-epo-cart-row td::before{display:none !important}.tc-price-in-cart,.tc-quantity-in-cart{font-size:smaller}.tc-associated-table-product .tc-associated-table-product-indent{padding-left:2em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.tc-associated-table-product .tc-associated-table-product-price::after{font-family:tc-fontawesome,sans-serif;font-size:1em;content:"\f3be";font-weight:900;margin:0 .5em;padding:0;opacity:.3;display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.tc-associated-table-product .tc-associated-table-product-indent *{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.tc-associated-table-product-name{font-weight:700;-webkit-box-ordinal-group:2 !important;-ms-flex-order:1 !important;order:1 !important}.tm-dpd-label{display:block;font-size:80%}.tm-animated{-webkit-animation-duration:.3s;animation-duration:.3s}.tc-chars{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;font-size:x-small;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;width:100%;max-width:100%;gap:calc(1ch / 2)}.tm-button{border-radius:3px;border-style:solid;border-width:1px;cursor:pointer;display:inline-block;font-size:13px !important;margin:0;height:30px;line-height:28px !important;padding:0 12px 2px !important;text-decoration:none;white-space:nowrap;background:none repeat scroll 0 0 #f7f7f7;border-color:#ccc;-webkit-box-shadow:0 1px 0 #fff inset,0 1px 0 rgba(0,0,0,0.08);box-shadow:0 1px 0 #fff inset,0 1px 0 rgba(0,0,0,0.08);color:#555;vertical-align:top}.tm-button:hover{background:none repeat scroll 0 0 #fafafa;border-color:#999;color:#222}.tc-hide-add-to-cart-button{display:none !important}.tc-clearfix::after{content:"";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}.tm-preloader-img{position:absolute !important;z-index:2;opacity:.6}button.tmicon{display:inline-block;left:auto !important;position:relative;right:auto !important;overflow:hidden;width:30px !important;height:30px !important;line-height:30px !important;font-size:14px;text-align:center;cursor:pointer;vertical-align:middle;margin:0;padding:0;-ms-flex-negative:0;flex-shrink:0;background:0;border:0;-webkit-transition:all .3s ease 0s;transition:all .3s ease 0s}button.tmicon.delete{color:#ff4500;border-radius:100%}button.tmicon.delete:hover{color:#fff;background:#ff4500}.pointereventsoff{pointer-events:none}.tm-hide{visibility:hidden !important;padding:0 !important;height:0 !important;width:0 !important;margin:0 !important;min-height:0 !important;min-width:0 !important;opacity:0 !important}.tm-show{display:block !important}.tm-extra-product-options .tc-row.tm-show,.tc-row.tm-show{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}@-webkit-keyframes appear{0%{opacity:0}100%{opacity:1}}@keyframes appear{0%{opacity:0}100%{opacity:1}}.appear{-webkit-animation-name:appear;animation-name:appear}.tc-tabs{width:100%}.tc-tabs.tc-cell{margin-bottom:0}.has-scroll-arrows.tc-tab-headers{padding:0;max-width:calc(100% - 4em - 1px) !important;left:2em}.tc-tabs-wrap .tc-row .tc-cell:last-of-type{margin-bottom:0}.tc-tab-headers-wrap{position:relative}.tc-scroll-left-arrow,.tc-scroll-right-arrow{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;cursor:pointer;padding:0;line-height:1;width:1em;text-align:center;height:100%;top:0;z-index:2}.tc-scroll-left-arrow.scroll-arrow-show,.tc-scroll-right-arrow.scroll-arrow-show{display:block;border:1px solid;height:100%;width:calc(2em + 1px);-webkit-box-sizing:border-box;box-sizing:border-box}.tc-scroll-left-arrow{left:0}.tc-scroll-right-arrow{right:0}.tc-scroll-left-arrow::before,.tc-scroll-right-arrow::before{line-height:1;-webkit-transform:translateY(-50%);transform:translateY(-50%);top:50%;padding:0;margin:0;position:absolute;left:0;right:0}.tc-scroll-left-arrow::before{content:"\25C0"}.tc-scroll-right-arrow::before{content:"\25B6"}.tc-tab-headers{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-ms-flex-line-pack:center;align-content:center;gap:1em;margin:0;padding:0;overflow:hidden !important;position:relative;width:100%;min-height:1px}.tab-header{font-weight:400;cursor:pointer;white-space:nowrap;padding:var(--tcgap);position:relative;margin:0}.tab-header.open{border-width:1px 1px 0 1px;border-style:solid}.tab-header.open::before,.tab-header.open::after{content:"";display:block;position:absolute;border-bottom:1px solid;bottom:0;height:0;width:999em;-webkit-box-sizing:border-box;box-sizing:border-box}.tab-header.open::before{right:100%}.tab-header.open::after{left:100%}.tc-tab-content.tcwidth-100{padding:var(--tcgap);border-width:0 1px 1px 1px;border-style:solid}.tc-tab-header{-ms-flex-negative:0;flex-shrink:0}.tab-header.open,.tab-header.open:focus{font-weight:700}.tc-extra-product-options .sbHolder .sbSelector{background-color:#fff;height:35px;padding:5px 10px}.tc-images-container .replaced-checkboxes+label::before,.tc-images-container .replaced-radio-buttons+label::before,.replaced-checkboxes+label.tm-epo-style::before,.replaced-radio-buttons+label.tm-epo-style::before{display:none}body[data-form-style="minimal"] .tc-extra-product-options .minimal-form-input label{pointer-events:auto !important}.has-options .quick-shop-wrapper .woocommerce-variation-add-to-cart{display:block !important;width:100%;max-width:100%;padding:0;margin:0}.thb-product-main-row .summary form.cart,.woocommerce .oxy-woo-element div.product.tm-has-options .woocommerce-variation-add-to-cart,.tm-has-options .fullwidth-button .cart:not(.variations_form),.tm-has-options .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,.single-product div.product.tm-has-options form.cart,.single-product div.product.tm-has-options .single-button-wrapper,.single-product div.product.tm-has-options .entry-summary form.cart:not(.variations_form):not(.grouped_form),.single-product div.product.tm-has-options .variations_button,.woocommerce div.product.elementor.tm-has-options form.cart.variations_form .woocommerce-variation-add-to-cart,.woocommerce div.product.elementor.tm-has-options form.cart:not(.grouped_form):not(.variations_form),.woocommerce .oxy-woo-element div.product.tm-variations-only .woocommerce-variation-add-to-cart,.tm-variations-only .fullwidth-button .cart:not(.variations_form),.tm-variations-only .fullwidth-button .woocommerce-variation-add-to-cart.variations_button,.single-product div.product.tm-variations-only form.cart,.single-product div.product.tm-variations-only .single-button-wrapper,.single-product div.product.tm-variations-only .entry-summary form.cart:not(.variations_form):not(.grouped_form),.single-product div.product.tm-variations-only .variations_button,.woocommerce div.product.elementor.tm-variations-only form.cart.variations_form .woocommerce-variation-add-to-cart,.woocommerce div.product.elementor.tm-variations-only form.cart:not(.grouped_form):not(.variations_form){-ms-flex-wrap:wrap !important;flex-wrap:wrap !important;max-width:100%}
.epo.sp-container,.sp-replacer.epo,.epo .sp-preview,.sp-dragger,.sp-slider,.sp-alpha,.sp-clear,.sp-alpha-handle,.epo.sp-container.sp-dragging .sp-input,.epo.sp-container button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font:inherit}.sp-original-input-container{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.sp-original-input-container input{margin:0 !important}.sp-original-input-container .sp-add-on{width:40px;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}input.spectrum.with-add-on{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.sp-original-input-container .sp-add-on .sp-colorize{height:100%;width:100%;border-radius:inherit}.sp-colorize-container{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.epo.sp-container.sp-flat{position:relative}.epo.sp-container,.epo.sp-container *{-webkit-box-sizing:content-box;box-sizing:content-box}.epo .sp-top{position:relative;width:100%;display:inline-block;margin-bottom:10px}.epo .sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}.epo .sp-color{position:absolute;top:0;left:0;bottom:0;right:20px !important}.epo .sp-hue{position:absolute;top:0;right:0;bottom:0;width:12px;height:100%;left:initial !important;background:-webkit-gradient(linear,left top,left bottom,from(#f00),color-stop(17%,#f00),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(#f00));background:linear-gradient(to bottom,#f00 0,#f00 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.epo .sp-clear-enabled .sp-hue{top:15%;height:85%}.epo .sp-fill{padding-top:80%}.epo .sp-sat,.epo .sp-val{position:absolute;top:0;left:0;right:0;bottom:0}.epo .sp-alpha-enabled .sp-top{margin-bottom:28px !important}.epo .sp-alpha-handle{position:absolute;top:-3px;cursor:pointer;height:16px;border-radius:50%;width:16px;margin-right:5px;left:-2px;right:0;background:#f9f9f9;-webkit-box-shadow:0 0 2px 0 #3a3a3a;box-shadow:0 0 2px 0 #3a3a3a}.epo .sp-alpha{display:none;position:absolute;bottom:-18px;right:0;left:0;height:10px}.epo.sp-alpha-enabled .sp-alpha{display:block}.epo.sp-alpha-enabled .sp-picker-container .sp-top{margin-bottom:26px}.epo .sp-alpha-inner{border-radius:4px}.epo .sp-clear{display:none}.epo .sp-clear.sp-clear-display{background-position:center}.epo .sp-clear-enabled .sp-clear{display:block;position:absolute;top:3px;right:0;bottom:0;cursor:pointer;left:initial;height:12px;width:12px}.epo.sp-container.sp-input-disabled .sp-input-container{display:none}.epo.sp-container.sp-buttons-disabled .sp-button-container{display:none}.epo.sp-container.sp-palette-buttons-disabled .sp-palette-button-container{display:none}.sp-palette-only .sp-picker-container{display:none}.sp-palette-disabled .sp-palette-container{display:none}.sp-initial-disabled .sp-initial{display:none}.epo .sp-sat{background-image:-webkit-gradient(linear,left top,right top,from(#fff),to(rgba(204,154,129,0)));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0));filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr="#FFFFFFFF",endColorstr="#00CC9A81")}.epo .sp-val{border-radius:4px;background-image:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(204,154,129,0)));background-image:linear-gradient(to top,#000,rgba(204,154,129,0));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00CC9A81",endColorstr="#FF000000")}.epo .sp-1{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#ffff00")}.epo .sp-2{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffff00",endColorstr="#00ff00")}.epo .sp-3{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ff00",endColorstr="#00ffff")}.epo .sp-4{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ffff",endColorstr="#0000ff")}.epo .sp-5{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#0000ff",endColorstr="#ff00ff")}.epo .sp-6{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff00ff",endColorstr="#ff0000")}.sp-hidden{display:none !important}.epo .sp-cf::before,.epo .sp-cf::after{content:"";display:table}.epo .sp-cf::after{clear:both}.epo .sp-cf{*zoom:1}@media(max-width:480px){.epo .sp-color{right:40%}.epo .sp-hue{left:63%}.epo .sp-fill{padding-top:60%}}.epo .sp-dragger{border-radius:5px;height:10px;width:10px;border:1px solid #fff;cursor:pointer;position:absolute;top:0;left:0;margin-left:3px;margin-top:3px;-webkit-box-shadow:0 0 2px 1px rgba(0,0,0,0.2);box-shadow:0 0 2px 1px rgba(0,0,0,0.2);background:0}.epo .sp-slider{position:absolute;top:0;cursor:pointer;height:16px;border-radius:50%;width:16px;left:-2px;background:#f9f9f9;-webkit-box-shadow:0 0 2px 0 #3a3a3a;box-shadow:0 0 2px 0 #3a3a3a;margin-top:8px;right:auto;border:0;opacity:1}.epo.sp-container{position:absolute;top:0;left:0;z-index:9999994;overflow:hidden;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;border:0;background-color:#fff;padding:0;border-radius:4px;color:#000;-webkit-box-shadow:0 0 0 1px rgba(99,114,130,0.16),0 8px 16px rgba(27,39,51,0.08);box-shadow:0 0 0 1px rgba(99,114,130,0.16),0 8px 16px rgba(27,39,51,0.08)}.epo.sp-container,.epo.sp-container button,.epo.sp-container input,.sp-color,.sp-hue,.sp-clear{font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.epo .sp-color,.epo .sp-hue,.epo .sp-clear,.epo .sp-val,.epo .sp-sat{border-radius:3px;border:0}.epo .sp-input-container{margin-top:-5px;float:none;width:auto}.epo .sp-input-container.sp-cf,.sp-initial.sp-thumb.sp-cf,.sp-button-container.sp-cf{height:25px}.epo .sp-picker-container .sp-cf{margin-bottom:10px}.sp-palette-row-initial>span:first-child{cursor:pointer}.epo.sp-initial-disabled .sp-input-container{width:100%}.epo .sp-input{padding:0 5px !important;margin:0;width:100%;-webkit-box-shadow:none !important;box-shadow:none !important;height:100% !important;background:transparent;color:#3a3a3a;border-radius:2px !important;border:1px solid #e0e0e0 !important;text-align:center;font-family:monospace;font-size:inherit !important}.sp-input:focus{border:1px solid #ffa600}.sp-input.sp-validation-error{border:1px solid red;background:#fdd}.epo .sp-picker-container,.sp-palette-container{position:relative;padding:10px}.epo .sp-picker-container{width:200px;padding-bottom:0;border:0;float:none;margin:0}.sp-palette-container{border-right:solid 1px #ccc}.sp-palette-only .sp-palette-container{border:0}.sp-palette .sp-thumb-el{display:block;position:relative;float:left;width:16px;height:16px;margin:3px;border:0;border-radius:3px;cursor:pointer}.sp-palette .sp-thumb-el:hover,.sp-palette .sp-thumb-el.sp-thumb-active{border-color:#ffa600}.sp-thumb-el{position:relative}.epo .sp-initial{float:left;border:0}.sp-initial span{width:30px;height:25px;border:0;display:block;float:left;margin:0}.sp-initial .spe-thumb-el.sp-thumb-active{border-radius:0 5px 5px 0}.sp-initial .spe-thumb-el{border-radius:5px 0 0 5px}.sp-initial .sp-clear-display{background-position:center}.sp-button-container{float:right}.sp-palette-button-container{margin-top:10px}.sp-replacer.epo{position:relative;overflow:hidden;cursor:pointer;display:inline-block;border-radius:3px;border:1px solid #aaa;color:#666;-webkit-transition:border-color .3s;transition:border-color .3s;vertical-align:middle;width:3.5rem;height:2rem;margin:0;padding:3px;background:#fff;-webkit-box-shadow:none;box-shadow:none}.sp-replacer.epo.sp-disabled{cursor:default;border-color:silver;color:silver}.epo .sp-dd{position:absolute;font-size:10px;right:0;top:0;bottom:0;padding:3px;line-height:calc(2rem - 5px);background-color:#fff;height:auto;float:none}.epo .sp-preview{position:relative;width:100%;height:100%;float:left;z-index:0;border:0;margin:0;padding:0}.epo .sp-preview-inner{-webkit-transition:background-color .2s;transition:background-color .2s}.epo .sp-preview-inner.sp-clear-display{display:none}.epo.sp-container button{border-radius:3px;border:0;background:transparent;line-height:1;padding:0 8px;height:25px;text-transform:capitalize;text-align:center;vertical-align:middle;cursor:pointer;color:#606c72;font-weight:700}.epo.sp-container button.sp-choose{background-color:#3cab3b;color:#fff;margin-left:5px}.epo.sp-container button:hover{opacity:.8}.epo.sp-container button.sp-palette-toggle{width:100%;background-color:#f3f3f3;margin:0}.sp-palette span:hover,.sp-palette span.sp-thumb-active{border-color:#000}.epo .sp-preview,.sp-alpha,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.epo .sp-preview-inner,.sp-alpha-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}.sp-palette .sp-thumb-inner{border-radius:3px;background-position:50% 50%;background-repeat:no-repeat}.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABe0lEQVQokYXSsUtcQRTF4d8Jj+VhHSxkEQuLsEUKK0nhTBFTmLSSUhBCMCAWsmgIwWrBLk0akfwLCaSQKBJmtrIIISwpRFKIhViETScphGMzysMtvOVwvpm5d0bGNCuGWAOPgYdl6S8wSDn9b+bUhDHEKWAdeAFMANg+l/TV9ofcz6cjMIbYBvaBMds7QCqZ58CmpBNgPuV0DvAAIMyFGugWtJr7eTv38xEwkPRPErY7QDeG2LqFkjrAgu0dSd/KDVqSNmxvAZ8lfbS9AHRuYemnLWkv5XRVBrQMbAI/gTXgEzAJtJuwBVS2L2OIle03QA/4Lmkl5XQBXEqqbFcAVYFDYChpFngiqWf7l6TXKaezMt2Zkhk24THwG+jZriX9AFZvUAyxLbRke2D75O5zPAO+ADXwEtizjaRHwDvbTyUtppwOmicCHAJvbXcl9YA1SQDjtseA97YPRz7ATcUQp2y/kjRdevsjaTfldNrMjcDGBjXA3T96L7yvrgFzP69+0Ao/HAAAAABJRU5ErkJggg==)}assets/css/nouislider.min.css000064400000016054150755142450012325 0ustar00/*! nouislider - 15.7.1 - 6/14/2023 */.noui-target,.noui-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.noui-target{position:relative}.noui-base,.noui-connects{width:100%;height:100%;position:relative;z-index:1}.noui-connects{overflow:hidden;z-index:0}.noui-connect,.noui-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform-style:flat;transform-style:flat}.noui-txt-dir-rtl.noui-horizontal .noui-origin{left:0;right:auto}.noui-vertical .noui-origin{top:-100%;width:0}.noui-horizontal .noui-origin{height:0}.noui-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noui-touch-area{height:100%;width:100%}.noui-state-tap .noui-connect,.noui-state-tap .noui-origin{-webkit-transition:transform .3s;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.noui-state-drag *{cursor:inherit !important}.noui-horizontal{height:18px}.noui-horizontal .noui-handle{width:34px;height:28px;right:-17px;top:-6px}.noui-vertical{width:18px}.noui-vertical .noui-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noui-txt-dir-rtl.noui-horizontal .noui-handle{left:-17px;right:auto}.noui-target{background:#fafafa;border-radius:4px;border:1px solid #d3d3d3;-webkit-box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #bbb}.noui-connects{border-radius:3px}.noui-connect{background:#3fb8af}.noui-draggable{cursor:ew-resize}.noui-vertical .noui-draggable{cursor:ns-resize}.noui-handle{border:1px solid #d9d9d9;border-radius:3px;background:#fff;cursor:default;-webkit-box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ebebeb,0 3px 6px -3px #bbb}.noui-active{-webkit-box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb;box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noui-handle::before,.noui-handle::after{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.noui-handle::after{left:17px}.noui-vertical .noui-handle::before,.noui-vertical .noui-handle::after{width:14px;height:1px;left:6px;top:14px}.noui-vertical .noui-handle::after{top:17px}[disabled] .noui-connect{background:#b8b8b8}[disabled].noui-target,[disabled].noui-handle,[disabled] .noui-handle{cursor:not-allowed}.noui-pips,.noui-pips *{-webkit-box-sizing:border-box;box-sizing:border-box}.noui-pips{position:absolute;color:#999}.noui-value{position:absolute;white-space:nowrap;text-align:center}.noui-value-sub{color:#ccc;font-size:10px}.noui-marker{position:absolute;background:#ccc}.noui-marker-sub{background:#aaa}.noui-marker-large{background:#aaa}.noui-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noui-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noui-rtl .noui-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noui-marker-horizontal.noui-marker{margin-left:-1px;width:2px;height:5px}.noui-marker-horizontal.noui-marker-sub{height:10px}.noui-marker-horizontal.noui-marker-large{height:15px}.noui-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noui-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noui-rtl .noui-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noui-marker-vertical.noui-marker{width:5px;height:2px;margin-top:-1px}.noui-marker-vertical.noui-marker-sub{width:10px}.noui-marker-vertical.noui-marker-large{width:15px}.noui-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noui-horizontal .noui-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noui-vertical .noui-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noui-horizontal .noui-origin>.noui-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noui-vertical .noui-origin>.noui-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px}.tm-range-picker.noui-target{background:var(--slider-background);border-radius:4px;border:0;-webkit-box-shadow:none;box-shadow:none}.tm-range-picker .noui-connects{border-radius:3px}.tm-range-picker .noui-connect{background:var(--slider-active-background)}.tm-range-picker,.tm-range-picker .noui-handle{-webkit-box-shadow:none;box-shadow:none}.tm-range-picker .noui-tooltip{background:#3fb8af;color:#fff;border:2px solid #fff;padding:.4em;text-align:center;white-space:nowrap;border-radius:3px;font-size:1em}.tm-range-picker .noui-active .noui-tooltip{display:block}.tm-range-picker .noui-handle::before,.tm-range-picker .noui-handle::after{display:none}.noui-marker{background:var(--marker-color);opacity:.8}.noui-marker-sub{opacity:.5;background:var(--marker-color)}.noui-marker-large{opacity:1;background:var(--marker-color)}.tm-range-picker .noui-handle .noui-touch-area::before{content:"";position:absolute;top:calc(-0.5 * var(--size) + 0.5 * 1em);left:calc(-0.5 * var(--size) + 0.5 * 1em);right:calc(-0.5 * var(--size) + 0.5 * 1em);bottom:calc(-0.5 * var(--size) + 0.5 * 1em);width:var(--size);height:var(--size);border-radius:100%;background:var(--handle-background);z-index:-1;opacity:.2;will-change:transform;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:all .1s ease-out,border-color .2s ease-out;transition:all .1s ease-out,border-color .2s ease-out;display:block;--size:calc(var(--handle-size) * 1.8)}.tm-range-picker .noui-handle:hover .noui-touch-area::before{border:0;-webkit-transform:scale(0.9);transform:scale(0.9)}.tm-range-picker .noui-active.noui-handle:hover .noui-touch-area::before{border:0;-webkit-transform:scale(1);transform:scale(1)}.tm-range-picker .noui-value{position:absolute;white-space:nowrap;text-align:center;font-size:.8em;margin-top:.8em}.tm-range-picker .noui-value-sub{color:inherit;font-size:10px;margin-top:.6em;opacity:.5}.tm-range-picker .noui-marker-horizontal.noui-marker{margin-left:-1px;width:1px}.tm-range-picker{--handle-size:14px;--slider-height:3px;--handle-radius:calc(var(--handle-size) / 2);--handle-background:#3fb8af;--slider-active-background:#3fb8af;--slider-background:#cdcdcd;--marker-color:#aaa;height:var(--slider-height)}.tm-range-picker .noui-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;border:0;background:var(--handle-background);cursor:pointer;-webkit-box-shadow:none;box-shadow:none;outline:none !important;height:var(--handle-size);width:var(--handle-size);top:calc((var(--handle-size) - var(--slider-height)) / -2);right:calc(var(--handle-size) / -2);border-radius:var(--handle-radius)}assets/css/owl.theme.default.css000064400000003053150755142450012706 0ustar00/**
 * Owl Carousel v2.3.4
 * Copyright 2013-2018 David Deutsch
 * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
 */

/*
 *  Default theme - Owl Carousel CSS File
 */

.tc-extra-product-options .owl-theme .owl-nav {
	margin-top: 10px;
	text-align: center;
	-webkit-tap-highlight-color: transparent;
}

.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"] {
	color: #fff;
	font-size: 14px;
	margin: 5px;
	padding: 4px 7px;
	background: #d6d6d6;
	display: inline-block;
	cursor: pointer;
	border-radius: 3px;
}

.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"]:hover {
	background: #869791;
	color: #fff;
	text-decoration: none;
}

.tc-extra-product-options .owl-theme .owl-nav .disabled {
	opacity: 0.5;
	cursor: default;
}

.tc-extra-product-options .owl-theme .owl-dots {
	text-align: center;
	-webkit-tap-highlight-color: transparent;
}


.tc-extra-product-options .owl-theme .owl-nav.disabled + .owl-dots {
	margin-top: 10px;
}

.tc-extra-product-options .owl-theme .owl-dots .owl-dot {
	display: inline-block;
	zoom: 1;
}

.tc-extra-product-options .owl-theme .owl-dots .owl-dot span {
	width: 10px;
	height: 10px;
	margin: 5px 7px;
	background: #d6d6d6;
	display: block;
	-webkit-backface-visibility: visible;
	backface-visibility: visible;
	-webkit-transition: opacity 200ms ease;
	transition: opacity 200ms ease;
	border-radius: 30px;
}

.tc-extra-product-options .owl-theme .owl-dots .owl-dot.active span,
.tc-extra-product-options .owl-theme .owl-dots .owl-dot:hover span {
	background: #869791;
}
assets/css/tm-epo-smallscreen.min.css000064400000002163150755142450013653 0ustar00.tm-responsive .tcwidth{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-responsive .tm-extra-product-options ul.tmcp-elements:not(.tm-extra-product-options-variations) li.tmcp-field-wrap:not(.tm-per-row){float:none !important;width:100% !important}.tm-responsive .tm-extra-product-options .cpf-type-select ul.tmcp-ul-wrap.fullwidth-ul li.tmcp-field-wrap .tc-field-label-wrap{grid-template-columns:1fr}.tm-responsive .tm-extra-product-options .tc-col-auto,.tm-responsive .tm-extra-product-options .tc-cell.tc-col-auto,.tm-responsive .tc-cell.tc-col-auto,.tm-responsive .tc-col-auto{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.tm-floating-box{display:none !important}.tm-epo-style:hover::after{opacity:0}.tm-epo-cart-row .product-remove,.tm-epo-cart-row .product-thumbnail,.tm-epo-cart-row .product-price,.tm-epo-cart-row .product-quantity,.tm-epo-cart-row .product-subtotal,.tc-epo-cart-row-total .product-remove,.tc-epo-cart-row-total .product-thumbnail,.tc-epo-cart-row-total .product-name,.tc-epo-cart-row-total .product-price{display:none !important}.tm-epo-cart-option-mobile{display:block}assets/css/owl.carousel.min.css000064400000012473150755142450012566 0ustar00.tc-extra-product-options .tcowl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.tc-extra-product-options .tcowl-carousel .owl-stage{position:relative;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-backface-visibility:hidden;backface-visibility:hidden}.tc-extra-product-options .tcowl-carousel .owl-stage::after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.tc-extra-product-options .tcowl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.tc-extra-product-options .tcowl-carousel .owl-stage-outer,.tc-extra-product-options .tcowl-carousel .owl-nav{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}.tc-extra-product-options .tcowl-carousel .owl-wrapper,.tc-extra-product-options .tcowl-carousel .owl-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.tc-extra-product-options .tcowl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.tc-extra-product-options .tcowl-carousel .owl-item img{display:block;width:100%}.tc-extra-product-options .tcowl-carousel .owl-nav.disabled,.tc-extra-product-options .tcowl-carousel .owl-dots.disabled{display:none}.tc-extra-product-options .tcowl-carousel .owl-nav .owl-prev,.tc-extra-product-options .tcowl-carousel .owl-nav .owl-next,.tc-extra-product-options .tcowl-carousel .owl-dot{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-prev,.tc-extra-product-options .tcowl-carousel .owl-nav button.owl-next,.tc-extra-product-options .tcowl-carousel button.owl-dot{background:0;color:inherit;border:0;padding:0 !important;font:inherit}.tc-extra-product-options .tcowl-carousel-show{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-wrap:wrap;flex-wrap:wrap}.tc-extra-product-options .tm-owl-slider,.tc-extra-product-options .tcowl-carousel.owl-loaded{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--tcgap)}.tc-extra-product-options .tcowl-carousel.owl-loading{opacity:0;display:block}.tc-extra-product-options .tcowl-carousel.owl-hidden{opacity:0}.tc-extra-product-options .tcowl-carousel.owl-refresh .owl-item{visibility:hidden}.tc-extra-product-options .tcowl-carousel.owl-drag .owl-item{-ms-touch-action:pan-y;touch-action:pan-y;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tc-extra-product-options .tcowl-carousel.owl-grab{cursor:move;cursor:-webkit-grab;cursor:grab}.tc-extra-product-options .tcowl-carousel.owl-rtl{direction:rtl}.tc-extra-product-options .tcowl-carousel.owl-rtl .owl-item{float:right}.tc-extra-product-options .tcowl-carousel .owl-item:not(.active){visibility:hidden}.no-js .tc-extra-product-options .tcowl-carousel{display:block}.tc-extra-product-options .tcowl-carousel .animated{-webkit-animation-duration:1000ms;animation-duration:1000ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.tc-extra-product-options .tcowl-carousel .owl-animated-in{z-index:0}.tc-extra-product-options .tcowl-carousel .owl-animated-out{z-index:1}.tc-extra-product-options .tcowl-carousel .fadeout{-webkit-animation-name:fadeout;animation-name:fadeout}@-webkit-keyframes fadeout{0%{opacity:1}100%{opacity:0}}@keyframes fadeout{0%{opacity:1}100%{opacity:0}}.tc-extra-product-options .owl-height{-webkit-transition:height 500ms ease-in-out;transition:height 500ms ease-in-out}.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy{opacity:0;-webkit-transition:opacity 400ms ease;transition:opacity 400ms ease}.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy[src^=""],.tc-extra-product-options .tcowl-carousel .owl-item .owl-lazy:not([src]){max-height:0}.tc-extra-product-options .tcowl-carousel .owl-item img.owl-lazy{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.tc-extra-product-options .tcowl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.tc-extra-product-options .tcowl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 100ms ease;transition:-webkit-transform 100ms ease;transition:transform 100ms ease;transition:transform 100ms ease,-webkit-transform 100ms ease}.tc-extra-product-options .tcowl-carousel .owl-video-play-icon:hover{-webkit-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.tc-extra-product-options .tcowl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;-webkit-transition:opacity 400ms ease;transition:opacity 400ms ease}.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-tn,.tc-extra-product-options .tcowl-carousel .owl-video-playing .owl-video-play-icon{display:none}.tc-extra-product-options .tcowl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}assets/css/animate.min.css000064400000001615150755142450011563 0ustar00/*!
 * CCS3 animations
 */.tm-animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.tm-animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.fadein{-webkit-animation-name:fadein;animation-name:fadein}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@keyframes fadeout{from{opacity:1}to{opacity:0}}.fadeout{-webkit-animation-name:fadeout;animation-name:fadeout}@-webkit-keyframes fadeoutdown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeoutdown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeoutdown{-webkit-animation-name:fadeoutdown;animation-name:fadeoutdown}assets/css/index.php000064400000000126150755142450010465 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/css/tm-epo-rtl.min.css000064400000002173150755142450012145 0ustar00.tc-extra-product-options,.tc-totals-form{direction:rtl;unicode-bidi:embed}.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger{border-width:0 1px 0 0;left:0;right:auto}.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-radio .tm-label,.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-checkbox .tm-label{padding:0 .5em 0 0 !important}.tm-extra-product-options .tc-element-container,.tm-extra-product-options .tmcp-ul-wrap,.tm-collapse-wrap{float:right !important}.tm-extra-product-options .tm-epo-datepicker,.tm-extra-product-options .tm-epo-timepicker{margin:0 0 0 -2.5em !important;max-width:100% !important;padding-left:2.5em !important;padding-right:1em !important}assets/css/tm-epo-rtl.css000064400000002336150755142450011364 0ustar00.tc-extra-product-options,
.tc-totals-form {
	direction: rtl;
	unicode-bidi: embed;
}

.tm-extra-product-options .tm-extra-product-options-date .ui-tm-datepicker-trigger {
	border-width: 0 1px 0 0;
	left: 0;
	right: auto;
}

.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-checkbox li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-radio li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-variations li.tmcp-field-wrap .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-radio .tm-label,
.tm-extra-product-options ul.tmcp-ul-wrap.tm-extra-product-options-product li.tmcp-field-wrap.tc-epo-element-product-checkbox .tm-label {
	padding: 0 0.5em 0 0 !important;
}

.tm-extra-product-options .tc-element-container,
.tm-extra-product-options .tmcp-ul-wrap,
.tm-collapse-wrap {
	float: right !important;
}

.tm-extra-product-options .tm-epo-datepicker,
.tm-extra-product-options .tm-epo-timepicker {
	margin: 0 0 0 -2.5em !important;
	max-width: 100% !important;
	padding-left: 2.5em !important;
	padding-right: 1em !important;
}
assets/css/spectrum.css000064400000031765150755142450011236 0ustar00/***
Spectrum Colorpicker v2.0
https://github.com/seballot/spectrum
Author: Brian Grinstead
License: MIT
***/

/* stylelint-disable no-descending-specificity */

/* Don't allow text selection */
.epo.sp-container,
.sp-replacer.epo,
.epo .sp-preview,
.sp-dragger,
.sp-slider,
.sp-alpha,
.sp-clear,
.sp-alpha-handle,
.epo.sp-container.sp-dragging .sp-input,
.epo.sp-container button {
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	font: inherit;
}

.sp-original-input-container {
	position: relative;
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
}

.sp-original-input-container input {
	margin: 0 !important;
}

.sp-original-input-container .sp-add-on {
	width: 40px;
	border-top-right-radius: 0 !important;
	border-bottom-right-radius: 0 !important;
}

input.spectrum.with-add-on {
	border-top-left-radius: 0;
	border-bottom-left-radius: 0;
	border-left: 0;
}

.sp-original-input-container .sp-add-on .sp-colorize {
	height: 100%;
	width: 100%;
	border-radius: inherit;
}

.sp-colorize-container {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
}

.epo.sp-container.sp-flat {
	position: relative;
}

/* Fix for * { box-sizing: border-box; } */
.epo.sp-container,
.epo.sp-container * {


	-webkit-box-sizing: content-box;


	box-sizing: content-box;
}

/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
.epo .sp-top {
	position: relative;
	width: 100%;
	display: inline-block;
	margin-bottom: 10px;
}

.epo .sp-top-inner {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
}

.epo .sp-color {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 20px !important;
}

.epo .sp-hue {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	width: 12px;
	height: 100%;
	left: initial !important;
	background: -webkit-gradient(linear, left top, left bottom, from(#f00), color-stop(17%, #f00), color-stop(33%, #0f0), color-stop(50%, #0ff), color-stop(67%, #00f), color-stop(83%, #f0f), to(#f00));
	background: linear-gradient(to bottom, #f00 0%, #f00 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);
}

.epo .sp-clear-enabled .sp-hue {
	top: 15%;
	height: 85%;
}

.epo .sp-fill {
	padding-top: 80%;
}

.epo .sp-sat,
.epo .sp-val {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
}

.epo .sp-alpha-enabled .sp-top {
	margin-bottom: 28px !important;
}

.epo .sp-alpha-handle {
	position: absolute;
	top: -3px;
	cursor: pointer;
	height: 16px;
	border-radius: 50%;
	width: 16px;
	margin-right: 5px;
	left: -2px;
	right: 0;
	background: #f9f9f9;
	-webkit-box-shadow: 0 0 2px 0 #3a3a3a;
	box-shadow: 0 0 2px 0 #3a3a3a;
}

.epo .sp-alpha {
	display: none;
	position: absolute;
	bottom: -18px;
	right: 0;
	left: 0;
	height: 10px;
}

.epo.sp-alpha-enabled .sp-alpha {
	display: block;
}

.epo.sp-alpha-enabled .sp-picker-container .sp-top {
	margin-bottom: 26px;
}

.epo .sp-alpha-inner {
	border-radius: 4px;
}

.epo .sp-clear {
	display: none;
}

.epo .sp-clear.sp-clear-display {
	background-position: center;
}

.epo .sp-clear-enabled .sp-clear {
	display: block;
	position: absolute;
	top: 3px;
	right: 0;
	bottom: 0;
	cursor: pointer;
	left: initial;
	height: 12px;
	width: 12px;
}

.epo.sp-container.sp-input-disabled .sp-input-container {
	display: none;
}

.epo.sp-container.sp-buttons-disabled .sp-button-container {
	display: none;
}

.epo.sp-container.sp-palette-buttons-disabled .sp-palette-button-container {
	display: none;
}

.sp-palette-only .sp-picker-container {
	display: none;
}

.sp-palette-disabled .sp-palette-container {
	display: none;
}

.sp-initial-disabled .sp-initial {
	display: none;
}


/* Gradients for hue, saturation and value instead of images.
   Not pretty... but it works
*/
.epo .sp-sat {
	background-image: -webkit-gradient(linear, left top, right top, from(#fff), to(rgba(204, 154, 129, 0)));
	background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));

	filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr="#FFFFFFFF", endColorstr="#00CC9A81");
}

.epo .sp-val {
	border-radius: 4px;
	background-image: -webkit-gradient(linear, left bottom, left top, from(#000), to(rgba(204, 154, 129, 0)));
	background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));

	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00CC9A81", endColorstr="#FF000000");
}

/* IE filters do not support multiple color stops.
   Generate 6 divs, line them up, and do two color gradients for each.
   Yes, really.
 */
.epo .sp-1 {
	height: 17%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000", endColorstr="#ffff00");
}

.epo .sp-2 {
	height: 16%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffff00", endColorstr="#00ff00");
}

.epo .sp-3 {
	height: 17%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ff00", endColorstr="#00ffff");
}

.epo .sp-4 {
	height: 17%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ffff", endColorstr="#0000ff");
}

.epo .sp-5 {
	height: 16%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#0000ff", endColorstr="#ff00ff");
}

.epo .sp-6 {
	height: 17%;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff00ff", endColorstr="#ff0000");
}

.sp-hidden {
	display: none !important;
}

/* Clearfix hack */
.epo .sp-cf::before,
.epo .sp-cf::after {
	content: "";
	display: table;
}

.epo .sp-cf::after {
	clear: both;
}

.epo .sp-cf {
	*zoom: 1;
}

/* Mobile devices, make hue slider bigger so it is easier to slide */
@media (max-width: 480px) {

	.epo .sp-color {
		right: 40%;
	}

	.epo .sp-hue {
		left: 63%;
	}

	.epo .sp-fill {
		padding-top: 60%;
	}
}

.epo .sp-dragger {
	border-radius: 5px;
	height: 10px;
	width: 10px;
	border: 1px solid #fff;
	cursor: pointer;
	position: absolute;
	top: 0;
	left: 0;
	margin-left: 3px;
	margin-top: 3px;
	-webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);
	box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2);
	background: none;
}

.epo .sp-slider {
	position: absolute;
	top: 0;
	cursor: pointer;
	height: 16px;
	border-radius: 50%;
	width: 16px;
	left: -2px;
	background: #f9f9f9;
	-webkit-box-shadow: 0 0 2px 0 #3a3a3a;
	box-shadow: 0 0 2px 0 #3a3a3a;
	margin-top: 8px;
	right: auto;
	border: 0;
	opacity: 1;
}


/*
Theme authors:
Here are the basic themeable display options (colors, fonts, global widths)
*/


.epo.sp-container {
	position: absolute;
	top: 0;
	left: 0;

	/* https://github.com/seballot/spectrum/issues/40 */
	z-index: 9999994;
	overflow: hidden;
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	border: 0;
	background-color: #fff;
	padding: 0;
	border-radius: 4px;
	color: #000;
	-webkit-box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
	box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
}

.epo.sp-container,
.epo.sp-container button,
.epo.sp-container input,
.sp-color,
.sp-hue,
.sp-clear {
	font-size: 12px;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.epo .sp-color,
.epo .sp-hue,
.epo .sp-clear,
.epo .sp-val,
.epo .sp-sat {
	border-radius: 3px;
	border: 0;
}

.epo .sp-input-container {
	margin-top: -5px;
	float: none;
	width: auto;
}

.epo .sp-input-container.sp-cf,
.sp-initial.sp-thumb.sp-cf,
.sp-button-container.sp-cf {
	height: 25px;
}

.epo .sp-picker-container .sp-cf {
	margin-bottom: 10px;
}

.sp-palette-row-initial > span:first-child {
	cursor: pointer;
}

/* Input */
.epo.sp-initial-disabled .sp-input-container {
	width: 100%;
}

.epo .sp-input {
	padding: 0 5px !important;
	margin: 0;
	width: 100%;
	-webkit-box-shadow: none !important;
	box-shadow: none !important;
	height: 100% !important;
	background: transparent;
	color: #3a3a3a;
	border-radius: 2px !important;
	border: 1px solid #e0e0e0 !important;
	text-align: center;
	font-family: monospace;
	font-size: inherit !important;
}

.sp-input:focus {
	border: 1px solid rgb(255, 166, 0);
}

.sp-input.sp-validation-error {
	border: 1px solid #f00;
	background: #fdd;
}

.epo .sp-picker-container,
.sp-palette-container {
	position: relative;
	padding: 10px;
}

.epo .sp-picker-container {
	width: 200px;
	padding-bottom: 0;
	border: 0;
	float: none;
	margin: 0;
}

/* Palettes */
.sp-palette-container {
	border-right: solid 1px #ccc;
}

.sp-palette-only .sp-palette-container {
	border: 0;
}

.sp-palette .sp-thumb-el {
	display: block;
	position: relative;
	float: left;
	width: 16px;
	height: 16px;
	margin: 3px;
	border: none;
	border-radius: 3px;
	cursor: pointer;
}

.sp-palette .sp-thumb-el:hover,
.sp-palette .sp-thumb-el.sp-thumb-active {
	border-color: rgb(255, 166, 0);
}

.sp-thumb-el {
	position: relative;
}

/* Initial */
.epo .sp-initial {
	float: left;
	border: 0;
}

.sp-initial span {
	width: 30px;
	height: 25px;
	border: none;
	display: block;
	float: left;
	margin: 0;

}

.sp-initial .spe-thumb-el.sp-thumb-active {
	border-radius: 0 5px 5px 0;
}

.sp-initial .spe-thumb-el {
	border-radius: 5px 0 0 5px;
}

.sp-initial .sp-clear-display {
	background-position: center;
}

/* Buttons */
.sp-button-container {
	float: right;
}

.sp-palette-button-container {
	margin-top: 10px;
}

/* Replacer (the little preview div that shows up instead of the <input>) */
.sp-replacer.epo {
	position: relative;
	overflow: hidden;
	cursor: pointer;
	display: inline-block;
	border-radius: 3px;
	border: 1px solid #aaa;
	color: #666;
	-webkit-transition: border-color 0.3s;
	transition: border-color 0.3s;
	vertical-align: middle;
	width: 3.5rem;
	height: 2rem;
	margin: 0;
	padding: 3px;
	background: #fff;
	-webkit-box-shadow: none;
	box-shadow: none;
}

.sp-replacer.epo.sp-disabled {
	cursor: default;
	border-color: rgb(192, 192, 192);
	color: rgb(192, 192, 192);
}

.epo .sp-dd {
	position: absolute;
	font-size: 10px;
	right: 0;
	top: 0;
	bottom: 0;
	padding: 3px;
	line-height: calc(2rem - 5px); /* stylelint-disable-line */
	background-color: #fff;
	height: auto;
	float: none;
}

.epo .sp-preview {
	position: relative;
	width: 100%;
	height: 100%;
	float: left;
	z-index: 0;
	border: 0;
	margin: 0;
	padding: 0;
}

.epo .sp-preview-inner {
	-webkit-transition: background-color 0.2s;
	transition: background-color 0.2s;
}

.epo .sp-preview-inner.sp-clear-display {
	display: none;
}

/* Buttons: http://hellohappy.org/css3-buttons/ */
.epo.sp-container button {
	border-radius: 3px;
	border: none;
	background: transparent;
	line-height: 1;
	padding: 0 8px;
	height: 25px;
	text-transform: capitalize;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	color: #606c72;
	font-weight: 700;
}

.epo.sp-container button.sp-choose {
	background-color: #3cab3b;
	color: #fff;
	margin-left: 5px;
}

.epo.sp-container button:hover {
	opacity: 0.8;
}

.epo.sp-container button.sp-palette-toggle {
	width: 100%;
	background-color: #f3f3f3;
	margin: 0;
}


.sp-palette span:hover,
.sp-palette span.sp-thumb-active {
	border-color: #000;
}

.epo .sp-preview,
.sp-alpha,
.sp-thumb-el {
	position: relative;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
}

.epo .sp-preview-inner,
.sp-alpha-inner,
.sp-thumb-inner {
	display: block;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
}

.sp-palette .sp-thumb-inner {
	border-radius: 3px;
	background-position: 50% 50%;
	background-repeat: no-repeat;
}

.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
}

.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
}

.sp-clear-display {
	background-repeat: no-repeat;
	background-position: center;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABe0lEQVQokYXSsUtcQRTF4d8Jj+VhHSxkEQuLsEUKK0nhTBFTmLSSUhBCMCAWsmgIwWrBLk0akfwLCaSQKBJmtrIIISwpRFKIhViETScphGMzysMtvOVwvpm5d0bGNCuGWAOPgYdl6S8wSDn9b+bUhDHEKWAdeAFMANg+l/TV9ofcz6cjMIbYBvaBMds7QCqZ58CmpBNgPuV0DvAAIMyFGugWtJr7eTv38xEwkPRPErY7QDeG2LqFkjrAgu0dSd/KDVqSNmxvAZ8lfbS9AHRuYemnLWkv5XRVBrQMbAI/gTXgEzAJtJuwBVS2L2OIle03QA/4Lmkl5XQBXEqqbFcAVYFDYChpFngiqWf7l6TXKaezMt2Zkhk24THwG+jZriX9AFZvUAyxLbRke2D75O5zPAO+ADXwEtizjaRHwDvbTyUtppwOmicCHAJvbXcl9YA1SQDjtseA97YPRz7ATcUQp2y/kjRdevsjaTfldNrMjcDGBjXA3T96L7yvrgFzP69+0Ao/HAAAAABJRU5ErkJggg==);
}
assets/css/owl.theme.default.min.css000064400000002300150755142450013462 0ustar00.tc-extra-product-options .owl-theme .owl-nav{margin-top:10px;text-align:center;-webkit-tap-highlight-color:transparent}.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"]{color:#fff;font-size:14px;margin:5px;padding:4px 7px;background:#d6d6d6;display:inline-block;cursor:pointer;border-radius:3px}.tc-extra-product-options .owl-theme .owl-nav [class*="owl-"]:hover{background:#869791;color:#fff;text-decoration:none}.tc-extra-product-options .owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.tc-extra-product-options .owl-theme .owl-dots{text-align:center;-webkit-tap-highlight-color:transparent}.tc-extra-product-options .owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.tc-extra-product-options .owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.tc-extra-product-options .owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#d6d6d6;display:block;-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-transition:opacity 200ms ease;transition:opacity 200ms ease;border-radius:30px}.tc-extra-product-options .owl-theme .owl-dots .owl-dot.active span,.tc-extra-product-options .owl-theme .owl-dots .owl-dot:hover span{background:#869791}assets/js/tm-epo-product.min.js000064400000027077150755142450012506 0ustar00!function(y,n,i){"use strict";function r(t,a,i,e,r){var o=this;o.field=a,o.currentCart=i,o.variableProductContainers=e,o.epoObject=r,o.$form=t,o.$wrap=t.closest(".tc-epo-element-product-container-wrap"),o.$attributeFields=t.find(".tc-epo-variable-product-selector"),o.$singleVariation=t.find(".tc-epo-element-single-variation"),o.$resetVariations=t.find(".tc-epo-element-variable-reset-variations"),o.variationData=t.data("product_variations"),o.useAjax=!1===o.variationData,o.xhr=!1,o.loading=!0,o.variationId=t.closest(".tc-epo-element-product-li-container").find(".tc-epo-element-product-container-variation-id input.product-variation-id"),o.getChosenAttributes=o.getChosenAttributes.bind(o),o.findMatchingVariations=o.findMatchingVariations.bind(o),o.isMatch=o.isMatch.bind(o),o.toggleResetLink=o.toggleResetLink.bind(o),t.on("click.tc-variation-form",".tc-epo-element-variable-reset-variations",{variationForm:o},o.onReset),t.on("tc_hide_variation",{variationForm:o},o.onHide),t.on("tc_show_variation",{variationForm:o},o.onShow),t.on("tc_reset_data",{variationForm:o},o.onResetDisplayedVariation),t.on("tc_reset_image",{variationForm:o},o.onResetImage),t.on("change.tc-variation-form",".tc-epo-variable-product-selector",{variationForm:o},o.onChange),t.on("tc_found_variation.tc-variation-form",{variationForm:o},o.onFoundVariation),t.on("tc_check_variations.tc-variation-form",{variationForm:o},o.onFindVariation),t.on("tc_update_variation_values.tc-variation-form",{variationForm:o},o.onUpdateAttributes),t.on("refresh.tc-variation-form",{variationForm:o},o.onRefreshContainer),t.on("update_field.tc-variation-form",{variationForm:o},o.onUpdateField),o.variationId.val(""),setTimeout(function(){t.trigger("refresh"),t.trigger("tc_variation_form"),o.loading=!1},100)}function l(t){var a=i.getElementById("tmpl-"+t).textContent;return/<#\s?data\./.test(a)||/{{{?\s?data\.(?!variation\.).+}}}?/.test(a)||/{{{?\s?data\.variation\.[\w-]*[^\s}]/.test(a)?n.wp.template(t):function(t){var r,o=t.variation||{};return a.replace(/({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g,function(t,a,i,e){return a.length!==e.length?"":(r=o[i]||"",2===a.length?n.escape(r):r)})}}r.prototype.onRefreshContainer=function(t){t=t.data.variationForm;t.variableProductContainers.find(".tc-epo-element-product-container").removeClass("variations_form"),t.$form.addClass("variations_form"),t.$form.trigger("tc_check_variations.tc-variation-form")},r.prototype.onUpdateField=function(t,a){var i=t.data.variationForm,e=i.field;t.preventDefault(),a||((t=e).is("select")&&(t=e.find("option:selected")),e.data("price_set",1),t.data("associated_price_set",1),t.data("price_set",1),t.data("raw_price",0),t.data("raw_original_price",0),t.data("price",0),t.data("original_price",0),e.data("price-changed",1),i.$form.trigger({type:"tm-epo-update",norules:2}),i.currentCart.trigger({type:"tm-epo-update",norules:2}))},r.prototype.onReset=function(t){t.preventDefault(),t.data.variationForm.$attributeFields.val("").trigger("change"),t.data.variationForm.$form.trigger("tc_reset_data")},r.prototype.onHide=function(t){t.preventDefault()},r.prototype.onShow=function(t){t.preventDefault()},r.prototype.onResetDisplayedVariation=function(t){t=t.data.variationForm;t.$form.find(".product-meta").find(".tc-product-sku").tc_reset_content(),t.$form.trigger("tc_reset_image"),t.$singleVariation.slideUp(200).trigger("tc_hide_variation")},r.prototype.onResetImage=function(t){t.data.variationForm.$form.tc_variations_image_update(!1)},r.prototype.onFindVariation=function(t){var a,i=t.data.variationForm,e=i.getChosenAttributes(),t=e.data;if(e.count===e.chosenCount)if(i.useAjax){if("undefined"==typeof wc_add_to_cart_variation_params)return;i.xhr&&i.xhr.abort(),a=i.$form.closest(".cpf-type-product"),i.$form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),t.product_id=parseInt(i.$form.data("product_id"),10),t.discount=a.attr("data-discount"),t.discount_type=a.attr("data-discount-type"),t.discount_exclude_addons=a.attr("data-discount-exclude-addons"),i.xhr=y.ajax({url:wc_add_to_cart_variation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_variation"),type:"POST",data:t,success:function(t){t?i.$form.trigger("tc_found_variation",[t]):(i.$form.trigger("tc_reset_data"),e.chosenCount=0,i.loading||(i.$form.find(".tc-epo-element-single-variation").after('<p class="wc-no-matching-variations woocommerce-info">'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"</p>"),i.$form.find(".wc-no-matching-variations").slideDown(200),i.$form.trigger("update_field",[])))},complete:function(){i.$form.unblock()}})}else i.$form.trigger("tc_update_variation_values"),(a=i.findMatchingVariations(i.variationData,t).shift())?i.$form.trigger("tc_found_variation",[a]):(i.$form.trigger("tc_reset_data"),e.chosenCount=0,i.loading||(i.$form.find(".tc-epo-element-single-variation").after('<p class="wc-no-matching-variations woocommerce-info">'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"</p>"),i.$form.find(".wc-no-matching-variations").slideDown(200)));else i.variationId.val("").trigger("change"),i.$form.trigger("tc_update_variation_values"),i.$form.trigger("tc_reset_data"),i.$form.trigger("update_field",[]);i.toggleResetLink(0<e.chosenCount)},r.prototype.onFoundVariation=function(t,a){var t=t.data.variationForm,i=t.$form.find(".product-meta").find(".tc-product-sku"),e=t.$wrap.find(".tm-quantity-alt"),r=e.find("input.tm-qty-alt"),o=y.epoAPI.math.toInt(r.attr("data-min")),n=y.epoAPI.math.toInt(r.attr("data-max")),c=r.attr("data-max"),s=!0,_=!1,d="";a.sku?i.tc_set_content(a.sku):i.tc_reset_content(),t.$form.tc_variations_image_update(a),_=a.variation_is_visible?l("variation-template"):l("unavailable-variation-template"),t.field.attr("data-no-price")&&(a.display_price="",a.display_regular_price="",a.price_html=""),t.$form.find(".tc-epo-element-product-container-cart").find(".stock").remove(),d=(d=(d=_({variation:a})).replace("/*<![CDATA[*/","")).replace("/*]]>*/",""),t.$singleVariation.html(d),t.variationId.val(a.variation_id).trigger("change"),"yes"===a.is_sold_individually?(r.val("1").attr("min","1").attr("max","1"),e.hide()):(""!==a.min_qty&&a.min_qty>o&&0<o&&(o=a.min_qty),""!==a.max_qty&&a.max_qty<n&&(n=a.max_qty),""!==o?r.attr("min",o):r.removeAttr("min"),""!==c?r.attr("max",n):r.removeAttr("max"),n&&y.epoAPI.math.toInt(r.val())>n&&r.val(n),o>y.epoAPI.math.toInt(r.val())&&r.val(o),e.show()),a.is_purchasable&&a.is_in_stock&&a.variation_is_visible||(s=!1,r.val("0").attr("min","0").attr("max","0"),e.hide()),r.trigger("change"),(y.epoAPI.util.trim(t.$singleVariation.text())?t.$singleVariation.slideDown(200):t.$singleVariation.show()).trigger("tc_show_variation",[a,s]),t.$form.trigger("update_field",[a])},r.prototype.onChange=function(t){var t=t.data.variationForm,a=t.field;t.variationId.val("").trigger("change"),t.$form.find(".wc-no-matching-variations").remove(),t.useAjax||t.$form.trigger("woocommerce_variation_select_change"),t.$form.trigger("tc_check_variations"),t.$form.trigger("woocommerce_variation_has_changed"),setTimeout(function(){a.closest(".tcowl-carousel").trigger("refresh.owl.carousel")},50)},r.prototype.onUpdateAttributes=function(t){var w=t.data.variationForm,b=w.getChosenAttributes().data;w.useAjax||(w.$attributeFields.each(function(t,a){var i,e,r,o,n,c,s,_,d,l,m,v=y(a),g=v.data("attribute_name")||v.attr("name"),a=y(a).data("show_option_none"),p=":gt(0)",f=y("<select/>"),u=v.val()||"",h=!0;for(r in v.data("attribute_html")||((i=v.clone()).find("option").prop("disabled",!1).prop("selected",!1).removeAttr("attached"),v.data("attribute_options",i.find("option"+p).get()),v.data("attribute_html",i.html())),f.html(v.data("attribute_html")),(i=y.extend(!0,{},b))[g]="",e=w.findMatchingVariations(w.variationData,i))if(void 0!==e[r])for(s in c=e[r].attributes)if(Object.prototype.hasOwnProperty.call(c,s)&&(_=c[s],d="",s===g))if(e[r].variation_is_active&&(d="enabled"),_){if(_=y("<div/>").html(_).text(),(l=f.find("option")).length)for(o=0,n=l.length;o<n;o++)if(_===(m=y(l[o])).val()){m.addClass("attached "+d);break}}else f.find("option:gt(0)").addClass("attached "+d);i=f.find("option.attached").length,u&&(h=!1,0!==i)&&f.find("option.attached.enabled").each(function(){var t=y(this).val();if(u===t)return!(h=!0)}),0<i&&u&&h&&"no"===a&&(f.find("option:first").remove(),p=""),f.find("option"+p+":not(.attached)").remove(),v.html(f.html()),v.find("option"+p+":not(.enabled)").prop("disabled",!0),u?h?v.val(u):v.val("").trigger("change"):v.val("")}),w.$form.trigger("woocommerce_update_variation_values"))},r.prototype.getChosenAttributes=function(){var i={},e=0,r=0;return this.$attributeFields.each(function(){var t=y(this).data("attribute_name")||y(this).attr("name"),a=y(this).val()||"";0<a.length&&r++,e++,i[t]=a}),{count:e,chosenCount:r,data:i}},r.prototype.findMatchingVariations=function(t,a){for(var i,e=[],r=0;r<t.length;r++)i=t[r],this.isMatch(i.attributes,a)&&e.push(i);return e},r.prototype.isMatch=function(t,a){var i,e,r,o=!0;for(r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i=t[r],e=a[r],void 0!==i)&&void 0!==e&&0!==i.length&&0!==e.length&&i!==e&&(o=!1);return o},r.prototype.toggleResetLink=function(t){t?"hidden"===this.$resetVariations.css("visibility")&&this.$resetVariations.css("visibility","visible").hide().fadeIn():this.$resetVariations.css("visibility","hidden")},y.fn.tc_product_variation_form=function(t,a,i,e){return new r(this,t,a,i,e),this.trigger("tc_product_variation_form"),this},y.fn.tc_set_content=function(t){void 0===this.attr("data-o_content")&&this.attr("data-o_content",this.text()),this.text(t)},y.fn.tc_reset_content=function(){void 0!==this.attr("data-o_content")&&this.text(this.attr("data-o_content"))},y.fn.tc_set_variation_attr=function(t,a){void 0===this.attr("data-o_"+t)&&this.attr("data-o_"+t,this.attr(t)?this.attr(t):""),!1===a?this.removeAttr(t):this.attr(t,a)},y.fn.tc_reset_variation_attr=function(t){void 0!==this.attr("data-o_"+t)&&this.attr(t,this.attr("data-o_"+t))},y.fn.tc_variations_image_update=function(t){var a=this.find(".tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),i=a.find(".wp-post-image"),e=a.find("a").eq(0);t&&t.image&&t.image.src&&1<t.image.src.length?(i.tc_set_variation_attr("src",t.image.src),i.tc_set_variation_attr("height",t.image.src_h),i.tc_set_variation_attr("width",t.image.src_w),i.tc_set_variation_attr("srcset",t.image.srcset),i.tc_set_variation_attr("sizes",t.image.sizes),i.tc_set_variation_attr("title",t.image.title),i.tc_set_variation_attr("data-caption",t.image.caption),i.tc_set_variation_attr("alt",t.image.alt),i.tc_set_variation_attr("data-src",t.image.full_src),i.tc_set_variation_attr("data-large_image",t.image.full_src),i.tc_set_variation_attr("data-large_image_width",t.image.full_src_w),i.tc_set_variation_attr("data-large_image_height",t.image.full_src_h),a.tc_set_variation_attr("data-thumb",t.image.src),e.tc_set_variation_attr("href",t.image.full_src)):this.tc_variations_image_reset()},y.fn.tc_variations_image_reset=function(){var t=this.find(".tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),a=t.find(".wp-post-image"),i=t.find("a").eq(0);a.tc_reset_variation_attr("src"),a.tc_reset_variation_attr("width"),a.tc_reset_variation_attr("height"),a.tc_reset_variation_attr("srcset"),a.tc_reset_variation_attr("sizes"),a.tc_reset_variation_attr("title"),a.tc_reset_variation_attr("data-caption"),a.tc_reset_variation_attr("alt"),a.tc_reset_variation_attr("data-src"),a.tc_reset_variation_attr("data-large_image"),a.tc_reset_variation_attr("data-large_image_width"),a.tc_reset_variation_attr("data-large_image_height"),t.tc_reset_variation_attr("data-thumb"),i.tc_reset_variation_attr("href")}}(window.jQuery,window,document);assets/js/epo.min.js000064400001711605150755142450010410 0ustar00!function(s){"use strict";var t=Array.prototype.slice;s.extend(s.event.special,{resizestop:{add:function(e){var i=e.handler;s(this).on("resize",function(t){clearTimeout(i._timer),t.type="resizestop",t=s.proxy(i,this,t),i._timer=setTimeout(t,e.data||200)})}},resizestart:{add:function(e){var i=e.handler;s(this).on("resize",function(t){clearTimeout(i._timer),i._started||(t.type="resizestart",i.apply(this,arguments),i._started=!0),i._timer=setTimeout(s.proxy(function(){i._started=!1},this),e.data||300)})}}}),s.extend(s.fn,{resizestop:function(){s(this).on.apply(this,["resizestop"].concat(t.call(arguments)))},resizestart:function(){s(this).on.apply(this,["resizestart"].concat(t.call(arguments)))}})}(window.jQuery);
!function(){"use strict";String.prototype.isNumeric||Object.defineProperty(String.prototype,"isNumeric",{value:function(){return!isNaN(parseFloat(this))&&isFinite(this)}})}(),window.jQuery.jMaskGlobals={maskElements:".tc-extra-product-options input"},function(i){"use strict";i.epoAPI={},i.epoAPI.error=!1,i.epoAPI.math={},i.epoAPI.dom={},i.epoAPI.util={},i.epoAPI.locale={},i.epoAPI.template={},i.epoAPI.math.toFloat=function(e,t){var n;return"string"!=typeof e&&"number"!=typeof e||isNaN(e)?0:(n=parseFloat(e),isNaN(n)?void 0!==t?t:e:n)},i.epoAPI.math.toInt=function(e,t){var n;return"string"!=typeof e&&"number"!=typeof e||isNaN(e)||""===e?0:(n=parseInt(e,10),isNaN(n)?void 0!==t?t:e:n)},i.epoAPI.math.round=function(e,t,n){var o,r,i;if(t=parseInt(t,10),Number.isFinite(t)||(t=0),r=(e*=t=Math.pow(10,t))%1==.5*(i="number"==typeof e&&e?e<0?-1:1:0),o=Math.floor(e),r)switch(n){case"PHP_ROUND_HALF_DOWN":e=o+(i<0?1:0);break;case"PHP_ROUND_HALF_EVEN":e=o+o%2*i;break;case"PHP_ROUND_HALF_ODD":e=o+(o%2?0:1);break;default:e=o+(0<i?1:0)}return(e=r?e:Math.round(e))/t},i.epoAPI.math.uniqueid=function(e,t){function n(e,t){return t<(e=parseInt(e,10).toString(16)).length?e.slice(e.length-t):t>e.length?new Array(t-e.length+1).join("0")+e:e}return void 0===e&&(e=""),i.epoAPI.php=i.epoAPI.php||{},i.epoAPI.php.uniqidSeed||(i.epoAPI.php.uniqidSeed=Math.floor(123456789*Math.random())),i.epoAPI.php.uniqidSeed+=1,e=e,e=(e+=n(parseInt(Date.now()/1e3,10),8))+n(i.epoAPI.php.uniqidSeed,5),t&&(e+=(10*Math.random()).toFixed(8).toString()),e},i.epoAPI.dom.id=function(e){return void 0===e?e:"string"!=typeof e&&"number"!=typeof e||"number"==typeof e&&isNaN(e)?e.toString():e.toString().replace(/(%|:|\.|\[|\]|,|=)/g,"\\$1")},i.epoAPI.dom.scroll=function(){var e,t;return window.pageYOffset?(t=window.pageYOffset,e=window.pageXOffset):document.documentElement&&document.documentElement.scrollTop?(t=document.documentElement.scrollTop,e=document.documentElement.scrollLeft):document.body&&(t=document.body.scrollTop,e=document.body.scrollLeft),{left:e,top:t}},i.epoAPI.dom.size=function(){var e,t,n,o=window.innerHeight&&window.scrollMaxY?(e=window.innerWidth+window.scrollMaxX,window.innerHeight+window.scrollMaxY):document.body.scrollHeight>document.body.offsetHeight?(e=document.body.scrollWidth,document.body.scrollHeight):(e=document.body.offsetWidth,document.body.offsetHeight);return window.innerHeight?(t=document.documentElement.clientWidth||window.innerWidth,n=window.innerHeight):document.documentElement&&document.documentElement.clientHeight?(t=document.documentElement.clientWidth,n=document.documentElement.clientHeight):document.body&&(t=document.body.clientWidth,n=document.body.clientHeight),{fullWidth:e<t?t:e,fullHeight:o<n?n:o,visibleWidth:t,visibleHeight:n,totalWidth:e,totalHeight:o}},i.epoAPI.util.trim=function(e){return"string"==typeof e?e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""):e},i.epoAPI.util.parseJSON=function(e){var t,n=window.JSON;try{if((t=n.parse(e+""))&&"object"==typeof t&&null!==t)return t}catch(e){i.epoAPI.error=e}return!1},i.epoAPI.util.decodeHTML=function(e){var t=document.createElement("textarea");return t.innerHTML=e,t.value},i.epoAPI.util.getStorage=function(e){var t,n;try{return t=window[e],n="__storage_test__",t.setItem(n,n),t.removeItem(n),t}catch(e){return!1}},i.epoAPI.util.basename=function(e){return e.replace(/.*\//,"")},i.epoAPI.util.deepCopyArray=function(t){var n,o;return void 0!==window.structuredClone?window.structuredClone(t):"object"!=typeof t||null===t?t:(n=Array.isArray(t)?[]:{},Object.keys(t).forEach(function(e){t&&(o=t[e],n[e]="object"==typeof o&&null!==o?i.epoAPI.util.deepCopyArray(o):o)}),n)},i.epoAPI.locale.getSystemDecimalSeparator=function(){var e=1.1;return e=(e=/^1(.+)1$/.exec(e.toLocaleString()))?e[1]:","},i.epoAPI.template.html=function(e,t){e=e(t);return e=(e=e.replace("/*<![CDATA[*/","")).replace("/*]]>*/","")},i.epoAPI.filters={},i.epoAPI.addFilter=function(e,t,n,o){var r;return n=parseInt(n,10),isNaN(n)&&(n=10),o=parseInt(o,10),isNaN(o)&&(o=1),r=t+"_"+n,i.epoAPI.filters[e]||(i.epoAPI.filters[e]={}),i.epoAPI.filters[e][n]||(i.epoAPI.filters[e][n]={}),i.epoAPI.filters[e][n][r]={func:t,accepted_args:o},!0},i.epoAPI.removeFilter=function(e,t,n){return n=parseInt(n,10),t=t+"_"+(n=isNaN(n)?10:n),!!(i.epoAPI.filters[e]&&i.epoAPI.filters[e][n]&&i.epoAPI.filters[e][n][t])&&(delete i.epoAPI.filters[e][n][t],!0)},i.epoAPI.applyFilter=function(e,n){var o=i.makeArray(arguments);return o.splice(0,1),i.epoAPI.filters[e]&&(e=i.epoAPI.filters[e],i.each(e,function(e,t){i.each(t,function(e,t){t=t.func;t instanceof Function?n=t.apply(null,o):window[t]&&window[t]instanceof Function&&(n=window[t].apply(null,o))})})),n},i.tc_add_filter=i.epoAPI.addFilter,i.tc_remove_filter=i.epoAPI.removeFilter,i.tc_apply_filters=i.epoAPI.applyFilter}(window.jQuery),function(e){"use strict";function i(e,t){return e=Math.round(Math.abs(e)),isNaN(e)?t:e}function a(e,t){var n;return Array.isArray(e)?e.map(e,function(e){return a(e,t)}):"number"==typeof(e=e||0)?e:(t=t||".",n=new RegExp("[^0-9-"+t+"]",["g"]),e=parseFloat((""+e).replace(n,"").replace(t,".")),isNaN(e)?0:e)}function c(e,t){return Number.isFinite(e)?(t=i(t,2),e=Number(a(e)*Math.pow(10,t)),e=Math.round(e),Number(e/Math.pow(10,t)).toFixed(t)):"-"}e.epoAPI.math.unformat=a,e.epoAPI.math.format=function t(e,n){var o,r;if(Array.isArray(e))return e.map(e,function(e){return t(e,n)});if(e=a(e),n)if(n.precision=i(n.precision),n.format&&n.symbol)o={pos:n.format,neg:n.format.replace("-","").replace("%v","-%v"),zero:n.format},o=0<e?o.pos:e<0?o.neg:o.zero,n.opts={precision:n.precision,thousand:n.thousand,decimal:n.decimal},e=o.replace("%s",n.symbol).replace("%v",t(Math.abs(e),n.opts));else{if(!Number.isFinite(e))return"-";e=(e<0?"-":"")+((r=3<(o=parseInt(c(Math.abs(e||0),n.precision),10)+"").length?o.length%3:0)?o.substring(0,r)+n.thousand:"")+o.substring(r).replace(/(\d{3})(?=\d)/g,"$1"+n.thousand)+(n.precision?n.decimal+c(Math.abs(e),n.precision).split(".")[1]:"")}return e},e.epoAPI.math.toFixed=c}(window.jQuery),function(l){"use strict";var t,o=/\r?\n/g,n=/^(?:checkbox|radio)$/i,r=/^(?:submit|button|image|reset|file)$/i,i=/^(?:input|select|textarea|keygen)/i;l.easing.easeInExpo||(l.easing.easeInExpo=t=function(e){return Math.pow(e,6)},l.easing.easeOutExpo=function(e){return 1-t(1-e)},l.easing.easeInOutExpo=function(e){return e<.5?t(2*e)/2:1-t(-2*e+2)/2}),l.fn.extend({tmcheckboxes:function(){var e=this.find(":checkbox:not('.tm-default-checkbox')").not(".wp-tab-panel :checkbox, .tm-weekdays-picker-wrap :checkbox, .tm-months-picker-wrap :checkbox");return e.wrap('<label class="tm-epo-switch-wrapper-label"></label>'),e.wrap('<span class="tm-epo-switch-wrapper tc"></span>'),e.after('<span class="tc-label tm-epo-switch tc"></span>'),this},tcSerializeArray:function(){return this.find(":input").filter(function(){var e=this.type;return this.name&&!l(this).is(":disabled")&&i.test(this.nodeName)&&!r.test(e)&&(this.checked||!n.test(e))}).map(function(e,t){var n=l(this).val();return null===n?null:Array.isArray(n)?l.map(n,function(e){return{name:t.name,value:e.replace(o,"\r\n")}}):{name:t.name,value:n.replace(o,"\r\n")}}).get()},tcSerializeObject:function(){var e={},t=this.tcSerializeArray();return l.each(t,function(){void 0!==e[this.name]&&this.name.endsWith("[]")?(e[this.name].push||(e[this.name]=[e[this.name]]),e[this.name].push(this.value||"")):e[this.name]=this.value||""}),e},tcScrollTo:function(e,t,n){var o=this;return 0===(e=l(e)).length?this:(t=t||0,n=n||0,o[0].self!==window&&(o=o.find(".woodmart-scroll-content").length?o.find(".woodmart-scroll-content"):o).offset()?n+=o.scrollTop()-o.offset().top:o=l("html, body"),o.animate({scrollTop:l(e).offset().top+n},t))},tcClone:function(){for(var e,t,n=l.fn.clone.apply(this,arguments),o=this.find("textarea").add(this.filter("textarea")),r=n.find("textarea").add(n.filter("textarea")),i=this.find("select").add(this.filter("select")),a=n.find("select").add(n.filter("select")),c=0,s=o.length;c<s;c+=1)l(r[c]).val(l(o[c]).val());for(c=0,s=i.length;c<s;c+=1)for(e=0,t=i[c].options.length;e<t;e+=1)!0===i[c].options[e].selected&&(a[c].options[e].selected=!0);return n}})}(window.jQuery);
!function(s){"use strict";function c(t){for(var r,n=[void 0,null,!1,0,"","0"],e=0,i=n.length;e<i;e++)if(t===n[e])return 1;if("object"==typeof t){for(r in t)if(t.hasOwnProperty(r))return;return 1}}function f(t,r){return!(!r||r.constructor!==Array&&r.constructor!==Object)&&t in r}function l(t){return{}.toString.call(t).split(" ")[1].slice(0,-1).toLowerCase()}function h(t,r){var n;return"string"!=typeof t&&"number"!=typeof t||isNaN(t)?void 0!==r?r:0:(n=parseFloat(t),isNaN(n)?void 0!==r?r:t:n)}function n(t,r){return t===r?0:r<t?1:-1}function t(t){return t=(t+"").replace(/[^01]/gi,""),parseInt(t,2)}function r(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(2)}function e(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(16)}function i(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(8)}function a(t){return.017453292519943295*t}function o(t,r=0){var n=0<=t?1:-1;return 0===r?Math.round(t):parseFloat((Math.round(t*Math.pow(10,r)+1e-4*n)/Math.pow(10,r)).toFixed(r))}function _(t){return t=(t+"").replace(/[^a-f0-9]/gi,""),parseInt(t,16)}function p(t){return t=(t+"").replace(/[^0-7]/gi,""),parseInt(t,8)}function g(t,r){var n;return t=Math.abs(t),r=Math.abs(r),n=Math.min(t,r),n/=t=Math.max(t,r),t*Math.sqrt(1+n*n)||null}var u={variables:{},on_var_not_found:void 0,on_var_validation:void 0,operators:{},functions:{},cache:{},construct:function(){return this.add_defaults(),this.set_division_by_zero_to_zero(),this},add_operator:function(t){return this.operators[t.operator]=t,this},evaluate:function(t,r=!0){return this.execute(t,r)},parse:function(t){var r,n=0;for(r of t)if("("===r?n++:")"===r&&n--,n<0)return!1;return 0===n&&(t=(t=new v(t,this.operators)).tokenize().build_reverse_polish_notation(),t=new y(this.functions,this.operators).calculate(t,this.variables,this.on_var_not_found,this),"number"===l(t))&&!isNaN(t)&&t},execute:function(t,r=!0){var n,e=t;return f(e,this.cache)?n=this.cache[e]:(n=(n=new v(t,this.operators)).tokenize().build_reverse_polish_notation(),r&&(this.cache[e]=n)),t=new y(this.functions,this.operators).calculate(n,this.variables,this.on_var_not_found,this),t="number"===l(t)&&!isNaN(t)?t:0},add_function:function(t,r){return this.functions[t]=new E(t,r),this},get_vars:function(){return this.variables},get_var:function(t){return f(t,this.variables)?this.variables[t]:(this.on_var_not_found&&"function"==typeof this.on_var_not_found&&this.on_var_not_found(t),A.trigger("Variable ("+t+") not set","UnknownVariableError",0))},set_var:function(t,r){return this.on_var_validation&&"function"==typeof this.on_var_validation&&(r=this.on_var_validation(t,r)),this.variables[t]=r,this},var_exists:function(t){return f(t,this.variables)},set_vars:function(t,r=!0){var n=this;return r&&this.remove_vars(),t.forFach(function(t,r){n.set_var(r,t)}),this},set_var_not_found_handler:function(t){return this.on_var_not_found=t,this},set_var_validation_handler:function(t){return this.on_var_validation=t,this},remove_var:function(t){return delete this.variables[t],this},remove_vars:function(){return this.variables={},this.on_var_not_found=null,this},get_operators:function(){return this.operators},get_functions:function(){return this.functions},remove_operator:function(t){delete this.operators[t]},set_division_by_zero_to_zero:function(){return this.add_operator(new d("/",!1,180,function(t,r){return t=Number(t),0==(r=Number(r))?0:t/r})),this},get_cache:function(){return this.cache},clear_cache:function(){this.cache=[]},add_defaults:function(){var n=this,e=this.default_operators(),i=this.default_functions();return Object.keys(e).forEach(function(t){var r=e[t];n.add_operator(new d(t,r[2],r[1],r[0]))}),Object.keys(i).forEach(function(t){var r=i[t];n.add_function(t,r)}),this.on_var_validation=this.default_var_validation,this.variables=this.default_vars(),this},default_operators:function(){return{"+":[function(t,r){return(t=h(t,0))+(r=h(r,0))},170,!1],"-":[function(t,r){return(t=h(t,0))-(r=h(r,0))},170,!1],uPos:[function(t){return t=h(t,0)},200,!1],uNeg:[function(t){return 0-(t=h(t,0))},200,!1],"*":[function(t,r){return(t=h(t,0))*(r=h(r,0))},180,!1],"/":[function(t,r){return t=h(t,0),r=h(r,0),c(r)?A.trigger("Division By Zero","DivisionByZeroError",0):t/r},180,!1],"^":[function(t,r){return t=h(t,0),r=h(r,0),Math.pow(t,r)},220,!0],"%":[function(t,r){return(t=h(t,0))%(r=h(r,0))},180,!1],"&&":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),r.isNumeric()&&(r=h(r,0)),t&&r?1:0},100,!1],"||":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),r.isNumeric()&&(r=h(r,0)),t||r?1:0},90,!1],"==":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&r.isNumeric()?h(t)===h(r)?1:0:0===n(t,r)?1:0},140,!1],"!=":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&r.isNumeric()?h(t)!==h(r)?1:0:0!==n(t,r)?1:0},140,!1],">=":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),(r=r.isNumeric()?h(r,0):r)<=t?1:0},150,!1],">":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),(r=r.isNumeric()?h(r,0):r)<t?1:0},150,!1],"<=":[function(t,r){return t=String(t),r=String(r),(t=t.isNumeric()?h(t,0):t)<=(r=r.isNumeric()?h(r,0):r)?1:0},150,!1],"<":[function(t,r){return t=String(t),r=String(r),(t=t.isNumeric()?h(t,0):t)<(r=r.isNumeric()?h(r,0):r)?1:0},150,!1]}},default_functions:function(){var u=this;return{abs:Math.abs,acos:Math.acos,acosh:Math.acosh,arcsin:Math.asin,arcctg:function(t){return Math.PI/2-Math.atan(t)},arccot:function(t){return Math.PI/2-Math.atan(t)},arccotan:function(t){return Math.PI/2-Math.atan(t)},arcsec:function(t){return Math.acos(1/t)},arccosec:function(t){return Math.asin(1/t)},arccsc:function(t){return Math.asin(1/t)},arccos:Math.acos,arctan:Math.atan,arctg:Math.atan,array:function(...t){return t},asin:Math.asin,atan:Math.atan,atan2:Math.atan2,atanh:Math.atanh,atn:Math.atan,avg:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(r=[].concat.apply([],[t,...r])).reduce(function(t,r){return h(r,0)+h(t,0)})/r.length},average:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(r=[].concat.apply([],[t,...r])).reduce(function(t,r){return h(r,0)+h(t,0)})/r.length},bindec:t,ceil:Math.ceil,cos:Math.cos,cosec:function(t){return Math.sin(1/t)},csc:function(t){return Math.sin(1/t)},cosh:Math.cosh,ctg:function(t){return Math.cos(t)/Math.sin(t)},cot:function(t){return Math.cos(t)/Math.sin(t)},cotan:function(t){return Math.cos(t)/Math.sin(t)},cotg:function(t){return Math.cos(t)/Math.sin(t)},ctn:function(t){return Math.cos(t)/Math.sin(t)},decbin:r,dechex:e,decoct:i,deg2rad:a,exp:Math.exp,expm1:Math.expm1,floor:Math.floor,int:Math.floor,fmod:function(t,r){return t%r},hexdec:_,hypot:g,if:function(t,r,n){t=0===t||1===t||!0===t||!1===t?t:u.execute(t);return t?u.execute(r):u.execute(n)},intdiv:function(t,r){return Math.trunc(Math.trunc(t)/Math.trunc(r))},ln:Math.log,lg:Math.log10,log:Math.log,log1p:Math.log1p,max:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(t=(t=Array.isArray(t)?t:[t,...r]).map(h),Math.max(...t))},min:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(t=(t=Array.isArray(t)?t:[t,...r]).map(h),Math.min(...t))},octdec:p,pi:function(){return Math.PI},pow:Math.pow,rad2deg:function(t){return 57.29577951308232*t},round:o,sin:Math.sin,sinh:Math.sinh,sec:function(t){return 1/Math.cos(t)},sqrt:Math.sqrt,tan:Math.tan,tanh:Math.tanh,tn:Math.tan,tg:Math.tan,lookuptable:function(t,r){var n,e=0,i=0,a=s.TMEPOJS;if(a&&(a=s&&s.jQuery&&s.jQuery.epoAPI&&s.jQuery.epoAPI.util.parseJSON(a.lookupTables))){if(Array.isArray(r)&&(i=r[1],r=r[0]),c(r))return 0;c(i)&&(i=0),t=Array.isArray(t)?(n=String(t[0]),String(t[1])):(n=String(t),""),(a=(a=a[r])&&a[i])&&(void 0===(r=(a=a.data)[n])&&n&&void 0!==n&&(n.isNumeric()&&0===h(n)?r=a[Object.keys(a)[0]]:n&&(r=a[n=u.find_lookup_table_index(n,a)])),void 0!==r)&&(t=t&&void 0!==t?u.find_lookup_table_index(t,r):Object.keys(r)[0],e=h("max"===t?r[Object.keys(r)[Object.keys(r).length-1]]:r[t]))}return e},concat:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(Array.isArray(t)?t:[t,...r]).join("")}}},find_lookup_table_index:function(n,t){var r,e,i,t=Object.keys(t);if(i=(e=t)[e.length-1],e.every(function(t){return String(t).isNumeric()})||"max"===i){if(n=String(n).isNumeric()?h(n):n,r=t.map(function(t){return String(t).isNumeric()?h(t):t}).reduce(function(t,r){return"max"===r&&t<n?r:"max"===t&&r<n?t:t<r?t<n&&n<=r||r<n?r:t:r<n&&n<=t||t<n||"max"===r?t:r}),t=t.map(function(t){return String(t).isNumeric()?h(t):t}),n>Math.max(...t)||n<Math.min(...t))return!1}else r=n;return r},default_vars:function(){return{pi:3.141592653589793,e:2.718281828459045}},default_var_validation:function(t,r){return/boolean|number|string/.test(typeof r)||Array.isArray(r)||void 0===r?r:A.trigger("Variable ("+t+") type ("+l(r)+") is not scalar or array!",0)}},v=function(t,r){var n={tokens:[],input:"",operators:{},number_buffer:"",string_buffer:"",allow_negative:!0,in_single_quoted_string:!1,in_double_quoted_string:!1,is_number:function(t){return"0"<=t&&t<="9"},is_alpha:function(t){return"a"<=t&&t<="z"||"A"<=t&&t<="Z"||"_"===t},is_dot:function(t){return"."===t},is_lp:function(t){return"("===t},is_rp:function(t){return")"===t},is_comma:function(t){return","===t},empty_number_buffer_as_literal:function(){this.number_buffer.length&&(this.tokens.push(m(b.LITERAL,this.number_buffer)),this.number_buffer="")},empty_str_buffer_as_variable:function(){""!==this.string_buffer&&(this.tokens.push(m(b.VARIABLE,this.string_buffer)),this.string_buffer="")},tokenize:function(){var r=!1,n=this,e=[];return this.tokens=[],this.input.toString().split("").forEach(function(t){switch(!0){case n.in_single_quoted_string:"\\"===t?r=!r||(n.string_buffer+="\\",!1):"'"===t?r?(n.string_buffer+="'",r=!1):(n.tokens.push(m(b.STRING,n.string_buffer)),n.in_single_quoted_string=!1,n.string_buffer=""):(r&&(n.string_buffer+="\\",r=!1),n.string_buffer+=t);break;case n.in_double_quoted_string:"\\"===t?r=!r||(n.string_buffer+="\\",!1):'"'===t?r?(n.string_buffer+='"',r=!1):(n.tokens.push(m(b.STRING,n.string_buffer)),n.in_double_quoted_string=!1,n.string_buffer=""):(r&&(n.string_buffer+="\\",r=!1),n.string_buffer+=t);break;case"["===t:n.tokens.push(m(b.FUNCTION,"array")),n.allow_negative=!0,n.tokens.push(m(b.LEFTPARENTHESIS,""));break;case" "===t||"\n"===t||"\r"===t||"\t"===t:break;case n.is_number(t):""!==n.string_buffer?n.string_buffer+=t:(n.number_buffer+=t,n.allow_negative=!1);break;case"e"===t.toLowerCase():if(n.number_buffer.length&&-1!==n.number_buffer.indexOf(".")){n.number_buffer+="e",n.allow_negative=!1;break}case n.is_alpha(t):n.number_buffer.length&&(n.empty_number_buffer_as_literal(),n.tokens.push(m(b.OPERATOR,"*"))),n.allow_negative=!1,n.string_buffer+=t;break;case'"'===t:n.in_double_quoted_string=!0;break;case"'"===t:n.in_single_quoted_string=!0;break;case n.is_dot(t):n.number_buffer+=t,n.allow_negative=!1;break;case n.is_lp(t):""!==n.string_buffer?(n.tokens.push(m(b.FUNCTION,n.string_buffer)),n.string_buffer=""):n.number_buffer.length&&(n.empty_number_buffer_as_literal(),n.tokens.push(m(b.OPERATOR,"*"))),n.allow_negative=!0,n.tokens.push(m(b.LEFTPARENTHESIS,t));break;case n.is_rp(t)||"]"===t:n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),n.allow_negative=!1,n.tokens.push(m(b.RIGHTPARENTHESIS,t));break;case n.is_comma(t):n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),n.allow_negative=!0,n.tokens.push(m(b.PARAMSEPARATOR,t));break;default:if("-"===t||"+"===t){if(n.allow_negative){n.allow_negative=!1,n.tokens.push(m(b.OPERATOR,"-"===t?"uNeg":"uPos"));break}if(n.number_buffer&&"e"===n.number_buffer[n.number_buffer.length-1]){n.number_buffer+=t;break}}n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),"$"!==t&&(0<n.tokens.length&&b.OPERATOR===n.tokens[n.tokens.length-1].type?n.tokens[n.tokens.length-1].value+=t:n.tokens.push(m(b.OPERATOR,t))),n.allow_negative=!0}}),this.empty_number_buffer_as_literal(),this.empty_str_buffer_as_variable(),this.tokens.forEach(function(t,r){e[r]=t.type}),e.forEach(function(t,r){0<r&&"space"===t&&"variable"===e[r+1]&&"variable"===e[r-1]&&(n.tokens[r]=new m(b.LITERAL,0),n.tokens.splice(r+1,1),n.tokens.splice(r-1,1))}),this},build_reverse_polish_notation:function(){var r,n,e,i=[],a=[],u=[],o=this;try{this.tokens.forEach(function(t){switch(t.type){case b.LITERAL:case b.VARIABLE:case b.STRING:i.push(t),0<u.length&&0===u[u.length-1]&&u.push(u.pop()+1);break;case b.FUNCTION:0<u.length&&0===u[u.length-1]&&u.push(u.pop()+1),a.push(t),u.push(0);break;case b.LEFTPARENTHESIS:a.push(t);break;case b.PARAMSEPARATOR:for(;b.LEFTPARENTHESIS!==a[a.length-1].type;){if(0===a.length)return A.trigger("Incorrect Brackets","IncorrectBracketsError",i);i.push(a.pop())}u.push(u.pop()+1);break;case b.OPERATOR:if(!f(t.value,o.operators))return A.trigger(t.value,"UnknownOperatorError",i);for(e=o.operators[t.value];0<a.length&&b.OPERATOR===a[a.length-1].type;){if(!f(a[a.length-1].value,o.operators))return A.trigger(a[a.length-1].value,"UnknownOperatorError",i);if(!(o.operators[a[a.length-1].value].priority>=e.priority))break;i.push(a.pop())}a.push(t);break;case b.RIGHTPARENTHESIS:for(;;)try{if(r=a.pop(),b.LEFTPARENTHESIS===r.type)break;i.push(r)}catch(t){return A.trigger("Incorrect Brackets","IncorrectBracketsError",i)}0<a.length&&b.FUNCTION===a[a.length-1].type&&((n=a.pop()).param_count=u.pop(),i.push(n));break;case b.SPACE:}})}catch(t){return i=[],A.trigger(t,"Error",i)}for(;0!==a.length;){if(b.LEFTPARENTHESIS===a[a.length-1].type||b.RIGHTPARENTHESIS===a[a.length-1].type)return A.trigger("Incorrect Brackets","IncorrectBracketsError",i);b.SPACE===a[a.length-1].type?a.pop():i.push(a.pop())}return i}};return n.input=t,n.operators=r,n},b={LITERAL:"literal",VARIABLE:"variable",OPERATOR:"operator",LEFTPARENTHESIS:"LP",RIGHTPARENTHESIS:"RP",FUNCTION:"function",PARAMSEPARATOR:"separator",STRING:"string",SPACE:"space"},m=function(t,r,n){var e={type:b.LITERAL,value:void 0,name:void 0,param_count:null};return e.type=t,e.value=r,e.name=n,e},d=function(t,r,n,e){var i={operator:"",is_right_assoc:!1,priority:0,function:null,places:0};return i.operator=t,i.is_right_assoc=r,i.priority=n,i.function=e,i.places=function(t){var r=/^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m;const n=/^\s*(_?)(.+?)\1\s*$/;return((t||"").toString().replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,"").match(r)||["","",""])[2].split(/,/).map(function(t){return t.replace(n,function(t,r,n){return n.split("=")[0].trim()})}).filter(String).length}(e),i.execute=function(t){var r,n,e=[];if(t.length<this.places)return t.splice(0,t.length),A.trigger("Incorrect Expression","IncorrectExpressionError",new m(b.LITERAL,0));for(r=0;r<this.places;r++)e.unshift(t.pop().value);return n=this.function.apply(null,e),"number"!==l(n)&&"string"!==l(n)&&(n=0),new m(b.LITERAL,n)},i},E=function(t,r){var n={name:"",function:void 0,required_param_count:void 0};return n.name=t,n.function=r,n.required_param_count=r.length,n.execute=function(t,r){var n,e,i,a=[];if((r=r<this.required_param_count?this.required_param_count:r)<this.required_param_count)return t.splice(0,t.length),A.trigger(this.name,"IncorrectNumberOfFunctionParametersError",new m(b.LITERAL,0));if(0<r)for(n=0;n<r;n++)null===(e=t.length?t.pop().value:0)?a.push(e="0"):a.unshift(e);return i=this.function.apply(null,a),m(b.LITERAL,i=i!==1/0&&i!==-1/0?i:0)},n},y=function(t,r){var n={functions:{},operators:{}};return n.functions=t,n.operators=r,n.calculate=function(t,e,i=null,a=!1){var u=this,o=[];if(c(t))return 0;try{t.forEach(function(t){var r,n;if(b.LITERAL===t.type||b.STRING===t.type)o.push(t);else if(b.VARIABLE===t.type)r=t.value,n=null,f(r,e)?n=e[r]:i&&"function"==typeof i?n=i(r):(a.variables[n=r]=n,e[r]=n),o.push(m(b.LITERAL,n,r));else if(b.FUNCTION===t.type){if(!f(t.value,u.functions)){if(a.add_function(t.value,function(){return 0}),u.functions=a.functions,!f(t.value,u.functions))return A.trigger(t.value,"UnknownFunctionError",0);A.trigger(t.value,"UnknownFunctionError",0)}o.push(u.functions[t.value].execute(o,t.param_count))}else if(b.OPERATOR===t.type){if(!f(t.value,u.operators))return A.trigger(t.value,"UnknownOperatorError",0);o.push(u.operators[t.value].execute(o))}})}catch(t){s.TMEPOJS&&s.TMEPOJS.WP_DEBUG&&s.console.log(t)}return null!=(t=o.pop())&&c(o)?(!1===t.value&&(t.value=0),!0===t.value&&(t.value=1),"string"===l(t.value)&&t.value.isNumeric()&&(t.value=h(t.value)),t.value):A.trigger("Stack must be empty","IncorrectExpressionError",0)},n},A={trigger:function(t,r="",n=!1){return s.TMEPOJS&&s.TMEPOJS.WP_DEBUG&&(s.console.log(r+"\n"+t),s.console.trace()),s.TMEPOGLOBALADMINJS&&s.TMEPOGLOBALADMINJS.WP_DEBUG?t:n}};s.tcmexp=u.construct()}(window);
!function(y,n,i){"use strict";function r(t,a,i,e,r){var o=this;o.field=a,o.currentCart=i,o.variableProductContainers=e,o.epoObject=r,o.$form=t,o.$wrap=t.closest(".tc-epo-element-product-container-wrap"),o.$attributeFields=t.find(".tc-epo-variable-product-selector"),o.$singleVariation=t.find(".tc-epo-element-single-variation"),o.$resetVariations=t.find(".tc-epo-element-variable-reset-variations"),o.variationData=t.data("product_variations"),o.useAjax=!1===o.variationData,o.xhr=!1,o.loading=!0,o.variationId=t.closest(".tc-epo-element-product-li-container").find(".tc-epo-element-product-container-variation-id input.product-variation-id"),o.getChosenAttributes=o.getChosenAttributes.bind(o),o.findMatchingVariations=o.findMatchingVariations.bind(o),o.isMatch=o.isMatch.bind(o),o.toggleResetLink=o.toggleResetLink.bind(o),t.on("click.tc-variation-form",".tc-epo-element-variable-reset-variations",{variationForm:o},o.onReset),t.on("tc_hide_variation",{variationForm:o},o.onHide),t.on("tc_show_variation",{variationForm:o},o.onShow),t.on("tc_reset_data",{variationForm:o},o.onResetDisplayedVariation),t.on("tc_reset_image",{variationForm:o},o.onResetImage),t.on("change.tc-variation-form",".tc-epo-variable-product-selector",{variationForm:o},o.onChange),t.on("tc_found_variation.tc-variation-form",{variationForm:o},o.onFoundVariation),t.on("tc_check_variations.tc-variation-form",{variationForm:o},o.onFindVariation),t.on("tc_update_variation_values.tc-variation-form",{variationForm:o},o.onUpdateAttributes),t.on("refresh.tc-variation-form",{variationForm:o},o.onRefreshContainer),t.on("update_field.tc-variation-form",{variationForm:o},o.onUpdateField),o.variationId.val(""),setTimeout(function(){t.trigger("refresh"),t.trigger("tc_variation_form"),o.loading=!1},100)}function l(t){var a=i.getElementById("tmpl-"+t).textContent;return/<#\s?data\./.test(a)||/{{{?\s?data\.(?!variation\.).+}}}?/.test(a)||/{{{?\s?data\.variation\.[\w-]*[^\s}]/.test(a)?n.wp.template(t):function(t){var r,o=t.variation||{};return a.replace(/({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g,function(t,a,i,e){return a.length!==e.length?"":(r=o[i]||"",2===a.length?n.escape(r):r)})}}r.prototype.onRefreshContainer=function(t){t=t.data.variationForm;t.variableProductContainers.find(".tc-epo-element-product-container").removeClass("variations_form"),t.$form.addClass("variations_form"),t.$form.trigger("tc_check_variations.tc-variation-form")},r.prototype.onUpdateField=function(t,a){var i=t.data.variationForm,e=i.field;t.preventDefault(),a||((t=e).is("select")&&(t=e.find("option:selected")),e.data("price_set",1),t.data("associated_price_set",1),t.data("price_set",1),t.data("raw_price",0),t.data("raw_original_price",0),t.data("price",0),t.data("original_price",0),e.data("price-changed",1),i.$form.trigger({type:"tm-epo-update",norules:2}),i.currentCart.trigger({type:"tm-epo-update",norules:2}))},r.prototype.onReset=function(t){t.preventDefault(),t.data.variationForm.$attributeFields.val("").trigger("change"),t.data.variationForm.$form.trigger("tc_reset_data")},r.prototype.onHide=function(t){t.preventDefault()},r.prototype.onShow=function(t){t.preventDefault()},r.prototype.onResetDisplayedVariation=function(t){t=t.data.variationForm;t.$form.find(".product-meta").find(".tc-product-sku").tc_reset_content(),t.$form.trigger("tc_reset_image"),t.$singleVariation.slideUp(200).trigger("tc_hide_variation")},r.prototype.onResetImage=function(t){t.data.variationForm.$form.tc_variations_image_update(!1)},r.prototype.onFindVariation=function(t){var a,i=t.data.variationForm,e=i.getChosenAttributes(),t=e.data;if(e.count===e.chosenCount)if(i.useAjax){if("undefined"==typeof wc_add_to_cart_variation_params)return;i.xhr&&i.xhr.abort(),a=i.$form.closest(".cpf-type-product"),i.$form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),t.product_id=parseInt(i.$form.data("product_id"),10),t.discount=a.attr("data-discount"),t.discount_type=a.attr("data-discount-type"),t.discount_exclude_addons=a.attr("data-discount-exclude-addons"),i.xhr=y.ajax({url:wc_add_to_cart_variation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_variation"),type:"POST",data:t,success:function(t){t?i.$form.trigger("tc_found_variation",[t]):(i.$form.trigger("tc_reset_data"),e.chosenCount=0,i.loading||(i.$form.find(".tc-epo-element-single-variation").after('<p class="wc-no-matching-variations woocommerce-info">'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"</p>"),i.$form.find(".wc-no-matching-variations").slideDown(200),i.$form.trigger("update_field",[])))},complete:function(){i.$form.unblock()}})}else i.$form.trigger("tc_update_variation_values"),(a=i.findMatchingVariations(i.variationData,t).shift())?i.$form.trigger("tc_found_variation",[a]):(i.$form.trigger("tc_reset_data"),e.chosenCount=0,i.loading||(i.$form.find(".tc-epo-element-single-variation").after('<p class="wc-no-matching-variations woocommerce-info">'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"</p>"),i.$form.find(".wc-no-matching-variations").slideDown(200)));else i.variationId.val("").trigger("change"),i.$form.trigger("tc_update_variation_values"),i.$form.trigger("tc_reset_data"),i.$form.trigger("update_field",[]);i.toggleResetLink(0<e.chosenCount)},r.prototype.onFoundVariation=function(t,a){var t=t.data.variationForm,i=t.$form.find(".product-meta").find(".tc-product-sku"),e=t.$wrap.find(".tm-quantity-alt"),r=e.find("input.tm-qty-alt"),o=y.epoAPI.math.toInt(r.attr("data-min")),n=y.epoAPI.math.toInt(r.attr("data-max")),c=r.attr("data-max"),s=!0,_=!1,d="";a.sku?i.tc_set_content(a.sku):i.tc_reset_content(),t.$form.tc_variations_image_update(a),_=a.variation_is_visible?l("variation-template"):l("unavailable-variation-template"),t.field.attr("data-no-price")&&(a.display_price="",a.display_regular_price="",a.price_html=""),t.$form.find(".tc-epo-element-product-container-cart").find(".stock").remove(),d=(d=(d=_({variation:a})).replace("/*<![CDATA[*/","")).replace("/*]]>*/",""),t.$singleVariation.html(d),t.variationId.val(a.variation_id).trigger("change"),"yes"===a.is_sold_individually?(r.val("1").attr("min","1").attr("max","1"),e.hide()):(""!==a.min_qty&&a.min_qty>o&&0<o&&(o=a.min_qty),""!==a.max_qty&&a.max_qty<n&&(n=a.max_qty),""!==o?r.attr("min",o):r.removeAttr("min"),""!==c?r.attr("max",n):r.removeAttr("max"),n&&y.epoAPI.math.toInt(r.val())>n&&r.val(n),o>y.epoAPI.math.toInt(r.val())&&r.val(o),e.show()),a.is_purchasable&&a.is_in_stock&&a.variation_is_visible||(s=!1,r.val("0").attr("min","0").attr("max","0"),e.hide()),r.trigger("change"),(y.epoAPI.util.trim(t.$singleVariation.text())?t.$singleVariation.slideDown(200):t.$singleVariation.show()).trigger("tc_show_variation",[a,s]),t.$form.trigger("update_field",[a])},r.prototype.onChange=function(t){var t=t.data.variationForm,a=t.field;t.variationId.val("").trigger("change"),t.$form.find(".wc-no-matching-variations").remove(),t.useAjax||t.$form.trigger("woocommerce_variation_select_change"),t.$form.trigger("tc_check_variations"),t.$form.trigger("woocommerce_variation_has_changed"),setTimeout(function(){a.closest(".tcowl-carousel").trigger("refresh.owl.carousel")},50)},r.prototype.onUpdateAttributes=function(t){var w=t.data.variationForm,b=w.getChosenAttributes().data;w.useAjax||(w.$attributeFields.each(function(t,a){var i,e,r,o,n,c,s,_,d,l,m,v=y(a),g=v.data("attribute_name")||v.attr("name"),a=y(a).data("show_option_none"),p=":gt(0)",f=y("<select/>"),u=v.val()||"",h=!0;for(r in v.data("attribute_html")||((i=v.clone()).find("option").prop("disabled",!1).prop("selected",!1).removeAttr("attached"),v.data("attribute_options",i.find("option"+p).get()),v.data("attribute_html",i.html())),f.html(v.data("attribute_html")),(i=y.extend(!0,{},b))[g]="",e=w.findMatchingVariations(w.variationData,i))if(void 0!==e[r])for(s in c=e[r].attributes)if(Object.prototype.hasOwnProperty.call(c,s)&&(_=c[s],d="",s===g))if(e[r].variation_is_active&&(d="enabled"),_){if(_=y("<div/>").html(_).text(),(l=f.find("option")).length)for(o=0,n=l.length;o<n;o++)if(_===(m=y(l[o])).val()){m.addClass("attached "+d);break}}else f.find("option:gt(0)").addClass("attached "+d);i=f.find("option.attached").length,u&&(h=!1,0!==i)&&f.find("option.attached.enabled").each(function(){var t=y(this).val();if(u===t)return!(h=!0)}),0<i&&u&&h&&"no"===a&&(f.find("option:first").remove(),p=""),f.find("option"+p+":not(.attached)").remove(),v.html(f.html()),v.find("option"+p+":not(.enabled)").prop("disabled",!0),u?h?v.val(u):v.val("").trigger("change"):v.val("")}),w.$form.trigger("woocommerce_update_variation_values"))},r.prototype.getChosenAttributes=function(){var i={},e=0,r=0;return this.$attributeFields.each(function(){var t=y(this).data("attribute_name")||y(this).attr("name"),a=y(this).val()||"";0<a.length&&r++,e++,i[t]=a}),{count:e,chosenCount:r,data:i}},r.prototype.findMatchingVariations=function(t,a){for(var i,e=[],r=0;r<t.length;r++)i=t[r],this.isMatch(i.attributes,a)&&e.push(i);return e},r.prototype.isMatch=function(t,a){var i,e,r,o=!0;for(r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i=t[r],e=a[r],void 0!==i)&&void 0!==e&&0!==i.length&&0!==e.length&&i!==e&&(o=!1);return o},r.prototype.toggleResetLink=function(t){t?"hidden"===this.$resetVariations.css("visibility")&&this.$resetVariations.css("visibility","visible").hide().fadeIn():this.$resetVariations.css("visibility","hidden")},y.fn.tc_product_variation_form=function(t,a,i,e){return new r(this,t,a,i,e),this.trigger("tc_product_variation_form"),this},y.fn.tc_set_content=function(t){void 0===this.attr("data-o_content")&&this.attr("data-o_content",this.text()),this.text(t)},y.fn.tc_reset_content=function(){void 0!==this.attr("data-o_content")&&this.text(this.attr("data-o_content"))},y.fn.tc_set_variation_attr=function(t,a){void 0===this.attr("data-o_"+t)&&this.attr("data-o_"+t,this.attr(t)?this.attr(t):""),!1===a?this.removeAttr(t):this.attr(t,a)},y.fn.tc_reset_variation_attr=function(t){void 0!==this.attr("data-o_"+t)&&this.attr(t,this.attr("data-o_"+t))},y.fn.tc_variations_image_update=function(t){var a=this.find(".tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),i=a.find(".wp-post-image"),e=a.find("a").eq(0);t&&t.image&&t.image.src&&1<t.image.src.length?(i.tc_set_variation_attr("src",t.image.src),i.tc_set_variation_attr("height",t.image.src_h),i.tc_set_variation_attr("width",t.image.src_w),i.tc_set_variation_attr("srcset",t.image.srcset),i.tc_set_variation_attr("sizes",t.image.sizes),i.tc_set_variation_attr("title",t.image.title),i.tc_set_variation_attr("data-caption",t.image.caption),i.tc_set_variation_attr("alt",t.image.alt),i.tc_set_variation_attr("data-src",t.image.full_src),i.tc_set_variation_attr("data-large_image",t.image.full_src),i.tc_set_variation_attr("data-large_image_width",t.image.full_src_w),i.tc_set_variation_attr("data-large_image_height",t.image.full_src_h),a.tc_set_variation_attr("data-thumb",t.image.src),e.tc_set_variation_attr("href",t.image.full_src)):this.tc_variations_image_reset()},y.fn.tc_variations_image_reset=function(){var t=this.find(".tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),a=t.find(".wp-post-image"),i=t.find("a").eq(0);a.tc_reset_variation_attr("src"),a.tc_reset_variation_attr("width"),a.tc_reset_variation_attr("height"),a.tc_reset_variation_attr("srcset"),a.tc_reset_variation_attr("sizes"),a.tc_reset_variation_attr("title"),a.tc_reset_variation_attr("data-caption"),a.tc_reset_variation_attr("alt"),a.tc_reset_variation_attr("data-src"),a.tc_reset_variation_attr("data-large_image"),a.tc_reset_variation_attr("data-large_image_width"),a.tc_reset_variation_attr("data-large_image_height"),t.tc_reset_variation_attr("data-thumb"),i.tc_reset_variation_attr("href")}}(window.jQuery,window,document);
!function(o){"use strict";function a(t,e){return this.element=o(t),this.settings=o.extend({},o.fn.tcFloatBox.defaults,e),this.settings.type="<"+this.settings.type+">",this.top=0,this.left=0,this.ticking=!1,1===this.element.length&&(this.init(),this)}a.prototype={constructor:a,destroy:function(){var t=this.settings;return void 0!==this.instance&&(o.fn.tcFloatBox.instances.splice(this.instance,1),delete this.instance,t.hideelements&&o("embed, object, select").css({visibility:"visible"}),t._ovl&&(t._ovl.off(),t._ovl.remove(),delete t._ovl),o(t.floatboxID).remove(),this.element.removeData("tcfloatbox"),o(window).off("scroll.tcfloatbox"+this.instance),o(window).off("resize.tcfloatbox"+this.instance)),this},hide:function(){var t=this.settings;t.hideelements&&o("embed, object, select").css({visibility:"visible"}),!0===t.showoverlay&&t._ovl&&t._ovl.hide(),o(t.floatboxID).addClass("tc-closing").removeClass(t.animateIn).addClass(t.animateOut),o(t.floatboxID).animate({opacity:0},t.closefadeouttime,function(){o(t.floatboxID).hide(),o(t.floatboxID).removeClass("tc-closing").addClass("tc-closed")}),o(window).off("scroll.tcfloatbox"+this.instance),o(window).off("resize.tcfloatbox"+this.instance)},requestTick:function(){var t=this.settings;this.ticking||(t.refresh?setTimeout(this.requestAnimationFrame.bind(this),t.refresh):requestAnimationFrame(this.update),this.ticking=!0)},requestAnimationFrame:function(){requestAnimationFrame(this.update.bind(this))},update:function(){this.render(),this.ticking=!1},doit:function(){this.requestTick()},render:function(){var t=this.settings,e=o.epoAPI.dom.size(),i="fixed"===t.refresh?{top:0,left:0}:o.epoAPI.dom.scroll(),n=parseInt(i.top+(e.visibleHeight-o(t.floatboxID).height())/2,10),i=parseInt(i.left+(e.visibleWidth-o(t.floatboxID).width())/2,10);n=parseInt((n-this.top)/t.fps,10),i=parseInt((i-this.left)/t.fps,10),this.top+=n,this.left+=i,o(t.floatboxID).css({top:this.top+"px",left:this.left+"px",opacity:1})},show:function(){var t,e,i=this.settings;1===this.element.length&&(void 0===this.instance&&this.init(),i.hideelements&&o("embed, object, select").css({visibility:"hidden"}),e=o.epoAPI.dom.size(),!0===i.showoverlay&&(i._ovl?i._ovl.show():(i._ovl=o('<div class="fl-overlay"></div>').css({zIndex:parseInt(i.zIndex,10)-1,opacity:i.overlayopacity}),i._ovl.appendTo("body"),i.ismodal||(i.cancelEvent||i.unique?i._ovl.on("click",this.applyCancelEvent.bind(this)):i._ovl.on("click",i.cancelfunc.bind(this))))),i.showfunc&&i.showfunc.call(),o(i.floatboxID).removeClass("tc-closing").addClass(i.animationBaseClass+" "+i.animateIn),"fixed"===i.refresh?(!1!==i.top?t=i.top:(t=parseInt((e.visibleHeight-o(i.floatboxID).height())/2,10),t+="px"),o(i.floatboxID).css({position:"fixed",top:t}),!1!==i.left&&o(i.floatboxID).css({left:i.left})):this.render())},applyCancelEvent:function(){var t=this.settings;!0===t.cancelEvent?this.destroy():"function"==typeof t.cancelEvent&&t.cancelEvent.call(this,this)},applyCancelEventFromKey:function(t){27===t.which&&this.applyCancelEvent()},applyUpdateEvent:function(){var t=this.settings;"function"==typeof t.updateEvent&&t.updateEvent.call(this,this)},applyUpdateEventFromKey:function(t){13===t.which&&this.applyUpdateEvent()},init:function(){var t,e,i=this.settings;1===this.element.length&&(0<o.fn.tcFloatBox.instances.length&&(i.zIndex=parseInt(o.fn.tcFloatBox.instances[o.fn.tcFloatBox.instances.length-1].zIndex,10)+100),this.instance=o.fn.tcFloatBox.instances.length,o.fn.tcFloatBox.instances.push(i),i.id=i.id+this.instance,i.floatboxID="#"+o.epoAPI.dom.id(i.id),this.hide(),t=o.epoAPI.dom.size(),e=o.epoAPI.dom.scroll(),o(i.type).attr("id",i.id).addClass(i.classname).html(i.data).appendTo(this.element),o(i.floatboxID).css({width:i.width,height:i.height}),i.minWidth&&o(i.floatboxID).css({"min-width":i.minWidth}),i.minHeight&&o(i.floatboxID).css({"min-height":i.minHeight}),e=parseInt(e.left+(t.visibleWidth-o(i.floatboxID).width())/2,10),o(i.floatboxID).css({top:"0px",left:e+"px","z-index":i.zIndex}),this.top=0,this.left=e,this.cancelfunc=i.cancelfunc,i.cancelEvent&&i.cancelClass&&(o(i.floatboxID).find(i.cancelClass).on("click",this.applyCancelEvent.bind(this)),i.isconfirm)&&o(document).off("keyup.escape-"+i.floatboxID).on("keyup.escape-"+i.floatboxID,this.applyCancelEventFromKey.bind(this)),i.updateEvent&&i.updateClass&&(o(i.floatboxID).find(i.updateClass).on("click",this.applyUpdateEvent.bind(this)),i.isconfirm)&&o(document).off("keyup.enter-"+i.floatboxID).on("keyup.enter-"+i.floatboxID,this.applyUpdateEventFromKey.bind(this)),this.show(),"fixed"!==i.refresh&&o(window).on("scroll.tcfloatbox"+this.instance,this.doit.bind(this)),o(window).on("resize.tcfloatbox"+this.instance,this.doit.bind(this)))}},o.fn.tcFloatBox=function(t){var e,i=o(this),n=i.data("tcfloatbox"),s="object"==typeof t?t:{};return n||(n=new a(this,s),i.data("tcfloatbox",n)),void 0===(e="string"==typeof t?n[t].apply(n,[]):e)?i:e},o.fn.tcFloatBox.defaults={id:"flasho",classname:"flasho",type:"div",data:"",width:"500px",height:"auto",minWidth:0,minHeight:0,closefadeouttime:1e3,animationBaseClass:"tm-animated",animateIn:"fadein",animateOut:"fadeout",top:!1,left:!1,refresh:!1,fps:4,hideelements:!1,showoverlay:!0,zIndex:100100,ismodal:!1,cancelfunc:a.prototype.hide,showfunc:null,cancelEvent:!0,cancelClass:".floatbox-cancel",updateEvent:!1,updateClass:!1,unique:!0,overlayopacity:.5,isconfirm:!1},o.fn.tcFloatBox.instances=[],o.fn.tcFloatBox.Constructor=a,o.tcFloatBox=function(t){var e=o("body"),i=!1;return e.map(function(){return o(this).data("tcfloatbox")||""}).get().some(function(t){return""===t})||t.unique?(i=new a(e,t),e.data("tcfloatbox",i)):(i=e.data("tcfloatbox")).init(),i}}(window.jQuery);
!function(m,v){"use strict";function l(t,i){return this.targets=v(t),this.settings=v.extend({},v.fn.tcToolTip.defaults,i),0<this.targets.length&&(this.init(),this)}var n;v(function(){n=m.TMEPOJS||{tm_epo_global_tooltip_max_width:"340px"}}),l.prototype={constructor:l,removeTooltip:function(t,i){var o=this.settings;t.data("is_moving")||(i.removeClass(o.fadin).addClass(o.fadeout),i.animate({opacity:0},o.speed,function(){v(this).remove()}),t.data("tmtip-title")&&void 0===t.data("tm-tip-html")&&!t.attr("data-tm-tooltip-html")&&t.attr("title",t.data("tmtip-title")),v(m).off("scroll.tcToolTip resize.tcToolTip"),o.onetime&&this.destroy())},initTooltip:function(t,i,o){var e,a,l,s,d=this.settings;t&&i&&1===t.length&&1===i.length&&1===t.data("tm-has-tm-tip")&&(1===o&&(e=void 0!==t.data("tm-tip-html")?t.data("tm-tip-html"):t.attr("data-tm-tooltip-html")?t.attr("data-tm-tooltip-html"):t.attr("title"),i.html(e),t.data("is_moving",!0)),i.find("aside").hide(),""===n.tm_epo_global_tooltip_max_width?v(m).width()<=1.2*i.outerWidth()?i.css("max-width",v(m).width()/1.2+"px"):i.css("max-width","340px"):(n.tm_epo_global_tooltip_max_width.isNumeric()&&(n.tm_epo_global_tooltip_max_width=n.tm_epo_global_tooltip_max_width+"px"),i.css("max-width",n.tm_epo_global_tooltip_max_width)),i.find("aside").show(),i.css({left:"",right:"",top:""}),e=v.epoAPI.dom.scroll(),(s=a=t.offset().left+t.outerWidth()/2-i.outerWidth()/2)<0?(a=t.offset().left+t.outerWidth()/2-20,i.addClass("left")):i.removeClass("left"),0<=s&&a+i.outerWidth()>v(m).width()?((a=t.offset().left-i.outerWidth()+t.outerWidth()/2+20)<0&&(a-=10,i.css("max-width","calc("+i.css("max-width")+" - "+Math.abs(a)+"px)"),a=10),i.addClass("right")):i.removeClass("right"),i.css({left:a,right:"auto",top:l}),l=t.offset().top-i.outerHeight()-10,s=t.offset().top-e.top-i.outerHeight()-10,l<0||s<0?(l=t.offset().top+t.outerHeight()+10,i.addClass("top"),i.removeClass("bottom")):(i.removeClass("top"),i.addClass("bottom")),v(m).trigger("tm_tooltip_show"),o?(i.css({left:a,top:l}),t.data("is_moving",!1)):i.css({left:a,top:l}).removeClass(d.fadeout).addClass(d.fadin))},show:function(t){var i,o=this.settings;if(!t.data("is_moving"))return 1===t.data("tm-has-tm-tip")&&(void 0!==t.data("tm-tip-html")?(i=t.data("tm-tip-html"),t.attr("title")&&t.data("tmtip-title",t.attr("title")),t.removeAttr("title")):t.attr("data-tm-tooltip-html")?(i=t.attr("data-tm-tooltip-html"),t.attr("title")&&t.data("tmtip-title",t.attr("title")),t.removeAttr("title")):i=t.attr("title"),void 0!==i)&&(v("#tm-tooltip").remove(),o.tipclass?o.tipclass=" "+o.tipclass:o.tipclass="",(o=v('<div id="tm-tooltip" class="tm-tip tm-animated'+o.tipclass+'"></div>')).css("opacity",0).html(i).appendTo("body"),0<(i=o.find("img")).length&&i.on("load",this.initTooltip.bind(this,t,o)),this.initTooltip(t,o),v(m).on("scroll.tcToolTip resize.tcToolTip",this.initTooltip.bind(this,t,o)),t.data("is_moving",!1),t.on("tmmovetooltip",this.initTooltip.bind(this,t,o,1)),t.on("mouseleave.tc tmhidetooltip",this.removeTooltip.bind(this,t,o)),t.closest("label").on("mouseleave.tc tmhidetooltip",this.removeTooltip.bind(this,t,o)),o.on("click",this.removeTooltip.bind(this,t,o))),!1},destroy:function(){0<this.targets.length&&(this.targets.toArray().forEach(function(t){t=v(t);t.closest("off").on("mouseleave.tc tmhidetooltip"),t.off("tc-tooltip-html-changed tmmovetooltip tmhidetooltip mouseenter.tc mouseleave.tc tmshowtooltip.tc"),t.removeData("tmtip-title"),t.removeData("tm-tip-html")}),this.targets.removeData("tctooltip tm-has-tm-tip is_moving"))},init:function(){var g=this,u=this.settings;0<this.targets.length&&this.targets.toArray().forEach(function(t){var i,o,e,a,l,s,d,m,n,r,p,h,c,f=v(t),t=u.tip||void 0;void 0===f.data("tm-has-tm-tip")&&(i=f.attr("data-tm-tooltip-swatch"),o=f.attr("data-tm-tooltip-swatch-desc"),e=f.attr("data-tm-tooltip-swatch-lbl-desc"),a=f.attr("data-tm-tooltip-swatch-img"),l=f.attr("data-tm-tooltip-swatch-img-lbl"),s=f.attr("data-tm-tooltip-swatch-img-desc"),d=f.attr("data-tm-tooltip-swatch-img-lbl-desc"),f.data("tm-has-tm-tip",1),r=void 0!==f.attr("data-original")?f.attr("data-original"):void 0!==f.attr("src")?void 0!==f.attr("data-src")?f.attr("data-src"):f.attr("src"):f[0].src,0===(p=0===(p=0===(p=(c=0===(c=(c=0===(c=(c=f.closest(".tmcp-field-wrap")).is(".tc-epo-element-product-holder")?f.closest(".cpf-element"):c).length?f.closest(".cpf-element"):c).is(".cpf-type-product")&&0===f.closest(".tm-epo-element-label").length&&f.closest(".cpf-section").length?f.closest(".cpf-section").find(".tc-section-inner-wrap .tm-section-description.tm-description"):c).length?f.closest(".cpf-section").find(".tc-section-inner-wrap .tm-section-description.tm-description"):c).find(".tm-tip-html")).length?c.find(".checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline"):p).length?c.next(".checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline,.tm-tip-html"):p).length&&c.is(".tm-description")&&(p=c),(c=(p=v(c=p)).find(".tc-label-text")).length||(c=p),h="yes"===f.attr("data-tm-hide-label")||void 0===f.attr("data-tm-hide-label")||p.is(".tm-tip-html"),n="",0===(m=(m=f.closest(".tmcp-field-wrap")).find("[data-tm-tooltip-html]")).length?0<(m=f.closest(".tmcp-field-wrap").find(".tc-inline-description")).length&&(n=m.html()):n=m.attr("data-tm-tooltip-html"),void 0===t?(i?t=c.html():o&&""!==n?t="<aside>"+n+"</aside>":!e||""===c.html()&&""===n?a&&""!==r?t='<img src="'+r+'">':!l||""===c.html()&&""===r?!s||""===r&&""===n?!d||""===c.html()&&""===r&&""===n||(t='<img src="'+r+'"><aside>'+c.html()+"</aside><aside>"+n+"</aside>"):t='<img src="'+r+'"><aside>'+n+"</aside>":t='<img src="'+r+'"><aside>'+c.html()+"</aside>":t="<aside>"+c.html()+"</aside><aside>"+n+"</aside>",void 0!==t&&(f.data("tm-tip-html",t),h)&&(p.find(".tm-tooltip").remove(),c.hide()),void 0===t&&(t=f.attr("data-tm-tooltip-html")?f.attr("data-tm-tooltip-html"):f.attr("title"))):f.data("tm-tip-html",t),f.on("tc-tooltip-html-changed",function(){f.attr("data-tm-tooltip-html")?f.show():f.hide()}),f.is("img")&&f.closest("label").on("mouseenter tmshowtooltip",g.show.bind(g,f)),f.on("mouseenter.tc tmshowtooltip.tc",g.show.bind(g,f)),u.trigger)&&g.show(f)})}},v.fn.tcToolTip=function(t){var i,o,e=v(this),a="object"==typeof t?t:{};return e.map(function(){return v(this).data("tctooltip")||""}).get().some(function(t){return""===t})&&(o=new l(this,a),e.data("tctooltip",o)),void 0===(i="string"==typeof t?(o=e.data("tctooltip"))[t].apply(o,[]):i)?e:i},v.fn.tcToolTip.defaults={fadin:"fadein",fadeout:"fadeout",speed:1500},v.fn.tcToolTip.instances=[],v.fn.tcToolTip.Constructor=l,v.tcToolTip=function(t,i){var o=!1;return(t=t||v(".tm-tooltip")).map(function(){return v(this).data("tctooltip")||""}).get().some(function(t){return""===t})&&(o=new l(t,i),t.data("tctooltip",o)),o}}(window,window.jQuery);
!function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):"object"==typeof window.module&&window.module.exports?window.module.exports=t(window.require("jquery")):t(window.jQuery)}(function(d){"use strict";var i,e,n={};return d.extend(d.fn,{tc_validate:function(t){var s;if(this.length)return(s=d.data(this[0],"tc_validator"))||(this.attr("novalidate","novalidate"),s=new d.tc_validator(t,this[0]),d.data(this[0],"tc_validator",s),s.settings.onsubmit&&(this.on("click.tc_validate",":submit",function(t){s.submitButton=t.currentTarget,d(this).hasClass("cancel")&&(s.cancelSubmit=!0),void 0!==d(this).attr("formnovalidate")&&(s.cancelSubmit=!0)}),this.on("submit.tc_validate",function(i){function t(){var t,e;return s.submitButton&&(s.settings.submitHandler||s.formSubmitted)&&(t=d("<input type='hidden'>").attr("name",s.submitButton.name).val(d(s.submitButton).val()).appendTo(s.currentForm)),!(s.settings.submitHandler&&!s.settings.debug)||(e=s.settings.submitHandler.call(s,s.currentForm,i),t&&t.remove(),void 0!==e&&e)}return s.settings.debug&&i.preventDefault(),s.cancelSubmit?(s.cancelSubmit=!1,t()):s.form()?s.pendingRequest?!(s.formSubmitted=!0):t():(s.focusInvalid(),!1)}))),s},tc_valid:function(){var t,e,i;return d(this[0]).is("form")?t=this.tc_validate().form():(i=[],t=!0,e=d(this[0].form).tc_validate(),this.each(function(){(t=e.element(this)&&t)||(i=i.concat(e.errorList))}),e.errorList=i),t},tc_rules:function(t,e){var i,s,n,r,a,o=this[0],l=void 0!==this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!==o&&(!o.form&&l&&(o.form=this.closest("form")[0],o.name=this.attr("name")),null!==o.form)){if(t)switch(s=(i=d.data(o.form,"tc_validator").settings).rules,n=d.tc_validator.staticRules(o),t){case"add":d.extend(n,d.tc_validator.normalizeRule(e)),delete n.messages,s[o.name]=n,e.messages&&(i.messages[o.name]=d.extend(i.messages[o.name],e.messages));break;case"remove":return e?(a={},d.each(e.split(/\s/),function(t,e){a[e]=n[e],delete n[e]}),a):(delete s[o.name],n)}return(l=d.tc_validator.normalizeRules(d.extend({},d.tc_validator.classRules(o),d.tc_validator.attributeRules(o),d.tc_validator.dataRules(o),d.tc_validator.staticRules(o)),o)).required&&(r=l.required,delete l.required,l=d.extend({required:r},l)),l.remote&&(r=l.remote,delete l.remote,l=d.extend(l,{remote:r})),l}}}),e=function(t){return t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},d.extend(d.expr.pseudos||d.expr[":"],{blank:function(t){return!e(""+d(t).val())},filled:function(t){t=d(t).val();return null!==t&&!!e(""+t)},unchecked:function(t){return!d(t).prop("checked")}}),d.tc_validator=function(t,e){this.settings=d.extend(!0,{},d.tc_validator.defaults,t),this.currentForm=e,this.init()},d.tc_validator.format=function(i,t){return 1===arguments.length?function(){var t=d.makeArray(arguments);return t.unshift(i),d.tc_validator.format.apply(this,t)}:(void 0!==t&&((t=2<arguments.length&&t.constructor!==Array?d.makeArray(arguments).slice(1):t).constructor!==Array&&(t=[t]),d.each(t,function(t,e){i=i.replace(new RegExp("\\{"+t+"\\}","g"),function(){return e})})),i)},d.extend(d.tc_validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:d([]),errorLabelContainer:d([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(t){this.lastActive=t,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,t,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(t)))},onfocusout:function(t){this.checkable(t)||!(t.name in this.submitted)&&this.optional(t)||this.element(t)},onkeyup:function(t,e){9===e.which&&""===this.elementValue(t)||-1!==d.inArray(e.keyCode,[16,17,18,20,35,36,37,38,39,40,45,144,225])||(t.name in this.submitted||t.name in this.invalid)&&this.element(t)},onclick:function(t){t.name in this.submitted?this.element(t):t.parentNode.name in this.submitted&&this.element(t.parentNode)},highlight:function(t,e,i){("radio"===t.type?this.findByName(t.name):d(t)).addClass(e).removeClass(i)},unhighlight:function(t,e,i){("radio"===t.type?this.findByName(t.name):d(t)).removeClass(e).addClass(i)}},setDefaults:function(t){d.extend(d.tc_validator.defaults,t)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:d.tc_validator.format("Please enter no more than {0} characters."),maxlengthsingle:d.tc_validator.format("Please enter no more than {0} character."),minlength:d.tc_validator.format("Please enter at least {0} characters."),minlengthsingle:d.tc_validator.format("Please enter at least {0} character."),rangelength:d.tc_validator.format("Please enter a value between {0} and {1} characters long."),range:d.tc_validator.format("Please enter a value between {0} and {1}."),max:d.tc_validator.format("Please enter a value less than or equal to {0}."),min:d.tc_validator.format("Please enter a value greater than or equal to {0}."),step:d.tc_validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){var i,n=this.currentForm;function t(t){var e,i,s=void 0!==d(t.data.that).attr("contenteditable")&&"false"!==d(t.data.that).attr("contenteditable");!t.data.that.form&&s&&(t.data.that.form=d(t.data.that).closest("form")[0],t.data.that.name=d(t.data.that).attr("name")),n===t.data.that.form&&(s=d.data(t.data.that.form,"tc_validator"),e="on"+t.type.replace(/^validate/,""),(i=s.settings)[e])&&!d(t.data.that).is(i.ignore)&&i[e].call(s,t.data.that,t)}this.labelContainer=d(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||d(this.currentForm),this.containers=d(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset(),this.groups={},d.each(this.settings.groups,function(t,e){"string"==typeof e&&(e=e.split(/\s/)),d.each(e,function(t,e){e,0})}),i=this.settings.rules,d.each(i,function(t,e){i[t]=d.tc_validator.normalizeRule(e)}),d(this.currentForm).on("focusin.tc_validate focusout.tc_validate keyup.tc_validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",{that:this},t).on("click.tc_validate","select, option, [type='radio'], [type='checkbox']",{that:this},t),this.settings.invalidHandler&&d(this.currentForm).on("invalid-form.tc_validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),d.extend(this.submitted,this.errorMap),this.invalid=d.extend({},this.errorMap),this.tc_valid()||d(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.tc_valid()},checkForm:function(){var t,e;for(this.prepareForm(),t=0,e=this.elements();e[t];t+=1)this.currentElements=e,this.check(e[t]);return this.tc_valid()},element:function(t){var e,i,s=this.clean(t),n=this.validationTargetFor(s),r=this,a=!0;return void 0===n?delete this.invalid[s.name]:(this.prepareElement(n),this.currentElements=d(n),(i=this.groups[n.name])&&d.each(this.groups,function(t,e){e===i&&t!==n.name&&(s=r.validationTargetFor(r.clean(r.findByName(t))))&&s.name in r.invalid&&(r.currentElements.push(s),a=r.check(s)&&a)}),e=!1!==this.check(n),a=a&&e,this.invalid[n.name]=!e,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),d(t).attr("aria-invalid",!e)),a},showErrors:function(e){var i;e&&(d.extend((i=this).errorMap,e),this.errorList=d.map(this.errorMap,function(t,e){return{message:t,element:i.findByName(e)[0]}}),this.successList=d.grep(this.successList,function(t){return!(t.name in e)})),this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){var t;d.fn.resetForm&&d(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors(),t=this.elements().removeData("previousValue").removeAttr("aria-invalid"),this.resetElements(t)},resetElements:function(t){var e;if(this.settings.unhighlight)for(e=0;t[e];e+=1)this.settings.unhighlight.call(this,t[e],this.settings.errorClass,""),this.findByName(t[e].name).removeClass(this.settings.validClass);else t.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(t){var e,i=0;for(e in t)void 0!==t[e]&&null!==t[e]&&!1!==t[e]&&(i+=1);return i},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(t){t.not(this.containers).text(""),this.addWrapper(t).hide()},tc_valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{d(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(t){}},findLastActive:function(){var e=this.lastActive;return e&&1===d.grep(this.errorList,function(t){return t.element.name===e.name}).length&&e},elements:function(){var e=this,i={};return d(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var t=this.name||d(this).attr("name");return void 0!==d(this).attr("contenteditable")&&"false"!==d(this).attr("contenteditable")&&(this.form=d(this).closest("form")[0],this.name=t),this.form===e.currentForm&&!(t in i||!e.objectLength(d(this).tc_rules()))&&(i[t]=!0)})},clean:function(t){return d(t)[0]},errors:function(){var t=this.settings.errorClass.split(" ").join(".");return d(this.settings.errorElement+"."+t,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=d([]),this.toHide=d([])},reset:function(){this.resetInternals(),this.currentElements=d([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(t){this.reset(),this.toHide=this.errorsFor(t)},elementValue:function(t){var e=d(t),i=t.type,s=void 0!==e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===i||"checkbox"===i?this.findByName(t.name).filter(":checked").val():"number"===i&&void 0!==t.validity?t.validity.badInput?"NaN":e.val():(t=s?e.text():e.val(),"file"===i?"C:\\fakepath\\"===t.substring(0,12)?t.substring(12):0<=(s=t.lastIndexOf("/"))||0<=(s=t.lastIndexOf("\\"))?t.substring(s+1):t:"string"==typeof t?t.replace(/\r/g,""):t)},check:function(e){var t,i,s,n,r,a,o,l;for(a in e=this.validationTargetFor(this.clean(e)),t=d(e).tc_rules(),i=d.map(t,function(t,e){return e}).length,s=!1,n=this.elementValue(e),"function"==typeof t.normalizer?l=t.normalizer:"function"==typeof this.settings.normalizer&&(l=this.settings.normalizer),l&&(n=l.call(e,n),delete t.normalizer),t)if(a){o={method:a,parameters:t[a]};try{if("dependency-mismatch"===(r=d.tc_validator.methods[a].call(this,n,e,o.parameters))&&1===i)s=!0;else{if(s=!1,"pending"===r)return void(this.toHide=this.toHide.not(this.errorsFor(e)));if(!r)return this.formatAndAdd(e,o),!1}}catch(t){throw t instanceof TypeError&&(t.message+=".  Exception occurred when checking element "+e.id+", check the '"+o.method+"' method."),t}}if(!s)return this.objectLength(t)&&this.successList.push(e),!0},customDataMessage:function(t,e){return d(t).data("msg"+e.charAt(0).toUpperCase()+e.substring(1).toLowerCase())||d(t).data("msg")},customMessage:function(t,e){t=this.settings.messages[t];return t&&(t.constructor===String?t:t[e])},findDefined:function(){for(var t=0;t<arguments.length;t+=1)if(void 0!==arguments[t])return arguments[t]},defaultMessage:function(t,e){var i,s="";return"minlength"!==(e="string"==typeof e?{method:e}:e).method&&"maxlength"!==e.method||1!==e.parameters&&"1"!==e.parameters||(s="single"),i=/\$?\{(\d+)\}/g,"function"==typeof(s=this.findDefined(this.customMessage(t.name,e.method+s),this.customDataMessage(t,e.method+s),!this.settings.ignoreTitle&&t.title||void 0,d.tc_validator.messages[e.method+s],"<strong>Warning: No message defined for "+t.name+"</strong>"))?s=s.call(this,e.parameters,t):i.test(s)&&(s=d.tc_validator.format(s.replace(i,"{$1}"),e.parameters)),s},formatAndAdd:function(t,e){var i=this.defaultMessage(t,e);this.errorList.push({message:i,element:t,method:e.method}),this.errorMap[t.name]=i,this.submitted[t.name]=i},addWrapper:function(t){return t=this.settings.wrapper?t.add(t.parent(this.settings.wrapper)):t},defaultShowErrors:function(){for(var t,e,i=0;this.errorList[i];i+=1)e=this.errorList[i],this.settings.highlight&&this.settings.highlight.call(this,e.element,this.settings.errorClass,this.settings.validClass),this.showLabel(e.element,e.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(i=0;this.successList[i];i+=1)this.showLabel(this.successList[i]);if(this.settings.unhighlight)for(i=0,t=this.validElements();t[i];i+=1)this.settings.unhighlight.call(this,t[i],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return d(this.errorList).map(function(){return this.element})},showLabel:function(t,e){var i,s,n,r=this.errorsFor(t),a=this.idOrName(t),o=d(t).attr("aria-describedby");r.length?(r.removeClass(this.settings.validClass).addClass(this.settings.errorClass),r.html(e)):(s=r=d("<"+this.settings.errorElement+">").attr("id",a+"-error").addClass(this.settings.errorClass).html(e||""),this.settings.wrapper&&(s=r.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(s):this.settings.errorPlacement?this.settings.errorPlacement.call(this,s,d(t)):s.insertAfter(t),r.is("label")?r.attr("for",a):0===r.parents("label[for='"+this.escapeCssMeta(a)+"']").length&&(s=r.attr("id"),o?o.match(new RegExp("\\b"+this.escapeCssMeta(s)+"\\b"))||(o+=" "+s):o=s,d(t).attr("aria-describedby",o),i=this.groups[t.name])&&d.each((n=this).groups,function(t,e){e===i&&d("[name='"+n.escapeCssMeta(t)+"']",n.currentForm).attr("aria-describedby",r.attr("id"))})),!e&&this.settings.success&&(r.text(""),"string"==typeof this.settings.success?r.addClass(this.settings.success):this.settings.success(r,t)),this.toShow=this.toShow.add(r)},errorsFor:function(t){var e=this.escapeCssMeta(this.idOrName(t)),t=d(t).attr("aria-describedby"),e="label[for='"+e+"'], label[for='"+e+"'] *";return t&&(e=e+", #"+this.escapeCssMeta(t).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(t){return t.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]\^`{|}~])/g,"\\$1")},idOrName:function(t){return this.groups[t.name]||!this.checkable(t)&&t.id||t.name},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name)),d(t).not(this.settings.ignore)[0]},checkable:function(t){return/radio|checkbox/i.test(t.type)},findByName:function(t){return d(this.currentForm).find("[name='"+this.escapeCssMeta(t)+"']")},getLength:function(t,e){switch(e.nodeName.toLowerCase()){case"select":return d("option:selected",e).length;case"input":if(this.checkable(e))return this.findByName(e.name).filter(":checked").length}return t.length},depend:function(t,e){return!this.dependTypes[typeof t]||this.dependTypes[typeof t](t,e)},dependTypes:{boolean:function(t){return t},string:function(t,e){return!!d(t,e.form).length},function:function(t,e){return t(e)}},optional:function(t){var e=this.elementValue(t);return!d.tc_validator.methods.required.call(this,e,t)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest+=1,d(t).addClass(this.settings.pendingClass),this.pending[t.name]=!0)},stopRequest:function(t,e){--this.pendingRequest,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[t.name],d(t).removeClass(this.settings.pendingClass),e&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(d(this.currentForm).trigger("submit"),this.submitButton&&d("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!e&&0===this.pendingRequest&&this.formSubmitted&&(d(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(t,e){return e="string"==typeof e&&e||"remote",d.data(t,"previousValue")||d.data(t,"previousValue",{old:null,valid:!0,message:this.defaultMessage(t,{method:e})})},destroy:function(){this.resetForm(),d(this.currentForm).off(".tc_validate").removeData("tc_validator").find(".tc_validate-equalTo-blur").off(".tc_validate-equalTo").removeClass("validate-equalTo-blur").find(".tc_validate-lessThan-blur").off(".tc_validate-lessThan").removeClass("validate-lessThan-blur").find(".tc_validate-lessThanEqual-blur").off(".tc_validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".tc_validate-greaterThanEqual-blur").off(".tc_validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".tc_validate-greaterThan-blur").off(".tc_validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(t,e){t.constructor===String?this.classRuleSettings[t]=e:d.extend(this.classRuleSettings,t)},classRules:function(t){var e={},t=d(t).attr("class");return t&&d.each(t.split(" "),function(){this in d.tc_validator.classRuleSettings&&d.extend(e,d.tc_validator.classRuleSettings[this])}),e},normalizeAttributeRule:function(t,e,i,s){(s=/min|max|step/.test(i)&&(null===e||/number|range|text/.test(e))&&(s=Number(s),isNaN(s))?void 0:s)||0===s?t[i]=s:e===i&&"range"!==e&&(t[i]=!0)},attributeRules:function(t){var e,i,s={},n=d(t),r=t.getAttribute("type");for(e in d.tc_validator.methods)e&&(i="required"===e?!!(i=""===(i=t.getAttribute(e))?!0:i):n.attr(e),this.normalizeAttributeRule(s,r,e,i));return s.maxlength&&/-1|2147483647|524288/.test(s.maxlength)&&delete s.maxlength,s},dataRules:function(t){var e,i,s={},n=d(t),r=t.getAttribute("type");for(e in d.tc_validator.methods)e&&(""===(i=n.data("rule"+e.charAt(0).toUpperCase()+e.substring(1).toLowerCase()))&&(i=!0),this.normalizeAttributeRule(s,r,e,i));return s},staticRules:function(t){var e={},i=d.data(t.form,"tc_validator");return e=i.settings.rules?d.tc_validator.normalizeRule(i.settings.rules[t.name])||{}:e},normalizeRules:function(i,s){var n;return d.each(i,function(t,e){if(!1===e)delete i[t];else if(e.param||e.depends){switch(n=!0,typeof e.depends){case"string":n=!!d(e.depends,s.form).length;break;case"function":n=e.depends.call(s,s)}n?i[t]=void 0===e.param||e.param:(d.data(s.form,"tc_validator").resetElements(d(s)),delete i[t])}}),d.each(i,function(t,e){i[t]="function"==typeof e&&"normalizer"!==t?e(s):e}),d.each(["minlength","maxlength"],function(){i[this]&&(i[this]=Number(i[this]))}),d.each(["rangelength","range"],function(){var t;i[this]&&(Array.isArray(i[this])?i[this]=[Number(i[this][0]),Number(i[this][1])]:"string"==typeof i[this]&&(t=i[this].replace(/[[\]]/g,"").split(/[\s,]+/),i[this]=[Number(t[0]),Number(t[1])]))}),d.tc_validator.autoCreateRanges&&(null!==i.min&&null!==i.max&&(i.range=[i.min,i.max],delete i.min,delete i.max),null!==i.minlength)&&null!==i.maxlength&&(i.rangelength=[i.minlength,i.maxlength],delete i.minlength,delete i.maxlength),i},normalizeRule:function(t){var e;return"string"==typeof t&&(e={},d.each(t.split(/\s/),function(){e[this]=!0}),t=e),t},addMethod:function(t,e,i){d.tc_validator.methods[t]=e,d.tc_validator.messages[t]=void 0!==i?i:d.tc_validator.messages[t],e.length<3&&d.tc_validator.addClassRules(t,d.tc_validator.normalizeRule(t))},methods:{required:function(t,e,i){return this.depend(i,e)?"select"===e.nodeName.toLowerCase()?(i=d(e).val())&&0<i.length:this.checkable(e)?0<this.getLength(t,e):null!=t&&0<t.length:"dependency-mismatch"},email:function(t,e){return this.optional(e)||/^[a-zA-Z0-9.!#$%&'*+\/=?\^_`{|}~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$/.test(t)},url:function(t,e){return this.optional(e)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(t)},date:function(t,e){return this.optional(e)||!/Invalid|NaN/.test(new Date(t).toString())},dateISO:function(t,e){return this.optional(e)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(t)},number:function(t,e){return this.optional(e)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t)},digits:function(t,e){return this.optional(e)||/^\d+$/.test(t)},minlength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||i<=t},maxlength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||t<=i},rangelength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||t>=i[0]&&t<=i[1]},min:function(t,e,i){return this.optional(e)||i<=t},max:function(t,e,i){return this.optional(e)||t<=i},range:function(t,e,i){return this.optional(e)||t>=i[0]&&t<=i[1]},step:function(t,e,i){function s(t){return(t=(""+t).match(/(?:\.(\d+))?$/))&&t[1]?t[1].length:0}function n(t){return Math.round(t*Math.pow(10,r))}var r,a=d(e).attr("type"),o="Step attribute on input type "+a+" is not supported.",l=new RegExp("\\b"+a+"\\b"),h=!0;if(a&&!l.test(["text","number","range"].join()))throw new Error(o);return r=s(i),(s(t)>r||n(t)%n(i)!=0)&&(h=!1),this.optional(e)||h},equalTo:function(t,e,i){i=d(i);return this.settings.onfocusout&&i.not(".tc_validate-equalTo-blur").length&&i.addClass("validate-equalTo-blur").on("blur.tc_validate-equalTo",function(){d(e).tc_valid()}),t===i.val()},remote:function(s,n,t,r){var a,o,e;return this.optional(n)?"dependency-mismatch":(r="string"==typeof r&&r||"remote",a=this.previousValue(n,r),this.settings.messages[n.name]||(this.settings.messages[n.name]={}),a.originalMessage=a.originalMessage||this.settings.messages[n.name][r],this.settings.messages[n.name][r]=a.message,e=d.param(d.extend({data:s},(t="string"==typeof t?{url:t}:t).data)),a.old===e?a.valid:(a.old=e,(o=this).startRequest(n),(e={})[n.name]=s,d.ajax(d.extend(!0,{mode:"abort",port:"validate"+n.name,dataType:"json",data:e,context:o.currentForm,success:function(t){var e,i=!0===t||"true"===t;o.settings.messages[n.name][r]=a.originalMessage,i?(e=o.formSubmitted,o.resetInternals(),o.toHide=o.errorsFor(n),o.formSubmitted=e,o.successList.push(n),o.invalid[n.name]=!1,o.showErrors()):(e={},t=t||o.defaultMessage(n,{method:r,parameters:s}),a.message=t,e[n.name]=t,o.invalid[n.name]=!0,o.showErrors(e)),a.valid=i,o.stopRequest(n,i)}},t)),"pending"))}}}),d.ajaxPrefilter?d.ajaxPrefilter(function(t,e,i){var s=t.port;"abort"===t.mode&&(n[s]&&n[s].abort(),n[s]=i)}):(i=d.ajax,d.ajax=function(t){var e=("mode"in t?t:d.ajaxSettings).mode,t=("port"in t?t:d.ajaxSettings).port;return"abort"===e?(n[t]&&n[t].abort(),n[t]=i.apply(this,arguments),n[t]):i.apply(this,arguments)}),d});
!function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):t(window.jQuery)}(function(M){"use strict";var n;function r(t){M.tm_datepicker._isDisabledDatepicker((n.inline?n.dpDiv.parent():n.input)[0])||(M(t).parents(".ui-tm-datepicker-calendar").find("a").removeClass("ui-state-hover"),M(t).addClass("ui-state-hover"),-1!==t.className.indexOf("ui-tm-datepicker-prev")&&M(t).addClass("ui-tm-datepicker-prev-hover"),-1!==t.className.indexOf("ui-tm-datepicker-next")&&M(t).addClass("ui-tm-datepicker-next-hover"))}function a(t){var e="button, .ui-tm-datepicker-prev, .ui-tm-datepicker-next, .ui-tm-datepicker-calendar td a";return t.on("mouseout",e,function(){M(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-tm-datepicker-prev")&&M(this).removeClass("ui-tm-datepicker-prev-hover"),-1!==this.className.indexOf("ui-tm-datepicker-next")&&M(this).removeClass("ui-tm-datepicker-next-hover")}).on("mouseover",e,function(){r(this)})}function d(t,e){for(var a in M.extend(t,e),e)null===e[a]&&(t[a]=e[a])}function t(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-tm-datepicker-div",this._inlineClass="ui-tm-datepicker-inline",this._appendClass="ui-tm-datepicker-append",this._triggerClass="ui-tm-datepicker-trigger",this._dialogClass="ui-tm-datepicker-dialog",this._disableClass="ui-tm-datepicker-disabled",this._unselectableClass="ui-tm-datepicker-unselectable",this._currentClass="ui-tm-datepicker-current-day",this._dayOverClass="ui-tm-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},M.extend(this._defaults,this.regional[""]),this.regional.en=M.extend(!0,{},this.regional[""]),this.regional["en-US"]=M.extend(!0,{},this.regional.en),this.dpDiv=a(M("<div id='"+this._mainDivId+"' class='ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}M.ui.tm_datepicker=M.ui.tm_datepicker||{},M.ui.tm_datepicker.version||(M.extend(M.ui,{tm_datepicker:{version:"1.11.4"}}),M.extend(t.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return d(this._defaults,t||{}),this},_attachDatepicker:function(t,e){var a,i=t.nodeName.toLowerCase(),s="div"===i||"span"===i;t.id||(this.uuid+=1,t.id="dp"+this.uuid),(a=this._newInst(M(t),s)).settings=M.extend({},e||{}),"input"===i?this._connectDatepicker(t,a):s&&this._inlineDatepicker(t,a)},_newInst:function(t,e){return{id:t[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:e,dpDiv:e?a(M("<div class='"+this._inlineClass+" ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,e){var a=M(t);e.append=M([]),e.trigger=M([]),a.hasClass(this.markerClassName)||(this._attachments(a,e),a.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(e),M.data(t,"datepicker",e),e.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,e){var a,i=this._get(e,"appendText"),s=this._get(e,"isRTL");e.append&&e.append.remove(),i&&(e.append=M("<span class='"+this._appendClass+"'>"+i+"</span>"),t[s?"before":"after"](e.append)),t.off("focus",this._showDatepicker),e.trigger&&e.trigger.remove(),"focus"!==(i=this._get(e,"showOn"))&&"both"!==i||t.on("focus",this._showDatepicker),"button"!==i&&"both"!==i||(i=this._get(e,"buttonText"),a=this._get(e,"buttonImage"),e.trigger=M(this._get(e,"buttonImageOnly")?M("<img/>").addClass(this._triggerClass).attr({src:a,alt:i,title:i}):M("<button type='button'></button>").addClass(this._triggerClass).html(a?M("<img/>").attr({src:a,alt:i,title:i}):i)),t[s?"before":"after"](e.trigger),e.trigger.on("click",function(){return M.tm_datepicker._datepickerShowing&&M.tm_datepicker._lastInput===t[0]?M.tm_datepicker._hideDatepicker():(M.tm_datepicker._datepickerShowing&&M.tm_datepicker._lastInput!==t[0]&&M.tm_datepicker._hideDatepicker(),M.tm_datepicker._showDatepicker(t[0])),!1}))},_autoSize:function(t){var e,a,i,s,n,r=this._get(t,"dateFormat");this._get(t,"autoSize")&&!t.inline&&(n=new Date(2009,11,20),(r=this._get(t,"dateFormat")).match(/[DM]/)&&(n.setMonth((e=function(t){for(s=i=a=0;s<t.length;s+=1)t[s].length>a&&(a=t[s].length,i=s);return i})(this._get(t,r.match(/MM/)?"monthNames":"monthNamesShort"))),n.setDate(e(this._get(t,r.match(/DD/)?"dayNames":"dayNamesShort"))+20-n.getDay())),t.input.attr("size",this._formatDate(t,n).length))},_inlineDatepicker:function(t,e){var a=M(t);a.hasClass(this.markerClassName)||(a.addClass(this.markerClassName).append(e.dpDiv),M.data(t,"datepicker",e),this._setDate(e,this._getDefaultDate(e),!0),this._updateDatepicker(e),this._updateAlternate(e),e.settings.disabled&&this._disableDatepicker(t),e.dpDiv.css("display","block"))},_dialogDatepicker:function(t,e,a,i,s){var n,r=this._dialogInst;return r||(this.uuid+=1,n="dp"+this.uuid,this._dialogInput=M("<input type='text' id='"+n+"'>"),this._dialogInput.on("keydown",this._doKeyDown),M("body").append(this._dialogInput),r=this._newInst(this._dialogInput,!1),(this._dialogInst=r).settings={},M.data(this._dialogInput[0],"datepicker",r)),d(r.settings,i||{}),e=e&&e.constructor===Date?this._formatDate(r,e):e,this._dialogInput.val(e),this._pos=s?s.length?s:[s.pageX,s.pageY]:null,this._pos||(n=document.documentElement.clientWidth,i=document.documentElement.clientHeight,e=document.documentElement.scrollLeft||document.body.scrollLeft,s=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[n/2-100+e,i/2-150+s]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),r.settings.onSelect=a,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),M.blockUI&&M.blockUI(this.dpDiv),M.data(this._dialogInput[0],"datepicker",r),this},_destroyDatepicker:function(t){var e,a=M(t),i=M.data(t,"datepicker");a.hasClass(this.markerClassName)&&(e=t.nodeName.toLowerCase(),M.removeData(t,"datepicker"),"input"===e?(i.append.remove(),i.trigger.remove(),a.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):"div"!==e&&"span"!==e||a.removeClass(this.markerClassName).empty(),n===i)&&(n=null)},_enableDatepicker:function(e){var t,a=M(e),i=M.data(e,"datepicker");a.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!1,i.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):"div"!==t&&"span"!==t||((i=a.children("."+this._inlineClass)).children().removeClass("ui-state-disabled"),i.find("select.ui-tm-datepicker-month, select.ui-tm-datepicker-year").prop("disabled",!1)),this._disabledInputs=M.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var t,a=M(e),i=M.data(e,"datepicker");a.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!0,i.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):"div"!==t&&"span"!==t||((i=a.children("."+this._inlineClass)).children().addClass("ui-state-disabled"),i.find("select.ui-tm-datepicker-month, select.ui-tm-datepicker-year").prop("disabled",!0)),this._disabledInputs=M.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){var e;if(t)for(e=0;e<this._disabledInputs.length;e+=1)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(t){try{return M.data(t,"datepicker")}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,e,a){var i,s,n=this._getInst(t);if(2===arguments.length&&"string"==typeof e)return"defaults"===e?M.extend({},M.tm_datepicker._defaults):n?"all"===e?M.extend({},n.settings):this._get(n,e):null;i=e||{},"string"==typeof e&&((i={})[e]=a),n&&(this._curInst===n&&this._hideDatepicker(),e=this._getDateDatepicker(t,!0),a=this._getMinMaxDate(n,"min"),s=this._getMinMaxDate(n,"max"),d(n.settings,i),null!==a&&void 0!==i.dateFormat&&void 0===i.minDate&&(n.settings.minDate=this._formatDate(n,a)),null!==s&&void 0!==i.dateFormat&&void 0===i.maxDate&&(n.settings.maxDate=this._formatDate(n,s)),"disabled"in i&&(i.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(M(t),n),this._autoSize(n),this._setDate(n,e),this._updateAlternate(n),this._updateDatepicker(n))},_changeDatepicker:function(t,e,a){this._optionDatepicker(t,e,a)},_refreshDatepicker:function(t){t=this._getInst(t);t&&this._updateDatepicker(t)},_setDateDatepicker:function(t,e){t=this._getInst(t);t&&(this._setDate(t,e),this._updateDatepicker(t),this._updateAlternate(t))},_getDateDatepicker:function(t,e){t=this._getInst(t);return t&&!t.inline&&this._setDateFromField(t,e),t?this._getDate(t):null},_doKeyDown:function(t){var e,a,i=M.tm_datepicker._getInst(t.target),s=!0,n=i.dpDiv.is(".ui-tm-datepicker-rtl");if(i._keyEvent=!0,M.tm_datepicker._datepickerShowing)switch(t.keyCode){case 9:M.tm_datepicker._hideDatepicker(),s=!1;break;case 13:return(a=M("td."+M.tm_datepicker._dayOverClass+":not(."+M.tm_datepicker._currentClass+")",i.dpDiv))[0]&&M.tm_datepicker._selectDay(t.target,i.selectedMonth,i.selectedYear,a[0]),(a=M.tm_datepicker._get(i,"onSelect"))?(e=M.tm_datepicker._formatDate(i),a.apply(i.input?i.input[0]:null,[e,i])):M.tm_datepicker._hideDatepicker(),!1;case 27:M.tm_datepicker._hideDatepicker();break;case 33:M.tm_datepicker._adjustDate(t.target,t.ctrlKey?-M.tm_datepicker._get(i,"stepBigMonths"):-M.tm_datepicker._get(i,"stepMonths"),"M");break;case 34:M.tm_datepicker._adjustDate(t.target,t.ctrlKey?+M.tm_datepicker._get(i,"stepBigMonths"):+M.tm_datepicker._get(i,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._clearDate(t.target),s=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._gotoToday(t.target),s=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,n?1:-1,"D"),s=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&M.tm_datepicker._adjustDate(t.target,t.ctrlKey?-M.tm_datepicker._get(i,"stepBigMonths"):-M.tm_datepicker._get(i,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,-7,"D"),s=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,n?-1:1,"D"),s=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&M.tm_datepicker._adjustDate(t.target,t.ctrlKey?+M.tm_datepicker._get(i,"stepBigMonths"):+M.tm_datepicker._get(i,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,7,"D"),s=t.ctrlKey||t.metaKey;break;default:s=!1}else 36===t.keyCode&&t.ctrlKey?M.tm_datepicker._showDatepicker(this):s=!1;s&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var e,a=M.tm_datepicker._getInst(t.target);if(M.tm_datepicker._get(a,"constrainInput"))return a=M.tm_datepicker._possibleChars(M.tm_datepicker._get(a,"dateFormat")),e=String.fromCharCode(null===t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||e<" "||!a||-1<a.indexOf(e)},_doKeyUp:function(t){t=M.tm_datepicker._getInst(t.target);if(t.input.val()!==t.lastVal)try{M.tm_datepicker.parseDate(M.tm_datepicker._get(t,"dateFormat"),t.input?t.input.val():null,M.tm_datepicker._getFormatConfig(t))&&(M.tm_datepicker._setDateFromField(t),M.tm_datepicker._updateAlternate(t),M.tm_datepicker._updateDatepicker(t))}catch(t){return!1}return!0},_showDatepicker:function(t){var e,a,i,s;"input"!==(t=t.target||t).nodeName.toLowerCase()&&(t=M("input",t.parentNode)[0]),M.tm_datepicker._isDisabledDatepicker(t)||M.tm_datepicker._lastInput===t||(e=M.tm_datepicker._getInst(t),M.tm_datepicker._curInst&&M.tm_datepicker._curInst!==e&&(M.tm_datepicker._curInst.dpDiv.stop(!0,!0),e)&&M.tm_datepicker._datepickerShowing&&M.tm_datepicker._hideDatepicker(M.tm_datepicker._curInst.input[0]),!1===(i=(i=M.tm_datepicker._get(e,"beforeShow"))?i.apply(t,[t,e]):{}))||(d(e.settings,i),e.lastVal=null,M.tm_datepicker._lastInput=t,M.tm_datepicker._setDateFromField(e),M.tm_datepicker._inDialog&&(t.value=""),M.tm_datepicker._pos||(M.tm_datepicker._pos=M.tm_datepicker._findPos(t),M.tm_datepicker._pos[1]+=t.offsetHeight),a=!1,M(t).parents().each(function(){return!(a=a||"fixed"===M(this).css("position"))}),i={left:M.tm_datepicker._pos[0],top:M.tm_datepicker._pos[1]},M.tm_datepicker._pos=null,e.dpDiv.empty(),e.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),M.tm_datepicker._updateDatepicker(e),i=M.tm_datepicker._checkOffset(e,i,a),e.dpDiv.css({position:M.tm_datepicker._inDialog&&M.blockUI?"static":a?"fixed":"absolute",display:"none",left:i.left+"px",top:i.top+"px"}),e.inline)||(i=M.tm_datepicker._get(e,"showAnim"),s=M.tm_datepicker._get(e,"duration"),e.dpDiv.css("z-index",function(t){for(var e;t.length&&t[0]!==document;){if(("absolute"===(e=t.css("position"))||"relative"===e||"fixed"===e)&&(e=parseInt(t.css("zIndex"),10),!isNaN(e))&&0!==e)return e;t=t.parent()}return 0}(M(t))+1),M.tm_datepicker._datepickerShowing=!0,M.effects&&M.effects.effect[i]?e.dpDiv.show(i,M.tm_datepicker._get(e,"showOptions"),s):e.dpDiv[i||"show"](i?s:null),M.tm_datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),M.tm_datepicker._curInst=e)},_updateDatepicker:function(t){var e,a,i,s;this.maxRows=4,(n=t).dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t),i=(a=this._getNumberOfMonths(t))[1],0<(s=t.dpDiv.find("."+this._dayOverClass+" a")).length&&r.apply(s.get(0),[s.get(0)]),t.dpDiv.removeClass("ui-tm-datepicker-multi-2 ui-tm-datepicker-multi-3 ui-tm-datepicker-multi-4").width(""),1<i&&t.dpDiv.addClass("ui-tm-datepicker-multi-"+i).css("width",17*i+"em"),t.dpDiv[(1!==a[0]||1!==a[1]?"add":"remove")+"Class"]("ui-tm-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-tm-datepicker-rtl"),t===M.tm_datepicker._curInst&&M.tm_datepicker._datepickerShowing&&M.tm_datepicker._shouldFocusInput(t)&&t.input.trigger("focus"),t.yearshtml&&(e=t.yearshtml,setTimeout(function(){e===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-tm-datepicker-year:first").replaceWith(t.yearshtml),e=null,t.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(t,e,a){var i=t.dpDiv.outerWidth(),s=t.dpDiv.outerHeight(),n=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,d=document.documentElement.clientWidth+(a?0:M(document).scrollLeft()),c=document.documentElement.clientHeight+(a?0:M(document).scrollTop());return e.left-=this._get(t,"isRTL")?i-n:0,e.left-=a&&e.left===t.input.offset().left?M(document).scrollLeft():0,e.top-=a&&e.top===t.input.offset().top+r?M(document).scrollTop():0,e.left-=Math.min(e.left,e.left+i>d&&i<d?Math.abs(e.left+i-d):0),e.top-=Math.min(e.top,e.top+s>c&&s<c?Math.abs(s+r):0),e},_findPos:function(t){for(var e=this._getInst(t),a=this._get(e,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||M.expr.filters.hidden(t));)t=t[a?"previousSibling":"nextSibling"];return[(e=M(t).offset()).left,e.top]},_hideDatepicker:function(t){var e,a,i=this._curInst;!i||t&&i!==M.data(t,"datepicker")||this._datepickerShowing&&(t=this._get(i,"showAnim"),a=this._get(i,"duration"),e=function(){M.tm_datepicker._tidyDialog(i)},M.effects&&(M.effects.effect[t]||M.effects[t])?i.dpDiv.hide(t,M.tm_datepicker._get(i,"showOptions"),a,e):i.dpDiv["slideDown"===t?"slideUp":"fadeIn"===t?"fadeOut":"hide"](t?a:null,e),t||e(),this._datepickerShowing=!1,(a=this._get(i,"onClose"))&&a.apply(i.input?i.input[0]:null,[i.input?i.input.val():"",i]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),M.blockUI)&&(M.unblockUI(),M("body").append(this.dpDiv)),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-tm-datepicker-calendar")},_checkExternalClick:function(t){var e;M.tm_datepicker._curInst&&(t=M(t.target),e=M.tm_datepicker._getInst(t[0]),!(t[0].id===M.tm_datepicker._mainDivId||0!==t.parents("#"+M.tm_datepicker._mainDivId).length||t.hasClass(M.tm_datepicker.markerClassName)||t.closest("."+M.tm_datepicker._triggerClass).length||!M.tm_datepicker._datepickerShowing||M.tm_datepicker._inDialog&&M.blockUI)||t.hasClass(M.tm_datepicker.markerClassName)&&M.tm_datepicker._curInst!==e)&&M.tm_datepicker._hideDatepicker()},_adjustDate:function(t,e,a){var t=M(t),i=this._getInst(t[0]);this._isDisabledDatepicker(t[0])||(this._adjustInstDate(i,e+("M"===a?this._get(i,"showCurrentAtPos"):0),a),this._updateDatepicker(i))},_gotoToday:function(t){var e,t=M(t),a=this._getInst(t[0]);this._get(a,"gotoCurrent")&&a.currentDay?(a.selectedDay=a.currentDay,a.drawMonth=a.currentMonth,a.selectedMonth=a.currentMonth,a.drawYear=a.currentYear,a.selectedYear=a.currentYear):(e=new Date,a.selectedDay=e.getDate(),a.drawMonth=e.getMonth(),a.selectedMonth=a.drawMonth,a.drawYear=e.getFullYear(),a.selectedYear=a.drawYear),this._notifyChange(a),this._adjustDate(t)},_selectMonthYear:function(t,e,a){var t=M(t),i=this._getInst(t[0]);i["selected"+("M"===a?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),i["draw"+("M"===a?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),this._notifyChange(i),this._adjustDate(t)},_selectDay:function(t,e,a,i){var s=M(t);M(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(s[0])||((s=this._getInst(s[0])).selectedDay=M("a",i).html(),s.currentDay=s.selectedDay,s.selectedMonth=e,s.currentMonth=e,s.selectedYear=a,s.currentYear=a,this._selectDate(t,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear)))},_clearDate:function(t){t=M(t);this._selectDate(t,"")},_selectDate:function(t,e){var a,t=M(t),t=this._getInst(t[0]);e=null!==e?e:this._formatDate(t),t.input&&t.input.val(e),this._updateAlternate(t),(a=this._get(t,"onSelect"))?a.apply(t.input?t.input[0]:null,[e,t]):t.input&&t.input.trigger("change"),t.inline?this._updateDatepicker(t):(this._hideDatepicker(),this._lastInput=t.input[0],"object"!=typeof t.input[0]&&t.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(t){var e,a,i=this._get(t,"altField");i&&(a=this._get(t,"altFormat")||this._get(t,"dateFormat"),e=this._getDate(t),a=this.formatDate(a,e,this._getFormatConfig(t)),M(i).val(a))},noWeekends:function(t){t=t.getDay();return[0<t&&t<6,""]},iso8601Week:function(t){var e,t=new Date(t.getTime());return t.setDate(t.getDate()+4-(t.getDay()||7)),e=t.getTime(),t.setMonth(0),t.setDate(1),Math.floor(Math.round((e-t)/864e5)/7)+1},parseDate:function(e,s,t){var a,i,n,r,d,c,l,o,u,h,p,m,_,g=0,f=-1,k=-1,D=-1,v=-1,y=!1;if(null===e||null===s)throw"Invalid arguments";if(""===(s="object"==typeof s?s.toString():s+""))return null;for(n="string"!=typeof(n=(t?t.shortYearCutoff:null)||this._defaults.shortYearCutoff)?n:(new Date).getFullYear()%100+parseInt(n,10),r=(t?t.dayNamesShort:null)||this._defaults.dayNamesShort,d=(t?t.dayNames:null)||this._defaults.dayNames,c=(t?t.monthNamesShort:null)||this._defaults.monthNamesShort,l=(t?t.monthNames:null)||this._defaults.monthNames,u=function(t){t=a+1<e.length&&e.charAt(a+1)===t;return t&&(a+=1),t},h=function(t){var e=u(t),e="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,t=new RegExp("^\\d{"+("y"===t?e:1)+","+e+"}"),e=s.substring(g).match(t);if(e)return g+=e[0].length,parseInt(e[0],10);throw"Missing number at position "+g},p=function(t,e,a){var i=-1,t=M.map(u(t)?a:e,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(M.each(t,function(t,e){var a=e[1];if(s.substring(g,parseInt(g,10)+a.length).toLowerCase()===a.toLowerCase())return i=e[0],g+=a.length,!1}),-1!==i)return i+1;throw"Unknown name at position "+g},m=function(){if(s.charAt(g)!==e.charAt(a))throw"Unexpected literal at position "+g;g+=1},a=0;a<e.length;a+=1)if(y)"'"!==e.charAt(a)||u("'")?m():y=!1;else switch(e.charAt(a)){case"d":D=h("d");break;case"D":p("D",r,d);break;case"o":v=h("o");break;case"m":k=h("m");break;case"M":k=p("M",c,l);break;case"y":f=h("y");break;case"@":f=(o=new Date(h("@"))).getFullYear(),k=o.getMonth()+1,D=o.getDate();break;case"!":f=(o=new Date((h("!")-this._ticksTo1970)/1e4)).getFullYear(),k=o.getMonth()+1,D=o.getDate();break;case"'":u("'")?m():y=!0;break;default:m()}if(g<s.length&&(t=s.substring(g),!/^\s+/.test(t)))throw"Extra/unparsed characters found in date: "+t;if(-1===f?f=(new Date).getFullYear():f<100&&(f+=(new Date).getFullYear()-(new Date).getFullYear()%100+(f<=n?0:-100)),-1<v)for(k=1,D=v,_=!0;D<=(i=this._getDaysInMonth(f,k-1))?_=!1:(k+=1,D-=i),_;);if((o=this._daylightSavingAdjust(new Date(f,k-1,D))).getFullYear()!==f||o.getMonth()+1!==k||o.getDate()!==D)throw"Invalid date";return o},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*60*60*1e7,formatDate:function(e,t,a){function i(t,e,a){var i=""+e;if(o(t))for(;i.length<a;)i="0"+i;return i}function s(t,e,a,i){return(o(t)?i:a)[e]}var n,r=(a?a.dayNamesShort:null)||this._defaults.dayNamesShort,d=(a?a.dayNames:null)||this._defaults.dayNames,c=(a?a.monthNamesShort:null)||this._defaults.monthNamesShort,l=(a?a.monthNames:null)||this._defaults.monthNames,o=function(t){t=n+1<e.length&&e.charAt(n+1)===t;return t&&(n+=1),t},u="",h=!1;if(!t)return"";if(t)for(n=0;n<e.length;n+=1)if(h)"'"!==e.charAt(n)||o("'")?u+=e.charAt(n):h=!1;else switch(e.charAt(n)){case"d":u+=i("d",t.getDate(),2);break;case"D":u+=s("D",t.getDay(),r,d);break;case"o":u+=i("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=i("m",t.getMonth()+1,2);break;case"M":u+=s("M",t.getMonth(),c,l);break;case"y":u+=o("y")?t.getFullYear():(t.getFullYear()%100<10?"0":"")+t.getFullYear()%100;break;case"@":u+=t.getTime();break;case"!":u+=1e4*t.getTime()+this._ticksTo1970;break;case"'":o("'")?u+="'":h=!0;break;default:u+=e.charAt(n)}return u},_possibleChars:function(e){for(var t="",a=!1,i=function(t){t=s+1<e.length&&e.charAt(s+1)===t;return t&&(s+=1),t},s=0;s<e.length;s+=1)if(a)"'"!==e.charAt(s)||i("'")?t+=e.charAt(s):a=!1;else switch(e.charAt(s)){case"d":case"m":case"y":case"@":t+="0123456789";break;case"D":case"M":return null;case"'":i("'")?t+="'":a=!0;break;default:t+=e.charAt(s)}return t},_get:function(t,e){return(void 0!==t.settings[e]?t.settings:this._defaults)[e]},_setDateFromField:function(t,e){var a,i,s,n,r;if(t.input.val()!==t.lastVal){a=this._get(t,"dateFormat"),i=t.input?t.input.val():null,n=s=this._getDefaultDate(t),r=this._getFormatConfig(t),t.lastVal=i;try{n=this.parseDate(a,i,r)||s}catch(t){i=e?"":i}t.selectedDay=n.getDate(),t.selectedMonth=n.getMonth(),t.drawMonth=t.selectedMonth,t.selectedYear=n.getFullYear(),t.drawYear=t.selectedYear,t.currentDay=i?n.getDate():0,t.currentMonth=i?n.getMonth():0,t.currentYear=i?n.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(d,t,e){var a,i=null===t||""===t?e:"string"==typeof t?function(t){var e,a,i,s,n,r;try{return M.tm_datepicker.parseDate(M.tm_datepicker._get(d,"dateFormat"),t,M.tm_datepicker._getFormatConfig(d))}catch(t){}for(a=(e=(t.toLowerCase().match(/^c/)?M.tm_datepicker._getDate(d):null)||new Date).getFullYear(),i=e.getMonth(),s=e.getDate(),r=(n=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g).exec(t);r;){switch(r[2]||"d"){case"d":case"D":s+=parseInt(r[1],10);break;case"w":case"W":s+=7*parseInt(r[1],10);break;case"m":case"M":i+=parseInt(r[1],10),s=Math.min(s,M.tm_datepicker._getDaysInMonth(a,i));break;case"y":case"Y":a+=parseInt(r[1],10),s=Math.min(s,M.tm_datepicker._getDaysInMonth(a,i))}r=n.exec(t)}return new Date(a,i,s)}(t):"number"==typeof t?Number.isFinite(t)?(i=t,(a=new Date).setDate(a.getDate()+i),a):e:new Date(t.getTime());return(i=i&&"Invalid Date"===i.toString()?e:i)&&(i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0)),this._daylightSavingAdjust(i)},_daylightSavingAdjust:function(t){return t?(t.setHours(12<t.getHours()?t.getHours()+2:0),t):null},_setDate:function(t,e,a){var i=!e,s=t.selectedMonth,n=t.selectedYear,e=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.currentDay=e.getDate(),t.selectedDay=t.currentDay,t.currentMonth=e.getMonth(),t.drawMonth=t.currentMonth,t.selectedMonth=t.currentMonth,t.currentYear=e.getFullYear(),t.drawYear=t.currentYear,t.selectedYear=t.currentYear,s===t.selectedMonth&&n===t.selectedYear||a||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(i?"":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(t){var e=this._get(t,"stepMonths"),a="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prevM:function(){M.tm_datepicker._adjustDate(a,-1,"M")},nextM:function(){M.tm_datepicker._adjustDate(a,1,"M")},prevY:function(){M.tm_datepicker._adjustDate(a,-1,"Y")},nextY:function(){M.tm_datepicker._adjustDate(a,1,"Y")},prev:function(){M.tm_datepicker._adjustDate(a,-e,"M")},next:function(){M.tm_datepicker._adjustDate(a,+e,"M")},hide:function(){M.tm_datepicker._hideDatepicker()},today:function(){},selectDay:function(){return M.tm_datepicker._selectDay(a,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return M.tm_datepicker._selectMonthYear(a,this,"M"),!1},selectYear:function(){return M.tm_datepicker._selectMonthYear(a,this,"Y"),!1}};return M(this).on(this.getAttribute("data-event"),t[this.getAttribute("data-handler")]),null})},_tm_canAdjustMonth:function(t,e,a,i){a=this._daylightSavingAdjust(new Date(a,i+e,1));return e<0&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(t,a)},_generateHTML:function(t){var e,a,i,s,n,O,R,r,d,c,L,l,o,u,h,p,m,_,g,f,W,E,k,H,D,P,U,v,y,M,z,B,b,w,I=new Date,J=this._daylightSavingAdjust(new Date(I.getFullYear(),I.getMonth(),I.getDate())),C=this._get(t,"isRTL"),I=this._get(t,"showButtonPanel"),x=this._get(t,"hideIfNoPrevNext"),Y=this._get(t,"navigationAsDateFormat"),F=this._getNumberOfMonths(t),S=this._get(t,"showCurrentAtPos"),N=this._get(t,"stepMonths"),V=1!==F[0]||1!==F[1],q=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),A=this._getMinMaxDate(t,"min"),T=this._getMinMaxDate(t,"max"),j=t.drawMonth-S,K=t.drawYear;if(j<0&&(j+=12,--K),T)for(e=this._daylightSavingAdjust(new Date(T.getFullYear(),T.getMonth()-F[0]*F[1]+1,T.getDate())),e=A&&e<A?A:e;this._daylightSavingAdjust(new Date(K,j,1))>e;)--j<0&&(j=11,--K);for(t.drawMonth=j,t.drawYear=K,S=this._get(t,"prevText"),S=Y?this.formatDate(S,this._daylightSavingAdjust(new Date(K,j-N,1)),this._getFormatConfig(t)):S,a=this._canAdjustMonth(t,-1,K,j)?"<a class='ui-tm-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+S+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"e":"w")+"'>"+S+"</span></a>":x?"":"<a class='ui-tm-datepicker-prev ui-corner-all ui-state-disabled' title='"+S+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"e":"w")+"'>"+S+"</span></a>",b=this._get(t,"nextText"),b=Y?this.formatDate(b,this._daylightSavingAdjust(new Date(K,j+N,1)),this._getFormatConfig(t)):b,i=this._canAdjustMonth(t,1,K,j)?"<a class='ui-tm-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+b+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"w":"e")+"'>"+b+"</span></a>":x?"":"<a class='ui-tm-datepicker-next ui-corner-all ui-state-disabled' title='"+b+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"w":"e")+"'>"+b+"</span></a>",N=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?q:J,N=Y?this.formatDate(N,r,this._getFormatConfig(t)):N,Y=t.inline?"":"<div class='tm-ui-dp-btn-wrap tm-ui-dp-close'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-close' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</div></div>",I=I?"<div class='tm-ui-dp-buttonpane'>"+(C?Y:"")+(this._isInRange(t,r)?"<div class='tm-ui-dp-btn-wrap tm-ui-dp-current'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-current' data-handler='today' data-event='click'>"+N+"</div></div>":"")+(C?"":Y)+"</div>":"",s=parseInt(this._get(t,"firstDay"),10),s=isNaN(s)?0:s,n=this._get(t,"showWeek"),O=this._get(t,"dayNames"),R=this._get(t,"dayNamesMin"),r=this._get(t,"monthNames"),d=this._get(t,"beforeShowDay"),c=this._get(t,"showOtherMonths"),L=this._get(t,"selectOtherMonths"),l=this._getDefaultDate(t),o="",Y='<div class="tm-ui-dp-button-prev tm-ui-dp-button"><div '+((N=this._tm_canAdjustMonth(t,-1,K,j))?'data-handler="prevM" data-event="click" ':"")+'aria-label="'+S+'" class="'+(N?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div></div>',N='<div class="tm-ui-dp-button-next tm-ui-dp-button"><div '+((N=this._tm_canAdjustMonth(t,1,K,j))?'data-handler="nextM" data-event="click" ':"")+'aria-label="'+b+'" class="'+(N?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div></div>',S='<div class="tm-ui-dp-button-prev tm-ui-dp-button"><div '+((w=this._tm_canAdjustMonth(t,-12,K,j))?'data-handler="prevY" data-event="click" ':"")+'aria-label="'+S+'" class="'+(w?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div></div>',b='<div class="tm-ui-dp-button-next tm-ui-dp-button"><div '+((w=this._tm_canAdjustMonth(t,12,K,j))?'data-handler="nextY" data-event="click" ':"")+'aria-label="'+b+'" class="'+(w?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div></div>',z=x?"":'<div class="tm-ui-dp-title-button">'+(C?N:Y)+'<span aria-label="'+r[j]+'" role="button" class="tm-ui-dp-month">'+r[j]+"</span>"+(C?Y:N)+"</div>",B=x?"":'<div class="tm-ui-dp-title-button">'+(C?b:S)+'<span class="tm-ui-dp-year" role="button" aria-label="'+K+'">'+K+"</span>"+(C?S:b)+"</div>",o+="<div class='tm-ui-dp-wrap'><div class='tm-ui-dp-overlay'></div><div class='tm-ui-dp'><div class='tm-ui-dp-container'><div class='tm-ui-dp-inner-container'><div class='tm-ui-dp-ui'><div class='tm-ui-dp-ui-inner'><div class='tm-ui-dp-main-wrap'><div class='tm-ui-dp-main'>",h=0;h<F[0];h+=1){for(p="",this.maxRows=4,m=0;m<F[1];m+=1){if(_=this._daylightSavingAdjust(new Date(K,j,t.selectedDay)),g=" ui-corner-all",f="",V){if(f+="<div class='ui-tm-datepicker-group",1<F[1])switch(m){case 0:f+=" ui-tm-datepicker-group-first",g=" ui-corner-"+(C?"right":"left");break;case F[1]-1:f+=" ui-tm-datepicker-group-last",g=" ui-corner-"+(C?"left":"right");break;default:f+=" ui-tm-datepicker-group-middle",g=""}f+="'>"}for(f=(f=f+("<div class='tm-ui-dp-header ui-tm-datepicker-header ui-widget-header ui-helper-clearfix"+g+"'>"+(/all|left/.test(g)&&0===h?C?i:a:"")+(/all|right/.test(g)&&0===h?C?a:i:"")+'<div class="ui-tm-datepicker-title tm-ui-dp-title">'+(/all|left/.test(g)&&0===h?C?B+z:z+B:"")+"</div></div>")+"<div class='tm-ui-dp-main-content'>")+"<div class='tm-ui-dp-main-header-wrap'><div class='tm-ui-dp-main-header'>"+"<table class='ui-tm-datepicker-calendar'><tbody><tr>",W=n?"<th class='ui-tm-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",u=0;u<7;u+=1)W+="<th scope='col'"+(5<=(u+s+6)%7?" class='ui-tm-datepicker-week-end'":"")+"><span title='"+O[E=(u+s)%7]+"'>"+R[E]+"</span></th>";for(f=(f+=W+"</tr></tbody></table>")+"</div></div>"+"<div class='tm-ui-dp-main-table'>",k=this._getDaysInMonth(K,j),K===t.selectedYear&&j===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,k)),k=(this._getFirstDayOfMonth(K,j)-s+7)%7,H=V&&6<this.maxRows?this.maxRows:6,this.maxRows=H,D=this._daylightSavingAdjust(new Date(K,j,1-k)),P=0;P<H;P+=1){for(f+="<div class='tm-ui-dp-main-row'>",U=n?"<div class='ui-tm-datepicker-week-col'>"+this._get(t,"calculateWeek")(D)+"</div>":"",u=0;u<7;u+=1)v=d?d.apply(t.input?t.input[0]:null,[D]):[!0,""],M=(y=D.getMonth()!==j)&&!L||!v[0]||A&&D<A||T&&T<D,U+="<div class='tm-ui-dp-main-cell "+(5<=(u+s+6)%7?" ui-tm-datepicker-week-end":"")+(y?" ui-tm-datepicker-other-month":"")+(D.getTime()===_.getTime()&&j===t.selectedMonth&&t._keyEvent||l.getTime()===D.getTime()&&l.getTime()===_.getTime()?" "+this._dayOverClass:"")+(M?" "+this._unselectableClass+" ui-state-disabled":"")+(y&&!c?"":" "+v[1]+(D.getTime()===q.getTime()?" "+this._currentClass:"")+(D.getTime()===J.getTime()?" ui-tm-datepicker-today":""))+"'"+(y&&!c||!v[2]?"":" title='"+v[2].replace(/'/g,"&#39;")+"'")+(M?"":" data-handler='selectDay' data-event='click' data-month='"+D.getMonth()+"' data-year='"+D.getFullYear()+"'")+"><div class='tm-ui-dp-main-cell-inner'><div class='tm-ui-dp-main-cell-content'>"+(y&&!c?"&#xa0;":M?"<span class='ui-state-default'>"+D.getDate()+"</span>":"<a class='ui-state-default"+(D.getTime()===J.getTime()?" ui-state-highlight":"")+(D.getTime()===q.getTime()?" ui-state-active":"")+(y?" ui-priority-secondary":"")+"' href='#'>"+D.getDate()+"</a>")+"</div></div></div>",D.setDate(D.getDate()+1),D=this._daylightSavingAdjust(D);f+=U+"</div>"}11<(j+=1)&&(j=0,K+=1),p+=f=(f+="</div>")+("</div>"+(V?"</div>"+(0<F[0]&&m===F[1]-1?"<div class='ui-tm-datepicker-row-break'></div>":""):""))}o+=p}return o=(o+="</div></div></div></div></div>")+I+"</div></div></div>",t._keyEvent=!1,o},_generateMonthYearHeader:function(t,e,a,i,s,n,r,d){var c,l,o,u,h,p,m,_=this._get(t,"changeMonth"),g=this._get(t,"changeYear"),f=this._get(t,"showMonthAfterYear"),k="<div class='ui-tm-datepicker-title'>",D="";if(n||!_)D+="<span class='ui-tm-datepicker-month'>"+r[e]+"</span>";else{for(c=i&&i.getFullYear()===a,l=s&&s.getFullYear()===a,D+="<select class='ui-tm-datepicker-month' data-handler='selectMonth' data-event='change'>",o=0;o<12;o+=1)(!c||o>=i.getMonth())&&(!l||o<=s.getMonth())&&(D+="<option value='"+o+"'"+(o===e?" selected='selected'":"")+">"+d[o]+"</option>");D+="</select>"}if(f||(k+=D+(!n&&_&&g?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",n||!g)k+="<span class='ui-tm-datepicker-year'>"+a+"</span>";else{for(r=this._get(t,"yearRange").split(":"),u=(new Date).getFullYear(),p=(h=function(t){t=t.match(/c[+-].*/)?a+parseInt(t.substring(1),10):t.match(/[+-].*/)?u+parseInt(t,10):parseInt(t,10);return isNaN(t)?u:t})(r[0]),m=Math.max(p,h(r[1]||"")),p=i?Math.max(p,i.getFullYear()):p,m=s?Math.min(m,s.getFullYear()):m,t.yearshtml+="<select class='ui-tm-datepicker-year' data-handler='selectYear' data-event='change'>";p<=m;p+=1)t.yearshtml+="<option value='"+p+"'"+(p===a?" selected='selected'":"")+">"+p+"</option>";t.yearshtml+="</select>",k+=t.yearshtml,t.yearshtml=null}return k+=this._get(t,"yearSuffix"),f&&(k+=(!n&&_&&g?"":"&#xa0;")+D),k+="</div>"},_adjustInstDate:function(t,e,a){var i=t.selectedYear+("Y"===a?e:0),s=t.selectedMonth+("M"===a?e:0),e=Math.min(t.selectedDay,this._getDaysInMonth(i,s))+("D"===a?e:0),i=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(i,s,e)));t.selectedDay=i.getDate(),t.selectedMonth=i.getMonth(),t.drawMonth=t.selectedMonth,t.selectedYear=i.getFullYear(),t.drawYear=t.selectedYear,"M"!==a&&"Y"!==a||this._notifyChange(t)},_restrictMinMax:function(t,e){var a=this._getMinMaxDate(t,"min"),t=this._getMinMaxDate(t,"max"),a=a&&e<a?a:e;return t&&t<a?t:a},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){t=this._get(t,"numberOfMonths");return null===t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,a,i){var s=this._getNumberOfMonths(t),a=this._daylightSavingAdjust(new Date(a,i+(e<0?e:s[0]*s[1]),1));return e<0&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(t,a)},_isInRange:function(t,e){var a,i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=null,r=null,t=this._get(t,"yearRange");return t&&(t=t.split(":"),a=(new Date).getFullYear(),n=parseInt(t[0],10),r=parseInt(t[1],10),t[0].match(/[+-].*/)&&(n+=a),t[1].match(/[+-].*/))&&(r+=a),(!i||e.getTime()>=i.getTime())&&(!s||e.getTime()<=s.getTime())&&(!n||e.getFullYear()>=n)&&(!r||e.getFullYear()<=r)},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return{shortYearCutoff:"string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,a,i){return e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear),i=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(i,a,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay)),this.formatDate(this._get(t,"dateFormat"),i,this._getFormatConfig(t))}}),M.fn.tm_datepicker=function(t){var e;return this.length?(M.tm_datepicker.initialized||(M(document).on("mousedown",M.tm_datepicker._checkExternalClick),M.tm_datepicker.initialized=!0),0===M("#"+M.tm_datepicker._mainDivId).length&&M("body").append(M.tm_datepicker.dpDiv),e=Array.prototype.slice.call(arguments,1),"string"==typeof t&&("isDisabled"===t||"getDate"===t||"widget"===t)||"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?M.tm_datepicker["_"+t+"Datepicker"].apply(M.tm_datepicker,[this[0]].concat(e)):this.each(function(){"string"==typeof t?M.tm_datepicker["_"+t+"Datepicker"].apply(M.tm_datepicker,[this].concat(e)):M.tm_datepicker._attachDatepicker(this,t)})):this},M.tm_datepicker=new t,M.tm_datepicker.initialized=!1,M.tm_datepicker.uuid=(new Date).getTime(),M.tm_datepicker.version="1.11.4")});
!function(e){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery","jquery-ui"],e):e(window.jQuery)}(function(k){"use strict";function n(e,t){for(var i in k.extend(e,t),t)null!==t[i]&&void 0!==t[i]||(e[i]=t[i]);return e}function u(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function h(e){function t(e,t){return-1!==e.indexOf(t)}var i=e.replace(/'.*?'/g,"").toLowerCase();return{hour:t(i,"h"),minute:t(i,"m"),second:t(i,"s"),millisec:t(i,"l"),microsec:t(i,"c"),timezone:t(i,"z"),ampm:t(i,"t")&&t(e,"h"),iso8601:t(e,"Z")}}function r(e){return 0===(e%=12)&&(e=12),String(e)}function l(e,t){var i=o(t,"separator"),t=o(t,"timeFormat").split(i).length,s=e.split(i),a=s.length;return 1<a?{dateString:s.splice(0,a-t).join(i),timeString:s.splice(0,t).join(i)}:{dateString:e,timeString:""}}function m(e,t,i,s,a){if(i=l(i,a),e=k.tm_datepicker._base_parseDate(e,i.dateString,s),""===i.timeString)return{date:e};if(s=k.tm_datepicker.parseTime(t,i.timeString,a))return{date:e,timeObj:s};throw"Wrong time format"}function T(e,t){e&&e.timezone_select&&(t=t||new Date,e.timezone_select.val(-t.getTimezoneOffset()))}function _(){this.regional=[],this.regional[""]={currentText:"Now",closeText:"Done",amNames:["AM","A"],pmNames:["PM","P"],timeFormat:"HH:mm",timeSuffix:"",timeOnlyTitle:"Choose Time",timeText:"Time",hourText:"Hour",minuteText:"Minute",secondText:"Second",millisecText:"Millisecond",microsecText:"Microsecond",timezoneText:"Time Zone",isRTL:!1},this._defaults={showButtonPanel:!0,timeOnly:!1,timeOnlyShowDate:!1,showHour:null,showMinute:null,showSecond:null,showMillisec:null,showMicrosec:null,showTimezone:null,showTime:!0,stepHour:1,stepMinute:1,stepSecond:1,stepMillisec:1,stepMicrosec:1,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMin:0,minuteMin:0,secondMin:0,millisecMin:0,microsecMin:0,hourMax:23,minuteMax:59,secondMax:59,millisecMax:999,microsecMax:999,minDateTime:null,maxDateTime:null,maxTime:null,minTime:null,onSelect:null,hourGrid:0,minuteGrid:0,secondGrid:0,millisecGrid:0,microsecGrid:0,alwaysSetTime:!0,separator:" ",altFieldTimeOnly:!0,altTimeFormat:null,altSeparator:null,altTimeSuffix:null,altRedirectFocus:!0,pickerTimeFormat:null,pickerTimeSuffix:null,showTimepicker:!0,timezoneList:null,addSliderAccess:!1,sliderAccessArgs:null,controlType:"slider",oneLine:!1,defaultValue:null,parse:"strict",afterInject:null},k.extend(this._defaults,this.regional[""])}var o=function(e,t){return(e&&e[t]?e:k.tm_timepicker._defaults)[t]};k.ui.tm_timepicker=k.ui.tm_timepicker||{},k.ui.tm_timepicker.version||(k.extend(k.ui,{tm_timepicker:{version:"1.6.3"}}),k.extend(_.prototype,{$input:null,$altInput:null,$timeObj:null,inst:null,hour_slider:null,minute_slider:null,second_slider:null,millisec_slider:null,microsec_slider:null,timezone_select:null,maxTime:null,minTime:null,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMinOriginal:null,minuteMinOriginal:null,secondMinOriginal:null,millisecMinOriginal:null,microsecMinOriginal:null,hourMaxOriginal:null,minuteMaxOriginal:null,secondMaxOriginal:null,millisecMaxOriginal:null,microsecMaxOriginal:null,ampm:"",formattedDate:"",formattedTime:"",formattedDateTime:"",timezoneList:null,units:["hour","minute","second","millisec","microsec"],support:{},control:null,setDefaults:function(e){return n(this._defaults,e||{}),this},_newInst:function(s,e){var t,i,a,n,r,l,m,o=new _,c={},u={},d=0;for(a in this._defaults)Object.prototype.hasOwnProperty.call(this._defaults,a)&&(n=s.attr("data-"+a))&&(c[a]=n);for(i in t={beforeShow:function(e,t){if("function"==typeof o._defaults.evnts.beforeShow)return o._defaults.evnts.beforeShow.call(s[0],e,t,o)},onChangeMonthYear:function(e,t,i){"function"==typeof o._defaults.evnts.onChangeMonthYear&&o._defaults.evnts.onChangeMonthYear.call(s[0],e,t,i,o)},onClose:function(e,t){!0===o.timeDefined&&""!==s.val()&&o._updateDateTime(t),"function"==typeof o._defaults.evnts.onClose&&o._defaults.evnts.onClose.call(s[0],e,t,o)}})Object.prototype.hasOwnProperty.call(t,i)&&(u[i]=e[i]||this._defaults[i]||null);if(o._defaults=k.extend({},this._defaults,c,e,t,{evnts:u,tm_timepicker:o}),o.amNames=k.map(o._defaults.amNames,function(e){return e.toUpperCase()}),o.pmNames=k.map(o._defaults.pmNames,function(e){return e.toUpperCase()}),o.support=h(o._defaults.timeFormat+(o._defaults.pickerTimeFormat||"")+(o._defaults.altTimeFormat||"")),"string"==typeof o._defaults.controlType?("slider"===o._defaults.controlType&&void 0===k.ui.slider&&(o._defaults.controlType="select"),o.control=o._controls[o._defaults.controlType]):o.control=o._defaults.controlType,r=[-720,-660,-600,-570,-540,-480,-420,-360,-300,-270,-240,-210,-180,-120,-60,0,60,120,180,210,240,270,300,330,345,360,390,420,480,525,540,570,600,630,660,690,720,765,780,840],0<(l=(r=null!==o._defaults.timezoneList?o._defaults.timezoneList:r).length)&&"object"!=typeof r[0])for(;d<l;d+=1)m=r[d],r[d]={value:m,label:k.tm_timepicker.timezoneOffsetString(m,o.support.iso8601)};return o._defaults.timezoneList=r,o.timezone=null!==o._defaults.timezone?k.tm_timepicker.timezoneOffsetNumber(o._defaults.timezone):-1*(new Date).getTimezoneOffset(),o.hour=o._defaults.hour<o._defaults.hourMin?o._defaults.hourMin:o._defaults.hour>o._defaults.hourMax?o._defaults.hourMax:o._defaults.hour,o.minute=o._defaults.minute<o._defaults.minuteMin?o._defaults.minuteMin:o._defaults.minute>o._defaults.minuteMax?o._defaults.minuteMax:o._defaults.minute,o.second=o._defaults.second<o._defaults.secondMin?o._defaults.secondMin:o._defaults.second>o._defaults.secondMax?o._defaults.secondMax:o._defaults.second,o.millisec=o._defaults.millisec<o._defaults.millisecMin?o._defaults.millisecMin:o._defaults.millisec>o._defaults.millisecMax?o._defaults.millisecMax:o._defaults.millisec,o.microsec=o._defaults.microsec<o._defaults.microsecMin?o._defaults.microsecMin:o._defaults.microsec>o._defaults.microsecMax?o._defaults.microsecMax:o._defaults.microsec,o.ampm="",o.$input=s,o._defaults.altField&&(o.$altInput=k(o._defaults.altField),!0===o._defaults.altRedirectFocus)&&o.$altInput.css({cursor:"pointer"}).on("focus",function(){s.trigger("focus")}),0!==o._defaults.minDate&&0!==o._defaults.minDateTime||(o._defaults.minDate=new Date),0!==o._defaults.maxDate&&0!==o._defaults.maxDateTime||(o._defaults.maxDate=new Date),void 0!==o._defaults.minDate&&o._defaults.minDate instanceof Date&&(o._defaults.minDateTime=new Date(o._defaults.minDate.getTime())),void 0!==o._defaults.minDateTime&&o._defaults.minDateTime instanceof Date&&(o._defaults.minDate=new Date(o._defaults.minDateTime.getTime())),void 0!==o._defaults.maxDate&&o._defaults.maxDate instanceof Date&&(o._defaults.maxDateTime=new Date(o._defaults.maxDate.getTime())),void 0!==o._defaults.maxDateTime&&o._defaults.maxDateTime instanceof Date&&(o._defaults.maxDate=new Date(o._defaults.maxDateTime.getTime())),o.$input.on("focus",function(){o._onFocus()}),o.$input.next(".ui-tm-timepicker-trigger").on("click",function(){return o._onFocus(),!1}),o},_addTimePicker:function(e){var t=k.epoAPI.util.trim(this.$altInput&&this._defaults.altFieldTimeOnly?this.$input.val()+" "+this.$altInput.val():this.$input.val());this.timeDefined=this._parseTime(t),this._limitMinMaxDateTime(e,!1),this._injectTimePicker(),this._afterInject()},_parseTime:function(t,i){var e;if(this.inst||(this.inst=k.tm_datepicker._getInst(this.$input[0])),i||!this._defaults.timeOnly){i=k.tm_datepicker._get(this.inst,"dateFormat");try{if(!(e=m(i,this._defaults.timeFormat,t,k.tm_datepicker._getFormatConfig(this.inst),this._defaults)).timeObj)return!1;k.extend(this,e.timeObj)}catch(e){return k.tm_timepicker.log("Error parsing the date/time string: "+e+"\ndate/time string = "+t+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+i),!1}}else{if(!(e=k.tm_datepicker.parseTime(this._defaults.timeFormat,t,this._defaults)))return!1;k.extend(this,e)}return!0},_afterInject:function(){var e=this.inst.settings;"function"==typeof e.afterInject&&e.afterInject.call(this)},_ui_tpicker_onclick:function(e){var t=k(e.target),i=t.html(),s=parseInt(i.replace(/[^0-9]/g),10),i=i.replace(/[^apm]/gi),t=t.data("for");"hour"===t&&(-1!==i.indexOf("p")&&s<12?s+=12:-1!==i.indexOf("a")&&12===s&&(s=0)),e.data.tp_inst.control.value(e.data.tp_inst,e.data.tp_inst[t+"_slider"],e.data.litem,s),e.data.tp_inst._onTimeChange(),e.data.tp_inst._onSelectHandler()},_injectTimePicker:function(){var e,t,i,s,a,r,n,l,m,o=this.inst.dpDiv,c=this.inst.settings,u=this,d="",h="",_=null,f={},p={},g=0,M=0;if(0===o.find("div.ui-tm-timepicker-div").length&&c.showTimepicker){for(t=" ui_tpicker_unit_hide",i='<div class="ui-tm-timepicker-div'+(c.isRTL?" ui-tm-timepicker-rtl":"")+(c.oneLine&&"select"===c.controlType?" ui-tm-timepicker-oneLine":"")+'"><dl><dt class="ui_tpicker_time_label'+(c.showTime?"":t)+'">'+c.timeText+'</dt><dd class="ui_tpicker_time '+(c.showTime?"":t)+'"><input class="ui_tpicker_time_input" '+(c.timeInput?"":"disabled")+"></dd>",g=0,M=this.units.length;g<M;g+=1){if(_=null!==c["show"+(h=(d=this.units[g]).substring(0,1).toUpperCase()+d.substring(1))]?c["show"+h]:this.support[d],f[d]=parseInt(c[d+"Max"]-(c[d+"Max"]-c[d+"Min"])%c["step"+h],10),p[d]=0,i+='<dt class="ui_tpicker_'+d+"_label"+(_?"":t)+'">'+c[d+"Text"]+'</dt><dd class="ui_tpicker_'+d+(_?"":t)+'"><div class="ui_tpicker_'+d+"_slider"+(_?"":t)+'"></div>',_&&0<c[d+"Grid"]){if(i+='<div><table class="ui-tpicker-grid-label"><tr>',"hour"===d)for(s=c[d+"Min"];s<=f[d];s+=parseInt(c[d+"Grid"],10))p[d]+=1,i+='<td data-for="'+d+'">'+k.tm_datepicker.formatTime(this.support.ampm?"hht":"HH",{hour:s},c)+"</td>";else for(a=c[d+"Min"];a<=f[d];a+=parseInt(c[d+"Grid"],10))p[d]+=1,i+='<td data-for="'+d+'">'+(a<10?"0":"")+a+"</td>";i+="</tr></table></div>"}i+="</dd>"}for(i+='<dt class="ui_tpicker_timezone_label'+((n=null!==c.showTimezone?c.showTimezone:this.support.timezone)?"":t)+'">'+c.timezoneText+"</dt>",r=k(i=i+('<dd class="ui_tpicker_timezone'+(n?"":t)+'"></dd>')+"</dl></div>"),!0===c.timeOnly&&(r.prepend('<div class="tm-ui-widget-header"><div class="tm-ui-tp-title">'+c.timeOnlyTitle+"</div></div>"),o.find(".tm-ui-dp-inner-container").hide()),g=0,M=u.units.length;g<M;g+=1)_=null!==c["show"+(h=(d=u.units[g]).substring(0,1).toUpperCase()+d.substring(1))]?c["show"+h]:this.support[d],u[d+"_slider"]=u.control.create(u,r.find(".ui_tpicker_"+d+"_slider"),d,u[d],c[d+"Min"],f[d],c["step"+h]),_&&0<c[d+"Grid"]&&(e=100*p[d]*c[d+"Grid"]/(f[d]-c[d+"Min"]),r.find(".ui_tpicker_"+d+" table").css({width:e+"%",marginLeft:c.isRTL?"0":e/(-2*p[d])+"%",marginRight:c.isRTL?e/(-2*p[d])+"%":"0",borderCollapse:"collapse"}).find("td").on("click",{that:this,tp_inst:u,litem:d},this._ui_tpicker_onclick).css({cursor:"pointer",width:100/p[d]+"%",textAlign:"center",overflow:"hidden"}));this.timezone_select=r.find(".ui_tpicker_timezone").append("<select></select>").find("select"),k.fn.append.apply(this.timezone_select,k.map(c.timezoneList,function(e){return k("<option />").val("object"==typeof e?e.value:e).text("object"==typeof e?e.label:e)})),void 0!==this.timezone&&null!==this.timezone&&""!==this.timezone?-1*new Date(this.inst.selectedYear,this.inst.selectedMonth,this.inst.selectedDay,12).getTimezoneOffset()===this.timezone?T(u):this.timezone_select.val(this.timezone):void 0!==this.hour&&null!==this.hour&&""!==this.hour?this.timezone_select.val(c.timezone):T(u),this.timezone_select.on("change",function(){u._onTimeChange(),u._onSelectHandler(),u._afterInject()}),(n=o.find(".tm-ui-dp-buttonpane")).length?n.before(r):o.append(r),this.$timeObj=r.find(".ui_tpicker_time_input"),this.$timeObj.on("change",function(){var e=u.inst.settings.timeFormat,e=k.tm_datepicker.parseTime(e,this.value),t=new Date;e?(t.setHours(e.hour),t.setMinutes(e.minute),t.setSeconds(e.second),k.datepicker._setTime(u.inst,t)):(this.value=u.formattedTime,this.trigger("blur"))}),null!==this.inst&&(n=this.timeDefined,this._onTimeChange(),this.timeDefined=n),this._defaults.addSliderAccess&&(l=this._defaults.sliderAccessArgs,m=this._defaults.isRTL,l.isRTL=m,setTimeout(function(){var n;0===r.find(".ui-slider-access").length&&(r.find(".ui-slider:visible").sliderAccess(l),n=r.find(".ui-slider-access:eq(0)").outerWidth(!0))&&r.find("table:visible").each(function(){var e=k(this),t=e.outerWidth(),i=e.css(m?"marginRight":"marginLeft").toString().replace("%",""),s=t-n,a={width:s,marginRight:0,marginLeft:0};a[m?"marginRight":"marginLeft"]=i*s/t+"%",e.css(a)})},10)),u._limitMinMaxDateTime(this.inst,!0)}},_limitMinMaxDateTime:function(e,t){var i,s,a=this._defaults,n=new Date(e.selectedYear,e.selectedMonth,e.selectedDay);this._defaults.showTimepicker&&(null!==k.tm_datepicker._get(e,"minDateTime")&&void 0!==k.tm_datepicker._get(e,"minDateTime")&&n&&(s=k.tm_datepicker._get(e,"minDateTime"),i=new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0),null!==this.hourMinOriginal&&null!==this.minuteMinOriginal&&null!==this.secondMinOriginal&&null!==this.millisecMinOriginal&&null!==this.microsecMinOriginal||(this.hourMinOriginal=a.hourMin,this.minuteMinOriginal=a.minuteMin,this.secondMinOriginal=a.secondMin,this.millisecMinOriginal=a.millisecMin,this.microsecMinOriginal=a.microsecMin),e.settings.timeOnly||i.getTime()===n.getTime()?(this._defaults.hourMin=s.getHours(),this.hour<=this._defaults.hourMin?(this.hour=this._defaults.hourMin,this._defaults.minuteMin=s.getMinutes(),this.minute<=this._defaults.minuteMin?(this.minute=this._defaults.minuteMin,this._defaults.secondMin=s.getSeconds(),this.second<=this._defaults.secondMin?(this.second=this._defaults.secondMin,this._defaults.millisecMin=s.getMilliseconds(),this.millisec<=this._defaults.millisecMin?(this.millisec=this._defaults.millisecMin,this._defaults.microsecMin=s.getMicroseconds()):(this.microsec<this._defaults.microsecMin&&(this.microsec=this._defaults.microsecMin),this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.hourMin=this.hourMinOriginal,this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)),null!==k.tm_datepicker._get(e,"maxDateTime")&&void 0!==k.tm_datepicker._get(e,"maxDateTime")&&n&&(i=k.tm_datepicker._get(e,"maxDateTime"),s=new Date(i.getFullYear(),i.getMonth(),i.getDate(),0,0,0,0),null!==this.hourMaxOriginal&&null!==this.minuteMaxOriginal&&null!==this.secondMaxOriginal&&null!==this.millisecMaxOriginal||(this.hourMaxOriginal=a.hourMax,this.minuteMaxOriginal=a.minuteMax,this.secondMaxOriginal=a.secondMax,this.millisecMaxOriginal=a.millisecMax,this.microsecMaxOriginal=a.microsecMax),e.settings.timeOnly||s.getTime()===n.getTime()?(this._defaults.hourMax=i.getHours(),this.hour>=this._defaults.hourMax?(this.hour=this._defaults.hourMax,this._defaults.minuteMax=i.getMinutes(),this.minute>=this._defaults.minuteMax?(this.minute=this._defaults.minuteMax,this._defaults.secondMax=i.getSeconds(),this.second>=this._defaults.secondMax?(this.second=this._defaults.secondMax,this._defaults.millisecMax=i.getMilliseconds(),this.millisec>=this._defaults.millisecMax?(this.millisec=this._defaults.millisecMax,this._defaults.microsecMax=i.getMicroseconds()):(this.microsec>this._defaults.microsecMax&&(this.microsec=this._defaults.microsecMax),this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.hourMax=this.hourMaxOriginal,this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)),null!==e.settings.minTime&&(a=new Date("01/01/1970 "+e.settings.minTime),parseFloat(e.settings.minTime).toString()===e.settings.minTime&&(a=new Date(Date.now()+parseFloat(e.settings.minTime))),this.hour<a.getHours()?(this._defaults.hourMin=a.getHours(),this.hour=this._defaults.hourMin,this._defaults.minuteMin=a.getMinutes(),this.minute=this._defaults.minuteMin):this.hour===a.getHours()&&this.minute<a.getMinutes()?(this._defaults.minuteMin=a.getMinutes(),this.minute=this._defaults.minuteMin):this._defaults.hourMin<a.getHours()?(this._defaults.hourMin=a.getHours(),this._defaults.minuteMin=a.getMinutes()):this._defaults.hourMin===a.getHours()===this.hour&&this._defaults.minuteMin<a.getMinutes()?this._defaults.minuteMin=a.getMinutes():this._defaults.minuteMin=0),null!==e.settings.maxTime&&(s=new Date("01/01/1970 "+e.settings.maxTime),this.hour>s.getHours()?(this._defaults.hourMax=s.getHours(),this.hour=this._defaults.hourMax,this._defaults.minuteMax=s.getMinutes(),this.minute=this._defaults.minuteMax):this.hour===s.getHours()&&this.minute>s.getMinutes()?(this._defaults.minuteMax=s.getMinutes(),this.minute=this._defaults.minuteMax):this._defaults.hourMax>s.getHours()?(this._defaults.hourMax=s.getHours(),this._defaults.minuteMax=s.getMinutes()):this._defaults.hourMax===s.getHours()===this.hour&&this._defaults.minuteMax>s.getMinutes()?this._defaults.minuteMax=s.getMinutes():this._defaults.minuteMax=59),void 0!==t)&&!0===t&&(n=parseInt(this._defaults.hourMax-(this._defaults.hourMax-this._defaults.hourMin)%this._defaults.stepHour,10),i=parseInt(this._defaults.minuteMax-(this._defaults.minuteMax-this._defaults.minuteMin)%this._defaults.stepMinute,10),a=parseInt(this._defaults.secondMax-(this._defaults.secondMax-this._defaults.secondMin)%this._defaults.stepSecond,10),e=parseInt(this._defaults.millisecMax-(this._defaults.millisecMax-this._defaults.millisecMin)%this._defaults.stepMillisec,10),s=parseInt(this._defaults.microsecMax-(this._defaults.microsecMax-this._defaults.microsecMin)%this._defaults.stepMicrosec,10),this.hour_slider&&(this.control.options(this,this.hour_slider,"hour",{min:this._defaults.hourMin,max:n,step:this._defaults.stepHour}),this.control.value(this,this.hour_slider,"hour",this.hour-this.hour%this._defaults.stepHour)),this.minute_slider&&(this.control.options(this,this.minute_slider,"minute",{min:this._defaults.minuteMin,max:i,step:this._defaults.stepMinute}),this.control.value(this,this.minute_slider,"minute",this.minute-this.minute%this._defaults.stepMinute)),this.second_slider&&(this.control.options(this,this.second_slider,"second",{min:this._defaults.secondMin,max:a,step:this._defaults.stepSecond}),this.control.value(this,this.second_slider,"second",this.second-this.second%this._defaults.stepSecond)),this.millisec_slider&&(this.control.options(this,this.millisec_slider,"millisec",{min:this._defaults.millisecMin,max:e,step:this._defaults.stepMillisec}),this.control.value(this,this.millisec_slider,"millisec",this.millisec-this.millisec%this._defaults.stepMillisec)),this.microsec_slider)&&(this.control.options(this,this.microsec_slider,"microsec",{min:this._defaults.microsecMin,max:s,step:this._defaults.stepMicrosec}),this.control.value(this,this.microsec_slider,"microsec",this.microsec-this.microsec%this._defaults.stepMicrosec))},_onTimeChange:function(){var e,t,i=!!this.hour_slider&&this.control.value(this,this.hour_slider,"hour"),s=!!this.minute_slider&&this.control.value(this,this.minute_slider,"minute"),a=!!this.second_slider&&this.control.value(this,this.second_slider,"second"),n=!!this.millisec_slider&&this.control.value(this,this.millisec_slider,"millisec"),r=!!this.microsec_slider&&this.control.value(this,this.microsec_slider,"microsec"),l=!!this.timezone_select&&this.timezone_select.val(),m=this._defaults,o=m.pickerTimeFormat||m.timeFormat,c=m.pickerTimeSuffix||m.timeSuffix;this._defaults.showTimepicker&&("object"==typeof s&&(s=!1),"object"==typeof a&&(a=!1),"object"==typeof n&&(n=!1),"object"==typeof r&&(r=!1),"object"==typeof l&&(l=!1),!1!==(i="object"==typeof i?!1:i)&&(i=parseInt(i,10)),!1!==s&&(s=parseInt(s,10)),!1!==a&&(a=parseInt(a,10)),!1!==n&&(n=parseInt(n,10)),!1!==r&&(r=parseInt(r,10)),!1!==l&&(l=l.toString()),e=m[i<12?"amNames":"pmNames"][0],(t=i!==parseInt(this.hour,10)||s!==parseInt(this.minute,10)||a!==parseInt(this.second,10)||n!==parseInt(this.millisec,10)||r!==parseInt(this.microsec,10)||0<this.ampm.length&&i<12!=(-1!==k.inArray(this.ampm.toUpperCase(),this.amNames))||null!==this.timezone&&l!==this.timezone.toString())&&(!1!==i&&(this.hour=i),!1!==s&&(this.minute=s),!1!==a&&(this.second=a),!1!==n&&(this.millisec=n),!1!==r&&(this.microsec=r),!1!==l&&(this.timezone=l),this.inst||(this.inst=k.tm_datepicker._getInst(this.$input[0])),this._limitMinMaxDateTime(this.inst,!0)),this.support.ampm&&(this.ampm=e),this.formattedTime=k.tm_datepicker.formatTime(m.timeFormat,this,m),this.$timeObj&&(o===m.timeFormat?this.$timeObj.val(this.formattedTime+c):this.$timeObj.val(k.tm_datepicker.formatTime(o,this,m)+c),this.$timeObj[0].setSelectionRange)&&(i=this.$timeObj[0].selectionStart,s=this.$timeObj[0].selectionEnd,this.$timeObj[0].setSelectionRange(i,s)),this.timeDefined=!0,t)&&this._updateDateTime()},_onSelectHandler:function(){var e=this._defaults.onSelect||this.inst.settings.onSelect,t=this.$input?this.$input[0]:null;e&&t&&e.apply(t,[this.formattedDateTime,this])},_updateDateTime:function(e){var t="",i=0<(e=this.inst||e).currentYear?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(e.selectedYear,e.selectedMonth,e.selectedDay),i=k.tm_datepicker._daylightSavingAdjust(i),s=k.tm_datepicker._get(e,"dateFormat"),a=k.tm_datepicker._getFormatConfig(e),n=null!==i&&this.timeDefined;this.formattedDate=k.tm_datepicker.formatDate(s,null===i?new Date:i,a),s=this.formattedDate,""===e.lastVal&&(e.currentYear=e.selectedYear,e.currentMonth=e.selectedMonth,e.currentDay=e.selectedDay),!0===this._defaults.timeOnly&&!1===this._defaults.timeOnlyShowDate?s=this.formattedTime:(!0!==this._defaults.timeOnly&&(this._defaults.alwaysSetTime||n)||!0===this._defaults.timeOnly&&!0===this._defaults.timeOnlyShowDate)&&(s+=this._defaults.separator+this.formattedTime+this._defaults.timeSuffix),this.formattedDateTime=s,this._defaults.showTimepicker?this.$altInput&&!1===this._defaults.timeOnly&&!0===this._defaults.altFieldTimeOnly?(this.$altInput.val(this.formattedTime),this.$input.val(this.formattedDate)):this.$altInput?(this.$input.val(s),t="",e=null!==this._defaults.altSeparator?this._defaults.altSeparator:this._defaults.separator,n=null!==this._defaults.altTimeSuffix?this._defaults.altTimeSuffix:this._defaults.timeSuffix,this._defaults.timeOnly||(t=this._defaults.altFormat?k.tm_datepicker.formatDate(this._defaults.altFormat,null===i?new Date:i,a):this.formattedDate)&&(t+=e),null!==this._defaults.altTimeFormat?t+=k.tm_datepicker.formatTime(this._defaults.altTimeFormat,this,this._defaults)+n:t+=this.formattedTime+n,this.$altInput.val(t)):this.$input.val(s):this.$input.val(this.formattedDate),this.$input.trigger("change")},_onFocus:function(){var e,t;if(!this.$input.val()&&this._defaults.defaultValue&&(this.$input.val(this._defaults.defaultValue),e=k.tm_datepicker._getInst(this.$input.get(0)),t=k.tm_datepicker._get(e,"tm_timepicker"))&&t._defaults.timeOnly&&e.input.val()!==e.lastVal)try{k.tm_datepicker._updateDatepicker(e)}catch(e){k.tm_timepicker.log(e)}},_controls:{slider:{create:function(i,e,s,t,a,n,r){var l=i._defaults.isRTL;return e.prop("slide",null).slider({orientation:"horizontal",value:l?-1*t:t,min:l?-1*n:a,max:l?-1*a:n,step:r,slide:function(e,t){i.control.value(i,k(this),s,l?-1*t.value:t.value),i._onTimeChange()},stop:function(){i._onSelectHandler()}})},options:function(e,t,i,s,a){var n;return e._defaults.isRTL?"string"==typeof s?"min"===s||"max"===s?void 0!==a?t.slider(s,-1*a):Math.abs(t.slider(s)):t.slider(s):(e=s.min,n=s.max,s.max=null,s.min=null,void 0!==e&&(s.max=-1*e),void 0!==n&&(s.min=-1*n),t.slider(s)):"string"==typeof s&&void 0!==a?t.slider(s,a):t.slider(s)},value:function(e,t,i,s){return e._defaults.isRTL?void 0!==s?t.slider("value",-1*s):Math.abs(t.slider("value")):void 0!==s?t.slider("value",s):t.slider("value")}},select:{create:function(e,t,i,s,a,n,r){for(var l='<select class="ui-tm-timepicker-select ui-state-default ui-corner-all" data-unit="'+i+'" data-min="'+a+'" data-max="'+n+'" data-step="'+r+'">',m=e._defaults.pickerTimeFormat||e._defaults.timeFormat,o=a;o<=n;o+=r)l=(l+='<option value="'+o+'"'+(o===s?" selected":"")+">")+("hour"===i?k.tm_datepicker.formatTime(k.epoAPI.util.trim(m.replace(/[^ht ]/gi,"")),{hour:o},e._defaults):"millisec"===i||"microsec"===i||10<=o?o:"0"+o.toString())+"</option>";return l+="</select>",t.children("select").remove(),k(l).appendTo(t).on("change",function(){e._onTimeChange(),e._onSelectHandler(),e._afterInject()}),t},options:function(e,t,i,s,a){var n={},r=t.children("select");if("string"==typeof s){if(void 0===a)return r.data(s);n[s]=a}else n=s;return e.control.create(e,t,r.data("unit"),r.val(),0<=n.min?n.min:r.data("min"),n.max||r.data("max"),n.step||r.data("step"))},value:function(e,t,i,s){t=t.children("select");return void 0!==s?t.val(s):t.val()}}}}),k.fn.extend({tm_timepicker:function(e){var t=Array.prototype.slice.call(arguments);return"object"==typeof(e=e||{})&&(t[0]=k.extend(e,{timeOnly:!0})),k(this).each(function(){k.fn.tm_datetimepicker.apply(k(this),t)})},tm_datetimepicker:function(t){var i=arguments;return"string"==typeof(t=t||{})?"getDate"===t||"option"===t&&2===i.length&&"string"==typeof i[1]?k.fn.tm_datepicker.apply(k(this[0]),i):this.each(function(){var e=k(this);e.tm_datepicker.apply(e,i)}):this.each(function(){var e=k(this);e.tm_datepicker(k.tm_timepicker._newInst(e,t)._defaults)})}}),k.tm_datepicker.parseDateTime=function(e,t,i,s,a){e=m(e,t,i,s,a);return e.timeObj&&(t=e.timeObj,e.date.setHours(t.hour,t.minute,t.second,t.millisec),e.date.setMicroseconds(t.microsec)),e.date},k.tm_datepicker.parseTime=function(t,i,s){function a(e,t,n){var i="^"+e.toString().replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){var t,i,s,a=e.length;switch(e.charAt(0).toLowerCase()){case"h":case"m":case"s":return 1===a?"(\\d?\\d)":"(\\d{"+a+"})";case"l":case"c":return"(\\d?\\d?\\d)";case"z":return"(z|[-+]\\d\\d:?\\d\\d|\\S+)?";case"t":return t=n.amNames,i=n.pmNames,s=[],t&&k.merge(s,t),i&&k.merge(s,i),"("+(s=k.map(s,function(e){return e.replace(/[.*+?|()[\]{}\\]/g,"\\$&")})).join("|")+")?";default:return"("+e.replace(/'/g,"").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g,function(e){return"\\"+e})+")?"}}).replace(/\s/g,"\\s?")+n.timeSuffix+"$",e=function(e){var t,i=e.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),s={h:-1,m:-1,s:-1,l:-1,c:-1,t:-1,z:-1};if(i)for(t=0;t<i.length;t+=1)-1===s[i[t].toString().charAt(0)]&&(s[i[t].toString().charAt(0)]=t+1);return s}(e),s="",a={hour:0,minute:0,second:0,millisec:0,microsec:0};return!!(t=t.match(new RegExp(i,"i")))&&(-1!==e.t&&(void 0===t[e.t]||0===t[e.t].length?a.ampm=s="":(s=-1!==k.inArray(t[e.t].toUpperCase(),k.map(n.amNames,function(e){return e.toUpperCase()}))?"AM":"PM",a.ampm=n["AM"===s?"amNames":"pmNames"][0])),-1!==e.h&&("AM"===s&&"12"===t[e.h]?a.hour=0:"PM"===s&&"12"!==t[e.h]?a.hour=parseInt(t[e.h],10)+12:a.hour=Number(t[e.h])),-1!==e.m&&(a.minute=Number(t[e.m])),-1!==e.s&&(a.second=Number(t[e.s])),-1!==e.l&&(a.millisec=Number(t[e.l])),-1!==e.c&&(a.microsec=Number(t[e.c])),-1!==e.z&&void 0!==t[e.z]&&(a.timezone=k.tm_timepicker.timezoneOffsetNumber(t[e.z])),a)}s=n(n({},k.tm_timepicker._defaults),s||{});if("function"==typeof s.parse)return s.parse(t,i,s);if("loose"!==s.parse)return a(t,i,s);var e;try{if(e=new Date("2012-01-01 "+i),isNaN(e.getTime())&&(e=new Date("2012-01-01T"+i),isNaN(e.getTime()))&&(e=new Date("01/01/2012 "+i),isNaN(e.getTime())))throw"Unable to parse time with native Date: "+i;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisec:e.getMilliseconds(),microsec:e.getMicroseconds(),timezone:-1*e.getTimezoneOffset()}}catch(e){try{return a(t,i,s)}catch(e){k.tm_timepicker.log("Unable to parse \ntimeString: "+i+"\ntimeFormat: "+t)}}return!1},k.tm_datepicker.formatTime=function(e,t,i){var s,a;return i=i||{},i=k.extend({},k.tm_timepicker._defaults,i),t=k.extend({hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null},t),e=e,s=i.amNames[0],11<(a=parseInt(t.hour,10))&&(s=i.pmNames[0]),e=e.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){switch(e){case"HH":return("0"+a).slice(-2);case"H":return a;case"hh":return("0"+r(a)).slice(-2);case"h":return r(a);case"mm":return("0"+t.minute).slice(-2);case"m":return t.minute;case"ss":return("0"+t.second).slice(-2);case"s":return t.second;case"l":return("00"+t.millisec).slice(-3);case"c":return("00"+t.microsec).slice(-3);case"z":return k.tm_timepicker.timezoneOffsetString((null===t.timezone?i:t).timezone,!1);case"Z":return k.tm_timepicker.timezoneOffsetString((null===t.timezone?i:t).timezone,!0);case"T":return s.charAt(0).toUpperCase();case"TT":return s.toUpperCase();case"t":return s.charAt(0).toLowerCase();case"tt":return s.toLowerCase();default:return e.replace(/'/g,"")}})},k.tm_datepicker._base_selectDate=k.tm_datepicker._selectDate,k.tm_datepicker._selectDate=function(e,t){var i=this._getInst(k(e)[0]),s=this._get(i,"tm_timepicker");s&&i.settings.showTimepicker?(s._limitMinMaxDateTime(i,!0),s=i.inline,i.stay_open=!0,i.inline=!0,this._base_selectDate(e,t),i.inline=s,i.stay_open=!1,this._notifyChange(i),this._updateDatepicker(i)):this._base_selectDate(e,t)},k.tm_datepicker._base_updateDatepicker=k.tm_datepicker._updateDatepicker,k.tm_datepicker._updateDatepicker=function(e){var t=e.input[0];k.tm_datepicker._curInst&&k.tm_datepicker._curInst!==e&&k.tm_datepicker._datepickerShowing&&k.tm_datepicker._lastInput!==t||("boolean"!=typeof e.stay_open||!1===e.stay_open)&&(this._base_updateDatepicker(e),t=this._get(e,"tm_timepicker"))&&t._addTimePicker(e)},k.tm_datepicker._base_doKeyPress=k.tm_datepicker._doKeyPress,k.tm_datepicker._doKeyPress=function(e){var t,i,s=k.tm_datepicker._getInst(e.target),a=k.tm_datepicker._get(s,"tm_timepicker");return a&&k.tm_datepicker._get(s,"constrainInput")?(t=a.support.ampm,i=null!==a._defaults.showTimezone?a._defaults.showTimezone:a.support.timezone,s=k.tm_datepicker._possibleChars(k.tm_datepicker._get(s,"dateFormat")),t=a._defaults.timeFormat.toString().replace(/[hms]/g,"").replace(/TT/g,t?"APM":"").replace(/Tt/g,t?"AaPpMm":"").replace(/tT/g,t?"AaPpMm":"").replace(/T/g,t?"AP":"").replace(/tt/g,t?"apm":"").replace(/t/g,t?"ap":"")+" "+a._defaults.separator+a._defaults.timeSuffix+(i?a._defaults.timezoneList.join(""):"")+a._defaults.amNames.join("")+a._defaults.pmNames.join("")+s,i=String.fromCharCode(void 0===e.charCode?e.keyCode:e.charCode),e.ctrlKey||i<" "||!s||-1<t.indexOf(i)):k.tm_datepicker._base_doKeyPress(e)},k.tm_datepicker._base_updateAlternate=k.tm_datepicker._updateAlternate,k.tm_datepicker._updateAlternate=function(e){var t,i,s,a,n,r,l,m=this._get(e,"tm_timepicker");m?(t=m._defaults.altField)&&(i=this._getDate(e),s=k.tm_datepicker._getFormatConfig(e),a="",n=m._defaults.altSeparator||m._defaults.separator,r=m._defaults.altTimeSuffix||m._defaults.timeSuffix,l=null!==m._defaults.altTimeFormat?m._defaults.altTimeFormat:m._defaults.timeFormat,a+=k.tm_datepicker.formatTime(l,m,m._defaults)+r,m._defaults.timeOnly||m._defaults.altFieldTimeOnly||null===i||(a=m._defaults.altFormat?k.tm_datepicker.formatDate(m._defaults.altFormat,i,s)+n+a:m.formattedDate+n+a),k(t).val(e.input.val()?a:"")):k.tm_datepicker._base_updateAlternate(e)},k.tm_datepicker._base_doKeyUp=k.tm_datepicker._doKeyUp,k.tm_datepicker._doKeyUp=function(e){var t=k.tm_datepicker._getInst(e.target),i=k.tm_datepicker._get(t,"tm_timepicker");if(i&&i._defaults.timeOnly&&t.input.val()!==t.lastVal)try{k.tm_datepicker._updateDatepicker(t)}catch(e){k.tm_timepicker.log(e)}return k.tm_datepicker._base_doKeyUp(e)},k.tm_datepicker._base_gotoToday=k.tm_datepicker._gotoToday,k.tm_datepicker._gotoToday=function(e){var t,i,s=this._getInst(k(e)[0]);this._base_gotoToday(e),(e=this._get(s,"timepicker"))&&(t=k.tm_timepicker.timezoneOffsetNumber(e.timezone),(i=new Date).setMinutes(i.getMinutes()+i.getTimezoneOffset()+parseInt(t,10)),this._setTime(s,i),this._setDate(s,i),e._onSelectHandler())},k.tm_datepicker._disableTimepickerDatepicker=function(e){var t,i=this._getInst(e);i&&(t=this._get(i,"tm_timepicker"),k(e).tm_datepicker("getDate"),t)&&(i.settings.showTimepicker=!1,t._defaults.showTimepicker=!1,t._updateDateTime(i))},k.tm_datepicker._enableTimepickerDatepicker=function(e){var t,i=this._getInst(e);i&&(t=this._get(i,"tm_timepicker"),k(e).tm_datepicker("getDate"),t)&&(i.settings.showTimepicker=!0,t._defaults.showTimepicker=!0,t._addTimePicker(i),t._updateDateTime(i))},k.tm_datepicker._setTime=function(e,t){var i,s=this._get(e,"tm_timepicker");s&&(i=s._defaults,s.hour=t?t.getHours():i.hour,s.minute=t?t.getMinutes():i.minute,s.second=t?t.getSeconds():i.second,s.millisec=t?t.getMilliseconds():i.millisec,s.microsec=t?t.getMicroseconds():i.microsec,s._limitMinMaxDateTime(e,!0),s._onTimeChange(),s._updateDateTime(e))},k.tm_datepicker._setTimeDatepicker=function(e,t,i){var s,a,e=this._getInst(e);e&&(s=this._get(e,"tm_timepicker"))&&(this._setDateFromField(e),t)&&("string"==typeof t?(s._parseTime(t,i),(a=new Date).setHours(s.hour,s.minute,s.second,s.millisec),a.setMicroseconds(s.microsec)):(a=new Date(t.getTime())).setMicroseconds(t.getMicroseconds()),"Invalid Date"===a.toString()&&(a=void 0),this._setTime(e,a))},k.tm_datepicker._base_setDateDatepicker=k.tm_datepicker._setDateDatepicker,k.tm_datepicker._setDateDatepicker=function(e,t){var i,s=this._getInst(e),a=t;s&&("string"!=typeof t||(a=new Date(t)).getTime()||(this._base_setDateDatepicker.apply(this,arguments),a=k(e).tm_datepicker("getDate")),t=this._get(s,"tm_timepicker"),a instanceof Date?(i=new Date(a.getTime())).setMicroseconds(a.getMicroseconds()):i=a,t&&i&&(t.support.timezone||null!==t._defaults.timezone||(t.timezone=-1*i.getTimezoneOffset()),a=k.tm_timepicker.timezoneAdjust(a,k.tm_timepicker.timezoneOffsetString(-a.getTimezoneOffset()),t.timezone),i=k.tm_timepicker.timezoneAdjust(i,k.tm_timepicker.timezoneOffsetString(-i.getTimezoneOffset()),t.timezone)),this._updateDatepicker(s),this._base_setDateDatepicker.apply(this,arguments),this._setTimeDatepicker(e,i,!0))},k.tm_datepicker._base_getDateDatepicker=k.tm_datepicker._getDateDatepicker,k.tm_datepicker._getDateDatepicker=function(e,t){var i,s,a,n=this._getInst(e);if(n)return(i=this._get(n,"tm_timepicker"))?(void 0===n.lastVal&&this._setDateFromField(n,t),s=this._getDate(n),a=null,a=i.$altInput&&i._defaults.altFieldTimeOnly?i.$input.val()+" "+i.$altInput.val():("INPUT"!==i.$input.get(0).tagName&&i.$altInput?i.$altInput:i.$input).val(),s&&i._parseTime(a,!n.settings.timeOnly)&&(s.setHours(i.hour,i.minute,i.second,i.millisec),s.setMicroseconds(i.microsec),null!==i.timezone)&&(i.support.timezone||null!==i._defaults.timezone||(i.timezone=-1*s.getTimezoneOffset()),s=k.tm_timepicker.timezoneAdjust(s,i.timezone,k.tm_timepicker.timezoneOffsetString(-s.getTimezoneOffset()))),s):this._base_getDateDatepicker(e,t)},k.tm_datepicker._base_parseDate=k.tm_datepicker.parseDate,k.tm_datepicker.parseDate=function(t,i,s){var a;try{a=this._base_parseDate(t,i,s)}catch(e){if(!(0<=e.indexOf(":")))throw e;a=this._base_parseDate(t,i.substring(0,i.length-(e.length-e.indexOf(":")-2)),s),k.tm_timepicker.log("Error parsing the date string: "+e+"\ndate string = "+i+"\ndate format = "+t)}return a},k.tm_datepicker._base_formatDate=k.tm_datepicker._formatDate,k.tm_datepicker._formatDate=function(e){var t=this._get(e,"tm_timepicker");return t?(t._updateDateTime(e),t.$input.val()):this._base_formatDate(e)},k.tm_datepicker._base_optionDatepicker=k.tm_datepicker._optionDatepicker,k.tm_datepicker._optionDatepicker=function(e,t,i){var s,a,n,r,l,m,o,c=this._getInst(e);if(!c)return null;if(c=this._get(c,"tm_timepicker")){if(o=a=m=null,n=c._defaults.evnts,r={},"string"==typeof t){if("minDate"===t||"minDateTime"===t)m=i;else if("maxDate"===t||"maxDateTime"===t)a=i;else if("onSelect"===t)o=i;else if(Object.prototype.hasOwnProperty.call(n,t)){if(void 0===i)return n[t];r[t]=i,s={}}}else if("object"==typeof t)for(l in t.minDate?m=t.minDate:t.minDateTime?m=t.minDateTime:t.maxDate?a=t.maxDate:t.maxDateTime&&(a=t.maxDateTime),n)Object.prototype.hasOwnProperty.call(n,l)&&t[l]&&(r[l]=t[l]);for(l in r)Object.prototype.hasOwnProperty.call(r,l)&&(n[l]=r[l],delete(s=s||k.extend({},t))[l]);if(s&&u(s))return;if(m?(m=0===m?new Date:new Date(m),c._defaults.minDate=m,c._defaults.minDateTime=m):a?(a=0===a?new Date:new Date(a),c._defaults.maxDate=a,c._defaults.maxDateTime=a):o&&(c._defaults.onSelect=o),m||a)return o=(c=k(e)).tm_datetimepicker("getDate"),m=this._base_optionDatepicker.call(k.tm_datepicker,e,s||t,i),c.tm_datetimepicker("setDate",o),m}return void 0===i?this._base_optionDatepicker.call(k.tm_datepicker,e,t):this._base_optionDatepicker.call(k.tm_datepicker,e,s||t,i)},k.tm_timepicker=new _,k.tm_timepicker.timezoneOffsetString=function(e,t){var i;return!(isNaN(e)||840<e||e<-720)&&(i=e%60,t=t?":":"","+00:00"==(e=(0<=e?"+":"-")+("0"+Math.abs((e-i)/60)).slice(-2)+t+("0"+Math.abs(i)).slice(-2)))?"Z":e},k.tm_timepicker.timezoneOffsetNumber=function(e){var t=e.toString().replace(":","");return"Z"===t.toUpperCase()?0:/^(-|\+)\d{4}$/.test(t)?("-"===t.substring(0,1)?-1:1)*(60*parseInt(t.substring(1,3),10)+parseInt(t.substring(3,5),10)):parseInt(e,10)},k.tm_timepicker.timezoneAdjust=function(e,t,i){t=k.timepicker.timezoneOffsetNumber(t),i=k.tm_timepicker.timezoneOffsetNumber(i);return isNaN(i)||e.setMinutes(e.getMinutes()+-t- -i),e},k.tm_timepicker.timeRange=function(e,t,i){return k.tm_timepicker.handleRange("tm_timepicker",e,t,i)},k.tm_timepicker.datetimeRange=function(e,t,i){k.tm_timepicker.handleRange("tm_datetimepicker",e,t,i)},k.tm_timepicker.dateRange=function(e,t,i){k.tm_timepicker.handleRange("tm_datepicker",e,t,i)},k.tm_timepicker.handleRange=function(r,l,m,o){var e=!1;function t(e,t){var i,s,a=l[r]("getDate"),n=m[r]("getDate"),e=e[r]("getDate");null!==a&&(i=new Date(a.getTime()),s=new Date(a.getTime()),i.setMilliseconds(i.getMilliseconds()+o.minInterval),s.setMilliseconds(s.getMilliseconds()+o.maxInterval),0<o.minInterval&&n<i?m[r]("setDate",i):0<o.maxInterval&&s<n?m[r]("setDate",s):n<a&&t[r]("setDate",e))}function i(e,t,i){e.val()&&(null!==(e=e[r].call(e,"getDate"))&&0<o.minInterval&&("minDate"===i&&e.setMilliseconds(e.getMilliseconds()+o.minInterval),"maxDate"===i)&&e.setMilliseconds(e.getMilliseconds()-o.minInterval),e.getTime)&&t[r].call(t,"option",i,e)}return o=k.extend({},{minInterval:0,maxInterval:0,start:{},end:{}},o),"tm_timepicker"===r&&(e=!0,r="tm_datetimepicker"),k.fn[r].call(l,k.extend({timeOnly:e,onClose:function(){t(k(this),m)},onSelect:function(){i(k(this),m,"minDate")}},o,o.start)),k.fn[r].call(m,k.extend({timeOnly:e,onClose:function(){t(k(this),l)},onSelect:function(){i(k(this),l,"maxDate")}},o,o.end)),t(l,m),i(l,m,"minDate"),i(m,l,"maxDate"),k([l.get(0),m.get(0)])},k.tm_timepicker.log=function(){window.console&&window.console.log&&window.console.log.apply&&window.console.log.apply(window.console,Array.prototype.slice.call(arguments))},k.tm_timepicker._util={_extendRemove:n,_isEmptyObject:u,_convert24to12:r,_detectSupport:h,_selectLocalTimezone:T,_computeEffectiveSetting:o,_splitDateTime:l,_parseDateTimeInternal:m},Date.prototype.getMicroseconds||(Object.defineProperty(Date.prototype,"microseconds",{value:0,writable:!0}),Object.defineProperty(Date.prototype,"getMicroseconds",{value:function(){return this.microseconds}}),Object.defineProperty(Date.prototype,"setMicroseconds",{value:function(e){return this.setMilliseconds(this.getMilliseconds()+Math.floor(e/1e3)),this.microseconds=e%1e3,this}})),k.tm_timepicker.version="1.6.3")});
!function(w){"use strict";function n(t,s){return this.elements=w(t),this.last=[],this.current=[],this.enableEvents=!0,this.backup=[],this.options=w.extend({},w.fn.tcTabs.defaults,s),0<this.elements.length&&(this.init(),this)}var y=w.epoAPI.util.getStorage("localStorage"),h=window.confirm;n.prototype={constructor:n,set:function(t){this.options=w.extend({},this.options,t),this.init(!0)},addHeaderEvents:function(i,o,e,t,n,l,r,d,c){var s="",p=this;t.off("closetab.tmtabs").on("closetab.tmtabs",function(){var t=w(this),s=i.find(t.data("tab"));t.removeClass("closed open").addClass("closed"),t.find(".tm-arrow").removeClass(p.options.classdown+" "+p.options.classup).addClass(p.options.classdown),p.options.useclasstohide?s.addClass("tm-hide").removeClass("tm-show"):s.hide(),s.removeClass("tm-animated "+p.options.animationclass),w(window).trigger("tc-closetab.tmtabs",{header:t,tab:s})}),t.off("opentab.tmtabs").on("opentab.tmtabs",function(){var t=w(this),s=i.find(t.data("tab"));t.removeClass("closed open").addClass("open"),t.find(".tm-arrow").removeClass(p.options.classdown+" "+p.options.classup).addClass(p.options.classup),p.options.useclasstohide?s.removeClass("tm-hide").addClass("tm-show"):s.show(),s.removeClass("tm-animated "+p.options.animationclass).addClass("tm-animated "+p.options.animationclass),p.current[o]=t.data("tab"),w(window).trigger("tc-opentab.tmtabs",{header:t,tab:p.current[o],table:s}),p.scrollIntoView(i,t,c)}),!0!==p.options.showonhover&&"function"!=typeof p.options.showonhover||(s=" mouseover"),t.off("keydown.tmtabs").on("keydown.tmtabs",function(t){var s,o=w(this);13===t.keyCode&&o.trigger("click.tmtabs"),40===t.keyCode&&(s=o.closest(".tm-box").next().find("."+p.options.header)),(s=38===t.keyCode?o.closest(".tm-box").prev().find("."+p.options.header):s)&&s.length&&(o.trigger("blur"),s.trigger(" focus").trigger("click"),t.preventDefault())}),t.off("click.tmtabs").on("click.tmtabs"+s,function(t){var s=w(this);t.preventDefault(),"mouseover"===t.type&&"function"==typeof p.options.showonhover&&!p.options.showonhover.call()||(p.current[o]===s.data("tab")?w(window).trigger("tc-isopentab.tmtabs",{header:s,tab:p.current[o],table:i.find(p.current[o])}):(p.last[o]&&w(p.last[o]).trigger("closetab.tmtabs"),s.trigger("opentab.tmtabs"),p.last[o]=s,y&&y.setItem("tmadmintab-"+e,s.attr(p.options.dataopenattribute)),w(window).trigger("tc-tmtabs-clicked",{tc:e,options:p.options,header:s,tab:p.current[o],table:i.find(p.current[o])})))}),this.options.deletebutton?(t.append(this.options.deletebuttonhtml),t.find("."+this.options.deleteheader).off("click.tmtabs").on("click.tmtabs",function(t){var s=w(this),o=s.closest(".tm-box"),e=o.find("."+p.options.header),a=i.find("."+e.attr(p.options.dataattribute));t.stopPropagation(),i.find("."+p.options.headers+" ."+p.options.header).length<2||p.options.deleteconfirm&&!h(window.TMEPOGLOBALADMINJS.i18n_builder_delete)||("function"==typeof p.options.beforedeletetab&&p.options.beforedeletetab.call(i,s,a),a.remove(),e.is(".open")&&(o.next().find("."+p.options.header).is(".closed")?o.next().find("."+p.options.header).trigger("click.tmtabs"):o.prev().find("."+p.options.header).is(".closed")&&o.prev().find("."+p.options.header).trigger("click.tmtabs")),o.remove(),p.checkSize(n,l,r,d,c,!0),"function"==typeof p.options.afterdeletetab&&p.options.afterdeletetab.call(i))})):t.find("."+this.options.deleteheader).remove(),this.options.editbutton?(t.append(p.options.editbuttonhtml),t.find("."+p.options.editheader).off("click.tmtabs").on("click.tmtabs",function(t){var s;p.enableEvents&&"function"==typeof p.options.oneditbutton&&(t.stopPropagation(),t=w(this),s=i.find("."+t.closest(".tm-box").find("."+p.options.header).attr(p.options.dataattribute)),p.options.oneditbutton.call(i,t,s))})):t.find("."+this.options.editheader).remove()},initHeader:function(t,s,o,e,a,i,n,l){var r=s.attr("class"),d="."+(t=w(t)).attr(this.options.dataattribute);t.data("tab",d),this.options.useclasstohide?s.find(d).addClass("tm-hide").removeClass("tm-show"):s.find(d).hide(),s.find(d).data("state","closed"),t.is(".open")?(t.removeClass("closed open").addClass("open").data("state","open"),t.find(".tm-arrow").removeClass(this.options.classdown+" "+this.options.classup).addClass(this.options.classup),this.options.useclasstohide?s.find(d).removeClass("tm-hide").addClass("tm-show"):s.find(d).show(),s.find(d).data("state","open"),this.current[o]=d,this.last[o]=t):t.removeClass("closed open").addClass("closed").data("state","closed"),this.addHeaderEvents(s,o,r,t,e,a,i,n,l)},checkSize:function(t,s,o,e,a,i){var n,l=[];s.parents().addBack().not(":visible").each(function(){var t=w(this),s=this.style.display,o=t.css("display"),e=this.style.visibility,a=!1,o={styleDisplay:s,cssDisplay:o,styleVisibility:e,cssVisibility:t.css("visibility"),display:null,visibility:null,element:t};"none"===s&&(this.style.display="",o.display=!0,"none"===t.css("display")&&(this.style.display="block"),a=!0),"hidden"===e&&(this.style.visibility="",o.visibility=!0,"hidden"===t.css("visibility")&&(this.style.visibility="visible"),a=!0),a&&l.push(o)}),n=Math.round(s.outerWidth()),s.is(".has-scroll-arrows")&&(s.removeClass(".has-scroll-arrows"),n=Math.round(t.outerWidth())),i&&((t=s.find("."+this.options.header+".open")).length&&t.removeClass("open"),a.scrollWidth=s[0].scrollWidth,t.length)&&t.addClass("open"),a.scrollWidth>n?(e.addClass("scroll-arrow-show"),o.addClass("scroll-arrow-show"),s.addClass("has-scroll-arrows"),a.scrollWidth-n===s.scrollLeft()?e.addClass("scroll-arrow-disabled scroll-arrow-right-disabled"):e.removeClass("scroll-arrow-disabled scroll-arrow-right-disabled"),0===s.scrollLeft()?o.addClass("scroll-arrow-disabled scroll-arrow-left-disabled"):o.removeClass("scroll-arrow-disabled scroll-arrow-left-disabled")):(e.removeClass("scroll-arrow-show"),o.removeClass("scroll-arrow-show"),s[0].scrollLeft=0,s.removeClass("has-scroll-arrows")),l.forEach(function(t){t.display&&(t.element[0].style.display=t.styleDisplay),t.visibility&&(t.element[0].style.visibility=t.styleVisibility)})},scrollIntoView:function(t,s,o){var e=o.scrollPos,t=t.find("."+this.options.headers),a=t.width();t.is(".has-scroll-arrows")&&s&&void 0!==s&&s.position()&&void 0!==s.position()&&(s.position().left<0?(o.scrollPos=Math.max(e+s.position().left+1,0),t.animate({scrollLeft:o.scrollPos+1+"px"},this.options.scrollDuration)):s.position().left+s.outerWidth()>a&&(o.scrollPos=Math.min(e+(s.position().left+s.outerWidth()-a),t[0].scrollWidth-t.outerWidth()),t.animate({scrollLeft:o.scrollPos-1+"px"},this.options.scrollDuration)))},initElement:function(l,r,d,t){var c,p,h,m,s,n,o,f=this,b=l.attr("class"),e=l.find("."+this.options.headers+" ."+this.options.header),u=0,v="",a={};0!==e.length&&((c=l.find("."+this.options.headers)).wrap('<div class="'+this.options.headersWrap+'"></div>'),p=l.find("."+this.options.headersWrap),this.options.scroll&&(p.html('<div class="tc-scroll-left-arrow"></div>'+p.html()+'<div class="tc-scroll-right-arrow"></div>'),e=l.find("."+this.options.headers+" ."+this.options.header),c=l.find("."+this.options.headers),h=l.find(".tc-scroll-left-arrow"),m=l.find(".tc-scroll-right-arrow"),"function"==typeof w.fn.mousewheel&&c.mousewheel(function(t,s){"none"!==m.css("display")&&(this.scrollLeft-=30*s,d.scrollPos=this.scrollLeft,t.preventDefault())}),c.animate({scrollLeft:d.scrollPos+"px"},0),this.checkSize(p,c,h,m,d,!0),w(window).off("resize.tmtabs"+t).on("resize.tmtabs"+t,function(){f.checkSize(p,c,h,m,d,!0)}),l.off("refresh.tmtabs"+t).on("refresh.tmtabs"+t,function(){f.checkSize(p,c,h,m,d,!0)}),w(function(){f.checkSize(p,c,h,m,d,!0)}),m.off("mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs").on("mousedown.tmtabs",function(t){function s(){var t=c.scrollLeft();d.scrollPos=Math.min(t+f.options.scrollDistance,d.scrollWidth-c.outerWidth()),c.animate({scrollLeft:d.scrollPos+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d)})}t.stopPropagation(),s(),o=setInterval(function(){s()},f.options.scrollDuration)}).on("mouseup.tmtabs mouseleave.tmtabs",function(){clearInterval(o)}).on("mouseover.tmtabs",function(){w(this).addClass("scroll-arrow-over scroll-arrow-right-over")}).on("mouseout.tmtabs",function(){w(this).removeClass("scroll-arrow-over scroll-arrow-right-over")}),h.off("mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs").on("mousedown.tmtabs",function(t){function s(){var t=c.scrollLeft();d.scrollPos=Math.max(t-f.options.scrollDistance,0),c.animate({scrollLeft:d.scrollPos+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d)})}t.stopPropagation(),s(),o=setInterval(function(){s()},f.options.scrollDuration)}).on("mouseup.tmtabs mouseleave.tmtabs",function(){clearInterval(o)}).on("mouseover.tmtabs",function(){w(this).addClass("scroll-arrow-over scroll-arrow-left-over")}).on("mouseout.tmtabs",function(){w(this).removeClass("scroll-arrow-over scroll-arrow-left-over")})),window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(t,s,o){a[s]=o}),this.last[r]=!1,this.current[r]="",l.data("tm-has-tmtabs",1),e.each(function(t,s){f.initHeader(s,l,r,p,c,h,m,d)}),this.options.sortabletabs&&l.find("."+this.options.headers+":not(.section_elements ."+this.options.headers+",.tm-settings-wrap ."+this.options.headers+",.builder-element-wrap ."+this.options.headers+")").sortable({cursor:"move",items:".tm-box:not(.tm-add-box)",start:function(t,s){var o=l.find("."+s.item.closest(".tm-box").find("."+f.options.header).attr(f.options.dataattribute));u=s.item.index(),v=s.item.find("."+f.options.header).attr(f.options.dataopenattribute),n=w.tmEPOAdmin.find_index(!0,o.find(".bitem").first()),"function"==typeof f.options.beforemovetab&&f.options.beforemovetab.call(this,u,o,n),f.enableEvents=!1},stop:function(t,s){var o,e,a=l.find("."+s.item.closest(".tm-box").find("."+f.options.header).attr(f.options.dataattribute)),s=l.find("."+f.options.slide+"."+v),i=l.find("."+f.options.headers+" ."+f.options.header+"["+f.options.dataopenattribute+"='"+v+"']").parent().index();i!==u&&(o=l.find("."+f.options.slide).eq(i),(e=s.tcClone()).find(".bitem").remove(),u<i?o.after(e):i<u&&o.before(e),s.find(".bitem").toArray().forEach(function(t){t=w(t),"function"==typeof f.options.beforemovebitem&&f.options.beforemovebitem.call(this,i,u,a,n,t),e.append(t),"function"==typeof f.options.aftermovebitem&&f.options.aftermovebitem.call(this,i,u,a,n,t)}),s.remove(),"function"==typeof f.options.aftermovetab)&&f.options.aftermovetab.call(this,i,u,a,n),f.enableEvents=!0},cancel:".tm-add-box",forcePlaceholderSize:!0,revert:200,placeholder:"tm-box pl",tolerance:"pointer"}),this.options.addbutton?(p.append(this.options.addbuttonhtml),l.addClass("has-add-button").find("."+this.options.addheader).off("click.tmtabs").on("click.tmtabs",function(t){var s=l.find("."+f.options.headers+" ."+f.options.header),o=s.last(),e=o.attr(f.options.dataattribute),a=l.find("."+e),i=o.tcClone().off("closetab.tmtabs opentab.tmtabs click.tmtabs"),n=a.tcClone().empty(),s=f.options.slide+s.length;t.preventDefault(),i.html('<span class="tab-text">'+(l.find("."+f.options.headers+" ."+f.options.header).length+1)+"</span>").removeClass("closed open").addClass("closed").data("tab","."+s).data("state","closed").attr(f.options.dataattribute,s),n.removeClass(e).addClass(s),f.options.useclasstohide?n.addClass("tm-hide").removeClass(".tm-show"):n.hide(),n.removeClass("tm-animated "+f.options.animationclass),o.closest(".tm-box").after(i),i.wrap('<div class="tm-box"></div>'),f.addHeaderEvents(l,r,b,i,p,c,h,m,d),a.after(n),f.options.scroll&&c.animate({scrollLeft:i.width()+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d,!0)}),"function"==typeof f.options.afteraddtab&&f.options.afteraddtab.call(this,i,n)})):p.find("."+this.options.addheader).remove(),"auto"===this.options.selectedtab?(y&&(s=y.getItem("tmadmintab-"+b)),void 0!==a.selected_tab&&(s=a.selected_tab),null==(s=void 0!==a.menu?a.menu:s)&&(s=l.find("."+this.options.header).eq(0).attr(this.options.dataopenattribute)),(l.find("."+this.options.header+"["+this.options.dataopenattribute+'="'+s+'"]').is(":visible")?l.find("."+this.options.header+"["+this.options.dataopenattribute+'="'+s+'"]'):l.find("."+this.options.header).eq(0)).trigger("click.tmtabs")):!1!==this.options.selectedtab&&(s=parseInt(this.options.selectedtab,10),l.find("."+this.options.header+":eq("+s+")").trigger("click.tmtabs")))},init:function(a){var i=this;this.elements.each(function(t){var s=w(this),o={},e=s.html();!a&&i.backup[t]?s.html(i.backup[t]):i.backup[t]=e,o.scrollPos=0,o.scrollWidth=0,e=s.css("display"),s.show(),i.initElement(s,t,o,w.epoAPI.math.uniqueid("")),s.css("display",e)})}},w.fn.tcTabs=function(t){var s,o,e=w(this),a=e.data("tctabs"),i=w.makeArray(arguments);return i.splice(0,1),o="object"==typeof t?t:{},a||(a=new n(this,o),e.data("tctabs",a)),void 0===(s="string"==typeof t?a[t].apply(a,i):s)?e:s},w.fn.tcTabs.defaults={headers:"tm-tab-headers",headersWrap:"tc-tab-headers-wrap",header:"tab-header",slide:"tc-tab-slide",classdown:"tcfa-angle-down",classup:"tcfa-angle-up",animationclass:"appear",dataattribute:"data-id",dataopenattribute:"data-id",selectedtab:"auto",showonhover:!1,useclasstohide:!0,sortabletabs:!0,addbutton:!1,addheader:"tm-add-tab",addbuttonhtml:'<div class="tm-add-tab"><span class="tmicon tcfa tcfa-plus"></span></div>',afteraddtab:null,beforemovetab:null,aftermovetab:null,beforemovebitem:null,aftermovebitem:null,deletebutton:!1,deletebuttonhtml:'<div class="tm-del-tab"><span class="tcfa tcfa-times"></span></div>',deleteheader:"tm-del-tab",deleteconfirm:!1,beforedeletetab:null,afterdeletetab:null,editbutton:!1,editbuttonhtml:'<span class="tm-edit-tab"><span class="tcfa tcfa-edit"></span></span>',editheader:"tm-edit-tab",oneditbutton:null,scroll:!0,scrollDistance:300,scrollDuration:300},w.fn.tcTabs.Constructor=n,w.fn.tmtabs=w.fn.tcTabs}(window.jQuery);
!function(h,s,n){"use strict";function r(t,e){this.settings=null,this.options=h.extend({},r.Defaults,e),this.$element=h(t),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},h.each(["onResize","onThrottledResize"],h.proxy(function(t,e){this._handlers[e]=h.proxy(this[e],this)},this)),h.each(r.Plugins,h.proxy(function(t,e){this._plugins[t.charAt(0).toLowerCase()+t.slice(1)]=new e(this)},this)),h.each(r.Workers,h.proxy(function(t,e){this._pipe.push({filter:e.filter,run:h.proxy(e.run,this)})},this)),this.setup(),this.initialize()}r.Defaults={items:3,loop:!1,center:!1,rewind:!1,checkVisibility:!0,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:s,fallbackEasing:"linear",slideTransition:"",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},r.Width={Default:"default",Inner:"inner",Outer:"outer"},r.Type={Event:"event",State:"state"},r.Plugins={},r.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(t){t.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(t){var e=this.settings.margin||"",i=!this.settings.autoWidth,s=this.settings.rtl,s={width:"auto","margin-left":s?e:"","margin-right":s?"":e};i||this.$stage.children().css(s),t.css=s}},{filter:["width","items","settings"],run:function(t){var e,i=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,s=this._items.length,n=!this.settings.autoWidth,o=[];for(t.items={merge:!1,width:i};0<s;)e=this._mergers[s-=1],e=this.settings.mergeFit&&Math.min(e,this.settings.items)||e,t.items.merge=1<e||t.items.merge,o[s]=n?i*e:this._items[s].width();this._widths=o}},{filter:["items","settings"],run:function(){var t=[],e=this._items,i=this.settings,s=Math.max(2*i.items,4),n=2*Math.ceil(e.length/2),o=i.loop&&e.length?i.rewind?s:Math.max(s,n):0,r="",a="";for(o/=2;0<o;)t.push(this.normalize(t.length/2,!0)),r+=e[t[t.length-1]][0].outerHTML,t.push(this.normalize(e.length-1-(t.length-1)/2,!0)),a=e[t[t.length-1]][0].outerHTML+a,--o;this._clones=t,h(r).addClass("cloned").appendTo(this.$stage),h(a).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var t,e,i=this.settings.rtl?1:-1,s=this._clones.length+this._items.length,n=0,o=[];n<s;)t=o[n-1]||0,e=this._widths[this.relative(n)]+this.settings.margin,o.push(t+e*i),n+=1;this._coordinates=o}},{filter:["width","items","settings"],run:function(){var t=this.settings.stagePadding,e=this._coordinates,e={width:Math.ceil(Math.abs(e[e.length-1]))+2*t,"padding-left":t||"","padding-right":t||""};this.$stage.css(e)}},{filter:["width","items","settings"],run:function(t){var e=this._coordinates.length,i=!this.settings.autoWidth,s=this.$stage.children();if(i&&t.items.merge)for(;0<e;)t.css.width=this._widths[this.relative(e-=1)],s.eq(e).css(t.css);else i&&(t.css.width=t.items.width,s.css(t.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(t){t.current=t.current?this.$stage.children().index(t.current):0,t.current=Math.max(this.minimum(),Math.min(this.maximum(),t.current)),this.reset(t.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){for(var t,e,i=this.settings.rtl?1:-1,s=2*this.settings.stagePadding,n=this.coordinates(this.current())+s,o=n+this.width()*i,r=[],a=0,h=this._coordinates.length;a<h;a+=1)t=this._coordinates[a-1]||0,e=Math.abs(this._coordinates[a])+s*i,(this.op(t,"<=",n)&&this.op(t,">",o)||this.op(e,"<",n)&&this.op(e,">",o))&&r.push(a);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+r.join("), :eq(")+")").addClass("active"),this.$stage.children(".center").removeClass("center"),this.settings.center&&this.$stage.children().eq(this.current()).addClass("center")}}],r.prototype.initializeStage=function(){this.$stage=this.$element.find("."+this.settings.stageClass),this.$stage.length||(this.$element.addClass(this.options.loadingClass),this.$stage=h("<"+this.settings.stageElement+">",{class:this.settings.stageClass}).wrap(h("<div/>",{class:this.settings.stageOuterClass})),this.$element.append(this.$stage.parent()))},r.prototype.initializeItems=function(){var t=this.$element.find(".owl-item");t.length?(this._items=t.get().map(function(t){return h(t)}),this._mergers=this._items.map(function(){return 1}),this.refresh()):(this.replace(this.$element.children().not(this.$stage.parent())),this.isVisible()?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass))},r.prototype.initialize=function(){var t,e;this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")&&(t=this.$element.find("img"),e=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:void 0,e=this.$element.children(e).width(),t.length)&&e<=0&&this.preloadAutoWidthImages(t),this.initializeStage(),this.initializeItems(),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},r.prototype.isVisible=function(){return!this.settings.checkVisibility||this.$element.is(":visible")},r.prototype.setup=function(){var e=this.viewport(),t=this.options.responsive,i=-1,s=null;t?(h.each(t,function(t){t<=e&&i<t&&(i=Number(t))}),"function"==typeof(s=h.extend({},this.options,t[i])).stagePadding&&(s.stagePadding=s.stagePadding()),delete s.responsive,s.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+i))):s=h.extend({},this.options),this.trigger("change",{property:{name:"settings",value:s}}),this._breakpoint=i,this.settings=s,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},r.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},r.prototype.prepare=function(t){var e=this.trigger("prepare",{content:t});return e.data||(e.data=h("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(t)),this.trigger("prepared",{content:e.data}),e.data},r.prototype.update=function(){for(var t=0,e=this._pipe.length,i=h.proxy(function(t){return this[t]},this._invalidated),s={};t<e;)(this._invalidated.all||0<h.grep(this._pipe[t].filter,i).length)&&this._pipe[t].run(s),t+=1;this._invalidated={},this.is("valid")||this.enter("valid")},r.prototype.width=function(t){switch(t=t||r.Width.Default){case r.Width.Inner:case r.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},r.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},r.prototype.onThrottledResize=function(){s.clearTimeout(this.resizeTimer),this.resizeTimer=s.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},r.prototype.onResize=function(){return!!this._items.length&&this._width!==this.$element.width()&&!!this.isVisible()&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))},r.prototype.registerEventHandlers=function(){h.support.transition&&this.$stage.on(h.support.transition.end+".owl.core",h.proxy(this.onTransitionEnd,this)),!1!==this.settings.responsive&&this.on(s,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",h.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",h.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",h.proxy(this.onDragEnd,this)))},r.prototype.onDragStart=function(t){var e=null;3!==t.which&&(e=h.support.transform?{x:(e=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","))[16===e.length?12:4],y:e[16===e.length?13:5]}:(e=this.$stage.position(),{x:this.settings.rtl?e.left+this.$stage.width()-this.width()+this.settings.margin:e.left,y:e.top}),this.is("animating")&&(h.support.transform?this.animate(e.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===t.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=h(t.target),this._drag.stage.start=e,this._drag.stage.current=e,this._drag.pointer=this.pointer(t),h(n).on("mouseup.owl.core touchend.owl.core",h.proxy(this.onDragEnd,this)),h(n).one("mousemove.owl.core touchmove.owl.core",h.proxy(function(t){var e=this.difference(this._drag.pointer,this.pointer(t));h(n).on("mousemove.owl.core touchmove.owl.core",h.proxy(this.onDragMove,this)),Math.abs(e.x)<Math.abs(e.y)&&this.is("valid")||(t.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},r.prototype.onDragMove=function(t){var e=null,i=null,s=this.difference(this._drag.pointer,this.pointer(t)),n=this.difference(this._drag.stage.start,s);this.is("dragging")&&(t.preventDefault(),this.settings.loop?(e=this.coordinates(this.minimum()),i=this.coordinates(this.maximum()+1)-e,n.x=((n.x-e)%i+i)%i+e):(e=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),i=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),t=this.settings.pullDrag?-1*s.x/5:0,n.x=Math.max(Math.min(n.x,e+t),i+t)),this._drag.stage.current=n,this.animate(n.x))},r.prototype.onDragEnd=function(t){var t=this.difference(this._drag.pointer,this.pointer(t)),e=this._drag.stage.current,i=0<t.x,i=i&&!this.settings.rtl||this.settings.rtl&&!i?"left":"right";h(n).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==t.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==t.x?i:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=i,3<Math.abs(t.x)||300<(new Date).getTime()-this._drag.time)&&this._drag.target.one("click.owl.core",function(){return!1}),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},r.prototype.closest=function(i,s){var n=-1,o=this.width(),r=this.coordinates();return this.settings.freeDrag||h.each(r,h.proxy(function(t,e){return"left"===s&&e-30<i&&i<e+30?n=t:"right"===s&&e-o-30<i&&i<e-o+30?n=t+1:this.op(i,"<",e)&&this.op(i,">",void 0!==r[t+1]?r[t+1]:e-o)&&(n="left"===s?t+1:t),-1===n},this)),this.settings.loop||(this.op(i,">",r[this.minimum()])?(i=this.minimum(),n=i):this.op(i,"<",r[this.maximum()])&&(i=this.maximum(),n=i)),n},r.prototype.animate=function(t){var e=0<this.speed();this.is("animating")&&this.onTransitionEnd(),e&&(this.enter("animating"),this.trigger("translate")),h.support.transform3d&&h.support.transition?this.$stage.css({transform:"translate3d("+t+"px,0px,0px)",transition:this.speed()/1e3+"s"+(this.settings.slideTransition?" "+this.settings.slideTransition:"")}):e?this.$stage.animate({left:t+"px"},this.speed(),this.settings.fallbackEasing,h.proxy(this.onTransitionEnd,this)):this.$stage.css({left:t+"px"})},r.prototype.is=function(t){return this._states.current[t]&&0<this._states.current[t]},r.prototype.current=function(t){var e;return void 0===t?this._current:0!==this._items.length?(t=this.normalize(t),this._current!==t&&(void 0!==(e=this.trigger("change",{property:{name:"position",value:t}})).data&&(t=this.normalize(e.data)),this._current=t,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})),this._current):void 0},r.prototype.invalidate=function(t){return"string"==typeof t&&(this._invalidated[t]=!0,this.is("valid"))&&this.leave("valid"),h.map(this._invalidated,function(t,e){return e})},r.prototype.reset=function(t){void 0!==(t=this.normalize(t))&&(this._speed=0,this._current=t,this.suppress(["translate","translated"]),this.animate(this.coordinates(t)),this.release(["translate","translated"]))},r.prototype.normalize=function(t,e){var i=this._items.length,e=e?0:this._clones.length;return!this.isNumeric(t)||i<1?t=void 0:(t<0||i+e<=t)&&(t=((t-e/2)%i+i)%i+e/2),t},r.prototype.relative=function(t){return t-=this._clones.length/2,this.normalize(t,!0)},r.prototype.maximum=function(t){var e,i,s,n=this.settings,o=this._coordinates.length;if(n.loop)o=this._clones.length/2+this._items.length-1;else if(n.autoWidth||n.merge){if(e=this._items.length)for(i=this._items[e-=1].width(),s=this.$element.width();0<e&&!(s<(i+=this._items[e].width()+this.settings.margin));)e-=1;o=e+1}else o=n.center?this._items.length-1:this._items.length-n.items;return t&&(o-=this._clones.length/2),Math.max(o,0)},r.prototype.minimum=function(t){return t?0:this._clones.length/2},r.prototype.items=function(t){return void 0===t?this._items.slice():(t=this.normalize(t,!0),this._items[t])},r.prototype.mergers=function(t){return void 0===t?this._mergers.slice():(t=this.normalize(t,!0),this._mergers[t])},r.prototype.clones=function(i){function s(t){return t%2==0?n+t/2:e-(t+1)/2}var e=this._clones.length/2,n=e+this._items.length;return void 0===i?h.map(this._clones,function(t,e){return s(e)}):h.map(this._clones,function(t,e){return t===i?s(e):null})},r.prototype.speed=function(t){return void 0!==t&&(this._speed=t),this._speed},r.prototype.coordinates=function(t){var e,i=1,s=t-1;return void 0===t?h.map(this._coordinates,h.proxy(function(t,e){return this.coordinates(e)},this)):(this.settings.center?(this.settings.rtl&&(i=-1,s=t+1),e=this._coordinates[t],e+=(this.width()-e+(this._coordinates[s]||0))/2*i):e=this._coordinates[s]||0,Math.ceil(e))},r.prototype.duration=function(t,e,i){return 0===i?0:Math.min(Math.max(Math.abs(e-t),1),6)*Math.abs(i||this.settings.smartSpeed)},r.prototype.to=function(t,e){var i=this.current(),s=t-this.relative(i),n=(0<s)-(s<0),o=this._items.length,r=this.minimum(),a=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(s)>o/2&&(s+=-1*n*o),(n=(((t=i+s)-r)%o+o)%o+r)!==t&&n-s<=a&&0<n-s&&this.reset(i=(t=n)-s)):t=this.settings.rewind?(t%(a+=1)+a)%a:Math.max(r,Math.min(a,t)),this.speed(this.duration(i,t,e)),this.current(t),this.isVisible()&&this.update()},r.prototype.next=function(t){t=t||!1,this.to(this.relative(this.current())+1,t)},r.prototype.prev=function(t){t=t||!1,this.to(this.relative(this.current())-1,t)},r.prototype.onTransitionEnd=function(t){if(void 0!==t&&(t.stopPropagation(),(t.target||t.srcElement||t.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},r.prototype.viewport=function(){var t;if(this.options.responsiveBaseElement!==s)t=h(this.options.responsiveBaseElement).width();else if(s.innerWidth)t=s.innerWidth;else{if(!n.documentElement||!n.documentElement.clientWidth)return t;t=n.documentElement.clientWidth}return t},r.prototype.replace=function(t){this.$stage.empty(),this._items=[],t=t&&(t instanceof s.jQuery?t:h(t)),(t=this.settings.nestedItemSelector?t.find("."+this.settings.nestedItemSelector):t).filter(function(){return 1===this.nodeType}).each(h.proxy(function(t,e){e=this.prepare(e),this.$stage.append(e),this._items.push(e),this._mergers.push(+e.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},r.prototype.add=function(t,e){var i=this.relative(this._current);e=void 0===e?this._items.length:this.normalize(e,!0),t=t instanceof s.jQuery?t:h(t),this.trigger("add",{content:t,position:e}),t=this.prepare(t),0===this._items.length||e===this._items.length?(0===this._items.length&&this.$stage.append(t),0!==this._items.length&&this._items[e-1].after(t),this._items.push(t),this._mergers.push(+t.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[e].before(t),this._items.splice(e,0,t),this._mergers.splice(e,0,+t.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[i]&&this.reset(this._items[i].index()),this.invalidate("items"),this.trigger("added",{content:t,position:e})},r.prototype.remove=function(t){void 0!==(t=this.normalize(t,!0))&&(this.trigger("remove",{content:this._items[t],position:t}),this._items[t].remove(),this._items.splice(t,1),this._mergers.splice(t,1),this.invalidate("items"),this.trigger("removed",{content:null,position:t}))},r.prototype.preloadAutoWidthImages=function(t){t.each(h.proxy(function(t,e){this.enter("pre-loading"),e=h(e),h(new Image).one("load",h.proxy(function(t){e.attr("src",t.target.src),e.css("opacity",1),this.leave("pre-loading"),this.is("pre-loading")||this.is("initializing")||this.refresh()},this)).attr("src",e.attr("src")||e.attr("data-src")||e.attr("data-src-retina"))},this))},r.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),h(n).off(".owl.core"),!1!==this.settings.responsive&&(s.clearTimeout(this.resizeTimer),this.off(s,"resize",this._handlers.onThrottledResize)),h.map(this._plugins,function(t){return t}).forEach(function(t){t&&t.destroy()}),this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.remove(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},r.prototype.op=function(t,e,i){var s=this.settings.rtl;switch(e){case"<":return s?i<t:t<i;case">":return s?t<i:i<t;case">=":return s?t<=i:i<=t;case"<=":return s?i<=t:t<=i}},r.prototype.on=function(t,e,i,s){t.addEventListener?t.addEventListener(e,i,s):t.attachEvent&&t.attachEvent("on"+e,i)},r.prototype.off=function(t,e,i,s){t.removeEventListener?t.removeEventListener(e,i,s):t.detachEvent&&t.detachEvent("on"+e,i)},r.prototype.trigger=function(t,e,i){var s={item:{count:this._items.length,index:this.current()}},n=h.camelCase(h.grep(["on",t,i],function(t){return t}).join("-").toLowerCase()),o=h.Event([t,"owl",i||"carousel"].join(".").toLowerCase(),h.extend({relatedTarget:this},s,e));return this._supress[t]||(h.each(this._plugins,function(t,e){e.onTrigger&&e.onTrigger(o)}),this.register({type:r.Type.Event,name:t}),this.$element.trigger(o),this.settings&&"function"==typeof this.settings[n]&&this.settings[n].call(this,o)),o},r.prototype.enter=function(t){h.each([t].concat(this._states.tags[t]||[]),h.proxy(function(t,e){void 0===this._states.current[e]&&(this._states.current[e]=0),this._states.current[e]+=1},this))},r.prototype.leave=function(t){h.each([t].concat(this._states.tags[t]||[]),h.proxy(function(t,e){--this._states.current[e]},this))},r.prototype.register=function(i){var e;i.type===r.Type.Event?(h.event.special[i.name]||(h.event.special[i.name]={}),h.event.special[i.name].owl||(e=h.event.special[i.name]._default,h.event.special[i.name]._default=function(t){return!e||!e.apply||t.namespace&&-1!==t.namespace.indexOf("owl")?t.namespace&&-1<t.namespace.indexOf("owl"):e.apply(this,arguments)},h.event.special[i.name].owl=!0)):i.type===r.Type.State&&(this._states.tags[i.name]?this._states.tags[i.name]=this._states.tags[i.name].concat(i.tags):this._states.tags[i.name]=i.tags,this._states.tags[i.name]=h.grep(this._states.tags[i.name],h.proxy(function(t,e){return h.inArray(t,this._states.tags[i.name])===e},this)))},r.prototype.suppress=function(t){h.each(t,h.proxy(function(t,e){this._supress[e]=!0},this))},r.prototype.release=function(t){h.each(t,h.proxy(function(t,e){delete this._supress[e]},this))},r.prototype.pointer=function(t){var e={x:null,y:null};return(t=(t=t.originalEvent||t||s.event).touches&&t.touches.length?t.touches[0]:t.changedTouches&&t.changedTouches.length?t.changedTouches[0]:t).pageX?(e.x=t.pageX,e.y=t.pageY):(e.x=t.clientX,e.y=t.clientY),e},r.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))},r.prototype.difference=function(t,e){return{x:t.x-e.x,y:t.y-e.y}},h.fn.tmowlCarousel=function(e){var s=Array.prototype.slice.call(arguments,1);return this.each(function(){var t=h(this),i=t.data("owl.carousel");i||(i=new r(this,"object"==typeof e&&e),t.data("owl.carousel",i),h.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(t,e){i.register({type:r.Type.Event,name:e}),i.$element.on(e+".owl.carousel.core",h.proxy(function(t){t.namespace&&t.relatedTarget!==this&&(this.suppress([e]),i[e].apply(this,[].slice.call(arguments,1)),this.release([e]))},i))})),"string"==typeof e&&"_"!==e.charAt(0)&&i[e].apply(i,s)})},h.fn.tmowlCarousel.Constructor=r}(window.Zepto||window.jQuery,window,document),function(e,i){"use strict";function s(t){this._core=t,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":e.proxy(function(t){t.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=e.extend({},s.Defaults,this._core.options),this._core.$element.on(this._handlers)}s.Defaults={autoRefresh:!0,autoRefreshInterval:500},s.prototype.watch=function(){this._interval||(this._visible=this._core.isVisible(),this._interval=i.setInterval(e.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},s.prototype.refresh=function(){this._core.isVisible()!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible)&&this._core.invalidate("width")&&this._core.refresh()},s.prototype.destroy=function(){var t,e;for(t in i.clearInterval(this._interval),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},e.fn.tmowlCarousel.Constructor.Plugins.AutoRefresh=s}(window.Zepto||window.jQuery,window),function(a,n){"use strict";function e(t){this._core=t,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(t){var e,i,s,n,o,r;if(t.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(t.property&&"position"===t.property.name||"initialized"===t.type))for(i=(e=this._core.settings).center&&Math.ceil(e.items/2)||e.items,s=e.center&&-1*i||0,n=(t.property&&void 0!==t.property.value?t.property.value:this._core.current())+s,o=this._core.clones().length,r=a.proxy(function(t,e){this.load(e)},this),0<e.lazyLoadEager&&(i+=e.lazyLoadEager,e.loop)&&(n-=e.lazyLoadEager,i+=1);s<i;)s+=1,this.load(o/2+this._core.relative(n)),o&&a.each(this._core.clones(this._core.relative(n)),r),n+=1},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)}e.Defaults={lazyLoad:!1,lazyLoadEager:0},e.prototype.load=function(t){var t=this._core.$stage.children().eq(t),e=t&&t.find(".owl-lazy");!e||-1<a.inArray(t.get(0),this._loaded)||(e.each(a.proxy(function(t,e){var i=a(e),s=1<n.devicePixelRatio&&i.attr("data-src-retina")||i.attr("data-src")||i.attr("data-srcset");this._core.trigger("load",{element:i,url:s},"lazy"),i.is("img")?i.one("load.owl.lazy",a.proxy(function(){i.css("opacity",1),this._core.trigger("loaded",{element:i,url:s},"lazy")},this)).attr("src",s):i.is("source")?i.one("load.owl.lazy",a.proxy(function(){this._core.trigger("loaded",{element:i,url:s},"lazy")},this)).attr("srcset",s):((e=new Image).onload=a.proxy(function(){i.css({"background-image":'url("'+s+'")',opacity:"1"}),this._core.trigger("loaded",{element:i,url:s},"lazy")},this),e.src=s)},this)),this._loaded.push(t.get(0)))},e.prototype.destroy=function(){var t,e;for(t in this.handlers)t&&this._core.$element.off(t,this.handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},a.fn.tmowlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window),function(n){"use strict";function i(t){var e=this;this._core=t,this._previousHeight=null,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&"position"===t.property.name&&this.update()},this),"loaded.owl.lazy":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&t.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=n.extend({},i.Defaults,this._core.options),this._core.$element.on(this._handlers),this._intervalId=null,n(void 0).on("load",function(){e._core.settings.autoHeight&&e.update()}),n(void 0).on("resize",function(){e._core.settings.autoHeight&&(null!==e._intervalId&&clearTimeout(e._intervalId),e._intervalId=setTimeout(function(){e.update()},250))})}i.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},i.prototype.update=function(){var t=this._core._current,e=t+this._core.settings.items,i=this._core.settings.lazyLoad,t=this._core.$stage.children().toArray().slice(t,e),s=[],e=0;n.each(t,function(t,e){s.push(n(e).height())}),(e=Math.max.apply(null,s))<=1&&i&&this._previousHeight&&(e=this._previousHeight),this._previousHeight=e,this._core.$stage.parent().height(e).addClass(this._core.settings.autoHeightClass)},i.prototype.destroy=function(){var t,e;for(t in this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},n.fn.tmowlCarousel.Constructor.Plugins.AutoHeight=i}(window.Zepto||window.jQuery),function(c,e){"use strict";function i(t){this._core=t,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":c.proxy(function(t){t.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":c.proxy(function(t){t.namespace&&this._core.settings.video&&this.isInFullScreen()&&t.preventDefault()},this),"refreshed.owl.carousel":c.proxy(function(t){t.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":c.proxy(function(t){t.namespace&&"position"===t.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":c.proxy(function(t){var e;t.namespace&&(e=c(t.content).find(".owl-video")).length&&(e.css("display","none"),this.fetch(e,c(t.content)))},this)},this._core.options=c.extend({},i.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",c.proxy(function(t){this.play(t)},this))}i.Defaults={video:!1,videoHeight:!1,videoWidth:!1},i.prototype.fetch=function(t,e){var i=t.attr("data-vimeo-id")?"vimeo":t.attr("data-vzaar-id")?"vzaar":"youtube",s=t.attr("data-vimeo-id")||t.attr("data-youtube-id")||t.attr("data-vzaar-id"),n=t.attr("data-width")||this._core.settings.videoWidth,o=t.attr("data-height")||this._core.settings.videoHeight,r=t.attr("href");if(!r)throw new Error("Missing video URL.");if(-1<(s=r.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/))[3].indexOf("youtu"))i="youtube";else if(-1<s[3].indexOf("vimeo"))i="vimeo";else{if(!(-1<s[3].indexOf("vzaar")))throw new Error("Video URL not supported.");i="vzaar"}s=s[6],this._videos[r]={type:i,id:s,width:n,height:o},e.attr("data-video",r),this.thumbnail(t,this._videos[r])},i.prototype.thumbnail=function(e,t){function i(t){s=l.lazyLoad?c("<div/>",{class:"owl-video-tn "+h,srcType:t}):c("<div/>",{class:"owl-video-tn",style:"opacity:1;background-image:url("+t+")"}),e.after(s),e.after('<div class="owl-video-play-icon"></div>')}var s,n,o=t.width&&t.height?"width:"+t.width+"px;height:"+t.height+"px;":"",r=e.find("img"),a="src",h="",l=this._core.settings;if(e.wrap(c("<div/>",{class:"owl-video-wrapper",style:o})),this._core.settings.lazyLoad&&(a="data-src",h="owl-lazy"),r.length)return i(r.attr(a)),r.remove(),!1;"youtube"===t.type?(n="//img.youtube.com/vi/"+t.id+"/hqdefault.jpg",i(n)):"vimeo"===t.type?c.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+t.id+".json",jsonp:"callback",dataType:"jsonp",success:function(t){n=t[0].thumbnail_large,i(n)}}):"vzaar"===t.type&&c.ajax({type:"GET",url:"//vzaar.com/api/videos/"+t.id+".json",jsonp:"callback",dataType:"jsonp",success:function(t){n=t.framegrab_url,i(n)}})},i.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},i.prototype.play=function(t){var e,t=c(t.target).closest("."+this._core.settings.itemClass),i=this._videos[t.attr("data-video")],s=i.width||"100%",n=i.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),t=this._core.items(this._core.relative(t.index())),this._core.reset(t.index()),(e=c('<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>')).attr("height",n),e.attr("width",s),"youtube"===i.type?e.attr("src","//www.youtube.com/embed/"+i.id+"?autoplay=1&rel=0&v="+i.id):"vimeo"===i.type?e.attr("src","//player.vimeo.com/video/"+i.id+"?autoplay=1"):"vzaar"===i.type&&e.attr("src","//view.vzaar.com/"+i.id+"/player?autoplay=true"),c(e).wrap('<div class="owl-video-frame" />').insertAfter(t.find(".owl-video")),this._playing=t.addClass("owl-video-playing"))},i.prototype.isInFullScreen=function(){var t=e.fullscreenElement||e.mozFullScreenElement||e.webkitFullscreenElement;return t&&c(t).parent().hasClass("owl-video-frame")},i.prototype.destroy=function(){var t,e;for(t in this._core.$element.off("click.owl.video"),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},c.fn.tmowlCarousel.Constructor.Plugins.Video=i}(window.Zepto||window.jQuery,(window,document)),function(r){"use strict";function e(t){this.core=t,this.core.options=r.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=void 0,this.next=void 0,this.handlers={"change.owl.carousel":r.proxy(function(t){t.namespace&&"position"===t.property.name&&(this.previous=this.core.current(),this.next=t.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":r.proxy(function(t){t.namespace&&(this.swapping="translated"===t.type)},this),"translate.owl.carousel":r.proxy(function(t){t.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)}e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){var t,e,i,s,n,o;1===this.core.settings.items&&r.support.animation&&r.support.transition&&(this.core.speed(0),e=r.proxy(this.clear,this),i=this.core.$stage.children().eq(this.previous),s=this.core.$stage.children().eq(this.next),n=this.core.settings.animateIn,o=this.core.settings.animateOut,this.core.current()!==this.previous)&&(o&&(t=this.core.coordinates(this.previous)-this.core.coordinates(this.next),i.one(r.support.animation.end,e).css({left:t+"px"}).addClass("animated owl-animated-out").addClass(o)),n)&&s.one(r.support.animation.end,e).addClass("animated owl-animated-in").addClass(n)},e.prototype.clear=function(t){r(t.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var t,e;for(t in this.handlers)t&&this.core.$element.off(t,this.handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},r.fn.tmowlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery),function(s,n,e){"use strict";function i(t){this._core=t,this._call=null,this._time=0,this._timeout=0,this._paused=!0,this._handlers={"changed.owl.carousel":s.proxy(function(t){t.namespace&&"settings"===t.property.name?this._core.settings.autoplay?this.play():this.stop():t.namespace&&"position"===t.property.name&&this._paused&&(this._time=0)},this),"initialized.owl.carousel":s.proxy(function(t){t.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":s.proxy(function(t,e,i){t.namespace&&this.play(e,i)},this),"stop.owl.autoplay":s.proxy(function(t){t.namespace&&this.stop()},this),"mouseover.owl.autoplay":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":s.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=s.extend({},i.Defaults,this._core.options)}i.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},i.prototype._next=function(t){this._call=n.setTimeout(s.proxy(this._next,this,t),this._timeout*(Math.round(this.read()/this._timeout)+1)-this.read()),this._core.is("interacting")||e.hidden||this._core.next(t||this._core.settings.autoplaySpeed)},i.prototype.read=function(){return(new Date).getTime()-this._time},i.prototype.play=function(t,e){var i;this._core.is("rotating")||this._core.enter("rotating"),t=t||this._core.settings.autoplayTimeout,i=Math.min(this._time%(this._timeout||t),t),this._paused?(this._time=this.read(),this._paused=!1):n.clearTimeout(this._call),this._time+=this.read()%t-i,this._timeout=t,this._call=n.setTimeout(s.proxy(this._next,this,e),t-i)},i.prototype.stop=function(){this._core.is("rotating")&&(this._time=0,this._paused=!0,n.clearTimeout(this._call),this._core.leave("rotating"))},i.prototype.pause=function(){this._core.is("rotating")&&!this._paused&&(this._time=this.read(),this._paused=!0,n.clearTimeout(this._call))},i.prototype.destroy=function(){var t,e;for(t in this.stop(),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},s.fn.tmowlCarousel.Constructor.Plugins.autoplay=i}(window.Zepto||window.jQuery,window,document),function(n){"use strict";function e(t){this._core=t,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+n(t.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.splice(t.position,0,this._templates.pop())},this),"remove.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.splice(t.position,1)},this),"changed.owl.carousel":n.proxy(function(t){t.namespace&&"position"===t.property.name&&this.draw()},this),"initialized.owl.carousel":n.proxy(function(t){t.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":n.proxy(function(t){t.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=n.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)}e.Defaults={nav:!1,navText:['<span aria-label="Previous">&#x2039;</span>','<span aria-label="Next">&#x203a;</span>'],navSpeed:!1,navElement:'button type="button" role="presentation"',navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var t,i=this._core.settings;for(t in this._controls.$relative=(i.navContainer?n(i.navContainer):n("<div>").addClass(i.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=n("<"+i.navElement+">").addClass(i.navClass[0]).html(i.navText[0]).prependTo(this._controls.$relative).on("click",n.proxy(function(){this.prev(i.navSpeed)},this)),this._controls.$next=n("<"+i.navElement+">").addClass(i.navClass[1]).html(i.navText[1]).appendTo(this._controls.$relative).on("click",n.proxy(function(){this.next(i.navSpeed)},this)),i.dotsData||(this._templates=[n('<button role="button">').addClass(i.dotClass).append(n("<span>")).prop("outerHTML")]),this._controls.$absolute=(i.dotsContainer?n(i.dotsContainer):n("<div>").addClass(i.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","button",n.proxy(function(t){var e=(n(t.target).parent().is(this._controls.$absolute)?n(t.target):n(t.target).parent()).index();t.preventDefault(),this.to(e,i.dotsSpeed)},this)),this._overrides)t&&(this._core[t]=n.proxy(this[t],this))},e.prototype.destroy=function(){var t,e,i,s,n=this._core.settings;for(t in this._handlers)t&&this.$element.off(t,this._handlers[t]);for(e in this._controls)"$relative"===e&&n.navContainer?this._controls[e].html(""):this._controls[e].remove();for(s in this.overides)s&&(this._core[s]=this._overrides[s]);for(i in Object.getOwnPropertyNames(this))"function"!=typeof this[i]&&(this[i]=null)},e.prototype.update=function(){var t,e,i=this._core.clones().length/2,s=i+this._core.items().length,n=this._core.maximum(!0),o=this._core.settings,r=o.center||o.autoWidth||o.dotsData?1:o.dotsEach||o.items;if("page"!==o.slideBy&&(o.slideBy=Math.min(o.slideBy,o.items)),o.dots||"page"===o.slideBy)for(this._pages=[],t=i,e=0;t<s;t+=1){if(r<=e||0===e){if(this._pages.push({start:Math.min(n,t-i),end:t-i+r-1}),Math.min(n,t-i)===n)break;e=0}e+=this._core.mergers(this._core.relative(t))}},e.prototype.draw=function(){var t=this._core.settings,e=this._core.items().length<=t.items,i=this._core.relative(this._core.current()),s=t.loop||t.rewind;this._controls.$relative.toggleClass("disabled",!t.nav||e),t.nav&&(this._controls.$previous.toggleClass("disabled",!s&&i<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!s&&i>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!t.dots||e),t.dots&&(s=this._pages.length-this._controls.$absolute.children().length,t.dotsData&&0!=s?this._controls.$absolute.html(this._templates.join("")):0<s?this._controls.$absolute.append(new Array(1+s).join(this._templates[0])):s<0&&this._controls.$absolute.children().slice(s).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(n.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(t){var e=this._core.settings;t.page={index:n.inArray(this.current(),this._pages),count:this._pages.length,size:e&&(e.center||e.autoWidth||e.dotsData?1:e.dotsEach||e.items)}},e.prototype.current=function(){var e=this._core.relative(this._core.current());return n.grep(this._pages,n.proxy(function(t){return t.start<=e&&t.end>=e},this)).pop()},e.prototype.getPosition=function(t){var e,i,s=this._core.settings;return"page"===s.slideBy?(e=n.inArray(this.current(),this._pages),i=this._pages.length,t?e+=1:e-=1,e=this._pages[(e%i+i)%i].start):(e=this._core.relative(this._core.current()),i=this._core.items().length,t?e+=s.slideBy:e-=s.slideBy),e},e.prototype.next=function(t){n.proxy(this._overrides.to,this._core)(this.getPosition(!0),t)},e.prototype.prev=function(t){n.proxy(this._overrides.to,this._core)(this.getPosition(!1),t)},e.prototype.to=function(t,e,i){!i&&this._pages.length?(i=this._pages.length,n.proxy(this._overrides.to,this._core)(this._pages[(t%i+i)%i].start,e)):n.proxy(this._overrides.to,this._core)(t,e)},n.fn.tmowlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery),function(s,n){"use strict";function e(t){this._core=t,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":s.proxy(function(t){t.namespace&&"URLHash"===this._core.settings.startPosition&&s(n).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":s.proxy(function(t){var e;t.namespace&&(e=s(t.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash"))&&(this._hashes[e]=t.content)},this),"changed.owl.carousel":s.proxy(function(t){var i;t.namespace&&"position"===t.property.name&&(i=this._core.items(this._core.relative(this._core.current())),t=s.map(this._hashes,function(t,e){return t===i?e:null}).join())&&n.location.hash.slice(1)!==t&&(n.location.hash=t)},this)},this._core.options=s.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),s(n).on("hashchange.owl.navigation",s.proxy(function(){var t=n.location.hash.substring(1),e=this._core.$stage.children(),e=this._hashes[t]&&e.index(this._hashes[t]);void 0!==e&&e!==this._core.current()&&this._core.to(this._core.relative(e),!1,!0)},this))}e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var t,e;for(t in s(n).off("hashchange.owl.navigation"),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},s.fn.tmowlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window),function(n){"use strict";var t,o=n("<support>").get(0).style,r="Webkit Moz O ms".split(" "),e={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}};function i(t,i){var s=!1,e=t.charAt(0).toUpperCase()+t.slice(1);return n.each((t+" "+r.join(e+" ")+e).split(" "),function(t,e){if(void 0!==o[e])return s=!i||e,!1}),s}function s(t){return i(t,!0)}(t={csstransforms:function(){return!!i("transform")},csstransforms3d:function(){return!!i("perspective")},csstransitions:function(){return!!i("transition")},cssanimations:function(){return!!i("animation")}}).csstransitions()&&(n.support.transition=new String(s("transition")),n.support.transition.end=e.transition.end[n.support.transition]),t.cssanimations()&&(n.support.animation=new String(s("animation")),n.support.animation.end=e.animation.end[n.support.animation]),t.csstransforms()&&(n.support.transform=new String(s("transform")),n.support.transform3d=t.csstransforms3d())}(window.Zepto||window.jQuery);
!function(h,g,t){"use strict";var m="lazyLoadXT",y="lazied",p="load error",e="lazy-hidden",w=t.documentElement||t.body,C={autoInit:!0,selector:"img[data-src]",blankImage:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",throttle:99,forceLoad:void 0===g.onscroll||!!g.operamini||!w.getBoundingClientRect,loadEvent:"pageshow",updateEvent:"load orientationchange resize scroll touchmove focus",forceEvent:"lazyloadall",oninit:{removeClass:"lazy"},onshow:{addClass:e},onload:{removeClass:e,addClass:"lazy-loaded"},onerror:{removeClass:e},checkDuplicates:!0},o={srcAttr:"data-src",edgeX:0,edgeY:0,visibleOnly:!0},n=h(g),z=function(t){return"function"==typeof t},s=h.extend,E=h.data||function(t,e){return h(t).data(e)},T=[],b=0,a=0;function d(t,e){return(void 0===t[e]?C:t)[e]}function L(){var t=g.pageYOffset;return void 0===t?w.scrollTop:t}function r(){1<a?(a=1,i(),setTimeout(r,C.throttle)):a=0}function u(t){!T.length||t&&"scroll"===t.type&&t.currentTarget===g&&b>=L()||(a||setTimeout(r,0),a=2)}function I(t,e){var o=C["on"+t];o&&(z(o)?o.call(e[0]):(o.addClass&&e.addClass(o.addClass),o.removeClass&&e.removeClass(o.removeClass))),e.trigger("lazy"+t,[e]),u()}function X(t){I(t.type,h(t.currentTarget).off(p,X))}function i(t){var e,o,n,a,r,i,c,l,s,d,u,f,A,v;if(T.length){for(t=t||C.forceLoad,b=1/0,e=L(),o=g.innerHeight||w.clientHeight,n=g.innerWidth||w.clientWidth,a=0,r=T.length;a<r;a+=1)c=(i=T[a])[0],l=i[m],s=!1,d=t||E(c,y)<0,h.contains(w,c)?(t||!l.visibleOnly||c.offsetWidth||c.offsetHeight)&&(d||(v=c.getBoundingClientRect(),f=l.edgeX,A=l.edgeY,d=(u=v.top+e-A-o)<=e&&v.bottom>-A&&v.left<=n+f&&v.right>-f),d?(i.on(p,X),I("show",i),A=l.srcAttr,(v=z(A)?A(i):c.getAttribute(A))&&(c.src=v),s=!0):u<b&&(b=u)):s=!0,s&&(E(c,y,0),T.splice(a,1),a-=1,r-=1);r||I("complete",h(w))}}function c(){n.lazyLoadXT()}function l(){i(!0)}h[m]=s(C,o,h[m]),h.fn[m]=function(a){var r={},i=d(a=a||{},"blankImage"),c=d(a,"checkDuplicates"),t=d(a,"scrollContainer"),l=d(a,"show");return h(t).on("scroll",u),Object.keys(o).forEach(function(t){r[t]=d(a,t)}),this.each(function(t,e){var o,n;e===g?h(C.selector).lazyLoadXT(a):(o=c&&E(e,y),n=h(e).data(y,l?-1:1),o||(i&&"IMG"===e.tagName&&!e.src&&(e.src=i),n[m]=s({},r),I("init",n),T.push(n)),u())})},h(function(){I("start",n),n.on(C.updateEvent,u).on(C.forceEvent,l),h(t).on(C.updateEvent,u),C.autoInit&&(n.on(C.loadEvent,c),c())})}(window.jQuery||window.Zepto||window.$,window,document),function(i){"use strict";var o=i.lazyLoadXT;o.selector+=",video,iframe[data-src]",o.videoPoster="data-poster",i(document).on("lazyshow","video",function(t,e){var n=e.lazyLoadXT.srcAttr,a="function"==typeof n,r=!1;e.attr("poster",e.attr(o.videoPoster)),e.children("source,track").each(function(t,e){var e=i(e),o=a?n(e):e.attr(n);o&&(e.attr("src",o),r=!0)}),r&&this.load()})}(window.jQuery||window.Zepto||window.$);
!function(t,a,e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports&&"undefined"==typeof Meteor?window.module.exports=t(window.require("jquery")):t(a||e)}(function(r){"use strict";function i(u,M,y){var s,o,w=this,b={invalid:[],getCaret:function(){var t,a,e,n,s=0;try{return a=u.get(0),e=document.selection,n=a.selectionStart,e&&-1===navigator.appVersion.indexOf("MSIE 10")?((t=e.createRange()).moveStart("character",-b.val().length),s=t.text.length):!n&&"0"!==n||(s=n),s}catch(t){window.console.log(t)}},setCaret:function(t){var a,e;try{u.is(":focus")&&((e=u.get(0)).setSelectionRange?e.setSelectionRange(t,t):((a=e.createTextRange()).collapse(!0),a.moveEnd("character",t),a.moveStart("character",t),a.select()))}catch(t){window.console.log(t)}},events:function(){u.on("keydown.mask",function(t){u.data("mask-keycode",t.keyCode||t.which),u.data("mask-previus-value",u.val()),u.data("mask-previus-caret-pos",b.getCaret()),b.maskDigitPosMapOld=b.maskDigitPosMap}).on(r.jMaskGlobals.useInput?"input.mask":"keyup.mask",b.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){u.keydown().keyup()},100)}).on("change.mask",function(){u.data("changed",!0)}).on("blur.mask",function(){o===b.val()||u.data("changed")||u.trigger("change"),u.data("changed",!1)}).on("blur.mask",function(){o=b.val()}).on("focus.mask",function(t){!0===y.selectOnFocus&&r(t.target).select()}).on("focusout.mask",function(){y.clearIfNotMatch&&!s.test(b.val())&&b.val("")})},getRegexMask:function(){for(var t,a,e,n,s,o=[],r=0;r<M.length;r+=1)(e=w.translation[M.charAt(r)])?(t=e.pattern.toString().replace(/.{1}$|^.{1}/g,""),a=e.optional,(e=e.recursive)?(o.push(M.charAt(r)),n={digit:M.charAt(r),pattern:t}):o.push(a||e?t+"?":t)):o.push(M.charAt(r).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));return s=o.join(""),n&&(s=s.replace(new RegExp("("+n.digit+"(.*"+n.digit+")?)"),"($1)?").replace(new RegExp(n.digit,"g"),n.pattern)),new RegExp(s)},destroyEvents:function(){u.off(["input","keydown","keyup","paste","drop","blur","focusout",""].join(".mask "))},val:function(t){var a=u.is("input")?"val":"text",t=0<arguments.length?(u[a]()!==t&&u[a](t),u):u[a]();return t},calculateCaretPosition:function(t){var a,e,n=b.getMasked(),s=b.getCaret(),o=0,r=0,i=0,l=0,c=0;if(t!==n){for(a=u.data("mask-previus-caret-pos")||0,e=n.length,n=t.length,c=s;c<e&&b.maskDigitPosMap[c];c+=1)r+=1;for(c=s-1;0<=c&&b.maskDigitPosMap[c];--c)o+=1;for(c=s-1;0<=c;--c)b.maskDigitPosMap[c]&&(i+=1);for(c=a-1;0<=c;--c)b.maskDigitPosMapOld[c]&&(l+=1);n<s?s=10*e:s<=a&&a!==n?b.maskDigitPosMapOld[s]||(t=s,b.maskDigitPosMap[s=s-(l-i)-o]&&(s=t)):a<s&&(s=s+(i-l)+r)}return s},behaviour:function(t){var a,e,n=u.data("mask-keycode");if(t=t||window.event,b.invalid=[],-1===r.inArray(n,w.byPassKeys))return n=b.getMasked(),e=b.getCaret(),a=u.data("mask-previus-value")||"",setTimeout(function(){b.setCaret(b.calculateCaretPosition(a))},r.jMaskGlobals.keyStrokeCompensation),b.val(n),b.setCaret(e),b.callbacks(t)},getMasked:function(t,a){for(var e,n,s,o,r,i=[],l=void 0===a?b.val():a+"",c=0,u=M.length,d=0,k=l.length,p=1,h="push",f=-1,g=0,v=[],m=y.reverse?(h="unshift",p=-1,e=0,c=u-1,d=k-1,function(){return-1<c&&-1<d}):(e=u-1,function(){return c<u&&d<k});m();)s=M.charAt(c),o=l.charAt(d),(r=w.translation[s])?(o.match(r.pattern)?(i[h](o),r.recursive&&(-1===f?f=c:c===e&&c!==f&&(c=f-p),e===f)&&(c-=p),c+=p):o===n?(g-=1,n=void 0):r.optional?(c+=p,d-=p):r.fallback?(i[h](r.fallback),c+=p,d-=p):b.invalid.push({p:d,v:o,e:r.pattern}),d+=p):(t||i[h](s),o===s?(v.push(d),d+=p):(n=s,v.push(d+g),g+=1),c+=p);return a=M.charAt(e),u!==k+1||w.translation[a]||i.push(a),a=i.join(""),b.mapMaskdigitPositions(a,v,k),a},mapMaskdigitPositions:function(t,a,e){var n,s=y.reverse?t.length-e:0;for(b.maskDigitPosMap={},n=0;n<a.length;n+=1)b.maskDigitPosMap[a[n]+s]=1},callbacks:function(t){function a(t,a,e){"function"==typeof y[t]&&a&&y[t].apply(this,e)}var e=b.val(),n=e!==o,s=[e,t,u,y];a("onChange",!0==n,s),a("onKeyPress",!0==n,s),a("onComplete",e.length===M.length,s),a("onInvalid",0<b.invalid.length,[e,t,u,b.invalid,y])}};u=r(u),o=b.val(),M="function"==typeof M?M(b.val(),void 0,u,y):M,w.mask=M,w.options=y,w.remove=function(){var t=b.getCaret();return w.options.placeholder&&u.removeAttr("placeholder"),u.data("mask-maxlength")&&u.removeAttr("maxlength"),b.destroyEvents(),b.val(w.getCleanVal()),b.setCaret(t),u},w.getCleanVal=function(){return b.getMasked(!0)},w.getMaskedVal=function(t){return b.getMasked(!1,t)},w.init=function(t){var a,e,n;if(t=t||!1,y=y||{},w.clearIfNotMatch=r.jMaskGlobals.clearIfNotMatch,w.byPassKeys=r.jMaskGlobals.byPassKeys,w.translation=r.extend({},r.jMaskGlobals.translation,y.translation),w=r.extend(!0,{},w,y),s=b.getRegexMask(),t)b.events(),b.val(b.getMasked());else{for(y.placeholder&&u.attr("placeholder",y.placeholder),u.data("mask")&&u.attr("autocomplete","off"),n=!(a=0);a<M.length;a+=1)if((e=w.translation[M.charAt(a)])&&e.recursive){n=!1;break}n&&u.attr("maxlength",M.length).data("mask-maxlength",!0),b.destroyEvents(),b.events(),t=b.getCaret(),b.val(b.getMasked()),b.setCaret(t)}},w.init(!u.is("input"))}function l(t,a,e){var n=r(t).data("mask"),s=o.stringify,t=r(t).val()||r(t).text();e=e||{};try{return"function"==typeof a&&(a=a(t)),"object"!=typeof n||s(n.options)!==s(e)||n.mask!==a}catch(t){window.console.log(t)}}function a(){var t=r(this),a={},e="data-mask-",n=t.attr("data-mask");if(t.attr(e+"reverse")&&(a.reverse=!0),t.attr(e+"clearifnotmatch")&&(a.clearIfNotMatch=!0),"true"===t.attr(e+"selectonfocus")&&(a.selectOnFocus=!0),t.attr(e+"placeholder")&&(a.placeholder=t.attr(e+"placeholder")),l(t,n,a))return t.data("mask",new i(this,n,a))}var t,e,n,o=window.JSON;r.maskWatchers={},r.fn.mask=function(t,a){var e=this.selector,n=r.jMaskGlobals,s=n.watchInterval,n=(a=a||{}).watchInputs||n.watchInputs,o=function(){if(l(this,t,a))return r(this).data("mask",new i(this,t,a))};return r(this).each(o),e&&""!==e&&n&&(clearInterval(r.maskWatchers[e]),r.maskWatchers[e]=setInterval(function(){r(document).find(e).each(o)},s)),this},r.fn.masked=function(t){return this.data("mask").getMaskedVal(t)},r.fn.unmask=function(){return clearInterval(r.maskWatchers[this.selector]),delete r.maskWatchers[this.selector],this.each(function(){var t=r(this).data("mask");t&&t.remove().removeData("mask")})},r.fn.cleanVal=function(){return this.data("mask").getCleanVal()},r.applyDataMask=function(t){((t=t||r.jMaskGlobals.maskElements)instanceof r?t:r(t)).filter(r.jMaskGlobals.dataMaskAttr).each(a)},t={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,keyStrokeCompensation:10,useInput:!/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent)&&(t="input",n=document.createElement("div"),(e=(t="on"+t)in n)||(n.setAttribute(t,"return;"),e="function"==typeof n[t]),n=null,e),watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}},r.jMaskGlobals=r.jMaskGlobals||{},(t=r.jMaskGlobals=r.extend(!0,{},t,r.jMaskGlobals)).dataMask&&r.applyDataMask(),setInterval(function(){r.jMaskGlobals.watchDataMask&&r.applyDataMask()},t.watchInterval)},window.jQuery,window.Zepto);
!function(e){"use strict";!function(Pe){"use strict";var e,l={to:function(e){return e===undefined?"":e.toFixed(2)},from:Number},u={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},Ce={tooltips:".__tooltips",aria:".__aria"},r=function(){function e(t,e,r){var n;var i=[];this.xPct=[];this.xVal=[];this.xSteps=[];this.xNumSteps=[];this.xHighestCompleteStep=[];this.xSteps=[r||false];this.xNumSteps=[false];this.snap=e;Object.keys(t).forEach(function(e){i.push([Oe(t[e]),e])});i.sort(function(e,t){return e[0][0]-t[0][0]});for(n=0;n<i.length;n++)this.handleEntryPoint(i[n][1],i[n][0]);this.xNumSteps=this.xSteps.slice(0);for(n=0;n<this.xNumSteps.length;n++)this.handleStepPoint(n,this.xNumSteps[n])}e.prototype.getDistance=function(e){var t;var r=[];for(t=0;t<this.xNumSteps.length-1;t++)r[t]=p(this.xVal,e,t);return r};e.prototype.getAbsoluteDistance=function(e,t,r){var n=0;var i;var a=1;var s;var o=0;var l=0;var u=0;var f=0;if(e<this.xPct[this.xPct.length-1])while(e>this.xPct[n+1])n++;else if(e===this.xPct[this.xPct.length-1])n=this.xPct.length-2;if(!r&&e===this.xPct[n+1])n++;if(t===null)t=[];s=t[n];if(r)i=(e-this.xPct[n])/(this.xPct[n+1]-this.xPct[n]);else i=(this.xPct[n+1]-e)/(this.xPct[n+1]-this.xPct[n]);while(s>0){o=this.xPct[n+1+f]-this.xPct[n+f];if(t[n+f]*a+100-i*100>100){l=o*i;a=(s-100*i)/t[n+f];i=1}else{l=t[n+f]*o/100*a;a=0}if(r){u=u-l;if(this.xPct.length+f>=1)f--}else{u=u+l;if(this.xPct.length-f>=1)f++}s=t[n+f]*a}return e+u};e.prototype.toStepping=function(e){e=b(this.xVal,this.xPct,e);return e};e.prototype.fromStepping=function(e){return S(this.xVal,this.xPct,e)};e.prototype.getStep=function(e){e=x(this.xPct,this.xSteps,this.snap,e);return e};e.prototype.getDefaultStep=function(e,t,r){var n=v(e,this.xPct);if(e===100||t&&e===this.xPct[n-1])n=Math.max(n-1,1);return(this.xVal[n]-this.xVal[n-1])/r};e.prototype.getNearbySteps=function(e){var t=v(e,this.xPct);return{stepBefore:{startValue:this.xVal[t-2],step:this.xNumSteps[t-2],highestStep:this.xHighestCompleteStep[t-2]},thisStep:{startValue:this.xVal[t-1],step:this.xNumSteps[t-1],highestStep:this.xHighestCompleteStep[t-1]},stepAfter:{startValue:this.xVal[t],step:this.xNumSteps[t],highestStep:this.xHighestCompleteStep[t]}}};e.prototype.countStepDecimals=function(){var e=this.xNumSteps.map(f);return Math.max.apply(null,e)};e.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]};e.prototype.convert=function(e){return this.getStep(this.toStepping(e))};e.prototype.handleEntryPoint=function(e,t){var r;var n;if(e==="min")r=0;else if(e==="max")r=100;else r=parseFloat(e);if(!s(r)||!s(t[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(r);this.xVal.push(t[0]);n=Number(t[1]);if(!r){if(!isNaN(n))this.xSteps[0]=n}else this.xSteps.push(isNaN(n)?false:n);this.xHighestCompleteStep.push(0)};e.prototype.handleStepPoint=function(e,t){var r;var n;var i;if(!t)return;if(this.xVal[e]===this.xVal[e+1]){this.xSteps[e]=this.xHighestCompleteStep[e]=this.xVal[e];return}this.xSteps[e]=p([this.xVal[e],this.xVal[e+1]],t,0)/c(this.xPct[e],this.xPct[e+1]);r=(this.xVal[e+1]-this.xVal[e])/this.xNumSteps[e];n=Math.ceil(Number(r.toFixed(3))-1);i=this.xVal[e]+this.xNumSteps[e]*n;this.xHighestCompleteStep[e]=i};return e}(),t=(Pe.PipsMode=void 0,Pe.PipsMode||(Pe.PipsMode={})),n=(t.Range="range",t.Steps="steps",t.Positions="positions",t.Count="count",t.Values="values",Pe.PipsType=void 0,Pe.PipsType||(Pe.PipsType={}));function i(e){return a(e)&&typeof e.from==="function"}function a(e){return typeof e==="object"&&typeof e.to==="function"}function Ne(e){e.parentElement.removeChild(e)}function Ve(e){return e!==null&&e!==undefined}function Ae(e){e.preventDefault()}function ke(e){return e.filter(function(e){return!this[e]?this[e]=true:false},{})}function o(e,t){return Math.round(e/t)*t}function Me(e,t){var r=e.getBoundingClientRect();var n=e.ownerDocument;var i=n.documentElement;var a=je(n);if(/webkit.*Chrome.*Mobile/i.test(navigator.userAgent))a.x=0;return t?r.top+a.y-i.clientTop:r.left+a.x-i.clientLeft}function s(e){return typeof e==="number"&&!isNaN(e)&&isFinite(e)}function Ue(e,t,r){if(r>0){Le(e,t);setTimeout(function(){Te(e,t)},r)}}function De(e){return Math.max(Math.min(e,100),0)}function Oe(e){return Array.isArray(e)?e:[e]}function f(e){var t;e=String(e);t=e.split(".");return t.length>1?t[1].length:0}function Le(e,t){if(e.classList&&!/\s/.test(t))e.classList.add(t);else e.className+=" "+t}function Te(e,t){if(e.classList&&!/\s/.test(t))e.classList.remove(t);else e.className=e.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function ze(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function je(e){var t=window.pageXOffset!==undefined;var r=(e.compatMode||"")==="CSS1Compat";var n=t?window.pageXOffset:r?e.documentElement.scrollLeft:e.body.scrollLeft;var i=t?window.pageYOffset:r?e.documentElement.scrollTop:e.body.scrollTop;return{x:n,y:i}}function He(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function Fe(){var e=false;try{var t=Object.defineProperty({},"passive",{get:function(){e=true}});window.addEventListener("test",null,t)}catch(e){}return e}function Re(){return window.CSS&&CSS.supports&&CSS.supports("touch-action","none")}function c(e,t){return 100/(t-e)}function p(e,t,r){return t*100/(e[r+1]-e[r])}function d(e,t){return p(e,e[0]<0?t+Math.abs(e[0]):t-e[0],0)}function h(e,t){return t*(e[1]-e[0])/100+e[0]}function v(e,t){var r=1;while(e>=t[r])r+=1;return r}function b(e,t,r){var n;var i;var a;var s;var o;if(r>=e.slice(-1)[0])return 100;n=v(r,e);i=e[n-1];a=e[n];s=t[n-1];o=t[n];return s+d([i,a],r)/c(s,o)}function S(e,t,r){var n;var i;var a;var s;var o;if(r>=100)return e.slice(-1)[0];n=v(r,t);i=e[n-1];a=e[n];s=t[n-1];o=t[n];return h([i,a],(r-s)*c(s,o))}function x(e,t,r,n){var i;var a;var s;if(n===100)return n;i=v(n,e);a=e[i-1];s=e[i];if(r){if(n-a>(s-a)/2)return s;return a}if(!t[i-1])return n;return e[i-1]+o(n-e[i-1],t[i-1])}function y(e,t){if(!s(t))throw new Error("noUiSlider: 'step' is not numeric.");e.singleStep=t}function w(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");e.keyboardPageMultiplier=t}function E(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");e.keyboardMultiplier=t}function P(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");e.keyboardDefaultStep=t}function C(e,t){if(typeof t!=="object"||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(t.min===undefined||t.max===undefined)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");e.spectrum=new r(t,e.snap||false,e.singleStep)}function N(e,t){t=Oe(t);if(!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");e.handles=t.length;e.start=t}function V(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'snap' option must be a boolean.");e.snap=t}function A(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'animate' option must be a boolean.");e.animate=t}function k(e,t){if(typeof t!=="number")throw new Error("noUiSlider: 'animationDuration' option must be a number.");e.animationDuration=t}function M(e,t){var r=[false];var n;if(t==="lower")t=[true,false];else if(t==="upper")t=[false,true];if(t===true||t===false){for(n=1;n<e.handles;n++)r.push(t);r.push(false)}else if(!Array.isArray(t)||!t.length||t.length!==e.handles+1)throw new Error("noUiSlider: 'connect' option doesn't match handle count.");else r=t;e.connect=r}function U(e,t){switch(t){case"horizontal":e.ort=0;break;case"vertical":e.ort=1;break;default:throw new Error("noUiSlider: 'orientation' option is invalid.")}}function m(e,t){if(!s(t))throw new Error("noUiSlider: 'margin' option must be numeric.");if(t===0)return;e.margin=e.spectrum.getDistance(t)}function D(e,t){if(!s(t))throw new Error("noUiSlider: 'limit' option must be numeric.");e.limit=e.spectrum.getDistance(t);if(!e.limit||e.handles<2)throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.")}function O(e,t){var r;var n;var i;var a;if(!s(t)&&!Array.isArray(t))throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");if(Array.isArray(t)&&!(t.length===2||s(t[0])||s(t[1])))throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");if(t===0)return;if(!Array.isArray(t))t=[t,t];e.padding=[e.spectrum.getDistance(t[0]),e.spectrum.getDistance(t[1])];for(r=0;r<e.spectrum.xNumSteps.length-1;r++)if(e.padding[0][r]<0||e.padding[1][r]<0)throw new Error("noUiSlider: 'padding' option must be a positive number(s).");n=t[0]+t[1];i=e.spectrum.xVal[0];a=e.spectrum.xVal[e.spectrum.xVal.length-1];if(n/(a-i)>1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}function L(e,t){switch(t){case"ltr":e.dir=0;break;case"rtl":e.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function T(e,t){var r;var n;var i;var a;var s;var o;var l;var u;if(typeof t!=="string")throw new Error("noUiSlider: 'behaviour' must be a string containing options.");r=t.indexOf("tap")>=0;n=t.indexOf("drag")>=0;i=t.indexOf("fixed")>=0;a=t.indexOf("snap")>=0;s=t.indexOf("hover")>=0;o=t.indexOf("unconstrained")>=0;l=t.indexOf("drag-all")>=0;u=t.indexOf("smooth-steps")>=0;if(i){if(e.handles!==2)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");m(e,e.start[1]-e.start[0])}if(o&&(e.margin||e.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");e.events={tap:r||a,drag:n,dragAll:l,smoothSteps:u,fixed:i,snap:a,hover:s,unconstrained:o}}function z(e,t){var r;if(t===false)return;if(t===true||a(t)){e.tooltips=[];for(r=0;r<e.handles;r++)e.tooltips.push(t)}else{t=Oe(t);if(t.length!==e.handles)throw new Error("noUiSlider: must pass a formatter for all handles.");t.forEach(function(e){if(typeof e!=="boolean"&&!a(e))throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'.")});e.tooltips=t}}function j(e,t){if(t.length!==e.handles)throw new Error("noUiSlider: must pass a attributes for all handles.");e.handleAttributes=t}function H(e,t){if(!a(t))throw new Error("noUiSlider: 'ariaFormat' requires 'to' method.");e.ariaFormat=t}function F(e,t){if(!i(t))throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods.");e.format=t}function R(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean.");e.keyboardSupport=t}function _(e,t){e.documentElement=t}function B(e,t){if(typeof t!=="string"&&t!==false)throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`.");e.cssPrefix=t}function q(t,r){if(typeof r!=="object")throw new Error("noUiSlider: 'cssClasses' must be an object.");if(typeof t.cssPrefix==="string"){t.cssClasses={};Object.keys(r).forEach(function(e){t.cssClasses[e]=t.cssPrefix+r[e]})}else t.cssClasses=r}function _e(t){var r={margin:null,limit:null,padding:null,animate:true,animationDuration:300,ariaFormat:l,format:l};var n={step:{r:false,t:y},keyboardPageMultiplier:{r:false,t:w},keyboardMultiplier:{r:false,t:E},keyboardDefaultStep:{r:false,t:P},start:{r:true,t:N},connect:{r:true,t:M},direction:{r:true,t:L},snap:{r:false,t:V},animate:{r:false,t:A},animationDuration:{r:false,t:k},range:{r:true,t:C},orientation:{r:false,t:U},margin:{r:false,t:m},limit:{r:false,t:D},padding:{r:false,t:O},behaviour:{r:true,t:T},ariaFormat:{r:false,t:H},format:{r:false,t:F},tooltips:{r:false,t:z},keyboardSupport:{r:true,t:R},documentElement:{r:false,t:_},cssPrefix:{r:true,t:B},cssClasses:{r:true,t:q},handleAttributes:{r:false,t:j}};var i={connect:false,direction:"ltr",behaviour:"tap",orientation:"horizontal",keyboardSupport:true,cssPrefix:"noui-",cssClasses:u,keyboardPageMultiplier:5,keyboardMultiplier:1,keyboardDefaultStep:10};var e;var a;var s;var o;if(t.format&&!t.ariaFormat)t.ariaFormat=t.format;Object.keys(n).forEach(function(e){if(!Ve(t[e])&&i[e]===undefined){if(n[e].r)throw new Error("noUiSlider: '"+e+"' is required.");return}n[e].t(r,!Ve(t[e])?i[e]:t[e])});r.pips=t.pips;e=document.createElement("div");a=e.style.msTransform!==undefined;s=e.style.transform!==undefined;r.transformRule=s?"transform":a?"msTransform":"webkitTransform";o=[["left","top"],["right","bottom"]];r.style=o[r.dir][r.ort];return r}function X(e,g,a){var l=He();var n=Re();var j=n&&Fe();var u=e;var f;var c;var p;var i;var s;var w=g.spectrum;var b=[];var S=[];var d=[];var h=0;var o={};var v=e.ownerDocument;var m=g.documentElement||v.documentElement;var x=v.body;var H=v.dir==="rtl"||g.ort===1?0:100;var y;function E(e,t){var r=v.createElement("div");if(t)Le(r,t);e.appendChild(r);return r}function F(e,t){var r=E(e,g.cssClasses.origin);var n=E(r,g.cssClasses.handle);var i;E(n,g.cssClasses.touchArea);n.setAttribute("data-handle",String(t));if(g.keyboardSupport){n.setAttribute("tabindex","0");n.addEventListener("keydown",function(e){return oe(e,t)})}if(g.handleAttributes!==undefined){i=g.handleAttributes[t];Object.keys(i).forEach(function(e){n.setAttribute(e,i[e])})}n.setAttribute("role","slider");n.setAttribute("aria-orientation",g.ort?"vertical":"horizontal");if(t===0)Le(n,g.cssClasses.handleLower);else if(t===g.handles-1)Le(n,g.cssClasses.handleUpper);r.handle=n;return r}function R(e,t){if(!t)return false;return E(e,g.cssClasses.connect)}function _(e,t){var r=E(t,g.cssClasses.connects);var n;c=[];p=[];p.push(R(r,e[0]));for(n=0;n<g.handles;n++){c.push(F(t,n));d[n]=n;p.push(R(r,e[n+1]))}}function B(e){var t;Le(e,g.cssClasses.target);if(g.dir===0)Le(e,g.cssClasses.ltr);else Le(e,g.cssClasses.rtl);if(g.ort===0)Le(e,g.cssClasses.horizontal);else Le(e,g.cssClasses.vertical);t=getComputedStyle(e).direction;if(t==="rtl")Le(e,g.cssClasses.textDirectionRtl);else Le(e,g.cssClasses.textDirectionLtr);return E(e,g.cssClasses.base)}function q(e,t){if(!g.tooltips||!g.tooltips[t])return false;return E(e.firstChild,g.cssClasses.tooltip)}function X(){return u.hasAttribute("disabled")}function P(e){var t=c[e];return t.hasAttribute("disabled")}function Y(e){if(e!==null&&e!==undefined){c[e].setAttribute("disabled","");c[e].handle.removeAttribute("tabindex")}else{u.setAttribute("disabled","");c.forEach(function(e){e.handle.removeAttribute("tabindex")})}}function I(e){if(e!==null&&e!==undefined){c[e].removeAttribute("disabled");c[e].handle.setAttribute("tabindex","0")}else{u.removeAttribute("disabled");c.forEach(function(e){e.removeAttribute("disabled");e.handle.setAttribute("tabindex","0")})}}function C(){if(s){r("update"+Ce.tooltips);s.forEach(function(e){if(e)Ne(e)});s=null}}function W(){var n;C();s=c.map(q);t("update"+Ce.tooltips,function(e,t,r){if(!s||!g.tooltips)return;if(s[t]===false)return;n=e[t];if(g.tooltips[t]!==true)n=g.tooltips[t].to(r[t]);s[t].innerHTML=n})}function $(){r("update"+Ce.aria);t("update"+Ce.aria,function(e,t,s,r,o){d.forEach(function(e){var t=c[e];var r=D(S,e,0,true,true,true);var n=D(S,e,100,true,true,true);var i=o[e];var a=String(g.ariaFormat.to(s[e]));r=w.fromStepping(r).toFixed(1);n=w.fromStepping(n).toFixed(1);i=w.fromStepping(i).toFixed(1);t.children[0].setAttribute("aria-valuemin",r);t.children[0].setAttribute("aria-valuemax",n);t.children[0].setAttribute("aria-valuenow",i);t.children[0].setAttribute("aria-valuetext",a)})})}function G(e){var t;var r;var n;if(e.mode===Pe.PipsMode.Range||e.mode===Pe.PipsMode.Steps)return w.xVal;if(e.mode===Pe.PipsMode.Count){if(e.values<2)throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'.");t=e.values-1;r=100/t;n=[];while(t--)n[t]=t*r;n.push(100);return J(n,e.stepped)}if(e.mode===Pe.PipsMode.Positions)return J(e.values,e.stepped);if(e.mode===Pe.PipsMode.Values){if(e.stepped)return e.values.map(function(e){return w.fromStepping(w.getStep(w.toStepping(e)))});return e.values}return[]}function J(e,t){return e.map(function(e){return w.fromStepping(t?w.getStep(e):e)})}function K(v){var m=G(v);var g={};var e=w.xVal[0];var t=w.xVal[w.xVal.length-1];var b=false;var S=false;var x=0;function y(e,t){return Number((e+t).toFixed(7))}m=ke(m.slice().sort(function(e,t){return e-t}));if(m[0]!==e){m.unshift(e);b=true}if(m[m.length-1]!==t){m.push(t);S=true}m.forEach(function(e,t){var r;var n;var i;var a=e;var s=m[t+1];var o;var l;var u;var f;var c;var p;var d;var h=v.mode===Pe.PipsMode.Steps;if(h)r=w.xNumSteps[t];if(!r)r=s-a;if(s===undefined)s=a;r=Math.max(r,1e-7);for(n=a;n<=s;n=y(n,r)){o=w.toStepping(n);l=o-x;c=l/(v.density||1);p=Math.round(c);d=l/p;for(i=1;i<=p;i+=1){u=x+i*d;g[u.toFixed(5)]=[w.fromStepping(u),0]}f=m.indexOf(n)>-1?Pe.PipsType.LargeValue:h?Pe.PipsType.SmallValue:Pe.PipsType.NoValue;if(!t&&b&&n!==s)f=0;if(!(n===s&&S))g[o.toFixed(5)]=[n,f];x=o}});return g}function Q(t,i,a){var e,r;var s=v.createElement("div");var o=(e={},e[Pe.PipsType.None]="",e[Pe.PipsType.NoValue]=g.cssClasses.valueNormal,e[Pe.PipsType.LargeValue]=g.cssClasses.valueLarge,e[Pe.PipsType.SmallValue]=g.cssClasses.valueSub,e);var l=(r={},r[Pe.PipsType.None]="",r[Pe.PipsType.NoValue]=g.cssClasses.markerNormal,r[Pe.PipsType.LargeValue]=g.cssClasses.markerLarge,r[Pe.PipsType.SmallValue]=g.cssClasses.markerSub,r);var u=[g.cssClasses.valueHorizontal,g.cssClasses.valueVertical];var f=[g.cssClasses.markerHorizontal,g.cssClasses.markerVertical];Le(s,g.cssClasses.pips);Le(s,g.ort===0?g.cssClasses.pipsHorizontal:g.cssClasses.pipsVertical);function c(e,t){var r=t===g.cssClasses.value;var n=r?u:f;var i=r?o:l;return t+" "+n[g.ort]+" "+i[e]}function n(e,t,r){var n;r=i?i(t,r):r;if(r===Pe.PipsType.None)return;n=E(s,false);n.className=c(r,g.cssClasses.marker);n.style[g.style]=e+"%";if(r>Pe.PipsType.NoValue){n=E(s,false);n.className=c(r,g.cssClasses.value);n.setAttribute("data-value",String(t));n.style[g.style]=e+"%";n.innerHTML=String(a.to(t))}}Object.keys(t).forEach(function(e){n(e,t[e][0],t[e][1])});return s}function N(){if(i){Ne(i);i=null}}function V(e){var t;var r;var n;N();r=K(e);t=e.filter;n=e.format||{to:function(e){return String(Math.round(e))}};i=u.appendChild(Q(r,t,n));return i}function Z(){var e=f.getBoundingClientRect();var t="offset"+["Width","Height"][g.ort];return g.ort===0?e.width||f[t]:e.height||f[t]}function A(r,n,i,a){var t=function(e){var t=ee(e,a.pageOffset,a.target||n);if(!t)return false;if(X()&&!a.doNotReject)return false;if(ze(u,g.cssClasses.tap)&&!a.doNotReject)return false;if(r===l.start&&t.buttons!==undefined&&t.buttons>1)return false;if(a.hover&&t.buttons)return false;if(!j)t.preventDefault();t.calcPoint=t.points[g.ort];i(t,a)};var s=[];r.split(" ").forEach(function(e){n.addEventListener(e,t,j?{passive:true}:false);s.push([e,t])});return s}function ee(t,e,r){var n=t.type.indexOf("touch")===0;var i=t.type.indexOf("mouse")===0;var a=t.type.indexOf("pointer")===0;var s=0;var o=0;var l;var u;var f;if(t.type.indexOf("MSPointer")===0)a=true;if(t.type==="mousedown"&&!t.buttons&&!t.touches)return false;if(n){l=function(e){return e.target===r||r.contains(e.target)||t.composed&&t.composedPath().shift()===r};if(t.type==="touchstart"){u=Array.prototype.filter.call(t.touches,l);if(u.length>1)return false;s=u[0].pageX;o=u[0].pageY}else{f=Array.prototype.find.call(t.changedTouches,l);if(!f)return false;s=f.pageX;o=f.pageY}}e=e||je(v);if(i||a){s=t.clientX+e.x;o=t.clientY+e.y}t.pageOffset=e;t.points=[s,o];t.cursor=i||a;return t}function te(e){var t=e-Me(f,g.ort);var r=t*100/Z();r=De(r);return g.dir?100-r:r}function re(o){var l=100;var u=false;c.forEach(function(e,t){var r;var n;var i;var a;var s;if(P(t))return;r=S[t];n=Math.abs(r-o);i=n===100&&l===100;a=n<l;s=n<=l&&o>r;if(a||s||i){u=t;l=n}});return u}function ne(e,t){if(e.type==="mouseout"&&e.target.nodeName==="HTML"&&e.relatedTarget===null)k(e,t)}function ie(e,t){var r;var n;if(navigator.appVersion.indexOf("MSIE 9")===-1&&e.buttons===0&&t.buttonsProperty!==0)return k(e,t);r=(g.dir?-1:1)*(e.calcPoint-t.startCalcPoint);n=r*100/t.baseSize;fe(r>0,n,t.locations,t.handleNumbers,t.connect)}function k(e,t){if(t.handle){Te(t.handle,g.cssClasses.active);h-=1}t.listeners.forEach(function(e){m.removeEventListener(e[0],e[1])});if(h===0){Te(u,g.cssClasses.drag);L();if(e.cursor){x.style.cursor="";x.removeEventListener("selectstart",Ae)}}if(g.events.smoothSteps){t.handleNumbers.forEach(function(e){T(e,S[e],true,true,false,false)});t.handleNumbers.forEach(function(e){U("update",e)})}t.handleNumbers.forEach(function(e){U("change",e);U("set",e);U("end",e)})}function M(e,t){var r;var n;var i;var a;var s;var o;if(t.handleNumbers.some(P))return;if(t.handleNumbers.length===1){n=c[t.handleNumbers[0]];r=n.children[0];h+=1;Le(r,g.cssClasses.active)}e.stopPropagation();i=[];a=A(l.move,m,ie,{target:e.target,handle:r,connect:t.connect,listeners:i,startCalcPoint:e.calcPoint,baseSize:Z(),pageOffset:e.pageOffset,handleNumbers:t.handleNumbers,buttonsProperty:e.buttons,locations:S.slice()});s=A(l.end,m,k,{target:e.target,handle:r,listeners:i,doNotReject:true,handleNumbers:t.handleNumbers});o=A("mouseout",m,ne,{target:e.target,handle:r,listeners:i,doNotReject:true,handleNumbers:t.handleNumbers});i.push.apply(i,a.concat(s,o));if(e.cursor){x.style.cursor=getComputedStyle(e.target).cursor;if(c.length>1)Le(u,g.cssClasses.drag);x.addEventListener("selectstart",Ae,false)}t.handleNumbers.forEach(function(e){U("start",e)})}function ae(e){var t;var r;e.stopPropagation();t=te(e.calcPoint);r=re(t);if(r===false)return;if(!g.events.snap)Ue(u,g.cssClasses.tap,g.animationDuration);T(r,t,true,true);L();U("slide",r,true);U("update",r,true);if(!g.events.snap){U("change",r,true);U("set",r,true)}else M(e,{handleNumbers:[r]})}function se(e){var t=te(e.calcPoint);var r=w.getStep(t);var n=w.fromStepping(r);Object.keys(o).forEach(function(e){if("hover"===e.split(".")[0])o[e].forEach(function(e){e.call(y,n)})})}function oe(e,t){var r;var n;var i;var a;var s;var o;var l;var u;var f;var c;var p;var d;var h;var v;var m;if(X()||P(t))return false;r=["Left","Right"];n=["Down","Up"];i=["PageDown","PageUp"];a=["Home","End"];if(g.dir&&!g.ort)r.reverse();else if(g.ort&&!g.dir){n.reverse();i.reverse()}s=e.key.replace("Arrow","");o=s===i[0];l=s===i[1];u=s===n[0]||s===r[0]||o;f=s===n[1]||s===r[1]||l;c=s===a[0];p=s===a[1];if(!u&&!f&&!c&&!p)return true;e.preventDefault();if(f||u){h=u?0:1;v=xe(t);m=v[h];if(m===null)return false;if(m===false)m=w.getDefaultStep(S[t],u,g.keyboardDefaultStep);if(l||o)m*=g.keyboardPageMultiplier;else m*=g.keyboardMultiplier;m=Math.max(m,1e-7);m=(u?-1:1)*m;d=b[t]+m}else if(p)d=g.spectrum.xVal[g.spectrum.xVal.length-1];else d=g.spectrum.xVal[0];T(t,w.toStepping(d),true,true);U("slide",t);U("update",t);U("change",t);U("set",t);return false}function le(r){var n;var i;var a;var s;var o;if(!r.fixed)c.forEach(function(e,t){A(l.start,e.children[0],M,{handleNumbers:[t]})});if(r.tap)A(l.start,f,ae,{});if(r.hover)A(l.move,f,se,{hover:true});if(r.drag)p.forEach(function(t,e){if(t===false||e===0||e===p.length-1)return;n=c[e-1];i=c[e];a=[t];s=[n,i];o=[e-1,e];Le(t,g.cssClasses.draggable);if(r.fixed){a.push(n.children[0]);a.push(i.children[0])}if(r.dragAll){s=c;o=d}a.forEach(function(e){A(l.start,e,M,{handles:s,handleNumbers:o,connect:t})})})}function t(e,t){o[e]=o[e]||[];o[e].push(t);if(e.split(".")[0]==="update")c.forEach(function(e,t){U("update",t)})}function ue(e){return e===Ce.aria||e===Ce.tooltips}function r(e){var n=e&&e.split(".")[0];var i=n?e.substring(n.length):e;Object.keys(o).forEach(function(e){var t=e.split(".")[0];var r=e.substring(t.length);if((!n||n===t)&&(!i||i===r))if(!ue(r)||i===r)delete o[e]})}function U(r,n,i){Object.keys(o).forEach(function(e){var t=e.split(".")[0];if(r===t)o[e].forEach(function(e){e.call(y,b.map(g.format.to),n,b.slice(),i||false,S.slice(),y)})})}function D(e,t,r,n,i,a,s){var o;if(c.length>1&&!g.events.unconstrained){if(n&&t>0){o=w.getAbsoluteDistance(e[t-1],g.margin,false);r=Math.max(r,o)}if(i&&t<c.length-1){o=w.getAbsoluteDistance(e[t+1],g.margin,true);r=Math.min(r,o)}}if(c.length>1&&g.limit){if(n&&t>0){o=w.getAbsoluteDistance(e[t-1],g.limit,false);r=Math.min(r,o)}if(i&&t<c.length-1){o=w.getAbsoluteDistance(e[t+1],g.limit,true);r=Math.max(r,o)}}if(g.padding){if(t===0){o=w.getAbsoluteDistance(0,g.padding[0],false);r=Math.max(r,o)}if(t===c.length-1){o=w.getAbsoluteDistance(100,g.padding[1],true);r=Math.min(r,o)}}if(!s)r=w.getStep(r);r=De(r);if(r===e[t]&&!a)return false;return r}function O(e,t){var r=g.ort;return(r?t:e)+", "+(r?e:t)}function fe(e,n,r,t,i){var a=r.slice();var s=t[0];var o=g.events.smoothSteps;var l=[!e,e];var u=[e,!e];var f=false;t=t.slice();if(e)t.reverse();if(t.length>1)t.forEach(function(e,t){var r=D(a,e,a[e]+n,l[t],u[t],false,o);if(r===false)n=0;else{n=r-a[e];a[e]=r}});else l=u=[true];t.forEach(function(e,t){f=T(e,r[e]+n,l[t],u[t],false,o)||f});if(f){t.forEach(function(e){U("update",e);U("slide",e)});if(i!==undefined)U("drag",s)}}function ce(e,t){return g.dir?100-e-t:e}function pe(e,t){var r;var n;S[e]=t;b[e]=w.fromStepping(t);r=ce(t,0)-H;n="translate("+O(r+"%","0")+")";c[e].style[g.transformRule]=n;de(e);de(e+1)}function L(){d.forEach(function(e){var t=S[e]>50?-1:1;var r=3+(c.length+t*e);c[e].style.zIndex=String(r)})}function T(e,t,r,n,i,a){if(!i)t=D(S,e,t,r,n,false,a);if(t===false)return false;pe(e,t);return true}function de(e){var t;var r;var n;var i;var a;if(!p[e])return;t=0;r=100;if(e!==0)t=S[e-1];if(e!==p.length-1)r=S[e];n=r-t;i="translate("+O(ce(t,n)+"%","0")+")";a="scale("+O(n/100,"1")+")";p[e].style[g.transformRule]=i+" "+a}function he(e,t){if(e===null||e===false||e===undefined)return S[t];if(typeof e==="number")e=String(e);e=g.format.from(e);if(e!==false)e=w.toStepping(e);if(e===false||isNaN(e))return S[t];return e}function ve(t){return function(e){T(e,S[e],true,true,t)}}function z(e,t,r){var n=Oe(e);var i=S[0]===undefined;var a;var s;t=t===undefined?true:t;if(g.animate&&!i)Ue(u,g.cssClasses.tap,g.animationDuration);d.forEach(function(e){T(e,he(n[e],e),true,false,r)});a=d.length===1?0:1;if(i&&w.hasNoSize()){r=true;S[0]=0;if(d.length>1){s=100/(d.length-1);d.forEach(function(e){S[e]=e*s})}}for(;a<d.length;++a)d.forEach(ve(r));L();d.forEach(function(e){U("update",e);if(n[e]!==null&&t)U("set",e)})}function me(e){z(g.start,e)}function ge(e,t,r,n){e=Number(e);if(!(e>=0&&e<d.length))throw new Error("noUiSlider: invalid handle number, got: "+e);T(e,he(t,e),true,true,n);U("update",e);if(r)U("set",e)}function be(e){var t;if(e===void 0)e=false;if(e)return b.length===1?b[0]:b.slice(0);t=b.map(g.format.to);if(t.length===1)return t[0];return t}function Se(){r(Ce.aria);r(Ce.tooltips);Object.keys(g.cssClasses).forEach(function(e){Te(u,g.cssClasses[e])});while(u.firstChild)u.removeChild(u.firstChild);delete u.noUiSlider}function xe(e){var t=S[e];var r=w.getNearbySteps(t);var n=b[e];var i=r.thisStep.step;var a=null;var s;if(g.snap)return[n-r.stepBefore.startValue||null,r.stepAfter.startValue-n||null];if(i!==false)if(n+i>r.stepAfter.startValue)i=r.stepAfter.startValue-n;if(n>r.thisStep.startValue)a=r.thisStep.step;else if(r.stepBefore.step===false)a=false;else a=n-r.stepBefore.highestStep;if(t===100)i=null;else if(t===0)a=null;s=w.countStepDecimals();if(i!==null&&i!==false)i=Number(i.toFixed(s));if(a!==null&&a!==false)a=Number(a.toFixed(s));return[a,i]}function ye(){return d.map(xe)}function we(t,e){var r=be();var n=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips"];var i;n.forEach(function(e){if(t[e]!==undefined)a[e]=t[e]});i=_e(a);n.forEach(function(e){if(t[e]!==undefined)g[e]=i[e]});w=i.spectrum;g.margin=i.margin;g.limit=i.limit;g.padding=i.padding;if(g.pips)V(g.pips);else N();if(g.tooltips)W();else C();S=[];z(Ve(t.start)?t.start:r,e)}function Ee(){f=B(u);_(g.connect,f);le(g.events);z(g.start);if(g.pips)V(g.pips);if(g.tooltips)W();$()}Ee();y={destroy:Se,steps:ye,on:t,off:r,get:be,set:z,setHandle:ge,reset:me,disable:Y,enable:I,__moveHandles:function(e,t,r){fe(e,t,S,r)},options:a,updateOptions:we,target:u,removePips:N,removeTooltips:C,getPositions:function(){return S.slice()},getTooltips:function(){return s},getOrigins:function(){return c},pips:V};return y}function g(e,t){var r;var n;if(!e||!e.nodeName)throw new Error("noUiSlider: create requires a single element, got: "+e);if(e.noUiSlider)throw new Error("noUiSlider: Slider was already initialized.");r=_e(t);n=X(e,r,t);e.noUiSlider=n;return n}n[n.None=-1]="None",n[n.NoValue=0]="NoValue",n[n.LargeValue=1]="LargeValue",n[n.SmallValue=2]="SmallValue",e={__spectrum:r,cssClasses:u,create:g},Pe.create=g,Pe.cssClasses=u,Pe.default=e,Object.defineProperty(Pe,"__esModule",{value:true})}(e.noUiSlider={})}(this);
!function(m){"use strict";var t,e,a,v=/^\s+/,w=/\s+$/,n=0,o=m.round,y=m.min,_=m.max,r=m.random,x={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},s=function(t){var e,a={};for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(a[t[e]]=e);return a}(x),k=(e="[\\s|\\(]+("+(t="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+t+")[,|\\s]+("+t+")\\s*\\)?",a="[\\s|\\(]+("+t+")[,|\\s]+("+t+")[,|\\s]+("+t+")[,|\\s]+("+t+")\\s*\\)?",{CSS_UNIT:new RegExp(t),rgb:new RegExp("rgb"+e),rgba:new RegExp("rgba"+a),hsl:new RegExp("hsl"+e),hsla:new RegExp("hsla"+a),hsv:new RegExp("hsv"+e),hsva:new RegExp("hsva"+a),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function A(t){return k.CSS_UNIT.exec(t)}function S(t){return parseInt(t,16)}function C(t){return S(t)/255}function P(t){return t=parseFloat(t),t=isNaN(t)||t<0||1<t?1:t}function R(t,e){var a;return"string"==typeof(a=t)&&-1!==a.indexOf(".")&&1===parseFloat(a)&&(t="100%"),a="string"==typeof(a=t)&&-1!==a.indexOf("%"),t=y(e,_(0,parseFloat(t))),a&&(t=parseInt(t*e,10)/100),m.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function i(t){return y(1,_(0,t))}function l(t){return 1===t.length?"0"+t:""+t}function F(t){return t=t<=1?100*t+"%":t}function c(t){return m.round(255*parseFloat(t)).toString(16)}function f(t,e,a){var n,r,o,s,i,l;if(t=R(t,255),e=R(e,255),a=R(a,255),i=((n=_(t,e,a))+(r=y(t,e,a)))/2,n===r)o=s=0;else{switch(l=n-r,s=.5<i?l/(2-n-r):l/(n+r),n){case t:o=(e-a)/l+(e<a?6:0);break;case e:o=(a-t)/l+2;break;case a:o=(t-e)/l+4}o/=6}return{h:o,s:s,l:i}}function u(t,e,a){var n,r,o,s,i,l;if(t=R(t,255),e=R(e,255),a=R(a,255),l=(i=n=_(t,e,a))-(r=y(t,e,a)),s=0===n?0:l/n,n===r)o=0;else{switch(n){case t:o=(e-a)/l+(e<a?6:0);break;case e:o=(a-t)/l+2;break;case a:o=(t-e)/l+4}o/=6}return{h:o,s:s,v:i}}function d(t,e,a,n){t=[l(o(t).toString(16)),l(o(e).toString(16)),l(o(a).toString(16))];return n&&t[0].charAt(0)===t[0].charAt(1)&&t[1].charAt(0)===t[1].charAt(1)&&t[2].charAt(0)===t[2].charAt(1)?t[0].charAt(0)+t[1].charAt(0)+t[2].charAt(0):t.join("")}function h(t,e,a,n){return[l(c(n)),l(o(t).toString(16)),l(o(e).toString(16)),l(o(a).toString(16))].join("")}function p(t){var e,a,n,r,o,s,i,l,c,f,u={r:0,g:0,b:0},d=1,h=null,p=!1,g=!1;function b(t,e,a){return a<0&&(a+=1),1<a&&--a,a<1/6?t+6*(e-t)*a:a<.5?e:a<2/3?t+(e-t)*(2/3-a)*6:t}return d=P(d="object"==typeof(t="string"==typeof t?function(t){var e,a=!1;if(t=t.replace(v,"").replace(w,"").toLowerCase(),x[t])t=x[t],a=!0;else if("transparent"===t)return{r:0,g:0,b:0,a:0,format:"name"};return(e=k.rgb.exec(t))?{r:e[1],g:e[2],b:e[3]}:(e=k.rgba.exec(t))?{r:e[1],g:e[2],b:e[3],a:e[4]}:(e=k.hsl.exec(t))?{h:e[1],s:e[2],l:e[3]}:(e=k.hsla.exec(t))?{h:e[1],s:e[2],l:e[3],a:e[4]}:(e=k.hsv.exec(t))?{h:e[1],s:e[2],v:e[3]}:(e=k.hsva.exec(t))?{h:e[1],s:e[2],v:e[3],a:e[4]}:(e=k.hex8.exec(t))?{r:S(e[1]),g:S(e[2]),b:S(e[3]),a:C(e[4]),format:a?"name":"hex8"}:(e=k.hex6.exec(t))?{r:S(e[1]),g:S(e[2]),b:S(e[3]),format:a?"name":"hex"}:(e=k.hex4.exec(t))?{r:S(e[1]+""+e[1]),g:S(e[2]+""+e[2]),b:S(e[3]+""+e[3]),a:C(e[4]+""+e[4]),format:a?"name":"hex8"}:!!(e=k.hex3.exec(t))&&{r:S(e[1]+""+e[1]),g:S(e[2]+""+e[2]),b:S(e[3]+""+e[3]),format:a?"name":"hex"}}(t):t)&&(A(t.r)&&A(t.g)&&A(t.b)?(l=t.r,c=t.g,f=t.b,u={r:255*R(l,255),g:255*R(c,255),b:255*R(f,255)},p=!0,g="%"===String(t.r).substring(String(t.r).length-1)?"prgb":"rgb"):A(t.h)&&A(t.s)&&A(t.v)?(h=F(t.s),l=F(t.v),c=t.h,f=h,r=l,c=6*R(c,360),f=R(f,100),u={r:255*[r=R(r,100),s=r*(1-(i=c-(c=m.floor(c)))*f),o=r*(1-f),o,i=r*(1-(1-i)*f),r][f=c%6],g:255*[i,r,r,s,o,o][f],b:255*[o,o,i,r,r,s][f]},p=!0,g="hsv"):A(t.h)&&A(t.s)&&A(t.l)&&(h=F(t.s),o=F(t.l),i=t.h,r=h,s=o,i=R(i,360),r=R(r,100),s=R(s,100),0===r?e=a=n=s:(e=b(r=2*s-(s=s<.5?s*(1+r):s+r-s*r),s,i+1/3),a=b(r,s,i),n=b(r,s,i-1/3)),u={r:255*e,g:255*a,b:255*n},p=!0,g="hsl"),Object.prototype.hasOwnProperty.call(t,"a"))?t.a:d),{ok:p,format:t.format||g,r:y(255,_(u.r,0)),g:y(255,_(u.g,0)),b:y(255,_(u.b,0)),a:d}}function g(t,e){var a;return e=e||{},(t=t||"")instanceof g?t:this instanceof g?(a=p(t),this._originalInput=t,this._r=a.r,this._g=a.g,this._b=a.b,this._a=a.a,this._roundA=o(100*this._a)/100,e.format?this._format=e.format:this._format=a.format,this._gradientType=e.gradientType,this._r<1&&(this._r=o(this._r)),this._g<1&&(this._g=o(this._g)),this._b<1&&(this._b=o(this._b)),this._ok=a.ok,n+=1,void(this._tc_id=n)):new g(t,e)}function b(t,e){return new g(t,e)}function H(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).s-=e/100,t.s=i(t.s),b(t)}function T(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).s+=e/100,t.s=i(t.s),b(t)}function M(t){return b(t).desaturate(100)}function O(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).l+=e/100,t.l=i(t.l),b(t)}function z(t,e){return e=0===e?0:e||10,(t=b(t).toRgb()).r=_(0,y(255,t.r-o(-e/100*255))),t.g=_(0,y(255,t.g-o(-e/100*255))),t.b=_(0,y(255,t.b-o(-e/100*255))),b(t)}function j(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).l-=e/100,t.l=i(t.l),b(t)}function E(t,e){t=b(t).toHsl(),e=(t.h+e)%360;return t.h=e<0?360+e:e,b(t)}function I(t){t=b(t).toHsl();return t.h=(t.h+180)%360,b(t)}function N(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+120)%360,s:e.s,l:e.l}),b({h:(a+240)%360,s:e.s,l:e.l})]}function q(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+90)%360,s:e.s,l:e.l}),b({h:(a+180)%360,s:e.s,l:e.l}),b({h:(a+270)%360,s:e.s,l:e.l})]}function D(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+72)%360,s:e.s,l:e.l}),b({h:(a+216)%360,s:e.s,l:e.l})]}g.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t=this.toRgb(),e=t.r/255,a=t.g/255,t=t.b/255,e=e<=.03928?e/12.92:m.pow((.055+e)/1.055,2.4),a=a<=.03928?a/12.92:m.pow((.055+a)/1.055,2.4),t=t<=.03928?t/12.92:m.pow((.055+t)/1.055,2.4);return.2126*e+.7152*a+.0722*t},setAlpha:function(t){return this._a=P(t),this._roundA=o(100*this._a)/100,this},toHsv:function(){var t=u(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=u(this._r,this._g,this._b),e=o(360*t.h),a=o(100*t.s),t=o(100*t.v);return 1===this._a?"hsv("+e+", "+a+"%, "+t+"%)":"hsva("+e+", "+a+"%, "+t+"%, "+this._roundA+")"},toHsl:function(){var t=f(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=f(this._r,this._g,this._b),e=o(360*t.h),a=o(100*t.s),t=o(100*t.l);return 1===this._a?"hsl("+e+", "+a+"%, "+t+"%)":"hsla("+e+", "+a+"%, "+t+"%, "+this._roundA+")"},toHex:function(t){return d(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return e=this._r,a=this._g,n=this._b,r=this._a,t=t,e=[l(o(e).toString(16)),l(o(a).toString(16)),l(o(n).toString(16)),l(c(r))],t&&e[0].charAt(0)===e[0].charAt(1)&&e[1].charAt(0)===e[1].charAt(1)&&e[2].charAt(0)===e[2].charAt(1)&&e[3].charAt(0)===e[3].charAt(1)?e[0].charAt(0)+e[1].charAt(0)+e[2].charAt(0)+e[3].charAt(0):e.join("");var e,a,n,r},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:o(this._r),g:o(this._g),b:o(this._b),a:this._a}},toRgbString:function(){return 1===this._a?"rgb("+o(this._r)+", "+o(this._g)+", "+o(this._b)+")":"rgba("+o(this._r)+", "+o(this._g)+", "+o(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:o(100*R(this._r,255))+"%",g:o(100*R(this._g,255))+"%",b:o(100*R(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1===this._a?"rgb("+o(100*R(this._r,255))+"%, "+o(100*R(this._g,255))+"%, "+o(100*R(this._b,255))+"%)":"rgba("+o(100*R(this._r,255))+"%, "+o(100*R(this._g,255))+"%, "+o(100*R(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&s[d(this._r,this._g,this._b,!0)]||!1},toFilter:function(t){var e="#"+h(this._r,this._g,this._b,this._a),a=e;return"progid:DXImageTransform.Microsoft.gradient("+(this._gradientType?"GradientType = 1, ":"")+"startColorstr="+e+",endColorstr="+(a=t?"#"+h((e=b(t))._r,e._g,e._b,e._a):a)+")"},toString:function(t){var e,a,n=!!t;return t=t||this._format,e=!1,a=this._a<1&&0<=this._a,n||!a||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(e=this.toRgbString()),"prgb"===t&&(e=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(e=this.toHexString()),"hex3"===t&&(e=this.toHexString(!0)),"hex4"===t&&(e=this.toHex8String(!0)),"hex8"===t&&(e=this.toHex8String()),"name"===t&&(e=this.toName()),"hsl"===t&&(e=this.toHslString()),(e="hsv"===t?this.toHsvString():e)||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return b(this.toString())},_applyModification:function(t,e){t=t.apply(null,[this].concat([].slice.call(e)));return this._r=t._r,this._g=t._g,this._b=t._b,this.setAlpha(t._a),this},lighten:function(){return this._applyModification(O,arguments)},brighten:function(){return this._applyModification(z,arguments)},darken:function(){return this._applyModification(j,arguments)},desaturate:function(){return this._applyModification(H,arguments)},saturate:function(){return this._applyModification(T,arguments)},greyscale:function(){return this._applyModification(M,arguments)},spin:function(){return this._applyModification(E,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},complement:function(){return this._applyCombination(I,arguments)},splitcomplement:function(){return this._applyCombination(D,arguments)},triad:function(){return this._applyCombination(N,arguments)},tetrad:function(){return this._applyCombination(q,arguments)}},g.fromRatio=function(t,e){var a,n;if("object"==typeof t){for(n in a={},t)Object.prototype.hasOwnProperty.call(t,n)&&(a[n]="a"===n?t[n]:F(t[n]));t=a}return b(t,e)},g.equals=function(t,e){return!(!t||!e)&&b(t).toRgbString()===b(e).toRgbString()},g.random=function(){return g.fromRatio({r:r(),g:r(),b:r()})},g.mix=function(t,e,a){return a=0===a?0:a||50,t=b(t).toRgb(),e=b(e).toRgb(),b({r:(e.r-t.r)*(a=a/100)+t.r,g:(e.g-t.g)*a+t.g,b:(e.b-t.b)*a+t.b,a:(e.a-t.a)*a+t.a})},g.readability=function(t,e){t=b(t),e=b(e);return(m.max(t.getLuminance(),e.getLuminance())+.05)/(m.min(t.getLuminance(),e.getLuminance())+.05)},g.isReadable=function(t,e,a){var n=g.readability(t,e),r=!1;switch((a={level:e="AA"!==(e=((t=(t=a)||{level:"AA",size:"small"}).level||"AA").toUpperCase())&&"AAA"!==e?"AA":e,size:e="small"!==(e=(t.size||"small").toLowerCase())&&"large"!==e?"small":e}).level+a.size){case"AAsmall":case"AAAlarge":r=4.5<=n;break;case"AAlarge":r=3<=n;break;case"AAAsmall":r=7<=n}return r},g.mostReadable=function(t,e,a){for(var n,r=null,o=0,s=(a=a||{}).includeFallbackColors,i=a.level,l=a.size,c=0;c<e.length;c+=1)o<(n=g.readability(t,e[c]))&&(o=n,r=b(e[c]));return g.isReadable(t,r,{level:i,size:l})||!s?r:(a.includeFallbackColors=!1,g.mostReadable(t,["#fff","#000"],a))},g.names=x,g.hexNames=s,void 0!==window.module&&window.module.exports?window.module.exports=g:"function"==typeof window.define&&window.define.amd?window.define(function(){return g}):window.tinycolor=g}(Math),function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):"object"==typeof exports&&"object"==typeof module?window.module.exports=t(window.require("jquery")):t(window.jQuery)}(function(It){"use strict";var t,o="spectrum.id",Nt=window.tinycolor,qt={beforeShow:a,move:a,change:a,show:a,hide:a,color:!1,flat:!1,type:"color",showInput:!1,allowEmpty:!1,showButtons:!0,clickoutFiresChange:!0,showInitial:!1,showPalette:!1,showPaletteOnly:!1,hideAfterPaletteSelect:!1,togglePaletteOnly:!1,showSelectionPalette:!0,localStorageKey:!1,appendTo:"body",maxSelectionSize:8,locale:"en",cancelText:"cancel",chooseText:"choose",togglePaletteMoreText:"more",togglePaletteLessText:"less",clearText:"Clear Color Selection",preferredFormat:"hex",className:"",containerClassName:"",replacerClassName:"",showAlpha:!1,theme:"epo",palette:[["#000000","#444444","#5b5b5b","#999999","#bcbcbc","#eeeeee","#f3f6f4","#ffffff"],["#f44336","#744700","#ce7e00","#8fce00","#2986cc","#16537e","#6a329f","#c90076"],["#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#cfe2f3","#d9d2e9","#ead1dc"],["#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#9fc5e8","#b4a7d6","#d5a6bd"],["#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6fa8dc","#8e7cc3","#c27ba0"],["#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3d85c6","#674ea7","#a64d79"],["#990000","#b45f06","#bf9000","#38761d","#134f5c","#0b5394","#351c75","#741b47"],["#660000","#783f04","#7f6000","#274e13","#0c343d","#073763","#20124d","#4c1130"]],selectionPalette:[],disabled:!1,offset:null},Dt=[],Lt=!!/msie/i.exec(window.navigator.userAgent),Bt=((t=document.createElement("div").style).cssText="background-color:rgba(0,0,0,.5)",e(t.backgroundColor,"rgba")||e(t.backgroundColor,"hsla")),$t=['<button type="button" class="sp-replacer">','<span class="sp-preview"><span class="sp-preview-inner"></span></span>','<span class="sp-dd">&#9660;</span>',"</button>"].join(""),Kt=function(){var t,e="";if(Lt)for(t=1;t<=6;t++)e+="<div class='sp-"+t+"'></div>";return["<div class='sp-container sp-hidden'>","<div class='sp-palette-container'>","<div class='sp-palette sp-thumb sp-cf'></div>","<div class='sp-palette-button-container sp-cf'>","<button type='button' class='sp-palette-toggle'></button>","</div>","</div>","<div class='sp-picker-container'>","<div class='sp-top sp-cf'>","<div class='sp-fill'></div>","<div class='sp-top-inner'>","<div class='sp-color'>","<div class='sp-sat'>","<div class='sp-val'>","<div class='sp-dragger' tabindex='0'></div>","</div>","</div>","</div>","<div class='sp-clear sp-clear-display'>","</div>","<div class='sp-hue'>","<div class='sp-slider' tabindex='0'></div>",e,"</div>","</div>","<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle' tabindex='0'></div></div></div>","</div>","<div class='sp-input-container sp-cf'>","<input class='sp-input' type='text' spellcheck='false'>","</div>","<div class='sp-initial sp-thumb sp-cf'></div>","<div class='sp-button-container sp-cf'>","<button type='button' class='sp-cancel'></button>","<button type='button' class='sp-choose'></button>","</div>","</div>","</div>"].join("")}();function e(t,e){return 1!==(""+t).indexOf(e)}function Vt(t,e,a,n){for(var r,o,s,i,l=[],c=0;c<t.length;c++)(s=t[c])?(o=(r=Nt(s)).toHsl().l<.5?"sp-thumb-el sp-thumb-dark":"sp-thumb-el sp-thumb-light",o+=Nt.equals(e,s)?" sp-thumb-active":"",s=r.toString(n.preferredFormat||"rgb"),i=Bt?"background-color:"+r.toRgbString():"filter:"+r.toFilter(),l.push('<span title="'+s+'" data-color="'+r.toRgbString()+'" class="'+o+'" role="button" tabindex="0"><span class="sp-thumb-inner" style="'+i+';"></span></span>')):l.push('<span class="sp-thumb-el sp-clear-display" role="button" tabindex="0"><span class="sp-clear-palette-only" style="background-color: transparent;"></span></span>');return"<div class='sp-cf "+a+"'>"+l.join("")+"</div>"}function s(t,e){n=t,(e=e).locale=e.locale||window.navigator.language,e.locale&&(e.locale=e.locale.split("-")[0].toLowerCase()),"en"!==e.locale&&It.spectrum.localization[e.locale]&&(e=It.extend({},It.spectrum.localization[e.locale],e)),(e=It.extend({},qt,e)).callbacks={move:Wt(e.move,n),change:Wt(e.change,n),show:Wt(e.show,n),hide:Wt(e.hide,n),beforeShow:Wt(e.beforeShow,n)};var E,I,N,q,D,a,l=e,n=l.type,c="flat"===n,L=l.showSelectionPalette,r=l.localStorageKey,e=l.theme,o=l.callbacks,B=(I=j,function(){var t=this,e=arguments;q&&clearTimeout(D),!q&&D||(D=setTimeout(function(){D=null,I.apply(t,e)},N))}),f=!(N=10),$=!1,u=0,d=0,h=0,K=0,V=0,U=0,W=0,s=0,X=0,Y=0,i=1,p=[],G=[],Q={},g=l.selectionPalette.slice(0),J=l.maxSelectionSize,Z="sp-dragging",tt=!1,b=null,et=t.ownerDocument,m=It(t),at=!1,v=It(Kt,et).addClass(e),nt=v.find(".sp-picker-container"),rt=v.find(".sp-color"),ot=v.find(".sp-dragger"),st=v.find(".sp-hue"),it=v.find(".sp-slider"),lt=v.find(".sp-alpha-inner"),ct=v.find(".sp-alpha"),ft=v.find(".sp-alpha-handle"),w=v.find(".sp-input"),ut=v.find(".sp-palette"),dt=v.find(".sp-initial"),t=v.find(".sp-cancel"),ht=v.find(".sp-clear"),pt=v.find(".sp-choose"),gt=v.find(".sp-palette-toggle"),bt=m.is("input"),mt=bt&&"color"===n,y=mt?It($t).addClass(e).addClass(l.className).addClass(l.replacerClassName):It([]),vt=mt?y:m,_=y.find(".sp-preview-inner"),x=l.color||bt&&m.val(),k=!1,A=l.preferredFormat,wt=!l.showButtons||l.clickoutFiresChange,S=!x,C=l.allowEmpty,P=null,R=null,yt=null,_t=null,e=m.attr("id");function xt(){var t,e,a;if(l.showPaletteOnly&&(l.showPalette=!0),gt.text(l.showPaletteOnly?l.togglePaletteMoreText:l.togglePaletteLessText),l.palette){for(p=l.palette.slice(0),G=Array.isArray(p[0])?p:[p],Q={},t=0;t<G.length;t++)for(e=0;e<G[t].length;e++)a=Nt(G[t][e]).toRgbString(),Q[a]=!0;l.showPaletteOnly&&!x&&(x=(""===p[0][0]?p[0]:Object.keys(Q))[0])}v.toggleClass("sp-flat",c),v.toggleClass("sp-input-disabled",!l.showInput),v.toggleClass("sp-alpha-enabled",l.showAlpha),v.toggleClass("sp-clear-enabled",C),v.toggleClass("sp-buttons-disabled",!l.showButtons),v.toggleClass("sp-palette-buttons-disabled",!l.togglePaletteOnly),v.toggleClass("sp-palette-disabled",!l.showPalette),v.toggleClass("sp-palette-only",l.showPaletteOnly),v.toggleClass("sp-initial-disabled",!l.showInitial),v.addClass(l.className).addClass(l.containerClassName),j()}function kt(){var t,e;if(r){try{1<(e=(t=window.localStorage)[r].split(",#")).length&&(delete t[r],It.each(e,function(t,e){At(e)}))}catch(t){window.console.log(t)}try{g=window.localStorage[r].split(";")}catch(t){window.console.log(t)}}}function At(t){if(L){if(t=Nt(t).toRgbString(),!Q[t]&&-1===It.inArray(t,g))for(g.push(t);g.length>J;)g.shift();if(r)try{window.localStorage[r]=g.join(";")}catch(t){window.console.log(t)}}}function St(){var a=T(),t=It.map(G,function(t,e){return Vt(t,a,"sp-palette-row sp-palette-row-"+e,l)});kt(),g&&t.push(Vt(function(){var t,e,a=[];if(l.showPalette)for(t=0;t<g.length;t++)e=Nt(g[t]).toRgbString(),Q[e]||a.push(g[t]);return a.reverse().slice(0,l.maxSelectionSize)}(),a,"sp-palette-row sp-palette-row-selection",l)),ut.html(t.join(""))}function Ct(){var t,e;l.showInitial&&(t=k,e=T(),dt.html(Vt([t,e],e,"sp-palette-row-initial",l)))}function Pt(){(d<=0||u<=0||K<=0)&&j(),$=!0,v.addClass(Z),b=null,m.trigger("dragstart.spectrum",[T()])}function Rt(){$=!1,v.removeClass(Z),m.trigger("dragstop.spectrum",[T()])}function Ft(t){tt?tt=!1:null!==t&&""!==t||!C?(t=Nt(t)).isValid()?(H(t),M(),z()):w.addClass("sp-validation-error"):(H(null),M(),z())}function Ht(){var t=It.Event("beforeShow.spectrum");if(f)j();else if(m.trigger(t,[T()]),!1!==o.beforeShow(T())&&!t.isDefaultPrevented()){for(var e=0;e<Dt.length;e++)Dt[e]&&Dt[e].hide();f=!0,It(et).on("keydown.spectrum",Tt),It(et).on("click.spectrum",Mt),It(window).on("resize.spectrum",B),y.attr("aria-expanded",!0),y.addClass("sp-active"),v.removeClass("sp-hidden"),j(),O(),k=T(),Ct(),o.show(k),m.trigger("show.spectrum",[k])}}function Tt(t){27===t.keyCode&&F()}function Mt(t){2===t.button||$||(wt?z(!0):Ot(),F())}function F(){f&&!c&&(f=!1,It(et).off("keydown.spectrum",Tt),It(et).off("click.spectrum",Mt),It(window).off("resize.spectrum",B),y.attr("aria-expanded",!1),y.removeClass("sp-active"),v.addClass("sp-hidden"),o.hide(T()),m.trigger("hide.spectrum",[T()]))}function Ot(){H(k,!0),z(!0)}function H(t,e){var a;Nt.equals(t,T())?O():(t&&void 0!==t||!C?(S=!1,t=(a=Nt(t)).toHsv(),s=t.h%360/360,X=t.s,Y=t.v,i=t.a):S=!0,O(),a&&a.isValid()&&!e&&(A=l.preferredFormat||a.getFormat()))}function T(t){return t=t||{},C&&S?null:Nt.fromRatio({h:s,s:X,v:Y,a:Math.round(1e3*i)/1e3},{format:t.format||A})}function M(){O(),o.move(T()),m.trigger("move.spectrum",[T()])}function O(){var t,e,a,n,r,o;w.removeClass("sp-validation-error"),zt(),t=Nt.fromRatio({h:s,s:1,v:1}),rt.css("background-color",t.toHexString()),t=A,e=T({format:t=!(i<1)||0===i&&"name"===A||"hex"!==A&&"hex3"!==A&&"hex6"!==A&&"name"!==A?A:"rgb"}),a="",_.removeClass("sp-clear-display"),_.css("background-color","transparent"),!e&&C?_.addClass("sp-clear-display"):(n=e.toHexString(),o=e.toRgbString(),Bt||1===e.alpha?_.css("background-color",o):(_.css("background-color","transparent"),_.css("filter",e.toFilter())),l.showAlpha&&((o=e.toRgb()).a=0,r="linear-gradient(left, "+(o=Nt(o).toRgbString())+", "+n+")",Lt?lt.css("filter",Nt(o).toFilter({gradientType:1},n)):(lt.css("background","-webkit-"+r),lt.css("background","-moz-"+r),lt.css("background","-ms-"+r),lt.css("background","linear-gradient(to right, "+o+", "+n+")"))),a=e.toString(t)),l.showInput&&w.val(a),m.val(a),"text"!==l.type&&"component"!==l.type||((r=e)&&R?(o=r.isLight()||r.getAlpha()<.4?"black":"white",R.css("background-color",r.toRgbString()).css("color",o)):R.css("background-color",_t).css("color",yt)),l.showPalette&&St(),Ct()}function zt(){var t=X,e=Y;C&&S?(ft.hide(),it.hide(),ot.hide()):(ft.show(),it.show(),ot.show(),t=t*u,e=d-e*d,t=Math.max(-h,Math.min(u-h,t-h)),e=Math.max(-h,Math.min(d-h,e-h)),ot.css({top:e+"px",left:t+"px"}),e=i*V,ft.css({left:e-U/2+"px"}),t=s*K,it.css({top:t-W+"px"}))}function z(t){var e=T(),a=!Nt.equals(e,k);e&&At(e),t&&a&&(o.change(e),tt=!0,m.trigger("change",[e]))}function j(){var t,e,a,n,r,o,s,i;f&&(u=rt.width(),d=rt.height(),h=ot.height(),K=st.height(),W=it.height(),V=ct.width(),U=ft.width(),c||(v.attr("aria-haspopup",!0),v.css("position","absolute"),l.offset?v.offset(l.offset):v.offset((e=vt,a=(t=v).outerWidth(),n=t.outerHeight(),r=e.outerHeight(),t=t[0].ownerDocument,o=t.documentElement,s=o.clientWidth+It(t).scrollLeft(),o=o.clientHeight+It(t).scrollTop(),e=(t=e.offset()).left,i=t.top,i+=r,e-=Math.min(e,s<e+a&&a<s?Math.abs(e+a-s):0),{top:i-=Math.min(i,o<i+n&&n<o?Math.abs(+(n+r)):0),bottom:t.bottom,left:e,right:t.right,width:t.width,height:t.height}))),zt(),l.showPalette&&St(),m.trigger("reflow.spectrum"))}function jt(){F(),at=!0,m.attr("disabled",!0),vt.addClass("sp-disabled")}function Et(t){return(t.data&&t.data.ignore?(H(It(t.target).closest(".sp-thumb-el").data("color")),M):(H(It(t.target).closest(".sp-thumb-el").data("color")),M(),l.hideAfterPaletteSelect?(z(!0),F):z))(),!1}return void 0!==e&&0<e.length&&(bt=It('label[for="'+e+'"]')).length&&bt.on("click",function(t){return t.preventDefault(),m.spectrum("show"),!1}),Lt&&v.find("*:not(input)").attr("unselectable","on"),xt(),P=It('<span class="sp-original-input-container"></span>'),["margin"].forEach(function(t){P.css(t,m.css(t))}),"block"===m.css("display")&&P.css("display","flex"),mt?m.after(y).hide():"text"===n?(P.addClass("sp-colorize-container"),m.addClass("spectrum sp-colorize").wrap(P)):"component"===n&&(m.addClass("spectrum").wrap(P),(a=It(["<div class='sp-colorize-container sp-add-on'>","<div class='sp-colorize'></div> ","</div>"].join(""))).width(m.outerHeight()+"px").css("border-radius",m.css("border-radius")).css("border",m.css("border")),m.addClass("with-add-on").before(a)),R=m.parent().find(".sp-colorize"),yt=R.css("color"),_t=R.css("background-color"),C||ht.hide(),c?m.after(v).hide():(a=1!==(a="parent"===l.appendTo?m.parent():It(l.appendTo)).length?It("body"):a).append(v),kt(),vt.on("click.spectrum touchstart.spectrum",function(t){at||Ht(),t.stopPropagation(),It(t.target).is("input")||t.preventDefault()}),!m.is(":disabled")&&!0!==l.disabled||jt(),v.on("click",Ut),v.on("keydown",'div[role="button"]',function(t){13===t.keyCode&&(t.preventDefault(),It(this).click())}),[w,m].forEach(function(e){e.on("change",function(){Ft(e.val())}),e.on("paste",function(){setTimeout(function(){Ft(e.val())},1)}),e.on("keydown",function(t){13===t.keyCode&&(Ft(It(e).val()),e==m)&&F()})}),t.text(l.cancelText),t.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),Ot(),F()}),ht.attr("title",l.clearText),ht.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),S=!0,M(),c&&z(!0)}),pt.text(l.chooseText),pt.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),Lt&&w.is(":focus")&&w.trigger("change"),w.hasClass("sp-validation-error")||(z(!0),F())}),gt.text(l.showPaletteOnly?l.togglePaletteMoreText:l.togglePaletteLessText),gt.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),l.showPaletteOnly=!l.showPaletteOnly,l.showPaletteOnly||c||v.css("left","-="+(nt.outerWidth(!0)+5)),xt()}),Xt(ct,function(t,e,a){i=t/V,S=!1,a.shiftKey&&(i=Math.round(10*i)/10),M()},Pt,Rt),Xt(st,function(t,e){s=parseFloat(e/K),S=!1,l.showAlpha||(i=1),M()},Pt,Rt),Xt(rt,function(t,e,a){var n;a.shiftKey?b||(a=X*u,n=d-Y*d,a=Math.abs(t-a)>Math.abs(e-n),b=a?"x":"y"):b=null,n=!b||"y"===b,b&&"x"!==b||(X=parseFloat(t/u)),n&&(Y=parseFloat((d-e)/d)),S=!1,l.showAlpha||(i=1),M()},Pt,Rt),!1!==x&&""!==x?(H(x),O(),A=Nt(x).format||l.preferredFormat,At(x)):(""===x&&H(x),O()),c&&Ht(),ut.on(a=Lt?"mousedown.spectrum":"click.spectrum touchstart.spectrum",".sp-thumb-el",Et),dt.on(a,".sp-thumb-el:nth-child(1)",{ignore:!0},Et),(E={show:Ht,hide:F,toggle:function(){(f?F:Ht)()},reflow:j,option:function(t,e){return void 0===t?It.extend({},l):void 0===e?l[t]:(l[t]=e,"preferredFormat"===t&&(A=l.preferredFormat),void xt())},enable:function(){at=!1,m.attr("disabled",!1),vt.removeClass("sp-disabled")},disable:jt,offset:function(t){l.offset=t,j()},set:function(t){H(t),z()},get:T,destroy:function(){var t;m.show().removeClass("spectrum with-add-on sp-colorize"),vt.off("click.spectrum touchstart.spectrum"),v.remove(),y.remove(),R&&R.css("background-color",_t).css("color",yt),0<(t=m.closest(".sp-original-input-container")).length&&t.after(m).remove(),Dt[E.id]=null},container:v}).id=Dt.push(E)-1,E}function a(){}function Ut(t){t.stopPropagation()}function Wt(t,e){var a=Array.prototype.slice,n=a.call(arguments,2);return function(){return t.apply(e,n.concat(a.call(arguments)))}}function Xt(n,r,e,t){var o=document,s=!1,i={},l=0,c=0,f="ontouchstart"in window,a={};function u(t){t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.returnValue=!1}function d(t){var e,a;if(s){if(Lt&&o.documentMode<9&&!t.button)return h();e=(a=t.originalEvent&&t.originalEvent.touches&&t.originalEvent.touches[0])&&a.pageX||t.pageX,a=a&&a.pageY||t.pageY,e=Math.max(0,Math.min(e-i.left,c)),a=Math.max(0,Math.min(a-i.top,l)),f&&u(t),r.apply(n,[e,a,t])}}function h(){s&&(It(o).off(a),It(o.body).removeClass("sp-dragging"),setTimeout(function(){t.apply(n,arguments)},0)),s=!1}r=r||function(){},e=e||function(){},t=t||function(){},a.selectstart=u,a.dragstart=u,a["touchmove mousemove"]=d,a["touchend mouseup"]=h,It(n).on("touchstart mousedown",function(t){(t.which?3===t.which:2===t.button)||s||!1!==e.apply(n,arguments)&&(s=!0,l=It(n).height(),c=It(n).width(),i=It(n).offset(),It(o).on(a),It(o.body).addClass("sp-dragging"),d(t),u(t))})}function n(){return It.fn.spectrum.inputTypeColorSupport()}It.fn.spectrum=function(e){var t,a,n,r;return"string"==typeof e?(t=this,a=Array.prototype.slice.call(arguments,1),this.each(function(){if(n=Dt[It(this).data(o)]){if(!(r=n[e]))throw new Error("Spectrum: no such method: '"+e+"'");"get"===e?t=n.get():"container"===e?t=n.container:"option"===e?t=n.option.apply(n,a):"destroy"===e?(n.destroy(),It(this).removeData(o)):r.apply(n,a)}}),t):this.spectrum("destroy").each(function(){var t=It.extend({},It(this).data(),e);It(this).is("input")?t.flat||"flat"===t.type?t.type="flat":"color"===It(this).attr("type")&&(t.type="color"):t.type="noInput",t=s(this,t),It(this).data(o,t.id)})},It.fn.spectrum.load=!0,It.fn.spectrum.loadOpts={},It.fn.spectrum.draggable=Xt,It.fn.spectrum.defaults=qt,It.fn.spectrum.inputTypeColorSupport=function(){var t;return void 0===n._cachedResult&&(t=It("<input type='color'>")[0],n._cachedResult="color"===t.type&&""!==t.value),n._cachedResult},It.spectrum={},It.spectrum.localization={},It.spectrum.palettes={},It.fn.spectrum.processNativeColorInputs=function(){var t=It("input[type=color]");t.length&&!n()&&t.spectrum({preferredFormat:"hex6"})},It(function(){It.fn.spectrum.load&&It.fn.spectrum.processNativeColorInputs()})});
!function(P,x,Ht){"use strict";var b,o,f,a,Lt={},Mt=P.TMEPOJS,e=P.wp,i=P.TMEPOQTRANSLATEXJS,_=P.noUiSlider,F=P.ClipboardEvent,k=P.DataTransfer,A=[],n=[],h=!1,v=!1,I=Ht("body"),Rt=Ht(P),C=Ht(x),E=Ht(P),D=P.tcmexp,B=P._,O=!1,r=Ht.fn.val;function u(t,i){t.toArray().forEach(function(t){(t=Ht(t)).find(":input").prop("disabled",function(t,e){var a=Ht(this).data("tc-state");return void 0===a?(Ht(this).data("tc-state",e),i):!1===a?i:a})})}function Ut(t,e){var a,i,o,r,c,n=0;return e&&(a=e.attr("data-taxable"),i=e.attr("data-tax-rate"),o=e.attr("data-prices-include-tax")||Mt.prices_include_tax,r=e.attr("data-tax-display-mode"),void 0!==(c=void 0!==e.data("current_variation")?e.data("current_variation"):c))&&(a=(c=e.data("current_variation")).tc_is_taxable,i=c.tc_tax_rate),a&&(i=parseFloat(i/100),"1"===o?n="incl"===r?(t=parseFloat(t))-t/(1+i):t*i:"incl"===r&&(n=t-t/(1+i)),n=Ht.epoAPI.math.toFloat(n)),n}function N(t,e,a,i,o,r,c){var n,l,d,s,p,m,_,f,u;return Number.isFinite(parseFloat(t))||(t=0),t*=1e4,e&&(n=e.attr("data-taxable"),l=e.attr("data-tax-rate"),d=e.attr("data-prices-include-tax")||Mt.prices_include_tax,s=e.attr("data-is-vat-exempt"),p=e.attr("data-non-base-location-prices"),m=e.attr("data-taxes-of-one"),_=e.attr("data-base-taxes-of-one"),f=e.attr("data-modded-taxes-of-one"),void 0!==e.data("current_variation")?u=e.data("current_variation"):void 0!==o&&(u=o),void 0!==u&&(n=(u=e.data("current_variation")).tc_is_taxable,l=u.tc_tax_rate,p=u.tc_non_base_location_prices,m=u.tc_taxes_of_one,_=u.tc_base_taxes_of_one,f=u.tc_modded_taxes_of_one),a&&a.data("tax-obj")&&("no"===(l=a.data("tax-obj")).has_fee?n=!1:"yes"===l.has_fee&&(n=!0),_=m=(l=l.tax_rate)/100),n)&&("1"!==d||i?(a||void 0===u||c)&&(t=parseFloat(t)+parseFloat(t)*m):"1"===s?t="1"===p?parseFloat(t)-m*t:parseFloat(t)-_*t:"1"===p&&(t=parseFloat(t)-_*t+f*t)),t/=1e4}function R(t,e,a,i,o,r,c){var n,l,d,s,p,m,_;return Number.isFinite(parseFloat(t))||(t=0),t*=1e4,e&&(_=e.attr("data-tax-display-mode"),n=e.attr("data-taxable"),l=e.attr("data-tax-rate"),d=e.attr("data-taxes-of-one"),s=e.attr("data-base-taxes-of-one"),p=e.attr("data-prices-include-tax"),void 0!==e.data("current_variation")?m=e.data("current_variation"):void 0!==o&&(m=o),void 0!==m&&(n=m.tc_is_taxable,l=m.tc_tax_rate,d=m.tc_taxes_of_one,s=m.tc_base_taxes_of_one),a&&a.data("tax-obj")&&("no"===(l=a.data("tax-obj")).has_fee?n=!1:"yes"===l.has_fee&&(n=!0),s=(l=l.tax_rate)/100),n)&&("1"===p||i)&&"incl"!==_&&(a||void 0===m||i||c)&&(s===d?t=parseFloat(t)-parseFloat(d*t):t*=1-parseFloat(s)),t/=1e4}function Jt(t,e,a,i,o,r,c){return Number.isFinite(parseFloat(t))||(t=0),t=e?("incl"===(e.attr("data-tax-display-mode")||Mt.tax_display_mode)?N:R)(t,e,a,o,r,0,c):t}function Qt(t,e){e=Ht.extend({symbol:"",format:"",decimal:Lt.localDecimalSeparator,thousand:Lt.localThousandSeparator,precision:Mt.currency_format_num_decimals},e=e||{});return"yes"===Mt.tm_epo_trim_zeros&&"0"!==(t%1).toString()==!1&&(e.precision=0),Ht.epoAPI.applyFilter("tc_formatPrice",Ht.epoAPI.math.format(t,e),e,t)}function l(t,e,a){return e+Qt(t,{symbol:Mt.currency_format_symbol,format:Mt.currency_format})+a}function $t(t,e,a,i,o,r){var c="",n=Mt.option_plus_sign+" ";return a||(t=Jt(t,e,o)),a=Math.abs(t),"minus"===Mt.tm_epo_global_options_price_sign&&(n=""),l(a,n=t<0?Mt.option_minus_sign+" ":n,c=void 0===(c=e&&i?e.attr("data-tax-string"):c)?"":c)}function Zt(t){return 0<t.find("input.variation_id").length?"input.variation_id":"input.product-variation-id"}function Kt(t){var e=t.find(Lt.qtySelector).last();return 0===e.length&&(e=t.find(Lt.associateQtySelector).last()),e=Ht.epoAPI.applyFilter("tc_getQtyElement",e,t)}function d(t,e,a){A[A.length]={name:t,selector:e,func:a}}function q(a,i,o){var r,c=!0,n=!1;return a=Ht(a),(r=a.filter(".tc-epo-field-product")).length&&void 0===r.data("islogicinit")&&(n=!0),a.each(function(t,e){!c&&a.has(".tc-epo-field-product").length?(n||r.is(".tcdisabled"))&&s(e,i,o):c=s(e,i,o)&&c}),c}function s(t,e,a){var i,o,r,c,n,l;return(t=Ht(t)).is(".cpf-element")?t=(i=t).find(".tmcp-field, .tmcp-fee-field"):i=t.closest(".cpf-element"),l=(n=i.closest(".cpf-section")).closest(".tm-extra-product-options-field"),a=a?t.closest(".tmcp-ul-wrap"):i,t.is(".tc-epo-field-product")&&void 0===t.data("islogicinit")&&t.data("islogicinit",1),(o=!t.is(".tc-epo-field-product")&&i.closest(".cpf-type-product")).length&&((c=o.find(Lt.associateQtySelector)).length&&(0<Ht.epoAPI.math.toFloat(c.val())?(t.removeClass("ignore"),c.removeClass("ignore")):(t.addClass("ignore"),c.addClass("ignore"))),c=o.data("isactive"),r=(o=o.closest(".cpf-section")).data("isactive")),!1!==c&&!1!==r&&!1!==i.data("isactive")&&!1!==n.data("isactive")?(o=t.first(),t.prop("disabled",!1),void 0!==t.data("tc-state")&&t.data("tc-state",!1),"yes"!==Mt.tm_epo_show_only_active_quantities?o.is(":radio, .cpf-type-radio")||o.is(":checkbox, .cpf-type-checkbox")?(t.filter(":checked").closest(".tmcp-field-wrap").find(".tm-qty").prop("disabled",!1),t.not(":checked").closest(".tmcp-field-wrap").find(".tm-qty").prop("disabled",!0)):(o.is("select, .cpf-type-select, .cpf-type-selectmultiple"),o.val()?a.find(".tm-qty").prop("disabled",!1):a.find(".tm-qty").prop("disabled",!0)):e||i.find(".tm-quantity").trigger("showhide.cpfcustom"),o.is(".cpf-element")||(t.removeClass("tcdisabled").addClass("tcenabled"),t.is(".tmcp-upload")&&t.next(".tmcp-upload-hidden").length&&t.next(".tmcp-upload-hidden").removeClass("tcdisabled").addClass("tcenabled").prop("disabled",!1)),i.removeClass("tc-container-disabled").addClass("tc-container-enabled"),t.trigger({type:"tm-field-is-active",field:t,value:!0}),n.removeClass("section-disabled"),l.removeClass("tc-hidden"),!0):(t.is(".cpf-element")||(t.prop("disabled",!0).removeClass("tcenabled").addClass("tcdisabled"),void 0!==t.data("tc-state")&&t.data("tc-state",!0),i.find(".tm-qty").prop("disabled",!0),t.is(".tmcp-upload")&&t.next(".tmcp-upload-hidden").length&&t.next(".tmcp-upload-hidden").removeClass("tcenabled").addClass("tcdisabled").prop("disabled",!0)),i.removeClass("tc-container-enabled").addClass("tc-container-disabled"),t.trigger({type:"tm-field-is-active",field:t,value:!1}),0===n.find(".cpf-element.tc-container-enabled").length&&(n.addClass("section-disabled"),0===l.children(".cpf-section").filter(function(){return!Ht(this).hasClass("section-disabled")}).length)&&l.addClass("tc-hidden"),!1)}function S(t,e,a){if(null!==t&&null!==e)switch(t=encodeURIComponent(t),e=Ht.qtranxj_split?encodeURIComponent(Ht.qtranxj_split(decodeURIComponent(e))[i.language]):encodeURIComponent(decodeURIComponent(e)),t=t?t.toLowerCase():"",e=e?e.toLowerCase():"",t=t.toString(),e=e.toString(),a){case"is":return null!==t&&t===e;case"isnot":return null!==t&&t!==e;case"isempty":return!("undefined"!==t&&void 0!==t&&""!==t);case"isnotempty":return"undefined"!==t&&void 0!==t&&""!==t;case"startswith":return t.startsWith(e);case"endswith":return t.endsWith(e);case"greaterthan":return parseFloat(t)>parseFloat(e);case"lessthan":return parseFloat(t)<parseFloat(e);case"greaterthanequal":return parseFloat(t)>=parseFloat(e);case"lessthanequal":return parseFloat(t)<=parseFloat(e)}return!1}function U(t){var a,i,e=Ht(t.element),o=t.operator,r=t.value,c=!1,n="";if(e.length){if(e.is(".cpf-section")){var l,d,s,t=e,p=o,m=t.find(".cpf-element"),_=!1;if(t.is(".tc-hidden")){if("isnotempty"===p)return;if("isempty"===p)return 1}return"isnotempty"===p?l=!1:"isempty"===p&&(l=!0),Ht(m).each(function(t,e){var a,i="";if((e=Ht(e)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),q(e))if(0<(a=e.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(a=a[0])&&(_=!0,a=e.is(".cpf-type-product-mode-product")||e.is(".cpf-type-product-checkbox")||e.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":e.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),a){case"cpf-type-radio":s=e.find("input.tm-epo-field.tmcp-radio:checked"+i),"isnotempty"===p?(l=l||0<s.length,0<s.length&&(d=s.length)):"isempty"===p&&(l=l&&0===s.length);break;case"cpf-type-checkbox":s=e.find("input.tm-epo-field.tmcp-checkbox:checked"+i),"isnotempty"===p?(l=l||0<s.length,0<s.length&&(d=s.length)):"isempty"===p&&(l=l&&0===s.length);break;case"cpf-type-select":(d=e.find("select.tm-epo-field.tmcp-select"+i).val())&&!_&&(d=d.slice(0,d.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(d=e.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!_&&d.forEach(function(t,e){d[e]=t.slice(0,t.lastIndexOf("_"))});break;default:d=e.find(".tm-epo-field"+i).val()}Array.isArray(d)?"isnotempty"===p?l=l||d.some(function(t){return S(t,"",p)}):"isempty"===p&&(l=l&&d.every(function(t){return S(t,"",p)})):"isnotempty"===p?l=l||S(d,"",p):"isempty"===p&&(l=l&&S(d,"",p))}else l=!1}),l}if(e.is(".cpf-type-product")&&(n=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(t=e.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(t=t[0])&&(c=!0,t=e.is(".cpf-type-product-mode-product")||e.is(".cpf-type-product-checkbox")||e.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":e.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),t){case"cpf-type-radio":if(u=e.find("input.tm-epo-field.tmcp-radio:checked"+n),"is"===o||"isnot"===o){if(0===u.length&&"is"===o)return;if(0===u.length&&"isnot"===o)return 1}if("isnotempty"===o)return 0<u.length;if("isempty"===o)return 0===u.length;(a=e.find("input.tm-epo-field.tmcp-radio:checked"+n).val())&&!c&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-checkbox":if(u=e.find("input.tm-epo-field.tmcp-checkbox:checked"+n),"is"===o||"isnot"===o)return(0!==u.length||"is"!==o)&&(0===u.length&&"isnot"===o||(i=!1,u.each(function(t,e){if(S(a=(a=Ht(e).val())&&!c?a.slice(0,a.lastIndexOf("_")):a,r,o))i=!0;else if("isnot"===o)return i=!1}),i));if("isnotempty"===o)return 0<u.length;if("isempty"===o)return 0===u.length;break;case"cpf-type-select":(a=e.find("select.tm-epo-field.tmcp-select"+n).val())&&!c&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=e.find("select.tm-epo-field.tmcp-selectmultiple"+n).val())&&!c&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;case"cpf-type-variations":var f,u=e,h=r,g=o,v=Ht(u),y=v.attr("data-epo_id"),b=v.attr("data-product_id"),w=Ht(".variations_form[data-epo_id='"+y+"'][data-product_id='"+b+"']"),w=Ht.epoAPI.applyFilter("tm_variation_check_match_variationsForm",w,y,b,v);if(0!==w.length)switch(0===(y=w.find("input[name^='variation_id']")).length&&0===(y=w.find("input.variation_id")).length&&(y=w.closest(".tc-epo-element-product-li-container").find(".product-variation-id")),null!==u&&null!==h&&void 0!==u&&void 0!==h&&!1!==u&&!1!==h&&(h=h?parseInt(h,10):-1),f=parseInt(y.val(),10),Number.isFinite(f)||(f=0),Number.isFinite(h)||(h=0),g){case"is":return""!==f&&f===h;case"isnot":return""!==f&&f!==h;case"isempty":return""===f||0===f;case"isnotempty":return""!==f&&0!==f;case"startswith":return f.toString().startsWith(h);case"endswith":return f.toString().endsWith(h);case"greaterthan":return parseFloat(f)>parseFloat(h);case"lessthan":return parseFloat(f)<parseFloat(h);case"greaterthanequal":return parseFloat(f)>=parseFloat(h);case"lessthanequal":return parseFloat(f)<=parseFloat(h)}return;default:a=e.find(".tm-epo-field"+n).val()}return Array.isArray(a)?a.some(function(t){return S(t,r,o)}):S(a,r,o)}}}function c(t,c){t.each(function(){var a=Ht(this),t=a.data("matches"),e=a.data("toggle"),i=a.data("fields"),o=[],r=!1;switch(e){case"show":r=!1;break;case"hide":r=!0}Ht.each(i,function(i,t){Array.isArray(t)&&(o[i]=0,Ht.each(t,function(t,e){var a=!0;(a="cpflogic"===c?q(Ht(e.element)):a)&&U(e)&&(o[i]=parseInt(o[i],10)+1)}))}),Ht.each(t,function(t,e){t=parseInt(o[t],10);if(e=parseInt(e,10),0<t&&e===t)return r=!r,!1}),r?("cpflogic"!==c||a.data("did_initial_activation")||n.push(function(){var t=a.find(".tm-epo-field.tcenabled");t.each(function(t,e){(e=Ht(e)).data("initial_activation")||a.closest(".cpf-section").is(".tc-hidden")||!q(e)||(e.trigger("tc_element_epo_rules"),e.data("initial_activation",1))}),(a.is(".cpf-element")&&t.length||a.is(".cpf-section"))&&a.data("did_initial_activation",1)}),a.removeClass("tc-hidden")):a.addClass("tc-hidden"),a.data("isactive",r),a.trigger("tc-logic")})}function T(t){var e,a=[];Ht(t).length||(t="body"),(e=(t=Ht(t)).find(".iscpfdependson")).each(function(t,e){Ht(e).each(function(t,e){c(Ht(e))})}),e.each(function(t,e){Ht(e).each(function(t,e){c(Ht(e),"cpflogic")})}),e.each(function(t,e){Ht(e).each(function(t,e){(e=(e=Ht(e)).is(".cpf-section")?e.find(".cpf-element"):e).each(function(t,e){q(Ht(e).find(".tm-epo-field"))})})}),n.forEach(function(t){t()}),n=[],Ht().selectric&&Ht(".tm-extra-product-options select").selectric("refresh"),setTimeout(function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})},200),t.find(".tm-product-image:checked,select.tm-product-image").each(function(){var t=Ht(this);q(t)&&""!==t.val()&&a.push(t)}),a.length?a[a.length-1].trigger("tm_trigger_product_image"):(e=t.data("epo_object"))&&e.main_product.trigger("tm_restore_product_image"),Rt.trigger("cpflogicrun"),Rt.trigger("tmlazy"),Rt.trigger("cpflogicdone")}function y(t){return"object"==typeof t&&"toggle"in t&&"rules"in t&&0<t.rules.length}function w(t){return t.what&&("all"===t.what?t.rules=[t.rules]:"any"===t.what&&(t.rules=t.rules.reduce(function(t,e){return t.push([e]),t},[])),delete t.what),t}function J(t){var a,i,o,r,c,n,l,d,s,p,m=Ht(t),t=m.find(".cpf-section"),_=!m.is(".cpf-section")&&t;m.each(function(t,e){(Ht(e).is(".cpf-section")?Ht(e):Ht(e).find(".cpf-section")).filter('[data-haslogic="1"]').each(function(t,e){a=Ht(e),i=w(a.data("logic")),o=parseInt(a.data("haslogic"),10),r=[],p=a.parent().closest(".cpf-type-product"),1===o&&y(i)&&(Ht.each(i.rules,function(a,t){t&&Array.isArray(t)&&(r[a]=[],Ht.each(t,function(t,e){s=e.section,c=e.element,n=e.operator,l=e.value,s=_?p.length?(d=p.find(".cpf-section").filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element").eq(c):d):(d=_.filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element:not(.cpf-element .cpf-element)").eq(c):d):c!==s?m.find(".cpf-element").eq(c):d,r[a].push({element:s,operator:n,value:l})}))}),a.data("iscpfdependson")?a.cpfdependson(a.data("cpfdependson-fields"),i.toggle,!0):(a.data("cpfdependson-fields",r),a.cpfdependson(r,i.toggle)))})})}function Q(t){var a,o,r,c,n,l,d,s,p,m=Ht(t),t=m.find(".cpf-section").not(".cpf-type-product .cpf-section"),_=!m.is(".cpf-section")&&t;m.find('.cpf-element[data-haslogic="1"]').each(function(t,e){var i=[];a=Ht(e),o=w(a.data("logic")),r=parseInt(a.data("haslogic"),10),p=a.parent().closest(".cpf-type-product"),1===r&&y(o)&&(Ht.each(o.rules,function(a,t){t&&Array.isArray(t)&&(i[a]=[],Ht.each(t,function(t,e){s=e.section,c=e.element,n=e.operator,l=e.value,s=_?p.length?(d=p.find(".cpf-section").filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element").eq(c):d):(d=_.filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element:not(.cpf-element .cpf-element)").eq(c):d):c!==s?m.find(".cpf-element").eq(c):d,i[a].push({element:s,operator:n,value:l})}))}),a.data("iscpfdependson")?a.cpfdependson(a.data("cpfdependson-fields"),o.toggle,!0):(a.data("cpfdependson-fields",i),a.cpfdependson(i,o.toggle)))})}function $(t,e,a){var i,o,r;return t=e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-rate"),r=e.attr("data-tax-display-mode"),e=e.attr("data-prices-include-tax"),a||i&&"incl"===r&&"1"!==e)?parseFloat(t)/(1+o/100):t}function p(t,e,a){var i,o,r;return t=e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-rate"),r=e.attr("data-tax-display-mode"),e=e.attr("data-prices-include-tax"),a||i&&"incl"!==r&&"1"===e)?parseFloat(t)*(1+o/100):t}function Z(t,e,a){var i,o,r;if(e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-display-mode"),r=e.attr("data-prices-include-tax"),i)){if(a&&a.tc_tax_rate&&"0"===String(a.tc_tax_rate))return t;"1"===r?"incl"===o?a.tc_base_taxes_of_one!==a.tc_modded_taxes_of_one&&(t=parseFloat((1-a.tc_taxes_of_one)*t*(1/(1-a.tc_base_taxes_of_one)))):t=p(t,e):"1"!==r&&"incl"===o&&(t=$(t,e))}return t}function Wt(t,e,a,i,o){var r="",c="";return a||(t=Jt(t,e,o,0,!0)),a=Math.abs(t),e&&i&&(r=e.attr("data-tax-string")),l(a,c=t<0?Mt.minus_sign+" ":c,r=void 0===r?"":r)}function Xt(t,e,a,i){return"excl"===i.attr("data-tax-display-mode")?(a[t]=a[t].replace(/{price_excluding_tax}/g,Wt(a[e],i,!0,!1)),a[t]=a[t].replace(/{price_including_tax}/g,Wt(p(a[e],i,!0),i,!0,!1))):(a[t]=a[t].replace(/{price_including_tax}/g,Wt(a[e],i,!0,!1)),a[t]=a[t].replace(/{price_excluding_tax}/g,Wt($(a[e],i,!0),i,!0,!1))),a}function te(t,e,a,i,o){H(t,e,a,i,o,!0)}function H(t,e,a,i,o,r){var c,n,l,t=Ht(t);0!==t.length&&(c=t.closest(".tmcp-field-wrap"),l=t.closest(".tc-price-wrap"),n=c.find(".tm-epo-field"),r||"1"!==n.attr("data-no-price-change")||!n.data("price-changed"))&&(e=Ht.epoAPI.applyFilter("tc_adjust_update_price_price",e),a=Ht.epoAPI.applyFilter("tc_adjust_update_price_formated_price",a,e),i=Ht.epoAPI.applyFilter("tc_adjust_update_price_original_price",i),o=Ht.epoAPI.applyFilter("tc_adjust_update_price_original_formated_price",o,i),Number.isFinite(parseFloat(i))||(i=0),Number.isFinite(parseFloat(e))||(e=0),c=c.find(".before-amount,.after-amount"),a={price:a,original_price:o},("yes"!==Mt.tm_epo_auto_hide_price_if_zero||!1!==Ht.tmempty(e)&&("yes"!==Mt.tm_epo_no_hide_price_if_original_not_zero||!0!==Ht.tmempty(e)||!1!==Ht.tmempty(i)))&&"yes"===Mt.tm_epo_auto_hide_price_if_zero||!0===Ht.tmempty(e)&&"1"===n.attr("data-no-price")||!r&&0<n.length&&("1"===n.attr("data-no-price")||"variable"===n.attr("data-type")&&!n.data("price"))?(l.addClass("tm-hidden"),t.addClass("tm-hidden"),t.empty(),c.addClass("tm-hidden")):(i&&void 0!==i&&parseFloat(i)!==parseFloat(e)?t.html(Ht.epoAPI.template.html(Lt.templateEngine.sale_price,{price:a})):t.html(Ht.epoAPI.template.html(Lt.templateEngine.price,{price:a})),l.removeClass("tm-hidden"),t.removeClass("tm-hidden"),c.removeClass("tm-hidden")))}function m(i,l,t){var e,a,d=[],s=(e=i,a={},(e=(t=t).thisForm?t.thisForm:e).find(".variations select, .tc-epo-variable-product-selector").each(function(){var t=void 0!==Ht(this).data("attribute_name")?Ht(this).data("attribute_name"):Ht(this).attr("name"),e=Ht(this).val();a[t]=e}),a),o=!0,t=i.find(Zt(i)).val();("0"!==t&&""!==t||0<i.find(".cpf-type-variations").find(".tm-epo-variation-element:checked").length||i.find(".cpf-type-variations").find('.tm-epo-variation-element option[value!=""]:selected'))&&(i.find(".cpf-type-variations").each(function(r,t){var c,n,t=Ht(t).find(".tm-epo-variation-element"),a=!1;d[r]=!0,t.is("select")?(c=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),(n=t.val())&&(d[r]=!1),t.children("option").each(function(t,e){a=!1,i.find("[data-attribute_name='attribute_"+c+"']").children("option").each(function(){if(Ht(this).attr("value")===Ht(e).attr("value"))return!(a=!0)}),a?Ht(e).prop("disabled",!1).show():Ht(e).prop("disabled",!0).hide()})):t.each(function(t,e){var e=Ht(e),a=e.closest("li"),i=a.find(".tm-epo-variation-element"),o=Ht.extend(!0,{},s);c=e.attr("data-tm-for-variation"),n=e.val(),e.is(":checked")&&(d[r]=!1),o["attribute_"+c]=n,(o=(o=Ht.fn.tm_find_matching_variations(l,o).shift())&&"is_in_stock"in o&&o.is_in_stock)?(e.prop("disabled",!1).removeClass("tm-disabled"),a.removeClass("pointereventsoff tm-attribute-disabled").fadeTo("fast",1,function(){Ht(this).css("opacity","")}),i.prop("disabled",!1),i.removeAttr("data-tm-disabled")):(i.is(":checked")||o?a.removeClass("pointereventsoff"):a.addClass("pointereventsoff"),e.attr("disabled","disabled").addClass("tm-disabled"),i.attr("disabled","disabled"),i.attr("data-tm-disabled","disabled"),a.addClass("tm-attribute-disabled").fadeTo("fast",.5))})}),d)&&(d.shift(),Ht.each(d,function(t,e){if(!1===e)return o=!1}),o)&&i.find(".cpf-type-variations").first().each(function(t,e){var a,i,e=Ht(e).find(".tm-epo-variation-element");e.is("select")||e.each(function(t,e){e=Ht(e),a=e.closest("li"),i=a.find(".tm-epo-variation-element"),e.prop("disabled",!1).removeClass("tm-disabled"),a.removeClass("tm-attribute-disabled").stop().css("opacity",""),i.prop("disabled",!1),i.removeAttr("data-tm-disabled")})})}function W(e,a){var t=e.data("product_variations"),i=parseInt(e.data("product_id"),10),o=e.data("globalVariationObject")||!1;!(i=i||e.data("tc_product_id"))&&e.is(Lt.compositeSelector)&&(i=e.find(".component_options").data("options_data")[0].option_id,t=t||e.find(".details.component_data").data("product_variations")),a.is_associated||!(t=!(t=!t&&P.product_variations&&P.product_variations.product_id?P.product_variations.product_id:t)&&P.product_variations?P.product_variations:t)&&P["product_variations_"+i]&&(t=P["product_variations_"+i]),t?m(e,t,a):o?m(e,o.variations,a):Ht.post(Mt.ajax_url,{action:"woocommerce_tm_get_variations_array",post_id:i},function(t){o=t,e.data("globalVariationObject",t),m(e,o.variations,a)},"json")}function X(t,e){var a,i,o,r;"no"!==Mt.tm_epo_global_move_out_of_stock&&((r=(r=t.find(".woocommerce-variation-availability").last()).length?r:t.find(".stock").last()).length?(e.find(".tm-stock").remove(),t=e,void 0!==(a=r.prop("outerHTML"))&&(o=(i=(t=Ht(t)).find(".tm-epo-variation-element").first()).closest(".tm-epo-variation-section"),i.length?(o.find(".tm-stock").remove(),o.append('<div class="tm-stock">'+a+"</div>")):(t.find(".tm-stock").remove(),t.find(".variations").after('<div class="tm-stock">'+a+"</div>")),1)&&r.remove()):e.find(".tm-stock").remove())}function G(t,e,a,i){return a=a||"form",t=t,i=i,o="",(t=0===(t=(e=(e=e)||t).find(Lt.addToCartSelector+(o=i?o+"[value='"+i+"']":o))).length?e.find(Lt.tcAddToCartSelector+o):t).last().closest(a);var o}function V(t,e,a,i){return G(t,e,a,i)}function Gt(t){var e=Ht.epoAPI.applyFilter("tcGetNativePricesBlockSelector",".single_variation .price",t);return Ht(t).find(e).not(".tc-price")}function ee(t,e){var a,i,o=e.showHideCart;e.is_associated||void 0===o||"yes"!==Mt.tm_epo_hide_add_cart_button&&"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_required_add_cart_button||(a=t.find(Lt.addToCartButtonSelector).first(),i=t.find(Lt.qtySelector).first(),o?(a.removeClass("tc-hide-add-to-cart-button"),i.removeClass("tc-hide-add-to-cart-button")):(a.addClass("tc-hide-add-to-cart-button"),i.addClass("tc-hide-add-to-cart-button")),Rt.trigger("epoShowHideCart",{main_product:t,currentEpoObject:e,showHideCart:o,button:a,qty:i}))}function ae(t,e,a){var i,o,r,c=!0,n=!0,l=Ht.tcepo.oneOptionIsSelected[e];return t.is_associated||(i="object"==typeof a?(i=a.has_epo,o=a.this_epo_container,i&&(o.find(".tmcp-fee-field").length||o.find(".tmcp-field").not(".cpf-type-variations .tmcp-field").length)):a,t.showHideCart=void 0,t.showHideTotal=void 0,!i)||"yes"!==Mt.tm_epo_hide_add_cart_button&&"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_required_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_any&&"yes"!==Mt.tm_epo_hide_totals_until_all_required&&"yes"!==Mt.tm_epo_hide_totals_until_all||("yes"===Mt.tm_epo_hide_add_cart_button&&(c=l),"yes"===Mt.tm_epo_hide_totals_until_any&&(n=l),"yes"!==Mt.tm_epo_hide_required_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_all_required||(r=t.this_epo_container.find(".cpf-element").not(".cpf-type-variations").filter(".tc-container-enabled.tc-is-required").toArray().every(function(t){var e,a,i="",o=!1;if((t=Ht(t)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(e=t.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(e=e[0])&&(o=!0,e=t.is(".cpf-type-product-mode-product")||t.is(".cpf-type-product-checkbox")||t.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":t.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),e){case"cpf-type-radio":return 0<t.find("input.tm-epo-field.tmcp-radio:checked"+i).length;case"cpf-type-checkbox":return 0<t.find("input.tm-epo-field.tmcp-checkbox:checked"+i).length;case"cpf-type-select":(a=t.find("select.tm-epo-field.tmcp-select"+i).val())&&!o&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=t.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!o&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;default:a=t.find(".tm-epo-field"+i).val()}return Array.isArray(a)?a.some(function(t){return""!==t}):""!==a}return!1}),"yes"===Mt.tm_epo_hide_required_add_cart_button&&(c=r),"yes"===Mt.tm_epo_hide_totals_until_all_required&&(n=r)),"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_all||(r=t.this_epo_container.find(".cpf-element").not(".cpf-type-variations").filter(".tc-container-enabled").toArray().every(function(t){var e,a,i="",o=!1;if((t=Ht(t)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(e=t.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(e=e[0])&&(o=!0,e=t.is(".cpf-type-product-mode-product")||t.is(".cpf-type-product-checkbox")||t.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":t.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),e){case"cpf-type-radio":return 0<t.find("input.tm-epo-field.tmcp-radio:checked"+i).length;case"cpf-type-checkbox":return 0<t.find("input.tm-epo-field.tmcp-checkbox:checked"+i).length;case"cpf-type-select":(a=t.find("select.tm-epo-field.tmcp-select"+i).val())&&!o&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=t.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!o&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;default:a=t.find(".tm-epo-field"+i).val()}return Array.isArray(a)?a.some(function(t){return""!==t}):""!==a}return!1}),"yes"===Mt.tm_epo_hide_all_add_cart_button&&(c=r),"yes"===Mt.tm_epo_hide_totals_until_all&&(n=r)),t.showHideCart=c,t.showHideTotal=n,Ht.tcepo.showHideTotal[e]=n),t}function Y(t,e){var a,i,o,r,c=Ht.tcepo.errorObject[e]||t;c&&("yes"!==Mt.tm_epo_disable_error_scroll&&(i=(a=c.closest(".cpf-section")).find(".tm-section-link"),o=c.closest(".cpf-element"),a.find(".tm-toggle").length&&a.find(".tm-toggle").trigger("openwrap.tmtoggle"),void 0===P.tc_validation_offset&&(P.tc_validation_offset=-100),a.is(".section_popup")?(E.tcScrollTo(i,300,P.tc_validation_offset),i.trigger("click.tmsectionpoplink")):a.is(".tm-owl-slider-section")?(r=c.closest(".owl-item").index(),a.find(".tcowl-carousel").trigger("to.owl.carousel",[r,100]),setTimeout(function(){a.find(".tcowl-carousel").trigger("refresh.owl.carousel"),0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)},200)):a.is(".tc-tabs-section")?(r=c.closest(".tc-tab-slide").index(),c.closest(".tc-tabs").find('.tc-tab-headers .tc-tab-header .tab-header[data-id="tc-tab-slide'+r+'"]').trigger("click.tmtabs"),setTimeout(function(){0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)},200)):0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)),t||(Ht.tcepo.errorObject[e]=!1))}function K(t,e){var a,i=parseInt(t.attr("data-limit"),10),o=!1;return!(0<i&&(o=0,t.closest(".tm-extra-product-options-checkbox").find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),o=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(o,10)+a):parseInt(o,10)+1}),i<o)&&(e&&t.prop("checked","").trigger("change"),1))}function tt(t,e){var a,i=parseInt(t.attr("data-exactlimit"),10),o=!1;return!(0<i&&(o=0,t.closest(".tm-extra-product-options-checkbox").find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),o=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(o,10)+a):parseInt(o,10)+1}),i<o)&&(e&&t.prop("checked","").trigger("change"),1))}function et(d,s,p){Ht.tcepo.formSubmitEvents[p][Ht.tcepo.formSubmitEvents[p].length]={trigger:function(){return t=s,e=p,l=!(n=!0),d.each(function(){c=Ht(this),(r=c.find("[type='checkbox'][data-limit]")).length&&q(r)&&(r=parseInt(r.attr("data-limit"),10),a=0,c.find("input.tm-epo-field[type='checkbox']:checked").each(function(){i=Ht(this),i=i.closest("li.tmcp-field-wrap").find("input.tm-qty"),a=0<i.length?((i=parseInt(i.val(),10))<=0&&(i=1),parseInt(a,10)+i):parseInt(a,10)+1}),o=c.closest(".cpf-element"),o=o.find("div.tm-error-min"),r<a?(n=!1,l=c,r=(1===r?Mt.tm_epo_global_validator_messages.epolimitsingle:Mt.tm_epo_global_validator_messages.epolimit).replace("{0}",r),o.length&&o.remove(),"before"===Mt.tm_epo_global_error_label_placement?c.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"):c.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"),t.find(Lt.addToCartButtonSelector).first().removeClass("disabled loading fpd-disabled").prop("disabled",!1)):o.remove())}),l&&(Ht.tcepo.errorObject[e]=l),n;var t,e,a,i,o,r,c,n,l},on_true:function(){return!0},on_false:function(){return Y(Ht(d).find(".tm-epo-field").first(),p),!0}}}function at(d,s,p){Ht.tcepo.formSubmitEvents[p][Ht.tcepo.formSubmitEvents[p].length]={trigger:function(){return t=s,e=p,l=!(n=!0),d.each(function(){c=Ht(this),(r=c.find("[type='checkbox'][data-exactlimit]")).length&&q(r)&&(r=parseInt(r.attr("data-exactlimit"),10),a=0,c.find("input.tm-epo-field[type='checkbox']:checked").each(function(){i=Ht(this),i=i.closest("li.tmcp-field-wrap").find("input.tm-qty"),a=0<i.length?((i=parseInt(i.val(),10))<=0&&(i=1),parseInt(a,10)+i):parseInt(a,10)+1}),o=c.closest(".cpf-element"),o=o.find("div.tm-error-min"),r!==a?(n=!1,l=c,r=(1===r?Mt.tm_epo_global_validator_messages.epoexactsingle:Mt.tm_epo_global_validator_messages.epoexact).replace("{0}",r),o.length&&o.remove(),"before"===Mt.tm_epo_global_error_label_placement?c.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"):c.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"),t.find(Lt.addToCartButtonSelector).first().removeClass("disabled loading fpd-disabled").prop("disabled",!1)):o.remove())}),l&&(Ht.tcepo.errorObject[e]=l),n;var t,e,a,i,o,r,c,n,l},on_true:function(){return!0},on_false:function(){return Y(Ht(d).find(".tm-epo-field").first(),p),!0}}}function it(l,d){Ht.tcepo.formSubmitEvents[d][Ht.tcepo.formSubmitEvents[d].length]={trigger:function(){return t=d,n=!(c=!0),l.each(function(){var t;(t=(r=Ht(this)).find("[type='checkbox'][data-minimumlimit]")).length&&q(t)&&(o=parseInt(t.attr("data-minimumlimit"),10),e=0,r.find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),e=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(e,10)+a):parseInt(e,10)+1}),i=r.closest(".cpf-element"),i=i.find("div.tm-error-min"),e<o?(c=!1,n=r,o=(1===o?Mt.tm_epo_global_validator_messages.epominsingle:Mt.tm_epo_global_validator_messages.epomin).replace("{0}",o),i.length&&i.remove(),"before"===Mt.tm_epo_global_error_label_placement?r.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+o+"</div>"):r.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+o+"</div>")):i.remove())}),n&&(Ht.tcepo.errorObject[t]=n),c;var t,e,a,i,o,r,c,n},on_true:function(){return!0},on_false:function(){return Y(!1,d),!0}}}function ot(t){return null!==t&&("object"==typeof t&&(t=t[0]),Number.isFinite(parseFloat(t)))?t:0}function L(t,e,a,i){return t=ot(t),t=a?Ht.epoAPI.applyFilter("tc_apply_dpd",t,e,a,i):t}function ie(t,e){var a=0;return 0<t.length&&(a=t.data("regular-price")),a=Ht.epoAPI.applyFilter("tc_calculate_product_regular_price",a,t),(!e||!1!==a)&&(a=parseFloat(a),Number.isFinite(a)?a:0)}function oe(t,e){var a=0;return 0<t.length&&(a=t.data("price")),a=Ht.epoAPI.applyFilter("tc_calculate_product_price",a,t),(!e||!1!==a)&&(a=parseFloat(a),Number.isFinite(a)?a:0)}function rt(e,a,i,o,t,r,c,n){var l,d,s,p,m,_,f,u,h,g=e.toString(),v=0,e=0,y=a.closest(".cpf-element").attr("data-uniqid"),b=a.closest(".tmcp-ul-wrap"),w=i.this_epo_totals_container.data("totalsHolder_tc_totals_ob"),x=b.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field").filter(":checked").index(a),F=b.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field").index(a),k=i.is_associated?i.this_epo_container:i.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),A=Ht.epoAPI.util.parseJSON(Mt.tm_epo_math)||{};-1===x&&a.is(".tmcp-checkbox, .tmcp-radio"),-1!==F||a.is(".tmcp-checkbox, .tmcp-radio")||(F=0),a.is(".tcdisabled")||o||a.data("addedtcEpoBeforeOptionPriceCalculation")||(Rt.on("tcEpoBeforeOptionPriceCalculation.math"+y,function(){Vt(i,a,void 0,void 0,void 0,!0)}),Rt.on("tcEpoAfterNormalOptionPriceCalculation.math"+y,function(){a.data("fetchOptionPrices",!1),a.data("fetchOptionPrices-forced",!1),a.data("fetchOptionPrices-fee",!1),a.data("fetchOptionPrices-fee-forced",!1),a.data("fetchOptionPrices-sub-fee",!1),a.data("fetchOptionPrices-sub-fee-forced",!1)}),a.data("addedtcEpoBeforeOptionPriceCalculation",1)),a.is(".tmcp-field")?a.data("fetchOptionPrices")?(_=a.data("fetchOptionPrices"),f=a.data("fetchOptionPrices-forced")):(_=Yt(i,b,".tmcp-field",0,0,[],!0),f=Yt(i,b,".tmcp-field",0,0,[],!0,!0),a.data("fetchOptionPrices",_),a.data("fetchOptionPrices-forced",f)):a.is(".tmcp-fee-field")?a.data("fetchOptionPrices-fee")?(_=a.data("fetchOptionPrices-fee"),f=a.data("fetchOptionPrices-fee-forced")):(_=Yt(i,b,".tmcp-fee-field",0,0,[],!0),f=Yt(i,b,".tmcp-fee-field",0,0,[],!0,!0),a.data("fetchOptionPrices-fee",_),a.data("fetchOptionPrices-fee-forced",f)):a.is(".tmcp-sub-fee-field")&&(a.data("fetchOptionPrices-sub-fee")?(_=a.data("fetchOptionPrices-sub-fee"),f=a.data("fetchOptionPrices-sub-fee-forced")):(_=Yt(i,b,".tmcp-sub-fee-field",0,0,[],!0),f=Yt(i,b,".tmcp-sub-fee-field",0,0,[],!0,!0),a.data("fetchOptionPrices-sub-fee",_),a.data("fetchOptionPrices-sub-fee-forced",f))),Object.keys(A).forEach(function(t){var e,a;""!==A[t].name&&""!==A[t].value&&(e=A[t].name,a=A[t].value,g=e.startsWith("{")?g.replace(e,a):A[t].name.isNumeric()?g.replace("{"+e+"}",a):(e=new RegExp("{"+e+"}","g"),a.startsWith("{")?g.replace(e,a):g.replace(e,Ht.epoAPI.math.unformat(a.replace(",",".")))))}),x=void 0!==w?(g=g.replace(/{quantity}/g,Ht.epoAPI.math.unformat(w.qty)),u=t&&void 0!==w.original_product_price?Ht.epoAPI.math.unformat(w.original_product_price):Ht.epoAPI.math.unformat(w.product_price),void 0!==w.dynamic_product_price?Ht.epoAPI.math.unformat(w.dynamic_product_price):0):(g=g.replace(/{quantity}/g,0),u=0),u=Ht.epoAPI.math.toFloat(u),g=(g=g.replace(/{product_price}/g,u)).replace(/{dynamic_product_price}/g,x),r=Ht.epoAPI.math.toFloat(r=r||0),c=Ht.epoAPI.math.toFloat(c=c||0),g=(g=(g=(g=g.replace(/{options_total}/g,r)).replace(/{product_price_plus_options_total}/g,u+r)).replace(/{cumulative_total}/g,c)).replace(/{product_price_plus_cumulative_total}/g,u+c),(g=(g=void 0!==f.floatingBoxData&&void 0!==f.floatingBoxData[F]?(g=(g=(g="number"===f.floatingBoxData[F].input_type||"hidden"===f.floatingBoxData[F].input_type?g.replace(/{this.value}/g,Ht.epoAPI.math.toFloat(Ht.epoAPI.math.unformat(f.floatingBoxData[F].valueText))):g.replace(/{this.value}/g,Ht.epoAPI.math.toFloat(Ht.epoAPI.math.unformat(f.floatingBoxData[F].valueText,Lt.localDecimalSeparator)))).replace(/{this.rawvalue}/g,f.floatingBoxData[F].valueText)).replace(/{this.text}/g,f.floatingBoxData[F].valueText)).replace(/{this.value.length}/g,f.floatingBoxData[F].valueText.length):g.replace(/{this.value}/g,0).replace(/{this.rawvalue}/g,"").replace(/{this.text}/g,"").replace(/{this.value.length}/g,0)).replace(/{this.count}/g,_.floatingBoxData.length).replace(/{this.count.quantity}/g,_.floatingBoxData.map(function(t){return t.quantity}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},0)).replace(/{this.quantity}/g,a.data("tm-quantity"))).match(/\{(\s)*?field\.([^}]*)}/)&&g.match(/\{(\s)*?field\.([^}]*)}/g).forEach(function(t){if(void 0!==(l=t.match(/\{(\s)*?field\.([^}]*)}/))[2]&&"string"==typeof l[2]&&-1!==(s=l[2].indexOf(".",l[2].indexOf(".")+1))&&(m=l[2].substring(0,s),p=l[2].substring(s+1),-1!==Ht.inArray(p,["price","value","value.length","rawvalue","text","text.length","quantity","count","count.quantity"]))){if((s=k.find("[data-uniqid='"+Ht.epoAPI.util.escapeSelector(m)+"']")).length){switch(m=s.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field"),d=m.first(),a.is(".tcdisabled")||o||a.data("addedfieldtcEpoBeforeOptionPriceCalculation")||(Rt.on("tcEpoBeforeOptionPriceCalculation.math"+y,function(){Vt(i,a,void 0,void 0,void 0,!0),a.trigger("tm-math-select-change-html-all")}),a.data("addedfieldtcEpoBeforeOptionPriceCalculation",1)),v=0,p){case"text":case"rawvalue":v=""}if(s.is(".tc-container-enabled")){switch(n||m.toArray().forEach(function(t){t=Ht(t),a.attr("id")!==t.attr("id")&&(a.is(".tmcp-dynamic")||t.is(".tmcp-dynamic"))&&Vt(i,t,void 0,void 0,void 0,!0,void 0,void 0,!0),o||t.data("addedmathevent")||(t.on("input.mathevent",function(){a.is(".tcdisabled")||a.trigger("change.cpf",{calculateMatcPrice:1})}),t.data("addedmathevent",1))}),d.is(".tmcp-field")?v=Yt(i,s,".tmcp-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0):d.is(".tmcp-fee-field")?v=Yt(i,s,".tmcp-fee-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0):d.is(".tmcp-sub-fee-field")&&(v=Yt(i,s,".tmcp-sub-fee-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0)),p){case"price":v=v.total,a.is(".tmcp-dynamic")&&(h=re(i,d,"price"),"math"===re(i,d,"price_type"))&&h.includes("{dynamic_product_price}")&&(v=0);break;case"value":case"text":case"rawvalue":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return"number"===t.input_type||"hidden"===t.input_type?"text"===p||"rawvalue"===p?t.valueText:Ht.epoAPI.math.unformat(t.valueText):"text"===p||"rawvalue"===p?t.valueText:Ht.epoAPI.math.unformat(t.valueText,Lt.localInputDecimalSeparator)}).reduce(function(t,e){return"text"===p||"rawvalue"===p?t+e:Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},"text"===p||"rawvalue"===p?"":0),"text"!==p&&"rawvalue"!==p||(""===v?v="''":v.toString().isNumeric()||(v="'"+v.replace("'","\\'")+"'")));break;case"value.length":case"text.length":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return t.valueText}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+e.length},0));break;case"quantity":case"count.quantity":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return t.quantity}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},0));break;case"count":v.floatingBoxData&&(v=v.floatingBoxData.length)}"text"!==p&&"rawvalue"!==p&&(v=Ht.epoAPI.math.toFloat(v),Number.isFinite(v)||(v=0))}}else switch(v=0,p){case"text":case"rawvalue":v=""}m=new RegExp(l[0]),g="text"===p||"rawvalue"===p?""===v?g.replace(m,"''"):g.replace(m,v):Number.isFinite(v)?g.replace(m,v):g.replace(m,"'"+v.replace("'","\\'")+"'")}});try{e=D.evaluate(g)}catch(t){e=0}return e}function re(t,e,a){var i,o,r,c,e=Ht(e),n=e,t=t.main_cart,l="input[name^='variation_id']";return 0<t.find("input.variation_id").length&&(l="input.variation_id"),t=(t=t.find(l).val())||0,e.is("select")&&(n=e.find("option:selected")),l=Ht.epoAPI.util.parseJSON(n.attr("data-rules")),n=Ht.epoAPI.util.parseJSON(n.attr("data-rulestype")),o="","object"==typeof l?(c=t in l?l[t]:"object"==typeof(c=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-rules")))&&t in c?c[t]:l[0],"object"==typeof n?o=t in n?n[t]:"object"==typeof(i=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-rulestype")))&&t in i?i[t]:n[0]:"object"==typeof(n=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-ulestype")))&&(o=t in n?n[t]:n[0])):(r=e.closest(".tmcp-ul-wrap"),"object"==typeof(l=Ht.epoAPI.util.parseJSON(r.attr("data-rules")))&&(c=t in l?l[t]:l[0],"object"==typeof n?o=t in n?n[t]:"object"==typeof(i=Ht.epoAPI.util.parseJSON(r.attr("data-rulestype")))&&t in i?i[t]:n[0]:"object"==typeof(n=Ht.epoAPI.util.parseJSON(r.attr("data-rulestype")))&&(o=t in n?n[t]:n[0]))),"object"==typeof c&&(c=c[0]),"object"==typeof o&&(o=o[0]),e.is(".tmcp-fee-field")&&-1!==Ht.inArray(o,["fee","stepfee","currentstepfee"])&&(o=""),"price"===a?c:o}function M(t){for(var e,a=new RegExp(/[\p{L}\d!@#$%^&*()_+=\{[\}\]|\\"':;?/>.<,-]+/,"gu"),i=0;null!==(e=a.exec(t));)e.index===a.lastIndex&&a.lastIndex++,i+=e.length;return i}function Vt(e,t,a,i,D,B,o,r,c){var n,l,d,s,p,m,_,f,u,h,g,v,y,b,w,x,F,k,A,P,I,C,E,q=Ht(t),t=q,S=q.is(".tmcp-range"),N=e.main_product,T=e.epoEventId,j=!0,O=0,z=0;q.data("associated_price_set")||(a?(n=a.cart,l=a.current_variation,d=a.bundleid,s=a.epoTotalsContainer,m=a.product_price,_=a.product_original_price,p=a.apply_dpd,j=a.per_product_pricing):(void 0!==(n=e.main_cart).data("per_product_pricing")&&(j=n.data("per_product_pricing")),a="input[name^='variation_id']",0<n.find("input.variation_id").length&&(a="input.variation_id"),l=n.find(a).val(),d=Ht.epoAPI.applyFilter("tc_get_bundleid",n.attr("data-product_id"),n,e),l=l||0,s=Ht.epoAPI.applyFilter("tc_get_totals_container",e.this_epo_totals_container,q,N,d),m=oe(s),_=ie(s),p=s.data("fields-price-rules")),m=Ht.epoAPI.applyFilter("tc_alter_product_price",m,q,n,s,d),_=Ht.epoAPI.applyFilter("tc_alter_product_original_price",_,q,n,s),!1!==m&&j&&(q.is("select")&&(t=q.find("option:selected")),(t=i?i:t).toArray().forEach(function(t){switch(t=Ht(t),E=Ht.epoAPI.util.parseJSON(t.attr("data-rules")),y=Ht.epoAPI.util.parseJSON(t.attr("data-rulestype")),v=Ht.epoAPI.util.parseJSON(t.attr("data-original-rules")),q.is(".tmcp-dynamic")&&(E=Ht.epoAPI.util.parseJSON(t.attr("data-formula")),v=Ht.epoAPI.util.parseJSON(t.attr("data-formula")),y=Ht.epoAPI.util.parseJSON(t.attr("data-calculation-type"))),void 0===v&&(v=E),u="","object"==typeof E?(g=l in E?(h=E[l],v[l]):(k=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-rules")),P=q.closest(".tmcp-ul-wrap").data("original-rules"),h="object"==typeof k&&l in k?k[l]:E[0],"object"==typeof P&&l in P?P[l]:v[0]),"object"==typeof y?u=l in y?y[l]:"object"==typeof(f=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-rulestype")))&&l in f?f[l]:y[0]:"object"==typeof(y=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-ulestype")))&&(u=l in y?y[l]:y[0])):(k=q.closest(".tmcp-ul-wrap"),E=Ht.epoAPI.util.parseJSON(k.attr("data-rules")),v=Ht.epoAPI.util.parseJSON(k.attr("data-original-rules")),"object"==typeof E&&(h=l in E?E[l]:E[0],g="object"==typeof v?l in v?v[l]:v[0]:h,"object"==typeof y?u=l in y?y[l]:"object"==typeof(f=Ht.epoAPI.util.parseJSON(k.attr("data-rulestype")))&&l in f?f[l]:y[0]:"object"==typeof(y=Ht.epoAPI.util.parseJSON(k.attr("data-rulestype")))&&(u=l in y?y[l]:y[0]))),"object"==typeof u&&(u=u[0]),q.is(".tmcp-fee-field")&&(-1!==Ht.inArray(u,["fee","stepfee","currentstepfee"])&&(u=""),p=0),void 0===D&&(q.is("select")?q.find("option"):t).removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),"math"!==u?(h=ot(h),g=ot(g)):"object"==typeof h&&(h=h[0]),P=h,E=g,u){case"":h=L(I=h,s,p);break;case"math":h=rt(h,q,e,B,Ht.epoAPI.applyFilter("tc_use_undiscounted_price",void 0,q,n,s),o,r,c),h=L(I=h,s,p),g=rt(g,q,e,!0,!0,o,r,c);break;case"percent_cart_total":A=parseFloat(Mt.cart_total),Number.isFinite(A)||(A=0),I=h/100*A,h=L(h,s,p)/100*A,g=L(g,s,p)/100*A;break;case"percent":I=h/100*m,h=L(h,s,p)/100*m,g=g/100*_;break;case"percentcurrenttotal":Ht.tcepo.lateFieldsPrices[T].push({setter:t,price:h,original_price:g,bundleid:d,pricetype:u}),t.data("tm-price-for-late",h).data("tm-original-price-for-late",g).data("islate",1).addClass("tm-epo-late-field"),g=h=I=0;break;case"fixedcurrenttotal":h=L(h,s,p),Ht.tcepo.lateFieldsPrices[T].push({setter:t,price:h,original_price:g,bundleid:d,pricetype:u}),t.data("tm-price-for-late",h).data("tm-original-price-for-late",g).data("islate",1).addClass("tm-epo-late-field"),g=h=I=0;break;case"word":I=h*M(t.val()),h=L(h,s,p)*M(t.val()),g*=M(t.val());break;case"wordpercent":I=h/100*m*M(t.val()),h=L(h,s,p)/100*m*M(t.val()),g=g/100*_*M(t.val());break;case"wordnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=M(t.val())-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"wordpercentnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=M(t.val())-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"char":I=h*t.val().length,h=L(h,s,p)*t.val().length,g*=t.val().length;break;case"charpercent":I=h/100*m*t.val().length,h=L(h,s,p)/100*m*t.val().length,g=g/100*_*t.val().length;break;case"charnospaces":I=h*t.val().replace(/\s/g,"").length,h=L(h,s,p)*t.val().replace(/\s/g,"").length,g*=t.val().replace(/\s/g,"").length;break;case"charnofirst":x=t.val().length-1,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().length-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charpercentnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().length-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"charnonnospaces":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().replace(/\s/g,"").length-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charpercentnonnospaces":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().replace(/\s/g,"").length-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"charpercentnofirst":x=t.val().length-1,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"step":h=S?(I=h*t.val(),L(h,s,p)*t.val()):(I=h*Ht.epoAPI.math.toFloat(t.val()),L(h,s,p)*Ht.epoAPI.math.toFloat(t.val())),g*=Ht.epoAPI.math.toFloat(t.val());break;case"currentstep":g=S?(I=t.val(),h=L(t.val(),s,p),L(t.val(),s,p)):(I=Ht.epoAPI.math.toFloat(t.val()),h=L(Ht.epoAPI.math.toFloat(t.val()),s,p),L(Ht.epoAPI.math.toFloat(t.val()),s,p));break;case"intervalstep":S&&(A=parseFloat(Ht('.tm-range-picker[data-field-id="'+t.attr("id")+'"]').attr("data-min")),I=h*(t.val()-A),h=L(h,s,p)*(t.val()-A),g*=t.val()-A);break;case"row":I=h*((t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1),h=L(h,s,p)*((t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1),g*=(t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1}v=h,P=I,E=C=y=g,q.data("tm-quantity")&&(I*=parseFloat(q.data("tm-quantity")),C*=parseFloat(q.data("tm-quantity")),P*=parseFloat(q.data("tm-quantity")),E*=parseFloat(q.data("tm-quantity")),h*=parseFloat(q.data("tm-quantity")),g*=parseFloat(q.data("tm-quantity")),v*=parseFloat(q.data("tm-quantity")),y*=parseFloat(q.data("tm-quantity"))),O+=parseFloat(h),z+=parseFloat(g),b=$t(O,s,!1,!1,t),w=$t(z,s,!1,!1,t),q.data("price_set",1),t.data("price_set",1),t.data("undiscounted_raw_price",P),t.data("undiscounted_raw_original_price",E),t.data("undiscounted_price",Jt(I,s,t)),t.data("undiscounted_original_price",Jt(C,s,t)),t.data("raw_price",v),t.data("raw_original_price",y),t.data("price",Jt(h,s,t)),t.data("original_price",Jt(g,s,t)),i||(q.is(".tc-epo-field-product")&&(E=!1,!q.is("select")&&(q.is(":checkbox")||q.is(":radio"))?q.is(":checked")&&(E=!0):""!==q.val()&&(E=!0),E||(b=t.data("price-html"),w="")),H(t.closest(".tmcp-field-wrap").find(".tc-price"),O,b,z,w),q.data("price-changed",1))})))}function ce(a,t){var e,i,o,r,c,n,l,d,s,p,m,_,f,u,h=!0,g=a.main_product,v=a.epoEventId,y=a.this_epo_container,b=a.this_epo_totals_container,t=t||g.find(".cart");t.length<=0||(Ht.tcepo.lateFieldsPrices[v]=[],t.toArray().forEach(function(t){if(t=Ht(t),_="input[name^='variation_id']",0<t.find("input.variation_id").length&&(_="input.variation_id"),void 0!==t.data("per_product_pricing")&&(h=t.data("per_product_pricing")),e=t.find(_).val(),_=Ht.epoAPI.applyFilter("tc_get_bundleid",t.attr("data-product_id"),t,a),e=e||0,i=Ht.epoAPI.applyFilter("tc_get_epo_container",y,t,g,_),o=Ht.epoAPI.applyFilter("tc_get_totals_container",b,t,g,_),r=o.data("fields-price-rules"),i.data("tm_rules_init_done")||(o.data("force-quantity")&&t.find(Lt.qtySelector).val(o.data("force-quantity")),i.toArray().forEach(function(t){Ht(t).closest(".tmcp-field-wrap").find(".tm-epo-field").data("tm-quantity",Ht(t).val())}),i.find(".tmcp-attributes, .tmcp-elements").toArray().forEach(function(t){t=Ht(t),c=Ht.epoAPI.util.parseJSON(t.attr("data-rules")),"object"!=typeof(n=Ht.epoAPI.util.parseJSON(t.attr("data-original-rules")))&&(n={0:"0"}),"object"==typeof(c="object"!=typeof c?{0:"0"}:c)&&(l=L(c[Ht.epoAPI.math.toFloat(e)],o,r),d=$t(l,o),s=L(n[Ht.epoAPI.math.toFloat(e)],o,r),p=$t(s,o),t.find(".tmcp-field, .tmcp-fee-field ").toArray().forEach(function(t){t=Ht(t),h?("1"===t.attr("data-no-price")&&(s=l=0),t.data("raw_price",l),t.data("raw_original_price",s),t.data("price",Jt(l,o,t)),t.data("original_price",Jt(s,o,t)),H(t.closest(".tmcp-field-wrap").find(".tc-price"),l,d,s,p)):(t.data("price",0),t.data("original_price",0),t.closest(".tmcp-field-wrap").find(".amount").empty())}))}),i.data("tm_rules_init_done",1)),!h)return!0;f=oe(o),m=ie(o),u={cart:t,current_variation:e,bundleid:_,epoTotalsContainer:o,product_price:f,product_original_price:m,apply_dpd:r,per_product_pricing:h},_=i.find(".tmcp-field,.tmcp-sub-fee-field,.tmcp-fee-field"),a.is_associated||(_=_.not(Lt.associatedEpoSelector+" .tmcp-field,"+Lt.associatedEpoSelector+" .tmcp-sub-fee-field,"+Lt.associatedEpoSelector+" .tmcp-fee-field")),f=_.filter(".tcenabled"),(!Ht.tcepo.initialActivation[v]||0===f.length&&0<_.length)&&(_.each(function(){q(Ht(this))}),Ht.tcepo.initialActivation[v]=!0),_.filter(".tcenabled").each(function(t,e){Vt(a,e,u)}),_.each(function(t,e){Ht(e).on("tc_element_epo_rules",function(){Vt(a,e,u)})})}))}function ne(e,t,a,i,o,r,c,n){var l,d,s,p,m,_,f,u,h,g,v,y,b=0,w=0,x=0,F=0,k=e.epoEventId,A=void 0!==n?n:e.this_epo_totals_container.data("fields-price-rules"),P=t,I=a;return Ht.tcepo.lateFieldsPrices[k].forEach(function(t){l=t.price,d=t.original_price,s=t.pricetype,p=t.setter,v=t.bundleid,y="percentcurrenttotal"===s?"_hidden":"_hiddenfixed",(_=p).is("option")&&(_=p.closest("select")),P=parseFloat(Ht.epoAPI.applyFilter("tc_alter_product_price",P,_,c,e.this_epo_totals_container,r)),I=parseFloat(Ht.epoAPI.applyFilter("tc_alter_original_product_price",I,_,c,e.this_epo_totals_container,r)),m=Ht.epoAPI.dom.id(_.attr("name")),f=Ht(".tc-totals-form.tm-totals-form-"+c.attr("data-cart-id")).attr("data-product-id"),g=Ht(".tc-totals-form.tm-totals-form-"+c.attr("data-cart-id")).attr("data-epo-id"),f=Ht(".tc-extra-product-options.tm-product-id-"+f+"[data-epo-id='"+g+"']").find("#"+m+y),v===r?("percentcurrenttotal"===s?(l=parseFloat(l)/100*(L(parseFloat(P),e.this_epo_totals_container,A)+parseFloat(i)),d=parseFloat(d)/100*(parseFloat(I)+parseFloat(o))):"fixedcurrenttotal"===s&&(l=parseFloat(l)+parseFloat(i),d=parseFloat(d)+parseFloat(o)),_.data("tm-quantity")&&(l*=parseFloat(_.data("tm-quantity")),d*=parseFloat(_.data("tm-quantity"))),1===p.data("isset")&&q(p)&&(_.is(".tmcp-field")?(b+=l,w+=d):_.is(".tmcp-fee-field")&&(x+=l,F+=d)),g=Jt(l,c,p),v=Jt(d,c,p),u=$t(l,c,!1,!1,p),h=$t(d,c,!1,!1,p),p.data("price",g),p.data("pricew",g),p.data("original_price",v),p.data("original_pricew",v),H(p.closest(".tmcp-field-wrap").find(".tc-price"),g,u,v,h),0===f.length&&_.before('<input type="hidden" id="'+m+y+'" name="'+m+y+'" value="'+$(l,c)+'">'),p.is(".tm-epo-field.tmcp-radio")&&!p.is(":checked")||f.val($(l,c))):void 0!==p.data("pricew")&&(u=$t(p.data("pricew"),c,!0,!1,p),h="",void 0!==p.data("original_pricew")&&(h=$t(p.data("original_pricew"),c,!0,!1,p)),H(p.closest(".tmcp-field-wrap").find(".tc-price"),p.data("pricew"),u,p.data("original_pricew"),h))}),{normal:[b,w],fees:[x,F]}}function ct(){var t;"yes"!==Mt.tm_epo_no_lazy_load&&((t=h?Ht(h).find("img.tmlazy"):Ht(".tc-extra-product-options img.tmlazy")).lazyLoadXT(),t.on("lazyshow",function(){Rt.trigger("lazyLoadXToncomplete")}))}function nt(t){var e,a;t&&(a=Ht(".cart"),t.find(".tm-owl-slider-section").each(function(){(e=Ht(this)).find(".tc-slider-content").addClass("tm-owl-slider"),(e=e.find(".tm-owl-slider")).addClass("tcowl-carousel-show").addClass("tcowl-carousel").on("changed.owl.carousel",function(){a.css("display","block").addClass("slider-setup")}).tmowlCarousel(Object.assign({rtl:"1"===Mt.isRTL,dots:!1,nav:!0,items:1,autoHeight:!0,mouseDrag:!1,touchDrag:!0,navText:[Mt.i18n_prev_text,Mt.i18n_next_text],navClass:["owl-prev button","owl-next button"],navElement:"a",loop:!1,navRewind:!1},P.tmowlCarouselSettings||{})),e.removeClass("tcowl-carousel-show")}),Ht.fn.tcTabs)&&t.find(".tc-tabs").tcTabs({headers:"tc-tab-headers",header:"tab-header",dataopenattribute:"data-tab",sortabletabs:!1})}function lt(a,t){var e=t.closest(".cpf-element").data("repeater-max-rows"),i=t.find(".tc-repeater-element"),o=i.length,r=i.last(),i=i.last().find(".tmcp-ul-wrap"),c=a.data("tc-repeater-id"),n=a.data("tc-repeater-init");return!(e&&e<=o)&&(e<=o+1&&a.is(".tc-repeater-add")&&a.closest(".tc-repeater-wrap").addClass("tc-hidden"),i.is(".tm-element-ul-date, .tm-element-ul-time")&&(i.find(".tm-epo-field").tm_datepicker("destroy"),i.find(".tmcp-date-select").off()),i.is(".tm-element-ul-color")&&i.find(".tm-epo-field").spectrum("destroy"),(e=r.tcClone(!0)).find(".tm-epo-field").attr("id",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-for]").attr("data-for",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[for]").attr("for",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-field-id]").attr("data-field-id",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-tm-date]").attr("data-tm-date",function(){return c+"_"+n}),e.find(".tm-epo-field").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tm-qty").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tmcp-date-select").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tmcp-date-select").attr("id",function(t,e){return c+"_"+n+"_"+e.substring(e.lastIndexOf("_")+1)}),o=e.find(".tmcp-ul-wrap"),0<t.find(".tc-repeater-element").length&&(t.find(".tc-repeater-delete").removeClass("tc-hidden"),e.find(".tc-repeater-delete").removeClass("tc-hidden")),o.is(".tm-element-ul-checkbox")?(e.find("li.tmcp-field-wrap").removeClass("tc-active"),e.find(".tm-epo-field.tmcp-checkbox").prop("checked",!1),e.find(".tm-epo-field.tmcp-checkbox").filter(function(t,e){return-1!==Ht.inArray(Ht(e).val(),a.data("repeater-init-value"))}).prop("checked",!0).closest("li.tmcp-field-wrap").addClass("tc-active")):o.is(".tm-element-ul-radio")?(e.find("li.tmcp-field-wrap").removeClass("tc-active"),e.find(".tm-epo-field.tmcp-radio").filter(function(t,e){return Ht(e).val()===a.data("repeater-init-value")}).prop("checked",!0).closest("li.tmcp-field-wrap").addClass("tc-active")):e.find(".tm-epo-field").val(a.data("repeater-init-value")),o.is(".tm-element-ul-checkbox")||o.is(".tm-element-ul-radio")||e.find(".tm-epo-field").val(a.data("repeater-init-value")),a.data("tc-repeater-init",a.data("tc-repeater-init")+1),[e,r,i])}function dt(i,t,e,a,o){var r=t.find(".tmcp-ul-wrap");r.is(".tm-element-ul-range")&&(t.find(".tm-range-picker").removeData("tc-picker-init").attr("class","tm-range-picker").html(""),wt(t)),r.is(".tm-element-ul-date, .tm-element-ul-time")&&(kt(a),kt(r)),r.is(".tm-element-ul-color")&&(mt(a),mt(r)),t.find(".tm-tooltip").removeData("tctooltip").removeData("tm-has-tm-tip"),Ht.tcToolTip(t.find(".tm-tooltip")),t.find(".tm-epo-field").removeData("addedtcEpoBeforeOptionPriceCalculation").each(function(t,e){var a=Ht(e);q(a,!1,!0),a.is(".tcenabled")&&Vt(i,a),a.on("tc_element_epo_rules",function(){Vt(i,a)})}),o&&(r.is(".tm-element-ul-checkbox")?t.find(".tm-epo-field.tmcp-checkbox").filter(":checked"):r.is(".tm-element-ul-radio")?t.find(".tm-epo-field.tmcp-radio").filter(":checked"):t.find(".tm-epo-field")).trigger("change.cpf")}function st(t,e,a,i){var o=t.closest(".cpf-element").data("repeater-min-rows"),r=t.find(".tc-repeater-element").length,c=e.index();o&&r<=o?i&&(o='<div class="tm-error-repeater tm-error tc-cell tcwidth tcwidth-100">'+Ht.tc_validator.messages.repeaterminrows(o)+"</div>",i.tcToolTip({tip:o,onetime:!0,trigger:!0,tipclass:"tc-error"})):1!==r&&(2===r&&t.find(".tc-repeater-delete").addClass("tc-hidden"),a.is(".tc-repeater-add")&&a.closest(".tc-repeater-wrap").removeClass("tc-hidden"),e.remove(),a.data("tc-repeater-init",a.data("tc-repeater-init")-1),c+1!==r)&&t.find(".tc-repeater-element").toArray().forEach(function(t,a){(t=Ht(t)).find(".tm-epo-field").attr("id",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-for]").attr("data-for",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[for]").attr("for",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-field-id]").attr("data-field-id",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-tm-date]").attr("data-tm-date",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find(".tm-epo-field").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")}),t.find(".tm-qty").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")}),t.find(".tmcp-date-select").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")})})}function pt(_,f){var u,h,g;_&&(_=Ht(_)).length&&(u=f.main_cart,h=Kt(u),h=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantity",h,{epo:f,currentCart:u,obj:_,qtyElement:h}),(g=_.find(".tc-repeater-quantity")).toArray().forEach(function(t,p){var e,m=Ht(t);m.data("tc-repeater-init")||(e=(t=m.find(".tc-repeater-element")).length,(t=t.first().find(".tm-epo-field")).is(":checkbox")?m.data("repeater-init-value",t.filter(":checked").toArray().map(function(t){return Ht(t).val()})):t.is(":radio")?m.data("repeater-init-value",t.filter(":checked").val()):m.data("repeater-init-value",t.val()),m.data("tc-repeater-init",e),m.data("tc-repeater-id",t.attr("id")),m.data("tc-repeater-name",t.attr("name")),h.length&&(h.off("change.r"+p+"cpf input.r"+p+"cpf").on("change.r"+p+"cpf input.r"+p+"cpf",function(t){var e,a,i,o,r,c,n=Ht(this),l=n.data("tm-prev-value"),d=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantityValue",n.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:n}),s=d-l;if(void 0===l&&(s=d-(l=d-1)),0!==(s=void 0!==t.isTrigger?d-(l=m.find(".tc-element-inner-wrap").find(".tc-repeater-element").length):s)){if(e=m.find(".tc-element-inner-wrap"),(t=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantity_tm-prev-value",n.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:n}))<=0&&(t=1),p===g.length&&n.data("tm-prev-value",t),0<s){if((a=e.find(".tc-repeater-element").eq(d-1)).length)return;for(i=0;i<s;i++)(r=lt(m,e))&&(o=o?o.add(r[0]):r[0],0===i)&&(r[1],c=r[2]);o&&(o.appendTo(e.find(".tc-element-container")),dt(f,o,0,c))}else for(i=d-s;d<i;--i)a=e.find(".tc-repeater-element").eq(i-1),st(e,a,m);u.trigger({type:"tm-epo-update",norules:2})}}),h.data("tm-prev-value",Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantityValue",h.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:h})).trigger("change")))}),_.find(".tc-repeater-add").toArray().forEach(function(t){var e,a,i=Ht(t);i.data("tc-repeater-init")||(a=(t=(e=i.closest(".tc-element-inner-wrap")).find(".tc-repeater-element")).length,t=t.first().find(".tm-epo-field"),1<e.find(".tc-repeater-element").length&&e.find(".tc-repeater-delete").removeClass("tc-hidden"),t.is(":checkbox")?i.data("repeater-init-value",t.filter(":checked").toArray().map(function(t){return Ht(t).val()})):t.is(":radio")?i.data("repeater-init-value",t.filter(":checked").val()):i.data("repeater-init-value",t.val()),i.data("tc-repeater-init",a),i.data("tc-repeater-id",t.attr("id")),i.data("tc-repeater-name",t.attr("name")),i.on("click.repeater",function(){var t=lt(i,e);t&&(t[0].appendTo(e.find(".tc-element-container")),dt(f,t[0],t[1],t[2],!0))}))}),_.find(".tc-repeater-delete .delete").on("click",function(){var t=Ht(this),e=t.closest(".tc-element-inner-wrap");st(e,t.closest(".tc-repeater-element"),e.find(".tc-repeater-add"),t)}))}function mt(t){t&&(t=Ht(t).find(".tm-color-picker")).length&&(t.spectrum({type:"color",theme:"epo",showButtons:!0,allowEmpty:!0,showInitial:!0,showInput:!0,clickoutFiresChange:!1,chooseText:Mt.closeText,cancelText:Mt.i18n_cancel}),t.spectrum("enable"))}function _t(t){t&&Ht(t).length&&Ht(function(){Ht(t).tclightbox()})}function ft(t){var e=t.closest(".tmcp-field-wrap").find("label img"),a=Ht(e).first().attr("data-original");return t.is("select.tm-product-image")&&(t=t.children("option:selected")),a=(a=a||Ht(e).first().attr("src"))||t.attr("data-image"),!(t.attr("data-imagep")?!t.attr("data-imagep"):!a)}function ut(t){var i,o,r,c,t=t.is_associated?t.this_epo_container.find(".tm-epo-field.tmcp-upload"):t.this_epo_container.find(".tm-epo-field.tmcp-upload").not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload");try{t.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload").toArray().forEach(function(t){var e,a;return c=[],""!==(i=Ht(t)).attr("data-file")&&0!==(e=i.attr("data-file").split("|")).length&&((F||k)&&(o=new F("").clipboardData||new k),e.forEach(function(t){a=Ht.epoAPI.util.basename(t),(F||k)&&o.items.add(new File([t],a)),c.push(t)}),o&&(t.files=o.files),c=c.join("|"),r=i.attr("name"),i.trigger("tcupload"),i.after('<input type="hidden" class="tmcp-upload-hidden" name="'+r+'" value="'+c+'">'),void i.removeAttr("data-file"))})}catch(t){P.console.log(t),Ht(".tm-epo-field.tmcp-upload").not(".tm-multiple-file-upload").addClass("tc-nodt"),b=t}}function ht(t,e,a){var i=a.find(".flex-control-nav li:eq(0) img"),a=a.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),o=e,e=e.closest("a"),r=e.next(".zoomImg");t&&t.image_link&&t.image_link&&1<t.image_link.length?(null!==t.full_src&&""!==t.full_src||(t.full_src=t.image_link),null!==t.full_src_w&&""!==t.full_src_w||(t.full_src_w=o.attr("data-large_image_width")),null!==t.full_src_h&&""!==t.full_src_h||(t.full_src_h=o.attr("data-large_image_height")),o.length&&(t.image_srcset||(t.image_sizes=!1),t.image_sizes||(t.image_srcset=!1),o.tc_set_attr("src",t.image_link,0),o.tc_set_attr("srcset",t.image_srcset,0),o.tc_set_attr("sizes",t.image_sizes,0),o.tc_set_attr("title",t.image_title,0),o.tc_set_attr("alt",t.image_alt,0),o.tc_set_attr("data-src",t.full_src,0),o.tc_set_attr("data-large_image",t.full_src,0),o.tc_set_attr("data-large_image_width",t.full_src_w,0),o.tc_set_attr("data-large_image_height",t.full_src_h,0),a.tc_set_attr("data-thumb",t.image_link,1)),i.length&&i.tc_set_attr("src",t.image_link,2),e.length&&(e.tc_set_attr("href",t.full_src,3),e.tc_set_attr("title",t.image_caption,3)),r.length&&r.tc_set_attr("src",t.full_src,4)):(o.length&&(o.tc_reset_attr("src",0),o.tc_reset_attr("srcset",0),o.tc_reset_attr("sizes",0),o.tc_reset_attr("title",0),o.tc_reset_attr("alt",0),o.tc_reset_attr("data-src",0),o.tc_reset_attr("data-large_image",0),o.tc_reset_attr("data-large_image_width",0),o.tc_reset_attr("data-large_image_height",0),a.tc_reset_attr("data-thumb",1)),i.length&&i.tc_reset_attr("src",2),e.length&&(e.tc_reset_attr("href",3),e.tc_reset_attr("title",3)),r.length&&r.tc_reset_attr("src",4))}function j(t,e){var a;return t.is_associated?a=e.find(".tc-product-image .wp-post-image").first():""!==Mt.tm_epo_global_product_image_selector?a=Ht(Mt.tm_epo_global_product_image_selector):0===(a=0===(a=0===(a=0===(a=0===(a=e.find(".woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)").eq(0).find(".wp-post-image").first()).length?e.find("a.woocommerce-main-image img, img.woocommerce-main-image,a img").not(".thumbnails img,.product_list_widget img").first():a).length?e.find("img.wp-post-image").not(".thumbnails img,.product_list_widget img").first():a).length?e.find(".elementor-widget-wd_single_product_gallery img.wp-post-image").first():a).length?e.find(".elementor-widget-ae-post-image .wp-post-image").first():a).length&&(a=Ht(".woocommerce div.product div.images").not(".thumbnails img,.product_list_widget img").first()),a=1<Ht(a).length?Ht(a).first():a}function gt(t){var e,a;return t.is_associated?t.main_product.closest(".tc-epo-element-product-container"):(e=t.main_product,t=t.product_id,(a=e.closest("#product-"+t)).length<=0?e.closest(".post-"+t):a)}function z(t,e,a,i,o,r,c){var n,l,d,s;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&(n=t[n]).enabled)switch(n.type){case"yith":e?(e.attr("srcset",a).attr("src-orig",a),n.element.data("yith_magnifier")&&n.element.yith_magnifier("destroy"),l={elements:{zoom:Ht(".yith_magnifier_zoom"),zoomImage:e,gallery:Ht(".yith_magnifier_gallery li a")}},n.element.yith_magnifier(Ht.extend(!0,{},P.yith_magnifier_options,l))):(i?n.yith_wcmg_zoom.attr("href",n.yith_wcmg_default_zoom):n.yith_wcmg_zoom.attr("href",n._yith_wcmg_default_zoom),n.element.data("yith_magnifier")&&n.element.yith_magnifier("destroy"),n.element.yith_magnifier(P.yith_magnifier_options));break;case"iosslider":setTimeout(function(t){t.element.iosSlider("update")}.bind(null,n),150);break;case"flexslider":Rt.trigger("resize");break;case"elevatezoom":n.element.each(function(t,e){e=e(this).data("elevateZoom");void 0!==e&&e.swaptheimage(t,t)}.bind(null,a,Ht));break;case"easyzoom":n.element.swap(null,a);break;case"easyzoom-flatsome":n.element.swap(a,a);break;case"woocommerce":e&&(n.element.flexslider(0),n.element.trigger("woocommerce_gallery_reset_slide_position"),l=n.element,P.setTimeout(function(t,e){t.trigger("woocommerce_gallery_init_zoom"),e.trigger("resize")}.bind(null,l,Rt),10));break;case"zoom":c&&(s=c.find(".woocommerce-product-gallery--with-images").width(),d=!1,(d=n.element.find("img.wp-post-image").attr("data-large_image_width")>s?!0:d)?(s={touch:!1},"ontouchstart"in P&&(s.on="click"),n.element.trigger("zoom.destroy"),n.element.zoom(s)):n.element.trigger("zoom.destroy"))}Rt.trigger("tm_gallery_compatibility_actions",{event_data:o,product_element:c,form:r})}function vt(t,e,a){var i,o,r,c,n,l,d,s,p,m,_,f,u,h,g,v,y,b,w;return t.is_associated?{}:(t=!1,i=Ht(".images"),o=Ht(".yith_magnifier_zoom"),r=i.find(".yith_magnifier_zoom").first().attr("href"),c=i.find(".yith_magnifier_zoom img").first().attr("src"),n=!1,l=Ht(".iosSlider.product-gallery-slider,.iosSlider.product-slider"),d=!1,s=a.find(".images .fusion-flexslider"),p=e.data("elevateZoom")||!1,m=a.find("div.product-images .woocommerce-main-image"),_=!1,f=a.find(".images .easyzoom"),u=!1,h=a.find(".images .easyzoom"),g=!1,v=a.find(".woocommerce-product-gallery"),y=P.wc_single_product_params,b="function"==typeof Ht.fn.zoom&&y&&y.zoom_enabled,w=!1,P.yith_magnifier_options&&i.data("yith_magnifier")&&(t=!0),l.length&&l.iosSlider&&(n=!0),s.length&&s.flexslider&&(d=!0),f.length&&f.filter(".images .easyzoom.first").data("easyZoom")&&(f=f.filter(".images .easyzoom.first").data("easyZoom"),_=!0),_||(h=a.find(".images .has-image-zoom .slide")).length&&h.filter(".images .has-image-zoom .slide.first").data("easyZoom")&&(h=h.filter(".images .has-image-zoom .slide.first").data("easyZoom"),u=!0),"complete"===x.readyState?setTimeout(function(){f.length&&f.data("easyZoom")&&(f=f.data("easyZoom"),_=!0),h.length&&h.data("easyZoom")&&(h=h.data("easyZoom"),u=!0)},150):Rt.on("load",function(){setTimeout(function(){f.length&&f.data("easyZoom")&&(f=f.data("easyZoom"),_=!0),h.length&&h.data("easyZoom")&&(h=h.data("easyZoom"),u=!0)},150)}),v.length&&v.data("flexslider")&&(g=!0,"function"==typeof Ht.fn.zoom)&&y&&y.zoom_enabled&&0<(y=e.closest(".woocommerce-product-gallery__image")).length&&e.width()>Ht(".woocommerce-product-gallery").width()&&(e.data.wc27_zoom_target=y),!g&&b&&(w=a.find(".woocommerce-product-gallery__image")),{is_yith_wcmg:{type:"yith",enabled:t,element:i,yith_wcmg_zoom:o,_yith_wcmg_default_zoom:r,yith_wcmg_default_image:c},is_iosSlider:{type:"iosslider",enabled:n,element:l},is_flexslider:{type:"flexslider",enabled:d,element:s},is_elevateZoom:{type:"elevatezoom",enabled:p,element:m},is_easyzoom:{type:"easyzoom",enabled:_,element:f},is_easyzoom_flatsome:{type:"easyzoom-flatsome",enabled:u,element:h},is_wc27_gallery:{type:"woocommerce",enabled:g,element:v},is_zoom_enabled:{type:"zoom",enabled:!g&&b,element:w}})}function yt(c){var n,i,o,r,t,l=c.is_associated?c.this_epo_container:c.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),d=c.variations_form,e=c.main_product,s=c.form,p=gt(c),m=[],a=c.is_associated?"tc_":"",_=j(c,p),f=vt(c,_,p);0<Ht(_).length&&(s.on(a+"reset_image.tcpi",function(){setTimeout(function(){"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p),Ht.tc_product_image_store=t),Ht.tc_product_image=Ht.tc_replace_object_values(Ht.tc_product_image,Ht.tc_product_image_store),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length?m[m.length-1].trigger("tm_trigger_product_image"):Ht.tc_product_image_store=Ht.tc_populate_store(_,p)},P.tc_epo_product_image_change_delay||0)}),s.on(a+"found_variation.tcpi",function(){setTimeout(function(){var t,e,a,i,o,r;"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p)),a=_,t=(i=p).find(".flex-control-nav li:eq(0) img"),r=i.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),e=(o=a).closest("a"),Ht.isEmptyObject(Ht.tc_product_image)?Ht.tc_product_image_store=Ht.tc_populate_store(a,i):(Ht.tc_product_image_store=Ht.tc_pre_populate_store(),Ht.tc_product_image_store=Ht.tc_maybe_copy_object_values(Ht.tc_product_image_store,Ht.tc_product_image)),o.tc_update_attr("src",0),o.tc_update_attr("srcset",0),o.tc_update_attr("sizes",0),o.tc_update_attr("title",0),o.tc_update_attr("alt",0),o.tc_update_attr("data-src",0),o.tc_update_attr("data-large_image",0),o.tc_update_attr("data-large_image_width",0),o.tc_update_attr("data-large_image_height",0),r.tc_update_attr("data-thumb",1),t.tc_update_attr("src",2),e.tc_update_attr("href",3),e.tc_update_attr("title",3),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length&&(a=_,o=(i=p).find(".flex-control-nav li:eq(0) img"),i=i.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),a=(r=a).closest("a"),r.attr("data-o_src",Ht.tc_product_image_store[0].src),r.attr("data-o_srcset",Ht.tc_product_image_store[0].srcset),r.attr("data-o_sizes",Ht.tc_product_image_store[0].sizes),r.attr("data-o_title",Ht.tc_product_image_store[0].title),r.attr("data-o_alt",Ht.tc_product_image_store[0].alt),r.attr("data-o_data-src",Ht.tc_product_image_store[0]["data-src"]),r.attr("data-o_data-large_image",Ht.tc_product_image_store[0]["data-large_image"]),r.attr("data-o_data-large_image_width",Ht.tc_product_image_store[0]["data-large_image_width"]),r.attr("data-o_data-large_image_height",Ht.tc_product_image_store[0]["data-large_image_height"]),i.attr("data-o_data-thumb",Ht.tc_product_image_store[1]["data-thumb"]),Ht.tc_product_image_store[2]&&o.attr("data-o_src",Ht.tc_product_image_store[2].src),a.attr("data-o_href",Ht.tc_product_image_store[3].href),a.attr("data-o_title",Ht.tc_product_image_store[3].title),m[m.length-1].trigger("tm_trigger_product_image"))},P.tc_epo_product_image_change_delay||0)}),Ht.tc_product_image_store=Ht.tc_maybe_copy_object_values_from_img(Ht.tc_product_image_store,_,p),t=Ht.epoAPI.util.deepCopyArray(Ht.tc_product_image_store),e.off("tm_change_product_image").on("tm_change_product_image",function(t,e){var a;t.stopImmediatePropagation(),i=e.element,o=e.element_current,i&&o&&(o=i.data("imagep"),(r="")!==o?r="imagep":"images"===i.data("changes-product-image")&&(r="image"),void 0!==(a=(a=e.element_current.data("image-variations"))&&a[r]))&&(m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=(n=Ht(this)).is("option")?n.closest("select"):n)&&""!==n.val()&&m.push(n)}),!m.length||m[m.length-1].is(i))&&setTimeout(function(){"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p)),ht(a,_,p),z(f,_,a.image_link,!1,e,s,p)},P.tc_epo_product_image_change_delay||0)}),e.off("tm_restore_product_image").on("tm_restore_product_image",function(t,e){t.stopImmediatePropagation(),i=!!e&&e.element,m=[],i&&(Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length)&&!m[m.length-1].is(i)?m[m.length-1].trigger("tm_trigger_product_image"):(ht(!1,_,p),z(f,!1,_.attr("src"),!1,e,s,p))}),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length)&&m[m.length-1].trigger("tm_trigger_product_image"),Rt.trigger("tm_product_image_loaded")}function bt(r){setTimeout(function(){var t,u,h,f,g,v,e,a,y,b,i,o,w,x;"inline"===Mt.tm_epo_global_product_image_mode?(e=(t=r).is_associated?t.this_epo_container:t.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),a=t.main_product,y=t.product_id,b=t.form,i=gt(t),o=[],w=j(t,i),x=vt(t,w,i),0<Ht(w).length&&(w.data("tm-current-image",!1),u=w.closest("a"),h=w.attr("src"),f=w.width(),g=w.height(),a.off("tm_change_product_image").on("tm_change_product_image",function(t,e){var a,i,o,r=[],c=e.element.closest(".cpf-section"),n=c.is(".tm-epo-variation-section"),l=e.epo_holder,n=(l=n?c:l).find(".tm-product-image:checked,select.tm-product-image"),r=[],d=e.element.attr("id"),c=!0,l=e.main_product,s=l.closest("#product-"+y),p=f,m=g,_=Ht("<div class='blockUI blockOverlay tm-preloader-img'></div>");0===(l=(s=s.length<=0?l.closest(".post-"+y):s).find("#"+d+"_tmimage")).length&&(l=w),o=function(){_.remove(),b.tc_image_update(!1),w.data("tm-current-image",!1),s.find(".tm-clone-product-image").hide(),w.show()},e.src===l.attr("src")&&l.is(":visible")||(!1===e.src?o():(_.css({width:p,height:m}),n.each(function(){q(v=Ht(this))&&ft(v)&&U({element:v.closest(".cpf-element"),operator:"isnotempty",value:""})&&r.push(v)}),(n=r.length?r[r.length-1]:n).attr("id")!==e.element.attr("id")&&(c=!1),a=w.tcClone(),i=new Image,a.removeAttr("data-o_src").removeAttr("data-o_title").removeAttr("data-o_alt").removeAttr("data-o_srcset").removeAttr("data-o_sizes").removeAttr("srcset").removeAttr("sizes"),c&&w.before(_),x.is_yith_wcmg.yith_wcmg_default_zoom=x.is_yith_wcmg.element.find(".yith_magnifier_zoom").first().attr("href"),x.is_yith_wcmg.yith_wcmg_default_image=x.is_yith_wcmg.element.find(".yith_magnifier_zoom img").first().attr("src"),i.onerror=function(){o()},i.onload=function(){if("naturalHeight"in this){if(this.naturalHeight+this.naturalWidth===0)return void this.onerror()}else if(this.width+this.height===0)return void this.onerror();s.find("#"+d+"_tmimage").remove(),s.find(".tm-clone-product-image").hide(),a.prop("src",i.src).hide(),w.hide().after(a),a.css("opacity",0).show(),z(x,a,i.src),_.animate({opacity:0},750,"easeOutExpo",function(){_.remove()}),a.animate({opacity:1},P.tc_epo_image_animation_delay||1500,"easeOutExpo",function(){}),Rt.trigger("tm_change_product_image_loaded",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})},a.attr("id",d+"_tmimage").addClass("tm-clone-product-image").hide(),a.attr("src-orig")&&a.attr("src-orig",e.src),c?(i.src=e.src,b.tc_image_update(e.element,a),w.data("tm-current-image",d),Rt.trigger("tm_change_product_image_show",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})):(a.prop("src",e.src).hide(),w.after(a)),Rt.trigger("tm_change_product_image_end",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})))}),a.off("tm_restore_product_image").on("tm_restore_product_image",function(t,e){var a,i,o,r,c,n,l,d,s,p,m,_;if(!e||!e.element)return!1;if(Rt.trigger("tm_restore_product_image_pre",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder}),a=e.element.attr("id"),o=(i=e.main_product).closest("#product-"+y),l=(d=e.element.closest(".cpf-section")).is(".tm-epo-variation-section"),n=!1,p=h,m=e.epo_holder,l&&(m=d),l=(o=o.length<=0?i.closest(".post-"+y):o).find("#"+a+"_tmimage").is(":visible"),o.find("#"+a+"_tmimage").remove(),0===o.find(".tm-clone-product-image").length)w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1);else{if(!l)return void Rt.trigger("tm_restore_product_image_loaded_exit",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder});for(d=o.find(".tm-clone-product-image").length,a=w.data("tm-current-image"),_=d-1;0<=_;--_){if(r=(c=o.find(".tm-clone-product-image").eq(_)).attr("id").replace("_tmimage",""),(s=m.find("[id='"+r+"']")).is(":checked")&&s.closest(".cpf-element").is(":visible")){o.find(".tm-clone-product-image").eq(_).show(),u.attr("href",o.find(".tm-clone-product-image").eq(_).prop("src")),w.data("tm-current-image",r),n=!0;break}o.find(".tm-clone-product-image").eq(_).hide()}n?o.find("#"+a+"_tmimage").remove():(w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1))}n&&(p=c.attr("src")),z(x,!1,p,o.find(".tm-clone-product-image").filter(":visible").length),Rt.trigger("tm_restore_product_image_loaded",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})}),a.off("tm_attempt_product_image").on("tm_attempt_product_image",function(t,e){var a,i,o,r,c,n=e.main_product,l=n.closest("#product-"+y),d=e.element?e.element.closest(".cpf-section"):Ht(n.find(".tm-epo-variation-section").first(),e.epo_holder),s=d.is(".tm-epo-variation-section"),p=e.epo_holder,s=(p=s?d:p).find(".tm-product-image:checked,select.tm-product-image"),d="",m=!(a=[]),_=w.data("tm-current-image"),f=h;if(l.length<=0&&(l=n.closest(".post-"+y)),(s=(p=n.find(".tm-epo-variation-section").first().add(e.epo_holder)).find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(v=Ht(this))&&ft(v)&&U({element:v.closest(".cpf-element"),operator:"isnotempty",value:""})&&a.push(v)}),a.length&&(d=(s=a[a.length-1]).attr("id")),!a.length||!s.length||_&&d===_){if(n=p.find("[id='"+_+"']").closest(".cpf-element"),_&&(!1===n.data("isactive")||!1===n.closest(".cpf-section").data("isactive"))){if(l.find("#"+_+"_tmimage").remove(),0===(e=l.find(".tm-clone-product-image").length))w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1);else{for(c=e-1;0<=c;--c){if(o=(i=l.find(".tm-clone-product-image").eq(c)).attr("id").replace("_tmimage",""),(r=p.find("[id='"+o+"']")).is(":checked")&&r.closest(".cpf-element").is(":visible")){l.find(".tm-clone-product-image").eq(c).show(),u.attr("href",l.find(".tm-clone-product-image").eq(c).prop("src")),w.data("tm-current-image",o),m=!0;break}l.find(".tm-clone-product-image").eq(c).hide()}m||(w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1))}m&&(f=i.attr("src")),z(x,!1,f,l.find(".tm-clone-product-image").filter(":visible").length)}}else s.last().trigger("tm_trigger_product_image")}),Ht(e.find(".tm-product-image:checked,select.tm-product-image")).add(a.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(v=Ht(this))&&""!==v.val()&&o.push(v)}),o.length)&&o[o.length-1].trigger("tm_trigger_product_image"),Rt.trigger("tm_product_image_loaded")):yt(r)},P.tc_epo_product_image_setup_delay||0)}function wt(m){_&&m.find(".tm-range-picker").toArray().forEach(function(t){var a,t=Ht(t),i=t.attr("data-step").split("."),o=m.find("#"+Ht.epoAPI.dom.id(t.attr("data-field-id"))),e=parseFloat(t.attr("data-min")),r=parseFloat(t.attr("data-max")),c=parseFloat(t.attr("data-start")),n=parseFloat(t.attr("data-step")),l=t.attr("data-show-picker-value"),d=t.closest("li").find(".tm-show-picker-value"),s=parseFloat(t.attr("data-noofpips")),p=null;t.data("tc-picker-init")||(t.data("tc-picker-init",1),i=1===i.length?0:i[1].length,Number.isFinite(e)||(e=0),(r=Number.isFinite(r)?r:0)<=e&&(r=parseFloat(r)+1),c=Ht.epoAPI.math.unformat(c,Lt.localDecimalSeparator),c=Qt(c=Number.isFinite(c)?c:0,{precision:i}),Number.isFinite(n)||(n=0),(s=Number.isFinite(s)?s:10)<2&&(s=2),"yes"===t.attr("data-pips")&&(p={mode:"count",values:s,filter:function(t,e){return t=parseFloat(Ht.epoAPI.math.toFixed(t,i)),n<=0?0:1!==e||Number.isInteger(t)?e:2},format:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}},density:2}),_.create(t.get(0),{direction:Mt.text_direction,start:c,step:n,connect:"lower",behaviour:"tap",format:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}},range:{min:[e],max:[r]},pips:p,tooltips:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}}}),a=t.find(".noui-handle-lower"),t.get(0).noUiSlider.on("slide",function(){o.trigger("change.cpf")}),t.get(0).noUiSlider.on("update",function(t,e){t[e]=Ht.epoAPI.math.unformat(t[e],Lt.localDecimalSeparator),e=0,"left"!==l&&"right"!==l&&a.attr("title",Qt(t[e],{precision:i})),o.val(t[e]).trigger("change"),""!==l&&d.html(Qt(t[e],{precision:i}))}),""!==l&&d.html(c),"left"!==l&&"right"!==l&&(a.attr("title",c),t.addClass("noui-show-tooltip")))})}function xt(){_&&!C.data("setRangePickersEvents")&&(C.on("click",".tm-show-picker-value",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap"),a=e.find(".tmcp-range").val(),i=t.closest(".tmcp-field-wrap").find(".tm-range-picker");t.addClass("tc-hidden").after(Ht('<input type="number" class="tm-show-picker-value-edit">')),(t=e.find(".tm-show-picker-value-edit")).focus().val(a).wrap('<div class="tm-show-picker-value-edit-wrap"></div>'),t.attr("step",i.attr("data-step")),t.attr("min",i.attr("data-min")),t.attr("max",i.attr("data-max")),C.data("range-picker-edit",e.find(".tm-show-picker-value-edit"))}),C.on("change input",".tm-show-picker-value-edit",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap").find(".tm-range-picker"),a=e.attr("data-step").split("."),t=t.val(),a=1===a.length?0:a[1].length;e.get(0).noUiSlider.set([Qt(t,{precision:a}),null])}),C.on("keydown",".tm-show-picker-value-edit",function(t){13===t.which&&t.preventDefault()}),C.on("click",function(t){C.data("range-picker-edit")&&!Ht(t.target).is(".tm-show-picker-value")&&0===Ht(t.target).closest(".tm-show-picker-value-edit-wrap").length&&((t=C.data("range-picker-edit")).closest(".tmcp-field-wrap").find(".tm-show-picker-value").data("has-edit",0).removeClass("tc-hidden"),t.closest(".tm-show-picker-value-edit-wrap").remove(),C.removeData("range-picker-edit"))}),C.data("setRangePickersEvents",1))}function Ft(t){var e,a,i,o,r;if(t.toString().isNumeric()&&0!==(e=0===t?t:0<t?1:-1)){for(a=new Date,o=!(i=1),r=Math.abs(t);i<=r;)!1===o&&(o=0),a.setDate(a.getDate()+ +e),o++,0!==a.getDay()&&6!==a.getDay()&&i++;!1!==o&&(t=o*e)}return t}function kt(y){var g,t,e=".tm-epo-timepicker";Ht.tm_datepicker&&(g=Ht("input").map(function(){return this.id}).get().join(" "),(t=x.createElement("input")).setAttribute("type","date"),"text"===t.type&&(e=".tm-epo-system-timepicker"),y.find(e).toArray().forEach(function(t){var a=Ht(t),t=null,e=null,i=a.attr("data-time-format").trim(),o=a.attr("data-time-theme").trim(),r=a.attr("data-time-theme-size").trim(),c=a.attr("data-time-theme-position").trim(),n=a.attr("data-tranlation-hour").trim(),l=a.attr("data-tranlation-minute").trim(),d=a.attr("data-tranlation-second").trim();a.attr("type","text"),""!==a.attr("data-min-time").trim()&&(t=a.attr("data-min-time").trim()),""!==a.attr("data-max-time").trim()&&(e=a.attr("data-max-time").trim()),""!==a.attr("data-custom-time-format").trim()&&(i=a.attr("data-custom-time-format").trim()),n=n||Mt.hourText,l=l||Mt.minuteText,d=d||Mt.secondText,a.tm_timepicker(Object.assign({isRTL:Mt.isRTL,hourText:n,minuteText:l,secondText:d,timeFormat:i,minTime:t,maxTime:e,closeText:Mt.closeText,showOn:"both",buttonText:"",beforeShow:function(t,e){Ht(e.dpDiv).removeClass(g).removeClass("tm-ui-skin-epo tm-ui-skin-epo-black tm-datepicker-medium tm-datepicker-small tm-datepicker-large tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom").addClass(this.id+" tm-bsbb-all tm-ui-skin-"+o+" tm-timepicker tm-datepicker tm-datepicker-"+c+" tm-datepicker-"+r).appendTo("body"),C.off("click",".tm-ui-dp-overlay").on("click",".tm-ui-dp-overlay",function(){a.tm_timepicker("hide")}),I.addClass("tm-static"),a.prop("readonly",!0),Rt.trigger({type:"tm-timepicker-beforeShow",input:t,inst:e})},onClose:function(){I.removeClass("tm-static"),a.prop("readonly",!1),a.trigger("change")}},P.tmTimepickerSettings||P.timepicker_settings||{})),Ht("#ui-tm-datepicker-div").hide()}),y.find(".tm-epo-datepicker").toArray().forEach(function(t){var e,l=Ht(t),t=parseInt(l.attr("data-start-year").trim(),10),a=parseInt(l.attr("data-end-year").trim(),10),i=l.attr("data-min-date").trim(),o=l.attr("data-max-date").trim(),d=l.attr("data-disabled-dates").trim(),s=l.attr("data-enabled-only-dates").trim(),r=l.attr("data-exlude-disabled").trim(),p=l.attr("data-disabled-weekdays").trim().split(","),m=l.attr("data-disabled-months").trim().split(","),_=l.attr("data-date-format").trim(),c=l.attr("data-date-showon").trim(),n=l.attr("data-date-defaultdate").trim(),f=l.attr("data-date-theme").trim(),u=l.attr("data-date-theme-size").trim(),h=l.attr("data-date-theme-position").trim();""!==d&&(e=d.split(","),-1!==d.indexOf(","))&&0<e.length&&(d=e),""!==s&&(e=s.split(","),-1!==s.indexOf(","))&&0<e.length&&(s=e),""===i?i=""===t?null:new Date(t,0,1):r&&(i=Ft(i)),""===o?o=""===a?null:new Date(a,11,31):r&&(o=Ft(o)),l.data("tc-enabled_only_dates",s),l.data("tc-disabled_weekdays",p),l.data("tc-disabled_months",m),l.data("tc-disabled_dates",d),l.data("tc-format",_),l.tm_datepicker(Object.assign({monthNames:Mt.monthNames,monthNamesShort:Mt.monthNamesShort,dayNames:Mt.dayNames,dayNamesShort:Mt.dayNamesShort,dayNamesMin:Mt.dayNamesMin,isRTL:Mt.isRTL,showOtherMonths:!0,selectOtherMonths:!0,showOn:c,defaultDate:n,buttonText:"",showButtonPanel:!0,firstDay:Mt.first_day,closeText:Mt.closeText,currentText:Mt.currentText,dateFormat:_,minDate:i,maxDate:o,onSelect:function(){var t,e=Ht(this),a="#"+Ht.epoAPI.dom.id(e.attr("id")),i=e.tm_datepicker("getDate"),o="",r="",c="",n=y.find(a+"_day"),l=y.find(a+"_month"),a=y.find(a+"_year");i&&(o=i.getDate(),r=i.getMonth()+1,c=i.getFullYear(),t=Ht.tm_datepicker.formatDate(_,i),-1!==m.indexOf(r.toString())||-1!==p.indexOf(i.getDay().toString())||-1!==d.indexOf(t)||""!==s&&-1===s.indexOf(t))&&(t=e.data("tm-last-date"),t=e.data("tm-last-date")?e.data("tm-last-date"):"",e.val(t),e.tm_datepicker("setDate",t),c=t?(o=(i=e.tm_datepicker("getDate")).getDate(),r=i.getMonth()+1,i.getFullYear()):r=o=""),n.val(o),l.val(r),a.val(c),e.data("tm-last-date",e.val()),e.tm_datepicker("hide")},beforeShow:function(t,n){Ht(n.dpDiv).removeClass(g).removeClass("tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom").addClass(this.id+" tm-bsbb-all tm-ui-skin-"+f+" tm-datepicker tm-datepicker-"+h+" tm-datepicker-"+u).appendTo("body"),C.off("click",".tm-ui-dp-overlay").on("click",".tm-ui-dp-overlay",function(){l.tm_datepicker("hide")}),C.off("click",".ui-tm-datepicker-current").on("click",".ui-tm-datepicker-current",function(){var t,e=new Date,e=Ht.tm_datepicker._daylightSavingAdjust(new Date(e.getFullYear(),e.getMonth(),e.getDate())),a=e.getDay(),i=e.getMonth()+1,o="#"+n.id.replace(/\\\\/g,"\\"),r=!1,c=l.tm_datepicker("getDate");if(""!==s)t=Ht.tm_datepicker.formatDate(_,c),r=-1!==s.indexOf(t);else if(-1!==m.indexOf(i.toString())||-1!==p.indexOf(a.toString()))r=!1;else{if(""!==d)return t=Ht.tm_datepicker.formatDate(_,c),[-1===d.indexOf(t),""];r=!0}r&&(Ht.tm_datepicker._setDate(n,e),Ht.tm_datepicker._gotoToday(o))}),I.addClass("tm-static"),Rt.trigger({type:"tm-datepicker-beforeShow",input:t,inst:n})},onClose:function(){I.removeClass("tm-static"),l.trigger("change")},beforeShowDay:function(t){var e,a=t.getDay(),i=t.getMonth()+1;return""!==s?(e=Ht.tm_datepicker.formatDate(_,t),[-1!==s.indexOf(e),""]):-1!==m.indexOf(i.toString())||-1!==p.indexOf(a.toString())?[!1,""]:""!==d?(e=Ht.tm_datepicker.formatDate(_,t),[-1===d.indexOf(e),""]):[!0,""]}},P.tmDatepickerSettings||{})),Ht("#ui-tm-datepicker-div").hide()}),y.find(".tmcp-date-select").on("change.cpf",function(){var t="#"+Ht.epoAPI.dom.id(Ht(this).attr("data-tm-date")),e=y.find(t),a=e.attr("data-date-format"),i=y.find(t+"_day").val(),o=y.find(t+"_month").val(),t=y.find(t+"_year").val(),a=Ht.tm_datepicker.formatDate(a,new Date(t,parseInt(o,10)-1,i));0<i&&0<o&&0<t?(e.tm_datepicker("setDate",a),e.trigger("change")):(e.val(""),e.trigger("change.cpf"))}).on("focus.cpf",function(){var t="#"+Ht.epoAPI.dom.id(Ht(this).attr("data-tm-date")),f=y.find(t),e=y.find(t+"_day"),a=y.find(t+"_month"),t=y.find(t+"_year"),u=e.val(),h=a.val(),g=t.val(),v=Ht(this);""!==g&&""!==h&&""!==u||""!==g&&""!==h&&""===u||""!==u&&""!==g&&""===h||""!==u&&""!==h&&""===g?v.find("option").toArray().forEach(function(e){var t,a,i,o,r,c,n,l,d,s,p,e=Ht(e),m=e.val(),_=g+"-"+h+"-"+u;if(v.is(".tmcp-date-day")){if(""===g||""===h)return;_=g+"-"+h+"-"+m}else if(v.is(".tmcp-date-month")){if(""===g||""===u)return;_=g+"-"+m+"-"+u}else if(v.is(".tmcp-date-year")){if(""===u||""===h)return;_=m+"-"+h+"-"+u}if(""!==m)try{(t=Ht.tm_datepicker.parseDate("yy-mm-dd",_))&&(a=t,i=Ht(i=f),r=Ht.tm_datepicker._getInst(i[0]),c=i.data("tc-enabled_only_dates"),n=i.data("tc-disabled_weekdays"),l=i.data("tc-disabled_months"),d=i.data("tc-disabled_dates"),i=i.data("tc-format"),s=a.getDay(),p=a.getDay()+1,!Ht.tm_datepicker._isInRange(r,a)||(""!==c?(o=Ht.tm_datepicker.formatDate(i,a),-1===c.indexOf(o)):-1!==n.indexOf(s.toString())||-1!==l.indexOf(p.toString())||""!==d&&(o=Ht.tm_datepicker.formatDate(i,a),-1!==d.indexOf(o)))?e.prop("disabled",!0):e.prop("disabled",!1))}catch(t){P.console.log(t),e.prop("disabled",!0),b=t}}):(e.find("option").prop("disabled",!1),a.find("option").prop("disabled",!1),t.find("option").prop("disabled",!1))}),Rt.on("resizestart",function(){var t=Ht(x.activeElement);t.is(".hasDatepicker")&&(t.data("resizestarted",!0),Ht(P).width()<768?t.data("resizewidth",!0):t.tm_datepicker("hide"))}),Rt.on("resizestop",function(){var t=Ht(x.activeElement);t.is(".hasDatepicker")&&t.data("resizestarted")&&(t.data("resizewidth")&&t.tm_datepicker("hide"),t.tm_datepicker("show")),t.data("resizestarted",!1),t.data("resizewidth",!1)}))}function At(t){var e=t.epoEventId,a=t.main_product,i=!Ht.tcepo.formSubmitEvents[e].some(function(t){return typeof t&&"function"==typeof t.trigger&&!t.trigger()});return Ht.tcepo.formSubmitEvents[e].forEach(function(t){"object"==typeof t&&(i?t.on_true():t.on_false())}),i||setTimeout(function(){a.find(Lt.addToCartButtonSelector).first().removeClass("disabled").removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled")},100),Rt.trigger("tm-apply-submit-events",{epo:{form_is_submit:i}}),i}function Pt(e){var n,l,a=e.form,t=e.this_epo_container,i=e.main_product,o=e.epoEventId;return"yes"===Mt.tm_epo_global_enable_validation&&(n={},t.find(".tmcp-ul-wrap").toArray().forEach(function(i){var o,t,a,r,c;i=Ht(i),(l=i.data("tm-validation"))&&"object"===Ht.tmType(l)&&(t=(o=i.find(".tm-epo-field")).first().attr("name"),i.is(".tm-extra-product-options-radio.tm-element-ul-radio")?(t=o.last().attr("name"),n[t]=l):i.is(".tm-extra-product-options-checkbox.tm-element-ul-checkbox")?o.each(function(t,e){"required"in l&&(l.required=function(t){var e=i.find("input.tm-epo-field.tmcp-checkbox:checked").length;return 0===e?o.last().attr("name")===Ht(t).attr("name"):e<=0}),n[Ht(e).attr("name")]=l}):i.is(".tm-extra-product-options-product.tm-element-ul-product")?o.is(":checkbox")?o.each(function(t,e){"required"in l&&(c=Ht(e)).is(":checkbox")&&(l.required=function(t){var e=i.find("input.tm-epo-field.tmcp-checkbox:checked"),a=e.length;return 0===a?o.last().attr("name")===Ht(t).attr("name"):(t=e.map(function(){return Ht(this)}).get().some(function(t){return t.closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()<=0}),0<a?t:a<=0)},"variable"===c.attr("data-type"))&&(a=c.closest(".tc-epo-element-product-holder").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-epo-element-product-holder").find(".tc-epo-field-product");return!(!q(t,!0)||!t.is(":checked"))}},n[a]=r),n[c.attr("name")]=l}):o.is(":radio")?(l.product_element_radio_qty=!0,n[o.attr("name")]=l,a=o.closest(".tc-element-container").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-element-container").find(".tc-epo-field-product:checked");return!!(t.length&&"variable"===t.attr("data-type")&&q(t,!0)&&t.is(":checked"))}},n[a]=r):o.is("select")&&(l.product_element_select_qty=!0,n[o.attr("name")]=l,a=o.closest(".tc-element-container").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-element-container").find(".tc-epo-field-product");return!(!t.length||"variable"!==t.children(":selected").attr("data-type")||!q(t,!0))}},n[a]=r):n[t]=l)}),a.removeData("tc_validator"),a.tc_validate({focusInvalid:!1,ignore:Lt.qtySelector+",.tcdisabled,.tmcp-upload-hidden,#wc_bookings_field_duration,input.tm-qty:hidden[type='number'],input.input-text.qty,.ignore,.variations select,.tc-epo-variable-product-selector,.tm-extra-product-options-variations input,.tm-extra-product-options-variations select,input:not(.tc-extra-product-options input),select:not(.tc-extra-product-options select)",rules:n,errorClass:"tm-error",validClass:"tm-valid",errorElement:"label",errorPlacement:function(t,e){return t.addClass("tc-cell tcwidth tcwidth-100"),"before"===Mt.tm_epo_global_error_label_placement?e.closest(".tc-element-container").before(t):e.closest(".tc-element-container").after(t),!1},invalidHandler:function(t,e){Rt.trigger("tm-invalidHandler",{epo:{validator:e}}),setTimeout(function(){i.find(Lt.addToCartButtonSelector).first().is(".disabled")||(i.find(Lt.addToCartButtonSelector).first().removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled"),i.find(Lt.addToCartButtonSelector).first().removeClass("disabled").removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled"))},100),e.errorList&&e.errorList[0]&&e.errorList[0].element&&Y(Ht(e.errorList[0].element),o)},submitHandler:function(){var t;return e.is_quickview||(i.find(Lt.addToCartButtonSelector).first().addClass("disabled"),t=function(){i.find(Lt.addToCartButtonSelector).first().removeClass("disabled"),C.off("ajaxSuccess",t)},C.on("ajaxSuccess",t)),At(e)}}),a.find(Lt.addToCartButtonSelector).on("click",function(t){a.tc_validate().form()||(t.preventDefault(),t.stopImmediatePropagation())}),!0)}function Yt(h,t,g,v,y,b,w,x,F,e,k,A,a){var P,I,C,E,q,S,T,i="none",j=0;return"none"!==(i=a?i:t.attr("class")+t.attr("data-uniqid")+g+h.is_associated+F+x+F+e||"none")&&!0!==O&&!1!==O&&void 0!==O[i]?O[i]:(P=e?"undiscounted_":"",a=t.find(g),!1===h.is_associated&&(a=a.not(Lt.associatedEpoSelector+" "+g+",.cpf-type-variations "+g)),x||(a=a.filter(".tcenabled")),I=T=S=v=v||0,C=y=y||0,b=b||[],E=h.this_epo_totals_container,a.length&&a.toArray().forEach(function(t){var e,a,i,o,r,c,n,l=Ht(t),d="",t=l.closest(".cpf-element"),s=l.closest(".tmcp-field-wrap"),p=t.attr("data-fblabelshow"),m=t.attr("data-fbvalueshow"),_="",s=s.find(".tm-qty").val(),f="",u=!1;".tc-epo-field-product"===g&&(t.is(".cpf-type-product-thumbnailmultiple")||t.is(".cpf-type-product-checkbox")?q=l.closest(".tc-epo-element-product-holder").find(".tc-extra-product-options-inline"):t.is(".cpf-type-product-thumbnail")||t.is(".cpf-type-product-radio")||t.is(".cpf-type-product-dropdown")?q=t.find('.tc-epo-element-product-container[data-product_id="'+l.val()+'"]').find(".tc-extra-product-options-inline"):t.is(".cpf-type-product-single")&&(q=t.find(".tc-extra-product-options-inline")),E=Ht(".tc-epo-totals.tm-product-id-"+q.attr("data-product-id")+'[data-epo-id="'+q.attr("data-epo-id")+'"]')),E.length&&(""===p&&(_=t.find(".tc-epo-element-label-text").html()),void 0===s&&(s=""),k&&Vt(h,l,void 0,void 0,void 0,void 0,S,T),l.is(":checkbox, :radio, :input"))&&(o=i=a=e=0,l.is(".tmcp-checkbox, .tmcp-radio")?x||l.is(":checked")?(e=l.data(P+"raw_price"),a=l.data(P+"price"),i=l.data(P+"raw_original_price"),o=l.data(P+"original_price"),w=!0,l.data("isset",1),t=l.closest("li.tmcp-field-wrap").find(".tc-image"),f=d="",(r=l.closest("li.tmcp-field-wrap").find(".tc-label-text")).length&&(d=r.html(),f=d),t.length&&((t=t.closest(".tc-label-wrap").clone().addClass("tc-img-floating")).find(".tc-label, .tc-epo-style-wrapper, .tc-input-wrap").remove(),d=t[0].outerHTML+'<span class="tc-label-text">'+d+"</span>"),u=!0):l.data("isset",0):l.is(".tmcp-select")?(n=l.find("option:selected"),e=n.data(P+"raw_price"),a=n.data(P+"price"),i=n.data(P+"raw_original_price"),o=n.data(P+"original_price"),""===(c=l.children("option:selected")).val()&&""===c.attr("data-rulestype")||(w=!0),l.find("option").data("isset",0),n.data("isset",1),""===n.val()&&""===n.attr("data-rulestype")||(d=n.attr("data-text"),u=!0,f=d)):l.is(".tmcp-selectmultiple")?(n=l.find("option:selected")).toArray().forEach(function(t){t=Ht(t),e+=Ht.epoAPI.math.toFloat(t.data(P+"raw_price")),a+=Ht.epoAPI.math.toFloat(t.data(P+"price")),i+=Ht.epoAPI.math.toFloat(t.data(P+"raw_original_price")),o+=Ht.epoAPI.math.toFloat(t.data(P+"original_price")),""===(c=l.children("option:selected")).val()&&""===c.attr("data-rulestype")||(w=!0),l.find("option").data("isset",0),t.data("isset",1),""===t.val()&&""===t.attr("data-rulestype")||(d=t.attr("data-text"),u=!0,f=d)}):(r=l.val(),!(r=l.is("[type='file']")?r.replace("C:\\fakepath\\",""):r)||l.is(".tmcp-range")&&"0"===r?l.data("isset",0):(e=l.data(P+"raw_price"),a=l.data(P+"price"),i=l.data(P+"raw_original_price"),o=l.data(P+"original_price"),w=!0,l.data("isset",1),d=r,l.is(".tmcp-range")&&(t=1===(t=l.closest(".tmcp-field-wrap").find(".tm-range-picker").attr("data-step").split(".")).length?0:t[1].length,d=Qt(d,{precision:t})),u=!0,l.is(".tmcp-dynamic")&&(m=p="hidden"),f=r)),e=e||0,i=i||0,a=a||0,o=o||0,u&&b.push({title:_,value:d,valueText:f,price:a,original_price:o,quantity:s,label_show:p,value_show:m,input_type:l.attr("type")}),a=Jt(e,E,l,0,void 0,void 0,!0),o=Jt(i,E,l,0,void 0,void 0,!0),F&&(e=a,i=o),v=Ht.epoAPI.math.toFloat(v)+Ht.epoAPI.math.toFloat(e),v=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(v,10)),y=Ht.epoAPI.math.toFloat(y)+Ht.epoAPI.math.toFloat(i),y=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(y,10)),I=Ht.epoAPI.math.toFloat(I)+Ht.epoAPI.math.toFloat(a),I=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(I,10)),j+=Ht.epoAPI.math.toFloat(Ut(a,E)),C=Ht.epoAPI.math.toFloat(C)+Ht.epoAPI.math.toFloat(o),C=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(C,10)),A)&&(T=v)}),e={total:v,original_total:y,total_taxed:I,original_total_taxed:C,vat_total:j,floatingBoxData:b,showTotal:w,elementsLength:a.length},!0===O?(O={})[i]=e:!0!==O&&!1!==O&&(O[i]=e),e)}function le(t,e,a,i,o,r,c,n,l){var d,s=Ht.extend(!0,{},t),p=a.find(Lt.associatedEpoSelector),m=a,_=!0;m.closest(".cpf-element").is(".tc-hidden")||(c.addClass("tm-hidden"),c.length&&u(c,!0),"variable"===i?a.is(".tc-init-variations")?a.trigger("refresh.tc-variation-form"):(a.addClass("variations_form"),setTimeout(function(){d=g(m,!1,p.attr("data-product-id"),p.attr("data-epo-id"),o,s),a.addClass("tc-init-variations"),a.tc_product_variation_form(o,r,c,d)},40),_=!1):a.is(".tc-init-product")||(a.addClass("tc-init-product"),c.find(".tc-epo-element-variable-product").removeClass("variations_form"),c.find(".tc-epo-element-variations").removeClass("variations"),setTimeout(function(){g(m,!1,p.attr("data-product-id"),p.attr("data-epo-id"),o,s)},20),_=!1),setTimeout(function(){c.length&&u(a,!1)},200),setTimeout(function(){l.length&&l.trigger("change"),0===a.find(Lt.epoSelector).length&&a.addClass("no-epo"),a.removeClass("tm-hidden"),_&&(Rt.trigger("cpflogicdone"),a.find(".tm-quantity").trigger("showhide.cpfcustom")),void 0===n&&"yes"===Mt.tm_epo_global_product_element_scroll&&Rt.tcScrollTo(a,200,Ht.epoAPI.math.toFloat(Mt.tm_epo_global_product_element_scroll_offset))},210))}function It(Ft,kt,At){var Pt,It,Ct,Et,t,qt,y,St,Tt,jt,e,a,i,o,r,c,n,l,d,s,p=Ft.product_id,Ot=Ft.main_product,zt=Ft.main_cart,m=Ft.this_epo_container,_=Ft.this_totals_container,Dt=Ft.this_epo_totals_container,Bt=Ft.epoEventId,Nt=Ft.main_epo_inside_form,f=Ft.epo_id_selector,b=Ft.epo_id,w=Ft.product_id_selector,u="main",h=Ft.is_associated?"tc-variation-form":"wc-variation-form",g=Ft.is_associated?"tc_":"",v=At&&kt?(u=Ht.epoAPI.applyFilter("tc_get_item_id",kt.attr("data-item_id"),kt),Pt=Ot.find(".tm-extra-product-options.tm-cart-"+u),It=Ot.find(".tm-totals-form-"+u),Ct=Ot.find(".tm-epo-totals.tm-cart-"+u),kt.find(".variations_form").first()):(zt&&0!==zt.length||(zt=m.is(".tc-shortcode")?Ot:V(Ot,Ot,"form",p)),kt=zt.parent(),Pt=m,It=_,Ct=Dt,Ft.variations_form);Ft.is_associated&&(u=Pt.attr("data-cart-id")),Et=At||zt,Ct.data("tm_for_cart",Et),t=Zt(Et),y=Kt(Et),Ct.data("variationIdElement",(l=".wceb_picker_wrap "+t,d=Zt(n=Et),s=n.find(d),s=n.is(".tc-epo-element-product-container-cart")?n.closest(".tc-epo-element-product-li-container").find(d):n.find(d).not(".tc-epo-element-product-container-variation-id "+d),s=l?s.not(l):s)),Ct.data("qty_element",y),qt=Ct.data("type"),v.data("tc_product_id",p),St=Ct.attr("data-tm-epo-final-total-box"),Tt=Ct.attr("data-tm-epo-show-final-total"),jt=Ct.attr("data-tm-epo-show-options-total"),Rt.on("epoCalculateRules",function(t,e){t&&e&&e.currentCart&&ce(Ft,e.currentCart)}),Et.is("form")&&Et.on("reset",function(){var t=Ht(this);setTimeout(function(){Ht(t.data("epo_id_selector")).find(".tm-epo-field").trigger("change")},1)}),ce(Ft,Et),n=Pt.find(".tm-epo-field"),Ft.is_associated||(n=n.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")),d=Pt.find(".tm-epo-field.tmcp-textarea,.tm-epo-field.tmcp-textfield"),Ft.is_associated||(d=d.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")),l=Pt.find(".tm-epo-reset-radio"),Ft.is_associated||(l=l.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-reset-radio")),s=Pt.find(".tm-epo-field.tmcp-upload"),Ft.is_associated||(s=s.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload")),o=Pt.find(".tm-has-clearbutton .tm-epo-field"),Ft.is_associated||(o=o.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-has-clearbutton .tm-epo-field")),r=Pt.find(".tm-quantity .tm-qty"),Ft.is_associated||(r=r.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-quantity .tm-qty")),c=Pt.find(".tm-quantity"),Ft.is_associated||(c=c.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-quantity")),i=Pt.find("select.tm-epo-field"),(i=Ft.is_associated?i:i.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" select.tm-epo-field")).off("tm-select-change-html").on("tm-select-change-html",function(){var t,e,a,i,o=Ht(this);o.is(".tc-epo-field-product")||o.is(".tmcp-selectmultiple")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||(t=$t(o.find("option:selected").data("price"),Ct,!0,!1,o),e=$t(o.find("option:selected").data("original_price"),Ct,!0,!1,o),a=o.closest(".tmcp-field-wrap").find(".tc-tooltip"),i=o.closest(".tmcp-field-wrap").find(".tc-inline-description"),H(o.closest(".tmcp-field-wrap").find(".tc-price"),o.find("option:selected").data("price"),t,o.find("option:selected").data("original_price"),e),0<a.length&&a.attr("data-tm-tooltip-html",o.find("option:selected").attr("data-tm-tooltip-html")).trigger("tc-tooltip-html-changed"),0<i.length&&(o.find("option:selected").attr("data-tm-tooltip-html")?i.html(o.find("option:selected").attr("data-tm-tooltip-html")):i.html("")),("0"===o.find("option:selected").attr("data-hide-amount")||"yes"===Mt.tm_epo_show_price_inside_option_hidden_even)&&"yes"===Mt.tm_epo_show_price_inside_option&&o.find("option:selected").attr("data-text")&&(o.find("option:selected").data("price")||"yes"===Mt.tm_epo_no_hide_price_if_original_not_zero&&o.find("option:selected").data("original_price"))&&("yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(o.find("option:selected").data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==o.find("option:selected").attr("data-price")?o.find("option:selected").html(o.find("option:selected").attr("data-text")+" ("+t+")"):o.find("option:selected").html(o.find("option:selected").attr("data-text"))),""!==o.val()&&o.find("option:selected").attr("data-tm-tooltip-html")?a.removeClass("tm-hidden"):a.addClass("tm-hidden"))}).off("tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math").on("tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math",function(t){var e,a,i,o,r=Ht(this);r.is(".tc-epo-field-product")||(e=r.closest(".tmcp-field-wrap").find(".tc-tooltip"),a=r.closest(".tmcp-field-wrap").find(".tc-inline-description"),0<e.length&&e.attr("data-tm-tooltip-html",r.find("option:selected").attr("data-tm-tooltip-html")).trigger("tc-tooltip-html-changed"),""!==r.val()&&r.find("option:selected").attr("data-tm-tooltip-html")?e.removeClass("tm-hidden"):e.addClass("tm-hidden"),0<a.length&&(r.find("option:selected").attr("data-tm-tooltip-html")?a.html(r.find("option:selected").attr("data-tm-tooltip-html")):a.html("")),zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing"))||"yes"===Mt.tm_epo_show_price_inside_option&&r.find("option").each(function(){if(!(i=Ht(this)).val())return!0;"tm-select-change-html-all"===t.type?(i.removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),Vt(Ft,r,void 0,i,1)):"tm-math-select-change-html-all"===t.type?Vt(Ft,r,void 0,i,1,!0):"tm-select-change-html-all-math"===t.type&&(i.removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),Vt(Ft,r,void 0,i,1,!0)),o=1,o=(o="yes"!==Mt.tm_epo_multiply_price_inside_option?r.data("tm-quantity"):o)||1,"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(i.data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==i.attr("data-price")?(o=$t(i.data("price")/o,Ct,!0,!1,r),"0"!==i.attr("data-hide-amount")&&"yes"!==Mt.tm_epo_show_price_inside_option_hidden_even||!i.attr("data-text")||i.html(i.attr("data-text")+" ("+o+")")):i.html(i.attr("data-text"))})}).off("tm-select-price-update-html-all").on("tm-select-price-update-html-all",function(){var t,e,a=Ht(this);a.is(".tc-epo-field-product")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||"yes"===Mt.tm_epo_show_price_inside_option&&a.find("option").each(function(){if(!(t=Ht(this)).val())return!0;e=1,e=(e="yes"!==Mt.tm_epo_multiply_price_inside_option?a.data("tm-quantity"):e)||1,"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(t.data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==t.attr("data-price")?(e=$t(t.data("price")/e,Ct,!0,!1,a),"0"!==t.attr("data-hide-amount")&&"yes"!==Mt.tm_epo_show_price_inside_option_hidden_even||!t.attr("data-text")||t.html(t.attr("data-text")+" ("+e+")")):t.html(t.attr("data-text"))})}).off("tm-select-change").on("tm-select-change",function(){var t=Ht(this),e=t.closest(".cpf-element").attr("data-uniqid");t.is(".tc-epo-field-product")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||(t.removeData("addedtcEpoBeforeOptionPriceCalculation"),t.removeData("addedfieldtcEpoBeforeOptionPriceCalculation"),Rt.off("tcEpoBeforeOptionPriceCalculation.math"+e),Rt.off("tcEpoAfterNormalOptionPriceCalculation.math"+e),t.trigger("tm-select-change-html"),t.trigger("tm-select-change-html-all"),Et.trigger({type:"tm-epo-update",norules:1,element:t}))}).trigger("tm-select-change-html-all"),r.off("focus.cpf").on("focus.cpf",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap").find(".tm-epo-field"),a=parseFloat(t.val()),i=parseFloat(t.attr("max")),o=parseFloat(t.attr("min")),r=t.attr("step"),c=K(e,!1),e=tt(e,!1),n=!0;a&&""!==a&&"NaN"!==a||(a=0),""!==i&&"NaN"!==i||(i=""),""!==o&&"NaN"!==o||(o=0),"any"!==r&&""!==r&&void 0!==r&&parseFloat(r),(a<o||i<a)&&(n=!1),c&&e&&n?t.data("tm-prev-value",a):t.data("tm-prev-value",o)}).off("change.cpf").on("change.cpf",function(t,e){var a=Ht(this),i=a.closest(".tmcp-field-wrap").find(".tm-epo-field"),o=parseFloat(a.val()),r=parseFloat(a.attr("max")),c=parseFloat(a.attr("min")),n=a.attr("step"),l=K(i,!1),d=tt(i,!1),s=!0;o&&""!==o&&"NaN"!==o||(o=0),""!==r&&"NaN"!==r||(r=""),""!==c&&"NaN"!==c||(c=0),"any"!==n&&""!==n&&void 0!==n&&parseFloat(n),(o<c||r<o)&&(s=!1),l&&d&&s?(Ft.noEpoUpdate?i.data("tm-quantity",a.val()).trigger("change.cpf",e).trigger("change.cpfproduct",e):i.data("tm-quantity",a.val()).trigger("change",e),i.trigger("tm-select-change-html-all")):a.data("tm-prev-value")?a.val(a.data("tm-prev-value")):a.val(c),a.trigger("cpf-changed")}).off("tmaddquantity").on("tmaddquantity",function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".tm-epo-field").data("tm-quantity",t.val())}),a=Pt.find(".tmcp-textfield.tm-epo-field[maxlength],textarea.tm-epo-field[maxlength]"),(a=Ft.is_associated?a:a.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")).each(function(){var t,e=Ht(this);e.data("tcmaxlength")||(e.data("tcmaxlength",1),t=e.closest(".tmcp-field-wrap-inner"),e=Ht.epoAPI.template.html(Lt.templateEngine.tc_chars_remanining,{maxlength:e.attr("maxlength"),characters_remaining:Mt.i18n_characters_remaining}),t.append(Ht(e)))}),a.off("change.tc_maxlen input.tc_maxlen").on("change.tc_maxlen input.tc_maxlen",function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".tc-chars-remanining").html(parseInt(t.attr("maxlength"),10)-parseInt(t.val().length,10))}),n.off("tm_trigger_product_image").on("tm_trigger_product_image",function(){var t,e,a,i,o=Ht(this);o.is(".tm-product-image:checkbox, .tm-product-image:radio, select.tm-product-image")?(e=o.closest(".tmcp-field-wrap").find("label img"),a=o.closest(".cpf-section").is(".tm-epo-variation-section"),(t=o).is("select.tm-product-image")&&(t=o.children("option:selected")),(0<Ht(e).length||a&&void 0!==t.attr("data-image")||void 0!==t.attr("data-image")&&""!==t.attr("data-image")||void 0!==t.attr("data-imagep")&&""!==t.attr("data-imagep"))&&(o.is(":checked")||o.is("select.tm-product-image")&&""!==o.val()&&(""!==o.find("option:selected").attr("data-rules")||o.is(".tm-epo-variation-element")))?(i=(i=(i=Ht(e).first().attr("data-original"))||a?i:Ht(e).first().attr("src"))||t.attr("data-image"),(i=t.attr("data-imagep")?t.attr("data-imagep"):i)?Ot.trigger("tm_change_product_image",{src:i,element:o,element_current:t,main_product:Ot,epo_holder:Pt}):Ot.trigger("tm_change_product_image",{src:!1,element:o,element_current:t,main_product:Ot,epo_holder:Pt})):Ot.trigger("tm_restore_product_image",{element:o,element_current:t,main_product:Ot,epo_holder:Pt})):Ot.trigger("tm_attempt_product_image",{element:o,element_current:t,main_product:Ot,epo_holder:Pt})}),c.off("showhide.cpfcustom").on("showhide.cpfcustom",function(){var t,e,a=Ht(this),i=a.closest(".tmcp-field-wrap").find(".tm-epo-field"),o=!1;i.is(".tm-epo-variation-element")||(i.is("select")?""!==i.val()&&(o=!0):i.is(":checkbox")?i.is(":checked")&&(o=!0):i.is(":radio")?i.is(":checked")&&(o=!0,"yes"===Mt.tm_epo_show_only_active_quantities)&&i.closest(".tc-element-inner-wrap").find(".tm-epo-field.tmcp-radio").each(function(){Ht(this).closest(".tmcp-field-wrap").find(".tm-quantity").hide()}):i.val()&&(o=!0),t=(i=a.find(".tm-qty")).val(),e=i.attr("min")||"",o?("yes"===Mt.tm_epo_show_only_active_quantities&&a.show(),i.removeClass("ignore").prop("disabled",!1)):("yes"===Mt.tm_epo_show_only_active_quantities&&(a.hide(),t||i.val(e)),i.addClass("ignore").prop("disabled",!0)),Pt.is(".tc-show")&&setTimeout(function(){a.closest(".tcowl-carousel").trigger("refresh.owl.carousel")},200))}),n.off("change.cpfcustom").on("change.cpfcustom",function(){Ht(this).closest(".tmcp-field-wrap").find(".tm-quantity").trigger("showhide.cpfcustom")}),n.off("change.cpf").on("change.cpf",function(t,e){var a=Ht(this),i=a.closest(".tmcp-field-wrap"),o=a.closest(".tmcp-ul-wrap"),r=o.attr("data-tm-connector");a.is(":checkbox, :radio")&&(a.is(":radio")&&(e||(void 0!==r?Ht('[data-tm-connector="'+r+'"]').find(".tmcp-field-wrap").removeClass("tc-active").find(".tm-epo-reset-radio").addClass("tm-hidden"):o.find(".tmcp-field-wrap").removeClass("tc-active")),void 0!==r)&&Ht('[data-tm-connector="'+r+'"]').find(".tmcp-field-wrap").removeClass("tc-active").find(".tm-epo-reset-radio").addClass("tm-hidden"),a.is(":checked")?i.addClass("tc-active"):i.removeClass("tc-active")),a.is(".tm-epo-variation-element")||(a.is(".use_images:checkbox, .use_images:radio")&&a.attr("data-imagec")&&0<(e=i.find(".radio-image,.checkbox-image").first()).length&&(a.is(":checked")?e.prop("src",a.attr("data-imagec")):e.prop("src",a.attr("data-image"))),a.is(".use_images:radio")&&a.closest(".cpf-type-radio").find(".use_images:radio").not(a).each(function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".radio-image").first().prop("src",t.attr("data-image"))}),a.is(".tmcp-range")&&a.trigger("change.cpflogic"),a.is("select")?a.trigger("tm-select-change"):(a.is(".tmcp-radio")&&a.closest(".cpf-element").find(".tm-quantity .tm-qty").each(function(){Ht(this).closest("li.tmcp-field-wrap").find(".tmcp-radio").is(":checked")?Ht(this).prop("disabled",!1):Ht(this).attr("disabled","disabled")}),O=!0,Et.trigger({type:"tm-epo-update",norules:1,element:a}),O=!1)),a.trigger("tm_trigger_product_image"),Pt.is(".tc-show")&&setTimeout(function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})},200),Ot.trigger("tm_attempt_product_image",{element:a,main_product:Ot,epo_holder:Pt})}),n.filter('.tm-epo-field:text,input.tm-epo-field[type="number"],textarea.tm-epo-field').off("input.cpf").on("input.cpf",function(){Ht(this).trigger("change.cpf")}),n.filter(":checkbox:checked, :radio:checked").each(function(){Ht(this).closest(".tmcp-field-wrap").addClass("tc-active"),Ht(this).trigger("change.cpf")}),o.off("change.cpfclearbutton").on("change.cpfclearbutton cpfclearbutton",function(){var t,e=Ht(this),a=e.closest(".tmcp-field-wrap");e.is(":checked")&&((t=(t=(t=(t=e.closest(".tc-element-inner-wrap")).find(".tc-epo-element-product-li-container").length?t.find(".tmcp-ul-wrap").first().children(".tmcp-field-wrap").not(".tc-epo-element-product-li-container"):t).find(".tm-epo-reset-radio")).length?t:e.closest(".tc-element-inner-wrap").find(".tm-epo-reset-radio").first()).removeClass("tm-hidden"),a.append(t))}),l.off("click.cpf").on("click.cpf",function(){var t=Ht(this),e=t.closest(".tc-element-inner-wrap").find(".tm-epo-field.tmcp-radio:checked");e.length&&(e.prop("checked",!1),e.trigger("change",{forced:1})),t.addClass("tm-hidden")}),B&&B.debounce&&d.on("keyup",B.debounce(function(){var t=Ht(this);"yes"===Mt.tm_epo_global_enable_validation&&Ht.tc_validator&&t.closest(".tmcp-ul-wrap").data("tm-validation")&&t.tc_rules()&&Et.tc_validate().element(t),t.trigger("change.cpf"),t.closest(".tmcp-field-wrap").find(".tm-quantity").trigger("showhide.cpfcustom")},10)),s.off("change.cpfv tcupload").on("change.cpfv tcupload",function(){var i,t,o,r,c,n=Ht(this),e=n.closest("label"),a=n.closest(".tmcp-field-wrap"),l=a.find(".cpf-upload-container"),d=a.find(".tm-filename"),s=n.val().replace("C:\\fakepath\\",""),p=[],m=P.URL||P.webkitURL,_=a.find(".tc-upload-preview");l.length&&d.length<=0&&(d=Ht('<span class="tm-filename"></span>'),e.after(d)),void 0!==s&&"undefined"!==s||(s=""),n.next(".tmcp-upload-hidden").remove(),p=(p=n.attr("data-file"))?p.split("|"):[],this.files?t=Array.from(this.files):0<p.length&&(t=p),1<t.length?d.html(t.length+" "+(1===t.length?Mt.i18n_file:Mt.i18n_files)):1===t.length?d.html(s):d.empty(),_.length||(_=Ht('<div class="tc-upload-preview tc-hidden"></div>'),a.append(_)),_.empty(),i=(i=Pt.data("num_uploads"))||[],c=n.closest(".cpf-element").attr("data-uniqid"),i[c]||(i[c]=[]),(s||0<t.length)&&m&&m.createObjectURL?("yes"===Mt.tm_epo_upload_inline_image_preview&&(1<t.length?_.addClass("multiple"):_.removeClass("multiple"),_.removeClass("tc-hidden")),r=function(t,e,a,i,o){var a=n[0].files&&n[0].files[a]&&n[0].files[a].size?n[0].files[a].size:0,r='<div class="tc-upload-image">';e?r=r+'<img src="'+e+'">':r+='<div class="tc-file-ext-overlay"></div>',r=r+'<div class="tc-file-name">'+t.name+"</div>",(F||k)&&(r+='<button type="button" class="tc-upload-remove"><svg width="26" height="26" viewBox="0 0 26 26" xmlns="http://www.w3.org/2000/svg"><path d="M11.586 13l-2.293 2.293a1 1 0 0 0 1.414 1.414L13 14.414l2.293 2.293a1 1 0 0 0 1.414-1.414L14.414 13l2.293-2.293a1 1 0 0 0-1.414-1.414L13 11.586l-2.293-2.293a1 1 0 0 0-1.414 1.414L11.586 13z" fill="currentColor" fill-rule="nonzero"/></svg></button>'),r=(r=o?r+'<div class="tc-file-ext">'+o+"</div>":r)+'<div class="tc-file-size">'+(e=a,a=(o=(t=Math).log)(e)/o(1024)|0,(e/t.pow(1024,a)).toFixed(a?2:0))+" "+(a?"KMGTPEZY"[--a]+"B":"bytes")+"</div>",i.append(r+="</div>")},t.forEach(function(t,e){var a;"yes"===Mt.tm_epo_upload_inline_image_preview&&(a=Ht('<div class="tc-upload-file"></div>'),_.append(a),(o=new Image).onload=function(){r(t,this.src,e,a)},o.onerror=function(){r(t,!1,e,a,t.name.split(".").pop())},0<p.length?o.src=p[e]:(o.src=m.createObjectURL(t),m.revokeObjectURL(t))),i[c].push(t.name)}),Pt.data("num_uploads",i)):delete i[c],i[c]&&0===i[c].length&&delete i[c]}),C.on("click",".tc-upload-remove",function(){var t,e,a,i,o,r,c,n,l=Ht(this);(F||k)&&(e=(t=l.closest(".cpf-element")).find(".tm-epo-field"),c=l.closest(".tc-upload-file"),r=(l=l.closest(".tmcp-field-wrap")).find(".tc-upload-preview"),l=l.find(".tm-filename"),a=c.index(),void 0!==(n=e.val().replace("C:\\fakepath\\",""))&&"undefined"!==n||(n=""),(o=Array.from(e[0].files)).splice(a,1),i=new F("").clipboardData||new k,o.forEach(function(t){i.items.add(t)}),1<o.length?r.addClass("multiple"):r.removeClass("multiple"),e[0].files=i.files,c.remove(),1<i.files.length?l.html(i.files.length+" "+(1===i.files.length?Mt.i18n_file:Mt.i18n_files)):1===i.files.length?l.html(n):l.empty(),(o=(o=Pt.data("num_uploads"))||[])[r=t.closest(".cpf-element").attr("data-uniqid")]||(o[r]=[]),o[r].splice(a,1),0===o[r].length&&(delete o[r],e.val("")),(c=e.next(".tmcp-upload-hidden")).length&&(0<(n=c.val().split("|")).length&&n.splice(a,1),0===n.length?c.remove():c.val(n.join("|"))),Pt.data("num_uploads",o))}),y.off("change.cpf input.cpf").on("change.cpf input.cpf",function(){var t=Ht(this);Et.trigger("tm-epo-check-dpd"),t.data("tm-prev-value",t.val()),Et.trigger({type:"tm-epo-update",norules:2})}).data("tm-prev-value",y.val()),Pt.find(".cpf-type-product").off("tc-logic").on("tc-logic",function(){var t=Ht(this);t.find(".tc-init").length||t.data("isactive")&&!t.data("donetclogic")&&(t.data("donetclogic",!0),t.find(".tc-epo-field-product").trigger("change.cpfproduct",{forced:3}))}),Pt.find(".cpf-type-product .tc-epo-field-product.tc-epo-field-product-checkbox").off("change.cpfrequired").on("change.cpfrequired",function(){var t,e,a=Ht(this).closest(".cpf-element");a.is(".tc-is-required")&&(e=(t=a.find(".tmcp-field.tc-epo-field-product-checkbox")).not(":checked"),(0<(a=a.find(".tmcp-field.tc-epo-field-product-checkbox:checked")).length?(e.prop("required",!1),a):(t.attr("required",!0),t)).prop("required",!0))}),Pt.find(".cpf-type-product .tc-epo-field-product").off("change.cpfproduct").on("change.cpfproduct",function(t,e){var a,i,o,r,c,n,l=Ht(this),d=l.closest(".cpf-element"),s=d.find(".tc-epo-element-product-container-wrap"),p=l.closest(".tmcp-field-wrap").find(".tc-epo-element-product-container-wrap"),m=0<p.length,_=!1,f=1e3,u=l,h=d.find(".tm-epo-field").not(".tc-epo-element-product-li-container .tm-epo-field"),g=h.filter(":checked"),v=l.attr("data-counter");if(!1!==d.data("isactive")&&(!e||2!==e.forced)&&(void 0===t.isTrigger||!l.data("triggeredonce")||e&&e.forced)){if(l.data("triggeredonce",1),l.is(":checkbox")||(f=t.isTrigger),h.is(":radio")?0<g.length&&(n=g.closest(".tmcp-field-wrap").find("input.tm-qty")):h.is(":checkbox")?0<g.length&&(n=l.closest(".tmcp-field-wrap").find("input.tm-qty")):n=h.closest(".tmcp-field-wrap").find("input.tm-qty"),l.is(":checkbox"))if(l.is(".tc-epo-field-product-hidden"))l.is(":checked")?s.addClass("tc-active-product"):s.removeClass("tc-active-product"),a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden");else{if(l.is(":checked"))m&&p.removeClass("tm-hidden");else{if(m&&p.addClass("tm-hidden"),!e||!e.forced)return;_=!0}_||(a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"))}else if(l.is(":radio")){if(l.is(":checked"))m&&(s.addClass("tm-hidden"),p.removeClass("tm-hidden"));else{if(m&&p.addClass("tm-hidden"),!e||!e.forced)return;_=!0}_||(a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"))}else l.is("select")&&(v=(u=t=l.children(":selected")).index(),""===l.children(":first").val()&&v--,a=l.val(),i=t.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"));if(o=(l.is(".tc-epo-field-product-checkbox")?p:d).find(".tc-epo-element-product-container"),r=o.filter('[data-product_id="'+a+'"]'),c=r.find(Lt.associateQtySelector),""!==s.html()&&n&&0<n.length&&0===c.length&&n.val(0),l.is(":checkbox"))l.is(".tc-epo-field-product-hidden")&&(l.is(":checked")?"0"===c.val()&&"0"!==c.attr("min")&&c.val(c.attr("min")).trigger("change"):(c.val(0),c.closest(".tm-quantity-alt").removeClass("tm-hidden"),1!==e.forced&&c.closest(".tm-quantity-alt").find(".single_add_to_cart_product").trigger("cpfqtybutton"),s.find(Lt.associatedEpoCart).trigger("tm-epo-update")));else{if(!l.is(":radio")&&!l.is("select"))return;l.val()&&!l.data("set_initial")&&"0"===c.val()&&("0"!==c.attr("min")&&c.val(c.attr("min")).trigger("change"),l.data("set_initial",1))}a?0===r.length?(g={action:"wc_epo_get_associated_product_html",product_id:a,parent_id:Pt.attr("data-product-id"),mode:d.attr("data-mode"),layout_mode:d.attr("data-product-layout-mode"),uniqid:d.attr("data-uniqid"),name:l.attr("name"),counter:v,quantity_min:d.attr("data-quantity-min"),quantity_max:d.attr("data-quantity-max"),priced_individually:d.attr("data-priced-individually"),discount:d.attr("data-discount"),discount_type:d.attr("data-discount-type"),discount_exclude_addons:d.attr("data-discount-exclude-addons"),show_image:d.attr("data-show-image"),show_title:d.attr("data-show-title"),show_title_link:d.attr("data-show-title-link"),show_price:d.attr("data-show-price"),show_description:d.attr("data-show-description"),show_meta:d.attr("data-show-meta"),disable_epo:d.attr("data-disable-epo")},d.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),Ht.ajax({url:Mt.ajax_url,type:"POST",data:g,dataType:"json",success:function(t){200===t.result&&(r=Ht(t.html),(m?l.closest(".tmcp-field-wrap").find(".tc-epo-element-product-container-wrap").empty():d.find(".tc-epo-element-product-container-wrap")).append(r),le(Ft,0,r,i,l,Et,o,f,c),r.find(Lt.associateQtySelector).trigger("change"))},complete:function(){d.unblock()}})):(le(Ft,0,r,i,l,Et,o,f,c),r.find(Lt.associateQtySelector).trigger("change")):(o.addClass("tm-hidden"),h=Ht.epoAPI.util.parseJSON(u.attr("data-rules"))[0]||0,_=Ht.epoAPI.util.parseJSON(u.attr("data-original-rules"))||0,u.is(".tcenabled")&&u.data("associated_price_set",1),u.data("price_set",1),u.data("raw_price",h),u.data("raw_original_price",_),u.data("price",h),u.data("original_price",_),t=!1,(p=(p=u).is("option")?u.closest("select"):p).is(".tc-epo-field-product")&&(!p.is("select")&&(p.is(":checkbox")||p.is(":radio"))?p.is(":checked")&&(t=!0):""!==p.val()&&(t=!0)),te(u.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),h,t?Wt(h):u.data("price-html"),_,t?Wt(_):""),y.trigger("change.cpf"))}}),C.off("click.cpfqtybutton cpfqtybutton",".cpf-type-product .single_add_to_cart_product").on("click.cpfqtybutton cpfqtybutton",".cpf-type-product .single_add_to_cart_product",function(){var t,e,a=Ht(this),i=a.closest(".tm-quantity-alt").find(Lt.associateQtySelector),o=a.is(".alt"),r=a.closest(".cpf-element").find(".tc-epo-element-product-container-wrap");a.data("inittriggeredonce")&&(t=Ht.epoAPI.math.toInt(i.attr("data-min")),e=Ht.epoAPI.math.toInt(i.attr("data-max")),o?(r.addClass("tc-active-product"),i.attr("min",t),e&&i.attr("max",e),"0"===i.val()&&("0"===i.attr("min")?i.val(1):i.val(i.attr("min"))).trigger("change"),a.removeClass("alt").text(a.attr("data-remove"))):(r.removeClass("tc-active-product"),i.val(0).trigger("change"),i.closest(".tm-quantity-alt").removeClass("tm-hidden"),a.addClass("alt").text(a.attr("data-add")))),a.data("inittriggeredonce",1),r.find(Lt.associatedEpoCart).trigger("tm-epo-update")}),C.off("change.cpfqtyalt input.cpfqtyalt",".cpf-type-product "+Lt.associateQtySelector).on("change.cpfqtyalt input.cpfqtyalt",".cpf-type-product "+Lt.associateQtySelector,function(){var t,e=Ht(this),a=e.closest(".cpf-element").find(".tm-epo-field").not(".tc-epo-element-product-li-container .tm-epo-field"),i=e.closest(".tm-quantity-alt").find(".single_add_to_cart_product"),o=a.filter(":checked"),r=Ht.epoAPI.math.toInt(e.attr("min")),c=Ht.epoAPI.math.toInt(e.attr("max"));if(a.is(".tc-epo-field-product-hidden")&&a.is(":checkbox")&&(0===o.length&&"0"!==e.val()?(a.prop("checked",!0).trigger("change"),o=a.filter(":checked")):"0"===e.val()&&o.length&&a.prop("checked",!1).trigger("change")),a.is(":radio")){if(0===o.length)return;t=o.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty")}else if(a.is(":checkbox")){if(0===o.length)return;t=e.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty")}else t=a.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty");0!==t.length&&(t.attr("min",r),c&&t.attr("max",c),(o=e.closest(".tc-epo-element-product-container").find(Lt.associatedEpoCart)).trigger("tm-epo-update"),t.val(e.val()),0<Ht.epoAPI.math.toFloat(e.val())?(o.find(".tm-epo-field.tcenabled").removeClass("ignore"),e.removeClass("ignore")):(o.find(".tm-epo-field.tcenabled").addClass("ignore"),e.addClass("ignore")),a.trigger("change.cpfproduct",{forced:2}),i.data("inittriggeredonce")&&("0"===e.val()?i.removeClass("alt"):i.addClass("alt")),i.trigger("cpfqtybutton"))}),Et.off("tm-epo-update").on("tm-epo-update",function(t){var D,B,e,a,N,H,L,M,i,R,U,J,o,r,c,Q,n,$,Z,W,l,d,X,G,V,Y,K,tt,s,p,m,et,at,it,_,f,ot,rt,ct,nt,lt,dt,u,st,h,g,v,pt,mt,y=Ht(this),b=!1,_t=0,w=0,x=0,F=0,k=!1,ft=!0,A=[],P=0,I=0,C={},E=0,ut=!1,ht=!1,gt=!1,vt="",yt=!1,bt=!1,wt="",xt="",q=0,S=0,T=0,j=0,O=0,z=t.epoObject?Ht.extend(!0,{},t.epoObject):Ht.extend(!0,{},Ft);z&&!z.noEpoUpdate&&(Rt.trigger("tcEpoUpdateStart",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt}),D=Ht.epoAPI.applyFilter("tc_get_bundleid",y.attr("data-product_id"),y,z),B=Ct.attr("data-price-override"),g=y,g=Ht.epoAPI.applyFilter("tc_getCurrentQty",Ht.epoAPI.math.toFloat(Kt(g).val()),g),pt=(v=(v=y).is(".tc-epo-element-product-container-cart")&&((pt=v.closest(".cpf-element")).is(".cpf-type-product-thumbnailmultiple")||pt.is(".cpf-type-product-checkbox")?mt=v.closest(".tc-epo-element-product-holder").find(".tc-epo-element-product-container-variation-id"):(pt.is(".cpf-type-product-thumbnail")||pt.is(".cpf-type-product-radio")||pt.is(".cpf-type-product-dropdown")||pt.is(".cpf-type-product-single"))&&(mt=pt.find(".tc-epo-element-product-container-variation-id")),mt)&&mt.length?mt:v).find(Zt(v)).val()||0,z.associated_connect&&1===z.associated_connect.length&&(g=parseFloat(z.main_product.find(Lt.associateQtySelector).not(Lt.associatedEpoSelector+" "+Lt.qtySelector).last().val())),t.stopImmediatePropagation(),_t=b=Ht.epoAPI.applyFilter("tcGetCurrentProductPrice",oe(Ct,!0),Et,Ct),w=mt=Ht.epoAPI.applyFilter("tcGetCurrentProductRegularPrice",ie(Ct,!0),Et,Ct),b=Ht.epoAPI.applyFilter("tcCalculateCurrentProductPrice",b,{epo:z,alternativeCart:At,cart:y,main_product:Ot}),Number.isFinite(g)||!Ct.attr("data-is-sold-individually")&&0!==Kt(y).length||(g=1),Ct.data("totalsHolder_tc_totals_ob",v={qty:g,product_price:_t,original_product_price:w}),t.norules?t.norules&&(1===t.norules&&Vt(z,t.element),Ht.tcepo.lateFieldsPrices[Bt]=[],Pt.find(".tm-epo-late-field").toArray().forEach(function(t){(t=Ht(t)).data("price",0),Ht.tcepo.lateFieldsPrices[Bt].push({setter:t,price:t.data("tm-price-for-late"),original_price:t.data("tm-original-price-for-late"),bundleid:D,pricetype:re(z,t,"price_type")})})):ce(z,y),h=Pt.find(".tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&(b=(l=Yt(z,Pt,".tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)",0,0,A,k,void 0,void 0,void 0,!0)).total,O=b,w=l.original_total,It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),z.associated_connect&&1===z.associated_connect.length&&(d=z.associated_connect,z.associated_connect.is("select"))&&(d=z.associated_connect.find("option:selected")),!1===b?(Ct.data("tm-floating-box-data",[]),Ct.empty(),z.associated_connect&&1===z.associated_connect.length&&te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),0,"",0,""),zt.trigger("tm-epo-short-update",{container:kt})):(n=Ht.epoAPI.applyFilter("tcAlterElementQty",1,{epo:z,alternativeCart:At,currentCart:Et,main_product:Ot}),void 0!==Et.data("per_product_pricing")&&(ft=Et.data("per_product_pricing")),ft=Ht.epoAPI.applyFilter("tcCalculatePerProductPricing",ft,{epo:z,alternativeCart:At,cart:y,main_product:Ot}),!Nt||"woocommerce_before_add_to_cart_button"!==Mt.tm_epo_totals_box_placement||"variable"!==qt&&"variable-subscription"!==qt||Ct.data("moved_inside")||Ct.data("moved_inside",1),Rt.trigger("tcEpoBeforeOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:0,cart_fee_options_original_total:0}),z.associated_connect||t.noassociated||"yes"!==Mt.tm_epo_global_product_element_quantity_sync||y.is(Ht.tcAPI().associatedEpoCart)||y.find(Ht.tcAPI().associatedEpoCart).filter(":visible").toArray().forEach(function(t){Ht(t).trigger({type:"tm-epo-update",noassociated:1})}),l=Yt(z,Pt,".tmcp-field:not(.tmcp-dynamic,.tc-epo-field-product, .tc-is-math-special, .tc-is-math-cumulative)",x,F,A,k),x=l.total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p=l.elementsLength,m=(l=Yt(z,Pt,".tc-epo-field-product",0,0,A,k)).total,et=l.original_total,at=l.total_taxed,it=l.original_total_taxed,u=l.vat_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,Ct.data("tm-floating-box-data",A),P=(l=Yt(z,Pt,".tmcp-fee-field",0,0,A,k,!1,!0)).total,I=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,Rt.trigger("tcEpoAfterNormalOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:P,cart_fee_options_original_total:I}),e=x,a=F,_=ne(z,parseFloat(b),parseFloat(w),parseFloat(e+m),parseFloat(a+et),D,Ct),l=Yt(z,Pt,".tmcp-field.tc-is-math-special:not(.tmcp-dynamic)",x,F,A,k,void 0,void 0,void 0,!0),x=l.total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,e=x,a=F,e+=_.normal[0],a+=_.normal[1],P+=_.fees[0],I+=_.fees[1],x=(l=Yt(z,Pt,".tmcp-field.tc-is-math-cumulative:not(.tmcp-dynamic)",x=e,F=a,A,k,void 0,void 0,void 0,!0,!0)).total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,e=x,a=F,h=Pt.find(".tmcp-dynamic.dynamic-product-price.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price.tc-is-math-special"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-special",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.dynamic-product-price"),0<!(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price"):h).filter(".tcenabled")).length&&It.find(".cpf-dynamic-product-price").val(""),O=0,h=Pt.find(".tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,[],!0,!0).total;t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),h=Pt.find(".tmcp-dynamic.calculation.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation.tc-is-math-special"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-field.tmcp-dynamic.calculation.tc-is-math-special",O+x,O+F,[],!0,!0,void 0,void 0,!0),a=Ht.epoAPI.math.toFloat(a.total)-Ht.epoAPI.math.toFloat(x);t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),h=Pt.find(".tmcp-dynamic.calculation.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-field.tmcp-dynamic.calculation.tc-is-math-cumulative",O+x,O+F,[],!0,!0,void 0,void 0,!0),a=Ht.epoAPI.math.toFloat(a.total)-Ht.epoAPI.math.toFloat(x);t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),O=0,h=Pt.find(".tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,[],!0,!0);t.find(".tc-result").html(e.total)}),h=Pt.find(".tmcp-dynamic.change-product-weight.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight.tc-is-math-special"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-special",O+x,O+F,[],!0,!0,void 0,void 0,!0);t.find(".tc-result").html(Ht.epoAPI.math.toFloat(e.total)-Ht.epoAPI.math.toFloat(x))}),h=Pt.find(".tmcp-dynamic.change-product-weight.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-cumulative",O+x,O+F,[],!0,!0,void 0,void 0,!0);t.find(".tc-result").html(Ht.epoAPI.math.toFloat(e.total)-Ht.epoAPI.math.toFloat(x))}),O=0,h=Pt.find(".tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,A,k),b=O=l.total,w=l.original_total,a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price.tc-is-math-special"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-special",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-cumulative",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price"),0<!(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price"):h).filter(".tcenabled")).length?It.find(".cpf-override-product-price").val(""):a=e=0,Rt.trigger("tcEpoAfterOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:P,cart_fee_options_original_total:I}),setTimeout(function(){Pt.find("select.tm-epo-field").trigger("tm-select-price-update-html-all")},1),Ht.tcepo.oneOptionIsSelected[Bt]=k,z=ae(z,Bt,p),ee(Ot,z),0<P&&(k=!0),At&&!ft&&(k=!1),"enable"!==St&&"hideifoptionsiszero"!==St&&"hideiftotaliszero"!==St||(k=!0),1<g&&(k=!0),"variable"!==qt&&"variable-subscription"!==qt||Ht.epoAPI.math.toFloat(pt)||(k=!1),"disable"===St&&(k=!1),"yes"!==Mt.tm_epo_change_variation_price&&"yes"!==Mt.tm_epo_change_original_price||(k=!0),z.is_associated&&!ft&&(k=!1),"yes"===Mt.tm_epo_total_price_as_unit_price&&(g=1),l=parseFloat(b*g),Mt.extraFee&&(E=parseFloat(Mt.extraFee),Number.isFinite(E)||(E=0)),!1!==(v=Ht.epoAPI.applyFilter("tcCalculateFinalProductPrice",!1,{alternativeCart:At,product_price:b,product_total_price:l,v_product_price:_t,tm_set_tax_price:Jt,main_product:Ot,totalsHolder:Ct,cartQty:g}))&&"object"==typeof v&&Object.prototype.hasOwnProperty.call(v,"productPrice")&&Object.prototype.hasOwnProperty.call(v,"productTotalPrice")&&(b=v.productPrice,l=v.productTotalPrice),e=Ht.epoAPI.applyFilter("tc_adjust_options_price_per_unit",e,l),x=parseFloat(e*g*n),x=Ht.epoAPI.applyFilter("tc_adjust_options_total_price",x,g,n,e,Ct),T="no"===Mt.tm_epo_global_product_element_quantity_sync?(q=parseFloat(m),parseFloat(at)):(q=parseFloat(m*g*n),parseFloat(at*g*n)),q=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_total_price",q,g,n,e,Ct),T=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_total_price_taxed",T,g,n,e,Ct),a=Ht.epoAPI.applyFilter("tc_adjust_options_price_per_unit",a,l),F=parseFloat(a*g*n),F=Ht.epoAPI.applyFilter("tc_adjust_options_original_total_price",F,g,n,a,Ct),j="no"===Mt.tm_epo_global_product_element_quantity_sync?(S=parseFloat(et),parseFloat(it)):(S=parseFloat(et*g*n),parseFloat(it*g*n)),S=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_original_total_price",S,g,n,a,Ct),j=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_original_total_price_taxed",j,g,n,a,Ct),"1"===B&&0<parseFloat(x)&&(l=_t=b=0),l=Ht.epoAPI.applyFilter("tc_adjust_product_total_price_without_options",l),x=Ht.epoAPI.applyFilter("tcAdjustTotal",x,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),q=Ht.epoAPI.applyFilter("tcAdjustProductFieldTotal",q,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),T=Ht.epoAPI.applyFilter("tcAdjustProductFieldTotalTaxed",T,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),F=Ht.epoAPI.applyFilter("tcAdjustOriginalTotal",F,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),S=Ht.epoAPI.applyFilter("tcAdjustProductFieldOriginalTotal",S,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),j=Ht.epoAPI.applyFilter("tcAdjustProductFieldOriginalTotalTaxed",j,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),x=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_total",x,Ct)),P=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_totals_fee",P,Ct)),F=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_original_total",F,Ct)),I=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_original_total_fee",I,Ct)),h=E,A=e,at=m=(p=x)+(v=P),et=a,$=J=(it=F)+(n=I),Z=l,W=parseFloat(l+m+h),h=parseFloat(w+J+h),b=Jt(b,Ct,void 0,0,void 0,void 0,!0),mt=Jt(mt,Ct,void 0,0,void 0,void 0,!0),l=Jt(l,Ct,void 0,0,void 0,void 0,!0),x=Jt(x,Ct,void 0,0,void 0,void 0,!0),e=Jt(e,Ct,void 0,0,void 0,void 0,!0),P=Jt(P,Ct,void 0,0,void 0,void 0,!0),m=parseFloat(P)+parseFloat(x),F=Jt(F,Ct,void 0,0,void 0,void 0,!0),a=Jt(a,Ct,void 0,0,void 0,void 0,!0),I=Jt(I,Ct,void 0,0,void 0,void 0,!0),J=parseFloat(I)+parseFloat(F),E=Jt(E,Ct,void 0,0,void 0,void 0,!0),o=l,l=Ht.epoAPI.applyFilter("tc_adjust_product_total_price",parseFloat(l+m+E),o,m,E,x,P,Ct),U=Ht.epoAPI.applyFilter("tc_adjust_product_total_original_price",parseFloat(o+J+E),o,J,E,F,I,Ct),u="1"===(Ct.attr("data-prices-include-tax")||Mt.prices_include_tax)?(ot=u+parseFloat(Ut(x,Ct)),rt=u+parseFloat(Ut(m,Ct)),lt=u+parseFloat(Ut(l,Ct)),parseFloat(Ut(o,Ct))):(ot=u+parseFloat(x-p),rt=u+parseFloat(m-at),lt=u+parseFloat(l-W),parseFloat(o-Z)),p+=q,A+=q,at+=q,it+=S,et+=S,$+=S,W+=q,h+=S,x+=T,e+=T,m+=T,F+=j,a+=j,J+=j,l+=T,U+=j,q=parseFloat(b+parseFloat(e)),S=parseFloat(b+parseFloat(a)),"yes"===Mt.tm_epo_fees_on_unit_price&&(q=parseFloat(b+parseFloat(e)+parseFloat(parseFloat(P)/g)),S=parseFloat(b+parseFloat(a)+parseFloat(parseFloat(I)/g))),T=Wt(q,Ct,!0,!0),j=Wt(S,Ct,!0,!0),E&&(yt=!0,vt=Wt(E,Ct,!0,!0)),i=Wt(l,Ct,!0,!0),R=Wt(U,Ct,!0,!0),N=Wt(x,Ct,!0,!0),L=Wt(P,Ct,!0,!0),H=Wt(F,Ct,!0,!0),M=Wt(I,Ct,!0,!0),ct=Wt(ot),nt=Wt(rt),dt=Wt(lt),st=Wt(u),T=Ht.epoAPI.applyFilter("tc_adjust_formatted_unit_price",T,b,e,P,g),N=Ht.epoAPI.applyFilter("tc_adjust_formatted_options_total",N,x,e,g),L=Ht.epoAPI.applyFilter("tc_adjust_formatted_fees_total",L,P),i=Ht.epoAPI.applyFilter("tc_adjust_formatted_final_total",i,l,o,m,E,g),T=Ht.epoAPI.applyFilter("tcAdjustFormattedUnitPrice",T,{epo:z,totalsHolder:Ct,event:t,unit_price:q,productPrice:b,_total:e,total_plcart_fee_options_totals_fee:P,cartQty:g}),j=Ht.epoAPI.applyFilter("tcAdjustFormattedUnitOriginalPrice",j,{epo:z,totalsHolder:Ct,event:t,unit_original_price:S,productPrice:b,_original_total:a,total_plcart_fee_options_totals_fee:P,cartQty:g}),N=Ht.epoAPI.applyFilter("tcAdjustFormattedOptionsTotal",N,{epo:z,totalsHolder:Ct,event:t,total:x,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),H=Ht.epoAPI.applyFilter("tcAdjustFormattedOptionsOriginalTotal",H,{epo:z,totalsHolder:Ct,event:t,original_total:F,_original_total:a,original_total_plus_fee:J,extraFee:E,cartQty:g}),L=Ht.epoAPI.applyFilter("tcAdjustFormattedFeesTotal",L,{epo:z,totalsHolder:Ct,event:t,cart_fee_options_total:P,extraFee:E,cartQty:g}),M=Ht.epoAPI.applyFilter("tcAdjustFormattedFeesOriginalTotal",M,{epo:z,totalsHolder:Ct,event:t,cart_fee_options_original_total:I,extraFee:E,cartQty:g}),i=Ht.epoAPI.applyFilter("tcAdjustFormattedFinalTotal",i,{epo:z,totalsHolder:Ct,event:t,product_total_price:l,product_total_price_without_options:o,total_plus_fee:m,extraFee:E,cartQty:g}),R=Ht.epoAPI.applyFilter("tcAdjustFormattedFinalOriginalTotal",R,{epo:z,totalsHolder:Ct,event:t,product_total_original_price:U,product_total_price_without_options:o,original_total_plus_fee:J,extraFee:E,cartQty:g}),(0<x&&"showtgz"===jt||"show"===jt)&&(ut=!0,"yes"===Mt.tm_epo_enable_vat_options_total)&&(ht=!0),0!==P&&(gt=!0),i&&"show"===Tt&&(bt=!0),C={qty:g,product_price:b,raw_product_price:_t,product_regular_price:mt,raw_product_regular_price:w,formatted_product_price:Wt(parseFloat(b)*g),late_total_prices:_,late_total_price:Jt(_[0],Ct),late_total_original_price:Jt(_[1],Ct),raw_options_price_per_unit:A,raw_options_total_price:p,raw_cart_fee_options_total_price:v,raw_total_plus_fee:at,raw_options_original_price_per_unit:et,raw_options_original_total_price:it,raw_cart_fee_options_original_total_price:n,raw_original_total_plus_fee:$,raw_product_total_price:W,raw_product_total_original_price:h,raw_product_total_price_without_options:Z,options_price_per_unit:e,options_total_price:x,cart_fee_options_total_price:P,total_plus_fee:m,options_original_price_per_unit:a,options_original_total_price:F,cart_fee_options_total_original_price:I,original_total_plus_fee:J,vat_options_total:ot,vat_options_total_plus_fee:rt,formatted_vat_options_total:ct,formatted_vat_options_total_plus_fee:nt,vat_total:lt,formatted_vat_total:dt,vat_product_base:u,formatted_vat_product_base:st,product_total_price:l,product_total_original_price:U,product_total_price_without_options:o,product_unit_price:q,product_unit_original_price:S,formatted_unit_price:T,formatted_options_total:N,formatted_fees_total:L,formatted_final_total:i,formatted_unit_original_price:j,formatted_options_original_total:H,formatted_fees_original_total:M,formatted_final_original_total:R,formatted_extra_fee:vt,show_options_total:ut,show_fees_total:gt,show_extra_fee:yt,show_final_total:bt,show_options_vat:ht,unit_price:Mt.i18n_unit_price,show_unit_price:"yes"===Mt.tm_epo_show_unit_price,options_total:Mt.i18n_options_total,fees_total:Mt.i18n_fees_total,extra_fee:Mt.i18n_extra_fee,final_total:Mt.i18n_final_total,options_vat_total:Mt.i18n_vat_options_total,totals_box_before_unit_price:Mt.totals_box_before_unit_price,totals_box_after_unit_price:Mt.totals_box_after_unit_price,totals_box_before_vat_options_totals_price:Mt.totals_box_before_vat_options_totals_price,totals_box_after_vat_options_totals_price:Mt.totals_box_after_vat_options_totals_price,totals_box_before_options_totals_price:Mt.totals_box_before_options_totals_price,totals_box_after_options_totals_price:Mt.totals_box_after_options_totals_price,totals_box_before_fee_totals_price:Mt.totals_box_before_fee_totals_price,totals_box_after_fee_totals_price:Mt.totals_box_after_fee_totals_price,totals_box_before_extra_fee_price:Mt.totals_box_before_extra_fee_price,totals_box_after_extra_fee_price:Mt.totals_box_after_extra_fee_price,totals_box_before_final_totals_price:Mt.totals_box_before_final_totals_price,totals_box_after_final_totals_price:Mt.totals_box_after_final_totals_price},Mt.customer_price_format&&(wt=Mt.customer_price_format_wrap_start,xt=Mt.customer_price_format_wrap_end,Q=Mt.customer_price_format),N&&0<x&&(_=Qt(x),A=Qt(F),Q&&(_=Q.replace("__PRICE__",_).replace("__CODE__",Mt.current_currency),Ct.data("is-on-sale")||(A=Q.replace("__PRICE__",A).replace("__CODE__",Mt.current_currency))),_=Ht.epoAPI.applyFilter("tcFilterFormattedFTotal",_,{epo:z,totalsHolder:Ct,event:t,total:x,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),A=Ht.epoAPI.applyFilter("tcFilterFormattedFOriginalTotal",A,{epo:z,totalsHolder:Ct,event:t,original_total:F,total:F,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),"yes"===Mt.tm_epo_enable_original_final_total&&x!==F?(C.formatted_options_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:A,sale_price:_,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})),C._foriginal_total=A,C._ftotal=_):C.formatted_options_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:_,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})))),i&&0<=l&&(r=Qt(l),c="1"===B&&0<parseFloat(x)?parseFloat($+E):parseFloat(parseFloat(w*g)+$+E),Q&&(r=Q.replace("__PRICE__",r).replace("__CODE__",Mt.current_currency),Ct.data("is-on-sale")||(c=Q.replace("__PRICE__",c).replace("__CODE__",Mt.current_currency))),r=Ht.epoAPI.applyFilter("tc_adjust_native_price",r,l),c=Qt(c=Jt(c,Ct,void 0,0,void 0,void 0,!0)),c=Ht.epoAPI.applyFilter("tc_adjust_native_regular_price",c,l),"yes"===Mt.tm_epo_enable_original_final_total&&(Ct.data("is-on-sale")&&"1"!==B||c!==r)?C.formatted_final_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})):C.formatted_final_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt}))),C._f_regular_price=c,C._fprice=r),C=Xt("formatted_fees_original_total","cart_fee_options_total_original_price",C,Ct),C=Xt("formatted_fees_total","cart_fee_options_total_price",C,Ct),C=Xt("formatted_final_original_total","product_total_original_price",C,Ct),C=Xt("formatted_final_total","product_total_price",C,Ct),C=Xt("formatted_options_original_total","options_original_total_price",C,Ct),C=Xt("formatted_options_total","options_total_price",C,Ct),C=Xt("formatted_unit_original_price","product_unit_original_price",C,Ct),C=Xt("formatted_unit_price","product_unit_price",C,Ct),void 0!==Ht.tcepo.showHideTotal&&void 0!==Ht.tcepo.showHideTotal[Bt]&&(k=Ht.tcepo.showHideTotal[Bt]),void 0!==(C=Ht.epoAPI.applyFilter("tc_adjust_tc_totals_ob",C,{epo_object:z,showTotal:k,epoHolder:Pt,totalsHolder:Ct,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g})).showTotal&&(k=C.showTotal),z.tc_totals_ob=C,k=Ht.epoAPI.applyFilter("tcFinalTotalsBoxVisibility",k,{epo:z,alternativeCart:At,cart:y,main_product:Ot,totalsHolder:Ct,this_epo_totals_container:Dt}),p=Ht.epoAPI.template.html(Lt.templateEngine.tc_final_totals,C),Ct.data("tm-html",p),Ct.data("tc_totals_ob",C),z.associated_connect&&1===z.associated_connect.length&&("1"===z.associated_connect.attr("data-no-price")?(Y=V=G=X=0,tt=K="",te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),X,K,V,tt)):(X=C.product_price+C.options_price_per_unit+C.cart_fee_options_total_price/C.qty,G=C.raw_product_price+C.raw_options_price_per_unit+C.raw_cart_fee_options_total_price/C.qty,V=C.product_regular_price+C.options_original_price_per_unit+C.cart_fee_options_total_original_price/C.qty,Y=C.raw_product_regular_price+C.raw_options_original_price_per_unit+C.raw_cart_fee_options_original_total_price/C.qty,K=$t(X,z.this_epo_totals_containe,!1,!1,d),tt=$t(V,z.this_epo_totals_containe,!1,!1,d),te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),X,K,V,tt),z.associated_connect.data("tm-quantity",C.qty),z.associated_connect.data("tm-quantity")&&(X*=parseFloat(z.associated_connect.data("tm-quantity")),G*=parseFloat(z.associated_connect.data("tm-quantity")),V*=parseFloat(z.associated_connect.data("tm-quantity")),Y*=parseFloat(z.associated_connect.data("tm-quantity"))),K=$t(X,z.this_epo_totals_containe,!1,!1,d),tt=$t(V,z.this_epo_totals_containe,!1,!1,d)),z.associated_connect.data("price_set",1),d.is(".tcenabled")&&d.data("associated_price_set",1),d.data("price_set",1),d.data("raw_price",G),d.data("raw_original_price",Y),d.data("price",Jt(X,z.this_epo_totals_containe,d)),d.data("original_price",Jt(V,z.this_epo_totals_containe,d)),z.associated_connect.data("price-changed",1),setTimeout(function(){z.associated_connect&&t.noassociated||z.mainEpoObject.main_cart.trigger({type:"tm-epo-update",norules:2})},20)),Rt.trigger("tcEpoAfterCalculateTotals",{epo:z,alternativeCart:At,this_product_type:qt,cart:y,bundleid:D,totalsObject:C,main_product:Ot,per_product_pricing:ft}),v=Ht.epoAPI.applyFilter("hide_native_price",!0),0<g?("yes"===Mt.tm_epo_change_variation_price&&(!0===v&&"disable"!==St?Gt(y).hide():Gt(y).show()),!k||"disable"===St||"hideiftotaliszero"===St&&0===l||"hideifoptionsiszero"===St&&0===m?(Ct.html(p=""),Ct.data("tm-floating-box-data",[])):(Ct.html(p),Rt.trigger("tc-totals-container",{epo:C,totals_holder:Ct,data:{epo_object:z,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g},tm_epo_js:Mt})),i&&0<=l&&(at=Gt(y),"yes"===Mt.tm_epo_change_variation_price&&(f=(f=Ct.data("is-on-sale")?Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.variation_price_before_price_text,after_price_text:Mt.variation_price_after_price_text})),raw:C.product_total_price},Ct):Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.variation_price_before_price_text,after_price_text:Mt.variation_price_after_price_text})),raw:C.product_total_price},Ct)).formatted,at.html(f).show()),"yes"===Mt.tm_epo_change_original_price)&&(At&&0!==Ot.find(".cpf-bto-price").length||(void 0===(s=0===(s=z.associated_connect?z.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).length&&Ot.is(".tc-after-shop-loop")?Ot.closest(".product").find(".price"):s).data("tc-original-html")&&s.data("tc-original-html",s.html()),0<l?(f=(f=Ct.data("is-on-sale")?Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.product_price_before_price_text,after_price_text:Mt.product_price_after_price_text})),raw:C.product_total_price},Ct):Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.product_price_before_price_text,after_price_text:Mt.product_price_after_price_text})),raw:C.product_total_price},Ct)).formatted,s.html(f).show()):qt&&"composite"!==qt&&(z.associated_connect?(!z.variations_form.length||0<(f=z.this_epo_totals_container.data("variationIdElement")).length&&(f=parseFloat(f.val()))&&0!==f)&&s.html(Ht.epoAPI.util.decodeHTML(Mt.assoc_current_free_text)):s.html(Ht.epoAPI.util.decodeHTML(Mt.current_free_text)))),Rt.trigger("tcEpoMaybeChangePriceHtml",{epo:z,alternativeCart:At,this_product_type:qt,cart:y,bundleid:D,totalsObject:C,main_product:Ot,nativePrice:r})),At?zt.trigger({type:"tm-epo-update",norules:1}):Dt.data("is_active",!0)):(z.associated_connect&&(s=z.main_product.find(Lt.associatedNativeProductPriceSelector)).html(s.data("tc-original-html")),Gt(y).each(function(){var t=Ht(this);t.data("tm-original-html")?t.html(t.data("tm-original-html")):t.data("tm-original-html",t.html())}),0===_t&&"yes"===Mt.tm_epo_remove_free_price_label?Gt(y).hide():"yes"!==Mt.tm_epo_change_variation_price||!0===v&&"disable"!==St||Gt(y).show(),Ct.empty(),At&&zt.trigger({type:"tm-epo-update",norules:1})),zt.trigger("tm-epo-after-update",{container:kt}),Rt.trigger("tc-epo-after-update",{epo:C,totals_holder:Ct,data:{epo_object:z,add_late_fields_prices:ne,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g,bundleid:D,currentCart:Et},tm_epo_js:Mt})))}),"variable"!==qt&&"variable-subscription"!==qt||((e=Pt.find(".tm-epo-variation-section").first()).find(".tm-epo-reset-variation").off("click.cpfv").on("click.cpfv",function(){var t=Ht(this),e=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),a=t.closest(".cpf-type-variations"),i=t.closest(".cpf-element").find(".tm-epo-variation-element"),o=t.closest(".cpf-element").find(".tmcp-field-wrap");i.prop("checked",!1),o.removeClass("tc-active"),v.find("[data-attribute_name='attribute_"+e+"']").val("").trigger("change"),v.find("[data-attribute_name='attribute_"+e+"']").trigger("focusin"),Ot.find(".cpf-type-variations").not(a).each(function(t,e){v.find("[data-attribute_name='attribute_"+Ht.epoAPI.dom.id(Ht(e).find(".tm-epo-variation-element").first().attr("data-tm-for-variation"))+"']").trigger("focusin")}),t.trigger("blur"),v.trigger("woocommerce_update_variation_values_tmlogic")}),e.find("input.tm-epo-variation-element,input.tm-epo-variation-element + span").off("mouseup.cpfv").on("mouseup.cpfv",function(){var t=Ht(this);(t=t.is("span")?t.prev("input"):t).attr("disabled")&&v.find(".reset_variations").trigger("click"),t=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),v.find("[data-attribute_name='attribute_"+t+"']").trigger("focusin")}),e.off("click."+h+".tmepo",".reset_variations, .tc-epo-element-variable-reset-variations").on("click."+h+".tmepo",".reset_variations, .tc-epo-element-variable-reset-variations",{_epoObject:Ft},function(t){"yes"!==Mt.tm_epo_change_original_price||At&&0!==Ot.find(".cpf-bto-price").length||(t=t.data._epoObject.associated_connect?t.data._epoObject.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).data("tc-original-html")&&t.html(t.data("tc-original-html")),v.find(".variations .reset_variations, .tc-epo-element-variable-reset-variations").first().trigger("click")}),e.find(".tm-epo-variation-element").off("change.cpfv tm_epo_variation_element_change").on("change.cpfv tm_epo_variation_element_change",function(t){var e,a=Ht(this),i=Ht.epoAPI.dom.id(a.attr("data-tm-for-variation")),o=a.val(),r=a.closest(".cpf-type-variations"),i=v.find("[data-attribute_name='attribute_"+i+"']");a.closest(".tm-epo-variation-section").is(".tm-hidden")||(t&&t.type&&"tm_epo_variation_element_change"===t.type||(e=!1,i.each(function(){if(this.value===o)return!(e=!0)}),e||i.trigger("focusin"),i.val(o).trigger("change")),o||i.trigger("focusin"),Ot.find(".cpf-type-variations").not(r).each(function(){v.find("#"+Ht.epoAPI.dom.id(Ht(this).find(".tm-epo-variation-element").first().attr("data-tm-for-variation"))).trigger("focusin")}),a.trigger("blur"),v.trigger("woocommerce_update_variation_values_tmlogic"))}).off("focusin.cpfv").on("focusin.cpfv",function(){var t=Ht(this);t.is("select")&&(t=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),v.find("[data-attribute_name='attribute_"+t+"']").trigger("focusin"),v.trigger("woocommerce_update_variation_values_tmlogic"))}),v.off(g+"found_variation.tmepo tm_fix_stock",".single_variation_wrap").on(g+"found_variation.tmepo tm_fix_stock",".single_variation_wrap",function(){X(Ht(this),kt)}),v.off(g+"found_variation.tmepo").on(g+"found_variation.tmepo",function(t,e){var a,i,o,r,c,n,l,d=Ht(this);Ct.data("is-on-sale",e.tc_is_on_sale),Ct.data("regular-price",Z(e.display_regular_price,Ct,e)),Rt.trigger("tm-epo-found-variation",{epo:Ft,totalsHolder:Ct,totalsHolderContainer:It,currentCart:Et,variationForm:d,variation:e}),i=(e={epoHolder:Pt,totalsHolder:Ct,totalsHolderContainer:It,currentCart:Et,variationForm:d,variation:e}).epoHolder,o=e.totalsHolder,r=e.totalsHolderContainer,c=e.currentCart,n=e.variationForm,e=e.variation,l=o.data("variations"),o.data("current_variation",e),e&&"display_price"in e&&!o.data("tm-epo-is-woocs")?(a=e.display_price,o.data("priceIsWithDiscount","1"),o.removeData("tcprice")):l&&e&&e.variation_id&&void 0!==l[e.variation_id]?(a=l[e.variation_id],o.removeData("tcprice")):e&&Ht(e.price_html).find(".amount:last").length&&(a=(a=(a=(a=Ht(e.price_html).find(".amount:last").text()).replace(Mt.currency_format_thousand_sep,"")).replace(Mt.currency_format_decimal_sep,".")).replace(/[^0-9.]/g,""),a=parseFloat(a),o.removeData("tcprice")),a=Z(a,o,e),o.data("price",a),r.find(".cpf-product-price").val(a),setTimeout(function(){i.find("select.tm-epo-field").trigger("tm-select-change-html-all-math")},100),n.data("tm-styled-variations")||c.trigger({type:"tm-epo-update"}),X(d,kt)}).off(g+"hide_variation.tmepo").on(g+"hide_variation.tmepo",{_epoObject:Ft},function(t){"yes"!==Mt.tm_epo_change_original_price||At&&0!==Ot.find(".cpf-bto-price").length||(t=t.data._epoObject.associated_connect?t.data._epoObject.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).data("tc-original-html")&&t.html(t.data("tc-original-html")),Ct.data("price",!1),Ct.removeData("tcprice"),Et.trigger({type:"tm-epo-update",norules:2})}).off(g+"check_variations.tmepo").on(g+"check_variations.tmepo",function(){var a=0,t=e.find(".reset_variations");v.find(".variations select, .tc-epo-variable-product-selector").each(function(){var t=Ht(this).data("attribute_name")||Ht(this).attr("name"),e=Ht(this).val()||"";0<e.length&&a++,t,0}),0<a?"hidden"===t.css("visibility")&&t.css("visibility","visible").hide().fadeIn():t.css("visibility","hidden")}).trigger(g+"check_variations"),function(t,e,a,i){var o,r,c,n,l,d,s,p,m=t.epoEventId,_="input[name^='variation_id']",f=t.is_associated?"tc_variation_form.tmlogic":"wc_variation_form.tmlogic",u=t.is_associated?"tc_":"",h=t.variations_form,g=t.is_associated?h.find(".tc-epo-element-variations"):h.find(".variations"),v=t.is_associated?".tc-epo-element-variable-reset-variations":".reset_variations";if(h.attr("data-epo_id",t.epo_id),0<e.find("input.variation_id").length&&(_="input.variation_id"),i.find(".tm-epo-variation-element").length||i.data("tm-epo-variation-element")){if((o=i.find(".tm-epo-variation-section").first()).find(".cpf-type-variations").attr("data-epo_id",t.epo_id).attr("data-product_id",h.attr("data-product_id")),i.data("tm-epo-variation-element",o.find(".tm-epo-variation-element")),a&&"main"!==a&&!t.is_associated){if(g=(h=t.form).find('.composite_component[data-item_id="'+a+'"]').find(".variations"),h.attr("data-epo_id",t.epo_id),0===g.length)return;r=o.closest("li.tm-extra-product-options-field"),o.is(".tm-hidden")||g.hide(),g.after(o.addClass("tm-extra-product-options nopadding")),r.is(":empty")&&r.hide(),o.is(".section_popup")?o.wrap("<div class='tc-styled-variations tc-row'></div>"):(o.removeClass("tc-cell"),o.wrap("<div class='tc-styled-variations'></div>")),c=!1,e.off(f).on(f,function(){for(c=!0,h.on("click.tmlogic",".reset_variations",function(){o.find("select.tm-epo-variation-element").val("").children("option").prop("disabled",!1).show(),o.find(".tm-epo-variation-element").prop("disabled",!1).removeClass("tm-disabled").prop("checked",!1).closest("li").show(),Rt.trigger("tmlazy"),o.find(".tm-epo-variation-element").trigger("tm_trigger_product_image"),o.find("li").removeClass("tc-active tm-attribute-disabled").css("opacity","")}),e.off("woocommerce_update_variation_values_tmlogic").on("woocommerce_update_variation_values_tmlogic",function(){W(e,t)}),p=0;p<A.length;p+=1)n=A[p],"object"===typeof n&&(l="string"==typeof n.name||!1,d="string"==typeof n.selector||!1,s="function"==typeof n.func||!1,l)&&s&&("input[name='variation_id']"===d&&(d=_),n.selector?e.data("tm-styled-variations",1).off(u+n.name+p,d).on(u+n.name+p,d,n.func):e.data("tm-styled-variations",1).off(u+n.name+p).on(u+n.name+p,n.func));A=[],o.find(".tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)").last().trigger("tm_epo_variation_element_change")}),Ht(function(){!1===c&&e.trigger(f)})}else{for(o.length&&(o.is(".tm-hidden")||g.hide(),r=o.closest("li.tm-extra-product-options-field"),g.after(o.addClass("tm-extra-product-options nopadding")),r.is(":empty")&&r.hide(),o.is(".section_popup")?o.wrap("<div class='tc-styled-variations tc-row'></div>"):(o.removeClass("tc-cell"),o.wrap("<div class='tc-styled-variations'></div>")),h.off("click.tmlogic",v).on("click.tmlogic",v,function(){o.find("select.tm-epo-variation-element").val("").children("option").prop("disabled",!1).show(),o.find(".tm-epo-variation-element").prop("disabled",!1).removeClass("tm-disabled").prop("checked",!1).closest("li").show(),Rt.trigger("tmlazy"),o.find(".tm-epo-variation-element").trigger("tm_trigger_product_image"),o.find("li").removeClass("tc-active tm-attribute-disabled").css("opacity","")})),h.off("woocommerce_update_variation_values_tmlogic").on("woocommerce_update_variation_values_tmlogic",function(){W(h,t)}),p=0;p<A.length;p+=1)n=A[p],"object"===typeof n&&(l="string"==typeof n.name||!1,d="string"==typeof n.selector||!1,s="function"==typeof n.func||!1,l)&&s&&("input[name='variation_id']"===d&&(d=_),n.selector?h.data("tm-styled-variations",1).off(u+n.name+p,d).on(u+n.name+p,d,n.func):h.data("tm-styled-variations",1).off(u+n.name+p).on(u+n.name+p,n.func));A=[],o.find(".tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)").last().trigger("tm_epo_variation_element_change")}Ht.tcepo.formSubmitEvents[m][Ht.tcepo.formSubmitEvents[m].length]={trigger:function(){return!0},on_true:function(){return o.find(".tm-epo-variation-element").attr("disabled","disabled"),!0},on_false:function(){o.find(".tm-epo-variation-element").prop("disabled",!1)}},Ht(x.body).on("added_to_cart",function(){o.find(".tm-epo-variation-element").prop("disabled",!1)})}}(Ft,kt,u,Pt)),i.trigger("tm-select-change-html"),r.trigger("change.cpf",{init:1}),c.trigger("showhide.cpfcustom"),o.filter(":checked").trigger("cpfclearbutton"),Rt.on("tm-do-epo-update",function(){Et.trigger({type:"tm-epo-update"})}),Rt.trigger("tm-epo-init-events",{epo:{epo_id:b,form:Ft.form,currentCart:Et,cart_container:kt,epo_holder:Pt,totals_holder_container:It,totals_holder:Ct,main_cart:zt,main_epo_inside_form:Nt,product_id_selector:w,epo_id_selector:f,product_id:p,this_epo_container:m,this_totals_container:_,this_epo_totals_container:Dt}}),Rt.trigger("epoEventHandlers",{epo:Ft,currentCart:Et,cartContainer:kt,qtyElement:y,epoHolder:Pt,totalsHolderContainer:It,totalsHolder:Ct,variationForm:v,variation_id_selector:t,main_epo_inside_form:Nt,this_product_type:qt,get_price_excluding_tax:R,get_price_including_tax:N}),"disable"!==St&&It.addClass("tc-show"),Rt.trigger("epo_options_before_visible"),"yes"===Mt.tm_epo_progressive_display?setTimeout(function(){Pt.css("opacity",0).addClass("tc-show").animate({opacity:1},Lt.epoAnimationDelay,"easeOutExpo",function(){Rt.trigger("epo_options_visible"),Rt.trigger("tmlazy")})},Lt.epoDelay):(Pt.addClass("tc-show"),Rt.trigger("epo_options_visible"),Rt.trigger("tmlazy")),Ot.addClass("tc-init")}function Ct(t){var e=t.variations_form,a=t.main_cart,i=t.this_epo_container,o=t.is_associated?"tc_variation_form.cpf":"wc_variation_form.cpf";e.off(o).on(o,function(){e.data("epo_loaded")||(J(i),Q(i),Ht.tcepo.lateFieldsPrices[t.epoEventId]=[],It(t),ut(t),bt(t),t.noEpoUpdate=!1,setTimeout(function(){T(i),a.trigger({type:"tm-epo-update",rules:"init"})},10),e.data("epo_loaded",!0))}),v&&e.trigger(o),Rt.trigger("epo-after-init",{epo:t})}function Et(t,e,a,i,o){var r=Ht.extend(!0,{},t),c=i.attr("data-product-id"),n=i.attr("data-epo-id"),l=".tm-product-id-"+c,d="[data-epo-id='"+n+"']",s="p"+c+"e"+n,p=Ht(".tc-extra-product-options"+l+d),m=Ht(".tc-totals-form"+l+d),_=Ht(".tc-epo-totals"+l+d);t.isManual=!0,Ht.tcepo.formSubmitEvents[s]=[],Ht.tcepo.errorObject[s]=!1,Ht.tcepo.initialActivation[s]=!1,t.product_id=c,t.product_id_selector=l,t.epo_id=n,t.epo_id_selector=d,t.epoEventId=s,t.noEpoUpdate=!0,t.thisForm=e,t.this_epo_container=p,t.this_totals_container=m,t.this_epo_totals_container=_,ct(),o.find(".tm-collapse").tmtoggle(),o.find(".tm-section-link").tmsectionpoplink(),kt(e),wt(e),xt(),pt(e,t),nt(e),mt(i),_t(i.find(".tc-lightbox-image").not(".tm-extra-product-options-variations .radio-image")),J(i),Q(i),T(i),Ht.tcToolTip(e.find(".tm-tooltip")),It(t,e,a),t.noEpoUpdate=!1,a.trigger({type:"tm-epo-update",norules:2}),setTimeout(function(){t.main_cart.trigger({type:"tm-epo-update",epoObject:r,norules:1})},200),X(a,e)}function g(t,e,a,i,o,r,c){var n,l,d,s,p,m=!1,_=!1,f=!1,u=void 0!==a,h=!1,g=0<Ht(".variation_form_section .variations-table").length,v=!1;if((t=Ht(t)).is(".tc-init")&&!c)return!0;if(E=e?t:Ht(P),Rt.trigger("tm-epo-init-start"),u||t.is(".product")&&(h=!0,u=I.find(Lt.epoSelector).length),u||"no"!==Mt.tm_epo_enable_final_total_box_all||t.is(".tm-no-options-composite")){h&&(Rt.trigger("tm-epo-init-no-options"),!t.is(".product")||t.is(".tm-no-options-pxq")||t.is(".tm-no-options-composite")||(t=I)),a||(h=t.find(Lt.addToCartSelector).last(),a=(a=0<h.length?h.val():(h=Ht(".tc-totals-form.tm-totals-form-main")).attr("data-product-id"))||""),i||(i=parseInt(t.find("input.tm-epo-counter").last().val(),10),Number.isFinite(i))||(i=""),l=Ht(".tc-extra-product-options"+(h=".tm-product-id-"+a)+(y="[data-epo-id='"+i+"']")),x=Ht(".tc-totals-form"+h+y),d=Ht(".tc-epo-totals"+h+y),p=t.find(".variations_form").not(".composite_component .variations_form").first(),n="p"+a+"e"+i,p&&p.attr("data-product_id")&&p.attr("data-product_id")!==a&&(p=t.find(".variations_form[data-product_id='"+a+"']")),0===(m=V(t,t,"form",a)).length&&(t.is(".tc-shortcode-wrap")?m=V(x,x,".tc-totals-form",a):t.is(".tc-epo-element-product-container")&&(0===(m=t.find(Lt.associatedEpoCart)).length&&0===(m=l.parent(Lt.associatedEpoSelector)).length&&(m=t.find(".tc-epo-element-product-container-right")),v=!0)),v&&0===p.length&&t.is(".variations_form")&&(p=t),Ht.tcepo.formSubmitEvents[n]=[],Ht.tcepo.errorObject[n]=!1,Ht.tcepo.initialActivation[n]=!1,0<m.find(Lt.epoSelector).length&&(_=!0),(f=0<m.find(".tc-totals-form").length?!0:f)||(Ht.tcepo.formSubmitEvents[n][Ht.tcepo.formSubmitEvents[n].length]={trigger:function(){return!0},on_true:function(){var t=Ht(".tc-totals-form.tm-product-id-"+a+"[data-epo-id='"+i+"']").tcClone(),e=Ht('<div class="tm-hidden tm-formepo-normal"></div>');return m.find(".tm-formepo-normal").remove(),e.append(t),m.append(e),!0},on_false:function(){setTimeout(function(){Ht(".tm-formepo-normal").remove()},100)}}),_||(Ht.tcepo.formSubmitEvents[n][Ht.tcepo.formSubmitEvents[n].length]={trigger:function(){return!0},on_true:function(){var t=Ht(Lt.epoSelector+".tm-product-id-"+a+"[data-epo-id='"+i+"']").tcClone().addClass("formepo"),e=Ht('<div class="tm-hidden tm-formepo"></div>');return m.find(".tm-formepo").remove(),e.append(t),m.append(e),!0},on_false:function(){setTimeout(function(){Ht(".tm-formepo").remove()},100)}}),s={main_product:t,main_cart:m,epo_id:i,form:G(t),main_epo_inside_form:_,product_id_selector:h,epo_id_selector:y,product_id:a,this_epo_container:l,this_totals_container:x,this_epo_totals_container:d,qtySelector:Lt.qtySelector,manualInitEPO:Et,epoEventId:n,variations_form:p,has_epo:u,is_quickview:e,is_associated:v,is_epo_shortcode:l.is(".tc-shortcode"),mainEpoObject:r,associated_connect:o,noEpoUpdate:!0},Ht(s.form).data("epo_object",s),l.data("epo_object",s),m.data("product_id",a).data("epo_id",i).data("product_id_selector",h).data("epo_id_selector",y),_=(f=s).this_epo_container,x=f.main_product,f=f.epoEventId,u=_.find(".tm-limit"),r=_.find(".tm-exactlimit"),o=_.find(".tm-minimumlimit"),_.on("change.cpflimit","input.tm-epo-field.tmcp-checkbox",function(){var t=Ht(this);K(t,!0),tt(t,!0)}),u.length&&et(u,x,f),r.length&&at(r,x,f),o.length&&it(o,f),y=(h=s).epoEventId,b=h.this_epo_container,"yes"===Mt.tm_epo_upload_popup&&(Ht.tcepo.formSubmitEvents[y][Ht.tcepo.formSubmitEvents[y].length]={trigger:function(){return!0},on_true:function(){var t,e,a=b.data("num_uploads");return a&&Object.keys(a).length&&(t=Ht.tcFloatBox({fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"300px",classname:"flasho tc-wrapper",data:Ht.epoAPI.template.html(Lt.templateEngine.tc_upload_messages,{files:a,title:Mt.i18n_uploading_files,message:Mt.i18n_uploading_message})}),e=function(){t.destroy(),C.off("ajaxSuccess",e)},C.on("ajaxSuccess",e)),!0},on_false:function(){return!0}}),kt(l),wt(l),xt(),pt(l,s),C.on("click.cpfurl change.cpfurl tmredirect",".tc-url-container .tmcp-radio, .tc-url-container .tmcp-radio+label",function(t){var e=Ht(this).attr("data-url");e&&P.location!==e&&(t.preventDefault(),P.location=e)}),C.on("change.cpfurl tmredirect",".tc-url-container .tmcp-select",function(t){var e=Ht(this).children("option:selected").attr("data-url");e&&P.location!==e&&(t.preventDefault(),P.location=e)}),Ht.tcToolTip(l.find(".tm-tooltip")),l.find(".tm-collapse").tmtoggle(),l.find(".tm-section-link").tmsectionpoplink(),c&&l.addClass("reactivate"),0<p.length?(c&&p.data("epo_loaded",!1),d.data("price",!1),(g?function t(e){var a=requestAnimationFrame(function(){t(e)}),i=e.variations_form,o=i.data("bound"),r=e.is_associated?"tc_variation_form.cpf":"wc_variation_form.cpf";o&&(cancelAnimationFrame(a),Ct(e),i.trigger(r))}:Ct)(s)):(setTimeout(function(){J(l),Q(l),T(l),Ht.tcepo.lateFieldsPrices[n]=[],It(s),ut(s),bt(s),Rt.trigger("epo-after-init-in-timeout",{epo:s}),m.trigger("tm-epo-check-dpd"),s.noEpoUpdate=!1,m.trigger({type:"tm-epo-update",rules:"init"})},20),Rt.trigger("epo-after-init",{epo:s})),ct(),nt(l),mt(l),_t(l.find(".tc-lightbox-image").not(".tm-extra-product-options-variations .radio-image"));var y,b,w,x,F,k,_=s,A=_.this_epo_container;if(_=Mt.theme_name){switch(_=_.toLowerCase(),F=A.find("select"),_){case"flatsome":case"flatsome-child":case"flatsome child":F.wrap('<div class="custom select-wrapper"/>');break;case"avada":case"avada-child":case"avada child":F.wrap('<div class="avada-select-parent tm-select-parent"></div>'),Ht('<div class="select-arrow">&#xe61f;</div>').appendTo(A.find(".tm-select-parent")),P.calc_select_arrow_dimensions?(P.calc_select_arrow_dimensions(),Rt.on("tmsectionpoplink cpflogicdone",function(){P.calc_select_arrow_dimensions()})):P.calcSelectArrowDimensions&&(P.calcSelectArrowDimensions(),Rt.on("tmsectionpoplink cpflogicdone",function(){P.calcSelectArrowDimensions()}));break;case"bazar":case"bazar-child":case"bazar child":F.wrap('<div class="tm-select-wrapper select-wrapper"/>');break;case"blaszok":case"blaszok-child":case"blaszok child":k=function(){setTimeout(function(){Ht(".tm-extra-product-options select").not(".hasCustomSelect").filter(":visible").each(function(){Ht(this).is(".mpcthSelect")||(Ht(this).width(Ht(this).outerWidth()),Ht(this).customSelect({customClass:"mpcthSelect"}))})},100)},Rt.on("cpflogicrun",function(){k()}),Rt.on("epo_options_visible",function(){k()});break;case"handmade":case"handmade child theme":Ht(".tm-owl-slider.tcowl-carousel").addClass("manual")}Rt.trigger("tm-theme-specific-actions",{epo:{theme_name:_,all_epo_selects:F}})}return C.off("click.cpf",".quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus").on("click.cpf",".quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus",function(){Ht(this).closest(".quantity").find(Lt.qtySelector).trigger("change.cpf")}),u=s,Rt.trigger("tm-epo-compatibility",{epo:u}),v||(r=d,x=m,Ht.tcFloatingTotalsBox(r,e,x),o=(w=s).form,f=w.epoEventId,Rt.trigger("tm-from-submit",{epo:w,functions:{tm_apply_validation:Pt,apply_submit_events:At}}),!Pt(w)&&Ht.tcepo.formSubmitEvents[f].length&&o.on("submit",function(){At(w)}),Rt.on("tc_apply_validation",function(){return Pt(w)}),ee(t,s=ae(s,n,s))),Rt.trigger("tm-epo-init-end",{epo:s}),s}Rt.trigger("tm-epo-init-end-no-options")}function qt(){var i,t;"no"===Mt.tm_epo_no_lazy_load&&Ht.extend(Ht.lazyLoadXT,{autoInit:!1,selector:"img.tmlazy",srcAttr:"data-original",visibleOnly:!1,updateEvent:Ht.lazyLoadXT.updateEvent+" tmlazy"}),0<(i=Ht(".tm-no-options-pxq, .tm-no-options-composite")).length&&(i.addClass("initializing"),i.each(function(t,e){var a;1<(a=(e=Ht(e)).find("input.tm-epo-counter")).length?a.each(function(){var t=Ht(this),e=t.closest(".cart").parent();(e=e.is("form")?e.parent():e).is(".initializing")||g(e,!1,void 0,parseInt(t.val(),10))}):g(e,!1),i.removeClass("initializing")})),setTimeout(function(){try{0<(t=Ht(Lt.epoSelector).not(Lt.associatedEpoSelector+" "+Lt.epoSelector+", .tm-no-options-pxq, .tm-no-options-composite, .wc-product-table "+Lt.epoSelector)).length&&(i.addClass("initializing"),t.each(function(){var t=Ht(this),a=t.attr("data-product-id"),e=t.attr("data-epo-id"),i=!1,o=!1,r=t.closest(".tc-after-shop-loop.tm-has-options");(0!==r.length||0===(r=Ht(Lt.tcAddToCartSelector+"[data-epo-id='"+e+"'][value='"+a+"']").closest("form,.cart").first().parent()).length&&0===(r=Ht(Lt.addToCartSelector+"[value='"+a+"']").closest("form,.cart").first().parent()).length&&0===(r=t.closest("form,.cart").first().parent(".tm-has-options")).length&&(t.is(".tc-shortcode")&&(r=t.wrap('<div class="tc-shortcode-wrap tc-wrap-'+e+'"></div>'),r=t.parent()),0<r.length))&&(o=!0),0<r.length&&(o&&(i=!0,t.closest("form,.cart").first().append(Ht('<input name="add-to-cart" value="'+a+'" type="hidden">')),t.closest("form,.cart").first().append(Ht('<input type="hidden" value="" class="variation_id" name="variation_id">'))),1<(o=(r=r.is("form")?r.parent():r).find("input.tm-epo-counter")).length?o.each(function(){var t=Ht(this),e=t.closest(".cart").parent();(e=e.is("form")?e.parent():e).is(".initializing")||g(e,i,a,parseInt(t.val(),10))}):g(r,i,a,e))}),i.removeClass("initializing"))}catch(t){P.console.log(t),b=t}},1)}function St(t){var e,a,i,o,r,c;void 0===(t=void 0===(t=(f=t).attr("data-product_id"))?f.val():t)||!(c=(c=f.closest(".cart").find(".tm-epo-counter").val())||f.attr("data-epo-id"))||1!==f.closest(".tm-has-options").length&&void 0===f.attr("data-epo-id")||(o={},1===(e=1<(e=Ht(".tc-extra-product-options.tm-product-id-"+t+'[data-epo-id="'+c+'"]')).length?e.filter(".formepo")?e.filter(".formepo"):e.first():e).length&&(r=(c=Ht(".tc-totals-form.tm-product-id-"+t+'[data-epo-id="'+c+'"]')).find(".cpf-product-price").val(),a=c.find(".cpf-dynamic-product-price").val(),i=c.find(".cpf-override-product-price").val(),c=c.find(".tc_form_prefix").val(),o=Ht.extend(o,{tcajax:1,tcaddtocart:t,cpf_product_price:r,dynamic_product_price:a,override_product_price:i}),c)&&(o.tc_form_prefix=c),r=f.data(),Mt.ajaxbuttondata=Ht.epoAPI.util.deepCopyArray(r),(Mt.ajaxbutton=f).removeData(),f.data(Ht.extend(r,e.tcSerializeObject(),o)),Mt.ajaxdata={epos:e,_pid:t,data:r})}function t(){Ht(".tc-associated-table-product td.product-name").each(function(){var t=Ht(this);0===t.find(".product-name").length&&t.wrapInner(Ht('<div class="tc-associated-table-product-indent"></div>'))})}Mt&&e&&(Ht.fn.val=function(){var t=r.apply(this,arguments);return 0<arguments.length&&Ht(this).is(".input-text.qty")&&Ht(this).trigger("change.cpf"),t},"no"===Mt.tm_epo_no_lazy_load&&Ht.lazyLoadXT&&Ht.extend(Ht.lazyLoadXT,{autoInit:!1,updateEvent:Ht.lazyLoadXT.updateEvent+" tmlazy"}),Lt.localInputDecimalSeparator=""===Mt.tm_epo_global_input_decimal_separator?Mt.currency_format_decimal_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.localDecimalSeparator=""===Mt.tm_epo_global_displayed_decimal_separator?Mt.currency_format_decimal_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.localThousandSeparator=""===Mt.tm_epo_global_displayed_decimal_separator?Mt.currency_format_thousand_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.epoDelay=Mt.tm_epo_start_animation_delay||P.tc_epo_delay||500,Lt.epoAnimationDelay=Mt.tm_epo_animation_delay?Mt.tm_epo_start_animation_delay:P.tc_epo_animation_delay||500,Lt.getElementFromFieldCache=[],Lt.epoSelector=".tc-extra-product-options",Lt.associatedEpoSelector=".tc-extra-product-options-inline",Lt.associatedEpoCart=".tc-epo-element-product-container-cart",Lt.addToCartSelector="input[name='add-to-cart']",Lt.tcAddToCartSelector="input.tc-add-to-cart",Lt.qtySelector="input.qty,input[name='quantity'],select.qty,.drop-down-button #qty,.plus-minus-button #qty,.slider-input #amount",Lt.associateQtySelector="input.tm-qty-alt",Lt.addToCartButtonSelector=".add_to_cart_button, .single_add_to_cart_button",Lt.compositeSelector=".bto_item,.component",Lt.nativeProductPriceSelector=".woocommerce .product p.price",Lt.associatedNativeProductPriceSelector=".product-price .associated-price",Lt.templateEngine=Ht.epoAPI.applyFilter("tc_adjust_templateEngine",{price:e.template("tc-price"),sale_price:e.template("tc-sale-price"),tc_chars_remanining:e.template("tc-chars-remanining"),tc_final_totals:e.template("tc-final-totals"),tc_floating_box:e.template("tc-floating-box"),tc_floating_box_nks:e.template("tc-floating-box-nks"),tc_formatted_price:e.template("tc-formatted-price"),tc_formatted_sale_price:e.template("tc-formatted-sale-price"),tc_lightbox:e.template("tc-lightbox"),tc_lightbox_zoom:e.template("tc-lightbox-zoom"),tc_section_pop_link:e.template("tc-section-pop-link"),tc_upload_messages:e.template("tc-upload-messages")}),Ht.tcAPI=function(){return Lt},Ht.tcAPIGet=function(t){return Lt[t]},Ht.tcAPISet=function(t,e){Lt[t]=e},Ht.tc_validator&&(Ht.extend(Ht.tc_validator.messages,{required:Mt.tm_epo_global_validator_messages.required,email:Mt.tm_epo_global_validator_messages.email,url:Mt.tm_epo_global_validator_messages.url,number:Mt.tm_epo_global_validator_messages.number,digits:Mt.tm_epo_global_validator_messages.digits,maxlengthsingle:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.maxlengthsingle),maxlength:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.maxlength),minlengthsingle:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.minlengthsingle),minlength:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.minlength),max:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.max),min:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.min),step:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.step),lettersonly:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.lettersonly),lettersspaceonly:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.lettersspaceonly),alphanumeric:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumeric),alphanumericunicode:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumericunicode),alphanumericunicodespace:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumericunicodespace),repeaterminrows:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.repeaterminrows),repeatermaxrows:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.repeatermaxrows)}),Ht.tc_validator.addMethod("alphanumeric",function(t,e){return this.optional(e)||/^[a-zA-Z0-9.-]+$/i.test(t)},Ht.tc_validator.messages.alphanumeric),Ht.tc_validator.addMethod("lettersonly",function(t,e){return this.optional(e)||/^[a-z]+$/i.test(t)},Ht.tc_validator.messages.lettersonly),Ht.tc_validator.addMethod("lettersspaceonly",function(t,e){return this.optional(e)||/^[a-z,\u0020]+$/i.test(t)},Ht.tc_validator.messages.lettersspaceonly),Ht.tc_validator.addMethod("alphanumericunicode",function(t,e){return this.optional(e)||/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F]+$/i.test(t)},Ht.tc_validator.messages.alphanumericunicode),Ht.tc_validator.addMethod("alphanumericunicodespace",function(t,e){return this.optional(e)||/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F,\u0020]+$/i.test(t)},Ht.tc_validator.messages.alphanumericunicodespace),Ht.tc_validator.addMethod("repeaterminrows",function(t,e,a){return Ht.epoAPI.math.toInt(Ht(e).closest(".tc-element-inner-wrap").find(".tc-repeater-element").length)>=Ht.epoAPI.math.toInt(a)},Ht.tc_validator.messages.repeaterminrows),Ht.tc_validator.addMethod("repeatermaxrows",function(t,e,a){return Ht.epoAPI.math.toInt(Ht(e).closest(".tc-element-inner-wrap").find(".tc-repeater-element").length)<=Ht.epoAPI.math.toInt(a)},Ht.tc_validator.messages.repeatermaxrows),Ht.tc_validator.addMethod("product_element_radio_qty",function(t,e){return 0<Ht(e).closest(".tm-element-ul-product").find("input.tc-epo-field-product.tmcp-radio:checked").closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()},Ht.tc_validator.messages.required),Ht.tc_validator.addMethod("product_element_select_qty",function(t,e){return 0<Ht(e).closest(".tm-element-ul-product").find("select.tc-epo-field-product.tmcp-select").closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()},Ht.tc_validator.messages.required)),Ht.epoAPI.util.escapeSelector=(a=/([!"$%&'()*+,/:;<=>?@[\]^`{|}~])/g,function(t){return t.replace(a,"\\$1")}),Ht.epoAPI.util.unformat=function(t){var t=Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator),e=parseFloat(t);return Number.isFinite(e)?e:t},Ht.epoAPI.util.parseParams=function(t,a){return"string"!=typeof t||void 0===t.split?[]:t.split("&").map(function(t){var e={};return 1<(t=(t=!0===a?decodeURIComponent(t.replace(/\+/g,"%20")):t).split("=").map(function(t){var e=t.split("?");return 1<e.length?e[1]:t})).length&&(e[t[0]]=t[1]),e}).filter(function(t){return null!==t}).reduce(function(t,e){return Object.assign({},t,e)},{})},Ht.tmempty||(Ht.tmempty=function(e){var t=1===[void 0,null,!1,0,"","0"].filter(function(t){return e===t}).length,a=!1;return"object"==typeof e?0===Object.keys(e).filter(function(t){return Object.prototype.hasOwnProperty.call(e,t)}).length:t||a}),Ht.tmType||(Ht.tmType=function(t){return Object.prototype.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}),Ht.is_on_screen||(Ht.fn.is_on_screen=function(){var t=Ht(P),e=Ht.epoAPI.dom.scroll(),a=this.offset(),e={top:e.top,left:e.left};return e.right=e.left+t.width(),e.bottom=e.top+t.height(),a.right=a.left+this.outerWidth(),a.bottom=a.top+this.outerHeight(),!(e.right<a.left||e.left>a.right||e.bottom<a.top||e.top>a.bottom)}),Ht().tmtoggle||(Ht.fn.tmtoggle=function(){var t=this,e=!1,c=0;if(0!==t.length)return void 0===P.tc_accordion_offset&&(P.tc_accordion_offset=-100),t.each(function(){var t,i,o,r=Ht(this);r.data("tm-toggle-init")||(r.data("tm-toggle-init",1),t=r.find(".tm-toggle"),i=r.find(".tm-collapse-wrap"),o=Ht(".tm-collapse.tmaccordion").find(".tm-toggle"),0!==t.length&&0!==i.length&&(i.is(".closed")?(Ht(i).removeClass("closed open").addClass("closed").hide(),Ht(t).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-down"),Ht(t).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-closed")):(Ht(i).removeClass("closed open").addClass("open").show(),Ht(t).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-up"),Ht(t).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-open"),e=!0),t.each(function(t,a){Ht(a).on("closewrap.tmtoggle",function(){r.is(".tmaccordion")&&Ht(i).is(".closed")||(Ht(i).removeClass("closed open").addClass("closed"),Ht(this).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-down"),Ht(this).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-closed"),Ht(i).removeClass("tm-animated fadein"),r.is(".tmaccordion"),Ht(i).animate({height:"toggle"},100,function(){Ht(i).hide()}),Rt.trigger("tmlazy"))}),Ht(a).on("openwrap.tmtoggle",function(t,e){r.is(".tmaccordion")&&Ht(o).not(Ht(this)).trigger("closewrap.tmtoggle"),Ht(i).removeClass("closed open").addClass("open"),Ht(this).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-up"),Ht(this).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-open"),Ht(i).show().removeClass("tm-animated fadein").addClass("tm-animated fadein"),setTimeout(function(){Rt.trigger("tmlazy")},200),setTimeout(function(){void 0===e&&c&&r.is(".tmaccordion")&&!r.is_on_screen()&&Rt.tcScrollTo(Ht(a),10,P.tc_accordion_offset)},110)}),Ht(a).on("click.tmtoggle",function(t){t.preventDefault(),Ht(i).is(".closed")?Ht(this).trigger("openwrap.tmtoggle"):Ht(this).trigger("closewrap.tmtoggle")}),Ht(a).find(".tm-qty").closest(".cpf-element").find(".tm-epo-field").on("change.cpf",function(){Ht(a).trigger("openwrap.tmtoggle")})})))}),void 0===P.tc_accordion_closed_on_page_load&&!e&&0<t.filter(".tmaccordion").length&&t.filter(".tmaccordion").first().find(".tm-toggle").trigger("openwrap.tmtoggle",{nomove:1}),c=1,t}),Ht().tmpoplink||(Ht.fn.tmpoplink=function(t){var o,r={classname:"flasho tc-wrapper cart-popup"};if(0!==this.length)return t&&(r=Ht.extend({},r,t)),o=function(t){return Ht.epoAPI.template.html(e.template("tc-cart-options-popup"),{title:t.title,id:t.id,html:t.html,close:Mt.i18n_close})},this.each(function(){var t,e,a,i=Ht(this);i.is(".tc-poplink")||(i.addClass("tc-poplink"),e=Ht(this).attr("href"),t=Ht(this).attr("data-title"),e=Ht(e).html(),t=t||Mt.i18n_addition_options,a=o({id:"tc-floatbox-content",html:e,title:t}),i.on("click.tmpoplink",function(t){Ht.tcFloatBox({fps:1,ismodal:!1,refresh:100,width:"80%",height:"80%",classname:r.classname,data:a}),t.preventDefault()}))})}),(o=function(t,e,a){return this.this_epo_totals_container=t,this.is_quickview=e,this.main_cart=a,!(e||!Mt.floating_totals_box||"disable"===Mt.floating_totals_box||!a||!t.length)&&(this.init(),this)}).prototype={constructor:o,onUpdate:function(){var t,e=this.this_epo_totals_container.data("tm-html"),a=this.this_epo_totals_container.data("tm-floating-box-data"),i=[];a&&a.length&&Ht.each(a,function(t,e){""===e.title&&(e.title="&nbsp;"),""===e.value&&(e.value="&nbsp;"),e.title?(e.title=Ht("<div>"+e.title+"</div>"),e.title.find("span").remove(),e.title=e.title.html()):e.title="&nbsp;",this.is_nks&&(""!==e.label_show&&(e.title=""),""!==e.value_show)&&(e.value=""),"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!0===Ht.tmempty(e.price)?e.price="":e.price=$t(e.price,this.this_epo_totals_container,!0,!1),i.push({label_show:e.label_show,value_show:e.value_show,title:e.title,value:e.value,quantity:e.quantity,price:e.price})}),(!e||""!==e||a&&a.length)&&(e&&""!==e||this.is_nks)||(e="",this.floatingBox.hide()),a=Ht.epoAPI.template.html(this.engineTemplate,{html_before:Mt.floating_totals_box_html_before,html_after:Mt.floating_totals_box_html_after,option_label:Mt.i18n_option_label,option_value:Mt.i18n_option_value,option_qty:Mt.i18n_option_qty,option_price:Mt.i18n_option_price,values:i,totals:e}),this.floatingBox.html(a),this.onUpdateScroll(),"yes"===Mt.floating_totals_box_add_button&&(t=this.main_cart.find(Lt.addToCartButtonSelector).first()).tcClone().addClass("tc-add-to-cart-button").on("click",function(){t.trigger("click")}).appendTo(this.floatingBox)},onUpdateScroll:function(){"always"===Mt.floating_totals_box_visibility?this.floatingBox.is(":empty")&&!this.is_nks_alt?this.floatingBox.hide():this.floatingBox.show():("hideafterscroll"===Mt.floating_totals_box_visibility&&(Rt.scrollTop()>Ht.epoAPI.math.toFloat(Mt.floating_totals_box_pixels)&&!this.is_nks_alt?this.floatingBox.is(":hidden")||(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide()):!this.floatingBox.is(":hidden")&&!this.is_nks_alt||this.floatingBox.is(":empty")&&!this.is_nks_alt||(!1===this.is_nks?this.floatingBox.fadeIn():this.floatingBox.show())),"afterscroll"===Mt.floating_totals_box_visibility&&(Rt.scrollTop()>Ht.epoAPI.math.toFloat(Mt.floating_totals_box_pixels)||this.is_nks_alt?this.floatingBox.is(":hidden")&&!this.floatingBox.is(":empty")||this.is_nks_alt?!1===this.is_nks?this.floatingBox.fadeIn():this.floatingBox.show():!this.floatingBox.is(":hidden")&&this.floatingBox.is(":empty")&&(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide()):this.floatingBox.is(":hidden")||(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide())))},addEvents:function(){this.onUpdate(),this.main_cart.on("tm-epo-after-update",this.onUpdate.bind(this)),this.main_cart.on("tm-epo-short-update",this.onUpdate.bind(this)),!1===this.is_nks&&Rt.on("scroll",this.onUpdateScroll.bind(this))},init:function(){this.floatingBox=Ht('<div class="tm-floating-box '+Mt.floating_totals_box+'"></div>'),this.nks_selector=Ht(".tm-floating-box-nks").first(),this.alt_selector=Ht(".tm-floating-box-alt").first(),this.engineTemplate=Lt.templateEngine.tc_floating_box,this.is_nks=!1,this.is_nks_alt=!1,0<this.nks_selector.length?(this.is_nks=!0,this.floatingBox.removeClass("top left right bottom").appendTo(this.nks_selector).show()):(0<this.alt_selector.length?this.floatingBox.removeClass("top left right bottom").appendTo(this.alt_selector):this.floatingBox.appendTo("body")).hide(),(0<this.nks_selector.length||0<this.alt_selector.length)&&(this.is_nks_alt=!0,this.engineTemplate=Lt.templateEngine.tc_floating_box_nks),this.addEvents()}},Ht.tcFloatingTotalsBox=function(t,e,a){var i=!1;return t&&t.length&&void 0===t.data("tcfloatingtotalsbox")&&(i=new o(t,e,a),t.data("tcfloatingtotalsbox",i)),i},Ht.tc_product_image={},Ht.tc_product_image_store={},Ht.tc_replace_object_values=function(a,i){return Object.keys(a).forEach(function(e){Object.keys(a[e]).forEach(function(t){void 0!==i[e]&&void 0!==i[e][t]&&Object.prototype.hasOwnProperty.call(i[e],t)&&(a[e][t]=i[e][t])})}),a},Ht.tc_maybe_copy_object_values=function(a,i){return Object.keys(i).forEach(function(e){Object.keys(i[e]).forEach(function(t){void 0===i[e]||!Object.prototype.hasOwnProperty.call(i[e],t)||void 0===i[e][t]||void 0!==a[e]&&void 0!==a[e][t]||(void 0===a[e]&&(a[e]={}),a[e][t]=i[e][t])})}),a},Ht.tc_pre_populate_store=function(){var t={0:{},1:{},2:{},3:{}};return t[0].src="",t[0].srcset="",t[0].sizes="",t[0].title="",t[0].alt="",t[0]["data-src"]="",t[0]["data-large_image"]="",t[0]["data-large_image_width"]="",t[0]["data-large_image_height"]="",t[1]["data-thumb"]="",t[2].src="",t[3].href="",t[3].title="",t},Ht.tc_populate_store=function(t,e){var a=e.find(".flex-control-nav li:eq(0) img"),e=e.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),i=t,t=t.closest("a"),o={0:{},1:{},2:{},3:{}};return o[0].src=i.attr("src"),o[0].srcset=i.attr("srcset"),o[0].sizes=i.attr("sizes"),o[0].title=i.attr("title"),o[0].alt=i.attr("alt"),o[0]["data-src"]=i.attr("data-src"),o[0]["data-large_image"]=i.attr("data-large_image"),o[0]["data-large_image_width"]=i.attr("data-large_image_width"),o[0]["data-large_image_height"]=i.attr("data-large_image_height"),o[1]["data-thumb"]=e.attr("data-thumb"),o[2].src=a.attr("src"),o[3].href=t.attr("href"),o[3].title=t.attr("title"),o},Ht.tc_maybe_copy_object_values_from_img=function(a,t,e){var i,o,r=e.find(".flex-control-nav li:eq(0) img"),e=e.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),c=t,t=t.closest("a"),n=[["src","srcset","sizes","title","alt","data-src","data-large_image","data-large_image_width","data-large_image_height","large-image"],["data-thumb"],["src"],["href","title"]];return[c,e,r,t].forEach(function(t,e){void 0!==t&&void 0!==t[0]&&(i=t[0].attributes,Ht.each(i,function(){this.specified&&(o=this.name,-1!==Ht.inArray(o,n[e]))&&(void 0===a[e]||void 0!==a[e]&&void 0===a[e][o])&&(void 0===a[e]&&(a[e]={}),a[e][o]=this.value)}))}),a},Ht.fn.tc_set_attr=function(t,e,a){(void 0===Ht.tc_product_image[a=void 0===a?0:a]||void 0!==Ht.tc_product_image[a]&&void 0===Ht.tc_product_image[a][t])&&(void 0===Ht.tc_product_image[a]&&(Ht.tc_product_image[a]={}),Ht.tc_product_image[a][t]="",this.attr(t))&&(Ht.tc_product_image[a][t]=this.attr(t)),!1===e?this.removeAttr(t):this.attr(t,e)},Ht.fn.tc_reset_attr=function(t,e){void 0!==Ht.tc_product_image[e=void 0===e?0:e]&&(void 0!==Ht.tc_product_image[e][t]&&this.attr(t,Ht.tc_product_image[e][t]),delete Ht.tc_product_image[e][t])},Ht.fn.tc_update_attr=function(t,e){void 0!==Ht.tc_product_image[e=void 0===e?0:e]&&(Ht.tc_product_image[e][t]=this.attr(t))},Ht.fn.tc_image_update=function(t,e){var a,t=Ht(t),e=Ht(e),i=this.data("epo_object"),o=i.main_product.closest("#product-"+i.product_id),r=o;o.length<=0&&(r=i.main_product.closest(".post-"+i.product_id)),o=(t=t.is("select")?t.children("option:selected"):t).data("image-variations"),a=(i=""!==Mt.tm_epo_global_product_image_selector?Ht(Mt.tm_epo_global_product_image_selector):r.find("a.woocommerce-main-image img, img.woocommerce-main-image,a img").not(".thumbnails img,.product_list_widget img,img.emoji,a.woocommerce-product-gallery__trigger img").first()).closest("a"),1<i.length&&(i=i.first()),t&&o&&0<e.length?(e.removeAttr("data-o_src").removeAttr("data-o_title").removeAttr("data-o_alt").removeAttr("data-o_srcset").removeAttr("data-o_sizes").removeAttr("srcset").removeAttr("sizes"),t=o.imagep,o.imagep.image_link||(t=o.image),e.attr("title",t.image_title),e.attr("alt",t.image_alt),t.image_srcset&&e.attr("srcset",t.image_srcset),t.image_sizes&&e.attr("sizes",t.image_sizes),i.tc_set_attr("title",t.image_title),i.tc_set_attr("alt",t.image_alt),i.tc_set_attr("data-large-image",t.image_link),i.data.wc27_zoom_target&&(i.data.wc27_zoom_target.tc_set_attr("data-thumb",t.image_link),r.find(".flex-control-nav li:eq(0) img").tc_set_attr("src",t.image_link)),a.tc_set_attr("href",t.image_link),a.tc_set_attr("title",t.image_caption)):(i.tc_reset_attr("title"),i.tc_reset_attr("alt"),i.tc_reset_attr("data-large-image"),i.data.wc27_zoom_target&&(i.data.wc27_zoom_target.tc_reset_attr("data-thumb"),r.find(".flex-control-nav li:eq(0) img").tc_reset_attr("src")),a.tc_reset_attr("href"),a.tc_reset_attr("title"))},Ht.fn.tm_find_matching_variations=function(t,e){var a,i,o=[];if(t)for(a=0;a<t.length;a+=1)i=t[a],Ht.fn.tm_variations_match(i.attributes,e)&&o.push(i);return o},Ht.fn.tm_variations_match=function(e,a){var i,o,r=!0;return Object.keys(e).forEach(function(t){Object.prototype.hasOwnProperty.call(e,t)&&(i=e[t],o=a[t],void 0!==i)&&void 0!==o&&0!==i.length&&0!==o.length&&i!==o&&(r=!1)}),r},Ht().tclightbox||(Ht.fn.tclightbox=function(){if(0!==this.length)return this.each(function(){var a,t,e,i,o=Ht(this);!o.is(".tcinit")&&(a=o.attr("src")||o.attr("data-original"),t=(t=o.closest("label")).closest(".tmcp-field-wrap").find(".tm-epo-field[id='"+t.attr("for")+"']"),a=t.attr("data-imagel")||t.attr("data-imagep")||t.attr("data-image")||a)&&(o.addClass("tcinit").before(Ht.epoAPI.template.html(Lt.templateEngine.tc_lightbox,{})),t=o.prev(),o.wrap("<div class='tc-lightbox-image-wrap'/>"),o.after(t),e=t.find(".tc-lightbox-button"),i=function(){e.addClass("tcinit").on("click.tclightbox",function(t){var e;0<Ht(".tc-closing.tc-lightbox").length||(e=Ht.epoAPI.dom.size(),e=Ht("<img>").addClass("tc-lightbox-img").attr("src",a).css("maxHeight",e.visibleHeight+"px").css("maxWidth",e.visibleWidth+"px"),Ht.tcFloatBox({fps:1,ismodal:!1,refresh:"fixed",width:"auto",height:"auto",top:"0%",left:"0%",classname:"flasho tc-lightbox",animateIn:"tc-lightbox-zoomin",animateOut:"tc-lightbox-zoomout",data:Ht.epoAPI.template.html(Lt.templateEngine.tc_lightbox_zoom,{img:e[0].outerHTML}),zIndex:102001,cancelClass:".tc-lightbox-img, .tc-lightbox-button-close",unique:!0}),t.preventDefault())})},"yes"===Mt.tm_epo_preload_lightbox_image?((o=new Image).src=a,o.onload=function(){i()}):i())})}),Ht().tmsectionpoplink||(Ht.fn.tmsectionpoplink=function(){if(0!==this.length)return this.each(function(){var t,e,a,i,o,r,c=Ht(this);c.data("tmsectionpoplink")||(c.data("tmsectionpoplink",!0),t=c.attr("data-sectionid"),e=Mt.i18n_addition_options,a=c.closest(".cpf-section[data-uniqid='"+t+"']"),i=!1,o=Ht('<div class="fl-overlay"></div>').css({zIndex:parseInt(c.zIndex,10)-1,opacity:.8}),r=function(){var t=Ht("#tm-section-pop-up");t.parents().removeClass("noanimated"),o.unbind().remove(),t.after(a),t.remove(),a.find(".tm-section-link").show(),a.find(".tm-section-pop").hide()},c.attr("data-title")&&(e=c.attr("data-title")),c.on("click.tmsectionpoplink",function(t){t.preventDefault(),i=!1,o.appendTo("body").on("click",r),a.before(Ht.epoAPI.template.html(Lt.templateEngine.tc_section_pop_link,{title:e,close:Mt.i18n_close})),(t=Ht("#tm-section-pop-up")).find(".float-editbox").prepend(a),a.find(".tm-section-link").hide(),a.find(".tm-section-pop").show(),t.parents().addClass("noanimated"),t.find(".floatbox-cancel").on("click",function(){i||(i=!0,r())}),Rt.trigger("tmlazy"),Rt.trigger("tmsectionpoplink")}))})}),Ht().cpfdependson||(Ht.fn.cpfdependson=function(a,i,n){var o=[];if(0!==this.length&&"object"==typeof a)return i=i||"show",Ht.each(a,function(a,t){var i,c;o[a]=0,Array.isArray(t)&&Ht.each(t,function(t,e){if("object"!=typeof e)return!0;(i=function(t){var e,a,i=Ht(t);if(0!==i.length){if(i.is(".cpf-section"))return t.find(".tm-epo-field");if(e=i.attr("data-uniqid"),a=(t=i.closest(".tc-extra-product-options")).attr("data-epo-id"),!t.is(".reactivate")&&Lt.getElementFromFieldCache&&Lt.getElementFromFieldCache[a]&&Lt.getElementFromFieldCache[a][e])return Lt.getElementFromFieldCache[a][e];if(0<(t=i.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length)switch(t="cpf-type-product"===(t=t[0])?i.is(".cpf-type-product-mode-product")||i.is(".cpf-type-product-checkbox")||i.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":i.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio":t){case"cpf-type-radio":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-radio"),Lt.getElementFromFieldCache[a][e];case"cpf-type-checkbox":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-checkbox"),Lt.getElementFromFieldCache[a][e];case"cpf-type-select":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-select"),Lt.getElementFromFieldCache[a][e];case"cpf-type-selectmultiple":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-selectmultiple"),Lt.getElementFromFieldCache[a][e];case"cpf-type-textarea":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-textarea"),Lt.getElementFromFieldCache[a][e];case"cpf-type-textfield":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-textfield"),Lt.getElementFromFieldCache[a][e];case"cpf-type-color":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tm-color-picker"),Lt.getElementFromFieldCache[a][e];case"cpf-type-range":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-range"),Lt.getElementFromFieldCache[a][e];case"cpf-type-date":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-date"),Lt.getElementFromFieldCache[a][e];case"cpf-type-time":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-time"),Lt.getElementFromFieldCache[a][e];case"cpf-type-variations":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.closest(".cpf-section").find(".tm-epo-field.tm-epo-variation-element"),Lt.getElementFromFieldCache[a][e]}}}(e.element))&&0<i.length&&i.each(function(t,e){var a,i,o=Ht(e),r="change.cpflogic";c&&!c.closest(".tc-extra-product-options-inline").length||(a=".tm-product-id-"+o.closest(".tc-extra-product-options").attr("data-product-id"),i="[data-epo-id='"+o.closest(".tc-extra-product-options").attr("data-epo-id")+"']",c=Ht(".tc-extra-product-options"+a+i)),e&&0<o.length&&(!o.data("tmhaslogicevents")||n)&&(o.is(".tm-epo-variation-element")?(d("found_variation.tmlogic",!1,function(){T(c),Rt.trigger("tm-do-epo-update")}),d("hide_variation.tmlogic",!1,function(){T(c),Rt.trigger("tm-do-epo-update")})):((o.is(":text")||o.is("textarea"))&&(r="change.cpflogic input.cpflogic"),o.is(':input[type="number"]')&&(r="change.cpflogic input.cpflogic keypress.cpflogic"),o.off(r).on(r,function(){T(c)})),o.data("tmhaslogicevents",1))}),o[a]=parseInt(o[a],10)+1})}),this.each(function(){var t=Ht(this),e=!1;switch(t.data("matches",o).data("toggle",i).data("fields",a),i){case"show":e=!1;break;case"hide":e=!0}e?t.removeClass("tc-hidden"):t.addClass("tc-hidden"),t.data("isactive",e)}),this.addClass("iscpfdependson is-epo-depend").data("iscpfdependson",1),this},Ht.fn.run_cpfdependson=function(){T()}),Ht.tcepo={formSubmitEvents:{},oneOptionIsSelected:{},initialActivation:{},lateFieldsPrices:{},errorObject:{},showHideTotal:{}},Ht.tcepo.tm_init_epo=function(t,e,a,i){g(t,e,a,i)},Ht.tcepo.tmLazyloadContainer=function(t){h=t},Rt.on("tc_manual_init",function(t,e){var a,i,o,r;"container"in e&&"reactivate"in e&&(a=e.reactivate,e=e.container),a=a,i=(e=Ht(e=e)).attr("data-product-id"),o=e.attr("data-epo-id"),g(r=(r=(r=e.parent()).is("form")||(r=e.closest("form")).is("form")?r:e.parent()).parent(),!1,i,o,void 0,void 0,a)}),Ht(x).on("click.tcajax","body.mfn-ajax-add-to-cart .single_add_to_cart_button:not(.disabled)",function(){var t,e=Ht(this);St(e),Mt.ajaxdata.cart=e.closest(".cart"),Mt.ajaxdata.cart.find(".tm-formepo").remove(),(t=Ht("<div class='tm-hidden tm-formepo'></div>")).append(Mt.ajaxdata.epos.tcClone().addClass("formepo")),e.after(t)}),I.on("click.tcajax",".ajax_add_to_cart",function(){St(Ht(this)),void 0!==Mt.ajaxdata&&delete Mt.ajaxdata}),Ht(x.body).on("added_to_cart",function(){Mt.ajaxbuttondata&&Mt.ajaxbutton instanceof Ht&&(Mt.ajaxbutton.removeData(),Mt.ajaxbutton.data(Mt.ajaxbuttondata))}),Ht(function(){Lt=Ht.epoAPI.applyFilter("tc_api",Lt),Rt.on("lazyLoadXToncomplete",function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})}),Rt.on("tc_init_epo_plugin",function(t){qt()}),Rt.on("tcShowLastError",function(){P.console.log(b)}),Ht.ajaxPrefilter(function(e,a){var t,i,o,r,c,n,l,d,s,p=!1,m=!1,_={};if("yes"===Mt.tm_epo_enable_in_shop&&(s=e.url.split("?"))&&1<=s.length&&(s=s[1])){for(t=s.split("&"),i=0;i<t.length;i+=1)1<=(o=t[i].split("=")).length&&o[0]&&o[1]&&"wc-ajax"===o[0]&&"add_to_cart"===o[1]&&(p=!0);p&&(e.originalsuccess=e.success,e.success=function(t){t&&t.error&&t.product_url?(f&&1===f.length&&(r=f),(r=Ht(".ajax_add_to_cart[data-product_id='"+a.data.product_id+"']")).removeClass("added"),r.removeClass("loading")):e.originalsuccess.call(null,t)})}FormData&&a.data&&(s=a.data,"object"==typeof(s="string"==typeof a.data?Ht.epoAPI.util.parseParams(a.data):s)[0]&&(s.forEach(function(t){_[t.name]=t.value}),s=_),c=[],a.url&&a.url.indexOf&&(c=Ht.epoAPI.util.parseParams(a.url.slice(a.url.indexOf("?")+1))),"quantity"in s&&s.tcaddtocart&&(s.product_id||s["add-to-cart"]||c.product_id||c["add-to-cart"])?(m=!0,n=s.tcaddtocart):Array.isArray(s)&&(m=s.some(function(t){return"quantity"===t.name})&&s.some(function(t){return"add-to-cart"===t.name})&&s.some(function(t){return"tcaddtocart"===t.name}),n=!!(n=s.find(function(t){return"tcaddtocart"===t.name}))&&n.value),m)&&1===(c=1<(c=f&&1===f.length&&1===f.closest(".tm-has-options").length?f.closest(".tm-has-options").find(".tc-extra-product-options.tm-product-id-"+n):Ht(".tc-extra-product-options.tm-product-id-"+n)).length?c.filter(".formepo")?c.filter(".formepo"):c.first():c).length&&(m={tcajax:1,tcaddtocart:n,cpf_product_price:(s=Ht(".tc-totals-form.tm-product-id-"+n)).find(".cpf-product-price").val(),dynamic_product_price:s.find(".cpf-dynamic-product-price").val(),override_product_price:s.find(".cpf-override-product-price").val()},(n=s.find(".tc_form_prefix").val())&&(m.tc_form_prefix=n),l=Ht.epoAPI.util.parseParams(e.data,!0),l=Ht.extend(l,c.tcSerializeObject(),m),d=new FormData,Object.keys(l).forEach(function(t){t&&d.append(t,l[t])}),c.find(":file").toArray().forEach(function(t){for(i=0;i<Ht(t)[0].files.length;i++)t.multiple||d.delete(Ht(t).attr("name")),d.append(Ht(t).attr("name"),Ht(t)[0].files[i])}),e.data=d,e.contentType=!1,e.cache=!1,e.processData=!1)}),C.ajaxSuccess(function(t,e,o){var a,r,c,n,l,d,s,p,m,_=Mt.quickview_array||"null",i=Mt.quickview_container||"null",f={},u=1;if(void 0!==Mt.ajaxdata&&(Mt.ajaxdata.cart.find(".tm-formepo").remove(),delete Mt.ajaxdata),"wc_epo_get_associated_product_html"!==(s=Ht.epoAPI.util.parseParams(o.data)).action){for(a in Ht(".tm-formepo-normal").remove(),Ht(".tm-formepo").remove(),Ht(".tm-cart-link").tmpoplink(),_=Ht.epoAPI.util.parseJSON(_),i=Ht.epoAPI.util.parseJSON(i))Object.prototype.hasOwnProperty.call(i,a)&&(f[i[a][0]]=Ht(i[a][1]));Ht.extend(_,f),p=function(){var e=!1;return Object.keys(_).forEach(function(t){Ht(_[t]).length&&(e=t)}),e},(m=function(t){var e,a=requestAnimationFrame(function(){setTimeout(function(){m(t-1)},200)}),i=p();if((i||0===t)&&(cancelAnimationFrame(a),i)){if(l=!1,r=Ht(_[i]),"woothemes_quick_view"===i&&r.is(".fusion-woocommerce-quick-view-container"))return!0;if("fusion_quick_view_load"===i&&0===r.find(Lt.epoSelector).length)return!0;if("woodmart_quick_shop"===i&&"woodmart_quick_shop"===(s=Ht.epoAPI.util.parseParams(o.url)).action&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+".post-"+s.id))).length&&(r=d,l=!0),"woodmart_quick_view"===i&&"woodmart_quick_view"===(s=Ht.epoAPI.util.parseParams(o.url)).action&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+".post-"+s.id))).length&&(r=d,l=!0),"quickview_pro"===i&&(s=o.url.split("/")).length&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+" .post-"+s[s.length-1]))).length&&(r=d,l=!0),"exwoofood_booking_info"!==i&&"wqv_popup_content"!==i&&"wp_food"!==i&&"jet_popup_get_content"!==i||(l=!0),"woofood"===i&&o.data&&"woofood_quickview_ajax"===(s=Ht.epoAPI.util.parseParams(o.data)).action&&(d=r.find("form").parent()).length&&(r=d,l=!0),0===r.find(".product").length&&r.is(".product")&&(l=!0),0<r.find(".product").length||l){if(r.removeClass("tc-init"),"fusion_quick_view_load"!==i&&"jet_popup_get_content"!==i&&"wp_food"!==i&&"woodmart_quick_shop"!==i&&"woodmart_quick_view"!==i&&"lightboxpro"!==i&&"jckqv_quick_view"!==i&&"yith_quick_view"!==i&&"theme_flatsome"!==i||(v=!0),1<(h=r).length){for(;1<h.length&&0!==(h=h.filter(function(){return 0<Ht(this).find(Lt.epoSelector).length})).length;);if(0===h.length)return setTimeout(function(){m(10)},1e3),!0}if(0===(e=h.find(Lt.epoSelector)).length)return delete _[i],m(10),!0;"fusion_quick_view_load"===i&&(u=1400),setTimeout(function(){c=e.attr("data-product-id"),n=e.attr("data-epo-id"),"woodmart_quick_shop"===i&&r.addClass("has-options"),Lt.getElementFromFieldCache=[],g(h,!0,c,n),Rt.trigger("tmlazy"),Rt.trigger("tm_epo_loaded_quickview"),Ht.jMaskGlobals&&h.find(Ht.jMaskGlobals.maskElements).each(function(){var t=Ht(this);t.attr("data-mask")&&t.mask(t.attr("data-mask"))})},u)}}})(10)}}),qt(),Ht(".tm-cart-link").tmpoplink(),I.on("updated_checkout wc_fragments_loaded wc_fragments_refreshed wc_fragment_refresh",function(){Ht(".tm-cart-link").tmpoplink()}),Rt.trigger("tmlazy"),Rt.trigger("tm_epo_loaded")}),I.on("updated_checkout updated_cart_totals",function(){t()}),t(),Ht(function(){var t=navigator.userAgent||navigator.vendor||P.opera;(t=-1<t.indexOf("FBAN")||-1<t.indexOf("FBAV")||-1<t.indexOf("Instagram"))&&Ht(".tmcp-upload").removeAttr("accept"),C.on("click",".quantity .jckqv-qty-spinner, .quantity .ui-spinner-button",function(){Ht(this).closest(".quantity").find(Lt.qtySelector).trigger("change")}),Ht("#wholesale_form").on("submit",function(){var t=Ht("form.cart").find(Lt.addToCartSelector).val(),e=Ht(Lt.epoSelector+".tm-cart-main[data-product-id='"+t+"']").tcClone(),t=Ht(".tm-totals-form-main[data-product-id='"+t+"']").tcClone(),a=Ht("<div class='tm-hidden tm-formepo'></div>");return a.append(e),a.append(t),Ht(this).append(a),!0}),C.on("click","#add_to_quote",function(t){var e,a;Mt&&"yes"===Mt.tm_epo_global_enable_validation&&(e=Ht(this).parents("form"),a=parseInt(e.find(".tm-epo-counter").val(),10),a=Ht(Lt.epoSelector+"[data-epo-id='"+a+"']"),"yes"===Mt.tm_epo_global_enable_validation)&&Ht.tc_validator&&0<e.length&&0<a.length&&!e.tc_validate().form()&&t.stopImmediatePropagation()}),Ht(".single_add_to_cart_button.paypal_checkout_button").on("click",function(t){var e=Ht(".cart");e.data("tc_validator")&&e.data("tc_validator").errorList&&t.stopImmediatePropagation()}),Ht(".wc-product-table").on("init.wcpt",function(t,e){e.$table.find(Lt.epoSelector).addClass("hidden"),e.$table.find("thead tr").append("<th>&nbsp;</th>"),setTimeout(function(){e.$table.find(".cart:not(.cart_group)").each(function(){var t=Ht(this).find(Lt.epoSelector),e=t.closest("tr");Ht("<td class='wc-product-table-epo'></td>").appendTo(e).append(t),Ht(P).trigger("tc_manual_init",t),t.removeClass("hidden")})},500)})}))}(window,document,window.jQuery);assets/js/tm-datepicker.min.js000064400000115101150755142450012342 0ustar00!function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):t(window.jQuery)}(function(M){"use strict";var n;function r(t){M.tm_datepicker._isDisabledDatepicker((n.inline?n.dpDiv.parent():n.input)[0])||(M(t).parents(".ui-tm-datepicker-calendar").find("a").removeClass("ui-state-hover"),M(t).addClass("ui-state-hover"),-1!==t.className.indexOf("ui-tm-datepicker-prev")&&M(t).addClass("ui-tm-datepicker-prev-hover"),-1!==t.className.indexOf("ui-tm-datepicker-next")&&M(t).addClass("ui-tm-datepicker-next-hover"))}function a(t){var e="button, .ui-tm-datepicker-prev, .ui-tm-datepicker-next, .ui-tm-datepicker-calendar td a";return t.on("mouseout",e,function(){M(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-tm-datepicker-prev")&&M(this).removeClass("ui-tm-datepicker-prev-hover"),-1!==this.className.indexOf("ui-tm-datepicker-next")&&M(this).removeClass("ui-tm-datepicker-next-hover")}).on("mouseover",e,function(){r(this)})}function d(t,e){for(var a in M.extend(t,e),e)null===e[a]&&(t[a]=e[a])}function t(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-tm-datepicker-div",this._inlineClass="ui-tm-datepicker-inline",this._appendClass="ui-tm-datepicker-append",this._triggerClass="ui-tm-datepicker-trigger",this._dialogClass="ui-tm-datepicker-dialog",this._disableClass="ui-tm-datepicker-disabled",this._unselectableClass="ui-tm-datepicker-unselectable",this._currentClass="ui-tm-datepicker-current-day",this._dayOverClass="ui-tm-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},M.extend(this._defaults,this.regional[""]),this.regional.en=M.extend(!0,{},this.regional[""]),this.regional["en-US"]=M.extend(!0,{},this.regional.en),this.dpDiv=a(M("<div id='"+this._mainDivId+"' class='ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}M.ui.tm_datepicker=M.ui.tm_datepicker||{},M.ui.tm_datepicker.version||(M.extend(M.ui,{tm_datepicker:{version:"1.11.4"}}),M.extend(t.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return d(this._defaults,t||{}),this},_attachDatepicker:function(t,e){var a,i=t.nodeName.toLowerCase(),s="div"===i||"span"===i;t.id||(this.uuid+=1,t.id="dp"+this.uuid),(a=this._newInst(M(t),s)).settings=M.extend({},e||{}),"input"===i?this._connectDatepicker(t,a):s&&this._inlineDatepicker(t,a)},_newInst:function(t,e){return{id:t[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:e,dpDiv:e?a(M("<div class='"+this._inlineClass+" ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,e){var a=M(t);e.append=M([]),e.trigger=M([]),a.hasClass(this.markerClassName)||(this._attachments(a,e),a.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(e),M.data(t,"datepicker",e),e.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,e){var a,i=this._get(e,"appendText"),s=this._get(e,"isRTL");e.append&&e.append.remove(),i&&(e.append=M("<span class='"+this._appendClass+"'>"+i+"</span>"),t[s?"before":"after"](e.append)),t.off("focus",this._showDatepicker),e.trigger&&e.trigger.remove(),"focus"!==(i=this._get(e,"showOn"))&&"both"!==i||t.on("focus",this._showDatepicker),"button"!==i&&"both"!==i||(i=this._get(e,"buttonText"),a=this._get(e,"buttonImage"),e.trigger=M(this._get(e,"buttonImageOnly")?M("<img/>").addClass(this._triggerClass).attr({src:a,alt:i,title:i}):M("<button type='button'></button>").addClass(this._triggerClass).html(a?M("<img/>").attr({src:a,alt:i,title:i}):i)),t[s?"before":"after"](e.trigger),e.trigger.on("click",function(){return M.tm_datepicker._datepickerShowing&&M.tm_datepicker._lastInput===t[0]?M.tm_datepicker._hideDatepicker():(M.tm_datepicker._datepickerShowing&&M.tm_datepicker._lastInput!==t[0]&&M.tm_datepicker._hideDatepicker(),M.tm_datepicker._showDatepicker(t[0])),!1}))},_autoSize:function(t){var e,a,i,s,n,r=this._get(t,"dateFormat");this._get(t,"autoSize")&&!t.inline&&(n=new Date(2009,11,20),(r=this._get(t,"dateFormat")).match(/[DM]/)&&(n.setMonth((e=function(t){for(s=i=a=0;s<t.length;s+=1)t[s].length>a&&(a=t[s].length,i=s);return i})(this._get(t,r.match(/MM/)?"monthNames":"monthNamesShort"))),n.setDate(e(this._get(t,r.match(/DD/)?"dayNames":"dayNamesShort"))+20-n.getDay())),t.input.attr("size",this._formatDate(t,n).length))},_inlineDatepicker:function(t,e){var a=M(t);a.hasClass(this.markerClassName)||(a.addClass(this.markerClassName).append(e.dpDiv),M.data(t,"datepicker",e),this._setDate(e,this._getDefaultDate(e),!0),this._updateDatepicker(e),this._updateAlternate(e),e.settings.disabled&&this._disableDatepicker(t),e.dpDiv.css("display","block"))},_dialogDatepicker:function(t,e,a,i,s){var n,r=this._dialogInst;return r||(this.uuid+=1,n="dp"+this.uuid,this._dialogInput=M("<input type='text' id='"+n+"'>"),this._dialogInput.on("keydown",this._doKeyDown),M("body").append(this._dialogInput),r=this._newInst(this._dialogInput,!1),(this._dialogInst=r).settings={},M.data(this._dialogInput[0],"datepicker",r)),d(r.settings,i||{}),e=e&&e.constructor===Date?this._formatDate(r,e):e,this._dialogInput.val(e),this._pos=s?s.length?s:[s.pageX,s.pageY]:null,this._pos||(n=document.documentElement.clientWidth,i=document.documentElement.clientHeight,e=document.documentElement.scrollLeft||document.body.scrollLeft,s=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[n/2-100+e,i/2-150+s]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),r.settings.onSelect=a,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),M.blockUI&&M.blockUI(this.dpDiv),M.data(this._dialogInput[0],"datepicker",r),this},_destroyDatepicker:function(t){var e,a=M(t),i=M.data(t,"datepicker");a.hasClass(this.markerClassName)&&(e=t.nodeName.toLowerCase(),M.removeData(t,"datepicker"),"input"===e?(i.append.remove(),i.trigger.remove(),a.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):"div"!==e&&"span"!==e||a.removeClass(this.markerClassName).empty(),n===i)&&(n=null)},_enableDatepicker:function(e){var t,a=M(e),i=M.data(e,"datepicker");a.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!1,i.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):"div"!==t&&"span"!==t||((i=a.children("."+this._inlineClass)).children().removeClass("ui-state-disabled"),i.find("select.ui-tm-datepicker-month, select.ui-tm-datepicker-year").prop("disabled",!1)),this._disabledInputs=M.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var t,a=M(e),i=M.data(e,"datepicker");a.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!0,i.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):"div"!==t&&"span"!==t||((i=a.children("."+this._inlineClass)).children().addClass("ui-state-disabled"),i.find("select.ui-tm-datepicker-month, select.ui-tm-datepicker-year").prop("disabled",!0)),this._disabledInputs=M.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){var e;if(t)for(e=0;e<this._disabledInputs.length;e+=1)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(t){try{return M.data(t,"datepicker")}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,e,a){var i,s,n=this._getInst(t);if(2===arguments.length&&"string"==typeof e)return"defaults"===e?M.extend({},M.tm_datepicker._defaults):n?"all"===e?M.extend({},n.settings):this._get(n,e):null;i=e||{},"string"==typeof e&&((i={})[e]=a),n&&(this._curInst===n&&this._hideDatepicker(),e=this._getDateDatepicker(t,!0),a=this._getMinMaxDate(n,"min"),s=this._getMinMaxDate(n,"max"),d(n.settings,i),null!==a&&void 0!==i.dateFormat&&void 0===i.minDate&&(n.settings.minDate=this._formatDate(n,a)),null!==s&&void 0!==i.dateFormat&&void 0===i.maxDate&&(n.settings.maxDate=this._formatDate(n,s)),"disabled"in i&&(i.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(M(t),n),this._autoSize(n),this._setDate(n,e),this._updateAlternate(n),this._updateDatepicker(n))},_changeDatepicker:function(t,e,a){this._optionDatepicker(t,e,a)},_refreshDatepicker:function(t){t=this._getInst(t);t&&this._updateDatepicker(t)},_setDateDatepicker:function(t,e){t=this._getInst(t);t&&(this._setDate(t,e),this._updateDatepicker(t),this._updateAlternate(t))},_getDateDatepicker:function(t,e){t=this._getInst(t);return t&&!t.inline&&this._setDateFromField(t,e),t?this._getDate(t):null},_doKeyDown:function(t){var e,a,i=M.tm_datepicker._getInst(t.target),s=!0,n=i.dpDiv.is(".ui-tm-datepicker-rtl");if(i._keyEvent=!0,M.tm_datepicker._datepickerShowing)switch(t.keyCode){case 9:M.tm_datepicker._hideDatepicker(),s=!1;break;case 13:return(a=M("td."+M.tm_datepicker._dayOverClass+":not(."+M.tm_datepicker._currentClass+")",i.dpDiv))[0]&&M.tm_datepicker._selectDay(t.target,i.selectedMonth,i.selectedYear,a[0]),(a=M.tm_datepicker._get(i,"onSelect"))?(e=M.tm_datepicker._formatDate(i),a.apply(i.input?i.input[0]:null,[e,i])):M.tm_datepicker._hideDatepicker(),!1;case 27:M.tm_datepicker._hideDatepicker();break;case 33:M.tm_datepicker._adjustDate(t.target,t.ctrlKey?-M.tm_datepicker._get(i,"stepBigMonths"):-M.tm_datepicker._get(i,"stepMonths"),"M");break;case 34:M.tm_datepicker._adjustDate(t.target,t.ctrlKey?+M.tm_datepicker._get(i,"stepBigMonths"):+M.tm_datepicker._get(i,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._clearDate(t.target),s=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._gotoToday(t.target),s=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,n?1:-1,"D"),s=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&M.tm_datepicker._adjustDate(t.target,t.ctrlKey?-M.tm_datepicker._get(i,"stepBigMonths"):-M.tm_datepicker._get(i,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,-7,"D"),s=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,n?-1:1,"D"),s=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&M.tm_datepicker._adjustDate(t.target,t.ctrlKey?+M.tm_datepicker._get(i,"stepBigMonths"):+M.tm_datepicker._get(i,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&M.tm_datepicker._adjustDate(t.target,7,"D"),s=t.ctrlKey||t.metaKey;break;default:s=!1}else 36===t.keyCode&&t.ctrlKey?M.tm_datepicker._showDatepicker(this):s=!1;s&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var e,a=M.tm_datepicker._getInst(t.target);if(M.tm_datepicker._get(a,"constrainInput"))return a=M.tm_datepicker._possibleChars(M.tm_datepicker._get(a,"dateFormat")),e=String.fromCharCode(null===t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||e<" "||!a||-1<a.indexOf(e)},_doKeyUp:function(t){t=M.tm_datepicker._getInst(t.target);if(t.input.val()!==t.lastVal)try{M.tm_datepicker.parseDate(M.tm_datepicker._get(t,"dateFormat"),t.input?t.input.val():null,M.tm_datepicker._getFormatConfig(t))&&(M.tm_datepicker._setDateFromField(t),M.tm_datepicker._updateAlternate(t),M.tm_datepicker._updateDatepicker(t))}catch(t){return!1}return!0},_showDatepicker:function(t){var e,a,i,s;"input"!==(t=t.target||t).nodeName.toLowerCase()&&(t=M("input",t.parentNode)[0]),M.tm_datepicker._isDisabledDatepicker(t)||M.tm_datepicker._lastInput===t||(e=M.tm_datepicker._getInst(t),M.tm_datepicker._curInst&&M.tm_datepicker._curInst!==e&&(M.tm_datepicker._curInst.dpDiv.stop(!0,!0),e)&&M.tm_datepicker._datepickerShowing&&M.tm_datepicker._hideDatepicker(M.tm_datepicker._curInst.input[0]),!1===(i=(i=M.tm_datepicker._get(e,"beforeShow"))?i.apply(t,[t,e]):{}))||(d(e.settings,i),e.lastVal=null,M.tm_datepicker._lastInput=t,M.tm_datepicker._setDateFromField(e),M.tm_datepicker._inDialog&&(t.value=""),M.tm_datepicker._pos||(M.tm_datepicker._pos=M.tm_datepicker._findPos(t),M.tm_datepicker._pos[1]+=t.offsetHeight),a=!1,M(t).parents().each(function(){return!(a=a||"fixed"===M(this).css("position"))}),i={left:M.tm_datepicker._pos[0],top:M.tm_datepicker._pos[1]},M.tm_datepicker._pos=null,e.dpDiv.empty(),e.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),M.tm_datepicker._updateDatepicker(e),i=M.tm_datepicker._checkOffset(e,i,a),e.dpDiv.css({position:M.tm_datepicker._inDialog&&M.blockUI?"static":a?"fixed":"absolute",display:"none",left:i.left+"px",top:i.top+"px"}),e.inline)||(i=M.tm_datepicker._get(e,"showAnim"),s=M.tm_datepicker._get(e,"duration"),e.dpDiv.css("z-index",function(t){for(var e;t.length&&t[0]!==document;){if(("absolute"===(e=t.css("position"))||"relative"===e||"fixed"===e)&&(e=parseInt(t.css("zIndex"),10),!isNaN(e))&&0!==e)return e;t=t.parent()}return 0}(M(t))+1),M.tm_datepicker._datepickerShowing=!0,M.effects&&M.effects.effect[i]?e.dpDiv.show(i,M.tm_datepicker._get(e,"showOptions"),s):e.dpDiv[i||"show"](i?s:null),M.tm_datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),M.tm_datepicker._curInst=e)},_updateDatepicker:function(t){var e,a,i,s;this.maxRows=4,(n=t).dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t),i=(a=this._getNumberOfMonths(t))[1],0<(s=t.dpDiv.find("."+this._dayOverClass+" a")).length&&r.apply(s.get(0),[s.get(0)]),t.dpDiv.removeClass("ui-tm-datepicker-multi-2 ui-tm-datepicker-multi-3 ui-tm-datepicker-multi-4").width(""),1<i&&t.dpDiv.addClass("ui-tm-datepicker-multi-"+i).css("width",17*i+"em"),t.dpDiv[(1!==a[0]||1!==a[1]?"add":"remove")+"Class"]("ui-tm-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-tm-datepicker-rtl"),t===M.tm_datepicker._curInst&&M.tm_datepicker._datepickerShowing&&M.tm_datepicker._shouldFocusInput(t)&&t.input.trigger("focus"),t.yearshtml&&(e=t.yearshtml,setTimeout(function(){e===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-tm-datepicker-year:first").replaceWith(t.yearshtml),e=null,t.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(t,e,a){var i=t.dpDiv.outerWidth(),s=t.dpDiv.outerHeight(),n=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,d=document.documentElement.clientWidth+(a?0:M(document).scrollLeft()),c=document.documentElement.clientHeight+(a?0:M(document).scrollTop());return e.left-=this._get(t,"isRTL")?i-n:0,e.left-=a&&e.left===t.input.offset().left?M(document).scrollLeft():0,e.top-=a&&e.top===t.input.offset().top+r?M(document).scrollTop():0,e.left-=Math.min(e.left,e.left+i>d&&i<d?Math.abs(e.left+i-d):0),e.top-=Math.min(e.top,e.top+s>c&&s<c?Math.abs(s+r):0),e},_findPos:function(t){for(var e=this._getInst(t),a=this._get(e,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||M.expr.filters.hidden(t));)t=t[a?"previousSibling":"nextSibling"];return[(e=M(t).offset()).left,e.top]},_hideDatepicker:function(t){var e,a,i=this._curInst;!i||t&&i!==M.data(t,"datepicker")||this._datepickerShowing&&(t=this._get(i,"showAnim"),a=this._get(i,"duration"),e=function(){M.tm_datepicker._tidyDialog(i)},M.effects&&(M.effects.effect[t]||M.effects[t])?i.dpDiv.hide(t,M.tm_datepicker._get(i,"showOptions"),a,e):i.dpDiv["slideDown"===t?"slideUp":"fadeIn"===t?"fadeOut":"hide"](t?a:null,e),t||e(),this._datepickerShowing=!1,(a=this._get(i,"onClose"))&&a.apply(i.input?i.input[0]:null,[i.input?i.input.val():"",i]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),M.blockUI)&&(M.unblockUI(),M("body").append(this.dpDiv)),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-tm-datepicker-calendar")},_checkExternalClick:function(t){var e;M.tm_datepicker._curInst&&(t=M(t.target),e=M.tm_datepicker._getInst(t[0]),!(t[0].id===M.tm_datepicker._mainDivId||0!==t.parents("#"+M.tm_datepicker._mainDivId).length||t.hasClass(M.tm_datepicker.markerClassName)||t.closest("."+M.tm_datepicker._triggerClass).length||!M.tm_datepicker._datepickerShowing||M.tm_datepicker._inDialog&&M.blockUI)||t.hasClass(M.tm_datepicker.markerClassName)&&M.tm_datepicker._curInst!==e)&&M.tm_datepicker._hideDatepicker()},_adjustDate:function(t,e,a){var t=M(t),i=this._getInst(t[0]);this._isDisabledDatepicker(t[0])||(this._adjustInstDate(i,e+("M"===a?this._get(i,"showCurrentAtPos"):0),a),this._updateDatepicker(i))},_gotoToday:function(t){var e,t=M(t),a=this._getInst(t[0]);this._get(a,"gotoCurrent")&&a.currentDay?(a.selectedDay=a.currentDay,a.drawMonth=a.currentMonth,a.selectedMonth=a.currentMonth,a.drawYear=a.currentYear,a.selectedYear=a.currentYear):(e=new Date,a.selectedDay=e.getDate(),a.drawMonth=e.getMonth(),a.selectedMonth=a.drawMonth,a.drawYear=e.getFullYear(),a.selectedYear=a.drawYear),this._notifyChange(a),this._adjustDate(t)},_selectMonthYear:function(t,e,a){var t=M(t),i=this._getInst(t[0]);i["selected"+("M"===a?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),i["draw"+("M"===a?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),this._notifyChange(i),this._adjustDate(t)},_selectDay:function(t,e,a,i){var s=M(t);M(i).hasClass(this._unselectableClass)||this._isDisabledDatepicker(s[0])||((s=this._getInst(s[0])).selectedDay=M("a",i).html(),s.currentDay=s.selectedDay,s.selectedMonth=e,s.currentMonth=e,s.selectedYear=a,s.currentYear=a,this._selectDate(t,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear)))},_clearDate:function(t){t=M(t);this._selectDate(t,"")},_selectDate:function(t,e){var a,t=M(t),t=this._getInst(t[0]);e=null!==e?e:this._formatDate(t),t.input&&t.input.val(e),this._updateAlternate(t),(a=this._get(t,"onSelect"))?a.apply(t.input?t.input[0]:null,[e,t]):t.input&&t.input.trigger("change"),t.inline?this._updateDatepicker(t):(this._hideDatepicker(),this._lastInput=t.input[0],"object"!=typeof t.input[0]&&t.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(t){var e,a,i=this._get(t,"altField");i&&(a=this._get(t,"altFormat")||this._get(t,"dateFormat"),e=this._getDate(t),a=this.formatDate(a,e,this._getFormatConfig(t)),M(i).val(a))},noWeekends:function(t){t=t.getDay();return[0<t&&t<6,""]},iso8601Week:function(t){var e,t=new Date(t.getTime());return t.setDate(t.getDate()+4-(t.getDay()||7)),e=t.getTime(),t.setMonth(0),t.setDate(1),Math.floor(Math.round((e-t)/864e5)/7)+1},parseDate:function(e,s,t){var a,i,n,r,d,c,l,o,u,h,p,m,_,g=0,f=-1,k=-1,D=-1,v=-1,y=!1;if(null===e||null===s)throw"Invalid arguments";if(""===(s="object"==typeof s?s.toString():s+""))return null;for(n="string"!=typeof(n=(t?t.shortYearCutoff:null)||this._defaults.shortYearCutoff)?n:(new Date).getFullYear()%100+parseInt(n,10),r=(t?t.dayNamesShort:null)||this._defaults.dayNamesShort,d=(t?t.dayNames:null)||this._defaults.dayNames,c=(t?t.monthNamesShort:null)||this._defaults.monthNamesShort,l=(t?t.monthNames:null)||this._defaults.monthNames,u=function(t){t=a+1<e.length&&e.charAt(a+1)===t;return t&&(a+=1),t},h=function(t){var e=u(t),e="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,t=new RegExp("^\\d{"+("y"===t?e:1)+","+e+"}"),e=s.substring(g).match(t);if(e)return g+=e[0].length,parseInt(e[0],10);throw"Missing number at position "+g},p=function(t,e,a){var i=-1,t=M.map(u(t)?a:e,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(M.each(t,function(t,e){var a=e[1];if(s.substring(g,parseInt(g,10)+a.length).toLowerCase()===a.toLowerCase())return i=e[0],g+=a.length,!1}),-1!==i)return i+1;throw"Unknown name at position "+g},m=function(){if(s.charAt(g)!==e.charAt(a))throw"Unexpected literal at position "+g;g+=1},a=0;a<e.length;a+=1)if(y)"'"!==e.charAt(a)||u("'")?m():y=!1;else switch(e.charAt(a)){case"d":D=h("d");break;case"D":p("D",r,d);break;case"o":v=h("o");break;case"m":k=h("m");break;case"M":k=p("M",c,l);break;case"y":f=h("y");break;case"@":f=(o=new Date(h("@"))).getFullYear(),k=o.getMonth()+1,D=o.getDate();break;case"!":f=(o=new Date((h("!")-this._ticksTo1970)/1e4)).getFullYear(),k=o.getMonth()+1,D=o.getDate();break;case"'":u("'")?m():y=!0;break;default:m()}if(g<s.length&&(t=s.substring(g),!/^\s+/.test(t)))throw"Extra/unparsed characters found in date: "+t;if(-1===f?f=(new Date).getFullYear():f<100&&(f+=(new Date).getFullYear()-(new Date).getFullYear()%100+(f<=n?0:-100)),-1<v)for(k=1,D=v,_=!0;D<=(i=this._getDaysInMonth(f,k-1))?_=!1:(k+=1,D-=i),_;);if((o=this._daylightSavingAdjust(new Date(f,k-1,D))).getFullYear()!==f||o.getMonth()+1!==k||o.getDate()!==D)throw"Invalid date";return o},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*60*60*1e7,formatDate:function(e,t,a){function i(t,e,a){var i=""+e;if(o(t))for(;i.length<a;)i="0"+i;return i}function s(t,e,a,i){return(o(t)?i:a)[e]}var n,r=(a?a.dayNamesShort:null)||this._defaults.dayNamesShort,d=(a?a.dayNames:null)||this._defaults.dayNames,c=(a?a.monthNamesShort:null)||this._defaults.monthNamesShort,l=(a?a.monthNames:null)||this._defaults.monthNames,o=function(t){t=n+1<e.length&&e.charAt(n+1)===t;return t&&(n+=1),t},u="",h=!1;if(!t)return"";if(t)for(n=0;n<e.length;n+=1)if(h)"'"!==e.charAt(n)||o("'")?u+=e.charAt(n):h=!1;else switch(e.charAt(n)){case"d":u+=i("d",t.getDate(),2);break;case"D":u+=s("D",t.getDay(),r,d);break;case"o":u+=i("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=i("m",t.getMonth()+1,2);break;case"M":u+=s("M",t.getMonth(),c,l);break;case"y":u+=o("y")?t.getFullYear():(t.getFullYear()%100<10?"0":"")+t.getFullYear()%100;break;case"@":u+=t.getTime();break;case"!":u+=1e4*t.getTime()+this._ticksTo1970;break;case"'":o("'")?u+="'":h=!0;break;default:u+=e.charAt(n)}return u},_possibleChars:function(e){for(var t="",a=!1,i=function(t){t=s+1<e.length&&e.charAt(s+1)===t;return t&&(s+=1),t},s=0;s<e.length;s+=1)if(a)"'"!==e.charAt(s)||i("'")?t+=e.charAt(s):a=!1;else switch(e.charAt(s)){case"d":case"m":case"y":case"@":t+="0123456789";break;case"D":case"M":return null;case"'":i("'")?t+="'":a=!0;break;default:t+=e.charAt(s)}return t},_get:function(t,e){return(void 0!==t.settings[e]?t.settings:this._defaults)[e]},_setDateFromField:function(t,e){var a,i,s,n,r;if(t.input.val()!==t.lastVal){a=this._get(t,"dateFormat"),i=t.input?t.input.val():null,n=s=this._getDefaultDate(t),r=this._getFormatConfig(t),t.lastVal=i;try{n=this.parseDate(a,i,r)||s}catch(t){i=e?"":i}t.selectedDay=n.getDate(),t.selectedMonth=n.getMonth(),t.drawMonth=t.selectedMonth,t.selectedYear=n.getFullYear(),t.drawYear=t.selectedYear,t.currentDay=i?n.getDate():0,t.currentMonth=i?n.getMonth():0,t.currentYear=i?n.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(d,t,e){var a,i=null===t||""===t?e:"string"==typeof t?function(t){var e,a,i,s,n,r;try{return M.tm_datepicker.parseDate(M.tm_datepicker._get(d,"dateFormat"),t,M.tm_datepicker._getFormatConfig(d))}catch(t){}for(a=(e=(t.toLowerCase().match(/^c/)?M.tm_datepicker._getDate(d):null)||new Date).getFullYear(),i=e.getMonth(),s=e.getDate(),r=(n=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g).exec(t);r;){switch(r[2]||"d"){case"d":case"D":s+=parseInt(r[1],10);break;case"w":case"W":s+=7*parseInt(r[1],10);break;case"m":case"M":i+=parseInt(r[1],10),s=Math.min(s,M.tm_datepicker._getDaysInMonth(a,i));break;case"y":case"Y":a+=parseInt(r[1],10),s=Math.min(s,M.tm_datepicker._getDaysInMonth(a,i))}r=n.exec(t)}return new Date(a,i,s)}(t):"number"==typeof t?Number.isFinite(t)?(i=t,(a=new Date).setDate(a.getDate()+i),a):e:new Date(t.getTime());return(i=i&&"Invalid Date"===i.toString()?e:i)&&(i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0)),this._daylightSavingAdjust(i)},_daylightSavingAdjust:function(t){return t?(t.setHours(12<t.getHours()?t.getHours()+2:0),t):null},_setDate:function(t,e,a){var i=!e,s=t.selectedMonth,n=t.selectedYear,e=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.currentDay=e.getDate(),t.selectedDay=t.currentDay,t.currentMonth=e.getMonth(),t.drawMonth=t.currentMonth,t.selectedMonth=t.currentMonth,t.currentYear=e.getFullYear(),t.drawYear=t.currentYear,t.selectedYear=t.currentYear,s===t.selectedMonth&&n===t.selectedYear||a||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(i?"":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(t){var e=this._get(t,"stepMonths"),a="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prevM:function(){M.tm_datepicker._adjustDate(a,-1,"M")},nextM:function(){M.tm_datepicker._adjustDate(a,1,"M")},prevY:function(){M.tm_datepicker._adjustDate(a,-1,"Y")},nextY:function(){M.tm_datepicker._adjustDate(a,1,"Y")},prev:function(){M.tm_datepicker._adjustDate(a,-e,"M")},next:function(){M.tm_datepicker._adjustDate(a,+e,"M")},hide:function(){M.tm_datepicker._hideDatepicker()},today:function(){},selectDay:function(){return M.tm_datepicker._selectDay(a,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return M.tm_datepicker._selectMonthYear(a,this,"M"),!1},selectYear:function(){return M.tm_datepicker._selectMonthYear(a,this,"Y"),!1}};return M(this).on(this.getAttribute("data-event"),t[this.getAttribute("data-handler")]),null})},_tm_canAdjustMonth:function(t,e,a,i){a=this._daylightSavingAdjust(new Date(a,i+e,1));return e<0&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(t,a)},_generateHTML:function(t){var e,a,i,s,n,O,R,r,d,c,L,l,o,u,h,p,m,_,g,f,W,E,k,H,D,P,U,v,y,M,z,B,b,w,I=new Date,J=this._daylightSavingAdjust(new Date(I.getFullYear(),I.getMonth(),I.getDate())),C=this._get(t,"isRTL"),I=this._get(t,"showButtonPanel"),x=this._get(t,"hideIfNoPrevNext"),Y=this._get(t,"navigationAsDateFormat"),F=this._getNumberOfMonths(t),S=this._get(t,"showCurrentAtPos"),N=this._get(t,"stepMonths"),V=1!==F[0]||1!==F[1],q=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),A=this._getMinMaxDate(t,"min"),T=this._getMinMaxDate(t,"max"),j=t.drawMonth-S,K=t.drawYear;if(j<0&&(j+=12,--K),T)for(e=this._daylightSavingAdjust(new Date(T.getFullYear(),T.getMonth()-F[0]*F[1]+1,T.getDate())),e=A&&e<A?A:e;this._daylightSavingAdjust(new Date(K,j,1))>e;)--j<0&&(j=11,--K);for(t.drawMonth=j,t.drawYear=K,S=this._get(t,"prevText"),S=Y?this.formatDate(S,this._daylightSavingAdjust(new Date(K,j-N,1)),this._getFormatConfig(t)):S,a=this._canAdjustMonth(t,-1,K,j)?"<a class='ui-tm-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+S+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"e":"w")+"'>"+S+"</span></a>":x?"":"<a class='ui-tm-datepicker-prev ui-corner-all ui-state-disabled' title='"+S+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"e":"w")+"'>"+S+"</span></a>",b=this._get(t,"nextText"),b=Y?this.formatDate(b,this._daylightSavingAdjust(new Date(K,j+N,1)),this._getFormatConfig(t)):b,i=this._canAdjustMonth(t,1,K,j)?"<a class='ui-tm-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+b+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"w":"e")+"'>"+b+"</span></a>":x?"":"<a class='ui-tm-datepicker-next ui-corner-all ui-state-disabled' title='"+b+"'><span class='ui-icon ui-icon-circle-triangle-"+(C?"w":"e")+"'>"+b+"</span></a>",N=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?q:J,N=Y?this.formatDate(N,r,this._getFormatConfig(t)):N,Y=t.inline?"":"<div class='tm-ui-dp-btn-wrap tm-ui-dp-close'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-close' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</div></div>",I=I?"<div class='tm-ui-dp-buttonpane'>"+(C?Y:"")+(this._isInRange(t,r)?"<div class='tm-ui-dp-btn-wrap tm-ui-dp-current'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-current' data-handler='today' data-event='click'>"+N+"</div></div>":"")+(C?"":Y)+"</div>":"",s=parseInt(this._get(t,"firstDay"),10),s=isNaN(s)?0:s,n=this._get(t,"showWeek"),O=this._get(t,"dayNames"),R=this._get(t,"dayNamesMin"),r=this._get(t,"monthNames"),d=this._get(t,"beforeShowDay"),c=this._get(t,"showOtherMonths"),L=this._get(t,"selectOtherMonths"),l=this._getDefaultDate(t),o="",Y='<div class="tm-ui-dp-button-prev tm-ui-dp-button"><div '+((N=this._tm_canAdjustMonth(t,-1,K,j))?'data-handler="prevM" data-event="click" ':"")+'aria-label="'+S+'" class="'+(N?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div></div>',N='<div class="tm-ui-dp-button-next tm-ui-dp-button"><div '+((N=this._tm_canAdjustMonth(t,1,K,j))?'data-handler="nextM" data-event="click" ':"")+'aria-label="'+b+'" class="'+(N?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div></div>',S='<div class="tm-ui-dp-button-prev tm-ui-dp-button"><div '+((w=this._tm_canAdjustMonth(t,-12,K,j))?'data-handler="prevY" data-event="click" ':"")+'aria-label="'+S+'" class="'+(w?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div></div>',b='<div class="tm-ui-dp-button-next tm-ui-dp-button"><div '+((w=this._tm_canAdjustMonth(t,12,K,j))?'data-handler="nextY" data-event="click" ':"")+'aria-label="'+b+'" class="'+(w?"":"tm-ui-dp-button-disabled ")+'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div></div>',z=x?"":'<div class="tm-ui-dp-title-button">'+(C?N:Y)+'<span aria-label="'+r[j]+'" role="button" class="tm-ui-dp-month">'+r[j]+"</span>"+(C?Y:N)+"</div>",B=x?"":'<div class="tm-ui-dp-title-button">'+(C?b:S)+'<span class="tm-ui-dp-year" role="button" aria-label="'+K+'">'+K+"</span>"+(C?S:b)+"</div>",o+="<div class='tm-ui-dp-wrap'><div class='tm-ui-dp-overlay'></div><div class='tm-ui-dp'><div class='tm-ui-dp-container'><div class='tm-ui-dp-inner-container'><div class='tm-ui-dp-ui'><div class='tm-ui-dp-ui-inner'><div class='tm-ui-dp-main-wrap'><div class='tm-ui-dp-main'>",h=0;h<F[0];h+=1){for(p="",this.maxRows=4,m=0;m<F[1];m+=1){if(_=this._daylightSavingAdjust(new Date(K,j,t.selectedDay)),g=" ui-corner-all",f="",V){if(f+="<div class='ui-tm-datepicker-group",1<F[1])switch(m){case 0:f+=" ui-tm-datepicker-group-first",g=" ui-corner-"+(C?"right":"left");break;case F[1]-1:f+=" ui-tm-datepicker-group-last",g=" ui-corner-"+(C?"left":"right");break;default:f+=" ui-tm-datepicker-group-middle",g=""}f+="'>"}for(f=(f=f+("<div class='tm-ui-dp-header ui-tm-datepicker-header ui-widget-header ui-helper-clearfix"+g+"'>"+(/all|left/.test(g)&&0===h?C?i:a:"")+(/all|right/.test(g)&&0===h?C?a:i:"")+'<div class="ui-tm-datepicker-title tm-ui-dp-title">'+(/all|left/.test(g)&&0===h?C?B+z:z+B:"")+"</div></div>")+"<div class='tm-ui-dp-main-content'>")+"<div class='tm-ui-dp-main-header-wrap'><div class='tm-ui-dp-main-header'>"+"<table class='ui-tm-datepicker-calendar'><tbody><tr>",W=n?"<th class='ui-tm-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",u=0;u<7;u+=1)W+="<th scope='col'"+(5<=(u+s+6)%7?" class='ui-tm-datepicker-week-end'":"")+"><span title='"+O[E=(u+s)%7]+"'>"+R[E]+"</span></th>";for(f=(f+=W+"</tr></tbody></table>")+"</div></div>"+"<div class='tm-ui-dp-main-table'>",k=this._getDaysInMonth(K,j),K===t.selectedYear&&j===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,k)),k=(this._getFirstDayOfMonth(K,j)-s+7)%7,H=V&&6<this.maxRows?this.maxRows:6,this.maxRows=H,D=this._daylightSavingAdjust(new Date(K,j,1-k)),P=0;P<H;P+=1){for(f+="<div class='tm-ui-dp-main-row'>",U=n?"<div class='ui-tm-datepicker-week-col'>"+this._get(t,"calculateWeek")(D)+"</div>":"",u=0;u<7;u+=1)v=d?d.apply(t.input?t.input[0]:null,[D]):[!0,""],M=(y=D.getMonth()!==j)&&!L||!v[0]||A&&D<A||T&&T<D,U+="<div class='tm-ui-dp-main-cell "+(5<=(u+s+6)%7?" ui-tm-datepicker-week-end":"")+(y?" ui-tm-datepicker-other-month":"")+(D.getTime()===_.getTime()&&j===t.selectedMonth&&t._keyEvent||l.getTime()===D.getTime()&&l.getTime()===_.getTime()?" "+this._dayOverClass:"")+(M?" "+this._unselectableClass+" ui-state-disabled":"")+(y&&!c?"":" "+v[1]+(D.getTime()===q.getTime()?" "+this._currentClass:"")+(D.getTime()===J.getTime()?" ui-tm-datepicker-today":""))+"'"+(y&&!c||!v[2]?"":" title='"+v[2].replace(/'/g,"&#39;")+"'")+(M?"":" data-handler='selectDay' data-event='click' data-month='"+D.getMonth()+"' data-year='"+D.getFullYear()+"'")+"><div class='tm-ui-dp-main-cell-inner'><div class='tm-ui-dp-main-cell-content'>"+(y&&!c?"&#xa0;":M?"<span class='ui-state-default'>"+D.getDate()+"</span>":"<a class='ui-state-default"+(D.getTime()===J.getTime()?" ui-state-highlight":"")+(D.getTime()===q.getTime()?" ui-state-active":"")+(y?" ui-priority-secondary":"")+"' href='#'>"+D.getDate()+"</a>")+"</div></div></div>",D.setDate(D.getDate()+1),D=this._daylightSavingAdjust(D);f+=U+"</div>"}11<(j+=1)&&(j=0,K+=1),p+=f=(f+="</div>")+("</div>"+(V?"</div>"+(0<F[0]&&m===F[1]-1?"<div class='ui-tm-datepicker-row-break'></div>":""):""))}o+=p}return o=(o+="</div></div></div></div></div>")+I+"</div></div></div>",t._keyEvent=!1,o},_generateMonthYearHeader:function(t,e,a,i,s,n,r,d){var c,l,o,u,h,p,m,_=this._get(t,"changeMonth"),g=this._get(t,"changeYear"),f=this._get(t,"showMonthAfterYear"),k="<div class='ui-tm-datepicker-title'>",D="";if(n||!_)D+="<span class='ui-tm-datepicker-month'>"+r[e]+"</span>";else{for(c=i&&i.getFullYear()===a,l=s&&s.getFullYear()===a,D+="<select class='ui-tm-datepicker-month' data-handler='selectMonth' data-event='change'>",o=0;o<12;o+=1)(!c||o>=i.getMonth())&&(!l||o<=s.getMonth())&&(D+="<option value='"+o+"'"+(o===e?" selected='selected'":"")+">"+d[o]+"</option>");D+="</select>"}if(f||(k+=D+(!n&&_&&g?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",n||!g)k+="<span class='ui-tm-datepicker-year'>"+a+"</span>";else{for(r=this._get(t,"yearRange").split(":"),u=(new Date).getFullYear(),p=(h=function(t){t=t.match(/c[+-].*/)?a+parseInt(t.substring(1),10):t.match(/[+-].*/)?u+parseInt(t,10):parseInt(t,10);return isNaN(t)?u:t})(r[0]),m=Math.max(p,h(r[1]||"")),p=i?Math.max(p,i.getFullYear()):p,m=s?Math.min(m,s.getFullYear()):m,t.yearshtml+="<select class='ui-tm-datepicker-year' data-handler='selectYear' data-event='change'>";p<=m;p+=1)t.yearshtml+="<option value='"+p+"'"+(p===a?" selected='selected'":"")+">"+p+"</option>";t.yearshtml+="</select>",k+=t.yearshtml,t.yearshtml=null}return k+=this._get(t,"yearSuffix"),f&&(k+=(!n&&_&&g?"":"&#xa0;")+D),k+="</div>"},_adjustInstDate:function(t,e,a){var i=t.selectedYear+("Y"===a?e:0),s=t.selectedMonth+("M"===a?e:0),e=Math.min(t.selectedDay,this._getDaysInMonth(i,s))+("D"===a?e:0),i=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(i,s,e)));t.selectedDay=i.getDate(),t.selectedMonth=i.getMonth(),t.drawMonth=t.selectedMonth,t.selectedYear=i.getFullYear(),t.drawYear=t.selectedYear,"M"!==a&&"Y"!==a||this._notifyChange(t)},_restrictMinMax:function(t,e){var a=this._getMinMaxDate(t,"min"),t=this._getMinMaxDate(t,"max"),a=a&&e<a?a:e;return t&&t<a?t:a},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){t=this._get(t,"numberOfMonths");return null===t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,a,i){var s=this._getNumberOfMonths(t),a=this._daylightSavingAdjust(new Date(a,i+(e<0?e:s[0]*s[1]),1));return e<0&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(t,a)},_isInRange:function(t,e){var a,i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=null,r=null,t=this._get(t,"yearRange");return t&&(t=t.split(":"),a=(new Date).getFullYear(),n=parseInt(t[0],10),r=parseInt(t[1],10),t[0].match(/[+-].*/)&&(n+=a),t[1].match(/[+-].*/))&&(r+=a),(!i||e.getTime()>=i.getTime())&&(!s||e.getTime()<=s.getTime())&&(!n||e.getFullYear()>=n)&&(!r||e.getFullYear()<=r)},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return{shortYearCutoff:"string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,a,i){return e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear),i=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(i,a,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay)),this.formatDate(this._get(t,"dateFormat"),i,this._getFormatConfig(t))}}),M.fn.tm_datepicker=function(t){var e;return this.length?(M.tm_datepicker.initialized||(M(document).on("mousedown",M.tm_datepicker._checkExternalClick),M.tm_datepicker.initialized=!0),0===M("#"+M.tm_datepicker._mainDivId).length&&M("body").append(M.tm_datepicker.dpDiv),e=Array.prototype.slice.call(arguments,1),"string"==typeof t&&("isDisabled"===t||"getDate"===t||"widget"===t)||"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?M.tm_datepicker["_"+t+"Datepicker"].apply(M.tm_datepicker,[this[0]].concat(e)):this.each(function(){"string"==typeof t?M.tm_datepicker["_"+t+"Datepicker"].apply(M.tm_datepicker,[this].concat(e)):M.tm_datepicker._attachDatepicker(this,t)})):this},M.tm_datepicker=new t,M.tm_datepicker.initialized=!1,M.tm_datepicker.uuid=(new Date).getTime(),M.tm_datepicker.version="1.11.4")});assets/js/jquery.tctooltip.js000064400000033565150755142450012403 0ustar00/**
 * jquery.tctooltip.js
 *
 * @param {Window} window - The window object representing the browser window.
 * @param {jQuery} $      - The jQuery object.
 * @version: v1.1
 * @author: themeComplete
 *
 * Created by themeComplete
 *
 * Copyright (c) 2021 themeComplete http://themecomplete.com
 */
( function( window, $ ) {
	'use strict';

	var ToolTip = function( dom, options ) {
		this.targets = $( dom );

		this.settings = $.extend( {}, $.fn.tcToolTip.defaults, options );

		if ( this.targets.length > 0 ) {
			this.init();
			return this;
		}

		return false;
	};

	var TMEPOJS;

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || { tm_epo_global_tooltip_max_width: '340px' };
	} );

	ToolTip.prototype = {
		constructor: ToolTip,

		removeTooltip: function( target, tooltip ) {
			var settings = this.settings;

			if ( target.data( 'is_moving' ) ) {
				return;
			}

			tooltip.removeClass( settings.fadin ).addClass( settings.fadeout );

			tooltip.animate(
				{
					opacity: 0
				},
				settings.speed,
				function() {
					$( this ).remove();
				}
			);

			if ( target.data( 'tmtip-title' ) && target.data( 'tm-tip-html' ) === undefined && ! target.attr( 'data-tm-tooltip-html' ) ) {
				target.attr( 'title', target.data( 'tmtip-title' ) );
			}

			$( window ).off( 'scroll.tcToolTip resize.tcToolTip' );

			if ( settings.onetime ) {
				this.destroy();
			}
		},

		initTooltip: function( target, tooltip, nofx ) {
			var settings = this.settings;
			var tip;
			var scroll;
			var pos_left;
			var pos_top;
			var pos_from_top;
			var original_pos_left;

			if ( target && tooltip && target.length === 1 && tooltip.length === 1 && target.data( 'tm-has-tm-tip' ) === 1 ) {
				if ( nofx === 1 ) {
					if ( target.data( 'tm-tip-html' ) !== undefined ) {
						tip = target.data( 'tm-tip-html' );
					} else if ( target.attr( 'data-tm-tooltip-html' ) ) {
						tip = target.attr( 'data-tm-tooltip-html' );
					} else {
						tip = target.attr( 'title' );
					}

					tooltip.html( tip );
					target.data( 'is_moving', true );
				}

				tooltip.find( 'aside' ).hide();

				if ( TMEPOJS.tm_epo_global_tooltip_max_width === '' ) {
					// 50: average scrollbar width. Needed to avoid flickering width issues on mobile.
					if ( $( window ).width() <= tooltip.outerWidth() * 1.2 ) {
						tooltip.css( 'max-width', ( $( window ).width() / 1.2 ) + 'px' );
					} else {
						tooltip.css( 'max-width', '340px' );
					}
				} else {
					if ( TMEPOJS.tm_epo_global_tooltip_max_width.isNumeric() ) {
						TMEPOJS.tm_epo_global_tooltip_max_width = TMEPOJS.tm_epo_global_tooltip_max_width + 'px';
					}
					tooltip.css( 'max-width', TMEPOJS.tm_epo_global_tooltip_max_width );
				}

				tooltip.find( 'aside' ).show();

				tooltip.css( {
					left: '',
					right: '',
					top: ''
				} );

				scroll = $.epoAPI.dom.scroll();
				pos_left = target.offset().left + ( target.outerWidth() / 2 ) - ( tooltip.outerWidth() / 2 );
				original_pos_left = pos_left;

				if ( pos_left < 0 ) {
					pos_left = target.offset().left + ( target.outerWidth() / 2 ) - 20;
					tooltip.addClass( 'left' );
				} else {
					tooltip.removeClass( 'left' );
				}
				if ( original_pos_left >= 0 && pos_left + tooltip.outerWidth() > $( window ).width() ) {
					pos_left = target.offset().left - tooltip.outerWidth() + ( target.outerWidth() / 2 ) + 20;
					if ( pos_left < 0 ) {
						pos_left = pos_left - 10;
						tooltip.css( 'max-width', 'calc(' + tooltip.css( 'max-width' ) + ' - ' + Math.abs( pos_left ) + 'px)' );
						pos_left = 10;
					}
					tooltip.addClass( 'right' );
				} else {
					tooltip.removeClass( 'right' );
				}

				tooltip.css( {
					left: pos_left,
					right: 'auto',
					top: pos_top
				} );
				pos_top = target.offset().top - tooltip.outerHeight() - 10;
				pos_from_top = target.offset().top - scroll.top - tooltip.outerHeight() - 10;

				if ( pos_top < 0 || pos_from_top < 0 ) {
					pos_top = target.offset().top + target.outerHeight() + 10;
					tooltip.addClass( 'top' );
					tooltip.removeClass( 'bottom' );
				} else {
					tooltip.removeClass( 'top' );
					tooltip.addClass( 'bottom' );
				}

				$( window ).trigger( 'tm_tooltip_show' );

				if ( nofx ) {
					tooltip.css( {
						left: pos_left,
						top: pos_top
					} );
					target.data( 'is_moving', false );
				} else {
					tooltip
						.css( {
							left: pos_left,
							top: pos_top
						} )
						.removeClass( settings.fadeout )
						.addClass( settings.fadin );
				}
			}
		},

		show: function( target ) {
			var tooltip;
			var tip;
			var img;
			var settings = this.settings;

			if ( target.data( 'is_moving' ) ) {
				return;
			}

			if ( target.data( 'tm-has-tm-tip' ) === 1 ) {
				if ( target.data( 'tm-tip-html' ) !== undefined ) {
					tip = target.data( 'tm-tip-html' );
					if ( target.attr( 'title' ) ) {
						target.data( 'tmtip-title', target.attr( 'title' ) );
					}
					target.removeAttr( 'title' );
				} else if ( target.attr( 'data-tm-tooltip-html' ) ) {
					tip = target.attr( 'data-tm-tooltip-html' );
					if ( target.attr( 'title' ) ) {
						target.data( 'tmtip-title', target.attr( 'title' ) );
					}
					target.removeAttr( 'title' );
				} else {
					tip = target.attr( 'title' );
				}

				if ( tip !== undefined ) {
					$( '#tm-tooltip' ).remove();
					if ( ! settings.tipclass ) {
						settings.tipclass = '';
					} else {
						settings.tipclass = ' ' + settings.tipclass;
					}
					tooltip = $( '<div id="tm-tooltip" class="tm-tip tm-animated' + settings.tipclass + '"></div>' );
					tooltip.css( 'opacity', 0 ).html( tip ).appendTo( 'body' );

					img = tooltip.find( 'img' );
					if ( img.length > 0 ) {
						img.on( 'load', this.initTooltip.bind( this, target, tooltip ) );
					}

					this.initTooltip( target, tooltip );

					$( window ).on( 'scroll.tcToolTip resize.tcToolTip', this.initTooltip.bind( this, target, tooltip ) );

					target.data( 'is_moving', false );

					target.on( 'tmmovetooltip', this.initTooltip.bind( this, target, tooltip, 1 ) );
					target.on( 'mouseleave.tc tmhidetooltip', this.removeTooltip.bind( this, target, tooltip ) );

					target.closest( 'label' ).on( 'mouseleave.tc tmhidetooltip', this.removeTooltip.bind( this, target, tooltip ) );

					tooltip.on( 'click', this.removeTooltip.bind( this, target, tooltip ) );
				}
			}

			return false;
		},

		destroy: function() {
			if ( this.targets.length > 0 ) {
				this.targets.toArray().forEach( function( element ) {
					var target = $( element );
					target.closest( 'off' ).on( 'mouseleave.tc tmhidetooltip' );
					target.off( 'tc-tooltip-html-changed tmmovetooltip tmhidetooltip mouseenter.tc mouseleave.tc tmshowtooltip.tc' );
					target.removeData( 'tmtip-title' );
					target.removeData( 'tm-tip-html' );
				} );
				this.targets.removeData( 'tctooltip tm-has-tm-tip is_moving' );
			}
		},

		init: function() {
			var that = this;
			var settings = this.settings;

			if ( this.targets.length > 0 ) {
				this.targets.toArray().forEach( function( element ) {
					var target;
					var is_swatch;
					var is_swatch_desc;
					var is_swatch_lbl_desc;
					var is_swatch_img;
					var is_swatch_img_lbl;
					var is_swatch_img_desc;
					var is_swatch_img_lbl_desc;
					var tip;
					var label;
					var desc;
					var descHTML;
					var get_img_src;
					var findlabel;
					var is_hide_label;
					var findlabelText;

					target = $( element );
					tip = settings.tip || undefined;

					if ( target.data( 'tm-has-tm-tip' ) === undefined ) {
						is_swatch = target.attr( 'data-tm-tooltip-swatch' );
						is_swatch_desc = target.attr( 'data-tm-tooltip-swatch-desc' );
						is_swatch_lbl_desc = target.attr( 'data-tm-tooltip-swatch-lbl-desc' );
						is_swatch_img = target.attr( 'data-tm-tooltip-swatch-img' );
						is_swatch_img_lbl = target.attr( 'data-tm-tooltip-swatch-img-lbl' );
						is_swatch_img_desc = target.attr( 'data-tm-tooltip-swatch-img-desc' );
						is_swatch_img_lbl_desc = target.attr( 'data-tm-tooltip-swatch-img-lbl-desc' );

						target.data( 'tm-has-tm-tip', 1 );

						if ( target.attr( 'data-original' ) !== undefined ) {
							get_img_src = target.attr( 'data-original' );
						} else if ( target.attr( 'src' ) !== undefined ) {
							if ( target.attr( 'data-src' ) !== undefined ) {
								get_img_src = target.attr( 'data-src' );
							} else {
								get_img_src = target.attr( 'src' );
							}
						} else {
							get_img_src = target[ 0 ].src;
						}

						label = target.closest( '.tmcp-field-wrap' );
						if ( label.is( '.tc-epo-element-product-holder' ) ) {
							label = target.closest( '.cpf-element' );
						}
						if ( label.length === 0 ) {
							label = target.closest( '.cpf-element' );
						}
						// If the target is inside a product element and there is a closest section
						if ( label.is( '.cpf-type-product' ) && target.closest( '.tm-epo-element-label' ).length === 0 && target.closest( '.cpf-section' ).length ) {
							label = target.closest( '.cpf-section' ).find( '.tc-section-inner-wrap .tm-section-description.tm-description' );
						}
						if ( label.length === 0 ) {
							label = target.closest( '.cpf-section' ).find( '.tc-section-inner-wrap .tm-section-description.tm-description' );
						}
						findlabel = label.find( '.tm-tip-html' );
						if ( findlabel.length === 0 ) {
							findlabel = label.find( '.checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline' );
						}

						if ( findlabel.length === 0 ) {
							findlabel = label.next( '.checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline,.tm-tip-html' );
						}
						if ( findlabel.length === 0 && label.is( '.tm-description' ) ) {
							findlabel = label;
						}
						label = findlabel;

						findlabel = $( label );
						findlabelText = findlabel.find( '.tc-label-text' );
						if ( ! findlabelText.length ) {
							findlabelText = findlabel;
						}

						is_hide_label = target.attr( 'data-tm-hide-label' ) === 'yes' || target.attr( 'data-tm-hide-label' ) === undefined || findlabel.is( '.tm-tip-html' );

						descHTML = '';
						desc = target.closest( '.tmcp-field-wrap' );
						desc = desc.find( '[data-tm-tooltip-html]' );
						if ( desc.length === 0 ) {
							desc = target.closest( '.tmcp-field-wrap' ).find( '.tc-inline-description' );
							if ( desc.length > 0 ) {
								descHTML = desc.html();
							}
						} else {
							descHTML = desc.attr( 'data-tm-tooltip-html' );
						}

						if ( tip === undefined ) {
							if ( is_swatch ) {
								tip = findlabelText.html();
							} else if ( is_swatch_desc && descHTML !== '' ) {
								tip = '<aside>' + descHTML + '</aside>';
							} else if ( is_swatch_lbl_desc && ( findlabelText.html() !== '' || descHTML !== '' ) ) {
								tip = '<aside>' + findlabelText.html() + '</aside><aside>' + descHTML + '</aside>';
							} else if ( is_swatch_img && get_img_src !== '' ) {
								tip = '<img src="' + get_img_src + '">';
							} else if ( is_swatch_img_lbl && ( findlabelText.html() !== '' || get_img_src !== '' ) ) {
								tip = '<img src="' + get_img_src + '"><aside>' + findlabelText.html() + '</aside>';
							} else if ( is_swatch_img_desc && ( get_img_src !== '' || descHTML !== '' ) ) {
								tip = '<img src="' + get_img_src + '"><aside>' + descHTML + '</aside>';
							} else if ( is_swatch_img_lbl_desc && ( findlabelText.html() !== '' || get_img_src !== '' || descHTML !== '' ) ) {
								tip = '<img src="' + get_img_src + '"><aside>' + findlabelText.html() + '</aside><aside>' + descHTML + '</aside>';
							}

							if ( tip !== undefined ) {
								target.data( 'tm-tip-html', tip );
								if ( is_hide_label ) {
									findlabel.find( '.tm-tooltip' ).remove();
									findlabelText.hide();
								}
							}
							if ( tip === undefined ) {
								// The following two methods are here for dynamic tooltip support
								if ( target.attr( 'data-tm-tooltip-html' ) ) {
									tip = target.attr( 'data-tm-tooltip-html' );
								} else {
									tip = target.attr( 'title' );
								}
							}
						} else {
							target.data( 'tm-tip-html', tip );
						}

						target.on( 'tc-tooltip-html-changed', function() {
							if ( target.attr( 'data-tm-tooltip-html' ) ) {
								target.show();
							} else {
								target.hide();
							}
						} );

						if ( target.is( 'img' ) ) {
							target.closest( 'label' ).on( 'mouseenter tmshowtooltip', that.show.bind( that, target ) );
						}
						target.on( 'mouseenter.tc tmshowtooltip.tc', that.show.bind( that, target ) );

						if ( settings.trigger ) {
							that.show( target );
						}
					}
				} );
			}
		}
	};

	$.fn.tcToolTip = function( option ) {
		var methodReturn;
		var targets = $( this );
		var data;
		var options;
		var ret;
		var hasAtLeastOneNonToolTip = targets
			.map( function() {
				return $( this ).data( 'tctooltip' ) || '';
			} )
			.get()
			.some( function( value ) {
				return value === '';
			} );

		if ( typeof option === 'object' ) {
			options = option;
		} else {
			options = {};
		}

		if ( hasAtLeastOneNonToolTip ) {
			data = new ToolTip( this, options );
			targets.data( 'tctooltip', data );
		}

		if ( typeof option === 'string' ) {
			data = targets.data( 'tctooltip' );
			methodReturn = data[ option ].apply( data, [] );
		}

		if ( methodReturn === undefined ) {
			ret = targets;
		} else {
			ret = methodReturn;
		}

		return ret;
	};

	$.fn.tcToolTip.defaults = {
		fadin: 'fadein',
		fadeout: 'fadeout',
		speed: 1500
	};

	$.fn.tcToolTip.instances = [];

	$.fn.tcToolTip.Constructor = ToolTip;

	$.tcToolTip = function( targets, options ) {
		var data = false;
		var hasAtLeastOneNonToolTip;

		targets = targets || $( '.tm-tooltip' );
		hasAtLeastOneNonToolTip = targets
			.map( function() {
				return $( this ).data( 'tctooltip' ) || '';
			} )
			.get()
			.some( function( value ) {
				return value === '';
			} );
		if ( hasAtLeastOneNonToolTip ) {
			data = new ToolTip( targets, options );
			targets.data( 'tctooltip', data );
		}

		return data;
	};
}( window, window.jQuery ) );
assets/js/jquery.validate.min.js000064400000056663150755142450012741 0ustar00!function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):"object"==typeof window.module&&window.module.exports?window.module.exports=t(window.require("jquery")):t(window.jQuery)}(function(d){"use strict";var i,e,n={};return d.extend(d.fn,{tc_validate:function(t){var s;if(this.length)return(s=d.data(this[0],"tc_validator"))||(this.attr("novalidate","novalidate"),s=new d.tc_validator(t,this[0]),d.data(this[0],"tc_validator",s),s.settings.onsubmit&&(this.on("click.tc_validate",":submit",function(t){s.submitButton=t.currentTarget,d(this).hasClass("cancel")&&(s.cancelSubmit=!0),void 0!==d(this).attr("formnovalidate")&&(s.cancelSubmit=!0)}),this.on("submit.tc_validate",function(i){function t(){var t,e;return s.submitButton&&(s.settings.submitHandler||s.formSubmitted)&&(t=d("<input type='hidden'>").attr("name",s.submitButton.name).val(d(s.submitButton).val()).appendTo(s.currentForm)),!(s.settings.submitHandler&&!s.settings.debug)||(e=s.settings.submitHandler.call(s,s.currentForm,i),t&&t.remove(),void 0!==e&&e)}return s.settings.debug&&i.preventDefault(),s.cancelSubmit?(s.cancelSubmit=!1,t()):s.form()?s.pendingRequest?!(s.formSubmitted=!0):t():(s.focusInvalid(),!1)}))),s},tc_valid:function(){var t,e,i;return d(this[0]).is("form")?t=this.tc_validate().form():(i=[],t=!0,e=d(this[0].form).tc_validate(),this.each(function(){(t=e.element(this)&&t)||(i=i.concat(e.errorList))}),e.errorList=i),t},tc_rules:function(t,e){var i,s,n,r,a,o=this[0],l=void 0!==this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!==o&&(!o.form&&l&&(o.form=this.closest("form")[0],o.name=this.attr("name")),null!==o.form)){if(t)switch(s=(i=d.data(o.form,"tc_validator").settings).rules,n=d.tc_validator.staticRules(o),t){case"add":d.extend(n,d.tc_validator.normalizeRule(e)),delete n.messages,s[o.name]=n,e.messages&&(i.messages[o.name]=d.extend(i.messages[o.name],e.messages));break;case"remove":return e?(a={},d.each(e.split(/\s/),function(t,e){a[e]=n[e],delete n[e]}),a):(delete s[o.name],n)}return(l=d.tc_validator.normalizeRules(d.extend({},d.tc_validator.classRules(o),d.tc_validator.attributeRules(o),d.tc_validator.dataRules(o),d.tc_validator.staticRules(o)),o)).required&&(r=l.required,delete l.required,l=d.extend({required:r},l)),l.remote&&(r=l.remote,delete l.remote,l=d.extend(l,{remote:r})),l}}}),e=function(t){return t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},d.extend(d.expr.pseudos||d.expr[":"],{blank:function(t){return!e(""+d(t).val())},filled:function(t){t=d(t).val();return null!==t&&!!e(""+t)},unchecked:function(t){return!d(t).prop("checked")}}),d.tc_validator=function(t,e){this.settings=d.extend(!0,{},d.tc_validator.defaults,t),this.currentForm=e,this.init()},d.tc_validator.format=function(i,t){return 1===arguments.length?function(){var t=d.makeArray(arguments);return t.unshift(i),d.tc_validator.format.apply(this,t)}:(void 0!==t&&((t=2<arguments.length&&t.constructor!==Array?d.makeArray(arguments).slice(1):t).constructor!==Array&&(t=[t]),d.each(t,function(t,e){i=i.replace(new RegExp("\\{"+t+"\\}","g"),function(){return e})})),i)},d.extend(d.tc_validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:d([]),errorLabelContainer:d([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(t){this.lastActive=t,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,t,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(t)))},onfocusout:function(t){this.checkable(t)||!(t.name in this.submitted)&&this.optional(t)||this.element(t)},onkeyup:function(t,e){9===e.which&&""===this.elementValue(t)||-1!==d.inArray(e.keyCode,[16,17,18,20,35,36,37,38,39,40,45,144,225])||(t.name in this.submitted||t.name in this.invalid)&&this.element(t)},onclick:function(t){t.name in this.submitted?this.element(t):t.parentNode.name in this.submitted&&this.element(t.parentNode)},highlight:function(t,e,i){("radio"===t.type?this.findByName(t.name):d(t)).addClass(e).removeClass(i)},unhighlight:function(t,e,i){("radio"===t.type?this.findByName(t.name):d(t)).removeClass(e).addClass(i)}},setDefaults:function(t){d.extend(d.tc_validator.defaults,t)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:d.tc_validator.format("Please enter no more than {0} characters."),maxlengthsingle:d.tc_validator.format("Please enter no more than {0} character."),minlength:d.tc_validator.format("Please enter at least {0} characters."),minlengthsingle:d.tc_validator.format("Please enter at least {0} character."),rangelength:d.tc_validator.format("Please enter a value between {0} and {1} characters long."),range:d.tc_validator.format("Please enter a value between {0} and {1}."),max:d.tc_validator.format("Please enter a value less than or equal to {0}."),min:d.tc_validator.format("Please enter a value greater than or equal to {0}."),step:d.tc_validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){var i,n=this.currentForm;function t(t){var e,i,s=void 0!==d(t.data.that).attr("contenteditable")&&"false"!==d(t.data.that).attr("contenteditable");!t.data.that.form&&s&&(t.data.that.form=d(t.data.that).closest("form")[0],t.data.that.name=d(t.data.that).attr("name")),n===t.data.that.form&&(s=d.data(t.data.that.form,"tc_validator"),e="on"+t.type.replace(/^validate/,""),(i=s.settings)[e])&&!d(t.data.that).is(i.ignore)&&i[e].call(s,t.data.that,t)}this.labelContainer=d(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||d(this.currentForm),this.containers=d(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset(),this.groups={},d.each(this.settings.groups,function(t,e){"string"==typeof e&&(e=e.split(/\s/)),d.each(e,function(t,e){e,0})}),i=this.settings.rules,d.each(i,function(t,e){i[t]=d.tc_validator.normalizeRule(e)}),d(this.currentForm).on("focusin.tc_validate focusout.tc_validate keyup.tc_validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",{that:this},t).on("click.tc_validate","select, option, [type='radio'], [type='checkbox']",{that:this},t),this.settings.invalidHandler&&d(this.currentForm).on("invalid-form.tc_validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),d.extend(this.submitted,this.errorMap),this.invalid=d.extend({},this.errorMap),this.tc_valid()||d(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.tc_valid()},checkForm:function(){var t,e;for(this.prepareForm(),t=0,e=this.elements();e[t];t+=1)this.currentElements=e,this.check(e[t]);return this.tc_valid()},element:function(t){var e,i,s=this.clean(t),n=this.validationTargetFor(s),r=this,a=!0;return void 0===n?delete this.invalid[s.name]:(this.prepareElement(n),this.currentElements=d(n),(i=this.groups[n.name])&&d.each(this.groups,function(t,e){e===i&&t!==n.name&&(s=r.validationTargetFor(r.clean(r.findByName(t))))&&s.name in r.invalid&&(r.currentElements.push(s),a=r.check(s)&&a)}),e=!1!==this.check(n),a=a&&e,this.invalid[n.name]=!e,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),d(t).attr("aria-invalid",!e)),a},showErrors:function(e){var i;e&&(d.extend((i=this).errorMap,e),this.errorList=d.map(this.errorMap,function(t,e){return{message:t,element:i.findByName(e)[0]}}),this.successList=d.grep(this.successList,function(t){return!(t.name in e)})),this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){var t;d.fn.resetForm&&d(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors(),t=this.elements().removeData("previousValue").removeAttr("aria-invalid"),this.resetElements(t)},resetElements:function(t){var e;if(this.settings.unhighlight)for(e=0;t[e];e+=1)this.settings.unhighlight.call(this,t[e],this.settings.errorClass,""),this.findByName(t[e].name).removeClass(this.settings.validClass);else t.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(t){var e,i=0;for(e in t)void 0!==t[e]&&null!==t[e]&&!1!==t[e]&&(i+=1);return i},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(t){t.not(this.containers).text(""),this.addWrapper(t).hide()},tc_valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{d(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(t){}},findLastActive:function(){var e=this.lastActive;return e&&1===d.grep(this.errorList,function(t){return t.element.name===e.name}).length&&e},elements:function(){var e=this,i={};return d(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var t=this.name||d(this).attr("name");return void 0!==d(this).attr("contenteditable")&&"false"!==d(this).attr("contenteditable")&&(this.form=d(this).closest("form")[0],this.name=t),this.form===e.currentForm&&!(t in i||!e.objectLength(d(this).tc_rules()))&&(i[t]=!0)})},clean:function(t){return d(t)[0]},errors:function(){var t=this.settings.errorClass.split(" ").join(".");return d(this.settings.errorElement+"."+t,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=d([]),this.toHide=d([])},reset:function(){this.resetInternals(),this.currentElements=d([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(t){this.reset(),this.toHide=this.errorsFor(t)},elementValue:function(t){var e=d(t),i=t.type,s=void 0!==e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===i||"checkbox"===i?this.findByName(t.name).filter(":checked").val():"number"===i&&void 0!==t.validity?t.validity.badInput?"NaN":e.val():(t=s?e.text():e.val(),"file"===i?"C:\\fakepath\\"===t.substring(0,12)?t.substring(12):0<=(s=t.lastIndexOf("/"))||0<=(s=t.lastIndexOf("\\"))?t.substring(s+1):t:"string"==typeof t?t.replace(/\r/g,""):t)},check:function(e){var t,i,s,n,r,a,o,l;for(a in e=this.validationTargetFor(this.clean(e)),t=d(e).tc_rules(),i=d.map(t,function(t,e){return e}).length,s=!1,n=this.elementValue(e),"function"==typeof t.normalizer?l=t.normalizer:"function"==typeof this.settings.normalizer&&(l=this.settings.normalizer),l&&(n=l.call(e,n),delete t.normalizer),t)if(a){o={method:a,parameters:t[a]};try{if("dependency-mismatch"===(r=d.tc_validator.methods[a].call(this,n,e,o.parameters))&&1===i)s=!0;else{if(s=!1,"pending"===r)return void(this.toHide=this.toHide.not(this.errorsFor(e)));if(!r)return this.formatAndAdd(e,o),!1}}catch(t){throw t instanceof TypeError&&(t.message+=".  Exception occurred when checking element "+e.id+", check the '"+o.method+"' method."),t}}if(!s)return this.objectLength(t)&&this.successList.push(e),!0},customDataMessage:function(t,e){return d(t).data("msg"+e.charAt(0).toUpperCase()+e.substring(1).toLowerCase())||d(t).data("msg")},customMessage:function(t,e){t=this.settings.messages[t];return t&&(t.constructor===String?t:t[e])},findDefined:function(){for(var t=0;t<arguments.length;t+=1)if(void 0!==arguments[t])return arguments[t]},defaultMessage:function(t,e){var i,s="";return"minlength"!==(e="string"==typeof e?{method:e}:e).method&&"maxlength"!==e.method||1!==e.parameters&&"1"!==e.parameters||(s="single"),i=/\$?\{(\d+)\}/g,"function"==typeof(s=this.findDefined(this.customMessage(t.name,e.method+s),this.customDataMessage(t,e.method+s),!this.settings.ignoreTitle&&t.title||void 0,d.tc_validator.messages[e.method+s],"<strong>Warning: No message defined for "+t.name+"</strong>"))?s=s.call(this,e.parameters,t):i.test(s)&&(s=d.tc_validator.format(s.replace(i,"{$1}"),e.parameters)),s},formatAndAdd:function(t,e){var i=this.defaultMessage(t,e);this.errorList.push({message:i,element:t,method:e.method}),this.errorMap[t.name]=i,this.submitted[t.name]=i},addWrapper:function(t){return t=this.settings.wrapper?t.add(t.parent(this.settings.wrapper)):t},defaultShowErrors:function(){for(var t,e,i=0;this.errorList[i];i+=1)e=this.errorList[i],this.settings.highlight&&this.settings.highlight.call(this,e.element,this.settings.errorClass,this.settings.validClass),this.showLabel(e.element,e.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(i=0;this.successList[i];i+=1)this.showLabel(this.successList[i]);if(this.settings.unhighlight)for(i=0,t=this.validElements();t[i];i+=1)this.settings.unhighlight.call(this,t[i],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return d(this.errorList).map(function(){return this.element})},showLabel:function(t,e){var i,s,n,r=this.errorsFor(t),a=this.idOrName(t),o=d(t).attr("aria-describedby");r.length?(r.removeClass(this.settings.validClass).addClass(this.settings.errorClass),r.html(e)):(s=r=d("<"+this.settings.errorElement+">").attr("id",a+"-error").addClass(this.settings.errorClass).html(e||""),this.settings.wrapper&&(s=r.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(s):this.settings.errorPlacement?this.settings.errorPlacement.call(this,s,d(t)):s.insertAfter(t),r.is("label")?r.attr("for",a):0===r.parents("label[for='"+this.escapeCssMeta(a)+"']").length&&(s=r.attr("id"),o?o.match(new RegExp("\\b"+this.escapeCssMeta(s)+"\\b"))||(o+=" "+s):o=s,d(t).attr("aria-describedby",o),i=this.groups[t.name])&&d.each((n=this).groups,function(t,e){e===i&&d("[name='"+n.escapeCssMeta(t)+"']",n.currentForm).attr("aria-describedby",r.attr("id"))})),!e&&this.settings.success&&(r.text(""),"string"==typeof this.settings.success?r.addClass(this.settings.success):this.settings.success(r,t)),this.toShow=this.toShow.add(r)},errorsFor:function(t){var e=this.escapeCssMeta(this.idOrName(t)),t=d(t).attr("aria-describedby"),e="label[for='"+e+"'], label[for='"+e+"'] *";return t&&(e=e+", #"+this.escapeCssMeta(t).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(t){return t.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]\^`{|}~])/g,"\\$1")},idOrName:function(t){return this.groups[t.name]||!this.checkable(t)&&t.id||t.name},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name)),d(t).not(this.settings.ignore)[0]},checkable:function(t){return/radio|checkbox/i.test(t.type)},findByName:function(t){return d(this.currentForm).find("[name='"+this.escapeCssMeta(t)+"']")},getLength:function(t,e){switch(e.nodeName.toLowerCase()){case"select":return d("option:selected",e).length;case"input":if(this.checkable(e))return this.findByName(e.name).filter(":checked").length}return t.length},depend:function(t,e){return!this.dependTypes[typeof t]||this.dependTypes[typeof t](t,e)},dependTypes:{boolean:function(t){return t},string:function(t,e){return!!d(t,e.form).length},function:function(t,e){return t(e)}},optional:function(t){var e=this.elementValue(t);return!d.tc_validator.methods.required.call(this,e,t)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest+=1,d(t).addClass(this.settings.pendingClass),this.pending[t.name]=!0)},stopRequest:function(t,e){--this.pendingRequest,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[t.name],d(t).removeClass(this.settings.pendingClass),e&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(d(this.currentForm).trigger("submit"),this.submitButton&&d("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!e&&0===this.pendingRequest&&this.formSubmitted&&(d(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(t,e){return e="string"==typeof e&&e||"remote",d.data(t,"previousValue")||d.data(t,"previousValue",{old:null,valid:!0,message:this.defaultMessage(t,{method:e})})},destroy:function(){this.resetForm(),d(this.currentForm).off(".tc_validate").removeData("tc_validator").find(".tc_validate-equalTo-blur").off(".tc_validate-equalTo").removeClass("validate-equalTo-blur").find(".tc_validate-lessThan-blur").off(".tc_validate-lessThan").removeClass("validate-lessThan-blur").find(".tc_validate-lessThanEqual-blur").off(".tc_validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".tc_validate-greaterThanEqual-blur").off(".tc_validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".tc_validate-greaterThan-blur").off(".tc_validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(t,e){t.constructor===String?this.classRuleSettings[t]=e:d.extend(this.classRuleSettings,t)},classRules:function(t){var e={},t=d(t).attr("class");return t&&d.each(t.split(" "),function(){this in d.tc_validator.classRuleSettings&&d.extend(e,d.tc_validator.classRuleSettings[this])}),e},normalizeAttributeRule:function(t,e,i,s){(s=/min|max|step/.test(i)&&(null===e||/number|range|text/.test(e))&&(s=Number(s),isNaN(s))?void 0:s)||0===s?t[i]=s:e===i&&"range"!==e&&(t[i]=!0)},attributeRules:function(t){var e,i,s={},n=d(t),r=t.getAttribute("type");for(e in d.tc_validator.methods)e&&(i="required"===e?!!(i=""===(i=t.getAttribute(e))?!0:i):n.attr(e),this.normalizeAttributeRule(s,r,e,i));return s.maxlength&&/-1|2147483647|524288/.test(s.maxlength)&&delete s.maxlength,s},dataRules:function(t){var e,i,s={},n=d(t),r=t.getAttribute("type");for(e in d.tc_validator.methods)e&&(""===(i=n.data("rule"+e.charAt(0).toUpperCase()+e.substring(1).toLowerCase()))&&(i=!0),this.normalizeAttributeRule(s,r,e,i));return s},staticRules:function(t){var e={},i=d.data(t.form,"tc_validator");return e=i.settings.rules?d.tc_validator.normalizeRule(i.settings.rules[t.name])||{}:e},normalizeRules:function(i,s){var n;return d.each(i,function(t,e){if(!1===e)delete i[t];else if(e.param||e.depends){switch(n=!0,typeof e.depends){case"string":n=!!d(e.depends,s.form).length;break;case"function":n=e.depends.call(s,s)}n?i[t]=void 0===e.param||e.param:(d.data(s.form,"tc_validator").resetElements(d(s)),delete i[t])}}),d.each(i,function(t,e){i[t]="function"==typeof e&&"normalizer"!==t?e(s):e}),d.each(["minlength","maxlength"],function(){i[this]&&(i[this]=Number(i[this]))}),d.each(["rangelength","range"],function(){var t;i[this]&&(Array.isArray(i[this])?i[this]=[Number(i[this][0]),Number(i[this][1])]:"string"==typeof i[this]&&(t=i[this].replace(/[[\]]/g,"").split(/[\s,]+/),i[this]=[Number(t[0]),Number(t[1])]))}),d.tc_validator.autoCreateRanges&&(null!==i.min&&null!==i.max&&(i.range=[i.min,i.max],delete i.min,delete i.max),null!==i.minlength)&&null!==i.maxlength&&(i.rangelength=[i.minlength,i.maxlength],delete i.minlength,delete i.maxlength),i},normalizeRule:function(t){var e;return"string"==typeof t&&(e={},d.each(t.split(/\s/),function(){e[this]=!0}),t=e),t},addMethod:function(t,e,i){d.tc_validator.methods[t]=e,d.tc_validator.messages[t]=void 0!==i?i:d.tc_validator.messages[t],e.length<3&&d.tc_validator.addClassRules(t,d.tc_validator.normalizeRule(t))},methods:{required:function(t,e,i){return this.depend(i,e)?"select"===e.nodeName.toLowerCase()?(i=d(e).val())&&0<i.length:this.checkable(e)?0<this.getLength(t,e):null!=t&&0<t.length:"dependency-mismatch"},email:function(t,e){return this.optional(e)||/^[a-zA-Z0-9.!#$%&'*+\/=?\^_`{|}~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$/.test(t)},url:function(t,e){return this.optional(e)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(t)},date:function(t,e){return this.optional(e)||!/Invalid|NaN/.test(new Date(t).toString())},dateISO:function(t,e){return this.optional(e)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(t)},number:function(t,e){return this.optional(e)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t)},digits:function(t,e){return this.optional(e)||/^\d+$/.test(t)},minlength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||i<=t},maxlength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||t<=i},rangelength:function(t,e,i){t=Array.isArray(t)?t.length:this.getLength(t,e);return this.optional(e)||t>=i[0]&&t<=i[1]},min:function(t,e,i){return this.optional(e)||i<=t},max:function(t,e,i){return this.optional(e)||t<=i},range:function(t,e,i){return this.optional(e)||t>=i[0]&&t<=i[1]},step:function(t,e,i){function s(t){return(t=(""+t).match(/(?:\.(\d+))?$/))&&t[1]?t[1].length:0}function n(t){return Math.round(t*Math.pow(10,r))}var r,a=d(e).attr("type"),o="Step attribute on input type "+a+" is not supported.",l=new RegExp("\\b"+a+"\\b"),h=!0;if(a&&!l.test(["text","number","range"].join()))throw new Error(o);return r=s(i),(s(t)>r||n(t)%n(i)!=0)&&(h=!1),this.optional(e)||h},equalTo:function(t,e,i){i=d(i);return this.settings.onfocusout&&i.not(".tc_validate-equalTo-blur").length&&i.addClass("validate-equalTo-blur").on("blur.tc_validate-equalTo",function(){d(e).tc_valid()}),t===i.val()},remote:function(s,n,t,r){var a,o,e;return this.optional(n)?"dependency-mismatch":(r="string"==typeof r&&r||"remote",a=this.previousValue(n,r),this.settings.messages[n.name]||(this.settings.messages[n.name]={}),a.originalMessage=a.originalMessage||this.settings.messages[n.name][r],this.settings.messages[n.name][r]=a.message,e=d.param(d.extend({data:s},(t="string"==typeof t?{url:t}:t).data)),a.old===e?a.valid:(a.old=e,(o=this).startRequest(n),(e={})[n.name]=s,d.ajax(d.extend(!0,{mode:"abort",port:"validate"+n.name,dataType:"json",data:e,context:o.currentForm,success:function(t){var e,i=!0===t||"true"===t;o.settings.messages[n.name][r]=a.originalMessage,i?(e=o.formSubmitted,o.resetInternals(),o.toHide=o.errorsFor(n),o.formSubmitted=e,o.successList.push(n),o.invalid[n.name]=!1,o.showErrors()):(e={},t=t||o.defaultMessage(n,{method:r,parameters:s}),a.message=t,e[n.name]=t,o.invalid[n.name]=!0,o.showErrors(e)),a.valid=i,o.stopRequest(n,i)}},t)),"pending"))}}}),d.ajaxPrefilter?d.ajaxPrefilter(function(t,e,i){var s=t.port;"abort"===t.mode&&(n[s]&&n[s].abort(),n[s]=i)}):(i=d.ajax,d.ajax=function(t){var e=("mode"in t?t:d.ajaxSettings).mode,t=("port"in t?t:d.ajaxSettings).port;return"abort"===e?(n[t]&&n[t].abort(),n[t]=i.apply(this,arguments),n[t]):i.apply(this,arguments)}),d});assets/js/admin/toastr.min.js000064400000011532150755142450012220 0ustar00!function(){"use strict";(typeof define==="function"&&define.amd?define:function(e,t){"use strict";if(typeof window.module!=="undefined"&&window.module.exports)window.module.exports=t(window.require("jquery"));else window.toastr=t(window.jQuery)})(["jquery"],function(w){return x=0,o="error",i="info",r="success",l="warning",e={clear:function(e,t){var s=C();if(D||T(s),!a(e,s,t))for(var n=s,o=D.children(),i=o.length-1;0<=i;--i)a(w(o[i]),n)},remove:function(e){var t=C();D||T(t),e&&0===w(":focus",e).length?O(e):D.children().length&&D.remove()},error:function(e,t,s){return n({type:o,iconClass:C().iconClasses.error,message:e,optionsOverride:s,title:t})},getContainer:T,info:function(e,t,s){return n({type:i,iconClass:C().iconClasses.info,message:e,optionsOverride:s,title:t})},options:{},subscribe:function(e){t=e},success:function(e,t,s){return n({type:r,iconClass:C().iconClasses.success,message:e,optionsOverride:s,title:t})},version:"2.1.4",warning:function(e,t,s){return n({type:l,iconClass:C().iconClasses.warning,message:e,optionsOverride:s,title:t})}};function C(){return w.extend({},{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"linear",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"linear",onHidden:void 0,closeMethod:!1,closeDuration:!1,closeEasing:!1,closeOnHover:!0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",escapeHtml:!1,target:"body",closeHtml:'<button type="button">&times;</button>',closeClass:"toast-close-button",newestOnTop:!0,preventDuplicates:!1,progressBar:!1,progressClass:"toast-progress",rtl:!1},e.options)}function T(e,t){return e=e||C(),(D=w("#"+e.containerId)).length||t&&(t=e,(D=w("<div/>").attr("id",t.containerId).addClass(t.positionClass)).appendTo(w(t.target))),D}function O(e){D=D||T(),e.is(":visible")||(e.remove(),e=null,0===D.children().length&&(D.remove(),H=void 0))}function a(e,t,s){s=!(!s||!s.force)&&s.force;return e&&(s||0===w(":focus",e).length)&&(e[t.hideMethod]({duration:t.hideDuration,easing:t.hideEasing,complete:function(){O(e)}}),1)}function b(e){t&&t(e)}function n(e){var o,t,s,n,i,a,r=C(),l=e.iconClass||r.iconClass,d=null,c={intervalId:null,hideEta:null,maxHideTime:null};function u(e){return(e=null==e?"":e).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function p(e){var t=e&&!1!==r.closeMethod?r.closeMethod:r.hideMethod,s=e&&!1!==r.closeDuration?r.closeDuration:r.hideDuration,n=e&&!1!==r.closeEasing?r.closeEasing:r.hideEasing;if(!w(":focus",o).length||e)return clearTimeout(c.intervalId),o[t]({duration:s,easing:n,complete:function(){O(o),clearTimeout(d),r.onHidden&&"hidden"!==a.state&&r.onHidden(),a.state="hidden",a.endTime=new Date,b(a)}})}function m(){(0<r.timeOut||0<r.extendedTimeOut)&&(d=setTimeout(p,r.extendedTimeOut),c.maxHideTime=parseFloat(r.extendedTimeOut),c.hideEta=(new Date).getTime()+c.maxHideTime)}function g(){clearTimeout(d),c.hideEta=0,o.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function f(){var e=(c.hideEta-(new Date).getTime())/c.maxHideTime*100;n.width(e+"%")}if(void 0!==e.optionsOverride&&(r=w.extend(r,e.optionsOverride),l=e.optionsOverride.iconClass||l),!function(e,t){if(e.preventDuplicates){if(t.message===H)return 1;H=t.message}}(r,e)){x+=1,D=T(r,!0),o=w("<div/>"),t=w("<div/>"),s=w("<div/>"),n=w("<div/>"),i=w(r.closeHtml),a={toastId:x,state:"visible",startTime:new Date,options:r,map:e},e.iconClass&&o.addClass(r.toastClass).addClass(l),e.title&&(h=e.title,r.escapeHtml&&(h=u(e.title)),t.append(h).addClass(r.titleClass),o.append(t)),e.message&&(h=e.message,r.escapeHtml&&(h=u(e.message)),s.append(h).addClass(r.messageClass),o.append(s)),r.closeButton&&(i.addClass(r.closeClass).attr("role","button"),o.prepend(i)),r.progressBar&&(n.addClass(r.progressClass),o.prepend(n)),r.rtl&&o.addClass("rtl"),r.newestOnTop?D.prepend(o):D.append(o);var h,v="";switch(e.iconClass){case"toast-success":case"toast-info":v="polite";break;default:v="assertive"}return o.attr("aria-live",v),o.hide(),o[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),0<r.timeOut&&(d=setTimeout(p,r.timeOut),c.maxHideTime=parseFloat(r.timeOut),c.hideEta=(new Date).getTime()+c.maxHideTime,r.progressBar)&&(c.intervalId=setInterval(f,10)),r.closeOnHover&&(o.on("mouseenter",g),o.on("mouseleave",m)),!r.onclick&&r.tapToDismiss&&o.on("click",p),r.closeButton&&i&&i.on("click",function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&!0!==e.cancelBubble&&(e.cancelBubble=!0),r.onCloseClick&&r.onCloseClick(e),p(!0)}),r.onclick&&o.on("click",function(e){r.onclick(e),p()}),b(a),r.debug&&window.console&&window.console.log(a),o}}var D,t,e,H,x,o,i,r,l})}();assets/js/admin/tm-epo-admin-lookuptable.min.js000064400000024537150755142450015523 0ustar00!function(l,e,c){"use strict";var r=l.wp,a=l._,s=l.TMEPOADMINLOOKUPJS,d=l.toastr,o=l.plupload,t={tc_builder_elements:r.template("tc-builder-elements"),tc_builder_section:r.template("tc-builder-section")},m=s.lookuptable;function u(){return""===s.tm_epo_global_displayed_decimal_separator?s.currency_format_decimal_sep:c.epoAPI.locale.getSystemDecimalSeparator()}function p(t){var e,t=String(t);return t.includes("e-")?(e=t.split("e-"),Number(e[1])+Number(p(e[0]))):t.includes(".")?t.split(".")[1].length:0}function f(){var i,n={},l={},s={};return c(".lookup-table").toArray().forEach(function(t){t=c(t),i=t.closest(".lookup-table-wrap").prev(".lookuptable-name").find(".table-name-value").text(),n[i]={},t.find(".row").toArray().forEach(function(t){c(t).find(".ltcell").toArray().forEach(function(t){var t=c(t),e=t.attr("data-row"),o=t.attr("data-column"),a=t.text(),r=a.replace(/,/g,".");"1"===e&&"1"===o||(t.is(".head .ltcell, .column1")&&!String(r).isNumeric()||(t=c.epoAPI.math.toFloat(r),a="max"!==r&&isNaN(t)?0:r),"1"===o?s[e]=a:"1"===e?l[o]=a:(void 0===n[i][l[o]]&&(n[i][l[o]]={}),n[i][l[o]][s[e]]=a))})})}),n}c.tmEPOAdmin={addEventsDone:0,addEvents:function(){var n,t=c("#builder_import_file"),t=new o.Uploader({url:s.ajax_url,browse_button:t[0],file_data_name:"builder_import_file",multi_selection:!1});t.init(),t.bind("FilesAdded",function(t){function e(){c("#tc-floatbox-content").find(".override-selection").addClass("tc-hidden"),o.appendTo("#tc-floatbox-content"),c(".tc-progress-info-content").html(s.i18n_importing),t.setOption("multipart_params",{action:"tc_lookup_table_import",post_id:s.post_id,security:s.import_nonce}),t.start(),c(".flasho").addClass("tc-color-notice")}var o,a=c.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:"",title:s.i18n_import_title});n=c.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",minHeight:"300px",classname:"flasho tc-wrapper",data:a}),o=c('<div class="tc-progress-bar tc-notice"><span class="tc-percent"></span></div><div class="tc-progress-info"><span class="tc-progress-info-content"></span></div>'),c(".lookuptable-wrapper").length?(c('<div class="override-selection"><button type="button" class="tc tc-button details-override">'+s.i18n_overwrite_existing_tables+"</button></div>").appendTo("#tc-floatbox-content"),c(".details-override").on("click",function(){e()})):e()}),t.bind("FileUploaded",function(t,e,o){var a,r,i=c.epoAPI.util.parseJSON(o.response);i&&void 0!==i.result&&i.message&&c(".tc-progress-info-content").html(i.message),i&&i.error&&i.message&&c(".tc-progress-info-content").html(i.message),i&&void 0!==i.result&&1===c.epoAPI.math.toFloat(i.result)?(c(".tc-progress-bar").removeClass("tc-notice").addClass("tc-success"),c(".tc-progress-info-content").removeClass("tc-color-error").addClass("tc-color-success"),c(".flasho").removeClass("tc-color-notice tc-color-error").addClass("tc-color-success"),c(".floatbox-cancel").addClass("tc-hidden"),c(".tc-progress-info-content").html(s.i18n_saving),c(l).off("beforeunload.edit-post"),i.table?Array.isArray(i.jsobject)?(c(".builder-layout").html(i.table),c.tmEPOAdmin.initSectionsCheck(),d.success(i.message,s.i18n_epo),(a=c("#title")).length&&""===a.val()&&(a.val(Object.keys(i.jsobject[0])[0]),c("#title-prompt-text").addClass("screen-reader-text"),"publish"===c("#publish").attr("name"))&&c("#publish").trigger("click")):d.error(s.i18n_invalid_request,s.i18n_epo):i.different?(r=1,c(".details-override").on("click",function(){c.post(s.ajax_url,{action:"tc_lookup_table_import",import_override:1,post_id:s.post_id,security:s.import_nonce},function(t){(i=t).table&&(Array.isArray(i.jsobject)?(c(".builder-layout").html(i.table),c.tmEPOAdmin.initSectionsCheck(),d.success(i.message,s.i18n_epo)):d.error(s.i18n_invalid_request,s.i18n_epo))},"json").always(function(){n.destroy()})}),c("#tc-floatbox-content").find(".override-selection").removeClass("tc-hidden").addClass("height50").insertAfter(c(".tc-progress-info")),c(".floatbox-cancel").removeClass("tc-hidden"),c(".tc-progress-bar").addClass("tc-hidden"),c(".tc-progress-info-content").removeClass("tc-color-success tc-color-error").addClass("tc-color-notice").html(i.message),c(".flasho").removeClass("tc-color-success tc-color-error").addClass("tc-color-notice")):d.error(s.i18n_invalid_csv,s.i18n_epo),r||n.destroy()):(c(".tc-progress-bar").removeClass("tc-notice").addClass("tc-error"),c(".tc-progress-info-content").removeClass("tc-color-success").addClass("tc-color-error"),c(".flasho").removeClass("tc-color-notice tc-color-success").addClass("tc-color-error"),!i&&o&&o.response&&c(".tc-progress-info-content").addClass("tc-normalize").html(o.response),d.error(s.i18n_invalid_request,s.i18n_epo))}),t.bind("UploadProgress",function(t,e){e=parseInt(e.percent,10);c(".tc-progress-bar").css("width",e+"%"),c(".tc-percent").html(e+"%")}),t.bind("Error",function(t,e){e&&e.message&&c(".tc-progress-info-content").removeClass("tc-color-success").addClass("tc-color-error").html("\nError #"+e.code+": "+e.message),c(".tc-progress-bar").removeClass("tc-notice").addClass("tc-error"),c(".flasho").removeClass("tc-color-notice tc-color-success").addClass("tc-color-error"),e&&e.response&&(c(".flasho .header h3").html(e.message),c(".tc-progress-info-content").addClass("tc-normal-font").html(e.response)),d.error(s.i18n_invalid_request,s.i18n_epo)}),t.bind("UploadComplete",function(){c("body").removeClass("overflow")}),c(e).on("click.cpf",".tc-add-import-csv",function(t){t.preventDefault(),c("#builder_import_file").trigger("click")}),c(e).on("click.cpf",".tc-add-export-csv",function(t){var e=c(this);t.preventDefault(),e.data("doing_export")||(e.data("doing_export",1).prepend('<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>'),t={action:"tc_lookup_table_export",metaserialized:JSON.stringify(m),security:s.export_nonce},c.post(s.ajax_url,t,function(t){t&&t.result&&""!==t.result?l.location=t.result:(t=t&&t.error&&t.message?t.message:s.i18n_error_message,t=c.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:'<div class="tm-inner">'+t+"</div>",title:s.i18n_error_title}),c.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",minHeight:"300px",classname:"flasho tc-wrapper tm-error",data:t}))},"json").always(function(){e.data("doing_export",0).find(".tm-icon").remove()}))}),c(e).on("mouseover",".ltcell",function(){var t=c(this),e=t.parent().parent().parent(),o=t.parent().parent(),a=c(e).data("vertable")+"",r=t.data("column")+"",t=t.data("row")+" .column1";c(o).find("."+r).addClass("hov-column-"+a),c(e).find(".row.head ."+r).addClass("hov-column-head-"+a),c(e).find(".row."+t).addClass("hov-column-head-"+a)}),c(e).on("mouseout",".ltcell",function(){var t=c(this),e=t.parent().parent().parent(),o=t.parent().parent(),a=c(e).data("vertable")+"",r=t.data("column")+"",t=t.data("row")+" .column1";c(o).find("."+r).removeClass("hov-column-"+a),c(e).find(".row.head ."+r).removeClass("hov-column-head-"+a),c(e).find(".row."+t).removeClass("hov-column-head-"+a)}),c(e).on("keypress",'[contenteditable="true"]',function(t){13===t.which&&(t.preventDefault(),c(this).trigger("blur"))}),c(e).on("focus",'[contenteditable="true"]',function(){var t=c(this);t.attr("data-value",t.text())}),c(e).on("blur",'.head [contenteditable="true"], .column1[contenteditable="true"]',function(){var t=c(this),e=t.text(),o=t.attr("data-row"),a=t.attr("data-column"),r=t.attr("data-value");if(void 0===r&&(r=0),""===e){if("1"===a||"1"===o)return void t.html(r)}else""!==e&&String(e).isNumeric()&&(e=t.text().replace(/,/g,"."),a={symbol:"",format:"",decimal:u(),thousand:"",precision:p(c.epoAPI.math.toFloat(e))},e=c.epoAPI.math.format(e,a)),t.html(e);m=f()}),c(e).on("blur",'[contenteditable="true"]:not(.head [contenteditable="true"], .column1)',function(){var t,e=c(this),o=e.text().replace(/,/g,"."),a=c.epoAPI.math.toFloat(o),r={symbol:"",format:"",decimal:u(),thousand:"",precision:p(a)},i=e.attr("data-row"),n=e.attr("data-column"),l=e.attr("data-value");if(void 0===l&&(l=0),e.is(".table-name-value"))""===o&&e.html(l);else if(t=e.closest("table").find("tr").length,""===o){if("1"===n||"1"===i)return void e.html(l)}else if("max"===o){if(1<Number(i)){if(Number(i)<t||1<Number(n))return void e.html(l)}else if(1===Number(i)&&Number(n)<=e.siblings().length)return void e.html(l);e.html(o)}else isNaN(a)||isNaN(Number(o))?e.html(l):(""!==o&&(o=c.epoAPI.math.format(o,r)),e.html(o));m=f()})},tm_escape:function(t){return encodeURIComponent(t)},createLookuptableMeta:function(){var t,e=c("input#wp-preview"),o=c("#tmformfieldsbuilderwrap");a.isEqual(s.lookuptable,m)||(c(".lookuptable-meta").remove(),t=c.tmEPOAdmin.tm_escape(JSON.stringify(m)),t=c("<textarea class='lookuptable-meta tm-hidden' name='lookuptable_meta_changed'></textarea>").val(t),o.prepend(t),0<e.length&&""!==e.val()&&c(".lookuptable-meta").remove())},fixFormSubmit:function(){var a,t=c("#post");1===t.length?t.on("submit",function(){return c.tmEPOAdmin.createLookuptableMeta(),!0}):r.data&&void 0!==r.data.subscribe&&(a=!1,"function"==typeof(t=r.data.subscribe))&&t(function(){var t,e,o;r.data.select("core/editor")&&(e=r.data.select("core/editor").didPostSaveRequestSucceed(),o=r.data.select("core/editor").didPostSaveRequestFail(),r&&r.data&&r.data.select("core/editor")&&(t=r.data.select("core/editor").isSavingPost()),!a&&t&&(a=!0,c.tmEPOAdmin.createLookuptableMeta()),a)&&(e||o)&&(a=!1,setTimeout(function(){c(".lookuptable-meta").remove()},600))})},initialitize:function(){c.tmEPOAdmin.initSectionsCheck(),c.tmEPOAdmin.addEvents(),c(".builder-layout").removeClass("tm-hidden"),c.tmEPOAdmin.fixFormSubmit()},initSectionsCheck:function(){c(".lookuptable-wrapper").length?(c(".builder-add-section-action").show(),c(".builder-selector").show(),c(".tc-welcome").hide(),c(".builder-layout").show(),c(".tc-add-export-csv").show()):(c(".builder-add-section-action").hide(),c(".builder-selector").hide(),c(".tc-welcome").show(),c(".builder-layout").hide(),c(".tc-add-export-csv").hide())},builder_floatbox_template:function(t,e){return c.epoAPI.template.html(r.template(e||"tc-floatbox"),{id:t.id,title:t.title,html:t.html,uniqidtext:t.uniqidtext||"",uniqid:t.uniqid,update:t.update||s.i18n_update,cancel:t.cancel||s.i18n_cancel})},builder_floatbox_template_import:function(t){return c.epoAPI.template.html(r.template("tc-floatbox-import"),{id:t.id,title:t.title,html:t.html,cancel:s.i18n_cancel})}},c(function(){t=c.epoAPI.applyFilter("tc_adjust_admin_template_engine",t),c.tmEPOAdmin.initialitize()})}(window,document,window.jQuery);assets/js/admin/index.php000064400000000126150755142450011401 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/js/admin/jquery.tcpagination.min.js000064400000007721150755142450014707 0ustar00!function(n){"use strict";function g(t,s){var e,i;return this.element=n(t),this.mainElement=this.element,this.settings=n.extend({},n.fn.tcPagination.defaults,s),this.settings.totalPages=parseInt(this.settings.totalPages,10),Number.isFinite(this.settings.totalPages)||(this.settings.totalPages=0),(this.settings.startPage<1||this.settings.startPage>this.settings.totalPages)&&(this.settings.startPage=1),this.settings.visiblePages=parseInt(this.settings.visiblePages,10),Number.isFinite(this.settings.visiblePages)||(this.settings.visiblePages=5),"function"==typeof this.settings.onPageClick&&this.element.first().on("page",this.settings.onPageClick),1===this.settings.totalPages?this.element.trigger("page",1):("UL"===this.element.prop("tagName")?this.listContainer=this.element:(e=n([]),this.element.toArray().forEach(function(t){i=n("<ul></ul>"),n(t).append(i),e.push(i[0])}),this.listContainer=e,this.element=e),this.show(this.settings.startPage)),this}g.prototype={constructor:g,destroy:function(){return this.element.empty(),this.mainElement.removeData("tc-pagination"),this.element.off("page"),this},show:function(t){var s;return t<1||t>this.settings.totalPages||(this.currentPage=t,this.element.trigger("beforePage",t),s=this.getPages(t),this.render(s),this.setupEvents(),this.element.trigger("page",t)),s},buildListItems:function(t){var s,e=[],i=this;return this.settings.first&&e.push(this.buildItem("first",1)),this.settings.prev&&(s=1<t.currentPage?parseInt(t.currentPage,10)-1:1,e.push(this.buildItem("prev",s))),t.numeric.forEach(function(t){e.push(i.buildItem("page",t))}),this.settings.next&&(s=t.currentPage<this.settings.totalPages?parseInt(t.currentPage,10)+1:this.settings.totalPages,e.push(this.buildItem("next",s))),this.settings.last&&e.push(this.buildItem("last",this.settings.totalPages)),e},buildItem:function(t,s){var e=n("<li></li>"),i=n("<a></a>"),a=this.settings[t]||s;return e.addClass(this.settings[t+"Class"]),e.data("page",s),e.data("page-type",t),e.append(i.attr("href","#").html(a)),e},getPages:function(t){var s,e=[],i=Math.floor(parseInt(this.settings.visiblePages,10)/2),a=parseInt(t,10)-i+1-parseInt(this.settings.visiblePages,10)%2,n=t+i,i=this.settings.visiblePages;for(i>this.settings.totalPages&&(i=this.settings.totalPages),a<=0&&(a=1,n=i),n>this.settings.totalPages&&(a=parseInt(this.settings.totalPages,10)-parseInt(i,10)+1,n=this.settings.totalPages),s=a;s<=n;)e.push(s),s=parseInt(s,10)+1;return{currentPage:t,numeric:e}},render:function(t){var s,e=this;this.listContainer.children().remove(),this.buildListItems(t).forEach(function(t){e.listContainer.append(t)}),this.listContainer.children().each(function(){switch(s=n(this),s.data("page-type")){case"page":s.data("page")===t.currentPage&&s.addClass(e.settings.activeClass);break;case"first":s.toggleClass(e.settings.disabledClass,1===t.currentPage);break;case"last":s.toggleClass(e.settings.disabledClass,t.currentPage===e.settings.totalPages);break;case"prev":s.toggleClass(e.settings.disabledClass,1===t.currentPage);break;case"next":s.toggleClass(e.settings.disabledClass,t.currentPage===e.settings.totalPages)}})},setupEvents:function(){var e=this;this.listContainer.off("click").on("click","li",function(t){var s=n(this);if(s.hasClass(e.settings.disabledClass)||s.hasClass(e.settings.activeClass))return!1;t.preventDefault(),e.show(parseInt(s.data("page"),10))})}},n.fn.tcPagination=function(t){var s,e=n(this),i=e.data("tc-pagination"),a="object"==typeof t?t:{};return i||(i=new g(this,a),e.data("tc-pagination",i)),void 0===(s="string"==typeof t?i[t].apply(i,[]):s)?e:s},n.fn.tcPagination.defaults={totalPages:0,startPage:1,visiblePages:5,onPageClick:null,page:null,first:'<i class="tcfa tcfa-angle-double-left"></i>',prev:'<i class="tcfa tcfa-angle-left"></i>',next:'<i class="tcfa tcfa-angle-right"></i>',last:'<i class="tcfa tcfa-angle-double-right"></i>',nextClass:"next",prevClass:"prev",lastClass:"last",firstClass:"first",pageClass:"page",activeClass:"active",disabledClass:"disabled"},n.fn.tcPagination.Constructor=g}(window.jQuery);assets/js/admin/tc-js-admin-templates.php000064400000005460150755142450014402 0ustar00<?php
/**
 * The admin javascript-based template for displayed javascript generated html code
 *
 * NOTE that this file is not meant to be overriden
 *
 * @see     https://codex.wordpress.org/Javascript_Reference/wp.template
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
?>
<script class="tm-hidden" type="text/template" id="tmpl-tc-floatbox">
	<div class="header">
		<h3>{{{ data.title }}}</h3>
		<# if (data.uniqid){ #>
			<span data-uniqid="{{{ data.uniqid }}}" class="tm-element-uniqid">{{{ data.uniqidtext }}}{{{ data.uniqid }}}</span>
			<# } #>
	</div>
	<div id="{{{ data.id }}}" class="float-editbox">{{{ data.html }}}</div>
	<div class="footer">
		<div class="inner">
		<button type="button" class="tc tc-button alt floatbox-cancel">{{{ data.cancel }}}</button>&nbsp;
		<button type="button" class="tc tc-button floatbox-update">{{{ data.update }}}</button>
		</div>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-floatbox-edit">
	<div class="header">
		<h3>{{{ data.title }}}</h3>
	</div>
	<div id="{{{ data.id }}}" class="float-editbox">{{{ data.html }}}</div>
	<div class="footer">
		<div class="inner">
			<button type="button" class="tc tc-button alt floatbox-edit-cancel">{{{ data.cancel }}}</button>
			<button type="button" class="tc tc-button floatbox-edit-update">{{{ data.update }}}</button>&nbsp;
		</div>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-floatbox-import">
	<div class="header">
		<h3>{{{ data.title }}}</h3>
	</div>
	<div id="{{{ data.id }}}" class="float-editbox">{{{ data.html }}}</div>
	<div class="footer">
		<div class="inner">
			<button type="button" class="tc tc-button alt floatbox-cancel">{{{ data.cancel }}}</button>
		</div>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-constant-template">
	<tr valign="top" class="constantrow">
		<th scope="row" class="titledesc">
			<div class="constant-label-wrap constant-name-text{{{ data.labelnameclass }}}">
				<label for="constant-name{{{ data.id }}}">{{{ data.labelname }}}</label>
				<input id="constant-name{{{ data.id }}}" type="text" value="{{{ data.constantname }}}" class="constant-name">
			</div>
		</th>
		<td class="forminp forminp-text">
			<div class="constant-value-wrap">
				<div class="constant-label-wrap constant-value-text{{{ data.labelvalueclass }}}">
					<label for="constant-value{{{ data.id }}}">{{{ data.labelvalue }}}</label>
					<input id="constant-value{{{ data.id }}}" type="text" value="{{{ data.constantvalue }}}" class="constant-value">
				</div>
				<div class="constant-value-delete">
					<div class="tc-constant-delete">
						<button type="button" class="tmicon tcfa tcfa-times delete"></button>
					</div>
				</div>
			</div>
		</td>
	</tr>
</script>
assets/js/admin/tm-epo-admin-order.min.js000064400000000775150755142450014313 0ustar00!function(a){"use strict";a(function(){a("#woocommerce-order-items").on("click.tc","a.tm-delete-order-item",function(t){var e,i=a(this).closest("tr.item, tr.fee, tr.shipping");t.preventDefault(),t=a("<input type='hidden' class='tm_meta_serialized' name='tm_item_id'>").val(i.attr("data-tm_item_id")),e=a("<input type='hidden' class='tm_meta_serialized' name='tm_key'>").val(i.attr("data-tm_key_id")),i.prepend(t).prepend(e),a(".button.calculate-action").trigger("click")})})}((window,document,window.jQuery));assets/js/admin/tm-global-epo-admin.js000064400000772716150755142450013671 0ustar00( function( window, document, $ ) {
	'use strict';

	var wp = window.wp;
	var TMEPOADMINJS = window.TMEPOADMINJS;
	var TMEPOGLOBALADMINJS = window.TMEPOGLOBALADMINJS;
	var TMEPOOPTIONSJS;
	var woocommerceAdmin;
	var tinyMCEPreInit;
	var QTags;
	var quicktags;
	var tinyMCE;
	var toastr = window.toastr;
	var _ = window._;
	var plupload = window.plupload;
	var globalVariationObject = false;
	var templateEngine = {
		tc_builder_elements: wp.template( 'tc-builder-elements' ),
		tc_builder_section: wp.template( 'tc-builder-section' )
	};
	var JSON = window.JSON;
	var TCBUILDER;
	var wcEnhancedSelectParams;
	var emptyImage = 'data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=';

	function tcArrayValues( input ) {
		var tmpArr = [];
		Object.keys( input ).forEach( function( key ) {
			if ( Object.prototype.hasOwnProperty.call( input, key ) ) {
				tmpArr[ tmpArr.length ] = input[ key ];
			}
		} );
		return tmpArr;
	}

	$.tmEPOAdmin = {
		addEventsDone: 0,
		variationsCheckForChanges: 0,
		elementLogicObject: {},
		sectionLogicObject: {},
		elementShippingLogicObject: {},
		logicOperators: {
			is: TMEPOGLOBALADMINJS.i18n_is,
			isnot: TMEPOGLOBALADMINJS.i18n_is_not,
			isempty: TMEPOGLOBALADMINJS.i18n_is_empty,
			isnotempty: TMEPOGLOBALADMINJS.i18n_is_not_empty,
			startswith: TMEPOGLOBALADMINJS.i18n_starts_with,
			endswith: TMEPOGLOBALADMINJS.i18n_ends_with,
			greaterthan: TMEPOGLOBALADMINJS.i18n_greater_than,
			lessthan: TMEPOGLOBALADMINJS.i18n_less_than,
			greaterthanequal: TMEPOGLOBALADMINJS.i18n_greater_than_equal,
			lessthanequal: TMEPOGLOBALADMINJS.i18n_less_than_equal
		},
		builderItemsSortableObj: {
			start: {},
			end: {}
		},
		builderSectionsSortableObj: {
			start: {},
			end: {}
		},
		// Helper : Holds element and sections available sizes
		builderSize: {
			w1: '1%',
			w2: '2%',
			w3: '3%',
			w4: '4%',
			w5: '5%',
			w6: '6%',
			w7: '7%',
			w8: '8%',
			w9: '9%',
			w10: '10%',
			w11: '11%',
			w12: '12%',

			'w12-5': '12.5%',

			w13: '13%',
			w14: '14%',
			w15: '15%',
			w16: '16%',
			w17: '17%',
			w18: '18%',
			w19: '19%',
			w20: '20%',
			w21: '21%',
			w22: '22%',
			w23: '23%',
			w24: '24%',
			w25: '25%',
			w26: '26%',
			w27: '27%',
			w28: '28%',
			w29: '29%',
			w30: '30%',
			w31: '31%',
			w32: '32%',
			w33: '33%',
			w34: '34%',
			w35: '35%',
			w36: '36%',
			w37: '37%',

			'w37-5': '37.5%',

			w38: '38%',
			w39: '39%',
			w40: '40%',
			w41: '41%',
			w42: '42%',
			w43: '43%',
			w44: '44%',
			w45: '45%',
			w46: '46%',
			w47: '47%',
			w48: '48%',
			w49: '49%',
			w50: '50%',
			w51: '51%',
			w52: '52%',
			w53: '53%',
			w54: '54%',
			w55: '55%',
			w56: '56%',
			w57: '57%',
			w58: '58%',
			w59: '59%',
			w60: '60%',
			w61: '61%',
			w62: '62%',

			'w62-5': '62.5%',

			w63: '63%',
			w64: '64%',
			w65: '65%',
			w66: '66%',
			w67: '67%',
			w68: '68%',
			w69: '69%',
			w70: '70%',
			w71: '71%',
			w72: '72%',
			w73: '73%',
			w74: '74%',
			w75: '75%',
			w76: '76%',
			w77: '77%',
			w78: '78%',
			w79: '79%',
			w80: '80%',
			w81: '81%',
			w82: '82%',
			w83: '83%',
			w84: '84%',
			w85: '85%',
			w86: '86%',
			w87: '87%',

			'w87-5': '87.5%',

			w88: '88%',
			w89: '89%',
			w90: '90%',
			w91: '91%',
			w92: '92%',
			w93: '93%',
			w94: '94%',
			w95: '95%',
			w96: '96%',
			w97: '97%',
			w98: '98%',
			w99: '99%',
			w100: '100%'
		},
		isElementDragged: false,

		variationSection: false,
		variationSectionIndex: false,
		variationFieldIndex: false,

		checkboxStates: {},

		canTakeLogic: [ 'product', 'color', 'range', 'radiobuttons', 'checkboxes', 'selectbox', 'selectboxmultiple', 'textfield', 'textarea', 'variations' ],

		addSortables: function() {
			if ( $.tmEPOAdmin.is_original ) {
				// Sections sortable
				$( '.builder-layout' ).sortable( {
					handle: '.move',
					cursor: 'move',
					items: '.builder-wrapper:not(.tma-nomove)',
					start: function( e, ui ) {
						var builderWrapper;
						var sectionIndex;

						builderWrapper = $( ui.item ).closest( '.builder-wrapper' );
						sectionIndex = builderWrapper.index();
						$.tmEPOAdmin.builderSectionsSortableObj.start.section = sectionIndex;

						ui.placeholder.height( ui.helper.outerHeight() );
						ui.placeholder.width( ui.helper.outerWidth() );
					},
					stop: function( e, ui ) {
						var builderWrapper;
						var sectionIndex;

						builderWrapper = $( ui.item ).closest( '.builder-wrapper' );
						sectionIndex = builderWrapper.index();
						$.tmEPOAdmin.builderSectionsSortableObj.end.section = sectionIndex;

						TCBUILDER.splice( sectionIndex, 0, TCBUILDER.splice( $.tmEPOAdmin.builderSectionsSortableObj.start.section, 1 )[ 0 ] );

						$.tmEPOAdmin.builder_reorder_multiple();
						$.tmEPOAdmin.builderSectionsSortableObj = {
							start: {},
							end: {}
						};
					},
					cancel: '.tma-nomove',
					forcePlaceholderSize: true,
					placeholder: 'bitem pl2',
					tolerance: 'pointer'
				} );

				// Elements sortable
				$.tmEPOAdmin.builder_items_sortable( $( '.builder-wrapper .bitem-wrapper' ) );
			}
		},

		getBuilder: function() {
			return TCBUILDER;
		},

		addEvents: function() {
			var $waiting;
			var tcuploader;
			var popup;
			var uploadmeta;
			var mouseupEvent;
			var keydownEvent;
			var tagchecklist = $( '.tagchecklist' );

			if ( $.tmEPOAdmin.addEventsDone === 1 ) {
				return;
			}

			$.tmEPOAdmin.addSortables();

			// Import CSV
			$waiting = $( '#builder_import_file' );

			tcuploader = new plupload.Uploader( {
				url: TMEPOGLOBALADMINJS.import_url,
				browse_button: $waiting[ 0 ],
				file_data_name: 'builder_import_file',
				multi_selection: false
			} );

			tcuploader.init();

			tcuploader.bind( 'FilesAdded', function( uploader ) {
				var $_html = $.tmEPOAdmin.builder_floatbox_template_import( {
					id: 'tc-floatbox-content',
					html: '',
					title: TMEPOGLOBALADMINJS.i18n_import_title
				} );
				var $progress;
				var $selection;

				popup = $.tcFloatBox( {
					closefadeouttime: 0,
					animateOut: '',
					fps: 1,
					ismodal: true,
					refresh: 'fixed',
					width: '50%',
					height: '300px',
					classname: 'flasho tc-wrapper',
					data: $_html
				} );

				$progress = $( '<div class="tc-progress-bar tc-notice"><span class="tc-percent"></span></div><div class="tc-progress-info"><span class="tc-progress-info-content"></span></div>' );
				$selection = $(
					'<div class="override-selection"><button type="button" class="tc tc-button details-override">' +
						TMEPOGLOBALADMINJS.i18n_overwrite_existing_elements +
						'</button><button type="button" class="tc tc-button details-append">' +
						TMEPOGLOBALADMINJS.i18n_append_new_elements +
						'</button></div>'
				);
				$selection.appendTo( '#tc-floatbox-content' );

				TCBUILDER = $.tmEPOAdmin.checkSections( TCBUILDER );

				uploadmeta = $.tmEPOAdmin.tm_escape( JSON.stringify( $.tmEPOAdmin.prepareForJson( $.tmEPOAdmin.tcSerializeJsOptionsObject( TCBUILDER ) ) ) );

				if ( TMEPOGLOBALADMINJS.is_original_post ) {
					$( '.details-override' ).on( 'click', function() {
						$( '#tc-floatbox-content' ).find( '.override-selection' ).remove();
						$progress.appendTo( '#tc-floatbox-content' );
						$( '.tc-progress-info-content' ).html( TMEPOGLOBALADMINJS.i18n_importing );
						uploader.setOption( 'multipart_params', {
							action: 'import',
							import_override: 1,
							post_id: TMEPOGLOBALADMINJS.post_id,
							security: TMEPOGLOBALADMINJS.import_nonce,
							is_original_post: TMEPOGLOBALADMINJS.is_original_post
						} );
						uploader.start();
						$( '.flasho' ).addClass( 'tc-color-notice' );
					} );

					$( '.details-append' ).on( 'click', function() {
						$( '#tc-floatbox-content' ).find( '.override-selection' ).remove();
						$progress.appendTo( '#tc-floatbox-content' );
						$( '.tc-progress-info-content' ).html( TMEPOGLOBALADMINJS.i18n_importing );
						uploader.setOption( 'multipart_params', {
							action: 'import',
							import_override: 0,
							post_id: TMEPOGLOBALADMINJS.post_id,
							tm_uploadmeta: uploadmeta,
							security: TMEPOGLOBALADMINJS.import_nonce,
							is_original_post: TMEPOGLOBALADMINJS.is_original_post
						} );
						uploader.start();
						$( '.flasho' ).addClass( 'tc-color-notice' );
					} );
				} else {
					$( '#tc-floatbox-content' ).find( '.override-selection' ).remove();
					$progress.appendTo( '#tc-floatbox-content' );
					$( '.tc-progress-info-content' ).html( TMEPOGLOBALADMINJS.i18n_importing );
					uploader.setOption( 'multipart_params', {
						action: 'import',
						import_override: 1,
						post_id: TMEPOGLOBALADMINJS.post_id,
						tm_uploadmeta: uploadmeta,
						security: TMEPOGLOBALADMINJS.import_nonce,
						is_original_post: TMEPOGLOBALADMINJS.is_original_post
					} );
					uploader.start();
					$( '.flasho' ).addClass( 'tc-color-notice' );
				}
			} );

			tcuploader.bind( 'FileUploaded', function( uploader, file, response ) {
				var data = $.epoAPI.util.parseJSON( response.response );

				if ( data && data.result !== undefined && data.message ) {
					$( '.tc-progress-info-content' ).html( data.message );
				}
				if ( data && data.error && data.message ) {
					$( '.tc-progress-info-content' ).html( data.message );
				}
				if ( data && data.result !== undefined && $.epoAPI.math.toFloat( data.result ) === 1 ) {
					$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-success' );
					$( '.tc-progress-info-content' ).removeClass( 'tc-color-error' ).addClass( 'tc-color-success' );
					$( '.flasho' ).removeClass( 'tc-color-notice tc-color-error' ).addClass( 'tc-color-success' );
					$( '.floatbox-cancel' ).remove();
					$( '.tc-progress-info-content' ).html( TMEPOGLOBALADMINJS.i18n_saving );
					$( window ).off( 'beforeunload.edit-post' );
					if ( data.options ) {
						if ( Array.isArray( data.jsobject ) ) {
							$( '.builder-layout' ).html( data.options );
							TCBUILDER = data.jsobject;
							$.tmEPOAdmin.setGlobalVariationObject( 'initialitize_on_after' );
							toastr.success( data.message, TMEPOGLOBALADMINJS.i18n_epo );
						} else {
							toastr.error( TMEPOGLOBALADMINJS.i18n_invalid_request, TMEPOGLOBALADMINJS.i18n_epo );
						}
					}
					popup.destroy();
				} else {
					$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-error' );
					$( '.tc-progress-info-content' ).removeClass( 'tc-color-success' ).addClass( 'tc-color-error' );
					$( '.flasho' ).removeClass( 'tc-color-notice tc-color-success' ).addClass( 'tc-color-error' );
					if ( ! data && response && response.response ) {
						$( '.tc-progress-info-content' ).addClass( 'tc-normal-font' ).html( response.response );
					}
					toastr.error( TMEPOGLOBALADMINJS.i18n_invalid_request, TMEPOGLOBALADMINJS.i18n_epo );
				}
			} );

			tcuploader.bind( 'UploadProgress', function( uploader, file ) {
				var progress = parseInt( file.percent, 10 );
				$( '.tc-progress-bar' ).css( 'width', progress + '%' );
				$( '.tc-percent' ).html( progress + '%' );
			} );

			tcuploader.bind( 'Error', function( uploader, error ) {
				if ( error && error.message ) {
					$( '.tc-progress-info-content' )
						.removeClass( 'tc-color-success' )
						.addClass( 'tc-color-error' )
						.html( '\nError #' + error.code + ': ' + error.message );
				}
				$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-error' );
				$( '.flasho' ).removeClass( 'tc-color-notice tc-color-success' ).addClass( 'tc-color-error' );
			} );

			tcuploader.bind( 'UploadComplete', function() {
				$( 'body' ).removeClass( 'overflow' );
			} );

			// Export button
			$( document ).on( 'click.cpf', '#builder_export', function( e ) {
				var $this = $( this );
				var tm_meta;
				var data;

				e.preventDefault();

				if ( $this.data( 'doing_export' ) ) {
					return;
				}

				$this.data( 'doing_export', 1 ).prepend( '<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>' );

				TCBUILDER = $.tmEPOAdmin.checkSections( TCBUILDER );

				tm_meta = $.tmEPOAdmin.prepareForJson( $.tmEPOAdmin.tcSerializeJsOptionsObject( TCBUILDER ) );

				tm_meta = JSON.stringify( tm_meta );

				data = {
					action: 'tm_export',
					metaserialized: tm_meta,
					is_original_post: TMEPOGLOBALADMINJS.is_original_post,
					security: TMEPOGLOBALADMINJS.export_nonce
				};

				$.post(
					TMEPOGLOBALADMINJS.ajax_url,
					data,
					function( response ) {
						var $_html;

						if ( response && response.result && response.result !== '' ) {
							window.location = response.result;
						} else if ( response && response.error && response.message ) {
							$_html = $.tmEPOAdmin.builder_floatbox_template_import( {
								id: 'tc-floatbox-content',
								html: '<div class="tm-inner">' + response.message + '</div>',
								title: TMEPOGLOBALADMINJS.i18n_error_title
							} );
							$.tcFloatBox( {
								closefadeouttime: 0,
								animateOut: '',
								fps: 1,
								ismodal: true,
								refresh: 'fixed',
								width: '50%',
								height: '300px',
								classname: 'flasho tc-wrapper tm-error',
								data: $_html
							} );
						}
					},
					'json'
				).always( function() {
					$this.data( 'doing_export', 0 ).find( '.tm-icon' ).remove();
				} );
			} );

			// Save button
			$( document ).on( 'click.cpf', '#builder_save', function( e ) {
				var data;
				var $this = $( this );

				if ( $this.data( 'doing_export' ) ) {
					return;
				}

				$this.data( 'doing_export', 1 ).prepend( '<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>' );

				TCBUILDER = $.tmEPOAdmin.checkSections( TCBUILDER );

				data = {
					action: 'tm_save',
					tm_uploadmeta: $.tmEPOAdmin.tm_escape( JSON.stringify( $.tmEPOAdmin.prepareForJson( $.tmEPOAdmin.tcSerializeJsOptionsObject( TCBUILDER ) ) ) ),
					post_id: TMEPOGLOBALADMINJS.post_id,
					security: TMEPOGLOBALADMINJS.save_nonce
				};

				$( '#tmformfieldsbuilderwrap' ).addClass( 'disabled' );

				e.preventDefault();
				$.post(
					TMEPOGLOBALADMINJS.ajax_url,
					data,
					function( response ) {
						if ( response && response.result && response.result === 1 ) {
							toastr.success( response.message, TMEPOGLOBALADMINJS.i18n_epo );
						} else {
							toastr.error( response.message, TMEPOGLOBALADMINJS.i18n_epo );
						}
					},
					'json'
				).always( function( response ) {
					$( '#tmformfieldsbuilderwrap' ).removeClass( 'disabled' );
					if ( response.responseText === '-1' ) {
						toastr.error( TMEPOGLOBALADMINJS.i18n_invalid_request, TMEPOGLOBALADMINJS.i18n_epo );
					}
					$this.data( 'doing_export', 0 ).find( '.tm-icon' ).remove();
				} );
			} );

			$( document ).on( 'click.cpf', '#builder_import,.tc-add-import-csv', function( e ) {
				e.preventDefault();
				$( '#builder_import_file' ).trigger( 'click' );
			} );

			// Fullsize button
			$( document ).on( 'click.cpf', '#builder-fullsize', function( e ) {
				e.preventDefault();
				$( 'body' ).addClass( 'overflow fullsize' );
			} );

			// Close Fullsize button
			$( document ).on( 'click.cpf', '#builder-fullsize-close', function( e ) {
				e.preventDefault();
				$( 'body' ).removeClass( 'overflow fullsize' );
			} );

			// Add Element button
			$( document ).on( 'click.cpf', '.builder-add-element', $.tmEPOAdmin.builder_add_element_onClick );
			// Section add button
			$( document ).on( 'click.cpf', '.builder_add_section,.tc-add-section ', $.tmEPOAdmin.builder_add_section_onClick );
			$( document ).on( 'click.cpf', '.builder-add-section-and-element,.tc-add-element', $.tmEPOAdmin.builder_add_section_and_element_onClick );
			// Variation button
			$( document ).on( 'click.cpf', '.builder_add_variation', $.tmEPOAdmin.builder_add_variation_onClick );

			// Section edit button
			$( document ).on( 'click.cpf', '.builder-wrapper .section-settings .edit', $.tmEPOAdmin.builder_section_item_onClick );
			// Section clone button
			$( document ).on( 'click.cpf', '.builder-wrapper .section-settings .clone', $.tmEPOAdmin.builder_section_clone_onClick );
			// Section plus button
			$( document ).on( 'click.cpf', '.builder-wrapper .section-settings .plus', $.tmEPOAdmin.builder_section_plus_onClick );
			// Section minus button
			$( document ).on( 'click.cpf', '.builder-wrapper .section-settings .minus', $.tmEPOAdmin.builder_section_minus_onClick );
			// Section delete button
			$( document ).on( 'click.cpf', '.builder-wrapper .btitle .delete:not(.builder-wrapper.tma-variations-wrap .btitle .delete)', $.tmEPOAdmin.builder_section_delete_onClick );
			// Section fold button
			$( document ).on( 'click.cpf', '.builder-wrapper .btitle .fold', $.tmEPOAdmin.builder_section_fold_onClick );

			// Variation delete button
			$( document ).on( 'click', '.builder-wrapper.tma-variations-wrap .btitle .delete', $.tmEPOAdmin.builder_variation_delete_onClick );

			// Element edit button
			$( document ).on( 'click.cpf', '.bitem .bitem-settings .edit', $.tmEPOAdmin.builder_item_onClick );
			// Element clone button
			$( document ).on( 'click.cpf', '.bitem .bitem-settings .clone', $.tmEPOAdmin.builder_clone_onClick );
			// Element change button
			$( document ).on( 'click.cpf', '.bitem .bitem-settings .change', $.tmEPOAdmin.builder_change_onClick );
			// Element plus button
			$( document ).on( 'click.cpf', '.bitem .bitem-settings .plus', $.tmEPOAdmin.builder_plus_onClick );
			// Element minus button
			$( document ).on( 'click.cpf', '.bitem .bitem-settings .minus', $.tmEPOAdmin.builder_minus_onClick );
			// Element delete button
			$( document ).on( 'click', '.bitem .delete', $.tmEPOAdmin.builder_delete_onClick );

			// EDIT panel events
			// Add options button
			$( document ).on( 'click.cpf', '.builder-panel-add', $.tmEPOAdmin.builder_panel_add_onClick );
			// Add separator button
			$( document ).on( 'click.cpf', '.builder-panel-add-separator', $.tmEPOAdmin.builder_panel_add_separator_onClick );
			// Mass add options button
			$( document ).on( 'click.cpf', '.builder-panel-mass-add', $.tmEPOAdmin.builder_panel_mass_add_onClick );
			// Populate options button
			$( document ).on( 'click.cpf', '.builder-panel-populate', $.tmEPOAdmin.builder_panel_populate_onClick );
			// Remove image
			$( document ).on( 'click.cpf', '.builder-image-delete', $.tmEPOAdmin.builder_image_delete_onClick );
			// Delete options button
			$( document ).on( 'click.cpf', '.builder_panel_delete', $.tmEPOAdmin.builder_panel_delete_onClick );
			$( '.builder_panel_delete' ).on( 'click.cpf', $.tmEPOAdmin.builder_panel_delete_onClick ); //sortable bug
			$( document ).on( 'click.cpf', '.builder_panel_delete_all', $.tmEPOAdmin.builder_panel_delete_all_onClick );
			// Move panel up
			$( document ).on( 'click.cpf', '.builder_panel_up', function() {
				var t = $( this );
				var options_wrap = t.closest( '.options-wrap' );
				var prev = options_wrap.prev();

				prev.before( options_wrap );
				$.tmEPOAdmin.panelsReorder( t.closest( '.panels_wrap' ) );
				$.tmEPOAdmin.paginattion_init( 'current' );
			} );
			// Move panel downn
			$( document ).on( 'click.cpf', '.builder_panel_down', function() {
				var t = $( this );
				var options_wrap = t.closest( '.options-wrap' );
				var next = options_wrap.next();

				next.after( options_wrap );
				$.tmEPOAdmin.panelsReorder( t.closest( '.panels_wrap' ) );
				$.tmEPOAdmin.paginattion_init( 'current' );
			} );

			// Auto generate option value
			$( document ).on( 'keyup.cpf change.cpf', '.tm_option_title', function() {
				$( this ).closest( '.options-wrap' ).find( '.tm_option_value' ).val( $( '<div/>' ).html( $( this ).val() ).text() );
			} );

			$( document ).on( 'change.cpf changechoice', '.tm_option_enabled', function() {
				var t = $( this );
				if ( t.is( ':checked' ) ) {
					t.closest( '.options-wrap' ).removeClass( 'choice-is-disabled' );
				} else {
					t.closest( '.options-wrap' ).addClass( 'choice-is-disabled' );
				}
			} );

			// Price
			$( document ).on( 'click.cpf', '.tc-element-setting-price, .tc-element-setting-sale-price, .tm_option_price, .tm_option_sale_price', function() {
				var $_html;
				var val;
				var $this = $( this );
				var pricetypeSelector;
				var checkFormula;
				var areBracketsClosed;
				var isDynnamicPrice = $this.is( '.dynamic-product-price' ) || $this.is( '.change-product-weight' );
				var isOverridePrice = $this.is( '.override-product-price' ) || $this.is( '.change-product-weight' );

				if ( $this.is( '.tc-element-setting-price, .tc-element-setting-sale-price' ) ) {
					pricetypeSelector = $( '.tm-pricetype-selector' );
				} else {
					pricetypeSelector = $this.closest( '.options-wrap' ).find( '.tm_option_price_type' );
				}

				if ( pricetypeSelector.val() === 'math' ) {
					areBracketsClosed = function( input ) {
						const stack = [];
						const quotes = [ "'", '"' ];
						var i;
						var char;
						var quoteType;
						var j;
						var lastOpened;
						for ( i = 0; i < input.length; i++ ) {
							char = input[ i ];
							if ( quotes.includes( char ) ) {
								quoteType = char;
								j = i + 1;
								while ( j < input.length && input[ j ] !== quoteType ) {
									j++;
								}
								i = j;
							} else if ( char === '[' || char === '{' ) {
								stack.push( char );
							} else if ( char === ']' || char === '}' ) {
								lastOpened = stack.pop();
								if ( ! lastOpened || ( char === ']' && lastOpened !== '[' ) || ( char === '}' && lastOpened !== '{' ) ) {
									return false;
								}
							}
						}
						return stack.length === 0;
					};
					checkFormula = function() {
						var tcmexp = window.tcmexp;
						var formula = $( '.tc-element-setting-edit-price' ).val();
						var parsed;
						var result = true;
						if ( tcmexp ) {
							parsed = formula.replace( /\{[^}]+\}|\[[^\]]+\]/g, '(0)' );
							result = tcmexp.parse( parsed );
							if ( result !== false && areBracketsClosed( formula ) ) {
								$( '.tc-element-setting-edit-price' ).removeClass( 'formula-error' ).addClass( 'formula-correct' );
							} else {
								$( '.tc-element-setting-edit-price' ).removeClass( 'formula-correct' ).addClass( 'formula-error' );
							}
						}
						return result;
					};
					val = $this.val();
					$_html = $.tmEPOAdmin.builder_floatbox_template(
						{
							id: 'tc-floatbox-content-pop',
							update: TMEPOGLOBALADMINJS.i18n_save,
							html: '<div class="tm-inner">' + '<textarea class="tc-element-setting-edit-price"></textarea>' + '<div class="tc-price-variables"></div>' + '</div>',
							title: TMEPOGLOBALADMINJS.i18n_edit_price
						},
						'tc-floatbox-edit'
					);
					$.tcFloatBox( {
						closefadeouttime: 0,
						animateOut: '',
						fps: 1,
						ismodal: false,
						refresh: 'fixed',
						width: '50%',
						height: '80%',
						top: '10%',
						left: '25%',
						classname: 'flasho tc-wrapper tc-builder-add-section-and-element',
						data: $_html,
						cancelClass: '.floatbox-edit-cancel',
						updateClass: '.floatbox-edit-update',
						updateEvent: function( inst ) {
							var formula = $( '.tc-element-setting-edit-price' ).val();
							checkFormula();
							$this.val( formula );
							inst.destroy();
						},
						unique: true
					} );

					$.tmEPOAdmin.populatePriceVariables( $( '.tc-price-variables' ), isDynnamicPrice, isOverridePrice );

					$( '.tc-element-setting-edit-price' ).val( val );

					checkFormula();

					$( '.tc-var-field' ).on( 'click.cpf', function( ev ) {
						var $txt = $( '.tc-element-setting-edit-price' );
						var textAreaTxt = $txt.val();
						var txtarea = $txt[ 0 ];
						var caretPos = txtarea.selectionStart;
						var scrollPos = txtarea.scrollTop;
						var front = textAreaTxt.substring( 0, caretPos );
						var back = textAreaTxt.substring( txtarea.selectionEnd, textAreaTxt.length );
						var txtToAdd = $( this ).attr( 'data-value' );

						ev.preventDefault();

						$txt.val( front + txtToAdd + back );
						caretPos = caretPos + txtToAdd.length;
						txtarea.selectionStart = caretPos;
						txtarea.selectionEnd = caretPos;
						$txt.trigger( ' focus' );
						txtarea.scrollTop = scrollPos;
						checkFormula();
					} );

					$( '.formula-field-mode' ).on( 'change.cpf', function() {
						var mode = $( this ).val();
						var list = $( '.tc-var-list.other .tc-var-field' );

						list.toArray().forEach( function( el ) {
							$( el ).attr( 'data-value', '{field.' + $( el ).attr( 'title' ) + '.' + mode + '}' );
						} );
					} );

					$( '.tc-element-setting-edit-price' ).on( 'input.cpf', function() {
						checkFormula();
					} );
				}
			} );

			// Upload button
			$( document ).on( 'click.cpf', '.tc-upload-button', $.tmEPOAdmin.upload );
			$( document ).on( 'change.cpf', '.changes-product-image,.tm-use-lightbox,.replacement-mode', $.tmEPOAdmin.floatbox_content_js );
			$( document ).on( 'change.cpf', '.use_url', $.tmEPOAdmin.tm_url );

			$( document ).on( 'change.cpf', '.tm-pricetype-selector', $.tmEPOAdmin.tm_pricetype_selector );
			$( document ).on( 'change.cpf', '.tm_option_price_type', $.tmEPOAdmin.tm_option_price_type );

			$( document ).on( 'change.cpf', '.dynamic-mode', $.tmEPOAdmin.dynamicMode );
			$( document ).on( 'change.cpf', '.variations-display-as', $.tmEPOAdmin.variations_display_as );
			$( document ).on( 'change.cpf', '.tm-attribute .tm-changes-product-image', $.tmEPOAdmin.variations_display_as );
			$( document ).on( 'click.cpf', '.tm-upload-button-remove', $.tmEPOAdmin.tm_upload_button_remove_onClick );

			$( document ).on( 'change.cpf', '.tm-weekday-picker', $.tmEPOAdmin.tm_weekday_picker );
			$( document ).on( 'change.cpf', '.tm-month-picker', $.tmEPOAdmin.tm_month_picker );

			$( document ).on( 'click.cpf', '.tm-tags-container .tab-header', function() {
				var $this = $( this );
				var tm_tags_container = $this.closest( '.tm-tags-container' );
				var tm_elements_container = tm_tags_container.find( '.tm-elements-container' );
				var elements = tm_elements_container.find( 'li.tm-element-button' );
				var headers = tm_tags_container.find( '.tab-header' );
				var tag_to_show = $this.attr( 'data-tm-tag' );

				headers.removeClass( 'open' ).addClass( 'closed' );
				$this.removeClass( 'closed' ).addClass( 'open' );

				if ( tag_to_show === 'all' ) {
					elements.removeClass( 'tm-hidden' );
				} else {
					elements.addClass( 'tm-hidden' );
					elements.filter( '.' + tag_to_show ).removeClass( 'tm-hidden' );
				}
			} );

			// popup editor identification
			$( document ).on( 'click.cpf', '.tm_editor_wrap', function() {
				var t = $( this ).find( 'textarea' );
				if ( t.attr( 'id' ) ) {
					window.wpActiveEditor = t.attr( 'id' );
				}
			} );

			$( document ).on( 'change.cpf', '.cpf-logic-element', $.tmEPOAdmin.cpf_logic_element_onchange );
			$( document ).on( 'change.cpf', '.cpf-logic-operator', $.tmEPOAdmin.cpf_logic_operator_onchange );

			$( document ).on( 'change.cpf', '.activate-sections-logic, .activate-element-logic', function() {
				if ( $( this ).is( ':checked' ) ) {
					$( this ).closest( '.message0x0' ).find( '.builder-logic-div' ).show();
				} else {
					$( this ).closest( '.message0x0' ).find( '.builder-logic-div' ).hide();
				}
			} );

			$( document ).on( 'dblclick.cpf', '.tm-default-radio', function() {
				$( this ).prop( 'checked', false );
			} );

			keydownEvent = function( event ) {
				if ( event.keyCode === 13 ) {
					event.preventDefault();

					$.tmEPOAdmin.force_current_edit_label = true;
					mouseupEvent();
					return false;
				}
			};

			mouseupEvent = function( e ) {
				var container = $.tmEPOAdmin.current_edit_label;
				var input;
				var sectionIndex;
				var fieldIndex;
				var edit;

				if ( ! $.tmEPOAdmin.current_edit_label ) {
					return;
				}

				// if the target of the click isn't the container...
				// ... nor a descendant of the container
				if ( $.tmEPOAdmin.force_current_edit_label === true || ( ! container.is( e.target ) && container.has( e.target ).length === 0 && ! $( e.target ).is( '.tm-internal-name' ) ) ) {
					input = container.closest( '.tm-label-desc' ).next( '.tm-label-desc-edit' ).find( '.tm-internal-name' );
					input.trigger( 'change' );

					if ( container.is( '.tm-internal-label' ) ) {
						container.html( input.val() ).removeClass( 'tm-hidden' );
					}
					if ( container.is( '.tm-element-label' ) ) {
						container.removeClass( 'tm-hidden' ).closest( '.tm-label-desc' ).find( '.tm-internal-label' ).html( input.val() );
					}

					container.closest( '.tm-label-desc' ).removeClass( 'tm-hidden' ).next( '.tm-label-desc-edit' ).addClass( 'tm-hidden' );

					if ( input.val() === '' ) {
						container.closest( '.tm-label-desc' ).removeClass( 'tc-has-value' ).addClass( 'tc-empty-value' );
						container.closest( '.tm-label-desc' ).find( '.tm-internal-label' ).html( container.closest( '.tm-label-desc' ).find( '.tm-element-label' ).html() );
						input.val( container.closest( '.tm-label-desc' ).find( '.tm-element-label' ).html() );
					} else {
						container.closest( '.tm-label-desc' ).removeClass( 'tc-empty-value' ).addClass( 'tc-has-value' );
					}
					sectionIndex = input.closest( '.builder-wrapper' ).index();
					fieldIndex = $.tmEPOAdmin.find_index( TCBUILDER[ sectionIndex ].section.is_slider, input.closest( '.bitem' ) );
					edit = input.closest( '.tm-label-desc-edit' );
					if ( edit.is( '.tm-for-bitem' ) ) {
						$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'internal_name', input.val(), true );
					} else if ( edit.is( '.tm-for-section' ) ) {
						TCBUILDER[ sectionIndex ].section.sections_internal_name.default = input.val();
						TCBUILDER[ sectionIndex ].sections_internal_name = input.val();
					}

					input.remove();
					$.tmEPOAdmin.current_edit_label = false;
					$.tmEPOAdmin.force_current_edit_label = false;

					$( document ).off( 'mouseup', mouseupEvent );
					$( document ).off( 'keydown', keydownEvent );
				}
			};

			$( document ).on( 'click', '.tm-element-label,.tm-internal-label', function() {
				var t = $( this );
				var edit;
				var input;
				var value;
				var sectionIndex;
				var fieldIndex;

				$.tmEPOAdmin.current_edit_label = t;
				edit = t.addClass( 'tm-hidden' ).closest( '.tm-label-desc' ).addClass( 'tm-hidden' ).next( '.tm-label-desc-edit' ).removeClass( 'tm-hidden' );
				sectionIndex = t.closest( '.builder-wrapper' ).index();
				fieldIndex = $.tmEPOAdmin.find_index( TCBUILDER[ sectionIndex ].section.is_slider, t.closest( '.bitem' ) );
				if ( edit.is( '.tm-for-bitem' ) ) {
					input = edit.attr( 'data-element' );
					value = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'internal_name', true );
				} else if ( edit.is( '.tm-for-section' ) ) {
					input = 'sections';
					value = TCBUILDER[ sectionIndex ].section.sections_internal_name.default;
				}

				input = input + '_internal_name';
				input = $( "<input type='text' value='" + value.replace( /'/g, '&#39;' ) + "' name='tm_meta[tmfbuilder][" + input + "][]' class='t tm-internal-name'>" );

				edit.append( input );
				input.trigger( ' focus' );
				$( document ).on( 'mouseup', mouseupEvent );
				$( document ).on( 'keydown', keydownEvent );
			} );

			$( document ).on( 'click.cpf', '.cpf-add-rule', $.tmEPOAdmin.cpf_add_rule );
			$( document ).on( 'click.cpf', '.cpf-delete-rule', $.tmEPOAdmin.cpf_delete_rule );
			$( document ).on( 'click.cpf', '.tm-logic-add-rule-set', $.tmEPOAdmin.cpf_add_rule_set );

			// Variation attribute terms fold button
			$( document ).on( 'click.cpf', '.tma-handle-wrap .tma-handle', $.tmEPOAdmin.builder_fold_onClick );

			$( document ).on( 'keyup change', '#tc-floatbox-content .n[type=text]', function() {
				var $this = $( this );
				var value = $this.val();
				var regex;
				var newvalue;
				var offset;

				if ( woocommerceAdmin && value !== newvalue ) {
					regex = new RegExp( '[^-0-9%.\\' + woocommerceAdmin.mon_decimal_point + ']+', 'gi' );
					newvalue = value.replace( regex, '' );
					$this.val( newvalue );
					if ( $this.parent().find( '.wc_error_tip' ).length === 0 ) {
						offset = $this.position();
						$this.after( '<div class="wc_error_tip">' + woocommerceAdmin.i18n_mon_decimal_error + '</div>' );
						$( '.wc_error_tip' )
							.css( 'left', offset.left + $this.width() - ( $this.width() / 2 ) - ( $( '.wc_error_tip' ).width() / 2 ) )
							.css( 'top', offset.top + $this.height() )
							.fadeIn( '100' );
					}
				}

				return this;
			} );

			$( document ).on( 'click', '.tc-enable-responsive', function() {
				var $this = $( this );
				var on = $this.find( '.on' );
				var off = $this.find( '.off' );
				var divs = $( '#tc-floatbox-content' ).find( '.builder_responsive_div' );

				if ( $this.is( '.active' ) ) {
					$this.removeClass( 'active' );
					on.addClass( 'tc-hidden' );
					off.removeClass( 'tc-hidden' );
					divs.addClass( 'tc-hidden' );
				} else {
					$this.addClass( 'active' );
					on.removeClass( 'tc-hidden' );
					off.addClass( 'tc-hidden' );
					divs.removeClass( 'tc-hidden' );
				}
			} );

			$( document ).on( 'change.cpf', '.product-mode', function() {
				var $temp_for_floatbox_insert = $( '#tc-floatbox-content' );
				var mode = $( this ).val();
				var productDefaultValue = $( '.product-default-value-search' );
				var productProductsSelector = $( '.product-products-selector' );

				if ( mode === 'product' ) {
					mode = 'products';
					if ( productProductsSelector.is( '.enhanced' ) && productProductsSelector.prop( 'multiple' ) ) {
						productProductsSelector.selectWoo( 'destroy' ).removeClass( 'enhanced' );
						productProductsSelector.prop( 'multiple', false );
						$.tmEPOAdmin.create_products_search( $temp_for_floatbox_insert );
					}
					productProductsSelector.prop( 'multiple', false );
				} else if ( mode === 'products' ) {
					if ( productProductsSelector.is( '.enhanced' ) && ! productProductsSelector.prop( 'multiple' ) ) {
						productProductsSelector.selectWoo( 'destroy' ).removeClass( 'enhanced' );
						productProductsSelector.prop( 'multiple', true );
						$.tmEPOAdmin.create_products_search( $temp_for_floatbox_insert );
					}
					productProductsSelector.prop( 'multiple', true );
				}
				if ( productDefaultValue.is( '.enhanced' ) ) {
					productDefaultValue.selectWoo( 'destroy' ).removeClass( 'enhanced' );
					if ( mode === 'products' ) {
						productDefaultValue.removeData( 'action' );
						productDefaultValue.addClass( 'enhanced-dropdown' );
						productProductsSelector.triggerHandler( 'change.cpf' );
						$.tmEPOAdmin.create_enhanced_dropdown( $temp_for_floatbox_insert );
					} else {
						productDefaultValue.data( 'action', 'wc_epo_search_products_in_categories' );
						productDefaultValue.addClass( 'wc-product-search' );
						$.tmEPOAdmin.create_products_search( $temp_for_floatbox_insert );
					}
				}
				$( '.product-' + mode + '-selector' ).trigger( 'change.cpf' );
			} );

			$( document ).on( 'change.cpf', '.product-default-value-search', function() {
				var $this = $( this );
				var productId = $this.val();
				var mode = $( '.product-mode' );
				var catArray;
				var data = {
					action: 'wc_epo_get_product_categories',
					product_id: productId,
					security: TMEPOGLOBALADMINJS.get_products_categories_nonce
				};
				var valid;

				if ( ! productId ) {
					return;
				}

				$.post( TMEPOGLOBALADMINJS.ajax_url, data, function( response ) {
					$this.data( 'categoryIds', 'success' === response.result ? response.category_ids : [] );

					if ( ! $this.data( 'categoryIds' ) ) {
						return;
					}

					if ( mode.val() === 'categories' && productId !== $this.attr( 'data-current-selected' ) ) {
						catArray = $( '.product-categories-selector' )
							.find( ':selected' )
							.toArray()
							.map( function( x ) {
								return parseInt( $( x ).val(), 10 );
							} );
						valid = false;
						$.each( $this.data( 'categoryIds' ), function( i, id ) {
							if ( $.inArray( parseInt( id, 10 ), catArray ) !== -1 ) {
								valid = true;
								return false;
							}
						} );
						if ( ! valid ) {
							$this.find( 'option' ).remove();
							this.removeAttr( 'data-current-selected' );
							this.removeData( 'current-selected-text' );
							this.removeData( 'categoryIds' );
							this.removeData( 'include' );
						} else {
							$this.attr( 'data-current-selected', productId );
							$this.data( 'current-selected-text', $this.find( ':selected' ).text() );
						}
					} else {
						$this.attr( 'data-current-selected', productId );
						$this.data( 'current-selected-text', $this.find( ':selected' ).text() );
					}
				} );
			} );

			$( document ).on( 'change.cpf', '.product-products-selector', function() {
				var element = $( this );
				var productDefaultValue = $( '.product-default-value-search' );
				var temp = element.find( ':selected' ).clone().prop( 'selected', false ).removeAttr( 'data-select2-id' );

				productDefaultValue.removeData( 'action' );
				productDefaultValue.find( 'option' ).remove();
				productDefaultValue.append( temp );
				productDefaultValue.val( productDefaultValue.attr( 'data-current-selected' ) ).trigger( 'change.cpf' );
			} );

			$( document ).on( 'change.cpf', '.product-categories-selector', function() {
				var element = $( this );
				var catArray = element
					.find( ':selected' )
					.toArray()
					.map( function( x ) {
						return parseInt( $( x ).val(), 10 );
					} );
				var productDefaultValue = $( '.product-default-value-search' );
				var valid;

				productDefaultValue.data( 'include', catArray );
				productDefaultValue.data( 'action', 'wc_epo_search_products_in_categories' );

				if ( productDefaultValue.data( 'categoryIds' ) ) {
					valid = false;
					$.each( productDefaultValue.data( 'categoryIds' ), function( i, id ) {
						if ( $.inArray( parseInt( id, 10 ), catArray ) !== -1 ) {
							valid = true;
							return false;
						}
					} );
					if ( ! valid ) {
						productDefaultValue.find( 'option' ).remove();
						productDefaultValue.removeAttr( 'data-current-selected' );
						productDefaultValue.removeData( 'current-selected-text' );
						productDefaultValue.removeData( 'categoryIds' );
					}
				}
			} );

			if ( $().ajaxChosen ) {
				$( 'select.ajax_chosen_select_tmProductIds' ).ajaxChosen(
					{
						method: 'GET',
						url: TMEPOGLOBALADMINJS.ajax_url,
						dataType: 'json',
						afterTypeDelay: 100,
						data: {
							action: 'woocommerce_json_search_products',
							security: TMEPOGLOBALADMINJS.search_products_nonce
						}
					},
					function( data ) {
						var terms = {};

						$.each( data, function( i, val ) {
							terms[ i ] = val;
						} );

						return terms;
					}
				);
			}

			$( 'body' ).on( 'woocommerce-product-type-change', function() {
				var productType = $( '#product-type' );
				var variationElement;

				$.tmEPOAdmin.initSectionsCheck();

				if ( productType.length ) {
					if ( ! ( productType.val() === 'variable' || productType.val() === 'variable-subscription' ) ) {
						variationElement = $( '.builder-layout .element-variations' );
						if ( variationElement.length ) {
							variationElement.closest( '.builder-wrapper' ).remove();
							$.tmEPOAdmin.builder_reorder_multiple();
							$.tmEPOAdmin.section_logic_init();
							$.tmEPOAdmin.initSectionsCheck();
							$.tmEPOAdmin.toggleVariationButton();
							$.tmEPOAdmin.var_remove( 'tm-style-variation-added' );
						}
					}
					$.tmEPOAdmin.toggleVariationButton();
				}
			} );

			$( document ).on(
				'change.cpf',
				'.apply-mode, .product_page_tm-global-epo #product_catdiv input:checkbox, .product_page_tm-global-epo #tm_product_ids, .product_page_tm-global-epo #tc-enabled-options, .product_page_tm-global-epo #tc-disabled-options',
				function() {
					setTimeout( function() {
						$.tmEPOAdmin.checkIfApplied();
					}, 100 );
				}
			);

			$( document ).on(
				'change.cpf',
				'.apply-mode',
				function() {
					$.tmEPOAdmin.applyMode( $( this ) );
				}
			);

			$( '#product_catchecklist input[type="checkbox"]' ).on( 'change', function() {
				$.tmEPOAdmin.checkboxStates[ this.id ] = $( this ).prop( 'checked' );
				setTimeout( function() {
					$.tmEPOAdmin.applyMode( $( '.apply-mode:checked' ) );
				}, 100 );
			} );

			if ( tagchecklist.length ) {
				tagchecklist.toArray().forEach( function( list ) {
					var observer;
					observer = new MutationObserver( function() {
						$.tmEPOAdmin.checkIfApplied();
					} );
					observer.observe( list, { attributes: true, childList: true, subtree: true } );
				} );
			}
			$.tmEPOAdmin.addEventsDone = 1;
		},

		initialitize: function() {
			$.tmEPOAdmin.setGlobalVariationObject( 'initialitize_on' );
		},

		initialitize_on: function() {
			$.tmEPOAdmin.isinit = true;
			$.tmEPOAdmin.pre_element_logic_init_obj = {};
			$.tmEPOAdmin.pre_element_logic_init_obj_options = {};

			$.tmEPOAdmin.pre_element_logic_init( true );
			$.tmEPOAdmin.pre_element_logic_init_done = true;

			$.tmEPOAdmin.is_original = TMEPOGLOBALADMINJS.is_original_post;
			$.tmEPOAdmin.current_edit_label = false;
			$.tmEPOAdmin.force_current_edit_label = false;

			$.tmEPOAdmin.toggleVariationButton();

			$.tmEPOAdmin.addEvents();

			// Check section logic
			$.tmEPOAdmin.check_section_logic();
			// Check element logic
			$.tmEPOAdmin.check_element_logic();
			// Start logic
			$.tmEPOAdmin.sectionLogicStart();
			$.tmEPOAdmin.elementLogicStart();

			$( '.builder-wrapper.tm-slider-wizard' ).each( function() {
				var bw = $( this );
				$.tmEPOAdmin.createSlider( bw );
			} );

			$( '#side-sortables' ).prepend( $( '<div class="tc-info-box hidden"></div>' ) );

			$( function() {
				$.tmEPOAdmin.checkIfApplied();
				$.tmEPOAdmin.applyModeInit();
				$.tmEPOAdmin.checkboxStates = {};
				$( '#product_catchecklist input[type="checkbox"]' ).each( function() {
					$.tmEPOAdmin.checkboxStates[ this.id ] = $( this ).prop( 'checked' );
				} );
			} );

			$.tmEPOAdmin.initSectionsCheck();

			$.tmEPOAdmin.fixFormSubmit();

			$.tmEPOAdmin.pre_element_logic_init_done = false;
			$.tmEPOAdmin.isinit = false;
			$( '.builder-layout' ).removeClass( 'tm-hidden' );
			$.tmEPOAdmin.makeResizables( $( '.builder-wrapper' ) );
			$.tmEPOAdmin.makeResizables( $( '.bitem' ) );
		},

		initialitize_on_after: function() {
			$.tmEPOAdmin.isinit = true;
			$.tmEPOAdmin.pre_element_logic_init_obj = {};
			$.tmEPOAdmin.pre_element_logic_init_obj_options = {};

			$.tmEPOAdmin.pre_element_logic_init( true );
			$.tmEPOAdmin.pre_element_logic_init_done = true;

			$.tmEPOAdmin.is_original = TMEPOGLOBALADMINJS.is_original_post;
			$.tmEPOAdmin.current_edit_label = false;
			$.tmEPOAdmin.force_current_edit_label = false;

			$.tmEPOAdmin.var_remove( 'tm-style-variation-added' );
			$.tmEPOAdmin.toggleVariationButton();

			$.tmEPOAdmin.addSortables();

			// Check section logic
			$.tmEPOAdmin.check_section_logic();
			// Check element logic
			$.tmEPOAdmin.check_element_logic();
			// Start logic
			$.tmEPOAdmin.sectionLogicStart();
			$.tmEPOAdmin.elementLogicStart();

			$( '.builder-wrapper.tm-slider-wizard' ).each( function() {
				var bw = $( this );
				$.tmEPOAdmin.createSlider( bw );
			} );

			$.tmEPOAdmin.initSectionsCheck();

			$.tmEPOAdmin.fixFormSubmit();

			$.tmEPOAdmin.makeResizables( $( '.builder-wrapper' ) );
			$.tmEPOAdmin.makeResizables( $( '.bitem' ) );

			$.tmEPOAdmin.pre_element_logic_init_done = false;
			$.tmEPOAdmin.isinit = false;
		},

		makeResizables: function( obj ) {
			var keys = Object.keys( $.tmEPOAdmin.builderSize );
			var widthStops = [];
			var startLimit;
			var builderLayout;

			obj = $( obj );
			if ( obj.length === 0 ) {
				return;
			}

			builderLayout = obj.closest( '.builder-layout' );

			if ( builderLayout.is( '.builder-template' ) ) {
				return;
			}

			keys.forEach( function( i ) {
				widthStops.push( parseFloat( $.tmEPOAdmin.builderSize[ i ].replace( '%', '' ), 10 ) );
			} );

			obj.not( '.tma-nomove' )
				.toArray()
				.forEach( function( el ) {
					var bitemContainer;
					el = $( el );
					if ( el.is( '.bitem' ) ) {
						bitemContainer = el.closest( '.bitem-wrapper' ).first();
					} else {
						bitemContainer = el.closest( '.builder-layout' );
					}

					if ( el.is( '.ui-resizable' ) ) {
						el.resizable().resizable( 'destroy' );
					}
					el.resizable( {
						maxWidth: bitemContainer.width(),
						minWidth: bitemContainer.width() / 8,
						start: function( event, ui ) {
							ui.originalElement.addClass( 'tm-label-info-hidden' );
							startLimit = parseFloat(
								$.tmEPOAdmin.builderSize[
									ui.originalElement
										.attr( 'class' )
										.split( ' ' )
										.filter( function( x ) {
											return x.indexOf( 'w' ) === 0;
										} )[ 0 ]
								].replace( '%', '' ),
								10
							);
						},
						stop: function( event, ui ) {
							var percentage = ( 100 * ui.size.width ) / bitemContainer.width();
							var limit1 = widthStops.filter( function( x ) {
								return x <= percentage;
							} );
							var limit2 = widthStops.filter( function( x ) {
								return x >= percentage;
							} );
							var half;
							var bitem = ui.originalElement;
							var currentSize;
							var size;
							var text;
							var sectionIndex;
							var fieldIndex;

							bitem.removeClass( 'ui-highlight tm-label-info-hidden' );

							limit1 = limit1[ limit1.length - 1 ];
							limit2 = limit2[ 0 ];
							if ( limit2 === undefined ) {
								limit2 = widthStops[ widthStops.length - 1 ];
							}

							if ( limit1 === undefined ) {
								if ( startLimit >= limit2 ) {
									limit1 = widthStops[ widthStops.length - 1 ];
								} else {
									limit1 = widthStops[ 1 ];
								}
							}

							half = ( limit2 - limit1 ) / 2;

							if ( percentage - limit1 > half ) {
								size = 'w' + limit2.toString().replace( '.', '-' );
								bitem.css( 'width', limit2 + '%' );
							} else {
								size = 'w' + limit1.toString().replace( '.', '-' );
								bitem.css( 'width', limit1 + '%' );
							}

							currentSize = bitem
								.attr( 'class' )
								.split( ' ' )
								.filter( function( x ) {
									return x.indexOf( 'w' ) === 0;
								} )[ 0 ];
							text = $.tmEPOAdmin.builderSize[ size ];

							if ( size !== currentSize ) {
								bitem.removeClass( String( currentSize ) );
								bitem.addClass( String( size ) );
								if ( el.is( '.bitem' ) ) {
									bitem.find( '.bitem-inner .size' ).text( text );
								} else {
									bitem.find( '.section-inner .size' ).text( text );
								}
								sectionIndex = bitem.closest( '.builder-wrapper' ).index();
								fieldIndex = $.tmEPOAdmin.find_index( TCBUILDER[ sectionIndex ].section.is_slider, bitem );
								if ( el.is( '.bitem' ) ) {
									$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'div_size', size );
								} else {
									TCBUILDER[ sectionIndex ].section.sections_size.default = size;
									TCBUILDER[ sectionIndex ].size = text;
								}
							}

							if ( el.is( '.builder-wrapper' ) ) {
								$.tmEPOAdmin.makeResizables( el.find( '.bitem' ) );
							}
							if ( bitem.is( '.bitem' ) ) {
								bitem.find( '.bitem-settings' ).removeClass( 'show' );
							} else {
								bitem.find( '.section-settings' ).removeClass( 'show' );
							}
						},
						resize: function( event, ui ) {
							var percentage = ( 100 * ui.size.width ) / bitemContainer.width();
							var limit1 = widthStops.filter( function( x ) {
								return x <= percentage;
							} );
							var bitem = ui.originalElement;

							limit1 = limit1[ limit1.length - 1 ];
							if ( limit1 === undefined ) {
								limit1 = widthStops[ widthStops.length - 1 ];
							}

							bitem.addClass( 'ui-highlight' );

							if ( bitem.is( '.bitem' ) ) {
								bitem.find( '.bitem-settings' ).addClass( 'show' ).find( '.bitem-setting.size' ).html( limit1 + '%' );
							} else {
								bitem.find( '.section-settings' ).addClass( 'show' ).find( '.section-setting.size' ).html( limit1 + '%' );
							}

							ui.size.height = ui.originalSize.height;
						}
					} );
				} );
		},

		cpf_logic_element_onchange: function( e, ison ) {
			var $this = $( this );
			var logic;
			var element;
			var section;
			var type;
			var cpfLogicValue;
			var select;
			var selectoperator;
			var value;
			var hideValues;
			var hideValuesSection;
			var disabledClass = 'tc-hidden-no-events';

			if ( e instanceof $ ) {
				$this = e;
			}
			if ( ison === undefined ) {
				ison = $( this ).closest( '.section_elements, .builder-wrapper, .bitem, .builder-element-wrap' );
				if ( ison.is( '.section_elements' ) || ison.is( '.builder-wrapper' ) ) {
					ison = false;
				} else {
					ison = true;
				}
			}

			if ( ! ison ) {
				logic = $.tmEPOAdmin.sectionLogicObject;
			} else if ( 2 === ison ) {
				logic = $.tmEPOAdmin.elementShippingLogicObject;
			} else {
				logic = $.tmEPOAdmin.elementLogicObject;
			}

			element = $this.val();
			section = $this.children( 'option:selected' ).attr( 'data-section' );
			type = $this.children( 'option:selected' ).attr( 'data-type' );
			cpfLogicValue = logic;

			if ( cpfLogicValue[ section ] !== undefined ) {
				cpfLogicValue = logic[ section ].values;
				if ( cpfLogicValue[ element ] !== undefined ) {
					cpfLogicValue = logic[ section ].values[ element ];
				} else {
					cpfLogicValue = false;
				}
			} else {
				cpfLogicValue = false;
			}

			select = $this.closest( '.tm-logic-rule' ).find( '.tm-logic-value' );
			selectoperator = $this.closest( '.tm-logic-rule' ).find( '.cpf-logic-operator' );
			value = selectoperator.val();
			hideValues = [ 'startswith', 'endswith', 'greaterthan', 'lessthan', 'greaterthanequal', 'lessthanequal' ];
			hideValuesSection = hideValues.concat( 'is', 'isnot' );

			if ( cpfLogicValue ) {
				cpfLogicValue = $( cpfLogicValue );

				select.empty().append( cpfLogicValue );

				selectoperator.children().filter( function( a, b ) {
					return -1 !== $.inArray( $( b ).val(), [ 'is', 'isnot' ] );
				} ).removeClass( disabledClass );

				if ( type === 'variation' || type === 'multiple' ) {
					if ( -1 !== $.inArray( value, hideValues ) ) {
						selectoperator.val( 'isempty' );
					}
					selectoperator.children().filter( function( a, b ) {
						return -1 !== $.inArray( $( b ).val(), hideValues );
					} ).addClass( disabledClass );
					selectoperator.trigger( 'change.cpf' );
				} else {
					selectoperator.children().filter( function( a, b ) {
						return -1 !== $.inArray( $( b ).val(), hideValues );
					} ).removeClass( disabledClass );
				}
			} else if ( element === section ) {
				if ( -1 !== $.inArray( value, hideValuesSection ) ) {
					selectoperator.val( 'isempty' );
				}
				selectoperator.children().filter( function( a, b ) {
					return -1 !== $.inArray( $( b ).val(), hideValuesSection );
				} ).addClass( disabledClass );
				selectoperator.trigger( 'change.cpf' );
			} else {
				selectoperator.children().filter( function( a, b ) {
					return -1 !== $.inArray( $( b ).val(), hideValuesSection );
				} ).removeClass( disabledClass );
			}
		},

		cpf_logic_operator_onchange: function( e ) {
			var $this = $( this );
			var value;
			var select;

			if ( e instanceof $ ) {
				$this = e;
			}

			value = $this.val();
			select = $this.closest( '.tm-logic-rule' ).find( '.tm-logic-value' );

			if ( value === 'isempty' || value === 'isnotempty' ) {
				select.hide();
			} else {
				select.show();
			}
		},

		createSlider: function( bw ) {
			bw.tmtabs( {
				headers: 'tm-slider-wizard-headers',
				header: 'tm-slider-wizard-header',
				selectedtab: 0,
				showonhover: function() {
					return $.tmEPOAdmin.isElementDragged;
				},
				useclasstohide: true,

				afteraddtab: function( h, t ) {
					var slides;
					var tabs;
					var bwindex = bw.index();
					$.tmEPOAdmin.builder_items_sortable( t );

					if ( ! bw.is( '.tm-slider-wizard' ) ) {
						slides = '';
						tabs = [];
						tabs.push( $( h ).text() );
					} else {
						slides = bw
							.find( '.bitem-wrapper' )
							.map( function( i, e ) {
								return $( e ).children( '.bitem' ).not( '.pl2' ).length;
							} )
							.get()
							.join( ',' );

						tabs = TCBUILDER[ bwindex ].section.sections_tabs_labels.default || 'null';
						tabs = $.epoAPI.util.parseJSON( tabs );
						if ( ! tabs ) {
							tabs = [];
						}
						tabs.push( $( h ).text() );
						tabs = JSON.stringify( tabs );
					}
					TCBUILDER[ bwindex ].section.sections_slides.default = slides;
					TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;
				},

				deletebutton: true,
				deleteconfirm: true,
				beforedeletetab: function( $header, $tab ) {
					var bwindex = bw.index();
					var length = $tab.find( '.bitem' ).length;
					var index = $.tmEPOAdmin.find_index( true, $tab.find( '.bitem' ).first() );
					var tabs;

					$.tmEPOAdmin.sliderTabDeleteBefore = [];
					$tab.find( '.bitem' ).toArray().forEach( function( el ) {
						$.tmEPOAdmin.sliderTabDeleteBefore.push( {
							field_index: $.tmEPOAdmin.find_index( true, $( el ) ),
							disabledFieldIndex: $.tmEPOAdmin.find_index( true, $( el ), '.bitem', '.element-is-disabled' )
						} );
					} );

					TCBUILDER[ bwindex ].fields.splice( index, length );
					TCBUILDER[ bwindex ].section.sections.default = parseInt( TCBUILDER[ bwindex ].section.sections.default, 10 ) - length;
					TCBUILDER[ bwindex ].section.sections.default = TCBUILDER[ bwindex ].section.sections.default.toString();
					tabs = TCBUILDER[ bwindex ].section.sections_tabs_labels.default || 'null';
					tabs = $.epoAPI.util.parseJSON( tabs );
					if ( ! tabs ) {
						tabs = [];
					}
					index = $header.closest( '.tm-box' ).index();
					tabs.splice( index, 1 );
					tabs = JSON.stringify( tabs );
					TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;
				},
				afterdeletetab: function() {
					var slides;
					var bwindex = bw.index();
					var tabs;
					var disabledElements = 0;
					if ( ! bw.is( '.tm-slider-wizard' ) ) {
						slides = '';
					} else {
						slides = bw
							.find( '.bitem-wrapper' )
							.map( function( i, e ) {
								return $( e ).children( '.bitem' ).not( '.pl2' ).length;
							} )
							.get()
							.join( ',' );
					}
					if ( bw.is( '.is-slider' ) ) {
						tabs = [];
						bw.find( '.tm-slider-wizard-header' ).toArray().forEach( function( el ) {
							$( el ).find( '.tab-text' ).html( $( el ).closest( '.tm-box' ).index() + 1 );
						} );
						tabs = JSON.stringify( tabs );
						TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;
					}
					TCBUILDER[ bwindex ].section.sections_slides.default = slides;

					$.tmEPOAdmin.sliderTabDeleteBefore.forEach( function( el, i ) {
						$.tmEPOAdmin.builderItemsSortableObj.start.section = TCBUILDER[ bwindex ].section.sections_uniqid.default;
						$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = bwindex.toString();
						$.tmEPOAdmin.builderItemsSortableObj.start.element = $.tmEPOAdmin.sliderTabDeleteBefore[ i ].disabledFieldIndex === -1 ? '-1' : parseInt( $.tmEPOAdmin.sliderTabDeleteBefore[ i ].disabledFieldIndex, 10 ) - i + disabledElements;
						if ( $.tmEPOAdmin.sliderTabDeleteBefore[ i ].disabledFieldIndex === -1 ) {
							$.tmEPOAdmin.builderItemsSortableObj.start.disabled = true;
							$.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex = -1;
							disabledElements = disabledElements + 1;
						}

						$.tmEPOAdmin.builderItemsSortableObj.end.section = 'delete';
						$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = 'delete';
						$.tmEPOAdmin.builderItemsSortableObj.end.element = 'delete';
						$.tmEPOAdmin.builderItemsSortableObj.end.novalidate = 'delete';

						$.tmEPOAdmin.logic_reindex();
					} );
					$.tmEPOAdmin.builder_reorder_multiple();
					$.tmEPOAdmin.section_logic_init();
					$.tmEPOAdmin.initSectionsCheck();
				},

				aftermovetab: function( newIndex, oldIndex ) {
					var bwindex = bw.index();
					var tabs;
					var element;

					TCBUILDER[ bwindex ].section.sections_slides.default = $( '.builder-wrapper' ).eq( bwindex )
						.find( '.bitem-wrapper' )
						.map( function( i, e ) {
							return $( e ).children( '.bitem' ).not( '.pl2' ).length;
						} )
						.get()
						.join( ',' );

					tabs = TCBUILDER[ bwindex ].section.sections_tabs_labels.default || 'null';
					tabs = $.epoAPI.util.parseJSON( tabs );
					if ( ! tabs ) {
						tabs = [];
					}
					element = tabs.splice( oldIndex, 1 )[ 0 ];
					tabs.splice( newIndex, 0, element );
					tabs = JSON.stringify( tabs );
					TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;

					$.tmEPOAdmin.section_logic_init();
					$.tmEPOAdmin.initSectionsCheck();

					if ( bw.is( '.is-slider' ) ) {
						tabs = [];
						bw.find( '.tm-slider-wizard-header' ).toArray().forEach( function( el ) {
							var currentIndex = $( el ).closest( '.tm-box' ).index() + 1;
							$( el ).find( '.tab-text' ).html( currentIndex );
							tabs.push( currentIndex );
						} );
						tabs = JSON.stringify( tabs );
						TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;
					}
				},

				beforemovebitem: function( newIndex, oldIndex, $tab, initialIndex, el ) {
					var bwindex = bw.index();
					$.tmEPOAdmin.builderItemsSortableObj.start.section = TCBUILDER[ bwindex ].section.sections_uniqid.default;
					$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = bwindex.toString();
					$.tmEPOAdmin.builderItemsSortableObj.start.element = $.tmEPOAdmin.find_index( true, el ).toString();
					$.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex = $.tmEPOAdmin.find_index( true, el, '.bitem', '.element-is-disabled' );
				},
				aftermovebitem: function( newIndex, oldIndex, $tab, initialIndex, el ) {
					var bwindex = bw.index();
					var field_index = $.tmEPOAdmin.find_index( true, el );

					$.tmEPOAdmin.builderItemsSortableObj.end.section = TCBUILDER[ bwindex ].section.sections_uniqid.default;
					$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = bwindex.toString();
					$.tmEPOAdmin.builderItemsSortableObj.end.element = $.tmEPOAdmin.find_index( true, el ).toString();
					$.tmEPOAdmin.builderItemsSortableObj.end.disabledFieldIndex = $.tmEPOAdmin.find_index( true, el, '.bitem', '.element-is-disabled' );

					TCBUILDER[ bwindex ].fields.splice( field_index, 0, TCBUILDER[ $.tmEPOAdmin.builderItemsSortableObj.start.section_eq ].fields.splice( $.tmEPOAdmin.builderItemsSortableObj.start.element, 1 )[ 0 ] );

					$.tmEPOAdmin.builder_reorder_multiple();
					$.tmEPOAdmin.logic_reindex();
				},

				editbutton: bw.is( '.is-tabs' ),
				oneditbutton: function( $editbutton ) {
					var bwindex = bw.index();
					var tabs = TCBUILDER[ bwindex ].section.sections_tabs_labels.default || 'null';
					var tabIndex = $editbutton.closest( '.tm-box' ).index();
					var $_html = $.tmEPOAdmin.builder_floatbox_template(
						{
							id: 'tc-floatbox-content-pop',
							update: TMEPOGLOBALADMINJS.i18n_save,
							html: '<div class="tm-inner"><input type="text" class="tc-element-setting-edit-tab"></div>',
							title: TMEPOGLOBALADMINJS.i18n_edit_tab
						},
						'tc-floatbox-edit'
					);
					var thisPopup = $.tcFloatBox( {
						closefadeouttime: 0,
						animateOut: '',
						fps: 1,
						ismodal: false,
						refresh: 'fixed',
						width: '50%',
						top: '25%',
						left: '25%',
						classname: 'flasho tc-wrapper',
						data: $_html,
						cancelClass: '.floatbox-edit-cancel',
						unique: true
					} );
					var ithis = this;

					tabs = $.epoAPI.util.parseJSON( tabs );
					if ( ! tabs ) {
						tabs = [];
					}

					$( '.tc-element-setting-edit-tab' ).val( tabs[ tabIndex ] );

					$( '.floatbox-edit-update' ).on( 'click.cpf', function( ev ) {
						ev.preventDefault();

						tabs[ tabIndex ] = $( '.tc-element-setting-edit-tab' ).val();
						$editbutton.closest( '.tm-slider-wizard-header' ).find( '.tab-text' ).html( tabs[ tabIndex ] );
						tabs = JSON.stringify( tabs );
						TCBUILDER[ bwindex ].section.sections_tabs_labels.default = tabs;
						thisPopup.destroy();
						ithis.trigger( 'refresh' );
					} );
				},

				addbutton: $.tmEPOAdmin.is_original ? true : false
			} );

			TCBUILDER[ bw.index() ].section.is_slider = true;
		},

		sections_type_onChange: function( sectionIndex ) {
			var bitem_wrapper;
			var style = TCBUILDER[ sectionIndex ].section.sections_type.default;
			var tab1;
			var add;
			var builderWrapper = $( '.builder-wrapper' ).eq( sectionIndex );
			var btitle;

			if ( ( style === 'slider' || style === 'tabs' ) && builderWrapper.hasClass( 'tm-slider-wizard' ) ) {
				if ( builderWrapper.is( '.is-slider' ) && style === 'tabs' ) {
					add = [];
					builderWrapper.find( '.tm-slider-wizard-header' ).toArray().forEach( function( el ) {
						var $el = $( el );
						var $tabtext = $el.find( '.tab-text' );
						if ( $tabtext.data( 'tabtext' ) !== undefined ) {
							$tabtext.html( $tabtext.data( 'tabtext' ) );
						}
						add.push( $tabtext.text() );
					} );
					add = JSON.stringify( add );
					builderWrapper.removeClass( 'is-slider' ).addClass( 'is-tabs' ).tcTabs( 'set', { editbutton: true } );
					TCBUILDER[ sectionIndex ].section.sections_tabs_labels.default = add;
				} else if ( builderWrapper.is( '.is-tabs' ) && style === 'slider' ) {
					builderWrapper.removeClass( 'is-tabs has-add-button' ).addClass( 'is-slider' ).tcTabs( 'set', { editbutton: false } );
					builderWrapper.find( '.tm-slider-wizard-header' ).toArray().forEach( function( el ) {
						var $el = $( el );
						var $tabtext = $el.find( '.tab-text' );
						var $tmbox = $el.closest( '.tm-box' );
						var index = $tmbox.index() + 1;
						$tabtext.data( 'tabtext', $tabtext.text() );
						$tabtext.html( index );
					} );
					TCBUILDER[ sectionIndex ].section.sections_tabs_labels.default = '';
				}
			} else if ( ( style === 'slider' || style === 'tabs' ) && ! builderWrapper.hasClass( 'tm-slider-wizard' ) ) {
				bitem_wrapper = builderWrapper.find( '.bitem-wrapper' );
				btitle = builderWrapper.find( '.btitle' );

				builderWrapper.addClass( 'tm-slider-wizard is-' + style );
				tab1 = '<div class="tm-box"><h4 class="tm-slider-wizard-header" data-id="tc-tab-slide0"><span class="tab-text">1</span></h4></div>';
				btitle.after( '<div class="transition tm-slider-wizard-headers">' + tab1 + '</div>' );
				bitem_wrapper.addClass( 'tc-tab-slide tc-tab-slide0' );

				$.tmEPOAdmin.createSlider( builderWrapper );

				TCBUILDER[ sectionIndex ].section.sections_slides.default = builderWrapper
					.find( '.bitem-wrapper' )
					.map( function( i, e ) {
						return $( e ).children( '.bitem' ).not( '.pl2' ).length;
					} )
					.get()
					.join( ',' );

				TCBUILDER[ sectionIndex ].section.is_slider = true;
				TCBUILDER[ sectionIndex ].section.sections_tabs_labels.default = JSON.stringify( [ '1' ] );
			} else if ( ( style !== 'slider' && style !== 'tabs' ) && builderWrapper.hasClass( 'tm-slider-wizard' ) ) {
				builderWrapper.find( '.bitem-wrapper' ).wrapAll( '<div class="tmtemp"></div>' );
				builderWrapper.find( '.bitem-wrapper .bitem' ).appendTo( builderWrapper.find( '.tmtemp' ) );
				builderWrapper.find( '.bitem-wrapper' ).remove();
				builderWrapper.find( '.tmtemp' ).addClass( 'bitem-wrapper' ).removeClass( 'tmtemp' );
				$.tmEPOAdmin.builder_items_sortable( builderWrapper.find( '.bitem-wrapper' ) );
				builderWrapper.find( '.tm-slider-wizard-headers' ).remove();
				builderWrapper.find( '.tc-tab-headers-wrap' ).remove();
				builderWrapper.removeClass( 'tm-slider-wizard is-tabs is-slider has-add-button' );

				builderWrapper.removeData( 'tctabs' ).removeData( 'tmHasTmtabs' );

				TCBUILDER[ sectionIndex ].section.sections_slides.default = '';
				TCBUILDER[ sectionIndex ].section.sections_tabs_labels.default = '';
				TCBUILDER[ sectionIndex ].section.is_slider = false;
			}
		},

		variationEventsSuccess: function() {
			setTimeout( function() {
				$.tmEPOAdmin.setGlobalVariationObject( 'reindex' );
			}, 600 );
			$( document ).unbind( 'ajaxSuccess', $.tmEPOAdmin.variationEventsSuccess );
			$.tmEPOAdmin.var_remove( 'tma-remove_variation-added' );
		},

		variationsCheckEventsSuccess: function() {
			setTimeout( function() {
				$.tmEPOAdmin.variationsCheckForChanges = 1;
				$.tmEPOAdmin.tm_variations_check();
			}, 600 );
			$( document ).unbind( 'ajaxSuccess', $.tmEPOAdmin.variationsCheckEventsSuccess );
			$.tmEPOAdmin.var_remove( 'tma-remove_variation-added' );
		},

		addVariationEvents: function() {
			if ( $.tmEPOAdmin.var_is( 'tma-variation-events-added' ) === true ) {
				return;
			}
			if ( $.tmEPOAdmin.var_is( 'tma-remove_variation-added' ) !== true ) {
				$( '#variable_product_options' ).on( 'click.tma', '.remove_variation', function() {
					$( document ).ajaxSuccess( $.tmEPOAdmin.variationEventsSuccess );
					$.tmEPOAdmin.var_is( 'tma-remove_variation-added', true );

					$( document ).ajaxSuccess( $.tmEPOAdmin.variationsCheckEventsSuccess );
				} );
			}
			if ( $.tmEPOAdmin.var_is( 'tma-remove_variation-added' ) !== true ) {
				$( '.wc-metaboxes-wrapper' ).on( 'click', 'a.bulk_edit', function() {
					var bulk_edit = $( 'select#field_to_edit' ).val();
					if ( bulk_edit === 'delete_all' ) {
						$( document ).ajaxSuccess( $.tmEPOAdmin.variationEventsSuccess );
						$.tmEPOAdmin.var_is( 'tma-remove_variation-added', true );

						$( document ).ajaxSuccess( $.tmEPOAdmin.variationsCheckEventsSuccess );
					}
				} );
			}
			$( '#variable_product_options' ).on( 'woocommerce_variations_added', function() {
				$.tmEPOAdmin.setGlobalVariationObject( 'reindex' );
				$( document ).ajaxSuccess( $.tmEPOAdmin.variationsCheckEventsSuccess );
			} );

			$( '#woocommerce-product-data' ).on( 'woocommerce_variations_saved', function() {
				$.tmEPOAdmin.setGlobalVariationObject( 'reindex' );
				$( document ).ajaxSuccess( $.tmEPOAdmin.variationsCheckEventsSuccess );
			} );

			$( document ).on( 'click.cpf', '.save_attributes', function() {
				$( document ).ajaxSuccess( $.tmEPOAdmin.variationsCheckEventsSuccess );
			} );

			$.tmEPOAdmin.var_is( 'tma-variation-events-added', true );
		},

		toggleVariationButton: function() {
			var productType = $( '#product-type' );
			var variationElement;
			var isForced;
			var variationElementBuilderWrapper;

			if ( productType.length ) {
				if ( productType.val() === 'variable' || productType.val() === 'variable-subscription' ) {
					$( '.builder_add_section' ).addClass( 'inline' );
					$( '.builder_add_variation' ).addClass( 'inline' ).removeClass( 'tm-hidden' );
					$( '.tma-variations-wrap' ).removeClass( 'tm-hidden' );
					$.tmEPOAdmin.addVariationEvents();
					variationElement = $( '.builder-layout .element-variations' );

					isForced = false;
					if ( ! variationElement.length ) {
						$.tmEPOAdmin.var_is( 'tm-style-variation-forced', true );
						$.tmEPOAdmin.builder_add_variation_onClick();
						isForced = true;
						variationElement = $( '.builder-layout .element-variations' );
					} else if ( $.tmEPOAdmin.getFieldValue( $.tmEPOAdmin.variationSection, 'variations_disabled' ) === '1' ) {
						isForced = true;
						variationElement = $( '.builder-layout .element-variations' );
						$.tmEPOAdmin.var_is( 'tm-style-variation-forced', true );
					}
					if ( variationElement.length ) {
						variationElementBuilderWrapper = variationElement.closest( '.builder-wrapper' );
						variationElementBuilderWrapper.find( '.tm-add-element-action,.tmicon.clone,.tmicon.size,.tmicon.move,.tmicon.plus,.tmicon.minus' ).remove();

						variationElementBuilderWrapper.addClass( 'tma-nomove tma-variations-wrap' );

						$.tmEPOAdmin.var_is( 'tm-style-variation-added', true );

						variationElement.addClass( 'tma-nomove' );
						variationElement.find( '.bitem-settings .size,.bitem-settings .clone,.tm-label-move,.bitem-settings .plus,.change,.bitem-settings .minus,.tm-label-delete' ).remove();

						if ( isForced ) {
							$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '1' );
							$( '.builder_add_section' ).addClass( 'inline' );
							$( '.builder_add_variation' ).addClass( 'inline' ).removeClass( 'tm-hidden' );
							$( '.tma-variations-wrap' ).addClass( 'tm-hidden' );
						} else {
							$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '' );
							$( '.builder_add_section' ).removeClass( 'inline' );
							$( '.builder_add_variation' ).removeClass( 'inline' ).addClass( 'tm-hidden' );
							$( '.tma-variations-wrap' ).removeClass( 'tm-hidden' );
						}

						$.tmEPOAdmin.variationsCheckForChanges = 1;
						$.tmEPOAdmin.tm_variations_check();
					}
					// remove cases where for any reason double variation sections appear
					if ( $( '.tma-variations-wrap' ).length > 1 ) {
						$( '.tma-variations-wrap' ).not( ':first' ).each( function() {
							var $this = $( this );
							var sectionIndex;
							var builderWrapper;
							builderWrapper = $this.closest( '.builder-wrapper' );
							sectionIndex = builderWrapper.index();
							builderWrapper.remove();
							TCBUILDER.splice( sectionIndex, 1 );
							$.tmEPOAdmin.builder_reorder_multiple();
							$.tmEPOAdmin.section_logic_init();
							$.tmEPOAdmin.initSectionsCheck();
						} );
					}
				} else {
					$( '.builder_add_section' ).removeClass( 'inline' );
					$( '.builder_add_variation' ).removeClass( 'inline' ).addClass( 'tm-hidden' );
				}
			}
		},

		// Encode the JS Options array as an array of names and values.
		tcSerializeJsOptionsArray: function( options ) {
			var sections = [].concat.apply(
				[],
				options.map( function( x ) {
					return Object.keys( x.section )
						.map( function( key ) {
							if ( x && typeof x.section[ key ] === 'object' ) {
								return x.section[ key ];
							}
							return null;
						} )
						.filter( function( el ) {
							return el !== null && el !== undefined;
						} );
				} )
			);

			var fields = [].concat.apply(
				[],
				options.map( function( x ) {
					return [].concat.apply(
						[],
						x.fields.map( function( y ) {
							return [].concat.apply(
								[],
								y
									.filter( function( el ) {
										return el !== null;
									} )
									.map( function( z ) {
										if ( z && z.id === 'multiple' ) {
											return [].concat.apply( [], z.multiple );
										}
										return z;
									} )
							);
						} )
					);
				} )
			);

			options = [].concat.apply( [], [ sections, fields ] );

			options = options
				.map( function( y ) {
					if ( y ) {
						if ( y.checked !== undefined ) {
							if ( y.checked === true ) {
								return { name: y.tags.name, value: y.default };
							}
							return { name: y.tags.name, value: '' };
						}
						return { name: y.tags.name, value: y.default };
					}
					return {};
				} )
				.filter( function( el ) {
					return el !== null && el !== undefined;
				} );

			return options;
		},

		// convert element to a valid JSON object
		tcSerializeJsOptionsObject: function( options ) {
			var o = {};
			var a = $.tmEPOAdmin.tcSerializeJsOptionsArray( options );

			if ( $( '#tm_meta_priority' ).length ) {
				a.push( { name: 'tm_meta[priority]', value: $( '#tm_meta_priority' ).val() } );
			}

			$.each( a, function() {
				if ( o[ this.name ] !== undefined ) {
					if ( this.name.slice( -2 ) === '[]' ) {
						if ( ! o[ this.name ].push ) {
							o[ this.name ] = [ o[ this.name ] ];
						}
						o[ this.name ].push( this.value || '' );
					} else if ( o[ this.name ] === '' ) {
						o[ this.name ] = this.value || '';
					}
				} else if ( this.value !== null && this.value !== undefined && this.value.push ) {
					o[ this.name ] = [ this.value ];
				} else {
					o[ this.name ] = this.value || '';
				}
			} );

			return o;
		},

		checkSections: function( data ) {
			Object.keys( data ).forEach( function( i ) {
				data[ i ].section.sections.default = data[ i ].fields.length;
			} );

			return data;
		},

		prepareForJson: function( data ) {
			var result = {};
			var arr;
			var value;
			var mustBeArray;

			Object.keys( data ).forEach( function( i ) {
				if ( i.indexOf( 'tm_meta[' ) === 0 ) {
					arr = i.split( /[[\]]{1,2}/ );
					arr.pop();
					arr = arr.map( function( item ) {
						return item === '' ? null : item;
					} );
					if ( arr.length > 0 && arr[ arr.length - 1 ] === null ) {
						mustBeArray = true;
					} else {
						mustBeArray = false;
					}
					arr = arr.filter( function( v ) {
						if ( v !== null && v !== undefined ) {
							return v;
						}
						return null;
					} );
					if ( typeof data[ i ] !== 'object' && mustBeArray ) {
						value = [ data[ i ] ];
					} else {
						value = data[ i ];
					}
					result = $.tmEPOAdmin.constructObject( arr, value, result );
				}
			} );

			return result;
		},

		constructObject: function( a, final_value, obj ) {
			var val = a.shift();

			if ( a.length > 0 ) {
				if ( ! Object.prototype.hasOwnProperty.call( obj, val ) ) {
					obj[ val ] = {};
				}
				obj[ val ] = $.tmEPOAdmin.constructObject( a, final_value, obj[ val ] );
			} else {
				obj[ val ] = final_value;
			}

			return obj;
		},

		createTmMetaSerialized: function() {
			var data;
			var name;
			var tmMetaSerialized;
			var previewField = $( 'input#wp-preview' );
			var $tcForm = $( '#tmformfieldsbuilderwrap' );

			$( '.tm_meta_serialized' ).remove();
			$( '.tm_meta_serialized_wpml' ).remove();

			if ( ! $.tmEPOAdmin.is_original ) {
				name = 'tm_meta_serialized_wpml';
			} else {
				name = 'tm_meta_serialized';
			}

			TCBUILDER = $.tmEPOAdmin.checkSections( TCBUILDER );

			data = $.tmEPOAdmin.tm_escape( JSON.stringify( $.tmEPOAdmin.prepareForJson( $.tmEPOAdmin.tcSerializeJsOptionsObject( TCBUILDER ) ) ) );

			tmMetaSerialized = $( "<textarea class='tm_meta_serialized tm-hidden' name='" + name + "'></textarea>" ).val( data );
			$tcForm.prepend( tmMetaSerialized );

			if ( previewField.length > 0 && previewField.val() !== '' ) {
				$( '.tm_meta_serialized' ).remove();
			}
		},

		fixFormSubmit: function() {
			var $post = $( '#post' );
			var found;
			var subscribe;
			var sub;

			if ( $post.length === 1 ) {
				$post.on( 'submit', function() {
					$.tmEPOAdmin.createTmMetaSerialized();
					return true; // ensure form still submits
				} );
			} else if ( wp.data && wp.data.subscribe !== undefined ) {
				found = false;
				subscribe = wp.data.subscribe;

				if ( typeof subscribe === 'function' ) {
					sub = function() {
						var isSavingPost;
						var didPostSaveRequestSucceed;
						var didPostSaveRequestFail;

						if ( ! wp.data.select( 'core/editor' ) ) {
							return;
						}
						didPostSaveRequestSucceed = wp.data.select( 'core/editor' ).didPostSaveRequestSucceed();
						didPostSaveRequestFail = wp.data.select( 'core/editor' ).didPostSaveRequestFail();

						if ( wp && wp.data && wp.data.select( 'core/editor' ) ) {
							isSavingPost = wp.data.select( 'core/editor' ).isSavingPost();
						}
						if ( ! found && isSavingPost ) {
							found = true;
							$.tmEPOAdmin.createTmMetaSerialized();
						}
						if ( found && ( didPostSaveRequestSucceed || didPostSaveRequestFail ) ) {
							found = false;
							setTimeout( function() {
								$( '.tm_meta_serialized' ).remove();
								$( '.tm_meta_serialized_wpml' ).remove();
							}, 600 );
						}
					};

					subscribe( sub );
				}
			}
		},

		initSectionsCheck: function() {
			var length = $( '.builder-wrapper' ).length;

			if ( length === 1 ) {
				if ( $( '.builder-wrapper.tma-variations-wrap.tm-hidden' ).length ) {
					length = 0;
				}
			}

			if ( ! length ) {
				$( '.builder-add-section-action' ).hide();
				$( '.builder-selector' ).hide();
				$( '.tc-welcome' ).show();
				$( '.builder-layout' ).hide();
			} else {
				$( '.builder-add-section-action' ).show();
				$( '.builder-selector' ).show();
				$( '.tc-welcome' ).hide();
				$( '.builder-layout' ).show();
			}
		},

		applyModeInit: function() {
			setTimeout( function() {
				$.tmEPOAdmin.applyMode( $( '.apply-mode:checked' ) );
			}, 100 );
		},

		applyMode: function( obj ) {
			var $this = obj;
			var value = $this.val();
			var check = value === 'disable-form' || ( value === 'customize-selection' && ! $( '#product_catchecklist :checkbox:checked' ).length ) ? 1 : 0;
			var id;
			var $include = $( '#tm_product_ids' );
			var $exclude = $( '#tm_product_exclude_ids' );
			var $enabled = $( '#tc-enabled-options' );
			var $disabled = $( '#tc-disabled-options' );
			var savedOptions;

			if ( value === 'apply-to-all-products' ) {
				$( '#product_catchecklist' ).find( ':checkbox' ).prop( 'checked', false );
			} else {
				for ( id in $.tmEPOAdmin.checkboxStates ) {
					$( '#' + id ).prop( 'checked', $.tmEPOAdmin.checkboxStates[ id ] );
				}
			}

			if ( value === 'apply-to-all-products' || value === 'customize-selection' ) {
				savedOptions = $exclude.data( 'saved-exclude-ids' );
				if ( savedOptions && savedOptions.length ) {
					$exclude.html( $.map( savedOptions, function( optionData ) {
						return optionData.html;
					} ).join( '' ) );
					$exclude.find( 'option' ).each( function( i ) {
						if ( savedOptions[ i ].checked ) {
							$( this ).prop( 'selected', true );
						}
					} );
					$exclude.removeData( 'saved-exclude-ids' );
				}

				savedOptions = $enabled.data( 'saved-enabled-roles' );
				if ( savedOptions && savedOptions.length ) {
					$enabled.html( $.map( savedOptions, function( optionData ) {
						return optionData.html;
					} ).join( '' ) );
					$enabled.find( 'option' ).each( function( i ) {
						if ( savedOptions[ i ].checked ) {
							$( this ).prop( 'selected', true );
						}
					} );
					$enabled.removeData( 'saved-enabled-roles' );
				}

				savedOptions = $disabled.data( 'saved-disabled-roles' );
				if ( savedOptions && savedOptions.length ) {
					$disabled.html( $.map( savedOptions, function( optionData ) {
						return optionData.html;
					} ).join( '' ) );
					$disabled.find( 'option' ).each( function( i ) {
						if ( savedOptions[ i ].checked ) {
							$( this ).prop( 'selected', true );
						}
					} );
					$disabled.removeData( 'saved-disabled-roles' );
				}
			} else if ( value === 'disable-form' ) {
				savedOptions = $exclude.find( 'option' ).map( function() {
					return {
						html: $( this ).prop( 'outerHTML' ),
						checked: $( this ).prop( 'selected' )
					};
				} ).get();
				$exclude.data( 'saved-exclude-ids', savedOptions );
				$exclude.html( '' );

				savedOptions = $enabled.find( 'option' ).map( function() {
					return {
						html: $( this ).prop( 'outerHTML' ),
						checked: $( this ).prop( 'selected' )
					};
				} ).get();
				$enabled.data( 'saved-enabled-roles', savedOptions );
				$enabled.html( '' );

				savedOptions = $disabled.find( 'option' ).map( function() {
					return {
						html: $( this ).prop( 'outerHTML' ),
						checked: $( this ).prop( 'selected' )
					};
				} ).get();
				$disabled.data( 'saved-disabled-roles', savedOptions );
				$disabled.html( '' );
			}

			if ( value === 'customize-selection' ) {
				savedOptions = $include.data( 'saved-include-ids' );
				if ( savedOptions && savedOptions.length ) {
					$include.html( $.map( savedOptions, function( optionData ) {
						return optionData.html;
					} ).join( '' ) );
					$include.find( 'option' ).each( function( i ) {
						if ( savedOptions[ i ].checked ) {
							$( this ).prop( 'selected', true );
						}
					} );
					$include.removeData( 'saved-include-ids' );
				}
			} else if ( value === 'apply-to-all-products' || value === 'disable-form' ) {
				savedOptions = $include.data( 'saved-include-ids' );
				if ( ! ( savedOptions && savedOptions.length ) ) {
					savedOptions = $include.find( 'option' ).map( function() {
						return {
							html: $( this ).prop( 'outerHTML' ),
							checked: $( this ).prop( 'selected' )
						};
					} ).get();
					$include.data( 'saved-include-ids', savedOptions );
					$include.html( '' );
				}
			}

			if ( value === 'apply-to-all-products' ) {
				$( '#product_catdiv' ).hide();
				$( '.postbox[id^="tagsdiv-"]' ).hide();
				$( '#tc-product-search' ).hide();
				$( '#tc-product-exclude' ).show();
				$( '#tc-product-roles' ).show();
			} else if ( value === 'customize-selection' ) {
				$( '#product_catdiv' ).show();
				$( '.postbox[id^="tagsdiv-"]' ).show();
				$( '#tc-product-search' ).show();
				$( '#tc-product-exclude' ).show();
				$( '#tc-product-roles' ).show();
			} else if ( value === 'disable-form' ) {
				$( '#product_catdiv' ).hide();
				$( '.postbox[id^="tagsdiv-"]' ).hide();
				$( '#tc-product-search' ).hide();
				$( '#tc-product-exclude' ).hide();
				$( '#tc-product-roles' ).hide();
			}
			$( '#tm_meta_disable_categories' ).val( check );
		},

		checkIfApplied: function() {
			var applyMode;
			var cat;
			var tmProductIds;
			var tmEnabledOptions;
			var tagCheckList;

			if ( ! $( 'body' ).is( '.product_page_tm-global-epo' ) ) {
				return;
			}

			applyMode = $( '.apply-mode:checked' ).val();

			cat = $( '#product_catdiv input:checkbox' ).filter( ':checked' ).length > 0;
			tagCheckList = $( '.tagchecklist' ).children( 'li' ).length > 0;
			tmProductIds = $( '#tm_product_ids' ).val();
			tmEnabledOptions = $( '#tc-enabled-options' ).val();
			tmProductIds = tmProductIds && tmProductIds !== null ? tmProductIds.length > 0 : false;
			tmEnabledOptions = tmEnabledOptions && tmEnabledOptions !== null ? tmEnabledOptions.length > 0 : false;

			if ( applyMode === 'apply-to-all-products' ) {
				$( '.tc-info-box' ).removeClass( 'hidden error' ).addClass( 'tc-all-products' ).html( TMEPOGLOBALADMINJS.i18n_form_is_applied_to_all );
			} else if ( applyMode === 'customize-selection' && ( cat || tagCheckList || tmProductIds || tmEnabledOptions ) ) {
				$( '.tc-info-box' ).removeClass( 'tc-error tc-all-products' ).addClass( 'hidden' ).html( '' );
			} else {
				$( '.tc-info-box' ).removeClass( 'hidden tc-all-products' ).addClass( 'tc-error' ).html( TMEPOGLOBALADMINJS.i18n_form_not_applied_to_all );
			}
		},

		check_section_logic: function( section ) {
			var sections;

			if ( ! ( Number.isFinite( section ) || section instanceof $ ) && $.tmEPOAdmin.isinit && $.tmEPOAdmin.done_check_section_logic ) {
				return;
			}

			if ( section instanceof $ ) {
				section = parseInt( section.index(), 10 );
			}

			if ( section === undefined ) {
				sections = TCBUILDER;
			} else {
				sections = [];
				section = $.epoAPI.math.toFloat( section );
				sections[ section ] = TCBUILDER[ section ];
			}

			Object.keys( sections ).forEach( function( i ) {
				var current_section = sections[ i ];
				var this_section_id;
				if ( current_section.section !== undefined ) {
					this_section_id = current_section.section.sections_uniqid.default;
					if ( ! this_section_id || this_section_id === '' || this_section_id === undefined || this_section_id === false ) {
						TCBUILDER[ i ].section.sections_uniqid.default = $.epoAPI.math.uniqueid( '', true );
					}
				}
			} );

			$.tmEPOAdmin.done_check_section_logic = true;
		},

		check_element_logic: function( element, section ) {
			var uniqids = [];
			var all = false;
			var sections;
			var fields;
			var field;
			var elementType;

			if ( ! ( Number.isFinite( element ) || element instanceof $ ) && $.tmEPOAdmin.isinit && $.tmEPOAdmin.done_check_element_logic ) {
				return;
			}

			if ( element instanceof $ && element.length ) {
				section = element.closest( '.builder-wrapper' ).index();
				if ( TCBUILDER[ section ] && TCBUILDER[ section ].section ) {
					element = $.tmEPOAdmin.find_index( TCBUILDER[ section ].section.is_slider, element );
				}
			}

			if ( section === undefined && element !== undefined ) {
				return;
			}

			if ( element === undefined ) {
				sections = TCBUILDER;
				all = true;
			} else {
				sections = [];
				section = $.epoAPI.math.toFloat( section );
				element = $.epoAPI.math.toFloat( element );
				sections[ section ] = $.extend( true, {}, TCBUILDER[ section ] );
				field = sections[ section ].fields[ element ];
				sections[ section ].fields = [];
				sections[ section ].fields[ element ] = field;
			}

			Object.keys( sections ).forEach( function( i ) {
				fields = sections[ i ].fields;

				Object.keys( fields ).forEach( function( ii ) {
					var this_element_id;

					field = fields[ ii ];

					elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
					this_element_id = $.tmEPOAdmin.getFieldValue( field, 'uniqid', elementType );

					if ( ( all && uniqids.indexOf( this_element_id ) !== -1 ) || ! this_element_id || this_element_id === '' || this_element_id === undefined || this_element_id === false ) {
						$.tmEPOAdmin.setFieldValue( i, ii, 'uniqid', $.epoAPI.math.uniqueid( '', true ), elementType );
					}
					if ( all ) {
						uniqids.push( $.tmEPOAdmin.getFieldValue( TCBUILDER[ i ].fields[ ii ], 'uniqid', elementType ) );
					}
				} );
			} );

			$.tmEPOAdmin.done_check_element_logic = true;
		},

		sectionLogicStart: function( section ) {
			var sections;
			var rules;

			if ( section === undefined ) {
				sections = TCBUILDER;
			} else {
				sections = [];
				section = $.epoAPI.math.toFloat( section );
				sections[ section ] = $.extend( true, {}, TCBUILDER[ section ] );
			}

			Object.keys( sections ).forEach( function( i ) {
				$.tmEPOAdmin.section_logic_init( i );
				try {
					rules = sections[ i ].section.sections_logicrules.default || 'null';
					rules = $.epoAPI.util.parseJSON( rules );
					rules = $.tmEPOAdmin.logic_check_section_rules( rules );

					TCBUILDER[ i ].section.sections_logicrules.default = JSON.stringify( rules );

					TCBUILDER[ i ].section.rules_toggle = rules.toggle;
				} catch ( err ) {

				}
			} );
		},

		elementLogicStart: function( element, section ) {
			var rules;
			var logic;
			var sections;
			var fields;
			var field;
			var elementType;

			if ( element === undefined ) {
				sections = TCBUILDER;
			} else {
				sections = [];
				section = $.epoAPI.math.toFloat( section );
				element = $.epoAPI.math.toFloat( element );
				sections[ section ] = $.extend( true, {}, TCBUILDER[ section ] );
				field = sections[ section ].fields[ element ];
				sections[ section ].fields = [];
				sections[ section ].fields[ element ] = field;
			}

			Object.keys( sections ).forEach( function( i ) {
				fields = sections[ i ].fields;
				if ( fields !== undefined ) {
					Object.keys( fields ).forEach( function( ii ) {
						field = fields[ ii ];

						$.tmEPOAdmin.element_logic_init( ii, i );

						try {
							elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
							logic = $.tmEPOAdmin.getFieldValue( field, 'logic', elementType ) || 'null';
							rules = $.tmEPOAdmin.getFieldValue( field, 'logicrules', elementType ) || 'null';
							rules = $.epoAPI.util.parseJSON( rules );

							// This check is to not print wrong rules when not required.
							if ( logic && logic !== 'null' ) {
								rules = $.tmEPOAdmin.logic_check_element_rules( rules, i, ii );
							}
							$.tmEPOAdmin.setFieldValue( i, ii, 'logicrules', JSON.stringify( rules ), elementType );
						} catch ( err ) {

						}
					} );
				}
			} );
		},

		panelsReorder: function( obj ) {
			$( obj )
				.children( '.options-wrap' )
				.each( function( i, el ) {
					$( el ).find( '.tm-default-radio,.tm-default-checkbox' ).val( i );
				} );
		},

		// Options sortable
		panelsSortable: function( obj ) {
			if ( $( obj ).length === 0 || ! $.tmEPOAdmin.is_original ) {
				return;
			}

			obj.sortable( {
				handle: '.move',
				cancel: 'input,select,button:not(.move)',
				cursor: 'move',
				tolerance: 'pointer',
				forcePlaceholderSize: true,
				placeholder: 'panel_wrap pl',
				stop: function( e, ui ) {
					$.tmEPOAdmin.panelsReorder( $( ui.item ).closest( '.panels_wrap' ) );
				}
			} );
		},

		// Delete all options button
		builder_panel_delete_all_onClick: function( e ) {
			var tcpagination = $( this ).closest( '.onerow' ).find( '.tcpagination' );
			var panels_wrap = $( '.flasho.tc-wrapper' ).find( '.panels_wrap' );
			var options_wrap;

			e.preventDefault();
			$( this ).trigger( 'hideTtooltip' );

			tcpagination.tcPagination( 'destroy' );

			if ( panels_wrap.children().length > 1 ) {
				options_wrap = panels_wrap.find( '.options-wrap' );
				options_wrap.each( function( i ) {
					if ( i === 0 ) {
						return true;
					}
					$( this ).remove();
					panels_wrap.find( '.numorder' ).each( function( i2 ) {
						$( this ).html( parseInt( i2, 10 ) + 1 );
					} );
				} );
				options_wrap.find( 'input' ).val( '' );
				$.tmEPOAdmin.panelsReorder( panels_wrap );
			}
		},

		// Remove image
		builder_image_delete_onClick: function( e ) {
			var $this = $( this );
			e.preventDefault();
			$this.trigger( 'hideTtooltip' );
			$this
				.closest( '.tm_cell_images' )
				.find( 'input.' + $this.attr( 'rel' ) )
				.val( '' );
			$this.closest( 'span' ).find( 'img' ).attr( 'src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=' );
		},

		// Delete options button
		builder_panel_delete_onClick: function( e ) {
			var _panels_wrap = $( this ).closest( '.panels_wrap' );

			e.preventDefault();
			$( this ).trigger( 'hideTtooltip' );

			if ( _panels_wrap.children().length > 1 ) {
				$( this )
					.closest( '.options-wrap' )
					.css( {
						margin: '0 auto'
					} )
					.animate(
						{
							opacity: 0,
							height: 0,
							width: 0
						},
						300,
						function() {
							$( this ).remove();
							_panels_wrap.find( '.numorder' ).each( function( i2 ) {
								$( this ).html( parseInt( i2, 10 ) + 1 );
							} );
							_panels_wrap.children( '.options-wrap' ).each( function( k ) {
								$( this )
									.find( '[id]' )
									.each( function() {
										var _name = $( this ).attr( 'name' ).replace( /[[\]]/g, '' );
										$( this ).attr( 'id', _name + '_' + k );
									} );
							} );
							$.tmEPOAdmin.panelsReorder( _panels_wrap );
						}
					);
			}
		},

		// Mass add options button
		builder_panel_mass_add_onClick: function( e ) {
			var html;
			var element = $( this );

			e.preventDefault();
			if ( element.is( '.disabled' ) ) {
				return;
			}
			element.addClass( 'disabled' );
			html =
				'<div class="tm-panel-populate-wrapper">' +
				'<textarea class="tm-panel-populate"></textarea>' +
				'<button type="button" class="tc tc-button builder-panel-populate">' +
				TMEPOGLOBALADMINJS.i18n_populate +
				'</button>' +
				'</div>';
			element.after( html );
		},

		// Populate options button
		builder_panel_populate_onClick: function( e ) {
			var panels_wrap = $( '.flasho.tc-wrapper' ).find( '.panels_wrap' );
			var _last = panels_wrap.children();
			var full_element = $( '' );
			var lines = $( '.tm-panel-populate' ).val().split( /\n/ );
			var texts = [];

			e.preventDefault();
			$( this ).remove();

			lines.forEach( function( value ) {
				if ( /\S/.test( value ) ) {
					texts.push( $.epoAPI.util.trim( value ) );
				}
			} );

			texts.forEach( function( value ) {
				var line = value.split( '|' );
				var len = line.length;
				var toadd;

				if ( len !== 0 ) {
					if ( len === 1 ) {
						line[ 1 ] = '';
					}
					line[ 0 ] = $.epoAPI.util.trim( line[ 0 ] );
					if ( line[ 1 ] !== undefined && line[ 1 ] !== '' ) {
						line[ 1 ] = parseFloat( $.epoAPI.util.trim( line[ 1 ] ) );
					} else {
						line[ 1 ] = '';
					}
					if ( ! Number.isFinite( line[ 1 ] ) ) {
						line[ 1 ] = '';
					}
					toadd = $.tmEPOAdmin.add_panel_row( line, panels_wrap, _last );

					full_element = full_element.add( toadd );
				}
			} );
			if ( full_element.length ) {
				panels_wrap.append( full_element );
				full_element.find( '.tm_option_enabled' ).prop( 'checked', true ).val( '1' ).trigger( 'changechoice' );
				$.tcToolTip( full_element.find( '.tm-tooltip' ) );
			}
			$( '.builder-panel-mass-add' ).removeClass( 'disabled' );
			$( '.tm-panel-populate-wrapper' ).remove();
			$.tmEPOAdmin.paginattion_init( 'last' );
			$.tmEPOAdmin.floatbox_content_js();
		},

		add_panel_row: function( line, panels_wrap, _last ) {
			var _clone = _last.last().tcClone();

			if ( _clone ) {
				$.tmEPOAdmin.builder_clone_elements_after_events( _clone );
				_clone.find( '[name]' ).val( '' );
				_clone.find( '.tm_option_title' ).val( line[ 0 ] );
				_clone.find( '.tm_option_value' ).val( $( '<div/>' ).html( line[ 0 ] ).text() );
				_clone.find( '.tm_option_price' ).val( line[ 1 ] );
				if ( line[ 2 ] ) {
					_clone.find( '.tm_option_price_type' ).val( line[ 2 ] );
					if ( _clone.find( '.tm_option_price_type' ).val() === false ) {
						_clone.find( '.tm_option_price_type' ).val( '' );
					}
				}
				if ( line[ 3 ] ) {
					_clone.find( '.tm_option_description' ).val( line[ 3 ] );
					if ( _clone.find( '.tm_option_description' ).val() === false ) {
						_clone.find( '.tm_option_description' ).val( '' );
					}
				}
				_clone.find( '.tm_upload_image img' ).attr( 'src', '' );
				_clone.find( 'input.tm_option_image' ).val( '' );
				_clone.find( '.tm-default-radio,.tm-default-checkbox' ).prop( 'checked', false ).val( _last.length );

				return _clone;
			}

			return $( '' );
		},

		// Add separator button
		builder_panel_add_separator_onClick: function( e ) {
			var panels_wrap = $( this ).prevUntil( '.panels_wrap' ).prev();
			var _last = panels_wrap.children();
			var _clone = _last.last().tcClone();

			e.preventDefault();
			if ( _clone ) {
				_clone.addClass( 'separator' );
				_clone.find( '.tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)' ).addClass( 'tm-hidden' );
				_clone.find( '[name]' ).val( '' );
				_clone.find( '.tc-cell-value input' ).removeClass( 'tm_option_value' ).val( '-1' );
				_clone.find( '.tm_upload_image img' ).attr( 'src', '' );
				_clone.find( 'input.tm_option_image' ).val( '' );
				_clone.find( '.tm-default-radio,.tm-default-checkbox' ).prop( 'checked', false ).val( _last.length );

				$.tmEPOAdmin.builder_clone_elements_after_events( _clone );

				panels_wrap.append( _clone );
				_clone.find( 'input:checkbox' ).toArray().forEach( function( checkbox ) {
					checkbox = $( checkbox );
					checkbox.val( checkbox.data( 'builder' ).tags.value );
					if ( checkbox.is( '.tm_option_enabled' ) ) {
						checkbox.prop( 'checked', true ).trigger( 'changechoice' );
					}
				} );

				$.tcToolTip( _clone.find( '.tm-tooltip' ) );
				$.tmEPOAdmin.paginattion_init( 'last' );
				$.tmEPOAdmin.floatbox_content_js();
			}
		},

		// Add options button
		builder_panel_add_onClick: function( e ) {
			var panels_wrap = $( this ).prev( '.panels_wrap' );
			var _last = panels_wrap.children().not( '.separator' );
			var _clone = _last.last().tcClone();

			e.preventDefault();
			if ( _clone ) {
				_clone.find( '[name]' ).val( '' );
				_clone.find( '.tm_upload_image img' ).attr( 'src', '' );
				_clone.find( 'input.tm_option_image' ).val( '' );
				_clone.find( '.tm-default-radio,.tm-default-checkbox' ).prop( 'checked', false ).val( _last.length );

				$.tmEPOAdmin.builder_clone_elements_after_events( _clone );

				panels_wrap.append( _clone );
				_clone.find( 'input:checkbox' ).toArray().forEach( function( checkbox ) {
					checkbox = $( checkbox );
					checkbox.val( checkbox.data( 'builder' ).tags.value );
					if ( checkbox.is( '.tm_option_enabled' ) ) {
						checkbox.prop( 'checked', true ).trigger( 'changechoice' );
					}
				} );

				$.tcToolTip( _clone.find( '.tm-tooltip' ) );
				$.tmEPOAdmin.paginattion_init( 'last' );
				$.tmEPOAdmin.floatbox_content_js();
			}
		},

		// Section add button
		builder_add_section_onClick: function( e, ap, nt ) {
			var _template = $.epoAPI.template.html( templateEngine.tc_builder_section, {} );
			var _clone;
			var fieldObject;
			var sectionObject;
			var sectionField;

			if ( e ) {
				e.preventDefault();
			}

			if ( _template ) {
				_clone = $( _template );
				if ( _clone ) {
					_clone.addClass( 'w100' );
					//_clone.addClass("appear");
					_clone.find( '.tm-builder-sections-uniqid' ).val( $.epoAPI.math.uniqueid( '', true ) );

					fieldObject = $.tmEPOAdmin.getFieldObject( _clone );
					sectionField = {};
					Object.keys( fieldObject ).forEach( function( i ) {
						sectionField[ fieldObject[ i ].id ] = fieldObject[ i ];
					} );
					sectionObject = {
						fields: [],
						section: sectionField,
						size: $.tmEPOAdmin.builderSize[ sectionField.sections_size.default ],
						sections_internal_name: sectionField.sections_internal_name.default
					};
					_clone.find( '.section_elements' ).empty();
					_clone.find( '.tm-internal-name' ).remove();
					if ( ap ) {
						_clone.appendTo( '.builder-layout' );
						TCBUILDER.push( sectionObject );
					} else if ( $( '.builder-layout .tma-variations-wrap' ).length > 0 ) {
						$( '.builder-layout .tma-variations-wrap' ).after( _clone );
						TCBUILDER.splice( 1, 0, sectionObject );
					} else {
						_clone.prependTo( '.builder-layout' );
						TCBUILDER.unshift( sectionObject );
					}

					$.tmEPOAdmin.check_section_logic( _clone );
					$.tmEPOAdmin.section_logic_init( _clone );

					if ( ! nt ) {
						$.tmEPOAdmin.builder_items_sortable( _clone.find( '.bitem-wrapper' ) );
						$.tmEPOAdmin.builder_reorder_multiple();
						if ( $( this ).is( 'a' ) ) {
							$( window ).tcScrollTo( _clone );
						}
					}

					$.tmEPOAdmin.initSectionsCheck();

					$.tmEPOAdmin.makeResizables( _clone );

					return _clone;
				}
			}

			return false;
		},

		builder_add_element_onClick: function( e ) {
			var $this = $( this );
			var $_html = $.tmEPOAdmin.builder_floatbox_template_import( {
				id: 'tc-floatbox-content',
				html: '<div class="tm-inner">' + TMEPOGLOBALADMINJS.element_data + '</div>',
				title: TMEPOGLOBALADMINJS.i18n_add_element
			} );
			var popup = $.tcFloatBox( {
				closefadeouttime: 0,
				animateOut: '',
				fps: 1,
				ismodal: false,
				refresh: 'fixed',
				width: '70%',
				height: '70%',
				top: '15%',
				left: '15%',
				classname: 'flasho tc-wrapper tc-builder-add-element',
				data: $_html
			} );

			if ( e ) {
				e.preventDefault();
			}

			$( '.tc-builder-add-element .tc-element-button' ).on( 'click.cpf', function( ev ) {
				var new_section = $this.closest( '.builder-wrapper' );
				var el = $( this ).attr( 'data-element' );

				ev.preventDefault();

				if ( $this.is( '.tc-prepend' ) ) {
					$.tmEPOAdmin.builder_clone_element( el, new_section, 'prepend' );
				} else {
					$.tmEPOAdmin.builder_clone_element( el, new_section );
				}

				$.tmEPOAdmin.logic_reindex();
				popup.destroy();
			} );
		},

		builder_add_section_and_element_onClick: function( e ) {
			var $_html = $.tmEPOAdmin.builder_floatbox_template_import( {
				id: 'tc-floatbox-content',
				html: '<div class="tm-inner">' + TMEPOGLOBALADMINJS.element_data + '</div>',
				title: TMEPOGLOBALADMINJS.i18n_add_element
			} );
			var popup = $.tcFloatBox( {
				closefadeouttime: 0,
				animateOut: '',
				fps: 1,
				ismodal: false,
				refresh: 'fixed',
				width: '70%',
				height: '70%',
				top: '15%',
				left: '15%',
				classname: 'flasho tc-wrapper tc-builder-add-section-and-element',
				data: $_html
			} );

			if ( e ) {
				e.preventDefault();
			}

			$( '.tc-builder-add-section-and-element .tc-element-button' ).on( 'click.cpf', function( ev ) {
				var new_section = $.tmEPOAdmin.builder_add_section_onClick( false, true );
				var el;

				ev.preventDefault();

				if ( new_section ) {
					el = $( this ).attr( 'data-element' );
					$.tmEPOAdmin.builder_clone_element( el, new_section );
					$.tmEPOAdmin.logic_reindex();
					popup.destroy();
				}
			} );
		},

		tm_variations_check: function() {
			var variationElement = $( '.builder-layout .element-variations' );
			var data;
			var foundIndex;

			if ( ! variationElement.length ) {
				return;
			}

			if ( $.tmEPOAdmin.variationsCheckForChanges === 1 && TMEPOADMINJS ) {
				$( '#tc-admin-extra-product-options' ).block( {
					message: null
				} );
				data = {
					action: 'woocommerce_tm_variations_check',
					post_id: TMEPOADMINJS.post_id,
					security: TMEPOADMINJS.check_attributes_nonce
				};
				$.post(
					TMEPOADMINJS.ajax_url,
					data,
					function( response ) {
						TCBUILDER[ 0 ].variations_html = response.html;
						$( '.tma-variations-wrap .tm-all-attributes' ).html( response.html );
						if ( response.jsobject ) {
							TCBUILDER[ 0 ].jsobject = response.jsobject;
							TCBUILDER[ 0 ].fields[ 0 ].find( function( y, index ) {
								if ( y.id === 'multiple' ) {
									foundIndex = index;
								}
								return y.id === 'multiple';
							} );
							if ( foundIndex !== undefined ) {
								TCBUILDER[ 0 ].fields[ 0 ][ foundIndex ] = response.jsobject;
							} else {
								TCBUILDER[ 0 ].fields[ 0 ].push( response.jsobject );
							}
						}
						$( '#tc-admin-extra-product-options' ).unblock();
						$( '#tc-admin-extra-product-options' ).trigger( 'woocommerce_tm_variations_check_loaded' );
						$.tmEPOAdmin.variationsCheckForChanges = 0;
						$.tmEPOAdmin.builder_reorder_multiple();
					},
					'json'
				);
			}
		},

		// Variation delete button
		builder_variation_delete_onClick: function() {
			$.tmEPOAdmin.var_is( 'tm-style-variation-forced', true );
			$( '.builder_add_section' ).addClass( 'inline' );
			$( '.builder_add_variation' ).addClass( 'inline' ).removeClass( 'tm-hidden' );
			if ( $( '.tma-variations-wrap' ).length > 1 ) {
				$( '.tma-variations-wrap' ).not( ':first' ).each( function() {
					var $this = $( this );
					var sectionIndex;
					var builderWrapper;

					builderWrapper = $this.closest( '.builder-wrapper' );
					sectionIndex = builderWrapper.index();
					builderWrapper.remove();
					TCBUILDER.splice( sectionIndex, 1 );
					$.tmEPOAdmin.builder_reorder_multiple();

					$.tmEPOAdmin.section_logic_init();
					$.tmEPOAdmin.initSectionsCheck();
				} );
			}
			$( '.tma-variations-wrap' ).addClass( 'tm-hidden' );
			$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '1' );
			$.tmEPOAdmin.initSectionsCheck();
		},

		// Variation button
		builder_add_variation_onClick: function( e ) {
			var _clone;
			var _clone2;

			if ( e ) {
				e.preventDefault();
			}

			if ( $.tmEPOAdmin.var_is( 'tm-style-variation-added' ) === true ) {
				if ( $.tmEPOAdmin.var_is( 'tm-style-variation-forced' ) === true ) {
					$.tmEPOAdmin.var_is( 'tm-style-variation-forced', false );
					$( '.builder_add_variation' ).addClass( 'tm-hidden' );
					$( '.builder_add_section' ).removeClass( 'inline' );
					$( '.tma-variations-wrap' ).removeClass( 'tm-hidden' );
					$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '' );
					$.tmEPOAdmin.initSectionsCheck();
				}
				return;
			}
			_clone = $.tmEPOAdmin.builder_add_section_onClick( false, false, true );
			if ( _clone ) {
				_clone.find( '.tm-add-element-action,.tmicon.clone,.tmicon.size,.tmicon.move,.tmicon.plus,.tmicon.minus' ).remove();
				_clone.addClass( 'tma-nomove tma-variations-wrap' );
				$.tmEPOAdmin.var_is( 'tm-style-variation-added', true );

				_clone2 = $.tmEPOAdmin.builder_clone_element( 'variations', $( '.builder-layout' ).find( '.builder-wrapper' ).first() );
				$.tmEPOAdmin.setVariationSection();
				if ( $.tmEPOAdmin.var_is( 'tm-style-variation-forced' ) === true ) {
					$( '.builder_add_section' ).addClass( 'inline' );
					$( '.builder_add_variation' ).addClass( 'inline' ).removeClass( 'tm-hidden' );
					$( '.tma-variations-wrap' ).addClass( 'tm-hidden' );
					$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '1' );
				} else {
					$( '.builder_add_variation' ).addClass( 'tm-hidden' );
					$( '.builder_add_section' ).removeClass( 'inline' );
					$( '.tma-variations-wrap' ).removeClass( 'tm-hidden' );
					$.tmEPOAdmin.var_is( 'tm-style-variation-forced', false );
					$.tmEPOAdmin.setFieldValue( $.tmEPOAdmin.variationSectionIndex, $.tmEPOAdmin.variationFieldIndex, 'variations_disabled', '' );
				}

				_clone2.find( '.bitem-settings .size,.bitem-settings .clone,.tm-label-move,.bitem-settings .plus,.bitem-settings .minus,.tm-label-delete' ).remove();

				_clone2.addClass( 'tma-nomove' );
				_clone2.find( '.builder-remove-for-variations' ).remove();
				_clone2.find( '.builder_hide_for_variation' ).hide();

				$.tmEPOAdmin.pre_element_logic_init_set();

				$.tmEPOAdmin.logic_reindex_force();

				$.tmEPOAdmin.variationsCheckForChanges = 1;
				$.tmEPOAdmin.tm_variations_check();
			}
		},

		var_is: function( v, d ) {
			if ( ! d ) {
				return $( 'body' ).data( v );
			}
			$( 'body' ).data( v, d );
		},

		var_remove: function( v ) {
			if ( v ) {
				$( 'body' ).removeData( v );
			}
		},

		tm_escape: function( val ) {
			return encodeURIComponent( val );
		},

		tm_unescape: function( val ) {
			return decodeURIComponent( val );
		},

		get_element_logic_init: function( do_section ) {
			if ( ! $.tmEPOAdmin.pre_element_logic_init_done ) {
				$.tmEPOAdmin.pre_element_logic_init( do_section );
			}
			if ( ! $.tmEPOAdmin.isinit ) {
				$.tmEPOAdmin.pre_element_logic_init_done = false;
			} else {
				$.tmEPOAdmin.pre_element_logic_init_done = true;
			}
			return $.tmEPOAdmin.pre_element_logic_init_obj;
		},

		get_element_logic_options_init: function( do_section ) {
			if ( ! $.tmEPOAdmin.pre_element_logic_init_done ) {
				$.tmEPOAdmin.pre_element_logic_init( do_section );
			}
			if ( ! $.tmEPOAdmin.isinit ) {
				$.tmEPOAdmin.pre_element_logic_init_done = false;
			} else {
				$.tmEPOAdmin.pre_element_logic_init_done = true;
			}
			return $.tmEPOAdmin.pre_element_logic_init_obj_options;
		},

		find_index: function( is_slider, field, include, exlcude ) {
			var sib = 0;
			var $lis;

			if ( is_slider ) {
				sib = field.closest( '.bitem-wrapper' ).prevAll( '.bitem-wrapper' ).find( '.bitem' );
				if ( exlcude ) {
					sib = sib.not( exlcude );
				}
				sib = sib.length;
			}
			if ( include && exlcude ) {
				$lis = field.parent().find( include ).not( exlcude );
				$lis = parseInt( $lis.index( field ), 10 );
				if ( $lis !== -1 ) {
					$lis = parseInt( sib, 10 ) + $lis;
				}
				return $lis;
			}

			return parseInt( sib, 10 ) + parseInt( field.index(), 10 );
		},

		setGlobalVariationObject: function( logic, do_section ) {
			var data;
			var cajaxurl;

			if ( TMEPOADMINJS ) {
				$( '#tc-admin-extra-product-options' ).block( {
					message: null
				} );
				data = {
					action: 'woocommerce_tm_get_variations_array',
					post_id: TMEPOADMINJS.post_id,
					security: TMEPOADMINJS.check_attributes_nonce
				};
				cajaxurl = window.ajaxurl || TMEPOADMINJS.ajax_url;

				$.post(
					cajaxurl,
					data,
					function( response ) {
						if ( response ) {
							globalVariationObject = response;
							if ( logic === true ) {
								$.tmEPOAdmin.pre_element_logic_init_set( do_section );
							} else if ( logic === 'reindex' ) {
								$.tmEPOAdmin.logic_reindex_force();
							} else if ( logic === 'initialitize_on' ) {
								$.tmEPOAdmin.initialitize_on();
							} else if ( logic === 'initialitize_on_after' ) {
								$.tmEPOAdmin.initialitize_on_after();
							}
						}
					},
					'json'
				).always( function() {
					$( '#tc-admin-extra-product-options' ).unblock();
				} );
			} else if ( logic === 'initialitize_on' ) {
				if ( ! globalVariationObject ) {
					globalVariationObject = {};
				}
				$.tmEPOAdmin.initialitize_on();
			} else if ( logic === 'initialitize_on_after' ) {
				if ( ! globalVariationObject ) {
					globalVariationObject = {};
				}
				$.tmEPOAdmin.initialitize_on_after();
			}
		},

		pre_element_logic_init: function( do_section ) {
			if ( ! globalVariationObject ) {
				$.tmEPOAdmin.setGlobalVariationObject( true, do_section );
			} else {
				$.tmEPOAdmin.pre_element_logic_init_set( do_section );
			}
		},

		getFieldValue: function( field, type, elementType ) {
			var value;

			if ( elementType && elementType !== true ) {
				type = elementType + '_' + type;
			} else if ( elementType === true ) {
				elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
				if ( elementType ) {
					type = elementType + '_' + type;
				}
			}

			value = field.find( function( y ) {
				return y.id === type;
			} );

			if ( value !== undefined && typeof value === 'object' ) {
				return value.default;
			}

			return undefined;
		},

		getFieldMultiple: function( field, type, elementType ) {
			var foundIndex;
			var multiple;
			var value;

			type = 'options_' + type;
			if ( elementType && elementType !== true ) {
				type = elementType + '_' + type;
			} else if ( elementType === true ) {
				elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
				if ( elementType ) {
					type = elementType + '_' + type;
				}
			}
			type = 'multiple_' + type;
			field.find( function( y, index ) {
				if ( y.id === 'multiple' ) {
					foundIndex = index;
				}
				return y.id === 'multiple';
			} );
			if ( foundIndex !== undefined ) {
				multiple = field[ foundIndex ].multiple;
				value = multiple
					.map( function( x ) {
						return x.find( function( y ) {
							return y.id === type;
						} );
					} )
					.filter( function( el ) {
						return el !== null && el !== undefined;
					} );
				if ( value && typeof value === 'object' ) {
					return value;
				}
			}

			return undefined;
		},

		setFieldValue: function( sectionIndex, fieldIndex, type, value, elementType ) {
			var field;
			var foundIndex;
			if ( elementType && elementType !== true ) {
				type = elementType + '_' + type;
			} else if ( elementType === true ) {
				elementType = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'element_type' );
				if ( elementType ) {
					type = elementType + '_' + type;
				}
			}
			field = TCBUILDER[ sectionIndex ].fields[ fieldIndex ];
			if ( Array.isArray( field ) ) {
				field.find( function( y, index ) {
					if ( y.id === type ) {
						foundIndex = index;
					}
					return y.id === type;
				} );
			}

			if ( foundIndex !== undefined ) {
				TCBUILDER[ sectionIndex ].fields[ fieldIndex ][ foundIndex ].default = value;
			}
		},

		setFieldValueMultiple: function( sectionIndex, fieldIndex, type, value, elementType ) {
			var field;
			var foundIndex;
			var multiple;
			var multipleIndex;

			if ( type.toString.isNumeric() ) {
				multipleIndex = type;
			} else {
				type = 'options_' + type;
				if ( elementType && elementType !== true ) {
					type = elementType + '_' + type;
				} else if ( elementType === true ) {
					elementType = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'element_type' );
					if ( elementType ) {
						type = elementType + '_' + type;
					}
				}
				type = 'multiple_' + type;
			}

			field = TCBUILDER[ sectionIndex ].fields[ fieldIndex ];
			//if (field !== undefined){
			field.find( function( y, index ) {
				if ( y.id === 'multiple' ) {
					foundIndex = index;
				}
				return y.id === 'multiple';
			} );
			//}
			if ( foundIndex !== undefined ) {
				multiple = TCBUILDER[ sectionIndex ].fields[ fieldIndex ][ foundIndex ].multiple;
				if ( multipleIndex === undefined ) {
					multiple.find( function( y, index ) {
						if ( y.id === type ) {
							multipleIndex = index;
						}
						return y.id === type;
					} );
				} else {
					TCBUILDER[ sectionIndex ].fields[ fieldIndex ][ foundIndex ].multiple[ multipleIndex ].default = value;
				}
			}
		},

		setVariationSection: function() {
			TCBUILDER.find( function( y, index ) {
				var variationFieldIndex;
				var found;
				if ( y !== undefined && y.fields !== undefined ) {
					found = y.fields.find( function( x, index2 ) {
						var found2;
						found2 = x.find( function( z ) {
							return z.id === 'element_type' && z.default === 'variations';
						} );
						if ( found2 !== undefined ) {
							variationFieldIndex = index2;
						}
						return found2;
					} );
				}
				if ( found !== undefined ) {
					$.tmEPOAdmin.variationSectionIndex = index;
					$.tmEPOAdmin.variationFieldIndex = variationFieldIndex;
					$.tmEPOAdmin.variationSection = TCBUILDER[ $.tmEPOAdmin.variationSectionIndex ].fields[ $.tmEPOAdmin.variationFieldIndex ];
					TCBUILDER[ $.tmEPOAdmin.variationSectionIndex ].section.tma_variations_wrap = true;
				}
				return found !== undefined;
			} );
		},

		pre_element_logic_init_set: function( do_section ) {
			var options;
			var logicobj;
			var log_section_id;
			var section_id;
			var fields;
			var fieldsNoDisabled;
			var values;
			var field_values;
			var name;
			var field_index;
			var has_enabled;
			var is_enabled;
			var value;
			var internal_name;
			var field_type;
			var tm_title;
			var tm_title_label;
			var tm_option_titles;
			var tm_option_values;
			var _section_name;
			var elementType;
			var section;
			var field;
			var uniqid;

			if ( ! globalVariationObject ) {
				return;
			}
			$.tmEPOAdmin.pre_element_logic_init_obj = {};
			$.tmEPOAdmin.pre_element_logic_init_obj_options = {};

			options = {};
			logicobj = {};
			log_section_id = [];

			$.tmEPOAdmin.setVariationSection();

			Object.keys( TCBUILDER ).forEach( function( i ) {
				section = TCBUILDER[ i ].section;

				if ( section !== undefined ) {
					section_id = section.sections_uniqid.default;

					// Check if section id exists
					if ( log_section_id.indexOf( section_id ) !== -1 ) {
						TCBUILDER[ i ].section.sections_uniqid.default = $.epoAPI.math.uniqueid( '', true );
						section_id = TCBUILDER[ i ].section.sections_uniqid.default;
					}
					log_section_id.push( section_id );

					options[ section_id ] = [];
					if ( do_section ) {
						$.tmEPOAdmin.check_section_logic( i );
					}
					_section_name = section.sections_internal_name.default || 'Section';
					if ( ! section.tma_variations_wrap ) {
						options[ section_id ][ 0 ] = '<option data-type="section" data-section="' + section_id + '" value="' + section_id + '">' + _section_name + ' (' + section_id + ')</option>';
					}

					fields = TCBUILDER[ i ].fields.filter( function( x ) {
						var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
						return type === 'variations' || ( $.inArray( type, $.tmEPOAdmin.canTakeLogic ) !== -1 && $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === '1' );
					} );

					fieldsNoDisabled = TCBUILDER[ i ].fields.filter( function( x ) {
						var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
						return $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === '1' || $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === undefined;
					} );

					values = [];
					field_values = [];

					// All the fields of current section that can be used as selector in logic
					Object.keys( fields ).forEach( function( ii ) {
						field = fields[ ii ];

						elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );

						name = $.tmEPOAdmin.getFieldValue( field, 'header_title', elementType );

						uniqid = $.tmEPOAdmin.getFieldValue( field, 'uniqid', elementType );

						field_index = fieldsNoDisabled.findIndex( function( x ) {
							var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
							return uniqid === $.tmEPOAdmin.getFieldValue( x, 'uniqid', type ) && ( type === 'variations' || ( $.inArray( type, $.tmEPOAdmin.canTakeLogic ) !== -1 && $.tmEPOAdmin.getFieldValue( x, 'enabled', true ) === '1' ) );
						} );

						has_enabled = $.tmEPOAdmin.getFieldValue( field, 'enabled', elementType );
						is_enabled = $.tmEPOAdmin.getFieldValue( field, 'enabled', elementType ) === '1';

						if ( has_enabled && ! is_enabled ) {
							return true;
						}

						if ( name !== undefined ) {
							value = name;
							if ( value === undefined || value.length === 0 ) {
								value = '';
							}
							internal_name = $.tmEPOAdmin.getFieldValue( field, 'internal_name', elementType );
							if ( internal_name !== value ) {
								value = value + ' (' + internal_name + ')';
							}

							field_type = elementType === 'variations'
								? 'variation'
								: $.inArray( elementType, [ 'radiobuttons', 'checkboxes', 'product', 'selectbox', 'selectboxmultiple' ] ) !== -1
									? 'multiple'
									: 'text';

							options[ section_id ][ field_index + 1 ] = '<option data-type="' + field_type + '" data-section="' + section_id + '" value="' + field_index + '">' + value + '</option>';

							if ( elementType === 'variations' ) {
								field_values = [];
								$( globalVariationObject.variations ).each( function( index, variation ) {
									var variationStatus = variation.status || 'invalid';
									if ( variationStatus === 'publish' ) {
										variationStatus = '';
									} else {
										variationStatus = ' (' + variationStatus + ')';
									}
									tm_title = [];
									$( variation.attributes ).each( function( iii, sel ) {
										var arr = $.map( sel, function( el ) {
											return el;
										} );

										$( arr ).each( function( iiii, sel2 ) {
											tm_title.push( sel2 );
										} );
									} );
									tm_title = tm_title.join( ' - ' );
									tm_title_label = tm_title;
									try {
										tm_title_label = $.tmEPOAdmin.tm_unescape( tm_title );
									} catch ( err ) {
										tm_title_label = tm_title;
									}
									field_values.push( '<option value="' + $.tmEPOAdmin.tm_escape( variation.variation_id ) + '">' + tm_title_label + variationStatus + '</option>' );
								} );

								values[ field_index ] = '<select data-element="' + field_index + '" data-section="' + section_id + '" class="cpf-logic-value">' + field_values.join( '' ) + '</select>';
							} else if ( $.inArray( elementType, [ 'radiobuttons', 'checkboxes', 'selectbox', 'selectboxmultiple' ] ) !== -1 ) {
								tm_option_titles = $.tmEPOAdmin.getFieldMultiple( field, 'title', elementType );
								tm_option_values = $.tmEPOAdmin.getFieldMultiple( field, 'value', elementType );
								field_values = [];

								Object.keys( tm_option_titles ).forEach( function( index ) {
									field_values.push( '<option value="' + $.tmEPOAdmin.tm_escape( tm_option_values[ index ].default ) + '">' + tm_option_titles[ index ].default + '</option>' );
								} );

								values[ field_index ] = '<select data-element="' + field_index + '" data-section="' + section_id + '" class="cpf-logic-value">' + field_values.join( '' ) + '</select>';
							} else {
								values[ field_index ] = '<input data-element="' + field_index + '" data-section="' + section_id + '" class="cpf-logic-value" type="text" value="">';
							}
						}
					} );

					logicobj[ section_id ] = {
						values: values
					};
				}
			} );
			$.tmEPOAdmin.pre_element_logic_init_obj = logicobj;
			$.tmEPOAdmin.pre_element_logic_init_obj_options = options;
		},

		element_logic_init: function( element, section, append ) {
			var field_index;
			var fieldsNoDisabled;
			var options_this = [];
			var options = [];
			var section_id;
			var logicobj;
			var shippinglogicobj = {};
			var options_pre_this;
			var options_pre;
			var elementIndex;
			var uniqid;

			if ( element instanceof $ ) {
				section = element.closest( '.builder-wrapper' ).index();
				element = $.tmEPOAdmin.find_index( TCBUILDER[ section ].section.is_slider, element );
			}

			section = $.epoAPI.math.toFloat( section );
			elementIndex = $.epoAPI.math.toFloat( element );

			uniqid = $.tmEPOAdmin.getFieldValue( TCBUILDER[ section ].fields[ elementIndex ], 'uniqid', true );

			fieldsNoDisabled = TCBUILDER[ section ].fields.filter( function( x ) {
				var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
				return $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === '1' || $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === undefined;
			} );

			field_index = fieldsNoDisabled.findIndex( function( x ) {
				var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
				return uniqid === $.tmEPOAdmin.getFieldValue( x, 'uniqid', type ) && $.inArray( type, $.tmEPOAdmin.canTakeLogic ) !== -1 && $.tmEPOAdmin.getFieldValue( x, 'enabled', true ) === '1';
			} );

			$.tmEPOAdmin.check_section_logic();
			$.tmEPOAdmin.check_element_logic( elementIndex, section );

			logicobj = $.extend( true, {}, $.tmEPOAdmin.get_element_logic_init() );
			shippinglogicobj = $.extend( true, {}, logicobj );
			options_pre = $.extend( true, {}, $.tmEPOAdmin.get_element_logic_options_init() );
			options_pre_this = $.extend( true, {}, $.tmEPOAdmin.get_element_logic_options_init() );

			section_id = TCBUILDER[ section ].section.sections_uniqid.default;

			if ( section_id && logicobj[ section_id ] && logicobj[ section_id ].values[ field_index ] ) {
				shippinglogicobj[ section_id ] = {
					values: shippinglogicobj[ section_id ].values
				};
				shippinglogicobj[ section_id ].values.forEach(
					function( e, i ) {
						if ( field_index !== i ) {
							delete shippinglogicobj[ section_id ].values[ i ];
						}
					}
				);
				delete logicobj[ section_id ].values[ field_index ];
				delete options_pre[ section_id ][ field_index + 1 ];
				delete options_pre[ section_id ][ 0 ];
			} else if ( section_id && options_pre[ section_id ] && options_pre[ section_id ][ 0 ] ) {
				delete options_pre[ section_id ][ 0 ];
			}
			$.each( options_pre, function( i, c ) {
				if ( c ) {
					$.each( c, function( ii, d ) {
						if ( d ) {
							options.push( d );
						}
					} );
				}
			} );
			$.each( options_pre_this, function( i, c ) {
				if ( i === section_id ) {
					$.each( c, function( ii, d ) {
						if ( ii === field_index + 1 ) {
							options_this.push( d );
						}
					} );
				}
			} );

			if ( ! $.tmEPOAdmin.elementLogicObject.init ) {
				$.tmEPOAdmin.elementLogicObject.init = true;
			}
			$.tmEPOAdmin.elementLogicObject = $.extend( $.tmEPOAdmin.elementLogicObject, logicobj );

			if ( ! $.tmEPOAdmin.elementShippingLogicObject.init ) {
				$.tmEPOAdmin.elementShippingLogicObject.init = true;
			}
			$.tmEPOAdmin.elementShippingLogicObject = $.extend( $.tmEPOAdmin.elementShippingLogicObject, shippinglogicobj );

			if ( append ) {
				$.tmEPOAdmin.logic_append( append, options, 'element', section, elementIndex );
				$.tmEPOAdmin.shipping_logic_append( append, options_this, 'element', section, elementIndex, 'enable' );
				$.tmEPOAdmin.shipping_logic_append( append, options_this, 'element', section, elementIndex, 'disable' );
			}
		},

		section_logic_init: function( section, append ) {
			var options = [];
			var logicobj = {};
			var options_pre;
			var section_id;
			var sections;

			if ( section instanceof $ ) {
				section = parseInt( section.index(), 10 );
			} else if ( section !== undefined ) {
				section = $.epoAPI.math.toFloat( section );
			}

			if ( section === undefined ) {
				sections = TCBUILDER;
			} else {
				sections = [];
				sections[ section ] = $.extend( true, {}, TCBUILDER[ section ] );
			}

			$.tmEPOAdmin.check_section_logic( section );

			Object.keys( sections ).forEach( function( i ) {
				if ( TCBUILDER[ i ].section !== undefined ) {
					logicobj = $.extend( true, {}, $.tmEPOAdmin.get_element_logic_init( true ) );
					options_pre = $.extend( true, {}, $.tmEPOAdmin.get_element_logic_options_init( true ) );
					section_id = TCBUILDER[ i ].section.sections_uniqid.default;
					if ( section_id && logicobj[ section_id ] ) {
						delete logicobj[ section_id ];
						delete options_pre[ section_id ];
					}
					$.each( options_pre, function( ix, c ) {
						if ( c ) {
							$.each( c, function( ii, d ) {
								if ( d ) {
									options.push( d );
								}
							} );
						}
					} );
					if ( ! $.tmEPOAdmin.sectionLogicObject.init ) {
						$.tmEPOAdmin.sectionLogicObject.init = true;
					}

					$.tmEPOAdmin.sectionLogicObject = $.extend( $.tmEPOAdmin.sectionLogicObject, logicobj );
					if ( append ) {
						$.tmEPOAdmin.logic_append( append, options, 'section', i );
					}
				}
			} );
		},

		logic_check_section_rules: function( rules ) {
			var copy;
			var _logic;

			if ( typeof rules !== 'object' || rules === null ) {
				rules = {};
			}
			if ( rules.toggle === undefined ) {
				rules.toggle = 'show';
			}
			if ( rules.rules === undefined ) {
				rules.rules = [];
			}

			// backwards compatibility conversion.
			rules = $.tmEPOAdmin.convert_rules( rules );

			copy = $.epoAPI.util.deepCopyArray( rules );
			_logic = $.tmEPOAdmin.sectionLogicObject;

			$.each( rules.rules, function( i, _rule ) {
				if ( Array.isArray( _rule ) ) {
					$.each( _rule, function( ii, __rule ) {
						if ( ! ( ( _logic[ __rule.section ] !== undefined && _logic[ __rule.section ].values[ __rule.element ] !== undefined ) || __rule.section === __rule.element ) ) {
							delete copy.rules[ i ][ ii ];
						}
					} );
					if ( copy.rules[ i ].length === 0 ) {
						delete copy.rules[ i ];
					}
					copy.rules[ i ] = tcArrayValues( copy.rules[ i ] );
				}
			} );
			copy.rules = tcArrayValues( copy.rules );

			return copy;
		},

		logic_check_element_rules: function( rules, sectionIndex, fieldIndex ) {
			var copy;
			var _logic;
			var bitem;
			var foundError = false;

			if ( typeof rules !== 'object' || ! rules ) {
				rules = {};
			}
			if ( rules.toggle === undefined ) {
				rules.toggle = 'show';
			}
			if ( rules.rules === undefined ) {
				rules.rules = [];
			}

			// backwards compatibility conversion.
			rules = $.tmEPOAdmin.convert_rules( rules );

			copy = $.epoAPI.util.deepCopyArray( rules );
			_logic = $.tmEPOAdmin.elementLogicObject;
			$.each( rules.rules, function( i, _rule ) {
				if ( Array.isArray( _rule ) ) {
					$.each( _rule, function( ii, __rule ) {
						if ( ! ( ( _logic[ __rule.section ] !== undefined && _logic[ __rule.section ].values[ __rule.element ] !== undefined ) || __rule.section === __rule.element ) ) {
							delete copy.rules[ i ][ ii ];
							foundError = true;
						}
					} );
					if ( copy.rules[ i ].length === 0 ) {
						delete copy.rules[ i ];
					} else {
						copy.rules[ i ] = tcArrayValues( copy.rules[ i ] );
					}
				}
				if ( foundError && sectionIndex !== undefined && fieldIndex !== undefined ) {
					bitem = $( '.builder-layout' ).find( '.builder-wrapper' ).eq( sectionIndex );

					bitem = bitem.find( '.bitem' ).eq( fieldIndex );

					bitem.addClass( 'tm-wrong-rule' );
				}
			} );
			copy.rules = tcArrayValues( copy.rules );

			return copy;
		},

		shipping_logic_check_element_rules: function( rules ) {
			if ( typeof rules !== 'object' || ! rules ) {
				rules = {};
			}
			if ( rules.toggle === undefined ) {
				rules.toggle = 'show';
			}
			if ( rules.rules === undefined ) {
				rules.rules = [];
			}

			return rules;
		},

		convert_rules: function( rules ) {
			if ( rules.what ) {
				if ( rules.what === 'all' ) {
					rules.rules = [ rules.rules ];
				} else if ( rules.what === 'any' ) {
					rules.rules = rules.rules.reduce( function( accumulator, elrule ) {
						accumulator.push( [ elrule ] );
						return accumulator;
					}, [] );
				}
				delete rules.what;
			}
			return rules;
		},

		shipping_logic_append: function( el, options, type, sectionIndex, fieldIndex, shippingtype ) {
			var logic;
			var rawrules;
			var rulesobj;
			var h;
			var fieldseth;
			var fieldsethtml;
			var rule;
			var tm_logic_element;
			var operators;
			var ruleshtml;
			var rules;

			el = $( el );
			logic = $( el ).find( '.tm-shipping-' + shippingtype + '-logicrules + .shipping-logic-div .tm-logic-wrapper' );

			if ( ! options || options.length !== 1 ) {
				logic.html( '<div class="errortitle"><p>' + TMEPOGLOBALADMINJS.i18n_cannot_apply_shippingrules + '</p></div>' );
				return false;
			}

			try {
				rawrules = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'shipping_methods_' + shippingtype + '_logicrules', true ) || 'null';
				rulesobj = $.epoAPI.util.parseJSON( rawrules );
				rules = $.tmEPOAdmin.shipping_logic_check_element_rules( rulesobj );
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'shipping_methods_' + shippingtype + '_logicrules', JSON.stringify( rules ), true );
			} catch ( err ) {
				rules = false;
			}
			logic.empty();
			fieldseth = '<fieldset class="tm-logic-rule-set"><legend>OR</legend><div class="tm-logic-rule-wrap"></div></fieldset>';
			h =
				'<div class="tc-row tm-logic-rule">' +
				'<div class="tc-cell tc-col-auto tm-logic-element"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-operator"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-value"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-func">' +
				'<button type="button" class="tmicon tcfa tcfa-plus add cpf-add-rule"></button>' +
				' <button type="button" class="tmicon tcfa tcfa-trash delete cpf-delete-rule"></button>' +
				'</div>' +
				'</div>';
			rule = $( h );
			tm_logic_element = $( '<select class="cpf-logic-element">' + options.join( '' ) + '</select>' );
			operators = '';

			Object.keys( $.tmEPOAdmin.logicOperators ).forEach( function( i ) {
				operators = operators + '<option value="' + i + '">' + $.tmEPOAdmin.logicOperators[ i ] + '</option>';
			} );

			operators = $( '<select class="cpf-logic-operator">' + operators + '</select>' );

			rule.find( '.tm-logic-element' ).append( tm_logic_element );
			rule.find( '.tm-logic-operator' ).append( operators );

			if ( ! rules || rules.rules === undefined || ! rules.rules.length ) {
				ruleshtml = $( '<div class="temp" />' );
				fieldsethtml = $( fieldseth );
				fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( {}, rule, type, true ) );
				ruleshtml.append( fieldsethtml );
				ruleshtml = ruleshtml.children();
				logic.append( ruleshtml );
				ruleshtml.find( '.cpf-logic-element' ).trigger( 'change.cpf', [ type === 'element' ] );
				ruleshtml.find( '.cpf-logic-operator' ).val( ruleshtml.find( '.cpf-logic-operator' ).children( ':not(.tc-hidden-no-events)' ).eq( 0 ).val() ).trigger( 'change.cpf', [ type === 'element' ] );
				logic.addClass( 'tc-hidden' );
			} else {
				ruleshtml = $( '<div class="temp" />' );
				$.each( rules.rules, function( i, _rule ) {
					fieldsethtml = $( fieldseth );
					if ( _rule && typeof _rule === 'object' ) {
						if ( Array.isArray( _rule ) ) {
							if ( _rule.length ) {
								$.each( _rule, function( ii, __rule ) {
									fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( __rule, rule, type, true ) );
								} );
							} else {
								fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( {}, rule, type, true ) );
							}
						}
						ruleshtml.append( fieldsethtml );
					}
				} );
				ruleshtml = ruleshtml.children();
				logic.append( ruleshtml ).removeClass( 'tc-hidden' );
			}
		},

		logic_append: function( el, options, type, sectionIndex, fieldIndex ) {
			var logic;
			var rawrules;
			var rulesobj;
			var h;
			var fieldseth;
			var fieldsethtml;
			var rule;
			var tm_logic_element;
			var operators;
			var ruleshtml;
			var rules;
			var elementDoesItHaveLogic;

			el = $( el );
			logic = $( el ).find( '.builder-logic-div .tm-logic-wrapper' );

			if ( ! options || options.length === 0 ) {
				logic.html( '<div class="errortitle"><p>' + TMEPOGLOBALADMINJS.i18n_cannot_apply_rules + '</p></div>' );
				return false;
			}

			try {
				if ( type === 'element' ) {
					elementDoesItHaveLogic = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'logic', true ) || '';
				} else {
					elementDoesItHaveLogic = TCBUILDER[ sectionIndex ].section.sections_logic.default || '';
				}
				if ( elementDoesItHaveLogic === '1' ) {
					if ( type === 'element' ) {
						rawrules = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'logicrules', true ) || 'null';
					} else {
						rawrules = TCBUILDER[ sectionIndex ].section.sections_logicrules.default || 'null';
					}
				} else {
					rawrules = 'null';
				}
				rulesobj = $.epoAPI.util.parseJSON( rawrules );
				if ( type === 'element' ) {
					rules = $.tmEPOAdmin.logic_check_element_rules( rulesobj );
				} else {
					rules = $.tmEPOAdmin.logic_check_section_rules( rulesobj );
				}
				if ( type === 'element' ) {
					$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'logicrules', JSON.stringify( rules ), true );
				} else {
					TCBUILDER[ sectionIndex ].section.sections_logicrules.default = JSON.stringify( rules );
				}
			} catch ( err ) {
				rules = false;
			}
			logic.empty();
			fieldseth = '<fieldset class="tm-logic-rule-set"><legend>OR</legend><div class="tm-logic-rule-wrap"></div></fieldset>';
			h =
				'<div class="tc-row tm-logic-rule">' +
				'<div class="tc-cell tc-col-auto tm-logic-element"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-operator"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-value"></div>' +
				'<div class="tc-cell tc-col-auto tm-logic-func">' +
				'<button type="button" class="tmicon tcfa tcfa-plus add cpf-add-rule"></button>' +
				' <button type="button" class="tmicon tcfa tcfa-trash delete cpf-delete-rule"></button>' +
				'</div>' +
				'</div>';
			rule = $( h );
			tm_logic_element = $( '<select class="cpf-logic-element">' + options.join( '' ) + '</select>' );
			operators = '';

			Object.keys( $.tmEPOAdmin.logicOperators ).forEach( function( i ) {
				operators = operators + '<option value="' + i + '">' + $.tmEPOAdmin.logicOperators[ i ] + '</option>';
			} );

			operators = $( '<select class="cpf-logic-operator">' + operators + '</select>' );

			rule.find( '.tm-logic-element' ).append( tm_logic_element );
			rule.find( '.tm-logic-operator' ).append( operators );

			if ( ! rules || rules.rules === undefined || ! rules.rules.length ) {
				ruleshtml = $( '<div class="temp" />' );
				fieldsethtml = $( fieldseth );
				fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( {}, rule, type ) );
				ruleshtml.append( fieldsethtml );
				ruleshtml = ruleshtml.children();
				logic.append( ruleshtml );
				ruleshtml.find( '.cpf-logic-element' ).trigger( 'change.cpf', [ type === 'element' ] );
				ruleshtml.find( '.cpf-logic-operator' ).val( ruleshtml.find( '.cpf-logic-operator' ).children( ':not(.tc-hidden-no-events)' ).eq( 0 ).val() ).trigger( 'change.cpf', [ type === 'element' ] );
			} else {
				// backwards compatibility conversion.
				rules = $.tmEPOAdmin.convert_rules( rules );

				ruleshtml = $( '<div class="temp" />' );
				$.each( rules.rules, function( i, _rule ) {
					fieldsethtml = $( fieldseth );
					if ( _rule && typeof _rule === 'object' ) {
						if ( Array.isArray( _rule ) ) {
							if ( _rule.length ) {
								$.each( _rule, function( ii, __rule ) {
									fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( __rule, rule, type ) );
								} );
							} else {
								fieldsethtml.find( '.tm-logic-rule-wrap' ).append( $.tmEPOAdmin.logic_append_rule( {}, rule, type ) );
							}
						}
						ruleshtml.append( fieldsethtml );
					}
				} );
				ruleshtml = ruleshtml.children();
				logic.append( ruleshtml );
			}
		},

		logic_append_rule: function( rule, rulehtml, type, isShipping ) {
			var current_rule;
			var set_select;
			current_rule = rulehtml.clone();
			set_select = current_rule.find( '.cpf-logic-element' ).find( 'option[data-section="' + rule.section + '"][value="' + rule.element + '"]' );
			if ( $( set_select ).length ) {
				$( set_select )[ 0 ].selected = true;
			}
			$.tmEPOAdmin.cpf_logic_element_onchange( current_rule.find( '.cpf-logic-element' ), isShipping ? 2 : type === 'element' );

			current_rule.find( '.cpf-logic-operator' ).val( rule.operator );
			$.tmEPOAdmin.cpf_logic_operator_onchange( current_rule.find( '.cpf-logic-operator' ), type === 'element' );

			if ( undefined === rule.value ) {
				rule.value = '';
			}
			if ( current_rule.find( '.cpf-logic-value' ).is( 'select' ) ) {
				current_rule.find( '.cpf-logic-value' ).val( $.tmEPOAdmin.tm_escape( $.tmEPOAdmin.tm_unescape( rule.value ) ) );
			} else {
				current_rule.find( '.cpf-logic-value' ).val( $.tmEPOAdmin.tm_unescape( rule.value ) );
			}

			return current_rule;
		},

		logic_get_JSON: function( s, type, thisId ) {
			var rules = $( s ).find( '.builder-logic-div' );
			var logic = {};
			var _toggle = rules.find( '.epo-rule-toggle' ).val();
			var $cpf_logic_element;
			var cpf_logic_section;
			var cpf_logic_element;
			var cpf_logic_operator;
			var cpfLogicValue;

			logic[ type ] = thisId;
			logic.toggle = _toggle;
			logic.rules = [];

			rules
				.find( '.tm-logic-wrapper' )
				.children( '.tm-logic-rule-set' )
				.each( function( iset, elset ) {
					var setRules = [];
					elset = $( elset );

					elset.find( '.tm-logic-rule-wrap' ).children( '.tm-logic-rule' ).each( function( i, el ) {
						el = $( el );
						$cpf_logic_element = el.find( '.cpf-logic-element' );
						cpf_logic_section = $cpf_logic_element.children( 'option:selected' ).attr( 'data-section' );
						cpf_logic_element = $cpf_logic_element.val();
						cpf_logic_operator = el.find( '.cpf-logic-operator' ).val();
						cpfLogicValue = el.find( '.cpf-logic-value' ).val();

						if ( cpfLogicValue === undefined ) {
							cpfLogicValue = '';
						}

						if ( ! el.find( '.cpf-logic-value' ).is( 'select' ) ) {
							cpfLogicValue = $.tmEPOAdmin.tm_escape( cpfLogicValue );
						}

						setRules.push( {
							section: cpf_logic_section,
							element: cpf_logic_element,
							operator: cpf_logic_operator,
							value: cpfLogicValue
						} );
					} );

					logic.rules.push( setRules );
				} );

			return JSON.stringify( logic );
		},

		shipping_logic_get_JSON: function( s, type, thisId, shippingtype ) {
			var rules = $( s ).find( '.tm-shipping-' + shippingtype + '-logicrules + .shipping-logic-div' );
			var logic = {};
			var $cpf_logic_element;
			var cpf_logic_section;
			var cpf_logic_element;
			var cpf_logic_operator;
			var cpfLogicValue;
			var logicwrapper = rules.find( '.tm-logic-wrapper' );

			if ( logicwrapper.is( '.tc-hidden' ) ) {
				return '';
			}

			logic[ type ] = thisId;
			logic.toggle = 'show';
			logic.rules = [];

			logicwrapper
				.children( '.tm-logic-rule-set' )
				.each( function( iset, elset ) {
					var setRules = [];
					elset = $( elset );

					elset.find( '.tm-logic-rule-wrap' ).children( '.tm-logic-rule' ).each( function( i, el ) {
						el = $( el );
						$cpf_logic_element = el.find( '.cpf-logic-element' );
						cpf_logic_section = $cpf_logic_element.children( 'option:selected' ).attr( 'data-section' );
						cpf_logic_element = $cpf_logic_element.val();
						cpf_logic_operator = el.find( '.cpf-logic-operator' ).val();
						cpfLogicValue = el.find( '.cpf-logic-value' ).val();

						if ( cpfLogicValue === undefined ) {
							cpfLogicValue = '';
						}

						if ( ! el.find( '.cpf-logic-value' ).is( 'select' ) ) {
							cpfLogicValue = $.tmEPOAdmin.tm_escape( cpfLogicValue );
						}

						setRules.push( {
							section: cpf_logic_section,
							element: cpf_logic_element,
							operator: cpf_logic_operator,
							value: cpfLogicValue
						} );
					} );

					logic.rules.push( setRules );
				} );

			return JSON.stringify( logic );
		},

		section_logic_get_JSON: function( s ) {
			var hasLogic = s.find( '.activate-sections-logic' ).is( ':checked' );
			var logic = '';
			var this_section_id;
			if ( hasLogic ) {
				this_section_id = s.find( '.tm-builder-sections-uniqid' ).val();
				logic = $.tmEPOAdmin.logic_get_JSON( s, 'section', this_section_id );
			}
			return logic;
		},

		element_logic_get_JSON: function( s ) {
			var hasLogic = s.find( '.activate-element-logic' ).is( ':checked' );
			var logic = '';
			var this_element_id;
			if ( hasLogic ) {
				this_element_id = s.find( '.tm-builder-element-uniqid' ).val();
				logic = $.tmEPOAdmin.logic_get_JSON( s, 'element', this_element_id );
			}
			return logic;
		},

		element_shipping_logic_get_JSON: function( s, shippingtype ) {
			var logic = '';
			var this_element_id;
			this_element_id = s.find( '.tm-builder-element-uniqid' ).val();
			logic = $.tmEPOAdmin.shipping_logic_get_JSON( s, 'element', this_element_id, shippingtype );
			return logic;
		},

		cpf_add_rule: function( e ) {
			var _last = $( this ).closest( '.tm-logic-rule' );
			var _clone = _last.tcClone( true );

			e.preventDefault();
			if ( _clone ) {
				_last.after( _clone );
			}
		},

		cpf_add_rule_set: function( e ) {
			var element = $( this );
			var mainDiv = element.closest( '.builder-logic-div, .shipping-logic-div' );
			var logicWrapper = mainDiv.find( '.tm-logic-wrapper' );
			var _last = logicWrapper.find( '.tm-logic-rule-set:last()' );
			var _clone;

			e.preventDefault();

			if ( logicWrapper.is( '.tc-hidden' ) ) {
				logicWrapper.removeClass( 'tc-hidden' );
			} else {
				_clone = _last.tcClone( true );
				if ( _clone ) {
					_clone.find( '.tm-logic-rule:not(:first)' ).remove();
					_last.after( _clone );
					_clone.find( '.tm-logic-rule:first .cpf-logic-element' ).prop( 'selectedIndex', 0 ).trigger( 'change.cpf' );
				}
			}
		},

		cpf_delete_rule: function( e ) {
			var element = $( this );
			var logicWrapper = element.closest( '.tm-logic-wrapper' );
			var _wrapper = element.closest( '.tm-logic-rule-set' );
			var shouldDeleteSet = logicWrapper.children( '.tm-logic-rule-set' ).length > 1;
			var rulesLength = _wrapper.find( '.tm-logic-rule-wrap' ).children( '.tm-logic-rule' ).length;

			e.preventDefault();
			element.trigger( 'hideTtooltip' );

			if ( rulesLength > 1 || shouldDeleteSet ) {
				element
					.closest( '.tm-logic-rule' )
					.css( {
						margin: '0 auto'
					} )
					.animate(
						{
							opacity: 0,
							height: 0,
							width: 0
						},
						300,
						function() {
							if ( shouldDeleteSet && rulesLength === 1 ) {
								_wrapper.remove();
							} else {
								$( this ).remove();
							}
						}
					);
			} else {
				logicWrapper.addClass( 'tc-hidden' );
			}
		},

		section_logic_reindex: function() {
			var l = $.tmEPOAdmin.builderItemsSortableObj;

			Object.keys( TCBUILDER ).forEach( function( sectionIndex ) {
				var section_eq = sectionIndex;
				var copy_rules = [];
				var section_rules = TCBUILDER[ sectionIndex ].section.sections_logicrules.default || 'null';
				var copy;

				if ( ! TCBUILDER[ sectionIndex ].section.sections_logic.default ) {
					return true; // skip
				}

				section_rules = $.epoAPI.util.parseJSON( section_rules );

				if ( ! ( section_rules && section_rules.rules !== undefined && section_rules.rules.length > 0 ) ) {
					return true; // skip
				}

				// backwards compatibility conversion.
				section_rules = $.tmEPOAdmin.convert_rules( section_rules );

				// Element is dragged on this section
				if ( l.end.section_eq === section_eq ) {
					// Getting here means that an element from another section
					// is being dragged on this section
					$.each( section_rules.rules, function( i, rule ) {
						if ( Array.isArray( rule ) ) {
							copy_rules[ i ] = [];
							$.each( rule, function( ii, __rule ) {
								copy = $.epoAPI.util.deepCopyArray( __rule );
								if ( __rule.element > l.start.element && __rule.section === l.start.section ) {
									copy.element = parseInt( copy.element, 10 ) - 1;
									copy_rules[ i ][ ii ] = $.tmEPOAdmin.validate_rule( copy, sectionIndex );
								} else {
									copy_rules[ i ][ ii ] = $.tmEPOAdmin.validate_rule( copy, sectionIndex );
								}
							} );
							copy_rules[ i ] = tcArrayValues( copy_rules[ i ] );
						}
					} );
					copy_rules = tcArrayValues( copy_rules );
					if ( copy_rules.length === 0 ) {
						TCBUILDER[ sectionIndex ].section.sections_logic.default = '';
					}
					section_rules.rules = copy_rules;
					TCBUILDER[ sectionIndex ].section.sections_logicrules.default = JSON.stringify( section_rules );

					// Element is not dragged on this section
				} else {
					// Getting here means that an element from another section
					// is being dragged on another section that is not the current section
					$.each( section_rules.rules, function( i, rule ) {
						if ( Array.isArray( rule ) ) {
							copy_rules[ i ] = [];
							$.each( rule, function( ii, __rule ) {
								copy = $.epoAPI.util.deepCopyArray( __rule );
								if ( l.start.section !== 'check' ) {
									// Element is not changing sections
									if ( __rule.section === l.start.section && __rule.section === l.end.section ) {
										// Element belonging to a rule is being dragged
										if ( __rule.element === l.start.element ) {
											copy.section = l.end.section;
											copy.element = l.end.element;
										} else if ( parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) <= parseInt( l.end.element, 10 ) ) {
											// Element not belonging to a rule is being dragged
											// and breaks the rule
											copy.element = parseInt( copy.element, 10 ) - 1;
										} else if ( parseInt( __rule.element, 10 ) < parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
											copy.element = parseInt( copy.element, 10 ) + 1;
										}
									} else if ( __rule.section === l.start.section && __rule.section !== l.end.section ) { // Element is getting dragged off this section
										// Element belonging to a rule is being dragged
										if ( __rule.element === l.start.element ) {
											copy.section = l.end.section;
											copy.element = l.end.element;
										} else if ( parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) ) {
										// Element not belonging to a rule is being dragged
										// and breaks the rule
											if ( copy.section !== copy.element ) { // if it is not a section rule
												copy.element = parseInt( copy.element, 10 ) - 1;
											}
										}
									} else if ( __rule.section !== l.start.section && __rule.section === l.end.section ) { // Element is getting dragged on this section
										// __rule.section !== __rule.element means that we only want to alter elements, not sections
										if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
											copy.element = parseInt( copy.element, 10 ) + 1;
										}
									}
								}
								if ( ! ( l.end.section === 'delete' && copy.element === 'delete' ) ) {
									copy_rules[ i ][ ii ] = $.tmEPOAdmin.validate_rule( copy, sectionIndex );
								}
							} );
							copy_rules[ i ] = tcArrayValues( copy_rules[ i ] );
						}
					} );
					copy_rules = tcArrayValues( copy_rules );
					if ( copy_rules.length === 0 ) {
						TCBUILDER[ sectionIndex ].section.sections_logic.default = '';
					}
					section_rules.rules = copy_rules;
					TCBUILDER[ sectionIndex ].section.sections_logicrules.default = JSON.stringify( section_rules );
				}
			} );
		},

		element_logic_reindex: function() {
			var l = $.tmEPOAdmin.builderItemsSortableObj;
			var field;
			var disabledFieldIndex;
			var elementType;

			disabledFieldIndex = l.start.disabledFieldIndex;
			if ( disabledFieldIndex ) {
				l.start.element = disabledFieldIndex.toString();
			}
			disabledFieldIndex = l.end.disabledFieldIndex;
			if ( disabledFieldIndex ) {
				l.end.element = disabledFieldIndex.toString();
			}

			Object.keys( TCBUILDER ).forEach( function( sectionIndex ) {
				Object.keys( TCBUILDER[ sectionIndex ].fields ).forEach( function( fieldIndex ) {
					field = TCBUILDER[ sectionIndex ].fields[ fieldIndex ];
					elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );

					$.tmEPOAdmin.do_element_logic_reindex( field, elementType, sectionIndex, fieldIndex, l );
					$.tmEPOAdmin.do_element_shipping_logic_reindex( field, elementType, sectionIndex, fieldIndex, l, 'enable' );
					$.tmEPOAdmin.do_element_shipping_logic_reindex( field, elementType, sectionIndex, fieldIndex, l, 'disable' );
				} );
			} );
		},

		do_element_logic_reindex: function( field, elementType, sectionIndex, fieldIndex, l ) {
			var copy_rules;
			var element_rules;
			var copy;

			if ( ! $.tmEPOAdmin.getFieldValue( field, 'logic', elementType ) ) {
				return true; // skip
			}

			copy_rules = [];
			element_rules = $.tmEPOAdmin.getFieldValue( field, 'logicrules', elementType );

			element_rules = $.epoAPI.util.parseJSON( element_rules );

			// backwards compatibility conversion.
			element_rules = $.tmEPOAdmin.convert_rules( element_rules );

			if ( ! ( element_rules && element_rules.rules !== undefined && element_rules.rules.length > 0 ) ) {
				return true; // skip
			}

			$.each( element_rules.rules, function( i, rule ) {
				if ( Array.isArray( rule ) ) {
					copy_rules[ i ] = [];
					$.each( rule, function( ii, __rule ) {
						copy = $.epoAPI.util.deepCopyArray( __rule );
						if ( __rule.element === undefined ) {
							return true;
						}
						__rule.element = __rule.element.toString();

						if ( l.start.section !== 'check' ) {
							// Element is not changing sections
							if ( __rule.section === l.start.section && __rule.section === l.end.section ) {
								// Element belonging to a rule is being dragged
								if ( __rule.element === l.start.element ) {
									//copy.section=l.end.section;
									copy.element = l.end.element;
								// rule.section !== rule.element means that we only want to alter elements, not sections
								} else if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) <= parseInt( l.end.element, 10 ) ) {
									// Element not belonging to a rule is being dragged
									// and breaks the rule
									copy.element = parseInt( copy.element, 10 ) - 1;
								} else if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) < parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
									// rule.section !== rule.element means that we only want to alter elements, not sections
									copy.element = parseInt( copy.element, 10 ) + 1;
								}
							} else if ( __rule.section === l.start.section && __rule.section !== l.end.section ) { // Element is getting dragged off its section
								// Element belonging to a rule is being dragged
								if ( __rule.element === l.start.element ) {
									copy.section = l.end.section;
									copy.element = l.end.element;
								// rule.section !== rule.element means that we only want to alter elements, not sections
								} else if ( __rule.section !== __rule.element && ! $.tmEPOAdmin.builderItemsSortableObj.start.disabled && parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) ) {
									// Element not belonging to a rule is being dragged
									// and breaks the rule
									copy.element = parseInt( copy.element, 10 ) - 1;
								}
							// __rule.section !== __rule.element means that we only want to alter elements, not sections
							} else if ( __rule.section !== l.start.section && __rule.section === l.end.section ) { // Element is getting dragged on this rule's section
								if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
									copy.element = parseInt( copy.element, 10 ) + 1;
								}
							}
						}
						if ( ! ( l.end.section === 'delete' && copy.element === 'delete' ) ) {
							if ( $.tmEPOAdmin.builderItemsSortableObj.end.novalidate && $.tmEPOAdmin.builderItemsSortableObj.end.novalidate === 'delete' ) {
								copy_rules[ i ][ ii ] = copy;
							} else {
								copy_rules[ i ][ ii ] = $.tmEPOAdmin.validate_rule( copy, sectionIndex, fieldIndex );
							}
						}
					} );
					if ( copy_rules[ i ].length === 0 ) {
						delete copy_rules[ i ];
					} else {
						copy_rules[ i ] = tcArrayValues( copy_rules[ i ] );
					}
				}
			} );

			copy_rules = tcArrayValues( copy_rules );
			if ( copy_rules.length === 0 ) {
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'logic', '', elementType );
			}
			element_rules.rules = copy_rules;

			$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'logicrules', JSON.stringify( element_rules ), elementType );
		},

		do_element_shipping_logic_reindex: function( field, elementType, sectionIndex, fieldIndex, l, shippingtype ) {
			var copy_rules;
			var copy;
			var shippingField = 'shipping_methods_' + shippingtype + '_logicrules';
			var element_rules = $.tmEPOAdmin.getFieldValue( field, shippingField, elementType );

			if ( ! element_rules ) {
				return true; // skip
			}

			copy_rules = [];

			element_rules = $.epoAPI.util.parseJSON( element_rules );

			if ( ! ( element_rules && element_rules.rules !== undefined && element_rules.rules.length > 0 ) ) {
				return true; // skip
			}

			$.each( element_rules.rules, function( i, rule ) {
				if ( Array.isArray( rule ) ) {
					copy_rules[ i ] = [];
					$.each( rule, function( ii, __rule ) {
						copy = $.epoAPI.util.deepCopyArray( __rule );
						if ( __rule.element === undefined ) {
							return true;
						}
						__rule.element = __rule.element.toString();

						if ( l.start.section !== 'check' ) {
							// Element is not changing sections
							if ( __rule.section === l.start.section && __rule.section === l.end.section ) {
								// Element belonging to a rule is being dragged
								if ( __rule.element === l.start.element ) {
									//copy.section=l.end.section;
									copy.element = l.end.element;
								// rule.section !== rule.element means that we only want to alter elements, not sections
								} else if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) <= parseInt( l.end.element, 10 ) ) {
									// Element not belonging to a rule is being dragged
									// and breaks the rule
									copy.element = parseInt( copy.element, 10 ) - 1;
								} else if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) < parseInt( l.start.element, 10 ) && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
									// rule.section !== rule.element means that we only want to alter elements, not sections
									copy.element = parseInt( copy.element, 10 ) + 1;
								}
							} else if ( __rule.section === l.start.section && __rule.section !== l.end.section ) { // Element is getting dragged off its section
								// Element belonging to a rule is being dragged
								if ( __rule.element === l.start.element ) {
									copy.section = l.end.section;
									copy.element = l.end.element;
								// rule.section !== rule.element means that we only want to alter elements, not sections
								} else if ( __rule.section !== __rule.element && ! $.tmEPOAdmin.builderItemsSortableObj.start.disabled && parseInt( __rule.element, 10 ) > parseInt( l.start.element, 10 ) ) {
									// Element not belonging to a rule is being dragged
									// and breaks the rule
									copy.element = parseInt( copy.element, 10 ) - 1;
								}
							// __rule.section !== __rule.element means that we only want to alter elements, not sections
							} else if ( __rule.section !== l.start.section && __rule.section === l.end.section ) { // Element is getting dragged on this rule's section
								if ( __rule.section !== __rule.element && parseInt( __rule.element, 10 ) >= parseInt( l.end.element, 10 ) ) {
									copy.element = parseInt( copy.element, 10 ) + 1;
								}
							}
						}
						if ( ! ( l.end.section === 'delete' && copy.element === 'delete' ) ) {
							copy_rules[ i ][ ii ] = copy;
						}
					} );
					if ( copy_rules[ i ].length === 0 ) {
						delete copy_rules[ i ];
					} else {
						copy_rules[ i ] = tcArrayValues( copy_rules[ i ] );
					}
				}
			} );

			copy_rules = tcArrayValues( copy_rules );
			if ( copy_rules.length === 0 ) {
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, shippingField, '', elementType );
			} else {
				element_rules.rules = copy_rules;
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, shippingField, JSON.stringify( element_rules ), elementType );
			}
		},

		validate_rule: function( rule, sectionIndex, fieldIndex ) {
			var section;
			var field;
			var check;
			var tm_option_values;
			var bitem;
			var elementType;
			var fieldsNoDisabled;

			if (
				! globalVariationObject ||
				! rule ||
				typeof rule !== 'object' ||
				rule.element === undefined ||
				rule.operator === undefined ||
				rule.section === undefined ||
				( rule.value === undefined && ! ( rule.operator === 'isempty' || rule.operator === 'isnotempty' ) )
			) {
				return []; //false wrong rule
			}
			section = TCBUILDER.findIndex( function( y ) {
				return y.section.sections_uniqid.default === rule.section;
			} );

			if ( section === -1 ) {
				return []; //false
			}

			fieldsNoDisabled = TCBUILDER[ section ].fields.filter( function( x ) {
				var type = $.tmEPOAdmin.getFieldValue( x, 'element_type' );
				return $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === '1' || $.tmEPOAdmin.getFieldValue( x, 'enabled', type ) === undefined;
			} );

			field = fieldsNoDisabled[ rule.element ];

			if ( field !== undefined ) {
				elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
				check = false;

				if ( $.inArray( elementType, [ 'radiobuttons', 'checkboxes', 'selectbox', 'selectboxmultiple' ] ) !== -1 ) {
					tm_option_values = $.tmEPOAdmin.getFieldMultiple( field, 'value', elementType );

					Object.keys( tm_option_values ).some( function( el, index ) {
						if ( $.tmEPOAdmin.tm_escape( tm_option_values[ index ].default ) === rule.value ) {
							check = true;
						} else if ( tm_option_values[ index ].default === rule.value ) {
							rule.value = $.tmEPOAdmin.tm_escape( rule.value );
							check = true;
						}
						return check;
					} );
				} else if ( elementType === 'variations' ) {
					if ( rule.operator === 'is' || rule.operator === 'isnot' ) {
						$( globalVariationObject.variations ).each( function( index, variation ) {
							if ( $.tmEPOAdmin.tm_escape( variation.variation_id ) === rule.value ) {
								check = true;
								return false;
							}
						} );
					} else {
						check = true;
					}
				} else {
					check = true; //other fields always true if they exist
				}
			} else {
				check = true; //this is a section
			}

			bitem = $( '.builder-layout' ).find( '.builder-wrapper' ).eq( sectionIndex );
			if ( fieldIndex !== undefined ) {
				bitem = bitem.find( '.bitem' ).eq( fieldIndex );
			}

			if ( bitem.length > 0 ) {
				if ( check || ( fieldIndex !== undefined && $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'logic', elementType ) === '' ) ) {
					bitem.removeClass( 'tm-wrong-rule' );
					return rule;
				}
				bitem.addClass( 'tm-wrong-rule' );
				return []; //false
			}

			// failsafe
			return []; //false
		},

		logic_check_rules_reindex: function( el, rules, true_field_index, new_field_index, section_id, new_enabled, new_logic ) {
			var copy;

			if ( typeof rules !== 'object' || rules === null ) {
				rules = {};
			}
			if ( rules.toggle === undefined ) {
				rules.toggle = 'show';
			}
			if ( rules.rules === undefined ) {
				rules.rules = [];
			}

			// backwards compatibility conversion.
			rules = $.tmEPOAdmin.convert_rules( rules );

			copy = $.epoAPI.util.deepCopyArray( rules );

			true_field_index = parseInt( true_field_index, 10 );
			new_field_index = parseInt( new_field_index, 10 );
			new_enabled = parseInt( new_enabled, 10 );
			new_logic = parseInt( new_logic, 10 );

			$.each( rules.rules, function( i, _rule ) {
				var section;
				var element;
				if ( Array.isArray( _rule ) ) {
					$.each( _rule, function( ii, __rule ) {
						section = __rule.section;
						element = __rule.element;

						if ( section === section_id && element.toString().isNumeric() ) {
							element = parseInt( element, 10 );
							if ( true_field_index === element ) {
								if ( new_logic && new_enabled === 0 ) {
									delete copy.rules[ i ][ ii ];
									el.addClass( 'tm-wrong-rule' );
								} else if ( new_enabled === 1 ) {
									element += 1;
									copy.rules[ i ][ ii ].element = element.toString();
								}
							} else if ( true_field_index < element ) {
								if ( new_enabled === 0 ) {
									element -= 1;
									copy.rules[ i ][ ii ].element = element.toString();
								} else if ( new_enabled === 1 ) {
									element += 1;
									copy.rules[ i ][ ii ].element = element.toString();
								}
							}
						}
					} );
					if ( copy.rules[ i ].length === 0 ) {
						delete copy.rules[ i ];
					} else {
						copy.rules[ i ] = tcArrayValues( copy.rules[ i ] );
					}
				}
			} );

			copy.rules = tcArrayValues( copy.rules );

			return copy;
		},

		logic_reindex: function() {
			var l = $.tmEPOAdmin.builderItemsSortableObj;

			if ( ! ( l.start.section === l.end.section && l.start.section_eq === l.end.section_eq && l.start.element === l.end.element ) ) {
				$.tmEPOAdmin.section_logic_reindex();
				$.tmEPOAdmin.element_logic_reindex();
			}
			$.tmEPOAdmin.builderItemsSortableObj = { start: {}, end: {} };
		},

		logic_reindex_force: function() {
			$.tmEPOAdmin.builderItemsSortableObj.start.section = 'check';
			$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = 'check';
			$.tmEPOAdmin.builderItemsSortableObj.start.element = 'check';
			$.tmEPOAdmin.builderItemsSortableObj.end.section = 'check2';
			$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = 'check2';
			$.tmEPOAdmin.builderItemsSortableObj.end.element = 'check2';

			$.tmEPOAdmin.section_logic_reindex();
			$.tmEPOAdmin.element_logic_reindex();
			$.tmEPOAdmin.builderItemsSortableObj = { start: {}, end: {} };
		},

		// Elements sortable
		builder_items_sortable: function( obj ) {
			if ( ! $.tmEPOAdmin.is_original ) {
				return;
			}

			obj.sortable( {
				handle: '.move',
				cursor: 'grabbing',
				items: '.bitem',
				start: function( e, ui ) {
					var builderWrapper;
					var is_slider;
					var sortable_field_index;
					var disabledFieldIndex;
					var sectionIndex;

					ui.placeholder.height( ui.helper.outerHeight() );
					ui.placeholder.width( ui.helper.outerWidth() );
					$.tmEPOAdmin.isElementDragged = true;
					if ( ! $( ui.item ).hasClass( 'ditem' ) ) {
						builderWrapper = $( ui.item ).closest( '.builder-wrapper' );
						sectionIndex = builderWrapper.index();
						is_slider = TCBUILDER[ sectionIndex ].section.is_slider;

						sortable_field_index = $.tmEPOAdmin.find_index( is_slider, $( ui.item ) );
						disabledFieldIndex = $.tmEPOAdmin.find_index( is_slider, $( ui.item ), '.bitem', '.element-is-disabled' );

						TCBUILDER[ sectionIndex ].section.sections.default = parseInt( TCBUILDER[ sectionIndex ].section.sections.default, 10 ) - 1;
						TCBUILDER[ sectionIndex ].section.sections.default = TCBUILDER[ sectionIndex ].section.sections.default.toString();
						if ( is_slider ) {
							TCBUILDER[ sectionIndex ].section.sections_slides.default = builderWrapper
								.find( '.bitem-wrapper' )
								.map( function( i, ee ) {
									return $( ee ).children( '.bitem' ).not( '.pl2' ).length;
								} )
								.get()
								.join( ',' );
						}

						$.tmEPOAdmin.builderItemsSortableObj.start.section = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
						$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = sectionIndex.toString();
						$.tmEPOAdmin.builderItemsSortableObj.start.element = sortable_field_index.toString();
						$.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex = disabledFieldIndex;
					} else {
						$.tmEPOAdmin.builderItemsSortableObj.start.section = 'drag';
						$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = 'drag';
						$.tmEPOAdmin.builderItemsSortableObj.start.element = 'drag';
					}

					$( '.builder-layout .bitem-wrapper' ).not( '.tma-variations-wrap .bitem-wrapper' ).addClass( 'highlight' );
				},
				stop: function( e, ui ) {
					var builderWrapper;
					var is_slider;
					var field_index;
					var sortable_field_index;
					var disabledFieldIndex;
					var sectionIndex;

					$.tmEPOAdmin.isElementDragged = false;
					builderWrapper = $( ui.item ).closest( '.builder-wrapper' );
					sectionIndex = builderWrapper.index();
					is_slider = TCBUILDER[ sectionIndex ].section.is_slider;
					field_index = $.tmEPOAdmin.find_index( is_slider, $( ui.item ) );
					sortable_field_index = $.tmEPOAdmin.find_index( is_slider, $( ui.item ) );
					disabledFieldIndex = $.tmEPOAdmin.find_index( is_slider, $( ui.item ), '.bitem', '.element-is-disabled' );
					if ( ! $( ui.item ).hasClass( 'ditem' ) ) {
						$( '.builder-wrapper.tm-zindex' ).css( 'zIndex', '' ).removeClass( 'tm-zindex' );
						TCBUILDER[ sectionIndex ].section.sections.default = parseInt( TCBUILDER[ sectionIndex ].section.sections.default, 10 ) + 1;
						TCBUILDER[ sectionIndex ].section.sections.default = TCBUILDER[ sectionIndex ].section.sections.default.toString();
						if ( is_slider ) {
							TCBUILDER[ sectionIndex ].section.sections_slides.default = builderWrapper
								.find( '.bitem-wrapper' )
								.map( function( i, ee ) {
									return $( ee ).children( '.bitem' ).not( '.pl2' ).length;
								} )
								.get()
								.join( ',' );
						}
					}
					$.tmEPOAdmin.builderItemsSortableObj.end.section = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
					$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = sectionIndex.toString();
					$.tmEPOAdmin.builderItemsSortableObj.end.element = sortable_field_index.toString();
					$.tmEPOAdmin.builderItemsSortableObj.end.disabledFieldIndex = disabledFieldIndex;

					TCBUILDER[ sectionIndex ].fields.splice( field_index, 0, TCBUILDER[ $.tmEPOAdmin.builderItemsSortableObj.start.section_eq ].fields.splice( $.tmEPOAdmin.builderItemsSortableObj.start.element, 1 )[ 0 ] );

					$.tmEPOAdmin.builder_reorder_multiple();

					$.tmEPOAdmin.logic_reindex();
					$( '.builder-layout .bitem-wrapper' ).removeClass( 'highlight' );
				},
				tolerance: 'pointer',
				forcePlaceholderSize: true,
				placeholder: 'bitem pl2',
				cancel: '.panels_wrap,.tma-nomove',
				dropOnEmptyType: true,
				revert: 200,
				connectWith: '.builder-wrapper:not(.tma-nomove) .bitem-wrapper'
			} );
		},

		builder_delete_do: function() {
			var builderWrapper;
			var builderLayout;
			var _bitem;
			var is_slider;
			var field_index;
			var sortable_field_index;
			var $this = $( this );
			var sectionIndex;
			var elementType;
			var is_enabled;
			var field;

			builderLayout = $this.closest( '.builder-layout' );

			if ( builderLayout.is( '.builder-template' ) ) {
				$.tmEPOAdmin.builder_section_delete_do.apply( this );
				return;
			}

			builderWrapper = $this.closest( '.builder-wrapper' );
			sectionIndex = builderWrapper.index();
			_bitem = $this.closest( '.bitem' );
			is_slider = TCBUILDER[ sectionIndex ].section.is_slider;
			field_index = $.tmEPOAdmin.find_index( is_slider, _bitem );
			sortable_field_index = $.tmEPOAdmin.find_index( is_slider, _bitem, '.bitem', '.element-is-disabled' );
			TCBUILDER[ sectionIndex ].section.sections.default = parseInt( TCBUILDER[ sectionIndex ].section.sections.default, 10 ) - 1;
			TCBUILDER[ sectionIndex ].section.sections.default = TCBUILDER[ sectionIndex ].section.sections.default.toString();
			field = TCBUILDER[ sectionIndex ].fields[ field_index ];
			elementType = $.tmEPOAdmin.getFieldValue( field, 'element_type' );
			is_enabled = $.tmEPOAdmin.getFieldValue( field, 'enabled', elementType ) === undefined || $.tmEPOAdmin.getFieldValue( field, 'enabled', elementType ) === '1';

			$.tmEPOAdmin.builderItemsSortableObj.start.section = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
			$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = sectionIndex.toString();
			$.tmEPOAdmin.builderItemsSortableObj.start.element = sortable_field_index.toString();

			$.tmEPOAdmin.builderItemsSortableObj.end.section = 'delete';
			$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = 'delete';
			$.tmEPOAdmin.builderItemsSortableObj.end.element = 'delete';

			if ( ! is_enabled ) {
				$.tmEPOAdmin.builderItemsSortableObj.start.disabled = true;
				$.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex = $.tmEPOAdmin.find_index( is_slider, $this, '.bitem', '.element-is-disabled' );
			}
			_bitem.remove();
			TCBUILDER[ sectionIndex ].fields.splice( field_index, 1 );
			$.tmEPOAdmin.logic_reindex();

			if ( is_slider ) {
				TCBUILDER[ sectionIndex ].section.sections_slides.default = builderWrapper
					.find( '.bitem-wrapper' )
					.map( function( i, e ) {
						return $( e ).children( '.bitem' ).not( '.pl2' ).length;
					} )
					.get()
					.join( ',' );
			}

			$.tmEPOAdmin.builder_reorder_multiple();
		},

		// Element delete button
		builder_delete_onClick: function( e ) {
			e.preventDefault();
			$( this ).trigger( 'blur' );
			$.tmEPOAdmin.doConfirm( TMEPOGLOBALADMINJS.i18n_builder_delete, $.tmEPOAdmin.builder_delete_do, this );
		},

		builder_fold_onClick: function() {
			var $this = $( this );
			var handle_wrap;
			var handle_wrapper;

			if ( $this.is( '.tma-handle' ) ) {
				$this = $this.find( '.fold' );
			}
			handle_wrap = $this.closest( '.tma-handle-wrap' );
			handle_wrapper = handle_wrap.find( '.tma-handle-wrapper' ).first();
			if ( ! $this.data( 'folded' ) && $this.data( 'folded' ) !== undefined ) {
				$this.data( 'folded', true );
				$this.removeClass( 'tcfa-caret-down' ).addClass( 'tcfa-caret-up' );
				handle_wrapper.addClass( 'tm-hidden' );
			} else {
				$this.data( 'folded', false );
				$this.removeClass( 'tcfa-caret-up' ).addClass( 'tcfa-caret-down' );
				handle_wrapper.removeClass( 'tm-hidden' );
			}
		},

		builder_section_fold_onClick: function() {
			var $this = $( this );
			var builderWrapper = $this.closest( '.builder-wrapper' );

			if ( ! $this.data( 'folded' ) ) {
				$this.data( 'folded', true );
				builderWrapper.addClass( 'tm-hide-bitems' ); //hide
				$this.removeClass( 'tcfa-caret-down' ).addClass( 'tcfa-caret-up' );
			} else {
				$this.data( 'folded', false );
				builderWrapper.removeClass( 'tm-hide-bitems' ); //show
				$this.removeClass( 'tcfa-caret-up' ).addClass( 'tcfa-caret-down' );
			}
		},

		builder_section_delete_do: function() {
			var $this = $( this );
			var sectionIndex;
			var builderWrapper;

			builderWrapper = $this.closest( '.builder-wrapper' );
			sectionIndex = builderWrapper.index();
			builderWrapper.remove();
			TCBUILDER.splice( sectionIndex, 1 );
			$.tmEPOAdmin.builder_reorder_multiple();

			$.tmEPOAdmin.section_logic_init();
			$.tmEPOAdmin.initSectionsCheck();
		},

		// Section delete button
		builder_section_delete_onClick: function( e ) {
			e.preventDefault();
			$( this ).trigger( 'blur' );
			$.tmEPOAdmin.doConfirm( TMEPOGLOBALADMINJS.i18n_builder_delete, $.tmEPOAdmin.builder_section_delete_do, this );
		},

		// Element plus button
		builder_plus_onClick: function() {
			var bitem = $( this ).parentsUntil( '.bitem' ).parent().first();
			var currentSize = bitem
				.attr( 'class' )
				.split( ' ' )
				.filter( function( x ) {
					return x.indexOf( 'w' ) === 0;
				} )[ 0 ];
			var keys = Object.keys( $.tmEPOAdmin.builderSize );
			var currentIndex = keys.findIndex( function( x ) {
				return x === currentSize;
			} );
			var newSize = keys[ currentIndex + 1 ];
			var newText = $.tmEPOAdmin.builderSize[ newSize ];
			var sectionIndex;
			var fieldIndex;

			if ( newSize !== undefined ) {
				bitem.removeClass( String( currentSize ) );
				bitem.addClass( String( newSize ) ).css( 'width', '' );
				bitem.find( '.size' ).text( newText );
				sectionIndex = bitem.closest( '.builder-wrapper' ).index();
				fieldIndex = $.tmEPOAdmin.find_index( TCBUILDER[ sectionIndex ].section.is_slider, bitem );
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'div_size', newSize );
			}
		},

		// Element minus button
		builder_minus_onClick: function() {
			var bitem = $( this ).parentsUntil( '.bitem' ).parent().first();
			var currentSize = bitem
				.attr( 'class' )
				.split( ' ' )
				.filter( function( x ) {
					return x.indexOf( 'w' ) === 0;
				} )[ 0 ];
			var keys = Object.keys( $.tmEPOAdmin.builderSize );
			var currentIndex = keys.findIndex( function( x ) {
				return x === currentSize;
			} );
			var newSize = keys[ currentIndex - 1 ];
			var newText = $.tmEPOAdmin.builderSize[ newSize ];
			var sectionIndex;
			var fieldIndex;

			if ( newSize !== undefined ) {
				bitem.removeClass( String( currentSize ) );
				bitem.addClass( String( newSize ) ).css( 'width', '' );
				bitem.find( '.size' ).text( newText );
				sectionIndex = bitem.closest( '.builder-wrapper' ).index();
				fieldIndex = $.tmEPOAdmin.find_index( TCBUILDER[ sectionIndex ].section.is_slider, bitem );
				$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'div_size', newSize );
			}
		},

		// Section plus button
		builder_section_plus_onClick: function() {
			var section = $( this ).closest( '.builder-wrapper' );
			var currentSize = section
				.attr( 'class' )
				.split( ' ' )
				.filter( function( x ) {
					return x.indexOf( 'w' ) === 0;
				} )[ 0 ];
			var keys = Object.keys( $.tmEPOAdmin.builderSize );
			var currentIndex = keys.findIndex( function( x ) {
				return x === currentSize;
			} );
			var newSize = keys[ currentIndex + 1 ];
			var newText = $.tmEPOAdmin.builderSize[ newSize ];
			var sectionIndex;

			if ( newSize !== undefined ) {
				section.removeClass( String( currentSize ) );
				section.addClass( String( newSize ) ).css( 'width', '' );
				section.find( '.section-settings .size' ).text( newText );
				sectionIndex = section.index();
				TCBUILDER[ sectionIndex ].section.sections_size.default = newSize;
				TCBUILDER[ sectionIndex ].size = newText;
				$.tmEPOAdmin.makeResizables( section.find( '.bitem' ) );
			}
		},

		// Section minus button
		builder_section_minus_onClick: function() {
			var section = $( this ).closest( '.builder-wrapper' );
			var currentSize = section
				.attr( 'class' )
				.split( ' ' )
				.filter( function( x ) {
					return x.indexOf( 'w' ) === 0;
				} )[ 0 ];
			var keys = Object.keys( $.tmEPOAdmin.builderSize );
			var currentIndex = keys.findIndex( function( x ) {
				return x === currentSize;
			} );
			var newSize = keys[ currentIndex - 1 ];
			var newText = $.tmEPOAdmin.builderSize[ newSize ];
			var sectionIndex;

			if ( newSize !== undefined ) {
				section.removeClass( String( currentSize ) );
				section.addClass( String( newSize ) ).css( 'width', '' );
				section.find( '.section-settings .size' ).text( newText );
				sectionIndex = section.index();
				TCBUILDER[ sectionIndex ].section.sections_size.default = newSize;
				TCBUILDER[ sectionIndex ].size = newText;
				$.tmEPOAdmin.makeResizables( section.find( '.bitem' ) );
			}
		},

		// Section edit button
		builder_section_item_onClick: function() {
			var _current_logic;
			var $_html;
			var clicked;
			var builderWrapper;
			var sectionIndex;
			var _template = $.epoAPI.template.html( templateEngine.tc_builder_section, {} );
			var _clone;
			var content;

			builderWrapper = $( this ).closest( '.builder-wrapper' );
			sectionIndex = builderWrapper.index();
			_clone = $( _template );
			_clone.addClass( TCBUILDER[ sectionIndex ].section.sections_size.default );
			_clone.addClass( 'appear' );

			if ( TCBUILDER[ sectionIndex ].section.tma_variations_wrap === true ) {
				_clone.find( '.builder-remove-for-variations' ).remove();
				_clone.find( '.builder_hide_for_variation' ).hide();
				_clone.find( '.tma-tab-extra, .tma-tab-logic,.tma-tab-css,.tma-tab-woocommerce' ).hide();
			}
			content = _clone.find( '.section_elements' );

			$.tmEPOAdmin.copyContent( content, sectionIndex );

			$.tmEPOAdmin.check_section_logic( sectionIndex );
			_current_logic = $.tmEPOAdmin.sectionLogicObject;

			$_html = $.tmEPOAdmin.builder_floatbox_template( {
				id: 'tc-floatbox-content',
				html: '',
				title: TMEPOGLOBALADMINJS.i18n_edit_settings,
				uniqidtext: TMEPOGLOBALADMINJS.i18n_section_uniqid + ':',
				uniqid: TCBUILDER[ sectionIndex ].section.sections_uniqid.default
			} );

			$.tcFloatBox( {
				closefadeouttime: 0,
				animateOut: '',
				fps: 1,
				ismodal: true,
				refresh: 'fixed',
				width: '80%',
				height: '80%',
				classname: 'flasho tc-wrapper' + ( builderWrapper.is( '.tma-variations-wrap' ) ? ' tma-variations-section' : '' ),
				data: $_html,
				cancelEvent: function( inst ) {
					if ( clicked ) {
						return;
					}
					clicked = true;
					$.tmEPOAdmin.sectionLogicObject = _current_logic;
					$.tmEPOAdmin.removeTinyMCE( '.flasho.tc-wrapper' );

					inst.destroy();
					$( 'body' ).removeClass( 'floatbox-open' );
				},
				cancelClass: '.floatbox-cancel',
				updateEvent: function( inst ) {
					if ( clicked ) {
						return;
					}
					clicked = true;
					$.tmEPOAdmin.removeTinyMCE( '.flasho.tc-wrapper' );

					$.tmEPOAdmin.changeBuilder( content, sectionIndex );

					TCBUILDER[ sectionIndex ].section.sections_logicrules.default = $.tmEPOAdmin.section_logic_get_JSON( content );

					$.tmEPOAdmin.sections_type_onChange( sectionIndex );

					$.tmEPOAdmin.logic_reindex_force();
					inst.destroy();
					$( 'body' ).removeClass( 'floatbox-open' );
				},
				updateClass: '.floatbox-update'
			} );
			clicked = false;
			$( 'body' ).addClass( 'floatbox-open' );

			content.appendTo( '#tc-floatbox-content' ).removeClass( 'closed' );
			$.tmEPOAdmin.section_logic_init( sectionIndex, content );

			setTimeout( function() {
				var rules;
				rules = content.find( '.tm-builder-logicrules' ).val() || 'null';
				rules = $.epoAPI.util.parseJSON( rules );
				rules = $.tmEPOAdmin.logic_check_element_rules( rules );
				content.find( '.epo-rule-toggle' ).val( rules.toggle );
			}, 1 );

			$.tmEPOAdmin.set_fields_logic( content );

			content.find( '.activate-sections-logic' ).trigger( 'change' );

			content.find( '.tm-tabs' ).tmtabs( {
				dataopenattribute: 'data-tab'
			} );
			content.tmcheckboxes();

			$.tmEPOAdmin.builder_clone_after_events( content );

			$.tcToolTip( $( '#tc-floatbox-content' ).find( '.tm-tooltip' ) );
			$.tmEPOAdmin.addTinyMCE( '.flasho.tc-wrapper' );
		},

		changeBuilder: function( content, sectionIndex, fieldIndex ) {
			var fieldObject = $.tmEPOAdmin.getFieldObject( content );
			var type;
			var basic;
			var sectionField;

			if ( fieldIndex !== undefined ) {
				type = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'element_type' );
				basic = TCBUILDER[ sectionIndex ].fields[ fieldIndex ].filter( function( x ) {
					return x.id === 'element_type' || x.id === 'div_size' || x.id === type + '_internal_name';
				} );
				TCBUILDER[ sectionIndex ].fields[ fieldIndex ] = [].concat.apply( basic, fieldObject );
			} else {
				basic = [ TCBUILDER[ sectionIndex ].section.sections_internal_name ];

				fieldObject = [].concat.apply( basic, fieldObject );

				sectionField = {};
				Object.keys( fieldObject ).forEach( function( i ) {
					sectionField[ fieldObject[ i ].id ] = fieldObject[ i ];
				} );

				sectionField.is_slider = TCBUILDER[ sectionIndex ].section.is_slider;
				sectionField.rules_toggle = TCBUILDER[ sectionIndex ].section.rules_toggle;

				TCBUILDER[ sectionIndex ].section = sectionField;
			}
		},

		copyContent: function( content, sectionIndex, fieldIndex ) {
			var builder;
			var panels_wrap = content.find( '.panels_wrap' );
			var options_wrap;
			var element;
			var temp;

			if ( fieldIndex !== undefined ) {
				builder = TCBUILDER[ sectionIndex ].fields[ fieldIndex ];
			} else {
				builder = TCBUILDER[ sectionIndex ].section;
			}

			Object.keys( builder ).forEach( function( i ) {
				var name;
				var value;
				var separator;

				if ( typeof builder[ i ] !== 'object' ) {
					return;
				}

				if ( builder[ i ].id === 'multiple' ) {
					Object.keys( builder[ i ].multiple ).forEach( function( ii ) {
						options_wrap = content.find( '.options-wrap' );
						if ( options_wrap.eq( ii ).length === 0 ) {
							options_wrap
								.eq( 0 )
								.tcClone()
								.removeClass( 'separator' )
								.appendTo( panels_wrap )
								.find( ':input' )
								.not( 'button' )
								.val( '' )
								.prop( 'checked', false )
								.find( '.tm_option_enabled' )
								.prop( 'checked', true )
								.val( '1' )
								.trigger( 'changechoice' );
							options_wrap = content.find( '.options-wrap' );
							options_wrap.eq( ii ).find( '.tc-cell-value input' ).addClass( 'tm_option_value' );
						}

						separator = {
							title: false,
							value: false
						};
						Object.keys( builder[ i ].multiple[ ii ] ).forEach( function( iii ) {
							name = builder[ i ].multiple[ ii ][ iii ].tags.name;
							name = name.replace( '[]', '' );
							name = name.substring( 0, name.lastIndexOf( '[' ) );
							value = builder[ i ].multiple[ ii ][ iii ].default;
							element = content
								.find( '.options-wrap' )
								.eq( ii )
								.find( "[name^='" + name + "']" );
							element.attr( 'data-builder', JSON.stringify( builder[ i ].multiple[ ii ][ iii ] ) );
							element.attr( 'name', builder[ i ].multiple[ ii ][ iii ].tags.name ).attr( 'data-field-id', builder[ i ].multiple[ ii ][ iii ].id ).removeAttr( 'id' ).val( value ).trigger( 'change' );

							if ( builder[ i ].multiple[ ii ][ iii ].checked !== undefined ) {
								if (
									builder[ i ].multiple[ ii ][ iii ].id === 'multiple_checkboxes_options_default_value' ||
									builder[ i ].multiple[ ii ][ iii ].id === 'multiple_radiobuttons_options_default_value' ||
									builder[ i ].multiple[ ii ][ iii ].id === 'multiple_selectbox_options_default_value' ||
									builder[ i ].multiple[ ii ][ iii ].id === 'multiple_selectboxmultiple_options_default_value'
								) {
									element.val( ii );
								} else {
									element.val( builder[ i ].multiple[ ii ][ iii ].tags.value );
								}
								if ( builder[ i ].multiple[ ii ][ iii ].checked === true ) {
									element.prop( 'checked', true );
								} else {
									element.prop( 'checked', false );
								}
							}

							if (
								( builder[ i ].multiple[ ii ][ iii ].id === 'multiple_checkboxes_title_value' ||
								builder[ i ].multiple[ ii ][ iii ].id === 'multiple_radiobuttons_title_value' ) &&
								builder[ i ].multiple[ ii ][ iii ].default === '-1'
							) {
								separator.title = true;
							}
							if (
								( builder[ i ].multiple[ ii ][ iii ].id === 'multiple_checkboxes_options_value' ||
								builder[ i ].multiple[ ii ][ iii ].id === 'multiple_radiobuttons_options_value' ) &&
								builder[ i ].multiple[ ii ][ iii ].default === '-1'
							) {
								separator.value = true;
							}
						} );
						if ( separator.value && ! separator.title ) {
							separator = options_wrap.eq( ii );
							separator.addClass( 'separator' );
							separator.find( '.tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)' ).addClass( 'tm-hidden' );
							separator.find( '.tm_option_value' ).removeClass( 'tm_option_value' );
						} else {
							separator = options_wrap.eq( ii );
							separator.removeClass( 'separator' );
							separator.find( '.tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)' ).removeClass( 'tm-hidden' );
							separator.find( '.tm_option_value' ).addClass( 'tm_option_value' );
						}
					} );
				} else {
					name = builder[ i ].tags.name;
					value = builder[ i ].default;
					element = content.find( "[name='" + name + "']" );

					if ( builder[ i ].fill === 'product' ) {
						if ( builder[ i ].options && builder[ i ].options.push ) {
							builder[ i ].options.forEach( function( x ) {
								element.append( $( '<option selected="selected" value="' + x.value + '">' + x.text + '</option>' ) );
							} );
							element.attr( 'data-exclude', TMEPOGLOBALADMINJS.original_post_id === TMEPOGLOBALADMINJS.post_id ? TMEPOGLOBALADMINJS.post_id : TMEPOGLOBALADMINJS.post_id + ',' + TMEPOGLOBALADMINJS.original_post_id );
						}
					}
					if ( builder[ i ].fill === 'category' ) {
						if ( value && value.push ) {
							value.forEach( function( x ) {
								element.find( 'option[value="' + x + '"]' ).attr( 'selected', 'selected' );
							} );
						}
					}

					// must be after the product and categories dropdowns
					// and the mode selector for this to work
					if ( element.is( '.product-default-value-search' ) ) {
						if ( content.find( '.product-mode:checked' ).val() === 'products' || content.find( '.product-mode:checked' ).val() === 'product' ) {
							element.removeClass( 'wc-product-search' ).addClass( 'enhanced-dropdown' );
							temp = content.find( '.product-products-selector' ).find( ':selected' ).clone().prop( 'selected', false ).removeAttr( 'data-select2-id' );
							element.find( 'option' ).remove();
							element.append( temp );
						} else if ( value !== '' ) {
							if ( builder[ i ].current_selected_text ) {
								temp = builder[ i ].current_selected_text;
							} else {
								temp = value;
							}
							element.attr( 'data-current-selected', value );
							element.data( 'current-selected-text', temp );
							element.append( $( '<option selected="selected" value="' + value + '">' + temp + '</option>' ) );
							element.addClass( 'wc-product-search' );
						}

						if ( value !== '' ) {
							element.attr( 'data-current-selected', value );
						}
					}

					element.attr( 'data-builder', JSON.stringify( builder[ i ] ) ).attr( 'data-field-id', builder[ i ].id );

					if ( element.is( ':radio' ) ) {
						element.toArray().forEach( function( x, index ) {
							var elementValue;
							if ( builder[ i ].options ) {
								element.eq( index ).val( builder[ i ].options[ index ].value );
								elementValue = builder[ i ].options[ index ].value;
							} else {
								elementValue = element.eq( index ).val();
							}

							if ( elementValue === value ) {
								element.eq( index ).prop( 'checked', true );
								element.eq( index ).trigger( 'change' );
							} else {
								element.eq( index ).prop( 'checked', false );
							}
						} );
					} else {
						element.val( value ).trigger( 'change' );

						if ( builder[ i ].checked !== undefined ) {
							element.val( builder[ i ].tags.value );
							if ( builder[ i ].checked === true ) {
								element.prop( 'checked', true );
							} else {
								element.prop( 'checked', false );
							}
						}
					}

					if ( builder[ i ].disabled ) {
						element.addClass( 'tm-wmpl-disabled' ).prop( 'disabled', true );
						element.closest( '.message0x0' ).addClass( 'tm-setting-row-disabled' );
					}
				}
			} );
		},

		// Element edit button
		builder_item_onClick: function() {
			var bitem = $( this ).closest( '.bitem' );
			var _current_logic;
			var original_enabled;
			var $_html;
			var clicked;
			var pager;
			var sectionIndex;
			var fieldIndex;
			var builderWrapper;
			var is_slider;
			var elementType;
			var _template = $.epoAPI.template.html( templateEngine.tc_builder_elements, {} );
			var _clone;
			var content;
			var uniqid;

			builderWrapper = bitem.closest( '.builder-wrapper' );
			sectionIndex = builderWrapper.index();

			is_slider = TCBUILDER[ sectionIndex ].section.is_slider;
			fieldIndex = $.tmEPOAdmin.find_index( is_slider, bitem );
			elementType = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'element_type' );
			_clone = $( _template )
				.filter( '.bitem.element-' + elementType )
				.tcClone( true );
			original_enabled = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'enabled', elementType );
			original_enabled = elementType === 'variations' || original_enabled === '1' || original_enabled === undefined ? '1' : '0';
			if ( TCBUILDER[ sectionIndex ].section.tma_variations_wrap === true ) {
				_clone.find( 'tma-tab-extra, .tma-tab-logic,.tma-tab-css,.tma-tab-woocommerce' ).remove();
			}
			content = _clone.find( '.hstc2' ).find( '.inside:first' );

			if ( elementType === 'variations' ) {
				content.find( '.tm-all-attributes' ).html( TCBUILDER[ sectionIndex ].variations_html );
			}

			$.tmEPOAdmin.copyContent( content, sectionIndex, fieldIndex );

			$.tmEPOAdmin.check_element_logic( fieldIndex, sectionIndex );
			_current_logic = $.tmEPOAdmin.elementLogicObject;

			uniqid = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'uniqid', elementType );

			$_html = $.tmEPOAdmin.builder_floatbox_template( {
				id: 'tc-floatbox-content',
				html: '',
				title: TMEPOGLOBALADMINJS.i18n_edit_settings,
				uniqidtext: elementType === 'variations' || uniqid === undefined ? '' : TMEPOGLOBALADMINJS.i18n_element_uniqid + ':',
				uniqid: elementType === 'variations' || uniqid === undefined ? '' : uniqid
			} );

			$.tcFloatBox( {
				closefadeouttime: 0,
				animateOut: '',
				fps: 1,
				ismodal: true,
				refresh: 'fixed',
				width: '80%',
				height: '80%',
				classname: 'flasho tc-wrapper' + ( elementType === 'variations' ? ' tma-variations-section' : '' ),
				data: $_html,
				cancelEvent: function( inst ) {
					if ( clicked ) {
						return;
					}
					clicked = true;

					pager = content.find( '.tcpagination' );
					if ( pager.data( 'tc-pagination' ) ) {
						pager.tcPagination( 'destroy' );
					}

					$.tmEPOAdmin.elementLogicObject = _current_logic;
					$.tmEPOAdmin.removeTinyMCE( '.flasho.tc-wrapper' );

					inst.destroy();
					$( 'body' ).removeClass( 'floatbox-open' );
				},
				cancelClass: '.floatbox-cancel',
				updateEvent: function( inst ) {
					var new_enabled;
					var new_logic;
					var section_id;
					var true_field_index;
					var new_field_index;
					var rules;
					var section_rules;

					if ( clicked ) {
						return;
					}
					clicked = true;
					pager = content.find( '.tcpagination' );
					if ( pager.data( 'tc-pagination' ) ) {
						pager.tcPagination( 'destroy' );
					}
					$.tmEPOAdmin.removeTinyMCE( '.flasho.tc-wrapper' );

					$.tmEPOAdmin.changeBuilder( content, sectionIndex, fieldIndex );

					$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'logicrules', $.tmEPOAdmin.element_logic_get_JSON( content ), elementType );
					$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'shipping_methods_enable_logicrules', $.tmEPOAdmin.element_shipping_logic_get_JSON( content, 'enable' ), elementType );
					$.tmEPOAdmin.setFieldValue( sectionIndex, fieldIndex, 'shipping_methods_disable_logicrules', $.tmEPOAdmin.element_shipping_logic_get_JSON( content, 'disable' ), elementType );

					$.tmEPOAdmin.set_field_title( bitem, sectionIndex, fieldIndex );

					new_enabled = elementType === 'variations' || content.find( '.is_enabled' ).length === 0 || content.find( '.is_enabled' ).is( ':checked' ) ? '1' : '0';
					new_logic = content.find( '.activate-element-logic' ).length === 0 || content.find( '.activate-element-logic' ).is( ':checked' ) ? '1' : '0';

					if ( new_enabled === '0' ) {
						bitem.addClass( 'element-is-disabled' );
					} else {
						bitem.removeClass( 'element-is-disabled' );
					}

					if ( original_enabled !== new_enabled ) {
						section_id = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
						true_field_index = fieldIndex;
						new_field_index = $.tmEPOAdmin.find_index( is_slider, bitem, '.bitem', '.element-is-disabled' );

						Object.keys( TCBUILDER[ sectionIndex ].fields ).forEach( function( i ) {
							rules = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ i ], 'logicrules', true ) || 'null';
							rules = $.epoAPI.util.parseJSON( rules );
							rules = $.tmEPOAdmin.logic_check_rules_reindex( bitem, rules, true_field_index, new_field_index, section_id, new_enabled, new_logic );
							$.tmEPOAdmin.setFieldValue( sectionIndex, i, 'logicrules', JSON.stringify( rules ), true );
						} );

						// needs check if element in rule is from the section above, otherwise no need to change the rule.
						Object.keys( TCBUILDER ).forEach( function( i ) {
							i = parseInt( i, 10 );
							if ( i !== sectionIndex ) {
								section_rules = TCBUILDER[ i ].section.sections_logicrules.default || 'null';
								section_rules = $.epoAPI.util.parseJSON( section_rules );
								section_rules = $.tmEPOAdmin.logic_check_rules_reindex( $( '.builder-wrapper' ).eq( i ), section_rules, true_field_index, new_field_index, section_id, new_enabled, new_logic );
								TCBUILDER[ i ].section.sections_logicrules.default = JSON.stringify( section_rules );

								Object.keys( TCBUILDER[ i ].fields ).forEach( function( ii ) {
									rules = $.tmEPOAdmin.getFieldValue( TCBUILDER[ i ].fields[ ii ], 'logicrules', true ) || 'null';
									rules = $.epoAPI.util.parseJSON( rules );
									rules = $.tmEPOAdmin.logic_check_rules_reindex( $( '.builder-wrapper' ).eq( i ).find( '.bitem' ).eq( ii ), rules, true_field_index, new_field_index, section_id, new_enabled, new_logic );
									$.tmEPOAdmin.setFieldValue( i, ii, 'logicrules', JSON.stringify( rules ), true );
								} );
							}
						} );
					}

					$.tmEPOAdmin.logic_reindex_force();

					inst.destroy();
					$( 'body' ).removeClass( 'floatbox-open' );
				},
				updateClass: '.floatbox-update'
			} );
			clicked = false;

			$( 'body' ).addClass( 'floatbox-open' );

			content.appendTo( '#tc-floatbox-content' );
			$( '#tc-floatbox-content' )
				.find( '.inside' )
				.addClass( 'tm-hidden' )
				.after( $( '<div class="floatbox-loading">' + TMEPOGLOBALADMINJS.i18n_loading + '</div>' ) );
			setTimeout( function() {
				var rules;

				$.tmEPOAdmin.element_logic_init( fieldIndex, sectionIndex, content );
				content.find( '.activate-element-logic' ).trigger( 'change' );
				content.find( '.tm_option_enabled' ).trigger( 'changechoice' );

				rules = content.find( '.tm-builder-logicrules' ).val() || 'null';
				rules = $.epoAPI.util.parseJSON( rules );
				rules = $.tmEPOAdmin.logic_check_element_rules( rules );
				content.find( '.epo-rule-toggle' ).val( rules.toggle );

				content.find( ':radio:checked' ).not( '.panels_wrap :radio' ).trigger( 'change' );
				if ( elementType === 'variations' ) {
					content.find( '.builder-remove-for-variations' ).remove();
					content.find( '.builder_hide_for_variation' ).hide();
				}

				content.tmcheckboxes();
				$.tmEPOAdmin.builder_clone_after_events( content );

				if ( elementType === 'variations' ) {
					$.tmEPOAdmin.variations_display_as();
				} else {
					$.tmEPOAdmin.floatbox_content_js();
				}

				$.tmEPOAdmin.set_fields_logic( content );

				$.tcToolTip( $( '#tc-floatbox-content' ).find( '.tm-tooltip' ) );
				$.tmEPOAdmin.tm_weekdays( $( '#tc-floatbox-content' ) );
				$.tmEPOAdmin.tm_months( $( '#tc-floatbox-content' ) );
				$.tmEPOAdmin.tm_url();
				$.tmEPOAdmin.tm_pricetype_selector();
				$.tmEPOAdmin.dynamicMode();
				$.tmEPOAdmin.tm_option_price_type();
				$.tmEPOAdmin.addTinyMCE( '.flasho.tc-wrapper' );
				$.tmEPOAdmin.paginattion_init();
				$( '#tc-floatbox-content' ).find( '.inside' ).removeClass( 'tm-hidden' );
				content.find( '.tm-tabs' ).tmtabs( {
					dataopenattribute: 'data-tab'
				} );
				$( '#tc-floatbox-content' ).find( '.floatbox-loading' ).remove();
			}, 1 );
		},

		set_fields_logic: function( content ) {
			content
				.find( '.message0x0[data-required]' )
				.toArray()
				.forEach( function( div ) {
					var required;
					var relation = 'AND';
					var exec;

					div = $( div );
					required = div.data( 'required' );
					if ( required.relation ) {
						relation = required.relation;
						delete required.relation;
					}
					exec = function() {
						var thisCheck = true;
						Object.keys( required ).some( function( selector ) {
							var operator = required[ selector ].operator;
							var value = required[ selector ].value;

							var func = function() {
								var $this = $( selector );
								var val = '';
								var check = true;

								if ( ! content.find( selector ).length ) {
									return check;
								}

								if ( $this.is( ':checkbox' ) ) {
									if ( $this.is( ':checked' ) ) {
										val = $this.val();
									}
								} else if ( $this.is( ':radio' ) ) {
									val = content.find( selector ).filter( ':checked' ).val();
								} else {
									val = $this.val();
								}

								if ( typeof value === 'object' ) {
									check = $.inArray( val, value ) !== -1;
								} else {
									check = val === value;
								}

								check = operator === 'is' ? check : ! check;

								if ( check ) {
									div.removeClass( 'tm-hidden' );
								} else {
									div.addClass( 'tm-hidden' );
								}

								return check;
							};

							if ( relation === 'OR' ) {
								thisCheck = true;
							}

							thisCheck = thisCheck && func();

							if ( ! thisCheck ) {
								div.addClass( 'tm-hidden' );
							}

							if ( relation === 'OR' ) {
								return thisCheck;
							}

							return false;
						} );
					};

					Object.keys( required ).forEach( function( selector ) {
						content.on( 'change.required changerequired', selector, exec );
					} );

					exec();
				} );
		},

		getFieldObject: function( _clone ) {
			var fieldObject = [];
			var name;
			var arr;
			var multipleObject;
			var multipleObjectWrap;
			var panelsWrap;
			var tempObject;
			var builder;

			_clone
				.find( ':input' )
				.not( 'button' )
				.not( '.panels_wrap :input' )
				.toArray()
				.forEach( function( el ) {
					el = $( el );
					if ( el.is( ':radio' ) && ! el.is( ':checked' ) ) {
						return;
					}
					name = el.attr( 'name' );

					if ( name !== undefined && name.indexOf( 'tm_meta[' ) === 0 ) {
						arr = name.split( /[[\]]{1,2}/ );
						arr.pop();
						arr = arr
							.map( function( item ) {
								return item === '' ? null : item;
							} )
							.filter( function( v ) {
								if ( v !== null && v !== undefined ) {
									return v;
								}
								return null;
							} )
							.splice( 2, 1 )[ 0 ];

						tempObject = {
							id: arr,
							default: el.val(),
							type: el.prop( 'nodeName' ).toLowerCase(),
							tags: {
								name: name
							}
						};

						if ( el.is( ':checkbox' ) || el.is( ':radio' ) ) {
							tempObject.checked = el.is( ':checked' );
							tempObject.tags.value = el.attr( 'value' );
							if ( tempObject.checked ) {
								tempObject.default = el.attr( 'value' );
							} else {
								tempObject.default = '';
							}
						}

						if ( el.is( '.product-categories-selector' ) ) {
							tempObject.fill = 'category';
							tempObject.options = [];
						} else if ( el.is( '.product-products-selector' ) ) {
							tempObject.fill = 'product';
							tempObject.options = [];
						}

						if ( el.attr( 'data-builder' ) ) {
							builder = $.epoAPI.util.parseJSON( el.attr( 'data-builder' ) );
							if ( builder.fill === 'product' || builder.fill === 'category' || el.is( '.product-products-selector' ) || el.is( '.product-categories-selector' ) ) {
								tempObject.options = el
									.children( 'option:selected' )
									.toArray()
									.map( function( option ) {
										return { text: $( option ).text(), value: $( option ).val() };
									} );
							}

							if ( builder ) {
								tempObject = Object.assign( builder, tempObject );
							}
						}

						if ( el.attr( 'data-current-selected' ) ) {
							tempObject.current_selected = el.attr( 'data-current-selected' );
							tempObject.current_selected_text = el.data( 'current-selected-text' );
						}

						fieldObject.push( tempObject );
					}
				} );

			panelsWrap = _clone.find( '.panels_wrap :input' ).not( 'button' );
			if ( panelsWrap.length > 0 ) {
				multipleObject = [];
				_clone.find( '.panels_wrap .options-wrap' ).each( function( i, wrap ) {
					multipleObjectWrap = [];
					$( wrap )
						.find( ':input' )
						.not( 'button' )
						.each( function( ii, el ) {
							el = $( el );
							name = el.attr( 'name' );

							if ( name !== undefined && name.indexOf( 'tm_meta[' ) === 0 ) {
								arr = name.split( /[[\]]{1,2}/ );
								arr.pop();
								arr = arr
									.map( function( item ) {
										return item === '' ? null : item;
									} )
									.filter( function( v ) {
										if ( v !== null && v !== undefined ) {
											return v;
										}
										return null;
									} )
									.splice( 2, 1 )[ 0 ];

								tempObject = {
									id: arr,
									default: el.val(),
									type: el.prop( 'nodeName' ).toLowerCase(),
									tags: {
										name: name
									}
								};

								if ( el.is( ':checkbox' ) || el.is( ':radio' ) ) {
									tempObject.checked = el.is( ':checked' );
									tempObject.tags.value = el.attr( 'value' );
									if ( tempObject.checked ) {
										tempObject.default = el.attr( 'value' );
									} else {
										tempObject.default = '';
									}
								}

								if ( el.attr( 'data-builder' ) ) {
									builder = $.epoAPI.util.parseJSON( el.attr( 'data-builder' ) );
									if ( builder ) {
										tempObject = Object.assign( builder, tempObject );
									}
								}

								multipleObjectWrap.push( tempObject );
							}
						} );
					multipleObject.push( multipleObjectWrap );
				} );

				fieldObject.push( {
					id: 'multiple',
					multiple: multipleObject
				} );
			}

			return fieldObject;
		},

		// Add Element to sortable via Add button
		builder_clone_element: function( element, wrapper_selector, append_or_prepend, _bitem, retainData ) {
			var _template = $.epoAPI.template.html( templateEngine.tc_builder_elements, {} );
			var _clone;
			var is_slider;
			var field_index;
			var sortable_field_index;
			var sectionIndex;
			var fieldObject;
			var newFieldObject;
			var previousElement;
			var title;
			var currentSize;

			if ( ! _template ) {
				return;
			}
			if ( ! append_or_prepend ) {
				append_or_prepend = 'append';
			}
			wrapper_selector = $( wrapper_selector );
			_clone = $( _template )
				.filter( '.bitem.element-' + element )
				.tcClone( true );

			if ( _clone ) {
				sectionIndex = wrapper_selector.index();
				is_slider = TCBUILDER[ sectionIndex ].section.is_slider;

				if ( append_or_prepend === 'replace' && _bitem && retainData ) {
					previousElement = _bitem.find( '.tm-for-bitem' ).attr( 'data-element' );
					_clone.find( '.tm-builder-element-uniqid' ).val( $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ $.tmEPOAdmin.find_index( is_slider, _bitem ) ], 'uniqid', previousElement ) );
				} else {
					_clone.find( '.tm-builder-element-uniqid' ).val( $.epoAPI.math.uniqueid( '', true ) );
				}
				if ( $( '.builder-wrapper' ).length <= 0 ) {
					$.tmEPOAdmin.builder_add_section_onClick();
					wrapper_selector = $( '.builder-wrapper' ).first();
				}

				fieldObject = $.tmEPOAdmin.getFieldObject( _clone );

				if ( append_or_prepend === 'replace' && _bitem && retainData ) {
					_bitem.replaceWith( _clone );
				} else if ( wrapper_selector.find( '.bitem-wrapper' ).find( '.ditem' ).length > 0 ) {
					wrapper_selector.find( '.bitem-wrapper' ).find( '.ditem' ).replaceWith( _clone );
				} else {
					if ( append_or_prepend === 'append' ) {
						wrapper_selector.find( '.bitem-wrapper' ).not( '.tm-hide' ).append( _clone );
					}
					if ( append_or_prepend === 'prepend' ) {
						wrapper_selector.find( '.bitem-wrapper' ).not( '.tm-hide' ).prepend( _clone );
					}

					TCBUILDER[ sectionIndex ].section.sections.default = parseInt( TCBUILDER[ sectionIndex ].section.sections.default, 10 ) + 1;
					TCBUILDER[ sectionIndex ].section.sections.default = TCBUILDER[ sectionIndex ].section.sections.default.toString();
				}

				field_index = $.tmEPOAdmin.find_index( is_slider, _clone );
				sortable_field_index = $.tmEPOAdmin.find_index( is_slider, _clone, '.bitem', '.element-is-disabled' );

				if ( append_or_prepend === 'replace' && _bitem && retainData ) {
					if ( retainData === 'yes' ) {
						newFieldObject = fieldObject.map( function( replacement ) {
							var mergedObject = {};
							var existingObject = TCBUILDER[ sectionIndex ].fields[ field_index ].find( function( book ) {
								var headerProperties = [ 'header_size', 'header_title', 'header_title_position', 'header_title_color', 'header_subtitle', 'header_subtitle_color', 'header_subtitle_position' ];
								var id = ( book.id === 'div_size' || book.id === 'element_type' || book.id === 'multiple' ) ? book.id : element + book.id.slice( previousElement.length );
								if ( previousElement === 'header' && headerProperties.includes( book.id ) ) {
									id = element + '_' + book.id;
								} else if ( element === 'header' && id.toString().startsWith( element + '_header' ) ) {
									id = book.id.slice( element.length - 1 );
								}
								return replacement.id !== 'element_type' && replacement.id !== element + '_internal_name' && id === replacement.id;
							} );

							if ( existingObject ) {
								Object.keys( replacement ).forEach( function( key ) {
									if ( key !== 'id' && key !== 'tags' && existingObject.hasOwnProperty( key ) ) {
										if ( key === 'multiple' ) {
											mergedObject[ key ] = existingObject[ key ].map( function( subArray ) {
												return subArray.map( function( obj ) {
													// Replace previousElement with element in the 'id' property
													var modifiedId = obj.id.replace( '_' + previousElement + '_', '_' + element + '_' );

													// Find the existingObj that matches the modifiedId
													var matchingExistingObj = replacement[ key ][ 0 ].find( function( existingObj ) {
														return existingObj.id === modifiedId;
													} );

													if ( matchingExistingObj && obj.tags ) {
														if ( obj.tags.name ) {
															obj.tags.name = obj.tags.name.replace( '_' + previousElement + '_', '_' + element + '_' );
														}
														if ( obj.tags.id ) {
															obj.tags.id = obj.tags.id.replace( '_' + previousElement + '_', '_' + element + '_' );
														}

														if ( modifiedId.endsWith( 'options_default_value' ) ) {
															if ( previousElement === 'radiobuttons' && element === 'checkboxes' ) {
																obj.type = 'input';
																obj.tags.name = obj.tags.name + '[]';
															} else if ( previousElement === 'checkboxes' && element === 'radiobuttons' ) {
																obj.type = 'radio';
																obj.tags.name = obj.tags.name.slice( 0, -2 );
															}
														}
													}

													// If the modified 'id' exists in existingArray, include it in the new array
													return matchingExistingObj ? Object.assign( {}, obj, { id: modifiedId } ) : null;
												} );
											} );
											mergedObject[ key ] = mergedObject[ key ].map( function( subArray ) {
												return subArray.filter( function( obj ) {
													return obj !== null;
												} );
											} );
										} else {
											mergedObject[ key ] = existingObject[ key ];
										}
									} else {
										mergedObject[ key ] = replacement[ key ];
									}
								} );
								return mergedObject;
							}
							return replacement;
						} );
						TCBUILDER[ sectionIndex ].fields[ field_index ] = newFieldObject;

						title = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ field_index ], element === 'header' ? 'title' : 'header_title', element );
						if ( title === undefined || title === '' ) {
							_clone.find( '.tm-label' ).html( TMEPOGLOBALADMINJS.i18n_no_title );
						} else {
							_clone.find( '.tm-label' ).html( title );
						}
						currentSize = _clone
							.attr( 'class' )
							.split( ' ' )
							.filter( function( x ) {
								return x.indexOf( 'w' ) === 0;
							} )[ 0 ];
						_clone.removeClass( String( currentSize ) );
						currentSize = newFieldObject.find( function( item ) {
							return item.id === 'div_size';
						} );
						if ( currentSize ) {
							currentSize = currentSize.default;
							_clone.addClass( currentSize );
						}
					} else {
						TCBUILDER[ sectionIndex ].fields[ field_index ] = fieldObject;
					}
				} else if ( append_or_prepend === 'prepend' || append_or_prepend === 'append' ) {
					if ( is_slider ) {
						TCBUILDER[ sectionIndex ].section.sections_slides.default = wrapper_selector
							.find( '.bitem-wrapper' )
							.map( function( i, e ) {
								return $( e ).children( '.bitem' ).not( '.pl2' ).length;
							} )
							.get()
							.join( ',' );
					}

					$.tmEPOAdmin.builderItemsSortableObj.start.section = 'drag';
					$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = 'drag';
					$.tmEPOAdmin.builderItemsSortableObj.start.element = 'drag';

					$.tmEPOAdmin.builderItemsSortableObj.end.section = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
					$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = wrapper_selector.index().toString();
					$.tmEPOAdmin.builderItemsSortableObj.end.element = sortable_field_index.toString();

					TCBUILDER[ sectionIndex ].fields.splice( field_index, 0, fieldObject );
				}

				_clone.find( '.builder-element-wrap' ).empty();
				_clone.find( '.builder_element_type' ).remove();
				_clone.find( '.div_size' ).remove();
				_clone.find( '.tm-internal-name' ).remove();

				$.tmEPOAdmin.check_element_logic( _clone );
				$.tmEPOAdmin.builder_reorder_multiple();

				$.tmEPOAdmin.makeResizables( _clone );

				return _clone;
			}
		},

		doConfirm: function( data, func, funcThis, funcArgs, forceOnCancel ) {
			var title = ( typeof data === 'object' && data !== null ) ? data.title : data;
			var html = ( typeof data === 'object' && data !== null ) ? '<div class="tm-inner">' + data.html + '</div>' : '';
			var $_html = $.epoAPI.template.html( wp.template( 'tc-floatbox' ), {
				id: 'tc-floatbox-content',
				title: title,
				html: html,
				uniqid: '',
				update: TMEPOGLOBALADMINJS.i18n_yes,
				cancel: TMEPOGLOBALADMINJS.i18n_no
			} );
			var clicked = false;

			$.tcFloatBox( {
				closefadeouttime: 0,
				overlayopacity: 0.6,
				animateOut: '',
				fps: 1,
				ismodal: true,
				refresh: 'fixed',
				width: '50%',
				height: 'auto',
				classname: 'flasho tc-wrapper' + ( html === '' ? ' tc-question' : '' ),
				data: $_html,
				cancelEvent: function( inst ) {
					if ( clicked ) {
						return;
					}
					clicked = true;
					inst.destroy();

					if ( forceOnCancel ) {
						funcArgs.push( 'no' );
						func.apply( funcThis, funcArgs );
					}
				},
				cancelClass: '.floatbox-cancel',
				updateEvent: function( inst ) {
					if ( clicked ) {
						return;
					}
					clicked = true;

					if ( forceOnCancel ) {
						funcArgs.push( 'yes' );
					}
					inst.destroy();
					func.apply( funcThis, funcArgs );
				},
				updateClass: '.floatbox-update',
				isconfirm: true
			} );
		},

		builder_clone_do: function() {
			var _bitem;
			var _label_data;
			var _clone;
			var is_slider;
			var field_index;
			var sortable_field_index;
			var _bitem_field_index;
			var sectionIndex;
			var builderWrapper;

			_bitem = $( this ).closest( '.bitem' );
			_label_data = _bitem.data( 'original_title' );
			_clone = _bitem.tcClone();
			_clone.data( 'original_title', _label_data );

			if ( _clone ) {
				_bitem.after( _clone );

				builderWrapper = _clone.closest( '.builder-wrapper' );
				sectionIndex = builderWrapper.index();

				is_slider = TCBUILDER[ sectionIndex ].section.is_slider;
				field_index = $.tmEPOAdmin.find_index( is_slider, _clone );
				sortable_field_index = $.tmEPOAdmin.find_index( is_slider, _clone, '.bitem', '.element-is-disabled' );

				TCBUILDER[ sectionIndex ].section.sections.default = parseInt( TCBUILDER[ sectionIndex ].section.sections.default, 10 ) + 1;
				TCBUILDER[ sectionIndex ].section.sections.default = TCBUILDER[ sectionIndex ].section.sections.default.toString();

				if ( is_slider ) {
					TCBUILDER[ sectionIndex ].section.sections_slides.default = builderWrapper
						.find( '.bitem-wrapper' )
						.map( function( i, e ) {
							return $( e ).children( '.bitem' ).not( '.pl2' ).length;
						} )
						.get()
						.join( ',' );
				}

				_bitem_field_index = $.tmEPOAdmin.find_index( _bitem, _bitem );
				TCBUILDER[ sectionIndex ].fields.splice( _bitem_field_index, 0, $.epoAPI.util.deepCopyArray( TCBUILDER[ sectionIndex ].fields[ _bitem_field_index ] ) );
				$.tmEPOAdmin.setFieldValue( sectionIndex, field_index, 'uniqid', $.epoAPI.math.uniqueid( '', true ), true );
				$.tmEPOAdmin.builder_reorder_multiple();
				$.tmEPOAdmin.builderItemsSortableObj.start.section = 'clone';
				$.tmEPOAdmin.builderItemsSortableObj.start.section_eq = 'clone';
				$.tmEPOAdmin.builderItemsSortableObj.start.element = 'clone';
				$.tmEPOAdmin.builderItemsSortableObj.end.section = TCBUILDER[ sectionIndex ].section.sections_uniqid.default;
				$.tmEPOAdmin.builderItemsSortableObj.end.section_eq = sectionIndex.toString();
				$.tmEPOAdmin.builderItemsSortableObj.end.element = sortable_field_index.toString();
				$.tmEPOAdmin.logic_reindex();

				$.tmEPOAdmin.makeResizables( _clone );
			}
		},

		// Element clone button
		builder_clone_onClick: function( e ) {
			e.preventDefault();
			$.tmEPOAdmin.doConfirm( TMEPOGLOBALADMINJS.i18n_builder_clone, $.tmEPOAdmin.builder_clone_do, this, [ $( this ) ] );
		},

		builder_change_do: function( $this, retainData ) {
			var $_html = $.tmEPOAdmin.builder_floatbox_template_import( {
				id: 'tc-floatbox-content',
				html: '<div class="tm-inner">' + TMEPOGLOBALADMINJS.element_data + '</div>',
				title: TMEPOGLOBALADMINJS.i18n_change_element
			} );
			var popup = $.tcFloatBox( {
				closefadeouttime: 0,
				animateOut: '',
				fps: 1,
				ismodal: false,
				refresh: 'fixed',
				width: '70%',
				height: '70%',
				top: '15%',
				left: '15%',
				classname: 'flasho tc-wrapper tc-builder-add-element',
				data: $_html
			} );

			var _bitem = $this.closest( '.bitem' );
			var currentElement = _bitem.find( '.tm-for-bitem' ).attr( 'data-element' );
			$( '.tm-elements-container' ).find( '.element-' + currentElement ).closest( '.tm-element-button' ).remove();

			$( '.tc-builder-add-element .tc-element-button' ).on( 'click.cpf', function( ev ) {
				var new_section = $this.closest( '.builder-wrapper' );
				var el = $( this ).attr( 'data-element' );

				ev.preventDefault();

				$.tmEPOAdmin.builder_clone_element( el, new_section, 'replace', _bitem, retainData );

				$.tmEPOAdmin.logic_reindex();
				popup.destroy();
			} );
		},

		// Element change button
		builder_change_onClick: function( e ) {
			e.preventDefault();
			$.tmEPOAdmin.doConfirm( { title: TMEPOGLOBALADMINJS.i18n_builder_change_ask_title, html: TMEPOGLOBALADMINJS.i18n_builder_change_ask }, $.tmEPOAdmin.builder_change_do, this, [ $( this ) ], true );
		},

		// Section clone button
		builder_section_clone_do: function() {
			var builderWrapper;
			var _clone;
			var original_titles;
			var sectionIndex;
			var _clonesectionIndex;

			builderWrapper = $( this ).closest( '.builder-wrapper' );
			_clone = builderWrapper.tcClone();
			if ( _clone ) {
				sectionIndex = builderWrapper.index();

				original_titles = [];
				builderWrapper.find( '.bitem' ).each( function( i, el ) {
					original_titles[ i ] = $( el ).data( 'original_title' );
				} );
				builderWrapper.after( _clone );
				_clonesectionIndex = builderWrapper.index();
				TCBUILDER.splice( sectionIndex, 0, $.epoAPI.util.deepCopyArray( TCBUILDER[ sectionIndex ] ) );
				TCBUILDER[ _clonesectionIndex ].section.sections_uniqid.default = $.epoAPI.math.uniqueid( '', true );

				_clone.find( '.bitem' ).each( function( i, el ) {
					$( el ).data( 'original_title', original_titles[ i ] );
				} );

				if ( TCBUILDER[ _clonesectionIndex ].section.is_slider ) {
					$.tmEPOAdmin.createSlider( _clone );
				}

				$.tmEPOAdmin.builder_reorder_multiple();
				$.tmEPOAdmin.builder_items_sortable( _clone.find( '.bitem-wrapper' ) );
				$.tmEPOAdmin.check_section_logic( _clonesectionIndex );
				$.tmEPOAdmin.check_element_logic();
				$.tmEPOAdmin.section_logic_init( _clonesectionIndex );
				$.tmEPOAdmin.makeResizables( _clone );
				$.tmEPOAdmin.makeResizables( _clone.find( '.bitem' ) );
			}
		},

		// Section clone button
		builder_section_clone_onClick: function( e ) {
			e.preventDefault();
			$.tmEPOAdmin.doConfirm( TMEPOGLOBALADMINJS.i18n_builder_clone, $.tmEPOAdmin.builder_section_clone_do, this, [ $( this ) ] );
		},

		// Helper : Creates the html for the edit pop up
		builder_floatbox_template: function( data, template ) {
			return $.epoAPI.template.html( wp.template( template || 'tc-floatbox' ), {
				id: data.id,
				title: data.title,
				html: data.html,
				uniqidtext: data.uniqidtext || '',
				uniqid: data.uniqid,
				update: data.update || TMEPOGLOBALADMINJS.i18n_update,
				cancel: data.cancel || TMEPOGLOBALADMINJS.i18n_cancel
			} );
		},

		builder_floatbox_template_import: function( data ) {
			return $.epoAPI.template.html( wp.template( 'tc-floatbox-import' ), {
				id: data.id,
				title: data.title,
				html: data.html,
				cancel: TMEPOGLOBALADMINJS.i18n_cancel
			} );
		},

		nameChange: function( _m, i ) {
			var __m = /\[[0-9]+\]\[\]/g;
			var __m2 = /\[[0-9]+\]/g;

			if ( _m.match( __m ) !== null ) {
				_m = _m.replace( __m, '[' + i + '][]' );
			} else if ( _m.match( __m2 ) !== null ) {
				_m = _m.replace( __m2, '[' + i + ']' );
			}

			return _m;
		},

		// Helper : Renames all fields that contain multiple options
		builder_reorder_multiple: function() {
			var obj;
			var outputArray = [].concat
				.apply(
					[],
					TCBUILDER.map( function( x ) {
						return x.fields.map( function( y ) {
							return y
								.map( function( z ) {
									if ( z.id === 'element_type' ) {
										return z.default;
									}
									return null;
								} )
								.filter( function( el ) {
									return el !== null;
								} )[ 0 ];
						} );
					} )
				)
				.filter( function( value, index, self ) {
					return self.indexOf( value ) === index;
				} );

			outputArray.forEach( function( selector ) {
				var counter = 0;
				obj = TCBUILDER.map( function( x ) {
					return x.fields.map( function( y ) {
						if (
							y.find( function( z ) {
								return z.id === 'element_type' && z.default === selector;
							} )
						) {
							return y;
						}
						return null;
					} );
				} );
				obj.forEach( function( el, sectionIndex ) {
					el.forEach( function( field, fieldIndex ) {
						var multiple;
						var foundIndex;
						if ( field ) {
							multiple = field.find( function( y, index ) {
								if ( y.id === 'multiple' ) {
									foundIndex = index;
								}
								return y.id === 'multiple';
							} );
							if ( multiple !== undefined && typeof multiple === 'object' ) {
								multiple = multiple.multiple;
								multiple.forEach( function( multipleObject, multipleIndex ) {
									multipleObject.forEach( function( multipleField, multipleFieldIndex ) {
										TCBUILDER[ sectionIndex ].fields[ fieldIndex ][ foundIndex ].multiple[ multipleIndex ][ multipleFieldIndex ].tags.name = $.tmEPOAdmin.nameChange(
											TCBUILDER[ sectionIndex ].fields[ fieldIndex ][ foundIndex ].multiple[ multipleIndex ][ multipleFieldIndex ].tags.name,
											counter
										);
									} );
								} );
							}
							counter = counter + 1;
						}
					} );
				} );
			} );
		},

		getEnhancedSelectFormatString: function() {
			return {
				language: {
					errorLoading: function() {
						// Workaround for https://github.com/select2/select2/issues/4355 instead of i18n_ajax_error.
						return wcEnhancedSelectParams.i18n_searching;
					},
					inputTooLong: function( args ) {
						var overChars = args.input.length - args.maximum;

						if ( 1 === overChars ) {
							return wcEnhancedSelectParams.i18n_input_too_long_1;
						}

						return wcEnhancedSelectParams.i18n_input_too_long_n.replace( '%qty%', overChars );
					},
					inputTooShort: function( args ) {
						var remainingChars = args.minimum - args.input.length;

						if ( 1 === remainingChars ) {
							return wcEnhancedSelectParams.i18n_input_too_short_1;
						}

						return wcEnhancedSelectParams.i18n_input_too_short_n.replace( '%qty%', remainingChars );
					},
					loadingMore: function() {
						return wcEnhancedSelectParams.i18n_load_more;
					},
					maximumSelected: function( args ) {
						if ( args.maximum === 1 ) {
							return wcEnhancedSelectParams.i18n_selection_too_long_1;
						}

						return wcEnhancedSelectParams.i18n_selection_too_long_n.replace( '%qty%', args.maximum );
					},
					noResults: function() {
						return wcEnhancedSelectParams.i18n_no_matches;
					},
					searching: function() {
						return wcEnhancedSelectParams.i18n_searching;
					}
				}
			};
		},

		create_products_search: function( _clone ) {
			// Ajax product search box
			_clone
				.find( ':input.wc-product-search' )
				.filter( ':not(.enhanced)' )
				.each( function() {
					var select2_args = {
						allowClear: true,
						placeholder: $( this ).data( 'placeholder' ),
						dropdownCssClass: 'tc-dropdown',
						minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
						escapeMarkup: function( m ) {
							return m;
						},
						ajax: {
							url: wcEnhancedSelectParams.ajax_url,
							dataType: 'json',
							delay: 250,
							data: function( params ) {
								return {
									term: params.term,
									action: $( this ).data( 'action' ) || 'woocommerce_json_search_products_and_variations',
									security: wcEnhancedSelectParams.search_products_nonce,
									exclude: $( this ).data( 'exclude' ),
									include: $( this ).data( 'include' ),
									limit: $( this ).data( 'limit' ),
									display_stock: $( this ).data( 'display_stock' ),
									tcmode: 'builder'
								};
							},
							processResults: function( data ) {
								var terms = [];
								if ( data ) {
									$.each( data, function( id, text ) {
										terms.push( { id: id, text: text } );
									} );
								}
								return {
									results: terms
								};
							},
							cache: true
						}
					};
					var $select;
					var $list;

					select2_args = $.extend( select2_args, $.tmEPOAdmin.getEnhancedSelectFormatString() );

					$( this ).selectWoo( select2_args ).addClass( 'enhanced' );
					// fix for being inside modal
					$( this ).on( 'select2:open', function() {
						var y = $( window ).scrollTop();
						$( window ).scrollTop( y + 1 );
						$( window ).scrollTop( y );
					} );

					if ( $( this ).data( 'sortable' ) ) {
						$select = $( this );
						$list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );

						$list.sortable( {
							placeholder: 'ui-state-highlight select2-selection__choice',
							forcePlaceholderSize: true,
							items: 'li:not(.select2-search__field)',
							tolerance: 'pointer',
							stop: function() {
								$( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() {
									var id = $( this ).data( 'data' ).id;
									var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
									$select.prepend( option );
								} );
							}
						} );
						// Keep multiselects ordered alphabetically if they are not sortable.
					} else if ( $( this ).prop( 'multiple' ) ) {
						$( this ).on( 'change', function() {
							var $children = $( this ).children();
							$children.sort( function( a, b ) {
								var atext = a.text.toLowerCase();
								var btext = b.text.toLowerCase();

								if ( atext > btext ) {
									return 1;
								}
								if ( atext < btext ) {
									return -1;
								}
								return 0;
							} );
							$( this ).html( $children );
						} );
					}
				} );
		},

		create_categories_search: function( _clone ) {
			// Ajax category search boxes
			_clone
				.find( ':input.wc-category-search' )
				.filter( ':not(.enhanced)' )
				.each( function() {
					var select2_args = $.extend(
						{
							allowClear: true,
							placeholder: $( this ).data( 'placeholder' ),
							dropdownCssClass: 'tc-dropdown'
						},
						$.tmEPOAdmin.getEnhancedSelectFormatString()
					);

					$( this ).selectWoo( select2_args ).addClass( 'enhanced' );
					$( this ).on( 'select2:open', function() {
						var y = $( window ).scrollTop();
						$( window ).scrollTop( y + 1 );
						$( window ).scrollTop( y );
					} );
				} );
		},

		create_enhanced_dropdown: function( _clone ) {
			_clone
				.find( ':input.enhanced-dropdown' )
				.filter( ':not(.enhanced)' )
				.each( function() {
					var select2_args = {
						allowClear: true,
						placeholder: $( this ).data( 'placeholder' ),
						dropdownCssClass: 'tc-dropdown'
					};

					select2_args = $.extend( select2_args, $.tmEPOAdmin.getEnhancedSelectFormatString() );
					$( this ).selectWoo( select2_args ).addClass( 'enhanced' );
				} );
		},

		create_normal_dropdown: function( _clone ) {
			_clone
				.find( 'select' )
				.filter( ':not(.enhanced, .enhanced-dropdown, .wc-category-search, .wc-product-search)' )
				.not( '.shipping-logic-div select, .builder-logic-div select, .panels_wrap select, .options-wrap select' )
				.each( function() {
					var select2_args = {
						allowClear: $( this ).is( '.wc-template-search' ) ? true : false,
						minimumResultsForSearch: $( this ).is( '.wc-template-search' ) ? 0 : -1,
						dropdownCssClass: 'tc-dropdown'
					};

					select2_args = $.extend( select2_args, $.tmEPOAdmin.getEnhancedSelectFormatString() );
					$( this ).selectWoo( select2_args ).addClass( 'enhanced' );
				} );
		},

		// Helper : Generates new events after cloning an element
		builder_clone_elements_after_events: function( _clone ) {
			_clone.find( 'input.tm-color-picker' ).spectrum( 'destroy' );
			_clone.find( '.sp-replacer' ).remove();
			_clone.find( 'input.tm-color-picker' ).spectrum( {
				showInput: true,
				showInitial: true,
				allowEmpty: true,
				showAlpha: false,
				showPalette: false,
				clickoutFiresChange: true,
				showButtons: false,
				preferredFormat: 'hex',
				theme: 'epo'
			} );
		},

		// Helper : Generates new events after cloning an element
		builder_clone_after_events: function( _clone ) {
			$.tmEPOAdmin.builder_clone_elements_after_events( _clone );
			$.tmEPOAdmin.panelsSortable( _clone.find( '.panels_wrap' ) );

			$.tmEPOAdmin.create_normal_dropdown( _clone );
			$.tmEPOAdmin.create_enhanced_dropdown( _clone );
			$.tmEPOAdmin.create_products_search( _clone );
			$.tmEPOAdmin.create_categories_search( _clone );
		},

		paginattion_init: function( start ) {
			var obj = $( '#tc-floatbox-content' );
			var pager = obj.find( '.tcpagination' );
			var panels_wrap;
			var options_wrap;
			var perpage;
			var total;

			if ( pager.length === 0 || TMEPOGLOBALADMINJS.tcAdminNoPagination ) {
				return;
			}
			panels_wrap = obj.find( '.panels_wrap' );
			options_wrap = panels_wrap.find( '.options-wrap' );
			perpage = parseInt( pager.attr( 'data-perpage' ), 10 );
			total = Math.ceil( options_wrap.length / perpage );

			if ( pager.data( 'tc-pagination' ) ) {
				pager.tcPagination( 'destroy' );
			}

			if ( start === 'last' ) {
				start = total;
			} else if ( start === 'current' ) {
				start = pager.data( 'pagination_current' ) || 1;
			} else {
				start = 1;
			}

			pager.data( 'pagination_current', start );
			pager.tcPagination( {
				totalPages: total,
				startPage: start,
				visiblePages: 10,
				onPageClick: function( event, page ) {
					$.tmEPOAdmin.paginationOnClick( pager, page, perpage, options_wrap );
				}
			} );
		},

		paginationOnClick: function( pager, page, perpage, options_wrap ) {
			page = parseInt( page, 10 );
			pager.data( 'pagination_current', page );
			options_wrap.addClass( 'tm-hidden' );

			options_wrap
				.filter( function( index ) {
					//return ( index >= perpage * ( page - 1 ) ) && ( perpage * ( page - 1 ) >= index );

					return ( ( index >= ( perpage * ( page - 1 ) ) ) && ( ( ( perpage * page ) - 1 ) >= index ) );
				} )
				.removeClass( 'tm-hidden' );
		},

		addTinyMCE: function( element ) {
			var getter_tmce = 'excerpt';
			var tmc_defaults = {
				theme: 'modern',
				menubar: false,
				wpautop: true,
				indent: false,
				toolbar1: 'bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink',
				plugins: 'fullscreen,image,wordpress,wpeditimage,wplink'
			};
			var qt_defaults = {
				buttons: 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen'
			};
			var init_settings = typeof tinyMCEPreInit === 'object' && tinyMCEPreInit.mceInit !== undefined && getter_tmce in tinyMCEPreInit.mceInit ? tinyMCEPreInit.mceInit[ getter_tmce ] : tmc_defaults;
			var qt_settings = typeof tinyMCEPreInit === 'object' && tinyMCEPreInit.qtInit !== undefined && getter_tmce in tinyMCEPreInit.mceInit ? tinyMCEPreInit.qtInit[ getter_tmce ] : qt_defaults;
			var tmc_settings;
			var id;
			var tqt_settings;
			var editor_tools_html;
			var editor_tools_class;

			if ( ! $( element ) || typeof tinyMCE === 'undefined' ) {
				return;
			}

			editor_tools_html = $( '#wp-' + getter_tmce + '-editor-tools' ).html();
			editor_tools_class = $( '#wp-' + getter_tmce + '-editor-tools' ).attr( 'class' );

			$( element )
				.find( 'textarea' )
				.not( ':disabled' )
				.not( '.tm-no-editor' )
				.each( function( i, textarea ) {
					id = $( textarea ).attr( 'id' );
					if ( ! id ) {
						$( textarea ).attr( 'id', $( textarea ).attr( 'name' ).replace( /[[\]]/g, '' ) );
						id = $( textarea ).attr( 'id' );
					}
					if ( id ) {
						tmc_settings = $.extend( {}, init_settings, {
							selector: '#' + id
						} );
						tqt_settings = $.extend( {}, qt_settings, {
							id: id
						} );
						if ( typeof tinyMCEPreInit === 'object' ) {
							tinyMCEPreInit.mceInit[ id ] = tmc_settings;
							tinyMCEPreInit.qtInit[ id ] = tqt_settings;
						}
						$( textarea )
							.addClass( 'wp-editor-area' )
							.wrap( '<div id="wp-' + id + '-wrap" class="wp-core-ui wp-editor-wrap tmce-active tm_editor_wrap"></div>' )
							.before( '<div class="' + editor_tools_class + '">' + editor_tools_html + '</div>' )
							.wrap( '<div class="wp-editor-container"></div>' );
						$( '.tm_editor_wrap' )
							.find( '.wp-switch-editor' )
							.each( function( n, s ) {
								var aid;
								var l;
								var mode;

								if ( $( s ).attr( 'id' ) ) {
									aid = $( s ).attr( 'id' );
									l = aid.length;
									mode = aid.substring( l - 4 );
									$( s ).attr( 'id', id + '-' + mode );
									$( s ).attr( 'data-wp-editor-id', id );
								}
							} );
						$( '.tm_editor_wrap' ).find( '.insert-media' ).attr( 'data-editor', id );

						tinyMCE.init( tmc_settings );
						if ( QTags && quicktags ) {
							quicktags( tqt_settings );
							QTags._buttonsInit();
						}
						$( textarea ).closest( '.tm_editor_wrap' ).find( 'a.insert-media' ).data( 'editor', id ).attr( 'data-editor', id );
					}
				} );
		},

		removeTinyMCE: function( element ) {
			var id;
			var _check = '';
			var current_textarea_value;
			var is_tinymce_active;

			if ( ! $( element ) || tinyMCE === undefined ) {
				return;
			}

			$( element )
				.find( 'textarea' )
				.not( ':disabled' )
				.not( '.tm-no-editor' )
				.each( function( i, textarea ) {
					id = $( textarea ).attr( 'id' );
					if ( id && tinyMCE && tinyMCE.editors ) {
						current_textarea_value = $( textarea ).val();
						is_tinymce_active = tinyMCE !== undefined && tinyMCE.editors[ id ] && ! tinyMCE.editors[ id ].isHidden();

						if ( tinyMCE.editors[ id ] !== undefined ) {
							_check = tinyMCE.editors[ id ].getContent();
							tinyMCE.editors[ id ].remove();
						}
						$( textarea ).closest( '.tm_editor_wrap' ).find( '.quicktags-toolbar,.wp-editor-tools' ).remove();
						$( textarea ).unwrap().unwrap();

						if ( is_tinymce_active ) {
							if ( _check === '' ) {
								$( textarea ).val( '' );
							} else {
								$( textarea ).val( _check );
							}
						} else {
							$( textarea ).val( current_textarea_value );
						}
					}
				} );
		},

		set_field_title: function( bitem, sectionIndex, fieldIndex ) {
			var title;
			var elementType;

			if ( bitem.length === 0 ) {
				return;
			}

			elementType = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'element_type' );

			title = $.tmEPOAdmin.getFieldValue( TCBUILDER[ sectionIndex ].fields[ fieldIndex ], 'header_title', elementType !== 'header' );

			if ( title === undefined || title === '' ) {
				bitem.find( '.tm-label' ).html( TMEPOGLOBALADMINJS.i18n_no_title );
			} else {
				bitem.find( '.tm-label' ).html( title );
			}
		},

		tm_upload_button_remove_onClick: function() {
			var input = $( this ).prevAll( 'input' ).first();
			var image = $( this ).nextAll( '.tm_upload_image' ).first().find( '.tm_upload_image_img' );

			$( input ).val( '' );
			$( image ).attr( 'src', emptyImage );
		},

		variations_display_as: function( e ) {
			var $this;
			var tm_attribute;
			var tm_terms;
			var tm_changes_product_image;

			if ( e ) {
				if ( $( this ).is( '.tm-changes-product-image' ) ) {
					$this = $( this ).closest( '.tm-attribute' ).find( '.variations-display-as' );
				} else {
					$this = $( this );
				}
			} else {
				$this = $( '#tc-floatbox-content .variations-display-as' );
			}

			$this.each( function( i, el ) {
				var selected_mode;

				tm_attribute = $( el ).closest( '.tm-attribute' );
				tm_terms = tm_attribute.find( '.tm-term' );
				tm_changes_product_image = tm_attribute.find( '.tm-changes-product-image' );
				selected_mode = $( el ).val();
				if ( selected_mode === 'select' ) {
					tm_attribute.find( '.tma-hide-for-select-box' ).hide().addClass( 'tc-row-hidden' );
				} else {
					tm_attribute.find( '.tma-hide-for-select-box' ).show().removeClass( 'tc-row-hidden' );
				}
				if ( selected_mode === 'image' || selected_mode === 'color' || selected_mode === 'radiostart' || selected_mode === 'radioend' ) {
					tm_attribute.find( '.tma-show-for-swatches' ).show().removeClass( 'tc-row-hidden' );
				} else {
					tm_attribute.find( '.tma-show-for-swatches' ).hide().addClass( 'tc-row-hidden' );
				}
				tm_terms.each( function( i2, term ) {
					$( term ).hide().find( '.tma-term-color,.tma-term-image,.tma-term-custom-image' ).hide();
					switch ( selected_mode ) {
						case 'select':
							if ( tm_changes_product_image.val() === 'images' ) {
								tm_changes_product_image.val( '' );
							}
							tm_changes_product_image.children( "option[value='images']" ).attr( 'disabled', 'disabled' ).hide();
							if ( tm_changes_product_image.val() === 'custom' ) {
								$( term ).show().find( '.tma-term-custom-image' ).show();
							}

							break;
						case 'radio':
							if ( tm_changes_product_image.val() === 'images' ) {
								tm_changes_product_image.val( '' );
							}
							tm_changes_product_image.children( "option[value='images']" ).attr( 'disabled', 'disabled' ).hide();
							if ( tm_changes_product_image.val() === 'custom' ) {
								$( term ).show().find( '.tma-term-custom-image' ).show();
							}
							break;
						case 'image':
						case 'radiostart':
						case 'radioend':
							tm_changes_product_image.children( "option[value='images']" ).prop( 'disabled', false ).show();
							$( term ).show().find( '.tma-term-image' ).show();
							if ( tm_changes_product_image.val() === 'custom' ) {
								$( term ).show().find( '.tma-term-custom-image' ).show();
							}
							break;
						case 'color':
							if ( tm_changes_product_image.val() === 'images' ) {
								tm_changes_product_image.val( '' );
							}
							tm_changes_product_image.children( "option[value='images']" ).attr( 'disabled', 'disabled' ).hide();
							if ( tm_changes_product_image.val() === 'custom' ) {
								$( term ).show().find( '.tma-term-custom-image' ).show();
							}
							$( term ).show().find( '.tma-term-color' ).show();
							break;
					}
				} );
			} );

			$this = $( '#tc-floatbox-content' );

			$this
				.find( '.tm_option_image' )
				.not( '.tm_option_imagep' )
				.each( function( i ) {
					$this.find( '.tm_upload_imagep' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
				} );
			$this.find( '.tm_option_imagep' ).each( function( i ) {
				$this.find( '.tm_upload_image' ).not( '.tm_upload_imagep' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
			} );
		},

		floatbox_content_js: function() {
			var $this = $( '#tc-floatbox-content' );
			var $replacementMode = $this.find( '.replacement-mode:checked' );
			var $changesProductImage = $this.find( '.tm-changes-product-image' );
			var $showTooltip = $this.find( '.show-tooltip' );
			var tm_upload = $this.find( '.builder-element-wrap' ).find( '.tc-upload-button' ).not( '.tc-upload-buttonp,.tc-upload-buttonl' );
			var tm_upload_image = $this.find( '.builder-element-wrap' ).find( '.tm_upload_image' ).not( '.tm_upload_imagep,.tm_upload_imagel' );
			var tm_uploadp = $this.find( '.builder-element-wrap' ).find( '.tc-upload-buttonp' );
			var tm_upload_imagep = $this.find( '.builder-element-wrap' ).find( '.tm_upload_imagep' );
			var tm_uploadl = $this.find( '.builder-element-wrap' ).find( '.tc-upload-buttonl' );
			var tm_upload_imagel = $this.find( '.builder-element-wrap' ).find( '.tm_upload_imagel' );
			var tm_cell_images = $this.find( '.builder-element-wrap' ).find( '.tm_cell_images' );
			var tm_color_picker = $this.find( '.builder-element-wrap .panels_wrap' ).find( '.sp-replacer' );
			var tm_option_image;
			var tm_option_imagep;
			var tm_upload_imagep_img;

			tm_upload.hide();
			tm_upload_image.hide();
			tm_uploadp.hide();
			tm_upload_imagep.hide();
			tm_uploadl.hide();
			tm_upload_imagel.hide();
			tm_cell_images.hide();
			tm_color_picker.hide();

			if ( $changesProductImage.val() === 'images' && ( $replacementMode.val() === 'none' || $replacementMode.val() === 'text' ) ) {
				tm_option_image = $this.find( '.tm_option_image' ).not( '.tm_option_imagep' );
				tm_option_imagep = $this.find( '.tm_option_imagep' );
				tm_upload_imagep_img = $this.find( '.tm_upload_imagep .tm_upload_image_img' );
				$changesProductImage.val( 'custom' );
				tm_option_image.each( function( i ) {
					tm_option_imagep.eq( i ).val( $( this ).val() );
					tm_upload_imagep_img.attr( 'src', $( this ).val() || emptyImage );
				} );
			}

			if ( ! $replacementMode.length || $replacementMode.val() !== 'image' ) {
				if ( $changesProductImage.val() === 'images' ) {
					$changesProductImage.val( '' );
				}
				$changesProductImage.find( "option[value='images']" ).attr( 'disabled', 'disabled' ).hide();
			} else {
				$changesProductImage.find( "option[value='images']" ).prop( 'disabled', false ).show();
			}
			setTimeout( function() {
				$changesProductImage.selectWoo( 'destroy' ).removeClass( 'enhanced' );
				$.tmEPOAdmin.create_normal_dropdown( $changesProductImage.parent() );
				$changesProductImage.trigger( 'change.select2' );
			}, 100 );
			if ( $replacementMode.val() === 'image' || ( $replacementMode.val() === 'images' && $changesProductImage.val() === 'images' ) ) {
				tm_upload.show();
				tm_upload_image.show();
				tm_cell_images.show();
			}
			if ( $changesProductImage.val() === 'custom' ) {
				tm_uploadp.show();
				tm_upload_imagep.show();
				tm_cell_images.show();
			}
			if ( $replacementMode.val() === 'image' ) {
				if ( $( '#tc-floatbox-content .tm-use-lightbox' ).is( ':checked' ) ) {
					tm_uploadl.show();
					tm_upload_imagel.show();
				}
			}
			if ( $replacementMode.val() === 'color' ) {
				if ( $showTooltip.val() === 'swatch_img' || $showTooltip.val() === 'swatch_img_lbl' || $showTooltip.val() === 'swatch_img_desc' || $showTooltip.val() === 'swatch_img_lbl_desc' ) {
					$showTooltip.val( '' );
				}
				$showTooltip.find( "option[value='swatch_img']" ).attr( 'disabled', 'disabled' ).hide();
				$showTooltip.find( "option[value='swatch_img_lbl']" ).attr( 'disabled', 'disabled' ).hide();
				$showTooltip.find( "option[value='swatch_img_desc']" ).attr( 'disabled', 'disabled' ).hide();
				$showTooltip.find( "option[value='swatch_img_lbl_desc']" ).attr( 'disabled', 'disabled' ).hide();
			} else {
				$showTooltip.find( "option[value='swatch_img']" ).prop( 'disabled', false ).show();
				$showTooltip.find( "option[value='swatch_img_lbl']" ).prop( 'disabled', false ).show();
				$showTooltip.find( "option[value='swatch_img_desc']" ).prop( 'disabled', false ).show();
				$showTooltip.find( "option[value='swatch_img_lbl_desc']" ).prop( 'disabled', false ).show();
			}

			setTimeout( function() {
				$showTooltip.selectWoo( 'destroy' ).removeClass( 'enhanced' );
				$.tmEPOAdmin.create_normal_dropdown( $showTooltip.parent() );
				$showTooltip.trigger( 'change.select2' );
			}, 100 );

			if ( $replacementMode.val() === 'color' ) {
				tm_cell_images.show();
				tm_color_picker.show();
			}

			$this
				.find( '.tm_option_image' )
				.not( '.tm_option_imagec, .tm_option_imagep, .tm_option_imagel' )
				.each( function( i ) {
					$this.find( '.tm_upload_image' ).not( '.tm_upload_imagec, .tm_upload_imagep, .tm_upload_imagel' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
				} );

			$this.find( '.tm_option_imagec' ).each( function( i ) {
				$this.find( '.tm_upload_imagec' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
			} );
			$this.find( '.tm_option_imagep' ).each( function( i ) {
				$this.find( '.tm_upload_imagep' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
			} );
			$this.find( '.tm_option_imagel' ).each( function( i ) {
				$this.find( '.tm_upload_imagel' ).eq( i ).find( '.tm_upload_image_img' ).attr( 'src', $( this ).val() || emptyImage );
			} );
		},

		tm_weekdays: function( e ) {
			var obj;

			if ( e ) {
				obj = $( e );
			} else {
				obj = $( 'body' );
			}

			obj.find( '.tm-weekdays' ).each( function( i, el ) {
				var val = $( el ).val();
				var values = val.split( ',' );
				var wrap = $( el ).next( '.tm-weekdays-picker-wrap' );
				var pickers = $( wrap ).find( '.tm-weekday-picker' );

				pickers.each( function( x, picker ) {
					if ( values.indexOf( $( picker ).val() ) !== -1 ) {
						$( picker ).attr( 'checked', 'checked' ).prop( 'checked', true );
						$( picker ).closest( '.tm-weekdays-picker' ).addClass( 'tm-checked' );
					} else {
						$( picker ).prop( 'checked', false );
						$( picker ).closest( '.tm-weekdays-picker' ).removeClass( 'tm-checked' );
					}
				} );
			} );
		},

		tm_weekday_picker: function() {
			var weekdays = $( this ).closest( '.tm-weekdays-picker-wrap' ).prev( '.tm-weekdays' );
			var values = $( weekdays ).val().split( ',' );
			var c = values.indexOf( $( this ).val() );

			if ( $( this ).is( ':checked' ) ) {
				if ( c === -1 ) {
					values.push( $( this ).val() );
				}
			} else if ( c !== -1 ) {
				values.splice( c, 1 );
			}
			values = $.map( values, function( item ) {
				return item === '' ? null : item;
			} );
			$( weekdays ).val( values.join( ',' ) );
			$.tmEPOAdmin.tm_weekdays( $( weekdays ).parent() );
		},

		tm_months: function( e ) {
			var obj;

			if ( e ) {
				obj = $( e );
			} else {
				obj = $( 'body' );
			}

			obj.find( '.tm-months' ).each( function( i, el ) {
				var val = $( el ).val();
				var values = val.split( ',' );
				var wrap = $( el ).next( '.tm-months-picker-wrap' );
				var pickers = $( wrap ).find( '.tm-month-picker' );

				pickers.each( function( x, picker ) {
					if ( values.indexOf( $( picker ).val() ) !== -1 ) {
						$( picker ).attr( 'checked', 'checked' ).prop( 'checked', true );
						$( picker ).closest( '.tm-months-picker' ).addClass( 'tm-checked' );
					} else {
						$( picker ).prop( 'checked', false );
						$( picker ).closest( '.tm-months-picker' ).removeClass( 'tm-checked' );
					}
				} );
			} );
		},

		tm_month_picker: function() {
			var months = $( this ).closest( '.tm-months-picker-wrap' ).prev( '.tm-months' );
			var values = $( months ).val().split( ',' );
			var c = values.indexOf( $( this ).val() );

			if ( $( this ).is( ':checked' ) ) {
				if ( c === -1 ) {
					values.push( $( this ).val() );
				}
			} else if ( c !== -1 ) {
				values.splice( c, 1 );
			}
			values = $.map( values, function( item ) {
				return item === '' ? null : item;
			} );
			$( months ).val( values.join( ',' ) );
			$.tmEPOAdmin.tm_months( $( months ).parent() );
		},

		tm_pricetype_selector: function( e ) {
			var obj;
			var val;
			var $price = $( '.tc-element-setting-price, .tc-element-setting-sale-price' );

			if ( e ) {
				obj = $( this );
			} else {
				obj = $( '#tc-floatbox-content .tm-pricetype-selector' );
			}
			val = obj.val();

			if ( val === 'math' ) {
				$price.attr( 'autocomplete', 'off' );
			} else {
				$price.removeAttr( 'autocomplete' );
			}
		},

		dynamicMode: function( e ) {
			var obj;
			var val;
			var $price = $( '.tc-element-setting-price' );

			if ( e ) {
				obj = $( this );
			} else {
				obj = $( '#tc-floatbox-content .dynamic-mode' );
			}
			val = obj.val();

			$price.removeClass( 'dynamic-product-price override-product-price change-product-weight' );
			if ( val === 'dynamic_product_price' ) {
				$price.addClass( 'dynamic-product-price' );
			} else if ( val === 'override_product_price' ) {
				$price.addClass( 'override-product-price' );
			} else if ( val === 'change_product_weight' ) {
				$price.addClass( 'change-product-weight' );
			}
		},

		tm_option_price_type: function( e ) {
			var obj;
			var val;

			if ( e ) {
				obj = $( this );
			} else {
				obj = $( '#tc-floatbox-content .tm_option_price_type' );
			}
			val = obj.val();

			if ( val === 'math' ) {
				$( '.tm_option_price, .tm_option_sale_price' ).attr( 'autocomplete', 'off' );
			} else {
				$( '.tm_option_price, .tm_option_sale_price' ).removeAttr( 'autocomplete' );
			}
		},

		tm_url: function( e ) {
			var $this = $( '#tc-floatbox-content' );
			var $use_url = $( this );
			var use_url = $this.find( '.builder-element-wrap' ).find( '.tc-cell-url' );

			if ( ! e ) {
				$use_url = $( '#tc-floatbox-content .use_url' );
			}

			if ( $use_url.val() === 'url' ) {
				use_url.show();
			} else {
				use_url.hide();
			}
		},

		upload: function( e ) {
			var _this;
			var _this_image;
			var InsertImage;
			var $tm_upload_frame;

			e.preventDefault();

			if ( wp && wp.media ) {
				_this = $( this ).prev( 'input' );
				_this_image = $( this ).nextAll( '.tm_upload_image' ).first().find( 'img' );

				if ( _this.data( 'tm_upload_frame' ) ) {
					_this.data( 'tm_upload_frame' ).open();
					return;
				}

				InsertImage = wp.media.controller.Library.extend( {
					defaults: _.defaults(
						{
							id: 'insert-image',
							title: 'Insert Image Url',
							allowLocalEdits: true,
							displaySettings: true,
							displayUserSettings: true,
							multiple: true,
							type: 'image' //audio, video, application/pdf, ... etc
						},
						wp.media.controller.Library.prototype.defaults
					)
				} );

				$tm_upload_frame = wp.media( {
					button: { text: 'Select' },
					state: 'insert-image',
					states: [ new InsertImage() ]
				} );

				$tm_upload_frame.on( 'close', function() {

				} );
				$tm_upload_frame.on( 'select', function() {
					var state = $tm_upload_frame.state( 'insert-image' );
					var selection = state.get( 'selection' );

					if ( ! selection ) {
						return;
					}

					_this_image.attr( 'src', '' );
					_this.val( '' );

					selection.each( function( attachment ) {
						var display = state.display( attachment ).toJSON();
						var obj_attachment = attachment.toJSON();
						var caption = obj_attachment.caption;
						var options;

						// If captions are disabled, clear the caption.
						if ( ! wp.media.view.settings.captions ) {
							delete obj_attachment.caption;
						}
						display = wp.media.string.props( display, obj_attachment );

						options = {
							id: obj_attachment.id,
							post_content: obj_attachment.description,
							post_excerpt: caption
						};

						if ( display.linkUrl ) {
							options.url = display.linkUrl;
						}
						if ( 'image' === obj_attachment.type ) {
							_.each(
								{
									align: 'align',
									size: 'image-size',
									alt: 'image_alt'
								},
								function( option, prop ) {
									if ( display[ prop ] ) {
										options[ option ] = display[ prop ];
									}
								}
							);
							if ( options[ 'image-size' ] && attachment.attributes.sizes[ options[ 'image-size' ] ] ) {
								options.url = attachment.attributes.sizes[ options[ 'image-size' ] ].url;
							}
						} else {
							options.post_title = display.title;
						}

						_this_image.attr( 'src', options.url );
						_this.val( options.url );
					} );
				} );

				$tm_upload_frame.on( 'open', function() {
					var selection = $tm_upload_frame.state().get( 'library' ).toJSON();
					var isinit = true;

					$.each( selection, function( i, _el ) {
						var attachment;

						if ( _el.url === _this.val() ) {
							attachment = wp.media.attachment( _el.id );
							$tm_upload_frame
								.state()
								.get( 'selection' )
								.add( attachment ? [ attachment ] : [] );
							$( '.attachment-display-settings' ).find( 'select.size' ).val( 'full' );
							isinit = false;
						} else if ( _el.sizes ) {
							$.each( _el.sizes, function( s, size ) {
								if ( size.url === _this.val() ) {
									attachment = wp.media.attachment( _el.id );
									$tm_upload_frame
										.state()
										.get( 'selection' )
										.add( attachment ? [ attachment ] : [] );
									$( '.attachment-display-settings' ).find( 'select.size' ).val( s );
									isinit = false;
								}
							} );
						}
						if ( isinit ) {
							$( '.attachment-display-settings' ).find( 'select.size' ).val( 'full' );
						}
					} );
				} );

				_this.data( 'tm_upload_frame', $tm_upload_frame );
				$tm_upload_frame.open();
			} else {
				return false;
			}
		},

		populatePriceVariables: function( obj, isDynnamicPrice, isOverridePrice ) {
			var ids = $.epoAPI.util.deepCopyArray(
				TCBUILDER.map( function( x, sectionIndex ) {
					return x.fields.map( function( y, fieldIndex ) {
						var type = y.find( function( z ) {
							return z.id === 'element_type';
						} );
						var ret;
						if ( type.default ) {
							type = type.default;
						}
						ret = y
							.filter( function( el ) {
								return el !== null;
							} )
							.find( function( z ) {
								return z.id === type + '_uniqid';
							} );
						if ( ret ) {
							ret = ret.default;
						}
						return {
							sectionIndex: sectionIndex,
							fieldIndex: fieldIndex,
							uniqid: ret,
							type: type
						};
					} );
				} )
			);
			var list;
			var exclude = $( '.tm-element-uniqid' ).attr( 'data-uniqid' );
			var value;
			var value1;
			var value2;

			// product variables
			list = $( '<h4 class="tc-var-header">' + TMEPOGLOBALADMINJS.i18n_formula_product_variables + '</h4>' );
			obj.append( list );
			list = $( '<ul class="tc-var-list product"></ul>' );
			obj.append( list );
			if ( ! isDynnamicPrice && ! isOverridePrice ) {
				list.append( '<li class="tc-var-field" data-value="{quantity}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_quantity + '</span></li>' );
			}
			list.append( '<li class="tc-var-field" data-value="{product_price}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_product_price + '</span></li>' );
			if ( ! isDynnamicPrice && ! isOverridePrice ) {
				list.append( '<li class="tc-var-field" data-value="{dynamic_product_price}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_dynamic_product_price + '</span></li>' );
			}

			// special variables
			if ( ! isDynnamicPrice ) {
				list = $( '<h4 class="tc-var-header">' + TMEPOGLOBALADMINJS.i18n_formula_special_variables + '</h4>' );
				obj.append( list );
				list = $( '<ul class="tc-var-list product"></ul>' );
				obj.append( list );
				list.append( '<li class="tc-var-field" data-value="{options_total}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_options_total + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{product_price_plus_options_total}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_product_price_plus_options_total + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{cumulative_total}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_cumulative_total + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{product_price_plus_cumulative_total}"><span>' + TMEPOGLOBALADMINJS.i18n_product_price_plus_cumulative_total + '</span></li>' );
			}

			// this element
			if ( ! isDynnamicPrice && ! isOverridePrice ) {
				list = $( '<h4 class="tc-var-header">' + TMEPOGLOBALADMINJS.i18n_formula_this_element + '</h4>' );
				obj.append( list );
				list = $( '<ul class="tc-var-list this"></ul>' );
				obj.append( list );
				list.append( '<li class="tc-var-field" data-value="{this.value}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_this_value + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{this.value.length}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_this_value_length + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{this.count}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_this_count + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{this.count.quantity}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_this_count_quantity + '</span></li>' );
				list.append( '<li class="tc-var-field" data-value="{this.quantity}"><span>' + TMEPOGLOBALADMINJS.i18n_formula_this_quantity + '</span></li>' );
			}

			// other elements
			if ( ids.length ) {
				list = $( '<h4 class="tc-var-header">' + TMEPOGLOBALADMINJS.i18n_formula_other_elements + '</h4>' );
				obj.append( list );

				list = $(
					'<div class="tc-clearfix tm-epo-switch-wrapper">' +
					'<div class="formula-field-mode-selector">' +
					'<input checked="checked" name="formulamode" class="formula-field-mode" id="formulafieldmode0" value="price" type="radio">' +
					'<label for="formulafieldmode0">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_price_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_price + '</span>' +
					'</label>' +
					'<input name="formulamode" class="formula-field-mode" id="formulafieldmode1" value="value" type="radio">' +
					'<label for="formulafieldmode1">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_value_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_value + '</span>' +
					'</label>' +
					'<input name="formulamode" class="formula-field-mode" id="formulafieldmode4" value="text" type="radio">' +
					'<label for="formulafieldmode4">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_text_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_text + '</span>' +
					'</label>' +
					'<input name="formulamode" class="formula-field-mode" id="formulafieldmode5" value="text.length" type="radio">' +
					'<label for="formulafieldmode5">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_text_length_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_text_length + '</span>' +
					'</label>' +
					'<input name="formulamode" class="formula-field-mode" id="formulafieldmode2"  value="quantity" type="radio">' +
					'<label for="formulafieldmode2">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_quantity_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_quantity + '</span>' +
					'</label>' +
					'<input name="formulamode" class="formula-field-mode" id="formulafieldmode3" value="count" type="radio">' +
					'<label for="formulafieldmode3">' +
					'<span title="' + TMEPOGLOBALADMINJS.i18n_formula_field_count_tip + '" class="tm-tooltip tc-radio-text">' + TMEPOGLOBALADMINJS.i18n_formula_field_count + '</span>' +
					'</label>' +
					'</div></div>'
				);
				obj.append( list );

				list = $( '<ul class="tc-var-list other"></ul>' );
				obj.append( list );
				ids.forEach( function( section ) {
					section.forEach( function( id ) {
						if ( id.uniqid === exclude || id.uniqid === undefined ) {
							return;
						}
						value1 = $.tmEPOAdmin.getFieldValue( TCBUILDER[ id.sectionIndex ].fields[ id.fieldIndex ], 'internal_name', id.type );
						value2 = $.tmEPOAdmin.getFieldValue( TCBUILDER[ id.sectionIndex ].fields[ id.fieldIndex ], 'header_title', id.type );

						if ( id.type === 'product' || id.type === 'dynamic' ) {
							return;
						}
						if ( value2 === undefined ) {
							value2 = '';
						}
						if ( value2 !== '' ) {
							value2 = ' (' + value2 + ')';
						}
						value = value1 + value2;
						list.append( '<li title="' + id.uniqid + '" class="tc-var-field" data-value="{field.' + id.uniqid + '.price}"><span>' + value + '</span></li>' );
					} );
				} );
			}
			$.tcToolTip( obj.find( '.tm-tooltip' ) );
		}
	};

	// document ready
	$( function() {
		templateEngine = $.epoAPI.applyFilter( 'tc_adjust_admin_template_engine', templateEngine );

		woocommerceAdmin = window.woocommerce_admin;
		tinyMCEPreInit = window.tinyMCEPreInit;
		QTags = window.QTags;
		quicktags = window.quicktags;
		tinyMCE = window.tinyMCE;
		// This should be in JSON by WordPress
		TMEPOOPTIONSJS = window.TMEPOOPTIONSJS.data;
		wcEnhancedSelectParams = window.wc_enhanced_select_params;

		// deep cloning the array
		TCBUILDER = $.epoAPI.util.deepCopyArray( TMEPOOPTIONSJS );
		if ( TCBUILDER === undefined || ! TCBUILDER ) {
			TCBUILDER = [];
		}

		$.tmEPOAdmin.initialitize();
		$.tcToolTip();

		if ( TMEPOADMINJS ) {
			$( '.tc-admin-extra-product-options_tab' ).on( 'click.cpf', function() {
				$.tmEPOAdmin.makeResizables( $( '.builder-wrapper' ) );
				$.tmEPOAdmin.makeResizables( $( '.bitem' ) );
				$( this ).off( 'click.cpf' );
			} );
		}
	} );
}( window, document, window.jQuery ) );
assets/js/admin/tm-epo-admin.js000064400000024110150755142450012405 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOADMINJS = window.TMEPOADMINJS;
	var checkForChanges = 0;
	var epoSortableOptions;

	if ( ! TMEPOADMINJS ) {
		return;
	}

	// Update option boxes
	function epoUpdateBoxes() {
		var productType = $( '#product-type' ).val();

		$( '.tc-normal-epo' )
			.toArray()
			.forEach( function( element ) {
				var div = $( element );
				var currentAttribute = div.find( '.tmcp_attribute' ).val();
				var attribute = div.find( 'select.tmcp_att' ).val();
				var variation = div.find( 'select.tmcp-variation' ).val();
				var showField = 'input.tmcp-price-input-variation-' + variation + "[data-price-input-attribute='" + attribute + "'],select.tmcp-price-input-variation-" + variation + "[data-price-input-attribute='" + attribute + "']";

				if ( ! ( productType === 'variable' || productType === 'variable-subscription' ) ) {
					div.find( '.show_if_variable' ).hide();
				} else {
					div.find( '.show_if_variable' ).show();
				}
				div.find( 'select.tmcp_att' ).hide();
				div.find( "select.tmcp_att[data-tm-attr='" + currentAttribute + "']" ).show();
				div.find( 'input.tmcp-price-input' ).hide();
				div.find( 'select.tmcp-price-input-type' ).hide();
				div.find( showField ).show();
			} );
	}

	// Set Ordering
	function epoRowIndex() {
		$( '.tc-normal-epos .tc-normal-epo' )
			.toArray()
			.forEach( function( el ) {
				$( '.tm_epo_menu_order', el ).val( parseInt( $( el ).index( '.tc-normal-epos .tc-normal-epo' ), 10 ) );
			} );
	}

	// Price fields
	function epoShowPriceField( obj, what ) {
		var val = obj.val();
		var div = obj.closest( '.tc-normal-epo' );
		var loop = div.find( 'input.tmcp_loop' ).val();
		var attribute = div.find( 'select.tmcp_att' ).val();
		var variation = div.find( 'select.tmcp-variation' ).val();
		var showField = '';
		var jo;

		div.find( 'input.tmcp-price-input' ).hide();
		div.find( 'select.tmcp-price-input-type' ).hide();

		switch ( what ) {
			case 'variation':
				variation = val;
				showField = 'input.tmcp-price-input-variation-' + val + "[data-price-input-attribute='" + attribute + "'],select.tmcp-price-input-variation-" + val + "[data-price-input-attribute='" + attribute + "']";
				break;
			case 'attribute':
				attribute = val;
				showField = 'input.tmcp-price-input-variation-' + variation + "[data-price-input-attribute='" + val + "'],select.tmcp-price-input-variation-" + variation + "[data-price-input-attribute='" + val + "']";
				break;
		}
		if ( div.find( showField ).length <= 0 ) {
			jo = div.find( '.tmcp-pricing' );
			jo.append(
				'<input type="text" name="tmcp_regular_price[' +
					loop +
					'][' +
					attribute +
					'][' +
					variation +
					']" value="" class="wc_input_price tmcp-price-input tmcp-price-input-variation-' +
					variation +
					'" data-price-input-attribute="' +
					attribute +
					'">'
			);
			jo.append(
				'<select class="tmcp-price-input-type tmcp-price-input tmcp-price-input-variation-' +
					variation +
					'" data-price-input-attribute="' +
					attribute +
					'" name="tmcp_regular_price_type[' +
					loop +
					'][' +
					attribute +
					'][' +
					variation +
					']"><option value="">' +
					TMEPOADMINJS.i18n_fixed_type +
					'</option><option value="percent">' +
					TMEPOADMINJS.i18n_percent_type +
					'</option></select>'
			);
		}

		div.find( showField ).show();
	}

	// Check for changes that affect the options
	function epoCheck() {
		var data;

		if ( checkForChanges === 1 ) {
			$( '#tc-admin-extra-product-options' ).block( {
				message: null
			} );
			data = {
				action: 'woocommerce_tm_load_epos',
				post_id: TMEPOADMINJS.post_id,
				security: TMEPOADMINJS.load_tm_epo_nonce
			};
			$.post( TMEPOADMINJS.ajax_url, data, function( response ) {
				$( '.tm-mode-local' ).html( response );
				$( '#tc-admin-extra-product-options' ).unblock();
				$( '#tc-admin-extra-product-options' ).trigger( 'tc_normal_epos_loaded' );
				checkForChanges = 0;
				epoUpdateBoxes();
			} );
		}
	}

	// Mode Selector
	function setMode( mode ) {
		if ( ! mode ) {
			return;
		}

		$( '#tm-meta-cpf-mode' ).val( mode );
		$( '.tm-mode-selector' ).addClass( 'tc-active' );
		$( '.tm-mode-builder,.tm-mode-local,.tm-mode-settings' ).hide();
		$( '.tm-mode-' + mode ).show();
		$( '.tc-builder-select,.tc-local-select,.tc-settings-select' ).removeClass( 'button-primary' );
		$( '.tc-' + mode + '-select' ).addClass( 'button-primary' );
	}

	// Price display mode
	function priceDisplayMode( mode ) {
		var checked = mode.filter( ':checked' );
		checked.closest( '.price-display-mode-wrap' ).removeClass( function( index, className ) {
			return ( className.match( /(^|\s)mode-\S+/g ) || [] ).join( ' ' );
		} ).addClass( 'mode-' + checked.val() );
	}

	// document ready
	$( function() {
		var bulkActionSelectorTop = $( '#bulk-action-selector-top' );
		var found = false;

		if ( bulkActionSelectorTop.length > 0 ) {
			bulkActionSelectorTop.children( 'option' ).each( function( i, o ) {
				if ( $( o ).val() === 'tcline' ) {
					found = true;
					$( o ).replaceWith( $( '<optgroup class="tc-bulk-opt" label="' + $( o ).text() + '">' ) );
				} else if ( found && $( o ).val() !== 'tcclear' && $( o ).val() !== 'tcproductclear' && $( o ).val() !== 'tcclearexclude' && $( o ).val() !== 'tcclearexcludeadd' ) {
					$( o ).appendTo( $( '.tc-bulk-opt' ) );
				}
				if ( $( o ).val() === 'tcline2' ) {
					$( o ).remove();
				}
			} );
		}

		epoSortableOptions = {
			items: '.tc-normal-epo',
			cursor: 'move',
			axis: 'y',
			handle: 'h3 .move',
			scrollSensitivity: 40,
			forcePlaceholderSize: true,
			helper: 'clone',
			opacity: 0.65,
			placeholder: 'wc-metabox-sortable-placeholder',
			start: function( event, ui ) {
				if ( event ) {
					ui.item.css( 'background-color', '#f6f6f6' );
				}
			},
			stop: function( event, ui ) {
				if ( event ) {
					ui.item.removeAttr( 'style' );
				}
				epoRowIndex();
			}
		};

		epoUpdateBoxes();

		$( '#tc-admin-extra-product-options' ).on( 'change', 'select.tmcp-variation', function() {
			epoShowPriceField( $( this ), 'variation' );
		} );
		$( '#tc-admin-extra-product-options' ).on( 'change', 'select.tmcp_att', function() {
			epoShowPriceField( $( this ), 'attribute' );
		} );

		$( '#tc-admin-extra-product-options' ).on( 'tc_normal_epo_added', function() {
			$( '.tc-normal-epos' ).sortable( epoSortableOptions );
		} );
		$( '#tc-admin-extra-product-options' ).on( 'tc_normal_epos_loaded', function() {
			$( '.tc-normal-epos' ).sortable( epoSortableOptions );
		} );

		$( '.tc-normal-epos' ).sortable( epoSortableOptions );

		$( '#variable_product_options' ).on( 'click', 'button.remove_variation', function() {
			checkForChanges = 1;
		} );
		$( '#variable_product_options' ).on( 'woocommerce_variations_added', function() {
			checkForChanges = 1;
		} );
		$( '.product_attributes' ).on( 'click', 'button.add_new_attribute', function() {
			checkForChanges = 1;
		} );
		$( '.save_attributes' ).on( 'click', function() {
			checkForChanges = 1;
		} );
		$( '.tc-epo-woocommerce-tab a' ).on( 'click', function() {
			epoCheck();
		} );

		// Add extra option
		$( '#tc-admin-extra-product-options' ).on( 'click', 'button.tm_add_epo', function() {
			var attributeType = $( 'select.tmcp-attr-list' ).val();
			var thisRow = $( ".tc-normal-epos .tc-normal-epo[data-epo-attr='" + attributeType + "']" );
			var loop = $( '.tc-normal-epo' ).length;
			var data = {
				action: 'woocommerce_tm_add_epo',
				post_id: TMEPOADMINJS.post_id,
				att_id: attributeType,
				loop: loop,
				security: TMEPOADMINJS.add_tm_epo_nonce
			};

			if ( thisRow.length > 0 ) {
				thisRow.find( '.woocommerce-tmcp-attributes' ).show();
				return;
			}
			$( '.tm-mode-local' ).block( {
				message: null
			} );

			$.post( TMEPOADMINJS.ajax_url, data, function( response ) {
				if ( response === 'max' ) {
					window.alert( TMEPOADMINJS.i18n_max_tmcp );
					$( '.tm-mode-local' ).unblock();
				} else if ( response ) {
					$( '.tc-normal-epos' ).append( response );

					$( '#tc-admin-extra-product-options' ).trigger( 'tc_normal_epo_added' );
					epoUpdateBoxes();
				}
			} ).always( function() {
				$( '.tm-mode-local' ).unblock();
			} );
			return false;
		} );

		// Remove extra option
		$( '#tc-admin-extra-product-options' ).on( 'click', '.remove_tm_epo', function( e ) {
			var answer = window.confirm( TMEPOADMINJS.i18n_remove_tmcp );
			var element;
			var variation;
			var data;

			e.preventDefault();

			if ( answer ) {
				element = $( this ).parent().parent();
				variation = $( this ).attr( 'rel' );
				if ( variation > 0 ) {
					element.block( {
						message: null
					} );
					data = {
						action: 'woocommerce_tm_remove_epo',
						tmcpid: variation,
						security: TMEPOADMINJS.delete_tm_epo_nonce
					};
					$.post( TMEPOADMINJS.ajax_url, data, function() {
						element.fadeOut( '300', function() {
							element.remove();
						} );
					} );
				} else {
					element.fadeOut( '300', function() {
						element.remove();
					} );
				}
			}
			return false;
		} );

		$( '#tc-admin-extra-product-options' ).on( 'change', '.tm-type', function() {
			var element = $( this );
			var choices = element.closest( '.data' ).find( '.tmcp_choices' );

			if ( element.val() === 'checkbox' ) {
				choices.removeClass( 'tm-hidden' );
			} else {
				choices.addClass( 'tm-hidden' );
			}
		} );

		$( '#tc-admin-extra-product-options' ).on( 'click', '.tc-select-mode', function( e ) {
			var mode = 'local';

			e.preventDefault();

			if ( $( this ).is( '.tc-builder-select' ) ) {
				mode = 'builder';
			}
			if ( $( this ).is( '.tc-settings-select' ) ) {
				mode = 'settings';
			}
			setMode( mode );
		} );

		// Price display mode
		$( '#tc-admin-extra-product-options' ).on( 'change', '.price-display-mode', function() {
			priceDisplayMode( $( this ) );
		} );
		priceDisplayMode( $( '.price-display-mode' ) );

		if ( ! $( '#tm-meta-cpf-mode' ).val() ) {
			$( '#tm-meta-cpf-mode' ).val( 'builder' );
		}
		setMode( $( '#tm-meta-cpf-mode' ).val() );

		if ( $.tmEPOAdmin ) {
			$.tmEPOAdmin.create_normal_dropdown( $( '.tm-mode-settings' ) );
		}
		if ( $.fn.tmcheckboxes ) {
			$( '.tm-mode-settings' ).tmcheckboxes();
		}
	} );
}( window, document, window.jQuery ) );
assets/js/admin/tm-epo-admin-order.js000064400000001303150755142450013515 0ustar00( function( window, document, $ ) {
	'use strict';

	// document ready
	$( function() {
		// Order page
		$( '#woocommerce-order-items' ).on( 'click.tc', 'a.tm-delete-order-item', function( e ) {
			var item = $( this ).closest( 'tr.item, tr.fee, tr.shipping' );
			var itemId;
			var key;

			e.preventDefault();

			itemId = $( "<input type='hidden' class='tm_meta_serialized' name='tm_item_id'>" ).val( item.attr( 'data-tm_item_id' ) );
			key = $( "<input type='hidden' class='tm_meta_serialized' name='tm_key'>" ).val( item.attr( 'data-tm_key_id' ) );
			item.prepend( itemId ).prepend( key );
			$( '.button.calculate-action' ).trigger( 'click' );
		} );
	} );
}( window, document, window.jQuery ) );
assets/js/admin/toastr.js000064400000031003150755142450011431 0ustar00/*
 * Toastr
 * Copyright 2012-2015
 * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.
 * All Rights Reserved.
 * Use, reproduction, distribution, and modification of this code is subject to the terms and
 * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
 *
 * ARIA Support: Greta Krafsig
 *
 * Project: https://github.com/CodeSeven/toastr
 * reformatted code by ThemeComplete
 */
/* global define */
( function( define ) {
	'use strict';

	define( [ 'jquery' ], function( $ ) {
		return ( function() {
			var $container;
			var listener;
			var toastId = 0;
			var toastType = {
				error: 'error',
				info: 'info',
				success: 'success',
				warning: 'warning'
			};

			var toastr;

			var previousToast;

			////////////////

			// internal functions

			function getDefaults() {
				return {
					tapToDismiss: true,
					toastClass: 'toast',
					containerId: 'toast-container',
					debug: false,

					showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
					showDuration: 300,
					showEasing: 'linear', //swing and linear are built into jQuery
					onShown: undefined,
					hideMethod: 'fadeOut',
					hideDuration: 1000,
					hideEasing: 'linear',
					onHidden: undefined,
					closeMethod: false,
					closeDuration: false,
					closeEasing: false,
					closeOnHover: true,

					extendedTimeOut: 1000,
					iconClasses: {
						error: 'toast-error',
						info: 'toast-info',
						success: 'toast-success',
						warning: 'toast-warning'
					},
					iconClass: 'toast-info',
					positionClass: 'toast-top-right',
					timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
					titleClass: 'toast-title',
					messageClass: 'toast-message',
					escapeHtml: false,
					target: 'body',
					closeHtml: '<button type="button">&times;</button>',
					closeClass: 'toast-close-button',
					newestOnTop: true,
					preventDuplicates: false,
					progressBar: false,
					progressClass: 'toast-progress',
					rtl: false
				};
			}

			function getOptions() {
				return $.extend( {}, getDefaults(), toastr.options );
			}

			function createContainer( options ) {
				$container = $( '<div/>' ).attr( 'id', options.containerId ).addClass( options.positionClass );

				$container.appendTo( $( options.target ) );
				return $container;
			}

			function getContainer( options, create ) {
				if ( ! options ) {
					options = getOptions();
				}
				$container = $( '#' + options.containerId );
				if ( $container.length ) {
					return $container;
				}
				if ( create ) {
					$container = createContainer( options );
				}
				return $container;
			}

			function removeToast( $toastElement ) {
				if ( ! $container ) {
					$container = getContainer();
				}
				if ( $toastElement.is( ':visible' ) ) {
					return;
				}
				$toastElement.remove();
				$toastElement = null;
				if ( $container.children().length === 0 ) {
					$container.remove();
					previousToast = undefined;
				}
			}

			function clearToast( $toastElement, options, clearOptions ) {
				var force = clearOptions && clearOptions.force ? clearOptions.force : false;
				if ( $toastElement && ( force || $( ':focus', $toastElement ).length === 0 ) ) {
					$toastElement[ options.hideMethod ]( {
						duration: options.hideDuration,
						easing: options.hideEasing,
						complete: function() {
							removeToast( $toastElement );
						}
					} );
					return true;
				}
				return false;
			}

			function clearContainer( options ) {
				var i;
				var toastsToClear = $container.children();
				for ( i = toastsToClear.length - 1; i >= 0; i -= 1 ) {
					clearToast( $( toastsToClear[ i ] ), options );
				}
			}

			function publish( args ) {
				if ( ! listener ) {
					return;
				}
				listener( args );
			}

			function notify( map ) {
				var options = getOptions();
				var iconClass = map.iconClass || options.iconClass;

				var intervalId = null;
				var $toastElement;
				var $titleElement;
				var $messageElement;
				var $progressElement;
				var $closeElement;
				var progressBar = {
					intervalId: null,
					hideEta: null,
					maxHideTime: null
				};
				var response;

				function escapeHtml( source ) {
					if ( source === null || source === undefined ) {
						source = '';
					}

					return source.replace( /&/g, '&amp;' ).replace( /"/g, '&quot;' ).replace( /'/g, '&#39;' ).replace( /</g, '&lt;' ).replace( />/g, '&gt;' );
				}

				function setAria() {
					var ariaValue = '';
					switch ( map.iconClass ) {
						case 'toast-success':
						case 'toast-info':
							ariaValue = 'polite';
							break;
						default:
							ariaValue = 'assertive';
					}
					$toastElement.attr( 'aria-live', ariaValue );
				}

				function hideToast( override ) {
					var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;
					var duration = override && options.closeDuration !== false ? options.closeDuration : options.hideDuration;
					var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;
					if ( $( ':focus', $toastElement ).length && ! override ) {
						return;
					}
					clearTimeout( progressBar.intervalId );
					return $toastElement[ method ]( {
						duration: duration,
						easing: easing,
						complete: function() {
							removeToast( $toastElement );
							clearTimeout( intervalId );
							if ( options.onHidden && response.state !== 'hidden' ) {
								options.onHidden();
							}
							response.state = 'hidden';
							response.endTime = new Date();
							publish( response );
						}
					} );
				}

				function delayedHideToast() {
					if ( options.timeOut > 0 || options.extendedTimeOut > 0 ) {
						intervalId = setTimeout( hideToast, options.extendedTimeOut );
						progressBar.maxHideTime = parseFloat( options.extendedTimeOut );
						progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
					}
				}

				function stickAround() {
					clearTimeout( intervalId );
					progressBar.hideEta = 0;
					$toastElement.stop( true, true )[ options.showMethod ]( { duration: options.showDuration, easing: options.showEasing } );
				}

				function handleEvents() {
					if ( options.closeOnHover ) {
						$toastElement.on( 'mouseenter', stickAround );
						$toastElement.on( 'mouseleave', delayedHideToast );
					}

					if ( ! options.onclick && options.tapToDismiss ) {
						$toastElement.on( 'click', hideToast );
					}

					if ( options.closeButton && $closeElement ) {
						$closeElement.on( 'click', function( event ) {
							if ( event.stopPropagation ) {
								event.stopPropagation();
							} else if ( event.cancelBubble !== undefined && event.cancelBubble !== true ) {
								event.cancelBubble = true;
							}

							if ( options.onCloseClick ) {
								options.onCloseClick( event );
							}

							hideToast( true );
						} );
					}

					if ( options.onclick ) {
						$toastElement.on( 'click', function( event ) {
							options.onclick( event );
							hideToast();
						} );
					}
				}

				function updateProgress() {
					var percentage = ( ( progressBar.hideEta - new Date().getTime() ) / progressBar.maxHideTime ) * 100;
					$progressElement.width( percentage + '%' );
				}

				function displayToast() {
					$toastElement.hide();

					$toastElement[ options.showMethod ]( { duration: options.showDuration, easing: options.showEasing, complete: options.onShown } );

					if ( options.timeOut > 0 ) {
						intervalId = setTimeout( hideToast, options.timeOut );
						progressBar.maxHideTime = parseFloat( options.timeOut );
						progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
						if ( options.progressBar ) {
							progressBar.intervalId = setInterval( updateProgress, 10 );
						}
					}
				}

				function setIcon() {
					if ( map.iconClass ) {
						$toastElement.addClass( options.toastClass ).addClass( iconClass );
					}
				}

				function setSequence() {
					if ( options.newestOnTop ) {
						$container.prepend( $toastElement );
					} else {
						$container.append( $toastElement );
					}
				}

				function setTitle() {
					var suffix;
					if ( map.title ) {
						suffix = map.title;
						if ( options.escapeHtml ) {
							suffix = escapeHtml( map.title );
						}
						$titleElement.append( suffix ).addClass( options.titleClass );
						$toastElement.append( $titleElement );
					}
				}

				function setMessage() {
					var suffix;
					if ( map.message ) {
						suffix = map.message;
						if ( options.escapeHtml ) {
							suffix = escapeHtml( map.message );
						}
						$messageElement.append( suffix ).addClass( options.messageClass );
						$toastElement.append( $messageElement );
					}
				}

				function setCloseButton() {
					if ( options.closeButton ) {
						$closeElement.addClass( options.closeClass ).attr( 'role', 'button' );
						$toastElement.prepend( $closeElement );
					}
				}

				function setProgressBar() {
					if ( options.progressBar ) {
						$progressElement.addClass( options.progressClass );
						$toastElement.prepend( $progressElement );
					}
				}

				function setRTL() {
					if ( options.rtl ) {
						$toastElement.addClass( 'rtl' );
					}
				}

				function shouldExit( opts, mmap ) {
					if ( opts.preventDuplicates ) {
						if ( mmap.message === previousToast ) {
							return true;
						}
						previousToast = mmap.message;
					}
					return false;
				}

				function personalizeToast() {
					setIcon();
					setTitle();
					setMessage();
					setCloseButton();
					setProgressBar();
					setRTL();
					setSequence();
					setAria();
				}

				if ( typeof map.optionsOverride !== 'undefined' ) {
					options = $.extend( options, map.optionsOverride );
					iconClass = map.optionsOverride.iconClass || iconClass;
				}

				if ( shouldExit( options, map ) ) {
					return;
				}

				toastId = toastId + 1;

				$container = getContainer( options, true );

				$toastElement = $( '<div/>' );
				$titleElement = $( '<div/>' );
				$messageElement = $( '<div/>' );
				$progressElement = $( '<div/>' );
				$closeElement = $( options.closeHtml );

				response = {
					toastId: toastId,
					state: 'visible',
					startTime: new Date(),
					options: options,
					map: map
				};

				personalizeToast();

				displayToast();

				handleEvents();

				publish( response );

				if ( options.debug && window.console ) {
					window.console.log( response );
				}

				return $toastElement;
			}

			function error( message, title, optionsOverride ) {
				return notify( {
					type: toastType.error,
					iconClass: getOptions().iconClasses.error,
					message: message,
					optionsOverride: optionsOverride,
					title: title
				} );
			}

			function info( message, title, optionsOverride ) {
				return notify( {
					type: toastType.info,
					iconClass: getOptions().iconClasses.info,
					message: message,
					optionsOverride: optionsOverride,
					title: title
				} );
			}

			function subscribe( callback ) {
				listener = callback;
			}

			function success( message, title, optionsOverride ) {
				return notify( {
					type: toastType.success,
					iconClass: getOptions().iconClasses.success,
					message: message,
					optionsOverride: optionsOverride,
					title: title
				} );
			}

			function warning( message, title, optionsOverride ) {
				return notify( {
					type: toastType.warning,
					iconClass: getOptions().iconClasses.warning,
					message: message,
					optionsOverride: optionsOverride,
					title: title
				} );
			}

			function clear( $toastElement, clearOptions ) {
				var options = getOptions();
				if ( ! $container ) {
					getContainer( options );
				}
				if ( ! clearToast( $toastElement, options, clearOptions ) ) {
					clearContainer( options );
				}
			}

			function remove( $toastElement ) {
				var options = getOptions();
				if ( ! $container ) {
					getContainer( options );
				}
				if ( $toastElement && $( ':focus', $toastElement ).length === 0 ) {
					removeToast( $toastElement );
					return;
				}
				if ( $container.children().length ) {
					$container.remove();
				}
			}

			toastr = {
				clear: clear,
				remove: remove,
				error: error,
				getContainer: getContainer,
				info: info,
				options: {},
				subscribe: subscribe,
				success: success,
				version: '2.1.4',
				warning: warning
			};

			return toastr;
		}() );
	} );
}(
	typeof define === 'function' && define.amd
		? define
		: function( deps, factory ) {
			'use strict';

			if ( typeof window.module !== 'undefined' && window.module.exports ) {
				//Node
				window.module.exports = factory( window.require( 'jquery' ) );
			} else {
				window.toastr = factory( window.jQuery );
			}
		}
) );
assets/js/admin/tm-epo-admin-settings.js000064400000056334150755142450014260 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOADMINSETTINGSJS = window.TMEPOADMINSETTINGSJS;
	var localStorage = $.epoAPI.util.getStorage( 'localStorage' );
	var confirm = window.confirm;
	var toastr = window.toastr;
	var ajaxCheck = 0;

	function tm_license_check( action ) {
		var tm_epo_consent_for_transmit = $( '#tm_epo_consent_for_transmit' );
		var data;

		if ( tm_epo_consent_for_transmit.length && tm_epo_consent_for_transmit.is( ':checked' ) && ajaxCheck === 0 ) {
			ajaxCheck = 1;
			$( '.tm-license-result' ).html( '<div class="activated"><p>' + TMEPOADMINSETTINGSJS.i18n_sending_data + '</p></div>' );
			$( '.tm-license-button' ).block( {
				message: null
			} );
			data = {
				action: 'tm_' + action + '_license',
				username: $( '#tm_epo_envato_username' ).val(),
				key: $( '#tm_epo_envato_purchasecode' ).val(),
				api_key: $( '#tm_epo_envato_apikey' ).val(),
				security: TMEPOADMINSETTINGSJS.settings_nonce
			};
			$.post(
				TMEPOADMINSETTINGSJS.ajax_url,
				data,
				function( response ) {
					var html;

					if ( ! response || response === -1 ) {
						html = TMEPOADMINSETTINGSJS.i18n_invalid_request;
					} else if ( response && response.message && response.result && ( response.result === '-3' || response.result === '-2' || response.result === 'wp_error' || response.result === 'server_error' ) ) {
						html = response.message;
					} else if ( response && response.message && response.result && response.result === '4' ) {
						html = response.message;
					} else {
						html = '';
					}

					$( '.tm-license-result' ).html( html );
					$( '.tm-license-button' ).unblock();
				},
				'json'
			).always( function( response ) {
				$( '.tm-license-button' ).unblock();
				ajaxCheck = 0;
				if ( response && response.result && response.result === '4' ) {
					if ( action === 'activate' ) {
						$( '.tm-deactivate-license' ).removeClass( 'tm-hidden' );
						$( '.tm-activate-license' ).removeClass( 'tm-hidden' ).addClass( 'tm-hidden' );
					}
					if ( action === 'deactivate' ) {
						$( '.tm-deactivate-license' ).removeClass( 'tm-hidden' ).addClass( 'tm-hidden' );
						$( '.tm-activate-license' ).removeClass( 'tm-hidden' );
					}
				}
			} );
		} else {
			$( '.tm-license-result' ).html( '<div class="error"><p>' + TMEPOADMINSETTINGSJS.i18n_must_concent + '</p></div>' );
		}
	}

	function tm_epo_auto_hide_price_if_zero( select ) {
		var val = select.is( ':checked' );
		var row1 = $( '#tm_epo_no_hide_price_if_original_not_zero' ).closest( 'tr' );

		if ( val ) {
			row1.show();
		} else {
			row1.hide();
		}
	}

	function tm_options_placement_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_options_placement_custom_hook' ).closest( 'tr' );

		if ( val === 'custom' ) {
			row1.show();
		} else {
			row1.hide();
		}
	}

	function tm_totals_box_placement_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_totals_box_placement_custom_hook' ).closest( 'tr' );

		if ( val === 'custom' ) {
			row1.show();
		} else {
			row1.hide();
		}
	}

	function tm_final_total_box_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_show_options_total' ).closest( 'tr' );
		var row2 = $( '#tm_epo_show_final_total' ).closest( 'tr' );
		var row3 = $( '#tm_epo_enable_final_total_box_all' ).closest( 'tr' );
		var row4 = $( '#tm_epo_enable_original_final_total' ).closest( 'tr' );
		var row5 = $( '#tm_epo_enable_vat_options_total' ).closest( 'tr' );
		var row6 = $( '#tm_epo_show_unit_price' ).closest( 'tr' );
		var row7 = $( '#tm_epo_fees_on_unit_price' ).closest( 'tr' );
		var row8 = $( '#tm_epo_total_price_as_unit_price' ).closest( 'tr' );
		var row9 = $( '#tm_epo_hide_totals_until_any' ).closest( 'tr' );
		var row10 = $( '#tm_epo_hide_totals_until_all_required' ).closest( 'tr' );
		var row11 = $( '#tm_epo_hide_totals_until_all' ).closest( 'tr' );

		if ( val === 'disable' ) {
			row1.hide();
			row2.hide();
			row3.hide();
			row4.hide();
			row5.hide();
			row6.hide();
			row7.hide();
			row8.hide();
			row9.hide();
			row10.hide();
			row11.hide();
		} else {
			row1.show();
			row2.show();
			row3.show();
			row4.show();
			row5.show();
			row6.show();
			row7.show();
			row8.show();
			row9.show();
			row10.show();
			row11.show();
			tm_show_options_total_settings( $( '#tm_epo_show_options_total' ) );
			tm_show_final_total_settings( $( '#tm_epo_show_final_total' ) );
		}
	}

	function tm_show_options_total_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_enable_vat_options_total' ).closest( 'tr' );

		if ( val === 'hide' ) {
			row1.hide();
		} else {
			row1.show();
		}
	}

	function tm_show_final_total_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_enable_original_final_total' ).closest( 'tr' );
		var row2 = $( '#tm_epo_total_price_as_unit_price' ).closest( 'tr' );

		if ( val === 'hide' ) {
			row1.hide();
			row2.hide();
		} else {
			row1.show();
			row2.show();
		}
	}

	function tm_display_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_options_placement' ).closest( 'tr' );
		var row2 = $( '#tm_epo_totals_box_placement' ).closest( 'tr' );
		var row3 = $( '#tm_epo_options_placement_custom_hook' ).closest( 'tr' );
		var row4 = $( '#tm_epo_totals_box_placement_custom_hook' ).closest( 'tr' );

		if ( val === 'action' ) {
			row1.hide();
			row2.hide();
			row3.hide();
			row4.hide();
		} else {
			row1.show();
			row2.show();
			tm_options_placement_settings( $( '#tm_epo_options_placement' ) );
			tm_totals_box_placement_settings( $( '#tm_epo_totals_box_placement' ) );
		}
	}

	function tm_epo_floating_totals_box_settings( select ) {
		var val = select.val();
		var row1 = $( '#tm_epo_floating_totals_box_visibility' ).closest( 'tr' );
		var row2 = $( '#tm_epo_floating_totals_box_add_button' ).closest( 'tr' );
		var row3 = $( '#tm_epo_floating_totals_box_pixels' ).closest( 'tr' );

		if ( val === 'disable' ) {
			row1.hide();
			row2.hide();
			row3.hide();
		} else {
			row1.show();
			row2.show();
			tm_epo_floating_totals_box_visibility_settings( $( '#tm_epo_floating_totals_box_visibility' ) );
		}
	}

	function tm_epo_floating_totals_box_visibility_settings( select ) {
		var val = select.val();
		var val2 = $( '#tm_epo_floating_totals_box' ).val();
		var row1 = $( '#tm_epo_floating_totals_box_pixels' ).closest( 'tr' );

		if ( val === 'always' || val2 === 'disable' ) {
			row1.hide();
		} else {
			row1.show();
		}
	}

	function tm_epo_show_price_inside_option_settings( select ) {
		var val = select.is( ':checked' );
		var row1 = $( '#tm_epo_show_price_inside_option_hidden_even' ).closest( 'tr' );
		var row2 = $( '#tm_epo_multiply_price_inside_option' ).closest( 'tr' );

		if ( val ) {
			row1.show();
			row2.show();
		} else {
			row1.hide();
			row2.hide();
		}
	}

	function tm_epo_show_hide_uploaded_file_url_cart_settings( select ) {
		var val = select.is( ':checked' );
		var row1 = $( '#tm_epo_show_upload_image_replacement' ).closest( 'tr' );

		if ( val ) {
			row1.hide();
		} else {
			row1.show();
		}
	}

	function tm_epo_show_hide_uploaded_file_url_order_settings( select ) {
		var val = select.is( ':checked' );
		var row1 = $( '#tm_epo_show_upload_image_replacement_order' ).closest( 'tr' );

		if ( val ) {
			row1.hide();
		} else {
			row1.show();
		}
	}

	function tm_css_styles_style( select ) {
		$( select )
			.closest( 'td' )
			.css( 'position', 'relative' )
			.append(
				'<label class="tm-epo-field-label"><span class="tc-epo-style-wrapper"><input type="checkbox" checked><span class="tm-epo-style"></span></span></label><label class="tm-epo-field-label"><span class="tc-epo-style-wrapper"><input type="radio" checked><span class="tm-epo-style"></span></span></label>'
			);
	}

	function tm_css_styles_style_settings( select ) {
		var val = select.val();
		var label = $( '.tm-epo-field-label' );

		label.find( '.tc-epo-style-wrapper, .tm-epo-style' ).removeClass( 'circle circle 2 square square2 round round2' ).addClass( val );
	}

	function tm_css_styles_settings( select ) {
		var row1 = $( '#tm_epo_css_styles_style' ).closest( 'tr' );

		if ( select.is( ':checked' ) ) {
			row1.show();
		} else {
			row1.hide();
		}
	}

	function tm_epo_css_selected_border( select ) {
		$( select ).closest( 'td' ).css( 'position', 'relative' ).append( '<div class="tm-border-type"></div>' );
	}

	function tm_epo_css_selected_border_settings( select ) {
		var val = select.val();
		var border = $( '.tm-border-type' );

		border.removeClass( 'square circle round shadow thinline' ).addClass( val );
	}

	function tc_find_row( obj ) {
		return obj.closest( 'tr' );
	}

	function show_sub_section( mitem, item, inputs, table ) {
		tc_find_row( inputs ).addClass( 'tm-hidden' );
		tc_find_row( inputs.filter( '.' + mitem ) ).removeClass( 'tm-hidden' );
		table.find( '.tm-section-desc .tm-section-menu-item' ).removeClass( 'active' );
		item.addClass( 'active' );
	}

	function doConfirm( title, func, funcThis, funcArgs ) {
		var $_html = $.epoAPI.template.html( window.wp.template( 'tc-floatbox' ), {
			id: 'tc-floatbox-content',
			title: title,
			html: '',
			uniqid: '',
			update: TMEPOADMINSETTINGSJS.i18n_yes,
			cancel: TMEPOADMINSETTINGSJS.i18n_no
		} );
		var clicked = false;

		$.tcFloatBox( {
			closefadeouttime: 0,
			overlayopacity: 0.6,
			animateOut: '',
			fps: 1,
			refresh: 'fixed',
			width: '50%',
			height: 'auto',
			classname: 'flasho tc-wrapper tc-question',
			data: $_html,
			cancelEvent: function( inst ) {
				if ( clicked ) {
					return;
				}
				clicked = true;

				inst.destroy();
			},
			cancelClass: '.floatbox-cancel',
			updateEvent: function( inst ) {
				if ( clicked ) {
					return;
				}
				clicked = true;

				func.apply( funcThis, funcArgs );

				inst.destroy();
			},
			updateClass: '.floatbox-update'
		} );
	}

	function doPost( form, data, refresh ) {
		form.block( {
			message: null
		} );

		$.post(
			TMEPOADMINSETTINGSJS.ajax_url,
			data,
			function( response ) {
				if ( response ) {
					if ( response.error === 1 ) {
						toastr.error( response.message, TMEPOADMINSETTINGSJS.i18n_epo );
					} else {
						toastr.success( response.message, TMEPOADMINSETTINGSJS.i18n_epo );
						if ( refresh ) {
							window.location.reload();
						}
					}
				}
			},
			'json'
		).always( function() {
			form.unblock();
		} );
	}

	function setMathData() {
		var tmEpoMath = $( '#tm_epo_math' );
		var dataRow = $( '.constantrow' );
		var mathArray = {};

		dataRow
			.toArray()
			.forEach( function( el, i ) {
				var $el = $( el );
				var constantName = $el.find( '.constant-name' );
				var name = constantName.val();
				var constantValue = $el.find( '.constant-value' );
				var value = constantValue.val();
				var labelName = constantName.closest( '.constant-label-wrap' );
				var labelValue = constantValue.closest( '.constant-label-wrap' );

				if ( name === '' ) {
					labelName.addClass( 'tm-error' );
				} else {
					labelName.removeClass( 'tm-error' );
				}
				if ( value === '' ) {
					labelValue.addClass( 'tm-error' );
				} else {
					labelValue.removeClass( 'tm-error' );
				}

				if ( name !== '' || value !== '' ) {
					mathArray[ 'm' + i ] = {
						name: String( name ),
						value: String( value )
					};
				}
			} );

		tmEpoMath.val( JSON.stringify( mathArray ) );
	}

	function tm_epo_math() {
		var tmEpoMath = $( '#tm_epo_math' );
		var mathArray;
		var template = '';

		tmEpoMath.closest( 'tr' ).hide();

		mathArray = $.epoAPI.util.parseJSON( tmEpoMath.val() );
		if ( ! mathArray ) {
			mathArray = {};
		}

		Object.keys( mathArray ).forEach( function( key, i ) {
			var name = mathArray[ key ].name;
			var value = mathArray[ key ].value;

			template = template + $.epoAPI.template.html( window.wp.template( 'tc-constant-template' ), {
				id: i,
				labelname: TMEPOADMINSETTINGSJS.i18n_constant_name,
				labelvalue: TMEPOADMINSETTINGSJS.i18n_constant_value,
				constantname: name,
				constantvalue: value,
				labelnameclass: ( name === '' ) ? ' tm-error' : '',
				labelvalueclass: ( value === '' ) ? ' tm-error' : ''
			} );
		} );

		$( '.tc-add-constant' ).closest( 'tr' ).before( template );

		$( document ).on( 'click', '.tc-add-constant', function() {
			var $this = $( this );
			var constantDiv = $this.closest( 'tr' );
			var len = $( '.constantrow' ).length;

			constantDiv.before( $.epoAPI.template.html( window.wp.template( 'tc-constant-template' ), {
				id: len,
				labelname: TMEPOADMINSETTINGSJS.i18n_constant_name,
				labelvalue: TMEPOADMINSETTINGSJS.i18n_constant_value
			} ) );
		} );

		$( document ).on( 'click', '.tc-constant-delete .delete', function() {
			$( this ).closest( 'tr' ).remove();
		} );

		$( document ).on( 'change blur keyup', '.constant-name, .constant-value', function() {
			var $this = $( this );
			var label = $this.closest( '.constant-label-wrap' );

			if ( $this.val() === '' ) {
				label.addClass( 'tm-error' );
			} else {
				label.removeClass( 'tm-error' );
			}
		} );
	}

	// document ready
	$( function() {
		var tm_settings_wrap = $( '.tm-settings-wrap' );
		var tm_settings_wrap_checkbox;

		if ( tm_settings_wrap.length > 0 ) {
			tm_settings_wrap_checkbox = tm_settings_wrap.find( ':checkbox' );
			tm_settings_wrap_checkbox.closest( 'label' ).addClass( 'tm-epo-switch-wrapper-label' );
			tm_settings_wrap_checkbox.wrap( '<span class="tm-epo-switch-wrapper tc"></span>' );
			tm_settings_wrap_checkbox.after( '<span class="tc-label tm-epo-switch tc"></span>' );

			tm_settings_wrap.find( 'input.tm-color-picker' ).spectrum( {
				showInput: true,
				showInitial: true,
				allowEmpty: true,
				showAlpha: true,
				showPalette: true,
				clickoutFiresChange: false,
				type: 'color',
				preferredFormat: 'hex',
				theme: 'epo',
				chooseText: TMEPOADMINSETTINGSJS.i18n_close,
				cancelText: TMEPOADMINSETTINGSJS.i18n_cancel
			} );

			$( '.forminp .description' )
				.toArray()
				.forEach( function( el ) {
					var $el = $( el );
					var tr = $el.closest( 'tr' );
					var titledesc = tr.find( '.titledesc' );

					titledesc.append( $el );
				} );

			$( '#tm_epo_consent_for_transmit' ).closest( 'tr' ).after( $( '<tr valign="top"><th scope="row" class="titledesc tm-license-div"></th><td class="forminp forminp-license"></td></tr>' ) );

			$( '.tm-license-div' ).append( $( '.tm-license-button' ) );
			$( '.forminp-license' ).append( $( '.tm-license-result' ) );

			$( window ).on( 'tc-opentab.tmtabs tc-isopentab.tmtabs', function( e, o ) {
				var items = o.table.find( '.tm-section-desc .tm-section-menu-item' );
				var mitem;
				var item;
				var inputs;

				if ( items.length > 0 ) {
					if ( localStorage ) {
						mitem = localStorage.getItem( 'tmadminextratab' );
					}
					item = items.filter( '[data-menu="' + mitem + '"]' );
					inputs = o.table.find( 'select,input,text,textarea' );

					if ( ! mitem || item.length === 0 ) {
						item = $( items ).eq( 0 );
						mitem = item.attr( 'data-menu' );
					}
					show_sub_section( mitem, item, inputs, o.table );
				}
			} );

			$( document ).on( 'keydown.tmtabs', '.tm-section-menu-item', function( e ) {
				var $this = $( this );
				var prevnext;
				if ( e.keyCode === 13 ) {
					$this.trigger( 'click' );
				}
				if ( e.keyCode === 39 ) {
					prevnext = $this.next( '.tm-section-menu-item' );
				}
				if ( e.keyCode === 37 ) {
					prevnext = $this.prev( '.tm-section-menu-item' );
				}
				if ( prevnext && prevnext.length ) {
					$this.trigger( 'blur' );
					prevnext.trigger( ' focus' ).trigger( 'click' );
					e.preventDefault();
				}
			} );

			$( document ).on( 'click', '.tm-section-menu-item', function() {
				var item = $( this );
				var mitem = item.attr( 'data-menu' );
				var table = item.closest( '.tm-tab' );
				var inputs = table.find( 'select,input,text,textarea' );

				show_sub_section( mitem, item, inputs, table );

				if ( localStorage ) {
					localStorage.setItem( 'tmadminextratab', mitem );
				}
			} );

			$( window ).on( 'tc-tmtabs-clicked', function( e, o ) {
				var items = o.table.find( '.tm-section-desc .tm-section-menu-item' );
				var mitem;
				var c;
				var con;
				var item;
				var inputs;

				if ( items.length > 0 ) {
					if ( localStorage ) {
						mitem = localStorage.getItem( 'tmadminextratab' );
					}
					if ( localStorage ) {
						c = localStorage.getItem( 'tmadminextratab-context' );
					}
					con = o.header.attr( o.options.dataattribute );
					inputs = o.table.find( 'select,input,text,textarea' );

					if ( mitem && c === con ) {
						item = items.filter( '[data-menu="' + mitem + '"]' );
					} else {
						item = $( items ).eq( 0 );
						mitem = item.attr( 'data-menu' );
					}
					if ( localStorage ) {
						localStorage.setItem( 'tmadminextratab-context', con );
					}
					if ( item.length > 0 && ! item.is( '.active' ) ) {
						show_sub_section( mitem, item, inputs, o.table );
					}
				}
			} );

			$( document ).on( 'click', '.tc-save-button', function( e ) {
				var form = $( this ).closest( 'form' );
				var data;

				setMathData();
				data = form.tcSerializeObject();
				data = $.extend( true, data, {
					action: 'tm_save_settings',
					save: 'save',
					security: TMEPOADMINSETTINGSJS.settings_nonce
				} );

				e.preventDefault();

				doPost( form, data );
			} );

			$( document ).on( 'click', '.tc-reset-button', function( e ) {
				var form = $( this ).closest( 'form' );
				var data = $.extend( true, {}, {
					action: 'tm_reset_settings',
					save: 'save',
					security: TMEPOADMINSETTINGSJS.settings_nonce
				} );

				e.preventDefault();

				doConfirm( TMEPOADMINSETTINGSJS.i18n_reset_settings, doPost, this, [ form, data, true ] );
			} );

			$( '.tm-settings-wrap .tm-tabs' ).tcTabs( { scroll: false } );

			$( '.tm-activate-license' ).on( 'click', function( e ) {
				e.preventDefault();
				tm_license_check( 'activate' );
			} );
			$( '.tm-deactivate-license' ).on( 'click', function( e ) {
				e.preventDefault();
				tm_license_check( 'deactivate' );
			} );

			$( '#tm_epo_final_total_box' ).on( 'change', function() {
				tm_final_total_box_settings( $( this ) );
			} );
			$( '#tm_epo_show_options_total' ).on( 'change', function() {
				tm_show_options_total_settings( $( this ) );
			} );
			$( '#tm_epo_show_final_total' ).on( 'change', function() {
				tm_show_final_total_settings( $( this ) );
			} );
			$( '#tm_epo_display' ).on( 'change', function() {
				tm_display_settings( $( this ) );
			} );
			$( '#tm_epo_options_placement' ).on( 'change', function() {
				tm_options_placement_settings( $( this ) );
			} );
			$( '#tm_epo_totals_box_placement' ).on( 'change', function() {
				tm_totals_box_placement_settings( $( this ) );
			} );
			$( '#tm_epo_css_styles' ).on( 'change', function() {
				tm_css_styles_settings( $( this ) );
			} );
			$( '#tm_epo_css_styles_style' ).on( 'change', function() {
				tm_css_styles_style_settings( $( this ) );
			} );
			$( '#tm_epo_css_selected_border' ).on( 'change', function() {
				tm_epo_css_selected_border_settings( $( this ) );
			} );
			$( '#tm_epo_floating_totals_box' ).on( 'change', function() {
				tm_epo_floating_totals_box_settings( $( this ) );
			} );
			$( '#tm_epo_floating_totals_box_visibility' ).on( 'change', function() {
				tm_epo_floating_totals_box_visibility_settings( $( this ) );
			} );
			$( '#tm_epo_show_price_inside_option' ).on( 'change', function() {
				tm_epo_show_price_inside_option_settings( $( this ) );
			} );
			$( '#tm_epo_show_hide_uploaded_file_url_cart' ).on( 'change', function() {
				tm_epo_show_hide_uploaded_file_url_cart_settings( $( this ) );
			} );
			$( '#tm_epo_show_hide_uploaded_file_url_order' ).on( 'change', function() {
				tm_epo_show_hide_uploaded_file_url_order_settings( $( this ) );
			} );
			$( '#tm_epo_auto_hide_price_if_zero' ).on( 'change', function() {
				tm_epo_auto_hide_price_if_zero( $( this ) );
			} );

			tm_final_total_box_settings( $( '#tm_epo_final_total_box' ) );
			tm_show_options_total_settings( $( '#tm_epo_show_options_total' ) );
			tm_show_final_total_settings( $( '#tm_epo_show_final_total' ) );
			tm_display_settings( $( '#tm_epo_display' ) );
			tm_options_placement_settings( $( '#tm_epo_options_placement' ) );
			tm_totals_box_placement_settings( $( '#tm_epo_totals_box_placement' ) );
			tm_css_styles_style( $( '#tm_epo_css_styles_style' ) );
			tm_css_styles_style_settings( $( '#tm_epo_css_styles_style' ) );
			tm_css_styles_settings( $( '#tm_epo_css_styles' ) );
			tm_epo_css_selected_border( $( '#tm_epo_css_selected_border' ) );
			tm_epo_css_selected_border_settings( $( '#tm_epo_css_selected_border' ) );
			tm_epo_floating_totals_box_settings( $( '#tm_epo_floating_totals_box' ) );
			tm_epo_floating_totals_box_visibility_settings( $( '#tm_epo_floating_totals_box_visibility' ) );
			tm_epo_show_price_inside_option_settings( $( '#tm_epo_show_price_inside_option' ) );
			tm_epo_show_hide_uploaded_file_url_cart_settings( $( '#tm_epo_show_hide_uploaded_file_url_cart' ) );
			tm_epo_show_hide_uploaded_file_url_order_settings( $( '#tm_epo_show_hide_uploaded_file_url_order' ) );
			tm_epo_auto_hide_price_if_zero( $( '#tm_epo_auto_hide_price_if_zero' ) );

			tm_epo_math();

			$( document ).on( 'click.cpf', '.tm-mn-movetodir,.tm-mn-deldir,.tm-mn-delfile', function( e ) {
				var $this = $( this );
				var forminp_tm_html = $( '.forminp-tm_html' );
				var action;
				var data;

				e.preventDefault();

				if ( forminp_tm_html.length > 0 ) {
					if ( forminp_tm_html.data( 'doing_ajax' ) ) {
						return;
					}
					if ( $this.is( '.tm-mn-deldir' ) && ! confirm( TMEPOADMINSETTINGSJS.i18n_mn_delete_folder ) ) {
						return;
					} else if ( $this.is( '.tm-mn-delfile' ) && ! confirm( TMEPOADMINSETTINGSJS.i18n_mn_delete_file ) ) {
						return;
					}
					$this.prepend( '<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>' );

					forminp_tm_html.data( 'doing_ajax', 1 ).block( {
						message: null
					} );
					action = 'tm_mn_movetodir';
					data = {
						action: action,
						dir: $this.attr( 'data-tm-dir' ),
						security: TMEPOADMINSETTINGSJS.settings_nonce
					};

					if ( $this.is( '.tm-mn-deldir' ) ) {
						data.action = 'tm_mn_deldir';
						data.tmdir = $this.attr( 'data-tm-deldir' );
					} else if ( $this.is( '.tm-mn-delfile' ) ) {
						data.action = 'tm_mn_delfile';
						data.tmfile = $this.attr( 'data-tm-delfile' );
						data.tmdir = $this.attr( 'data-tm-deldir' );
					}
					$.post(
						TMEPOADMINSETTINGSJS.ajax_url,
						data,
						function( response ) {
							var $_html;

							if ( response && response.result && response.result !== '' ) {
								forminp_tm_html.html( response.result );
							} else if ( response && response.error && response.message ) {
								$_html = $.epoAPI.template.html( window.wp.template( 'tc-floatbox-import' ), {
									id: 'tc-floatbox-content',
									title: TMEPOADMINSETTINGSJS.i18n_error_title,
									html: '<div class="tm-inner">' + response.message + '</div>',
									cancel: TMEPOADMINSETTINGSJS.i18n_cancel
								} );
								$.tcFloatBox( {
									closefadeouttime: 0,
									//"animationBaseClass": "",
									//"animateIn": "",
									animateOut: '',
									fps: 1,
									ismodal: true,
									refresh: 'fixed',
									width: '50%',
									height: '300px',
									classname: 'flasho tc-wrapper tm-error tc-color-error',
									data: $_html
								} );
							}
						},
						'json'
					).always( function() {
						forminp_tm_html.data( 'doing_ajax', 0 ).unblock();
						$this.find( '.tm-icon' ).remove();
					} );
				}
			} );
		}

		$.tcToolTip();
	} );
}( window, document, window.jQuery ) );
assets/js/admin/tm-epo-admin-settings.min.js000064400000031461150755142450015034 0ustar00!function(l,o,p){"use strict";var c=l.TMEPOADMINSETTINGSJS,_=p.epoAPI.util.getStorage("localStorage"),n=l.confirm,s=l.toastr,a=0;function i(e){var t=p("#tm_epo_consent_for_transmit");t.length&&t.is(":checked")&&0===a?(a=1,p(".tm-license-result").html('<div class="activated"><p>'+c.i18n_sending_data+"</p></div>"),p(".tm-license-button").block({message:null}),t={action:"tm_"+e+"_license",username:p("#tm_epo_envato_username").val(),key:p("#tm_epo_envato_purchasecode").val(),api_key:p("#tm_epo_envato_apikey").val(),security:c.settings_nonce},p.post(c.ajax_url,t,function(t){t=t&&-1!==t?t&&t.message&&t.result&&("-3"===t.result||"-2"===t.result||"wp_error"===t.result||"server_error"===t.result)||t&&t.message&&t.result&&"4"===t.result?t.message:"":c.i18n_invalid_request;p(".tm-license-result").html(t),p(".tm-license-button").unblock()},"json").always(function(t){p(".tm-license-button").unblock(),a=0,t&&t.result&&"4"===t.result&&("activate"===e&&(p(".tm-deactivate-license").removeClass("tm-hidden"),p(".tm-activate-license").removeClass("tm-hidden").addClass("tm-hidden")),"deactivate"===e)&&(p(".tm-deactivate-license").removeClass("tm-hidden").addClass("tm-hidden"),p(".tm-activate-license").removeClass("tm-hidden"))})):p(".tm-license-result").html('<div class="error"><p>'+c.i18n_must_concent+"</p></div>")}function r(t){var t=t.is(":checked"),e=p("#tm_epo_no_hide_price_if_original_not_zero").closest("tr");t?e.show():e.hide()}function m(t){var t=t.val(),e=p("#tm_epo_options_placement_custom_hook").closest("tr");"custom"===t?e.show():e.hide()}function d(t){var t=t.val(),e=p("#tm_epo_totals_box_placement_custom_hook").closest("tr");"custom"===t?e.show():e.hide()}function h(t){var t=t.val(),e=p("#tm_epo_show_options_total").closest("tr"),o=p("#tm_epo_show_final_total").closest("tr"),s=p("#tm_epo_enable_final_total_box_all").closest("tr"),a=p("#tm_epo_enable_original_final_total").closest("tr"),n=p("#tm_epo_enable_vat_options_total").closest("tr"),i=p("#tm_epo_show_unit_price").closest("tr"),l=p("#tm_epo_fees_on_unit_price").closest("tr"),c=p("#tm_epo_total_price_as_unit_price").closest("tr"),_=p("#tm_epo_hide_totals_until_any").closest("tr"),r=p("#tm_epo_hide_totals_until_all_required").closest("tr"),m=p("#tm_epo_hide_totals_until_all").closest("tr");"disable"===t?(e.hide(),o.hide(),s.hide(),a.hide(),n.hide(),i.hide(),l.hide(),c.hide(),_.hide(),r.hide(),m.hide()):(e.show(),o.show(),s.show(),a.show(),n.show(),i.show(),l.show(),c.show(),_.show(),r.show(),m.show(),u(p("#tm_epo_show_options_total")),f(p("#tm_epo_show_final_total")))}function u(t){var t=t.val(),e=p("#tm_epo_enable_vat_options_total").closest("tr");"hide"===t?e.hide():e.show()}function f(t){var t=t.val(),e=p("#tm_epo_enable_original_final_total").closest("tr"),o=p("#tm_epo_total_price_as_unit_price").closest("tr");"hide"===t?(e.hide(),o.hide()):(e.show(),o.show())}function v(t){var t=t.val(),e=p("#tm_epo_options_placement").closest("tr"),o=p("#tm_epo_totals_box_placement").closest("tr"),s=p("#tm_epo_options_placement_custom_hook").closest("tr"),a=p("#tm_epo_totals_box_placement_custom_hook").closest("tr");"action"===t?(e.hide(),o.hide(),s.hide(),a.hide()):(e.show(),o.show(),m(p("#tm_epo_options_placement")),d(p("#tm_epo_totals_box_placement")))}function b(t){var t=t.val(),e=p("#tm_epo_floating_totals_box_visibility").closest("tr"),o=p("#tm_epo_floating_totals_box_add_button").closest("tr"),s=p("#tm_epo_floating_totals_box_pixels").closest("tr");"disable"===t?(e.hide(),o.hide(),s.hide()):(e.show(),o.show(),w(p("#tm_epo_floating_totals_box_visibility")))}function w(t){var t=t.val(),e=p("#tm_epo_floating_totals_box").val(),o=p("#tm_epo_floating_totals_box_pixels").closest("tr");"always"===t||"disable"===e?o.hide():o.show()}function g(t){var t=t.is(":checked"),e=p("#tm_epo_show_price_inside_option_hidden_even").closest("tr"),o=p("#tm_epo_multiply_price_inside_option").closest("tr");t?(e.show(),o.show()):(e.hide(),o.hide())}function x(t){var t=t.is(":checked"),e=p("#tm_epo_show_upload_image_replacement").closest("tr");t?e.hide():e.show()}function y(t){var t=t.is(":checked"),e=p("#tm_epo_show_upload_image_replacement_order").closest("tr");t?e.hide():e.show()}function k(t){t=t.val();p(".tm-epo-field-label").find(".tc-epo-style-wrapper, .tm-epo-style").removeClass("circle circle 2 square square2 round round2").addClass(t)}function C(t){var e=p("#tm_epo_css_styles_style").closest("tr");t.is(":checked")?e.show():e.hide()}function I(t){t=t.val();p(".tm-border-type").removeClass("square circle round shadow thinline").addClass(t)}function j(t){return t.closest("tr")}function A(t,e,o,s){j(o).addClass("tm-hidden"),j(o.filter("."+t)).removeClass("tm-hidden"),s.find(".tm-section-desc .tm-section-menu-item").removeClass("active"),e.addClass("active")}function S(t,e,o){t.block({message:null}),p.post(c.ajax_url,e,function(t){t&&(1===t.error?s.error(t.message,c.i18n_epo):(s.success(t.message,c.i18n_epo),o&&l.location.reload()))},"json").always(function(){t.unblock()})}p(function(){var s,a,t,e=p(".tm-settings-wrap");0<e.length&&((t=e.find(":checkbox")).closest("label").addClass("tm-epo-switch-wrapper-label"),t.wrap('<span class="tm-epo-switch-wrapper tc"></span>'),t.after('<span class="tc-label tm-epo-switch tc"></span>'),e.find("input.tm-color-picker").spectrum({showInput:!0,showInitial:!0,allowEmpty:!0,showAlpha:!0,showPalette:!0,clickoutFiresChange:!1,type:"color",preferredFormat:"hex",theme:"epo",chooseText:c.i18n_close,cancelText:c.i18n_cancel}),p(".forminp .description").toArray().forEach(function(t){t=p(t);t.closest("tr").find(".titledesc").append(t)}),p("#tm_epo_consent_for_transmit").closest("tr").after(p('<tr valign="top"><th scope="row" class="titledesc tm-license-div"></th><td class="forminp forminp-license"></td></tr>')),p(".tm-license-div").append(p(".tm-license-button")),p(".forminp-license").append(p(".tm-license-result")),p(l).on("tc-opentab.tmtabs tc-isopentab.tmtabs",function(t,e){var o,s,a,n=e.table.find(".tm-section-desc .tm-section-menu-item");0<n.length&&(_&&(o=_.getItem("tmadminextratab")),s=n.filter('[data-menu="'+o+'"]'),a=e.table.find("select,input,text,textarea"),A(o=o&&0!==s.length?o:(s=p(n).eq(0)).attr("data-menu"),s,a,e.table))}),p(o).on("keydown.tmtabs",".tm-section-menu-item",function(t){var e,o=p(this);13===t.keyCode&&o.trigger("click"),39===t.keyCode&&(e=o.next(".tm-section-menu-item")),(e=37===t.keyCode?o.prev(".tm-section-menu-item"):e)&&e.length&&(o.trigger("blur"),e.trigger(" focus").trigger("click"),t.preventDefault())}),p(o).on("click",".tm-section-menu-item",function(){var t=p(this),e=t.attr("data-menu"),o=t.closest(".tm-tab");A(e,t,o.find("select,input,text,textarea"),o),_&&_.setItem("tmadminextratab",e)}),p(l).on("tc-tmtabs-clicked",function(t,e){var o,s,a,n,i,l=e.table.find(".tm-section-desc .tm-section-menu-item");0<l.length&&(_&&(o=_.getItem("tmadminextratab")),_&&(s=_.getItem("tmadminextratab-context")),a=e.header.attr(e.options.dataattribute),i=e.table.find("select,input,text,textarea"),o&&s===a?n=l.filter('[data-menu="'+o+'"]'):o=(n=p(l).eq(0)).attr("data-menu"),_&&_.setItem("tmadminextratab-context",a),0<n.length)&&!n.is(".active")&&A(o,n,i,e.table)}),p(o).on("click",".tc-save-button",function(t){var e,o,n,s=p(this).closest("form");e=p("#tm_epo_math"),o=p(".constantrow"),n={},o.toArray().forEach(function(t,e){var t=p(t),o=t.find(".constant-name"),s=o.val(),t=t.find(".constant-value"),a=t.val(),o=o.closest(".constant-label-wrap"),t=t.closest(".constant-label-wrap");""===s?o.addClass("tm-error"):o.removeClass("tm-error"),""===a?t.addClass("tm-error"):t.removeClass("tm-error"),""===s&&""===a||(n["m"+e]={name:String(s),value:String(a)})}),e.val(JSON.stringify(n)),o=s.tcSerializeObject(),o=p.extend(!0,o,{action:"tm_save_settings",save:"save",security:c.settings_nonce}),t.preventDefault(),S(s,o)}),p(o).on("click",".tc-reset-button",function(t){var e,o,s,a,n=p(this).closest("form"),i=p.extend(!0,{},{action:"tm_reset_settings",save:"save",security:c.settings_nonce});t.preventDefault(),t=c.i18n_reset_settings,e=S,o=this,s=[n,i,!0],t=p.epoAPI.template.html(l.wp.template("tc-floatbox"),{id:"tc-floatbox-content",title:t,html:"",uniqid:"",update:c.i18n_yes,cancel:c.i18n_no}),a=!1,p.tcFloatBox({closefadeouttime:0,overlayopacity:.6,animateOut:"",fps:1,refresh:"fixed",width:"50%",height:"auto",classname:"flasho tc-wrapper tc-question",data:t,cancelEvent:function(t){a||(a=!0,t.destroy())},cancelClass:".floatbox-cancel",updateEvent:function(t){a||(a=!0,e.apply(o,s),t.destroy())},updateClass:".floatbox-update"})}),p(".tm-settings-wrap .tm-tabs").tcTabs({scroll:!1}),p(".tm-activate-license").on("click",function(t){t.preventDefault(),i("activate")}),p(".tm-deactivate-license").on("click",function(t){t.preventDefault(),i("deactivate")}),p("#tm_epo_final_total_box").on("change",function(){h(p(this))}),p("#tm_epo_show_options_total").on("change",function(){u(p(this))}),p("#tm_epo_show_final_total").on("change",function(){f(p(this))}),p("#tm_epo_display").on("change",function(){v(p(this))}),p("#tm_epo_options_placement").on("change",function(){m(p(this))}),p("#tm_epo_totals_box_placement").on("change",function(){d(p(this))}),p("#tm_epo_css_styles").on("change",function(){C(p(this))}),p("#tm_epo_css_styles_style").on("change",function(){k(p(this))}),p("#tm_epo_css_selected_border").on("change",function(){I(p(this))}),p("#tm_epo_floating_totals_box").on("change",function(){b(p(this))}),p("#tm_epo_floating_totals_box_visibility").on("change",function(){w(p(this))}),p("#tm_epo_show_price_inside_option").on("change",function(){g(p(this))}),p("#tm_epo_show_hide_uploaded_file_url_cart").on("change",function(){x(p(this))}),p("#tm_epo_show_hide_uploaded_file_url_order").on("change",function(){y(p(this))}),p("#tm_epo_auto_hide_price_if_zero").on("change",function(){r(p(this))}),h(p("#tm_epo_final_total_box")),u(p("#tm_epo_show_options_total")),f(p("#tm_epo_show_final_total")),v(p("#tm_epo_display")),m(p("#tm_epo_options_placement")),d(p("#tm_epo_totals_box_placement")),t=p("#tm_epo_css_styles_style"),p(t).closest("td").css("position","relative").append('<label class="tm-epo-field-label"><span class="tc-epo-style-wrapper"><input type="checkbox" checked><span class="tm-epo-style"></span></span></label><label class="tm-epo-field-label"><span class="tc-epo-style-wrapper"><input type="radio" checked><span class="tm-epo-style"></span></span></label>'),k(p("#tm_epo_css_styles_style")),C(p("#tm_epo_css_styles")),e=p("#tm_epo_css_selected_border"),p(e).closest("td").css("position","relative").append('<div class="tm-border-type"></div>'),I(p("#tm_epo_css_selected_border")),b(p("#tm_epo_floating_totals_box")),w(p("#tm_epo_floating_totals_box_visibility")),g(p("#tm_epo_show_price_inside_option")),x(p("#tm_epo_show_hide_uploaded_file_url_cart")),y(p("#tm_epo_show_hide_uploaded_file_url_order")),r(p("#tm_epo_auto_hide_price_if_zero")),t=p("#tm_epo_math"),a="",t.closest("tr").hide(),s=(s=p.epoAPI.util.parseJSON(t.val()))||{},Object.keys(s).forEach(function(t,e){var o=s[t].name,t=s[t].value;a+=p.epoAPI.template.html(l.wp.template("tc-constant-template"),{id:e,labelname:c.i18n_constant_name,labelvalue:c.i18n_constant_value,constantname:o,constantvalue:t,labelnameclass:""===o?" tm-error":"",labelvalueclass:""===t?" tm-error":""})}),p(".tc-add-constant").closest("tr").before(a),p(o).on("click",".tc-add-constant",function(){var t=p(this).closest("tr"),e=p(".constantrow").length;t.before(p.epoAPI.template.html(l.wp.template("tc-constant-template"),{id:e,labelname:c.i18n_constant_name,labelvalue:c.i18n_constant_value}))}),p(o).on("click",".tc-constant-delete .delete",function(){p(this).closest("tr").remove()}),p(o).on("change blur keyup",".constant-name, .constant-value",function(){var t=p(this),e=t.closest(".constant-label-wrap");""===t.val()?e.addClass("tm-error"):e.removeClass("tm-error")}),p(o).on("click.cpf",".tm-mn-movetodir,.tm-mn-deldir,.tm-mn-delfile",function(t){var e=p(this),o=p(".forminp-tm_html");t.preventDefault(),0<o.length&&(o.data("doing_ajax")||e.is(".tm-mn-deldir")&&!n(c.i18n_mn_delete_folder)||e.is(".tm-mn-delfile")&&!n(c.i18n_mn_delete_file)||(e.prepend('<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>'),o.data("doing_ajax",1).block({message:null}),t={action:"tm_mn_movetodir",dir:e.attr("data-tm-dir"),security:c.settings_nonce},e.is(".tm-mn-deldir")?(t.action="tm_mn_deldir",t.tmdir=e.attr("data-tm-deldir")):e.is(".tm-mn-delfile")&&(t.action="tm_mn_delfile",t.tmfile=e.attr("data-tm-delfile"),t.tmdir=e.attr("data-tm-deldir")),p.post(c.ajax_url,t,function(t){t&&t.result&&""!==t.result?o.html(t.result):t&&t.error&&t.message&&(t=p.epoAPI.template.html(l.wp.template("tc-floatbox-import"),{id:"tc-floatbox-content",title:c.i18n_error_title,html:'<div class="tm-inner">'+t.message+"</div>",cancel:c.i18n_cancel}),p.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"300px",classname:"flasho tc-wrapper tm-error tc-color-error",data:t}))},"json").always(function(){o.data("doing_ajax",0).unblock(),e.find(".tm-icon").remove()})))})),p.tcToolTip()})}(window,document,window.jQuery);assets/js/admin/tm-epo-admin-lookuptable.js000064400000044562150755142450014741 0ustar00( function( window, document, $ ) {
	'use strict';

	var wp = window.wp;
	var _ = window._;
	var TMEPOADMINLOOKUPJS = window.TMEPOADMINLOOKUPJS;
	var toastr = window.toastr;
	var plupload = window.plupload;
	var templateEngine = {
		tc_builder_elements: wp.template( 'tc-builder-elements' ),
		tc_builder_section: wp.template( 'tc-builder-section' )
	};
	var changedLookupTable = TMEPOADMINLOOKUPJS.lookuptable;

	function getLocalDecimalSeparator() {
		if ( TMEPOADMINLOOKUPJS.tm_epo_global_displayed_decimal_separator === '' ) {
			return TMEPOADMINLOOKUPJS.currency_format_decimal_sep;
		}
		return $.epoAPI.locale.getSystemDecimalSeparator();
	}
	function countDecimals( n ) {
		var numStr = String( n );
		var s;
		if ( numStr.includes( 'e-' ) ) {
			s = numStr.split( 'e-' );
			return Number( s[ 1 ] ) + Number( countDecimals( s[ 0 ] ) );
		} else if ( numStr.includes( '.' ) ) {
			return numStr.split( '.' )[ 1 ].length;
		}
		return 0;
	}

	function createTable() {
		var lookuptable = {};
		var columns = {};
		var rows = {};
		var tableName;
		$( '.lookup-table' ).toArray().forEach( function( table ) {
			table = $( table );
			tableName = table.closest( '.lookup-table-wrap' ).prev( '.lookuptable-name' ).find( '.table-name-value' ).text();
			lookuptable[ tableName ] = {};
			table.find( '.row' ).toArray().forEach( function( row ) {
				$( row ).find( '.ltcell' ).toArray().forEach( function( cell ) {
					var $cell = $( cell );
					var dataRow = $cell.attr( 'data-row' );
					var dataColumn = $cell.attr( 'data-column' );
					var cellValue = $cell.text();
					var h = cellValue.replace( /,/g, '.' );
					var f;
					if ( dataRow === '1' && dataColumn === '1' ) {
						return;
					}
					if ( ! $cell.is( '.head .ltcell, .column1' ) || String( h ).isNumeric() ) {
						f = $.epoAPI.math.toFloat( h );
						if ( h === 'max' ) {
							cellValue = h;
						} else if ( isNaN( f ) ) {
							cellValue = 0;
						} else {
							cellValue = h;
						}
					}

					if ( dataColumn === '1' ) {
						rows[ dataRow ] = cellValue;
						return;
					}
					if ( dataRow === '1' ) {
						columns[ dataColumn ] = cellValue;
						return;
					}
					if ( lookuptable[ tableName ][ columns[ dataColumn ] ] === undefined ) {
						lookuptable[ tableName ][ columns[ dataColumn ] ] = {};
					}
					lookuptable[ tableName ][ columns[ dataColumn ] ][ rows[ dataRow ] ] = cellValue;
				} );
			} );
		} );
		return lookuptable;
	}

	$.tmEPOAdmin = {
		addEventsDone: 0,

		addEvents: function() {
			var $waiting;
			var tcuploader;
			var popup;

			// Import CSV
			$waiting = $( '#builder_import_file' );

			tcuploader = new plupload.Uploader( {
				url: TMEPOADMINLOOKUPJS.ajax_url,
				browse_button: $waiting[ 0 ],
				file_data_name: 'builder_import_file',
				multi_selection: false
			} );

			tcuploader.init();

			tcuploader.bind( 'FilesAdded', function( uploader ) {
				var $_html = $.tmEPOAdmin.builder_floatbox_template_import( {
					id: 'tc-floatbox-content',
					html: '',
					title: TMEPOADMINLOOKUPJS.i18n_import_title
				} );
				var $progress;
				var $selection;
				var uploaderStart = function() {
					$( '#tc-floatbox-content' ).find( '.override-selection' ).addClass( 'tc-hidden' );
					$progress.appendTo( '#tc-floatbox-content' );
					$( '.tc-progress-info-content' ).html( TMEPOADMINLOOKUPJS.i18n_importing );
					uploader.setOption( 'multipart_params', {
						action: 'tc_lookup_table_import',
						post_id: TMEPOADMINLOOKUPJS.post_id,
						security: TMEPOADMINLOOKUPJS.import_nonce
					} );
					uploader.start();
					$( '.flasho' ).addClass( 'tc-color-notice' );
				};

				popup = $.tcFloatBox( {
					closefadeouttime: 0,
					animateOut: '',
					fps: 1,
					ismodal: true,
					refresh: 'fixed',
					width: '50%',
					minHeight: '300px',
					classname: 'flasho tc-wrapper',
					data: $_html
				} );

				$progress = $( '<div class="tc-progress-bar tc-notice"><span class="tc-percent"></span></div><div class="tc-progress-info"><span class="tc-progress-info-content"></span></div>' );

				if ( $( '.lookuptable-wrapper' ).length ) {
					$selection = $(
						'<div class="override-selection"><button type="button" class="tc tc-button details-override">' +
							TMEPOADMINLOOKUPJS.i18n_overwrite_existing_tables +
							'</button></div>'
					);
					$selection.appendTo( '#tc-floatbox-content' );
					$( '.details-override' ).on( 'click', function() {
						uploaderStart();
					} );
				} else {
					uploaderStart();
				}
			} );

			tcuploader.bind( 'FileUploaded', function( uploader, file, response ) {
				var data = $.epoAPI.util.parseJSON( response.response );
				var postTitle;
				var noDestroypopup;

				if ( data && data.result !== undefined && data.message ) {
					$( '.tc-progress-info-content' ).html( data.message );
				}
				if ( data && data.error && data.message ) {
					$( '.tc-progress-info-content' ).html( data.message );
				}
				if ( data && data.result !== undefined && $.epoAPI.math.toFloat( data.result ) === 1 ) {
					$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-success' );
					$( '.tc-progress-info-content' ).removeClass( 'tc-color-error' ).addClass( 'tc-color-success' );
					$( '.flasho' ).removeClass( 'tc-color-notice tc-color-error' ).addClass( 'tc-color-success' );
					$( '.floatbox-cancel' ).addClass( 'tc-hidden' );
					$( '.tc-progress-info-content' ).html( TMEPOADMINLOOKUPJS.i18n_saving );
					$( window ).off( 'beforeunload.edit-post' );
					if ( data.table ) {
						if ( Array.isArray( data.jsobject ) ) {
							$( '.builder-layout' ).html( data.table );
							$.tmEPOAdmin.initSectionsCheck();
							toastr.success( data.message, TMEPOADMINLOOKUPJS.i18n_epo );
							postTitle = $( '#title' );
							if ( postTitle.length && postTitle.val() === '' ) {
								postTitle.val( Object.keys( data.jsobject[ 0 ] )[ 0 ] );
								$( '#title-prompt-text' ).addClass( 'screen-reader-text' );
								if ( $( '#publish' ).attr( 'name' ) === 'publish' ) {
									$( '#publish' ).trigger( 'click' );
								}
							}
						} else {
							toastr.error( TMEPOADMINLOOKUPJS.i18n_invalid_request, TMEPOADMINLOOKUPJS.i18n_epo );
						}
					} else if ( data.different ) {
						noDestroypopup = 1;
						$( '.details-override' ).on( 'click', function() {
							$.post(
								TMEPOADMINLOOKUPJS.ajax_url,
								{
									action: 'tc_lookup_table_import',
									import_override: 1,
									post_id: TMEPOADMINLOOKUPJS.post_id,
									security: TMEPOADMINLOOKUPJS.import_nonce
								},
								function( r ) {
									data = r;
									if ( data.table ) {
										if ( Array.isArray( data.jsobject ) ) {
											$( '.builder-layout' ).html( data.table );
											$.tmEPOAdmin.initSectionsCheck();
											toastr.success( data.message, TMEPOADMINLOOKUPJS.i18n_epo );
										} else {
											toastr.error( TMEPOADMINLOOKUPJS.i18n_invalid_request, TMEPOADMINLOOKUPJS.i18n_epo );
										}
									}
								},
								'json'
							).always( function() {
								popup.destroy();
							} );
						} );
						$( '#tc-floatbox-content' ).find( '.override-selection' ).removeClass( 'tc-hidden' ).addClass( 'height50' ).insertAfter( $( '.tc-progress-info' ) );
						$( '.floatbox-cancel' ).removeClass( 'tc-hidden' );
						$( '.tc-progress-bar' ).addClass( 'tc-hidden' );
						$( '.tc-progress-info-content' ).removeClass( 'tc-color-success tc-color-error' ).addClass( 'tc-color-notice' ).html( data.message );
						$( '.flasho' ).removeClass( 'tc-color-success tc-color-error' ).addClass( 'tc-color-notice' );
					} else {
						toastr.error( TMEPOADMINLOOKUPJS.i18n_invalid_csv, TMEPOADMINLOOKUPJS.i18n_epo );
					}
					if ( noDestroypopup ) {
						return;
					}
					popup.destroy();
				} else {
					$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-error' );
					$( '.tc-progress-info-content' ).removeClass( 'tc-color-success' ).addClass( 'tc-color-error' );
					$( '.flasho' ).removeClass( 'tc-color-notice tc-color-success' ).addClass( 'tc-color-error' );
					if ( ! data && response && response.response ) {
						$( '.tc-progress-info-content' ).addClass( 'tc-normalize' ).html( response.response );
					}
					toastr.error( TMEPOADMINLOOKUPJS.i18n_invalid_request, TMEPOADMINLOOKUPJS.i18n_epo );
				}
			} );

			tcuploader.bind( 'UploadProgress', function( uploader, file ) {
				var progress = parseInt( file.percent, 10 );
				$( '.tc-progress-bar' ).css( 'width', progress + '%' );
				$( '.tc-percent' ).html( progress + '%' );
			} );

			tcuploader.bind( 'Error', function( uploader, error ) {
				if ( error && error.message ) {
					$( '.tc-progress-info-content' )
						.removeClass( 'tc-color-success' )
						.addClass( 'tc-color-error' )
						.html( '\nError #' + error.code + ': ' + error.message );
				}
				$( '.tc-progress-bar' ).removeClass( 'tc-notice' ).addClass( 'tc-error' );
				$( '.flasho' ).removeClass( 'tc-color-notice tc-color-success' ).addClass( 'tc-color-error' );
				if ( error && error.response ) {
					$( '.flasho .header h3' ).html( error.message );
					$( '.tc-progress-info-content' ).addClass( 'tc-normal-font' ).html( error.response );
				}
				toastr.error( TMEPOADMINLOOKUPJS.i18n_invalid_request, TMEPOADMINLOOKUPJS.i18n_epo );
			} );

			tcuploader.bind( 'UploadComplete', function() {
				$( 'body' ).removeClass( 'overflow' );
			} );

			$( document ).on( 'click.cpf', '.tc-add-import-csv', function( e ) {
				e.preventDefault();
				$( '#builder_import_file' ).trigger( 'click' );
			} );

			$( document ).on( 'click.cpf', '.tc-add-export-csv', function( e ) {
				var $this = $( this );
				var data;

				e.preventDefault();
				if ( $this.data( 'doing_export' ) ) {
					return;
				}

				$this.data( 'doing_export', 1 ).prepend( '<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>' );

				data = {
					action: 'tc_lookup_table_export',
					metaserialized: JSON.stringify( changedLookupTable ),
					security: TMEPOADMINLOOKUPJS.export_nonce
				};

				$.post(
					TMEPOADMINLOOKUPJS.ajax_url,
					data,
					function( response ) {
						var $_html;
						var message;

						if ( response && response.result && response.result !== '' ) {
							window.location = response.result;
						} else {
							if ( response && response.error && response.message ) {
								message = response.message;
							} else {
								message = TMEPOADMINLOOKUPJS.i18n_error_message;
							}
							$_html = $.tmEPOAdmin.builder_floatbox_template_import( {
								id: 'tc-floatbox-content',
								html: '<div class="tm-inner">' + message + '</div>',
								title: TMEPOADMINLOOKUPJS.i18n_error_title
							} );
							$.tcFloatBox( {
								closefadeouttime: 0,
								animateOut: '',
								fps: 1,
								ismodal: true,
								refresh: 'fixed',
								width: '50%',
								minHeight: '300px',
								classname: 'flasho tc-wrapper tm-error',
								data: $_html
							} );
						}
					},
					'json'
				).always( function() {
					$this.data( 'doing_export', 0 ).find( '.tm-icon' ).remove();
				} );
			} );

			// table
			$( document ).on( 'mouseover', '.ltcell', function() {
				var $this = $( this );
				var table1 = $this.parent().parent().parent();
				var table2 = $this.parent().parent();
				var verTable = $( table1 ).data( 'vertable' ) + '';
				var column = $this.data( 'column' ) + '';
				var row = $this.data( 'row' ) + ' .column1';
				$( table2 ).find( '.' + column ).addClass( 'hov-column-' + verTable );
				$( table1 ).find( '.row.head .' + column ).addClass( 'hov-column-head-' + verTable );
				$( table1 ).find( '.row.' + row ).addClass( 'hov-column-head-' + verTable );
			} );
			$( document ).on( 'mouseout', '.ltcell', function() {
				var $this = $( this );
				var table1 = $this.parent().parent().parent();
				var table2 = $this.parent().parent();
				var verTable = $( table1 ).data( 'vertable' ) + '';
				var column = $this.data( 'column' ) + '';
				var row = $this.data( 'row' ) + ' .column1';
				$( table2 ).find( '.' + column ).removeClass( 'hov-column-' + verTable );
				$( table1 ).find( '.row.head .' + column ).removeClass( 'hov-column-head-' + verTable );
				$( table1 ).find( '.row.' + row ).removeClass( 'hov-column-head-' + verTable );
			} );
			$( document ).on( 'keypress', '[contenteditable="true"]', function( e ) {
				if ( e.which === 13 ) {
					e.preventDefault();
					$( this ).trigger( 'blur' );
				}
			} );
			$( document ).on( 'focus', '[contenteditable="true"]', function() {
				var $this = $( this );
				$this.attr( 'data-value', $this.text() );
			} );
			$( document ).on( 'blur', '.head [contenteditable="true"], .column1[contenteditable="true"]', function() {
				var $this = $( this );
				var h = $this.text();
				var args;
				var dataRow = $this.attr( 'data-row' );
				var dataColumn = $this.attr( 'data-column' );
				var dataValue = $this.attr( 'data-value' );
				if ( dataValue === undefined ) {
					dataValue = 0;
				}
				if ( h === '' ) {
					if ( dataColumn === '1' || dataRow === '1' ) {
						$this.html( dataValue );
						return;
					}
				} else {
					if ( h !== '' ) {
						if ( String( h ).isNumeric() ) {
							h = $this.text().replace( /,/g, '.' );
							args = {
								symbol: '',
								format: '',
								decimal: getLocalDecimalSeparator(),
								thousand: '',
								precision: countDecimals( $.epoAPI.math.toFloat( h ) )
							};
							h = $.epoAPI.math.format( h, args );
						}
					}
					$this.html( h );
				}
				changedLookupTable = createTable();
			} );
			$( document ).on( 'blur', '[contenteditable="true"]:not(.head [contenteditable="true"], .column1)', function() {
				var $this = $( this );
				var h = $this.text().replace( /,/g, '.' );
				var f = $.epoAPI.math.toFloat( h );
				var args = {
					symbol: '',
					format: '',
					decimal: getLocalDecimalSeparator(),
					thousand: '',
					precision: countDecimals( f )
				};
				var dataRow = $this.attr( 'data-row' );
				var dataColumn = $this.attr( 'data-column' );
				var dataValue = $this.attr( 'data-value' );
				var numRows;
				if ( dataValue === undefined ) {
					dataValue = 0;
				}
				if ( $this.is( '.table-name-value' ) ) {
					if ( h === '' ) {
						$this.html( dataValue );
					}
					changedLookupTable = createTable();
					return;
				}
				numRows = $this.closest( 'table' ).find( 'tr' ).length;
				if ( h === '' ) {
					if ( dataColumn === '1' || dataRow === '1' ) {
						$this.html( dataValue );
						return;
					}
				} else if ( h === 'max' ) {
					if ( Number( dataRow ) > 1 ) {
						if ( Number( dataRow ) < numRows || Number( dataColumn ) > 1 ) {
							$this.html( dataValue );
							return;
						}
					} else if ( Number( dataRow ) === 1 && Number( dataColumn ) <= $this.siblings().length ) {
						$this.html( dataValue );
						return;
					}
					$this.html( h );
				} else if ( isNaN( f ) || isNaN( Number( h ) ) ) {
					$this.html( dataValue );
				} else {
					if ( h !== '' ) {
						h = $.epoAPI.math.format( h, args );
					}
					$this.html( h );
				}
				changedLookupTable = createTable();
			} );
		},

		tm_escape: function( val ) {
			return encodeURIComponent( val );
		},

		createLookuptableMeta: function() {
			var data;
			var name;
			var tmMetaSerialized;
			var previewField = $( 'input#wp-preview' );
			var $tcForm = $( '#tmformfieldsbuilderwrap' );

			if ( _.isEqual( TMEPOADMINLOOKUPJS.lookuptable, changedLookupTable ) ) {
				return;
			}

			$( '.lookuptable-meta' ).remove();

			name = 'lookuptable_meta_changed';

			data = $.tmEPOAdmin.tm_escape( JSON.stringify( changedLookupTable ) );

			tmMetaSerialized = $( "<textarea class='lookuptable-meta tm-hidden' name='" + name + "'></textarea>" ).val( data );
			$tcForm.prepend( tmMetaSerialized );

			if ( previewField.length > 0 && previewField.val() !== '' ) {
				$( '.lookuptable-meta' ).remove();
			}
		},

		fixFormSubmit: function() {
			var $post = $( '#post' );
			var found;
			var subscribe;
			var sub;

			if ( $post.length === 1 ) {
				$post.on( 'submit', function() {
					$.tmEPOAdmin.createLookuptableMeta();
					return true; // ensure form still submits
				} );
			} else if ( wp.data && wp.data.subscribe !== undefined ) {
				found = false;
				subscribe = wp.data.subscribe;

				if ( typeof subscribe === 'function' ) {
					sub = function() {
						var isSavingPost;
						var didPostSaveRequestSucceed;
						var didPostSaveRequestFail;

						if ( ! wp.data.select( 'core/editor' ) ) {
							return;
						}
						didPostSaveRequestSucceed = wp.data.select( 'core/editor' ).didPostSaveRequestSucceed();
						didPostSaveRequestFail = wp.data.select( 'core/editor' ).didPostSaveRequestFail();

						if ( wp && wp.data && wp.data.select( 'core/editor' ) ) {
							isSavingPost = wp.data.select( 'core/editor' ).isSavingPost();
						}
						if ( ! found && isSavingPost ) {
							found = true;
							$.tmEPOAdmin.createLookuptableMeta();
						}
						if ( found && ( didPostSaveRequestSucceed || didPostSaveRequestFail ) ) {
							found = false;
							setTimeout( function() {
								$( '.lookuptable-meta' ).remove();
							}, 600 );
						}
					};

					subscribe( sub );
				}
			}
		},

		initialitize: function() {
			$.tmEPOAdmin.initSectionsCheck();
			$.tmEPOAdmin.addEvents();
			$( '.builder-layout' ).removeClass( 'tm-hidden' );
			$.tmEPOAdmin.fixFormSubmit();
		},
		initSectionsCheck: function() {
			var length = $( '.lookuptable-wrapper' ).length;

			if ( ! length ) {
				$( '.builder-add-section-action' ).hide();
				$( '.builder-selector' ).hide();
				$( '.tc-welcome' ).show();
				$( '.builder-layout' ).hide();
				$( '.tc-add-export-csv' ).hide();
			} else {
				$( '.builder-add-section-action' ).show();
				$( '.builder-selector' ).show();
				$( '.tc-welcome' ).hide();
				$( '.builder-layout' ).show();
				$( '.tc-add-export-csv' ).show();
			}
		},
		builder_floatbox_template: function( data, template ) {
			return $.epoAPI.template.html( wp.template( template || 'tc-floatbox' ), {
				id: data.id,
				title: data.title,
				html: data.html,
				uniqidtext: data.uniqidtext || '',
				uniqid: data.uniqid,
				update: data.update || TMEPOADMINLOOKUPJS.i18n_update,
				cancel: data.cancel || TMEPOADMINLOOKUPJS.i18n_cancel
			} );
		},

		builder_floatbox_template_import: function( data ) {
			return $.epoAPI.template.html( wp.template( 'tc-floatbox-import' ), {
				id: data.id,
				title: data.title,
				html: data.html,
				cancel: TMEPOADMINLOOKUPJS.i18n_cancel
			} );
		}
	};

	// document ready
	$( function() {
		templateEngine = $.epoAPI.applyFilter( 'tc_adjust_admin_template_engine', templateEngine );

		$.tmEPOAdmin.initialitize();
	} );
}( window, document, window.jQuery ) );
assets/js/admin/tm-epo-admin.min.js000064400000014331150755142450013173 0ustar00!function(c,a){"use strict";var e,r=c.TMEPOADMINJS,i=0;function n(){var i=a("#product-type").val();a(".tc-normal-epo").toArray().forEach(function(t){var t=a(t),e=t.find(".tmcp_attribute").val(),o=t.find("select.tmcp_att").val(),c=t.find("select.tmcp-variation").val(),c="input.tmcp-price-input-variation-"+c+"[data-price-input-attribute='"+o+"'],select.tmcp-price-input-variation-"+c+"[data-price-input-attribute='"+o+"']";"variable"!==i&&"variable-subscription"!==i?t.find(".show_if_variable").hide():t.find(".show_if_variable").show(),t.find("select.tmcp_att").hide(),t.find("select.tmcp_att[data-tm-attr='"+e+"']").show(),t.find("input.tmcp-price-input").hide(),t.find("select.tmcp-price-input-type").hide(),t.find(c).show()})}function p(t,e){var o=t.val(),t=t.closest(".tc-normal-epo"),c=t.find("input.tmcp_loop").val(),i=t.find("select.tmcp_att").val(),a=t.find("select.tmcp-variation").val(),n="";switch(t.find("input.tmcp-price-input").hide(),t.find("select.tmcp-price-input-type").hide(),e){case"variation":n="input.tmcp-price-input-variation-"+(a=o)+"[data-price-input-attribute='"+i+"'],select.tmcp-price-input-variation-"+o+"[data-price-input-attribute='"+i+"']";break;case"attribute":n="input.tmcp-price-input-variation-"+a+"[data-price-input-attribute='"+(i=o)+"'],select.tmcp-price-input-variation-"+a+"[data-price-input-attribute='"+o+"']"}t.find(n).length<=0&&((e=t.find(".tmcp-pricing")).append('<input type="text" name="tmcp_regular_price['+c+"]["+i+"]["+a+']" value="" class="wc_input_price tmcp-price-input tmcp-price-input-variation-'+a+'" data-price-input-attribute="'+i+'">'),e.append('<select class="tmcp-price-input-type tmcp-price-input tmcp-price-input-variation-'+a+'" data-price-input-attribute="'+i+'" name="tmcp_regular_price_type['+c+"]["+i+"]["+a+']"><option value="">'+r.i18n_fixed_type+'</option><option value="percent">'+r.i18n_percent_type+"</option></select>")),t.find(n).show()}function l(t){t&&(a("#tm-meta-cpf-mode").val(t),a(".tm-mode-selector").addClass("tc-active"),a(".tm-mode-builder,.tm-mode-local,.tm-mode-settings").hide(),a(".tm-mode-"+t).show(),a(".tc-builder-select,.tc-local-select,.tc-settings-select").removeClass("button-primary"),a(".tc-"+t+"-select").addClass("button-primary"))}function m(t){t=t.filter(":checked");t.closest(".price-display-mode-wrap").removeClass(function(t,e){return(e.match(/(^|\s)mode-\S+/g)||[]).join(" ")}).addClass("mode-"+t.val())}r&&a(function(){var t=a("#bulk-action-selector-top"),o=!1;0<t.length&&t.children("option").each(function(t,e){"tcline"===a(e).val()?(o=!0,a(e).replaceWith(a('<optgroup class="tc-bulk-opt" label="'+a(e).text()+'">'))):o&&"tcclear"!==a(e).val()&&"tcproductclear"!==a(e).val()&&"tcclearexclude"!==a(e).val()&&"tcclearexcludeadd"!==a(e).val()&&a(e).appendTo(a(".tc-bulk-opt")),"tcline2"===a(e).val()&&a(e).remove()}),e={items:".tc-normal-epo",cursor:"move",axis:"y",handle:"h3 .move",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(t,e){t&&e.item.css("background-color","#f6f6f6")},stop:function(t,e){t&&e.item.removeAttr("style"),a(".tc-normal-epos .tc-normal-epo").toArray().forEach(function(t){a(".tm_epo_menu_order",t).val(parseInt(a(t).index(".tc-normal-epos .tc-normal-epo"),10))})}},n(),a("#tc-admin-extra-product-options").on("change","select.tmcp-variation",function(){p(a(this),"variation")}),a("#tc-admin-extra-product-options").on("change","select.tmcp_att",function(){p(a(this),"attribute")}),a("#tc-admin-extra-product-options").on("tc_normal_epo_added",function(){a(".tc-normal-epos").sortable(e)}),a("#tc-admin-extra-product-options").on("tc_normal_epos_loaded",function(){a(".tc-normal-epos").sortable(e)}),a(".tc-normal-epos").sortable(e),a("#variable_product_options").on("click","button.remove_variation",function(){i=1}),a("#variable_product_options").on("woocommerce_variations_added",function(){i=1}),a(".product_attributes").on("click","button.add_new_attribute",function(){i=1}),a(".save_attributes").on("click",function(){i=1}),a(".tc-epo-woocommerce-tab a").on("click",function(){var t;1===i&&(a("#tc-admin-extra-product-options").block({message:null}),t={action:"woocommerce_tm_load_epos",post_id:r.post_id,security:r.load_tm_epo_nonce},a.post(r.ajax_url,t,function(t){a(".tm-mode-local").html(t),a("#tc-admin-extra-product-options").unblock(),a("#tc-admin-extra-product-options").trigger("tc_normal_epos_loaded"),i=0,n()}))}),a("#tc-admin-extra-product-options").on("click","button.tm_add_epo",function(){var t=a("select.tmcp-attr-list").val(),e=a(".tc-normal-epos .tc-normal-epo[data-epo-attr='"+t+"']"),o=a(".tc-normal-epo").length,t={action:"woocommerce_tm_add_epo",post_id:r.post_id,att_id:t,loop:o,security:r.add_tm_epo_nonce};if(!(0<e.length))return a(".tm-mode-local").block({message:null}),a.post(r.ajax_url,t,function(t){"max"===t?(c.alert(r.i18n_max_tmcp),a(".tm-mode-local").unblock()):t&&(a(".tc-normal-epos").append(t),a("#tc-admin-extra-product-options").trigger("tc_normal_epo_added"),n())}).always(function(){a(".tm-mode-local").unblock()}),!1;e.find(".woocommerce-tmcp-attributes").show()}),a("#tc-admin-extra-product-options").on("click",".remove_tm_epo",function(t){var e,o=c.confirm(r.i18n_remove_tmcp);return t.preventDefault(),o&&(e=a(this).parent().parent(),0<(t=a(this).attr("rel"))?(e.block({message:null}),o={action:"woocommerce_tm_remove_epo",tmcpid:t,security:r.delete_tm_epo_nonce},a.post(r.ajax_url,o,function(){e.fadeOut("300",function(){e.remove()})})):e.fadeOut("300",function(){e.remove()})),!1}),a("#tc-admin-extra-product-options").on("change",".tm-type",function(){var t=a(this),e=t.closest(".data").find(".tmcp_choices");"checkbox"===t.val()?e.removeClass("tm-hidden"):e.addClass("tm-hidden")}),a("#tc-admin-extra-product-options").on("click",".tc-select-mode",function(t){var e="local";t.preventDefault(),a(this).is(".tc-builder-select")&&(e="builder"),l(e=a(this).is(".tc-settings-select")?"settings":e)}),a("#tc-admin-extra-product-options").on("change",".price-display-mode",function(){m(a(this))}),m(a(".price-display-mode")),a("#tm-meta-cpf-mode").val()||a("#tm-meta-cpf-mode").val("builder"),l(a("#tm-meta-cpf-mode").val()),a.tmEPOAdmin&&a.tmEPOAdmin.create_normal_dropdown(a(".tm-mode-settings")),a.fn.tmcheckboxes&&a(".tm-mode-settings").tmcheckboxes()})}(window,(document,window.jQuery));assets/js/admin/tm-global-epo-admin.min.js000064400000430744150755142450014443 0ustar00!function(d,r,P){"use strict";var e,s,c,m,u,p,w,n,_=d.wp,a=d.TMEPOADMINJS,g=d.TMEPOGLOBALADMINJS,f=d.toastr,h=d._,i=d.plupload,x=!1,v={tc_builder_elements:_.template("tc-builder-elements"),tc_builder_section:_.template("tc-builder-section")},O=d.JSON,b="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=";function A(t){var i=[];return Object.keys(t).forEach(function(e){Object.prototype.hasOwnProperty.call(t,e)&&(i[i.length]=t[e])}),i}P.tmEPOAdmin={addEventsDone:0,variationsCheckForChanges:0,elementLogicObject:{},sectionLogicObject:{},elementShippingLogicObject:{},logicOperators:{is:g.i18n_is,isnot:g.i18n_is_not,isempty:g.i18n_is_empty,isnotempty:g.i18n_is_not_empty,startswith:g.i18n_starts_with,endswith:g.i18n_ends_with,greaterthan:g.i18n_greater_than,lessthan:g.i18n_less_than,greaterthanequal:g.i18n_greater_than_equal,lessthanequal:g.i18n_less_than_equal},builderItemsSortableObj:{start:{},end:{}},builderSectionsSortableObj:{start:{},end:{}},builderSize:{w1:"1%",w2:"2%",w3:"3%",w4:"4%",w5:"5%",w6:"6%",w7:"7%",w8:"8%",w9:"9%",w10:"10%",w11:"11%",w12:"12%","w12-5":"12.5%",w13:"13%",w14:"14%",w15:"15%",w16:"16%",w17:"17%",w18:"18%",w19:"19%",w20:"20%",w21:"21%",w22:"22%",w23:"23%",w24:"24%",w25:"25%",w26:"26%",w27:"27%",w28:"28%",w29:"29%",w30:"30%",w31:"31%",w32:"32%",w33:"33%",w34:"34%",w35:"35%",w36:"36%",w37:"37%","w37-5":"37.5%",w38:"38%",w39:"39%",w40:"40%",w41:"41%",w42:"42%",w43:"43%",w44:"44%",w45:"45%",w46:"46%",w47:"47%",w48:"48%",w49:"49%",w50:"50%",w51:"51%",w52:"52%",w53:"53%",w54:"54%",w55:"55%",w56:"56%",w57:"57%",w58:"58%",w59:"59%",w60:"60%",w61:"61%",w62:"62%","w62-5":"62.5%",w63:"63%",w64:"64%",w65:"65%",w66:"66%",w67:"67%",w68:"68%",w69:"69%",w70:"70%",w71:"71%",w72:"72%",w73:"73%",w74:"74%",w75:"75%",w76:"76%",w77:"77%",w78:"78%",w79:"79%",w80:"80%",w81:"81%",w82:"82%",w83:"83%",w84:"84%",w85:"85%",w86:"86%",w87:"87%","w87-5":"87.5%",w88:"88%",w89:"89%",w90:"90%",w91:"91%",w92:"92%",w93:"93%",w94:"94%",w95:"95%",w96:"96%",w97:"97%",w98:"98%",w99:"99%",w100:"100%"},isElementDragged:!1,variationSection:!1,variationSectionIndex:!1,variationFieldIndex:!1,checkboxStates:{},canTakeLogic:["product","color","range","radiobuttons","checkboxes","selectbox","selectboxmultiple","textfield","textarea","variations"],addSortables:function(){P.tmEPOAdmin.is_original&&(P(".builder-layout").sortable({handle:".move",cursor:"move",items:".builder-wrapper:not(.tma-nomove)",start:function(e,t){var i=P(t.item).closest(".builder-wrapper").index();P.tmEPOAdmin.builderSectionsSortableObj.start.section=i,t.placeholder.height(t.helper.outerHeight()),t.placeholder.width(t.helper.outerWidth())},stop:function(e,t){t=P(t.item).closest(".builder-wrapper").index();P.tmEPOAdmin.builderSectionsSortableObj.end.section=t,w.splice(t,0,w.splice(P.tmEPOAdmin.builderSectionsSortableObj.start.section,1)[0]),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.builderSectionsSortableObj={start:{},end:{}}},cancel:".tma-nomove",forcePlaceholderSize:!0,placeholder:"bitem pl2",tolerance:"pointer"}),P.tmEPOAdmin.builder_items_sortable(P(".builder-wrapper .bitem-wrapper")))},getBuilder:function(){return w},addEvents:function(){var e,a,n,l,o,t=P(".tagchecklist");1!==P.tmEPOAdmin.addEventsDone&&(P.tmEPOAdmin.addSortables(),e=P("#builder_import_file"),(e=new i.Uploader({url:g.import_url,browse_button:e[0],file_data_name:"builder_import_file",multi_selection:!1})).init(),e.bind("FilesAdded",function(e){var t,i=P.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:"",title:g.i18n_import_title});a=P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"300px",classname:"flasho tc-wrapper",data:i}),t=P('<div class="tc-progress-bar tc-notice"><span class="tc-percent"></span></div><div class="tc-progress-info"><span class="tc-progress-info-content"></span></div>'),P('<div class="override-selection"><button type="button" class="tc tc-button details-override">'+g.i18n_overwrite_existing_elements+'</button><button type="button" class="tc tc-button details-append">'+g.i18n_append_new_elements+"</button></div>").appendTo("#tc-floatbox-content"),w=P.tmEPOAdmin.checkSections(w),n=P.tmEPOAdmin.tm_escape(O.stringify(P.tmEPOAdmin.prepareForJson(P.tmEPOAdmin.tcSerializeJsOptionsObject(w)))),g.is_original_post?(P(".details-override").on("click",function(){P("#tc-floatbox-content").find(".override-selection").remove(),t.appendTo("#tc-floatbox-content"),P(".tc-progress-info-content").html(g.i18n_importing),e.setOption("multipart_params",{action:"import",import_override:1,post_id:g.post_id,security:g.import_nonce,is_original_post:g.is_original_post}),e.start(),P(".flasho").addClass("tc-color-notice")}),P(".details-append").on("click",function(){P("#tc-floatbox-content").find(".override-selection").remove(),t.appendTo("#tc-floatbox-content"),P(".tc-progress-info-content").html(g.i18n_importing),e.setOption("multipart_params",{action:"import",import_override:0,post_id:g.post_id,tm_uploadmeta:n,security:g.import_nonce,is_original_post:g.is_original_post}),e.start(),P(".flasho").addClass("tc-color-notice")})):(P("#tc-floatbox-content").find(".override-selection").remove(),t.appendTo("#tc-floatbox-content"),P(".tc-progress-info-content").html(g.i18n_importing),e.setOption("multipart_params",{action:"import",import_override:1,post_id:g.post_id,tm_uploadmeta:n,security:g.import_nonce,is_original_post:g.is_original_post}),e.start(),P(".flasho").addClass("tc-color-notice"))}),e.bind("FileUploaded",function(e,t,i){var n=P.epoAPI.util.parseJSON(i.response);n&&void 0!==n.result&&n.message&&P(".tc-progress-info-content").html(n.message),n&&n.error&&n.message&&P(".tc-progress-info-content").html(n.message),n&&void 0!==n.result&&1===P.epoAPI.math.toFloat(n.result)?(P(".tc-progress-bar").removeClass("tc-notice").addClass("tc-success"),P(".tc-progress-info-content").removeClass("tc-color-error").addClass("tc-color-success"),P(".flasho").removeClass("tc-color-notice tc-color-error").addClass("tc-color-success"),P(".floatbox-cancel").remove(),P(".tc-progress-info-content").html(g.i18n_saving),P(d).off("beforeunload.edit-post"),n.options&&(Array.isArray(n.jsobject)?(P(".builder-layout").html(n.options),w=n.jsobject,P.tmEPOAdmin.setGlobalVariationObject("initialitize_on_after"),f.success(n.message,g.i18n_epo)):f.error(g.i18n_invalid_request,g.i18n_epo)),a.destroy()):(P(".tc-progress-bar").removeClass("tc-notice").addClass("tc-error"),P(".tc-progress-info-content").removeClass("tc-color-success").addClass("tc-color-error"),P(".flasho").removeClass("tc-color-notice tc-color-success").addClass("tc-color-error"),!n&&i&&i.response&&P(".tc-progress-info-content").addClass("tc-normal-font").html(i.response),f.error(g.i18n_invalid_request,g.i18n_epo))}),e.bind("UploadProgress",function(e,t){t=parseInt(t.percent,10);P(".tc-progress-bar").css("width",t+"%"),P(".tc-percent").html(t+"%")}),e.bind("Error",function(e,t){t&&t.message&&P(".tc-progress-info-content").removeClass("tc-color-success").addClass("tc-color-error").html("\nError #"+t.code+": "+t.message),P(".tc-progress-bar").removeClass("tc-notice").addClass("tc-error"),P(".flasho").removeClass("tc-color-notice tc-color-success").addClass("tc-color-error")}),e.bind("UploadComplete",function(){P("body").removeClass("overflow")}),P(r).on("click.cpf","#builder_export",function(e){var t=P(this);e.preventDefault(),t.data("doing_export")||(t.data("doing_export",1).prepend('<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>'),w=P.tmEPOAdmin.checkSections(w),e=P.tmEPOAdmin.prepareForJson(P.tmEPOAdmin.tcSerializeJsOptionsObject(w)),e={action:"tm_export",metaserialized:O.stringify(e),is_original_post:g.is_original_post,security:g.export_nonce},P.post(g.ajax_url,e,function(e){e&&e.result&&""!==e.result?d.location=e.result:e&&e.error&&e.message&&(e=P.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:'<div class="tm-inner">'+e.message+"</div>",title:g.i18n_error_title}),P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"300px",classname:"flasho tc-wrapper tm-error",data:e}))},"json").always(function(){t.data("doing_export",0).find(".tm-icon").remove()}))}),P(r).on("click.cpf","#builder_save",function(e){var t,i=P(this);i.data("doing_export")||(i.data("doing_export",1).prepend('<i class="tm-icon tcfa tcfa-spin tcfa-spinner"></i>'),w=P.tmEPOAdmin.checkSections(w),t={action:"tm_save",tm_uploadmeta:P.tmEPOAdmin.tm_escape(O.stringify(P.tmEPOAdmin.prepareForJson(P.tmEPOAdmin.tcSerializeJsOptionsObject(w)))),post_id:g.post_id,security:g.save_nonce},P("#tmformfieldsbuilderwrap").addClass("disabled"),e.preventDefault(),P.post(g.ajax_url,t,function(e){e&&e.result&&1===e.result?f.success(e.message,g.i18n_epo):f.error(e.message,g.i18n_epo)},"json").always(function(e){P("#tmformfieldsbuilderwrap").removeClass("disabled"),"-1"===e.responseText&&f.error(g.i18n_invalid_request,g.i18n_epo),i.data("doing_export",0).find(".tm-icon").remove()}))}),P(r).on("click.cpf","#builder_import,.tc-add-import-csv",function(e){e.preventDefault(),P("#builder_import_file").trigger("click")}),P(r).on("click.cpf","#builder-fullsize",function(e){e.preventDefault(),P("body").addClass("overflow fullsize")}),P(r).on("click.cpf","#builder-fullsize-close",function(e){e.preventDefault(),P("body").removeClass("overflow fullsize")}),P(r).on("click.cpf",".builder-add-element",P.tmEPOAdmin.builder_add_element_onClick),P(r).on("click.cpf",".builder_add_section,.tc-add-section ",P.tmEPOAdmin.builder_add_section_onClick),P(r).on("click.cpf",".builder-add-section-and-element,.tc-add-element",P.tmEPOAdmin.builder_add_section_and_element_onClick),P(r).on("click.cpf",".builder_add_variation",P.tmEPOAdmin.builder_add_variation_onClick),P(r).on("click.cpf",".builder-wrapper .section-settings .edit",P.tmEPOAdmin.builder_section_item_onClick),P(r).on("click.cpf",".builder-wrapper .section-settings .clone",P.tmEPOAdmin.builder_section_clone_onClick),P(r).on("click.cpf",".builder-wrapper .section-settings .plus",P.tmEPOAdmin.builder_section_plus_onClick),P(r).on("click.cpf",".builder-wrapper .section-settings .minus",P.tmEPOAdmin.builder_section_minus_onClick),P(r).on("click.cpf",".builder-wrapper .btitle .delete:not(.builder-wrapper.tma-variations-wrap .btitle .delete)",P.tmEPOAdmin.builder_section_delete_onClick),P(r).on("click.cpf",".builder-wrapper .btitle .fold",P.tmEPOAdmin.builder_section_fold_onClick),P(r).on("click",".builder-wrapper.tma-variations-wrap .btitle .delete",P.tmEPOAdmin.builder_variation_delete_onClick),P(r).on("click.cpf",".bitem .bitem-settings .edit",P.tmEPOAdmin.builder_item_onClick),P(r).on("click.cpf",".bitem .bitem-settings .clone",P.tmEPOAdmin.builder_clone_onClick),P(r).on("click.cpf",".bitem .bitem-settings .change",P.tmEPOAdmin.builder_change_onClick),P(r).on("click.cpf",".bitem .bitem-settings .plus",P.tmEPOAdmin.builder_plus_onClick),P(r).on("click.cpf",".bitem .bitem-settings .minus",P.tmEPOAdmin.builder_minus_onClick),P(r).on("click",".bitem .delete",P.tmEPOAdmin.builder_delete_onClick),P(r).on("click.cpf",".builder-panel-add",P.tmEPOAdmin.builder_panel_add_onClick),P(r).on("click.cpf",".builder-panel-add-separator",P.tmEPOAdmin.builder_panel_add_separator_onClick),P(r).on("click.cpf",".builder-panel-mass-add",P.tmEPOAdmin.builder_panel_mass_add_onClick),P(r).on("click.cpf",".builder-panel-populate",P.tmEPOAdmin.builder_panel_populate_onClick),P(r).on("click.cpf",".builder-image-delete",P.tmEPOAdmin.builder_image_delete_onClick),P(r).on("click.cpf",".builder_panel_delete",P.tmEPOAdmin.builder_panel_delete_onClick),P(".builder_panel_delete").on("click.cpf",P.tmEPOAdmin.builder_panel_delete_onClick),P(r).on("click.cpf",".builder_panel_delete_all",P.tmEPOAdmin.builder_panel_delete_all_onClick),P(r).on("click.cpf",".builder_panel_up",function(){var e=P(this),t=e.closest(".options-wrap");t.prev().before(t),P.tmEPOAdmin.panelsReorder(e.closest(".panels_wrap")),P.tmEPOAdmin.paginattion_init("current")}),P(r).on("click.cpf",".builder_panel_down",function(){var e=P(this),t=e.closest(".options-wrap");t.next().after(t),P.tmEPOAdmin.panelsReorder(e.closest(".panels_wrap")),P.tmEPOAdmin.paginattion_init("current")}),P(r).on("keyup.cpf change.cpf",".tm_option_title",function(){P(this).closest(".options-wrap").find(".tm_option_value").val(P("<div/>").html(P(this).val()).text())}),P(r).on("change.cpf changechoice",".tm_option_enabled",function(){var e=P(this);e.is(":checked")?e.closest(".options-wrap").removeClass("choice-is-disabled"):e.closest(".options-wrap").addClass("choice-is-disabled")}),P(r).on("click.cpf",".tc-element-setting-price, .tc-element-setting-sale-price, .tm_option_price, .tm_option_sale_price",function(){var e,r,a,i=P(this),t=i.is(".dynamic-product-price")||i.is(".change-product-weight"),n=i.is(".override-product-price")||i.is(".change-product-weight"),l=i.is(".tc-element-setting-price, .tc-element-setting-sale-price")?P(".tm-pricetype-selector"):i.closest(".options-wrap").find(".tm_option_price_type");"math"===l.val()&&(a=function(e){for(var t,i,n,a,l=[],o=["'",'"'],d=0;d<e.length;d++)if(t=e[d],o.includes(t)){for(i=t,n=d+1;n<e.length&&e[n]!==i;)n++;d=n}else if("["===t||"{"===t)l.push(t);else if(("]"===t||"}"===t)&&(!(a=l.pop())||"]"===t&&"["!==a||"}"===t&&"{"!==a))return!1;return 0===l.length},r=function(){var e,t=d.tcmexp,i=P(".tc-element-setting-edit-price").val(),n=!0;return t&&(e=i.replace(/\{[^}]+\}|\[[^\]]+\]/g,"(0)"),!1!==(n=t.parse(e))&&a(i)?P(".tc-element-setting-edit-price").removeClass("formula-error").addClass("formula-correct"):P(".tc-element-setting-edit-price").removeClass("formula-correct").addClass("formula-error")),n},l=i.val(),e=P.tmEPOAdmin.builder_floatbox_template({id:"tc-floatbox-content-pop",update:g.i18n_save,html:'<div class="tm-inner"><textarea class="tc-element-setting-edit-price"></textarea><div class="tc-price-variables"></div></div>',title:g.i18n_edit_price},"tc-floatbox-edit"),P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!1,refresh:"fixed",width:"50%",height:"80%",top:"10%",left:"25%",classname:"flasho tc-wrapper tc-builder-add-section-and-element",data:e,cancelClass:".floatbox-edit-cancel",updateClass:".floatbox-edit-update",updateEvent:function(e){var t=P(".tc-element-setting-edit-price").val();r(),i.val(t),e.destroy()},unique:!0}),P.tmEPOAdmin.populatePriceVariables(P(".tc-price-variables"),t,n),P(".tc-element-setting-edit-price").val(l),r(),P(".tc-var-field").on("click.cpf",function(e){var t=P(".tc-element-setting-edit-price"),i=t.val(),n=t[0],a=n.selectionStart,l=n.scrollTop,o=i.substring(0,a),i=i.substring(n.selectionEnd,i.length),d=P(this).attr("data-value");e.preventDefault(),t.val(o+d+i),a+=d.length,n.selectionStart=a,n.selectionEnd=a,t.trigger(" focus"),n.scrollTop=l,r()}),P(".formula-field-mode").on("change.cpf",function(){var t=P(this).val();P(".tc-var-list.other .tc-var-field").toArray().forEach(function(e){P(e).attr("data-value","{field."+P(e).attr("title")+"."+t+"}")})}),P(".tc-element-setting-edit-price").on("input.cpf",function(){r()}))}),P(r).on("click.cpf",".tc-upload-button",P.tmEPOAdmin.upload),P(r).on("change.cpf",".changes-product-image,.tm-use-lightbox,.replacement-mode",P.tmEPOAdmin.floatbox_content_js),P(r).on("change.cpf",".use_url",P.tmEPOAdmin.tm_url),P(r).on("change.cpf",".tm-pricetype-selector",P.tmEPOAdmin.tm_pricetype_selector),P(r).on("change.cpf",".tm_option_price_type",P.tmEPOAdmin.tm_option_price_type),P(r).on("change.cpf",".dynamic-mode",P.tmEPOAdmin.dynamicMode),P(r).on("change.cpf",".variations-display-as",P.tmEPOAdmin.variations_display_as),P(r).on("change.cpf",".tm-attribute .tm-changes-product-image",P.tmEPOAdmin.variations_display_as),P(r).on("click.cpf",".tm-upload-button-remove",P.tmEPOAdmin.tm_upload_button_remove_onClick),P(r).on("change.cpf",".tm-weekday-picker",P.tmEPOAdmin.tm_weekday_picker),P(r).on("change.cpf",".tm-month-picker",P.tmEPOAdmin.tm_month_picker),P(r).on("click.cpf",".tm-tags-container .tab-header",function(){var e=P(this),t=e.closest(".tm-tags-container"),i=t.find(".tm-elements-container").find("li.tm-element-button"),t=t.find(".tab-header"),n=e.attr("data-tm-tag");t.removeClass("open").addClass("closed"),e.removeClass("closed").addClass("open"),("all"===n?i:(i.addClass("tm-hidden"),i.filter("."+n))).removeClass("tm-hidden")}),P(r).on("click.cpf",".tm_editor_wrap",function(){var e=P(this).find("textarea");e.attr("id")&&(d.wpActiveEditor=e.attr("id"))}),P(r).on("change.cpf",".cpf-logic-element",P.tmEPOAdmin.cpf_logic_element_onchange),P(r).on("change.cpf",".cpf-logic-operator",P.tmEPOAdmin.cpf_logic_operator_onchange),P(r).on("change.cpf",".activate-sections-logic, .activate-element-logic",function(){P(this).is(":checked")?P(this).closest(".message0x0").find(".builder-logic-div").show():P(this).closest(".message0x0").find(".builder-logic-div").hide()}),P(r).on("dblclick.cpf",".tm-default-radio",function(){P(this).prop("checked",!1)}),o=function(e){if(13===e.keyCode)return e.preventDefault(),P.tmEPOAdmin.force_current_edit_label=!0,l(),!1},l=function(e){var t,i,n=P.tmEPOAdmin.current_edit_label;!P.tmEPOAdmin.current_edit_label||!0!==P.tmEPOAdmin.force_current_edit_label&&(n.is(e.target)||0!==n.has(e.target).length||P(e.target).is(".tm-internal-name"))||((e=n.closest(".tm-label-desc").next(".tm-label-desc-edit").find(".tm-internal-name")).trigger("change"),n.is(".tm-internal-label")&&n.html(e.val()).removeClass("tm-hidden"),n.is(".tm-element-label")&&n.removeClass("tm-hidden").closest(".tm-label-desc").find(".tm-internal-label").html(e.val()),n.closest(".tm-label-desc").removeClass("tm-hidden").next(".tm-label-desc-edit").addClass("tm-hidden"),""===e.val()?(n.closest(".tm-label-desc").removeClass("tc-has-value").addClass("tc-empty-value"),n.closest(".tm-label-desc").find(".tm-internal-label").html(n.closest(".tm-label-desc").find(".tm-element-label").html()),e.val(n.closest(".tm-label-desc").find(".tm-element-label").html())):n.closest(".tm-label-desc").removeClass("tc-empty-value").addClass("tc-has-value"),n=e.closest(".builder-wrapper").index(),t=P.tmEPOAdmin.find_index(w[n].section.is_slider,e.closest(".bitem")),(i=e.closest(".tm-label-desc-edit")).is(".tm-for-bitem")?P.tmEPOAdmin.setFieldValue(n,t,"internal_name",e.val(),!0):i.is(".tm-for-section")&&(w[n].section.sections_internal_name.default=e.val(),w[n].sections_internal_name=e.val()),e.remove(),P.tmEPOAdmin.current_edit_label=!1,P.tmEPOAdmin.force_current_edit_label=!1,P(r).off("mouseup",l),P(r).off("keydown",o))},P(r).on("click",".tm-element-label,.tm-internal-label",function(){var e,t,i=P(this),n=(P.tmEPOAdmin.current_edit_label=i).addClass("tm-hidden").closest(".tm-label-desc").addClass("tm-hidden").next(".tm-label-desc-edit").removeClass("tm-hidden"),a=i.closest(".builder-wrapper").index(),i=P.tmEPOAdmin.find_index(w[a].section.is_slider,i.closest(".bitem"));n.is(".tm-for-bitem")?(e=n.attr("data-element"),t=P.tmEPOAdmin.getFieldValue(w[a].fields[i],"internal_name",!0)):n.is(".tm-for-section")&&(e="sections",t=w[a].section.sections_internal_name.default),e+="_internal_name",e=P("<input type='text' value='"+t.replace(/'/g,"&#39;")+"' name='tm_meta[tmfbuilder]["+e+"][]' class='t tm-internal-name'>"),n.append(e),e.trigger(" focus"),P(r).on("mouseup",l),P(r).on("keydown",o)}),P(r).on("click.cpf",".cpf-add-rule",P.tmEPOAdmin.cpf_add_rule),P(r).on("click.cpf",".cpf-delete-rule",P.tmEPOAdmin.cpf_delete_rule),P(r).on("click.cpf",".tm-logic-add-rule-set",P.tmEPOAdmin.cpf_add_rule_set),P(r).on("click.cpf",".tma-handle-wrap .tma-handle",P.tmEPOAdmin.builder_fold_onClick),P(r).on("keyup change","#tc-floatbox-content .n[type=text]",function(){var e,t,i=P(this),n=i.val();return s&&n!==t&&(e=new RegExp("[^-0-9%.\\"+s.mon_decimal_point+"]+","gi"),t=n.replace(e,""),i.val(t),0===i.parent().find(".wc_error_tip").length)&&(n=i.position(),i.after('<div class="wc_error_tip">'+s.i18n_mon_decimal_error+"</div>"),P(".wc_error_tip").css("left",n.left+i.width()-i.width()/2-P(".wc_error_tip").width()/2).css("top",n.top+i.height()).fadeIn("100")),this}),P(r).on("click",".tc-enable-responsive",function(){var e=P(this),t=e.find(".on"),i=e.find(".off"),n=P("#tc-floatbox-content").find(".builder_responsive_div");e.is(".active")?(e.removeClass("active"),t.addClass("tc-hidden"),i.removeClass("tc-hidden"),n.addClass("tc-hidden")):(e.addClass("active"),t.removeClass("tc-hidden"),i.addClass("tc-hidden"),n.removeClass("tc-hidden"))}),P(r).on("change.cpf",".product-mode",function(){var e=P("#tc-floatbox-content"),t=P(this).val(),i=P(".product-default-value-search"),n=P(".product-products-selector");"product"===t?(t="products",n.is(".enhanced")&&n.prop("multiple")&&(n.selectWoo("destroy").removeClass("enhanced"),n.prop("multiple",!1),P.tmEPOAdmin.create_products_search(e)),n.prop("multiple",!1)):"products"===t&&(n.is(".enhanced")&&!n.prop("multiple")&&(n.selectWoo("destroy").removeClass("enhanced"),n.prop("multiple",!0),P.tmEPOAdmin.create_products_search(e)),n.prop("multiple",!0)),i.is(".enhanced")&&(i.selectWoo("destroy").removeClass("enhanced"),"products"===t?(i.removeData("action"),i.addClass("enhanced-dropdown"),n.triggerHandler("change.cpf"),P.tmEPOAdmin.create_enhanced_dropdown(e)):(i.data("action","wc_epo_search_products_in_categories"),i.addClass("wc-product-search"),P.tmEPOAdmin.create_products_search(e))),P(".product-"+t+"-selector").trigger("change.cpf")}),P(r).on("change.cpf",".product-default-value-search",function(){var i,n,t=P(this),a=t.val(),l=P(".product-mode"),e={action:"wc_epo_get_product_categories",product_id:a,security:g.get_products_categories_nonce};a&&P.post(g.ajax_url,e,function(e){t.data("categoryIds","success"===e.result?e.category_ids:[]),t.data("categoryIds")&&("categories"!==l.val()||a===t.attr("data-current-selected")||(i=P(".product-categories-selector").find(":selected").toArray().map(function(e){return parseInt(P(e).val(),10)}),n=!1,P.each(t.data("categoryIds"),function(e,t){if(-1!==P.inArray(parseInt(t,10),i))return!(n=!0)}),n)?(t.attr("data-current-selected",a),t.data("current-selected-text",t.find(":selected").text())):(t.find("option").remove(),this.removeAttr("data-current-selected"),this.removeData("current-selected-text"),this.removeData("categoryIds"),this.removeData("include")))})}),P(r).on("change.cpf",".product-products-selector",function(){var e=P(this),t=P(".product-default-value-search"),e=e.find(":selected").clone().prop("selected",!1).removeAttr("data-select2-id");t.removeData("action"),t.find("option").remove(),t.append(e),t.val(t.attr("data-current-selected")).trigger("change.cpf")}),P(r).on("change.cpf",".product-categories-selector",function(){var i,n=P(this).find(":selected").toArray().map(function(e){return parseInt(P(e).val(),10)}),e=P(".product-default-value-search");e.data("include",n),e.data("action","wc_epo_search_products_in_categories"),e.data("categoryIds")&&(i=!1,P.each(e.data("categoryIds"),function(e,t){if(-1!==P.inArray(parseInt(t,10),n))return!(i=!0)}),i||(e.find("option").remove(),e.removeAttr("data-current-selected"),e.removeData("current-selected-text"),e.removeData("categoryIds")))}),P().ajaxChosen&&P("select.ajax_chosen_select_tmProductIds").ajaxChosen({method:"GET",url:g.ajax_url,dataType:"json",afterTypeDelay:100,data:{action:"woocommerce_json_search_products",security:g.search_products_nonce}},function(e){var i={};return P.each(e,function(e,t){i[e]=t}),i}),P("body").on("woocommerce-product-type-change",function(){var e=P("#product-type");P.tmEPOAdmin.initSectionsCheck(),e.length&&("variable"!==e.val()&&"variable-subscription"!==e.val()&&(e=P(".builder-layout .element-variations")).length&&(e.closest(".builder-wrapper").remove(),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck(),P.tmEPOAdmin.toggleVariationButton(),P.tmEPOAdmin.var_remove("tm-style-variation-added")),P.tmEPOAdmin.toggleVariationButton())}),P(r).on("change.cpf",".apply-mode, .product_page_tm-global-epo #product_catdiv input:checkbox, .product_page_tm-global-epo #tm_product_ids, .product_page_tm-global-epo #tc-enabled-options, .product_page_tm-global-epo #tc-disabled-options",function(){setTimeout(function(){P.tmEPOAdmin.checkIfApplied()},100)}),P(r).on("change.cpf",".apply-mode",function(){P.tmEPOAdmin.applyMode(P(this))}),P('#product_catchecklist input[type="checkbox"]').on("change",function(){P.tmEPOAdmin.checkboxStates[this.id]=P(this).prop("checked"),setTimeout(function(){P.tmEPOAdmin.applyMode(P(".apply-mode:checked"))},100)}),t.length&&t.toArray().forEach(function(e){new MutationObserver(function(){P.tmEPOAdmin.checkIfApplied()}).observe(e,{attributes:!0,childList:!0,subtree:!0})}),P.tmEPOAdmin.addEventsDone=1)},initialitize:function(){P.tmEPOAdmin.setGlobalVariationObject("initialitize_on")},initialitize_on:function(){P.tmEPOAdmin.isinit=!0,P.tmEPOAdmin.pre_element_logic_init_obj={},P.tmEPOAdmin.pre_element_logic_init_obj_options={},P.tmEPOAdmin.pre_element_logic_init(!0),P.tmEPOAdmin.pre_element_logic_init_done=!0,P.tmEPOAdmin.is_original=g.is_original_post,P.tmEPOAdmin.current_edit_label=!1,P.tmEPOAdmin.force_current_edit_label=!1,P.tmEPOAdmin.toggleVariationButton(),P.tmEPOAdmin.addEvents(),P.tmEPOAdmin.check_section_logic(),P.tmEPOAdmin.check_element_logic(),P.tmEPOAdmin.sectionLogicStart(),P.tmEPOAdmin.elementLogicStart(),P(".builder-wrapper.tm-slider-wizard").each(function(){var e=P(this);P.tmEPOAdmin.createSlider(e)}),P("#side-sortables").prepend(P('<div class="tc-info-box hidden"></div>')),P(function(){P.tmEPOAdmin.checkIfApplied(),P.tmEPOAdmin.applyModeInit(),P.tmEPOAdmin.checkboxStates={},P('#product_catchecklist input[type="checkbox"]').each(function(){P.tmEPOAdmin.checkboxStates[this.id]=P(this).prop("checked")})}),P.tmEPOAdmin.initSectionsCheck(),P.tmEPOAdmin.fixFormSubmit(),P.tmEPOAdmin.pre_element_logic_init_done=!1,P.tmEPOAdmin.isinit=!1,P(".builder-layout").removeClass("tm-hidden"),P.tmEPOAdmin.makeResizables(P(".builder-wrapper")),P.tmEPOAdmin.makeResizables(P(".bitem"))},initialitize_on_after:function(){P.tmEPOAdmin.isinit=!0,P.tmEPOAdmin.pre_element_logic_init_obj={},P.tmEPOAdmin.pre_element_logic_init_obj_options={},P.tmEPOAdmin.pre_element_logic_init(!0),P.tmEPOAdmin.pre_element_logic_init_done=!0,P.tmEPOAdmin.is_original=g.is_original_post,P.tmEPOAdmin.current_edit_label=!1,P.tmEPOAdmin.force_current_edit_label=!1,P.tmEPOAdmin.var_remove("tm-style-variation-added"),P.tmEPOAdmin.toggleVariationButton(),P.tmEPOAdmin.addSortables(),P.tmEPOAdmin.check_section_logic(),P.tmEPOAdmin.check_element_logic(),P.tmEPOAdmin.sectionLogicStart(),P.tmEPOAdmin.elementLogicStart(),P(".builder-wrapper.tm-slider-wizard").each(function(){var e=P(this);P.tmEPOAdmin.createSlider(e)}),P.tmEPOAdmin.initSectionsCheck(),P.tmEPOAdmin.fixFormSubmit(),P.tmEPOAdmin.makeResizables(P(".builder-wrapper")),P.tmEPOAdmin.makeResizables(P(".bitem")),P.tmEPOAdmin.pre_element_logic_init_done=!1,P.tmEPOAdmin.isinit=!1},makeResizables:function(e){var s,t=Object.keys(P.tmEPOAdmin.builderSize),c=[];0===(e=P(e)).length||e.closest(".builder-layout").is(".builder-template")||(t.forEach(function(e){c.push(parseFloat(P.tmEPOAdmin.builderSize[e].replace("%",""),10))}),e.not(".tma-nomove").toArray().forEach(function(d){var r;d=P(d),r=d.is(".bitem")?d.closest(".bitem-wrapper").first():d.closest(".builder-layout"),d.is(".ui-resizable")&&d.resizable().resizable("destroy"),d.resizable({maxWidth:r.width(),minWidth:r.width()/8,start:function(e,t){t.originalElement.addClass("tm-label-info-hidden"),s=parseFloat(P.tmEPOAdmin.builderSize[t.originalElement.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0]].replace("%",""),10)},stop:function(e,t){var i,n,a=100*t.size.width/r.width(),l=c.filter(function(e){return e<=a}),o=c.filter(function(e){return a<=e}),t=t.originalElement;t.removeClass("ui-highlight tm-label-info-hidden"),l=l[l.length-1],((o=void 0===(o=o[0])?c[c.length-1]:o)-(l=void 0===l?o<=s?c[c.length-1]:c[1]:l))/2<a-l?(i="w"+o.toString().replace(".","-"),t.css("width",o+"%")):(i="w"+l.toString().replace(".","-"),t.css("width",l+"%")),o=t.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],l=P.tmEPOAdmin.builderSize[i],i!==o&&(t.removeClass(String(o)),t.addClass(String(i)),(d.is(".bitem")?t.find(".bitem-inner .size"):t.find(".section-inner .size")).text(l),o=t.closest(".builder-wrapper").index(),n=P.tmEPOAdmin.find_index(w[o].section.is_slider,t),d.is(".bitem")?P.tmEPOAdmin.setFieldValue(o,n,"div_size",i):(w[o].section.sections_size.default=i,w[o].size=l)),d.is(".builder-wrapper")&&P.tmEPOAdmin.makeResizables(d.find(".bitem")),(t.is(".bitem")?t.find(".bitem-settings"):t.find(".section-settings")).removeClass("show")},resize:function(e,t){var i=100*t.size.width/r.width(),n=c.filter(function(e){return e<=i}),a=t.originalElement;void 0===(n=n[n.length-1])&&(n=c[c.length-1]),a.addClass("ui-highlight"),(a.is(".bitem")?a.find(".bitem-settings").addClass("show").find(".bitem-setting.size"):a.find(".section-settings").addClass("show").find(".section-setting.size")).html(n+"%"),t.size.height=t.originalSize.height}})}))},cpf_logic_element_onchange:function(e,t){var i,n,a,l,o,d,r=P(this),s="tc-hidden-no-events";e instanceof P&&(r=e),e=(t=void 0===t?!(t=P(this).closest(".section_elements, .builder-wrapper, .bitem, .builder-element-wrap")).is(".section_elements")&&!t.is(".builder-wrapper"):t)?2===t?P.tmEPOAdmin.elementShippingLogicObject:P.tmEPOAdmin.elementLogicObject:P.tmEPOAdmin.sectionLogicObject,t=r.val(),i=r.children("option:selected").attr("data-section"),n=r.children("option:selected").attr("data-type"),a=void 0!==(a=e)[i]&&void 0!==(a=e[i].values)[t]&&e[i].values[t],e=r.closest(".tm-logic-rule").find(".tm-logic-value"),l=(r=r.closest(".tm-logic-rule").find(".cpf-logic-operator")).val(),d=(o=["startswith","endswith","greaterthan","lessthan","greaterthanequal","lessthanequal"]).concat("is","isnot"),a?(a=P(a),e.empty().append(a),r.children().filter(function(e,t){return-1!==P.inArray(P(t).val(),["is","isnot"])}).removeClass(s),"variation"===n||"multiple"===n?(-1!==P.inArray(l,o)&&r.val("isempty"),r.children().filter(function(e,t){return-1!==P.inArray(P(t).val(),o)}).addClass(s),r.trigger("change.cpf")):r.children().filter(function(e,t){return-1!==P.inArray(P(t).val(),o)}).removeClass(s)):t===i?(-1!==P.inArray(l,d)&&r.val("isempty"),r.children().filter(function(e,t){return-1!==P.inArray(P(t).val(),d)}).addClass(s),r.trigger("change.cpf")):r.children().filter(function(e,t){return-1!==P.inArray(P(t).val(),d)}).removeClass(s)},cpf_logic_operator_onchange:function(e){var t=P(this),e=(t=e instanceof P?e:t).val(),t=t.closest(".tm-logic-rule").find(".tm-logic-value");"isempty"===e||"isnotempty"===e?t.hide():t.show()},createSlider:function(d){d.tmtabs({headers:"tm-slider-wizard-headers",header:"tm-slider-wizard-header",selectedtab:0,showonhover:function(){return P.tmEPOAdmin.isElementDragged},useclasstohide:!0,afteraddtab:function(e,t){var i,n,a=d.index();P.tmEPOAdmin.builder_items_sortable(t),d.is(".tm-slider-wizard")?(i=d.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(","),n=w[a].section.sections_tabs_labels.default||"null",(n=(n=P.epoAPI.util.parseJSON(n))||[]).push(P(e).text()),n=O.stringify(n)):(i="",(n=[]).push(P(e).text())),w[a].section.sections_slides.default=i,w[a].section.sections_tabs_labels.default=n},deletebutton:!0,deleteconfirm:!0,beforedeletetab:function(e,t){var i=d.index(),n=t.find(".bitem").length,a=P.tmEPOAdmin.find_index(!0,t.find(".bitem").first());P.tmEPOAdmin.sliderTabDeleteBefore=[],t.find(".bitem").toArray().forEach(function(e){P.tmEPOAdmin.sliderTabDeleteBefore.push({field_index:P.tmEPOAdmin.find_index(!0,P(e)),disabledFieldIndex:P.tmEPOAdmin.find_index(!0,P(e),".bitem",".element-is-disabled")})}),w[i].fields.splice(a,n),w[i].section.sections.default=parseInt(w[i].section.sections.default,10)-n,w[i].section.sections.default=w[i].section.sections.default.toString(),t=w[i].section.sections_tabs_labels.default||"null",t=(t=P.epoAPI.util.parseJSON(t))||[],a=e.closest(".tm-box").index(),t.splice(a,1),t=O.stringify(t),w[i].section.sections_tabs_labels.default=t},afterdeletetab:function(){var e,i=d.index(),n=0,t=d.is(".tm-slider-wizard")?d.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(","):"";d.is(".is-slider")&&(e=[],d.find(".tm-slider-wizard-header").toArray().forEach(function(e){P(e).find(".tab-text").html(P(e).closest(".tm-box").index()+1)}),e=O.stringify(e),w[i].section.sections_tabs_labels.default=e),w[i].section.sections_slides.default=t,P.tmEPOAdmin.sliderTabDeleteBefore.forEach(function(e,t){P.tmEPOAdmin.builderItemsSortableObj.start.section=w[i].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.start.section_eq=i.toString(),P.tmEPOAdmin.builderItemsSortableObj.start.element=-1===P.tmEPOAdmin.sliderTabDeleteBefore[t].disabledFieldIndex?"-1":parseInt(P.tmEPOAdmin.sliderTabDeleteBefore[t].disabledFieldIndex,10)-t+n,-1===P.tmEPOAdmin.sliderTabDeleteBefore[t].disabledFieldIndex&&(P.tmEPOAdmin.builderItemsSortableObj.start.disabled=!0,P.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex=-1,n+=1),P.tmEPOAdmin.builderItemsSortableObj.end.section="delete",P.tmEPOAdmin.builderItemsSortableObj.end.section_eq="delete",P.tmEPOAdmin.builderItemsSortableObj.end.element="delete",P.tmEPOAdmin.builderItemsSortableObj.end.novalidate="delete",P.tmEPOAdmin.logic_reindex()}),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck()},aftermovetab:function(e,t){var i,n=d.index();w[n].section.sections_slides.default=P(".builder-wrapper").eq(n).find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(","),i=w[n].section.sections_tabs_labels.default||"null",t=(i=(i=P.epoAPI.util.parseJSON(i))||[]).splice(t,1)[0],i.splice(e,0,t),i=O.stringify(i),w[n].section.sections_tabs_labels.default=i,P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck(),d.is(".is-slider")&&(i=[],d.find(".tm-slider-wizard-header").toArray().forEach(function(e){var t=P(e).closest(".tm-box").index()+1;P(e).find(".tab-text").html(t),i.push(t)}),i=O.stringify(i),w[n].section.sections_tabs_labels.default=i)},beforemovebitem:function(e,t,i,n,a){var l=d.index();P.tmEPOAdmin.builderItemsSortableObj.start.section=w[l].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.start.section_eq=l.toString(),P.tmEPOAdmin.builderItemsSortableObj.start.element=P.tmEPOAdmin.find_index(!0,a).toString(),P.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex=P.tmEPOAdmin.find_index(!0,a,".bitem",".element-is-disabled")},aftermovebitem:function(e,t,i,n,a){var l=d.index(),o=P.tmEPOAdmin.find_index(!0,a);P.tmEPOAdmin.builderItemsSortableObj.end.section=w[l].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.end.section_eq=l.toString(),P.tmEPOAdmin.builderItemsSortableObj.end.element=P.tmEPOAdmin.find_index(!0,a).toString(),P.tmEPOAdmin.builderItemsSortableObj.end.disabledFieldIndex=P.tmEPOAdmin.find_index(!0,a,".bitem",".element-is-disabled"),w[l].fields.splice(o,0,w[P.tmEPOAdmin.builderItemsSortableObj.start.section_eq].fields.splice(P.tmEPOAdmin.builderItemsSortableObj.start.element,1)[0]),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.logic_reindex()},editbutton:d.is(".is-tabs"),oneditbutton:function(t){var i=d.index(),n=w[i].section.sections_tabs_labels.default||"null",a=t.closest(".tm-box").index(),e=P.tmEPOAdmin.builder_floatbox_template({id:"tc-floatbox-content-pop",update:g.i18n_save,html:'<div class="tm-inner"><input type="text" class="tc-element-setting-edit-tab"></div>',title:g.i18n_edit_tab},"tc-floatbox-edit"),l=P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!1,refresh:"fixed",width:"50%",top:"25%",left:"25%",classname:"flasho tc-wrapper",data:e,cancelClass:".floatbox-edit-cancel",unique:!0}),o=this;n=(n=P.epoAPI.util.parseJSON(n))||[],P(".tc-element-setting-edit-tab").val(n[a]),P(".floatbox-edit-update").on("click.cpf",function(e){e.preventDefault(),n[a]=P(".tc-element-setting-edit-tab").val(),t.closest(".tm-slider-wizard-header").find(".tab-text").html(n[a]),n=O.stringify(n),w[i].section.sections_tabs_labels.default=n,l.destroy(),o.trigger("refresh")})},addbutton:!!P.tmEPOAdmin.is_original}),w[d.index()].section.is_slider=!0},sections_type_onChange:function(e){var t,i,n,a=w[e].section.sections_type.default,l=P(".builder-wrapper").eq(e);"slider"!==a&&"tabs"!==a||!l.hasClass("tm-slider-wizard")?"slider"!==a&&"tabs"!==a||l.hasClass("tm-slider-wizard")?"slider"!==a&&"tabs"!==a&&l.hasClass("tm-slider-wizard")&&(l.find(".bitem-wrapper").wrapAll('<div class="tmtemp"></div>'),l.find(".bitem-wrapper .bitem").appendTo(l.find(".tmtemp")),l.find(".bitem-wrapper").remove(),l.find(".tmtemp").addClass("bitem-wrapper").removeClass("tmtemp"),P.tmEPOAdmin.builder_items_sortable(l.find(".bitem-wrapper")),l.find(".tm-slider-wizard-headers").remove(),l.find(".tc-tab-headers-wrap").remove(),l.removeClass("tm-slider-wizard is-tabs is-slider has-add-button"),l.removeData("tctabs").removeData("tmHasTmtabs"),w[e].section.sections_slides.default="",w[e].section.sections_tabs_labels.default="",w[e].section.is_slider=!1):(t=l.find(".bitem-wrapper"),n=l.find(".btitle"),l.addClass("tm-slider-wizard is-"+a),n.after('<div class="transition tm-slider-wizard-headers"><div class="tm-box"><h4 class="tm-slider-wizard-header" data-id="tc-tab-slide0"><span class="tab-text">1</span></h4></div></div>'),t.addClass("tc-tab-slide tc-tab-slide0"),P.tmEPOAdmin.createSlider(l),w[e].section.sections_slides.default=l.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(","),w[e].section.is_slider=!0,w[e].section.sections_tabs_labels.default=O.stringify(["1"])):l.is(".is-slider")&&"tabs"===a?(i=[],l.find(".tm-slider-wizard-header").toArray().forEach(function(e){e=P(e).find(".tab-text");void 0!==e.data("tabtext")&&e.html(e.data("tabtext")),i.push(e.text())}),i=O.stringify(i),l.removeClass("is-slider").addClass("is-tabs").tcTabs("set",{editbutton:!0}),w[e].section.sections_tabs_labels.default=i):l.is(".is-tabs")&&"slider"===a&&(l.removeClass("is-tabs has-add-button").addClass("is-slider").tcTabs("set",{editbutton:!1}),l.find(".tm-slider-wizard-header").toArray().forEach(function(e){var e=P(e),t=e.find(".tab-text"),e=e.closest(".tm-box").index()+1;t.data("tabtext",t.text()),t.html(e)}),w[e].section.sections_tabs_labels.default="")},variationEventsSuccess:function(){setTimeout(function(){P.tmEPOAdmin.setGlobalVariationObject("reindex")},600),P(r).unbind("ajaxSuccess",P.tmEPOAdmin.variationEventsSuccess),P.tmEPOAdmin.var_remove("tma-remove_variation-added")},variationsCheckEventsSuccess:function(){setTimeout(function(){P.tmEPOAdmin.variationsCheckForChanges=1,P.tmEPOAdmin.tm_variations_check()},600),P(r).unbind("ajaxSuccess",P.tmEPOAdmin.variationsCheckEventsSuccess),P.tmEPOAdmin.var_remove("tma-remove_variation-added")},addVariationEvents:function(){!0!==P.tmEPOAdmin.var_is("tma-variation-events-added")&&(!0!==P.tmEPOAdmin.var_is("tma-remove_variation-added")&&P("#variable_product_options").on("click.tma",".remove_variation",function(){P(r).ajaxSuccess(P.tmEPOAdmin.variationEventsSuccess),P.tmEPOAdmin.var_is("tma-remove_variation-added",!0),P(r).ajaxSuccess(P.tmEPOAdmin.variationsCheckEventsSuccess)}),!0!==P.tmEPOAdmin.var_is("tma-remove_variation-added")&&P(".wc-metaboxes-wrapper").on("click","a.bulk_edit",function(){"delete_all"===P("select#field_to_edit").val()&&(P(r).ajaxSuccess(P.tmEPOAdmin.variationEventsSuccess),P.tmEPOAdmin.var_is("tma-remove_variation-added",!0),P(r).ajaxSuccess(P.tmEPOAdmin.variationsCheckEventsSuccess))}),P("#variable_product_options").on("woocommerce_variations_added",function(){P.tmEPOAdmin.setGlobalVariationObject("reindex"),P(r).ajaxSuccess(P.tmEPOAdmin.variationsCheckEventsSuccess)}),P("#woocommerce-product-data").on("woocommerce_variations_saved",function(){P.tmEPOAdmin.setGlobalVariationObject("reindex"),P(r).ajaxSuccess(P.tmEPOAdmin.variationsCheckEventsSuccess)}),P(r).on("click.cpf",".save_attributes",function(){P(r).ajaxSuccess(P.tmEPOAdmin.variationsCheckEventsSuccess)}),P.tmEPOAdmin.var_is("tma-variation-events-added",!0))},toggleVariationButton:function(){var e,t,i=P("#product-type");i.length&&("variable"===i.val()||"variable-subscription"===i.val()?(P(".builder_add_section").addClass("inline"),P(".builder_add_variation").addClass("inline").removeClass("tm-hidden"),P(".tma-variations-wrap").removeClass("tm-hidden"),P.tmEPOAdmin.addVariationEvents(),i=!1,(e=P(".builder-layout .element-variations")).length?"1"===P.tmEPOAdmin.getFieldValue(P.tmEPOAdmin.variationSection,"variations_disabled")&&(i=!0,e=P(".builder-layout .element-variations"),P.tmEPOAdmin.var_is("tm-style-variation-forced",!0)):(P.tmEPOAdmin.var_is("tm-style-variation-forced",!0),P.tmEPOAdmin.builder_add_variation_onClick(),i=!0,e=P(".builder-layout .element-variations")),e.length&&((t=e.closest(".builder-wrapper")).find(".tm-add-element-action,.tmicon.clone,.tmicon.size,.tmicon.move,.tmicon.plus,.tmicon.minus").remove(),t.addClass("tma-nomove tma-variations-wrap"),P.tmEPOAdmin.var_is("tm-style-variation-added",!0),e.addClass("tma-nomove"),e.find(".bitem-settings .size,.bitem-settings .clone,.tm-label-move,.bitem-settings .plus,.change,.bitem-settings .minus,.tm-label-delete").remove(),i?(P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled","1"),P(".builder_add_section").addClass("inline"),P(".builder_add_variation").addClass("inline").removeClass("tm-hidden"),P(".tma-variations-wrap").addClass("tm-hidden")):(P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled",""),P(".builder_add_section").removeClass("inline"),P(".builder_add_variation").removeClass("inline").addClass("tm-hidden"),P(".tma-variations-wrap").removeClass("tm-hidden")),P.tmEPOAdmin.variationsCheckForChanges=1,P.tmEPOAdmin.tm_variations_check()),1<P(".tma-variations-wrap").length&&P(".tma-variations-wrap").not(":first").each(function(){var e=P(this).closest(".builder-wrapper"),t=e.index();e.remove(),w.splice(t,1),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck()})):(P(".builder_add_section").removeClass("inline"),P(".builder_add_variation").removeClass("inline").addClass("tm-hidden")))},tcSerializeJsOptionsArray:function(e){var t=[].concat.apply([],e.map(function(t){return Object.keys(t.section).map(function(e){return t&&"object"==typeof t.section[e]?t.section[e]:null}).filter(function(e){return null!=e})})),i=[].concat.apply([],e.map(function(e){return[].concat.apply([],e.fields.map(function(e){return[].concat.apply([],e.filter(function(e){return null!==e}).map(function(e){return e&&"multiple"===e.id?[].concat.apply([],e.multiple):e}))}))}));return e=(e=[].concat.apply([],[t,i])).map(function(e){return e?void 0===e.checked||!0===e.checked?{name:e.tags.name,value:e.default}:{name:e.tags.name,value:""}:{}}).filter(function(e){return null!=e})},tcSerializeJsOptionsObject:function(e){var t={},e=P.tmEPOAdmin.tcSerializeJsOptionsArray(e);return P("#tm_meta_priority").length&&e.push({name:"tm_meta[priority]",value:P("#tm_meta_priority").val()}),P.each(e,function(){void 0!==t[this.name]?"[]"===this.name.slice(-2)?(t[this.name].push||(t[this.name]=[t[this.name]]),t[this.name].push(this.value||"")):""===t[this.name]&&(t[this.name]=this.value||""):null!==this.value&&void 0!==this.value&&this.value.push?t[this.name]=[this.value]:t[this.name]=this.value||""}),t},checkSections:function(t){return Object.keys(t).forEach(function(e){t[e].section.sections.default=t[e].fields.length}),t},prepareForJson:function(t){var i,n,a={};return Object.keys(t).forEach(function(e){0===e.indexOf("tm_meta[")&&((i=e.split(/[[\]]{1,2}/)).pop(),i=i.map(function(e){return""===e?null:e}),n=0<i.length&&null===i[i.length-1],i=i.filter(function(e){return null!=e?e:null}),n="object"!=typeof t[e]&&n?[t[e]]:t[e],a=P.tmEPOAdmin.constructObject(i,n,a))}),a},constructObject:function(e,t,i){var n=e.shift();return 0<e.length?(Object.prototype.hasOwnProperty.call(i,n)||(i[n]={}),i[n]=P.tmEPOAdmin.constructObject(e,t,i[n])):i[n]=t,i},createTmMetaSerialized:function(){var e,t,i=P("input#wp-preview"),n=P("#tmformfieldsbuilderwrap");P(".tm_meta_serialized").remove(),P(".tm_meta_serialized_wpml").remove(),t=P.tmEPOAdmin.is_original?"tm_meta_serialized":"tm_meta_serialized_wpml",w=P.tmEPOAdmin.checkSections(w),e=P.tmEPOAdmin.tm_escape(O.stringify(P.tmEPOAdmin.prepareForJson(P.tmEPOAdmin.tcSerializeJsOptionsObject(w)))),t=P("<textarea class='tm_meta_serialized tm-hidden' name='"+t+"'></textarea>").val(e),n.prepend(t),0<i.length&&""!==i.val()&&P(".tm_meta_serialized").remove()},fixFormSubmit:function(){var n,e=P("#post");1===e.length?e.on("submit",function(){return P.tmEPOAdmin.createTmMetaSerialized(),!0}):_.data&&void 0!==_.data.subscribe&&(n=!1,"function"==typeof(e=_.data.subscribe))&&e(function(){var e,t,i;_.data.select("core/editor")&&(t=_.data.select("core/editor").didPostSaveRequestSucceed(),i=_.data.select("core/editor").didPostSaveRequestFail(),_&&_.data&&_.data.select("core/editor")&&(e=_.data.select("core/editor").isSavingPost()),!n&&e&&(n=!0,P.tmEPOAdmin.createTmMetaSerialized()),n)&&(t||i)&&(n=!1,setTimeout(function(){P(".tm_meta_serialized").remove(),P(".tm_meta_serialized_wpml").remove()},600))})},initSectionsCheck:function(){var e=P(".builder-wrapper").length;(e=1===e&&P(".builder-wrapper.tma-variations-wrap.tm-hidden").length?0:e)?(P(".builder-add-section-action").show(),P(".builder-selector").show(),P(".tc-welcome").hide(),P(".builder-layout").show()):(P(".builder-add-section-action").hide(),P(".builder-selector").hide(),P(".tc-welcome").show(),P(".builder-layout").hide())},applyModeInit:function(){setTimeout(function(){P.tmEPOAdmin.applyMode(P(".apply-mode:checked"))},100)},applyMode:function(e){var t,i,e=e.val(),n="disable-form"===e||"customize-selection"===e&&!P("#product_catchecklist :checkbox:checked").length?1:0,a=P("#tm_product_ids"),l=P("#tm_product_exclude_ids"),o=P("#tc-enabled-options"),d=P("#tc-disabled-options");if("apply-to-all-products"===e)P("#product_catchecklist").find(":checkbox").prop("checked",!1);else for(t in P.tmEPOAdmin.checkboxStates)P("#"+t).prop("checked",P.tmEPOAdmin.checkboxStates[t]);"apply-to-all-products"===e||"customize-selection"===e?((i=l.data("saved-exclude-ids"))&&i.length&&(l.html(P.map(i,function(e){return e.html}).join("")),l.find("option").each(function(e){i[e].checked&&P(this).prop("selected",!0)}),l.removeData("saved-exclude-ids")),(i=o.data("saved-enabled-roles"))&&i.length&&(o.html(P.map(i,function(e){return e.html}).join("")),o.find("option").each(function(e){i[e].checked&&P(this).prop("selected",!0)}),o.removeData("saved-enabled-roles")),(i=d.data("saved-disabled-roles"))&&i.length&&(d.html(P.map(i,function(e){return e.html}).join("")),d.find("option").each(function(e){i[e].checked&&P(this).prop("selected",!0)}),d.removeData("saved-disabled-roles"))):"disable-form"===e&&(i=l.find("option").map(function(){return{html:P(this).prop("outerHTML"),checked:P(this).prop("selected")}}).get(),l.data("saved-exclude-ids",i),l.html(""),i=o.find("option").map(function(){return{html:P(this).prop("outerHTML"),checked:P(this).prop("selected")}}).get(),o.data("saved-enabled-roles",i),o.html(""),i=d.find("option").map(function(){return{html:P(this).prop("outerHTML"),checked:P(this).prop("selected")}}).get(),d.data("saved-disabled-roles",i),d.html("")),"customize-selection"===e?(i=a.data("saved-include-ids"))&&i.length&&(a.html(P.map(i,function(e){return e.html}).join("")),a.find("option").each(function(e){i[e].checked&&P(this).prop("selected",!0)}),a.removeData("saved-include-ids")):"apply-to-all-products"!==e&&"disable-form"!==e||(i=a.data("saved-include-ids"))&&i.length||(i=a.find("option").map(function(){return{html:P(this).prop("outerHTML"),checked:P(this).prop("selected")}}).get(),a.data("saved-include-ids",i),a.html("")),"apply-to-all-products"===e?(P("#product_catdiv").hide(),P('.postbox[id^="tagsdiv-"]').hide(),P("#tc-product-search").hide(),P("#tc-product-exclude").show(),P("#tc-product-roles").show()):"customize-selection"===e?(P("#product_catdiv").show(),P('.postbox[id^="tagsdiv-"]').show(),P("#tc-product-search").show(),P("#tc-product-exclude").show(),P("#tc-product-roles").show()):"disable-form"===e&&(P("#product_catdiv").hide(),P('.postbox[id^="tagsdiv-"]').hide(),P("#tc-product-search").hide(),P("#tc-product-exclude").hide(),P("#tc-product-roles").hide()),P("#tm_meta_disable_categories").val(n)},checkIfApplied:function(){var e,t,i,n,a;P("body").is(".product_page_tm-global-epo")&&(e=P(".apply-mode:checked").val(),t=0<P("#product_catdiv input:checkbox").filter(":checked").length,a=0<P(".tagchecklist").children("li").length,i=P("#tm_product_ids").val(),n=P("#tc-enabled-options").val(),i=!(!i||null===i)&&0<i.length,n=!(!n||null===n)&&0<n.length,"apply-to-all-products"===e?P(".tc-info-box").removeClass("hidden error").addClass("tc-all-products").html(g.i18n_form_is_applied_to_all):"customize-selection"===e&&(t||a||i||n)?P(".tc-info-box").removeClass("tc-error tc-all-products").addClass("hidden").html(""):P(".tc-info-box").removeClass("hidden tc-all-products").addClass("tc-error").html(g.i18n_form_not_applied_to_all))},check_section_logic:function(e){var i;!(Number.isFinite(e)||e instanceof P)&&P.tmEPOAdmin.isinit&&P.tmEPOAdmin.done_check_section_logic||(void 0===(e=e instanceof P?parseInt(e.index(),10):e)?i=w:(i=[],e=P.epoAPI.math.toFloat(e),i[e]=w[e]),Object.keys(i).forEach(function(e){var t=i[e];void 0===t.section||(t=t.section.sections_uniqid.default)&&""!==t&&void 0!==t&&!1!==t||(w[e].section.sections_uniqid.default=P.epoAPI.math.uniqueid("",!0))}),P.tmEPOAdmin.done_check_section_logic=!0)},check_element_logic:function(e,t){var n,a,l,o,d=[],r=!1;!(Number.isFinite(e)||e instanceof P)&&P.tmEPOAdmin.isinit&&P.tmEPOAdmin.done_check_element_logic||(e instanceof P&&e.length&&(t=e.closest(".builder-wrapper").index(),w[t])&&w[t].section&&(e=P.tmEPOAdmin.find_index(w[t].section.is_slider,e)),void 0===t&&void 0!==e)||(void 0===e?(n=w,r=!0):(n=[],t=P.epoAPI.math.toFloat(t),e=P.epoAPI.math.toFloat(e),n[t]=P.extend(!0,{},w[t]),l=n[t].fields[e],n[t].fields=[],n[t].fields[e]=l),Object.keys(n).forEach(function(i){a=n[i].fields,Object.keys(a).forEach(function(e){var t;l=a[e],o=P.tmEPOAdmin.getFieldValue(l,"element_type"),t=P.tmEPOAdmin.getFieldValue(l,"uniqid",o),(r&&-1!==d.indexOf(t)||!t||""===t||void 0===t||!1===t)&&P.tmEPOAdmin.setFieldValue(i,e,"uniqid",P.epoAPI.math.uniqueid("",!0),o),r&&d.push(P.tmEPOAdmin.getFieldValue(w[i].fields[e],"uniqid",o))})}),P.tmEPOAdmin.done_check_element_logic=!0)},sectionLogicStart:function(e){var t,i;void 0===e?t=w:(t=[],e=P.epoAPI.math.toFloat(e),t[e]=P.extend(!0,{},w[e])),Object.keys(t).forEach(function(e){P.tmEPOAdmin.section_logic_init(e);try{i=t[e].section.sections_logicrules.default||"null",i=P.epoAPI.util.parseJSON(i),i=P.tmEPOAdmin.logic_check_section_rules(i),w[e].section.sections_logicrules.default=O.stringify(i),w[e].section.rules_toggle=i.toggle}catch(e){}})},elementLogicStart:function(e,t){var i,n,a,l,o,d;void 0===e?a=w:(a=[],t=P.epoAPI.math.toFloat(t),e=P.epoAPI.math.toFloat(e),a[t]=P.extend(!0,{},w[t]),o=a[t].fields[e],a[t].fields=[],a[t].fields[e]=o),Object.keys(a).forEach(function(t){void 0!==(l=a[t].fields)&&Object.keys(l).forEach(function(e){o=l[e],P.tmEPOAdmin.element_logic_init(e,t);try{d=P.tmEPOAdmin.getFieldValue(o,"element_type"),n=P.tmEPOAdmin.getFieldValue(o,"logic",d)||"null",i=P.tmEPOAdmin.getFieldValue(o,"logicrules",d)||"null",i=P.epoAPI.util.parseJSON(i),n&&"null"!==n&&(i=P.tmEPOAdmin.logic_check_element_rules(i,t,e)),P.tmEPOAdmin.setFieldValue(t,e,"logicrules",O.stringify(i),d)}catch(e){}})})},panelsReorder:function(e){P(e).children(".options-wrap").each(function(e,t){P(t).find(".tm-default-radio,.tm-default-checkbox").val(e)})},panelsSortable:function(e){0!==P(e).length&&P.tmEPOAdmin.is_original&&e.sortable({handle:".move",cancel:"input,select,button:not(.move)",cursor:"move",tolerance:"pointer",forcePlaceholderSize:!0,placeholder:"panel_wrap pl",stop:function(e,t){P.tmEPOAdmin.panelsReorder(P(t.item).closest(".panels_wrap"))}})},builder_panel_delete_all_onClick:function(e){var t=P(this).closest(".onerow").find(".tcpagination"),i=P(".flasho.tc-wrapper").find(".panels_wrap");e.preventDefault(),P(this).trigger("hideTtooltip"),t.tcPagination("destroy"),1<i.children().length&&((e=i.find(".options-wrap")).each(function(e){if(0===e)return!0;P(this).remove(),i.find(".numorder").each(function(e){P(this).html(parseInt(e,10)+1)})}),e.find("input").val(""),P.tmEPOAdmin.panelsReorder(i))},builder_image_delete_onClick:function(e){var t=P(this);e.preventDefault(),t.trigger("hideTtooltip"),t.closest(".tm_cell_images").find("input."+t.attr("rel")).val(""),t.closest("span").find("img").attr("src","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=")},builder_panel_delete_onClick:function(e){var t=P(this).closest(".panels_wrap");e.preventDefault(),P(this).trigger("hideTtooltip"),1<t.children().length&&P(this).closest(".options-wrap").css({margin:"0 auto"}).animate({opacity:0,height:0,width:0},300,function(){P(this).remove(),t.find(".numorder").each(function(e){P(this).html(parseInt(e,10)+1)}),t.children(".options-wrap").each(function(t){P(this).find("[id]").each(function(){var e=P(this).attr("name").replace(/[[\]]/g,"");P(this).attr("id",e+"_"+t)})}),P.tmEPOAdmin.panelsReorder(t)})},builder_panel_mass_add_onClick:function(e){var t=P(this);e.preventDefault(),t.is(".disabled")||(t.addClass("disabled"),e='<div class="tm-panel-populate-wrapper"><textarea class="tm-panel-populate"></textarea><button type="button" class="tc tc-button builder-panel-populate">'+g.i18n_populate+"</button></div>",t.after(e))},builder_panel_populate_onClick:function(e){var i=P(".flasho.tc-wrapper").find(".panels_wrap"),n=i.children(),a=P(""),t=P(".tm-panel-populate").val().split(/\n/),l=[];e.preventDefault(),P(this).remove(),t.forEach(function(e){/\S/.test(e)&&l.push(P.epoAPI.util.trim(e))}),l.forEach(function(e){var e=e.split("|"),t=e.length;0!==t&&(1===t&&(e[1]=""),e[0]=P.epoAPI.util.trim(e[0]),void 0!==e[1]&&""!==e[1]?e[1]=parseFloat(P.epoAPI.util.trim(e[1])):e[1]="",Number.isFinite(e[1])||(e[1]=""),t=P.tmEPOAdmin.add_panel_row(e,i,n),a=a.add(t))}),a.length&&(i.append(a),a.find(".tm_option_enabled").prop("checked",!0).val("1").trigger("changechoice"),P.tcToolTip(a.find(".tm-tooltip"))),P(".builder-panel-mass-add").removeClass("disabled"),P(".tm-panel-populate-wrapper").remove(),P.tmEPOAdmin.paginattion_init("last"),P.tmEPOAdmin.floatbox_content_js()},add_panel_row:function(e,t,i){var n=i.last().tcClone();return n?(P.tmEPOAdmin.builder_clone_elements_after_events(n),n.find("[name]").val(""),n.find(".tm_option_title").val(e[0]),n.find(".tm_option_value").val(P("<div/>").html(e[0]).text()),n.find(".tm_option_price").val(e[1]),e[2]&&(n.find(".tm_option_price_type").val(e[2]),!1===n.find(".tm_option_price_type").val())&&n.find(".tm_option_price_type").val(""),e[3]&&(n.find(".tm_option_description").val(e[3]),!1===n.find(".tm_option_description").val())&&n.find(".tm_option_description").val(""),n.find(".tm_upload_image img").attr("src",""),n.find("input.tm_option_image").val(""),n.find(".tm-default-radio,.tm-default-checkbox").prop("checked",!1).val(i.length),n):P("")},builder_panel_add_separator_onClick:function(e){var t=P(this).prevUntil(".panels_wrap").prev(),i=t.children(),n=i.last().tcClone();e.preventDefault(),n&&(n.addClass("separator"),n.find(".tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)").addClass("tm-hidden"),n.find("[name]").val(""),n.find(".tc-cell-value input").removeClass("tm_option_value").val("-1"),n.find(".tm_upload_image img").attr("src",""),n.find("input.tm_option_image").val(""),n.find(".tm-default-radio,.tm-default-checkbox").prop("checked",!1).val(i.length),P.tmEPOAdmin.builder_clone_elements_after_events(n),t.append(n),n.find("input:checkbox").toArray().forEach(function(e){(e=P(e)).val(e.data("builder").tags.value),e.is(".tm_option_enabled")&&e.prop("checked",!0).trigger("changechoice")}),P.tcToolTip(n.find(".tm-tooltip")),P.tmEPOAdmin.paginattion_init("last"),P.tmEPOAdmin.floatbox_content_js())},builder_panel_add_onClick:function(e){var t=P(this).prev(".panels_wrap"),i=t.children().not(".separator"),n=i.last().tcClone();e.preventDefault(),n&&(n.find("[name]").val(""),n.find(".tm_upload_image img").attr("src",""),n.find("input.tm_option_image").val(""),n.find(".tm-default-radio,.tm-default-checkbox").prop("checked",!1).val(i.length),P.tmEPOAdmin.builder_clone_elements_after_events(n),t.append(n),n.find("input:checkbox").toArray().forEach(function(e){(e=P(e)).val(e.data("builder").tags.value),e.is(".tm_option_enabled")&&e.prop("checked",!0).trigger("changechoice")}),P.tcToolTip(n.find(".tm-tooltip")),P.tmEPOAdmin.paginattion_init("last"),P.tmEPOAdmin.floatbox_content_js())},builder_add_section_onClick:function(e,t,i){var n,a,l=P.epoAPI.template.html(v.tc_builder_section,{});return e&&e.preventDefault(),!(!l||!(e=P(l)))&&(e.addClass("w100"),e.find(".tm-builder-sections-uniqid").val(P.epoAPI.math.uniqueid("",!0)),n=P.tmEPOAdmin.getFieldObject(e),a={},Object.keys(n).forEach(function(e){a[n[e].id]=n[e]}),l={fields:[],section:a,size:P.tmEPOAdmin.builderSize[a.sections_size.default],sections_internal_name:a.sections_internal_name.default},e.find(".section_elements").empty(),e.find(".tm-internal-name").remove(),t?(e.appendTo(".builder-layout"),w.push(l)):0<P(".builder-layout .tma-variations-wrap").length?(P(".builder-layout .tma-variations-wrap").after(e),w.splice(1,0,l)):(e.prependTo(".builder-layout"),w.unshift(l)),P.tmEPOAdmin.check_section_logic(e),P.tmEPOAdmin.section_logic_init(e),i||(P.tmEPOAdmin.builder_items_sortable(e.find(".bitem-wrapper")),P.tmEPOAdmin.builder_reorder_multiple(),P(this).is("a")&&P(d).tcScrollTo(e)),P.tmEPOAdmin.initSectionsCheck(),P.tmEPOAdmin.makeResizables(e),e)},builder_add_element_onClick:function(e){var n=P(this),t=P.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:'<div class="tm-inner">'+g.element_data+"</div>",title:g.i18n_add_element}),a=P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!1,refresh:"fixed",width:"70%",height:"70%",top:"15%",left:"15%",classname:"flasho tc-wrapper tc-builder-add-element",data:t});e&&e.preventDefault(),P(".tc-builder-add-element .tc-element-button").on("click.cpf",function(e){var t=n.closest(".builder-wrapper"),i=P(this).attr("data-element");e.preventDefault(),n.is(".tc-prepend")?P.tmEPOAdmin.builder_clone_element(i,t,"prepend"):P.tmEPOAdmin.builder_clone_element(i,t),P.tmEPOAdmin.logic_reindex(),a.destroy()})},builder_add_section_and_element_onClick:function(e){var t=P.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:'<div class="tm-inner">'+g.element_data+"</div>",title:g.i18n_add_element}),i=P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!1,refresh:"fixed",width:"70%",height:"70%",top:"15%",left:"15%",classname:"flasho tc-wrapper tc-builder-add-section-and-element",data:t});e&&e.preventDefault(),P(".tc-builder-add-section-and-element .tc-element-button").on("click.cpf",function(e){var t=P.tmEPOAdmin.builder_add_section_onClick(!1,!0);e.preventDefault(),t&&(e=P(this).attr("data-element"),P.tmEPOAdmin.builder_clone_element(e,t),P.tmEPOAdmin.logic_reindex(),i.destroy())})},tm_variations_check:function(){var e,i;P(".builder-layout .element-variations").length&&1===P.tmEPOAdmin.variationsCheckForChanges&&a&&(P("#tc-admin-extra-product-options").block({message:null}),e={action:"woocommerce_tm_variations_check",post_id:a.post_id,security:a.check_attributes_nonce},P.post(a.ajax_url,e,function(e){w[0].variations_html=e.html,P(".tma-variations-wrap .tm-all-attributes").html(e.html),e.jsobject&&(w[0].jsobject=e.jsobject,w[0].fields[0].find(function(e,t){return"multiple"===e.id&&(i=t),"multiple"===e.id}),void 0!==i?w[0].fields[0][i]=e.jsobject:w[0].fields[0].push(e.jsobject)),P("#tc-admin-extra-product-options").unblock(),P("#tc-admin-extra-product-options").trigger("woocommerce_tm_variations_check_loaded"),P.tmEPOAdmin.variationsCheckForChanges=0,P.tmEPOAdmin.builder_reorder_multiple()},"json"))},builder_variation_delete_onClick:function(){P.tmEPOAdmin.var_is("tm-style-variation-forced",!0),P(".builder_add_section").addClass("inline"),P(".builder_add_variation").addClass("inline").removeClass("tm-hidden"),1<P(".tma-variations-wrap").length&&P(".tma-variations-wrap").not(":first").each(function(){var e=P(this).closest(".builder-wrapper"),t=e.index();e.remove(),w.splice(t,1),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck()}),P(".tma-variations-wrap").addClass("tm-hidden"),P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled","1"),P.tmEPOAdmin.initSectionsCheck()},builder_add_variation_onClick:function(e){e&&e.preventDefault(),!0===P.tmEPOAdmin.var_is("tm-style-variation-added")?!0===P.tmEPOAdmin.var_is("tm-style-variation-forced")&&(P.tmEPOAdmin.var_is("tm-style-variation-forced",!1),P(".builder_add_variation").addClass("tm-hidden"),P(".builder_add_section").removeClass("inline"),P(".tma-variations-wrap").removeClass("tm-hidden"),P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled",""),P.tmEPOAdmin.initSectionsCheck()):(e=P.tmEPOAdmin.builder_add_section_onClick(!1,!1,!0))&&(e.find(".tm-add-element-action,.tmicon.clone,.tmicon.size,.tmicon.move,.tmicon.plus,.tmicon.minus").remove(),e.addClass("tma-nomove tma-variations-wrap"),P.tmEPOAdmin.var_is("tm-style-variation-added",!0),e=P.tmEPOAdmin.builder_clone_element("variations",P(".builder-layout").find(".builder-wrapper").first()),P.tmEPOAdmin.setVariationSection(),!0===P.tmEPOAdmin.var_is("tm-style-variation-forced")?(P(".builder_add_section").addClass("inline"),P(".builder_add_variation").addClass("inline").removeClass("tm-hidden"),P(".tma-variations-wrap").addClass("tm-hidden"),P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled","1")):(P(".builder_add_variation").addClass("tm-hidden"),P(".builder_add_section").removeClass("inline"),P(".tma-variations-wrap").removeClass("tm-hidden"),P.tmEPOAdmin.var_is("tm-style-variation-forced",!1),P.tmEPOAdmin.setFieldValue(P.tmEPOAdmin.variationSectionIndex,P.tmEPOAdmin.variationFieldIndex,"variations_disabled","")),e.find(".bitem-settings .size,.bitem-settings .clone,.tm-label-move,.bitem-settings .plus,.bitem-settings .minus,.tm-label-delete").remove(),e.addClass("tma-nomove"),e.find(".builder-remove-for-variations").remove(),e.find(".builder_hide_for_variation").hide(),P.tmEPOAdmin.pre_element_logic_init_set(),P.tmEPOAdmin.logic_reindex_force(),P.tmEPOAdmin.variationsCheckForChanges=1,P.tmEPOAdmin.tm_variations_check())},var_is:function(e,t){if(!t)return P("body").data(e);P("body").data(e,t)},var_remove:function(e){e&&P("body").removeData(e)},tm_escape:function(e){return encodeURIComponent(e)},tm_unescape:function(e){return decodeURIComponent(e)},get_element_logic_init:function(e){return P.tmEPOAdmin.pre_element_logic_init_done||P.tmEPOAdmin.pre_element_logic_init(e),P.tmEPOAdmin.isinit?P.tmEPOAdmin.pre_element_logic_init_done=!0:P.tmEPOAdmin.pre_element_logic_init_done=!1,P.tmEPOAdmin.pre_element_logic_init_obj},get_element_logic_options_init:function(e){return P.tmEPOAdmin.pre_element_logic_init_done||P.tmEPOAdmin.pre_element_logic_init(e),P.tmEPOAdmin.isinit?P.tmEPOAdmin.pre_element_logic_init_done=!0:P.tmEPOAdmin.pre_element_logic_init_done=!1,P.tmEPOAdmin.pre_element_logic_init_obj_options},find_index:function(e,t,i,n){var a=0;return e&&(a=t.closest(".bitem-wrapper").prevAll(".bitem-wrapper").find(".bitem"),a=(a=n?a.not(n):a).length),i&&n?(e=t.parent().find(i).not(n),-1!==(e=parseInt(e.index(t),10))?parseInt(a,10)+e:e):parseInt(a,10)+parseInt(t.index(),10)},setGlobalVariationObject:function(t,i){var e,n;a?(P("#tc-admin-extra-product-options").block({message:null}),e={action:"woocommerce_tm_get_variations_array",post_id:a.post_id,security:a.check_attributes_nonce},n=d.ajaxurl||a.ajax_url,P.post(n,e,function(e){e&&(x=e,!0===t?P.tmEPOAdmin.pre_element_logic_init_set(i):"reindex"===t?P.tmEPOAdmin.logic_reindex_force():"initialitize_on"===t?P.tmEPOAdmin.initialitize_on():"initialitize_on_after"===t&&P.tmEPOAdmin.initialitize_on_after())},"json").always(function(){P("#tc-admin-extra-product-options").unblock()})):"initialitize_on"===t?(x=x||{},P.tmEPOAdmin.initialitize_on()):"initialitize_on_after"===t&&(x=x||{},P.tmEPOAdmin.initialitize_on_after())},pre_element_logic_init:function(e){x?P.tmEPOAdmin.pre_element_logic_init_set(e):P.tmEPOAdmin.setGlobalVariationObject(!0,e)},getFieldValue:function(e,t,i){if((i&&!0!==i||!0===i&&(i=P.tmEPOAdmin.getFieldValue(e,"element_type")))&&(t=i+"_"+t),void 0!==(i=e.find(function(e){return e.id===t}))&&"object"==typeof i)return i.default},getFieldMultiple:function(e,t,i){var n,a;if(t="options_"+t,t="multiple_"+(t=i&&!0!==i||!0===i&&(i=P.tmEPOAdmin.getFieldValue(e,"element_type"))?i+"_"+t:t),e.find(function(e,t){return"multiple"===e.id&&(n=t),"multiple"===e.id}),void 0!==n&&(a=e[n].multiple.map(function(e){return e.find(function(e){return e.id===t})}).filter(function(e){return null!=e}))&&"object"==typeof a)return a},setFieldValue:function(e,t,i,n,a){var l;(a&&!0!==a||!0===a&&(a=P.tmEPOAdmin.getFieldValue(w[e].fields[t],"element_type")))&&(i=a+"_"+i),a=w[e].fields[t],Array.isArray(a)&&a.find(function(e,t){return e.id===i&&(l=t),e.id===i}),void 0!==l&&(w[e].fields[t][l].default=n)},setFieldValueMultiple:function(e,t,i,n,a){var l,o;i.toString.isNumeric()?o=i:(i="options_"+i,i="multiple_"+(i=a&&!0!==a||!0===a&&(a=P.tmEPOAdmin.getFieldValue(w[e].fields[t],"element_type"))?a+"_"+i:i)),w[e].fields[t].find(function(e,t){return"multiple"===e.id&&(l=t),"multiple"===e.id}),void 0!==l&&(a=w[e].fields[t][l].multiple,void 0===o?a.find(function(e,t){return e.id===i&&(o=t),e.id===i}):w[e].fields[t][l].multiple[o].default=n)},setVariationSection:function(){w.find(function(e,t){var i,n;return void 0!==(n=void 0!==e&&void 0!==e.fields?e.fields.find(function(e,t){e=e.find(function(e){return"element_type"===e.id&&"variations"===e.default});return void 0!==e&&(i=t),e}):n)&&(P.tmEPOAdmin.variationSectionIndex=t,P.tmEPOAdmin.variationFieldIndex=i,P.tmEPOAdmin.variationSection=w[P.tmEPOAdmin.variationSectionIndex].fields[P.tmEPOAdmin.variationFieldIndex],w[P.tmEPOAdmin.variationSectionIndex].section.tma_variations_wrap=!0),void 0!==n})},pre_element_logic_init_set:function(t){var i,n,a,l,o,d,r,s,c,m,u,p,_,f,h,b,g,v,O,A,E;x&&(P.tmEPOAdmin.pre_element_logic_init_obj={},P.tmEPOAdmin.pre_element_logic_init_obj_options={},i={},n={},a=[],P.tmEPOAdmin.setVariationSection(),Object.keys(w).forEach(function(e){void 0!==(O=w[e].section)&&(l=O.sections_uniqid.default,-1!==a.indexOf(l)&&(w[e].section.sections_uniqid.default=P.epoAPI.math.uniqueid("",!0),l=w[e].section.sections_uniqid.default),a.push(l),i[l]=[],t&&P.tmEPOAdmin.check_section_logic(e),g=O.sections_internal_name.default||"Section",O.tma_variations_wrap||(i[l][0]='<option data-type="section" data-section="'+l+'" value="'+l+'">'+g+" ("+l+")</option>"),o=w[e].fields.filter(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return"variations"===t||-1!==P.inArray(t,P.tmEPOAdmin.canTakeLogic)&&"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",t)}),d=w[e].fields.filter(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",t)||void 0===P.tmEPOAdmin.getFieldValue(e,"enabled",t)}),r=[],s=[],Object.keys(o).forEach(function(e){if(A=o[e],v=P.tmEPOAdmin.getFieldValue(A,"element_type"),p=P.tmEPOAdmin.getFieldValue(A,"header_title",v),E=P.tmEPOAdmin.getFieldValue(A,"uniqid",v),c=d.findIndex(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return E===P.tmEPOAdmin.getFieldValue(e,"uniqid",t)&&("variations"===t||-1!==P.inArray(t,P.tmEPOAdmin.canTakeLogic)&&"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",!0))}),m=P.tmEPOAdmin.getFieldValue(A,"enabled",v),u="1"===P.tmEPOAdmin.getFieldValue(A,"enabled",v),m&&!u)return!0;void 0!==p&&(void 0!==(m=p)&&0!==m.length||(m=""),(u=P.tmEPOAdmin.getFieldValue(A,"internal_name",v))!==m&&(m=m+" ("+u+")"),p="variations"===v?"variation":-1!==P.inArray(v,["radiobuttons","checkboxes","product","selectbox","selectboxmultiple"])?"multiple":"text",i[l][c+1]='<option data-type="'+p+'" data-section="'+l+'" value="'+c+'">'+m+"</option>","variations"===v?(s=[],P(x.variations).each(function(e,t){var i="publish"===(i=t.status||"invalid")?"":" ("+i+")";_=[],P(t.attributes).each(function(e,t){t=P.map(t,function(e){return e});P(t).each(function(e,t){_.push(t)})}),_=_.join(" - "),f=_;try{f=P.tmEPOAdmin.tm_unescape(_)}catch(e){f=_}s.push('<option value="'+P.tmEPOAdmin.tm_escape(t.variation_id)+'">'+f+i+"</option>")}),r[c]='<select data-element="'+c+'" data-section="'+l+'" class="cpf-logic-value">'+s.join("")+"</select>"):-1!==P.inArray(v,["radiobuttons","checkboxes","selectbox","selectboxmultiple"])?(h=P.tmEPOAdmin.getFieldMultiple(A,"title",v),b=P.tmEPOAdmin.getFieldMultiple(A,"value",v),s=[],Object.keys(h).forEach(function(e){s.push('<option value="'+P.tmEPOAdmin.tm_escape(b[e].default)+'">'+h[e].default+"</option>")}),r[c]='<select data-element="'+c+'" data-section="'+l+'" class="cpf-logic-value">'+s.join("")+"</select>"):r[c]='<input data-element="'+c+'" data-section="'+l+'" class="cpf-logic-value" type="text" value="">')}),n[l]={values:r})}),P.tmEPOAdmin.pre_element_logic_init_obj=n,P.tmEPOAdmin.pre_element_logic_init_obj_options=i)},element_logic_init:function(e,t,i){var n,a,l,o,d,r,s=[],c=[],m={};e instanceof P&&(t=e.closest(".builder-wrapper").index(),e=P.tmEPOAdmin.find_index(w[t].section.is_slider,e)),t=P.epoAPI.math.toFloat(t),e=P.epoAPI.math.toFloat(e),r=P.tmEPOAdmin.getFieldValue(w[t].fields[e],"uniqid",!0),l=w[t].fields.filter(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",t)||void 0===P.tmEPOAdmin.getFieldValue(e,"enabled",t)}),n=l.findIndex(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return r===P.tmEPOAdmin.getFieldValue(e,"uniqid",t)&&-1!==P.inArray(t,P.tmEPOAdmin.canTakeLogic)&&"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",!0)}),P.tmEPOAdmin.check_section_logic(),P.tmEPOAdmin.check_element_logic(e,t),l=P.extend(!0,{},P.tmEPOAdmin.get_element_logic_init()),m=P.extend(!0,{},l),d=P.extend(!0,{},P.tmEPOAdmin.get_element_logic_options_init()),o=P.extend(!0,{},P.tmEPOAdmin.get_element_logic_options_init()),(a=w[t].section.sections_uniqid.default)&&l[a]&&l[a].values[n]?(m[a]={values:m[a].values},m[a].values.forEach(function(e,t){n!==t&&delete m[a].values[t]}),delete l[a].values[n],delete d[a][n+1],delete d[a][0]):a&&d[a]&&d[a][0]&&delete d[a][0],P.each(d,function(e,t){t&&P.each(t,function(e,t){t&&c.push(t)})}),P.each(o,function(e,t){e===a&&P.each(t,function(e,t){e===n+1&&s.push(t)})}),P.tmEPOAdmin.elementLogicObject.init||(P.tmEPOAdmin.elementLogicObject.init=!0),P.tmEPOAdmin.elementLogicObject=P.extend(P.tmEPOAdmin.elementLogicObject,l),P.tmEPOAdmin.elementShippingLogicObject.init||(P.tmEPOAdmin.elementShippingLogicObject.init=!0),P.tmEPOAdmin.elementShippingLogicObject=P.extend(P.tmEPOAdmin.elementShippingLogicObject,m),i&&(P.tmEPOAdmin.logic_append(i,c,"element",t,e),P.tmEPOAdmin.shipping_logic_append(i,s,"element",t,e,"enable"),P.tmEPOAdmin.shipping_logic_append(i,s,"element",t,e,"disable"))},section_logic_init:function(e,t){var i,n,a,l=[],o={};e instanceof P?e=parseInt(e.index(),10):void 0!==e&&(e=P.epoAPI.math.toFloat(e)),void 0===e?a=w:(a=[])[e]=P.extend(!0,{},w[e]),P.tmEPOAdmin.check_section_logic(e),Object.keys(a).forEach(function(e){void 0!==w[e].section&&(o=P.extend(!0,{},P.tmEPOAdmin.get_element_logic_init(!0)),i=P.extend(!0,{},P.tmEPOAdmin.get_element_logic_options_init(!0)),(n=w[e].section.sections_uniqid.default)&&o[n]&&(delete o[n],delete i[n]),P.each(i,function(e,t){t&&P.each(t,function(e,t){t&&l.push(t)})}),P.tmEPOAdmin.sectionLogicObject.init||(P.tmEPOAdmin.sectionLogicObject.init=!0),P.tmEPOAdmin.sectionLogicObject=P.extend(P.tmEPOAdmin.sectionLogicObject,o),t)&&P.tmEPOAdmin.logic_append(t,l,"section",e)})},logic_check_section_rules:function(e){var n,a;return void 0===(e="object"==typeof e&&null!==e?e:{}).toggle&&(e.toggle="show"),void 0===e.rules&&(e.rules=[]),e=P.tmEPOAdmin.convert_rules(e),n=P.epoAPI.util.deepCopyArray(e),a=P.tmEPOAdmin.sectionLogicObject,P.each(e.rules,function(i,e){Array.isArray(e)&&(P.each(e,function(e,t){void 0!==a[t.section]&&void 0!==a[t.section].values[t.element]||t.section===t.element||delete n.rules[i][e]}),0===n.rules[i].length&&delete n.rules[i],n.rules[i]=A(n.rules[i]))}),n.rules=A(n.rules),n},logic_check_element_rules:function(e,t,n){var a,l,o=!1;return void 0===(e="object"==typeof e&&e?e:{}).toggle&&(e.toggle="show"),void 0===e.rules&&(e.rules=[]),e=P.tmEPOAdmin.convert_rules(e),a=P.epoAPI.util.deepCopyArray(e),l=P.tmEPOAdmin.elementLogicObject,P.each(e.rules,function(i,e){Array.isArray(e)&&(P.each(e,function(e,t){void 0!==l[t.section]&&void 0!==l[t.section].values[t.element]||t.section===t.element||(delete a.rules[i][e],o=!0)}),0===a.rules[i].length?delete a.rules[i]:a.rules[i]=A(a.rules[i])),o&&void 0!==t&&void 0!==n&&P(".builder-layout").find(".builder-wrapper").eq(t).find(".bitem").eq(n).addClass("tm-wrong-rule")}),a.rules=A(a.rules),a},shipping_logic_check_element_rules:function(e){return void 0===(e="object"==typeof e&&e?e:{}).toggle&&(e.toggle="show"),void 0===e.rules&&(e.rules=[]),e},convert_rules:function(e){return e.what&&("all"===e.what?e.rules=[e.rules]:"any"===e.what&&(e.rules=e.rules.reduce(function(e,t){return e.push([t]),e},[])),delete e.what),e},shipping_logic_append:function(e,t,i,n,a,l){var o,d,r,s,c,m,u,p;if(e=P(e),e=P(e).find(".tm-shipping-"+l+"-logicrules + .shipping-logic-div .tm-logic-wrapper"),!t||1!==t.length)return e.html('<div class="errortitle"><p>'+g.i18n_cannot_apply_shippingrules+"</p></div>"),!1;try{c=P.tmEPOAdmin.getFieldValue(w[n].fields[a],"shipping_methods_"+l+"_logicrules",!0)||"null",o=P.epoAPI.util.parseJSON(c),p=P.tmEPOAdmin.shipping_logic_check_element_rules(o),P.tmEPOAdmin.setFieldValue(n,a,"shipping_methods_"+l+"_logicrules",O.stringify(p),!0)}catch(e){p=!1}e.empty(),d='<fieldset class="tm-logic-rule-set"><legend>OR</legend><div class="tm-logic-rule-wrap"></div></fieldset>',s=P('<div class="tc-row tm-logic-rule"><div class="tc-cell tc-col-auto tm-logic-element"></div><div class="tc-cell tc-col-auto tm-logic-operator"></div><div class="tc-cell tc-col-auto tm-logic-value"></div><div class="tc-cell tc-col-auto tm-logic-func"><button type="button" class="tmicon tcfa tcfa-plus add cpf-add-rule"></button> <button type="button" class="tmicon tcfa tcfa-trash delete cpf-delete-rule"></button></div></div>'),c=P('<select class="cpf-logic-element">'+t.join("")+"</select>"),m="",Object.keys(P.tmEPOAdmin.logicOperators).forEach(function(e){m=m+'<option value="'+e+'">'+P.tmEPOAdmin.logicOperators[e]+"</option>"}),m=P('<select class="cpf-logic-operator">'+m+"</select>"),s.find(".tm-logic-element").append(c),s.find(".tm-logic-operator").append(m),p&&void 0!==p.rules&&p.rules.length?(u=P('<div class="temp" />'),P.each(p.rules,function(e,t){r=P(d),t&&"object"==typeof t&&(Array.isArray(t)&&(t.length?P.each(t,function(e,t){r.find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule(t,s,i,!0))}):r.find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule({},s,i,!0))),u.append(r))}),u=u.children(),e.append(u).removeClass("tc-hidden")):(u=P('<div class="temp" />'),(r=P(d)).find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule({},s,i,!0)),u.append(r),u=u.children(),e.append(u),u.find(".cpf-logic-element").trigger("change.cpf",["element"===i]),u.find(".cpf-logic-operator").val(u.find(".cpf-logic-operator").children(":not(.tc-hidden-no-events)").eq(0).val()).trigger("change.cpf",["element"===i]),e.addClass("tc-hidden"))},logic_append:function(e,t,i,n,a){var l,o,d,r,s,c,m,u;if(e=P(e),e=P(e).find(".builder-logic-div .tm-logic-wrapper"),!t||0===t.length)return e.html('<div class="errortitle"><p>'+g.i18n_cannot_apply_rules+"</p></div>"),!1;try{s="1"===("element"===i?P.tmEPOAdmin.getFieldValue(w[n].fields[a],"logic",!0)||"":w[n].section.sections_logic.default||"")?"element"===i?P.tmEPOAdmin.getFieldValue(w[n].fields[a],"logicrules",!0)||"null":w[n].section.sections_logicrules.default||"null":"null",l=P.epoAPI.util.parseJSON(s),u="element"===i?P.tmEPOAdmin.logic_check_element_rules(l):P.tmEPOAdmin.logic_check_section_rules(l),"element"===i?P.tmEPOAdmin.setFieldValue(n,a,"logicrules",O.stringify(u),!0):w[n].section.sections_logicrules.default=O.stringify(u)}catch(e){u=!1}e.empty(),o='<fieldset class="tm-logic-rule-set"><legend>OR</legend><div class="tm-logic-rule-wrap"></div></fieldset>',r=P('<div class="tc-row tm-logic-rule"><div class="tc-cell tc-col-auto tm-logic-element"></div><div class="tc-cell tc-col-auto tm-logic-operator"></div><div class="tc-cell tc-col-auto tm-logic-value"></div><div class="tc-cell tc-col-auto tm-logic-func"><button type="button" class="tmicon tcfa tcfa-plus add cpf-add-rule"></button> <button type="button" class="tmicon tcfa tcfa-trash delete cpf-delete-rule"></button></div></div>'),s=P('<select class="cpf-logic-element">'+t.join("")+"</select>"),c="",Object.keys(P.tmEPOAdmin.logicOperators).forEach(function(e){c=c+'<option value="'+e+'">'+P.tmEPOAdmin.logicOperators[e]+"</option>"}),c=P('<select class="cpf-logic-operator">'+c+"</select>"),r.find(".tm-logic-element").append(s),r.find(".tm-logic-operator").append(c),u&&void 0!==u.rules&&u.rules.length?(u=P.tmEPOAdmin.convert_rules(u),m=P('<div class="temp" />'),P.each(u.rules,function(e,t){d=P(o),t&&"object"==typeof t&&(Array.isArray(t)&&(t.length?P.each(t,function(e,t){d.find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule(t,r,i))}):d.find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule({},r,i))),m.append(d))}),m=m.children(),e.append(m)):(m=P('<div class="temp" />'),(d=P(o)).find(".tm-logic-rule-wrap").append(P.tmEPOAdmin.logic_append_rule({},r,i)),m.append(d),m=m.children(),e.append(m),m.find(".cpf-logic-element").trigger("change.cpf",["element"===i]),m.find(".cpf-logic-operator").val(m.find(".cpf-logic-operator").children(":not(.tc-hidden-no-events)").eq(0).val()).trigger("change.cpf",["element"===i]))},logic_append_rule:function(e,t,i,n){var t=t.clone(),a=t.find(".cpf-logic-element").find('option[data-section="'+e.section+'"][value="'+e.element+'"]');return P(a).length&&(P(a)[0].selected=!0),P.tmEPOAdmin.cpf_logic_element_onchange(t.find(".cpf-logic-element"),n?2:"element"===i),t.find(".cpf-logic-operator").val(e.operator),P.tmEPOAdmin.cpf_logic_operator_onchange(t.find(".cpf-logic-operator"),"element"===i),void 0===e.value&&(e.value=""),t.find(".cpf-logic-value").is("select")?t.find(".cpf-logic-value").val(P.tmEPOAdmin.tm_escape(P.tmEPOAdmin.tm_unescape(e.value))):t.find(".cpf-logic-value").val(P.tmEPOAdmin.tm_unescape(e.value)),t},logic_get_JSON:function(e,t,i){var n,a,l,o,e=P(e).find(".builder-logic-div"),d={},r=e.find(".epo-rule-toggle").val();return d[t]=i,d.toggle=r,d.rules=[],e.find(".tm-logic-wrapper").children(".tm-logic-rule-set").each(function(e,t){var i=[];(t=P(t)).find(".tm-logic-rule-wrap").children(".tm-logic-rule").each(function(e,t){t=P(t),a=t.find(".cpf-logic-element"),n=a.children("option:selected").attr("data-section"),a=a.val(),l=t.find(".cpf-logic-operator").val(),void 0===(o=t.find(".cpf-logic-value").val())&&(o=""),t.find(".cpf-logic-value").is("select")||(o=P.tmEPOAdmin.tm_escape(o)),i.push({section:n,element:a,operator:l,value:o})}),d.rules.push(i)}),O.stringify(d)},shipping_logic_get_JSON:function(e,t,i,n){var a,l,o,d,e=P(e).find(".tm-shipping-"+n+"-logicrules + .shipping-logic-div"),r={},n=e.find(".tm-logic-wrapper");return n.is(".tc-hidden")?"":(r[t]=i,r.toggle="show",r.rules=[],n.children(".tm-logic-rule-set").each(function(e,t){var i=[];(t=P(t)).find(".tm-logic-rule-wrap").children(".tm-logic-rule").each(function(e,t){t=P(t),l=t.find(".cpf-logic-element"),a=l.children("option:selected").attr("data-section"),l=l.val(),o=t.find(".cpf-logic-operator").val(),void 0===(d=t.find(".cpf-logic-value").val())&&(d=""),t.find(".cpf-logic-value").is("select")||(d=P.tmEPOAdmin.tm_escape(d)),i.push({section:a,element:l,operator:o,value:d})}),r.rules.push(i)}),O.stringify(r))},section_logic_get_JSON:function(e){var t,i="";return e.find(".activate-sections-logic").is(":checked")&&(t=e.find(".tm-builder-sections-uniqid").val(),i=P.tmEPOAdmin.logic_get_JSON(e,"section",t)),i},element_logic_get_JSON:function(e){var t,i="";return e.find(".activate-element-logic").is(":checked")&&(t=e.find(".tm-builder-element-uniqid").val(),i=P.tmEPOAdmin.logic_get_JSON(e,"element",t)),i},element_shipping_logic_get_JSON:function(e,t){var i=e.find(".tm-builder-element-uniqid").val();return P.tmEPOAdmin.shipping_logic_get_JSON(e,"element",i,t)},cpf_add_rule:function(e){var t=P(this).closest(".tm-logic-rule"),i=t.tcClone(!0);e.preventDefault(),i&&t.after(i)},cpf_add_rule_set:function(e){var t=P(this).closest(".builder-logic-div, .shipping-logic-div").find(".tm-logic-wrapper"),i=t.find(".tm-logic-rule-set:last()");e.preventDefault(),t.is(".tc-hidden")?t.removeClass("tc-hidden"):(e=i.tcClone(!0))&&(e.find(".tm-logic-rule:not(:first)").remove(),i.after(e),e.find(".tm-logic-rule:first .cpf-logic-element").prop("selectedIndex",0).trigger("change.cpf"))},cpf_delete_rule:function(e){var t=P(this),i=t.closest(".tm-logic-wrapper"),n=t.closest(".tm-logic-rule-set"),a=1<i.children(".tm-logic-rule-set").length,l=n.find(".tm-logic-rule-wrap").children(".tm-logic-rule").length;e.preventDefault(),t.trigger("hideTtooltip"),1<l||a?t.closest(".tm-logic-rule").css({margin:"0 auto"}).animate({opacity:0,height:0,width:0},300,function(){(a&&1===l?n:P(this)).remove()}):i.addClass("tc-hidden")},section_logic_reindex:function(){var o=P.tmEPOAdmin.builderItemsSortableObj;Object.keys(w).forEach(function(n){var a,e=n,l=[],t=w[n].section.sections_logicrules.default||"null";return!w[n].section.sections_logic.default||!((t=P.epoAPI.util.parseJSON(t))&&void 0!==t.rules&&0<t.rules.length)||(t=P.tmEPOAdmin.convert_rules(t),o.end.section_eq===e?P.each(t.rules,function(i,e){Array.isArray(e)&&(l[i]=[],P.each(e,function(e,t){a=P.epoAPI.util.deepCopyArray(t),t.element>o.start.element&&t.section===o.start.section&&(a.element=parseInt(a.element,10)-1),l[i][e]=P.tmEPOAdmin.validate_rule(a,n)}),l[i]=A(l[i]))}):P.each(t.rules,function(i,e){Array.isArray(e)&&(l[i]=[],P.each(e,function(e,t){a=P.epoAPI.util.deepCopyArray(t),"check"!==o.start.section&&(t.section===o.start.section&&t.section===o.end.section?t.element===o.start.element?(a.section=o.end.section,a.element=o.end.element):parseInt(t.element,10)>parseInt(o.start.element,10)&&parseInt(t.element,10)<=parseInt(o.end.element,10)?a.element=parseInt(a.element,10)-1:parseInt(t.element,10)<parseInt(o.start.element,10)&&parseInt(t.element,10)>=parseInt(o.end.element,10)&&(a.element=parseInt(a.element,10)+1):t.section===o.start.section&&t.section!==o.end.section?t.element===o.start.element?(a.section=o.end.section,a.element=o.end.element):parseInt(t.element,10)>parseInt(o.start.element,10)&&a.section!==a.element&&(a.element=parseInt(a.element,10)-1):t.section!==o.start.section&&t.section===o.end.section&&t.section!==t.element&&parseInt(t.element,10)>=parseInt(o.end.element,10)&&(a.element=parseInt(a.element,10)+1)),"delete"===o.end.section&&"delete"===a.element||(l[i][e]=P.tmEPOAdmin.validate_rule(a,n))}),l[i]=A(l[i]))}),0===(l=A(l)).length&&(w[n].section.sections_logic.default=""),t.rules=l,void(w[n].section.sections_logicrules.default=O.stringify(t)))})},element_logic_reindex:function(){var i,n,a=P.tmEPOAdmin.builderItemsSortableObj,e=a.start.disabledFieldIndex;e&&(a.start.element=e.toString()),(e=a.end.disabledFieldIndex)&&(a.end.element=e.toString()),Object.keys(w).forEach(function(t){Object.keys(w[t].fields).forEach(function(e){i=w[t].fields[e],n=P.tmEPOAdmin.getFieldValue(i,"element_type"),P.tmEPOAdmin.do_element_logic_reindex(i,n,t,e,a),P.tmEPOAdmin.do_element_shipping_logic_reindex(i,n,t,e,a,"enable"),P.tmEPOAdmin.do_element_shipping_logic_reindex(i,n,t,e,a,"disable")})})},do_element_logic_reindex:function(e,t,n,a,l){var o,d;return!(P.tmEPOAdmin.getFieldValue(e,"logic",t)&&(o=[],e=P.tmEPOAdmin.getFieldValue(e,"logicrules",t),e=P.epoAPI.util.parseJSON(e),e=P.tmEPOAdmin.convert_rules(e))&&void 0!==e.rules&&0<e.rules.length)||(P.each(e.rules,function(i,e){Array.isArray(e)&&(o[i]=[],P.each(e,function(e,t){if(d=P.epoAPI.util.deepCopyArray(t),void 0===t.element)return!0;t.element=t.element.toString(),"check"!==l.start.section&&(t.section===l.start.section&&t.section===l.end.section?t.element===l.start.element?d.element=l.end.element:t.section!==t.element&&parseInt(t.element,10)>parseInt(l.start.element,10)&&parseInt(t.element,10)<=parseInt(l.end.element,10)?d.element=parseInt(d.element,10)-1:t.section!==t.element&&parseInt(t.element,10)<parseInt(l.start.element,10)&&parseInt(t.element,10)>=parseInt(l.end.element,10)&&(d.element=parseInt(d.element,10)+1):t.section===l.start.section&&t.section!==l.end.section?t.element===l.start.element?(d.section=l.end.section,d.element=l.end.element):t.section!==t.element&&!P.tmEPOAdmin.builderItemsSortableObj.start.disabled&&parseInt(t.element,10)>parseInt(l.start.element,10)&&(d.element=parseInt(d.element,10)-1):t.section!==l.start.section&&t.section===l.end.section&&t.section!==t.element&&parseInt(t.element,10)>=parseInt(l.end.element,10)&&(d.element=parseInt(d.element,10)+1)),"delete"===l.end.section&&"delete"===d.element||(P.tmEPOAdmin.builderItemsSortableObj.end.novalidate&&"delete"===P.tmEPOAdmin.builderItemsSortableObj.end.novalidate?o[i][e]=d:o[i][e]=P.tmEPOAdmin.validate_rule(d,n,a))}),0===o[i].length?delete o[i]:o[i]=A(o[i]))}),0===(o=A(o)).length&&P.tmEPOAdmin.setFieldValue(n,a,"logic","",t),e.rules=o,void P.tmEPOAdmin.setFieldValue(n,a,"logicrules",O.stringify(e),t))},do_element_shipping_logic_reindex:function(e,t,i,n,a,l){var o,d,l="shipping_methods_"+l+"_logicrules",e=P.tmEPOAdmin.getFieldValue(e,l,t);return!(e&&(o=[],e=P.epoAPI.util.parseJSON(e))&&void 0!==e.rules&&0<e.rules.length)||(P.each(e.rules,function(i,e){Array.isArray(e)&&(o[i]=[],P.each(e,function(e,t){if(d=P.epoAPI.util.deepCopyArray(t),void 0===t.element)return!0;t.element=t.element.toString(),"check"!==a.start.section&&(t.section===a.start.section&&t.section===a.end.section?t.element===a.start.element?d.element=a.end.element:t.section!==t.element&&parseInt(t.element,10)>parseInt(a.start.element,10)&&parseInt(t.element,10)<=parseInt(a.end.element,10)?d.element=parseInt(d.element,10)-1:t.section!==t.element&&parseInt(t.element,10)<parseInt(a.start.element,10)&&parseInt(t.element,10)>=parseInt(a.end.element,10)&&(d.element=parseInt(d.element,10)+1):t.section===a.start.section&&t.section!==a.end.section?t.element===a.start.element?(d.section=a.end.section,d.element=a.end.element):t.section!==t.element&&!P.tmEPOAdmin.builderItemsSortableObj.start.disabled&&parseInt(t.element,10)>parseInt(a.start.element,10)&&(d.element=parseInt(d.element,10)-1):t.section!==a.start.section&&t.section===a.end.section&&t.section!==t.element&&parseInt(t.element,10)>=parseInt(a.end.element,10)&&(d.element=parseInt(d.element,10)+1)),"delete"===a.end.section&&"delete"===d.element||(o[i][e]=d)}),0===o[i].length?delete o[i]:o[i]=A(o[i]))}),void(0===(o=A(o)).length?P.tmEPOAdmin.setFieldValue(i,n,l,"",t):(e.rules=o,P.tmEPOAdmin.setFieldValue(i,n,l,O.stringify(e),t))))},validate_rule:function(i,e,t){var n,a,l,o;return x&&i&&"object"==typeof i&&void 0!==i.element&&void 0!==i.operator&&void 0!==i.section&&(void 0!==i.value||"isempty"===i.operator||"isnotempty"===i.operator)&&-1!==(l=w.findIndex(function(e){return e.section.sections_uniqid.default===i.section}))&&(void 0!==(l=w[l].fields.filter(function(e){var t=P.tmEPOAdmin.getFieldValue(e,"element_type");return"1"===P.tmEPOAdmin.getFieldValue(e,"enabled",t)||void 0===P.tmEPOAdmin.getFieldValue(e,"enabled",t)})[i.element])?(o=P.tmEPOAdmin.getFieldValue(l,"element_type"),n=!1,-1!==P.inArray(o,["radiobuttons","checkboxes","selectbox","selectboxmultiple"])?(a=P.tmEPOAdmin.getFieldMultiple(l,"value",o),Object.keys(a).some(function(e,t){return P.tmEPOAdmin.tm_escape(a[t].default)===i.value?n=!0:a[t].default===i.value&&(i.value=P.tmEPOAdmin.tm_escape(i.value),n=!0),n})):"variations"===o&&("is"===i.operator||"isnot"===i.operator)?P(x.variations).each(function(e,t){if(P.tmEPOAdmin.tm_escape(t.variation_id)===i.value)return!(n=!0)}):n=!0):n=!0,l=P(".builder-layout").find(".builder-wrapper").eq(e),0<(l=void 0!==t?l.find(".bitem").eq(t):l).length)?n||void 0!==t&&""===P.tmEPOAdmin.getFieldValue(w[e].fields[t],"logic",o)?(l.removeClass("tm-wrong-rule"),i):(l.addClass("tm-wrong-rule"),[]):[]},logic_check_rules_reindex:function(l,e,o,t,d,r,s){var c;return void 0===(e="object"==typeof e&&null!==e?e:{}).toggle&&(e.toggle="show"),void 0===e.rules&&(e.rules=[]),e=P.tmEPOAdmin.convert_rules(e),c=P.epoAPI.util.deepCopyArray(e),o=parseInt(o,10),t=parseInt(t,10),r=parseInt(r,10),s=parseInt(s,10),P.each(e.rules,function(i,e){var n,a;Array.isArray(e)&&(P.each(e,function(e,t){n=t.section,a=t.element,n===d&&a.toString().isNumeric()&&(a=parseInt(a,10),o===a?s&&0===r?(delete c.rules[i][e],l.addClass("tm-wrong-rule")):1===r&&(a+=1,c.rules[i][e].element=a.toString()):o<a&&(0===r?(--a,c.rules[i][e].element=a.toString()):1===r&&(a+=1,c.rules[i][e].element=a.toString())))}),0===c.rules[i].length?delete c.rules[i]:c.rules[i]=A(c.rules[i]))}),c.rules=A(c.rules),c},logic_reindex:function(){var e=P.tmEPOAdmin.builderItemsSortableObj;e.start.section===e.end.section&&e.start.section_eq===e.end.section_eq&&e.start.element===e.end.element||(P.tmEPOAdmin.section_logic_reindex(),P.tmEPOAdmin.element_logic_reindex()),P.tmEPOAdmin.builderItemsSortableObj={start:{},end:{}}},logic_reindex_force:function(){P.tmEPOAdmin.builderItemsSortableObj.start.section="check",P.tmEPOAdmin.builderItemsSortableObj.start.section_eq="check",P.tmEPOAdmin.builderItemsSortableObj.start.element="check",P.tmEPOAdmin.builderItemsSortableObj.end.section="check2",P.tmEPOAdmin.builderItemsSortableObj.end.section_eq="check2",P.tmEPOAdmin.builderItemsSortableObj.end.element="check2",P.tmEPOAdmin.section_logic_reindex(),P.tmEPOAdmin.element_logic_reindex(),P.tmEPOAdmin.builderItemsSortableObj={start:{},end:{}}},builder_items_sortable:function(e){P.tmEPOAdmin.is_original&&e.sortable({handle:".move",cursor:"grabbing",items:".bitem",start:function(e,t){var i,n,a,l;t.placeholder.height(t.helper.outerHeight()),t.placeholder.width(t.helper.outerWidth()),P.tmEPOAdmin.isElementDragged=!0,P(t.item).hasClass("ditem")?(P.tmEPOAdmin.builderItemsSortableObj.start.section="drag",P.tmEPOAdmin.builderItemsSortableObj.start.section_eq="drag",P.tmEPOAdmin.builderItemsSortableObj.start.element="drag"):(l=(i=P(t.item).closest(".builder-wrapper")).index(),n=w[l].section.is_slider,a=P.tmEPOAdmin.find_index(n,P(t.item)),t=P.tmEPOAdmin.find_index(n,P(t.item),".bitem",".element-is-disabled"),w[l].section.sections.default=parseInt(w[l].section.sections.default,10)-1,w[l].section.sections.default=w[l].section.sections.default.toString(),n&&(w[l].section.sections_slides.default=i.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(",")),P.tmEPOAdmin.builderItemsSortableObj.start.section=w[l].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.start.section_eq=l.toString(),P.tmEPOAdmin.builderItemsSortableObj.start.element=a.toString(),P.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex=t),P(".builder-layout .bitem-wrapper").not(".tma-variations-wrap .bitem-wrapper").addClass("highlight")},stop:function(e,t){var i,n,a,l,o,d;P.tmEPOAdmin.isElementDragged=!1,d=(i=P(t.item).closest(".builder-wrapper")).index(),n=w[d].section.is_slider,a=P.tmEPOAdmin.find_index(n,P(t.item)),l=P.tmEPOAdmin.find_index(n,P(t.item)),o=P.tmEPOAdmin.find_index(n,P(t.item),".bitem",".element-is-disabled"),P(t.item).hasClass("ditem")||(P(".builder-wrapper.tm-zindex").css("zIndex","").removeClass("tm-zindex"),w[d].section.sections.default=parseInt(w[d].section.sections.default,10)+1,w[d].section.sections.default=w[d].section.sections.default.toString(),n&&(w[d].section.sections_slides.default=i.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(","))),P.tmEPOAdmin.builderItemsSortableObj.end.section=w[d].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.end.section_eq=d.toString(),P.tmEPOAdmin.builderItemsSortableObj.end.element=l.toString(),P.tmEPOAdmin.builderItemsSortableObj.end.disabledFieldIndex=o,w[d].fields.splice(a,0,w[P.tmEPOAdmin.builderItemsSortableObj.start.section_eq].fields.splice(P.tmEPOAdmin.builderItemsSortableObj.start.element,1)[0]),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.logic_reindex(),P(".builder-layout .bitem-wrapper").removeClass("highlight")},tolerance:"pointer",forcePlaceholderSize:!0,placeholder:"bitem pl2",cancel:".panels_wrap,.tma-nomove",dropOnEmptyType:!0,revert:200,connectWith:".builder-wrapper:not(.tma-nomove) .bitem-wrapper"})},builder_delete_do:function(){var e,t,i,n,a,l,o,d,r=P(this);r.closest(".builder-layout").is(".builder-template")?P.tmEPOAdmin.builder_section_delete_do.apply(this):(l=(e=r.closest(".builder-wrapper")).index(),t=r.closest(".bitem"),i=w[l].section.is_slider,n=P.tmEPOAdmin.find_index(i,t),a=P.tmEPOAdmin.find_index(i,t,".bitem",".element-is-disabled"),w[l].section.sections.default=parseInt(w[l].section.sections.default,10)-1,w[l].section.sections.default=w[l].section.sections.default.toString(),d=w[l].fields[n],o=P.tmEPOAdmin.getFieldValue(d,"element_type"),d=void 0===P.tmEPOAdmin.getFieldValue(d,"enabled",o)||"1"===P.tmEPOAdmin.getFieldValue(d,"enabled",o),P.tmEPOAdmin.builderItemsSortableObj.start.section=w[l].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.start.section_eq=l.toString(),P.tmEPOAdmin.builderItemsSortableObj.start.element=a.toString(),P.tmEPOAdmin.builderItemsSortableObj.end.section="delete",P.tmEPOAdmin.builderItemsSortableObj.end.section_eq="delete",P.tmEPOAdmin.builderItemsSortableObj.end.element="delete",d||(P.tmEPOAdmin.builderItemsSortableObj.start.disabled=!0,P.tmEPOAdmin.builderItemsSortableObj.start.disabledFieldIndex=P.tmEPOAdmin.find_index(i,r,".bitem",".element-is-disabled")),t.remove(),w[l].fields.splice(n,1),P.tmEPOAdmin.logic_reindex(),i&&(w[l].section.sections_slides.default=e.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(",")),P.tmEPOAdmin.builder_reorder_multiple())},builder_delete_onClick:function(e){e.preventDefault(),P(this).trigger("blur"),P.tmEPOAdmin.doConfirm(g.i18n_builder_delete,P.tmEPOAdmin.builder_delete_do,this)},builder_fold_onClick:function(){var e=P(this),t=(e=e.is(".tma-handle")?e.find(".fold"):e).closest(".tma-handle-wrap").find(".tma-handle-wrapper").first();e.data("folded")||void 0===e.data("folded")?(e.data("folded",!1),e.removeClass("tcfa-caret-up").addClass("tcfa-caret-down"),t.removeClass("tm-hidden")):(e.data("folded",!0),e.removeClass("tcfa-caret-down").addClass("tcfa-caret-up"),t.addClass("tm-hidden"))},builder_section_fold_onClick:function(){var e=P(this),t=e.closest(".builder-wrapper");e.data("folded")?(e.data("folded",!1),t.removeClass("tm-hide-bitems"),e.removeClass("tcfa-caret-up").addClass("tcfa-caret-down")):(e.data("folded",!0),t.addClass("tm-hide-bitems"),e.removeClass("tcfa-caret-down").addClass("tcfa-caret-up"))},builder_section_delete_do:function(){var e=P(this).closest(".builder-wrapper"),t=e.index();e.remove(),w.splice(t,1),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.section_logic_init(),P.tmEPOAdmin.initSectionsCheck()},builder_section_delete_onClick:function(e){e.preventDefault(),P(this).trigger("blur"),P.tmEPOAdmin.doConfirm(g.i18n_builder_delete,P.tmEPOAdmin.builder_section_delete_do,this)},builder_plus_onClick:function(){var e=P(this).parentsUntil(".bitem").parent().first(),t=e.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],i=Object.keys(P.tmEPOAdmin.builderSize),n=i.findIndex(function(e){return e===t}),i=i[n+1],n=P.tmEPOAdmin.builderSize[i];void 0!==i&&(e.removeClass(String(t)),e.addClass(String(i)).css("width",""),e.find(".size").text(n),n=e.closest(".builder-wrapper").index(),e=P.tmEPOAdmin.find_index(w[n].section.is_slider,e),P.tmEPOAdmin.setFieldValue(n,e,"div_size",i))},builder_minus_onClick:function(){var e=P(this).parentsUntil(".bitem").parent().first(),t=e.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],i=Object.keys(P.tmEPOAdmin.builderSize),n=i.findIndex(function(e){return e===t}),i=i[n-1],n=P.tmEPOAdmin.builderSize[i];void 0!==i&&(e.removeClass(String(t)),e.addClass(String(i)).css("width",""),e.find(".size").text(n),n=e.closest(".builder-wrapper").index(),e=P.tmEPOAdmin.find_index(w[n].section.is_slider,e),P.tmEPOAdmin.setFieldValue(n,e,"div_size",i))},builder_section_plus_onClick:function(){var e,t=P(this).closest(".builder-wrapper"),i=t.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],n=Object.keys(P.tmEPOAdmin.builderSize),a=n.findIndex(function(e){return e===i}),n=n[a+1],a=P.tmEPOAdmin.builderSize[n];void 0!==n&&(t.removeClass(String(i)),t.addClass(String(n)).css("width",""),t.find(".section-settings .size").text(a),e=t.index(),w[e].section.sections_size.default=n,w[e].size=a,P.tmEPOAdmin.makeResizables(t.find(".bitem")))},builder_section_minus_onClick:function(){var e,t=P(this).closest(".builder-wrapper"),i=t.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],n=Object.keys(P.tmEPOAdmin.builderSize),a=n.findIndex(function(e){return e===i}),n=n[a-1],a=P.tmEPOAdmin.builderSize[n];void 0!==n&&(t.removeClass(String(i)),t.addClass(String(n)).css("width",""),t.find(".section-settings .size").text(a),e=t.index(),w[e].section.sections_size.default=n,w[e].size=a,P.tmEPOAdmin.makeResizables(t.find(".bitem")))},builder_section_item_onClick:function(){var t,i,n,e=P.epoAPI.template.html(v.tc_builder_section,{}),a=P(this).closest(".builder-wrapper"),l=a.index(),e=P(e);e.addClass(w[l].section.sections_size.default),e.addClass("appear"),!0===w[l].section.tma_variations_wrap&&(e.find(".builder-remove-for-variations").remove(),e.find(".builder_hide_for_variation").hide(),e.find(".tma-tab-extra, .tma-tab-logic,.tma-tab-css,.tma-tab-woocommerce").hide()),n=e.find(".section_elements"),P.tmEPOAdmin.copyContent(n,l),P.tmEPOAdmin.check_section_logic(l),t=P.tmEPOAdmin.sectionLogicObject,e=P.tmEPOAdmin.builder_floatbox_template({id:"tc-floatbox-content",html:"",title:g.i18n_edit_settings,uniqidtext:g.i18n_section_uniqid+":",uniqid:w[l].section.sections_uniqid.default}),P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"80%",height:"80%",classname:"flasho tc-wrapper"+(a.is(".tma-variations-wrap")?" tma-variations-section":""),data:e,cancelEvent:function(e){i||(i=!0,P.tmEPOAdmin.sectionLogicObject=t,P.tmEPOAdmin.removeTinyMCE(".flasho.tc-wrapper"),e.destroy(),P("body").removeClass("floatbox-open"))},cancelClass:".floatbox-cancel",updateEvent:function(e){i||(i=!0,P.tmEPOAdmin.removeTinyMCE(".flasho.tc-wrapper"),P.tmEPOAdmin.changeBuilder(n,l),w[l].section.sections_logicrules.default=P.tmEPOAdmin.section_logic_get_JSON(n),P.tmEPOAdmin.sections_type_onChange(l),P.tmEPOAdmin.logic_reindex_force(),e.destroy(),P("body").removeClass("floatbox-open"))},updateClass:".floatbox-update"}),i=!1,P("body").addClass("floatbox-open"),n.appendTo("#tc-floatbox-content").removeClass("closed"),P.tmEPOAdmin.section_logic_init(l,n),setTimeout(function(){var e=n.find(".tm-builder-logicrules").val()||"null";e=P.epoAPI.util.parseJSON(e),e=P.tmEPOAdmin.logic_check_element_rules(e),n.find(".epo-rule-toggle").val(e.toggle)},1),P.tmEPOAdmin.set_fields_logic(n),n.find(".activate-sections-logic").trigger("change"),n.find(".tm-tabs").tmtabs({dataopenattribute:"data-tab"}),n.tmcheckboxes(),P.tmEPOAdmin.builder_clone_after_events(n),P.tcToolTip(P("#tc-floatbox-content").find(".tm-tooltip")),P.tmEPOAdmin.addTinyMCE(".flasho.tc-wrapper")},changeBuilder:function(e,t,i){var n,a,l,o=P.tmEPOAdmin.getFieldObject(e);void 0!==i?(n=P.tmEPOAdmin.getFieldValue(w[t].fields[i],"element_type"),a=w[t].fields[i].filter(function(e){return"element_type"===e.id||"div_size"===e.id||e.id===n+"_internal_name"}),w[t].fields[i]=[].concat.apply(a,o)):(a=[w[t].section.sections_internal_name],o=[].concat.apply(a,o),l={},Object.keys(o).forEach(function(e){l[o[e].id]=o[e]}),l.is_slider=w[t].section.is_slider,l.rules_toggle=w[t].section.rules_toggle,w[t].section=l)},copyContent:function(o,e,t){var d,r,s,c=o.find(".panels_wrap"),m=void 0!==t?w[e].fields[t]:w[e].section;Object.keys(m).forEach(function(n){var i,a,l;"object"==typeof m[n]&&("multiple"===m[n].id?Object.keys(m[n].multiple).forEach(function(t){0===(d=o.find(".options-wrap")).eq(t).length&&(d.eq(0).tcClone().removeClass("separator").appendTo(c).find(":input").not("button").val("").prop("checked",!1).find(".tm_option_enabled").prop("checked",!0).val("1").trigger("changechoice"),(d=o.find(".options-wrap")).eq(t).find(".tc-cell-value input").addClass("tm_option_value")),l={title:!1,value:!1},Object.keys(m[n].multiple[t]).forEach(function(e){i=(i=(i=m[n].multiple[t][e].tags.name).replace("[]","")).substring(0,i.lastIndexOf("[")),a=m[n].multiple[t][e].default,(r=o.find(".options-wrap").eq(t).find("[name^='"+i+"']")).attr("data-builder",O.stringify(m[n].multiple[t][e])),r.attr("name",m[n].multiple[t][e].tags.name).attr("data-field-id",m[n].multiple[t][e].id).removeAttr("id").val(a).trigger("change"),void 0!==m[n].multiple[t][e].checked&&("multiple_checkboxes_options_default_value"===m[n].multiple[t][e].id||"multiple_radiobuttons_options_default_value"===m[n].multiple[t][e].id||"multiple_selectbox_options_default_value"===m[n].multiple[t][e].id||"multiple_selectboxmultiple_options_default_value"===m[n].multiple[t][e].id?r.val(t):r.val(m[n].multiple[t][e].tags.value),!0===m[n].multiple[t][e].checked?r.prop("checked",!0):r.prop("checked",!1)),"multiple_checkboxes_title_value"!==m[n].multiple[t][e].id&&"multiple_radiobuttons_title_value"!==m[n].multiple[t][e].id||"-1"!==m[n].multiple[t][e].default||(l.title=!0),"multiple_checkboxes_options_value"!==m[n].multiple[t][e].id&&"multiple_radiobuttons_options_value"!==m[n].multiple[t][e].id||"-1"!==m[n].multiple[t][e].default||(l.value=!0)}),l.value&&!l.title?((l=d.eq(t)).addClass("separator"),l.find(".tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)").addClass("tm-hidden"),l.find(".tm_option_value").removeClass("tm_option_value")):((l=d.eq(t)).removeClass("separator"),l.find(".tc-cell:not(.tm_cell_move,.tm_cell_title,.tm_cell_description,.tm_cell_delete)").removeClass("tm-hidden"),l.find(".tm_option_value").addClass("tm_option_value"))}):(i=m[n].tags.name,a=m[n].default,r=o.find("[name='"+i+"']"),"product"===m[n].fill&&m[n].options&&m[n].options.push&&(m[n].options.forEach(function(e){r.append(P('<option selected="selected" value="'+e.value+'">'+e.text+"</option>"))}),r.attr("data-exclude",g.original_post_id===g.post_id?g.post_id:g.post_id+","+g.original_post_id)),"category"===m[n].fill&&a&&a.push&&a.forEach(function(e){r.find('option[value="'+e+'"]').attr("selected","selected")}),r.is(".product-default-value-search")&&("products"===o.find(".product-mode:checked").val()||"product"===o.find(".product-mode:checked").val()?(r.removeClass("wc-product-search").addClass("enhanced-dropdown"),s=o.find(".product-products-selector").find(":selected").clone().prop("selected",!1).removeAttr("data-select2-id"),r.find("option").remove(),r.append(s)):""!==a&&(s=m[n].current_selected_text||a,r.attr("data-current-selected",a),r.data("current-selected-text",s),r.append(P('<option selected="selected" value="'+a+'">'+s+"</option>")),r.addClass("wc-product-search")),""!==a)&&r.attr("data-current-selected",a),r.attr("data-builder",O.stringify(m[n])).attr("data-field-id",m[n].id),r.is(":radio")?r.toArray().forEach(function(e,t){var i=m[n].options?(r.eq(t).val(m[n].options[t].value),m[n].options[t].value):r.eq(t).val();i===a?(r.eq(t).prop("checked",!0),r.eq(t).trigger("change")):r.eq(t).prop("checked",!1)}):(r.val(a).trigger("change"),void 0!==m[n].checked&&(r.val(m[n].tags.value),!0===m[n].checked?r.prop("checked",!0):r.prop("checked",!1))),m[n].disabled&&(r.addClass("tm-wmpl-disabled").prop("disabled",!0),r.closest(".message0x0").addClass("tm-setting-row-disabled"))))})},builder_item_onClick:function(){var t,s,c,m,u=P(this).closest(".bitem"),e=P.epoAPI.template.html(v.tc_builder_elements,{}),p=u.closest(".builder-wrapper").index(),_=w[p].section.is_slider,f=P.tmEPOAdmin.find_index(_,u),h=P.tmEPOAdmin.getFieldValue(w[p].fields[f],"element_type"),e=P(e).filter(".bitem.element-"+h).tcClone(!0),b=P.tmEPOAdmin.getFieldValue(w[p].fields[f],"enabled",h);b="variations"===h||"1"===b||void 0===b?"1":"0",!0===w[p].section.tma_variations_wrap&&e.find("tma-tab-extra, .tma-tab-logic,.tma-tab-css,.tma-tab-woocommerce").remove(),m=e.find(".hstc2").find(".inside:first"),"variations"===h&&m.find(".tm-all-attributes").html(w[p].variations_html),P.tmEPOAdmin.copyContent(m,p,f),P.tmEPOAdmin.check_element_logic(f,p),t=P.tmEPOAdmin.elementLogicObject,e=P.tmEPOAdmin.getFieldValue(w[p].fields[f],"uniqid",h),e=P.tmEPOAdmin.builder_floatbox_template({id:"tc-floatbox-content",html:"",title:g.i18n_edit_settings,uniqidtext:"variations"===h||void 0===e?"":g.i18n_element_uniqid+":",uniqid:"variations"===h||void 0===e?"":e}),P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"80%",height:"80%",classname:"flasho tc-wrapper"+("variations"===h?" tma-variations-section":""),data:e,cancelEvent:function(e){s||(s=!0,(c=m.find(".tcpagination")).data("tc-pagination")&&c.tcPagination("destroy"),P.tmEPOAdmin.elementLogicObject=t,P.tmEPOAdmin.removeTinyMCE(".flasho.tc-wrapper"),e.destroy(),P("body").removeClass("floatbox-open"))},cancelClass:".floatbox-cancel",updateEvent:function(e){var i,n,a,l,o,d,r;s||(s=!0,(c=m.find(".tcpagination")).data("tc-pagination")&&c.tcPagination("destroy"),P.tmEPOAdmin.removeTinyMCE(".flasho.tc-wrapper"),P.tmEPOAdmin.changeBuilder(m,p,f),P.tmEPOAdmin.setFieldValue(p,f,"logicrules",P.tmEPOAdmin.element_logic_get_JSON(m),h),P.tmEPOAdmin.setFieldValue(p,f,"shipping_methods_enable_logicrules",P.tmEPOAdmin.element_shipping_logic_get_JSON(m,"enable"),h),P.tmEPOAdmin.setFieldValue(p,f,"shipping_methods_disable_logicrules",P.tmEPOAdmin.element_shipping_logic_get_JSON(m,"disable"),h),P.tmEPOAdmin.set_field_title(u,p,f),i="variations"===h||0===m.find(".is_enabled").length||m.find(".is_enabled").is(":checked")?"1":"0",n=0===m.find(".activate-element-logic").length||m.find(".activate-element-logic").is(":checked")?"1":"0","0"==i?u.addClass("element-is-disabled"):u.removeClass("element-is-disabled"),b!=i&&(a=w[p].section.sections_uniqid.default,l=f,o=P.tmEPOAdmin.find_index(_,u,".bitem",".element-is-disabled"),Object.keys(w[p].fields).forEach(function(e){d=P.tmEPOAdmin.getFieldValue(w[p].fields[e],"logicrules",!0)||"null",d=P.epoAPI.util.parseJSON(d),d=P.tmEPOAdmin.logic_check_rules_reindex(u,d,l,o,a,i,n),P.tmEPOAdmin.setFieldValue(p,e,"logicrules",O.stringify(d),!0)}),Object.keys(w).forEach(function(t){(t=parseInt(t,10))!==p&&(r=w[t].section.sections_logicrules.default||"null",r=P.epoAPI.util.parseJSON(r),r=P.tmEPOAdmin.logic_check_rules_reindex(P(".builder-wrapper").eq(t),r,l,o,a,i,n),w[t].section.sections_logicrules.default=O.stringify(r),Object.keys(w[t].fields).forEach(function(e){d=P.tmEPOAdmin.getFieldValue(w[t].fields[e],"logicrules",!0)||"null",d=P.epoAPI.util.parseJSON(d),d=P.tmEPOAdmin.logic_check_rules_reindex(P(".builder-wrapper").eq(t).find(".bitem").eq(e),d,l,o,a,i,n),P.tmEPOAdmin.setFieldValue(t,e,"logicrules",O.stringify(d),!0)}))})),P.tmEPOAdmin.logic_reindex_force(),e.destroy(),P("body").removeClass("floatbox-open"))},updateClass:".floatbox-update"}),s=!1,P("body").addClass("floatbox-open"),m.appendTo("#tc-floatbox-content"),P("#tc-floatbox-content").find(".inside").addClass("tm-hidden").after(P('<div class="floatbox-loading">'+g.i18n_loading+"</div>")),setTimeout(function(){var e;P.tmEPOAdmin.element_logic_init(f,p,m),m.find(".activate-element-logic").trigger("change"),m.find(".tm_option_enabled").trigger("changechoice"),e=m.find(".tm-builder-logicrules").val()||"null",e=P.epoAPI.util.parseJSON(e),e=P.tmEPOAdmin.logic_check_element_rules(e),m.find(".epo-rule-toggle").val(e.toggle),m.find(":radio:checked").not(".panels_wrap :radio").trigger("change"),"variations"===h&&(m.find(".builder-remove-for-variations").remove(),m.find(".builder_hide_for_variation").hide()),m.tmcheckboxes(),P.tmEPOAdmin.builder_clone_after_events(m),"variations"===h?P.tmEPOAdmin.variations_display_as():P.tmEPOAdmin.floatbox_content_js(),P.tmEPOAdmin.set_fields_logic(m),P.tcToolTip(P("#tc-floatbox-content").find(".tm-tooltip")),P.tmEPOAdmin.tm_weekdays(P("#tc-floatbox-content")),P.tmEPOAdmin.tm_months(P("#tc-floatbox-content")),P.tmEPOAdmin.tm_url(),P.tmEPOAdmin.tm_pricetype_selector(),P.tmEPOAdmin.dynamicMode(),P.tmEPOAdmin.tm_option_price_type(),P.tmEPOAdmin.addTinyMCE(".flasho.tc-wrapper"),P.tmEPOAdmin.paginattion_init(),P("#tc-floatbox-content").find(".inside").removeClass("tm-hidden"),m.find(".tm-tabs").tmtabs({dataopenattribute:"data-tab"}),P("#tc-floatbox-content").find(".floatbox-loading").remove()},1)},set_fields_logic:function(c){c.find(".message0x0[data-required]").toArray().forEach(function(d){var r,t,s="AND";d=P(d),(r=d.data("required")).relation&&(s=r.relation,delete r.relation),t=function(){var o=!0;Object.keys(r).some(function(e){var t,i,n,a=r[e].operator,l=r[e].value;return(o=(o="OR"===s?!0:o)&&(t=P(e),n=!(i=""),c.find(e).length&&(t.is(":checkbox")?t.is(":checked")&&(i=t.val()):i=(t.is(":radio")?c.find(e).filter(":checked"):t).val(),n="object"==typeof l?-1!==P.inArray(i,l):i===l,(n="is"===a?n:!n)?d.removeClass("tm-hidden"):d.addClass("tm-hidden")),n))||d.addClass("tm-hidden"),"OR"===s&&o})},Object.keys(r).forEach(function(e){c.on("change.required changerequired",e,t)}),t()})},getFieldObject:function(e){var i,n,a,l,o,d,t=[];return e.find(":input").not("button").not(".panels_wrap :input").toArray().forEach(function(e){(e=P(e)).is(":radio")&&!e.is(":checked")||void 0!==(i=e.attr("name"))&&0===i.indexOf("tm_meta[")&&((n=i.split(/[[\]]{1,2}/)).pop(),n=n.map(function(e){return""===e?null:e}).filter(function(e){return null!=e?e:null}).splice(2,1)[0],o={id:n,default:e.val(),type:e.prop("nodeName").toLowerCase(),tags:{name:i}},(e.is(":checkbox")||e.is(":radio"))&&(o.checked=e.is(":checked"),o.tags.value=e.attr("value"),o.checked?o.default=e.attr("value"):o.default=""),e.is(".product-categories-selector")?(o.fill="category",o.options=[]):e.is(".product-products-selector")&&(o.fill="product",o.options=[]),e.attr("data-builder")&&(("product"===(d=P.epoAPI.util.parseJSON(e.attr("data-builder"))).fill||"category"===d.fill||e.is(".product-products-selector")||e.is(".product-categories-selector"))&&(o.options=e.children("option:selected").toArray().map(function(e){return{text:P(e).text(),value:P(e).val()}})),d)&&(o=Object.assign(d,o)),e.attr("data-current-selected")&&(o.current_selected=e.attr("data-current-selected"),o.current_selected_text=e.data("current-selected-text")),t.push(o))}),0<e.find(".panels_wrap :input").not("button").length&&(a=[],e.find(".panels_wrap .options-wrap").each(function(e,t){l=[],P(t).find(":input").not("button").each(function(e,t){t=P(t),void 0!==(i=t.attr("name"))&&0===i.indexOf("tm_meta[")&&((n=i.split(/[[\]]{1,2}/)).pop(),n=n.map(function(e){return""===e?null:e}).filter(function(e){return null!=e?e:null}).splice(2,1)[0],o={id:n,default:t.val(),type:t.prop("nodeName").toLowerCase(),tags:{name:i}},(t.is(":checkbox")||t.is(":radio"))&&(o.checked=t.is(":checked"),o.tags.value=t.attr("value"),o.checked?o.default=t.attr("value"):o.default=""),t.attr("data-builder")&&(d=P.epoAPI.util.parseJSON(t.attr("data-builder")))&&(o=Object.assign(d,o)),l.push(o))}),a.push(l)}),t.push({id:"multiple",multiple:a})),t},builder_clone_element:function(l,e,t,i,n){var a,o,d,r,s,c,m=P.epoAPI.template.html(v.tc_builder_elements,{});if(m)return t=t||"append",e=P(e),(m=P(m).filter(".bitem.element-"+l).tcClone(!0))?(r=e.index(),a=w[r].section.is_slider,"replace"===t&&i&&n?(c=i.find(".tm-for-bitem").attr("data-element"),m.find(".tm-builder-element-uniqid").val(P.tmEPOAdmin.getFieldValue(w[r].fields[P.tmEPOAdmin.find_index(a,i)],"uniqid",c))):m.find(".tm-builder-element-uniqid").val(P.epoAPI.math.uniqueid("",!0)),P(".builder-wrapper").length<=0&&(P.tmEPOAdmin.builder_add_section_onClick(),e=P(".builder-wrapper").first()),s=P.tmEPOAdmin.getFieldObject(m),"replace"===t&&i&&n?i.replaceWith(m):0<e.find(".bitem-wrapper").find(".ditem").length?e.find(".bitem-wrapper").find(".ditem").replaceWith(m):("append"===t&&e.find(".bitem-wrapper").not(".tm-hide").append(m),"prepend"===t&&e.find(".bitem-wrapper").not(".tm-hide").prepend(m),w[r].section.sections.default=parseInt(w[r].section.sections.default,10)+1,w[r].section.sections.default=w[r].section.sections.default.toString()),o=P.tmEPOAdmin.find_index(a,m),d=P.tmEPOAdmin.find_index(a,m,".bitem",".element-is-disabled"),"replace"===t&&i&&n?"yes"===n?(i=s.map(function(a){var e={},t=w[r].fields[o].find(function(e){var t="div_size"===e.id||"element_type"===e.id||"multiple"===e.id?e.id:l+e.id.slice(c.length);return"header"===c&&["header_size","header_title","header_title_position","header_title_color","header_subtitle","header_subtitle_color","header_subtitle_position"].includes(e.id)?t=l+"_"+e.id:"header"===l&&t.toString().startsWith(l+"_header")&&(t=e.id.slice(l.length-1)),"element_type"!==a.id&&a.id!==l+"_internal_name"&&t===a.id});return t?(Object.keys(a).forEach(function(n){"id"!==n&&"tags"!==n&&t.hasOwnProperty(n)?"multiple"===n?(e[n]=t[n].map(function(e){return e.map(function(e){var t=e.id.replace("_"+c+"_","_"+l+"_"),i=a[n][0].find(function(e){return e.id===t});return i&&e.tags&&(e.tags.name&&(e.tags.name=e.tags.name.replace("_"+c+"_","_"+l+"_")),e.tags.id&&(e.tags.id=e.tags.id.replace("_"+c+"_","_"+l+"_")),t.endsWith("options_default_value"))&&("radiobuttons"===c&&"checkboxes"===l?(e.type="input",e.tags.name=e.tags.name+"[]"):"checkboxes"===c&&"radiobuttons"===l&&(e.type="radio",e.tags.name=e.tags.name.slice(0,-2))),i?Object.assign({},e,{id:t}):null})}),e[n]=e[n].map(function(e){return e.filter(function(e){return null!==e})})):e[n]=t[n]:e[n]=a[n]}),e):a}),w[r].fields[o]=i,void 0===(n=P.tmEPOAdmin.getFieldValue(w[r].fields[o],"header"===l?"title":"header_title",l))||""===n?m.find(".tm-label").html(g.i18n_no_title):m.find(".tm-label").html(n),n=m.attr("class").split(" ").filter(function(e){return 0===e.indexOf("w")})[0],m.removeClass(String(n)),(n=i.find(function(e){return"div_size"===e.id}))&&(n=n.default,m.addClass(n))):w[r].fields[o]=s:"prepend"!==t&&"append"!==t||(a&&(w[r].section.sections_slides.default=e.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(",")),P.tmEPOAdmin.builderItemsSortableObj.start.section="drag",P.tmEPOAdmin.builderItemsSortableObj.start.section_eq="drag",P.tmEPOAdmin.builderItemsSortableObj.start.element="drag",P.tmEPOAdmin.builderItemsSortableObj.end.section=w[r].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.end.section_eq=e.index().toString(),P.tmEPOAdmin.builderItemsSortableObj.end.element=d.toString(),w[r].fields.splice(o,0,s)),m.find(".builder-element-wrap").empty(),m.find(".builder_element_type").remove(),m.find(".div_size").remove(),m.find(".tm-internal-name").remove(),P.tmEPOAdmin.check_element_logic(m),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.makeResizables(m),m):void 0},doConfirm:function(e,t,i,n,a){var l="object"==typeof e&&null!==e?e.title:e,e="object"==typeof e&&null!==e?'<div class="tm-inner">'+e.html+"</div>":"",l=P.epoAPI.template.html(_.template("tc-floatbox"),{id:"tc-floatbox-content",title:l,html:e,uniqid:"",update:g.i18n_yes,cancel:g.i18n_no}),o=!1;P.tcFloatBox({closefadeouttime:0,overlayopacity:.6,animateOut:"",fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"auto",classname:"flasho tc-wrapper"+(e?"":" tc-question"),data:l,cancelEvent:function(e){o||(o=!0,e.destroy(),a&&(n.push("no"),t.apply(i,n)))},cancelClass:".floatbox-cancel",updateEvent:function(e){o||(o=!0,a&&n.push("yes"),e.destroy(),t.apply(i,n))},updateClass:".floatbox-update",isconfirm:!0})},builder_clone_do:function(){var e,t,i,n,a=P(this).closest(".bitem"),l=a.data("original_title"),o=a.tcClone();o.data("original_title",l),o&&(a.after(o),n=(l=o.closest(".builder-wrapper")).index(),i=w[n].section.is_slider,e=P.tmEPOAdmin.find_index(i,o),t=P.tmEPOAdmin.find_index(i,o,".bitem",".element-is-disabled"),w[n].section.sections.default=parseInt(w[n].section.sections.default,10)+1,w[n].section.sections.default=w[n].section.sections.default.toString(),i&&(w[n].section.sections_slides.default=l.find(".bitem-wrapper").map(function(e,t){return P(t).children(".bitem").not(".pl2").length}).get().join(",")),i=P.tmEPOAdmin.find_index(a,a),w[n].fields.splice(i,0,P.epoAPI.util.deepCopyArray(w[n].fields[i])),P.tmEPOAdmin.setFieldValue(n,e,"uniqid",P.epoAPI.math.uniqueid("",!0),!0),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.builderItemsSortableObj.start.section="clone",P.tmEPOAdmin.builderItemsSortableObj.start.section_eq="clone",P.tmEPOAdmin.builderItemsSortableObj.start.element="clone",P.tmEPOAdmin.builderItemsSortableObj.end.section=w[n].section.sections_uniqid.default,P.tmEPOAdmin.builderItemsSortableObj.end.section_eq=n.toString(),P.tmEPOAdmin.builderItemsSortableObj.end.element=t.toString(),P.tmEPOAdmin.logic_reindex(),P.tmEPOAdmin.makeResizables(o))},builder_clone_onClick:function(e){e.preventDefault(),P.tmEPOAdmin.doConfirm(g.i18n_builder_clone,P.tmEPOAdmin.builder_clone_do,this,[P(this)])},builder_change_do:function(n,a){var e=P.tmEPOAdmin.builder_floatbox_template_import({id:"tc-floatbox-content",html:'<div class="tm-inner">'+g.element_data+"</div>",title:g.i18n_change_element}),l=P.tcFloatBox({closefadeouttime:0,animateOut:"",fps:1,ismodal:!1,refresh:"fixed",width:"70%",height:"70%",top:"15%",left:"15%",classname:"flasho tc-wrapper tc-builder-add-element",data:e}),o=n.closest(".bitem"),e=o.find(".tm-for-bitem").attr("data-element");P(".tm-elements-container").find(".element-"+e).closest(".tm-element-button").remove(),P(".tc-builder-add-element .tc-element-button").on("click.cpf",function(e){var t=n.closest(".builder-wrapper"),i=P(this).attr("data-element");e.preventDefault(),P.tmEPOAdmin.builder_clone_element(i,t,"replace",o,a),P.tmEPOAdmin.logic_reindex(),l.destroy()})},builder_change_onClick:function(e){e.preventDefault(),P.tmEPOAdmin.doConfirm({title:g.i18n_builder_change_ask_title,html:g.i18n_builder_change_ask},P.tmEPOAdmin.builder_change_do,this,[P(this)],!0)},builder_section_clone_do:function(){var i,e,t=P(this).closest(".builder-wrapper"),n=t.tcClone();n&&(e=t.index(),i=[],t.find(".bitem").each(function(e,t){i[e]=P(t).data("original_title")}),t.after(n),t=t.index(),w.splice(e,0,P.epoAPI.util.deepCopyArray(w[e])),w[t].section.sections_uniqid.default=P.epoAPI.math.uniqueid("",!0),n.find(".bitem").each(function(e,t){P(t).data("original_title",i[e])}),w[t].section.is_slider&&P.tmEPOAdmin.createSlider(n),P.tmEPOAdmin.builder_reorder_multiple(),P.tmEPOAdmin.builder_items_sortable(n.find(".bitem-wrapper")),P.tmEPOAdmin.check_section_logic(t),P.tmEPOAdmin.check_element_logic(),P.tmEPOAdmin.section_logic_init(t),P.tmEPOAdmin.makeResizables(n),P.tmEPOAdmin.makeResizables(n.find(".bitem")))},builder_section_clone_onClick:function(e){e.preventDefault(),P.tmEPOAdmin.doConfirm(g.i18n_builder_clone,P.tmEPOAdmin.builder_section_clone_do,this,[P(this)])},builder_floatbox_template:function(e,t){return P.epoAPI.template.html(_.template(t||"tc-floatbox"),{id:e.id,title:e.title,html:e.html,uniqidtext:e.uniqidtext||"",uniqid:e.uniqid,update:e.update||g.i18n_update,cancel:e.cancel||g.i18n_cancel})},builder_floatbox_template_import:function(e){return P.epoAPI.template.html(_.template("tc-floatbox-import"),{id:e.id,title:e.title,html:e.html,cancel:g.i18n_cancel})},nameChange:function(e,t){var i=/\[[0-9]+\]\[\]/g,n=/\[[0-9]+\]/g;return null!==e.match(i)?e=e.replace(i,"["+t+"][]"):null!==e.match(n)&&(e=e.replace(n,"["+t+"]")),e},builder_reorder_multiple:function(){[].concat.apply([],w.map(function(e){return e.fields.map(function(e){return e.map(function(e){return"element_type"===e.id?e.default:null}).filter(function(e){return null!==e})[0]})})).filter(function(e,t,i){return i.indexOf(e)===t}).forEach(function(t){var o=0;w.map(function(e){return e.fields.map(function(e){return e.find(function(e){return"element_type"===e.id&&e.default===t})?e:null})}).forEach(function(e,l){e.forEach(function(e,n){var a;e&&(void 0!==(e=e.find(function(e,t){return"multiple"===e.id&&(a=t),"multiple"===e.id}))&&"object"==typeof e&&(e=e.multiple).forEach(function(e,i){e.forEach(function(e,t){w[l].fields[n][a].multiple[i][t].tags.name=P.tmEPOAdmin.nameChange(w[l].fields[n][a].multiple[i][t].tags.name,o)})}),o+=1)})})})},getEnhancedSelectFormatString:function(){return{language:{errorLoading:function(){return n.i18n_searching},inputTooLong:function(e){e=e.input.length-e.maximum;return 1==e?n.i18n_input_too_long_1:n.i18n_input_too_long_n.replace("%qty%",e)},inputTooShort:function(e){e=e.minimum-e.input.length;return 1==e?n.i18n_input_too_short_1:n.i18n_input_too_short_n.replace("%qty%",e)},loadingMore:function(){return n.i18n_load_more},maximumSelected:function(e){return 1===e.maximum?n.i18n_selection_too_long_1:n.i18n_selection_too_long_n.replace("%qty%",e.maximum)},noResults:function(){return n.i18n_no_matches},searching:function(){return n.i18n_searching}}}},create_products_search:function(e){e.find(":input.wc-product-search").filter(":not(.enhanced)").each(function(){var t,e,i={allowClear:!0,placeholder:P(this).data("placeholder"),dropdownCssClass:"tc-dropdown",minimumInputLength:P(this).data("minimum_input_length")?P(this).data("minimum_input_length"):"3",escapeMarkup:function(e){return e},ajax:{url:n.ajax_url,dataType:"json",delay:250,data:function(e){return{term:e.term,action:P(this).data("action")||"woocommerce_json_search_products_and_variations",security:n.search_products_nonce,exclude:P(this).data("exclude"),include:P(this).data("include"),limit:P(this).data("limit"),display_stock:P(this).data("display_stock"),tcmode:"builder"}},processResults:function(e){var i=[];return e&&P.each(e,function(e,t){i.push({id:e,text:t})}),{results:i}},cache:!0}},i=P.extend(i,P.tmEPOAdmin.getEnhancedSelectFormatString());P(this).selectWoo(i).addClass("enhanced"),P(this).on("select2:open",function(){var e=P(d).scrollTop();P(d).scrollTop(e+1),P(d).scrollTop(e)}),P(this).data("sortable")?(t=P(this),(e=P(this).next(".select2-container").find("ul.select2-selection__rendered")).sortable({placeholder:"ui-state-highlight select2-selection__choice",forcePlaceholderSize:!0,items:"li:not(.select2-search__field)",tolerance:"pointer",stop:function(){P(e.find(".select2-selection__choice").get().reverse()).each(function(){var e=P(this).data("data").id,e=t.find('option[value="'+e+'"]')[0];t.prepend(e)})}})):P(this).prop("multiple")&&P(this).on("change",function(){var e=P(this).children();e.sort(function(e,t){e=e.text.toLowerCase(),t=t.text.toLowerCase();return t<e?1:e<t?-1:0}),P(this).html(e)})})},create_categories_search:function(e){e.find(":input.wc-category-search").filter(":not(.enhanced)").each(function(){var e=P.extend({allowClear:!0,placeholder:P(this).data("placeholder"),dropdownCssClass:"tc-dropdown"},P.tmEPOAdmin.getEnhancedSelectFormatString());P(this).selectWoo(e).addClass("enhanced"),P(this).on("select2:open",function(){var e=P(d).scrollTop();P(d).scrollTop(e+1),P(d).scrollTop(e)})})},create_enhanced_dropdown:function(e){e.find(":input.enhanced-dropdown").filter(":not(.enhanced)").each(function(){var e={allowClear:!0,placeholder:P(this).data("placeholder"),dropdownCssClass:"tc-dropdown"},e=P.extend(e,P.tmEPOAdmin.getEnhancedSelectFormatString());P(this).selectWoo(e).addClass("enhanced")})},create_normal_dropdown:function(e){e.find("select").filter(":not(.enhanced, .enhanced-dropdown, .wc-category-search, .wc-product-search)").not(".shipping-logic-div select, .builder-logic-div select, .panels_wrap select, .options-wrap select").each(function(){var e={allowClear:!!P(this).is(".wc-template-search"),minimumResultsForSearch:P(this).is(".wc-template-search")?0:-1,dropdownCssClass:"tc-dropdown"},e=P.extend(e,P.tmEPOAdmin.getEnhancedSelectFormatString());P(this).selectWoo(e).addClass("enhanced")})},builder_clone_elements_after_events:function(e){e.find("input.tm-color-picker").spectrum("destroy"),e.find(".sp-replacer").remove(),e.find("input.tm-color-picker").spectrum({showInput:!0,showInitial:!0,allowEmpty:!0,showAlpha:!1,showPalette:!1,clickoutFiresChange:!0,showButtons:!1,preferredFormat:"hex",theme:"epo"})},builder_clone_after_events:function(e){P.tmEPOAdmin.builder_clone_elements_after_events(e),P.tmEPOAdmin.panelsSortable(e.find(".panels_wrap")),P.tmEPOAdmin.create_normal_dropdown(e),P.tmEPOAdmin.create_enhanced_dropdown(e),P.tmEPOAdmin.create_products_search(e),P.tmEPOAdmin.create_categories_search(e)},paginattion_init:function(e){var i,n,t=P("#tc-floatbox-content"),a=t.find(".tcpagination");0===a.length||g.tcAdminNoPagination||(t=t.find(".panels_wrap"),i=t.find(".options-wrap"),n=parseInt(a.attr("data-perpage"),10),t=Math.ceil(i.length/n),a.data("tc-pagination")&&a.tcPagination("destroy"),e="last"===e?t:"current"===e&&a.data("pagination_current")||1,a.data("pagination_current",e),a.tcPagination({totalPages:t,startPage:e,visiblePages:10,onPageClick:function(e,t){P.tmEPOAdmin.paginationOnClick(a,t,n,i)}}))},paginationOnClick:function(e,t,i,n){t=parseInt(t,10),e.data("pagination_current",t),n.addClass("tm-hidden"),n.filter(function(e){return i*(t-1)<=e&&e<=i*t-1}).removeClass("tm-hidden")},addTinyMCE:function(e){var i,a,n,l,o,t="excerpt",d="object"==typeof c&&void 0!==c.mceInit&&t in c.mceInit?c.mceInit[t]:{theme:"modern",menubar:!1,wpautop:!0,indent:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,link,unlink",plugins:"fullscreen,image,wordpress,wpeditimage,wplink"},r="object"==typeof c&&void 0!==c.qtInit&&t in c.mceInit?c.qtInit[t]:{buttons:"strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen"};P(e)&&void 0!==p&&(l=P("#wp-"+t+"-editor-tools").html(),o=P("#wp-"+t+"-editor-tools").attr("class"),P(e).find("textarea").not(":disabled").not(".tm-no-editor").each(function(e,t){(a=P(t).attr("id"))||(P(t).attr("id",P(t).attr("name").replace(/[[\]]/g,"")),a=P(t).attr("id")),a&&(i=P.extend({},d,{selector:"#"+a}),n=P.extend({},r,{id:a}),"object"==typeof c&&(c.mceInit[a]=i,c.qtInit[a]=n),P(t).addClass("wp-editor-area").wrap('<div id="wp-'+a+'-wrap" class="wp-core-ui wp-editor-wrap tmce-active tm_editor_wrap"></div>').before('<div class="'+o+'">'+l+"</div>").wrap('<div class="wp-editor-container"></div>'),P(".tm_editor_wrap").find(".wp-switch-editor").each(function(e,t){var i,n;P(t).attr("id")&&(i=(n=P(t).attr("id")).length,n=n.substring(i-4),P(t).attr("id",a+"-"+n),P(t).attr("data-wp-editor-id",a))}),P(".tm_editor_wrap").find(".insert-media").attr("data-editor",a),p.init(i),m&&u&&(u(n),m._buttonsInit()),P(t).closest(".tm_editor_wrap").find("a.insert-media").data("editor",a).attr("data-editor",a))}))},removeTinyMCE:function(e){var i,n,a,l="";P(e)&&void 0!==p&&P(e).find("textarea").not(":disabled").not(".tm-no-editor").each(function(e,t){(i=P(t).attr("id"))&&p&&p.editors&&(n=P(t).val(),a=void 0!==p&&p.editors[i]&&!p.editors[i].isHidden(),void 0!==p.editors[i]&&(l=p.editors[i].getContent(),p.editors[i].remove()),P(t).closest(".tm_editor_wrap").find(".quicktags-toolbar,.wp-editor-tools").remove(),P(t).unwrap().unwrap(),a?""===l?P(t).val(""):P(t).val(l):P(t).val(n))})},set_field_title:function(e,t,i){var n;0!==e.length&&(n=P.tmEPOAdmin.getFieldValue(w[t].fields[i],"element_type"),void 0===(t=P.tmEPOAdmin.getFieldValue(w[t].fields[i],"header_title","header"!==n))||""===t?e.find(".tm-label").html(g.i18n_no_title):e.find(".tm-label").html(t))},tm_upload_button_remove_onClick:function(){var e=P(this).prevAll("input").first(),t=P(this).nextAll(".tm_upload_image").first().find(".tm_upload_image_img");P(e).val(""),P(t).attr("src",b)},variations_display_as:function(e){var n,a,l,t=e?P(this).is(".tm-changes-product-image")?P(this).closest(".tm-attribute").find(".variations-display-as"):P(this):P("#tc-floatbox-content .variations-display-as");t.each(function(e,t){var i;n=P(t).closest(".tm-attribute"),a=n.find(".tm-term"),l=n.find(".tm-changes-product-image"),"select"===(i=P(t).val())?n.find(".tma-hide-for-select-box").hide().addClass("tc-row-hidden"):n.find(".tma-hide-for-select-box").show().removeClass("tc-row-hidden"),"image"===i||"color"===i||"radiostart"===i||"radioend"===i?n.find(".tma-show-for-swatches").show().removeClass("tc-row-hidden"):n.find(".tma-show-for-swatches").hide().addClass("tc-row-hidden"),a.each(function(e,t){switch(P(t).hide().find(".tma-term-color,.tma-term-image,.tma-term-custom-image").hide(),i){case"select":case"radio":"images"===l.val()&&l.val(""),l.children("option[value='images']").attr("disabled","disabled").hide(),"custom"===l.val()&&P(t).show().find(".tma-term-custom-image").show();break;case"image":case"radiostart":case"radioend":l.children("option[value='images']").prop("disabled",!1).show(),P(t).show().find(".tma-term-image").show(),"custom"===l.val()&&P(t).show().find(".tma-term-custom-image").show();break;case"color":"images"===l.val()&&l.val(""),l.children("option[value='images']").attr("disabled","disabled").hide(),"custom"===l.val()&&P(t).show().find(".tma-term-custom-image").show(),P(t).show().find(".tma-term-color").show()}})}),(t=P("#tc-floatbox-content")).find(".tm_option_image").not(".tm_option_imagep").each(function(e){t.find(".tm_upload_imagep").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)}),t.find(".tm_option_imagep").each(function(e){t.find(".tm_upload_image").not(".tm_upload_imagep").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)})},floatbox_content_js:function(){var e,t,i,n=P("#tc-floatbox-content"),a=n.find(".replacement-mode:checked"),l=n.find(".tm-changes-product-image"),o=n.find(".show-tooltip"),d=n.find(".builder-element-wrap").find(".tc-upload-button").not(".tc-upload-buttonp,.tc-upload-buttonl"),r=n.find(".builder-element-wrap").find(".tm_upload_image").not(".tm_upload_imagep,.tm_upload_imagel"),s=n.find(".builder-element-wrap").find(".tc-upload-buttonp"),c=n.find(".builder-element-wrap").find(".tm_upload_imagep"),m=n.find(".builder-element-wrap").find(".tc-upload-buttonl"),u=n.find(".builder-element-wrap").find(".tm_upload_imagel"),p=n.find(".builder-element-wrap").find(".tm_cell_images"),_=n.find(".builder-element-wrap .panels_wrap").find(".sp-replacer");d.hide(),r.hide(),s.hide(),c.hide(),m.hide(),u.hide(),p.hide(),_.hide(),"images"!==l.val()||"none"!==a.val()&&"text"!==a.val()||(e=n.find(".tm_option_image").not(".tm_option_imagep"),t=n.find(".tm_option_imagep"),i=n.find(".tm_upload_imagep .tm_upload_image_img"),l.val("custom"),e.each(function(e){t.eq(e).val(P(this).val()),i.attr("src",P(this).val()||b)})),a.length&&"image"===a.val()?l.find("option[value='images']").prop("disabled",!1).show():("images"===l.val()&&l.val(""),l.find("option[value='images']").attr("disabled","disabled").hide()),setTimeout(function(){l.selectWoo("destroy").removeClass("enhanced"),P.tmEPOAdmin.create_normal_dropdown(l.parent()),l.trigger("change.select2")},100),("image"===a.val()||"images"===a.val()&&"images"===l.val())&&(d.show(),r.show(),p.show()),"custom"===l.val()&&(s.show(),c.show(),p.show()),"image"===a.val()&&P("#tc-floatbox-content .tm-use-lightbox").is(":checked")&&(m.show(),u.show()),"color"===a.val()?("swatch_img"!==o.val()&&"swatch_img_lbl"!==o.val()&&"swatch_img_desc"!==o.val()&&"swatch_img_lbl_desc"!==o.val()||o.val(""),o.find("option[value='swatch_img']").attr("disabled","disabled").hide(),o.find("option[value='swatch_img_lbl']").attr("disabled","disabled").hide(),o.find("option[value='swatch_img_desc']").attr("disabled","disabled").hide(),o.find("option[value='swatch_img_lbl_desc']").attr("disabled","disabled").hide()):(o.find("option[value='swatch_img']").prop("disabled",!1).show(),o.find("option[value='swatch_img_lbl']").prop("disabled",!1).show(),o.find("option[value='swatch_img_desc']").prop("disabled",!1).show(),o.find("option[value='swatch_img_lbl_desc']").prop("disabled",!1).show()),setTimeout(function(){o.selectWoo("destroy").removeClass("enhanced"),P.tmEPOAdmin.create_normal_dropdown(o.parent()),o.trigger("change.select2")},100),"color"===a.val()&&(p.show(),_.show()),n.find(".tm_option_image").not(".tm_option_imagec, .tm_option_imagep, .tm_option_imagel").each(function(e){n.find(".tm_upload_image").not(".tm_upload_imagec, .tm_upload_imagep, .tm_upload_imagel").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)}),n.find(".tm_option_imagec").each(function(e){n.find(".tm_upload_imagec").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)}),n.find(".tm_option_imagep").each(function(e){n.find(".tm_upload_imagep").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)}),n.find(".tm_option_imagel").each(function(e){n.find(".tm_upload_imagel").eq(e).find(".tm_upload_image_img").attr("src",P(this).val()||b)})},tm_weekdays:function(e){e=P(e||"body");e.find(".tm-weekdays").each(function(e,t){var i=P(t).val().split(","),t=P(t).next(".tm-weekdays-picker-wrap");P(t).find(".tm-weekday-picker").each(function(e,t){-1!==i.indexOf(P(t).val())?(P(t).attr("checked","checked").prop("checked",!0),P(t).closest(".tm-weekdays-picker").addClass("tm-checked")):(P(t).prop("checked",!1),P(t).closest(".tm-weekdays-picker").removeClass("tm-checked"))})})},tm_weekday_picker:function(){var e=P(this).closest(".tm-weekdays-picker-wrap").prev(".tm-weekdays"),t=P(e).val().split(","),i=t.indexOf(P(this).val());P(this).is(":checked")?-1===i&&t.push(P(this).val()):-1!==i&&t.splice(i,1),t=P.map(t,function(e){return""===e?null:e}),P(e).val(t.join(",")),P.tmEPOAdmin.tm_weekdays(P(e).parent())},tm_months:function(e){e=P(e||"body");e.find(".tm-months").each(function(e,t){var i=P(t).val().split(","),t=P(t).next(".tm-months-picker-wrap");P(t).find(".tm-month-picker").each(function(e,t){-1!==i.indexOf(P(t).val())?(P(t).attr("checked","checked").prop("checked",!0),P(t).closest(".tm-months-picker").addClass("tm-checked")):(P(t).prop("checked",!1),P(t).closest(".tm-months-picker").removeClass("tm-checked"))})})},tm_month_picker:function(){var e=P(this).closest(".tm-months-picker-wrap").prev(".tm-months"),t=P(e).val().split(","),i=t.indexOf(P(this).val());P(this).is(":checked")?-1===i&&t.push(P(this).val()):-1!==i&&t.splice(i,1),t=P.map(t,function(e){return""===e?null:e}),P(e).val(t.join(",")),P.tmEPOAdmin.tm_months(P(e).parent())},tm_pricetype_selector:function(e){var t=P(".tc-element-setting-price, .tc-element-setting-sale-price"),e=P(e?this:"#tc-floatbox-content .tm-pricetype-selector");"math"===e.val()?t.attr("autocomplete","off"):t.removeAttr("autocomplete")},dynamicMode:function(e){var t=P(".tc-element-setting-price"),e=P(e?this:"#tc-floatbox-content .dynamic-mode"),e=e.val();t.removeClass("dynamic-product-price override-product-price change-product-weight"),"dynamic_product_price"===e?t.addClass("dynamic-product-price"):"override_product_price"===e?t.addClass("override-product-price"):"change_product_weight"===e&&t.addClass("change-product-weight")},tm_option_price_type:function(e){e=P(e?this:"#tc-floatbox-content .tm_option_price_type");"math"===e.val()?P(".tm_option_price, .tm_option_sale_price").attr("autocomplete","off"):P(".tm_option_price, .tm_option_sale_price").removeAttr("autocomplete")},tm_url:function(e){var t=P("#tc-floatbox-content"),i=P(this),t=t.find(".builder-element-wrap").find(".tc-cell-url");"url"===(i=e?i:P("#tc-floatbox-content .use_url")).val()?t.show():t.hide()},upload:function(e){var o,d,r;if(e.preventDefault(),!_||!_.media)return!1;o=P(this).prev("input"),d=P(this).nextAll(".tm_upload_image").first().find("img"),(o.data("tm_upload_frame")?o.data("tm_upload_frame"):(e=_.media.controller.Library.extend({defaults:h.defaults({id:"insert-image",title:"Insert Image Url",allowLocalEdits:!0,displaySettings:!0,displayUserSettings:!0,multiple:!0,type:"image"},_.media.controller.Library.prototype.defaults)}),(r=_.media({button:{text:"Select"},state:"insert-image",states:[new e]})).on("close",function(){}),r.on("select",function(){var l=r.state("insert-image"),e=l.get("selection");e&&(d.attr("src",""),o.val(""),e.each(function(e){var i,n=l.display(e).toJSON(),t=e.toJSON(),a=t.caption;_.media.view.settings.captions||delete t.caption,n=_.media.string.props(n,t),i={id:t.id,post_content:t.description,post_excerpt:a},n.linkUrl&&(i.url=n.linkUrl),"image"===t.type?(h.each({align:"align",size:"image-size",alt:"image_alt"},function(e,t){n[t]&&(i[e]=n[t])}),i["image-size"]&&e.attributes.sizes[i["image-size"]]&&(i.url=e.attributes.sizes[i["image-size"]].url)):i.post_title=n.title,d.attr("src",i.url),o.val(i.url)}))}),r.on("open",function(){var e=r.state().get("library").toJSON(),a=!0;P.each(e,function(e,i){var n;i.url===o.val()?(n=_.media.attachment(i.id),r.state().get("selection").add(n?[n]:[]),P(".attachment-display-settings").find("select.size").val("full"),a=!1):i.sizes&&P.each(i.sizes,function(e,t){t.url===o.val()&&(n=_.media.attachment(i.id),r.state().get("selection").add(n?[n]:[]),P(".attachment-display-settings").find("select.size").val(e),a=!1)}),a&&P(".attachment-display-settings").find("select.size").val("full")})}),o.data("tm_upload_frame",r),r)).open()},populatePriceVariables:function(e,t,i){var n,a,l=P.epoAPI.util.deepCopyArray(w.map(function(e,n){return e.fields.map(function(e,t){var i=e.find(function(e){return"element_type"===e.id});return i.default&&(i=i.default),e=(e=e.filter(function(e){return null!==e}).find(function(e){return e.id===i+"_uniqid"}))&&e.default,{sectionIndex:n,fieldIndex:t,uniqid:e,type:i}})})),o=P(".tm-element-uniqid").attr("data-uniqid"),d=P('<h4 class="tc-var-header">'+g.i18n_formula_product_variables+"</h4>");e.append(d),d=P('<ul class="tc-var-list product"></ul>'),e.append(d),t||i||d.append('<li class="tc-var-field" data-value="{quantity}"><span>'+g.i18n_formula_quantity+"</span></li>"),d.append('<li class="tc-var-field" data-value="{product_price}"><span>'+g.i18n_formula_product_price+"</span></li>"),t||i||d.append('<li class="tc-var-field" data-value="{dynamic_product_price}"><span>'+g.i18n_formula_dynamic_product_price+"</span></li>"),t||(d=P('<h4 class="tc-var-header">'+g.i18n_formula_special_variables+"</h4>"),e.append(d),d=P('<ul class="tc-var-list product"></ul>'),e.append(d),d.append('<li class="tc-var-field" data-value="{options_total}"><span>'+g.i18n_formula_options_total+"</span></li>"),d.append('<li class="tc-var-field" data-value="{product_price_plus_options_total}"><span>'+g.i18n_formula_product_price_plus_options_total+"</span></li>"),d.append('<li class="tc-var-field" data-value="{cumulative_total}"><span>'+g.i18n_formula_cumulative_total+"</span></li>"),d.append('<li class="tc-var-field" data-value="{product_price_plus_cumulative_total}"><span>'+g.i18n_product_price_plus_cumulative_total+"</span></li>")),t||i||(d=P('<h4 class="tc-var-header">'+g.i18n_formula_this_element+"</h4>"),e.append(d),d=P('<ul class="tc-var-list this"></ul>'),e.append(d),d.append('<li class="tc-var-field" data-value="{this.value}"><span>'+g.i18n_formula_this_value+"</span></li>"),d.append('<li class="tc-var-field" data-value="{this.value.length}"><span>'+g.i18n_formula_this_value_length+"</span></li>"),d.append('<li class="tc-var-field" data-value="{this.count}"><span>'+g.i18n_formula_this_count+"</span></li>"),d.append('<li class="tc-var-field" data-value="{this.count.quantity}"><span>'+g.i18n_formula_this_count_quantity+"</span></li>"),d.append('<li class="tc-var-field" data-value="{this.quantity}"><span>'+g.i18n_formula_this_quantity+"</span></li>")),l.length&&(d=P('<h4 class="tc-var-header">'+g.i18n_formula_other_elements+"</h4>"),e.append(d),d=P('<div class="tc-clearfix tm-epo-switch-wrapper"><div class="formula-field-mode-selector"><input checked="checked" name="formulamode" class="formula-field-mode" id="formulafieldmode0" value="price" type="radio"><label for="formulafieldmode0"><span title="'+g.i18n_formula_field_price_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_price+'</span></label><input name="formulamode" class="formula-field-mode" id="formulafieldmode1" value="value" type="radio"><label for="formulafieldmode1"><span title="'+g.i18n_formula_field_value_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_value+'</span></label><input name="formulamode" class="formula-field-mode" id="formulafieldmode4" value="text" type="radio"><label for="formulafieldmode4"><span title="'+g.i18n_formula_field_text_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_text+'</span></label><input name="formulamode" class="formula-field-mode" id="formulafieldmode5" value="text.length" type="radio"><label for="formulafieldmode5"><span title="'+g.i18n_formula_field_text_length_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_text_length+'</span></label><input name="formulamode" class="formula-field-mode" id="formulafieldmode2"  value="quantity" type="radio"><label for="formulafieldmode2"><span title="'+g.i18n_formula_field_quantity_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_quantity+'</span></label><input name="formulamode" class="formula-field-mode" id="formulafieldmode3" value="count" type="radio"><label for="formulafieldmode3"><span title="'+g.i18n_formula_field_count_tip+'" class="tm-tooltip tc-radio-text">'+g.i18n_formula_field_count+"</span></label></div></div>"),e.append(d),d=P('<ul class="tc-var-list other"></ul>'),e.append(d),l.forEach(function(e){e.forEach(function(e){e.uniqid!==o&&void 0!==e.uniqid&&(n=P.tmEPOAdmin.getFieldValue(w[e.sectionIndex].fields[e.fieldIndex],"internal_name",e.type),a=P.tmEPOAdmin.getFieldValue(w[e.sectionIndex].fields[e.fieldIndex],"header_title",e.type),"product"!==e.type)&&"dynamic"!==e.type&&(n=n+(a=""!==(a=void 0===a?"":a)?" ("+a+")":a),d.append('<li title="'+e.uniqid+'" class="tc-var-field" data-value="{field.'+e.uniqid+'.price}"><span>'+n+"</span></li>"))})})),P.tcToolTip(e.find(".tm-tooltip"))}},P(function(){v=P.epoAPI.applyFilter("tc_adjust_admin_template_engine",v),s=d.woocommerce_admin,c=d.tinyMCEPreInit,m=d.QTags,u=d.quicktags,p=d.tinyMCE,e=d.TMEPOOPTIONSJS.data,n=d.wc_enhanced_select_params,void 0!==(w=P.epoAPI.util.deepCopyArray(e))&&w||(w=[]),P.tmEPOAdmin.initialitize(),P.tcToolTip(),a&&P(".tc-admin-extra-product-options_tab").on("click.cpf",function(){P.tmEPOAdmin.makeResizables(P(".builder-wrapper")),P.tmEPOAdmin.makeResizables(P(".bitem")),P(this).off("click.cpf")})})}(window,document,window.jQuery);assets/js/admin/jquery.tcpagination.js000064400000015667150755142450014135 0ustar00/*
 * jQuery Pagination plugin
 *
 * Based on jQuery pagination plugin
 * http://josecebe.github.io/pagination/
 *
 * Copyright 2014-2018, Eugene Simakin
 * Released under Apache 2.0 license
 * http://apache.org/licenses/LICENSE-2.0.html
 *
 * Modified for Extra Product Options
 */

( function( $ ) {
	'use strict';

	var Pagination = function( dom, options ) {
		var tagName;
		var newdom;
		var newTag;

		this.element = $( dom );
		this.mainElement = this.element;
		this.settings = $.extend( {}, $.fn.tcPagination.defaults, options );

		this.settings.totalPages = parseInt( this.settings.totalPages, 10 );
		if ( ! Number.isFinite( this.settings.totalPages ) ) {
			this.settings.totalPages = 0;
		}

		if ( this.settings.startPage < 1 || this.settings.startPage > this.settings.totalPages ) {
			this.settings.startPage = 1;
		}

		this.settings.visiblePages = parseInt( this.settings.visiblePages, 10 );
		if ( ! Number.isFinite( this.settings.visiblePages ) ) {
			this.settings.visiblePages = 5;
		}

		if ( typeof this.settings.onPageClick === 'function' ) {
			this.element.first().on( 'page', this.settings.onPageClick );
		}

		if ( this.settings.totalPages === 1 ) {
			this.element.trigger( 'page', 1 );
			return this;
		}

		tagName = this.element.prop( 'tagName' );

		if ( tagName === 'UL' ) {
			this.listContainer = this.element;
		} else {
			newdom = $( [] );
			this.element.toArray().forEach( function( el ) {
				newTag = $( '<ul></ul>' );
				$( el ).append( newTag );
				newdom.push( newTag[ 0 ] );
			} );
			this.listContainer = newdom;
			this.element = newdom;
		}

		this.show( this.settings.startPage );

		return this;
	};

	Pagination.prototype = {
		constructor: Pagination,

		destroy: function() {
			this.element.empty();
			this.mainElement.removeData( 'tc-pagination' );
			this.element.off( 'page' );

			return this;
		},

		show: function( page ) {
			var pages;

			if ( page < 1 || page > this.settings.totalPages ) {
				return pages;
			}
			this.currentPage = page;

			this.element.trigger( 'beforePage', page );

			pages = this.getPages( page );
			this.render( pages );
			this.setupEvents();

			this.element.trigger( 'page', page );

			return pages;
		},

		buildListItems: function( pages ) {
			var listItems = [];
			var prev;
			var next;
			var _this = this;

			if ( this.settings.first ) {
				listItems.push( this.buildItem( 'first', 1 ) );
			}

			if ( this.settings.prev ) {
				if ( pages.currentPage > 1 ) {
					prev = parseInt( pages.currentPage, 10 ) - 1;
				} else {
					prev = 1;
				}

				listItems.push( this.buildItem( 'prev', prev ) );
			}

			pages.numeric.forEach( function( page ) {
				listItems.push( _this.buildItem( 'page', page ) );
			} );

			if ( this.settings.next ) {
				if ( pages.currentPage < this.settings.totalPages ) {
					next = parseInt( pages.currentPage, 10 ) + 1;
				} else {
					next = this.settings.totalPages;
				}

				listItems.push( this.buildItem( 'next', next ) );
			}

			if ( this.settings.last ) {
				listItems.push( this.buildItem( 'last', this.settings.totalPages ) );
			}

			return listItems;
		},

		buildItem: function( type, page ) {
			var $itemContainer = $( '<li></li>' );
			var $itemContent = $( '<a></a>' );
			var itemText;

			if ( this.settings[ type ] ) {
				itemText = this.settings[ type ];
			} else {
				itemText = page;
			}
			$itemContainer.addClass( this.settings[ type + 'Class' ] );
			$itemContainer.data( 'page', page );
			$itemContainer.data( 'page-type', type );
			$itemContainer.append( $itemContent.attr( 'href', '#' ).html( itemText ) );

			return $itemContainer;
		},

		getPages: function( currentPage ) {
			var pages = [];
			var half = Math.floor( parseInt( this.settings.visiblePages, 10 ) / 2 );
			var start = parseInt( currentPage, 10 ) - half + 1 - ( parseInt( this.settings.visiblePages, 10 ) % 2 );
			var end = currentPage + half;
			var visiblePages = this.settings.visiblePages;
			var itPage;

			if ( visiblePages > this.settings.totalPages ) {
				visiblePages = this.settings.totalPages;
			}

			if ( start <= 0 ) {
				start = 1;
				end = visiblePages;
			}
			if ( end > this.settings.totalPages ) {
				start = parseInt( this.settings.totalPages, 10 ) - parseInt( visiblePages, 10 ) + 1;
				end = this.settings.totalPages;
			}

			itPage = start;
			while ( itPage <= end ) {
				pages.push( itPage );
				itPage = parseInt( itPage, 10 ) + 1;
			}

			return { currentPage: currentPage, numeric: pages };
		},

		render: function( pages ) {
			var _this = this;
			var items;
			var $this;
			var pageType;

			this.listContainer.children().remove();
			items = this.buildListItems( pages );

			items.forEach( function( item ) {
				_this.listContainer.append( item );
			} );

			this.listContainer.children().each( function() {
				$this = $( this );
				pageType = $this.data( 'page-type' );

				switch ( pageType ) {
					case 'page':
						if ( $this.data( 'page' ) === pages.currentPage ) {
							$this.addClass( _this.settings.activeClass );
						}
						break;
					case 'first':
						$this.toggleClass( _this.settings.disabledClass, pages.currentPage === 1 );
						break;
					case 'last':
						$this.toggleClass( _this.settings.disabledClass, pages.currentPage === _this.settings.totalPages );
						break;
					case 'prev':
						$this.toggleClass( _this.settings.disabledClass, pages.currentPage === 1 );
						break;
					case 'next':
						$this.toggleClass( _this.settings.disabledClass, pages.currentPage === _this.settings.totalPages );
						break;
				}
			} );
		},

		setupEvents: function() {
			var _this = this;

			this.listContainer.off( 'click' ).on( 'click', 'li', function( evt ) {
				var $this = $( this );

				if ( $this.hasClass( _this.settings.disabledClass ) || $this.hasClass( _this.settings.activeClass ) ) {
					return false;
				}

				evt.preventDefault();
				_this.show( parseInt( $this.data( 'page' ), 10 ) );
			} );
		}
	};

	$.fn.tcPagination = function( option ) {
		var methodReturn;
		var $this = $( this );
		var data = $this.data( 'tc-pagination' );
		var options;
		var ret;

		if ( typeof option === 'object' ) {
			options = option;
		} else {
			options = {};
		}

		if ( ! data ) {
			data = new Pagination( this, options );
			$this.data( 'tc-pagination', data );
		}

		if ( typeof option === 'string' ) {
			methodReturn = data[ option ].apply( data, [] );
		}

		if ( methodReturn === undefined ) {
			ret = $this;
		} else {
			ret = methodReturn;
		}

		return ret;
	};

	$.fn.tcPagination.defaults = {
		totalPages: 0,
		startPage: 1,
		visiblePages: 5,
		onPageClick: null,
		page: null,
		first: '<i class="tcfa tcfa-angle-double-left"></i>',
		prev: '<i class="tcfa tcfa-angle-left"></i>',
		next: '<i class="tcfa tcfa-angle-right"></i>',
		last: '<i class="tcfa tcfa-angle-double-right"></i>',
		nextClass: 'next',
		prevClass: 'prev',
		lastClass: 'last',
		firstClass: 'first',
		pageClass: 'page',
		activeClass: 'active',
		disabledClass: 'disabled'
	};

	$.fn.tcPagination.Constructor = Pagination;
}( window.jQuery ) );
assets/js/admin/tc-js-admin-builder-templates.php000064400000002622150755142450016023 0ustar00<?php
/**
 * The admin javascript-based template for the builder mode
 *
 * NOTE that this file is not meant to be overriden
 *
 * @see     https://codex.wordpress.org/Javascript_Reference/wp.template
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 4.8.5
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! function_exists( 'THEMECOMPLETE_EPO_ADMIN_BUILDER' ) || ! function_exists( 'THEMECOMPLETE_EPO_ADMIN_GLOBAL' ) || ! function_exists( 'THEMECOMPLETE_EPO_WPML' ) ) {
	return;
}

global $post;

if ( ! $post ) {

	if ( THEMECOMPLETE_EPO_ADMIN_GLOBAL()->post !== false ) {
		$the_post = THEMECOMPLETE_EPO_ADMIN_GLOBAL()->post;
	} else {
		return;
	}
} else {
	$the_post = $post;
}

$basetype = THEMECOMPLETE_EPO_ADMIN_GLOBAL()->basetype;
if ( false === $basetype ) {
	$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
}

$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $the_post->ID, $the_post->post_type, $basetype );

// The template_elements and template_section_elements functions contain HTML code generated internally.
?>
<script class="tm-hidden" type="text/template" id="tmpl-tc-builder-elements"><?php THEMECOMPLETE_EPO_ADMIN_BUILDER()->template_elements(); ?></script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-builder-section"><?php THEMECOMPLETE_EPO_ADMIN_BUILDER()->template_section_elements( $wpml_is_original_product ); ?></script>
assets/js/jquery.resizestop.js000064400000005036150755142450012561 0ustar00/**
 * jquery.resizestop (and resizestart)
 * by: Fatih Kadir Akın
 * https://github.com/f/jquery.resizestop
 * License is CC0, published to the public domain.
 * @param {jQuery} $
 */
// Used by datepicker when position is top or bottom of the screen
( function( $ ) {
	'use strict';
	// Slice shortcut
	var slice = Array.prototype.slice;

	// Special event definition
	$.extend( $.event.special, {
		// resize stop special event.
		resizestop: {
			add: function( handle ) {
				// shortcut to the event handler.
				var handler = handle.handler;

				// event modifying
				$( this ).on( 'resize', function( e ) {
					var _proxy;
					// every resize event clears handler's timer.
					// and every handler must have a timer.
					clearTimeout( handler._timer );
					// change event type text.
					e.type = 'resizestop';
					// push the "resize" event to the handler.
					_proxy = $.proxy( handler, this, e );
					// if no resize event fired for a time that we decide,
					// then it means its stopped.
					handler._timer = setTimeout( _proxy, handle.data || 200 );
				} );
			}
		},
		// resize start special event
		resizestart: {
			add: function( handle ) {
				// shortcut to the event handler.
				var handler = handle.handler;

				// event modifying
				$( this ).on( 'resize', function( e ) {
					// every resize event clears handler's timer.
					// and every handler must have a timer.
					clearTimeout( handler._timer );
					// we suddenly fire the event, then we can put
					// a flag with name _started knows if it's already fired.
					if ( ! handler._started ) {
						e.type = 'resizestart';
						handler.apply( this, arguments );
						// after firing the handler, put the flag with the value "true"
						handler._started = true;
					}
					handler._timer = setTimeout(
						$.proxy( function() {
							// after a while, it will make the flag false.
							handler._started = false;
						}, this ),
						handle.data || 300
					);
				} );
			}
		}
	} );
	// binding and currying the shortcuts.
	$.extend( $.fn, {
		// $(window).resizestop instead of $(window).on('resizestop')
		resizestop: function() {
			// will push the "resizestop" argument at the beginning of arguments
			$( this ).on.apply( this, [ 'resizestop' ].concat( slice.call( arguments ) ) );
		},
		// $(window).resizestart instead of $(window).on('resizestart')
		resizestart: function() {
			// will push the "resizestart" argument at the beginning of arguments
			$( this ).on.apply( this, [ 'resizestart' ].concat( slice.call( arguments ) ) );
		}
	} );
}( window.jQuery ) );
assets/js/tm-timepicker.js000064400000243673150755142450011621 0ustar00/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20
 * http://trentrichardson.com/examples/timepicker
 * Modified version of jQuery Timepicker
 * Copyright (c) 2016 Trent Richardson; Licensed MIT */
( function( factory ) {
	'use strict';
	if ( typeof window.define === 'function' && window.define.amd ) {
		window.define( [ 'jquery', 'jquery-ui' ], factory );
	} else {
		factory( window.jQuery );
	}
}( function( $ ) {
	'use strict';

	/*
	 * jQuery extend now ignores nulls!
	 */
	var extendRemove = function( target, props ) {
		var name;
		$.extend( target, props );
		for ( name in props ) {
			if ( props[ name ] === null || props[ name ] === undefined ) {
				target[ name ] = props[ name ];
			}
		}
		return target;
	};

	/*
	 * jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,
	 * it will return false for all objects
	 */
	var isEmptyObject = function( obj ) {
		var prop;
		for ( prop in obj ) {
			if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
				return false;
			}
		}
		return true;
	};

	/*
	 * Determine by the time format which units are supported
	 * Returns an object of booleans for each unit
	 */
	var detectSupport = function( timeFormat ) {
		var tf = timeFormat.replace( /'.*?'/g, '' ).toLowerCase(), // removes literals
			isIn = function( f, t ) {
				// does the format contain the token?
				return f.indexOf( t ) !== -1 ? true : false;
			};
		return {
			hour: isIn( tf, 'h' ),
			minute: isIn( tf, 'm' ),
			second: isIn( tf, 's' ),
			millisec: isIn( tf, 'l' ),
			microsec: isIn( tf, 'c' ),
			timezone: isIn( tf, 'z' ),
			ampm: isIn( tf, 't' ) && isIn( timeFormat, 'h' ),
			iso8601: isIn( timeFormat, 'Z' )
		};
	};

	/*
	 * Converts 24 hour format into 12 hour
	 * Returns 12 hour without leading 0
	 */
	var convert24to12 = function( hour ) {
		hour %= 12;

		if ( hour === 0 ) {
			hour = 12;
		}

		return String( hour );
	};

	var computeEffectiveSetting = function( settings, property ) {
		return settings && settings[ property ] ? settings[ property ] : $.tm_timepicker._defaults[ property ];
	};

	/*
	 * Splits datetime string into date and time substrings.
	 * Throws exception when date can't be parsed
	 * Returns {dateString: dateString, timeString: timeString}
	 */
	var splitDateTime = function( dateTimeString, timeSettings ) {
		// The idea is to get the number separator occurrences in datetime and the time format requested (since time has
		// fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.
		var separator = computeEffectiveSetting( timeSettings, 'separator' ),
			format = computeEffectiveSetting( timeSettings, 'timeFormat' ),
			timeParts = format.split( separator ), // how many occurrences of separator may be in our format?
			timePartsLen = timeParts.length,
			allParts = dateTimeString.split( separator ),
			allPartsLen = allParts.length;

		if ( allPartsLen > 1 ) {
			return {
				dateString: allParts.splice( 0, allPartsLen - timePartsLen ).join( separator ),
				timeString: allParts.splice( 0, timePartsLen ).join( separator )
			};
		}

		return {
			dateString: dateTimeString,
			timeString: ''
		};
	};

	/*
	 * Internal function to parse datetime interval
	 * Returns: {date: Date, timeObj: Object}, where
	 *   date - parsed date without time (type Date)
	 *   timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional
	 */
	var parseDateTimeInternal = function( dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings ) {
		var date, parts, parsedTime;

		parts = splitDateTime( dateTimeString, timeSettings );
		date = $.tm_datepicker._base_parseDate( dateFormat, parts.dateString, dateSettings );

		if ( parts.timeString === '' ) {
			return {
				date: date
			};
		}

		parsedTime = $.tm_datepicker.parseTime( timeFormat, parts.timeString, timeSettings );

		if ( ! parsedTime ) {
			throw 'Wrong time format';
		}

		return {
			date: date,
			timeObj: parsedTime
		};
	};

	/*
	 * Internal function to set timezone_select to the local timezone
	 */
	var selectLocalTimezone = function( tp_inst, date ) {
		var now;
		if ( tp_inst && tp_inst.timezone_select ) {
			now = date || new Date();
			tp_inst.timezone_select.val( -now.getTimezoneOffset() );
		}
	};

	/*
	 * Timepicker manager.
	 * Use the singleton instance of this class, $.tm_timepicker, to interact with the time picker.
	 * Settings for (groups of) time pickers are maintained in an instance object,
	 * allowing multiple different settings on the same page.
	 */
	var Timepicker = function() {
		this.regional = []; // Available regional settings, indexed by language code
		this.regional[ '' ] = {
			// Default regional settings
			currentText: 'Now',
			closeText: 'Done',
			amNames: [ 'AM', 'A' ],
			pmNames: [ 'PM', 'P' ],
			timeFormat: 'HH:mm',
			timeSuffix: '',
			timeOnlyTitle: 'Choose Time',
			timeText: 'Time',
			hourText: 'Hour',
			minuteText: 'Minute',
			secondText: 'Second',
			millisecText: 'Millisecond',
			microsecText: 'Microsecond',
			timezoneText: 'Time Zone',
			isRTL: false
		};
		this._defaults = {
			// Global defaults for all the datetime picker instances
			showButtonPanel: true,
			timeOnly: false,
			timeOnlyShowDate: false,
			showHour: null,
			showMinute: null,
			showSecond: null,
			showMillisec: null,
			showMicrosec: null,
			showTimezone: null,
			showTime: true,
			stepHour: 1,
			stepMinute: 1,
			stepSecond: 1,
			stepMillisec: 1,
			stepMicrosec: 1,
			hour: 0,
			minute: 0,
			second: 0,
			millisec: 0,
			microsec: 0,
			timezone: null,
			hourMin: 0,
			minuteMin: 0,
			secondMin: 0,
			millisecMin: 0,
			microsecMin: 0,
			hourMax: 23,
			minuteMax: 59,
			secondMax: 59,
			millisecMax: 999,
			microsecMax: 999,
			minDateTime: null,
			maxDateTime: null,
			maxTime: null,
			minTime: null,
			onSelect: null,
			hourGrid: 0,
			minuteGrid: 0,
			secondGrid: 0,
			millisecGrid: 0,
			microsecGrid: 0,
			alwaysSetTime: true,
			separator: ' ',
			altFieldTimeOnly: true,
			altTimeFormat: null,
			altSeparator: null,
			altTimeSuffix: null,
			altRedirectFocus: true,
			pickerTimeFormat: null,
			pickerTimeSuffix: null,
			showTimepicker: true,
			timezoneList: null,
			addSliderAccess: false,
			sliderAccessArgs: null,
			controlType: 'slider',
			oneLine: false,
			defaultValue: null,
			parse: 'strict',
			afterInject: null
		};
		$.extend( this._defaults, this.regional[ '' ] );
	};

	/*
	 * Lets not redefine tm_timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
	 */
	$.ui.tm_timepicker = $.ui.tm_timepicker || {};
	if ( $.ui.tm_timepicker.version ) {
		return;
	}

	/*
	 * Extend jQueryUI, get it started with our version number
	 */
	$.extend( $.ui, {
		tm_timepicker: {
			version: '1.6.3'
		}
	} );

	$.extend( Timepicker.prototype, {
		$input: null,
		$altInput: null,
		$timeObj: null,
		inst: null,
		hour_slider: null,
		minute_slider: null,
		second_slider: null,
		millisec_slider: null,
		microsec_slider: null,
		timezone_select: null,
		maxTime: null,
		minTime: null,
		hour: 0,
		minute: 0,
		second: 0,
		millisec: 0,
		microsec: 0,
		timezone: null,
		hourMinOriginal: null,
		minuteMinOriginal: null,
		secondMinOriginal: null,
		millisecMinOriginal: null,
		microsecMinOriginal: null,
		hourMaxOriginal: null,
		minuteMaxOriginal: null,
		secondMaxOriginal: null,
		millisecMaxOriginal: null,
		microsecMaxOriginal: null,
		ampm: '',
		formattedDate: '',
		formattedTime: '',
		formattedDateTime: '',
		timezoneList: null,
		units: [ 'hour', 'minute', 'second', 'millisec', 'microsec' ],
		support: {},
		control: null,

		/*
		 * Override the default settings for all instances of the time picker.
		 * @param  {Object} settings  object - the new settings to use as defaults (anonymous object)
		 * @return {Object} the manager object
		 */
		setDefaults: function( settings ) {
			extendRemove( this._defaults, settings || {} );
			return this;
		},

		/*
		 * Create a new Timepicker instance
		 */
		_newInst: function( $input, opts ) {
			var tp_inst = new Timepicker(),
				inlineSettings = {},
				fns = {},
				overrides,
				i;
			var attrName;
			var attrValue;
			var timezoneList;
			var tzl;
			var tzi = 0;
			var tzv = null;

			for ( attrName in this._defaults ) {
				if ( Object.prototype.hasOwnProperty.call( this._defaults, attrName ) ) {
					attrValue = $input.attr( 'data-' + attrName );
					if ( attrValue ) {
						inlineSettings[ attrName ] = attrValue;
					}
				}
			}

			overrides = {
				beforeShow: function( input, dp_inst ) {
					if ( typeof tp_inst._defaults.evnts.beforeShow === 'function' ) {
						return tp_inst._defaults.evnts.beforeShow.call( $input[ 0 ], input, dp_inst, tp_inst );
					}
				},
				onChangeMonthYear: function( year, month, dp_inst ) {
					// Update the time as well : this prevents the time from disappearing from the $input field.
					// tp_inst._updateDateTime(dp_inst);
					if ( typeof tp_inst._defaults.evnts.onChangeMonthYear === 'function' ) {
						tp_inst._defaults.evnts.onChangeMonthYear.call( $input[ 0 ], year, month, dp_inst, tp_inst );
					}
				},
				onClose: function( dateText, dp_inst ) {
					if ( tp_inst.timeDefined === true && $input.val() !== '' ) {
						tp_inst._updateDateTime( dp_inst );
					}
					if ( typeof tp_inst._defaults.evnts.onClose === 'function' ) {
						tp_inst._defaults.evnts.onClose.call( $input[ 0 ], dateText, dp_inst, tp_inst );
					}
				}
			};
			for ( i in overrides ) {
				if ( Object.prototype.hasOwnProperty.call( overrides, i ) ) {
					fns[ i ] = opts[ i ] || this._defaults[ i ] || null;
				}
			}

			tp_inst._defaults = $.extend( {}, this._defaults, inlineSettings, opts, overrides, {
				evnts: fns,
				tm_timepicker: tp_inst // add tm_timepicker as a property of tm_datepicker: $.tm_datepicker._get(dp_inst, 'tm_timepicker');
			} );
			tp_inst.amNames = $.map( tp_inst._defaults.amNames, function( val ) {
				return val.toUpperCase();
			} );
			tp_inst.pmNames = $.map( tp_inst._defaults.pmNames, function( val ) {
				return val.toUpperCase();
			} );

			// detect which units are supported
			tp_inst.support = detectSupport( tp_inst._defaults.timeFormat + ( tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '' ) + ( tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '' ) );

			// controlType is string - key to our this._controls
			if ( typeof tp_inst._defaults.controlType === 'string' ) {
				if ( tp_inst._defaults.controlType === 'slider' && typeof $.ui.slider === 'undefined' ) {
					tp_inst._defaults.controlType = 'select';
				}
				tp_inst.control = tp_inst._controls[ tp_inst._defaults.controlType ];
			} else {
				// controlType is an object and must implement create, options, value methods
				tp_inst.control = tp_inst._defaults.controlType;
			}

			// prep the timezone options
			timezoneList = [ -720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840 ];
			if ( tp_inst._defaults.timezoneList !== null ) {
				timezoneList = tp_inst._defaults.timezoneList;
			}
			tzl = timezoneList.length;

			if ( tzl > 0 && typeof timezoneList[ 0 ] !== 'object' ) {
				for ( ; tzi < tzl; tzi += 1 ) {
					tzv = timezoneList[ tzi ];
					timezoneList[ tzi ] = {
						value: tzv,
						label: $.tm_timepicker.timezoneOffsetString( tzv, tp_inst.support.iso8601 )
					};
				}
			}
			tp_inst._defaults.timezoneList = timezoneList;

			// set the default units
			tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.tm_timepicker.timezoneOffsetNumber( tp_inst._defaults.timezone ) : new Date().getTimezoneOffset() * -1;
			tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
			tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
			tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;
			tp_inst.millisec =
				tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
			tp_inst.microsec =
				tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;
			tp_inst.ampm = '';
			tp_inst.$input = $input;

			if ( tp_inst._defaults.altField ) {
				tp_inst.$altInput = $( tp_inst._defaults.altField );
				if ( tp_inst._defaults.altRedirectFocus === true ) {
					tp_inst.$altInput
						.css( {
							cursor: 'pointer'
						} )
						.on( 'focus', function() {
							$input.trigger( 'focus' );
						} );
				}
			}

			if ( tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0 ) {
				tp_inst._defaults.minDate = new Date();
			}
			if ( tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0 ) {
				tp_inst._defaults.maxDate = new Date();
			}

			// tm_datepicker needs minDate/maxDate, tm_timepicker needs minDateTime/maxDateTime..
			if ( tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date ) {
				tp_inst._defaults.minDateTime = new Date( tp_inst._defaults.minDate.getTime() );
			}
			if ( tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date ) {
				tp_inst._defaults.minDate = new Date( tp_inst._defaults.minDateTime.getTime() );
			}
			if ( tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date ) {
				tp_inst._defaults.maxDateTime = new Date( tp_inst._defaults.maxDate.getTime() );
			}
			if ( tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date ) {
				tp_inst._defaults.maxDate = new Date( tp_inst._defaults.maxDateTime.getTime() );
			}
			tp_inst.$input.on( 'focus', function() {
				tp_inst._onFocus();
			} );

			tp_inst.$input.next( '.ui-tm-timepicker-trigger' ).on( 'click', function() {
				tp_inst._onFocus();
				/*if ( $.tm_datepicker._datepickerShowing && $.tm_datepicker._lastInput === input[ 0 ] ) {
                 $.tm_datepicker._hideDatepicker();
                 } else if ( $.tm_datepicker._datepickerShowing && $.tm_datepicker._lastInput !== input[ 0 ] ) {
                 $.tm_datepicker._hideDatepicker();
                 $.tm_datepicker._showDatepicker( input[ 0 ] );
                 } else {
                 $.tm_datepicker._showDatepicker( input[ 0 ] );
                 }*/
				return false;
			} );

			return tp_inst;
		},

		/*
		 * add our sliders to the calendar
		 */
		_addTimePicker: function( dp_inst ) {
			var currDT = $.epoAPI.util.trim( this.$altInput && this._defaults.altFieldTimeOnly ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val() );

			this.timeDefined = this._parseTime( currDT );
			this._limitMinMaxDateTime( dp_inst, false );
			this._injectTimePicker();
			this._afterInject();
		},

		/*
		 * parse the time string from input value or _setTime
		 */
		_parseTime: function( timeString, withDate ) {
			var dp_dateFormat;
			var parseRes;
			var timeObj;

			if ( ! this.inst ) {
				this.inst = $.tm_datepicker._getInst( this.$input[ 0 ] );
			}

			if ( withDate || ! this._defaults.timeOnly ) {
				dp_dateFormat = $.tm_datepicker._get( this.inst, 'dateFormat' );
				try {
					parseRes = parseDateTimeInternal( dp_dateFormat, this._defaults.timeFormat, timeString, $.tm_datepicker._getFormatConfig( this.inst ), this._defaults );
					if ( ! parseRes.timeObj ) {
						return false;
					}
					$.extend( this, parseRes.timeObj );
				} catch ( err ) {
					$.tm_timepicker.log( 'Error parsing the date/time string: ' + err + '\ndate/time string = ' + timeString + '\ntimeFormat = ' + this._defaults.timeFormat + '\ndateFormat = ' + dp_dateFormat );
					return false;
				}
				return true;
			}
			timeObj = $.tm_datepicker.parseTime( this._defaults.timeFormat, timeString, this._defaults );
			if ( ! timeObj ) {
				return false;
			}
			$.extend( this, timeObj );
			return true;
		},

		/*
		 * Handle callback option after injecting tm_timepicker
		 */
		_afterInject: function() {
			var o = this.inst.settings;
			if ( typeof o.afterInject === 'function' ) {
				o.afterInject.call( this );
			}
		},

		_ui_tpicker_onclick: function( event ) {
			var $t = $( event.target ),
				h = $t.html(),
				n = parseInt( h.replace( /[^0-9]/g ), 10 ),
				ap = h.replace( /[^apm]/gi ),
				f = $t.data( 'for' ); // loses scope, so we use data-for

			if ( f === 'hour' ) {
				if ( ap.indexOf( 'p' ) !== -1 && n < 12 ) {
					n += 12;
				} else if ( ap.indexOf( 'a' ) !== -1 && n === 12 ) {
					n = 0;
				}
			}

			event.data.tp_inst.control.value( event.data.tp_inst, event.data.tp_inst[ f + '_slider' ], event.data.litem, n );

			event.data.tp_inst._onTimeChange();
			event.data.tp_inst._onSelectHandler();
		},
		/*
		 * generate and inject html for tm_timepicker into ui tm_datepicker
		 */
		_injectTimePicker: function() {
			var $dp = this.inst.dpDiv,
				o = this.inst.settings,
				tp_inst = this,
				litem = '',
				uitem = '',
				show = null,
				max = {},
				gridSize = {},
				size = null,
				i = 0,
				l = 0;
			var noDisplay;
			var html;
			var h;
			var tmph;
			var m;
			var showTz;
			var $tp;
			var local_timezone;
			var $buttonPanel;
			var timeDefined;
			var sliderAccessArgs;
			var rtl;

			// Prevent displaying twice
			if ( $dp.find( 'div.ui-tm-timepicker-div' ).length === 0 && o.showTimepicker ) {
				noDisplay = ' ui_tpicker_unit_hide';
				html =
					'<div class="ui-tm-timepicker-div' +
					( o.isRTL ? ' ui-tm-timepicker-rtl' : '' ) +
					( o.oneLine && o.controlType === 'select' ? ' ui-tm-timepicker-oneLine' : '' ) +
					'"><dl>' +
					'<dt class="ui_tpicker_time_label' +
					( o.showTime ? '' : noDisplay ) +
					'">' +
					o.timeText +
					'</dt>' +
					'<dd class="ui_tpicker_time ' +
					( o.showTime ? '' : noDisplay ) +
					'"><input class="ui_tpicker_time_input" ' +
					( o.timeInput ? '' : 'disabled' ) +
					'></dd>';

				// Create the markup
				for ( i = 0, l = this.units.length; i < l; i += 1 ) {
					litem = this.units[ i ];
					uitem = litem.substring( 0, 1 ).toUpperCase() + litem.substring( 1 );
					show = o[ 'show' + uitem ] !== null ? o[ 'show' + uitem ] : this.support[ litem ];

					// Added by Peter Medeiros:
					// - Figure out what the hour/minute/second max should be based on the step values.
					// - Example: if stepMinute is 15, then minMax is 45.
					max[ litem ] = parseInt( o[ litem + 'Max' ] - ( ( o[ litem + 'Max' ] - o[ litem + 'Min' ] ) % o[ 'step' + uitem ] ), 10 );
					gridSize[ litem ] = 0;

					html +=
						'<dt class="ui_tpicker_' +
						litem +
						'_label' +
						( show ? '' : noDisplay ) +
						'">' +
						o[ litem + 'Text' ] +
						'</dt>' +
						'<dd class="ui_tpicker_' +
						litem +
						( show ? '' : noDisplay ) +
						'"><div class="ui_tpicker_' +
						litem +
						'_slider' +
						( show ? '' : noDisplay ) +
						'"></div>';

					if ( show && o[ litem + 'Grid' ] > 0 ) {
						html += '<div><table class="ui-tpicker-grid-label"><tr>';

						if ( litem === 'hour' ) {
							for ( h = o[ litem + 'Min' ]; h <= max[ litem ]; h += parseInt( o[ litem + 'Grid' ], 10 ) ) {
								gridSize[ litem ] += 1;
								tmph = $.tm_datepicker.formatTime( this.support.ampm ? 'hht' : 'HH', { hour: h }, o );
								html += '<td data-for="' + litem + '">' + tmph + '</td>';
							}
						} else {
							for ( m = o[ litem + 'Min' ]; m <= max[ litem ]; m += parseInt( o[ litem + 'Grid' ], 10 ) ) {
								gridSize[ litem ] += 1;
								html += '<td data-for="' + litem + '">' + ( m < 10 ? '0' : '' ) + m + '</td>';
							}
						}

						html += '</tr></table></div>';
					}
					html += '</dd>';
				}

				// Timezone
				showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;
				html += '<dt class="ui_tpicker_timezone_label' + ( showTz ? '' : noDisplay ) + '">' + o.timezoneText + '</dt>';
				html += '<dd class="ui_tpicker_timezone' + ( showTz ? '' : noDisplay ) + '"></dd>';

				// Create the elements from string
				html += '</dl></div>';
				$tp = $( html );

				// if we only want time picker...
				if ( o.timeOnly === true ) {
					$tp.prepend( '<div class="tm-ui-widget-header">' + '<div class="tm-ui-tp-title">' + o.timeOnlyTitle + '</div>' + '</div>' );
					$dp.find( '.tm-ui-dp-inner-container' ).hide();
				}

				// add sliders, adjust grids, add events
				for ( i = 0, l = tp_inst.units.length; i < l; i += 1 ) {
					litem = tp_inst.units[ i ];
					uitem = litem.substring( 0, 1 ).toUpperCase() + litem.substring( 1 );
					show = o[ 'show' + uitem ] !== null ? o[ 'show' + uitem ] : this.support[ litem ];

					// add the slider
					tp_inst[ litem + '_slider' ] = tp_inst.control.create( tp_inst, $tp.find( '.ui_tpicker_' + litem + '_slider' ), litem, tp_inst[ litem ], o[ litem + 'Min' ], max[ litem ], o[ 'step' + uitem ] );

					// adjust the grid and add click event
					if ( show && o[ litem + 'Grid' ] > 0 ) {
						size = ( 100 * gridSize[ litem ] * o[ litem + 'Grid' ] ) / ( max[ litem ] - o[ litem + 'Min' ] );
						$tp.find( '.ui_tpicker_' + litem + ' table' )
							.css( {
								width: size + '%',
								marginLeft: o.isRTL ? '0' : ( size / ( -2 * gridSize[ litem ] ) ) + '%',
								marginRight: o.isRTL ? ( size / ( -2 * gridSize[ litem ] ) ) + '%' : '0',
								borderCollapse: 'collapse'
							} )
							.find( 'td' )
							.on( 'click', { that: this, tp_inst: tp_inst, litem: litem }, this._ui_tpicker_onclick )
							.css( {
								cursor: 'pointer',
								width: ( 100 / gridSize[ litem ] ) + '%',
								textAlign: 'center',
								overflow: 'hidden'
							} );
					} // end if grid > 0
				} // end for loop

				// Add timezone options
				this.timezone_select = $tp.find( '.ui_tpicker_timezone' ).append( '<select></select>' ).find( 'select' );
				$.fn.append.apply(
					this.timezone_select,
					$.map( o.timezoneList, function( val ) {
						return $( '<option />' )
							.val( typeof val === 'object' ? val.value : val )
							.text( typeof val === 'object' ? val.label : val );
					} )
				);
				if ( typeof this.timezone !== 'undefined' && this.timezone !== null && this.timezone !== '' ) {
					local_timezone = new Date( this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12 ).getTimezoneOffset() * -1;
					if ( local_timezone === this.timezone ) {
						selectLocalTimezone( tp_inst );
					} else {
						this.timezone_select.val( this.timezone );
					}
				} else if ( typeof this.hour !== 'undefined' && this.hour !== null && this.hour !== '' ) {
					this.timezone_select.val( o.timezone );
				} else {
					selectLocalTimezone( tp_inst );
				}
				this.timezone_select.on( 'change', function() {
					tp_inst._onTimeChange();
					tp_inst._onSelectHandler();
					tp_inst._afterInject();
				} );
				// End timezone options

				// inject tm_timepicker into tm_datepicker
				$buttonPanel = $dp.find( '.tm-ui-dp-buttonpane' );
				if ( $buttonPanel.length ) {
					$buttonPanel.before( $tp );
				} else {
					$dp.append( $tp );
				}

				this.$timeObj = $tp.find( '.ui_tpicker_time_input' );
				this.$timeObj.on( 'change', function() {
					var timeFormat = tp_inst.inst.settings.timeFormat;
					var parsedTime = $.tm_datepicker.parseTime( timeFormat, this.value );
					var update = new Date();
					if ( parsedTime ) {
						update.setHours( parsedTime.hour );
						update.setMinutes( parsedTime.minute );
						update.setSeconds( parsedTime.second );
						$.datepicker._setTime( tp_inst.inst, update );
					} else {
						this.value = tp_inst.formattedTime;
						this.trigger( 'blur' );
					}
				} );

				if ( this.inst !== null ) {
					timeDefined = this.timeDefined;
					this._onTimeChange();
					this.timeDefined = timeDefined;
				}

				// slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
				if ( this._defaults.addSliderAccess ) {
					sliderAccessArgs = this._defaults.sliderAccessArgs;
					rtl = this._defaults.isRTL;
					sliderAccessArgs.isRTL = rtl;

					setTimeout( function() {
						// fix for inline mode
						var sliderAccessWidth;
						if ( $tp.find( '.ui-slider-access' ).length === 0 ) {
							$tp.find( '.ui-slider:visible' ).sliderAccess( sliderAccessArgs );

							// fix any grids since sliders are shorter
							sliderAccessWidth = $tp.find( '.ui-slider-access:eq(0)' ).outerWidth( true );
							if ( sliderAccessWidth ) {
								$tp.find( 'table:visible' ).each( function() {
									var $g = $( this ),
										oldWidth = $g.outerWidth(),
										oldMarginLeft = $g
											.css( rtl ? 'marginRight' : 'marginLeft' )
											.toString()
											.replace( '%', '' ),
										newWidth = oldWidth - sliderAccessWidth,
										newMarginLeft = ( ( oldMarginLeft * newWidth ) / oldWidth ) + '%',
										css = { width: newWidth, marginRight: 0, marginLeft: 0 };
									css[ rtl ? 'marginRight' : 'marginLeft' ] = newMarginLeft;
									$g.css( css );
								} );
							}
						}
					}, 10 );
				}
				// end slideAccess integration

				tp_inst._limitMinMaxDateTime( this.inst, true );
			}
		},

		/*
		 * This function tries to limit the ability to go outside the
		 * min/max date range
		 */
		_limitMinMaxDateTime: function( dp_inst, adjustSliders ) {
			var o = this._defaults,
				dp_date = new Date( dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay );
			var minDateTime;
			var minDateTimeDate;
			var maxDateTime;
			var maxDateTimeDate;
			var tempMinTime;
			var tempMaxTime;
			var hourMax;
			var minMax;
			var secMax;
			var millisecMax;
			var microsecMax;

			if ( ! this._defaults.showTimepicker ) {
				return;
			} // No time so nothing to check here

			if ( $.tm_datepicker._get( dp_inst, 'minDateTime' ) !== null && $.tm_datepicker._get( dp_inst, 'minDateTime' ) !== undefined && dp_date ) {
				minDateTime = $.tm_datepicker._get( dp_inst, 'minDateTime' );
				minDateTimeDate = new Date( minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0 );

				if ( this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null || this.microsecMinOriginal === null ) {
					this.hourMinOriginal = o.hourMin;
					this.minuteMinOriginal = o.minuteMin;
					this.secondMinOriginal = o.secondMin;
					this.millisecMinOriginal = o.millisecMin;
					this.microsecMinOriginal = o.microsecMin;
				}

				if ( dp_inst.settings.timeOnly || minDateTimeDate.getTime() === dp_date.getTime() ) {
					this._defaults.hourMin = minDateTime.getHours();
					if ( this.hour <= this._defaults.hourMin ) {
						this.hour = this._defaults.hourMin;
						this._defaults.minuteMin = minDateTime.getMinutes();
						if ( this.minute <= this._defaults.minuteMin ) {
							this.minute = this._defaults.minuteMin;
							this._defaults.secondMin = minDateTime.getSeconds();
							if ( this.second <= this._defaults.secondMin ) {
								this.second = this._defaults.secondMin;
								this._defaults.millisecMin = minDateTime.getMilliseconds();
								if ( this.millisec <= this._defaults.millisecMin ) {
									this.millisec = this._defaults.millisecMin;
									this._defaults.microsecMin = minDateTime.getMicroseconds();
								} else {
									if ( this.microsec < this._defaults.microsecMin ) {
										this.microsec = this._defaults.microsecMin;
									}
									this._defaults.microsecMin = this.microsecMinOriginal;
								}
							} else {
								this._defaults.millisecMin = this.millisecMinOriginal;
								this._defaults.microsecMin = this.microsecMinOriginal;
							}
						} else {
							this._defaults.secondMin = this.secondMinOriginal;
							this._defaults.millisecMin = this.millisecMinOriginal;
							this._defaults.microsecMin = this.microsecMinOriginal;
						}
					} else {
						this._defaults.minuteMin = this.minuteMinOriginal;
						this._defaults.secondMin = this.secondMinOriginal;
						this._defaults.millisecMin = this.millisecMinOriginal;
						this._defaults.microsecMin = this.microsecMinOriginal;
					}
				} else {
					this._defaults.hourMin = this.hourMinOriginal;
					this._defaults.minuteMin = this.minuteMinOriginal;
					this._defaults.secondMin = this.secondMinOriginal;
					this._defaults.millisecMin = this.millisecMinOriginal;
					this._defaults.microsecMin = this.microsecMinOriginal;
				}
			}

			if ( $.tm_datepicker._get( dp_inst, 'maxDateTime' ) !== null && $.tm_datepicker._get( dp_inst, 'maxDateTime' ) !== undefined && dp_date ) {
				maxDateTime = $.tm_datepicker._get( dp_inst, 'maxDateTime' );
				maxDateTimeDate = new Date( maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0 );

				if ( this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null || this.millisecMaxOriginal === null ) {
					this.hourMaxOriginal = o.hourMax;
					this.minuteMaxOriginal = o.minuteMax;
					this.secondMaxOriginal = o.secondMax;
					this.millisecMaxOriginal = o.millisecMax;
					this.microsecMaxOriginal = o.microsecMax;
				}

				if ( dp_inst.settings.timeOnly || maxDateTimeDate.getTime() === dp_date.getTime() ) {
					this._defaults.hourMax = maxDateTime.getHours();
					if ( this.hour >= this._defaults.hourMax ) {
						this.hour = this._defaults.hourMax;
						this._defaults.minuteMax = maxDateTime.getMinutes();
						if ( this.minute >= this._defaults.minuteMax ) {
							this.minute = this._defaults.minuteMax;
							this._defaults.secondMax = maxDateTime.getSeconds();
							if ( this.second >= this._defaults.secondMax ) {
								this.second = this._defaults.secondMax;
								this._defaults.millisecMax = maxDateTime.getMilliseconds();
								if ( this.millisec >= this._defaults.millisecMax ) {
									this.millisec = this._defaults.millisecMax;
									this._defaults.microsecMax = maxDateTime.getMicroseconds();
								} else {
									if ( this.microsec > this._defaults.microsecMax ) {
										this.microsec = this._defaults.microsecMax;
									}
									this._defaults.microsecMax = this.microsecMaxOriginal;
								}
							} else {
								this._defaults.millisecMax = this.millisecMaxOriginal;
								this._defaults.microsecMax = this.microsecMaxOriginal;
							}
						} else {
							this._defaults.secondMax = this.secondMaxOriginal;
							this._defaults.millisecMax = this.millisecMaxOriginal;
							this._defaults.microsecMax = this.microsecMaxOriginal;
						}
					} else {
						this._defaults.minuteMax = this.minuteMaxOriginal;
						this._defaults.secondMax = this.secondMaxOriginal;
						this._defaults.millisecMax = this.millisecMaxOriginal;
						this._defaults.microsecMax = this.microsecMaxOriginal;
					}
				} else {
					this._defaults.hourMax = this.hourMaxOriginal;
					this._defaults.minuteMax = this.minuteMaxOriginal;
					this._defaults.secondMax = this.secondMaxOriginal;
					this._defaults.millisecMax = this.millisecMaxOriginal;
					this._defaults.microsecMax = this.microsecMaxOriginal;
				}
			}

			if ( dp_inst.settings.minTime !== null ) {
				tempMinTime = new Date( '01/01/1970 ' + dp_inst.settings.minTime );
				if ( parseFloat( dp_inst.settings.minTime ).toString() === dp_inst.settings.minTime ) {
					tempMinTime = new Date( Date.now() + parseFloat( dp_inst.settings.minTime ) );
				}
				if ( this.hour < tempMinTime.getHours() ) {
					this._defaults.hourMin = tempMinTime.getHours();
					this.hour = this._defaults.hourMin;
					this._defaults.minuteMin = tempMinTime.getMinutes();
					this.minute = this._defaults.minuteMin;
				} else if ( this.hour === tempMinTime.getHours() && this.minute < tempMinTime.getMinutes() ) {
					this._defaults.minuteMin = tempMinTime.getMinutes();
					this.minute = this._defaults.minuteMin;
				} else if ( this._defaults.hourMin < tempMinTime.getHours() ) {
					this._defaults.hourMin = tempMinTime.getHours();
					this._defaults.minuteMin = tempMinTime.getMinutes();
				} else if ( ( this._defaults.hourMin === tempMinTime.getHours() ) === this.hour && this._defaults.minuteMin < tempMinTime.getMinutes() ) {
					this._defaults.minuteMin = tempMinTime.getMinutes();
				} else {
					this._defaults.minuteMin = 0;
				}
			}

			if ( dp_inst.settings.maxTime !== null ) {
				tempMaxTime = new Date( '01/01/1970 ' + dp_inst.settings.maxTime );
				if ( this.hour > tempMaxTime.getHours() ) {
					this._defaults.hourMax = tempMaxTime.getHours();
					this.hour = this._defaults.hourMax;
					this._defaults.minuteMax = tempMaxTime.getMinutes();
					this.minute = this._defaults.minuteMax;
				} else if ( this.hour === tempMaxTime.getHours() && this.minute > tempMaxTime.getMinutes() ) {
					this._defaults.minuteMax = tempMaxTime.getMinutes();
					this.minute = this._defaults.minuteMax;
				} else if ( this._defaults.hourMax > tempMaxTime.getHours() ) {
					this._defaults.hourMax = tempMaxTime.getHours();
					this._defaults.minuteMax = tempMaxTime.getMinutes();
				} else if ( ( this._defaults.hourMax === tempMaxTime.getHours() ) === this.hour && this._defaults.minuteMax > tempMaxTime.getMinutes() ) {
					this._defaults.minuteMax = tempMaxTime.getMinutes();
				} else {
					this._defaults.minuteMax = 59;
				}
			}

			if ( adjustSliders !== undefined && adjustSliders === true ) {
				hourMax = parseInt( this._defaults.hourMax - ( ( this._defaults.hourMax - this._defaults.hourMin ) % this._defaults.stepHour ), 10 );
				minMax = parseInt( this._defaults.minuteMax - ( ( this._defaults.minuteMax - this._defaults.minuteMin ) % this._defaults.stepMinute ), 10 );
				secMax = parseInt( this._defaults.secondMax - ( ( this._defaults.secondMax - this._defaults.secondMin ) % this._defaults.stepSecond ), 10 );
				millisecMax = parseInt( this._defaults.millisecMax - ( ( this._defaults.millisecMax - this._defaults.millisecMin ) % this._defaults.stepMillisec ), 10 );
				microsecMax = parseInt( this._defaults.microsecMax - ( ( this._defaults.microsecMax - this._defaults.microsecMin ) % this._defaults.stepMicrosec ), 10 );

				if ( this.hour_slider ) {
					this.control.options( this, this.hour_slider, 'hour', {
						min: this._defaults.hourMin,
						max: hourMax,
						step: this._defaults.stepHour
					} );
					this.control.value( this, this.hour_slider, 'hour', this.hour - ( this.hour % this._defaults.stepHour ) );
				}
				if ( this.minute_slider ) {
					this.control.options( this, this.minute_slider, 'minute', {
						min: this._defaults.minuteMin,
						max: minMax,
						step: this._defaults.stepMinute
					} );
					this.control.value( this, this.minute_slider, 'minute', this.minute - ( this.minute % this._defaults.stepMinute ) );
				}
				if ( this.second_slider ) {
					this.control.options( this, this.second_slider, 'second', {
						min: this._defaults.secondMin,
						max: secMax,
						step: this._defaults.stepSecond
					} );
					this.control.value( this, this.second_slider, 'second', this.second - ( this.second % this._defaults.stepSecond ) );
				}
				if ( this.millisec_slider ) {
					this.control.options( this, this.millisec_slider, 'millisec', {
						min: this._defaults.millisecMin,
						max: millisecMax,
						step: this._defaults.stepMillisec
					} );
					this.control.value( this, this.millisec_slider, 'millisec', this.millisec - ( this.millisec % this._defaults.stepMillisec ) );
				}
				if ( this.microsec_slider ) {
					this.control.options( this, this.microsec_slider, 'microsec', {
						min: this._defaults.microsecMin,
						max: microsecMax,
						step: this._defaults.stepMicrosec
					} );
					this.control.value( this, this.microsec_slider, 'microsec', this.microsec - ( this.microsec % this._defaults.stepMicrosec ) );
				}
			}
		},

		/*
		 * when a slider moves, set the internal time...
		 * on time change is also called when the time is updated in the text field
		 */
		_onTimeChange: function() {
			var hour = this.hour_slider ? this.control.value( this, this.hour_slider, 'hour' ) : false,
				minute = this.minute_slider ? this.control.value( this, this.minute_slider, 'minute' ) : false,
				second = this.second_slider ? this.control.value( this, this.second_slider, 'second' ) : false,
				millisec = this.millisec_slider ? this.control.value( this, this.millisec_slider, 'millisec' ) : false,
				microsec = this.microsec_slider ? this.control.value( this, this.microsec_slider, 'microsec' ) : false,
				timezone = this.timezone_select ? this.timezone_select.val() : false,
				o = this._defaults,
				pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,
				pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;
			var ampm;
			var hasChanged;
			var sPos;
			var ePos;

			if ( ! this._defaults.showTimepicker ) {
				return;
			}

			if ( typeof hour === 'object' ) {
				hour = false;
			}
			if ( typeof minute === 'object' ) {
				minute = false;
			}
			if ( typeof second === 'object' ) {
				second = false;
			}
			if ( typeof millisec === 'object' ) {
				millisec = false;
			}
			if ( typeof microsec === 'object' ) {
				microsec = false;
			}
			if ( typeof timezone === 'object' ) {
				timezone = false;
			}

			if ( hour !== false ) {
				hour = parseInt( hour, 10 );
			}
			if ( minute !== false ) {
				minute = parseInt( minute, 10 );
			}
			if ( second !== false ) {
				second = parseInt( second, 10 );
			}
			if ( millisec !== false ) {
				millisec = parseInt( millisec, 10 );
			}
			if ( microsec !== false ) {
				microsec = parseInt( microsec, 10 );
			}
			if ( timezone !== false ) {
				timezone = timezone.toString();
			}

			ampm = o[ hour < 12 ? 'amNames' : 'pmNames' ][ 0 ];

			// If the update was done in the input field, the input field should not be updated.
			// If the update was done using the sliders, update the input field.
			hasChanged =
				hour !== parseInt( this.hour, 10 ) || // sliders should all be numeric
				minute !== parseInt( this.minute, 10 ) ||
				second !== parseInt( this.second, 10 ) ||
				millisec !== parseInt( this.millisec, 10 ) ||
				microsec !== parseInt( this.microsec, 10 ) ||
				( this.ampm.length > 0 && ( hour < 12 ) !== ( $.inArray( this.ampm.toUpperCase(), this.amNames ) !== -1 ) ) ||
				( this.timezone !== null && timezone !== this.timezone.toString() ); // could be numeric or "EST" format, so use toString()

			if ( hasChanged ) {
				if ( hour !== false ) {
					this.hour = hour;
				}
				if ( minute !== false ) {
					this.minute = minute;
				}
				if ( second !== false ) {
					this.second = second;
				}
				if ( millisec !== false ) {
					this.millisec = millisec;
				}
				if ( microsec !== false ) {
					this.microsec = microsec;
				}
				if ( timezone !== false ) {
					this.timezone = timezone;
				}

				if ( ! this.inst ) {
					this.inst = $.tm_datepicker._getInst( this.$input[ 0 ] );
				}

				this._limitMinMaxDateTime( this.inst, true );
			}
			if ( this.support.ampm ) {
				this.ampm = ampm;
			}

			// Updates the time within the tm_timepicker
			this.formattedTime = $.tm_datepicker.formatTime( o.timeFormat, this, o );
			if ( this.$timeObj ) {
				if ( pickerTimeFormat === o.timeFormat ) {
					this.$timeObj.val( this.formattedTime + pickerTimeSuffix );
				} else {
					this.$timeObj.val( $.tm_datepicker.formatTime( pickerTimeFormat, this, o ) + pickerTimeSuffix );
				}
				if ( this.$timeObj[ 0 ].setSelectionRange ) {
					sPos = this.$timeObj[ 0 ].selectionStart;
					ePos = this.$timeObj[ 0 ].selectionEnd;
					this.$timeObj[ 0 ].setSelectionRange( sPos, ePos );
				}
			}

			this.timeDefined = true;
			if ( hasChanged ) {
				this._updateDateTime();
				//this.$input.trigger(' focus' ); // may automatically open the picker on setDate
			}
		},

		/*
		 * call custom onSelect.
		 * bind to sliders slidestop, and grid click.
		 */
		_onSelectHandler: function() {
			var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;
			var inputEl = this.$input ? this.$input[ 0 ] : null;
			if ( onSelect && inputEl ) {
				onSelect.apply( inputEl, [ this.formattedDateTime, this ] );
			}
		},

		/*
		 * update our input with the new date time..
		 */
		_updateDateTime: function( dp_inst ) {
			var dtTmp;
			var dt;
			var dateFmt;
			var formatCfg;
			var timeAvailable;
			var formattedDateTime;
			var altFormattedDateTime = '';
			var altSeparator;
			var altTimeSuffix;

			dp_inst = this.inst || dp_inst;
			dtTmp = dp_inst.currentYear > 0 ? new Date( dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay ) : new Date( dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay );
			dt = $.tm_datepicker._daylightSavingAdjust( dtTmp );
			//dt = $.tm_datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
			//dt = $.tm_datepicker._daylightSavingAdjust(new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay)),
			dateFmt = $.tm_datepicker._get( dp_inst, 'dateFormat' );
			formatCfg = $.tm_datepicker._getFormatConfig( dp_inst );
			timeAvailable = dt !== null && this.timeDefined;
			this.formattedDate = $.tm_datepicker.formatDate( dateFmt, dt === null ? new Date() : dt, formatCfg );
			formattedDateTime = this.formattedDate;

			// if a slider was changed but tm_datepicker doesn't have a value yet, set it
			if ( dp_inst.lastVal === '' ) {
				dp_inst.currentYear = dp_inst.selectedYear;
				dp_inst.currentMonth = dp_inst.selectedMonth;
				dp_inst.currentDay = dp_inst.selectedDay;
			}

			/*
			 * remove following lines to force every changes in date picker to change the input value
			 * Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker.
			 * If the user manually empty the value in the input field, the date picker will never change selected value.
			 */
			//if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {
			//return;
			//}

			if ( this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === false ) {
				formattedDateTime = this.formattedTime;
			} else if ( ( this._defaults.timeOnly !== true && ( this._defaults.alwaysSetTime || timeAvailable ) ) || ( this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === true ) ) {
				formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
			}

			this.formattedDateTime = formattedDateTime;

			if ( ! this._defaults.showTimepicker ) {
				this.$input.val( this.formattedDate );
			} else if ( this.$altInput && this._defaults.timeOnly === false && this._defaults.altFieldTimeOnly === true ) {
				this.$altInput.val( this.formattedTime );
				this.$input.val( this.formattedDate );
			} else if ( this.$altInput ) {
				this.$input.val( formattedDateTime );
				altFormattedDateTime = '';
				altSeparator = this._defaults.altSeparator !== null ? this._defaults.altSeparator : this._defaults.separator;
				altTimeSuffix = this._defaults.altTimeSuffix !== null ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;

				if ( ! this._defaults.timeOnly ) {
					if ( this._defaults.altFormat ) {
						altFormattedDateTime = $.tm_datepicker.formatDate( this._defaults.altFormat, dt === null ? new Date() : dt, formatCfg );
					} else {
						altFormattedDateTime = this.formattedDate;
					}

					if ( altFormattedDateTime ) {
						altFormattedDateTime += altSeparator;
					}
				}

				if ( this._defaults.altTimeFormat !== null ) {
					altFormattedDateTime += $.tm_datepicker.formatTime( this._defaults.altTimeFormat, this, this._defaults ) + altTimeSuffix;
				} else {
					altFormattedDateTime += this.formattedTime + altTimeSuffix;
				}
				this.$altInput.val( altFormattedDateTime );
			} else {
				this.$input.val( formattedDateTime );
			}

			this.$input.trigger( 'change' );
		},

		_onFocus: function() {
			var inst;
			var tp_inst;
			if ( ! this.$input.val() && this._defaults.defaultValue ) {
				this.$input.val( this._defaults.defaultValue );
				inst = $.tm_datepicker._getInst( this.$input.get( 0 ) );
				tp_inst = $.tm_datepicker._get( inst, 'tm_timepicker' );
				if ( tp_inst ) {
					if ( tp_inst._defaults.timeOnly && inst.input.val() !== inst.lastVal ) {
						try {
							$.tm_datepicker._updateDatepicker( inst );
						} catch ( err ) {
							$.tm_timepicker.log( err );
						}
					}
				}
			}
		},

		/*
		 * Small abstraction to control types
		 * We can add more, just be sure to follow the pattern: create, options, value
		 */
		_controls: {
			// slider methods
			slider: {
				create: function( tp_inst, obj, unit, val, min, max, step ) {
					var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60
					return obj.prop( 'slide', null ).slider( {
						orientation: 'horizontal',
						value: rtl ? val * -1 : val,
						min: rtl ? max * -1 : min,
						max: rtl ? min * -1 : max,
						step: step,
						slide: function( event, ui ) {
							tp_inst.control.value( tp_inst, $( this ), unit, rtl ? ui.value * -1 : ui.value );
							tp_inst._onTimeChange();
						},
						stop: function() {
							tp_inst._onSelectHandler();
						}
					} );
				},
				options: function( tp_inst, obj, unit, opts, val ) {
					var min;
					var max;
					if ( tp_inst._defaults.isRTL ) {
						if ( typeof opts === 'string' ) {
							if ( opts === 'min' || opts === 'max' ) {
								if ( val !== undefined ) {
									return obj.slider( opts, val * -1 );
								}
								return Math.abs( obj.slider( opts ) );
							}
							return obj.slider( opts );
						}
						min = opts.min;
						max = opts.max;
						opts.max = null;
						opts.min = null;
						if ( min !== undefined ) {
							opts.max = min * -1;
						}
						if ( max !== undefined ) {
							opts.min = max * -1;
						}
						return obj.slider( opts );
					}
					if ( typeof opts === 'string' && val !== undefined ) {
						return obj.slider( opts, val );
					}
					return obj.slider( opts );
				},
				value: function( tp_inst, obj, unit, val ) {
					if ( tp_inst._defaults.isRTL ) {
						if ( val !== undefined ) {
							return obj.slider( 'value', val * -1 );
						}
						return Math.abs( obj.slider( 'value' ) );
					}
					if ( val !== undefined ) {
						return obj.slider( 'value', val );
					}
					return obj.slider( 'value' );
				}
			},
			// select methods
			select: {
				create: function( tp_inst, obj, unit, val, min, max, step ) {
					var sel = '<select class="ui-tm-timepicker-select ui-state-default ui-corner-all" data-unit="' + unit + '" data-min="' + min + '" data-max="' + max + '" data-step="' + step + '">',
						format = tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat;
					var i;

					for ( i = min; i <= max; i += step ) {
						sel += '<option value="' + i + '"' + ( i === val ? ' selected' : '' ) + '>';
						if ( unit === 'hour' ) {
							sel += $.tm_datepicker.formatTime( $.epoAPI.util.trim( format.replace( /[^ht ]/gi, '' ) ), { hour: i }, tp_inst._defaults );
						} else if ( unit === 'millisec' || unit === 'microsec' || i >= 10 ) {
							sel += i;
						} else {
							sel += '0' + i.toString();
						}
						sel += '</option>';
					}
					sel += '</select>';

					obj.children( 'select' ).remove();

					$( sel )
						.appendTo( obj )
						.on( 'change', function() {
							tp_inst._onTimeChange();
							tp_inst._onSelectHandler();
							tp_inst._afterInject();
						} );

					return obj;
				},
				options: function( tp_inst, obj, unit, opts, val ) {
					var o = {},
						$t = obj.children( 'select' );
					if ( typeof opts === 'string' ) {
						if ( val === undefined ) {
							return $t.data( opts );
						}
						o[ opts ] = val;
					} else {
						o = opts;
					}
					return tp_inst.control.create( tp_inst, obj, $t.data( 'unit' ), $t.val(), o.min >= 0 ? o.min : $t.data( 'min' ), o.max || $t.data( 'max' ), o.step || $t.data( 'step' ) );
				},
				value: function( tp_inst, obj, unit, val ) {
					var $t = obj.children( 'select' );
					if ( val !== undefined ) {
						return $t.val( val );
					}
					return $t.val();
				}
			}
		} // end _controls
	} );

	$.fn.extend( {
		/*
		 * shorthand just to use tm_timepicker.
		 */
		tm_timepicker: function( o ) {
			var tmp_args = Array.prototype.slice.call( arguments );
			o = o || {};

			if ( typeof o === 'object' ) {
				tmp_args[ 0 ] = $.extend( o, {
					timeOnly: true
				} );
			}

			return $( this ).each( function() {
				$.fn.tm_datetimepicker.apply( $( this ), tmp_args );
			} );
		},

		/*
		 * extend tm_timepicker to tm_datepicker
		 */
		tm_datetimepicker: function( o ) {
			var tmp_args = arguments;
			o = o || {};

			if ( typeof o === 'string' ) {
				if ( o === 'getDate' || ( o === 'option' && tmp_args.length === 2 && typeof tmp_args[ 1 ] === 'string' ) ) {
					return $.fn.tm_datepicker.apply( $( this[ 0 ] ), tmp_args );
				}
				return this.each( function() {
					var $t = $( this );
					$t.tm_datepicker.apply( $t, tmp_args );
				} );
			}
			return this.each( function() {
				var $t = $( this );
				$t.tm_datepicker( $.tm_timepicker._newInst( $t, o )._defaults );
			} );
		}
	} );

	/*
	 * Public Utility to parse date and time
	 */
	$.tm_datepicker.parseDateTime = function( dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings ) {
		var parseRes = parseDateTimeInternal( dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings );
		var t;
		if ( parseRes.timeObj ) {
			t = parseRes.timeObj;
			parseRes.date.setHours( t.hour, t.minute, t.second, t.millisec );
			parseRes.date.setMicroseconds( t.microsec );
		}

		return parseRes.date;
	};

	/*
	 * Public utility to parse time
	 */
	$.tm_datepicker.parseTime = function( timeFormat, timeString, options ) {
		var o = extendRemove( extendRemove( {}, $.tm_timepicker._defaults ), options || {} );

		// Strict parse requires the timeString to match the timeFormat exactly
		var strictParse = function( f, s, oo ) {
			// pattern for standard and localized AM/PM markers
			var getPatternAmpm = function( amNames, pmNames ) {
				var markers = [];
				if ( amNames ) {
					$.merge( markers, amNames );
				}
				if ( pmNames ) {
					$.merge( markers, pmNames );
				}
				markers = $.map( markers, function( val ) {
					return val.replace( /[.*+?|()[\]{}\\]/g, '\\$&' );
				} );
				return '(' + markers.join( '|' ) + ')?';
			};

			// figure out position of time elements.. cause js cant do named captures
			var getFormatPositions = function( formatoftime ) {
				var finds = formatoftime.toLowerCase().match( /(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g ),
					orders = {
						h: -1,
						m: -1,
						s: -1,
						l: -1,
						c: -1,
						t: -1,
						z: -1
					};
				var i;

				if ( finds ) {
					for ( i = 0; i < finds.length; i += 1 ) {
						if ( orders[ finds[ i ].toString().charAt( 0 ) ] === -1 ) {
							orders[ finds[ i ].toString().charAt( 0 ) ] = i + 1;
						}
					}
				}
				return orders;
			};

			var regstr =
					'^' +
					f
						.toString()
						.replace( /([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function( match ) {
							var ml = match.length;
							switch ( match.charAt( 0 ).toLowerCase() ) {
								case 'h':
									return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
								case 'm':
									return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
								case 's':
									return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
								case 'l':
									return '(\\d?\\d?\\d)';
								case 'c':
									return '(\\d?\\d?\\d)';
								case 'z':
									return '(z|[-+]\\d\\d:?\\d\\d|\\S+)?';
								case 't':
									return getPatternAmpm( oo.amNames, oo.pmNames );
								default:
									// literal escaped in quotes
									return (
										'(' +
										match.replace( /'/g, '' ).replace( /(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g, function( m ) {
											return '\\' + m;
										} ) +
										')?'
									);
							}
						} )
						.replace( /\s/g, '\\s?' ) +
					oo.timeSuffix +
					'$',
				order = getFormatPositions( f ),
				ampm = '',
				treg;

			var resTime = {
				hour: 0,
				minute: 0,
				second: 0,
				millisec: 0,
				microsec: 0
			};

			treg = s.match( new RegExp( regstr, 'i' ) );

			if ( treg ) {
				if ( order.t !== -1 ) {
					if ( treg[ order.t ] === undefined || treg[ order.t ].length === 0 ) {
						ampm = '';
						resTime.ampm = '';
					} else {
						ampm =
							$.inArray(
								treg[ order.t ].toUpperCase(),
								$.map( oo.amNames, function( x ) {
									return x.toUpperCase();
								} )
							) !== -1
								? 'AM'
								: 'PM';
						resTime.ampm = oo[ ampm === 'AM' ? 'amNames' : 'pmNames' ][ 0 ];
					}
				}

				if ( order.h !== -1 ) {
					if ( ampm === 'AM' && treg[ order.h ] === '12' ) {
						resTime.hour = 0; // 12am = 0 hour
					} else if ( ampm === 'PM' && treg[ order.h ] !== '12' ) {
						resTime.hour = parseInt( treg[ order.h ], 10 ) + 12; // 12pm = 12 hour, any other pm = hour + 12
					} else {
						resTime.hour = Number( treg[ order.h ] );
					}
				}

				if ( order.m !== -1 ) {
					resTime.minute = Number( treg[ order.m ] );
				}
				if ( order.s !== -1 ) {
					resTime.second = Number( treg[ order.s ] );
				}
				if ( order.l !== -1 ) {
					resTime.millisec = Number( treg[ order.l ] );
				}
				if ( order.c !== -1 ) {
					resTime.microsec = Number( treg[ order.c ] );
				}
				if ( order.z !== -1 && treg[ order.z ] !== undefined ) {
					resTime.timezone = $.tm_timepicker.timezoneOffsetNumber( treg[ order.z ] );
				}

				return resTime;
			}
			return false;
		}; // end strictParse

		// First try JS Date, if that fails, use strictParse
		var looseParse = function( f, s, oo ) {
			var d;
			try {
				d = new Date( '2012-01-01 ' + s );
				if ( isNaN( d.getTime() ) ) {
					d = new Date( '2012-01-01T' + s );
					if ( isNaN( d.getTime() ) ) {
						d = new Date( '01/01/2012 ' + s );
						if ( isNaN( d.getTime() ) ) {
							throw 'Unable to parse time with native Date: ' + s;
						}
					}
				}

				return {
					hour: d.getHours(),
					minute: d.getMinutes(),
					second: d.getSeconds(),
					millisec: d.getMilliseconds(),
					microsec: d.getMicroseconds(),
					timezone: d.getTimezoneOffset() * -1
				};
			} catch ( err ) {
				try {
					return strictParse( f, s, oo );
				} catch ( err2 ) {
					$.tm_timepicker.log( 'Unable to parse \ntimeString: ' + s + '\ntimeFormat: ' + f );
				}
			}
			return false;
		}; // end looseParse

		if ( typeof o.parse === 'function' ) {
			return o.parse( timeFormat, timeString, o );
		}
		if ( o.parse === 'loose' ) {
			return looseParse( timeFormat, timeString, o );
		}
		return strictParse( timeFormat, timeString, o );
	};

	/**
	 * Public utility to format the time.
	 *
	 * @param {string} format    format of the time
	 * @param {Object} time      Object not a Date for timezones
	 * @param {Object} [options] essentially the regional[].. amNames, pmNames, ampm
	 * @returns {string} the formatted time
	 */
	$.tm_datepicker.formatTime = function( format, time, options ) {
		var tmptime;
		var ampmName;
		var hour;

		options = options || {};
		options = $.extend( {}, $.tm_timepicker._defaults, options );
		time = $.extend(
			{
				hour: 0,
				minute: 0,
				second: 0,
				millisec: 0,
				microsec: 0,
				timezone: null
			},
			time
		);

		tmptime = format;
		ampmName = options.amNames[ 0 ];
		hour = parseInt( time.hour, 10 );

		if ( hour > 11 ) {
			ampmName = options.pmNames[ 0 ];
		}

		tmptime = tmptime.replace( /(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function( match ) {
			switch ( match ) {
				case 'HH':
					return ( '0' + hour ).slice( -2 );
				case 'H':
					return hour;
				case 'hh':
					return ( '0' + convert24to12( hour ) ).slice( -2 );
				case 'h':
					return convert24to12( hour );
				case 'mm':
					return ( '0' + time.minute ).slice( -2 );
				case 'm':
					return time.minute;
				case 'ss':
					return ( '0' + time.second ).slice( -2 );
				case 's':
					return time.second;
				case 'l':
					return ( '00' + time.millisec ).slice( -3 );
				case 'c':
					return ( '00' + time.microsec ).slice( -3 );
				case 'z':
					return $.tm_timepicker.timezoneOffsetString( time.timezone === null ? options.timezone : time.timezone, false );
				case 'Z':
					return $.tm_timepicker.timezoneOffsetString( time.timezone === null ? options.timezone : time.timezone, true );
				case 'T':
					return ampmName.charAt( 0 ).toUpperCase();
				case 'TT':
					return ampmName.toUpperCase();
				case 't':
					return ampmName.charAt( 0 ).toLowerCase();
				case 'tt':
					return ampmName.toLowerCase();
				default:
					return match.replace( /'/g, '' );
			}
		} );

		return tmptime;
	};

	/*
     * the bad hack :/ override tm_datepicker so it doesn't close on select
     // inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
     */
	$.tm_datepicker._base_selectDate = $.tm_datepicker._selectDate;
	$.tm_datepicker._selectDate = function( id, dateStr ) {
		var inst = this._getInst( $( id )[ 0 ] ),
			tp_inst = this._get( inst, 'tm_timepicker' ),
			was_inline;

		if ( tp_inst && inst.settings.showTimepicker ) {
			tp_inst._limitMinMaxDateTime( inst, true );
			was_inline = inst.inline;
			inst.stay_open = true;
			inst.inline = true;
			//This way the onSelect handler called from calendarpicker get the full dateTime
			this._base_selectDate( id, dateStr );
			inst.inline = was_inline;
			inst.stay_open = false;
			this._notifyChange( inst );
			this._updateDatepicker( inst );
		} else {
			this._base_selectDate( id, dateStr );
		}
	};

	/*
	 * second bad hack :/ override tm_datepicker so it triggers an event when changing the input field
	 * and does not redraw the tm_datepicker on every selectDate event
	 */
	$.tm_datepicker._base_updateDatepicker = $.tm_datepicker._updateDatepicker;
	$.tm_datepicker._updateDatepicker = function( inst ) {
		// don't popup the tm_datepicker if there is another instance already opened
		var input = inst.input[ 0 ];
		var tp_inst;
		if ( $.tm_datepicker._curInst && $.tm_datepicker._curInst !== inst && $.tm_datepicker._datepickerShowing && $.tm_datepicker._lastInput !== input ) {
			return;
		}

		if ( typeof inst.stay_open !== 'boolean' || inst.stay_open === false ) {
			this._base_updateDatepicker( inst );

			// Reload the time control when changing something in the input text field.
			tp_inst = this._get( inst, 'tm_timepicker' );
			if ( tp_inst ) {
				tp_inst._addTimePicker( inst );
			}
		}
	};

	/*
	 * third bad hack :/ override tm_datepicker so it allows spaces and colon in the input field
	 */
	$.tm_datepicker._base_doKeyPress = $.tm_datepicker._doKeyPress;
	$.tm_datepicker._doKeyPress = function( event ) {
		var inst = $.tm_datepicker._getInst( event.target ),
			tp_inst = $.tm_datepicker._get( inst, 'tm_timepicker' );
		var ampm;
		var tz;
		var dateChars;
		var datetimeChars;
		var chr;

		if ( tp_inst ) {
			if ( $.tm_datepicker._get( inst, 'constrainInput' ) ) {
				ampm = tp_inst.support.ampm;
				tz = tp_inst._defaults.showTimezone !== null ? tp_inst._defaults.showTimezone : tp_inst.support.timezone;
				dateChars = $.tm_datepicker._possibleChars( $.tm_datepicker._get( inst, 'dateFormat' ) );
				datetimeChars =
					tp_inst._defaults.timeFormat
						.toString()
						.replace( /[hms]/g, '' )
						.replace( /TT/g, ampm ? 'APM' : '' )
						.replace( /Tt/g, ampm ? 'AaPpMm' : '' )
						.replace( /tT/g, ampm ? 'AaPpMm' : '' )
						.replace( /T/g, ampm ? 'AP' : '' )
						.replace( /tt/g, ampm ? 'apm' : '' )
						.replace( /t/g, ampm ? 'ap' : '' ) +
					' ' +
					tp_inst._defaults.separator +
					tp_inst._defaults.timeSuffix +
					( tz ? tp_inst._defaults.timezoneList.join( '' ) : '' ) +
					tp_inst._defaults.amNames.join( '' ) +
					tp_inst._defaults.pmNames.join( '' ) +
					dateChars;
				chr = String.fromCharCode( event.charCode === undefined ? event.keyCode : event.charCode );
				return event.ctrlKey || chr < ' ' || ! dateChars || datetimeChars.indexOf( chr ) > -1;
			}
		}

		return $.tm_datepicker._base_doKeyPress( event );
	};

	/*
	 * Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField
	 * Update any alternate field to synchronise with the main field.
	 */
	$.tm_datepicker._base_updateAlternate = $.tm_datepicker._updateAlternate;
	$.tm_datepicker._updateAlternate = function( inst ) {
		var tp_inst = this._get( inst, 'tm_timepicker' );
		var altField;
		var date;
		var formatCfg;
		var altFormattedDateTime;
		var altSeparator;
		var altTimeSuffix;
		var altTimeFormat;
		if ( tp_inst ) {
			altField = tp_inst._defaults.altField;
			if ( altField ) {
				// update alternate field too
				date = this._getDate( inst );
				formatCfg = $.tm_datepicker._getFormatConfig( inst );
				altFormattedDateTime = '';
				altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator;
				altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix;
				altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;

				altFormattedDateTime += $.tm_datepicker.formatTime( altTimeFormat, tp_inst, tp_inst._defaults ) + altTimeSuffix;
				if ( ! tp_inst._defaults.timeOnly && ! tp_inst._defaults.altFieldTimeOnly && date !== null ) {
					if ( tp_inst._defaults.altFormat ) {
						altFormattedDateTime = $.tm_datepicker.formatDate( tp_inst._defaults.altFormat, date, formatCfg ) + altSeparator + altFormattedDateTime;
					} else {
						altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;
					}
				}
				$( altField ).val( inst.input.val() ? altFormattedDateTime : '' );
			}
		} else {
			$.tm_datepicker._base_updateAlternate( inst );
		}
	};

	/*
	 * Override key up event to sync manual input changes.
	 */
	$.tm_datepicker._base_doKeyUp = $.tm_datepicker._doKeyUp;
	$.tm_datepicker._doKeyUp = function( event ) {
		var inst = $.tm_datepicker._getInst( event.target ),
			tp_inst = $.tm_datepicker._get( inst, 'tm_timepicker' );

		if ( tp_inst ) {
			if ( tp_inst._defaults.timeOnly && inst.input.val() !== inst.lastVal ) {
				try {
					$.tm_datepicker._updateDatepicker( inst );
				} catch ( err ) {
					$.tm_timepicker.log( err );
				}
			}
		}

		return $.tm_datepicker._base_doKeyUp( event );
	};

	/*
	 * override "Today" button to also grab the time and set it to input field.
	 */
	$.tm_datepicker._base_gotoToday = $.tm_datepicker._gotoToday;
	$.tm_datepicker._gotoToday = function( id ) {
		var inst = this._getInst( $( id )[ 0 ] );
		var tp_inst;
		var tzoffset;
		var now;
		this._base_gotoToday( id );
		tp_inst = this._get( inst, 'timepicker' );
		if ( ! tp_inst ) {
			return;
		}

		tzoffset = $.tm_timepicker.timezoneOffsetNumber( tp_inst.timezone );
		now = new Date();
		now.setMinutes( now.getMinutes() + now.getTimezoneOffset() + parseInt( tzoffset, 10 ) );
		this._setTime( inst, now );
		this._setDate( inst, now );
		tp_inst._onSelectHandler();
	};

	/*
	 * Disable & enable the Time in the datetimepicker
	 */
	$.tm_datepicker._disableTimepickerDatepicker = function( target ) {
		var inst = this._getInst( target );
		var tp_inst;
		if ( ! inst ) {
			return;
		}

		tp_inst = this._get( inst, 'tm_timepicker' );
		$( target ).tm_datepicker( 'getDate' ); // Init selected[Year|Month|Day]
		if ( tp_inst ) {
			inst.settings.showTimepicker = false;
			tp_inst._defaults.showTimepicker = false;
			tp_inst._updateDateTime( inst );
		}
	};

	$.tm_datepicker._enableTimepickerDatepicker = function( target ) {
		var inst = this._getInst( target );
		var tp_inst;
		if ( ! inst ) {
			return;
		}

		tp_inst = this._get( inst, 'tm_timepicker' );
		$( target ).tm_datepicker( 'getDate' ); // Init selected[Year|Month|Day]
		if ( tp_inst ) {
			inst.settings.showTimepicker = true;
			tp_inst._defaults.showTimepicker = true;
			tp_inst._addTimePicker( inst ); // Could be disabled on page load
			tp_inst._updateDateTime( inst );
		}
	};

	/*
	 * Create our own set time function
	 */
	$.tm_datepicker._setTime = function( inst, date ) {
		var tp_inst = this._get( inst, 'tm_timepicker' );
		var defaults;
		if ( tp_inst ) {
			defaults = tp_inst._defaults;

			// calling _setTime with no date sets time to defaults
			tp_inst.hour = date ? date.getHours() : defaults.hour;
			tp_inst.minute = date ? date.getMinutes() : defaults.minute;
			tp_inst.second = date ? date.getSeconds() : defaults.second;
			tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;
			tp_inst.microsec = date ? date.getMicroseconds() : defaults.microsec;

			//check if within min/max times..
			tp_inst._limitMinMaxDateTime( inst, true );

			tp_inst._onTimeChange();
			tp_inst._updateDateTime( inst );
		}
	};

	/*
	 * Create new public method to set only time, callable as $().tm_datepicker('setTime', date)
	 */
	$.tm_datepicker._setTimeDatepicker = function( target, date, withDate ) {
		var inst = this._getInst( target );
		var tp_inst;
		var tp_date;

		if ( ! inst ) {
			return;
		}

		tp_inst = this._get( inst, 'tm_timepicker' );

		if ( tp_inst ) {
			this._setDateFromField( inst );

			if ( date ) {
				if ( typeof date === 'string' ) {
					tp_inst._parseTime( date, withDate );
					tp_date = new Date();
					tp_date.setHours( tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec );
					tp_date.setMicroseconds( tp_inst.microsec );
				} else {
					tp_date = new Date( date.getTime() );
					tp_date.setMicroseconds( date.getMicroseconds() );
				}
				if ( tp_date.toString() === 'Invalid Date' ) {
					tp_date = undefined;
				}
				this._setTime( inst, tp_date );
			}
		}
	};

	/*
	 * override setDate() to allow setting time too within Date object
	 */
	$.tm_datepicker._base_setDateDatepicker = $.tm_datepicker._setDateDatepicker;
	$.tm_datepicker._setDateDatepicker = function( target, _date ) {
		var inst = this._getInst( target );
		var date = _date;
		var tp_inst;
		var tp_date;
		if ( ! inst ) {
			return;
		}

		if ( typeof _date === 'string' ) {
			date = new Date( _date );
			if ( ! date.getTime() ) {
				this._base_setDateDatepicker.apply( this, arguments );
				date = $( target ).tm_datepicker( 'getDate' );
			}
		}

		tp_inst = this._get( inst, 'tm_timepicker' );
		if ( date instanceof Date ) {
			tp_date = new Date( date.getTime() );
			tp_date.setMicroseconds( date.getMicroseconds() );
		} else {
			tp_date = date;
		}

		// This is important if you are using the timezone option, javascript's Date
		// object will only return the timezone offset for the current locale, so we
		// adjust it accordingly.  If not using timezone option this won't matter..
		// If a timezone is different in tp, keep the timezone as is
		if ( tp_inst && tp_date ) {
			// look out for DST if tz wasn't specified
			if ( ! tp_inst.support.timezone && tp_inst._defaults.timezone === null ) {
				tp_inst.timezone = tp_date.getTimezoneOffset() * -1;
			}
			date = $.tm_timepicker.timezoneAdjust( date, $.tm_timepicker.timezoneOffsetString( -date.getTimezoneOffset() ), tp_inst.timezone );
			tp_date = $.tm_timepicker.timezoneAdjust( tp_date, $.tm_timepicker.timezoneOffsetString( -tp_date.getTimezoneOffset() ), tp_inst.timezone );
		}

		this._updateDatepicker( inst );
		this._base_setDateDatepicker.apply( this, arguments );
		this._setTimeDatepicker( target, tp_date, true );
	};

	/*
	 * override getDate() to allow getting time too within Date object
	 */
	$.tm_datepicker._base_getDateDatepicker = $.tm_datepicker._getDateDatepicker;
	$.tm_datepicker._getDateDatepicker = function( target, noDefault ) {
		var inst = this._getInst( target );
		var tp_inst;
		var date;
		var currDT;

		if ( ! inst ) {
			return;
		}

		tp_inst = this._get( inst, 'tm_timepicker' );

		if ( tp_inst ) {
			// if it hasn't yet been defined, grab from field
			if ( inst.lastVal === undefined ) {
				this._setDateFromField( inst, noDefault );
			}

			date = this._getDate( inst );

			currDT = null;

			if ( tp_inst.$altInput && tp_inst._defaults.altFieldTimeOnly ) {
				currDT = tp_inst.$input.val() + ' ' + tp_inst.$altInput.val();
			} else if ( tp_inst.$input.get( 0 ).tagName !== 'INPUT' && tp_inst.$altInput ) {
				/**
				 * in case the datetimepicker has been applied to a non-input tag for inline UI,
				 * and the user has not configured the plugin to display only time in altInput,
				 * pick current date time from the altInput (and hope for the best, for now, until "ER1" is applied)
				 *
				 * @todo ER1. Since altInput can have a totally difference format, convert it to standard format by reading input format from "altFormat" and "altTimeFormat" option values
				 */
				currDT = tp_inst.$altInput.val();
			} else {
				currDT = tp_inst.$input.val();
			}

			if ( date && tp_inst._parseTime( currDT, ! inst.settings.timeOnly ) ) {
				date.setHours( tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec );
				date.setMicroseconds( tp_inst.microsec );

				// This is important if you are using the timezone option, javascript's Date
				// object will only return the timezone offset for the current locale, so we
				// adjust it accordingly.  If not using timezone option this won't matter..
				if ( tp_inst.timezone !== null ) {
					// look out for DST if tz wasn't specified
					if ( ! tp_inst.support.timezone && tp_inst._defaults.timezone === null ) {
						tp_inst.timezone = date.getTimezoneOffset() * -1;
					}
					date = $.tm_timepicker.timezoneAdjust( date, tp_inst.timezone, $.tm_timepicker.timezoneOffsetString( -date.getTimezoneOffset() ) );
				}
			}
			return date;
		}
		return this._base_getDateDatepicker( target, noDefault );
	};

	/*
	 * override parseDate() because UI 1.8.14 throws an error about "Extra characters"
	 * An option in datapicker to ignore extra format characters would be nicer.
	 */
	$.tm_datepicker._base_parseDate = $.tm_datepicker.parseDate;
	$.tm_datepicker.parseDate = function( format, value, settings ) {
		var date;
		try {
			date = this._base_parseDate( format, value, settings );
		} catch ( err ) {
			// Hack!  The error message ends with a colon, a space, and
			// the "extra" characters.  We rely on that instead of
			// attempting to perfectly reproduce the parsing algorithm.
			if ( err.indexOf( ':' ) >= 0 ) {
				date = this._base_parseDate( format, value.substring( 0, value.length - ( err.length - err.indexOf( ':' ) - 2 ) ), settings );
				$.tm_timepicker.log( 'Error parsing the date string: ' + err + '\ndate string = ' + value + '\ndate format = ' + format );
			} else {
				throw err;
			}
		}
		return date;
	};

	/*
	 * override formatDate to set date with time to the input
	 */
	$.tm_datepicker._base_formatDate = $.tm_datepicker._formatDate;
	$.tm_datepicker._formatDate = function( inst ) {
		var tp_inst = this._get( inst, 'tm_timepicker' );
		if ( tp_inst ) {
			tp_inst._updateDateTime( inst );
			return tp_inst.$input.val();
		}
		return this._base_formatDate( inst );
	};

	/*
	 * override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
	 */
	$.tm_datepicker._base_optionDatepicker = $.tm_datepicker._optionDatepicker;
	$.tm_datepicker._optionDatepicker = function( target, name, value ) {
		var inst = this._getInst( target ),
			name_clone;
		var tp_inst;
		var min, max, onselect, overrides, fns, prop, ret, oldVal, $target;

		if ( ! inst ) {
			return null;
		}

		tp_inst = this._get( inst, 'tm_timepicker' );
		if ( tp_inst ) {
			min = null;
			max = null;
			onselect = null;
			overrides = tp_inst._defaults.evnts;
			fns = {};

			if ( typeof name === 'string' ) {
				// if min/max was set with the string
				if ( name === 'minDate' || name === 'minDateTime' ) {
					min = value;
				} else if ( name === 'maxDate' || name === 'maxDateTime' ) {
					max = value;
				} else if ( name === 'onSelect' ) {
					onselect = value;
				} else if ( Object.prototype.hasOwnProperty.call( overrides, name ) ) {
					if ( typeof value === 'undefined' ) {
						return overrides[ name ];
					}
					fns[ name ] = value;
					name_clone = {}; //empty results in exiting function after overrides updated
				}
			} else if ( typeof name === 'object' ) {
				//if min/max was set with the JSON
				if ( name.minDate ) {
					min = name.minDate;
				} else if ( name.minDateTime ) {
					min = name.minDateTime;
				} else if ( name.maxDate ) {
					max = name.maxDate;
				} else if ( name.maxDateTime ) {
					max = name.maxDateTime;
				}
				for ( prop in overrides ) {
					if ( Object.prototype.hasOwnProperty.call( overrides, prop ) && name[ prop ] ) {
						fns[ prop ] = name[ prop ];
					}
				}
			}
			for ( prop in fns ) {
				if ( Object.prototype.hasOwnProperty.call( fns, prop ) ) {
					overrides[ prop ] = fns[ prop ];
					if ( ! name_clone ) {
						name_clone = $.extend( {}, name );
					}
					delete name_clone[ prop ];
				}
			}
			if ( name_clone && isEmptyObject( name_clone ) ) {
				return;
			}
			if ( min ) {
				//if min was set
				if ( min === 0 ) {
					min = new Date();
				} else {
					min = new Date( min );
				}
				tp_inst._defaults.minDate = min;
				tp_inst._defaults.minDateTime = min;
			} else if ( max ) {
				//if max was set
				if ( max === 0 ) {
					max = new Date();
				} else {
					max = new Date( max );
				}
				tp_inst._defaults.maxDate = max;
				tp_inst._defaults.maxDateTime = max;
			} else if ( onselect ) {
				tp_inst._defaults.onSelect = onselect;
			}

			// Datepicker will override our date when we call _base_optionDatepicker when
			// calling minDate/maxDate, so we will first grab the value, call
			// _base_optionDatepicker, then set our value back.
			if ( min || max ) {
				$target = $( target );
				oldVal = $target.tm_datetimepicker( 'getDate' );
				ret = this._base_optionDatepicker.call( $.tm_datepicker, target, name_clone || name, value );
				$target.tm_datetimepicker( 'setDate', oldVal );
				return ret;
			}
		}
		if ( value === undefined ) {
			return this._base_optionDatepicker.call( $.tm_datepicker, target, name );
		}
		return this._base_optionDatepicker.call( $.tm_datepicker, target, name_clone || name, value );
	};

	/*
	 * Create a Singleton Instance
	 */
	$.tm_timepicker = new Timepicker();

	/**
	 * Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)
	 *
	 * @param {number}  tzMinutes if not a number, less than -720 (-1200), or greater than 840 (+1400) this value is returned
	 * @param {boolean} iso8601   if true formats in accordance to iso8601 "+12:45"
	 * @return {string} timezone Offset
	 */
	$.tm_timepicker.timezoneOffsetString = function( tzMinutes, iso8601 ) {
		var off, minutes, hours, iso, tz;

		if ( isNaN( tzMinutes ) || tzMinutes > 840 || tzMinutes < -720 ) {
			return tzMinutes;
		}

		off = tzMinutes;
		minutes = off % 60;
		hours = ( off - minutes ) / 60;
		iso = iso8601 ? ':' : '';
		tz = ( off >= 0 ? '+' : '-' ) + ( '0' + Math.abs( hours ) ).slice( -2 ) + iso + ( '0' + Math.abs( minutes ) ).slice( -2 );

		if ( tz === '+00:00' ) {
			return 'Z';
		}
		return tz;
	};

	/**
	 * Get the number in minutes that represents a timezone string
	 *
	 * @param {string} tzString formatted like "+0500", "-1245", "Z"
	 * @return {number} the offset minutes or the original string if it doesn't match expectations
	 */
	$.tm_timepicker.timezoneOffsetNumber = function( tzString ) {
		var normalized = tzString.toString().replace( ':', '' ); // excuse any iso8601, end up with "+1245"

		if ( normalized.toUpperCase() === 'Z' ) {
			// if iso8601 with Z, its 0 minute offset
			return 0;
		}

		if ( ! /^(-|\+)\d{4}$/.test( normalized ) ) {
			// possibly a user defined tz, so just give it back
			return parseInt( tzString, 10 );
		}

		return (
			( normalized.substring( 0, 1 ) === '-' ? -1 : 1 ) * // plus or minus
			( ( parseInt( normalized.substring( 1, 3 ), 10 ) * 60 ) + // hours (converted to minutes)
				parseInt( normalized.substring( 3, 5 ), 10 ) )
		); // minutes
	};

	/**
	 * No way to set timezone in js Date, so we must adjust the minutes to compensate.
	 * (think setDate, getDate)
	 *
	 * @param {Date}   date
	 * @param {string} fromTimezone formatted like "+0500", "-1245"
	 * @param {string} toTimezone   formatted like "+0500", "-1245"
	 * @return {Date} Date
	 */
	$.tm_timepicker.timezoneAdjust = function( date, fromTimezone, toTimezone ) {
		var fromTz = $.timepicker.timezoneOffsetNumber( fromTimezone );
		var toTz = $.tm_timepicker.timezoneOffsetNumber( toTimezone );
		if ( ! isNaN( toTz ) ) {
			date.setMinutes( date.getMinutes() + -fromTz - -toTz );
		}
		return date;
	};

	/**
	 * Calls `tm_timepicker()` on the `startTime` and `endTime` elements, and configures them to
	 * enforce date range limits.
	 * n.b. The input value must be correctly formatted (reformatting is not supported)
	 *
	 * @param {Element} startTime
	 * @param {Element} endTime
	 * @param {Object}  options   Options for the tm_timepicker() call
	 * @return {jQuery} time range
	 */
	$.tm_timepicker.timeRange = function( startTime, endTime, options ) {
		return $.tm_timepicker.handleRange( 'tm_timepicker', startTime, endTime, options );
	};

	/**
	 * Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to
	 * enforce date range limits.
	 *
	 * @param {Element} startTime
	 * @param {Element} endTime
	 * @param {Object}  options   Options for the `tm_timepicker()` call. Also supports `reformat`,
	 *                            a boolean value that can be used to reformat the input values to the `dateFormat`.
	 */
	$.tm_timepicker.datetimeRange = function( startTime, endTime, options ) {
		$.tm_timepicker.handleRange( 'tm_datetimepicker', startTime, endTime, options );
	};

	/**
	 * Calls `tm_datepicker` on the `startTime` and `endTime` elements, and configures them to
	 * enforce date range limits.
	 *
	 * @param {Element} startTime
	 * @param {Element} endTime
	 * @param {Object}  options   Options for the `tm_timepicker()` call. Also supports `reformat`,
	 *                            a boolean value that can be used to reformat the input values to the `dateFormat`.
	 */
	$.tm_timepicker.dateRange = function( startTime, endTime, options ) {
		$.tm_timepicker.handleRange( 'tm_datepicker', startTime, endTime, options );
	};

	/**
	 * Calls `method` on the `startTime` and `endTime` elements, and configures them to
	 * enforce date range limits.
	 *
	 * @param {string}  method    Can be used to specify the type of picker to be added
	 * @param {Element} startTime
	 * @param {Element} endTime
	 * @param {Object}  options   Options for the `tm_timepicker()` call. Also supports `reformat`,
	 *                            a boolean value that can be used to reformat the input values to the `dateFormat`.
	 * @return {jQuery} range
	 */
	$.tm_timepicker.handleRange = function( method, startTime, endTime, options ) {
		var timeOnly = false;
		options = $.extend(
			{},
			{
				minInterval: 0, // min allowed interval in milliseconds
				maxInterval: 0, // max allowed interval in milliseconds
				start: {}, // options for start picker
				end: {} // options for end picker
			},
			options
		);

		// for the mean time this fixes an issue with calling getDate with tm_timepicker()

		if ( method === 'tm_timepicker' ) {
			timeOnly = true;
			method = 'tm_datetimepicker';
		}

		function checkDates( changed, other ) {
			var startdt = startTime[ method ]( 'getDate' ),
				enddt = endTime[ method ]( 'getDate' ),
				changeddt = changed[ method ]( 'getDate' );
			var minDate;
			var maxDate;

			if ( startdt !== null ) {
				minDate = new Date( startdt.getTime() );
				maxDate = new Date( startdt.getTime() );

				minDate.setMilliseconds( minDate.getMilliseconds() + options.minInterval );
				maxDate.setMilliseconds( maxDate.getMilliseconds() + options.maxInterval );

				if ( options.minInterval > 0 && minDate > enddt ) {
					// minInterval check
					endTime[ method ]( 'setDate', minDate );
				} else if ( options.maxInterval > 0 && maxDate < enddt ) {
					// max interval check
					endTime[ method ]( 'setDate', maxDate );
				} else if ( startdt > enddt ) {
					other[ method ]( 'setDate', changeddt );
				}
			}
		}

		function selected( changed, other, option ) {
			var date;
			if ( ! changed.val() ) {
				return;
			}
			date = changed[ method ].call( changed, 'getDate' );
			if ( date !== null && options.minInterval > 0 ) {
				if ( option === 'minDate' ) {
					date.setMilliseconds( date.getMilliseconds() + options.minInterval );
				}
				if ( option === 'maxDate' ) {
					date.setMilliseconds( date.getMilliseconds() - options.minInterval );
				}
			}

			if ( date.getTime ) {
				other[ method ].call( other, 'option', option, date );
			}
		}

		$.fn[ method ].call(
			startTime,
			$.extend(
				{
					timeOnly: timeOnly,
					onClose: function() {
						checkDates( $( this ), endTime );
					},
					onSelect: function() {
						selected( $( this ), endTime, 'minDate' );
					}
				},
				options,
				options.start
			)
		);
		$.fn[ method ].call(
			endTime,
			$.extend(
				{
					timeOnly: timeOnly,
					onClose: function() {
						checkDates( $( this ), startTime );
					},
					onSelect: function() {
						selected( $( this ), startTime, 'maxDate' );
					}
				},
				options,
				options.end
			)
		);

		checkDates( startTime, endTime );

		selected( startTime, endTime, 'minDate' );
		selected( endTime, startTime, 'maxDate' );

		return $( [ startTime.get( 0 ), endTime.get( 0 ) ] );
	};

	/**
	 * Log error or data to the console during error or debugging
	 *
	 * @return {void}
	 */
	$.tm_timepicker.log = function() {
		// Older IE (9, maybe 10) throw error on accessing `window.console.log.apply`, so check first.
		if ( window.console && window.console.log && window.console.log.apply ) {
			window.console.log.apply( window.console, Array.prototype.slice.call( arguments ) );
		}
	};

	/*
	 * Add util object to allow access to private methods for testability.
	 */
	$.tm_timepicker._util = {
		_extendRemove: extendRemove,
		_isEmptyObject: isEmptyObject,
		_convert24to12: convert24to12,
		_detectSupport: detectSupport,
		_selectLocalTimezone: selectLocalTimezone,
		_computeEffectiveSetting: computeEffectiveSetting,
		_splitDateTime: splitDateTime,
		_parseDateTimeInternal: parseDateTimeInternal
	};

	/*
	 * Microsecond support
	 */
	if ( ! Date.prototype.getMicroseconds ) {
		Object.defineProperty( Date.prototype, 'microseconds', {
			value: 0,
			writable: true
		} );

		Object.defineProperty( Date.prototype, 'getMicroseconds', {
			value: function() {
				return this.microseconds;
			}
		} );

		Object.defineProperty( Date.prototype, 'setMicroseconds', {
			value: function( m ) {
				this.setMilliseconds( this.getMilliseconds() + Math.floor( m / 1000 ) );
				this.microseconds = m % 1000;
				return this;
			}
		} );
	}

	/*
	 * Keep up with the version
	 */
	$.tm_timepicker.version = '1.6.3';
} ) );
assets/js/jquery.tcfloatbox.min.js000064400000013071150755142450013277 0ustar00!function(o){"use strict";function a(t,e){return this.element=o(t),this.settings=o.extend({},o.fn.tcFloatBox.defaults,e),this.settings.type="<"+this.settings.type+">",this.top=0,this.left=0,this.ticking=!1,1===this.element.length&&(this.init(),this)}a.prototype={constructor:a,destroy:function(){var t=this.settings;return void 0!==this.instance&&(o.fn.tcFloatBox.instances.splice(this.instance,1),delete this.instance,t.hideelements&&o("embed, object, select").css({visibility:"visible"}),t._ovl&&(t._ovl.off(),t._ovl.remove(),delete t._ovl),o(t.floatboxID).remove(),this.element.removeData("tcfloatbox"),o(window).off("scroll.tcfloatbox"+this.instance),o(window).off("resize.tcfloatbox"+this.instance)),this},hide:function(){var t=this.settings;t.hideelements&&o("embed, object, select").css({visibility:"visible"}),!0===t.showoverlay&&t._ovl&&t._ovl.hide(),o(t.floatboxID).addClass("tc-closing").removeClass(t.animateIn).addClass(t.animateOut),o(t.floatboxID).animate({opacity:0},t.closefadeouttime,function(){o(t.floatboxID).hide(),o(t.floatboxID).removeClass("tc-closing").addClass("tc-closed")}),o(window).off("scroll.tcfloatbox"+this.instance),o(window).off("resize.tcfloatbox"+this.instance)},requestTick:function(){var t=this.settings;this.ticking||(t.refresh?setTimeout(this.requestAnimationFrame.bind(this),t.refresh):requestAnimationFrame(this.update),this.ticking=!0)},requestAnimationFrame:function(){requestAnimationFrame(this.update.bind(this))},update:function(){this.render(),this.ticking=!1},doit:function(){this.requestTick()},render:function(){var t=this.settings,e=o.epoAPI.dom.size(),i="fixed"===t.refresh?{top:0,left:0}:o.epoAPI.dom.scroll(),n=parseInt(i.top+(e.visibleHeight-o(t.floatboxID).height())/2,10),i=parseInt(i.left+(e.visibleWidth-o(t.floatboxID).width())/2,10);n=parseInt((n-this.top)/t.fps,10),i=parseInt((i-this.left)/t.fps,10),this.top+=n,this.left+=i,o(t.floatboxID).css({top:this.top+"px",left:this.left+"px",opacity:1})},show:function(){var t,e,i=this.settings;1===this.element.length&&(void 0===this.instance&&this.init(),i.hideelements&&o("embed, object, select").css({visibility:"hidden"}),e=o.epoAPI.dom.size(),!0===i.showoverlay&&(i._ovl?i._ovl.show():(i._ovl=o('<div class="fl-overlay"></div>').css({zIndex:parseInt(i.zIndex,10)-1,opacity:i.overlayopacity}),i._ovl.appendTo("body"),i.ismodal||(i.cancelEvent||i.unique?i._ovl.on("click",this.applyCancelEvent.bind(this)):i._ovl.on("click",i.cancelfunc.bind(this))))),i.showfunc&&i.showfunc.call(),o(i.floatboxID).removeClass("tc-closing").addClass(i.animationBaseClass+" "+i.animateIn),"fixed"===i.refresh?(!1!==i.top?t=i.top:(t=parseInt((e.visibleHeight-o(i.floatboxID).height())/2,10),t+="px"),o(i.floatboxID).css({position:"fixed",top:t}),!1!==i.left&&o(i.floatboxID).css({left:i.left})):this.render())},applyCancelEvent:function(){var t=this.settings;!0===t.cancelEvent?this.destroy():"function"==typeof t.cancelEvent&&t.cancelEvent.call(this,this)},applyCancelEventFromKey:function(t){27===t.which&&this.applyCancelEvent()},applyUpdateEvent:function(){var t=this.settings;"function"==typeof t.updateEvent&&t.updateEvent.call(this,this)},applyUpdateEventFromKey:function(t){13===t.which&&this.applyUpdateEvent()},init:function(){var t,e,i=this.settings;1===this.element.length&&(0<o.fn.tcFloatBox.instances.length&&(i.zIndex=parseInt(o.fn.tcFloatBox.instances[o.fn.tcFloatBox.instances.length-1].zIndex,10)+100),this.instance=o.fn.tcFloatBox.instances.length,o.fn.tcFloatBox.instances.push(i),i.id=i.id+this.instance,i.floatboxID="#"+o.epoAPI.dom.id(i.id),this.hide(),t=o.epoAPI.dom.size(),e=o.epoAPI.dom.scroll(),o(i.type).attr("id",i.id).addClass(i.classname).html(i.data).appendTo(this.element),o(i.floatboxID).css({width:i.width,height:i.height}),i.minWidth&&o(i.floatboxID).css({"min-width":i.minWidth}),i.minHeight&&o(i.floatboxID).css({"min-height":i.minHeight}),e=parseInt(e.left+(t.visibleWidth-o(i.floatboxID).width())/2,10),o(i.floatboxID).css({top:"0px",left:e+"px","z-index":i.zIndex}),this.top=0,this.left=e,this.cancelfunc=i.cancelfunc,i.cancelEvent&&i.cancelClass&&(o(i.floatboxID).find(i.cancelClass).on("click",this.applyCancelEvent.bind(this)),i.isconfirm)&&o(document).off("keyup.escape-"+i.floatboxID).on("keyup.escape-"+i.floatboxID,this.applyCancelEventFromKey.bind(this)),i.updateEvent&&i.updateClass&&(o(i.floatboxID).find(i.updateClass).on("click",this.applyUpdateEvent.bind(this)),i.isconfirm)&&o(document).off("keyup.enter-"+i.floatboxID).on("keyup.enter-"+i.floatboxID,this.applyUpdateEventFromKey.bind(this)),this.show(),"fixed"!==i.refresh&&o(window).on("scroll.tcfloatbox"+this.instance,this.doit.bind(this)),o(window).on("resize.tcfloatbox"+this.instance,this.doit.bind(this)))}},o.fn.tcFloatBox=function(t){var e,i=o(this),n=i.data("tcfloatbox"),s="object"==typeof t?t:{};return n||(n=new a(this,s),i.data("tcfloatbox",n)),void 0===(e="string"==typeof t?n[t].apply(n,[]):e)?i:e},o.fn.tcFloatBox.defaults={id:"flasho",classname:"flasho",type:"div",data:"",width:"500px",height:"auto",minWidth:0,minHeight:0,closefadeouttime:1e3,animationBaseClass:"tm-animated",animateIn:"fadein",animateOut:"fadeout",top:!1,left:!1,refresh:!1,fps:4,hideelements:!1,showoverlay:!0,zIndex:100100,ismodal:!1,cancelfunc:a.prototype.hide,showfunc:null,cancelEvent:!0,cancelClass:".floatbox-cancel",updateEvent:!1,updateClass:!1,unique:!0,overlayopacity:.5,isconfirm:!1},o.fn.tcFloatBox.instances=[],o.fn.tcFloatBox.Constructor=a,o.tcFloatBox=function(t){var e=o("body"),i=!1;return e.map(function(){return o(this).data("tcfloatbox")||""}).get().some(function(t){return""===t})||t.unique?(i=new a(e,t),e.data("tcfloatbox",i)):(i=e.data("tcfloatbox")).init(),i}}(window.jQuery);assets/js/tm-epo.min.js000064400000641272150755142450011027 0ustar00!function(P,x,Ht){"use strict";var b,o,f,a,Lt={},Mt=P.TMEPOJS,e=P.wp,i=P.TMEPOQTRANSLATEXJS,_=P.noUiSlider,F=P.ClipboardEvent,k=P.DataTransfer,A=[],n=[],h=!1,v=!1,I=Ht("body"),Rt=Ht(P),C=Ht(x),E=Ht(P),D=P.tcmexp,B=P._,O=!1,r=Ht.fn.val;function u(t,i){t.toArray().forEach(function(t){(t=Ht(t)).find(":input").prop("disabled",function(t,e){var a=Ht(this).data("tc-state");return void 0===a?(Ht(this).data("tc-state",e),i):!1===a?i:a})})}function Ut(t,e){var a,i,o,r,c,n=0;return e&&(a=e.attr("data-taxable"),i=e.attr("data-tax-rate"),o=e.attr("data-prices-include-tax")||Mt.prices_include_tax,r=e.attr("data-tax-display-mode"),void 0!==(c=void 0!==e.data("current_variation")?e.data("current_variation"):c))&&(a=(c=e.data("current_variation")).tc_is_taxable,i=c.tc_tax_rate),a&&(i=parseFloat(i/100),"1"===o?n="incl"===r?(t=parseFloat(t))-t/(1+i):t*i:"incl"===r&&(n=t-t/(1+i)),n=Ht.epoAPI.math.toFloat(n)),n}function N(t,e,a,i,o,r,c){var n,l,d,s,p,m,_,f,u;return Number.isFinite(parseFloat(t))||(t=0),t*=1e4,e&&(n=e.attr("data-taxable"),l=e.attr("data-tax-rate"),d=e.attr("data-prices-include-tax")||Mt.prices_include_tax,s=e.attr("data-is-vat-exempt"),p=e.attr("data-non-base-location-prices"),m=e.attr("data-taxes-of-one"),_=e.attr("data-base-taxes-of-one"),f=e.attr("data-modded-taxes-of-one"),void 0!==e.data("current_variation")?u=e.data("current_variation"):void 0!==o&&(u=o),void 0!==u&&(n=(u=e.data("current_variation")).tc_is_taxable,l=u.tc_tax_rate,p=u.tc_non_base_location_prices,m=u.tc_taxes_of_one,_=u.tc_base_taxes_of_one,f=u.tc_modded_taxes_of_one),a&&a.data("tax-obj")&&("no"===(l=a.data("tax-obj")).has_fee?n=!1:"yes"===l.has_fee&&(n=!0),_=m=(l=l.tax_rate)/100),n)&&("1"!==d||i?(a||void 0===u||c)&&(t=parseFloat(t)+parseFloat(t)*m):"1"===s?t="1"===p?parseFloat(t)-m*t:parseFloat(t)-_*t:"1"===p&&(t=parseFloat(t)-_*t+f*t)),t/=1e4}function R(t,e,a,i,o,r,c){var n,l,d,s,p,m,_;return Number.isFinite(parseFloat(t))||(t=0),t*=1e4,e&&(_=e.attr("data-tax-display-mode"),n=e.attr("data-taxable"),l=e.attr("data-tax-rate"),d=e.attr("data-taxes-of-one"),s=e.attr("data-base-taxes-of-one"),p=e.attr("data-prices-include-tax"),void 0!==e.data("current_variation")?m=e.data("current_variation"):void 0!==o&&(m=o),void 0!==m&&(n=m.tc_is_taxable,l=m.tc_tax_rate,d=m.tc_taxes_of_one,s=m.tc_base_taxes_of_one),a&&a.data("tax-obj")&&("no"===(l=a.data("tax-obj")).has_fee?n=!1:"yes"===l.has_fee&&(n=!0),s=(l=l.tax_rate)/100),n)&&("1"===p||i)&&"incl"!==_&&(a||void 0===m||i||c)&&(s===d?t=parseFloat(t)-parseFloat(d*t):t*=1-parseFloat(s)),t/=1e4}function Jt(t,e,a,i,o,r,c){return Number.isFinite(parseFloat(t))||(t=0),t=e?("incl"===(e.attr("data-tax-display-mode")||Mt.tax_display_mode)?N:R)(t,e,a,o,r,0,c):t}function Qt(t,e){e=Ht.extend({symbol:"",format:"",decimal:Lt.localDecimalSeparator,thousand:Lt.localThousandSeparator,precision:Mt.currency_format_num_decimals},e=e||{});return"yes"===Mt.tm_epo_trim_zeros&&"0"!==(t%1).toString()==!1&&(e.precision=0),Ht.epoAPI.applyFilter("tc_formatPrice",Ht.epoAPI.math.format(t,e),e,t)}function l(t,e,a){return e+Qt(t,{symbol:Mt.currency_format_symbol,format:Mt.currency_format})+a}function $t(t,e,a,i,o,r){var c="",n=Mt.option_plus_sign+" ";return a||(t=Jt(t,e,o)),a=Math.abs(t),"minus"===Mt.tm_epo_global_options_price_sign&&(n=""),l(a,n=t<0?Mt.option_minus_sign+" ":n,c=void 0===(c=e&&i?e.attr("data-tax-string"):c)?"":c)}function Zt(t){return 0<t.find("input.variation_id").length?"input.variation_id":"input.product-variation-id"}function Kt(t){var e=t.find(Lt.qtySelector).last();return 0===e.length&&(e=t.find(Lt.associateQtySelector).last()),e=Ht.epoAPI.applyFilter("tc_getQtyElement",e,t)}function d(t,e,a){A[A.length]={name:t,selector:e,func:a}}function q(a,i,o){var r,c=!0,n=!1;return a=Ht(a),(r=a.filter(".tc-epo-field-product")).length&&void 0===r.data("islogicinit")&&(n=!0),a.each(function(t,e){!c&&a.has(".tc-epo-field-product").length?(n||r.is(".tcdisabled"))&&s(e,i,o):c=s(e,i,o)&&c}),c}function s(t,e,a){var i,o,r,c,n,l;return(t=Ht(t)).is(".cpf-element")?t=(i=t).find(".tmcp-field, .tmcp-fee-field"):i=t.closest(".cpf-element"),l=(n=i.closest(".cpf-section")).closest(".tm-extra-product-options-field"),a=a?t.closest(".tmcp-ul-wrap"):i,t.is(".tc-epo-field-product")&&void 0===t.data("islogicinit")&&t.data("islogicinit",1),(o=!t.is(".tc-epo-field-product")&&i.closest(".cpf-type-product")).length&&((c=o.find(Lt.associateQtySelector)).length&&(0<Ht.epoAPI.math.toFloat(c.val())?(t.removeClass("ignore"),c.removeClass("ignore")):(t.addClass("ignore"),c.addClass("ignore"))),c=o.data("isactive"),r=(o=o.closest(".cpf-section")).data("isactive")),!1!==c&&!1!==r&&!1!==i.data("isactive")&&!1!==n.data("isactive")?(o=t.first(),t.prop("disabled",!1),void 0!==t.data("tc-state")&&t.data("tc-state",!1),"yes"!==Mt.tm_epo_show_only_active_quantities?o.is(":radio, .cpf-type-radio")||o.is(":checkbox, .cpf-type-checkbox")?(t.filter(":checked").closest(".tmcp-field-wrap").find(".tm-qty").prop("disabled",!1),t.not(":checked").closest(".tmcp-field-wrap").find(".tm-qty").prop("disabled",!0)):(o.is("select, .cpf-type-select, .cpf-type-selectmultiple"),o.val()?a.find(".tm-qty").prop("disabled",!1):a.find(".tm-qty").prop("disabled",!0)):e||i.find(".tm-quantity").trigger("showhide.cpfcustom"),o.is(".cpf-element")||(t.removeClass("tcdisabled").addClass("tcenabled"),t.is(".tmcp-upload")&&t.next(".tmcp-upload-hidden").length&&t.next(".tmcp-upload-hidden").removeClass("tcdisabled").addClass("tcenabled").prop("disabled",!1)),i.removeClass("tc-container-disabled").addClass("tc-container-enabled"),t.trigger({type:"tm-field-is-active",field:t,value:!0}),n.removeClass("section-disabled"),l.removeClass("tc-hidden"),!0):(t.is(".cpf-element")||(t.prop("disabled",!0).removeClass("tcenabled").addClass("tcdisabled"),void 0!==t.data("tc-state")&&t.data("tc-state",!0),i.find(".tm-qty").prop("disabled",!0),t.is(".tmcp-upload")&&t.next(".tmcp-upload-hidden").length&&t.next(".tmcp-upload-hidden").removeClass("tcenabled").addClass("tcdisabled").prop("disabled",!0)),i.removeClass("tc-container-enabled").addClass("tc-container-disabled"),t.trigger({type:"tm-field-is-active",field:t,value:!1}),0===n.find(".cpf-element.tc-container-enabled").length&&(n.addClass("section-disabled"),0===l.children(".cpf-section").filter(function(){return!Ht(this).hasClass("section-disabled")}).length)&&l.addClass("tc-hidden"),!1)}function S(t,e,a){if(null!==t&&null!==e)switch(t=encodeURIComponent(t),e=Ht.qtranxj_split?encodeURIComponent(Ht.qtranxj_split(decodeURIComponent(e))[i.language]):encodeURIComponent(decodeURIComponent(e)),t=t?t.toLowerCase():"",e=e?e.toLowerCase():"",t=t.toString(),e=e.toString(),a){case"is":return null!==t&&t===e;case"isnot":return null!==t&&t!==e;case"isempty":return!("undefined"!==t&&void 0!==t&&""!==t);case"isnotempty":return"undefined"!==t&&void 0!==t&&""!==t;case"startswith":return t.startsWith(e);case"endswith":return t.endsWith(e);case"greaterthan":return parseFloat(t)>parseFloat(e);case"lessthan":return parseFloat(t)<parseFloat(e);case"greaterthanequal":return parseFloat(t)>=parseFloat(e);case"lessthanequal":return parseFloat(t)<=parseFloat(e)}return!1}function U(t){var a,i,e=Ht(t.element),o=t.operator,r=t.value,c=!1,n="";if(e.length){if(e.is(".cpf-section")){var l,d,s,t=e,p=o,m=t.find(".cpf-element"),_=!1;if(t.is(".tc-hidden")){if("isnotempty"===p)return;if("isempty"===p)return 1}return"isnotempty"===p?l=!1:"isempty"===p&&(l=!0),Ht(m).each(function(t,e){var a,i="";if((e=Ht(e)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),q(e))if(0<(a=e.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(a=a[0])&&(_=!0,a=e.is(".cpf-type-product-mode-product")||e.is(".cpf-type-product-checkbox")||e.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":e.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),a){case"cpf-type-radio":s=e.find("input.tm-epo-field.tmcp-radio:checked"+i),"isnotempty"===p?(l=l||0<s.length,0<s.length&&(d=s.length)):"isempty"===p&&(l=l&&0===s.length);break;case"cpf-type-checkbox":s=e.find("input.tm-epo-field.tmcp-checkbox:checked"+i),"isnotempty"===p?(l=l||0<s.length,0<s.length&&(d=s.length)):"isempty"===p&&(l=l&&0===s.length);break;case"cpf-type-select":(d=e.find("select.tm-epo-field.tmcp-select"+i).val())&&!_&&(d=d.slice(0,d.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(d=e.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!_&&d.forEach(function(t,e){d[e]=t.slice(0,t.lastIndexOf("_"))});break;default:d=e.find(".tm-epo-field"+i).val()}Array.isArray(d)?"isnotempty"===p?l=l||d.some(function(t){return S(t,"",p)}):"isempty"===p&&(l=l&&d.every(function(t){return S(t,"",p)})):"isnotempty"===p?l=l||S(d,"",p):"isempty"===p&&(l=l&&S(d,"",p))}else l=!1}),l}if(e.is(".cpf-type-product")&&(n=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(t=e.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(t=t[0])&&(c=!0,t=e.is(".cpf-type-product-mode-product")||e.is(".cpf-type-product-checkbox")||e.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":e.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),t){case"cpf-type-radio":if(u=e.find("input.tm-epo-field.tmcp-radio:checked"+n),"is"===o||"isnot"===o){if(0===u.length&&"is"===o)return;if(0===u.length&&"isnot"===o)return 1}if("isnotempty"===o)return 0<u.length;if("isempty"===o)return 0===u.length;(a=e.find("input.tm-epo-field.tmcp-radio:checked"+n).val())&&!c&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-checkbox":if(u=e.find("input.tm-epo-field.tmcp-checkbox:checked"+n),"is"===o||"isnot"===o)return(0!==u.length||"is"!==o)&&(0===u.length&&"isnot"===o||(i=!1,u.each(function(t,e){if(S(a=(a=Ht(e).val())&&!c?a.slice(0,a.lastIndexOf("_")):a,r,o))i=!0;else if("isnot"===o)return i=!1}),i));if("isnotempty"===o)return 0<u.length;if("isempty"===o)return 0===u.length;break;case"cpf-type-select":(a=e.find("select.tm-epo-field.tmcp-select"+n).val())&&!c&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=e.find("select.tm-epo-field.tmcp-selectmultiple"+n).val())&&!c&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;case"cpf-type-variations":var f,u=e,h=r,g=o,v=Ht(u),y=v.attr("data-epo_id"),b=v.attr("data-product_id"),w=Ht(".variations_form[data-epo_id='"+y+"'][data-product_id='"+b+"']"),w=Ht.epoAPI.applyFilter("tm_variation_check_match_variationsForm",w,y,b,v);if(0!==w.length)switch(0===(y=w.find("input[name^='variation_id']")).length&&0===(y=w.find("input.variation_id")).length&&(y=w.closest(".tc-epo-element-product-li-container").find(".product-variation-id")),null!==u&&null!==h&&void 0!==u&&void 0!==h&&!1!==u&&!1!==h&&(h=h?parseInt(h,10):-1),f=parseInt(y.val(),10),Number.isFinite(f)||(f=0),Number.isFinite(h)||(h=0),g){case"is":return""!==f&&f===h;case"isnot":return""!==f&&f!==h;case"isempty":return""===f||0===f;case"isnotempty":return""!==f&&0!==f;case"startswith":return f.toString().startsWith(h);case"endswith":return f.toString().endsWith(h);case"greaterthan":return parseFloat(f)>parseFloat(h);case"lessthan":return parseFloat(f)<parseFloat(h);case"greaterthanequal":return parseFloat(f)>=parseFloat(h);case"lessthanequal":return parseFloat(f)<=parseFloat(h)}return;default:a=e.find(".tm-epo-field"+n).val()}return Array.isArray(a)?a.some(function(t){return S(t,r,o)}):S(a,r,o)}}}function c(t,c){t.each(function(){var a=Ht(this),t=a.data("matches"),e=a.data("toggle"),i=a.data("fields"),o=[],r=!1;switch(e){case"show":r=!1;break;case"hide":r=!0}Ht.each(i,function(i,t){Array.isArray(t)&&(o[i]=0,Ht.each(t,function(t,e){var a=!0;(a="cpflogic"===c?q(Ht(e.element)):a)&&U(e)&&(o[i]=parseInt(o[i],10)+1)}))}),Ht.each(t,function(t,e){t=parseInt(o[t],10);if(e=parseInt(e,10),0<t&&e===t)return r=!r,!1}),r?("cpflogic"!==c||a.data("did_initial_activation")||n.push(function(){var t=a.find(".tm-epo-field.tcenabled");t.each(function(t,e){(e=Ht(e)).data("initial_activation")||a.closest(".cpf-section").is(".tc-hidden")||!q(e)||(e.trigger("tc_element_epo_rules"),e.data("initial_activation",1))}),(a.is(".cpf-element")&&t.length||a.is(".cpf-section"))&&a.data("did_initial_activation",1)}),a.removeClass("tc-hidden")):a.addClass("tc-hidden"),a.data("isactive",r),a.trigger("tc-logic")})}function T(t){var e,a=[];Ht(t).length||(t="body"),(e=(t=Ht(t)).find(".iscpfdependson")).each(function(t,e){Ht(e).each(function(t,e){c(Ht(e))})}),e.each(function(t,e){Ht(e).each(function(t,e){c(Ht(e),"cpflogic")})}),e.each(function(t,e){Ht(e).each(function(t,e){(e=(e=Ht(e)).is(".cpf-section")?e.find(".cpf-element"):e).each(function(t,e){q(Ht(e).find(".tm-epo-field"))})})}),n.forEach(function(t){t()}),n=[],Ht().selectric&&Ht(".tm-extra-product-options select").selectric("refresh"),setTimeout(function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})},200),t.find(".tm-product-image:checked,select.tm-product-image").each(function(){var t=Ht(this);q(t)&&""!==t.val()&&a.push(t)}),a.length?a[a.length-1].trigger("tm_trigger_product_image"):(e=t.data("epo_object"))&&e.main_product.trigger("tm_restore_product_image"),Rt.trigger("cpflogicrun"),Rt.trigger("tmlazy"),Rt.trigger("cpflogicdone")}function y(t){return"object"==typeof t&&"toggle"in t&&"rules"in t&&0<t.rules.length}function w(t){return t.what&&("all"===t.what?t.rules=[t.rules]:"any"===t.what&&(t.rules=t.rules.reduce(function(t,e){return t.push([e]),t},[])),delete t.what),t}function J(t){var a,i,o,r,c,n,l,d,s,p,m=Ht(t),t=m.find(".cpf-section"),_=!m.is(".cpf-section")&&t;m.each(function(t,e){(Ht(e).is(".cpf-section")?Ht(e):Ht(e).find(".cpf-section")).filter('[data-haslogic="1"]').each(function(t,e){a=Ht(e),i=w(a.data("logic")),o=parseInt(a.data("haslogic"),10),r=[],p=a.parent().closest(".cpf-type-product"),1===o&&y(i)&&(Ht.each(i.rules,function(a,t){t&&Array.isArray(t)&&(r[a]=[],Ht.each(t,function(t,e){s=e.section,c=e.element,n=e.operator,l=e.value,s=_?p.length?(d=p.find(".cpf-section").filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element").eq(c):d):(d=_.filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element:not(.cpf-element .cpf-element)").eq(c):d):c!==s?m.find(".cpf-element").eq(c):d,r[a].push({element:s,operator:n,value:l})}))}),a.data("iscpfdependson")?a.cpfdependson(a.data("cpfdependson-fields"),i.toggle,!0):(a.data("cpfdependson-fields",r),a.cpfdependson(r,i.toggle)))})})}function Q(t){var a,o,r,c,n,l,d,s,p,m=Ht(t),t=m.find(".cpf-section").not(".cpf-type-product .cpf-section"),_=!m.is(".cpf-section")&&t;m.find('.cpf-element[data-haslogic="1"]').each(function(t,e){var i=[];a=Ht(e),o=w(a.data("logic")),r=parseInt(a.data("haslogic"),10),p=a.parent().closest(".cpf-type-product"),1===r&&y(o)&&(Ht.each(o.rules,function(a,t){t&&Array.isArray(t)&&(i[a]=[],Ht.each(t,function(t,e){s=e.section,c=e.element,n=e.operator,l=e.value,s=_?p.length?(d=p.find(".cpf-section").filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element").eq(c):d):(d=_.filter("[data-uniqid='"+s+"']"),c!==s?d.find(".cpf-element:not(.cpf-element .cpf-element)").eq(c):d):c!==s?m.find(".cpf-element").eq(c):d,i[a].push({element:s,operator:n,value:l})}))}),a.data("iscpfdependson")?a.cpfdependson(a.data("cpfdependson-fields"),o.toggle,!0):(a.data("cpfdependson-fields",i),a.cpfdependson(i,o.toggle)))})}function $(t,e,a){var i,o,r;return t=e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-rate"),r=e.attr("data-tax-display-mode"),e=e.attr("data-prices-include-tax"),a||i&&"incl"===r&&"1"!==e)?parseFloat(t)/(1+o/100):t}function p(t,e,a){var i,o,r;return t=e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-rate"),r=e.attr("data-tax-display-mode"),e=e.attr("data-prices-include-tax"),a||i&&"incl"!==r&&"1"===e)?parseFloat(t)*(1+o/100):t}function Z(t,e,a){var i,o,r;if(e&&(i=e.attr("data-taxable"),o=e.attr("data-tax-display-mode"),r=e.attr("data-prices-include-tax"),i)){if(a&&a.tc_tax_rate&&"0"===String(a.tc_tax_rate))return t;"1"===r?"incl"===o?a.tc_base_taxes_of_one!==a.tc_modded_taxes_of_one&&(t=parseFloat((1-a.tc_taxes_of_one)*t*(1/(1-a.tc_base_taxes_of_one)))):t=p(t,e):"1"!==r&&"incl"===o&&(t=$(t,e))}return t}function Wt(t,e,a,i,o){var r="",c="";return a||(t=Jt(t,e,o,0,!0)),a=Math.abs(t),e&&i&&(r=e.attr("data-tax-string")),l(a,c=t<0?Mt.minus_sign+" ":c,r=void 0===r?"":r)}function Xt(t,e,a,i){return"excl"===i.attr("data-tax-display-mode")?(a[t]=a[t].replace(/{price_excluding_tax}/g,Wt(a[e],i,!0,!1)),a[t]=a[t].replace(/{price_including_tax}/g,Wt(p(a[e],i,!0),i,!0,!1))):(a[t]=a[t].replace(/{price_including_tax}/g,Wt(a[e],i,!0,!1)),a[t]=a[t].replace(/{price_excluding_tax}/g,Wt($(a[e],i,!0),i,!0,!1))),a}function te(t,e,a,i,o){H(t,e,a,i,o,!0)}function H(t,e,a,i,o,r){var c,n,l,t=Ht(t);0!==t.length&&(c=t.closest(".tmcp-field-wrap"),l=t.closest(".tc-price-wrap"),n=c.find(".tm-epo-field"),r||"1"!==n.attr("data-no-price-change")||!n.data("price-changed"))&&(e=Ht.epoAPI.applyFilter("tc_adjust_update_price_price",e),a=Ht.epoAPI.applyFilter("tc_adjust_update_price_formated_price",a,e),i=Ht.epoAPI.applyFilter("tc_adjust_update_price_original_price",i),o=Ht.epoAPI.applyFilter("tc_adjust_update_price_original_formated_price",o,i),Number.isFinite(parseFloat(i))||(i=0),Number.isFinite(parseFloat(e))||(e=0),c=c.find(".before-amount,.after-amount"),a={price:a,original_price:o},("yes"!==Mt.tm_epo_auto_hide_price_if_zero||!1!==Ht.tmempty(e)&&("yes"!==Mt.tm_epo_no_hide_price_if_original_not_zero||!0!==Ht.tmempty(e)||!1!==Ht.tmempty(i)))&&"yes"===Mt.tm_epo_auto_hide_price_if_zero||!0===Ht.tmempty(e)&&"1"===n.attr("data-no-price")||!r&&0<n.length&&("1"===n.attr("data-no-price")||"variable"===n.attr("data-type")&&!n.data("price"))?(l.addClass("tm-hidden"),t.addClass("tm-hidden"),t.empty(),c.addClass("tm-hidden")):(i&&void 0!==i&&parseFloat(i)!==parseFloat(e)?t.html(Ht.epoAPI.template.html(Lt.templateEngine.sale_price,{price:a})):t.html(Ht.epoAPI.template.html(Lt.templateEngine.price,{price:a})),l.removeClass("tm-hidden"),t.removeClass("tm-hidden"),c.removeClass("tm-hidden")))}function m(i,l,t){var e,a,d=[],s=(e=i,a={},(e=(t=t).thisForm?t.thisForm:e).find(".variations select, .tc-epo-variable-product-selector").each(function(){var t=void 0!==Ht(this).data("attribute_name")?Ht(this).data("attribute_name"):Ht(this).attr("name"),e=Ht(this).val();a[t]=e}),a),o=!0,t=i.find(Zt(i)).val();("0"!==t&&""!==t||0<i.find(".cpf-type-variations").find(".tm-epo-variation-element:checked").length||i.find(".cpf-type-variations").find('.tm-epo-variation-element option[value!=""]:selected'))&&(i.find(".cpf-type-variations").each(function(r,t){var c,n,t=Ht(t).find(".tm-epo-variation-element"),a=!1;d[r]=!0,t.is("select")?(c=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),(n=t.val())&&(d[r]=!1),t.children("option").each(function(t,e){a=!1,i.find("[data-attribute_name='attribute_"+c+"']").children("option").each(function(){if(Ht(this).attr("value")===Ht(e).attr("value"))return!(a=!0)}),a?Ht(e).prop("disabled",!1).show():Ht(e).prop("disabled",!0).hide()})):t.each(function(t,e){var e=Ht(e),a=e.closest("li"),i=a.find(".tm-epo-variation-element"),o=Ht.extend(!0,{},s);c=e.attr("data-tm-for-variation"),n=e.val(),e.is(":checked")&&(d[r]=!1),o["attribute_"+c]=n,(o=(o=Ht.fn.tm_find_matching_variations(l,o).shift())&&"is_in_stock"in o&&o.is_in_stock)?(e.prop("disabled",!1).removeClass("tm-disabled"),a.removeClass("pointereventsoff tm-attribute-disabled").fadeTo("fast",1,function(){Ht(this).css("opacity","")}),i.prop("disabled",!1),i.removeAttr("data-tm-disabled")):(i.is(":checked")||o?a.removeClass("pointereventsoff"):a.addClass("pointereventsoff"),e.attr("disabled","disabled").addClass("tm-disabled"),i.attr("disabled","disabled"),i.attr("data-tm-disabled","disabled"),a.addClass("tm-attribute-disabled").fadeTo("fast",.5))})}),d)&&(d.shift(),Ht.each(d,function(t,e){if(!1===e)return o=!1}),o)&&i.find(".cpf-type-variations").first().each(function(t,e){var a,i,e=Ht(e).find(".tm-epo-variation-element");e.is("select")||e.each(function(t,e){e=Ht(e),a=e.closest("li"),i=a.find(".tm-epo-variation-element"),e.prop("disabled",!1).removeClass("tm-disabled"),a.removeClass("tm-attribute-disabled").stop().css("opacity",""),i.prop("disabled",!1),i.removeAttr("data-tm-disabled")})})}function W(e,a){var t=e.data("product_variations"),i=parseInt(e.data("product_id"),10),o=e.data("globalVariationObject")||!1;!(i=i||e.data("tc_product_id"))&&e.is(Lt.compositeSelector)&&(i=e.find(".component_options").data("options_data")[0].option_id,t=t||e.find(".details.component_data").data("product_variations")),a.is_associated||!(t=!(t=!t&&P.product_variations&&P.product_variations.product_id?P.product_variations.product_id:t)&&P.product_variations?P.product_variations:t)&&P["product_variations_"+i]&&(t=P["product_variations_"+i]),t?m(e,t,a):o?m(e,o.variations,a):Ht.post(Mt.ajax_url,{action:"woocommerce_tm_get_variations_array",post_id:i},function(t){o=t,e.data("globalVariationObject",t),m(e,o.variations,a)},"json")}function X(t,e){var a,i,o,r;"no"!==Mt.tm_epo_global_move_out_of_stock&&((r=(r=t.find(".woocommerce-variation-availability").last()).length?r:t.find(".stock").last()).length?(e.find(".tm-stock").remove(),t=e,void 0!==(a=r.prop("outerHTML"))&&(o=(i=(t=Ht(t)).find(".tm-epo-variation-element").first()).closest(".tm-epo-variation-section"),i.length?(o.find(".tm-stock").remove(),o.append('<div class="tm-stock">'+a+"</div>")):(t.find(".tm-stock").remove(),t.find(".variations").after('<div class="tm-stock">'+a+"</div>")),1)&&r.remove()):e.find(".tm-stock").remove())}function G(t,e,a,i){return a=a||"form",t=t,i=i,o="",(t=0===(t=(e=(e=e)||t).find(Lt.addToCartSelector+(o=i?o+"[value='"+i+"']":o))).length?e.find(Lt.tcAddToCartSelector+o):t).last().closest(a);var o}function V(t,e,a,i){return G(t,e,a,i)}function Gt(t){var e=Ht.epoAPI.applyFilter("tcGetNativePricesBlockSelector",".single_variation .price",t);return Ht(t).find(e).not(".tc-price")}function ee(t,e){var a,i,o=e.showHideCart;e.is_associated||void 0===o||"yes"!==Mt.tm_epo_hide_add_cart_button&&"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_required_add_cart_button||(a=t.find(Lt.addToCartButtonSelector).first(),i=t.find(Lt.qtySelector).first(),o?(a.removeClass("tc-hide-add-to-cart-button"),i.removeClass("tc-hide-add-to-cart-button")):(a.addClass("tc-hide-add-to-cart-button"),i.addClass("tc-hide-add-to-cart-button")),Rt.trigger("epoShowHideCart",{main_product:t,currentEpoObject:e,showHideCart:o,button:a,qty:i}))}function ae(t,e,a){var i,o,r,c=!0,n=!0,l=Ht.tcepo.oneOptionIsSelected[e];return t.is_associated||(i="object"==typeof a?(i=a.has_epo,o=a.this_epo_container,i&&(o.find(".tmcp-fee-field").length||o.find(".tmcp-field").not(".cpf-type-variations .tmcp-field").length)):a,t.showHideCart=void 0,t.showHideTotal=void 0,!i)||"yes"!==Mt.tm_epo_hide_add_cart_button&&"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_required_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_any&&"yes"!==Mt.tm_epo_hide_totals_until_all_required&&"yes"!==Mt.tm_epo_hide_totals_until_all||("yes"===Mt.tm_epo_hide_add_cart_button&&(c=l),"yes"===Mt.tm_epo_hide_totals_until_any&&(n=l),"yes"!==Mt.tm_epo_hide_required_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_all_required||(r=t.this_epo_container.find(".cpf-element").not(".cpf-type-variations").filter(".tc-container-enabled.tc-is-required").toArray().every(function(t){var e,a,i="",o=!1;if((t=Ht(t)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(e=t.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(e=e[0])&&(o=!0,e=t.is(".cpf-type-product-mode-product")||t.is(".cpf-type-product-checkbox")||t.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":t.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),e){case"cpf-type-radio":return 0<t.find("input.tm-epo-field.tmcp-radio:checked"+i).length;case"cpf-type-checkbox":return 0<t.find("input.tm-epo-field.tmcp-checkbox:checked"+i).length;case"cpf-type-select":(a=t.find("select.tm-epo-field.tmcp-select"+i).val())&&!o&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=t.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!o&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;default:a=t.find(".tm-epo-field"+i).val()}return Array.isArray(a)?a.some(function(t){return""!==t}):""!==a}return!1}),"yes"===Mt.tm_epo_hide_required_add_cart_button&&(c=r),"yes"===Mt.tm_epo_hide_totals_until_all_required&&(n=r)),"yes"!==Mt.tm_epo_hide_all_add_cart_button&&"yes"!==Mt.tm_epo_hide_totals_until_all||(r=t.this_epo_container.find(".cpf-element").not(".cpf-type-variations").filter(".tc-container-enabled").toArray().every(function(t){var e,a,i="",o=!1;if((t=Ht(t)).is(".cpf-type-product")&&(i=":not(.tc-extra-product-options-inline .tm-epo-field)"),0<(e=t.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length){switch("cpf-type-product"===(e=e[0])&&(o=!0,e=t.is(".cpf-type-product-mode-product")||t.is(".cpf-type-product-checkbox")||t.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":t.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio"),e){case"cpf-type-radio":return 0<t.find("input.tm-epo-field.tmcp-radio:checked"+i).length;case"cpf-type-checkbox":return 0<t.find("input.tm-epo-field.tmcp-checkbox:checked"+i).length;case"cpf-type-select":(a=t.find("select.tm-epo-field.tmcp-select"+i).val())&&!o&&(a=a.slice(0,a.lastIndexOf("_")));break;case"cpf-type-selectmultiple":(a=t.find("select.tm-epo-field.tmcp-selectmultiple"+i).val())&&!o&&a.forEach(function(t,e){a[e]=t.slice(0,t.lastIndexOf("_"))});break;default:a=t.find(".tm-epo-field"+i).val()}return Array.isArray(a)?a.some(function(t){return""!==t}):""!==a}return!1}),"yes"===Mt.tm_epo_hide_all_add_cart_button&&(c=r),"yes"===Mt.tm_epo_hide_totals_until_all&&(n=r)),t.showHideCart=c,t.showHideTotal=n,Ht.tcepo.showHideTotal[e]=n),t}function Y(t,e){var a,i,o,r,c=Ht.tcepo.errorObject[e]||t;c&&("yes"!==Mt.tm_epo_disable_error_scroll&&(i=(a=c.closest(".cpf-section")).find(".tm-section-link"),o=c.closest(".cpf-element"),a.find(".tm-toggle").length&&a.find(".tm-toggle").trigger("openwrap.tmtoggle"),void 0===P.tc_validation_offset&&(P.tc_validation_offset=-100),a.is(".section_popup")?(E.tcScrollTo(i,300,P.tc_validation_offset),i.trigger("click.tmsectionpoplink")):a.is(".tm-owl-slider-section")?(r=c.closest(".owl-item").index(),a.find(".tcowl-carousel").trigger("to.owl.carousel",[r,100]),setTimeout(function(){a.find(".tcowl-carousel").trigger("refresh.owl.carousel"),0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)},200)):a.is(".tc-tabs-section")?(r=c.closest(".tc-tab-slide").index(),c.closest(".tc-tabs").find('.tc-tab-headers .tc-tab-header .tab-header[data-id="tc-tab-slide'+r+'"]').trigger("click.tmtabs"),setTimeout(function(){0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)},200)):0<o.length&&E.tcScrollTo(o,300,P.tc_validation_offset)),t||(Ht.tcepo.errorObject[e]=!1))}function K(t,e){var a,i=parseInt(t.attr("data-limit"),10),o=!1;return!(0<i&&(o=0,t.closest(".tm-extra-product-options-checkbox").find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),o=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(o,10)+a):parseInt(o,10)+1}),i<o)&&(e&&t.prop("checked","").trigger("change"),1))}function tt(t,e){var a,i=parseInt(t.attr("data-exactlimit"),10),o=!1;return!(0<i&&(o=0,t.closest(".tm-extra-product-options-checkbox").find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),o=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(o,10)+a):parseInt(o,10)+1}),i<o)&&(e&&t.prop("checked","").trigger("change"),1))}function et(d,s,p){Ht.tcepo.formSubmitEvents[p][Ht.tcepo.formSubmitEvents[p].length]={trigger:function(){return t=s,e=p,l=!(n=!0),d.each(function(){c=Ht(this),(r=c.find("[type='checkbox'][data-limit]")).length&&q(r)&&(r=parseInt(r.attr("data-limit"),10),a=0,c.find("input.tm-epo-field[type='checkbox']:checked").each(function(){i=Ht(this),i=i.closest("li.tmcp-field-wrap").find("input.tm-qty"),a=0<i.length?((i=parseInt(i.val(),10))<=0&&(i=1),parseInt(a,10)+i):parseInt(a,10)+1}),o=c.closest(".cpf-element"),o=o.find("div.tm-error-min"),r<a?(n=!1,l=c,r=(1===r?Mt.tm_epo_global_validator_messages.epolimitsingle:Mt.tm_epo_global_validator_messages.epolimit).replace("{0}",r),o.length&&o.remove(),"before"===Mt.tm_epo_global_error_label_placement?c.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"):c.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"),t.find(Lt.addToCartButtonSelector).first().removeClass("disabled loading fpd-disabled").prop("disabled",!1)):o.remove())}),l&&(Ht.tcepo.errorObject[e]=l),n;var t,e,a,i,o,r,c,n,l},on_true:function(){return!0},on_false:function(){return Y(Ht(d).find(".tm-epo-field").first(),p),!0}}}function at(d,s,p){Ht.tcepo.formSubmitEvents[p][Ht.tcepo.formSubmitEvents[p].length]={trigger:function(){return t=s,e=p,l=!(n=!0),d.each(function(){c=Ht(this),(r=c.find("[type='checkbox'][data-exactlimit]")).length&&q(r)&&(r=parseInt(r.attr("data-exactlimit"),10),a=0,c.find("input.tm-epo-field[type='checkbox']:checked").each(function(){i=Ht(this),i=i.closest("li.tmcp-field-wrap").find("input.tm-qty"),a=0<i.length?((i=parseInt(i.val(),10))<=0&&(i=1),parseInt(a,10)+i):parseInt(a,10)+1}),o=c.closest(".cpf-element"),o=o.find("div.tm-error-min"),r!==a?(n=!1,l=c,r=(1===r?Mt.tm_epo_global_validator_messages.epoexactsingle:Mt.tm_epo_global_validator_messages.epoexact).replace("{0}",r),o.length&&o.remove(),"before"===Mt.tm_epo_global_error_label_placement?c.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"):c.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+r+"</div>"),t.find(Lt.addToCartButtonSelector).first().removeClass("disabled loading fpd-disabled").prop("disabled",!1)):o.remove())}),l&&(Ht.tcepo.errorObject[e]=l),n;var t,e,a,i,o,r,c,n,l},on_true:function(){return!0},on_false:function(){return Y(Ht(d).find(".tm-epo-field").first(),p),!0}}}function it(l,d){Ht.tcepo.formSubmitEvents[d][Ht.tcepo.formSubmitEvents[d].length]={trigger:function(){return t=d,n=!(c=!0),l.each(function(){var t;(t=(r=Ht(this)).find("[type='checkbox'][data-minimumlimit]")).length&&q(t)&&(o=parseInt(t.attr("data-minimumlimit"),10),e=0,r.find("input.tm-epo-field[type='checkbox']:checked").each(function(){a=Ht(this),a=a.closest("li.tmcp-field-wrap").find("input.tm-qty"),e=0<a.length?((a=parseInt(a.val(),10))<=0&&(a=1),parseInt(e,10)+a):parseInt(e,10)+1}),i=r.closest(".cpf-element"),i=i.find("div.tm-error-min"),e<o?(c=!1,n=r,o=(1===o?Mt.tm_epo_global_validator_messages.epominsingle:Mt.tm_epo_global_validator_messages.epomin).replace("{0}",o),i.length&&i.remove(),"before"===Mt.tm_epo_global_error_label_placement?r.closest(".tc-element-container").before('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+o+"</div>"):r.closest(".tc-element-container").after('<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">'+o+"</div>")):i.remove())}),n&&(Ht.tcepo.errorObject[t]=n),c;var t,e,a,i,o,r,c,n},on_true:function(){return!0},on_false:function(){return Y(!1,d),!0}}}function ot(t){return null!==t&&("object"==typeof t&&(t=t[0]),Number.isFinite(parseFloat(t)))?t:0}function L(t,e,a,i){return t=ot(t),t=a?Ht.epoAPI.applyFilter("tc_apply_dpd",t,e,a,i):t}function ie(t,e){var a=0;return 0<t.length&&(a=t.data("regular-price")),a=Ht.epoAPI.applyFilter("tc_calculate_product_regular_price",a,t),(!e||!1!==a)&&(a=parseFloat(a),Number.isFinite(a)?a:0)}function oe(t,e){var a=0;return 0<t.length&&(a=t.data("price")),a=Ht.epoAPI.applyFilter("tc_calculate_product_price",a,t),(!e||!1!==a)&&(a=parseFloat(a),Number.isFinite(a)?a:0)}function rt(e,a,i,o,t,r,c,n){var l,d,s,p,m,_,f,u,h,g=e.toString(),v=0,e=0,y=a.closest(".cpf-element").attr("data-uniqid"),b=a.closest(".tmcp-ul-wrap"),w=i.this_epo_totals_container.data("totalsHolder_tc_totals_ob"),x=b.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field").filter(":checked").index(a),F=b.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field").index(a),k=i.is_associated?i.this_epo_container:i.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),A=Ht.epoAPI.util.parseJSON(Mt.tm_epo_math)||{};-1===x&&a.is(".tmcp-checkbox, .tmcp-radio"),-1!==F||a.is(".tmcp-checkbox, .tmcp-radio")||(F=0),a.is(".tcdisabled")||o||a.data("addedtcEpoBeforeOptionPriceCalculation")||(Rt.on("tcEpoBeforeOptionPriceCalculation.math"+y,function(){Vt(i,a,void 0,void 0,void 0,!0)}),Rt.on("tcEpoAfterNormalOptionPriceCalculation.math"+y,function(){a.data("fetchOptionPrices",!1),a.data("fetchOptionPrices-forced",!1),a.data("fetchOptionPrices-fee",!1),a.data("fetchOptionPrices-fee-forced",!1),a.data("fetchOptionPrices-sub-fee",!1),a.data("fetchOptionPrices-sub-fee-forced",!1)}),a.data("addedtcEpoBeforeOptionPriceCalculation",1)),a.is(".tmcp-field")?a.data("fetchOptionPrices")?(_=a.data("fetchOptionPrices"),f=a.data("fetchOptionPrices-forced")):(_=Yt(i,b,".tmcp-field",0,0,[],!0),f=Yt(i,b,".tmcp-field",0,0,[],!0,!0),a.data("fetchOptionPrices",_),a.data("fetchOptionPrices-forced",f)):a.is(".tmcp-fee-field")?a.data("fetchOptionPrices-fee")?(_=a.data("fetchOptionPrices-fee"),f=a.data("fetchOptionPrices-fee-forced")):(_=Yt(i,b,".tmcp-fee-field",0,0,[],!0),f=Yt(i,b,".tmcp-fee-field",0,0,[],!0,!0),a.data("fetchOptionPrices-fee",_),a.data("fetchOptionPrices-fee-forced",f)):a.is(".tmcp-sub-fee-field")&&(a.data("fetchOptionPrices-sub-fee")?(_=a.data("fetchOptionPrices-sub-fee"),f=a.data("fetchOptionPrices-sub-fee-forced")):(_=Yt(i,b,".tmcp-sub-fee-field",0,0,[],!0),f=Yt(i,b,".tmcp-sub-fee-field",0,0,[],!0,!0),a.data("fetchOptionPrices-sub-fee",_),a.data("fetchOptionPrices-sub-fee-forced",f))),Object.keys(A).forEach(function(t){var e,a;""!==A[t].name&&""!==A[t].value&&(e=A[t].name,a=A[t].value,g=e.startsWith("{")?g.replace(e,a):A[t].name.isNumeric()?g.replace("{"+e+"}",a):(e=new RegExp("{"+e+"}","g"),a.startsWith("{")?g.replace(e,a):g.replace(e,Ht.epoAPI.math.unformat(a.replace(",",".")))))}),x=void 0!==w?(g=g.replace(/{quantity}/g,Ht.epoAPI.math.unformat(w.qty)),u=t&&void 0!==w.original_product_price?Ht.epoAPI.math.unformat(w.original_product_price):Ht.epoAPI.math.unformat(w.product_price),void 0!==w.dynamic_product_price?Ht.epoAPI.math.unformat(w.dynamic_product_price):0):(g=g.replace(/{quantity}/g,0),u=0),u=Ht.epoAPI.math.toFloat(u),g=(g=g.replace(/{product_price}/g,u)).replace(/{dynamic_product_price}/g,x),r=Ht.epoAPI.math.toFloat(r=r||0),c=Ht.epoAPI.math.toFloat(c=c||0),g=(g=(g=(g=g.replace(/{options_total}/g,r)).replace(/{product_price_plus_options_total}/g,u+r)).replace(/{cumulative_total}/g,c)).replace(/{product_price_plus_cumulative_total}/g,u+c),(g=(g=void 0!==f.floatingBoxData&&void 0!==f.floatingBoxData[F]?(g=(g=(g="number"===f.floatingBoxData[F].input_type||"hidden"===f.floatingBoxData[F].input_type?g.replace(/{this.value}/g,Ht.epoAPI.math.toFloat(Ht.epoAPI.math.unformat(f.floatingBoxData[F].valueText))):g.replace(/{this.value}/g,Ht.epoAPI.math.toFloat(Ht.epoAPI.math.unformat(f.floatingBoxData[F].valueText,Lt.localDecimalSeparator)))).replace(/{this.rawvalue}/g,f.floatingBoxData[F].valueText)).replace(/{this.text}/g,f.floatingBoxData[F].valueText)).replace(/{this.value.length}/g,f.floatingBoxData[F].valueText.length):g.replace(/{this.value}/g,0).replace(/{this.rawvalue}/g,"").replace(/{this.text}/g,"").replace(/{this.value.length}/g,0)).replace(/{this.count}/g,_.floatingBoxData.length).replace(/{this.count.quantity}/g,_.floatingBoxData.map(function(t){return t.quantity}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},0)).replace(/{this.quantity}/g,a.data("tm-quantity"))).match(/\{(\s)*?field\.([^}]*)}/)&&g.match(/\{(\s)*?field\.([^}]*)}/g).forEach(function(t){if(void 0!==(l=t.match(/\{(\s)*?field\.([^}]*)}/))[2]&&"string"==typeof l[2]&&-1!==(s=l[2].indexOf(".",l[2].indexOf(".")+1))&&(m=l[2].substring(0,s),p=l[2].substring(s+1),-1!==Ht.inArray(p,["price","value","value.length","rawvalue","text","text.length","quantity","count","count.quantity"]))){if((s=k.find("[data-uniqid='"+Ht.epoAPI.util.escapeSelector(m)+"']")).length){switch(m=s.find(".tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field"),d=m.first(),a.is(".tcdisabled")||o||a.data("addedfieldtcEpoBeforeOptionPriceCalculation")||(Rt.on("tcEpoBeforeOptionPriceCalculation.math"+y,function(){Vt(i,a,void 0,void 0,void 0,!0),a.trigger("tm-math-select-change-html-all")}),a.data("addedfieldtcEpoBeforeOptionPriceCalculation",1)),v=0,p){case"text":case"rawvalue":v=""}if(s.is(".tc-container-enabled")){switch(n||m.toArray().forEach(function(t){t=Ht(t),a.attr("id")!==t.attr("id")&&(a.is(".tmcp-dynamic")||t.is(".tmcp-dynamic"))&&Vt(i,t,void 0,void 0,void 0,!0,void 0,void 0,!0),o||t.data("addedmathevent")||(t.on("input.mathevent",function(){a.is(".tcdisabled")||a.trigger("change.cpf",{calculateMatcPrice:1})}),t.data("addedmathevent",1))}),d.is(".tmcp-field")?v=Yt(i,s,".tmcp-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0):d.is(".tmcp-fee-field")?v=Yt(i,s,".tmcp-fee-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0):d.is(".tmcp-sub-fee-field")&&(v=Yt(i,s,".tmcp-sub-fee-field",0,0,[],!0,void 0,void 0,!0,void 0,void 0,!0)),p){case"price":v=v.total,a.is(".tmcp-dynamic")&&(h=re(i,d,"price"),"math"===re(i,d,"price_type"))&&h.includes("{dynamic_product_price}")&&(v=0);break;case"value":case"text":case"rawvalue":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return"number"===t.input_type||"hidden"===t.input_type?"text"===p||"rawvalue"===p?t.valueText:Ht.epoAPI.math.unformat(t.valueText):"text"===p||"rawvalue"===p?t.valueText:Ht.epoAPI.math.unformat(t.valueText,Lt.localInputDecimalSeparator)}).reduce(function(t,e){return"text"===p||"rawvalue"===p?t+e:Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},"text"===p||"rawvalue"===p?"":0),"text"!==p&&"rawvalue"!==p||(""===v?v="''":v.toString().isNumeric()||(v="'"+v.replace("'","\\'")+"'")));break;case"value.length":case"text.length":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return t.valueText}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+e.length},0));break;case"quantity":case"count.quantity":v.floatingBoxData&&(v=v.floatingBoxData.map(function(t){return t.quantity}).reduce(function(t,e){return Ht.epoAPI.math.toFloat(t)+Ht.epoAPI.math.toFloat(e)},0));break;case"count":v.floatingBoxData&&(v=v.floatingBoxData.length)}"text"!==p&&"rawvalue"!==p&&(v=Ht.epoAPI.math.toFloat(v),Number.isFinite(v)||(v=0))}}else switch(v=0,p){case"text":case"rawvalue":v=""}m=new RegExp(l[0]),g="text"===p||"rawvalue"===p?""===v?g.replace(m,"''"):g.replace(m,v):Number.isFinite(v)?g.replace(m,v):g.replace(m,"'"+v.replace("'","\\'")+"'")}});try{e=D.evaluate(g)}catch(t){e=0}return e}function re(t,e,a){var i,o,r,c,e=Ht(e),n=e,t=t.main_cart,l="input[name^='variation_id']";return 0<t.find("input.variation_id").length&&(l="input.variation_id"),t=(t=t.find(l).val())||0,e.is("select")&&(n=e.find("option:selected")),l=Ht.epoAPI.util.parseJSON(n.attr("data-rules")),n=Ht.epoAPI.util.parseJSON(n.attr("data-rulestype")),o="","object"==typeof l?(c=t in l?l[t]:"object"==typeof(c=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-rules")))&&t in c?c[t]:l[0],"object"==typeof n?o=t in n?n[t]:"object"==typeof(i=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-rulestype")))&&t in i?i[t]:n[0]:"object"==typeof(n=Ht.epoAPI.util.parseJSON(e.closest(".tmcp-ul-wrap").attr("data-ulestype")))&&(o=t in n?n[t]:n[0])):(r=e.closest(".tmcp-ul-wrap"),"object"==typeof(l=Ht.epoAPI.util.parseJSON(r.attr("data-rules")))&&(c=t in l?l[t]:l[0],"object"==typeof n?o=t in n?n[t]:"object"==typeof(i=Ht.epoAPI.util.parseJSON(r.attr("data-rulestype")))&&t in i?i[t]:n[0]:"object"==typeof(n=Ht.epoAPI.util.parseJSON(r.attr("data-rulestype")))&&(o=t in n?n[t]:n[0]))),"object"==typeof c&&(c=c[0]),"object"==typeof o&&(o=o[0]),e.is(".tmcp-fee-field")&&-1!==Ht.inArray(o,["fee","stepfee","currentstepfee"])&&(o=""),"price"===a?c:o}function M(t){for(var e,a=new RegExp(/[\p{L}\d!@#$%^&*()_+=\{[\}\]|\\"':;?/>.<,-]+/,"gu"),i=0;null!==(e=a.exec(t));)e.index===a.lastIndex&&a.lastIndex++,i+=e.length;return i}function Vt(e,t,a,i,D,B,o,r,c){var n,l,d,s,p,m,_,f,u,h,g,v,y,b,w,x,F,k,A,P,I,C,E,q=Ht(t),t=q,S=q.is(".tmcp-range"),N=e.main_product,T=e.epoEventId,j=!0,O=0,z=0;q.data("associated_price_set")||(a?(n=a.cart,l=a.current_variation,d=a.bundleid,s=a.epoTotalsContainer,m=a.product_price,_=a.product_original_price,p=a.apply_dpd,j=a.per_product_pricing):(void 0!==(n=e.main_cart).data("per_product_pricing")&&(j=n.data("per_product_pricing")),a="input[name^='variation_id']",0<n.find("input.variation_id").length&&(a="input.variation_id"),l=n.find(a).val(),d=Ht.epoAPI.applyFilter("tc_get_bundleid",n.attr("data-product_id"),n,e),l=l||0,s=Ht.epoAPI.applyFilter("tc_get_totals_container",e.this_epo_totals_container,q,N,d),m=oe(s),_=ie(s),p=s.data("fields-price-rules")),m=Ht.epoAPI.applyFilter("tc_alter_product_price",m,q,n,s,d),_=Ht.epoAPI.applyFilter("tc_alter_product_original_price",_,q,n,s),!1!==m&&j&&(q.is("select")&&(t=q.find("option:selected")),(t=i?i:t).toArray().forEach(function(t){switch(t=Ht(t),E=Ht.epoAPI.util.parseJSON(t.attr("data-rules")),y=Ht.epoAPI.util.parseJSON(t.attr("data-rulestype")),v=Ht.epoAPI.util.parseJSON(t.attr("data-original-rules")),q.is(".tmcp-dynamic")&&(E=Ht.epoAPI.util.parseJSON(t.attr("data-formula")),v=Ht.epoAPI.util.parseJSON(t.attr("data-formula")),y=Ht.epoAPI.util.parseJSON(t.attr("data-calculation-type"))),void 0===v&&(v=E),u="","object"==typeof E?(g=l in E?(h=E[l],v[l]):(k=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-rules")),P=q.closest(".tmcp-ul-wrap").data("original-rules"),h="object"==typeof k&&l in k?k[l]:E[0],"object"==typeof P&&l in P?P[l]:v[0]),"object"==typeof y?u=l in y?y[l]:"object"==typeof(f=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-rulestype")))&&l in f?f[l]:y[0]:"object"==typeof(y=Ht.epoAPI.util.parseJSON(q.closest(".tmcp-ul-wrap").attr("data-ulestype")))&&(u=l in y?y[l]:y[0])):(k=q.closest(".tmcp-ul-wrap"),E=Ht.epoAPI.util.parseJSON(k.attr("data-rules")),v=Ht.epoAPI.util.parseJSON(k.attr("data-original-rules")),"object"==typeof E&&(h=l in E?E[l]:E[0],g="object"==typeof v?l in v?v[l]:v[0]:h,"object"==typeof y?u=l in y?y[l]:"object"==typeof(f=Ht.epoAPI.util.parseJSON(k.attr("data-rulestype")))&&l in f?f[l]:y[0]:"object"==typeof(y=Ht.epoAPI.util.parseJSON(k.attr("data-rulestype")))&&(u=l in y?y[l]:y[0]))),"object"==typeof u&&(u=u[0]),q.is(".tmcp-fee-field")&&(-1!==Ht.inArray(u,["fee","stepfee","currentstepfee"])&&(u=""),p=0),void 0===D&&(q.is("select")?q.find("option"):t).removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),"math"!==u?(h=ot(h),g=ot(g)):"object"==typeof h&&(h=h[0]),P=h,E=g,u){case"":h=L(I=h,s,p);break;case"math":h=rt(h,q,e,B,Ht.epoAPI.applyFilter("tc_use_undiscounted_price",void 0,q,n,s),o,r,c),h=L(I=h,s,p),g=rt(g,q,e,!0,!0,o,r,c);break;case"percent_cart_total":A=parseFloat(Mt.cart_total),Number.isFinite(A)||(A=0),I=h/100*A,h=L(h,s,p)/100*A,g=L(g,s,p)/100*A;break;case"percent":I=h/100*m,h=L(h,s,p)/100*m,g=g/100*_;break;case"percentcurrenttotal":Ht.tcepo.lateFieldsPrices[T].push({setter:t,price:h,original_price:g,bundleid:d,pricetype:u}),t.data("tm-price-for-late",h).data("tm-original-price-for-late",g).data("islate",1).addClass("tm-epo-late-field"),g=h=I=0;break;case"fixedcurrenttotal":h=L(h,s,p),Ht.tcepo.lateFieldsPrices[T].push({setter:t,price:h,original_price:g,bundleid:d,pricetype:u}),t.data("tm-price-for-late",h).data("tm-original-price-for-late",g).data("islate",1).addClass("tm-epo-late-field"),g=h=I=0;break;case"word":I=h*M(t.val()),h=L(h,s,p)*M(t.val()),g*=M(t.val());break;case"wordpercent":I=h/100*m*M(t.val()),h=L(h,s,p)/100*m*M(t.val()),g=g/100*_*M(t.val());break;case"wordnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=M(t.val())-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"wordpercentnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=M(t.val())-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"char":I=h*t.val().length,h=L(h,s,p)*t.val().length,g*=t.val().length;break;case"charpercent":I=h/100*m*t.val().length,h=L(h,s,p)/100*m*t.val().length,g=g/100*_*t.val().length;break;case"charnospaces":I=h*t.val().replace(/\s/g,"").length,h=L(h,s,p)*t.val().replace(/\s/g,"").length,g*=t.val().replace(/\s/g,"").length;break;case"charnofirst":x=t.val().length-1,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().length-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charpercentnon":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().length-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"charnonnospaces":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().replace(/\s/g,"").length-F,I=h*(x=x<0?0:x),h=L(h,s,p)*x,g*=x;break;case"charpercentnonnospaces":F=parseInt(t.attr("data-freechars"),10),Number.isFinite(F)||(F=0),x=t.val().replace(/\s/g,"").length-F,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"charpercentnofirst":x=t.val().length-1,I=h/100*m*(x=x<0?0:x),h=L(h,s,p)/100*m*x,g=g/100*_*x;break;case"step":h=S?(I=h*t.val(),L(h,s,p)*t.val()):(I=h*Ht.epoAPI.math.toFloat(t.val()),L(h,s,p)*Ht.epoAPI.math.toFloat(t.val())),g*=Ht.epoAPI.math.toFloat(t.val());break;case"currentstep":g=S?(I=t.val(),h=L(t.val(),s,p),L(t.val(),s,p)):(I=Ht.epoAPI.math.toFloat(t.val()),h=L(Ht.epoAPI.math.toFloat(t.val()),s,p),L(Ht.epoAPI.math.toFloat(t.val()),s,p));break;case"intervalstep":S&&(A=parseFloat(Ht('.tm-range-picker[data-field-id="'+t.attr("id")+'"]').attr("data-min")),I=h*(t.val()-A),h=L(h,s,p)*(t.val()-A),g*=t.val()-A);break;case"row":I=h*((t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1),h=L(h,s,p)*((t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1),g*=(t.val().match(/(\r\n|\n|\r)/gm)||[]).length+1}v=h,P=I,E=C=y=g,q.data("tm-quantity")&&(I*=parseFloat(q.data("tm-quantity")),C*=parseFloat(q.data("tm-quantity")),P*=parseFloat(q.data("tm-quantity")),E*=parseFloat(q.data("tm-quantity")),h*=parseFloat(q.data("tm-quantity")),g*=parseFloat(q.data("tm-quantity")),v*=parseFloat(q.data("tm-quantity")),y*=parseFloat(q.data("tm-quantity"))),O+=parseFloat(h),z+=parseFloat(g),b=$t(O,s,!1,!1,t),w=$t(z,s,!1,!1,t),q.data("price_set",1),t.data("price_set",1),t.data("undiscounted_raw_price",P),t.data("undiscounted_raw_original_price",E),t.data("undiscounted_price",Jt(I,s,t)),t.data("undiscounted_original_price",Jt(C,s,t)),t.data("raw_price",v),t.data("raw_original_price",y),t.data("price",Jt(h,s,t)),t.data("original_price",Jt(g,s,t)),i||(q.is(".tc-epo-field-product")&&(E=!1,!q.is("select")&&(q.is(":checkbox")||q.is(":radio"))?q.is(":checked")&&(E=!0):""!==q.val()&&(E=!0),E||(b=t.data("price-html"),w="")),H(t.closest(".tmcp-field-wrap").find(".tc-price"),O,b,z,w),q.data("price-changed",1))})))}function ce(a,t){var e,i,o,r,c,n,l,d,s,p,m,_,f,u,h=!0,g=a.main_product,v=a.epoEventId,y=a.this_epo_container,b=a.this_epo_totals_container,t=t||g.find(".cart");t.length<=0||(Ht.tcepo.lateFieldsPrices[v]=[],t.toArray().forEach(function(t){if(t=Ht(t),_="input[name^='variation_id']",0<t.find("input.variation_id").length&&(_="input.variation_id"),void 0!==t.data("per_product_pricing")&&(h=t.data("per_product_pricing")),e=t.find(_).val(),_=Ht.epoAPI.applyFilter("tc_get_bundleid",t.attr("data-product_id"),t,a),e=e||0,i=Ht.epoAPI.applyFilter("tc_get_epo_container",y,t,g,_),o=Ht.epoAPI.applyFilter("tc_get_totals_container",b,t,g,_),r=o.data("fields-price-rules"),i.data("tm_rules_init_done")||(o.data("force-quantity")&&t.find(Lt.qtySelector).val(o.data("force-quantity")),i.toArray().forEach(function(t){Ht(t).closest(".tmcp-field-wrap").find(".tm-epo-field").data("tm-quantity",Ht(t).val())}),i.find(".tmcp-attributes, .tmcp-elements").toArray().forEach(function(t){t=Ht(t),c=Ht.epoAPI.util.parseJSON(t.attr("data-rules")),"object"!=typeof(n=Ht.epoAPI.util.parseJSON(t.attr("data-original-rules")))&&(n={0:"0"}),"object"==typeof(c="object"!=typeof c?{0:"0"}:c)&&(l=L(c[Ht.epoAPI.math.toFloat(e)],o,r),d=$t(l,o),s=L(n[Ht.epoAPI.math.toFloat(e)],o,r),p=$t(s,o),t.find(".tmcp-field, .tmcp-fee-field ").toArray().forEach(function(t){t=Ht(t),h?("1"===t.attr("data-no-price")&&(s=l=0),t.data("raw_price",l),t.data("raw_original_price",s),t.data("price",Jt(l,o,t)),t.data("original_price",Jt(s,o,t)),H(t.closest(".tmcp-field-wrap").find(".tc-price"),l,d,s,p)):(t.data("price",0),t.data("original_price",0),t.closest(".tmcp-field-wrap").find(".amount").empty())}))}),i.data("tm_rules_init_done",1)),!h)return!0;f=oe(o),m=ie(o),u={cart:t,current_variation:e,bundleid:_,epoTotalsContainer:o,product_price:f,product_original_price:m,apply_dpd:r,per_product_pricing:h},_=i.find(".tmcp-field,.tmcp-sub-fee-field,.tmcp-fee-field"),a.is_associated||(_=_.not(Lt.associatedEpoSelector+" .tmcp-field,"+Lt.associatedEpoSelector+" .tmcp-sub-fee-field,"+Lt.associatedEpoSelector+" .tmcp-fee-field")),f=_.filter(".tcenabled"),(!Ht.tcepo.initialActivation[v]||0===f.length&&0<_.length)&&(_.each(function(){q(Ht(this))}),Ht.tcepo.initialActivation[v]=!0),_.filter(".tcenabled").each(function(t,e){Vt(a,e,u)}),_.each(function(t,e){Ht(e).on("tc_element_epo_rules",function(){Vt(a,e,u)})})}))}function ne(e,t,a,i,o,r,c,n){var l,d,s,p,m,_,f,u,h,g,v,y,b=0,w=0,x=0,F=0,k=e.epoEventId,A=void 0!==n?n:e.this_epo_totals_container.data("fields-price-rules"),P=t,I=a;return Ht.tcepo.lateFieldsPrices[k].forEach(function(t){l=t.price,d=t.original_price,s=t.pricetype,p=t.setter,v=t.bundleid,y="percentcurrenttotal"===s?"_hidden":"_hiddenfixed",(_=p).is("option")&&(_=p.closest("select")),P=parseFloat(Ht.epoAPI.applyFilter("tc_alter_product_price",P,_,c,e.this_epo_totals_container,r)),I=parseFloat(Ht.epoAPI.applyFilter("tc_alter_original_product_price",I,_,c,e.this_epo_totals_container,r)),m=Ht.epoAPI.dom.id(_.attr("name")),f=Ht(".tc-totals-form.tm-totals-form-"+c.attr("data-cart-id")).attr("data-product-id"),g=Ht(".tc-totals-form.tm-totals-form-"+c.attr("data-cart-id")).attr("data-epo-id"),f=Ht(".tc-extra-product-options.tm-product-id-"+f+"[data-epo-id='"+g+"']").find("#"+m+y),v===r?("percentcurrenttotal"===s?(l=parseFloat(l)/100*(L(parseFloat(P),e.this_epo_totals_container,A)+parseFloat(i)),d=parseFloat(d)/100*(parseFloat(I)+parseFloat(o))):"fixedcurrenttotal"===s&&(l=parseFloat(l)+parseFloat(i),d=parseFloat(d)+parseFloat(o)),_.data("tm-quantity")&&(l*=parseFloat(_.data("tm-quantity")),d*=parseFloat(_.data("tm-quantity"))),1===p.data("isset")&&q(p)&&(_.is(".tmcp-field")?(b+=l,w+=d):_.is(".tmcp-fee-field")&&(x+=l,F+=d)),g=Jt(l,c,p),v=Jt(d,c,p),u=$t(l,c,!1,!1,p),h=$t(d,c,!1,!1,p),p.data("price",g),p.data("pricew",g),p.data("original_price",v),p.data("original_pricew",v),H(p.closest(".tmcp-field-wrap").find(".tc-price"),g,u,v,h),0===f.length&&_.before('<input type="hidden" id="'+m+y+'" name="'+m+y+'" value="'+$(l,c)+'">'),p.is(".tm-epo-field.tmcp-radio")&&!p.is(":checked")||f.val($(l,c))):void 0!==p.data("pricew")&&(u=$t(p.data("pricew"),c,!0,!1,p),h="",void 0!==p.data("original_pricew")&&(h=$t(p.data("original_pricew"),c,!0,!1,p)),H(p.closest(".tmcp-field-wrap").find(".tc-price"),p.data("pricew"),u,p.data("original_pricew"),h))}),{normal:[b,w],fees:[x,F]}}function ct(){var t;"yes"!==Mt.tm_epo_no_lazy_load&&((t=h?Ht(h).find("img.tmlazy"):Ht(".tc-extra-product-options img.tmlazy")).lazyLoadXT(),t.on("lazyshow",function(){Rt.trigger("lazyLoadXToncomplete")}))}function nt(t){var e,a;t&&(a=Ht(".cart"),t.find(".tm-owl-slider-section").each(function(){(e=Ht(this)).find(".tc-slider-content").addClass("tm-owl-slider"),(e=e.find(".tm-owl-slider")).addClass("tcowl-carousel-show").addClass("tcowl-carousel").on("changed.owl.carousel",function(){a.css("display","block").addClass("slider-setup")}).tmowlCarousel(Object.assign({rtl:"1"===Mt.isRTL,dots:!1,nav:!0,items:1,autoHeight:!0,mouseDrag:!1,touchDrag:!0,navText:[Mt.i18n_prev_text,Mt.i18n_next_text],navClass:["owl-prev button","owl-next button"],navElement:"a",loop:!1,navRewind:!1},P.tmowlCarouselSettings||{})),e.removeClass("tcowl-carousel-show")}),Ht.fn.tcTabs)&&t.find(".tc-tabs").tcTabs({headers:"tc-tab-headers",header:"tab-header",dataopenattribute:"data-tab",sortabletabs:!1})}function lt(a,t){var e=t.closest(".cpf-element").data("repeater-max-rows"),i=t.find(".tc-repeater-element"),o=i.length,r=i.last(),i=i.last().find(".tmcp-ul-wrap"),c=a.data("tc-repeater-id"),n=a.data("tc-repeater-init");return!(e&&e<=o)&&(e<=o+1&&a.is(".tc-repeater-add")&&a.closest(".tc-repeater-wrap").addClass("tc-hidden"),i.is(".tm-element-ul-date, .tm-element-ul-time")&&(i.find(".tm-epo-field").tm_datepicker("destroy"),i.find(".tmcp-date-select").off()),i.is(".tm-element-ul-color")&&i.find(".tm-epo-field").spectrum("destroy"),(e=r.tcClone(!0)).find(".tm-epo-field").attr("id",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-for]").attr("data-for",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[for]").attr("for",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-field-id]").attr("data-field-id",function(t,e){return e.replace(/\_\d+$/g,"")+"_"+n}),e.find("[data-tm-date]").attr("data-tm-date",function(){return c+"_"+n}),e.find(".tm-epo-field").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tm-qty").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tmcp-date-select").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+n+"]")}),e.find(".tmcp-date-select").attr("id",function(t,e){return c+"_"+n+"_"+e.substring(e.lastIndexOf("_")+1)}),o=e.find(".tmcp-ul-wrap"),0<t.find(".tc-repeater-element").length&&(t.find(".tc-repeater-delete").removeClass("tc-hidden"),e.find(".tc-repeater-delete").removeClass("tc-hidden")),o.is(".tm-element-ul-checkbox")?(e.find("li.tmcp-field-wrap").removeClass("tc-active"),e.find(".tm-epo-field.tmcp-checkbox").prop("checked",!1),e.find(".tm-epo-field.tmcp-checkbox").filter(function(t,e){return-1!==Ht.inArray(Ht(e).val(),a.data("repeater-init-value"))}).prop("checked",!0).closest("li.tmcp-field-wrap").addClass("tc-active")):o.is(".tm-element-ul-radio")?(e.find("li.tmcp-field-wrap").removeClass("tc-active"),e.find(".tm-epo-field.tmcp-radio").filter(function(t,e){return Ht(e).val()===a.data("repeater-init-value")}).prop("checked",!0).closest("li.tmcp-field-wrap").addClass("tc-active")):e.find(".tm-epo-field").val(a.data("repeater-init-value")),o.is(".tm-element-ul-checkbox")||o.is(".tm-element-ul-radio")||e.find(".tm-epo-field").val(a.data("repeater-init-value")),a.data("tc-repeater-init",a.data("tc-repeater-init")+1),[e,r,i])}function dt(i,t,e,a,o){var r=t.find(".tmcp-ul-wrap");r.is(".tm-element-ul-range")&&(t.find(".tm-range-picker").removeData("tc-picker-init").attr("class","tm-range-picker").html(""),wt(t)),r.is(".tm-element-ul-date, .tm-element-ul-time")&&(kt(a),kt(r)),r.is(".tm-element-ul-color")&&(mt(a),mt(r)),t.find(".tm-tooltip").removeData("tctooltip").removeData("tm-has-tm-tip"),Ht.tcToolTip(t.find(".tm-tooltip")),t.find(".tm-epo-field").removeData("addedtcEpoBeforeOptionPriceCalculation").each(function(t,e){var a=Ht(e);q(a,!1,!0),a.is(".tcenabled")&&Vt(i,a),a.on("tc_element_epo_rules",function(){Vt(i,a)})}),o&&(r.is(".tm-element-ul-checkbox")?t.find(".tm-epo-field.tmcp-checkbox").filter(":checked"):r.is(".tm-element-ul-radio")?t.find(".tm-epo-field.tmcp-radio").filter(":checked"):t.find(".tm-epo-field")).trigger("change.cpf")}function st(t,e,a,i){var o=t.closest(".cpf-element").data("repeater-min-rows"),r=t.find(".tc-repeater-element").length,c=e.index();o&&r<=o?i&&(o='<div class="tm-error-repeater tm-error tc-cell tcwidth tcwidth-100">'+Ht.tc_validator.messages.repeaterminrows(o)+"</div>",i.tcToolTip({tip:o,onetime:!0,trigger:!0,tipclass:"tc-error"})):1!==r&&(2===r&&t.find(".tc-repeater-delete").addClass("tc-hidden"),a.is(".tc-repeater-add")&&a.closest(".tc-repeater-wrap").removeClass("tc-hidden"),e.remove(),a.data("tc-repeater-init",a.data("tc-repeater-init")-1),c+1!==r)&&t.find(".tc-repeater-element").toArray().forEach(function(t,a){(t=Ht(t)).find(".tm-epo-field").attr("id",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-for]").attr("data-for",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[for]").attr("for",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-field-id]").attr("data-field-id",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find("[data-tm-date]").attr("data-tm-date",function(t,e){return e.replace(/\_\d+$/g,"")+(0!==a?"_"+a:"")}),t.find(".tm-epo-field").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")}),t.find(".tm-qty").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")}),t.find(".tmcp-date-select").attr("name",function(t,e){return e.replace(/\[\d+\]/g,"["+a+"]")})})}function pt(_,f){var u,h,g;_&&(_=Ht(_)).length&&(u=f.main_cart,h=Kt(u),h=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantity",h,{epo:f,currentCart:u,obj:_,qtyElement:h}),(g=_.find(".tc-repeater-quantity")).toArray().forEach(function(t,p){var e,m=Ht(t);m.data("tc-repeater-init")||(e=(t=m.find(".tc-repeater-element")).length,(t=t.first().find(".tm-epo-field")).is(":checkbox")?m.data("repeater-init-value",t.filter(":checked").toArray().map(function(t){return Ht(t).val()})):t.is(":radio")?m.data("repeater-init-value",t.filter(":checked").val()):m.data("repeater-init-value",t.val()),m.data("tc-repeater-init",e),m.data("tc-repeater-id",t.attr("id")),m.data("tc-repeater-name",t.attr("name")),h.length&&(h.off("change.r"+p+"cpf input.r"+p+"cpf").on("change.r"+p+"cpf input.r"+p+"cpf",function(t){var e,a,i,o,r,c,n=Ht(this),l=n.data("tm-prev-value"),d=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantityValue",n.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:n}),s=d-l;if(void 0===l&&(s=d-(l=d-1)),0!==(s=void 0!==t.isTrigger?d-(l=m.find(".tc-element-inner-wrap").find(".tc-repeater-element").length):s)){if(e=m.find(".tc-element-inner-wrap"),(t=Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantity_tm-prev-value",n.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:n}))<=0&&(t=1),p===g.length&&n.data("tm-prev-value",t),0<s){if((a=e.find(".tc-repeater-element").eq(d-1)).length)return;for(i=0;i<s;i++)(r=lt(m,e))&&(o=o?o.add(r[0]):r[0],0===i)&&(r[1],c=r[2]);o&&(o.appendTo(e.find(".tc-element-container")),dt(f,o,0,c))}else for(i=d-s;d<i;--i)a=e.find(".tc-repeater-element").eq(i-1),st(e,a,m);u.trigger({type:"tm-epo-update",norules:2})}}),h.data("tm-prev-value",Ht.epoAPI.applyFilter("qtyElementForRepeaterQuantityValue",h.val(),{epo:f,currentCart:u,obj:_,qtyElement:h,field:h})).trigger("change")))}),_.find(".tc-repeater-add").toArray().forEach(function(t){var e,a,i=Ht(t);i.data("tc-repeater-init")||(a=(t=(e=i.closest(".tc-element-inner-wrap")).find(".tc-repeater-element")).length,t=t.first().find(".tm-epo-field"),1<e.find(".tc-repeater-element").length&&e.find(".tc-repeater-delete").removeClass("tc-hidden"),t.is(":checkbox")?i.data("repeater-init-value",t.filter(":checked").toArray().map(function(t){return Ht(t).val()})):t.is(":radio")?i.data("repeater-init-value",t.filter(":checked").val()):i.data("repeater-init-value",t.val()),i.data("tc-repeater-init",a),i.data("tc-repeater-id",t.attr("id")),i.data("tc-repeater-name",t.attr("name")),i.on("click.repeater",function(){var t=lt(i,e);t&&(t[0].appendTo(e.find(".tc-element-container")),dt(f,t[0],t[1],t[2],!0))}))}),_.find(".tc-repeater-delete .delete").on("click",function(){var t=Ht(this),e=t.closest(".tc-element-inner-wrap");st(e,t.closest(".tc-repeater-element"),e.find(".tc-repeater-add"),t)}))}function mt(t){t&&(t=Ht(t).find(".tm-color-picker")).length&&(t.spectrum({type:"color",theme:"epo",showButtons:!0,allowEmpty:!0,showInitial:!0,showInput:!0,clickoutFiresChange:!1,chooseText:Mt.closeText,cancelText:Mt.i18n_cancel}),t.spectrum("enable"))}function _t(t){t&&Ht(t).length&&Ht(function(){Ht(t).tclightbox()})}function ft(t){var e=t.closest(".tmcp-field-wrap").find("label img"),a=Ht(e).first().attr("data-original");return t.is("select.tm-product-image")&&(t=t.children("option:selected")),a=(a=a||Ht(e).first().attr("src"))||t.attr("data-image"),!(t.attr("data-imagep")?!t.attr("data-imagep"):!a)}function ut(t){var i,o,r,c,t=t.is_associated?t.this_epo_container.find(".tm-epo-field.tmcp-upload"):t.this_epo_container.find(".tm-epo-field.tmcp-upload").not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload");try{t.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload").toArray().forEach(function(t){var e,a;return c=[],""!==(i=Ht(t)).attr("data-file")&&0!==(e=i.attr("data-file").split("|")).length&&((F||k)&&(o=new F("").clipboardData||new k),e.forEach(function(t){a=Ht.epoAPI.util.basename(t),(F||k)&&o.items.add(new File([t],a)),c.push(t)}),o&&(t.files=o.files),c=c.join("|"),r=i.attr("name"),i.trigger("tcupload"),i.after('<input type="hidden" class="tmcp-upload-hidden" name="'+r+'" value="'+c+'">'),void i.removeAttr("data-file"))})}catch(t){P.console.log(t),Ht(".tm-epo-field.tmcp-upload").not(".tm-multiple-file-upload").addClass("tc-nodt"),b=t}}function ht(t,e,a){var i=a.find(".flex-control-nav li:eq(0) img"),a=a.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),o=e,e=e.closest("a"),r=e.next(".zoomImg");t&&t.image_link&&t.image_link&&1<t.image_link.length?(null!==t.full_src&&""!==t.full_src||(t.full_src=t.image_link),null!==t.full_src_w&&""!==t.full_src_w||(t.full_src_w=o.attr("data-large_image_width")),null!==t.full_src_h&&""!==t.full_src_h||(t.full_src_h=o.attr("data-large_image_height")),o.length&&(t.image_srcset||(t.image_sizes=!1),t.image_sizes||(t.image_srcset=!1),o.tc_set_attr("src",t.image_link,0),o.tc_set_attr("srcset",t.image_srcset,0),o.tc_set_attr("sizes",t.image_sizes,0),o.tc_set_attr("title",t.image_title,0),o.tc_set_attr("alt",t.image_alt,0),o.tc_set_attr("data-src",t.full_src,0),o.tc_set_attr("data-large_image",t.full_src,0),o.tc_set_attr("data-large_image_width",t.full_src_w,0),o.tc_set_attr("data-large_image_height",t.full_src_h,0),a.tc_set_attr("data-thumb",t.image_link,1)),i.length&&i.tc_set_attr("src",t.image_link,2),e.length&&(e.tc_set_attr("href",t.full_src,3),e.tc_set_attr("title",t.image_caption,3)),r.length&&r.tc_set_attr("src",t.full_src,4)):(o.length&&(o.tc_reset_attr("src",0),o.tc_reset_attr("srcset",0),o.tc_reset_attr("sizes",0),o.tc_reset_attr("title",0),o.tc_reset_attr("alt",0),o.tc_reset_attr("data-src",0),o.tc_reset_attr("data-large_image",0),o.tc_reset_attr("data-large_image_width",0),o.tc_reset_attr("data-large_image_height",0),a.tc_reset_attr("data-thumb",1)),i.length&&i.tc_reset_attr("src",2),e.length&&(e.tc_reset_attr("href",3),e.tc_reset_attr("title",3)),r.length&&r.tc_reset_attr("src",4))}function j(t,e){var a;return t.is_associated?a=e.find(".tc-product-image .wp-post-image").first():""!==Mt.tm_epo_global_product_image_selector?a=Ht(Mt.tm_epo_global_product_image_selector):0===(a=0===(a=0===(a=0===(a=0===(a=e.find(".woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)").eq(0).find(".wp-post-image").first()).length?e.find("a.woocommerce-main-image img, img.woocommerce-main-image,a img").not(".thumbnails img,.product_list_widget img").first():a).length?e.find("img.wp-post-image").not(".thumbnails img,.product_list_widget img").first():a).length?e.find(".elementor-widget-wd_single_product_gallery img.wp-post-image").first():a).length?e.find(".elementor-widget-ae-post-image .wp-post-image").first():a).length&&(a=Ht(".woocommerce div.product div.images").not(".thumbnails img,.product_list_widget img").first()),a=1<Ht(a).length?Ht(a).first():a}function gt(t){var e,a;return t.is_associated?t.main_product.closest(".tc-epo-element-product-container"):(e=t.main_product,t=t.product_id,(a=e.closest("#product-"+t)).length<=0?e.closest(".post-"+t):a)}function z(t,e,a,i,o,r,c){var n,l,d,s;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&(n=t[n]).enabled)switch(n.type){case"yith":e?(e.attr("srcset",a).attr("src-orig",a),n.element.data("yith_magnifier")&&n.element.yith_magnifier("destroy"),l={elements:{zoom:Ht(".yith_magnifier_zoom"),zoomImage:e,gallery:Ht(".yith_magnifier_gallery li a")}},n.element.yith_magnifier(Ht.extend(!0,{},P.yith_magnifier_options,l))):(i?n.yith_wcmg_zoom.attr("href",n.yith_wcmg_default_zoom):n.yith_wcmg_zoom.attr("href",n._yith_wcmg_default_zoom),n.element.data("yith_magnifier")&&n.element.yith_magnifier("destroy"),n.element.yith_magnifier(P.yith_magnifier_options));break;case"iosslider":setTimeout(function(t){t.element.iosSlider("update")}.bind(null,n),150);break;case"flexslider":Rt.trigger("resize");break;case"elevatezoom":n.element.each(function(t,e){e=e(this).data("elevateZoom");void 0!==e&&e.swaptheimage(t,t)}.bind(null,a,Ht));break;case"easyzoom":n.element.swap(null,a);break;case"easyzoom-flatsome":n.element.swap(a,a);break;case"woocommerce":e&&(n.element.flexslider(0),n.element.trigger("woocommerce_gallery_reset_slide_position"),l=n.element,P.setTimeout(function(t,e){t.trigger("woocommerce_gallery_init_zoom"),e.trigger("resize")}.bind(null,l,Rt),10));break;case"zoom":c&&(s=c.find(".woocommerce-product-gallery--with-images").width(),d=!1,(d=n.element.find("img.wp-post-image").attr("data-large_image_width")>s?!0:d)?(s={touch:!1},"ontouchstart"in P&&(s.on="click"),n.element.trigger("zoom.destroy"),n.element.zoom(s)):n.element.trigger("zoom.destroy"))}Rt.trigger("tm_gallery_compatibility_actions",{event_data:o,product_element:c,form:r})}function vt(t,e,a){var i,o,r,c,n,l,d,s,p,m,_,f,u,h,g,v,y,b,w;return t.is_associated?{}:(t=!1,i=Ht(".images"),o=Ht(".yith_magnifier_zoom"),r=i.find(".yith_magnifier_zoom").first().attr("href"),c=i.find(".yith_magnifier_zoom img").first().attr("src"),n=!1,l=Ht(".iosSlider.product-gallery-slider,.iosSlider.product-slider"),d=!1,s=a.find(".images .fusion-flexslider"),p=e.data("elevateZoom")||!1,m=a.find("div.product-images .woocommerce-main-image"),_=!1,f=a.find(".images .easyzoom"),u=!1,h=a.find(".images .easyzoom"),g=!1,v=a.find(".woocommerce-product-gallery"),y=P.wc_single_product_params,b="function"==typeof Ht.fn.zoom&&y&&y.zoom_enabled,w=!1,P.yith_magnifier_options&&i.data("yith_magnifier")&&(t=!0),l.length&&l.iosSlider&&(n=!0),s.length&&s.flexslider&&(d=!0),f.length&&f.filter(".images .easyzoom.first").data("easyZoom")&&(f=f.filter(".images .easyzoom.first").data("easyZoom"),_=!0),_||(h=a.find(".images .has-image-zoom .slide")).length&&h.filter(".images .has-image-zoom .slide.first").data("easyZoom")&&(h=h.filter(".images .has-image-zoom .slide.first").data("easyZoom"),u=!0),"complete"===x.readyState?setTimeout(function(){f.length&&f.data("easyZoom")&&(f=f.data("easyZoom"),_=!0),h.length&&h.data("easyZoom")&&(h=h.data("easyZoom"),u=!0)},150):Rt.on("load",function(){setTimeout(function(){f.length&&f.data("easyZoom")&&(f=f.data("easyZoom"),_=!0),h.length&&h.data("easyZoom")&&(h=h.data("easyZoom"),u=!0)},150)}),v.length&&v.data("flexslider")&&(g=!0,"function"==typeof Ht.fn.zoom)&&y&&y.zoom_enabled&&0<(y=e.closest(".woocommerce-product-gallery__image")).length&&e.width()>Ht(".woocommerce-product-gallery").width()&&(e.data.wc27_zoom_target=y),!g&&b&&(w=a.find(".woocommerce-product-gallery__image")),{is_yith_wcmg:{type:"yith",enabled:t,element:i,yith_wcmg_zoom:o,_yith_wcmg_default_zoom:r,yith_wcmg_default_image:c},is_iosSlider:{type:"iosslider",enabled:n,element:l},is_flexslider:{type:"flexslider",enabled:d,element:s},is_elevateZoom:{type:"elevatezoom",enabled:p,element:m},is_easyzoom:{type:"easyzoom",enabled:_,element:f},is_easyzoom_flatsome:{type:"easyzoom-flatsome",enabled:u,element:h},is_wc27_gallery:{type:"woocommerce",enabled:g,element:v},is_zoom_enabled:{type:"zoom",enabled:!g&&b,element:w}})}function yt(c){var n,i,o,r,t,l=c.is_associated?c.this_epo_container:c.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),d=c.variations_form,e=c.main_product,s=c.form,p=gt(c),m=[],a=c.is_associated?"tc_":"",_=j(c,p),f=vt(c,_,p);0<Ht(_).length&&(s.on(a+"reset_image.tcpi",function(){setTimeout(function(){"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p),Ht.tc_product_image_store=t),Ht.tc_product_image=Ht.tc_replace_object_values(Ht.tc_product_image,Ht.tc_product_image_store),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length?m[m.length-1].trigger("tm_trigger_product_image"):Ht.tc_product_image_store=Ht.tc_populate_store(_,p)},P.tc_epo_product_image_change_delay||0)}),s.on(a+"found_variation.tcpi",function(){setTimeout(function(){var t,e,a,i,o,r;"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p)),a=_,t=(i=p).find(".flex-control-nav li:eq(0) img"),r=i.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),e=(o=a).closest("a"),Ht.isEmptyObject(Ht.tc_product_image)?Ht.tc_product_image_store=Ht.tc_populate_store(a,i):(Ht.tc_product_image_store=Ht.tc_pre_populate_store(),Ht.tc_product_image_store=Ht.tc_maybe_copy_object_values(Ht.tc_product_image_store,Ht.tc_product_image)),o.tc_update_attr("src",0),o.tc_update_attr("srcset",0),o.tc_update_attr("sizes",0),o.tc_update_attr("title",0),o.tc_update_attr("alt",0),o.tc_update_attr("data-src",0),o.tc_update_attr("data-large_image",0),o.tc_update_attr("data-large_image_width",0),o.tc_update_attr("data-large_image_height",0),r.tc_update_attr("data-thumb",1),t.tc_update_attr("src",2),e.tc_update_attr("href",3),e.tc_update_attr("title",3),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length&&(a=_,o=(i=p).find(".flex-control-nav li:eq(0) img"),i=i.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),a=(r=a).closest("a"),r.attr("data-o_src",Ht.tc_product_image_store[0].src),r.attr("data-o_srcset",Ht.tc_product_image_store[0].srcset),r.attr("data-o_sizes",Ht.tc_product_image_store[0].sizes),r.attr("data-o_title",Ht.tc_product_image_store[0].title),r.attr("data-o_alt",Ht.tc_product_image_store[0].alt),r.attr("data-o_data-src",Ht.tc_product_image_store[0]["data-src"]),r.attr("data-o_data-large_image",Ht.tc_product_image_store[0]["data-large_image"]),r.attr("data-o_data-large_image_width",Ht.tc_product_image_store[0]["data-large_image_width"]),r.attr("data-o_data-large_image_height",Ht.tc_product_image_store[0]["data-large_image_height"]),i.attr("data-o_data-thumb",Ht.tc_product_image_store[1]["data-thumb"]),Ht.tc_product_image_store[2]&&o.attr("data-o_src",Ht.tc_product_image_store[2].src),a.attr("data-o_href",Ht.tc_product_image_store[3].href),a.attr("data-o_title",Ht.tc_product_image_store[3].title),m[m.length-1].trigger("tm_trigger_product_image"))},P.tc_epo_product_image_change_delay||0)}),Ht.tc_product_image_store=Ht.tc_maybe_copy_object_values_from_img(Ht.tc_product_image_store,_,p),t=Ht.epoAPI.util.deepCopyArray(Ht.tc_product_image_store),e.off("tm_change_product_image").on("tm_change_product_image",function(t,e){var a;t.stopImmediatePropagation(),i=e.element,o=e.element_current,i&&o&&(o=i.data("imagep"),(r="")!==o?r="imagep":"images"===i.data("changes-product-image")&&(r="image"),void 0!==(a=(a=e.element_current.data("image-variations"))&&a[r]))&&(m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=(n=Ht(this)).is("option")?n.closest("select"):n)&&""!==n.val()&&m.push(n)}),!m.length||m[m.length-1].is(i))&&setTimeout(function(){"yes"===Mt.tm_epo_global_image_recalculate&&(_=j(c,p)),ht(a,_,p),z(f,_,a.image_link,!1,e,s,p)},P.tc_epo_product_image_change_delay||0)}),e.off("tm_restore_product_image").on("tm_restore_product_image",function(t,e){t.stopImmediatePropagation(),i=!!e&&e.element,m=[],i&&(Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length)&&!m[m.length-1].is(i)?m[m.length-1].trigger("tm_trigger_product_image"):(ht(!1,_,p),z(f,!1,_.attr("src"),!1,e,s,p))}),m=[],Ht(l.find(".tm-product-image:checked,select.tm-product-image")).add(d.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(n=Ht(this))&&""!==n.val()&&m.push(n)}),m.length)&&m[m.length-1].trigger("tm_trigger_product_image"),Rt.trigger("tm_product_image_loaded")}function bt(r){setTimeout(function(){var t,u,h,f,g,v,e,a,y,b,i,o,w,x;"inline"===Mt.tm_epo_global_product_image_mode?(e=(t=r).is_associated?t.this_epo_container:t.this_epo_container.not(Lt.epoSelector+" "+Lt.associatedEpoSelector),a=t.main_product,y=t.product_id,b=t.form,i=gt(t),o=[],w=j(t,i),x=vt(t,w,i),0<Ht(w).length&&(w.data("tm-current-image",!1),u=w.closest("a"),h=w.attr("src"),f=w.width(),g=w.height(),a.off("tm_change_product_image").on("tm_change_product_image",function(t,e){var a,i,o,r=[],c=e.element.closest(".cpf-section"),n=c.is(".tm-epo-variation-section"),l=e.epo_holder,n=(l=n?c:l).find(".tm-product-image:checked,select.tm-product-image"),r=[],d=e.element.attr("id"),c=!0,l=e.main_product,s=l.closest("#product-"+y),p=f,m=g,_=Ht("<div class='blockUI blockOverlay tm-preloader-img'></div>");0===(l=(s=s.length<=0?l.closest(".post-"+y):s).find("#"+d+"_tmimage")).length&&(l=w),o=function(){_.remove(),b.tc_image_update(!1),w.data("tm-current-image",!1),s.find(".tm-clone-product-image").hide(),w.show()},e.src===l.attr("src")&&l.is(":visible")||(!1===e.src?o():(_.css({width:p,height:m}),n.each(function(){q(v=Ht(this))&&ft(v)&&U({element:v.closest(".cpf-element"),operator:"isnotempty",value:""})&&r.push(v)}),(n=r.length?r[r.length-1]:n).attr("id")!==e.element.attr("id")&&(c=!1),a=w.tcClone(),i=new Image,a.removeAttr("data-o_src").removeAttr("data-o_title").removeAttr("data-o_alt").removeAttr("data-o_srcset").removeAttr("data-o_sizes").removeAttr("srcset").removeAttr("sizes"),c&&w.before(_),x.is_yith_wcmg.yith_wcmg_default_zoom=x.is_yith_wcmg.element.find(".yith_magnifier_zoom").first().attr("href"),x.is_yith_wcmg.yith_wcmg_default_image=x.is_yith_wcmg.element.find(".yith_magnifier_zoom img").first().attr("src"),i.onerror=function(){o()},i.onload=function(){if("naturalHeight"in this){if(this.naturalHeight+this.naturalWidth===0)return void this.onerror()}else if(this.width+this.height===0)return void this.onerror();s.find("#"+d+"_tmimage").remove(),s.find(".tm-clone-product-image").hide(),a.prop("src",i.src).hide(),w.hide().after(a),a.css("opacity",0).show(),z(x,a,i.src),_.animate({opacity:0},750,"easeOutExpo",function(){_.remove()}),a.animate({opacity:1},P.tc_epo_image_animation_delay||1500,"easeOutExpo",function(){}),Rt.trigger("tm_change_product_image_loaded",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})},a.attr("id",d+"_tmimage").addClass("tm-clone-product-image").hide(),a.attr("src-orig")&&a.attr("src-orig",e.src),c?(i.src=e.src,b.tc_image_update(e.element,a),w.data("tm-current-image",d),Rt.trigger("tm_change_product_image_show",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})):(a.prop("src",e.src).hide(),w.after(a)),Rt.trigger("tm_change_product_image_end",{src:e.src,element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})))}),a.off("tm_restore_product_image").on("tm_restore_product_image",function(t,e){var a,i,o,r,c,n,l,d,s,p,m,_;if(!e||!e.element)return!1;if(Rt.trigger("tm_restore_product_image_pre",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder}),a=e.element.attr("id"),o=(i=e.main_product).closest("#product-"+y),l=(d=e.element.closest(".cpf-section")).is(".tm-epo-variation-section"),n=!1,p=h,m=e.epo_holder,l&&(m=d),l=(o=o.length<=0?i.closest(".post-"+y):o).find("#"+a+"_tmimage").is(":visible"),o.find("#"+a+"_tmimage").remove(),0===o.find(".tm-clone-product-image").length)w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1);else{if(!l)return void Rt.trigger("tm_restore_product_image_loaded_exit",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder});for(d=o.find(".tm-clone-product-image").length,a=w.data("tm-current-image"),_=d-1;0<=_;--_){if(r=(c=o.find(".tm-clone-product-image").eq(_)).attr("id").replace("_tmimage",""),(s=m.find("[id='"+r+"']")).is(":checked")&&s.closest(".cpf-element").is(":visible")){o.find(".tm-clone-product-image").eq(_).show(),u.attr("href",o.find(".tm-clone-product-image").eq(_).prop("src")),w.data("tm-current-image",r),n=!0;break}o.find(".tm-clone-product-image").eq(_).hide()}n?o.find("#"+a+"_tmimage").remove():(w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1))}n&&(p=c.attr("src")),z(x,!1,p,o.find(".tm-clone-product-image").filter(":visible").length),Rt.trigger("tm_restore_product_image_loaded",{element:e.element,main_product:e.main_product,epo_holder:e.epo_holder})}),a.off("tm_attempt_product_image").on("tm_attempt_product_image",function(t,e){var a,i,o,r,c,n=e.main_product,l=n.closest("#product-"+y),d=e.element?e.element.closest(".cpf-section"):Ht(n.find(".tm-epo-variation-section").first(),e.epo_holder),s=d.is(".tm-epo-variation-section"),p=e.epo_holder,s=(p=s?d:p).find(".tm-product-image:checked,select.tm-product-image"),d="",m=!(a=[]),_=w.data("tm-current-image"),f=h;if(l.length<=0&&(l=n.closest(".post-"+y)),(s=(p=n.find(".tm-epo-variation-section").first().add(e.epo_holder)).find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(v=Ht(this))&&ft(v)&&U({element:v.closest(".cpf-element"),operator:"isnotempty",value:""})&&a.push(v)}),a.length&&(d=(s=a[a.length-1]).attr("id")),!a.length||!s.length||_&&d===_){if(n=p.find("[id='"+_+"']").closest(".cpf-element"),_&&(!1===n.data("isactive")||!1===n.closest(".cpf-section").data("isactive"))){if(l.find("#"+_+"_tmimage").remove(),0===(e=l.find(".tm-clone-product-image").length))w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1);else{for(c=e-1;0<=c;--c){if(o=(i=l.find(".tm-clone-product-image").eq(c)).attr("id").replace("_tmimage",""),(r=p.find("[id='"+o+"']")).is(":checked")&&r.closest(".cpf-element").is(":visible")){l.find(".tm-clone-product-image").eq(c).show(),u.attr("href",l.find(".tm-clone-product-image").eq(c).prop("src")),w.data("tm-current-image",o),m=!0;break}l.find(".tm-clone-product-image").eq(c).hide()}m||(w.show(),w.data("tm-current-image",!1),b.tc_image_update(!1))}m&&(f=i.attr("src")),z(x,!1,f,l.find(".tm-clone-product-image").filter(":visible").length)}}else s.last().trigger("tm_trigger_product_image")}),Ht(e.find(".tm-product-image:checked,select.tm-product-image")).add(a.find(".tm-epo-variation-section").first().find(".tm-product-image:checked,select.tm-product-image")).each(function(){q(v=Ht(this))&&""!==v.val()&&o.push(v)}),o.length)&&o[o.length-1].trigger("tm_trigger_product_image"),Rt.trigger("tm_product_image_loaded")):yt(r)},P.tc_epo_product_image_setup_delay||0)}function wt(m){_&&m.find(".tm-range-picker").toArray().forEach(function(t){var a,t=Ht(t),i=t.attr("data-step").split("."),o=m.find("#"+Ht.epoAPI.dom.id(t.attr("data-field-id"))),e=parseFloat(t.attr("data-min")),r=parseFloat(t.attr("data-max")),c=parseFloat(t.attr("data-start")),n=parseFloat(t.attr("data-step")),l=t.attr("data-show-picker-value"),d=t.closest("li").find(".tm-show-picker-value"),s=parseFloat(t.attr("data-noofpips")),p=null;t.data("tc-picker-init")||(t.data("tc-picker-init",1),i=1===i.length?0:i[1].length,Number.isFinite(e)||(e=0),(r=Number.isFinite(r)?r:0)<=e&&(r=parseFloat(r)+1),c=Ht.epoAPI.math.unformat(c,Lt.localDecimalSeparator),c=Qt(c=Number.isFinite(c)?c:0,{precision:i}),Number.isFinite(n)||(n=0),(s=Number.isFinite(s)?s:10)<2&&(s=2),"yes"===t.attr("data-pips")&&(p={mode:"count",values:s,filter:function(t,e){return t=parseFloat(Ht.epoAPI.math.toFixed(t,i)),n<=0?0:1!==e||Number.isInteger(t)?e:2},format:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}},density:2}),_.create(t.get(0),{direction:Mt.text_direction,start:c,step:n,connect:"lower",behaviour:"tap",format:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}},range:{min:[e],max:[r]},pips:p,tooltips:{from:function(t){return Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator)},to:function(t){return Qt(t,{precision:i})}}}),a=t.find(".noui-handle-lower"),t.get(0).noUiSlider.on("slide",function(){o.trigger("change.cpf")}),t.get(0).noUiSlider.on("update",function(t,e){t[e]=Ht.epoAPI.math.unformat(t[e],Lt.localDecimalSeparator),e=0,"left"!==l&&"right"!==l&&a.attr("title",Qt(t[e],{precision:i})),o.val(t[e]).trigger("change"),""!==l&&d.html(Qt(t[e],{precision:i}))}),""!==l&&d.html(c),"left"!==l&&"right"!==l&&(a.attr("title",c),t.addClass("noui-show-tooltip")))})}function xt(){_&&!C.data("setRangePickersEvents")&&(C.on("click",".tm-show-picker-value",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap"),a=e.find(".tmcp-range").val(),i=t.closest(".tmcp-field-wrap").find(".tm-range-picker");t.addClass("tc-hidden").after(Ht('<input type="number" class="tm-show-picker-value-edit">')),(t=e.find(".tm-show-picker-value-edit")).focus().val(a).wrap('<div class="tm-show-picker-value-edit-wrap"></div>'),t.attr("step",i.attr("data-step")),t.attr("min",i.attr("data-min")),t.attr("max",i.attr("data-max")),C.data("range-picker-edit",e.find(".tm-show-picker-value-edit"))}),C.on("change input",".tm-show-picker-value-edit",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap").find(".tm-range-picker"),a=e.attr("data-step").split("."),t=t.val(),a=1===a.length?0:a[1].length;e.get(0).noUiSlider.set([Qt(t,{precision:a}),null])}),C.on("keydown",".tm-show-picker-value-edit",function(t){13===t.which&&t.preventDefault()}),C.on("click",function(t){C.data("range-picker-edit")&&!Ht(t.target).is(".tm-show-picker-value")&&0===Ht(t.target).closest(".tm-show-picker-value-edit-wrap").length&&((t=C.data("range-picker-edit")).closest(".tmcp-field-wrap").find(".tm-show-picker-value").data("has-edit",0).removeClass("tc-hidden"),t.closest(".tm-show-picker-value-edit-wrap").remove(),C.removeData("range-picker-edit"))}),C.data("setRangePickersEvents",1))}function Ft(t){var e,a,i,o,r;if(t.toString().isNumeric()&&0!==(e=0===t?t:0<t?1:-1)){for(a=new Date,o=!(i=1),r=Math.abs(t);i<=r;)!1===o&&(o=0),a.setDate(a.getDate()+ +e),o++,0!==a.getDay()&&6!==a.getDay()&&i++;!1!==o&&(t=o*e)}return t}function kt(y){var g,t,e=".tm-epo-timepicker";Ht.tm_datepicker&&(g=Ht("input").map(function(){return this.id}).get().join(" "),(t=x.createElement("input")).setAttribute("type","date"),"text"===t.type&&(e=".tm-epo-system-timepicker"),y.find(e).toArray().forEach(function(t){var a=Ht(t),t=null,e=null,i=a.attr("data-time-format").trim(),o=a.attr("data-time-theme").trim(),r=a.attr("data-time-theme-size").trim(),c=a.attr("data-time-theme-position").trim(),n=a.attr("data-tranlation-hour").trim(),l=a.attr("data-tranlation-minute").trim(),d=a.attr("data-tranlation-second").trim();a.attr("type","text"),""!==a.attr("data-min-time").trim()&&(t=a.attr("data-min-time").trim()),""!==a.attr("data-max-time").trim()&&(e=a.attr("data-max-time").trim()),""!==a.attr("data-custom-time-format").trim()&&(i=a.attr("data-custom-time-format").trim()),n=n||Mt.hourText,l=l||Mt.minuteText,d=d||Mt.secondText,a.tm_timepicker(Object.assign({isRTL:Mt.isRTL,hourText:n,minuteText:l,secondText:d,timeFormat:i,minTime:t,maxTime:e,closeText:Mt.closeText,showOn:"both",buttonText:"",beforeShow:function(t,e){Ht(e.dpDiv).removeClass(g).removeClass("tm-ui-skin-epo tm-ui-skin-epo-black tm-datepicker-medium tm-datepicker-small tm-datepicker-large tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom").addClass(this.id+" tm-bsbb-all tm-ui-skin-"+o+" tm-timepicker tm-datepicker tm-datepicker-"+c+" tm-datepicker-"+r).appendTo("body"),C.off("click",".tm-ui-dp-overlay").on("click",".tm-ui-dp-overlay",function(){a.tm_timepicker("hide")}),I.addClass("tm-static"),a.prop("readonly",!0),Rt.trigger({type:"tm-timepicker-beforeShow",input:t,inst:e})},onClose:function(){I.removeClass("tm-static"),a.prop("readonly",!1),a.trigger("change")}},P.tmTimepickerSettings||P.timepicker_settings||{})),Ht("#ui-tm-datepicker-div").hide()}),y.find(".tm-epo-datepicker").toArray().forEach(function(t){var e,l=Ht(t),t=parseInt(l.attr("data-start-year").trim(),10),a=parseInt(l.attr("data-end-year").trim(),10),i=l.attr("data-min-date").trim(),o=l.attr("data-max-date").trim(),d=l.attr("data-disabled-dates").trim(),s=l.attr("data-enabled-only-dates").trim(),r=l.attr("data-exlude-disabled").trim(),p=l.attr("data-disabled-weekdays").trim().split(","),m=l.attr("data-disabled-months").trim().split(","),_=l.attr("data-date-format").trim(),c=l.attr("data-date-showon").trim(),n=l.attr("data-date-defaultdate").trim(),f=l.attr("data-date-theme").trim(),u=l.attr("data-date-theme-size").trim(),h=l.attr("data-date-theme-position").trim();""!==d&&(e=d.split(","),-1!==d.indexOf(","))&&0<e.length&&(d=e),""!==s&&(e=s.split(","),-1!==s.indexOf(","))&&0<e.length&&(s=e),""===i?i=""===t?null:new Date(t,0,1):r&&(i=Ft(i)),""===o?o=""===a?null:new Date(a,11,31):r&&(o=Ft(o)),l.data("tc-enabled_only_dates",s),l.data("tc-disabled_weekdays",p),l.data("tc-disabled_months",m),l.data("tc-disabled_dates",d),l.data("tc-format",_),l.tm_datepicker(Object.assign({monthNames:Mt.monthNames,monthNamesShort:Mt.monthNamesShort,dayNames:Mt.dayNames,dayNamesShort:Mt.dayNamesShort,dayNamesMin:Mt.dayNamesMin,isRTL:Mt.isRTL,showOtherMonths:!0,selectOtherMonths:!0,showOn:c,defaultDate:n,buttonText:"",showButtonPanel:!0,firstDay:Mt.first_day,closeText:Mt.closeText,currentText:Mt.currentText,dateFormat:_,minDate:i,maxDate:o,onSelect:function(){var t,e=Ht(this),a="#"+Ht.epoAPI.dom.id(e.attr("id")),i=e.tm_datepicker("getDate"),o="",r="",c="",n=y.find(a+"_day"),l=y.find(a+"_month"),a=y.find(a+"_year");i&&(o=i.getDate(),r=i.getMonth()+1,c=i.getFullYear(),t=Ht.tm_datepicker.formatDate(_,i),-1!==m.indexOf(r.toString())||-1!==p.indexOf(i.getDay().toString())||-1!==d.indexOf(t)||""!==s&&-1===s.indexOf(t))&&(t=e.data("tm-last-date"),t=e.data("tm-last-date")?e.data("tm-last-date"):"",e.val(t),e.tm_datepicker("setDate",t),c=t?(o=(i=e.tm_datepicker("getDate")).getDate(),r=i.getMonth()+1,i.getFullYear()):r=o=""),n.val(o),l.val(r),a.val(c),e.data("tm-last-date",e.val()),e.tm_datepicker("hide")},beforeShow:function(t,n){Ht(n.dpDiv).removeClass(g).removeClass("tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom").addClass(this.id+" tm-bsbb-all tm-ui-skin-"+f+" tm-datepicker tm-datepicker-"+h+" tm-datepicker-"+u).appendTo("body"),C.off("click",".tm-ui-dp-overlay").on("click",".tm-ui-dp-overlay",function(){l.tm_datepicker("hide")}),C.off("click",".ui-tm-datepicker-current").on("click",".ui-tm-datepicker-current",function(){var t,e=new Date,e=Ht.tm_datepicker._daylightSavingAdjust(new Date(e.getFullYear(),e.getMonth(),e.getDate())),a=e.getDay(),i=e.getMonth()+1,o="#"+n.id.replace(/\\\\/g,"\\"),r=!1,c=l.tm_datepicker("getDate");if(""!==s)t=Ht.tm_datepicker.formatDate(_,c),r=-1!==s.indexOf(t);else if(-1!==m.indexOf(i.toString())||-1!==p.indexOf(a.toString()))r=!1;else{if(""!==d)return t=Ht.tm_datepicker.formatDate(_,c),[-1===d.indexOf(t),""];r=!0}r&&(Ht.tm_datepicker._setDate(n,e),Ht.tm_datepicker._gotoToday(o))}),I.addClass("tm-static"),Rt.trigger({type:"tm-datepicker-beforeShow",input:t,inst:n})},onClose:function(){I.removeClass("tm-static"),l.trigger("change")},beforeShowDay:function(t){var e,a=t.getDay(),i=t.getMonth()+1;return""!==s?(e=Ht.tm_datepicker.formatDate(_,t),[-1!==s.indexOf(e),""]):-1!==m.indexOf(i.toString())||-1!==p.indexOf(a.toString())?[!1,""]:""!==d?(e=Ht.tm_datepicker.formatDate(_,t),[-1===d.indexOf(e),""]):[!0,""]}},P.tmDatepickerSettings||{})),Ht("#ui-tm-datepicker-div").hide()}),y.find(".tmcp-date-select").on("change.cpf",function(){var t="#"+Ht.epoAPI.dom.id(Ht(this).attr("data-tm-date")),e=y.find(t),a=e.attr("data-date-format"),i=y.find(t+"_day").val(),o=y.find(t+"_month").val(),t=y.find(t+"_year").val(),a=Ht.tm_datepicker.formatDate(a,new Date(t,parseInt(o,10)-1,i));0<i&&0<o&&0<t?(e.tm_datepicker("setDate",a),e.trigger("change")):(e.val(""),e.trigger("change.cpf"))}).on("focus.cpf",function(){var t="#"+Ht.epoAPI.dom.id(Ht(this).attr("data-tm-date")),f=y.find(t),e=y.find(t+"_day"),a=y.find(t+"_month"),t=y.find(t+"_year"),u=e.val(),h=a.val(),g=t.val(),v=Ht(this);""!==g&&""!==h&&""!==u||""!==g&&""!==h&&""===u||""!==u&&""!==g&&""===h||""!==u&&""!==h&&""===g?v.find("option").toArray().forEach(function(e){var t,a,i,o,r,c,n,l,d,s,p,e=Ht(e),m=e.val(),_=g+"-"+h+"-"+u;if(v.is(".tmcp-date-day")){if(""===g||""===h)return;_=g+"-"+h+"-"+m}else if(v.is(".tmcp-date-month")){if(""===g||""===u)return;_=g+"-"+m+"-"+u}else if(v.is(".tmcp-date-year")){if(""===u||""===h)return;_=m+"-"+h+"-"+u}if(""!==m)try{(t=Ht.tm_datepicker.parseDate("yy-mm-dd",_))&&(a=t,i=Ht(i=f),r=Ht.tm_datepicker._getInst(i[0]),c=i.data("tc-enabled_only_dates"),n=i.data("tc-disabled_weekdays"),l=i.data("tc-disabled_months"),d=i.data("tc-disabled_dates"),i=i.data("tc-format"),s=a.getDay(),p=a.getDay()+1,!Ht.tm_datepicker._isInRange(r,a)||(""!==c?(o=Ht.tm_datepicker.formatDate(i,a),-1===c.indexOf(o)):-1!==n.indexOf(s.toString())||-1!==l.indexOf(p.toString())||""!==d&&(o=Ht.tm_datepicker.formatDate(i,a),-1!==d.indexOf(o)))?e.prop("disabled",!0):e.prop("disabled",!1))}catch(t){P.console.log(t),e.prop("disabled",!0),b=t}}):(e.find("option").prop("disabled",!1),a.find("option").prop("disabled",!1),t.find("option").prop("disabled",!1))}),Rt.on("resizestart",function(){var t=Ht(x.activeElement);t.is(".hasDatepicker")&&(t.data("resizestarted",!0),Ht(P).width()<768?t.data("resizewidth",!0):t.tm_datepicker("hide"))}),Rt.on("resizestop",function(){var t=Ht(x.activeElement);t.is(".hasDatepicker")&&t.data("resizestarted")&&(t.data("resizewidth")&&t.tm_datepicker("hide"),t.tm_datepicker("show")),t.data("resizestarted",!1),t.data("resizewidth",!1)}))}function At(t){var e=t.epoEventId,a=t.main_product,i=!Ht.tcepo.formSubmitEvents[e].some(function(t){return typeof t&&"function"==typeof t.trigger&&!t.trigger()});return Ht.tcepo.formSubmitEvents[e].forEach(function(t){"object"==typeof t&&(i?t.on_true():t.on_false())}),i||setTimeout(function(){a.find(Lt.addToCartButtonSelector).first().removeClass("disabled").removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled")},100),Rt.trigger("tm-apply-submit-events",{epo:{form_is_submit:i}}),i}function Pt(e){var n,l,a=e.form,t=e.this_epo_container,i=e.main_product,o=e.epoEventId;return"yes"===Mt.tm_epo_global_enable_validation&&(n={},t.find(".tmcp-ul-wrap").toArray().forEach(function(i){var o,t,a,r,c;i=Ht(i),(l=i.data("tm-validation"))&&"object"===Ht.tmType(l)&&(t=(o=i.find(".tm-epo-field")).first().attr("name"),i.is(".tm-extra-product-options-radio.tm-element-ul-radio")?(t=o.last().attr("name"),n[t]=l):i.is(".tm-extra-product-options-checkbox.tm-element-ul-checkbox")?o.each(function(t,e){"required"in l&&(l.required=function(t){var e=i.find("input.tm-epo-field.tmcp-checkbox:checked").length;return 0===e?o.last().attr("name")===Ht(t).attr("name"):e<=0}),n[Ht(e).attr("name")]=l}):i.is(".tm-extra-product-options-product.tm-element-ul-product")?o.is(":checkbox")?o.each(function(t,e){"required"in l&&(c=Ht(e)).is(":checkbox")&&(l.required=function(t){var e=i.find("input.tm-epo-field.tmcp-checkbox:checked"),a=e.length;return 0===a?o.last().attr("name")===Ht(t).attr("name"):(t=e.map(function(){return Ht(this)}).get().some(function(t){return t.closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()<=0}),0<a?t:a<=0)},"variable"===c.attr("data-type"))&&(a=c.closest(".tc-epo-element-product-holder").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-epo-element-product-holder").find(".tc-epo-field-product");return!(!q(t,!0)||!t.is(":checked"))}},n[a]=r),n[c.attr("name")]=l}):o.is(":radio")?(l.product_element_radio_qty=!0,n[o.attr("name")]=l,a=o.closest(".tc-element-container").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-element-container").find(".tc-epo-field-product:checked");return!!(t.length&&"variable"===t.attr("data-type")&&q(t,!0)&&t.is(":checked"))}},n[a]=r):o.is("select")&&(l.product_element_select_qty=!0,n[o.attr("name")]=l,a=o.closest(".tc-element-container").find(".product-variation-id").first().attr("name"),r={required:function(t){t=Ht(t).closest(".tc-element-container").find(".tc-epo-field-product");return!(!t.length||"variable"!==t.children(":selected").attr("data-type")||!q(t,!0))}},n[a]=r):n[t]=l)}),a.removeData("tc_validator"),a.tc_validate({focusInvalid:!1,ignore:Lt.qtySelector+",.tcdisabled,.tmcp-upload-hidden,#wc_bookings_field_duration,input.tm-qty:hidden[type='number'],input.input-text.qty,.ignore,.variations select,.tc-epo-variable-product-selector,.tm-extra-product-options-variations input,.tm-extra-product-options-variations select,input:not(.tc-extra-product-options input),select:not(.tc-extra-product-options select)",rules:n,errorClass:"tm-error",validClass:"tm-valid",errorElement:"label",errorPlacement:function(t,e){return t.addClass("tc-cell tcwidth tcwidth-100"),"before"===Mt.tm_epo_global_error_label_placement?e.closest(".tc-element-container").before(t):e.closest(".tc-element-container").after(t),!1},invalidHandler:function(t,e){Rt.trigger("tm-invalidHandler",{epo:{validator:e}}),setTimeout(function(){i.find(Lt.addToCartButtonSelector).first().is(".disabled")||(i.find(Lt.addToCartButtonSelector).first().removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled"),i.find(Lt.addToCartButtonSelector).first().removeClass("disabled").removeClass("loading").prop("disabled",!1).removeClass("fpd-disabled"))},100),e.errorList&&e.errorList[0]&&e.errorList[0].element&&Y(Ht(e.errorList[0].element),o)},submitHandler:function(){var t;return e.is_quickview||(i.find(Lt.addToCartButtonSelector).first().addClass("disabled"),t=function(){i.find(Lt.addToCartButtonSelector).first().removeClass("disabled"),C.off("ajaxSuccess",t)},C.on("ajaxSuccess",t)),At(e)}}),a.find(Lt.addToCartButtonSelector).on("click",function(t){a.tc_validate().form()||(t.preventDefault(),t.stopImmediatePropagation())}),!0)}function Yt(h,t,g,v,y,b,w,x,F,e,k,A,a){var P,I,C,E,q,S,T,i="none",j=0;return"none"!==(i=a?i:t.attr("class")+t.attr("data-uniqid")+g+h.is_associated+F+x+F+e||"none")&&!0!==O&&!1!==O&&void 0!==O[i]?O[i]:(P=e?"undiscounted_":"",a=t.find(g),!1===h.is_associated&&(a=a.not(Lt.associatedEpoSelector+" "+g+",.cpf-type-variations "+g)),x||(a=a.filter(".tcenabled")),I=T=S=v=v||0,C=y=y||0,b=b||[],E=h.this_epo_totals_container,a.length&&a.toArray().forEach(function(t){var e,a,i,o,r,c,n,l=Ht(t),d="",t=l.closest(".cpf-element"),s=l.closest(".tmcp-field-wrap"),p=t.attr("data-fblabelshow"),m=t.attr("data-fbvalueshow"),_="",s=s.find(".tm-qty").val(),f="",u=!1;".tc-epo-field-product"===g&&(t.is(".cpf-type-product-thumbnailmultiple")||t.is(".cpf-type-product-checkbox")?q=l.closest(".tc-epo-element-product-holder").find(".tc-extra-product-options-inline"):t.is(".cpf-type-product-thumbnail")||t.is(".cpf-type-product-radio")||t.is(".cpf-type-product-dropdown")?q=t.find('.tc-epo-element-product-container[data-product_id="'+l.val()+'"]').find(".tc-extra-product-options-inline"):t.is(".cpf-type-product-single")&&(q=t.find(".tc-extra-product-options-inline")),E=Ht(".tc-epo-totals.tm-product-id-"+q.attr("data-product-id")+'[data-epo-id="'+q.attr("data-epo-id")+'"]')),E.length&&(""===p&&(_=t.find(".tc-epo-element-label-text").html()),void 0===s&&(s=""),k&&Vt(h,l,void 0,void 0,void 0,void 0,S,T),l.is(":checkbox, :radio, :input"))&&(o=i=a=e=0,l.is(".tmcp-checkbox, .tmcp-radio")?x||l.is(":checked")?(e=l.data(P+"raw_price"),a=l.data(P+"price"),i=l.data(P+"raw_original_price"),o=l.data(P+"original_price"),w=!0,l.data("isset",1),t=l.closest("li.tmcp-field-wrap").find(".tc-image"),f=d="",(r=l.closest("li.tmcp-field-wrap").find(".tc-label-text")).length&&(d=r.html(),f=d),t.length&&((t=t.closest(".tc-label-wrap").clone().addClass("tc-img-floating")).find(".tc-label, .tc-epo-style-wrapper, .tc-input-wrap").remove(),d=t[0].outerHTML+'<span class="tc-label-text">'+d+"</span>"),u=!0):l.data("isset",0):l.is(".tmcp-select")?(n=l.find("option:selected"),e=n.data(P+"raw_price"),a=n.data(P+"price"),i=n.data(P+"raw_original_price"),o=n.data(P+"original_price"),""===(c=l.children("option:selected")).val()&&""===c.attr("data-rulestype")||(w=!0),l.find("option").data("isset",0),n.data("isset",1),""===n.val()&&""===n.attr("data-rulestype")||(d=n.attr("data-text"),u=!0,f=d)):l.is(".tmcp-selectmultiple")?(n=l.find("option:selected")).toArray().forEach(function(t){t=Ht(t),e+=Ht.epoAPI.math.toFloat(t.data(P+"raw_price")),a+=Ht.epoAPI.math.toFloat(t.data(P+"price")),i+=Ht.epoAPI.math.toFloat(t.data(P+"raw_original_price")),o+=Ht.epoAPI.math.toFloat(t.data(P+"original_price")),""===(c=l.children("option:selected")).val()&&""===c.attr("data-rulestype")||(w=!0),l.find("option").data("isset",0),t.data("isset",1),""===t.val()&&""===t.attr("data-rulestype")||(d=t.attr("data-text"),u=!0,f=d)}):(r=l.val(),!(r=l.is("[type='file']")?r.replace("C:\\fakepath\\",""):r)||l.is(".tmcp-range")&&"0"===r?l.data("isset",0):(e=l.data(P+"raw_price"),a=l.data(P+"price"),i=l.data(P+"raw_original_price"),o=l.data(P+"original_price"),w=!0,l.data("isset",1),d=r,l.is(".tmcp-range")&&(t=1===(t=l.closest(".tmcp-field-wrap").find(".tm-range-picker").attr("data-step").split(".")).length?0:t[1].length,d=Qt(d,{precision:t})),u=!0,l.is(".tmcp-dynamic")&&(m=p="hidden"),f=r)),e=e||0,i=i||0,a=a||0,o=o||0,u&&b.push({title:_,value:d,valueText:f,price:a,original_price:o,quantity:s,label_show:p,value_show:m,input_type:l.attr("type")}),a=Jt(e,E,l,0,void 0,void 0,!0),o=Jt(i,E,l,0,void 0,void 0,!0),F&&(e=a,i=o),v=Ht.epoAPI.math.toFloat(v)+Ht.epoAPI.math.toFloat(e),v=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(v,10)),y=Ht.epoAPI.math.toFloat(y)+Ht.epoAPI.math.toFloat(i),y=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(y,10)),I=Ht.epoAPI.math.toFloat(I)+Ht.epoAPI.math.toFloat(a),I=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(I,10)),j+=Ht.epoAPI.math.toFloat(Ut(a,E)),C=Ht.epoAPI.math.toFloat(C)+Ht.epoAPI.math.toFloat(o),C=Ht.epoAPI.math.toFloat(Ht.epoAPI.math.round(C,10)),A)&&(T=v)}),e={total:v,original_total:y,total_taxed:I,original_total_taxed:C,vat_total:j,floatingBoxData:b,showTotal:w,elementsLength:a.length},!0===O?(O={})[i]=e:!0!==O&&!1!==O&&(O[i]=e),e)}function le(t,e,a,i,o,r,c,n,l){var d,s=Ht.extend(!0,{},t),p=a.find(Lt.associatedEpoSelector),m=a,_=!0;m.closest(".cpf-element").is(".tc-hidden")||(c.addClass("tm-hidden"),c.length&&u(c,!0),"variable"===i?a.is(".tc-init-variations")?a.trigger("refresh.tc-variation-form"):(a.addClass("variations_form"),setTimeout(function(){d=g(m,!1,p.attr("data-product-id"),p.attr("data-epo-id"),o,s),a.addClass("tc-init-variations"),a.tc_product_variation_form(o,r,c,d)},40),_=!1):a.is(".tc-init-product")||(a.addClass("tc-init-product"),c.find(".tc-epo-element-variable-product").removeClass("variations_form"),c.find(".tc-epo-element-variations").removeClass("variations"),setTimeout(function(){g(m,!1,p.attr("data-product-id"),p.attr("data-epo-id"),o,s)},20),_=!1),setTimeout(function(){c.length&&u(a,!1)},200),setTimeout(function(){l.length&&l.trigger("change"),0===a.find(Lt.epoSelector).length&&a.addClass("no-epo"),a.removeClass("tm-hidden"),_&&(Rt.trigger("cpflogicdone"),a.find(".tm-quantity").trigger("showhide.cpfcustom")),void 0===n&&"yes"===Mt.tm_epo_global_product_element_scroll&&Rt.tcScrollTo(a,200,Ht.epoAPI.math.toFloat(Mt.tm_epo_global_product_element_scroll_offset))},210))}function It(Ft,kt,At){var Pt,It,Ct,Et,t,qt,y,St,Tt,jt,e,a,i,o,r,c,n,l,d,s,p=Ft.product_id,Ot=Ft.main_product,zt=Ft.main_cart,m=Ft.this_epo_container,_=Ft.this_totals_container,Dt=Ft.this_epo_totals_container,Bt=Ft.epoEventId,Nt=Ft.main_epo_inside_form,f=Ft.epo_id_selector,b=Ft.epo_id,w=Ft.product_id_selector,u="main",h=Ft.is_associated?"tc-variation-form":"wc-variation-form",g=Ft.is_associated?"tc_":"",v=At&&kt?(u=Ht.epoAPI.applyFilter("tc_get_item_id",kt.attr("data-item_id"),kt),Pt=Ot.find(".tm-extra-product-options.tm-cart-"+u),It=Ot.find(".tm-totals-form-"+u),Ct=Ot.find(".tm-epo-totals.tm-cart-"+u),kt.find(".variations_form").first()):(zt&&0!==zt.length||(zt=m.is(".tc-shortcode")?Ot:V(Ot,Ot,"form",p)),kt=zt.parent(),Pt=m,It=_,Ct=Dt,Ft.variations_form);Ft.is_associated&&(u=Pt.attr("data-cart-id")),Et=At||zt,Ct.data("tm_for_cart",Et),t=Zt(Et),y=Kt(Et),Ct.data("variationIdElement",(l=".wceb_picker_wrap "+t,d=Zt(n=Et),s=n.find(d),s=n.is(".tc-epo-element-product-container-cart")?n.closest(".tc-epo-element-product-li-container").find(d):n.find(d).not(".tc-epo-element-product-container-variation-id "+d),s=l?s.not(l):s)),Ct.data("qty_element",y),qt=Ct.data("type"),v.data("tc_product_id",p),St=Ct.attr("data-tm-epo-final-total-box"),Tt=Ct.attr("data-tm-epo-show-final-total"),jt=Ct.attr("data-tm-epo-show-options-total"),Rt.on("epoCalculateRules",function(t,e){t&&e&&e.currentCart&&ce(Ft,e.currentCart)}),Et.is("form")&&Et.on("reset",function(){var t=Ht(this);setTimeout(function(){Ht(t.data("epo_id_selector")).find(".tm-epo-field").trigger("change")},1)}),ce(Ft,Et),n=Pt.find(".tm-epo-field"),Ft.is_associated||(n=n.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")),d=Pt.find(".tm-epo-field.tmcp-textarea,.tm-epo-field.tmcp-textfield"),Ft.is_associated||(d=d.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")),l=Pt.find(".tm-epo-reset-radio"),Ft.is_associated||(l=l.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-reset-radio")),s=Pt.find(".tm-epo-field.tmcp-upload"),Ft.is_associated||(s=s.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field.tmcp-upload")),o=Pt.find(".tm-has-clearbutton .tm-epo-field"),Ft.is_associated||(o=o.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-has-clearbutton .tm-epo-field")),r=Pt.find(".tm-quantity .tm-qty"),Ft.is_associated||(r=r.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-quantity .tm-qty")),c=Pt.find(".tm-quantity"),Ft.is_associated||(c=c.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-quantity")),i=Pt.find("select.tm-epo-field"),(i=Ft.is_associated?i:i.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" select.tm-epo-field")).off("tm-select-change-html").on("tm-select-change-html",function(){var t,e,a,i,o=Ht(this);o.is(".tc-epo-field-product")||o.is(".tmcp-selectmultiple")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||(t=$t(o.find("option:selected").data("price"),Ct,!0,!1,o),e=$t(o.find("option:selected").data("original_price"),Ct,!0,!1,o),a=o.closest(".tmcp-field-wrap").find(".tc-tooltip"),i=o.closest(".tmcp-field-wrap").find(".tc-inline-description"),H(o.closest(".tmcp-field-wrap").find(".tc-price"),o.find("option:selected").data("price"),t,o.find("option:selected").data("original_price"),e),0<a.length&&a.attr("data-tm-tooltip-html",o.find("option:selected").attr("data-tm-tooltip-html")).trigger("tc-tooltip-html-changed"),0<i.length&&(o.find("option:selected").attr("data-tm-tooltip-html")?i.html(o.find("option:selected").attr("data-tm-tooltip-html")):i.html("")),("0"===o.find("option:selected").attr("data-hide-amount")||"yes"===Mt.tm_epo_show_price_inside_option_hidden_even)&&"yes"===Mt.tm_epo_show_price_inside_option&&o.find("option:selected").attr("data-text")&&(o.find("option:selected").data("price")||"yes"===Mt.tm_epo_no_hide_price_if_original_not_zero&&o.find("option:selected").data("original_price"))&&("yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(o.find("option:selected").data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==o.find("option:selected").attr("data-price")?o.find("option:selected").html(o.find("option:selected").attr("data-text")+" ("+t+")"):o.find("option:selected").html(o.find("option:selected").attr("data-text"))),""!==o.val()&&o.find("option:selected").attr("data-tm-tooltip-html")?a.removeClass("tm-hidden"):a.addClass("tm-hidden"))}).off("tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math").on("tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math",function(t){var e,a,i,o,r=Ht(this);r.is(".tc-epo-field-product")||(e=r.closest(".tmcp-field-wrap").find(".tc-tooltip"),a=r.closest(".tmcp-field-wrap").find(".tc-inline-description"),0<e.length&&e.attr("data-tm-tooltip-html",r.find("option:selected").attr("data-tm-tooltip-html")).trigger("tc-tooltip-html-changed"),""!==r.val()&&r.find("option:selected").attr("data-tm-tooltip-html")?e.removeClass("tm-hidden"):e.addClass("tm-hidden"),0<a.length&&(r.find("option:selected").attr("data-tm-tooltip-html")?a.html(r.find("option:selected").attr("data-tm-tooltip-html")):a.html("")),zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing"))||"yes"===Mt.tm_epo_show_price_inside_option&&r.find("option").each(function(){if(!(i=Ht(this)).val())return!0;"tm-select-change-html-all"===t.type?(i.removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),Vt(Ft,r,void 0,i,1)):"tm-math-select-change-html-all"===t.type?Vt(Ft,r,void 0,i,1,!0):"tm-select-change-html-all-math"===t.type&&(i.removeClass("tm-epo-late-field").removeData("tm-price-for-late islate"),Vt(Ft,r,void 0,i,1,!0)),o=1,o=(o="yes"!==Mt.tm_epo_multiply_price_inside_option?r.data("tm-quantity"):o)||1,"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(i.data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==i.attr("data-price")?(o=$t(i.data("price")/o,Ct,!0,!1,r),"0"!==i.attr("data-hide-amount")&&"yes"!==Mt.tm_epo_show_price_inside_option_hidden_even||!i.attr("data-text")||i.html(i.attr("data-text")+" ("+o+")")):i.html(i.attr("data-text"))})}).off("tm-select-price-update-html-all").on("tm-select-price-update-html-all",function(){var t,e,a=Ht(this);a.is(".tc-epo-field-product")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||"yes"===Mt.tm_epo_show_price_inside_option&&a.find("option").each(function(){if(!(t=Ht(this)).val())return!0;e=1,e=(e="yes"!==Mt.tm_epo_multiply_price_inside_option?a.data("tm-quantity"):e)||1,"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!1===Ht.tmempty(t.data("price"))||"yes"!==Mt.tm_epo_auto_hide_price_if_zero&&""!==t.attr("data-price")?(e=$t(t.data("price")/e,Ct,!0,!1,a),"0"!==t.attr("data-hide-amount")&&"yes"!==Mt.tm_epo_show_price_inside_option_hidden_even||!t.attr("data-text")||t.html(t.attr("data-text")+" ("+e+")")):t.html(t.attr("data-text"))})}).off("tm-select-change").on("tm-select-change",function(){var t=Ht(this),e=t.closest(".cpf-element").attr("data-uniqid");t.is(".tc-epo-field-product")||zt&&void 0!==zt.data("per_product_pricing")&&!zt.data("per_product_pricing")||(t.removeData("addedtcEpoBeforeOptionPriceCalculation"),t.removeData("addedfieldtcEpoBeforeOptionPriceCalculation"),Rt.off("tcEpoBeforeOptionPriceCalculation.math"+e),Rt.off("tcEpoAfterNormalOptionPriceCalculation.math"+e),t.trigger("tm-select-change-html"),t.trigger("tm-select-change-html-all"),Et.trigger({type:"tm-epo-update",norules:1,element:t}))}).trigger("tm-select-change-html-all"),r.off("focus.cpf").on("focus.cpf",function(){var t=Ht(this),e=t.closest(".tmcp-field-wrap").find(".tm-epo-field"),a=parseFloat(t.val()),i=parseFloat(t.attr("max")),o=parseFloat(t.attr("min")),r=t.attr("step"),c=K(e,!1),e=tt(e,!1),n=!0;a&&""!==a&&"NaN"!==a||(a=0),""!==i&&"NaN"!==i||(i=""),""!==o&&"NaN"!==o||(o=0),"any"!==r&&""!==r&&void 0!==r&&parseFloat(r),(a<o||i<a)&&(n=!1),c&&e&&n?t.data("tm-prev-value",a):t.data("tm-prev-value",o)}).off("change.cpf").on("change.cpf",function(t,e){var a=Ht(this),i=a.closest(".tmcp-field-wrap").find(".tm-epo-field"),o=parseFloat(a.val()),r=parseFloat(a.attr("max")),c=parseFloat(a.attr("min")),n=a.attr("step"),l=K(i,!1),d=tt(i,!1),s=!0;o&&""!==o&&"NaN"!==o||(o=0),""!==r&&"NaN"!==r||(r=""),""!==c&&"NaN"!==c||(c=0),"any"!==n&&""!==n&&void 0!==n&&parseFloat(n),(o<c||r<o)&&(s=!1),l&&d&&s?(Ft.noEpoUpdate?i.data("tm-quantity",a.val()).trigger("change.cpf",e).trigger("change.cpfproduct",e):i.data("tm-quantity",a.val()).trigger("change",e),i.trigger("tm-select-change-html-all")):a.data("tm-prev-value")?a.val(a.data("tm-prev-value")):a.val(c),a.trigger("cpf-changed")}).off("tmaddquantity").on("tmaddquantity",function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".tm-epo-field").data("tm-quantity",t.val())}),a=Pt.find(".tmcp-textfield.tm-epo-field[maxlength],textarea.tm-epo-field[maxlength]"),(a=Ft.is_associated?a:a.not(Lt.epoSelector+" "+Lt.associatedEpoSelector+" .tm-epo-field")).each(function(){var t,e=Ht(this);e.data("tcmaxlength")||(e.data("tcmaxlength",1),t=e.closest(".tmcp-field-wrap-inner"),e=Ht.epoAPI.template.html(Lt.templateEngine.tc_chars_remanining,{maxlength:e.attr("maxlength"),characters_remaining:Mt.i18n_characters_remaining}),t.append(Ht(e)))}),a.off("change.tc_maxlen input.tc_maxlen").on("change.tc_maxlen input.tc_maxlen",function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".tc-chars-remanining").html(parseInt(t.attr("maxlength"),10)-parseInt(t.val().length,10))}),n.off("tm_trigger_product_image").on("tm_trigger_product_image",function(){var t,e,a,i,o=Ht(this);o.is(".tm-product-image:checkbox, .tm-product-image:radio, select.tm-product-image")?(e=o.closest(".tmcp-field-wrap").find("label img"),a=o.closest(".cpf-section").is(".tm-epo-variation-section"),(t=o).is("select.tm-product-image")&&(t=o.children("option:selected")),(0<Ht(e).length||a&&void 0!==t.attr("data-image")||void 0!==t.attr("data-image")&&""!==t.attr("data-image")||void 0!==t.attr("data-imagep")&&""!==t.attr("data-imagep"))&&(o.is(":checked")||o.is("select.tm-product-image")&&""!==o.val()&&(""!==o.find("option:selected").attr("data-rules")||o.is(".tm-epo-variation-element")))?(i=(i=(i=Ht(e).first().attr("data-original"))||a?i:Ht(e).first().attr("src"))||t.attr("data-image"),(i=t.attr("data-imagep")?t.attr("data-imagep"):i)?Ot.trigger("tm_change_product_image",{src:i,element:o,element_current:t,main_product:Ot,epo_holder:Pt}):Ot.trigger("tm_change_product_image",{src:!1,element:o,element_current:t,main_product:Ot,epo_holder:Pt})):Ot.trigger("tm_restore_product_image",{element:o,element_current:t,main_product:Ot,epo_holder:Pt})):Ot.trigger("tm_attempt_product_image",{element:o,element_current:t,main_product:Ot,epo_holder:Pt})}),c.off("showhide.cpfcustom").on("showhide.cpfcustom",function(){var t,e,a=Ht(this),i=a.closest(".tmcp-field-wrap").find(".tm-epo-field"),o=!1;i.is(".tm-epo-variation-element")||(i.is("select")?""!==i.val()&&(o=!0):i.is(":checkbox")?i.is(":checked")&&(o=!0):i.is(":radio")?i.is(":checked")&&(o=!0,"yes"===Mt.tm_epo_show_only_active_quantities)&&i.closest(".tc-element-inner-wrap").find(".tm-epo-field.tmcp-radio").each(function(){Ht(this).closest(".tmcp-field-wrap").find(".tm-quantity").hide()}):i.val()&&(o=!0),t=(i=a.find(".tm-qty")).val(),e=i.attr("min")||"",o?("yes"===Mt.tm_epo_show_only_active_quantities&&a.show(),i.removeClass("ignore").prop("disabled",!1)):("yes"===Mt.tm_epo_show_only_active_quantities&&(a.hide(),t||i.val(e)),i.addClass("ignore").prop("disabled",!0)),Pt.is(".tc-show")&&setTimeout(function(){a.closest(".tcowl-carousel").trigger("refresh.owl.carousel")},200))}),n.off("change.cpfcustom").on("change.cpfcustom",function(){Ht(this).closest(".tmcp-field-wrap").find(".tm-quantity").trigger("showhide.cpfcustom")}),n.off("change.cpf").on("change.cpf",function(t,e){var a=Ht(this),i=a.closest(".tmcp-field-wrap"),o=a.closest(".tmcp-ul-wrap"),r=o.attr("data-tm-connector");a.is(":checkbox, :radio")&&(a.is(":radio")&&(e||(void 0!==r?Ht('[data-tm-connector="'+r+'"]').find(".tmcp-field-wrap").removeClass("tc-active").find(".tm-epo-reset-radio").addClass("tm-hidden"):o.find(".tmcp-field-wrap").removeClass("tc-active")),void 0!==r)&&Ht('[data-tm-connector="'+r+'"]').find(".tmcp-field-wrap").removeClass("tc-active").find(".tm-epo-reset-radio").addClass("tm-hidden"),a.is(":checked")?i.addClass("tc-active"):i.removeClass("tc-active")),a.is(".tm-epo-variation-element")||(a.is(".use_images:checkbox, .use_images:radio")&&a.attr("data-imagec")&&0<(e=i.find(".radio-image,.checkbox-image").first()).length&&(a.is(":checked")?e.prop("src",a.attr("data-imagec")):e.prop("src",a.attr("data-image"))),a.is(".use_images:radio")&&a.closest(".cpf-type-radio").find(".use_images:radio").not(a).each(function(){var t=Ht(this);t.closest(".tmcp-field-wrap").find(".radio-image").first().prop("src",t.attr("data-image"))}),a.is(".tmcp-range")&&a.trigger("change.cpflogic"),a.is("select")?a.trigger("tm-select-change"):(a.is(".tmcp-radio")&&a.closest(".cpf-element").find(".tm-quantity .tm-qty").each(function(){Ht(this).closest("li.tmcp-field-wrap").find(".tmcp-radio").is(":checked")?Ht(this).prop("disabled",!1):Ht(this).attr("disabled","disabled")}),O=!0,Et.trigger({type:"tm-epo-update",norules:1,element:a}),O=!1)),a.trigger("tm_trigger_product_image"),Pt.is(".tc-show")&&setTimeout(function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})},200),Ot.trigger("tm_attempt_product_image",{element:a,main_product:Ot,epo_holder:Pt})}),n.filter('.tm-epo-field:text,input.tm-epo-field[type="number"],textarea.tm-epo-field').off("input.cpf").on("input.cpf",function(){Ht(this).trigger("change.cpf")}),n.filter(":checkbox:checked, :radio:checked").each(function(){Ht(this).closest(".tmcp-field-wrap").addClass("tc-active"),Ht(this).trigger("change.cpf")}),o.off("change.cpfclearbutton").on("change.cpfclearbutton cpfclearbutton",function(){var t,e=Ht(this),a=e.closest(".tmcp-field-wrap");e.is(":checked")&&((t=(t=(t=(t=e.closest(".tc-element-inner-wrap")).find(".tc-epo-element-product-li-container").length?t.find(".tmcp-ul-wrap").first().children(".tmcp-field-wrap").not(".tc-epo-element-product-li-container"):t).find(".tm-epo-reset-radio")).length?t:e.closest(".tc-element-inner-wrap").find(".tm-epo-reset-radio").first()).removeClass("tm-hidden"),a.append(t))}),l.off("click.cpf").on("click.cpf",function(){var t=Ht(this),e=t.closest(".tc-element-inner-wrap").find(".tm-epo-field.tmcp-radio:checked");e.length&&(e.prop("checked",!1),e.trigger("change",{forced:1})),t.addClass("tm-hidden")}),B&&B.debounce&&d.on("keyup",B.debounce(function(){var t=Ht(this);"yes"===Mt.tm_epo_global_enable_validation&&Ht.tc_validator&&t.closest(".tmcp-ul-wrap").data("tm-validation")&&t.tc_rules()&&Et.tc_validate().element(t),t.trigger("change.cpf"),t.closest(".tmcp-field-wrap").find(".tm-quantity").trigger("showhide.cpfcustom")},10)),s.off("change.cpfv tcupload").on("change.cpfv tcupload",function(){var i,t,o,r,c,n=Ht(this),e=n.closest("label"),a=n.closest(".tmcp-field-wrap"),l=a.find(".cpf-upload-container"),d=a.find(".tm-filename"),s=n.val().replace("C:\\fakepath\\",""),p=[],m=P.URL||P.webkitURL,_=a.find(".tc-upload-preview");l.length&&d.length<=0&&(d=Ht('<span class="tm-filename"></span>'),e.after(d)),void 0!==s&&"undefined"!==s||(s=""),n.next(".tmcp-upload-hidden").remove(),p=(p=n.attr("data-file"))?p.split("|"):[],this.files?t=Array.from(this.files):0<p.length&&(t=p),1<t.length?d.html(t.length+" "+(1===t.length?Mt.i18n_file:Mt.i18n_files)):1===t.length?d.html(s):d.empty(),_.length||(_=Ht('<div class="tc-upload-preview tc-hidden"></div>'),a.append(_)),_.empty(),i=(i=Pt.data("num_uploads"))||[],c=n.closest(".cpf-element").attr("data-uniqid"),i[c]||(i[c]=[]),(s||0<t.length)&&m&&m.createObjectURL?("yes"===Mt.tm_epo_upload_inline_image_preview&&(1<t.length?_.addClass("multiple"):_.removeClass("multiple"),_.removeClass("tc-hidden")),r=function(t,e,a,i,o){var a=n[0].files&&n[0].files[a]&&n[0].files[a].size?n[0].files[a].size:0,r='<div class="tc-upload-image">';e?r=r+'<img src="'+e+'">':r+='<div class="tc-file-ext-overlay"></div>',r=r+'<div class="tc-file-name">'+t.name+"</div>",(F||k)&&(r+='<button type="button" class="tc-upload-remove"><svg width="26" height="26" viewBox="0 0 26 26" xmlns="http://www.w3.org/2000/svg"><path d="M11.586 13l-2.293 2.293a1 1 0 0 0 1.414 1.414L13 14.414l2.293 2.293a1 1 0 0 0 1.414-1.414L14.414 13l2.293-2.293a1 1 0 0 0-1.414-1.414L13 11.586l-2.293-2.293a1 1 0 0 0-1.414 1.414L11.586 13z" fill="currentColor" fill-rule="nonzero"/></svg></button>'),r=(r=o?r+'<div class="tc-file-ext">'+o+"</div>":r)+'<div class="tc-file-size">'+(e=a,a=(o=(t=Math).log)(e)/o(1024)|0,(e/t.pow(1024,a)).toFixed(a?2:0))+" "+(a?"KMGTPEZY"[--a]+"B":"bytes")+"</div>",i.append(r+="</div>")},t.forEach(function(t,e){var a;"yes"===Mt.tm_epo_upload_inline_image_preview&&(a=Ht('<div class="tc-upload-file"></div>'),_.append(a),(o=new Image).onload=function(){r(t,this.src,e,a)},o.onerror=function(){r(t,!1,e,a,t.name.split(".").pop())},0<p.length?o.src=p[e]:(o.src=m.createObjectURL(t),m.revokeObjectURL(t))),i[c].push(t.name)}),Pt.data("num_uploads",i)):delete i[c],i[c]&&0===i[c].length&&delete i[c]}),C.on("click",".tc-upload-remove",function(){var t,e,a,i,o,r,c,n,l=Ht(this);(F||k)&&(e=(t=l.closest(".cpf-element")).find(".tm-epo-field"),c=l.closest(".tc-upload-file"),r=(l=l.closest(".tmcp-field-wrap")).find(".tc-upload-preview"),l=l.find(".tm-filename"),a=c.index(),void 0!==(n=e.val().replace("C:\\fakepath\\",""))&&"undefined"!==n||(n=""),(o=Array.from(e[0].files)).splice(a,1),i=new F("").clipboardData||new k,o.forEach(function(t){i.items.add(t)}),1<o.length?r.addClass("multiple"):r.removeClass("multiple"),e[0].files=i.files,c.remove(),1<i.files.length?l.html(i.files.length+" "+(1===i.files.length?Mt.i18n_file:Mt.i18n_files)):1===i.files.length?l.html(n):l.empty(),(o=(o=Pt.data("num_uploads"))||[])[r=t.closest(".cpf-element").attr("data-uniqid")]||(o[r]=[]),o[r].splice(a,1),0===o[r].length&&(delete o[r],e.val("")),(c=e.next(".tmcp-upload-hidden")).length&&(0<(n=c.val().split("|")).length&&n.splice(a,1),0===n.length?c.remove():c.val(n.join("|"))),Pt.data("num_uploads",o))}),y.off("change.cpf input.cpf").on("change.cpf input.cpf",function(){var t=Ht(this);Et.trigger("tm-epo-check-dpd"),t.data("tm-prev-value",t.val()),Et.trigger({type:"tm-epo-update",norules:2})}).data("tm-prev-value",y.val()),Pt.find(".cpf-type-product").off("tc-logic").on("tc-logic",function(){var t=Ht(this);t.find(".tc-init").length||t.data("isactive")&&!t.data("donetclogic")&&(t.data("donetclogic",!0),t.find(".tc-epo-field-product").trigger("change.cpfproduct",{forced:3}))}),Pt.find(".cpf-type-product .tc-epo-field-product.tc-epo-field-product-checkbox").off("change.cpfrequired").on("change.cpfrequired",function(){var t,e,a=Ht(this).closest(".cpf-element");a.is(".tc-is-required")&&(e=(t=a.find(".tmcp-field.tc-epo-field-product-checkbox")).not(":checked"),(0<(a=a.find(".tmcp-field.tc-epo-field-product-checkbox:checked")).length?(e.prop("required",!1),a):(t.attr("required",!0),t)).prop("required",!0))}),Pt.find(".cpf-type-product .tc-epo-field-product").off("change.cpfproduct").on("change.cpfproduct",function(t,e){var a,i,o,r,c,n,l=Ht(this),d=l.closest(".cpf-element"),s=d.find(".tc-epo-element-product-container-wrap"),p=l.closest(".tmcp-field-wrap").find(".tc-epo-element-product-container-wrap"),m=0<p.length,_=!1,f=1e3,u=l,h=d.find(".tm-epo-field").not(".tc-epo-element-product-li-container .tm-epo-field"),g=h.filter(":checked"),v=l.attr("data-counter");if(!1!==d.data("isactive")&&(!e||2!==e.forced)&&(void 0===t.isTrigger||!l.data("triggeredonce")||e&&e.forced)){if(l.data("triggeredonce",1),l.is(":checkbox")||(f=t.isTrigger),h.is(":radio")?0<g.length&&(n=g.closest(".tmcp-field-wrap").find("input.tm-qty")):h.is(":checkbox")?0<g.length&&(n=l.closest(".tmcp-field-wrap").find("input.tm-qty")):n=h.closest(".tmcp-field-wrap").find("input.tm-qty"),l.is(":checkbox"))if(l.is(".tc-epo-field-product-hidden"))l.is(":checked")?s.addClass("tc-active-product"):s.removeClass("tc-active-product"),a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden");else{if(l.is(":checked"))m&&p.removeClass("tm-hidden");else{if(m&&p.addClass("tm-hidden"),!e||!e.forced)return;_=!0}_||(a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"))}else if(l.is(":radio")){if(l.is(":checked"))m&&(s.addClass("tm-hidden"),p.removeClass("tm-hidden"));else{if(m&&p.addClass("tm-hidden"),!e||!e.forced)return;_=!0}_||(a=l.val(),i=l.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"))}else l.is("select")&&(v=(u=t=l.children(":selected")).index(),""===l.children(":first").val()&&v--,a=l.val(),i=t.attr("data-type"),d.find(".tc-epo-element-product-li-container").removeClass("tm-hidden"));if(o=(l.is(".tc-epo-field-product-checkbox")?p:d).find(".tc-epo-element-product-container"),r=o.filter('[data-product_id="'+a+'"]'),c=r.find(Lt.associateQtySelector),""!==s.html()&&n&&0<n.length&&0===c.length&&n.val(0),l.is(":checkbox"))l.is(".tc-epo-field-product-hidden")&&(l.is(":checked")?"0"===c.val()&&"0"!==c.attr("min")&&c.val(c.attr("min")).trigger("change"):(c.val(0),c.closest(".tm-quantity-alt").removeClass("tm-hidden"),1!==e.forced&&c.closest(".tm-quantity-alt").find(".single_add_to_cart_product").trigger("cpfqtybutton"),s.find(Lt.associatedEpoCart).trigger("tm-epo-update")));else{if(!l.is(":radio")&&!l.is("select"))return;l.val()&&!l.data("set_initial")&&"0"===c.val()&&("0"!==c.attr("min")&&c.val(c.attr("min")).trigger("change"),l.data("set_initial",1))}a?0===r.length?(g={action:"wc_epo_get_associated_product_html",product_id:a,parent_id:Pt.attr("data-product-id"),mode:d.attr("data-mode"),layout_mode:d.attr("data-product-layout-mode"),uniqid:d.attr("data-uniqid"),name:l.attr("name"),counter:v,quantity_min:d.attr("data-quantity-min"),quantity_max:d.attr("data-quantity-max"),priced_individually:d.attr("data-priced-individually"),discount:d.attr("data-discount"),discount_type:d.attr("data-discount-type"),discount_exclude_addons:d.attr("data-discount-exclude-addons"),show_image:d.attr("data-show-image"),show_title:d.attr("data-show-title"),show_title_link:d.attr("data-show-title-link"),show_price:d.attr("data-show-price"),show_description:d.attr("data-show-description"),show_meta:d.attr("data-show-meta"),disable_epo:d.attr("data-disable-epo")},d.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),Ht.ajax({url:Mt.ajax_url,type:"POST",data:g,dataType:"json",success:function(t){200===t.result&&(r=Ht(t.html),(m?l.closest(".tmcp-field-wrap").find(".tc-epo-element-product-container-wrap").empty():d.find(".tc-epo-element-product-container-wrap")).append(r),le(Ft,0,r,i,l,Et,o,f,c),r.find(Lt.associateQtySelector).trigger("change"))},complete:function(){d.unblock()}})):(le(Ft,0,r,i,l,Et,o,f,c),r.find(Lt.associateQtySelector).trigger("change")):(o.addClass("tm-hidden"),h=Ht.epoAPI.util.parseJSON(u.attr("data-rules"))[0]||0,_=Ht.epoAPI.util.parseJSON(u.attr("data-original-rules"))||0,u.is(".tcenabled")&&u.data("associated_price_set",1),u.data("price_set",1),u.data("raw_price",h),u.data("raw_original_price",_),u.data("price",h),u.data("original_price",_),t=!1,(p=(p=u).is("option")?u.closest("select"):p).is(".tc-epo-field-product")&&(!p.is("select")&&(p.is(":checkbox")||p.is(":radio"))?p.is(":checked")&&(t=!0):""!==p.val()&&(t=!0)),te(u.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),h,t?Wt(h):u.data("price-html"),_,t?Wt(_):""),y.trigger("change.cpf"))}}),C.off("click.cpfqtybutton cpfqtybutton",".cpf-type-product .single_add_to_cart_product").on("click.cpfqtybutton cpfqtybutton",".cpf-type-product .single_add_to_cart_product",function(){var t,e,a=Ht(this),i=a.closest(".tm-quantity-alt").find(Lt.associateQtySelector),o=a.is(".alt"),r=a.closest(".cpf-element").find(".tc-epo-element-product-container-wrap");a.data("inittriggeredonce")&&(t=Ht.epoAPI.math.toInt(i.attr("data-min")),e=Ht.epoAPI.math.toInt(i.attr("data-max")),o?(r.addClass("tc-active-product"),i.attr("min",t),e&&i.attr("max",e),"0"===i.val()&&("0"===i.attr("min")?i.val(1):i.val(i.attr("min"))).trigger("change"),a.removeClass("alt").text(a.attr("data-remove"))):(r.removeClass("tc-active-product"),i.val(0).trigger("change"),i.closest(".tm-quantity-alt").removeClass("tm-hidden"),a.addClass("alt").text(a.attr("data-add")))),a.data("inittriggeredonce",1),r.find(Lt.associatedEpoCart).trigger("tm-epo-update")}),C.off("change.cpfqtyalt input.cpfqtyalt",".cpf-type-product "+Lt.associateQtySelector).on("change.cpfqtyalt input.cpfqtyalt",".cpf-type-product "+Lt.associateQtySelector,function(){var t,e=Ht(this),a=e.closest(".cpf-element").find(".tm-epo-field").not(".tc-epo-element-product-li-container .tm-epo-field"),i=e.closest(".tm-quantity-alt").find(".single_add_to_cart_product"),o=a.filter(":checked"),r=Ht.epoAPI.math.toInt(e.attr("min")),c=Ht.epoAPI.math.toInt(e.attr("max"));if(a.is(".tc-epo-field-product-hidden")&&a.is(":checkbox")&&(0===o.length&&"0"!==e.val()?(a.prop("checked",!0).trigger("change"),o=a.filter(":checked")):"0"===e.val()&&o.length&&a.prop("checked",!1).trigger("change")),a.is(":radio")){if(0===o.length)return;t=o.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty")}else if(a.is(":checkbox")){if(0===o.length)return;t=e.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty")}else t=a.closest(".tmcp-field-wrap").find("input.tm-qty").not(".tc-element-qty");0!==t.length&&(t.attr("min",r),c&&t.attr("max",c),(o=e.closest(".tc-epo-element-product-container").find(Lt.associatedEpoCart)).trigger("tm-epo-update"),t.val(e.val()),0<Ht.epoAPI.math.toFloat(e.val())?(o.find(".tm-epo-field.tcenabled").removeClass("ignore"),e.removeClass("ignore")):(o.find(".tm-epo-field.tcenabled").addClass("ignore"),e.addClass("ignore")),a.trigger("change.cpfproduct",{forced:2}),i.data("inittriggeredonce")&&("0"===e.val()?i.removeClass("alt"):i.addClass("alt")),i.trigger("cpfqtybutton"))}),Et.off("tm-epo-update").on("tm-epo-update",function(t){var D,B,e,a,N,H,L,M,i,R,U,J,o,r,c,Q,n,$,Z,W,l,d,X,G,V,Y,K,tt,s,p,m,et,at,it,_,f,ot,rt,ct,nt,lt,dt,u,st,h,g,v,pt,mt,y=Ht(this),b=!1,_t=0,w=0,x=0,F=0,k=!1,ft=!0,A=[],P=0,I=0,C={},E=0,ut=!1,ht=!1,gt=!1,vt="",yt=!1,bt=!1,wt="",xt="",q=0,S=0,T=0,j=0,O=0,z=t.epoObject?Ht.extend(!0,{},t.epoObject):Ht.extend(!0,{},Ft);z&&!z.noEpoUpdate&&(Rt.trigger("tcEpoUpdateStart",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt}),D=Ht.epoAPI.applyFilter("tc_get_bundleid",y.attr("data-product_id"),y,z),B=Ct.attr("data-price-override"),g=y,g=Ht.epoAPI.applyFilter("tc_getCurrentQty",Ht.epoAPI.math.toFloat(Kt(g).val()),g),pt=(v=(v=y).is(".tc-epo-element-product-container-cart")&&((pt=v.closest(".cpf-element")).is(".cpf-type-product-thumbnailmultiple")||pt.is(".cpf-type-product-checkbox")?mt=v.closest(".tc-epo-element-product-holder").find(".tc-epo-element-product-container-variation-id"):(pt.is(".cpf-type-product-thumbnail")||pt.is(".cpf-type-product-radio")||pt.is(".cpf-type-product-dropdown")||pt.is(".cpf-type-product-single"))&&(mt=pt.find(".tc-epo-element-product-container-variation-id")),mt)&&mt.length?mt:v).find(Zt(v)).val()||0,z.associated_connect&&1===z.associated_connect.length&&(g=parseFloat(z.main_product.find(Lt.associateQtySelector).not(Lt.associatedEpoSelector+" "+Lt.qtySelector).last().val())),t.stopImmediatePropagation(),_t=b=Ht.epoAPI.applyFilter("tcGetCurrentProductPrice",oe(Ct,!0),Et,Ct),w=mt=Ht.epoAPI.applyFilter("tcGetCurrentProductRegularPrice",ie(Ct,!0),Et,Ct),b=Ht.epoAPI.applyFilter("tcCalculateCurrentProductPrice",b,{epo:z,alternativeCart:At,cart:y,main_product:Ot}),Number.isFinite(g)||!Ct.attr("data-is-sold-individually")&&0!==Kt(y).length||(g=1),Ct.data("totalsHolder_tc_totals_ob",v={qty:g,product_price:_t,original_product_price:w}),t.norules?t.norules&&(1===t.norules&&Vt(z,t.element),Ht.tcepo.lateFieldsPrices[Bt]=[],Pt.find(".tm-epo-late-field").toArray().forEach(function(t){(t=Ht(t)).data("price",0),Ht.tcepo.lateFieldsPrices[Bt].push({setter:t,price:t.data("tm-price-for-late"),original_price:t.data("tm-original-price-for-late"),bundleid:D,pricetype:re(z,t,"price_type")})})):ce(z,y),h=Pt.find(".tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&(b=(l=Yt(z,Pt,".tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)",0,0,A,k,void 0,void 0,void 0,!0)).total,O=b,w=l.original_total,It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),z.associated_connect&&1===z.associated_connect.length&&(d=z.associated_connect,z.associated_connect.is("select"))&&(d=z.associated_connect.find("option:selected")),!1===b?(Ct.data("tm-floating-box-data",[]),Ct.empty(),z.associated_connect&&1===z.associated_connect.length&&te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),0,"",0,""),zt.trigger("tm-epo-short-update",{container:kt})):(n=Ht.epoAPI.applyFilter("tcAlterElementQty",1,{epo:z,alternativeCart:At,currentCart:Et,main_product:Ot}),void 0!==Et.data("per_product_pricing")&&(ft=Et.data("per_product_pricing")),ft=Ht.epoAPI.applyFilter("tcCalculatePerProductPricing",ft,{epo:z,alternativeCart:At,cart:y,main_product:Ot}),!Nt||"woocommerce_before_add_to_cart_button"!==Mt.tm_epo_totals_box_placement||"variable"!==qt&&"variable-subscription"!==qt||Ct.data("moved_inside")||Ct.data("moved_inside",1),Rt.trigger("tcEpoBeforeOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:0,cart_fee_options_original_total:0}),z.associated_connect||t.noassociated||"yes"!==Mt.tm_epo_global_product_element_quantity_sync||y.is(Ht.tcAPI().associatedEpoCart)||y.find(Ht.tcAPI().associatedEpoCart).filter(":visible").toArray().forEach(function(t){Ht(t).trigger({type:"tm-epo-update",noassociated:1})}),l=Yt(z,Pt,".tmcp-field:not(.tmcp-dynamic,.tc-epo-field-product, .tc-is-math-special, .tc-is-math-cumulative)",x,F,A,k),x=l.total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p=l.elementsLength,m=(l=Yt(z,Pt,".tc-epo-field-product",0,0,A,k)).total,et=l.original_total,at=l.total_taxed,it=l.original_total_taxed,u=l.vat_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,Ct.data("tm-floating-box-data",A),P=(l=Yt(z,Pt,".tmcp-fee-field",0,0,A,k,!1,!0)).total,I=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,Rt.trigger("tcEpoAfterNormalOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:P,cart_fee_options_original_total:I}),e=x,a=F,_=ne(z,parseFloat(b),parseFloat(w),parseFloat(e+m),parseFloat(a+et),D,Ct),l=Yt(z,Pt,".tmcp-field.tc-is-math-special:not(.tmcp-dynamic)",x,F,A,k,void 0,void 0,void 0,!0),x=l.total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,e=x,a=F,e+=_.normal[0],a+=_.normal[1],P+=_.fees[0],I+=_.fees[1],x=(l=Yt(z,Pt,".tmcp-field.tc-is-math-cumulative:not(.tmcp-dynamic)",x=e,F=a,A,k,void 0,void 0,void 0,!0,!0)).total,F=l.original_total,A=l.floatingBoxData,k=l.showTotal,p+=l.elementsLength,e=x,a=F,h=Pt.find(".tmcp-dynamic.dynamic-product-price.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price.tc-is-math-special"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-special",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),It.find(".cpf-dynamic-product-price").val(O),v.dynamic_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.dynamic-product-price"),0<!(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.dynamic-product-price"):h).filter(".tcenabled")).length&&It.find(".cpf-dynamic-product-price").val(""),O=0,h=Pt.find(".tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,[],!0,!0).total;t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),h=Pt.find(".tmcp-dynamic.calculation.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation.tc-is-math-special"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-field.tmcp-dynamic.calculation.tc-is-math-special",O+x,O+F,[],!0,!0,void 0,void 0,!0),a=Ht.epoAPI.math.toFloat(a.total)-Ht.epoAPI.math.toFloat(x);t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),h=Pt.find(".tmcp-dynamic.calculation.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.calculation.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var e=(t=Ht(t)).closest(".tmcp-ul-wrap"),a=Yt(Ft,e,".tmcp-field.tmcp-dynamic.calculation.tc-is-math-cumulative",O+x,O+F,[],!0,!0,void 0,void 0,!0),a=Ht.epoAPI.math.toFloat(a.total)-Ht.epoAPI.math.toFloat(x);t.is(".result-as-price")&&(a=Wt(a,Ct,!0,!1)),e.find(".tc-result").html(a)}),O=0,h=Pt.find(".tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,[],!0,!0);t.find(".tc-result").html(e.total)}),h=Pt.find(".tmcp-dynamic.change-product-weight.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight.tc-is-math-special"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-special",O+x,O+F,[],!0,!0,void 0,void 0,!0);t.find(".tc-result").html(Ht.epoAPI.math.toFloat(e.total)-Ht.epoAPI.math.toFloat(x))}),h=Pt.find(".tmcp-dynamic.change-product-weight.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.change-product-weight.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&h.toArray().forEach(function(t){var t=(t=Ht(t)).closest(".tmcp-ul-wrap"),e=Yt(Ft,t,".tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-cumulative",O+x,O+F,[],!0,!0,void 0,void 0,!0);t.find(".tc-result").html(Ht.epoAPI.math.toFloat(e.total)-Ht.epoAPI.math.toFloat(x))}),O=0,h=Pt.find(".tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)",O,O,A,k),b=O=l.total,w=l.original_total,a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price.tc-is-math-special"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price.tc-is-math-special"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-special",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price.tc-is-math-cumulative"),0<(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price.tc-is-math-cumulative"):h).filter(".tcenabled")).length&&(l=Yt(z,Pt,".tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-cumulative",O+x,O+F,A,k,void 0,void 0,void 0,!0),b=O=Ht.epoAPI.math.toFloat(l.total)-Ht.epoAPI.math.toFloat(x),w=Ht.epoAPI.math.toFloat(l.original_total)-Ht.epoAPI.math.toFloat(F),a=e=O,It.find(".cpf-override-product-price").val(O),v.override_product_price=O,Ct.data("totalsHolder_tc_totals_ob",v)),h=Pt.find(".tmcp-dynamic.override-product-price"),0<!(h=(h=!1===z.is_associated?h.not(Lt.associatedEpoSelector+" .tmcp-dynamic.override-product-price"):h).filter(".tcenabled")).length?It.find(".cpf-override-product-price").val(""):a=e=0,Rt.trigger("tcEpoAfterOptionPriceCalculation",{epo:z,alternativeCart:z,this_product_type:qt,cart:y,totalsHolder:Ct,fetchOptionPrices:Yt,epoHolder:Pt,total:x,original_total:F,floatingBoxData:A,showTotal:k,cart_fee_options_total:P,cart_fee_options_original_total:I}),setTimeout(function(){Pt.find("select.tm-epo-field").trigger("tm-select-price-update-html-all")},1),Ht.tcepo.oneOptionIsSelected[Bt]=k,z=ae(z,Bt,p),ee(Ot,z),0<P&&(k=!0),At&&!ft&&(k=!1),"enable"!==St&&"hideifoptionsiszero"!==St&&"hideiftotaliszero"!==St||(k=!0),1<g&&(k=!0),"variable"!==qt&&"variable-subscription"!==qt||Ht.epoAPI.math.toFloat(pt)||(k=!1),"disable"===St&&(k=!1),"yes"!==Mt.tm_epo_change_variation_price&&"yes"!==Mt.tm_epo_change_original_price||(k=!0),z.is_associated&&!ft&&(k=!1),"yes"===Mt.tm_epo_total_price_as_unit_price&&(g=1),l=parseFloat(b*g),Mt.extraFee&&(E=parseFloat(Mt.extraFee),Number.isFinite(E)||(E=0)),!1!==(v=Ht.epoAPI.applyFilter("tcCalculateFinalProductPrice",!1,{alternativeCart:At,product_price:b,product_total_price:l,v_product_price:_t,tm_set_tax_price:Jt,main_product:Ot,totalsHolder:Ct,cartQty:g}))&&"object"==typeof v&&Object.prototype.hasOwnProperty.call(v,"productPrice")&&Object.prototype.hasOwnProperty.call(v,"productTotalPrice")&&(b=v.productPrice,l=v.productTotalPrice),e=Ht.epoAPI.applyFilter("tc_adjust_options_price_per_unit",e,l),x=parseFloat(e*g*n),x=Ht.epoAPI.applyFilter("tc_adjust_options_total_price",x,g,n,e,Ct),T="no"===Mt.tm_epo_global_product_element_quantity_sync?(q=parseFloat(m),parseFloat(at)):(q=parseFloat(m*g*n),parseFloat(at*g*n)),q=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_total_price",q,g,n,e,Ct),T=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_total_price_taxed",T,g,n,e,Ct),a=Ht.epoAPI.applyFilter("tc_adjust_options_price_per_unit",a,l),F=parseFloat(a*g*n),F=Ht.epoAPI.applyFilter("tc_adjust_options_original_total_price",F,g,n,a,Ct),j="no"===Mt.tm_epo_global_product_element_quantity_sync?(S=parseFloat(et),parseFloat(it)):(S=parseFloat(et*g*n),parseFloat(it*g*n)),S=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_original_total_price",S,g,n,a,Ct),j=Ht.epoAPI.applyFilter("tc_adjust_options_productfield_original_total_price_taxed",j,g,n,a,Ct),"1"===B&&0<parseFloat(x)&&(l=_t=b=0),l=Ht.epoAPI.applyFilter("tc_adjust_product_total_price_without_options",l),x=Ht.epoAPI.applyFilter("tcAdjustTotal",x,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),q=Ht.epoAPI.applyFilter("tcAdjustProductFieldTotal",q,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),T=Ht.epoAPI.applyFilter("tcAdjustProductFieldTotalTaxed",T,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),F=Ht.epoAPI.applyFilter("tcAdjustOriginalTotal",F,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),S=Ht.epoAPI.applyFilter("tcAdjustProductFieldOriginalTotal",S,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),j=Ht.epoAPI.applyFilter("tcAdjustProductFieldOriginalTotalTaxed",j,{epo:z,totalsHolder:Ct,cart:y,main_product:Ot}),x=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_total",x,Ct)),P=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_totals_fee",P,Ct)),F=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_original_total",F,Ct)),I=parseFloat(Ht.epoAPI.applyFilter("tc_adjust_original_total_fee",I,Ct)),h=E,A=e,at=m=(p=x)+(v=P),et=a,$=J=(it=F)+(n=I),Z=l,W=parseFloat(l+m+h),h=parseFloat(w+J+h),b=Jt(b,Ct,void 0,0,void 0,void 0,!0),mt=Jt(mt,Ct,void 0,0,void 0,void 0,!0),l=Jt(l,Ct,void 0,0,void 0,void 0,!0),x=Jt(x,Ct,void 0,0,void 0,void 0,!0),e=Jt(e,Ct,void 0,0,void 0,void 0,!0),P=Jt(P,Ct,void 0,0,void 0,void 0,!0),m=parseFloat(P)+parseFloat(x),F=Jt(F,Ct,void 0,0,void 0,void 0,!0),a=Jt(a,Ct,void 0,0,void 0,void 0,!0),I=Jt(I,Ct,void 0,0,void 0,void 0,!0),J=parseFloat(I)+parseFloat(F),E=Jt(E,Ct,void 0,0,void 0,void 0,!0),o=l,l=Ht.epoAPI.applyFilter("tc_adjust_product_total_price",parseFloat(l+m+E),o,m,E,x,P,Ct),U=Ht.epoAPI.applyFilter("tc_adjust_product_total_original_price",parseFloat(o+J+E),o,J,E,F,I,Ct),u="1"===(Ct.attr("data-prices-include-tax")||Mt.prices_include_tax)?(ot=u+parseFloat(Ut(x,Ct)),rt=u+parseFloat(Ut(m,Ct)),lt=u+parseFloat(Ut(l,Ct)),parseFloat(Ut(o,Ct))):(ot=u+parseFloat(x-p),rt=u+parseFloat(m-at),lt=u+parseFloat(l-W),parseFloat(o-Z)),p+=q,A+=q,at+=q,it+=S,et+=S,$+=S,W+=q,h+=S,x+=T,e+=T,m+=T,F+=j,a+=j,J+=j,l+=T,U+=j,q=parseFloat(b+parseFloat(e)),S=parseFloat(b+parseFloat(a)),"yes"===Mt.tm_epo_fees_on_unit_price&&(q=parseFloat(b+parseFloat(e)+parseFloat(parseFloat(P)/g)),S=parseFloat(b+parseFloat(a)+parseFloat(parseFloat(I)/g))),T=Wt(q,Ct,!0,!0),j=Wt(S,Ct,!0,!0),E&&(yt=!0,vt=Wt(E,Ct,!0,!0)),i=Wt(l,Ct,!0,!0),R=Wt(U,Ct,!0,!0),N=Wt(x,Ct,!0,!0),L=Wt(P,Ct,!0,!0),H=Wt(F,Ct,!0,!0),M=Wt(I,Ct,!0,!0),ct=Wt(ot),nt=Wt(rt),dt=Wt(lt),st=Wt(u),T=Ht.epoAPI.applyFilter("tc_adjust_formatted_unit_price",T,b,e,P,g),N=Ht.epoAPI.applyFilter("tc_adjust_formatted_options_total",N,x,e,g),L=Ht.epoAPI.applyFilter("tc_adjust_formatted_fees_total",L,P),i=Ht.epoAPI.applyFilter("tc_adjust_formatted_final_total",i,l,o,m,E,g),T=Ht.epoAPI.applyFilter("tcAdjustFormattedUnitPrice",T,{epo:z,totalsHolder:Ct,event:t,unit_price:q,productPrice:b,_total:e,total_plcart_fee_options_totals_fee:P,cartQty:g}),j=Ht.epoAPI.applyFilter("tcAdjustFormattedUnitOriginalPrice",j,{epo:z,totalsHolder:Ct,event:t,unit_original_price:S,productPrice:b,_original_total:a,total_plcart_fee_options_totals_fee:P,cartQty:g}),N=Ht.epoAPI.applyFilter("tcAdjustFormattedOptionsTotal",N,{epo:z,totalsHolder:Ct,event:t,total:x,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),H=Ht.epoAPI.applyFilter("tcAdjustFormattedOptionsOriginalTotal",H,{epo:z,totalsHolder:Ct,event:t,original_total:F,_original_total:a,original_total_plus_fee:J,extraFee:E,cartQty:g}),L=Ht.epoAPI.applyFilter("tcAdjustFormattedFeesTotal",L,{epo:z,totalsHolder:Ct,event:t,cart_fee_options_total:P,extraFee:E,cartQty:g}),M=Ht.epoAPI.applyFilter("tcAdjustFormattedFeesOriginalTotal",M,{epo:z,totalsHolder:Ct,event:t,cart_fee_options_original_total:I,extraFee:E,cartQty:g}),i=Ht.epoAPI.applyFilter("tcAdjustFormattedFinalTotal",i,{epo:z,totalsHolder:Ct,event:t,product_total_price:l,product_total_price_without_options:o,total_plus_fee:m,extraFee:E,cartQty:g}),R=Ht.epoAPI.applyFilter("tcAdjustFormattedFinalOriginalTotal",R,{epo:z,totalsHolder:Ct,event:t,product_total_original_price:U,product_total_price_without_options:o,original_total_plus_fee:J,extraFee:E,cartQty:g}),(0<x&&"showtgz"===jt||"show"===jt)&&(ut=!0,"yes"===Mt.tm_epo_enable_vat_options_total)&&(ht=!0),0!==P&&(gt=!0),i&&"show"===Tt&&(bt=!0),C={qty:g,product_price:b,raw_product_price:_t,product_regular_price:mt,raw_product_regular_price:w,formatted_product_price:Wt(parseFloat(b)*g),late_total_prices:_,late_total_price:Jt(_[0],Ct),late_total_original_price:Jt(_[1],Ct),raw_options_price_per_unit:A,raw_options_total_price:p,raw_cart_fee_options_total_price:v,raw_total_plus_fee:at,raw_options_original_price_per_unit:et,raw_options_original_total_price:it,raw_cart_fee_options_original_total_price:n,raw_original_total_plus_fee:$,raw_product_total_price:W,raw_product_total_original_price:h,raw_product_total_price_without_options:Z,options_price_per_unit:e,options_total_price:x,cart_fee_options_total_price:P,total_plus_fee:m,options_original_price_per_unit:a,options_original_total_price:F,cart_fee_options_total_original_price:I,original_total_plus_fee:J,vat_options_total:ot,vat_options_total_plus_fee:rt,formatted_vat_options_total:ct,formatted_vat_options_total_plus_fee:nt,vat_total:lt,formatted_vat_total:dt,vat_product_base:u,formatted_vat_product_base:st,product_total_price:l,product_total_original_price:U,product_total_price_without_options:o,product_unit_price:q,product_unit_original_price:S,formatted_unit_price:T,formatted_options_total:N,formatted_fees_total:L,formatted_final_total:i,formatted_unit_original_price:j,formatted_options_original_total:H,formatted_fees_original_total:M,formatted_final_original_total:R,formatted_extra_fee:vt,show_options_total:ut,show_fees_total:gt,show_extra_fee:yt,show_final_total:bt,show_options_vat:ht,unit_price:Mt.i18n_unit_price,show_unit_price:"yes"===Mt.tm_epo_show_unit_price,options_total:Mt.i18n_options_total,fees_total:Mt.i18n_fees_total,extra_fee:Mt.i18n_extra_fee,final_total:Mt.i18n_final_total,options_vat_total:Mt.i18n_vat_options_total,totals_box_before_unit_price:Mt.totals_box_before_unit_price,totals_box_after_unit_price:Mt.totals_box_after_unit_price,totals_box_before_vat_options_totals_price:Mt.totals_box_before_vat_options_totals_price,totals_box_after_vat_options_totals_price:Mt.totals_box_after_vat_options_totals_price,totals_box_before_options_totals_price:Mt.totals_box_before_options_totals_price,totals_box_after_options_totals_price:Mt.totals_box_after_options_totals_price,totals_box_before_fee_totals_price:Mt.totals_box_before_fee_totals_price,totals_box_after_fee_totals_price:Mt.totals_box_after_fee_totals_price,totals_box_before_extra_fee_price:Mt.totals_box_before_extra_fee_price,totals_box_after_extra_fee_price:Mt.totals_box_after_extra_fee_price,totals_box_before_final_totals_price:Mt.totals_box_before_final_totals_price,totals_box_after_final_totals_price:Mt.totals_box_after_final_totals_price},Mt.customer_price_format&&(wt=Mt.customer_price_format_wrap_start,xt=Mt.customer_price_format_wrap_end,Q=Mt.customer_price_format),N&&0<x&&(_=Qt(x),A=Qt(F),Q&&(_=Q.replace("__PRICE__",_).replace("__CODE__",Mt.current_currency),Ct.data("is-on-sale")||(A=Q.replace("__PRICE__",A).replace("__CODE__",Mt.current_currency))),_=Ht.epoAPI.applyFilter("tcFilterFormattedFTotal",_,{epo:z,totalsHolder:Ct,event:t,total:x,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),A=Ht.epoAPI.applyFilter("tcFilterFormattedFOriginalTotal",A,{epo:z,totalsHolder:Ct,event:t,original_total:F,total:F,_total:e,total_plus_fee:m,extraFee:E,cartQty:g}),"yes"===Mt.tm_epo_enable_original_final_total&&x!==F?(C.formatted_options_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:A,sale_price:_,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})),C._foriginal_total=A,C._ftotal=_):C.formatted_options_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:_,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})))),i&&0<=l&&(r=Qt(l),c="1"===B&&0<parseFloat(x)?parseFloat($+E):parseFloat(parseFloat(w*g)+$+E),Q&&(r=Q.replace("__PRICE__",r).replace("__CODE__",Mt.current_currency),Ct.data("is-on-sale")||(c=Q.replace("__PRICE__",c).replace("__CODE__",Mt.current_currency))),r=Ht.epoAPI.applyFilter("tc_adjust_native_price",r,l),c=Qt(c=Jt(c,Ct,void 0,0,void 0,void 0,!0)),c=Ht.epoAPI.applyFilter("tc_adjust_native_regular_price",c,l),"yes"===Mt.tm_epo_enable_original_final_total&&(Ct.data("is-on-sale")&&"1"!==B||c!==r)?C.formatted_final_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt})):C.formatted_final_total=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt}))),C._f_regular_price=c,C._fprice=r),C=Xt("formatted_fees_original_total","cart_fee_options_total_original_price",C,Ct),C=Xt("formatted_fees_total","cart_fee_options_total_price",C,Ct),C=Xt("formatted_final_original_total","product_total_original_price",C,Ct),C=Xt("formatted_final_total","product_total_price",C,Ct),C=Xt("formatted_options_original_total","options_original_total_price",C,Ct),C=Xt("formatted_options_total","options_total_price",C,Ct),C=Xt("formatted_unit_original_price","product_unit_original_price",C,Ct),C=Xt("formatted_unit_price","product_unit_price",C,Ct),void 0!==Ht.tcepo.showHideTotal&&void 0!==Ht.tcepo.showHideTotal[Bt]&&(k=Ht.tcepo.showHideTotal[Bt]),void 0!==(C=Ht.epoAPI.applyFilter("tc_adjust_tc_totals_ob",C,{epo_object:z,showTotal:k,epoHolder:Pt,totalsHolder:Ct,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g})).showTotal&&(k=C.showTotal),z.tc_totals_ob=C,k=Ht.epoAPI.applyFilter("tcFinalTotalsBoxVisibility",k,{epo:z,alternativeCart:At,cart:y,main_product:Ot,totalsHolder:Ct,this_epo_totals_container:Dt}),p=Ht.epoAPI.template.html(Lt.templateEngine.tc_final_totals,C),Ct.data("tm-html",p),Ct.data("tc_totals_ob",C),z.associated_connect&&1===z.associated_connect.length&&("1"===z.associated_connect.attr("data-no-price")?(Y=V=G=X=0,tt=K="",te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),X,K,V,tt)):(X=C.product_price+C.options_price_per_unit+C.cart_fee_options_total_price/C.qty,G=C.raw_product_price+C.raw_options_price_per_unit+C.raw_cart_fee_options_total_price/C.qty,V=C.product_regular_price+C.options_original_price_per_unit+C.cart_fee_options_total_original_price/C.qty,Y=C.raw_product_regular_price+C.raw_options_original_price_per_unit+C.raw_cart_fee_options_original_total_price/C.qty,K=$t(X,z.this_epo_totals_containe,!1,!1,d),tt=$t(V,z.this_epo_totals_containe,!1,!1,d),te(d.closest(".tmcp-field-wrap").find(".tc-price").not(Lt.associatedEpoSelector+" .tc-price"),X,K,V,tt),z.associated_connect.data("tm-quantity",C.qty),z.associated_connect.data("tm-quantity")&&(X*=parseFloat(z.associated_connect.data("tm-quantity")),G*=parseFloat(z.associated_connect.data("tm-quantity")),V*=parseFloat(z.associated_connect.data("tm-quantity")),Y*=parseFloat(z.associated_connect.data("tm-quantity"))),K=$t(X,z.this_epo_totals_containe,!1,!1,d),tt=$t(V,z.this_epo_totals_containe,!1,!1,d)),z.associated_connect.data("price_set",1),d.is(".tcenabled")&&d.data("associated_price_set",1),d.data("price_set",1),d.data("raw_price",G),d.data("raw_original_price",Y),d.data("price",Jt(X,z.this_epo_totals_containe,d)),d.data("original_price",Jt(V,z.this_epo_totals_containe,d)),z.associated_connect.data("price-changed",1),setTimeout(function(){z.associated_connect&&t.noassociated||z.mainEpoObject.main_cart.trigger({type:"tm-epo-update",norules:2})},20)),Rt.trigger("tcEpoAfterCalculateTotals",{epo:z,alternativeCart:At,this_product_type:qt,cart:y,bundleid:D,totalsObject:C,main_product:Ot,per_product_pricing:ft}),v=Ht.epoAPI.applyFilter("hide_native_price",!0),0<g?("yes"===Mt.tm_epo_change_variation_price&&(!0===v&&"disable"!==St?Gt(y).hide():Gt(y).show()),!k||"disable"===St||"hideiftotaliszero"===St&&0===l||"hideifoptionsiszero"===St&&0===m?(Ct.html(p=""),Ct.data("tm-floating-box-data",[])):(Ct.html(p),Rt.trigger("tc-totals-container",{epo:C,totals_holder:Ct,data:{epo_object:z,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g},tm_epo_js:Mt})),i&&0<=l&&(at=Gt(y),"yes"===Mt.tm_epo_change_variation_price&&(f=(f=Ct.data("is-on-sale")?Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.variation_price_before_price_text,after_price_text:Mt.variation_price_after_price_text})),raw:C.product_total_price},Ct):Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.variation_price_before_price_text,after_price_text:Mt.variation_price_after_price_text})),raw:C.product_total_price},Ct)).formatted,at.html(f).show()),"yes"===Mt.tm_epo_change_original_price)&&(At&&0!==Ot.find(".cpf-bto-price").length||(void 0===(s=0===(s=z.associated_connect?z.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).length&&Ot.is(".tc-after-shop-loop")?Ot.closest(".product").find(".price"):s).data("tc-original-html")&&s.data("tc-original-html",s.html()),0<l?(f=(f=Ct.data("is-on-sale")?Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_sale_price,{price:c,sale_price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.product_price_before_price_text,after_price_text:Mt.product_price_after_price_text})),raw:C.product_total_price},Ct):Xt("formatted","raw",f={formatted:f=Ht.epoAPI.util.decodeHTML(Ht.epoAPI.template.html(Lt.templateEngine.tc_formatted_price,{price:r,customer_price_format_wrap_start:wt,customer_price_format_wrap_end:xt,before_price_text:Mt.product_price_before_price_text,after_price_text:Mt.product_price_after_price_text})),raw:C.product_total_price},Ct)).formatted,s.html(f).show()):qt&&"composite"!==qt&&(z.associated_connect?(!z.variations_form.length||0<(f=z.this_epo_totals_container.data("variationIdElement")).length&&(f=parseFloat(f.val()))&&0!==f)&&s.html(Ht.epoAPI.util.decodeHTML(Mt.assoc_current_free_text)):s.html(Ht.epoAPI.util.decodeHTML(Mt.current_free_text)))),Rt.trigger("tcEpoMaybeChangePriceHtml",{epo:z,alternativeCart:At,this_product_type:qt,cart:y,bundleid:D,totalsObject:C,main_product:Ot,nativePrice:r})),At?zt.trigger({type:"tm-epo-update",norules:1}):Dt.data("is_active",!0)):(z.associated_connect&&(s=z.main_product.find(Lt.associatedNativeProductPriceSelector)).html(s.data("tc-original-html")),Gt(y).each(function(){var t=Ht(this);t.data("tm-original-html")?t.html(t.data("tm-original-html")):t.data("tm-original-html",t.html())}),0===_t&&"yes"===Mt.tm_epo_remove_free_price_label?Gt(y).hide():"yes"!==Mt.tm_epo_change_variation_price||!0===v&&"disable"!==St||Gt(y).show(),Ct.empty(),At&&zt.trigger({type:"tm-epo-update",norules:1})),zt.trigger("tm-epo-after-update",{container:kt}),Rt.trigger("tc-epo-after-update",{epo:C,totals_holder:Ct,data:{epo_object:z,add_late_fields_prices:ne,tm_set_price:$t,tm_set_price_totals:Wt,product_total_price:l,product_price:b,qty:g,bundleid:D,currentCart:Et},tm_epo_js:Mt})))}),"variable"!==qt&&"variable-subscription"!==qt||((e=Pt.find(".tm-epo-variation-section").first()).find(".tm-epo-reset-variation").off("click.cpfv").on("click.cpfv",function(){var t=Ht(this),e=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),a=t.closest(".cpf-type-variations"),i=t.closest(".cpf-element").find(".tm-epo-variation-element"),o=t.closest(".cpf-element").find(".tmcp-field-wrap");i.prop("checked",!1),o.removeClass("tc-active"),v.find("[data-attribute_name='attribute_"+e+"']").val("").trigger("change"),v.find("[data-attribute_name='attribute_"+e+"']").trigger("focusin"),Ot.find(".cpf-type-variations").not(a).each(function(t,e){v.find("[data-attribute_name='attribute_"+Ht.epoAPI.dom.id(Ht(e).find(".tm-epo-variation-element").first().attr("data-tm-for-variation"))+"']").trigger("focusin")}),t.trigger("blur"),v.trigger("woocommerce_update_variation_values_tmlogic")}),e.find("input.tm-epo-variation-element,input.tm-epo-variation-element + span").off("mouseup.cpfv").on("mouseup.cpfv",function(){var t=Ht(this);(t=t.is("span")?t.prev("input"):t).attr("disabled")&&v.find(".reset_variations").trigger("click"),t=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),v.find("[data-attribute_name='attribute_"+t+"']").trigger("focusin")}),e.off("click."+h+".tmepo",".reset_variations, .tc-epo-element-variable-reset-variations").on("click."+h+".tmepo",".reset_variations, .tc-epo-element-variable-reset-variations",{_epoObject:Ft},function(t){"yes"!==Mt.tm_epo_change_original_price||At&&0!==Ot.find(".cpf-bto-price").length||(t=t.data._epoObject.associated_connect?t.data._epoObject.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).data("tc-original-html")&&t.html(t.data("tc-original-html")),v.find(".variations .reset_variations, .tc-epo-element-variable-reset-variations").first().trigger("click")}),e.find(".tm-epo-variation-element").off("change.cpfv tm_epo_variation_element_change").on("change.cpfv tm_epo_variation_element_change",function(t){var e,a=Ht(this),i=Ht.epoAPI.dom.id(a.attr("data-tm-for-variation")),o=a.val(),r=a.closest(".cpf-type-variations"),i=v.find("[data-attribute_name='attribute_"+i+"']");a.closest(".tm-epo-variation-section").is(".tm-hidden")||(t&&t.type&&"tm_epo_variation_element_change"===t.type||(e=!1,i.each(function(){if(this.value===o)return!(e=!0)}),e||i.trigger("focusin"),i.val(o).trigger("change")),o||i.trigger("focusin"),Ot.find(".cpf-type-variations").not(r).each(function(){v.find("#"+Ht.epoAPI.dom.id(Ht(this).find(".tm-epo-variation-element").first().attr("data-tm-for-variation"))).trigger("focusin")}),a.trigger("blur"),v.trigger("woocommerce_update_variation_values_tmlogic"))}).off("focusin.cpfv").on("focusin.cpfv",function(){var t=Ht(this);t.is("select")&&(t=Ht.epoAPI.dom.id(t.attr("data-tm-for-variation")),v.find("[data-attribute_name='attribute_"+t+"']").trigger("focusin"),v.trigger("woocommerce_update_variation_values_tmlogic"))}),v.off(g+"found_variation.tmepo tm_fix_stock",".single_variation_wrap").on(g+"found_variation.tmepo tm_fix_stock",".single_variation_wrap",function(){X(Ht(this),kt)}),v.off(g+"found_variation.tmepo").on(g+"found_variation.tmepo",function(t,e){var a,i,o,r,c,n,l,d=Ht(this);Ct.data("is-on-sale",e.tc_is_on_sale),Ct.data("regular-price",Z(e.display_regular_price,Ct,e)),Rt.trigger("tm-epo-found-variation",{epo:Ft,totalsHolder:Ct,totalsHolderContainer:It,currentCart:Et,variationForm:d,variation:e}),i=(e={epoHolder:Pt,totalsHolder:Ct,totalsHolderContainer:It,currentCart:Et,variationForm:d,variation:e}).epoHolder,o=e.totalsHolder,r=e.totalsHolderContainer,c=e.currentCart,n=e.variationForm,e=e.variation,l=o.data("variations"),o.data("current_variation",e),e&&"display_price"in e&&!o.data("tm-epo-is-woocs")?(a=e.display_price,o.data("priceIsWithDiscount","1"),o.removeData("tcprice")):l&&e&&e.variation_id&&void 0!==l[e.variation_id]?(a=l[e.variation_id],o.removeData("tcprice")):e&&Ht(e.price_html).find(".amount:last").length&&(a=(a=(a=(a=Ht(e.price_html).find(".amount:last").text()).replace(Mt.currency_format_thousand_sep,"")).replace(Mt.currency_format_decimal_sep,".")).replace(/[^0-9.]/g,""),a=parseFloat(a),o.removeData("tcprice")),a=Z(a,o,e),o.data("price",a),r.find(".cpf-product-price").val(a),setTimeout(function(){i.find("select.tm-epo-field").trigger("tm-select-change-html-all-math")},100),n.data("tm-styled-variations")||c.trigger({type:"tm-epo-update"}),X(d,kt)}).off(g+"hide_variation.tmepo").on(g+"hide_variation.tmepo",{_epoObject:Ft},function(t){"yes"!==Mt.tm_epo_change_original_price||At&&0!==Ot.find(".cpf-bto-price").length||(t=t.data._epoObject.associated_connect?t.data._epoObject.main_product.find(Lt.associatedNativeProductPriceSelector):Ht(Lt.nativeProductPriceSelector)).data("tc-original-html")&&t.html(t.data("tc-original-html")),Ct.data("price",!1),Ct.removeData("tcprice"),Et.trigger({type:"tm-epo-update",norules:2})}).off(g+"check_variations.tmepo").on(g+"check_variations.tmepo",function(){var a=0,t=e.find(".reset_variations");v.find(".variations select, .tc-epo-variable-product-selector").each(function(){var t=Ht(this).data("attribute_name")||Ht(this).attr("name"),e=Ht(this).val()||"";0<e.length&&a++,t,0}),0<a?"hidden"===t.css("visibility")&&t.css("visibility","visible").hide().fadeIn():t.css("visibility","hidden")}).trigger(g+"check_variations"),function(t,e,a,i){var o,r,c,n,l,d,s,p,m=t.epoEventId,_="input[name^='variation_id']",f=t.is_associated?"tc_variation_form.tmlogic":"wc_variation_form.tmlogic",u=t.is_associated?"tc_":"",h=t.variations_form,g=t.is_associated?h.find(".tc-epo-element-variations"):h.find(".variations"),v=t.is_associated?".tc-epo-element-variable-reset-variations":".reset_variations";if(h.attr("data-epo_id",t.epo_id),0<e.find("input.variation_id").length&&(_="input.variation_id"),i.find(".tm-epo-variation-element").length||i.data("tm-epo-variation-element")){if((o=i.find(".tm-epo-variation-section").first()).find(".cpf-type-variations").attr("data-epo_id",t.epo_id).attr("data-product_id",h.attr("data-product_id")),i.data("tm-epo-variation-element",o.find(".tm-epo-variation-element")),a&&"main"!==a&&!t.is_associated){if(g=(h=t.form).find('.composite_component[data-item_id="'+a+'"]').find(".variations"),h.attr("data-epo_id",t.epo_id),0===g.length)return;r=o.closest("li.tm-extra-product-options-field"),o.is(".tm-hidden")||g.hide(),g.after(o.addClass("tm-extra-product-options nopadding")),r.is(":empty")&&r.hide(),o.is(".section_popup")?o.wrap("<div class='tc-styled-variations tc-row'></div>"):(o.removeClass("tc-cell"),o.wrap("<div class='tc-styled-variations'></div>")),c=!1,e.off(f).on(f,function(){for(c=!0,h.on("click.tmlogic",".reset_variations",function(){o.find("select.tm-epo-variation-element").val("").children("option").prop("disabled",!1).show(),o.find(".tm-epo-variation-element").prop("disabled",!1).removeClass("tm-disabled").prop("checked",!1).closest("li").show(),Rt.trigger("tmlazy"),o.find(".tm-epo-variation-element").trigger("tm_trigger_product_image"),o.find("li").removeClass("tc-active tm-attribute-disabled").css("opacity","")}),e.off("woocommerce_update_variation_values_tmlogic").on("woocommerce_update_variation_values_tmlogic",function(){W(e,t)}),p=0;p<A.length;p+=1)n=A[p],"object"===typeof n&&(l="string"==typeof n.name||!1,d="string"==typeof n.selector||!1,s="function"==typeof n.func||!1,l)&&s&&("input[name='variation_id']"===d&&(d=_),n.selector?e.data("tm-styled-variations",1).off(u+n.name+p,d).on(u+n.name+p,d,n.func):e.data("tm-styled-variations",1).off(u+n.name+p).on(u+n.name+p,n.func));A=[],o.find(".tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)").last().trigger("tm_epo_variation_element_change")}),Ht(function(){!1===c&&e.trigger(f)})}else{for(o.length&&(o.is(".tm-hidden")||g.hide(),r=o.closest("li.tm-extra-product-options-field"),g.after(o.addClass("tm-extra-product-options nopadding")),r.is(":empty")&&r.hide(),o.is(".section_popup")?o.wrap("<div class='tc-styled-variations tc-row'></div>"):(o.removeClass("tc-cell"),o.wrap("<div class='tc-styled-variations'></div>")),h.off("click.tmlogic",v).on("click.tmlogic",v,function(){o.find("select.tm-epo-variation-element").val("").children("option").prop("disabled",!1).show(),o.find(".tm-epo-variation-element").prop("disabled",!1).removeClass("tm-disabled").prop("checked",!1).closest("li").show(),Rt.trigger("tmlazy"),o.find(".tm-epo-variation-element").trigger("tm_trigger_product_image"),o.find("li").removeClass("tc-active tm-attribute-disabled").css("opacity","")})),h.off("woocommerce_update_variation_values_tmlogic").on("woocommerce_update_variation_values_tmlogic",function(){W(h,t)}),p=0;p<A.length;p+=1)n=A[p],"object"===typeof n&&(l="string"==typeof n.name||!1,d="string"==typeof n.selector||!1,s="function"==typeof n.func||!1,l)&&s&&("input[name='variation_id']"===d&&(d=_),n.selector?h.data("tm-styled-variations",1).off(u+n.name+p,d).on(u+n.name+p,d,n.func):h.data("tm-styled-variations",1).off(u+n.name+p).on(u+n.name+p,n.func));A=[],o.find(".tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)").last().trigger("tm_epo_variation_element_change")}Ht.tcepo.formSubmitEvents[m][Ht.tcepo.formSubmitEvents[m].length]={trigger:function(){return!0},on_true:function(){return o.find(".tm-epo-variation-element").attr("disabled","disabled"),!0},on_false:function(){o.find(".tm-epo-variation-element").prop("disabled",!1)}},Ht(x.body).on("added_to_cart",function(){o.find(".tm-epo-variation-element").prop("disabled",!1)})}}(Ft,kt,u,Pt)),i.trigger("tm-select-change-html"),r.trigger("change.cpf",{init:1}),c.trigger("showhide.cpfcustom"),o.filter(":checked").trigger("cpfclearbutton"),Rt.on("tm-do-epo-update",function(){Et.trigger({type:"tm-epo-update"})}),Rt.trigger("tm-epo-init-events",{epo:{epo_id:b,form:Ft.form,currentCart:Et,cart_container:kt,epo_holder:Pt,totals_holder_container:It,totals_holder:Ct,main_cart:zt,main_epo_inside_form:Nt,product_id_selector:w,epo_id_selector:f,product_id:p,this_epo_container:m,this_totals_container:_,this_epo_totals_container:Dt}}),Rt.trigger("epoEventHandlers",{epo:Ft,currentCart:Et,cartContainer:kt,qtyElement:y,epoHolder:Pt,totalsHolderContainer:It,totalsHolder:Ct,variationForm:v,variation_id_selector:t,main_epo_inside_form:Nt,this_product_type:qt,get_price_excluding_tax:R,get_price_including_tax:N}),"disable"!==St&&It.addClass("tc-show"),Rt.trigger("epo_options_before_visible"),"yes"===Mt.tm_epo_progressive_display?setTimeout(function(){Pt.css("opacity",0).addClass("tc-show").animate({opacity:1},Lt.epoAnimationDelay,"easeOutExpo",function(){Rt.trigger("epo_options_visible"),Rt.trigger("tmlazy")})},Lt.epoDelay):(Pt.addClass("tc-show"),Rt.trigger("epo_options_visible"),Rt.trigger("tmlazy")),Ot.addClass("tc-init")}function Ct(t){var e=t.variations_form,a=t.main_cart,i=t.this_epo_container,o=t.is_associated?"tc_variation_form.cpf":"wc_variation_form.cpf";e.off(o).on(o,function(){e.data("epo_loaded")||(J(i),Q(i),Ht.tcepo.lateFieldsPrices[t.epoEventId]=[],It(t),ut(t),bt(t),t.noEpoUpdate=!1,setTimeout(function(){T(i),a.trigger({type:"tm-epo-update",rules:"init"})},10),e.data("epo_loaded",!0))}),v&&e.trigger(o),Rt.trigger("epo-after-init",{epo:t})}function Et(t,e,a,i,o){var r=Ht.extend(!0,{},t),c=i.attr("data-product-id"),n=i.attr("data-epo-id"),l=".tm-product-id-"+c,d="[data-epo-id='"+n+"']",s="p"+c+"e"+n,p=Ht(".tc-extra-product-options"+l+d),m=Ht(".tc-totals-form"+l+d),_=Ht(".tc-epo-totals"+l+d);t.isManual=!0,Ht.tcepo.formSubmitEvents[s]=[],Ht.tcepo.errorObject[s]=!1,Ht.tcepo.initialActivation[s]=!1,t.product_id=c,t.product_id_selector=l,t.epo_id=n,t.epo_id_selector=d,t.epoEventId=s,t.noEpoUpdate=!0,t.thisForm=e,t.this_epo_container=p,t.this_totals_container=m,t.this_epo_totals_container=_,ct(),o.find(".tm-collapse").tmtoggle(),o.find(".tm-section-link").tmsectionpoplink(),kt(e),wt(e),xt(),pt(e,t),nt(e),mt(i),_t(i.find(".tc-lightbox-image").not(".tm-extra-product-options-variations .radio-image")),J(i),Q(i),T(i),Ht.tcToolTip(e.find(".tm-tooltip")),It(t,e,a),t.noEpoUpdate=!1,a.trigger({type:"tm-epo-update",norules:2}),setTimeout(function(){t.main_cart.trigger({type:"tm-epo-update",epoObject:r,norules:1})},200),X(a,e)}function g(t,e,a,i,o,r,c){var n,l,d,s,p,m=!1,_=!1,f=!1,u=void 0!==a,h=!1,g=0<Ht(".variation_form_section .variations-table").length,v=!1;if((t=Ht(t)).is(".tc-init")&&!c)return!0;if(E=e?t:Ht(P),Rt.trigger("tm-epo-init-start"),u||t.is(".product")&&(h=!0,u=I.find(Lt.epoSelector).length),u||"no"!==Mt.tm_epo_enable_final_total_box_all||t.is(".tm-no-options-composite")){h&&(Rt.trigger("tm-epo-init-no-options"),!t.is(".product")||t.is(".tm-no-options-pxq")||t.is(".tm-no-options-composite")||(t=I)),a||(h=t.find(Lt.addToCartSelector).last(),a=(a=0<h.length?h.val():(h=Ht(".tc-totals-form.tm-totals-form-main")).attr("data-product-id"))||""),i||(i=parseInt(t.find("input.tm-epo-counter").last().val(),10),Number.isFinite(i))||(i=""),l=Ht(".tc-extra-product-options"+(h=".tm-product-id-"+a)+(y="[data-epo-id='"+i+"']")),x=Ht(".tc-totals-form"+h+y),d=Ht(".tc-epo-totals"+h+y),p=t.find(".variations_form").not(".composite_component .variations_form").first(),n="p"+a+"e"+i,p&&p.attr("data-product_id")&&p.attr("data-product_id")!==a&&(p=t.find(".variations_form[data-product_id='"+a+"']")),0===(m=V(t,t,"form",a)).length&&(t.is(".tc-shortcode-wrap")?m=V(x,x,".tc-totals-form",a):t.is(".tc-epo-element-product-container")&&(0===(m=t.find(Lt.associatedEpoCart)).length&&0===(m=l.parent(Lt.associatedEpoSelector)).length&&(m=t.find(".tc-epo-element-product-container-right")),v=!0)),v&&0===p.length&&t.is(".variations_form")&&(p=t),Ht.tcepo.formSubmitEvents[n]=[],Ht.tcepo.errorObject[n]=!1,Ht.tcepo.initialActivation[n]=!1,0<m.find(Lt.epoSelector).length&&(_=!0),(f=0<m.find(".tc-totals-form").length?!0:f)||(Ht.tcepo.formSubmitEvents[n][Ht.tcepo.formSubmitEvents[n].length]={trigger:function(){return!0},on_true:function(){var t=Ht(".tc-totals-form.tm-product-id-"+a+"[data-epo-id='"+i+"']").tcClone(),e=Ht('<div class="tm-hidden tm-formepo-normal"></div>');return m.find(".tm-formepo-normal").remove(),e.append(t),m.append(e),!0},on_false:function(){setTimeout(function(){Ht(".tm-formepo-normal").remove()},100)}}),_||(Ht.tcepo.formSubmitEvents[n][Ht.tcepo.formSubmitEvents[n].length]={trigger:function(){return!0},on_true:function(){var t=Ht(Lt.epoSelector+".tm-product-id-"+a+"[data-epo-id='"+i+"']").tcClone().addClass("formepo"),e=Ht('<div class="tm-hidden tm-formepo"></div>');return m.find(".tm-formepo").remove(),e.append(t),m.append(e),!0},on_false:function(){setTimeout(function(){Ht(".tm-formepo").remove()},100)}}),s={main_product:t,main_cart:m,epo_id:i,form:G(t),main_epo_inside_form:_,product_id_selector:h,epo_id_selector:y,product_id:a,this_epo_container:l,this_totals_container:x,this_epo_totals_container:d,qtySelector:Lt.qtySelector,manualInitEPO:Et,epoEventId:n,variations_form:p,has_epo:u,is_quickview:e,is_associated:v,is_epo_shortcode:l.is(".tc-shortcode"),mainEpoObject:r,associated_connect:o,noEpoUpdate:!0},Ht(s.form).data("epo_object",s),l.data("epo_object",s),m.data("product_id",a).data("epo_id",i).data("product_id_selector",h).data("epo_id_selector",y),_=(f=s).this_epo_container,x=f.main_product,f=f.epoEventId,u=_.find(".tm-limit"),r=_.find(".tm-exactlimit"),o=_.find(".tm-minimumlimit"),_.on("change.cpflimit","input.tm-epo-field.tmcp-checkbox",function(){var t=Ht(this);K(t,!0),tt(t,!0)}),u.length&&et(u,x,f),r.length&&at(r,x,f),o.length&&it(o,f),y=(h=s).epoEventId,b=h.this_epo_container,"yes"===Mt.tm_epo_upload_popup&&(Ht.tcepo.formSubmitEvents[y][Ht.tcepo.formSubmitEvents[y].length]={trigger:function(){return!0},on_true:function(){var t,e,a=b.data("num_uploads");return a&&Object.keys(a).length&&(t=Ht.tcFloatBox({fps:1,ismodal:!0,refresh:"fixed",width:"50%",height:"300px",classname:"flasho tc-wrapper",data:Ht.epoAPI.template.html(Lt.templateEngine.tc_upload_messages,{files:a,title:Mt.i18n_uploading_files,message:Mt.i18n_uploading_message})}),e=function(){t.destroy(),C.off("ajaxSuccess",e)},C.on("ajaxSuccess",e)),!0},on_false:function(){return!0}}),kt(l),wt(l),xt(),pt(l,s),C.on("click.cpfurl change.cpfurl tmredirect",".tc-url-container .tmcp-radio, .tc-url-container .tmcp-radio+label",function(t){var e=Ht(this).attr("data-url");e&&P.location!==e&&(t.preventDefault(),P.location=e)}),C.on("change.cpfurl tmredirect",".tc-url-container .tmcp-select",function(t){var e=Ht(this).children("option:selected").attr("data-url");e&&P.location!==e&&(t.preventDefault(),P.location=e)}),Ht.tcToolTip(l.find(".tm-tooltip")),l.find(".tm-collapse").tmtoggle(),l.find(".tm-section-link").tmsectionpoplink(),c&&l.addClass("reactivate"),0<p.length?(c&&p.data("epo_loaded",!1),d.data("price",!1),(g?function t(e){var a=requestAnimationFrame(function(){t(e)}),i=e.variations_form,o=i.data("bound"),r=e.is_associated?"tc_variation_form.cpf":"wc_variation_form.cpf";o&&(cancelAnimationFrame(a),Ct(e),i.trigger(r))}:Ct)(s)):(setTimeout(function(){J(l),Q(l),T(l),Ht.tcepo.lateFieldsPrices[n]=[],It(s),ut(s),bt(s),Rt.trigger("epo-after-init-in-timeout",{epo:s}),m.trigger("tm-epo-check-dpd"),s.noEpoUpdate=!1,m.trigger({type:"tm-epo-update",rules:"init"})},20),Rt.trigger("epo-after-init",{epo:s})),ct(),nt(l),mt(l),_t(l.find(".tc-lightbox-image").not(".tm-extra-product-options-variations .radio-image"));var y,b,w,x,F,k,_=s,A=_.this_epo_container;if(_=Mt.theme_name){switch(_=_.toLowerCase(),F=A.find("select"),_){case"flatsome":case"flatsome-child":case"flatsome child":F.wrap('<div class="custom select-wrapper"/>');break;case"avada":case"avada-child":case"avada child":F.wrap('<div class="avada-select-parent tm-select-parent"></div>'),Ht('<div class="select-arrow">&#xe61f;</div>').appendTo(A.find(".tm-select-parent")),P.calc_select_arrow_dimensions?(P.calc_select_arrow_dimensions(),Rt.on("tmsectionpoplink cpflogicdone",function(){P.calc_select_arrow_dimensions()})):P.calcSelectArrowDimensions&&(P.calcSelectArrowDimensions(),Rt.on("tmsectionpoplink cpflogicdone",function(){P.calcSelectArrowDimensions()}));break;case"bazar":case"bazar-child":case"bazar child":F.wrap('<div class="tm-select-wrapper select-wrapper"/>');break;case"blaszok":case"blaszok-child":case"blaszok child":k=function(){setTimeout(function(){Ht(".tm-extra-product-options select").not(".hasCustomSelect").filter(":visible").each(function(){Ht(this).is(".mpcthSelect")||(Ht(this).width(Ht(this).outerWidth()),Ht(this).customSelect({customClass:"mpcthSelect"}))})},100)},Rt.on("cpflogicrun",function(){k()}),Rt.on("epo_options_visible",function(){k()});break;case"handmade":case"handmade child theme":Ht(".tm-owl-slider.tcowl-carousel").addClass("manual")}Rt.trigger("tm-theme-specific-actions",{epo:{theme_name:_,all_epo_selects:F}})}return C.off("click.cpf",".quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus").on("click.cpf",".quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus",function(){Ht(this).closest(".quantity").find(Lt.qtySelector).trigger("change.cpf")}),u=s,Rt.trigger("tm-epo-compatibility",{epo:u}),v||(r=d,x=m,Ht.tcFloatingTotalsBox(r,e,x),o=(w=s).form,f=w.epoEventId,Rt.trigger("tm-from-submit",{epo:w,functions:{tm_apply_validation:Pt,apply_submit_events:At}}),!Pt(w)&&Ht.tcepo.formSubmitEvents[f].length&&o.on("submit",function(){At(w)}),Rt.on("tc_apply_validation",function(){return Pt(w)}),ee(t,s=ae(s,n,s))),Rt.trigger("tm-epo-init-end",{epo:s}),s}Rt.trigger("tm-epo-init-end-no-options")}function qt(){var i,t;"no"===Mt.tm_epo_no_lazy_load&&Ht.extend(Ht.lazyLoadXT,{autoInit:!1,selector:"img.tmlazy",srcAttr:"data-original",visibleOnly:!1,updateEvent:Ht.lazyLoadXT.updateEvent+" tmlazy"}),0<(i=Ht(".tm-no-options-pxq, .tm-no-options-composite")).length&&(i.addClass("initializing"),i.each(function(t,e){var a;1<(a=(e=Ht(e)).find("input.tm-epo-counter")).length?a.each(function(){var t=Ht(this),e=t.closest(".cart").parent();(e=e.is("form")?e.parent():e).is(".initializing")||g(e,!1,void 0,parseInt(t.val(),10))}):g(e,!1),i.removeClass("initializing")})),setTimeout(function(){try{0<(t=Ht(Lt.epoSelector).not(Lt.associatedEpoSelector+" "+Lt.epoSelector+", .tm-no-options-pxq, .tm-no-options-composite, .wc-product-table "+Lt.epoSelector)).length&&(i.addClass("initializing"),t.each(function(){var t=Ht(this),a=t.attr("data-product-id"),e=t.attr("data-epo-id"),i=!1,o=!1,r=t.closest(".tc-after-shop-loop.tm-has-options");(0!==r.length||0===(r=Ht(Lt.tcAddToCartSelector+"[data-epo-id='"+e+"'][value='"+a+"']").closest("form,.cart").first().parent()).length&&0===(r=Ht(Lt.addToCartSelector+"[value='"+a+"']").closest("form,.cart").first().parent()).length&&0===(r=t.closest("form,.cart").first().parent(".tm-has-options")).length&&(t.is(".tc-shortcode")&&(r=t.wrap('<div class="tc-shortcode-wrap tc-wrap-'+e+'"></div>'),r=t.parent()),0<r.length))&&(o=!0),0<r.length&&(o&&(i=!0,t.closest("form,.cart").first().append(Ht('<input name="add-to-cart" value="'+a+'" type="hidden">')),t.closest("form,.cart").first().append(Ht('<input type="hidden" value="" class="variation_id" name="variation_id">'))),1<(o=(r=r.is("form")?r.parent():r).find("input.tm-epo-counter")).length?o.each(function(){var t=Ht(this),e=t.closest(".cart").parent();(e=e.is("form")?e.parent():e).is(".initializing")||g(e,i,a,parseInt(t.val(),10))}):g(r,i,a,e))}),i.removeClass("initializing"))}catch(t){P.console.log(t),b=t}},1)}function St(t){var e,a,i,o,r,c;void 0===(t=void 0===(t=(f=t).attr("data-product_id"))?f.val():t)||!(c=(c=f.closest(".cart").find(".tm-epo-counter").val())||f.attr("data-epo-id"))||1!==f.closest(".tm-has-options").length&&void 0===f.attr("data-epo-id")||(o={},1===(e=1<(e=Ht(".tc-extra-product-options.tm-product-id-"+t+'[data-epo-id="'+c+'"]')).length?e.filter(".formepo")?e.filter(".formepo"):e.first():e).length&&(r=(c=Ht(".tc-totals-form.tm-product-id-"+t+'[data-epo-id="'+c+'"]')).find(".cpf-product-price").val(),a=c.find(".cpf-dynamic-product-price").val(),i=c.find(".cpf-override-product-price").val(),c=c.find(".tc_form_prefix").val(),o=Ht.extend(o,{tcajax:1,tcaddtocart:t,cpf_product_price:r,dynamic_product_price:a,override_product_price:i}),c)&&(o.tc_form_prefix=c),r=f.data(),Mt.ajaxbuttondata=Ht.epoAPI.util.deepCopyArray(r),(Mt.ajaxbutton=f).removeData(),f.data(Ht.extend(r,e.tcSerializeObject(),o)),Mt.ajaxdata={epos:e,_pid:t,data:r})}function t(){Ht(".tc-associated-table-product td.product-name").each(function(){var t=Ht(this);0===t.find(".product-name").length&&t.wrapInner(Ht('<div class="tc-associated-table-product-indent"></div>'))})}Mt&&e&&(Ht.fn.val=function(){var t=r.apply(this,arguments);return 0<arguments.length&&Ht(this).is(".input-text.qty")&&Ht(this).trigger("change.cpf"),t},"no"===Mt.tm_epo_no_lazy_load&&Ht.lazyLoadXT&&Ht.extend(Ht.lazyLoadXT,{autoInit:!1,updateEvent:Ht.lazyLoadXT.updateEvent+" tmlazy"}),Lt.localInputDecimalSeparator=""===Mt.tm_epo_global_input_decimal_separator?Mt.currency_format_decimal_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.localDecimalSeparator=""===Mt.tm_epo_global_displayed_decimal_separator?Mt.currency_format_decimal_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.localThousandSeparator=""===Mt.tm_epo_global_displayed_decimal_separator?Mt.currency_format_thousand_sep:Ht.epoAPI.locale.getSystemDecimalSeparator(),Lt.epoDelay=Mt.tm_epo_start_animation_delay||P.tc_epo_delay||500,Lt.epoAnimationDelay=Mt.tm_epo_animation_delay?Mt.tm_epo_start_animation_delay:P.tc_epo_animation_delay||500,Lt.getElementFromFieldCache=[],Lt.epoSelector=".tc-extra-product-options",Lt.associatedEpoSelector=".tc-extra-product-options-inline",Lt.associatedEpoCart=".tc-epo-element-product-container-cart",Lt.addToCartSelector="input[name='add-to-cart']",Lt.tcAddToCartSelector="input.tc-add-to-cart",Lt.qtySelector="input.qty,input[name='quantity'],select.qty,.drop-down-button #qty,.plus-minus-button #qty,.slider-input #amount",Lt.associateQtySelector="input.tm-qty-alt",Lt.addToCartButtonSelector=".add_to_cart_button, .single_add_to_cart_button",Lt.compositeSelector=".bto_item,.component",Lt.nativeProductPriceSelector=".woocommerce .product p.price",Lt.associatedNativeProductPriceSelector=".product-price .associated-price",Lt.templateEngine=Ht.epoAPI.applyFilter("tc_adjust_templateEngine",{price:e.template("tc-price"),sale_price:e.template("tc-sale-price"),tc_chars_remanining:e.template("tc-chars-remanining"),tc_final_totals:e.template("tc-final-totals"),tc_floating_box:e.template("tc-floating-box"),tc_floating_box_nks:e.template("tc-floating-box-nks"),tc_formatted_price:e.template("tc-formatted-price"),tc_formatted_sale_price:e.template("tc-formatted-sale-price"),tc_lightbox:e.template("tc-lightbox"),tc_lightbox_zoom:e.template("tc-lightbox-zoom"),tc_section_pop_link:e.template("tc-section-pop-link"),tc_upload_messages:e.template("tc-upload-messages")}),Ht.tcAPI=function(){return Lt},Ht.tcAPIGet=function(t){return Lt[t]},Ht.tcAPISet=function(t,e){Lt[t]=e},Ht.tc_validator&&(Ht.extend(Ht.tc_validator.messages,{required:Mt.tm_epo_global_validator_messages.required,email:Mt.tm_epo_global_validator_messages.email,url:Mt.tm_epo_global_validator_messages.url,number:Mt.tm_epo_global_validator_messages.number,digits:Mt.tm_epo_global_validator_messages.digits,maxlengthsingle:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.maxlengthsingle),maxlength:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.maxlength),minlengthsingle:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.minlengthsingle),minlength:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.minlength),max:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.max),min:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.min),step:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.step),lettersonly:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.lettersonly),lettersspaceonly:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.lettersspaceonly),alphanumeric:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumeric),alphanumericunicode:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumericunicode),alphanumericunicodespace:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.alphanumericunicodespace),repeaterminrows:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.repeaterminrows),repeatermaxrows:Ht.tc_validator.format(Mt.tm_epo_global_validator_messages.repeatermaxrows)}),Ht.tc_validator.addMethod("alphanumeric",function(t,e){return this.optional(e)||/^[a-zA-Z0-9.-]+$/i.test(t)},Ht.tc_validator.messages.alphanumeric),Ht.tc_validator.addMethod("lettersonly",function(t,e){return this.optional(e)||/^[a-z]+$/i.test(t)},Ht.tc_validator.messages.lettersonly),Ht.tc_validator.addMethod("lettersspaceonly",function(t,e){return this.optional(e)||/^[a-z,\u0020]+$/i.test(t)},Ht.tc_validator.messages.lettersspaceonly),Ht.tc_validator.addMethod("alphanumericunicode",function(t,e){return this.optional(e)||/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F]+$/i.test(t)},Ht.tc_validator.messages.alphanumericunicode),Ht.tc_validator.addMethod("alphanumericunicodespace",function(t,e){return this.optional(e)||/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F,\u0020]+$/i.test(t)},Ht.tc_validator.messages.alphanumericunicodespace),Ht.tc_validator.addMethod("repeaterminrows",function(t,e,a){return Ht.epoAPI.math.toInt(Ht(e).closest(".tc-element-inner-wrap").find(".tc-repeater-element").length)>=Ht.epoAPI.math.toInt(a)},Ht.tc_validator.messages.repeaterminrows),Ht.tc_validator.addMethod("repeatermaxrows",function(t,e,a){return Ht.epoAPI.math.toInt(Ht(e).closest(".tc-element-inner-wrap").find(".tc-repeater-element").length)<=Ht.epoAPI.math.toInt(a)},Ht.tc_validator.messages.repeatermaxrows),Ht.tc_validator.addMethod("product_element_radio_qty",function(t,e){return 0<Ht(e).closest(".tm-element-ul-product").find("input.tc-epo-field-product.tmcp-radio:checked").closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()},Ht.tc_validator.messages.required),Ht.tc_validator.addMethod("product_element_select_qty",function(t,e){return 0<Ht(e).closest(".tm-element-ul-product").find("select.tc-epo-field-product.tmcp-select").closest(".tc-epo-element-product-holder").find(".tm-qty").first().val()},Ht.tc_validator.messages.required)),Ht.epoAPI.util.escapeSelector=(a=/([!"$%&'()*+,/:;<=>?@[\]^`{|}~])/g,function(t){return t.replace(a,"\\$1")}),Ht.epoAPI.util.unformat=function(t){var t=Ht.epoAPI.math.unformat(t,Lt.localInputDecimalSeparator),e=parseFloat(t);return Number.isFinite(e)?e:t},Ht.epoAPI.util.parseParams=function(t,a){return"string"!=typeof t||void 0===t.split?[]:t.split("&").map(function(t){var e={};return 1<(t=(t=!0===a?decodeURIComponent(t.replace(/\+/g,"%20")):t).split("=").map(function(t){var e=t.split("?");return 1<e.length?e[1]:t})).length&&(e[t[0]]=t[1]),e}).filter(function(t){return null!==t}).reduce(function(t,e){return Object.assign({},t,e)},{})},Ht.tmempty||(Ht.tmempty=function(e){var t=1===[void 0,null,!1,0,"","0"].filter(function(t){return e===t}).length,a=!1;return"object"==typeof e?0===Object.keys(e).filter(function(t){return Object.prototype.hasOwnProperty.call(e,t)}).length:t||a}),Ht.tmType||(Ht.tmType=function(t){return Object.prototype.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}),Ht.is_on_screen||(Ht.fn.is_on_screen=function(){var t=Ht(P),e=Ht.epoAPI.dom.scroll(),a=this.offset(),e={top:e.top,left:e.left};return e.right=e.left+t.width(),e.bottom=e.top+t.height(),a.right=a.left+this.outerWidth(),a.bottom=a.top+this.outerHeight(),!(e.right<a.left||e.left>a.right||e.bottom<a.top||e.top>a.bottom)}),Ht().tmtoggle||(Ht.fn.tmtoggle=function(){var t=this,e=!1,c=0;if(0!==t.length)return void 0===P.tc_accordion_offset&&(P.tc_accordion_offset=-100),t.each(function(){var t,i,o,r=Ht(this);r.data("tm-toggle-init")||(r.data("tm-toggle-init",1),t=r.find(".tm-toggle"),i=r.find(".tm-collapse-wrap"),o=Ht(".tm-collapse.tmaccordion").find(".tm-toggle"),0!==t.length&&0!==i.length&&(i.is(".closed")?(Ht(i).removeClass("closed open").addClass("closed").hide(),Ht(t).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-down"),Ht(t).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-closed")):(Ht(i).removeClass("closed open").addClass("open").show(),Ht(t).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-up"),Ht(t).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-open"),e=!0),t.each(function(t,a){Ht(a).on("closewrap.tmtoggle",function(){r.is(".tmaccordion")&&Ht(i).is(".closed")||(Ht(i).removeClass("closed open").addClass("closed"),Ht(this).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-down"),Ht(this).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-closed"),Ht(i).removeClass("tm-animated fadein"),r.is(".tmaccordion"),Ht(i).animate({height:"toggle"},100,function(){Ht(i).hide()}),Rt.trigger("tmlazy"))}),Ht(a).on("openwrap.tmtoggle",function(t,e){r.is(".tmaccordion")&&Ht(o).not(Ht(this)).trigger("closewrap.tmtoggle"),Ht(i).removeClass("closed open").addClass("open"),Ht(this).find(".tm-arrow").removeClass("tcfa-angle-down tcfa-angle-up").addClass("tcfa-angle-up"),Ht(this).removeClass("toggle-header-open toggle-header-closed").addClass("toggle-header-open"),Ht(i).show().removeClass("tm-animated fadein").addClass("tm-animated fadein"),setTimeout(function(){Rt.trigger("tmlazy")},200),setTimeout(function(){void 0===e&&c&&r.is(".tmaccordion")&&!r.is_on_screen()&&Rt.tcScrollTo(Ht(a),10,P.tc_accordion_offset)},110)}),Ht(a).on("click.tmtoggle",function(t){t.preventDefault(),Ht(i).is(".closed")?Ht(this).trigger("openwrap.tmtoggle"):Ht(this).trigger("closewrap.tmtoggle")}),Ht(a).find(".tm-qty").closest(".cpf-element").find(".tm-epo-field").on("change.cpf",function(){Ht(a).trigger("openwrap.tmtoggle")})})))}),void 0===P.tc_accordion_closed_on_page_load&&!e&&0<t.filter(".tmaccordion").length&&t.filter(".tmaccordion").first().find(".tm-toggle").trigger("openwrap.tmtoggle",{nomove:1}),c=1,t}),Ht().tmpoplink||(Ht.fn.tmpoplink=function(t){var o,r={classname:"flasho tc-wrapper cart-popup"};if(0!==this.length)return t&&(r=Ht.extend({},r,t)),o=function(t){return Ht.epoAPI.template.html(e.template("tc-cart-options-popup"),{title:t.title,id:t.id,html:t.html,close:Mt.i18n_close})},this.each(function(){var t,e,a,i=Ht(this);i.is(".tc-poplink")||(i.addClass("tc-poplink"),e=Ht(this).attr("href"),t=Ht(this).attr("data-title"),e=Ht(e).html(),t=t||Mt.i18n_addition_options,a=o({id:"tc-floatbox-content",html:e,title:t}),i.on("click.tmpoplink",function(t){Ht.tcFloatBox({fps:1,ismodal:!1,refresh:100,width:"80%",height:"80%",classname:r.classname,data:a}),t.preventDefault()}))})}),(o=function(t,e,a){return this.this_epo_totals_container=t,this.is_quickview=e,this.main_cart=a,!(e||!Mt.floating_totals_box||"disable"===Mt.floating_totals_box||!a||!t.length)&&(this.init(),this)}).prototype={constructor:o,onUpdate:function(){var t,e=this.this_epo_totals_container.data("tm-html"),a=this.this_epo_totals_container.data("tm-floating-box-data"),i=[];a&&a.length&&Ht.each(a,function(t,e){""===e.title&&(e.title="&nbsp;"),""===e.value&&(e.value="&nbsp;"),e.title?(e.title=Ht("<div>"+e.title+"</div>"),e.title.find("span").remove(),e.title=e.title.html()):e.title="&nbsp;",this.is_nks&&(""!==e.label_show&&(e.title=""),""!==e.value_show)&&(e.value=""),"yes"===Mt.tm_epo_auto_hide_price_if_zero&&!0===Ht.tmempty(e.price)?e.price="":e.price=$t(e.price,this.this_epo_totals_container,!0,!1),i.push({label_show:e.label_show,value_show:e.value_show,title:e.title,value:e.value,quantity:e.quantity,price:e.price})}),(!e||""!==e||a&&a.length)&&(e&&""!==e||this.is_nks)||(e="",this.floatingBox.hide()),a=Ht.epoAPI.template.html(this.engineTemplate,{html_before:Mt.floating_totals_box_html_before,html_after:Mt.floating_totals_box_html_after,option_label:Mt.i18n_option_label,option_value:Mt.i18n_option_value,option_qty:Mt.i18n_option_qty,option_price:Mt.i18n_option_price,values:i,totals:e}),this.floatingBox.html(a),this.onUpdateScroll(),"yes"===Mt.floating_totals_box_add_button&&(t=this.main_cart.find(Lt.addToCartButtonSelector).first()).tcClone().addClass("tc-add-to-cart-button").on("click",function(){t.trigger("click")}).appendTo(this.floatingBox)},onUpdateScroll:function(){"always"===Mt.floating_totals_box_visibility?this.floatingBox.is(":empty")&&!this.is_nks_alt?this.floatingBox.hide():this.floatingBox.show():("hideafterscroll"===Mt.floating_totals_box_visibility&&(Rt.scrollTop()>Ht.epoAPI.math.toFloat(Mt.floating_totals_box_pixels)&&!this.is_nks_alt?this.floatingBox.is(":hidden")||(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide()):!this.floatingBox.is(":hidden")&&!this.is_nks_alt||this.floatingBox.is(":empty")&&!this.is_nks_alt||(!1===this.is_nks?this.floatingBox.fadeIn():this.floatingBox.show())),"afterscroll"===Mt.floating_totals_box_visibility&&(Rt.scrollTop()>Ht.epoAPI.math.toFloat(Mt.floating_totals_box_pixels)||this.is_nks_alt?this.floatingBox.is(":hidden")&&!this.floatingBox.is(":empty")||this.is_nks_alt?!1===this.is_nks?this.floatingBox.fadeIn():this.floatingBox.show():!this.floatingBox.is(":hidden")&&this.floatingBox.is(":empty")&&(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide()):this.floatingBox.is(":hidden")||(!1===this.is_nks?this.floatingBox.fadeOut():this.floatingBox.hide())))},addEvents:function(){this.onUpdate(),this.main_cart.on("tm-epo-after-update",this.onUpdate.bind(this)),this.main_cart.on("tm-epo-short-update",this.onUpdate.bind(this)),!1===this.is_nks&&Rt.on("scroll",this.onUpdateScroll.bind(this))},init:function(){this.floatingBox=Ht('<div class="tm-floating-box '+Mt.floating_totals_box+'"></div>'),this.nks_selector=Ht(".tm-floating-box-nks").first(),this.alt_selector=Ht(".tm-floating-box-alt").first(),this.engineTemplate=Lt.templateEngine.tc_floating_box,this.is_nks=!1,this.is_nks_alt=!1,0<this.nks_selector.length?(this.is_nks=!0,this.floatingBox.removeClass("top left right bottom").appendTo(this.nks_selector).show()):(0<this.alt_selector.length?this.floatingBox.removeClass("top left right bottom").appendTo(this.alt_selector):this.floatingBox.appendTo("body")).hide(),(0<this.nks_selector.length||0<this.alt_selector.length)&&(this.is_nks_alt=!0,this.engineTemplate=Lt.templateEngine.tc_floating_box_nks),this.addEvents()}},Ht.tcFloatingTotalsBox=function(t,e,a){var i=!1;return t&&t.length&&void 0===t.data("tcfloatingtotalsbox")&&(i=new o(t,e,a),t.data("tcfloatingtotalsbox",i)),i},Ht.tc_product_image={},Ht.tc_product_image_store={},Ht.tc_replace_object_values=function(a,i){return Object.keys(a).forEach(function(e){Object.keys(a[e]).forEach(function(t){void 0!==i[e]&&void 0!==i[e][t]&&Object.prototype.hasOwnProperty.call(i[e],t)&&(a[e][t]=i[e][t])})}),a},Ht.tc_maybe_copy_object_values=function(a,i){return Object.keys(i).forEach(function(e){Object.keys(i[e]).forEach(function(t){void 0===i[e]||!Object.prototype.hasOwnProperty.call(i[e],t)||void 0===i[e][t]||void 0!==a[e]&&void 0!==a[e][t]||(void 0===a[e]&&(a[e]={}),a[e][t]=i[e][t])})}),a},Ht.tc_pre_populate_store=function(){var t={0:{},1:{},2:{},3:{}};return t[0].src="",t[0].srcset="",t[0].sizes="",t[0].title="",t[0].alt="",t[0]["data-src"]="",t[0]["data-large_image"]="",t[0]["data-large_image_width"]="",t[0]["data-large_image_height"]="",t[1]["data-thumb"]="",t[2].src="",t[3].href="",t[3].title="",t},Ht.tc_populate_store=function(t,e){var a=e.find(".flex-control-nav li:eq(0) img"),e=e.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),i=t,t=t.closest("a"),o={0:{},1:{},2:{},3:{}};return o[0].src=i.attr("src"),o[0].srcset=i.attr("srcset"),o[0].sizes=i.attr("sizes"),o[0].title=i.attr("title"),o[0].alt=i.attr("alt"),o[0]["data-src"]=i.attr("data-src"),o[0]["data-large_image"]=i.attr("data-large_image"),o[0]["data-large_image_width"]=i.attr("data-large_image_width"),o[0]["data-large_image_height"]=i.attr("data-large_image_height"),o[1]["data-thumb"]=e.attr("data-thumb"),o[2].src=a.attr("src"),o[3].href=t.attr("href"),o[3].title=t.attr("title"),o},Ht.tc_maybe_copy_object_values_from_img=function(a,t,e){var i,o,r=e.find(".flex-control-nav li:eq(0) img"),e=e.find(".woocommerce-product-gallery__wrapper ").find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),c=t,t=t.closest("a"),n=[["src","srcset","sizes","title","alt","data-src","data-large_image","data-large_image_width","data-large_image_height","large-image"],["data-thumb"],["src"],["href","title"]];return[c,e,r,t].forEach(function(t,e){void 0!==t&&void 0!==t[0]&&(i=t[0].attributes,Ht.each(i,function(){this.specified&&(o=this.name,-1!==Ht.inArray(o,n[e]))&&(void 0===a[e]||void 0!==a[e]&&void 0===a[e][o])&&(void 0===a[e]&&(a[e]={}),a[e][o]=this.value)}))}),a},Ht.fn.tc_set_attr=function(t,e,a){(void 0===Ht.tc_product_image[a=void 0===a?0:a]||void 0!==Ht.tc_product_image[a]&&void 0===Ht.tc_product_image[a][t])&&(void 0===Ht.tc_product_image[a]&&(Ht.tc_product_image[a]={}),Ht.tc_product_image[a][t]="",this.attr(t))&&(Ht.tc_product_image[a][t]=this.attr(t)),!1===e?this.removeAttr(t):this.attr(t,e)},Ht.fn.tc_reset_attr=function(t,e){void 0!==Ht.tc_product_image[e=void 0===e?0:e]&&(void 0!==Ht.tc_product_image[e][t]&&this.attr(t,Ht.tc_product_image[e][t]),delete Ht.tc_product_image[e][t])},Ht.fn.tc_update_attr=function(t,e){void 0!==Ht.tc_product_image[e=void 0===e?0:e]&&(Ht.tc_product_image[e][t]=this.attr(t))},Ht.fn.tc_image_update=function(t,e){var a,t=Ht(t),e=Ht(e),i=this.data("epo_object"),o=i.main_product.closest("#product-"+i.product_id),r=o;o.length<=0&&(r=i.main_product.closest(".post-"+i.product_id)),o=(t=t.is("select")?t.children("option:selected"):t).data("image-variations"),a=(i=""!==Mt.tm_epo_global_product_image_selector?Ht(Mt.tm_epo_global_product_image_selector):r.find("a.woocommerce-main-image img, img.woocommerce-main-image,a img").not(".thumbnails img,.product_list_widget img,img.emoji,a.woocommerce-product-gallery__trigger img").first()).closest("a"),1<i.length&&(i=i.first()),t&&o&&0<e.length?(e.removeAttr("data-o_src").removeAttr("data-o_title").removeAttr("data-o_alt").removeAttr("data-o_srcset").removeAttr("data-o_sizes").removeAttr("srcset").removeAttr("sizes"),t=o.imagep,o.imagep.image_link||(t=o.image),e.attr("title",t.image_title),e.attr("alt",t.image_alt),t.image_srcset&&e.attr("srcset",t.image_srcset),t.image_sizes&&e.attr("sizes",t.image_sizes),i.tc_set_attr("title",t.image_title),i.tc_set_attr("alt",t.image_alt),i.tc_set_attr("data-large-image",t.image_link),i.data.wc27_zoom_target&&(i.data.wc27_zoom_target.tc_set_attr("data-thumb",t.image_link),r.find(".flex-control-nav li:eq(0) img").tc_set_attr("src",t.image_link)),a.tc_set_attr("href",t.image_link),a.tc_set_attr("title",t.image_caption)):(i.tc_reset_attr("title"),i.tc_reset_attr("alt"),i.tc_reset_attr("data-large-image"),i.data.wc27_zoom_target&&(i.data.wc27_zoom_target.tc_reset_attr("data-thumb"),r.find(".flex-control-nav li:eq(0) img").tc_reset_attr("src")),a.tc_reset_attr("href"),a.tc_reset_attr("title"))},Ht.fn.tm_find_matching_variations=function(t,e){var a,i,o=[];if(t)for(a=0;a<t.length;a+=1)i=t[a],Ht.fn.tm_variations_match(i.attributes,e)&&o.push(i);return o},Ht.fn.tm_variations_match=function(e,a){var i,o,r=!0;return Object.keys(e).forEach(function(t){Object.prototype.hasOwnProperty.call(e,t)&&(i=e[t],o=a[t],void 0!==i)&&void 0!==o&&0!==i.length&&0!==o.length&&i!==o&&(r=!1)}),r},Ht().tclightbox||(Ht.fn.tclightbox=function(){if(0!==this.length)return this.each(function(){var a,t,e,i,o=Ht(this);!o.is(".tcinit")&&(a=o.attr("src")||o.attr("data-original"),t=(t=o.closest("label")).closest(".tmcp-field-wrap").find(".tm-epo-field[id='"+t.attr("for")+"']"),a=t.attr("data-imagel")||t.attr("data-imagep")||t.attr("data-image")||a)&&(o.addClass("tcinit").before(Ht.epoAPI.template.html(Lt.templateEngine.tc_lightbox,{})),t=o.prev(),o.wrap("<div class='tc-lightbox-image-wrap'/>"),o.after(t),e=t.find(".tc-lightbox-button"),i=function(){e.addClass("tcinit").on("click.tclightbox",function(t){var e;0<Ht(".tc-closing.tc-lightbox").length||(e=Ht.epoAPI.dom.size(),e=Ht("<img>").addClass("tc-lightbox-img").attr("src",a).css("maxHeight",e.visibleHeight+"px").css("maxWidth",e.visibleWidth+"px"),Ht.tcFloatBox({fps:1,ismodal:!1,refresh:"fixed",width:"auto",height:"auto",top:"0%",left:"0%",classname:"flasho tc-lightbox",animateIn:"tc-lightbox-zoomin",animateOut:"tc-lightbox-zoomout",data:Ht.epoAPI.template.html(Lt.templateEngine.tc_lightbox_zoom,{img:e[0].outerHTML}),zIndex:102001,cancelClass:".tc-lightbox-img, .tc-lightbox-button-close",unique:!0}),t.preventDefault())})},"yes"===Mt.tm_epo_preload_lightbox_image?((o=new Image).src=a,o.onload=function(){i()}):i())})}),Ht().tmsectionpoplink||(Ht.fn.tmsectionpoplink=function(){if(0!==this.length)return this.each(function(){var t,e,a,i,o,r,c=Ht(this);c.data("tmsectionpoplink")||(c.data("tmsectionpoplink",!0),t=c.attr("data-sectionid"),e=Mt.i18n_addition_options,a=c.closest(".cpf-section[data-uniqid='"+t+"']"),i=!1,o=Ht('<div class="fl-overlay"></div>').css({zIndex:parseInt(c.zIndex,10)-1,opacity:.8}),r=function(){var t=Ht("#tm-section-pop-up");t.parents().removeClass("noanimated"),o.unbind().remove(),t.after(a),t.remove(),a.find(".tm-section-link").show(),a.find(".tm-section-pop").hide()},c.attr("data-title")&&(e=c.attr("data-title")),c.on("click.tmsectionpoplink",function(t){t.preventDefault(),i=!1,o.appendTo("body").on("click",r),a.before(Ht.epoAPI.template.html(Lt.templateEngine.tc_section_pop_link,{title:e,close:Mt.i18n_close})),(t=Ht("#tm-section-pop-up")).find(".float-editbox").prepend(a),a.find(".tm-section-link").hide(),a.find(".tm-section-pop").show(),t.parents().addClass("noanimated"),t.find(".floatbox-cancel").on("click",function(){i||(i=!0,r())}),Rt.trigger("tmlazy"),Rt.trigger("tmsectionpoplink")}))})}),Ht().cpfdependson||(Ht.fn.cpfdependson=function(a,i,n){var o=[];if(0!==this.length&&"object"==typeof a)return i=i||"show",Ht.each(a,function(a,t){var i,c;o[a]=0,Array.isArray(t)&&Ht.each(t,function(t,e){if("object"!=typeof e)return!0;(i=function(t){var e,a,i=Ht(t);if(0!==i.length){if(i.is(".cpf-section"))return t.find(".tm-epo-field");if(e=i.attr("data-uniqid"),a=(t=i.closest(".tc-extra-product-options")).attr("data-epo-id"),!t.is(".reactivate")&&Lt.getElementFromFieldCache&&Lt.getElementFromFieldCache[a]&&Lt.getElementFromFieldCache[a][e])return Lt.getElementFromFieldCache[a][e];if(0<(t=i.attr("class").split(" ").map(function(t){return-1!==t.indexOf("cpf-type-",0)?t:null}).filter(function(t){return null!=t?t:null})).length)switch(t="cpf-type-product"===(t=t[0])?i.is(".cpf-type-product-mode-product")||i.is(".cpf-type-product-checkbox")||i.is(".cpf-type-product-thumbnailmultiple")?"cpf-type-checkbox":i.is(".cpf-type-product-dropdown")?"cpf-type-select":"cpf-type-radio":t){case"cpf-type-radio":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-radio"),Lt.getElementFromFieldCache[a][e];case"cpf-type-checkbox":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-checkbox"),Lt.getElementFromFieldCache[a][e];case"cpf-type-select":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-select"),Lt.getElementFromFieldCache[a][e];case"cpf-type-selectmultiple":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-selectmultiple"),Lt.getElementFromFieldCache[a][e];case"cpf-type-textarea":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-textarea"),Lt.getElementFromFieldCache[a][e];case"cpf-type-textfield":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-textfield"),Lt.getElementFromFieldCache[a][e];case"cpf-type-color":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tm-color-picker"),Lt.getElementFromFieldCache[a][e];case"cpf-type-range":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-range"),Lt.getElementFromFieldCache[a][e];case"cpf-type-date":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-date"),Lt.getElementFromFieldCache[a][e];case"cpf-type-time":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.find(".tm-epo-field.tmcp-time"),Lt.getElementFromFieldCache[a][e];case"cpf-type-variations":return Lt.getElementFromFieldCache[a]=[],Lt.getElementFromFieldCache[a][e]=i.closest(".cpf-section").find(".tm-epo-field.tm-epo-variation-element"),Lt.getElementFromFieldCache[a][e]}}}(e.element))&&0<i.length&&i.each(function(t,e){var a,i,o=Ht(e),r="change.cpflogic";c&&!c.closest(".tc-extra-product-options-inline").length||(a=".tm-product-id-"+o.closest(".tc-extra-product-options").attr("data-product-id"),i="[data-epo-id='"+o.closest(".tc-extra-product-options").attr("data-epo-id")+"']",c=Ht(".tc-extra-product-options"+a+i)),e&&0<o.length&&(!o.data("tmhaslogicevents")||n)&&(o.is(".tm-epo-variation-element")?(d("found_variation.tmlogic",!1,function(){T(c),Rt.trigger("tm-do-epo-update")}),d("hide_variation.tmlogic",!1,function(){T(c),Rt.trigger("tm-do-epo-update")})):((o.is(":text")||o.is("textarea"))&&(r="change.cpflogic input.cpflogic"),o.is(':input[type="number"]')&&(r="change.cpflogic input.cpflogic keypress.cpflogic"),o.off(r).on(r,function(){T(c)})),o.data("tmhaslogicevents",1))}),o[a]=parseInt(o[a],10)+1})}),this.each(function(){var t=Ht(this),e=!1;switch(t.data("matches",o).data("toggle",i).data("fields",a),i){case"show":e=!1;break;case"hide":e=!0}e?t.removeClass("tc-hidden"):t.addClass("tc-hidden"),t.data("isactive",e)}),this.addClass("iscpfdependson is-epo-depend").data("iscpfdependson",1),this},Ht.fn.run_cpfdependson=function(){T()}),Ht.tcepo={formSubmitEvents:{},oneOptionIsSelected:{},initialActivation:{},lateFieldsPrices:{},errorObject:{},showHideTotal:{}},Ht.tcepo.tm_init_epo=function(t,e,a,i){g(t,e,a,i)},Ht.tcepo.tmLazyloadContainer=function(t){h=t},Rt.on("tc_manual_init",function(t,e){var a,i,o,r;"container"in e&&"reactivate"in e&&(a=e.reactivate,e=e.container),a=a,i=(e=Ht(e=e)).attr("data-product-id"),o=e.attr("data-epo-id"),g(r=(r=(r=e.parent()).is("form")||(r=e.closest("form")).is("form")?r:e.parent()).parent(),!1,i,o,void 0,void 0,a)}),Ht(x).on("click.tcajax","body.mfn-ajax-add-to-cart .single_add_to_cart_button:not(.disabled)",function(){var t,e=Ht(this);St(e),Mt.ajaxdata.cart=e.closest(".cart"),Mt.ajaxdata.cart.find(".tm-formepo").remove(),(t=Ht("<div class='tm-hidden tm-formepo'></div>")).append(Mt.ajaxdata.epos.tcClone().addClass("formepo")),e.after(t)}),I.on("click.tcajax",".ajax_add_to_cart",function(){St(Ht(this)),void 0!==Mt.ajaxdata&&delete Mt.ajaxdata}),Ht(x.body).on("added_to_cart",function(){Mt.ajaxbuttondata&&Mt.ajaxbutton instanceof Ht&&(Mt.ajaxbutton.removeData(),Mt.ajaxbutton.data(Mt.ajaxbuttondata))}),Ht(function(){Lt=Ht.epoAPI.applyFilter("tc_api",Lt),Rt.on("lazyLoadXToncomplete",function(){Ht(".tm-owl-slider").each(function(){Ht(this).trigger("refresh.owl.carousel")})}),Rt.on("tc_init_epo_plugin",function(t){qt()}),Rt.on("tcShowLastError",function(){P.console.log(b)}),Ht.ajaxPrefilter(function(e,a){var t,i,o,r,c,n,l,d,s,p=!1,m=!1,_={};if("yes"===Mt.tm_epo_enable_in_shop&&(s=e.url.split("?"))&&1<=s.length&&(s=s[1])){for(t=s.split("&"),i=0;i<t.length;i+=1)1<=(o=t[i].split("=")).length&&o[0]&&o[1]&&"wc-ajax"===o[0]&&"add_to_cart"===o[1]&&(p=!0);p&&(e.originalsuccess=e.success,e.success=function(t){t&&t.error&&t.product_url?(f&&1===f.length&&(r=f),(r=Ht(".ajax_add_to_cart[data-product_id='"+a.data.product_id+"']")).removeClass("added"),r.removeClass("loading")):e.originalsuccess.call(null,t)})}FormData&&a.data&&(s=a.data,"object"==typeof(s="string"==typeof a.data?Ht.epoAPI.util.parseParams(a.data):s)[0]&&(s.forEach(function(t){_[t.name]=t.value}),s=_),c=[],a.url&&a.url.indexOf&&(c=Ht.epoAPI.util.parseParams(a.url.slice(a.url.indexOf("?")+1))),"quantity"in s&&s.tcaddtocart&&(s.product_id||s["add-to-cart"]||c.product_id||c["add-to-cart"])?(m=!0,n=s.tcaddtocart):Array.isArray(s)&&(m=s.some(function(t){return"quantity"===t.name})&&s.some(function(t){return"add-to-cart"===t.name})&&s.some(function(t){return"tcaddtocart"===t.name}),n=!!(n=s.find(function(t){return"tcaddtocart"===t.name}))&&n.value),m)&&1===(c=1<(c=f&&1===f.length&&1===f.closest(".tm-has-options").length?f.closest(".tm-has-options").find(".tc-extra-product-options.tm-product-id-"+n):Ht(".tc-extra-product-options.tm-product-id-"+n)).length?c.filter(".formepo")?c.filter(".formepo"):c.first():c).length&&(m={tcajax:1,tcaddtocart:n,cpf_product_price:(s=Ht(".tc-totals-form.tm-product-id-"+n)).find(".cpf-product-price").val(),dynamic_product_price:s.find(".cpf-dynamic-product-price").val(),override_product_price:s.find(".cpf-override-product-price").val()},(n=s.find(".tc_form_prefix").val())&&(m.tc_form_prefix=n),l=Ht.epoAPI.util.parseParams(e.data,!0),l=Ht.extend(l,c.tcSerializeObject(),m),d=new FormData,Object.keys(l).forEach(function(t){t&&d.append(t,l[t])}),c.find(":file").toArray().forEach(function(t){for(i=0;i<Ht(t)[0].files.length;i++)t.multiple||d.delete(Ht(t).attr("name")),d.append(Ht(t).attr("name"),Ht(t)[0].files[i])}),e.data=d,e.contentType=!1,e.cache=!1,e.processData=!1)}),C.ajaxSuccess(function(t,e,o){var a,r,c,n,l,d,s,p,m,_=Mt.quickview_array||"null",i=Mt.quickview_container||"null",f={},u=1;if(void 0!==Mt.ajaxdata&&(Mt.ajaxdata.cart.find(".tm-formepo").remove(),delete Mt.ajaxdata),"wc_epo_get_associated_product_html"!==(s=Ht.epoAPI.util.parseParams(o.data)).action){for(a in Ht(".tm-formepo-normal").remove(),Ht(".tm-formepo").remove(),Ht(".tm-cart-link").tmpoplink(),_=Ht.epoAPI.util.parseJSON(_),i=Ht.epoAPI.util.parseJSON(i))Object.prototype.hasOwnProperty.call(i,a)&&(f[i[a][0]]=Ht(i[a][1]));Ht.extend(_,f),p=function(){var e=!1;return Object.keys(_).forEach(function(t){Ht(_[t]).length&&(e=t)}),e},(m=function(t){var e,a=requestAnimationFrame(function(){setTimeout(function(){m(t-1)},200)}),i=p();if((i||0===t)&&(cancelAnimationFrame(a),i)){if(l=!1,r=Ht(_[i]),"woothemes_quick_view"===i&&r.is(".fusion-woocommerce-quick-view-container"))return!0;if("fusion_quick_view_load"===i&&0===r.find(Lt.epoSelector).length)return!0;if("woodmart_quick_shop"===i&&"woodmart_quick_shop"===(s=Ht.epoAPI.util.parseParams(o.url)).action&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+".post-"+s.id))).length&&(r=d,l=!0),"woodmart_quick_view"===i&&"woodmart_quick_view"===(s=Ht.epoAPI.util.parseParams(o.url)).action&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+".post-"+s.id))).length&&(r=d,l=!0),"quickview_pro"===i&&(s=o.url.split("/")).length&&(d=Ht(Ht.epoAPI.util.escapeSelector(_[i]+" .post-"+s[s.length-1]))).length&&(r=d,l=!0),"exwoofood_booking_info"!==i&&"wqv_popup_content"!==i&&"wp_food"!==i&&"jet_popup_get_content"!==i||(l=!0),"woofood"===i&&o.data&&"woofood_quickview_ajax"===(s=Ht.epoAPI.util.parseParams(o.data)).action&&(d=r.find("form").parent()).length&&(r=d,l=!0),0===r.find(".product").length&&r.is(".product")&&(l=!0),0<r.find(".product").length||l){if(r.removeClass("tc-init"),"fusion_quick_view_load"!==i&&"jet_popup_get_content"!==i&&"wp_food"!==i&&"woodmart_quick_shop"!==i&&"woodmart_quick_view"!==i&&"lightboxpro"!==i&&"jckqv_quick_view"!==i&&"yith_quick_view"!==i&&"theme_flatsome"!==i||(v=!0),1<(h=r).length){for(;1<h.length&&0!==(h=h.filter(function(){return 0<Ht(this).find(Lt.epoSelector).length})).length;);if(0===h.length)return setTimeout(function(){m(10)},1e3),!0}if(0===(e=h.find(Lt.epoSelector)).length)return delete _[i],m(10),!0;"fusion_quick_view_load"===i&&(u=1400),setTimeout(function(){c=e.attr("data-product-id"),n=e.attr("data-epo-id"),"woodmart_quick_shop"===i&&r.addClass("has-options"),Lt.getElementFromFieldCache=[],g(h,!0,c,n),Rt.trigger("tmlazy"),Rt.trigger("tm_epo_loaded_quickview"),Ht.jMaskGlobals&&h.find(Ht.jMaskGlobals.maskElements).each(function(){var t=Ht(this);t.attr("data-mask")&&t.mask(t.attr("data-mask"))})},u)}}})(10)}}),qt(),Ht(".tm-cart-link").tmpoplink(),I.on("updated_checkout wc_fragments_loaded wc_fragments_refreshed wc_fragment_refresh",function(){Ht(".tm-cart-link").tmpoplink()}),Rt.trigger("tmlazy"),Rt.trigger("tm_epo_loaded")}),I.on("updated_checkout updated_cart_totals",function(){t()}),t(),Ht(function(){var t=navigator.userAgent||navigator.vendor||P.opera;(t=-1<t.indexOf("FBAN")||-1<t.indexOf("FBAV")||-1<t.indexOf("Instagram"))&&Ht(".tmcp-upload").removeAttr("accept"),C.on("click",".quantity .jckqv-qty-spinner, .quantity .ui-spinner-button",function(){Ht(this).closest(".quantity").find(Lt.qtySelector).trigger("change")}),Ht("#wholesale_form").on("submit",function(){var t=Ht("form.cart").find(Lt.addToCartSelector).val(),e=Ht(Lt.epoSelector+".tm-cart-main[data-product-id='"+t+"']").tcClone(),t=Ht(".tm-totals-form-main[data-product-id='"+t+"']").tcClone(),a=Ht("<div class='tm-hidden tm-formepo'></div>");return a.append(e),a.append(t),Ht(this).append(a),!0}),C.on("click","#add_to_quote",function(t){var e,a;Mt&&"yes"===Mt.tm_epo_global_enable_validation&&(e=Ht(this).parents("form"),a=parseInt(e.find(".tm-epo-counter").val(),10),a=Ht(Lt.epoSelector+"[data-epo-id='"+a+"']"),"yes"===Mt.tm_epo_global_enable_validation)&&Ht.tc_validator&&0<e.length&&0<a.length&&!e.tc_validate().form()&&t.stopImmediatePropagation()}),Ht(".single_add_to_cart_button.paypal_checkout_button").on("click",function(t){var e=Ht(".cart");e.data("tc_validator")&&e.data("tc_validator").errorList&&t.stopImmediatePropagation()}),Ht(".wc-product-table").on("init.wcpt",function(t,e){e.$table.find(Lt.epoSelector).addClass("hidden"),e.$table.find("thead tr").append("<th>&nbsp;</th>"),setTimeout(function(){e.$table.find(".cart:not(.cart_group)").each(function(){var t=Ht(this).find(Lt.epoSelector),e=t.closest("tr");Ht("<td class='wc-product-table-epo'></td>").appendTo(e).append(t),Ht(P).trigger("tc_manual_init",t),t.removeClass("hidden")})},500)})}))}(window,document,window.jQuery);assets/js/index.php000064400000000126150755142450010311 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
assets/js/owl.carousel.min.js000064400000126233150755142450012236 0ustar00!function(h,s,n){"use strict";function r(t,e){this.settings=null,this.options=h.extend({},r.Defaults,e),this.$element=h(t),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},h.each(["onResize","onThrottledResize"],h.proxy(function(t,e){this._handlers[e]=h.proxy(this[e],this)},this)),h.each(r.Plugins,h.proxy(function(t,e){this._plugins[t.charAt(0).toLowerCase()+t.slice(1)]=new e(this)},this)),h.each(r.Workers,h.proxy(function(t,e){this._pipe.push({filter:e.filter,run:h.proxy(e.run,this)})},this)),this.setup(),this.initialize()}r.Defaults={items:3,loop:!1,center:!1,rewind:!1,checkVisibility:!0,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:s,fallbackEasing:"linear",slideTransition:"",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},r.Width={Default:"default",Inner:"inner",Outer:"outer"},r.Type={Event:"event",State:"state"},r.Plugins={},r.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(t){t.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(t){var e=this.settings.margin||"",i=!this.settings.autoWidth,s=this.settings.rtl,s={width:"auto","margin-left":s?e:"","margin-right":s?"":e};i||this.$stage.children().css(s),t.css=s}},{filter:["width","items","settings"],run:function(t){var e,i=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,s=this._items.length,n=!this.settings.autoWidth,o=[];for(t.items={merge:!1,width:i};0<s;)e=this._mergers[s-=1],e=this.settings.mergeFit&&Math.min(e,this.settings.items)||e,t.items.merge=1<e||t.items.merge,o[s]=n?i*e:this._items[s].width();this._widths=o}},{filter:["items","settings"],run:function(){var t=[],e=this._items,i=this.settings,s=Math.max(2*i.items,4),n=2*Math.ceil(e.length/2),o=i.loop&&e.length?i.rewind?s:Math.max(s,n):0,r="",a="";for(o/=2;0<o;)t.push(this.normalize(t.length/2,!0)),r+=e[t[t.length-1]][0].outerHTML,t.push(this.normalize(e.length-1-(t.length-1)/2,!0)),a=e[t[t.length-1]][0].outerHTML+a,--o;this._clones=t,h(r).addClass("cloned").appendTo(this.$stage),h(a).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var t,e,i=this.settings.rtl?1:-1,s=this._clones.length+this._items.length,n=0,o=[];n<s;)t=o[n-1]||0,e=this._widths[this.relative(n)]+this.settings.margin,o.push(t+e*i),n+=1;this._coordinates=o}},{filter:["width","items","settings"],run:function(){var t=this.settings.stagePadding,e=this._coordinates,e={width:Math.ceil(Math.abs(e[e.length-1]))+2*t,"padding-left":t||"","padding-right":t||""};this.$stage.css(e)}},{filter:["width","items","settings"],run:function(t){var e=this._coordinates.length,i=!this.settings.autoWidth,s=this.$stage.children();if(i&&t.items.merge)for(;0<e;)t.css.width=this._widths[this.relative(e-=1)],s.eq(e).css(t.css);else i&&(t.css.width=t.items.width,s.css(t.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(t){t.current=t.current?this.$stage.children().index(t.current):0,t.current=Math.max(this.minimum(),Math.min(this.maximum(),t.current)),this.reset(t.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){for(var t,e,i=this.settings.rtl?1:-1,s=2*this.settings.stagePadding,n=this.coordinates(this.current())+s,o=n+this.width()*i,r=[],a=0,h=this._coordinates.length;a<h;a+=1)t=this._coordinates[a-1]||0,e=Math.abs(this._coordinates[a])+s*i,(this.op(t,"<=",n)&&this.op(t,">",o)||this.op(e,"<",n)&&this.op(e,">",o))&&r.push(a);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+r.join("), :eq(")+")").addClass("active"),this.$stage.children(".center").removeClass("center"),this.settings.center&&this.$stage.children().eq(this.current()).addClass("center")}}],r.prototype.initializeStage=function(){this.$stage=this.$element.find("."+this.settings.stageClass),this.$stage.length||(this.$element.addClass(this.options.loadingClass),this.$stage=h("<"+this.settings.stageElement+">",{class:this.settings.stageClass}).wrap(h("<div/>",{class:this.settings.stageOuterClass})),this.$element.append(this.$stage.parent()))},r.prototype.initializeItems=function(){var t=this.$element.find(".owl-item");t.length?(this._items=t.get().map(function(t){return h(t)}),this._mergers=this._items.map(function(){return 1}),this.refresh()):(this.replace(this.$element.children().not(this.$stage.parent())),this.isVisible()?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass))},r.prototype.initialize=function(){var t,e;this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")&&(t=this.$element.find("img"),e=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:void 0,e=this.$element.children(e).width(),t.length)&&e<=0&&this.preloadAutoWidthImages(t),this.initializeStage(),this.initializeItems(),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},r.prototype.isVisible=function(){return!this.settings.checkVisibility||this.$element.is(":visible")},r.prototype.setup=function(){var e=this.viewport(),t=this.options.responsive,i=-1,s=null;t?(h.each(t,function(t){t<=e&&i<t&&(i=Number(t))}),"function"==typeof(s=h.extend({},this.options,t[i])).stagePadding&&(s.stagePadding=s.stagePadding()),delete s.responsive,s.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+i))):s=h.extend({},this.options),this.trigger("change",{property:{name:"settings",value:s}}),this._breakpoint=i,this.settings=s,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},r.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},r.prototype.prepare=function(t){var e=this.trigger("prepare",{content:t});return e.data||(e.data=h("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(t)),this.trigger("prepared",{content:e.data}),e.data},r.prototype.update=function(){for(var t=0,e=this._pipe.length,i=h.proxy(function(t){return this[t]},this._invalidated),s={};t<e;)(this._invalidated.all||0<h.grep(this._pipe[t].filter,i).length)&&this._pipe[t].run(s),t+=1;this._invalidated={},this.is("valid")||this.enter("valid")},r.prototype.width=function(t){switch(t=t||r.Width.Default){case r.Width.Inner:case r.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},r.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},r.prototype.onThrottledResize=function(){s.clearTimeout(this.resizeTimer),this.resizeTimer=s.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},r.prototype.onResize=function(){return!!this._items.length&&this._width!==this.$element.width()&&!!this.isVisible()&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))},r.prototype.registerEventHandlers=function(){h.support.transition&&this.$stage.on(h.support.transition.end+".owl.core",h.proxy(this.onTransitionEnd,this)),!1!==this.settings.responsive&&this.on(s,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",h.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",h.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",h.proxy(this.onDragEnd,this)))},r.prototype.onDragStart=function(t){var e=null;3!==t.which&&(e=h.support.transform?{x:(e=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","))[16===e.length?12:4],y:e[16===e.length?13:5]}:(e=this.$stage.position(),{x:this.settings.rtl?e.left+this.$stage.width()-this.width()+this.settings.margin:e.left,y:e.top}),this.is("animating")&&(h.support.transform?this.animate(e.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===t.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=h(t.target),this._drag.stage.start=e,this._drag.stage.current=e,this._drag.pointer=this.pointer(t),h(n).on("mouseup.owl.core touchend.owl.core",h.proxy(this.onDragEnd,this)),h(n).one("mousemove.owl.core touchmove.owl.core",h.proxy(function(t){var e=this.difference(this._drag.pointer,this.pointer(t));h(n).on("mousemove.owl.core touchmove.owl.core",h.proxy(this.onDragMove,this)),Math.abs(e.x)<Math.abs(e.y)&&this.is("valid")||(t.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},r.prototype.onDragMove=function(t){var e=null,i=null,s=this.difference(this._drag.pointer,this.pointer(t)),n=this.difference(this._drag.stage.start,s);this.is("dragging")&&(t.preventDefault(),this.settings.loop?(e=this.coordinates(this.minimum()),i=this.coordinates(this.maximum()+1)-e,n.x=((n.x-e)%i+i)%i+e):(e=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),i=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),t=this.settings.pullDrag?-1*s.x/5:0,n.x=Math.max(Math.min(n.x,e+t),i+t)),this._drag.stage.current=n,this.animate(n.x))},r.prototype.onDragEnd=function(t){var t=this.difference(this._drag.pointer,this.pointer(t)),e=this._drag.stage.current,i=0<t.x,i=i&&!this.settings.rtl||this.settings.rtl&&!i?"left":"right";h(n).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==t.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==t.x?i:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=i,3<Math.abs(t.x)||300<(new Date).getTime()-this._drag.time)&&this._drag.target.one("click.owl.core",function(){return!1}),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},r.prototype.closest=function(i,s){var n=-1,o=this.width(),r=this.coordinates();return this.settings.freeDrag||h.each(r,h.proxy(function(t,e){return"left"===s&&e-30<i&&i<e+30?n=t:"right"===s&&e-o-30<i&&i<e-o+30?n=t+1:this.op(i,"<",e)&&this.op(i,">",void 0!==r[t+1]?r[t+1]:e-o)&&(n="left"===s?t+1:t),-1===n},this)),this.settings.loop||(this.op(i,">",r[this.minimum()])?(i=this.minimum(),n=i):this.op(i,"<",r[this.maximum()])&&(i=this.maximum(),n=i)),n},r.prototype.animate=function(t){var e=0<this.speed();this.is("animating")&&this.onTransitionEnd(),e&&(this.enter("animating"),this.trigger("translate")),h.support.transform3d&&h.support.transition?this.$stage.css({transform:"translate3d("+t+"px,0px,0px)",transition:this.speed()/1e3+"s"+(this.settings.slideTransition?" "+this.settings.slideTransition:"")}):e?this.$stage.animate({left:t+"px"},this.speed(),this.settings.fallbackEasing,h.proxy(this.onTransitionEnd,this)):this.$stage.css({left:t+"px"})},r.prototype.is=function(t){return this._states.current[t]&&0<this._states.current[t]},r.prototype.current=function(t){var e;return void 0===t?this._current:0!==this._items.length?(t=this.normalize(t),this._current!==t&&(void 0!==(e=this.trigger("change",{property:{name:"position",value:t}})).data&&(t=this.normalize(e.data)),this._current=t,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})),this._current):void 0},r.prototype.invalidate=function(t){return"string"==typeof t&&(this._invalidated[t]=!0,this.is("valid"))&&this.leave("valid"),h.map(this._invalidated,function(t,e){return e})},r.prototype.reset=function(t){void 0!==(t=this.normalize(t))&&(this._speed=0,this._current=t,this.suppress(["translate","translated"]),this.animate(this.coordinates(t)),this.release(["translate","translated"]))},r.prototype.normalize=function(t,e){var i=this._items.length,e=e?0:this._clones.length;return!this.isNumeric(t)||i<1?t=void 0:(t<0||i+e<=t)&&(t=((t-e/2)%i+i)%i+e/2),t},r.prototype.relative=function(t){return t-=this._clones.length/2,this.normalize(t,!0)},r.prototype.maximum=function(t){var e,i,s,n=this.settings,o=this._coordinates.length;if(n.loop)o=this._clones.length/2+this._items.length-1;else if(n.autoWidth||n.merge){if(e=this._items.length)for(i=this._items[e-=1].width(),s=this.$element.width();0<e&&!(s<(i+=this._items[e].width()+this.settings.margin));)e-=1;o=e+1}else o=n.center?this._items.length-1:this._items.length-n.items;return t&&(o-=this._clones.length/2),Math.max(o,0)},r.prototype.minimum=function(t){return t?0:this._clones.length/2},r.prototype.items=function(t){return void 0===t?this._items.slice():(t=this.normalize(t,!0),this._items[t])},r.prototype.mergers=function(t){return void 0===t?this._mergers.slice():(t=this.normalize(t,!0),this._mergers[t])},r.prototype.clones=function(i){function s(t){return t%2==0?n+t/2:e-(t+1)/2}var e=this._clones.length/2,n=e+this._items.length;return void 0===i?h.map(this._clones,function(t,e){return s(e)}):h.map(this._clones,function(t,e){return t===i?s(e):null})},r.prototype.speed=function(t){return void 0!==t&&(this._speed=t),this._speed},r.prototype.coordinates=function(t){var e,i=1,s=t-1;return void 0===t?h.map(this._coordinates,h.proxy(function(t,e){return this.coordinates(e)},this)):(this.settings.center?(this.settings.rtl&&(i=-1,s=t+1),e=this._coordinates[t],e+=(this.width()-e+(this._coordinates[s]||0))/2*i):e=this._coordinates[s]||0,Math.ceil(e))},r.prototype.duration=function(t,e,i){return 0===i?0:Math.min(Math.max(Math.abs(e-t),1),6)*Math.abs(i||this.settings.smartSpeed)},r.prototype.to=function(t,e){var i=this.current(),s=t-this.relative(i),n=(0<s)-(s<0),o=this._items.length,r=this.minimum(),a=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(s)>o/2&&(s+=-1*n*o),(n=(((t=i+s)-r)%o+o)%o+r)!==t&&n-s<=a&&0<n-s&&this.reset(i=(t=n)-s)):t=this.settings.rewind?(t%(a+=1)+a)%a:Math.max(r,Math.min(a,t)),this.speed(this.duration(i,t,e)),this.current(t),this.isVisible()&&this.update()},r.prototype.next=function(t){t=t||!1,this.to(this.relative(this.current())+1,t)},r.prototype.prev=function(t){t=t||!1,this.to(this.relative(this.current())-1,t)},r.prototype.onTransitionEnd=function(t){if(void 0!==t&&(t.stopPropagation(),(t.target||t.srcElement||t.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},r.prototype.viewport=function(){var t;if(this.options.responsiveBaseElement!==s)t=h(this.options.responsiveBaseElement).width();else if(s.innerWidth)t=s.innerWidth;else{if(!n.documentElement||!n.documentElement.clientWidth)return t;t=n.documentElement.clientWidth}return t},r.prototype.replace=function(t){this.$stage.empty(),this._items=[],t=t&&(t instanceof s.jQuery?t:h(t)),(t=this.settings.nestedItemSelector?t.find("."+this.settings.nestedItemSelector):t).filter(function(){return 1===this.nodeType}).each(h.proxy(function(t,e){e=this.prepare(e),this.$stage.append(e),this._items.push(e),this._mergers.push(+e.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},r.prototype.add=function(t,e){var i=this.relative(this._current);e=void 0===e?this._items.length:this.normalize(e,!0),t=t instanceof s.jQuery?t:h(t),this.trigger("add",{content:t,position:e}),t=this.prepare(t),0===this._items.length||e===this._items.length?(0===this._items.length&&this.$stage.append(t),0!==this._items.length&&this._items[e-1].after(t),this._items.push(t),this._mergers.push(+t.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[e].before(t),this._items.splice(e,0,t),this._mergers.splice(e,0,+t.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[i]&&this.reset(this._items[i].index()),this.invalidate("items"),this.trigger("added",{content:t,position:e})},r.prototype.remove=function(t){void 0!==(t=this.normalize(t,!0))&&(this.trigger("remove",{content:this._items[t],position:t}),this._items[t].remove(),this._items.splice(t,1),this._mergers.splice(t,1),this.invalidate("items"),this.trigger("removed",{content:null,position:t}))},r.prototype.preloadAutoWidthImages=function(t){t.each(h.proxy(function(t,e){this.enter("pre-loading"),e=h(e),h(new Image).one("load",h.proxy(function(t){e.attr("src",t.target.src),e.css("opacity",1),this.leave("pre-loading"),this.is("pre-loading")||this.is("initializing")||this.refresh()},this)).attr("src",e.attr("src")||e.attr("data-src")||e.attr("data-src-retina"))},this))},r.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),h(n).off(".owl.core"),!1!==this.settings.responsive&&(s.clearTimeout(this.resizeTimer),this.off(s,"resize",this._handlers.onThrottledResize)),h.map(this._plugins,function(t){return t}).forEach(function(t){t&&t.destroy()}),this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.remove(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},r.prototype.op=function(t,e,i){var s=this.settings.rtl;switch(e){case"<":return s?i<t:t<i;case">":return s?t<i:i<t;case">=":return s?t<=i:i<=t;case"<=":return s?i<=t:t<=i}},r.prototype.on=function(t,e,i,s){t.addEventListener?t.addEventListener(e,i,s):t.attachEvent&&t.attachEvent("on"+e,i)},r.prototype.off=function(t,e,i,s){t.removeEventListener?t.removeEventListener(e,i,s):t.detachEvent&&t.detachEvent("on"+e,i)},r.prototype.trigger=function(t,e,i){var s={item:{count:this._items.length,index:this.current()}},n=h.camelCase(h.grep(["on",t,i],function(t){return t}).join("-").toLowerCase()),o=h.Event([t,"owl",i||"carousel"].join(".").toLowerCase(),h.extend({relatedTarget:this},s,e));return this._supress[t]||(h.each(this._plugins,function(t,e){e.onTrigger&&e.onTrigger(o)}),this.register({type:r.Type.Event,name:t}),this.$element.trigger(o),this.settings&&"function"==typeof this.settings[n]&&this.settings[n].call(this,o)),o},r.prototype.enter=function(t){h.each([t].concat(this._states.tags[t]||[]),h.proxy(function(t,e){void 0===this._states.current[e]&&(this._states.current[e]=0),this._states.current[e]+=1},this))},r.prototype.leave=function(t){h.each([t].concat(this._states.tags[t]||[]),h.proxy(function(t,e){--this._states.current[e]},this))},r.prototype.register=function(i){var e;i.type===r.Type.Event?(h.event.special[i.name]||(h.event.special[i.name]={}),h.event.special[i.name].owl||(e=h.event.special[i.name]._default,h.event.special[i.name]._default=function(t){return!e||!e.apply||t.namespace&&-1!==t.namespace.indexOf("owl")?t.namespace&&-1<t.namespace.indexOf("owl"):e.apply(this,arguments)},h.event.special[i.name].owl=!0)):i.type===r.Type.State&&(this._states.tags[i.name]?this._states.tags[i.name]=this._states.tags[i.name].concat(i.tags):this._states.tags[i.name]=i.tags,this._states.tags[i.name]=h.grep(this._states.tags[i.name],h.proxy(function(t,e){return h.inArray(t,this._states.tags[i.name])===e},this)))},r.prototype.suppress=function(t){h.each(t,h.proxy(function(t,e){this._supress[e]=!0},this))},r.prototype.release=function(t){h.each(t,h.proxy(function(t,e){delete this._supress[e]},this))},r.prototype.pointer=function(t){var e={x:null,y:null};return(t=(t=t.originalEvent||t||s.event).touches&&t.touches.length?t.touches[0]:t.changedTouches&&t.changedTouches.length?t.changedTouches[0]:t).pageX?(e.x=t.pageX,e.y=t.pageY):(e.x=t.clientX,e.y=t.clientY),e},r.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))},r.prototype.difference=function(t,e){return{x:t.x-e.x,y:t.y-e.y}},h.fn.tmowlCarousel=function(e){var s=Array.prototype.slice.call(arguments,1);return this.each(function(){var t=h(this),i=t.data("owl.carousel");i||(i=new r(this,"object"==typeof e&&e),t.data("owl.carousel",i),h.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(t,e){i.register({type:r.Type.Event,name:e}),i.$element.on(e+".owl.carousel.core",h.proxy(function(t){t.namespace&&t.relatedTarget!==this&&(this.suppress([e]),i[e].apply(this,[].slice.call(arguments,1)),this.release([e]))},i))})),"string"==typeof e&&"_"!==e.charAt(0)&&i[e].apply(i,s)})},h.fn.tmowlCarousel.Constructor=r}(window.Zepto||window.jQuery,window,document),function(e,i){"use strict";function s(t){this._core=t,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":e.proxy(function(t){t.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=e.extend({},s.Defaults,this._core.options),this._core.$element.on(this._handlers)}s.Defaults={autoRefresh:!0,autoRefreshInterval:500},s.prototype.watch=function(){this._interval||(this._visible=this._core.isVisible(),this._interval=i.setInterval(e.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},s.prototype.refresh=function(){this._core.isVisible()!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible)&&this._core.invalidate("width")&&this._core.refresh()},s.prototype.destroy=function(){var t,e;for(t in i.clearInterval(this._interval),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},e.fn.tmowlCarousel.Constructor.Plugins.AutoRefresh=s}(window.Zepto||window.jQuery,window),function(a,n){"use strict";function e(t){this._core=t,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(t){var e,i,s,n,o,r;if(t.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(t.property&&"position"===t.property.name||"initialized"===t.type))for(i=(e=this._core.settings).center&&Math.ceil(e.items/2)||e.items,s=e.center&&-1*i||0,n=(t.property&&void 0!==t.property.value?t.property.value:this._core.current())+s,o=this._core.clones().length,r=a.proxy(function(t,e){this.load(e)},this),0<e.lazyLoadEager&&(i+=e.lazyLoadEager,e.loop)&&(n-=e.lazyLoadEager,i+=1);s<i;)s+=1,this.load(o/2+this._core.relative(n)),o&&a.each(this._core.clones(this._core.relative(n)),r),n+=1},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)}e.Defaults={lazyLoad:!1,lazyLoadEager:0},e.prototype.load=function(t){var t=this._core.$stage.children().eq(t),e=t&&t.find(".owl-lazy");!e||-1<a.inArray(t.get(0),this._loaded)||(e.each(a.proxy(function(t,e){var i=a(e),s=1<n.devicePixelRatio&&i.attr("data-src-retina")||i.attr("data-src")||i.attr("data-srcset");this._core.trigger("load",{element:i,url:s},"lazy"),i.is("img")?i.one("load.owl.lazy",a.proxy(function(){i.css("opacity",1),this._core.trigger("loaded",{element:i,url:s},"lazy")},this)).attr("src",s):i.is("source")?i.one("load.owl.lazy",a.proxy(function(){this._core.trigger("loaded",{element:i,url:s},"lazy")},this)).attr("srcset",s):((e=new Image).onload=a.proxy(function(){i.css({"background-image":'url("'+s+'")',opacity:"1"}),this._core.trigger("loaded",{element:i,url:s},"lazy")},this),e.src=s)},this)),this._loaded.push(t.get(0)))},e.prototype.destroy=function(){var t,e;for(t in this.handlers)t&&this._core.$element.off(t,this.handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},a.fn.tmowlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window),function(n){"use strict";function i(t){var e=this;this._core=t,this._previousHeight=null,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&"position"===t.property.name&&this.update()},this),"loaded.owl.lazy":n.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&t.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=n.extend({},i.Defaults,this._core.options),this._core.$element.on(this._handlers),this._intervalId=null,n(void 0).on("load",function(){e._core.settings.autoHeight&&e.update()}),n(void 0).on("resize",function(){e._core.settings.autoHeight&&(null!==e._intervalId&&clearTimeout(e._intervalId),e._intervalId=setTimeout(function(){e.update()},250))})}i.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},i.prototype.update=function(){var t=this._core._current,e=t+this._core.settings.items,i=this._core.settings.lazyLoad,t=this._core.$stage.children().toArray().slice(t,e),s=[],e=0;n.each(t,function(t,e){s.push(n(e).height())}),(e=Math.max.apply(null,s))<=1&&i&&this._previousHeight&&(e=this._previousHeight),this._previousHeight=e,this._core.$stage.parent().height(e).addClass(this._core.settings.autoHeightClass)},i.prototype.destroy=function(){var t,e;for(t in this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},n.fn.tmowlCarousel.Constructor.Plugins.AutoHeight=i}(window.Zepto||window.jQuery),function(c,e){"use strict";function i(t){this._core=t,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":c.proxy(function(t){t.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":c.proxy(function(t){t.namespace&&this._core.settings.video&&this.isInFullScreen()&&t.preventDefault()},this),"refreshed.owl.carousel":c.proxy(function(t){t.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":c.proxy(function(t){t.namespace&&"position"===t.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":c.proxy(function(t){var e;t.namespace&&(e=c(t.content).find(".owl-video")).length&&(e.css("display","none"),this.fetch(e,c(t.content)))},this)},this._core.options=c.extend({},i.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",c.proxy(function(t){this.play(t)},this))}i.Defaults={video:!1,videoHeight:!1,videoWidth:!1},i.prototype.fetch=function(t,e){var i=t.attr("data-vimeo-id")?"vimeo":t.attr("data-vzaar-id")?"vzaar":"youtube",s=t.attr("data-vimeo-id")||t.attr("data-youtube-id")||t.attr("data-vzaar-id"),n=t.attr("data-width")||this._core.settings.videoWidth,o=t.attr("data-height")||this._core.settings.videoHeight,r=t.attr("href");if(!r)throw new Error("Missing video URL.");if(-1<(s=r.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/))[3].indexOf("youtu"))i="youtube";else if(-1<s[3].indexOf("vimeo"))i="vimeo";else{if(!(-1<s[3].indexOf("vzaar")))throw new Error("Video URL not supported.");i="vzaar"}s=s[6],this._videos[r]={type:i,id:s,width:n,height:o},e.attr("data-video",r),this.thumbnail(t,this._videos[r])},i.prototype.thumbnail=function(e,t){function i(t){s=l.lazyLoad?c("<div/>",{class:"owl-video-tn "+h,srcType:t}):c("<div/>",{class:"owl-video-tn",style:"opacity:1;background-image:url("+t+")"}),e.after(s),e.after('<div class="owl-video-play-icon"></div>')}var s,n,o=t.width&&t.height?"width:"+t.width+"px;height:"+t.height+"px;":"",r=e.find("img"),a="src",h="",l=this._core.settings;if(e.wrap(c("<div/>",{class:"owl-video-wrapper",style:o})),this._core.settings.lazyLoad&&(a="data-src",h="owl-lazy"),r.length)return i(r.attr(a)),r.remove(),!1;"youtube"===t.type?(n="//img.youtube.com/vi/"+t.id+"/hqdefault.jpg",i(n)):"vimeo"===t.type?c.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+t.id+".json",jsonp:"callback",dataType:"jsonp",success:function(t){n=t[0].thumbnail_large,i(n)}}):"vzaar"===t.type&&c.ajax({type:"GET",url:"//vzaar.com/api/videos/"+t.id+".json",jsonp:"callback",dataType:"jsonp",success:function(t){n=t.framegrab_url,i(n)}})},i.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},i.prototype.play=function(t){var e,t=c(t.target).closest("."+this._core.settings.itemClass),i=this._videos[t.attr("data-video")],s=i.width||"100%",n=i.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),t=this._core.items(this._core.relative(t.index())),this._core.reset(t.index()),(e=c('<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>')).attr("height",n),e.attr("width",s),"youtube"===i.type?e.attr("src","//www.youtube.com/embed/"+i.id+"?autoplay=1&rel=0&v="+i.id):"vimeo"===i.type?e.attr("src","//player.vimeo.com/video/"+i.id+"?autoplay=1"):"vzaar"===i.type&&e.attr("src","//view.vzaar.com/"+i.id+"/player?autoplay=true"),c(e).wrap('<div class="owl-video-frame" />').insertAfter(t.find(".owl-video")),this._playing=t.addClass("owl-video-playing"))},i.prototype.isInFullScreen=function(){var t=e.fullscreenElement||e.mozFullScreenElement||e.webkitFullscreenElement;return t&&c(t).parent().hasClass("owl-video-frame")},i.prototype.destroy=function(){var t,e;for(t in this._core.$element.off("click.owl.video"),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},c.fn.tmowlCarousel.Constructor.Plugins.Video=i}(window.Zepto||window.jQuery,(window,document)),function(r){"use strict";function e(t){this.core=t,this.core.options=r.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=void 0,this.next=void 0,this.handlers={"change.owl.carousel":r.proxy(function(t){t.namespace&&"position"===t.property.name&&(this.previous=this.core.current(),this.next=t.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":r.proxy(function(t){t.namespace&&(this.swapping="translated"===t.type)},this),"translate.owl.carousel":r.proxy(function(t){t.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)}e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){var t,e,i,s,n,o;1===this.core.settings.items&&r.support.animation&&r.support.transition&&(this.core.speed(0),e=r.proxy(this.clear,this),i=this.core.$stage.children().eq(this.previous),s=this.core.$stage.children().eq(this.next),n=this.core.settings.animateIn,o=this.core.settings.animateOut,this.core.current()!==this.previous)&&(o&&(t=this.core.coordinates(this.previous)-this.core.coordinates(this.next),i.one(r.support.animation.end,e).css({left:t+"px"}).addClass("animated owl-animated-out").addClass(o)),n)&&s.one(r.support.animation.end,e).addClass("animated owl-animated-in").addClass(n)},e.prototype.clear=function(t){r(t.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var t,e;for(t in this.handlers)t&&this.core.$element.off(t,this.handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},r.fn.tmowlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery),function(s,n,e){"use strict";function i(t){this._core=t,this._call=null,this._time=0,this._timeout=0,this._paused=!0,this._handlers={"changed.owl.carousel":s.proxy(function(t){t.namespace&&"settings"===t.property.name?this._core.settings.autoplay?this.play():this.stop():t.namespace&&"position"===t.property.name&&this._paused&&(this._time=0)},this),"initialized.owl.carousel":s.proxy(function(t){t.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":s.proxy(function(t,e,i){t.namespace&&this.play(e,i)},this),"stop.owl.autoplay":s.proxy(function(t){t.namespace&&this.stop()},this),"mouseover.owl.autoplay":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":s.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":s.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=s.extend({},i.Defaults,this._core.options)}i.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},i.prototype._next=function(t){this._call=n.setTimeout(s.proxy(this._next,this,t),this._timeout*(Math.round(this.read()/this._timeout)+1)-this.read()),this._core.is("interacting")||e.hidden||this._core.next(t||this._core.settings.autoplaySpeed)},i.prototype.read=function(){return(new Date).getTime()-this._time},i.prototype.play=function(t,e){var i;this._core.is("rotating")||this._core.enter("rotating"),t=t||this._core.settings.autoplayTimeout,i=Math.min(this._time%(this._timeout||t),t),this._paused?(this._time=this.read(),this._paused=!1):n.clearTimeout(this._call),this._time+=this.read()%t-i,this._timeout=t,this._call=n.setTimeout(s.proxy(this._next,this,e),t-i)},i.prototype.stop=function(){this._core.is("rotating")&&(this._time=0,this._paused=!0,n.clearTimeout(this._call),this._core.leave("rotating"))},i.prototype.pause=function(){this._core.is("rotating")&&!this._paused&&(this._time=this.read(),this._paused=!0,n.clearTimeout(this._call))},i.prototype.destroy=function(){var t,e;for(t in this.stop(),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},s.fn.tmowlCarousel.Constructor.Plugins.autoplay=i}(window.Zepto||window.jQuery,window,document),function(n){"use strict";function e(t){this._core=t,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+n(t.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.splice(t.position,0,this._templates.pop())},this),"remove.owl.carousel":n.proxy(function(t){t.namespace&&this._core.settings.dotsData&&this._templates.splice(t.position,1)},this),"changed.owl.carousel":n.proxy(function(t){t.namespace&&"position"===t.property.name&&this.draw()},this),"initialized.owl.carousel":n.proxy(function(t){t.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":n.proxy(function(t){t.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=n.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)}e.Defaults={nav:!1,navText:['<span aria-label="Previous">&#x2039;</span>','<span aria-label="Next">&#x203a;</span>'],navSpeed:!1,navElement:'button type="button" role="presentation"',navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var t,i=this._core.settings;for(t in this._controls.$relative=(i.navContainer?n(i.navContainer):n("<div>").addClass(i.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=n("<"+i.navElement+">").addClass(i.navClass[0]).html(i.navText[0]).prependTo(this._controls.$relative).on("click",n.proxy(function(){this.prev(i.navSpeed)},this)),this._controls.$next=n("<"+i.navElement+">").addClass(i.navClass[1]).html(i.navText[1]).appendTo(this._controls.$relative).on("click",n.proxy(function(){this.next(i.navSpeed)},this)),i.dotsData||(this._templates=[n('<button role="button">').addClass(i.dotClass).append(n("<span>")).prop("outerHTML")]),this._controls.$absolute=(i.dotsContainer?n(i.dotsContainer):n("<div>").addClass(i.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","button",n.proxy(function(t){var e=(n(t.target).parent().is(this._controls.$absolute)?n(t.target):n(t.target).parent()).index();t.preventDefault(),this.to(e,i.dotsSpeed)},this)),this._overrides)t&&(this._core[t]=n.proxy(this[t],this))},e.prototype.destroy=function(){var t,e,i,s,n=this._core.settings;for(t in this._handlers)t&&this.$element.off(t,this._handlers[t]);for(e in this._controls)"$relative"===e&&n.navContainer?this._controls[e].html(""):this._controls[e].remove();for(s in this.overides)s&&(this._core[s]=this._overrides[s]);for(i in Object.getOwnPropertyNames(this))"function"!=typeof this[i]&&(this[i]=null)},e.prototype.update=function(){var t,e,i=this._core.clones().length/2,s=i+this._core.items().length,n=this._core.maximum(!0),o=this._core.settings,r=o.center||o.autoWidth||o.dotsData?1:o.dotsEach||o.items;if("page"!==o.slideBy&&(o.slideBy=Math.min(o.slideBy,o.items)),o.dots||"page"===o.slideBy)for(this._pages=[],t=i,e=0;t<s;t+=1){if(r<=e||0===e){if(this._pages.push({start:Math.min(n,t-i),end:t-i+r-1}),Math.min(n,t-i)===n)break;e=0}e+=this._core.mergers(this._core.relative(t))}},e.prototype.draw=function(){var t=this._core.settings,e=this._core.items().length<=t.items,i=this._core.relative(this._core.current()),s=t.loop||t.rewind;this._controls.$relative.toggleClass("disabled",!t.nav||e),t.nav&&(this._controls.$previous.toggleClass("disabled",!s&&i<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!s&&i>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!t.dots||e),t.dots&&(s=this._pages.length-this._controls.$absolute.children().length,t.dotsData&&0!=s?this._controls.$absolute.html(this._templates.join("")):0<s?this._controls.$absolute.append(new Array(1+s).join(this._templates[0])):s<0&&this._controls.$absolute.children().slice(s).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(n.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(t){var e=this._core.settings;t.page={index:n.inArray(this.current(),this._pages),count:this._pages.length,size:e&&(e.center||e.autoWidth||e.dotsData?1:e.dotsEach||e.items)}},e.prototype.current=function(){var e=this._core.relative(this._core.current());return n.grep(this._pages,n.proxy(function(t){return t.start<=e&&t.end>=e},this)).pop()},e.prototype.getPosition=function(t){var e,i,s=this._core.settings;return"page"===s.slideBy?(e=n.inArray(this.current(),this._pages),i=this._pages.length,t?e+=1:e-=1,e=this._pages[(e%i+i)%i].start):(e=this._core.relative(this._core.current()),i=this._core.items().length,t?e+=s.slideBy:e-=s.slideBy),e},e.prototype.next=function(t){n.proxy(this._overrides.to,this._core)(this.getPosition(!0),t)},e.prototype.prev=function(t){n.proxy(this._overrides.to,this._core)(this.getPosition(!1),t)},e.prototype.to=function(t,e,i){!i&&this._pages.length?(i=this._pages.length,n.proxy(this._overrides.to,this._core)(this._pages[(t%i+i)%i].start,e)):n.proxy(this._overrides.to,this._core)(t,e)},n.fn.tmowlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery),function(s,n){"use strict";function e(t){this._core=t,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":s.proxy(function(t){t.namespace&&"URLHash"===this._core.settings.startPosition&&s(n).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":s.proxy(function(t){var e;t.namespace&&(e=s(t.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash"))&&(this._hashes[e]=t.content)},this),"changed.owl.carousel":s.proxy(function(t){var i;t.namespace&&"position"===t.property.name&&(i=this._core.items(this._core.relative(this._core.current())),t=s.map(this._hashes,function(t,e){return t===i?e:null}).join())&&n.location.hash.slice(1)!==t&&(n.location.hash=t)},this)},this._core.options=s.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),s(n).on("hashchange.owl.navigation",s.proxy(function(){var t=n.location.hash.substring(1),e=this._core.$stage.children(),e=this._hashes[t]&&e.index(this._hashes[t]);void 0!==e&&e!==this._core.current()&&this._core.to(this._core.relative(e),!1,!0)},this))}e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var t,e;for(t in s(n).off("hashchange.owl.navigation"),this._handlers)t&&this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},s.fn.tmowlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window),function(n){"use strict";var t,o=n("<support>").get(0).style,r="Webkit Moz O ms".split(" "),e={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}};function i(t,i){var s=!1,e=t.charAt(0).toUpperCase()+t.slice(1);return n.each((t+" "+r.join(e+" ")+e).split(" "),function(t,e){if(void 0!==o[e])return s=!i||e,!1}),s}function s(t){return i(t,!0)}(t={csstransforms:function(){return!!i("transform")},csstransforms3d:function(){return!!i("perspective")},csstransitions:function(){return!!i("transition")},cssanimations:function(){return!!i("animation")}}).csstransitions()&&(n.support.transition=new String(s("transition")),n.support.transition.end=e.transition.end[n.support.transition]),t.cssanimations()&&(n.support.animation=new String(s("animation")),n.support.animation.end=e.animation.end[n.support.animation]),t.csstransforms()&&(n.support.transform=new String(s("transform")),n.support.transform3d=t.csstransforms3d())}(window.Zepto||window.jQuery);assets/js/jquery.validate.js000064400000150645150755142450012152 0ustar00/*!
 * jQuery Validation Plugin v1.19.3
 *
 * https://jqueryvalidation.org/
 *
 * Copyright (c) 2021 Jörn Zaefferer
 * Released under the MIT license
 *
 * Renamed methods for compatibility
 * reformatted code by ThemeComplete
 */
( function( factory ) {
	'use strict';
	if ( typeof window.define === 'function' && window.define.amd ) {
		window.define( [ 'jquery' ], factory );
	} else if ( typeof window.module === 'object' && window.module.exports ) {
		window.module.exports = factory( window.require( 'jquery' ) );
	} else {
		factory( window.jQuery );
	}
}( function( $ ) {
	'use strict';
	var pendingRequests = {};
	var ajax;
	var trim;

	$.extend( $.fn, {
		// https://jqueryvalidation.org/validate/
		tc_validate: function( options ) {
			var tc_validator;
			// If nothing is selected, return nothing; can't chain anyway
			if ( ! this.length ) {
				return;
			}

			// Check if a tc_validator for this form was already created
			tc_validator = $.data( this[ 0 ], 'tc_validator' );
			if ( tc_validator ) {
				return tc_validator;
			}

			// Add novalidate tag if HTML5.
			this.attr( 'novalidate', 'novalidate' );

			tc_validator = new $.tc_validator( options, this[ 0 ] );
			$.data( this[ 0 ], 'tc_validator', tc_validator );

			if ( tc_validator.settings.onsubmit ) {
				this.on( 'click.tc_validate', ':submit', function( event ) {
					// Track the used submit button to properly handle scripted
					// submits later.
					tc_validator.submitButton = event.currentTarget;

					// Allow suppressing validation by adding a cancel class to the submit button
					if ( $( this ).hasClass( 'cancel' ) ) {
						tc_validator.cancelSubmit = true;
					}

					// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
					if ( $( this ).attr( 'formnovalidate' ) !== undefined ) {
						tc_validator.cancelSubmit = true;
					}
				} );

				// Validate the form on submit
				this.on( 'submit.tc_validate', function( event ) {
					if ( tc_validator.settings.debug ) {
						// Prevent form submit to be able to see console output
						event.preventDefault();
					}

					function handle() {
						var hidden;
						var result;

						// Insert a hidden input as a replacement for the missing submit button
						// The hidden input is inserted in two cases:
						//   - A user defined a `submitHandler`
						//   - There was a pending request due to `remote` method and `stopRequest()`
						//     was called to submit the form in case it's valid
						if ( tc_validator.submitButton && ( tc_validator.settings.submitHandler || tc_validator.formSubmitted ) ) {
							hidden = $( "<input type='hidden'>" ).attr( 'name', tc_validator.submitButton.name ).val( $( tc_validator.submitButton ).val() ).appendTo( tc_validator.currentForm );
						}

						if ( tc_validator.settings.submitHandler && ! tc_validator.settings.debug ) {
							result = tc_validator.settings.submitHandler.call( tc_validator, tc_validator.currentForm, event );
							if ( hidden ) {
								// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
								hidden.remove();
							}
							if ( result !== undefined ) {
								return result;
							}
							return false;
						}
						return true;
					}

					// Prevent submit for invalid forms or custom submit handlers
					if ( tc_validator.cancelSubmit ) {
						tc_validator.cancelSubmit = false;
						return handle();
					}
					if ( tc_validator.form() ) {
						if ( tc_validator.pendingRequest ) {
							tc_validator.formSubmitted = true;
							return false;
						}
						return handle();
					}
					tc_validator.focusInvalid();
					return false;
				} );
			}

			return tc_validator;
		},

		// https://jqueryvalidation.org/valid/
		tc_valid: function() {
			var valid;
			var tc_validator;
			var errorList;

			if ( $( this[ 0 ] ).is( 'form' ) ) {
				valid = this.tc_validate().form();
			} else {
				errorList = [];
				valid = true;
				tc_validator = $( this[ 0 ].form ).tc_validate();
				this.each( function() {
					valid = tc_validator.element( this ) && valid;
					if ( ! valid ) {
						errorList = errorList.concat( tc_validator.errorList );
					}
				} );
				tc_validator.errorList = errorList;
			}
			return valid;
		},

		// https://jqueryvalidation.org/rules/
		tc_rules: function( command, argument ) {
			var element = this[ 0 ];
			var isContentEditable = typeof this.attr( 'contenteditable' ) !== 'undefined' && this.attr( 'contenteditable' ) !== 'false';
			var settings;
			var staticRules;
			var existingRules;
			var data;
			var param;
			var filtered;

			// If nothing is selected, return empty object; can't chain anyway
			if ( element === null ) {
				return;
			}

			if ( ! element.form && isContentEditable ) {
				element.form = this.closest( 'form' )[ 0 ];
				element.name = this.attr( 'name' );
			}

			if ( element.form === null ) {
				return;
			}

			if ( command ) {
				settings = $.data( element.form, 'tc_validator' ).settings;
				staticRules = settings.rules;
				existingRules = $.tc_validator.staticRules( element );
				switch ( command ) {
					case 'add':
						$.extend( existingRules, $.tc_validator.normalizeRule( argument ) );

						// Remove messages from rules, but allow them to be set separately
						delete existingRules.messages;
						staticRules[ element.name ] = existingRules;
						if ( argument.messages ) {
							settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
						}
						break;
					case 'remove':
						if ( ! argument ) {
							delete staticRules[ element.name ];
							return existingRules;
						}
						filtered = {};
						$.each( argument.split( /\s/ ), function( index, method ) {
							filtered[ method ] = existingRules[ method ];
							delete existingRules[ method ];
						} );
						return filtered;
				}
			}

			data = $.tc_validator.normalizeRules( $.extend( {}, $.tc_validator.classRules( element ), $.tc_validator.attributeRules( element ), $.tc_validator.dataRules( element ), $.tc_validator.staticRules( element ) ), element );

			// Make sure required is at front
			if ( data.required ) {
				param = data.required;
				delete data.required;
				data = $.extend( { required: param }, data );
			}

			// Make sure remote is at back
			if ( data.remote ) {
				param = data.remote;
				delete data.remote;
				data = $.extend( data, { remote: param } );
			}

			return data;
		}
	} );

	// JQuery trim is deprecated, provide a trim method based on String.prototype.trim
	trim = function( str ) {
		// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
		return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '' );
	};
	// Custom selectors
	$.extend( $.expr.pseudos || $.expr[ ':' ], {
		// https://jqueryvalidation.org/blank-selector/
		blank: function( a ) {
			return ! trim( '' + $( a ).val() );
		},

		// https://jqueryvalidation.org/filled-selector/
		filled: function( a ) {
			var val = $( a ).val();
			return val !== null && !! trim( '' + val );
		},

		// https://jqueryvalidation.org/unchecked-selector/
		unchecked: function( a ) {
			return ! $( a ).prop( 'checked' );
		}
	} );

	// Constructor for tc_validator
	$.tc_validator = function( options, form ) {
		this.settings = $.extend( true, {}, $.tc_validator.defaults, options );
		this.currentForm = form;
		this.init();
	};

	// https://jqueryvalidation.org/jQuery.tc_validator.format/
	$.tc_validator.format = function( source, params ) {
		if ( arguments.length === 1 ) {
			return function() {
				var args = $.makeArray( arguments );
				args.unshift( source );
				return $.tc_validator.format.apply( this, args );
			};
		}
		if ( params === undefined ) {
			return source;
		}
		if ( arguments.length > 2 && params.constructor !== Array ) {
			params = $.makeArray( arguments ).slice( 1 );
		}
		if ( params.constructor !== Array ) {
			params = [ params ];
		}
		$.each( params, function( i, n ) {
			source = source.replace( new RegExp( '\\{' + i + '\\}', 'g' ), function() {
				return n;
			} );
		} );
		return source;
	};

	$.extend( $.tc_validator, {
		defaults: {
			messages: {},
			groups: {},
			rules: {},
			errorClass: 'error',
			pendingClass: 'pending',
			validClass: 'valid',
			errorElement: 'label',
			focusCleanup: false,
			focusInvalid: true,
			errorContainer: $( [] ),
			errorLabelContainer: $( [] ),
			onsubmit: true,
			ignore: ':hidden',
			ignoreTitle: false,
			onfocusin: function( element ) {
				this.lastActive = element;

				// Hide error label and remove error class on focus if enabled
				if ( this.settings.focusCleanup ) {
					if ( this.settings.unhighlight ) {
						this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
					}
					this.hideThese( this.errorsFor( element ) );
				}
			},
			onfocusout: function( element ) {
				if ( ! this.checkable( element ) && ( element.name in this.submitted || ! this.optional( element ) ) ) {
					this.element( element );
				}
			},
			onkeyup: function( element, event ) {
				// Avoid revalidate the field when pressing one of the following keys
				// Shift       => 16
				// Ctrl        => 17
				// Alt         => 18
				// Caps lock   => 20
				// End         => 35
				// Home        => 36
				// Left arrow  => 37
				// Up arrow    => 38
				// Right arrow => 39
				// Down arrow  => 40
				// Insert      => 45
				// Num lock    => 144
				// AltGr key   => 225
				var excludedKeys = [ 16, 17, 18, 20, 35, 36, 37, 38, 39, 40, 45, 144, 225 ];

				if ( ( event.which === 9 && this.elementValue( element ) === '' ) || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {

				} else if ( element.name in this.submitted || element.name in this.invalid ) {
					this.element( element );
				}
			},
			onclick: function( element ) {
				// Click on selects, radiobuttons and checkboxes
				if ( element.name in this.submitted ) {
					this.element( element );

					// Or option elements, check parent select in that case
				} else if ( element.parentNode.name in this.submitted ) {
					this.element( element.parentNode );
				}
			},
			highlight: function( element, errorClass, validClass ) {
				if ( element.type === 'radio' ) {
					this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
				} else {
					$( element ).addClass( errorClass ).removeClass( validClass );
				}
			},
			unhighlight: function( element, errorClass, validClass ) {
				if ( element.type === 'radio' ) {
					this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
				} else {
					$( element ).removeClass( errorClass ).addClass( validClass );
				}
			}
		},

		// https://jqueryvalidation.org/jQuery.tc_validator.setDefaults/
		setDefaults: function( settings ) {
			$.extend( $.tc_validator.defaults, settings );
		},

		messages: {
			required: 'This field is required.',
			remote: 'Please fix this field.',
			email: 'Please enter a valid email address.',
			url: 'Please enter a valid URL.',
			date: 'Please enter a valid date.',
			dateISO: 'Please enter a valid date (ISO).',
			number: 'Please enter a valid number.',
			digits: 'Please enter only digits.',
			equalTo: 'Please enter the same value again.',
			maxlength: $.tc_validator.format( 'Please enter no more than {0} characters.' ),
			maxlengthsingle: $.tc_validator.format( 'Please enter no more than {0} character.' ),
			minlength: $.tc_validator.format( 'Please enter at least {0} characters.' ),
			minlengthsingle: $.tc_validator.format( 'Please enter at least {0} character.' ),
			rangelength: $.tc_validator.format( 'Please enter a value between {0} and {1} characters long.' ),
			range: $.tc_validator.format( 'Please enter a value between {0} and {1}.' ),
			max: $.tc_validator.format( 'Please enter a value less than or equal to {0}.' ),
			min: $.tc_validator.format( 'Please enter a value greater than or equal to {0}.' ),
			step: $.tc_validator.format( 'Please enter a multiple of {0}.' )
		},

		autoCreateRanges: false,

		prototype: {
			init: function() {
				var currentForm = this.currentForm;
				var groups = {};
				var rules;

				this.labelContainer = $( this.settings.errorLabelContainer );
				this.errorContext = ( this.labelContainer.length && this.labelContainer ) || $( this.currentForm );
				this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
				this.submitted = {};
				this.valueCache = {};
				this.pendingRequest = 0;
				this.pending = {};
				this.invalid = {};
				this.reset();
				this.groups = {};

				$.each( this.settings.groups, function( key, value ) {
					if ( typeof value === 'string' ) {
						value = value.split( /\s/ );
					}
					$.each( value, function( index, name ) {
						groups[ name ] = key;
					} );
				} );
				rules = this.settings.rules;
				$.each( rules, function( key, value ) {
					rules[ key ] = $.tc_validator.normalizeRule( value );
				} );

				function delegate( event ) {
					var isContentEditable = typeof $( event.data.that ).attr( 'contenteditable' ) !== 'undefined' && $( event.data.that ).attr( 'contenteditable' ) !== 'false';
					var tc_validator;
					var eventType;
					var settings;
					// Set form expando on contenteditable
					if ( ! event.data.that.form && isContentEditable ) {
						event.data.that.form = $( event.data.that ).closest( 'form' )[ 0 ];
						event.data.that.name = $( event.data.that ).attr( 'name' );
					}

					// Ignore the element if it belongs to another form. This will happen mainly
					// when setting the `form` attribute of an input to the id of another form.
					if ( currentForm !== event.data.that.form ) {
						return;
					}

					tc_validator = $.data( event.data.that.form, 'tc_validator' );
					eventType = 'on' + event.type.replace( /^validate/, '' );
					settings = tc_validator.settings;
					if ( settings[ eventType ] && ! $( event.data.that ).is( settings.ignore ) ) {
						settings[ eventType ].call( tc_validator, event.data.that, event );
					}
				}

				$( this.currentForm )
					.on(
						'focusin.tc_validate focusout.tc_validate keyup.tc_validate',
						":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
							"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
							"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
							"[type='radio'], [type='checkbox'], [contenteditable], [type='button']",
						{ that: this },
						delegate
					)

					// Support: Chrome, oldIE
					// "select" is provided as event.target when clicking a option
					.on( 'click.tc_validate', "select, option, [type='radio'], [type='checkbox']", { that: this }, delegate );

				if ( this.settings.invalidHandler ) {
					$( this.currentForm ).on( 'invalid-form.tc_validate', this.settings.invalidHandler );
				}
			},

			// https://jqueryvalidation.org/tc_validator.form/
			form: function() {
				this.checkForm();
				$.extend( this.submitted, this.errorMap );
				this.invalid = $.extend( {}, this.errorMap );
				if ( ! this.tc_valid() ) {
					$( this.currentForm ).triggerHandler( 'invalid-form', [ this ] );
				}
				this.showErrors();
				return this.tc_valid();
			},

			checkForm: function() {
				var i;
				var elements;
				this.prepareForm();
				for ( i = 0, elements = this.elements(); elements[ i ]; i += 1 ) {
					this.currentElements = elements;
					this.check( elements[ i ] );
				}
				return this.tc_valid();
			},

			// https://jqueryvalidation.org/tc_validator.element/
			element: function( element ) {
				var cleanElement = this.clean( element ),
					checkElement = this.validationTargetFor( cleanElement ),
					v = this,
					result = true,
					rs,
					group;

				if ( checkElement === undefined ) {
					delete this.invalid[ cleanElement.name ];
				} else {
					this.prepareElement( checkElement );
					this.currentElements = $( checkElement );

					// If this element is grouped, then validate all group elements already
					// containing a value
					group = this.groups[ checkElement.name ];
					if ( group ) {
						$.each( this.groups, function( name, testgroup ) {
							if ( testgroup === group && name !== checkElement.name ) {
								cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
								if ( cleanElement && cleanElement.name in v.invalid ) {
									v.currentElements.push( cleanElement );
									result = v.check( cleanElement ) && result;
								}
							}
						} );
					}

					rs = this.check( checkElement ) !== false;
					result = result && rs;
					if ( rs ) {
						this.invalid[ checkElement.name ] = false;
					} else {
						this.invalid[ checkElement.name ] = true;
					}

					if ( ! this.numberOfInvalids() ) {
						// Hide error containers on last error
						this.toHide = this.toHide.add( this.containers );
					}
					this.showErrors();

					// Add aria-invalid status for screen readers
					$( element ).attr( 'aria-invalid', ! rs );
				}

				return result;
			},

			// https://jqueryvalidation.org/tc_validator.showErrors/
			showErrors: function( errors ) {
				var tc_validator;
				if ( errors ) {
					tc_validator = this;

					// Add items to error list and map
					$.extend( this.errorMap, errors );
					this.errorList = $.map( this.errorMap, function( message, name ) {
						return {
							message: message,
							element: tc_validator.findByName( name )[ 0 ]
						};
					} );

					// Remove items from success list
					this.successList = $.grep( this.successList, function( element ) {
						return ! ( element.name in errors );
					} );
				}
				if ( this.settings.showErrors ) {
					this.settings.showErrors.call( this, this.errorMap, this.errorList );
				} else {
					this.defaultShowErrors();
				}
			},

			// https://jqueryvalidation.org/tc_validator.resetForm/
			resetForm: function() {
				var elements;
				if ( $.fn.resetForm ) {
					$( this.currentForm ).resetForm();
				}
				this.invalid = {};
				this.submitted = {};
				this.prepareForm();
				this.hideErrors();
				elements = this.elements().removeData( 'previousValue' ).removeAttr( 'aria-invalid' );

				this.resetElements( elements );
			},

			resetElements: function( elements ) {
				var i;

				if ( this.settings.unhighlight ) {
					for ( i = 0; elements[ i ]; i += 1 ) {
						this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, '' );
						this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
					}
				} else {
					elements.removeClass( this.settings.errorClass ).removeClass( this.settings.validClass );
				}
			},

			numberOfInvalids: function() {
				return this.objectLength( this.invalid );
			},

			objectLength: function( obj ) {
				/* jshint unused: false */
				var count = 0,
					i;
				for ( i in obj ) {
					// This check allows counting elements with empty error
					// message as invalid elements
					if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
						count += 1;
					}
				}
				return count;
			},

			hideErrors: function() {
				this.hideThese( this.toHide );
			},

			hideThese: function( errors ) {
				errors.not( this.containers ).text( '' );
				this.addWrapper( errors ).hide();
			},

			tc_valid: function() {
				return this.size() === 0;
			},

			size: function() {
				return this.errorList.length;
			},

			focusInvalid: function() {
				if ( this.settings.focusInvalid ) {
					try {
						$( this.findLastActive() || ( this.errorList.length && this.errorList[ 0 ].element ) || [] )
							.filter( ':visible' )
							.trigger( 'focus' )

							// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
							.trigger( 'focusin' );
					} catch ( e ) {
						// Ignore IE throwing errors when focusing hidden elements
					}
				}
			},

			findLastActive: function() {
				var lastActive = this.lastActive;
				return (
					lastActive &&
					$.grep( this.errorList, function( n ) {
						return n.element.name === lastActive.name;
					} ).length === 1 &&
					lastActive
				);
			},

			elements: function() {
				var tc_validator = this,
					rulesCache = {};

				// Select all valid inputs inside the form (no submit or reset buttons)
				return $( this.currentForm )
					.find( 'input, select, textarea, [contenteditable]' )
					.not( ':submit, :reset, :image, :disabled' )
					.not( this.settings.ignore )
					.filter( function() {
						var name = this.name || $( this ).attr( 'name' ); // For contenteditable
						var isContentEditable = typeof $( this ).attr( 'contenteditable' ) !== 'undefined' && $( this ).attr( 'contenteditable' ) !== 'false';

						// Set form expando on contenteditable
						if ( isContentEditable ) {
							this.form = $( this ).closest( 'form' )[ 0 ];
							this.name = name;
						}

						// Ignore elements that belong to other/nested forms
						if ( this.form !== tc_validator.currentForm ) {
							return false;
						}

						// Select only the first element for each name, and only those with rules specified
						if ( name in rulesCache || ! tc_validator.objectLength( $( this ).tc_rules() ) ) {
							return false;
						}

						rulesCache[ name ] = true;
						return true;
					} );
			},

			clean: function( selector ) {
				return $( selector )[ 0 ];
			},

			errors: function() {
				var errorClass = this.settings.errorClass.split( ' ' ).join( '.' );
				return $( this.settings.errorElement + '.' + errorClass, this.errorContext );
			},

			resetInternals: function() {
				this.successList = [];
				this.errorList = [];
				this.errorMap = {};
				this.toShow = $( [] );
				this.toHide = $( [] );
			},

			reset: function() {
				this.resetInternals();
				this.currentElements = $( [] );
			},

			prepareForm: function() {
				this.reset();
				this.toHide = this.errors().add( this.containers );
			},

			prepareElement: function( element ) {
				this.reset();
				this.toHide = this.errorsFor( element );
			},

			elementValue: function( element ) {
				var $element = $( element ),
					type = element.type,
					isContentEditable = typeof $element.attr( 'contenteditable' ) !== 'undefined' && $element.attr( 'contenteditable' ) !== 'false',
					val,
					idx;

				if ( type === 'radio' || type === 'checkbox' ) {
					return this.findByName( element.name ).filter( ':checked' ).val();
				} else if ( type === 'number' && typeof element.validity !== 'undefined' ) {
					return element.validity.badInput ? 'NaN' : $element.val();
				}

				if ( isContentEditable ) {
					val = $element.text();
				} else {
					val = $element.val();
				}

				if ( type === 'file' ) {
					// Modern browser (chrome & safari)
					if ( val.substring( 0, 12 ) === 'C:\\fakepath\\' ) {
						return val.substring( 12 );
					}

					// Legacy browsers
					// Unix-based path
					idx = val.lastIndexOf( '/' );
					if ( idx >= 0 ) {
						return val.substring( idx + 1 );
					}

					// Windows-based path
					idx = val.lastIndexOf( '\\' );
					if ( idx >= 0 ) {
						return val.substring( idx + 1 );
					}

					// Just the file name
					return val;
				}

				if ( typeof val === 'string' ) {
					return val.replace( /\r/g, '' );
				}
				return val;
			},

			check: function( element ) {
				var rules;
				var rulesCount;
				var dependencyMismatch;
				var val;
				var result;
				var method;
				var rule;
				var normalizer;

				element = this.validationTargetFor( this.clean( element ) );

				rules = $( element ).tc_rules();
				rulesCount = $.map( rules, function( n, i ) {
					return i;
				} ).length;
				dependencyMismatch = false;
				val = this.elementValue( element );

				// Prioritize the local normalizer defined for this element over the global one
				// if the former exists, otherwise user the global one in case it exists.
				if ( typeof rules.normalizer === 'function' ) {
					normalizer = rules.normalizer;
				} else if ( typeof this.settings.normalizer === 'function' ) {
					normalizer = this.settings.normalizer;
				}

				// If normalizer is defined, then call it to retreive the changed value instead
				// of using the real one.
				// Note that `this` in the normalizer is `element`.
				if ( normalizer ) {
					val = normalizer.call( element, val );

					// Delete the normalizer from rules to avoid treating it as a pre-defined method.
					delete rules.normalizer;
				}

				for ( method in rules ) {
					if ( method ) {
						rule = { method: method, parameters: rules[ method ] };
						try {
							result = $.tc_validator.methods[ method ].call( this, val, element, rule.parameters );

							// If a method indicates that the field is optional and therefore valid,
							// don't mark it as valid when there are no other rules
							if ( result === 'dependency-mismatch' && rulesCount === 1 ) {
								dependencyMismatch = true;
								continue;
							}
							dependencyMismatch = false;

							if ( result === 'pending' ) {
								this.toHide = this.toHide.not( this.errorsFor( element ) );
								return;
							}

							if ( ! result ) {
								this.formatAndAdd( element, rule );
								return false;
							}
						} catch ( e ) {
							if ( e instanceof TypeError ) {
								e.message += '.  Exception occurred when checking element ' + element.id + ", check the '" + rule.method + "' method.";
							}

							throw e;
						}
					}
				}
				if ( dependencyMismatch ) {
					return;
				}
				if ( this.objectLength( rules ) ) {
					this.successList.push( element );
				}
				return true;
			},

			// Return the custom message for the given element and validation method
			// specified in the element's HTML5 data attribute
			// return the generic message if present and no method specific message is present
			customDataMessage: function( element, method ) {
				return $( element ).data( 'msg' + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() ) || $( element ).data( 'msg' );
			},

			// Return the custom message for the given element name and validation method
			customMessage: function( name, method ) {
				var m = this.settings.messages[ name ];
				return m && ( m.constructor === String ? m : m[ method ] );
			},

			// Return the first defined argument, allowing empty strings
			findDefined: function() {
				var i;
				for ( i = 0; i < arguments.length; i += 1 ) {
					if ( arguments[ i ] !== undefined ) {
						return arguments[ i ];
					}
				}
				return undefined;
			},

			// The second parameter 'rule' used to be a string, and extended to an object literal
			// of the following form:
			// rule = {
			//     method: "method name",
			//     parameters: "the given method parameters"
			// }
			//
			// The old behavior still supported, kept to maintain backward compatibility with
			// old code, and will be removed in the next major release.
			defaultMessage: function( element, rule ) {
				var message;
				var theregex;
				var singleCheck = '';

				if ( typeof rule === 'string' ) {
					rule = { method: rule };
				}

				if ( rule.method === 'minlength' || rule.method === 'maxlength' ) {
					if ( rule.parameters === 1 || rule.parameters === '1' ) {
						singleCheck = 'single';
					}
				}

				message = this.findDefined(
					this.customMessage( element.name, rule.method + singleCheck ),
					this.customDataMessage( element, rule.method + singleCheck ),

					// 'title' is never undefined, so handle empty string as undefined
					( ! this.settings.ignoreTitle && element.title ) || undefined,
					$.tc_validator.messages[ rule.method + singleCheck ],
					'<strong>Warning: No message defined for ' + element.name + '</strong>'
				);
				theregex = /\$?\{(\d+)\}/g;
				if ( typeof message === 'function' ) {
					message = message.call( this, rule.parameters, element );
				} else if ( theregex.test( message ) ) {
					message = $.tc_validator.format( message.replace( theregex, '{$1}' ), rule.parameters );
				}

				return message;
			},

			formatAndAdd: function( element, rule ) {
				var message = this.defaultMessage( element, rule );

				this.errorList.push( {
					message: message,
					element: element,
					method: rule.method
				} );

				this.errorMap[ element.name ] = message;
				this.submitted[ element.name ] = message;
			},

			addWrapper: function( toToggle ) {
				if ( this.settings.wrapper ) {
					toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
				}
				return toToggle;
			},

			defaultShowErrors: function() {
				var i, elements, error;
				for ( i = 0; this.errorList[ i ]; i += 1 ) {
					error = this.errorList[ i ];
					if ( this.settings.highlight ) {
						this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
					}
					this.showLabel( error.element, error.message );
				}
				if ( this.errorList.length ) {
					this.toShow = this.toShow.add( this.containers );
				}
				if ( this.settings.success ) {
					for ( i = 0; this.successList[ i ]; i += 1 ) {
						this.showLabel( this.successList[ i ] );
					}
				}
				if ( this.settings.unhighlight ) {
					for ( i = 0, elements = this.validElements(); elements[ i ]; i += 1 ) {
						this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
					}
				}
				this.toHide = this.toHide.not( this.toShow );
				this.hideErrors();
				this.addWrapper( this.toShow ).show();
			},

			validElements: function() {
				return this.currentElements.not( this.invalidElements() );
			},

			invalidElements: function() {
				return $( this.errorList ).map( function() {
					return this.element;
				} );
			},

			showLabel: function( element, message ) {
				var place,
					group,
					errorID,
					v,
					error = this.errorsFor( element ),
					elementID = this.idOrName( element ),
					describedBy = $( element ).attr( 'aria-describedby' );

				if ( error.length ) {
					// Refresh error/success class
					error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );

					// Replace message on existing label
					error.html( message );
				} else {
					// Create error element
					error = $( '<' + this.settings.errorElement + '>' )
						.attr( 'id', elementID + '-error' )
						.addClass( this.settings.errorClass )
						.html( message || '' );

					// Maintain reference to the element to be placed into the DOM
					place = error;
					if ( this.settings.wrapper ) {
						// Make sure the element is visible, even in IE
						// actually showing the wrapped element is handled elsewhere
						place = error
							.hide()
							.show()
							.wrap( '<' + this.settings.wrapper + '/>' )
							.parent();
					}
					if ( this.labelContainer.length ) {
						this.labelContainer.append( place );
					} else if ( this.settings.errorPlacement ) {
						this.settings.errorPlacement.call( this, place, $( element ) );
					} else {
						place.insertAfter( element );
					}

					// Link error back to the element
					if ( error.is( 'label' ) ) {
						// If the error is a label, then associate using 'for'
						error.attr( 'for', elementID );

						// If the element is not a child of an associated label, then it's necessary
						// to explicitly apply aria-describedby
					} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
						errorID = error.attr( 'id' );

						// Respect existing non-error aria-describedby
						if ( ! describedBy ) {
							describedBy = errorID;
						} else if ( ! describedBy.match( new RegExp( '\\b' + this.escapeCssMeta( errorID ) + '\\b' ) ) ) {
							// Add to end of list if not already present
							describedBy += ' ' + errorID;
						}
						$( element ).attr( 'aria-describedby', describedBy );

						// If this element is grouped, then assign to all elements in the same group
						group = this.groups[ element.name ];
						if ( group ) {
							v = this;
							$.each( v.groups, function( name, testgroup ) {
								if ( testgroup === group ) {
									$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm ).attr( 'aria-describedby', error.attr( 'id' ) );
								}
							} );
						}
					}
				}
				if ( ! message && this.settings.success ) {
					error.text( '' );
					if ( typeof this.settings.success === 'string' ) {
						error.addClass( this.settings.success );
					} else {
						this.settings.success( error, element );
					}
				}
				this.toShow = this.toShow.add( error );
			},

			errorsFor: function( element ) {
				var name = this.escapeCssMeta( this.idOrName( element ) ),
					describer = $( element ).attr( 'aria-describedby' ),
					selector = "label[for='" + name + "'], label[for='" + name + "'] *";

				// 'aria-describedby' should directly reference the error element
				if ( describer ) {
					selector = selector + ', #' + this.escapeCssMeta( describer ).replace( /\s+/g, ', #' );
				}

				return this.errors().filter( selector );
			},

			// See https://api.jquery.com/category/selectors/, for CSS
			// meta-characters that should be escaped in order to be used with JQuery
			// as a literal part of a name/id or any selector.
			escapeCssMeta: function( string ) {
				// eslint-disable-next-line no-useless-escape
				return string.replace( /([\\!"#$%&'()*+,.\/:;<=>?@\[\]\^`{|}~])/g, '\\$1' );
			},

			idOrName: function( element ) {
				return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
			},

			validationTargetFor: function( element ) {
				// If radio/checkbox, validate first element in group instead
				if ( this.checkable( element ) ) {
					element = this.findByName( element.name );
				}

				// Always apply ignore filter
				return $( element ).not( this.settings.ignore )[ 0 ];
			},

			checkable: function( element ) {
				return /radio|checkbox/i.test( element.type );
			},

			findByName: function( name ) {
				return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
			},

			getLength: function( value, element ) {
				switch ( element.nodeName.toLowerCase() ) {
					case 'select':
						return $( 'option:selected', element ).length;
					case 'input':
						if ( this.checkable( element ) ) {
							return this.findByName( element.name ).filter( ':checked' ).length;
						}
				}
				return value.length;
			},

			depend: function( param, element ) {
				return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
			},

			dependTypes: {
				boolean: function( param ) {
					return param;
				},
				string: function( param, element ) {
					return !! $( param, element.form ).length;
				},
				function: function( param, element ) {
					return param( element );
				}
			},

			optional: function( element ) {
				var val = this.elementValue( element );
				return ! $.tc_validator.methods.required.call( this, val, element ) && 'dependency-mismatch';
			},

			startRequest: function( element ) {
				if ( ! this.pending[ element.name ] ) {
					this.pendingRequest += 1;
					$( element ).addClass( this.settings.pendingClass );
					this.pending[ element.name ] = true;
				}
			},

			stopRequest: function( element, valid ) {
				this.pendingRequest -= 1;

				// Sometimes synchronization fails, make sure pendingRequest is never < 0
				if ( this.pendingRequest < 0 ) {
					this.pendingRequest = 0;
				}
				delete this.pending[ element.name ];
				$( element ).removeClass( this.settings.pendingClass );
				if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
					$( this.currentForm ).trigger( 'submit' );

					// Remove the hidden input that was used as a replacement for the
					// missing submit button. The hidden input is added by `handle()`
					// to ensure that the value of the used submit button is passed on
					// for scripted submits triggered by this method
					if ( this.submitButton ) {
						$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
					}

					this.formSubmitted = false;
				} else if ( ! valid && this.pendingRequest === 0 && this.formSubmitted ) {
					$( this.currentForm ).triggerHandler( 'invalid-form', [ this ] );
					this.formSubmitted = false;
				}
			},

			previousValue: function( element, method ) {
				method = ( typeof method === 'string' && method ) || 'remote';

				return (
					$.data( element, 'previousValue' ) ||
					$.data( element, 'previousValue', {
						old: null,
						valid: true,
						message: this.defaultMessage( element, { method: method } )
					} )
				);
			},

			// Cleans up all forms and elements, removes tc_validator-specific events
			destroy: function() {
				this.resetForm();

				$( this.currentForm )
					.off( '.tc_validate' )
					.removeData( 'tc_validator' )
					.find( '.tc_validate-equalTo-blur' )
					.off( '.tc_validate-equalTo' )
					.removeClass( 'validate-equalTo-blur' )
					.find( '.tc_validate-lessThan-blur' )
					.off( '.tc_validate-lessThan' )
					.removeClass( 'validate-lessThan-blur' )
					.find( '.tc_validate-lessThanEqual-blur' )
					.off( '.tc_validate-lessThanEqual' )
					.removeClass( 'validate-lessThanEqual-blur' )
					.find( '.tc_validate-greaterThanEqual-blur' )
					.off( '.tc_validate-greaterThanEqual' )
					.removeClass( 'validate-greaterThanEqual-blur' )
					.find( '.tc_validate-greaterThan-blur' )
					.off( '.tc_validate-greaterThan' )
					.removeClass( 'validate-greaterThan-blur' );
			}
		},

		classRuleSettings: {
			required: { required: true },
			email: { email: true },
			url: { url: true },
			date: { date: true },
			dateISO: { dateISO: true },
			number: { number: true },
			digits: { digits: true },
			creditcard: { creditcard: true }
		},

		addClassRules: function( className, rules ) {
			if ( className.constructor === String ) {
				this.classRuleSettings[ className ] = rules;
			} else {
				$.extend( this.classRuleSettings, className );
			}
		},

		classRules: function( element ) {
			var rules = {},
				classes = $( element ).attr( 'class' );

			if ( classes ) {
				$.each( classes.split( ' ' ), function() {
					if ( this in $.tc_validator.classRuleSettings ) {
						$.extend( rules, $.tc_validator.classRuleSettings[ this ] );
					}
				} );
			}
			return rules;
		},

		normalizeAttributeRule: function( rules, type, method, value ) {
			// Convert the value to a number for number inputs, and for text for backwards compability
			// allows type="date" and others to be compared as strings
			if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
				value = Number( value );

				// Support Opera Mini, which returns NaN for undefined minlength
				if ( isNaN( value ) ) {
					value = undefined;
				}
			}

			if ( value || value === 0 ) {
				rules[ method ] = value;
			} else if ( type === method && type !== 'range' ) {
				// Exception: the jquery validate 'range' method
				// does not test for the html5 'range' type
				rules[ method ] = true;
			}
		},

		attributeRules: function( element ) {
			var rules = {},
				$element = $( element ),
				type = element.getAttribute( 'type' ),
				method,
				value;

			for ( method in $.tc_validator.methods ) {
				if ( method ) {
					// Support for <input required> in both html5 and older browsers
					if ( method === 'required' ) {
						value = element.getAttribute( method );

						// Some browsers return an empty string for the required attribute
						// and non-HTML5 browsers might have required="" markup
						if ( value === '' ) {
							value = true;
						}

						// Force non-HTML5 browsers to return bool
						value = !! value;
					} else {
						value = $element.attr( method );
					}

					this.normalizeAttributeRule( rules, type, method, value );
				}
			}

			// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
			if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
				delete rules.maxlength;
			}

			return rules;
		},

		dataRules: function( element ) {
			var rules = {},
				$element = $( element ),
				type = element.getAttribute( 'type' ),
				method,
				value;

			for ( method in $.tc_validator.methods ) {
				if ( method ) {
					value = $element.data( 'rule' + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );

					// Cast empty attributes like `data-rule-required` to `true`
					if ( value === '' ) {
						value = true;
					}

					this.normalizeAttributeRule( rules, type, method, value );
				}
			}
			return rules;
		},

		staticRules: function( element ) {
			var rules = {},
				tc_validator = $.data( element.form, 'tc_validator' );

			if ( tc_validator.settings.rules ) {
				rules = $.tc_validator.normalizeRule( tc_validator.settings.rules[ element.name ] ) || {};
			}
			return rules;
		},

		normalizeRules: function( rules, element ) {
			var keepRule;
			// Handle dependency check
			$.each( rules, function( prop, val ) {
				// Ignore rule when param is explicitly false, eg. required:false
				if ( val === false ) {
					delete rules[ prop ];
					return;
				}
				if ( val.param || val.depends ) {
					keepRule = true;
					switch ( typeof val.depends ) {
						case 'string':
							keepRule = !! $( val.depends, element.form ).length;
							break;
						case 'function':
							keepRule = val.depends.call( element, element );
							break;
					}
					if ( keepRule ) {
						rules[ prop ] = val.param !== undefined ? val.param : true;
					} else {
						$.data( element.form, 'tc_validator' ).resetElements( $( element ) );
						delete rules[ prop ];
					}
				}
			} );

			// Evaluate parameters
			$.each( rules, function( rule, parameter ) {
				rules[ rule ] = typeof parameter === 'function' && rule !== 'normalizer' ? parameter( element ) : parameter;
			} );

			// Clean number parameters
			$.each( [ 'minlength', 'maxlength' ], function() {
				if ( rules[ this ] ) {
					rules[ this ] = Number( rules[ this ] );
				}
			} );
			$.each( [ 'rangelength', 'range' ], function() {
				var parts;
				if ( rules[ this ] ) {
					if ( Array.isArray( rules[ this ] ) ) {
						rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
					} else if ( typeof rules[ this ] === 'string' ) {
						parts = rules[ this ].replace( /[[\]]/g, '' ).split( /[\s,]+/ );
						rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
					}
				}
			} );

			if ( $.tc_validator.autoCreateRanges ) {
				// Auto-create ranges
				if ( rules.min !== null && rules.max !== null ) {
					rules.range = [ rules.min, rules.max ];
					delete rules.min;
					delete rules.max;
				}
				if ( rules.minlength !== null && rules.maxlength !== null ) {
					rules.rangelength = [ rules.minlength, rules.maxlength ];
					delete rules.minlength;
					delete rules.maxlength;
				}
			}

			return rules;
		},

		// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
		normalizeRule: function( data ) {
			var transformed;
			if ( typeof data === 'string' ) {
				transformed = {};
				$.each( data.split( /\s/ ), function() {
					transformed[ this ] = true;
				} );
				data = transformed;
			}
			return data;
		},

		// https://jqueryvalidation.org/jQuery.tc_validator.addMethod/
		addMethod: function( name, method, message ) {
			$.tc_validator.methods[ name ] = method;
			$.tc_validator.messages[ name ] = message !== undefined ? message : $.tc_validator.messages[ name ];
			if ( method.length < 3 ) {
				$.tc_validator.addClassRules( name, $.tc_validator.normalizeRule( name ) );
			}
		},

		// https://jqueryvalidation.org/jQuery.tc_validator.methods/
		methods: {
			// https://jqueryvalidation.org/required-method/
			required: function( value, element, param ) {
				var val;
				// Check if dependency is met
				if ( ! this.depend( param, element ) ) {
					return 'dependency-mismatch';
				}
				if ( element.nodeName.toLowerCase() === 'select' ) {
					// Could be an array for select-multiple or a string, both are fine this way
					val = $( element ).val();
					return val && val.length > 0;
				}
				if ( this.checkable( element ) ) {
					return this.getLength( value, element ) > 0;
				}
				return value !== undefined && value !== null && value.length > 0;
			},

			// https://jqueryvalidation.org/email-method/
			email: function( value, element ) {
				// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
				// Retrieved 2014-01-14
				// If you have a problem with this implementation, report a bug against the above spec
				// Or use custom methods to implement your own email validation
				// eslint-disable-next-line no-useless-escape
				return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?\^_`{|}~\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
			},

			// https://jqueryvalidation.org/url-method/
			url: function( value, element ) {
				// Copyright (c) 2010-2013 Diego Perini, MIT licensed
				// https://gist.github.com/dperini/729294
				// see also https://mathiasbynens.be/demo/url-regex
				// modified to allow protocol-relative URLs
				return (
					this.optional( element ) ||
					// eslint-disable-next-line no-useless-escape
					/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(
						value
					)
				);
			},
			// https://jqueryvalidation.org/date-method/
			date: function( value, element ) {
				/* This method is deprecated and will be removed in version 2.0.0. Please don't use it, since it relies on the Date constructor, which behaves very differently across browsers and locales. Use dateISO instead or one of the locale specific methods (in localizations/ and additional-methods.js). */
				return this.optional( element ) || ! /Invalid|NaN/.test( new Date( value ).toString() );
			},

			// https://jqueryvalidation.org/dateISO-method/
			dateISO: function( value, element ) {
				// eslint-disable-next-line no-useless-escape
				return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
			},

			// https://jqueryvalidation.org/number-method/
			number: function( value, element ) {
				return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
			},

			// https://jqueryvalidation.org/digits-method/
			digits: function( value, element ) {
				return this.optional( element ) || /^\d+$/.test( value );
			},

			// https://jqueryvalidation.org/minlength-method/
			minlength: function( value, element, param ) {
				var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
				return this.optional( element ) || length >= param;
			},

			// https://jqueryvalidation.org/maxlength-method/
			maxlength: function( value, element, param ) {
				var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
				return this.optional( element ) || length <= param;
			},

			// https://jqueryvalidation.org/rangelength-method/
			rangelength: function( value, element, param ) {
				var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
				return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
			},

			// https://jqueryvalidation.org/min-method/
			min: function( value, element, param ) {
				return this.optional( element ) || value >= param;
			},

			// https://jqueryvalidation.org/max-method/
			max: function( value, element, param ) {
				return this.optional( element ) || value <= param;
			},

			// https://jqueryvalidation.org/range-method/
			range: function( value, element, param ) {
				return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
			},

			// https://jqueryvalidation.org/step-method/
			step: function( value, element, param ) {
				var type = $( element ).attr( 'type' ),
					errorMessage = 'Step attribute on input type ' + type + ' is not supported.',
					supportedTypes = [ 'text', 'number', 'range' ],
					re = new RegExp( '\\b' + type + '\\b' ),
					notSupported = type && ! re.test( supportedTypes.join() ),
					decimalPlaces = function( num ) {
						var match = ( '' + num ).match( /(?:\.(\d+))?$/ );
						if ( ! match ) {
							return 0;
						}

						// Number of digits right of decimal point.
						return match[ 1 ] ? match[ 1 ].length : 0;
					},
					decimals,
					toInt = function( num ) {
						return Math.round( num * Math.pow( 10, decimals ) );
					},
					valid = true;

				// Works only for text, number and range input types
				// TO-DO find a way to support input types date, datetime, datetime-local, month, time and week
				if ( notSupported ) {
					throw new Error( errorMessage );
				}

				decimals = decimalPlaces( param );

				// Value can't have too many decimals
				if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
					valid = false;
				}

				return this.optional( element ) || valid;
			},

			// https://jqueryvalidation.org/equalTo-method/
			equalTo: function( value, element, param ) {
				// Bind to the blur event of the target in order to revalidate whenever the target field is updated
				var target = $( param );
				if ( this.settings.onfocusout && target.not( '.tc_validate-equalTo-blur' ).length ) {
					target.addClass( 'validate-equalTo-blur' ).on( 'blur.tc_validate-equalTo', function() {
						$( element ).tc_valid();
					} );
				}
				return value === target.val();
			},

			// https://jqueryvalidation.org/remote-method/
			remote: function( value, element, param, method ) {
				var previous;
				var tc_validator;
				var data;
				var optionDataString;

				if ( this.optional( element ) ) {
					return 'dependency-mismatch';
				}

				method = ( typeof method === 'string' && method ) || 'remote';

				previous = this.previousValue( element, method );

				if ( ! this.settings.messages[ element.name ] ) {
					this.settings.messages[ element.name ] = {};
				}
				previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
				this.settings.messages[ element.name ][ method ] = previous.message;

				param = ( typeof param === 'string' && { url: param } ) || param;
				optionDataString = $.param( $.extend( { data: value }, param.data ) );
				if ( previous.old === optionDataString ) {
					return previous.valid;
				}

				previous.old = optionDataString;
				tc_validator = this;
				this.startRequest( element );
				data = {};
				data[ element.name ] = value;
				$.ajax(
					$.extend(
						true,
						{
							mode: 'abort',
							port: 'validate' + element.name,
							dataType: 'json',
							data: data,
							context: tc_validator.currentForm,
							success: function( response ) {
								var valid = response === true || response === 'true',
									errors,
									message,
									submitted;

								tc_validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
								if ( valid ) {
									submitted = tc_validator.formSubmitted;
									tc_validator.resetInternals();
									tc_validator.toHide = tc_validator.errorsFor( element );
									tc_validator.formSubmitted = submitted;
									tc_validator.successList.push( element );
									tc_validator.invalid[ element.name ] = false;
									tc_validator.showErrors();
								} else {
									errors = {};
									message = response || tc_validator.defaultMessage( element, { method: method, parameters: value } );
									previous.message = message;
									errors[ element.name ] = message;
									tc_validator.invalid[ element.name ] = true;
									tc_validator.showErrors( errors );
								}
								previous.valid = valid;
								tc_validator.stopRequest( element, valid );
							}
						},
						param
					)
				);
				return 'pending';
			}
		}
	} );

	// Ajax mode: abort
	// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
	// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()

	// Use a prefilter if available (1.5+)
	if ( $.ajaxPrefilter ) {
		$.ajaxPrefilter( function( settings, _, xhr ) {
			var port = settings.port;
			if ( settings.mode === 'abort' ) {
				if ( pendingRequests[ port ] ) {
					pendingRequests[ port ].abort();
				}
				pendingRequests[ port ] = xhr;
			}
		} );
	} else {
		// Proxy ajax
		ajax = $.ajax;
		$.ajax = function( settings ) {
			var mode = ( 'mode' in settings ? settings : $.ajaxSettings ).mode,
				port = ( 'port' in settings ? settings : $.ajaxSettings ).port;
			if ( mode === 'abort' ) {
				if ( pendingRequests[ port ] ) {
					pendingRequests[ port ].abort();
				}
				pendingRequests[ port ] = ajax.apply( this, arguments );
				return pendingRequests[ port ];
			}
			return ajax.apply( this, arguments );
		};
	}
	return $;
} ) );
assets/js/jquery.tctooltip.min.js000064400000015331150755142450013154 0ustar00!function(m,v){"use strict";function l(t,i){return this.targets=v(t),this.settings=v.extend({},v.fn.tcToolTip.defaults,i),0<this.targets.length&&(this.init(),this)}var n;v(function(){n=m.TMEPOJS||{tm_epo_global_tooltip_max_width:"340px"}}),l.prototype={constructor:l,removeTooltip:function(t,i){var o=this.settings;t.data("is_moving")||(i.removeClass(o.fadin).addClass(o.fadeout),i.animate({opacity:0},o.speed,function(){v(this).remove()}),t.data("tmtip-title")&&void 0===t.data("tm-tip-html")&&!t.attr("data-tm-tooltip-html")&&t.attr("title",t.data("tmtip-title")),v(m).off("scroll.tcToolTip resize.tcToolTip"),o.onetime&&this.destroy())},initTooltip:function(t,i,o){var e,a,l,s,d=this.settings;t&&i&&1===t.length&&1===i.length&&1===t.data("tm-has-tm-tip")&&(1===o&&(e=void 0!==t.data("tm-tip-html")?t.data("tm-tip-html"):t.attr("data-tm-tooltip-html")?t.attr("data-tm-tooltip-html"):t.attr("title"),i.html(e),t.data("is_moving",!0)),i.find("aside").hide(),""===n.tm_epo_global_tooltip_max_width?v(m).width()<=1.2*i.outerWidth()?i.css("max-width",v(m).width()/1.2+"px"):i.css("max-width","340px"):(n.tm_epo_global_tooltip_max_width.isNumeric()&&(n.tm_epo_global_tooltip_max_width=n.tm_epo_global_tooltip_max_width+"px"),i.css("max-width",n.tm_epo_global_tooltip_max_width)),i.find("aside").show(),i.css({left:"",right:"",top:""}),e=v.epoAPI.dom.scroll(),(s=a=t.offset().left+t.outerWidth()/2-i.outerWidth()/2)<0?(a=t.offset().left+t.outerWidth()/2-20,i.addClass("left")):i.removeClass("left"),0<=s&&a+i.outerWidth()>v(m).width()?((a=t.offset().left-i.outerWidth()+t.outerWidth()/2+20)<0&&(a-=10,i.css("max-width","calc("+i.css("max-width")+" - "+Math.abs(a)+"px)"),a=10),i.addClass("right")):i.removeClass("right"),i.css({left:a,right:"auto",top:l}),l=t.offset().top-i.outerHeight()-10,s=t.offset().top-e.top-i.outerHeight()-10,l<0||s<0?(l=t.offset().top+t.outerHeight()+10,i.addClass("top"),i.removeClass("bottom")):(i.removeClass("top"),i.addClass("bottom")),v(m).trigger("tm_tooltip_show"),o?(i.css({left:a,top:l}),t.data("is_moving",!1)):i.css({left:a,top:l}).removeClass(d.fadeout).addClass(d.fadin))},show:function(t){var i,o=this.settings;if(!t.data("is_moving"))return 1===t.data("tm-has-tm-tip")&&(void 0!==t.data("tm-tip-html")?(i=t.data("tm-tip-html"),t.attr("title")&&t.data("tmtip-title",t.attr("title")),t.removeAttr("title")):t.attr("data-tm-tooltip-html")?(i=t.attr("data-tm-tooltip-html"),t.attr("title")&&t.data("tmtip-title",t.attr("title")),t.removeAttr("title")):i=t.attr("title"),void 0!==i)&&(v("#tm-tooltip").remove(),o.tipclass?o.tipclass=" "+o.tipclass:o.tipclass="",(o=v('<div id="tm-tooltip" class="tm-tip tm-animated'+o.tipclass+'"></div>')).css("opacity",0).html(i).appendTo("body"),0<(i=o.find("img")).length&&i.on("load",this.initTooltip.bind(this,t,o)),this.initTooltip(t,o),v(m).on("scroll.tcToolTip resize.tcToolTip",this.initTooltip.bind(this,t,o)),t.data("is_moving",!1),t.on("tmmovetooltip",this.initTooltip.bind(this,t,o,1)),t.on("mouseleave.tc tmhidetooltip",this.removeTooltip.bind(this,t,o)),t.closest("label").on("mouseleave.tc tmhidetooltip",this.removeTooltip.bind(this,t,o)),o.on("click",this.removeTooltip.bind(this,t,o))),!1},destroy:function(){0<this.targets.length&&(this.targets.toArray().forEach(function(t){t=v(t);t.closest("off").on("mouseleave.tc tmhidetooltip"),t.off("tc-tooltip-html-changed tmmovetooltip tmhidetooltip mouseenter.tc mouseleave.tc tmshowtooltip.tc"),t.removeData("tmtip-title"),t.removeData("tm-tip-html")}),this.targets.removeData("tctooltip tm-has-tm-tip is_moving"))},init:function(){var g=this,u=this.settings;0<this.targets.length&&this.targets.toArray().forEach(function(t){var i,o,e,a,l,s,d,m,n,r,p,h,c,f=v(t),t=u.tip||void 0;void 0===f.data("tm-has-tm-tip")&&(i=f.attr("data-tm-tooltip-swatch"),o=f.attr("data-tm-tooltip-swatch-desc"),e=f.attr("data-tm-tooltip-swatch-lbl-desc"),a=f.attr("data-tm-tooltip-swatch-img"),l=f.attr("data-tm-tooltip-swatch-img-lbl"),s=f.attr("data-tm-tooltip-swatch-img-desc"),d=f.attr("data-tm-tooltip-swatch-img-lbl-desc"),f.data("tm-has-tm-tip",1),r=void 0!==f.attr("data-original")?f.attr("data-original"):void 0!==f.attr("src")?void 0!==f.attr("data-src")?f.attr("data-src"):f.attr("src"):f[0].src,0===(p=0===(p=0===(p=(c=0===(c=(c=0===(c=(c=f.closest(".tmcp-field-wrap")).is(".tc-epo-element-product-holder")?f.closest(".cpf-element"):c).length?f.closest(".cpf-element"):c).is(".cpf-type-product")&&0===f.closest(".tm-epo-element-label").length&&f.closest(".cpf-section").length?f.closest(".cpf-section").find(".tc-section-inner-wrap .tm-section-description.tm-description"):c).length?f.closest(".cpf-section").find(".tc-section-inner-wrap .tm-section-description.tm-description"):c).find(".tm-tip-html")).length?c.find(".checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline"):p).length?c.next(".checkbox-image-label,.checkbox-image-label-inline,.radio-image-label,.radio-image-label-inline,.tm-tip-html"):p).length&&c.is(".tm-description")&&(p=c),(c=(p=v(c=p)).find(".tc-label-text")).length||(c=p),h="yes"===f.attr("data-tm-hide-label")||void 0===f.attr("data-tm-hide-label")||p.is(".tm-tip-html"),n="",0===(m=(m=f.closest(".tmcp-field-wrap")).find("[data-tm-tooltip-html]")).length?0<(m=f.closest(".tmcp-field-wrap").find(".tc-inline-description")).length&&(n=m.html()):n=m.attr("data-tm-tooltip-html"),void 0===t?(i?t=c.html():o&&""!==n?t="<aside>"+n+"</aside>":!e||""===c.html()&&""===n?a&&""!==r?t='<img src="'+r+'">':!l||""===c.html()&&""===r?!s||""===r&&""===n?!d||""===c.html()&&""===r&&""===n||(t='<img src="'+r+'"><aside>'+c.html()+"</aside><aside>"+n+"</aside>"):t='<img src="'+r+'"><aside>'+n+"</aside>":t='<img src="'+r+'"><aside>'+c.html()+"</aside>":t="<aside>"+c.html()+"</aside><aside>"+n+"</aside>",void 0!==t&&(f.data("tm-tip-html",t),h)&&(p.find(".tm-tooltip").remove(),c.hide()),void 0===t&&(t=f.attr("data-tm-tooltip-html")?f.attr("data-tm-tooltip-html"):f.attr("title"))):f.data("tm-tip-html",t),f.on("tc-tooltip-html-changed",function(){f.attr("data-tm-tooltip-html")?f.show():f.hide()}),f.is("img")&&f.closest("label").on("mouseenter tmshowtooltip",g.show.bind(g,f)),f.on("mouseenter.tc tmshowtooltip.tc",g.show.bind(g,f)),u.trigger)&&g.show(f)})}},v.fn.tcToolTip=function(t){var i,o,e=v(this),a="object"==typeof t?t:{};return e.map(function(){return v(this).data("tctooltip")||""}).get().some(function(t){return""===t})&&(o=new l(this,a),e.data("tctooltip",o)),void 0===(i="string"==typeof t?(o=e.data("tctooltip"))[t].apply(o,[]):i)?e:i},v.fn.tcToolTip.defaults={fadin:"fadein",fadeout:"fadeout",speed:1500},v.fn.tcToolTip.instances=[],v.fn.tcToolTip.Constructor=l,v.tcToolTip=function(t,i){var o=!1;return(t=t||v(".tm-tooltip")).map(function(){return v(this).data("tctooltip")||""}).get().some(function(t){return""===t})&&(o=new l(t,i),t.data("tctooltip",o)),o}}(window,window.jQuery);assets/js/jquery.tcfloatbox.js000064400000024036150755142450012520 0ustar00/**
 * jquery.tcfloatbox.js
 *
 * @param {Object} $ The jQuery object
 * @version: v1.2
 * @author: ThemeComplete
 *
 * Created by ThemeComplete
 *
 * Copyright (c) 2023 themeComplete http://themecomplete.com
 */
( function( $ ) {
	'use strict';

	var FloatBox = function( dom, options ) {
		this.element = $( dom );

		this.settings = $.extend( {}, $.fn.tcFloatBox.defaults, options );
		this.settings.type = '<' + this.settings.type + '>';

		this.top = 0;
		this.left = 0;
		this.ticking = false;

		if ( this.element.length === 1 ) {
			this.init();
			return this;
		}

		return false;
	};

	FloatBox.prototype = {
		constructor: FloatBox,

		destroy: function() {
			var settings = this.settings;

			if ( this.instance !== undefined ) {
				$.fn.tcFloatBox.instances.splice( this.instance, 1 );

				delete this.instance;

				if ( settings.hideelements ) {
					$( 'embed, object, select' ).css( {
						visibility: 'visible'
					} );
				}

				if ( settings._ovl ) {
					settings._ovl.off();
					settings._ovl.remove();
					delete settings._ovl;
				}

				$( settings.floatboxID ).remove();

				this.element.removeData( 'tcfloatbox' );

				$( window ).off( 'scroll.tcfloatbox' + this.instance );
				$( window ).off( 'resize.tcfloatbox' + this.instance );
			}

			return this;
		},

		hide: function() {
			var settings = this.settings;

			if ( settings.hideelements ) {
				$( 'embed, object, select' ).css( {
					visibility: 'visible'
				} );
			}
			if ( settings.showoverlay === true ) {
				if ( settings._ovl ) {
					settings._ovl.hide();
				}
			}

			$( settings.floatboxID )
				.addClass( 'tc-closing' )
				.removeClass( settings.animateIn )
				.addClass( settings.animateOut );
			$( settings.floatboxID ).animate(
				{
					opacity: 0
				},
				settings.closefadeouttime,
				function() {
					$( settings.floatboxID ).hide();
					$( settings.floatboxID )
						.removeClass( 'tc-closing' )
						.addClass( 'tc-closed' );
				}
			);

			$( window ).off( 'scroll.tcfloatbox' + this.instance );
			$( window ).off( 'resize.tcfloatbox' + this.instance );
		},

		requestTick: function() {
			var settings = this.settings;

			if ( ! this.ticking ) {
				if ( settings.refresh ) {
					setTimeout(
						this.requestAnimationFrame.bind( this ),
						settings.refresh
					);
				} else {
					requestAnimationFrame( this.update );
				}

				this.ticking = true;
			}
		},

		requestAnimationFrame: function() {
			requestAnimationFrame( this.update.bind( this ) );
		},

		update: function() {
			this.render();
			this.ticking = false;
		},

		doit: function() {
			this.requestTick();
		},

		render: function() {
			var settings = this.settings;
			var size = $.epoAPI.dom.size();
			var scroll;
			var top;
			var left;

			if ( settings.refresh === 'fixed' ) {
				scroll = { top: 0, left: 0 };
			} else {
				scroll = $.epoAPI.dom.scroll();
			}

			top = parseInt(
				scroll.top +
					( ( size.visibleHeight - $( settings.floatboxID ).height() ) / 2 ),
				10
			);
			left = parseInt(
				scroll.left +
					( ( size.visibleWidth - $( settings.floatboxID ).width() ) / 2 ),
				10
			);

			top = parseInt( ( top - this.top ) / settings.fps, 10 );
			left = parseInt( ( left - this.left ) / settings.fps, 10 );

			this.top += top;
			this.left += left;

			$( settings.floatboxID ).css( {
				top: this.top + 'px',
				left: this.left + 'px',
				opacity: 1
			} );
		},

		show: function() {
			var settings = this.settings;
			var top;
			var size;

			if ( this.element.length === 1 ) {
				if ( this.instance === undefined ) {
					this.init();
				}

				if ( settings.hideelements ) {
					$( 'embed, object, select' ).css( {
						visibility: 'hidden'
					} );
				}

				size = $.epoAPI.dom.size();

				if ( settings.showoverlay === true ) {
					if ( ! settings._ovl ) {
						settings._ovl = $( '<div class="fl-overlay"></div>' ).css(
							{
								zIndex: parseInt( settings.zIndex, 10 ) - 1,
								opacity: settings.overlayopacity
							}
						);
						settings._ovl.appendTo( 'body' );
						if ( ! settings.ismodal ) {
							if ( settings.cancelEvent || settings.unique ) {
								settings._ovl.on(
									'click',
									this.applyCancelEvent.bind( this )
								);
							} else {
								settings._ovl.on(
									'click',
									settings.cancelfunc.bind( this )
								);
							}
						}
					} else {
						settings._ovl.show();
					}
				}

				if ( settings.showfunc ) {
					settings.showfunc.call();
				}

				$( settings.floatboxID )
					.removeClass( 'tc-closing' )
					.addClass(
						settings.animationBaseClass + ' ' + settings.animateIn
					);

				if ( settings.refresh === 'fixed' ) {
					if ( settings.top !== false ) {
						top = settings.top;
					} else {
						top = parseInt(
							( size.visibleHeight -
								$( settings.floatboxID ).height() ) /
								2,
							10
						);
						top = top + 'px';
					}
					$( settings.floatboxID ).css( {
						position: 'fixed',
						top: top
					} );

					if ( settings.left !== false ) {
						$( settings.floatboxID ).css( {
							left: settings.left
						} );
					}
				} else {
					this.render();
				}
			}
		},

		applyCancelEvent: function() {
			var settings = this.settings;

			if ( settings.cancelEvent === true ) {
				this.destroy();
			} else if ( typeof settings.cancelEvent === 'function' ) {
				settings.cancelEvent.call( this, this );
			}
		},

		applyCancelEventFromKey: function( e ) {
			if ( e.which === 27 ) {
				this.applyCancelEvent();
			}
		},

		applyUpdateEvent: function() {
			var settings = this.settings;

			if ( typeof settings.updateEvent === 'function' ) {
				settings.updateEvent.call( this, this );
			}
		},

		applyUpdateEventFromKey: function( e ) {
			if ( e.which === 13 ) {
				this.applyUpdateEvent();
			}
		},

		init: function() {
			var settings = this.settings;
			var size;
			var scroll;
			var l = 0;
			var h;

			if ( this.element.length === 1 ) {
				// Instance initialization
				if ( $.fn.tcFloatBox.instances.length > 0 ) {
					settings.zIndex =
						parseInt(
							$.fn.tcFloatBox.instances[
								$.fn.tcFloatBox.instances.length - 1
							].zIndex,
							10
						) + 100;
				}
				this.instance = $.fn.tcFloatBox.instances.length;
				$.fn.tcFloatBox.instances.push( settings );

				settings.id = settings.id + this.instance;
				settings.floatboxID = '#' + $.epoAPI.dom.id( settings.id );

				this.hide();

				size = $.epoAPI.dom.size();
				scroll = $.epoAPI.dom.scroll();

				$( settings.type )
					.attr( 'id', settings.id )
					.addClass( settings.classname )
					.html( settings.data )
					.appendTo( this.element );

				$( settings.floatboxID ).css( {
					width: settings.width,
					height: settings.height
				} );

				if ( settings.minWidth ) {
					$( settings.floatboxID ).css( {
						'min-width': settings.minWidth
					} );
				}

				if ( settings.minHeight ) {
					$( settings.floatboxID ).css( {
						'min-height': settings.minHeight
					} );
				}

				h = parseInt(
					scroll.left +
						( ( size.visibleWidth - $( settings.floatboxID ).width() ) / 2 ),
					10
				);

				$( settings.floatboxID ).css( {
					top: l + 'px',
					left: h + 'px',
					'z-index': settings.zIndex
				} );

				this.top = l;
				this.left = h;
				this.cancelfunc = settings.cancelfunc;

				if ( settings.cancelEvent && settings.cancelClass ) {
					$( settings.floatboxID )
						.find( settings.cancelClass )
						.on( 'click', this.applyCancelEvent.bind( this ) );
					if ( settings.isconfirm ) {
						$( document )
							.off( 'keyup.escape-' + settings.floatboxID )
							.on(
								'keyup.escape-' + settings.floatboxID,
								this.applyCancelEventFromKey.bind( this )
							);
					}
				}

				if ( settings.updateEvent && settings.updateClass ) {
					$( settings.floatboxID )
						.find( settings.updateClass )
						.on( 'click', this.applyUpdateEvent.bind( this ) );
					if ( settings.isconfirm ) {
						$( document )
							.off( 'keyup.enter-' + settings.floatboxID )
							.on(
								'keyup.enter-' + settings.floatboxID,
								this.applyUpdateEventFromKey.bind( this )
							);
					}
				}

				this.show();

				if ( settings.refresh !== 'fixed' ) {
					$( window ).on(
						'scroll.tcfloatbox' + this.instance,
						this.doit.bind( this )
					);
				}

				$( window ).on(
					'resize.tcfloatbox' + this.instance,
					this.doit.bind( this )
				);
			}
		}
	};

	$.fn.tcFloatBox = function( option ) {
		var methodReturn;
		var targets = $( this );
		var data = targets.data( 'tcfloatbox' );
		var options;
		var ret;

		if ( typeof option === 'object' ) {
			options = option;
		} else {
			options = {};
		}

		if ( ! data ) {
			data = new FloatBox( this, options );
			targets.data( 'tcfloatbox', data );
		}

		if ( typeof option === 'string' ) {
			methodReturn = data[ option ].apply( data, [] );
		}

		if ( methodReturn === undefined ) {
			ret = targets;
		} else {
			ret = methodReturn;
		}

		return ret;
	};

	$.fn.tcFloatBox.defaults = {
		id: 'flasho',
		classname: 'flasho',
		type: 'div',
		data: '',
		width: '500px',
		height: 'auto',
		minWidth: 0,
		minHeight: 0,
		closefadeouttime: 1000,
		animationBaseClass: 'tm-animated',
		animateIn: 'fadein',
		animateOut: 'fadeout',
		top: false,
		left: false,
		refresh: false,
		fps: 4,
		hideelements: false,
		showoverlay: true,
		zIndex: 100100,
		ismodal: false,
		cancelfunc: FloatBox.prototype.hide,
		showfunc: null,
		cancelEvent: true,
		cancelClass: '.floatbox-cancel',
		updateEvent: false,
		updateClass: false,
		unique: true,
		overlayopacity: 0.5,
		isconfirm: false
	};

	$.fn.tcFloatBox.instances = [];

	$.fn.tcFloatBox.Constructor = FloatBox;

	$.tcFloatBox = function( options ) {
		var targets = $( 'body' );
		var data = false;
		var hasAtLeastOneNonToolTip = targets
			.map( function() {
				return $( this ).data( 'tcfloatbox' ) || '';
			} )
			.get()
			.some( function( value ) {
				return value === '';
			} );
		if ( hasAtLeastOneNonToolTip || options.unique ) {
			data = new FloatBox( targets, options );
			targets.data( 'tcfloatbox', data );
		} else {
			data = targets.data( 'tcfloatbox' );
			data.init();
		}
		return data;
	};
}( window.jQuery ) );
assets/js/jquery.mask.js000064400000045420150755142450011306 0ustar00/**
 * jquery.mask.js
 *
 * @version: v1.14.16
 * @author: Igor Escobar
 *
 * Created by Igor Escobar on 2012-03-10. Please report any bug at github.com/igorescobar/jQuery-Mask-Plugin
 *
 * Copyright (c) 2012 Igor Escobar http://igorescobar.com
 *
 * The MIT License (http://www.opensource.org/licenses/mit-license.php)
 *
 * 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.
 */

/* jshint laxbreak: true */
/* jshint maxcomplexity:17 */
/* global define */

// UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere.
// https://github.com/umdjs/umd/blob/master/templates/jqueryPlugin.js
// reformatted code by ThemeComplete
( function( factory, jQuery, Zepto ) {
	'use strict';

	if ( typeof define === 'function' && define.amd ) {
		define( [ 'jquery' ], factory );
	} else if ( typeof exports === 'object' && typeof Meteor === 'undefined' ) {
		window.module.exports = factory( window.require( 'jquery' ) );
	} else {
		factory( jQuery || Zepto );
	}
}(
	function( $ ) {
		'use strict';

		var JSON = window.JSON;
		var globals;
		var Mask = function( el, mask, options ) {
			var jMask = this;
			var regexMask;
			var oldValue;

			var p = {
				invalid: [],
				getCaret: function() {
					var sel,
						pos = 0,
						ctrl,
						dSel,
						cSelStart;
					try {
						ctrl = el.get( 0 );
						dSel = document.selection;
						cSelStart = ctrl.selectionStart;

						// IE Support
						if ( dSel && navigator.appVersion.indexOf( 'MSIE 10' ) === -1 ) {
							sel = dSel.createRange();
							sel.moveStart( 'character', -p.val().length );
							pos = sel.text.length;
						} else if ( cSelStart || cSelStart === '0' ) { // Firefox support
							pos = cSelStart;
						}

						return pos;
					} catch ( err ) {
						window.console.log( err );
					}
				},
				setCaret: function( pos ) {
					var range;
					var ctrl;
					try {
						if ( el.is( ':focus' ) ) {
							ctrl = el.get( 0 );

							// Firefox, WebKit, etc..
							if ( ctrl.setSelectionRange ) {
								ctrl.setSelectionRange( pos, pos );
							} else {
								// IE
								range = ctrl.createTextRange();
								range.collapse( true );
								range.moveEnd( 'character', pos );
								range.moveStart( 'character', pos );
								range.select();
							}
						}
					} catch ( err ) {
						window.console.log( err );
					}
				},
				events: function() {
					el.on( 'keydown.mask', function( e ) {
						el.data( 'mask-keycode', e.keyCode || e.which );
						el.data( 'mask-previus-value', el.val() );
						el.data( 'mask-previus-caret-pos', p.getCaret() );
						p.maskDigitPosMapOld = p.maskDigitPosMap;
					} )
						.on( $.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour )
						.on( 'paste.mask drop.mask', function() {
							setTimeout( function() {
								el.keydown().keyup();
							}, 100 );
						} )
						.on( 'change.mask', function() {
							el.data( 'changed', true );
						} )
						.on( 'blur.mask', function() {
							if ( oldValue !== p.val() && ! el.data( 'changed' ) ) {
								el.trigger( 'change' );
							}
							el.data( 'changed', false );
						} )
						// it's very important that this callback remains in this position
						// otherwhise oldValue it's going to work buggy
						.on( 'blur.mask', function() {
							oldValue = p.val();
						} )
						// select all text on focus
						.on( 'focus.mask', function( e ) {
							if ( options.selectOnFocus === true ) {
								$( e.target ).select();
							}
						} )
						// clear the value if it not complete the mask
						.on( 'focusout.mask', function() {
							if ( options.clearIfNotMatch && ! regexMask.test( p.val() ) ) {
								p.val( '' );
							}
						} );
				},
				getRegexMask: function() {
					var maskChunks = [],
						translation,
						pattern,
						optional,
						recursive,
						oRecursive,
						r;
					var i;

					for ( i = 0; i < mask.length; i += 1 ) {
						translation = jMask.translation[ mask.charAt( i ) ];

						if ( translation ) {
							pattern = translation.pattern.toString().replace( /.{1}$|^.{1}/g, '' );
							optional = translation.optional;
							recursive = translation.recursive;

							if ( recursive ) {
								maskChunks.push( mask.charAt( i ) );
								oRecursive = {
									digit: mask.charAt( i ),
									pattern: pattern
								};
							} else {
								maskChunks.push( ! optional && ! recursive ? pattern : pattern + '?' );
							}
						} else {
							// eslint-disable-next-line no-useless-escape
							maskChunks.push( mask.charAt( i ).replace( /[-\/\\^$*+?.()|[\]{}]/g, '\\$&' ) );
						}
					}

					r = maskChunks.join( '' );

					if ( oRecursive ) {
						r = r.replace( new RegExp( '(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)' ), '($1)?' ).replace( new RegExp( oRecursive.digit, 'g' ), oRecursive.pattern );
					}

					return new RegExp( r );
				},
				destroyEvents: function() {
					el.off( [ 'input', 'keydown', 'keyup', 'paste', 'drop', 'blur', 'focusout', '' ].join( '.mask ' ) );
				},
				val: function( v ) {
					var isInput = el.is( 'input' ),
						method = isInput ? 'val' : 'text',
						r;

					if ( arguments.length > 0 ) {
						if ( el[ method ]() !== v ) {
							el[ method ]( v );
						}
						r = el;
					} else {
						r = el[ method ]();
					}

					return r;
				},
				calculateCaretPosition: function( oldVal ) {
					var newVal = p.getMasked(),
						caretPosNew = p.getCaret();
					var caretPosOld,
						newValL,
						oldValL,
						maskDigitsBeforeCaret = 0,
						maskDigitsAfterCaret = 0,
						maskDigitsBeforeCaretAll = 0,
						maskDigitsBeforeCaretAllOld = 0,
						i = 0;
					var caretPos;
					if ( oldVal !== newVal ) {
						caretPosOld = el.data( 'mask-previus-caret-pos' ) || 0;
						newValL = newVal.length;
						oldValL = oldVal.length;

						for ( i = caretPosNew; i < newValL; i += 1 ) {
							if ( ! p.maskDigitPosMap[ i ] ) {
								break;
							}
							maskDigitsAfterCaret = maskDigitsAfterCaret + 1;
						}

						for ( i = caretPosNew - 1; i >= 0; i -= 1 ) {
							if ( ! p.maskDigitPosMap[ i ] ) {
								break;
							}
							maskDigitsBeforeCaret = maskDigitsBeforeCaret + 1;
						}

						for ( i = caretPosNew - 1; i >= 0; i -= 1 ) {
							if ( p.maskDigitPosMap[ i ] ) {
								maskDigitsBeforeCaretAll = maskDigitsBeforeCaretAll + 1;
							}
						}

						for ( i = caretPosOld - 1; i >= 0; i -= 1 ) {
							if ( p.maskDigitPosMapOld[ i ] ) {
								maskDigitsBeforeCaretAllOld = maskDigitsBeforeCaretAllOld + 1;
							}
						}

						// if the cursor is at the end keep it there
						if ( caretPosNew > oldValL ) {
							caretPosNew = newValL * 10;
						} else if ( caretPosOld >= caretPosNew && caretPosOld !== oldValL ) {
							if ( ! p.maskDigitPosMapOld[ caretPosNew ] ) {
								caretPos = caretPosNew;
								caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll;
								caretPosNew -= maskDigitsBeforeCaret;
								if ( p.maskDigitPosMap[ caretPosNew ] ) {
									caretPosNew = caretPos;
								}
							}
						} else if ( caretPosNew > caretPosOld ) {
							caretPosNew += maskDigitsBeforeCaretAll - maskDigitsBeforeCaretAllOld;
							caretPosNew += maskDigitsAfterCaret;
						}
					}
					return caretPosNew;
				},
				behaviour: function( e ) {
					var keyCode = el.data( 'mask-keycode' );
					var newVal;
					var oldVal;
					var caretPos;
					e = e || window.event;
					p.invalid = [];

					if ( $.inArray( keyCode, jMask.byPassKeys ) === -1 ) {
						newVal = p.getMasked();
						caretPos = p.getCaret();
						oldVal = el.data( 'mask-previus-value' ) || '';

						// this is a compensation to devices/browsers that don't compensate
						// caret positioning the right way
						setTimeout( function() {
							p.setCaret( p.calculateCaretPosition( oldVal ) );
						}, $.jMaskGlobals.keyStrokeCompensation );

						p.val( newVal );
						p.setCaret( caretPos );
						return p.callbacks( e );
					}
				},
				getMasked: function( skipMaskChars, val ) {
					var buf = [],
						value = val === undefined ? p.val() : val + '',
						m = 0,
						maskLen = mask.length,
						v = 0,
						valLen = value.length,
						offset = 1,
						addMethod = 'push',
						resetPos = -1,
						maskDigitCount = 0,
						maskDigitPosArr = [],
						lastMaskChar,
						check;
					var lastUntranslatedMaskChar;
					var maskDigit;
					var valDigit;
					var translation;
					var lastMaskCharDigit;
					var newVal;
					if ( options.reverse ) {
						addMethod = 'unshift';
						offset = -1;
						lastMaskChar = 0;
						m = maskLen - 1;
						v = valLen - 1;
						check = function() {
							return m > -1 && v > -1;
						};
					} else {
						lastMaskChar = maskLen - 1;
						check = function() {
							return m < maskLen && v < valLen;
						};
					}

					while ( check() ) {
						maskDigit = mask.charAt( m );
						valDigit = value.charAt( v );
						translation = jMask.translation[ maskDigit ];

						if ( translation ) {
							if ( valDigit.match( translation.pattern ) ) {
								buf[ addMethod ]( valDigit );
								if ( translation.recursive ) {
									if ( resetPos === -1 ) {
										resetPos = m;
									} else if ( m === lastMaskChar && m !== resetPos ) {
										m = resetPos - offset;
									}

									if ( lastMaskChar === resetPos ) {
										m -= offset;
									}
								}
								m += offset;
							} else if ( valDigit === lastUntranslatedMaskChar ) {
								// matched the last untranslated (raw) mask character that we encountered
								// likely an insert offset the mask character from the last entry; fall
								// through and only increment v
								maskDigitCount = maskDigitCount - 1;
								lastUntranslatedMaskChar = undefined;
							} else if ( translation.optional ) {
								m += offset;
								v -= offset;
							} else if ( translation.fallback ) {
								buf[ addMethod ]( translation.fallback );
								m += offset;
								v -= offset;
							} else {
								p.invalid.push( {
									p: v,
									v: valDigit,
									e: translation.pattern
								} );
							}
							v += offset;
						} else {
							if ( ! skipMaskChars ) {
								buf[ addMethod ]( maskDigit );
							}

							if ( valDigit === maskDigit ) {
								maskDigitPosArr.push( v );
								v += offset;
							} else {
								lastUntranslatedMaskChar = maskDigit;
								maskDigitPosArr.push( v + maskDigitCount );
								maskDigitCount = maskDigitCount + 1;
							}

							m += offset;
						}
					}

					lastMaskCharDigit = mask.charAt( lastMaskChar );
					if ( maskLen === valLen + 1 && ! jMask.translation[ lastMaskCharDigit ] ) {
						buf.push( lastMaskCharDigit );
					}

					newVal = buf.join( '' );
					p.mapMaskdigitPositions( newVal, maskDigitPosArr, valLen );
					return newVal;
				},
				mapMaskdigitPositions: function( newVal, maskDigitPosArr, valLen ) {
					var maskDiff = options.reverse ? newVal.length - valLen : 0;
					var i;
					p.maskDigitPosMap = {};
					for ( i = 0; i < maskDigitPosArr.length; i += 1 ) {
						p.maskDigitPosMap[ maskDigitPosArr[ i ] + maskDiff ] = 1;
					}
				},
				callbacks: function( e ) {
					var val = p.val(),
						changed = val !== oldValue,
						defaultArgs = [ val, e, el, options ],
						callback = function( name, criteria, args ) {
							if ( typeof options[ name ] === 'function' && criteria ) {
								options[ name ].apply( this, args );
							}
						};

					callback( 'onChange', changed === true, defaultArgs );
					callback( 'onKeyPress', changed === true, defaultArgs );
					callback( 'onComplete', val.length === mask.length, defaultArgs );
					callback( 'onInvalid', p.invalid.length > 0, [ val, e, el, p.invalid, options ] );
				}
			};

			el = $( el );

			oldValue = p.val();

			mask = typeof mask === 'function' ? mask( p.val(), undefined, el, options ) : mask;

			// public methods
			jMask.mask = mask;
			jMask.options = options;
			jMask.remove = function() {
				var caret = p.getCaret();
				if ( jMask.options.placeholder ) {
					el.removeAttr( 'placeholder' );
				}
				if ( el.data( 'mask-maxlength' ) ) {
					el.removeAttr( 'maxlength' );
				}
				p.destroyEvents();
				p.val( jMask.getCleanVal() );
				p.setCaret( caret );
				return el;
			};

			// get value without mask
			jMask.getCleanVal = function() {
				return p.getMasked( true );
			};

			// get masked value without the value being in the input or element
			jMask.getMaskedVal = function( val ) {
				return p.getMasked( false, val );
			};

			jMask.init = function( onlyMask ) {
				var i;
				var translation;
				var caret;
				var maxlength;

				onlyMask = onlyMask || false;
				options = options || {};

				jMask.clearIfNotMatch = $.jMaskGlobals.clearIfNotMatch;
				jMask.byPassKeys = $.jMaskGlobals.byPassKeys;
				jMask.translation = $.extend( {}, $.jMaskGlobals.translation, options.translation );

				jMask = $.extend( true, {}, jMask, options );

				regexMask = p.getRegexMask();

				if ( onlyMask ) {
					p.events();
					p.val( p.getMasked() );
				} else {
					if ( options.placeholder ) {
						el.attr( 'placeholder', options.placeholder );
					}

					// this is necessary, otherwise if the user submit the form
					// and then press the "back" button, the autocomplete will erase
					// the data. Works fine on IE9+, FF, Opera, Safari.
					if ( el.data( 'mask' ) ) {
						el.attr( 'autocomplete', 'off' );
					}

					// detect if is necessary let the user type freely.
					// for is a lot faster than forEach.
					for ( i = 0, maxlength = true; i < mask.length; i += 1 ) {
						translation = jMask.translation[ mask.charAt( i ) ];
						if ( translation && translation.recursive ) {
							maxlength = false;
							break;
						}
					}

					if ( maxlength ) {
						el.attr( 'maxlength', mask.length ).data( 'mask-maxlength', true );
					}

					p.destroyEvents();
					p.events();

					caret = p.getCaret();
					p.val( p.getMasked() );
					p.setCaret( caret );
				}
			};

			jMask.init( ! el.is( 'input' ) );
		};

		var notSameMaskObject = function( field, mask, options ) {
				var maskObject = $( field ).data( 'mask' ),
					stringify = JSON.stringify,
					value = $( field ).val() || $( field ).text();
				options = options || {};
				try {
					if ( typeof mask === 'function' ) {
						mask = mask( value );
					}
					return typeof maskObject !== 'object' || stringify( maskObject.options ) !== stringify( options ) || maskObject.mask !== mask;
				} catch ( err ) {
					window.console.log( err );
				}
			},
			HTMLAttributes = function() {
				var input = $( this ),
					options = {},
					prefix = 'data-mask-',
					mask = input.attr( 'data-mask' );

				if ( input.attr( prefix + 'reverse' ) ) {
					options.reverse = true;
				}

				if ( input.attr( prefix + 'clearifnotmatch' ) ) {
					options.clearIfNotMatch = true;
				}

				if ( input.attr( prefix + 'selectonfocus' ) === 'true' ) {
					options.selectOnFocus = true;
				}

				if ( input.attr( prefix + 'placeholder' ) ) {
					options.placeholder = input.attr( prefix + 'placeholder' );
				}

				if ( notSameMaskObject( input, mask, options ) ) {
					return input.data( 'mask', new Mask( this, mask, options ) );
				}
			},
			eventSupported = function( eventName ) {
				var el = document.createElement( 'div' ),
					isSupported;

				eventName = 'on' + eventName;
				isSupported = eventName in el;

				if ( ! isSupported ) {
					el.setAttribute( eventName, 'return;' );
					isSupported = typeof el[ eventName ] === 'function';
				}
				el = null;

				return isSupported;
			};

		$.maskWatchers = {};

		$.fn.mask = function( mask, options ) {
			var selector = this.selector,
				maskGlobals = $.jMaskGlobals,
				interval = maskGlobals.watchInterval,
				watchInputs,
				maskFunction;
			options = options || {};

			watchInputs = options.watchInputs || maskGlobals.watchInputs;
			maskFunction = function() {
				if ( notSameMaskObject( this, mask, options ) ) {
					return $( this ).data( 'mask', new Mask( this, mask, options ) );
				}
			};

			$( this ).each( maskFunction );

			if ( selector && selector !== '' && watchInputs ) {
				clearInterval( $.maskWatchers[ selector ] );
				$.maskWatchers[ selector ] = setInterval( function() {
					$( document ).find( selector ).each( maskFunction );
				}, interval );
			}
			return this;
		};

		$.fn.masked = function( val ) {
			return this.data( 'mask' ).getMaskedVal( val );
		};

		$.fn.unmask = function() {
			clearInterval( $.maskWatchers[ this.selector ] );
			delete $.maskWatchers[ this.selector ];
			return this.each( function() {
				var dataMask = $( this ).data( 'mask' );
				if ( dataMask ) {
					dataMask.remove().removeData( 'mask' );
				}
			} );
		};

		$.fn.cleanVal = function() {
			return this.data( 'mask' ).getCleanVal();
		};

		$.applyDataMask = function( selector ) {
			var $selector;
			selector = selector || $.jMaskGlobals.maskElements;
			$selector = selector instanceof $ ? selector : $( selector );
			$selector.filter( $.jMaskGlobals.dataMaskAttr ).each( HTMLAttributes );
		};

		globals = {
			maskElements: 'input,td,span,div',
			dataMaskAttr: '*[data-mask]',
			dataMask: true,
			watchInterval: 300,
			watchInputs: true,
			keyStrokeCompensation: 10,
			// old versions of chrome dont work great with input event
			useInput: ! /Chrome\/[2-4][0-9]|SamsungBrowser/.test( window.navigator.userAgent ) && eventSupported( 'input' ),
			watchDataMask: false,
			byPassKeys: [ 9, 16, 17, 18, 36, 37, 38, 39, 40, 91 ],
			translation: {
				0: { pattern: /\d/ },
				9: { pattern: /\d/, optional: true },
				'#': { pattern: /\d/, recursive: true },
				A: { pattern: /[a-zA-Z0-9]/ },
				S: { pattern: /[a-zA-Z]/ }
			}
		};

		$.jMaskGlobals = $.jMaskGlobals || {};
		globals = $.jMaskGlobals = $.extend( true, {}, globals, $.jMaskGlobals );

		// looking for inputs with data-mask attribute
		if ( globals.dataMask ) {
			$.applyDataMask();
		}

		setInterval( function() {
			if ( $.jMaskGlobals.watchDataMask ) {
				$.applyDataMask();
			}
		}, globals.watchInterval );
	},
	window.jQuery,
	window.Zepto
) );
assets/js/tm-math.min.js000064400000041227150755142450011167 0ustar00!function(s){"use strict";function c(t){for(var r,n=[void 0,null,!1,0,"","0"],e=0,i=n.length;e<i;e++)if(t===n[e])return 1;if("object"==typeof t){for(r in t)if(t.hasOwnProperty(r))return;return 1}}function f(t,r){return!(!r||r.constructor!==Array&&r.constructor!==Object)&&t in r}function l(t){return{}.toString.call(t).split(" ")[1].slice(0,-1).toLowerCase()}function h(t,r){var n;return"string"!=typeof t&&"number"!=typeof t||isNaN(t)?void 0!==r?r:0:(n=parseFloat(t),isNaN(n)?void 0!==r?r:t:n)}function n(t,r){return t===r?0:r<t?1:-1}function t(t){return t=(t+"").replace(/[^01]/gi,""),parseInt(t,2)}function r(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(2)}function e(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(16)}function i(t){return t<0&&(t=4294967295+t+1),parseInt(t,10).toString(8)}function a(t){return.017453292519943295*t}function o(t,r=0){var n=0<=t?1:-1;return 0===r?Math.round(t):parseFloat((Math.round(t*Math.pow(10,r)+1e-4*n)/Math.pow(10,r)).toFixed(r))}function _(t){return t=(t+"").replace(/[^a-f0-9]/gi,""),parseInt(t,16)}function p(t){return t=(t+"").replace(/[^0-7]/gi,""),parseInt(t,8)}function g(t,r){var n;return t=Math.abs(t),r=Math.abs(r),n=Math.min(t,r),n/=t=Math.max(t,r),t*Math.sqrt(1+n*n)||null}var u={variables:{},on_var_not_found:void 0,on_var_validation:void 0,operators:{},functions:{},cache:{},construct:function(){return this.add_defaults(),this.set_division_by_zero_to_zero(),this},add_operator:function(t){return this.operators[t.operator]=t,this},evaluate:function(t,r=!0){return this.execute(t,r)},parse:function(t){var r,n=0;for(r of t)if("("===r?n++:")"===r&&n--,n<0)return!1;return 0===n&&(t=(t=new v(t,this.operators)).tokenize().build_reverse_polish_notation(),t=new y(this.functions,this.operators).calculate(t,this.variables,this.on_var_not_found,this),"number"===l(t))&&!isNaN(t)&&t},execute:function(t,r=!0){var n,e=t;return f(e,this.cache)?n=this.cache[e]:(n=(n=new v(t,this.operators)).tokenize().build_reverse_polish_notation(),r&&(this.cache[e]=n)),t=new y(this.functions,this.operators).calculate(n,this.variables,this.on_var_not_found,this),t="number"===l(t)&&!isNaN(t)?t:0},add_function:function(t,r){return this.functions[t]=new E(t,r),this},get_vars:function(){return this.variables},get_var:function(t){return f(t,this.variables)?this.variables[t]:(this.on_var_not_found&&"function"==typeof this.on_var_not_found&&this.on_var_not_found(t),A.trigger("Variable ("+t+") not set","UnknownVariableError",0))},set_var:function(t,r){return this.on_var_validation&&"function"==typeof this.on_var_validation&&(r=this.on_var_validation(t,r)),this.variables[t]=r,this},var_exists:function(t){return f(t,this.variables)},set_vars:function(t,r=!0){var n=this;return r&&this.remove_vars(),t.forFach(function(t,r){n.set_var(r,t)}),this},set_var_not_found_handler:function(t){return this.on_var_not_found=t,this},set_var_validation_handler:function(t){return this.on_var_validation=t,this},remove_var:function(t){return delete this.variables[t],this},remove_vars:function(){return this.variables={},this.on_var_not_found=null,this},get_operators:function(){return this.operators},get_functions:function(){return this.functions},remove_operator:function(t){delete this.operators[t]},set_division_by_zero_to_zero:function(){return this.add_operator(new d("/",!1,180,function(t,r){return t=Number(t),0==(r=Number(r))?0:t/r})),this},get_cache:function(){return this.cache},clear_cache:function(){this.cache=[]},add_defaults:function(){var n=this,e=this.default_operators(),i=this.default_functions();return Object.keys(e).forEach(function(t){var r=e[t];n.add_operator(new d(t,r[2],r[1],r[0]))}),Object.keys(i).forEach(function(t){var r=i[t];n.add_function(t,r)}),this.on_var_validation=this.default_var_validation,this.variables=this.default_vars(),this},default_operators:function(){return{"+":[function(t,r){return(t=h(t,0))+(r=h(r,0))},170,!1],"-":[function(t,r){return(t=h(t,0))-(r=h(r,0))},170,!1],uPos:[function(t){return t=h(t,0)},200,!1],uNeg:[function(t){return 0-(t=h(t,0))},200,!1],"*":[function(t,r){return(t=h(t,0))*(r=h(r,0))},180,!1],"/":[function(t,r){return t=h(t,0),r=h(r,0),c(r)?A.trigger("Division By Zero","DivisionByZeroError",0):t/r},180,!1],"^":[function(t,r){return t=h(t,0),r=h(r,0),Math.pow(t,r)},220,!0],"%":[function(t,r){return(t=h(t,0))%(r=h(r,0))},180,!1],"&&":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),r.isNumeric()&&(r=h(r,0)),t&&r?1:0},100,!1],"||":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),r.isNumeric()&&(r=h(r,0)),t||r?1:0},90,!1],"==":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&r.isNumeric()?h(t)===h(r)?1:0:0===n(t,r)?1:0},140,!1],"!=":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&r.isNumeric()?h(t)!==h(r)?1:0:0!==n(t,r)?1:0},140,!1],">=":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),(r=r.isNumeric()?h(r,0):r)<=t?1:0},150,!1],">":[function(t,r){return t=String(t),r=String(r),t.isNumeric()&&(t=h(t,0)),(r=r.isNumeric()?h(r,0):r)<t?1:0},150,!1],"<=":[function(t,r){return t=String(t),r=String(r),(t=t.isNumeric()?h(t,0):t)<=(r=r.isNumeric()?h(r,0):r)?1:0},150,!1],"<":[function(t,r){return t=String(t),r=String(r),(t=t.isNumeric()?h(t,0):t)<(r=r.isNumeric()?h(r,0):r)?1:0},150,!1]}},default_functions:function(){var u=this;return{abs:Math.abs,acos:Math.acos,acosh:Math.acosh,arcsin:Math.asin,arcctg:function(t){return Math.PI/2-Math.atan(t)},arccot:function(t){return Math.PI/2-Math.atan(t)},arccotan:function(t){return Math.PI/2-Math.atan(t)},arcsec:function(t){return Math.acos(1/t)},arccosec:function(t){return Math.asin(1/t)},arccsc:function(t){return Math.asin(1/t)},arccos:Math.acos,arctan:Math.atan,arctg:Math.atan,array:function(...t){return t},asin:Math.asin,atan:Math.atan,atan2:Math.atan2,atanh:Math.atanh,atn:Math.atan,avg:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(r=[].concat.apply([],[t,...r])).reduce(function(t,r){return h(r,0)+h(t,0)})/r.length},average:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(r=[].concat.apply([],[t,...r])).reduce(function(t,r){return h(r,0)+h(t,0)})/r.length},bindec:t,ceil:Math.ceil,cos:Math.cos,cosec:function(t){return Math.sin(1/t)},csc:function(t){return Math.sin(1/t)},cosh:Math.cosh,ctg:function(t){return Math.cos(t)/Math.sin(t)},cot:function(t){return Math.cos(t)/Math.sin(t)},cotan:function(t){return Math.cos(t)/Math.sin(t)},cotg:function(t){return Math.cos(t)/Math.sin(t)},ctn:function(t){return Math.cos(t)/Math.sin(t)},decbin:r,dechex:e,decoct:i,deg2rad:a,exp:Math.exp,expm1:Math.expm1,floor:Math.floor,int:Math.floor,fmod:function(t,r){return t%r},hexdec:_,hypot:g,if:function(t,r,n){t=0===t||1===t||!0===t||!1===t?t:u.execute(t);return t?u.execute(r):u.execute(n)},intdiv:function(t,r){return Math.trunc(Math.trunc(t)/Math.trunc(r))},ln:Math.log,lg:Math.log10,log:Math.log,log1p:Math.log1p,max:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(t=(t=Array.isArray(t)?t:[t,...r]).map(h),Math.max(...t))},min:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(t=(t=Array.isArray(t)?t:[t,...r]).map(h),Math.min(...t))},octdec:p,pi:function(){return Math.PI},pow:Math.pow,rad2deg:function(t){return 57.29577951308232*t},round:o,sin:Math.sin,sinh:Math.sinh,sec:function(t){return 1/Math.cos(t)},sqrt:Math.sqrt,tan:Math.tan,tanh:Math.tanh,tn:Math.tan,tg:Math.tan,lookuptable:function(t,r){var n,e=0,i=0,a=s.TMEPOJS;if(a&&(a=s&&s.jQuery&&s.jQuery.epoAPI&&s.jQuery.epoAPI.util.parseJSON(a.lookupTables))){if(Array.isArray(r)&&(i=r[1],r=r[0]),c(r))return 0;c(i)&&(i=0),t=Array.isArray(t)?(n=String(t[0]),String(t[1])):(n=String(t),""),(a=(a=a[r])&&a[i])&&(void 0===(r=(a=a.data)[n])&&n&&void 0!==n&&(n.isNumeric()&&0===h(n)?r=a[Object.keys(a)[0]]:n&&(r=a[n=u.find_lookup_table_index(n,a)])),void 0!==r)&&(t=t&&void 0!==t?u.find_lookup_table_index(t,r):Object.keys(r)[0],e=h("max"===t?r[Object.keys(r)[Object.keys(r).length-1]]:r[t]))}return e},concat:function(t,...r){return Array.isArray(t)&&0===t.length?A.trigger("Array must contain at least one element!","InvalidArgumentError",0):(Array.isArray(t)?t:[t,...r]).join("")}}},find_lookup_table_index:function(n,t){var r,e,i,t=Object.keys(t);if(i=(e=t)[e.length-1],e.every(function(t){return String(t).isNumeric()})||"max"===i){if(n=String(n).isNumeric()?h(n):n,r=t.map(function(t){return String(t).isNumeric()?h(t):t}).reduce(function(t,r){return"max"===r&&t<n?r:"max"===t&&r<n?t:t<r?t<n&&n<=r||r<n?r:t:r<n&&n<=t||t<n||"max"===r?t:r}),t=t.map(function(t){return String(t).isNumeric()?h(t):t}),n>Math.max(...t)||n<Math.min(...t))return!1}else r=n;return r},default_vars:function(){return{pi:3.141592653589793,e:2.718281828459045}},default_var_validation:function(t,r){return/boolean|number|string/.test(typeof r)||Array.isArray(r)||void 0===r?r:A.trigger("Variable ("+t+") type ("+l(r)+") is not scalar or array!",0)}},v=function(t,r){var n={tokens:[],input:"",operators:{},number_buffer:"",string_buffer:"",allow_negative:!0,in_single_quoted_string:!1,in_double_quoted_string:!1,is_number:function(t){return"0"<=t&&t<="9"},is_alpha:function(t){return"a"<=t&&t<="z"||"A"<=t&&t<="Z"||"_"===t},is_dot:function(t){return"."===t},is_lp:function(t){return"("===t},is_rp:function(t){return")"===t},is_comma:function(t){return","===t},empty_number_buffer_as_literal:function(){this.number_buffer.length&&(this.tokens.push(m(b.LITERAL,this.number_buffer)),this.number_buffer="")},empty_str_buffer_as_variable:function(){""!==this.string_buffer&&(this.tokens.push(m(b.VARIABLE,this.string_buffer)),this.string_buffer="")},tokenize:function(){var r=!1,n=this,e=[];return this.tokens=[],this.input.toString().split("").forEach(function(t){switch(!0){case n.in_single_quoted_string:"\\"===t?r=!r||(n.string_buffer+="\\",!1):"'"===t?r?(n.string_buffer+="'",r=!1):(n.tokens.push(m(b.STRING,n.string_buffer)),n.in_single_quoted_string=!1,n.string_buffer=""):(r&&(n.string_buffer+="\\",r=!1),n.string_buffer+=t);break;case n.in_double_quoted_string:"\\"===t?r=!r||(n.string_buffer+="\\",!1):'"'===t?r?(n.string_buffer+='"',r=!1):(n.tokens.push(m(b.STRING,n.string_buffer)),n.in_double_quoted_string=!1,n.string_buffer=""):(r&&(n.string_buffer+="\\",r=!1),n.string_buffer+=t);break;case"["===t:n.tokens.push(m(b.FUNCTION,"array")),n.allow_negative=!0,n.tokens.push(m(b.LEFTPARENTHESIS,""));break;case" "===t||"\n"===t||"\r"===t||"\t"===t:break;case n.is_number(t):""!==n.string_buffer?n.string_buffer+=t:(n.number_buffer+=t,n.allow_negative=!1);break;case"e"===t.toLowerCase():if(n.number_buffer.length&&-1!==n.number_buffer.indexOf(".")){n.number_buffer+="e",n.allow_negative=!1;break}case n.is_alpha(t):n.number_buffer.length&&(n.empty_number_buffer_as_literal(),n.tokens.push(m(b.OPERATOR,"*"))),n.allow_negative=!1,n.string_buffer+=t;break;case'"'===t:n.in_double_quoted_string=!0;break;case"'"===t:n.in_single_quoted_string=!0;break;case n.is_dot(t):n.number_buffer+=t,n.allow_negative=!1;break;case n.is_lp(t):""!==n.string_buffer?(n.tokens.push(m(b.FUNCTION,n.string_buffer)),n.string_buffer=""):n.number_buffer.length&&(n.empty_number_buffer_as_literal(),n.tokens.push(m(b.OPERATOR,"*"))),n.allow_negative=!0,n.tokens.push(m(b.LEFTPARENTHESIS,t));break;case n.is_rp(t)||"]"===t:n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),n.allow_negative=!1,n.tokens.push(m(b.RIGHTPARENTHESIS,t));break;case n.is_comma(t):n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),n.allow_negative=!0,n.tokens.push(m(b.PARAMSEPARATOR,t));break;default:if("-"===t||"+"===t){if(n.allow_negative){n.allow_negative=!1,n.tokens.push(m(b.OPERATOR,"-"===t?"uNeg":"uPos"));break}if(n.number_buffer&&"e"===n.number_buffer[n.number_buffer.length-1]){n.number_buffer+=t;break}}n.empty_number_buffer_as_literal(),n.empty_str_buffer_as_variable(),"$"!==t&&(0<n.tokens.length&&b.OPERATOR===n.tokens[n.tokens.length-1].type?n.tokens[n.tokens.length-1].value+=t:n.tokens.push(m(b.OPERATOR,t))),n.allow_negative=!0}}),this.empty_number_buffer_as_literal(),this.empty_str_buffer_as_variable(),this.tokens.forEach(function(t,r){e[r]=t.type}),e.forEach(function(t,r){0<r&&"space"===t&&"variable"===e[r+1]&&"variable"===e[r-1]&&(n.tokens[r]=new m(b.LITERAL,0),n.tokens.splice(r+1,1),n.tokens.splice(r-1,1))}),this},build_reverse_polish_notation:function(){var r,n,e,i=[],a=[],u=[],o=this;try{this.tokens.forEach(function(t){switch(t.type){case b.LITERAL:case b.VARIABLE:case b.STRING:i.push(t),0<u.length&&0===u[u.length-1]&&u.push(u.pop()+1);break;case b.FUNCTION:0<u.length&&0===u[u.length-1]&&u.push(u.pop()+1),a.push(t),u.push(0);break;case b.LEFTPARENTHESIS:a.push(t);break;case b.PARAMSEPARATOR:for(;b.LEFTPARENTHESIS!==a[a.length-1].type;){if(0===a.length)return A.trigger("Incorrect Brackets","IncorrectBracketsError",i);i.push(a.pop())}u.push(u.pop()+1);break;case b.OPERATOR:if(!f(t.value,o.operators))return A.trigger(t.value,"UnknownOperatorError",i);for(e=o.operators[t.value];0<a.length&&b.OPERATOR===a[a.length-1].type;){if(!f(a[a.length-1].value,o.operators))return A.trigger(a[a.length-1].value,"UnknownOperatorError",i);if(!(o.operators[a[a.length-1].value].priority>=e.priority))break;i.push(a.pop())}a.push(t);break;case b.RIGHTPARENTHESIS:for(;;)try{if(r=a.pop(),b.LEFTPARENTHESIS===r.type)break;i.push(r)}catch(t){return A.trigger("Incorrect Brackets","IncorrectBracketsError",i)}0<a.length&&b.FUNCTION===a[a.length-1].type&&((n=a.pop()).param_count=u.pop(),i.push(n));break;case b.SPACE:}})}catch(t){return i=[],A.trigger(t,"Error",i)}for(;0!==a.length;){if(b.LEFTPARENTHESIS===a[a.length-1].type||b.RIGHTPARENTHESIS===a[a.length-1].type)return A.trigger("Incorrect Brackets","IncorrectBracketsError",i);b.SPACE===a[a.length-1].type?a.pop():i.push(a.pop())}return i}};return n.input=t,n.operators=r,n},b={LITERAL:"literal",VARIABLE:"variable",OPERATOR:"operator",LEFTPARENTHESIS:"LP",RIGHTPARENTHESIS:"RP",FUNCTION:"function",PARAMSEPARATOR:"separator",STRING:"string",SPACE:"space"},m=function(t,r,n){var e={type:b.LITERAL,value:void 0,name:void 0,param_count:null};return e.type=t,e.value=r,e.name=n,e},d=function(t,r,n,e){var i={operator:"",is_right_assoc:!1,priority:0,function:null,places:0};return i.operator=t,i.is_right_assoc=r,i.priority=n,i.function=e,i.places=function(t){var r=/^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m;const n=/^\s*(_?)(.+?)\1\s*$/;return((t||"").toString().replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,"").match(r)||["","",""])[2].split(/,/).map(function(t){return t.replace(n,function(t,r,n){return n.split("=")[0].trim()})}).filter(String).length}(e),i.execute=function(t){var r,n,e=[];if(t.length<this.places)return t.splice(0,t.length),A.trigger("Incorrect Expression","IncorrectExpressionError",new m(b.LITERAL,0));for(r=0;r<this.places;r++)e.unshift(t.pop().value);return n=this.function.apply(null,e),"number"!==l(n)&&"string"!==l(n)&&(n=0),new m(b.LITERAL,n)},i},E=function(t,r){var n={name:"",function:void 0,required_param_count:void 0};return n.name=t,n.function=r,n.required_param_count=r.length,n.execute=function(t,r){var n,e,i,a=[];if((r=r<this.required_param_count?this.required_param_count:r)<this.required_param_count)return t.splice(0,t.length),A.trigger(this.name,"IncorrectNumberOfFunctionParametersError",new m(b.LITERAL,0));if(0<r)for(n=0;n<r;n++)null===(e=t.length?t.pop().value:0)?a.push(e="0"):a.unshift(e);return i=this.function.apply(null,a),m(b.LITERAL,i=i!==1/0&&i!==-1/0?i:0)},n},y=function(t,r){var n={functions:{},operators:{}};return n.functions=t,n.operators=r,n.calculate=function(t,e,i=null,a=!1){var u=this,o=[];if(c(t))return 0;try{t.forEach(function(t){var r,n;if(b.LITERAL===t.type||b.STRING===t.type)o.push(t);else if(b.VARIABLE===t.type)r=t.value,n=null,f(r,e)?n=e[r]:i&&"function"==typeof i?n=i(r):(a.variables[n=r]=n,e[r]=n),o.push(m(b.LITERAL,n,r));else if(b.FUNCTION===t.type){if(!f(t.value,u.functions)){if(a.add_function(t.value,function(){return 0}),u.functions=a.functions,!f(t.value,u.functions))return A.trigger(t.value,"UnknownFunctionError",0);A.trigger(t.value,"UnknownFunctionError",0)}o.push(u.functions[t.value].execute(o,t.param_count))}else if(b.OPERATOR===t.type){if(!f(t.value,u.operators))return A.trigger(t.value,"UnknownOperatorError",0);o.push(u.operators[t.value].execute(o))}})}catch(t){s.TMEPOJS&&s.TMEPOJS.WP_DEBUG&&s.console.log(t)}return null!=(t=o.pop())&&c(o)?(!1===t.value&&(t.value=0),!0===t.value&&(t.value=1),"string"===l(t.value)&&t.value.isNumeric()&&(t.value=h(t.value)),t.value):A.trigger("Stack must be empty","IncorrectExpressionError",0)},n},A={trigger:function(t,r="",n=!1){return s.TMEPOJS&&s.TMEPOJS.WP_DEBUG&&(s.console.log(r+"\n"+t),s.console.trace()),s.TMEPOGLOBALADMINJS&&s.TMEPOGLOBALADMINJS.WP_DEBUG?t:n}};s.tcmexp=u.construct()}(window);assets/js/jquery.mask.min.js000064400000016154150755142450012072 0ustar00!function(t,a,e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports&&"undefined"==typeof Meteor?window.module.exports=t(window.require("jquery")):t(a||e)}(function(r){"use strict";function i(u,M,y){var s,o,w=this,b={invalid:[],getCaret:function(){var t,a,e,n,s=0;try{return a=u.get(0),e=document.selection,n=a.selectionStart,e&&-1===navigator.appVersion.indexOf("MSIE 10")?((t=e.createRange()).moveStart("character",-b.val().length),s=t.text.length):!n&&"0"!==n||(s=n),s}catch(t){window.console.log(t)}},setCaret:function(t){var a,e;try{u.is(":focus")&&((e=u.get(0)).setSelectionRange?e.setSelectionRange(t,t):((a=e.createTextRange()).collapse(!0),a.moveEnd("character",t),a.moveStart("character",t),a.select()))}catch(t){window.console.log(t)}},events:function(){u.on("keydown.mask",function(t){u.data("mask-keycode",t.keyCode||t.which),u.data("mask-previus-value",u.val()),u.data("mask-previus-caret-pos",b.getCaret()),b.maskDigitPosMapOld=b.maskDigitPosMap}).on(r.jMaskGlobals.useInput?"input.mask":"keyup.mask",b.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){u.keydown().keyup()},100)}).on("change.mask",function(){u.data("changed",!0)}).on("blur.mask",function(){o===b.val()||u.data("changed")||u.trigger("change"),u.data("changed",!1)}).on("blur.mask",function(){o=b.val()}).on("focus.mask",function(t){!0===y.selectOnFocus&&r(t.target).select()}).on("focusout.mask",function(){y.clearIfNotMatch&&!s.test(b.val())&&b.val("")})},getRegexMask:function(){for(var t,a,e,n,s,o=[],r=0;r<M.length;r+=1)(e=w.translation[M.charAt(r)])?(t=e.pattern.toString().replace(/.{1}$|^.{1}/g,""),a=e.optional,(e=e.recursive)?(o.push(M.charAt(r)),n={digit:M.charAt(r),pattern:t}):o.push(a||e?t+"?":t)):o.push(M.charAt(r).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));return s=o.join(""),n&&(s=s.replace(new RegExp("("+n.digit+"(.*"+n.digit+")?)"),"($1)?").replace(new RegExp(n.digit,"g"),n.pattern)),new RegExp(s)},destroyEvents:function(){u.off(["input","keydown","keyup","paste","drop","blur","focusout",""].join(".mask "))},val:function(t){var a=u.is("input")?"val":"text",t=0<arguments.length?(u[a]()!==t&&u[a](t),u):u[a]();return t},calculateCaretPosition:function(t){var a,e,n=b.getMasked(),s=b.getCaret(),o=0,r=0,i=0,l=0,c=0;if(t!==n){for(a=u.data("mask-previus-caret-pos")||0,e=n.length,n=t.length,c=s;c<e&&b.maskDigitPosMap[c];c+=1)r+=1;for(c=s-1;0<=c&&b.maskDigitPosMap[c];--c)o+=1;for(c=s-1;0<=c;--c)b.maskDigitPosMap[c]&&(i+=1);for(c=a-1;0<=c;--c)b.maskDigitPosMapOld[c]&&(l+=1);n<s?s=10*e:s<=a&&a!==n?b.maskDigitPosMapOld[s]||(t=s,b.maskDigitPosMap[s=s-(l-i)-o]&&(s=t)):a<s&&(s=s+(i-l)+r)}return s},behaviour:function(t){var a,e,n=u.data("mask-keycode");if(t=t||window.event,b.invalid=[],-1===r.inArray(n,w.byPassKeys))return n=b.getMasked(),e=b.getCaret(),a=u.data("mask-previus-value")||"",setTimeout(function(){b.setCaret(b.calculateCaretPosition(a))},r.jMaskGlobals.keyStrokeCompensation),b.val(n),b.setCaret(e),b.callbacks(t)},getMasked:function(t,a){for(var e,n,s,o,r,i=[],l=void 0===a?b.val():a+"",c=0,u=M.length,d=0,k=l.length,p=1,h="push",f=-1,g=0,v=[],m=y.reverse?(h="unshift",p=-1,e=0,c=u-1,d=k-1,function(){return-1<c&&-1<d}):(e=u-1,function(){return c<u&&d<k});m();)s=M.charAt(c),o=l.charAt(d),(r=w.translation[s])?(o.match(r.pattern)?(i[h](o),r.recursive&&(-1===f?f=c:c===e&&c!==f&&(c=f-p),e===f)&&(c-=p),c+=p):o===n?(g-=1,n=void 0):r.optional?(c+=p,d-=p):r.fallback?(i[h](r.fallback),c+=p,d-=p):b.invalid.push({p:d,v:o,e:r.pattern}),d+=p):(t||i[h](s),o===s?(v.push(d),d+=p):(n=s,v.push(d+g),g+=1),c+=p);return a=M.charAt(e),u!==k+1||w.translation[a]||i.push(a),a=i.join(""),b.mapMaskdigitPositions(a,v,k),a},mapMaskdigitPositions:function(t,a,e){var n,s=y.reverse?t.length-e:0;for(b.maskDigitPosMap={},n=0;n<a.length;n+=1)b.maskDigitPosMap[a[n]+s]=1},callbacks:function(t){function a(t,a,e){"function"==typeof y[t]&&a&&y[t].apply(this,e)}var e=b.val(),n=e!==o,s=[e,t,u,y];a("onChange",!0==n,s),a("onKeyPress",!0==n,s),a("onComplete",e.length===M.length,s),a("onInvalid",0<b.invalid.length,[e,t,u,b.invalid,y])}};u=r(u),o=b.val(),M="function"==typeof M?M(b.val(),void 0,u,y):M,w.mask=M,w.options=y,w.remove=function(){var t=b.getCaret();return w.options.placeholder&&u.removeAttr("placeholder"),u.data("mask-maxlength")&&u.removeAttr("maxlength"),b.destroyEvents(),b.val(w.getCleanVal()),b.setCaret(t),u},w.getCleanVal=function(){return b.getMasked(!0)},w.getMaskedVal=function(t){return b.getMasked(!1,t)},w.init=function(t){var a,e,n;if(t=t||!1,y=y||{},w.clearIfNotMatch=r.jMaskGlobals.clearIfNotMatch,w.byPassKeys=r.jMaskGlobals.byPassKeys,w.translation=r.extend({},r.jMaskGlobals.translation,y.translation),w=r.extend(!0,{},w,y),s=b.getRegexMask(),t)b.events(),b.val(b.getMasked());else{for(y.placeholder&&u.attr("placeholder",y.placeholder),u.data("mask")&&u.attr("autocomplete","off"),n=!(a=0);a<M.length;a+=1)if((e=w.translation[M.charAt(a)])&&e.recursive){n=!1;break}n&&u.attr("maxlength",M.length).data("mask-maxlength",!0),b.destroyEvents(),b.events(),t=b.getCaret(),b.val(b.getMasked()),b.setCaret(t)}},w.init(!u.is("input"))}function l(t,a,e){var n=r(t).data("mask"),s=o.stringify,t=r(t).val()||r(t).text();e=e||{};try{return"function"==typeof a&&(a=a(t)),"object"!=typeof n||s(n.options)!==s(e)||n.mask!==a}catch(t){window.console.log(t)}}function a(){var t=r(this),a={},e="data-mask-",n=t.attr("data-mask");if(t.attr(e+"reverse")&&(a.reverse=!0),t.attr(e+"clearifnotmatch")&&(a.clearIfNotMatch=!0),"true"===t.attr(e+"selectonfocus")&&(a.selectOnFocus=!0),t.attr(e+"placeholder")&&(a.placeholder=t.attr(e+"placeholder")),l(t,n,a))return t.data("mask",new i(this,n,a))}var t,e,n,o=window.JSON;r.maskWatchers={},r.fn.mask=function(t,a){var e=this.selector,n=r.jMaskGlobals,s=n.watchInterval,n=(a=a||{}).watchInputs||n.watchInputs,o=function(){if(l(this,t,a))return r(this).data("mask",new i(this,t,a))};return r(this).each(o),e&&""!==e&&n&&(clearInterval(r.maskWatchers[e]),r.maskWatchers[e]=setInterval(function(){r(document).find(e).each(o)},s)),this},r.fn.masked=function(t){return this.data("mask").getMaskedVal(t)},r.fn.unmask=function(){return clearInterval(r.maskWatchers[this.selector]),delete r.maskWatchers[this.selector],this.each(function(){var t=r(this).data("mask");t&&t.remove().removeData("mask")})},r.fn.cleanVal=function(){return this.data("mask").getCleanVal()},r.applyDataMask=function(t){((t=t||r.jMaskGlobals.maskElements)instanceof r?t:r(t)).filter(r.jMaskGlobals.dataMaskAttr).each(a)},t={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,keyStrokeCompensation:10,useInput:!/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent)&&(t="input",n=document.createElement("div"),(e=(t="on"+t)in n)||(n.setAttribute(t,"return;"),e="function"==typeof n[t]),n=null,e),watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}},r.jMaskGlobals=r.jMaskGlobals||{},(t=r.jMaskGlobals=r.extend(!0,{},t,r.jMaskGlobals)).dataMask&&r.applyDataMask(),setInterval(function(){r.jMaskGlobals.watchDataMask&&r.applyDataMask()},t.watchInterval)},window.jQuery,window.Zepto);assets/js/tm-epo-product.js000064400000063342150755142450011717 0ustar00/* global wc_add_to_cart_variation_params */

( function( $, window, document ) {
	'use strict';
	/**
	 * Handles variation forms and attributes.
	 *
	 * @param {Object} $form                     The product form
	 * @param {Object} element                   The product element
	 * @param {Object} currentCart               The current cart form
	 * @param {Object} variableProductContainers The container for the variable product
	 * @param {Object} epoObject                 The EPO Object
	 */
	var VariationForm = function( $form, element, currentCart, variableProductContainers, epoObject ) {
		var self = this;

		self.field = element;
		self.currentCart = currentCart;
		self.variableProductContainers = variableProductContainers;
		self.epoObject = epoObject;
		self.$form = $form;
		self.$wrap = $form.closest( '.tc-epo-element-product-container-wrap' );
		self.$attributeFields = $form.find( '.tc-epo-variable-product-selector' );
		self.$singleVariation = $form.find( '.tc-epo-element-single-variation' );
		self.$resetVariations = $form.find( '.tc-epo-element-variable-reset-variations' );
		self.variationData = $form.data( 'product_variations' );

		self.useAjax = false === self.variationData;
		self.xhr = false;
		self.loading = true;
		self.variationId = $form.closest( '.tc-epo-element-product-li-container' ).find( '.tc-epo-element-product-container-variation-id input.product-variation-id' );

		// Methods.
		self.getChosenAttributes = self.getChosenAttributes.bind( self );
		self.findMatchingVariations = self.findMatchingVariations.bind( self );
		self.isMatch = self.isMatch.bind( self );
		self.toggleResetLink = self.toggleResetLink.bind( self );

		// Events.
		$form.on( 'click.tc-variation-form', '.tc-epo-element-variable-reset-variations', { variationForm: self }, self.onReset );
		$form.on( 'tc_hide_variation', { variationForm: self }, self.onHide );
		$form.on( 'tc_show_variation', { variationForm: self }, self.onShow );
		$form.on( 'tc_reset_data', { variationForm: self }, self.onResetDisplayedVariation );
		$form.on( 'tc_reset_image', { variationForm: self }, self.onResetImage );
		$form.on( 'change.tc-variation-form', '.tc-epo-variable-product-selector', { variationForm: self }, self.onChange );
		$form.on( 'tc_found_variation.tc-variation-form', { variationForm: self }, self.onFoundVariation );
		$form.on( 'tc_check_variations.tc-variation-form', { variationForm: self }, self.onFindVariation );
		$form.on( 'tc_update_variation_values.tc-variation-form', { variationForm: self }, self.onUpdateAttributes );
		$form.on( 'refresh.tc-variation-form', { variationForm: self }, self.onRefreshContainer );
		$form.on( 'update_field.tc-variation-form', { variationForm: self }, self.onUpdateField );

		self.variationId.val( '' );

		// Init after gallery.
		setTimeout( function() {
			$form.trigger( 'refresh' );
			$form.trigger( 'tc_variation_form' );
			self.loading = false;
		}, 100 );
	};

	/**
	 * Refresh variations container
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onRefreshContainer = function( event ) {
		var form = event.data.variationForm;

		form.variableProductContainers.find( '.tc-epo-element-product-container' ).removeClass( 'variations_form' );

		form.$form.addClass( 'variations_form' );

		form.$form.trigger( 'tc_check_variations.tc-variation-form' );
	};

	/**
	 * Reset all fields.
	 *
	 * @param {Event}  event     The event Object.
	 * @param {Object} variation The variation Object.
	 */
	VariationForm.prototype.onUpdateField = function( event, variation ) {
		var form = event.data.variationForm;
		var field = form.field;
		var associatedSetter;
		var associatedPrice;
		var associatedRawPrice;
		var associatedOriginalPrice;
		var associatedRawOriginalPrice;

		event.preventDefault();

		if ( ! variation ) {
			associatedSetter = field;
			if ( field.is( 'select' ) ) {
				associatedSetter = field.find( 'option:selected' );
			}

			associatedPrice = 0;
			associatedRawPrice = 0;
			associatedOriginalPrice = 0;
			associatedRawOriginalPrice = 0;

			field.data( 'price_set', 1 );
			associatedSetter.data( 'associated_price_set', 1 );
			associatedSetter.data( 'price_set', 1 );
			associatedSetter.data( 'raw_price', associatedRawPrice );
			associatedSetter.data( 'raw_original_price', associatedRawOriginalPrice );
			associatedSetter.data( 'price', associatedPrice );
			associatedSetter.data( 'original_price', associatedOriginalPrice );

			field.data( 'price-changed', 1 );

			form.$form.trigger( {
				type: 'tm-epo-update',
				norules: 2
			} );
			form.currentCart.trigger( {
				type: 'tm-epo-update',
				norules: 2
			} );
		}
	};

	/**
	 * Reset all fields.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onReset = function( event ) {
		event.preventDefault();
		event.data.variationForm.$attributeFields.val( '' ).trigger( 'change' );
		event.data.variationForm.$form.trigger( 'tc_reset_data' );
	};

	/**
	 * When a variation is hidden.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onHide = function( event ) {
		event.preventDefault();
	};
	/**
	 * When a variation is shown.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onShow = function( event ) {
		event.preventDefault();
	};
	/**
	 * When displayed variation data is reset.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onResetDisplayedVariation = function( event ) {
		var form = event.data.variationForm;
		form.$form.find( '.product-meta' ).find( '.tc-product-sku' ).tc_reset_content();
		form.$form.trigger( 'tc_reset_image' );
		form.$singleVariation.slideUp( 200 ).trigger( 'tc_hide_variation' );
	};

	/**
	 * When the product image is reset.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onResetImage = function( event ) {
		event.data.variationForm.$form.tc_variations_image_update( false );
	};

	/**
	 * Looks for matching variations for current selected attributes.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onFindVariation = function( event ) {
		var form = event.data.variationForm;
		var attributes = form.getChosenAttributes();
		var currentAttributes = attributes.data;
		var cpfElement;
		var matching_variations;
		var variation;

		if ( attributes.count === attributes.chosenCount ) {
			if ( form.useAjax ) {
				if ( typeof wc_add_to_cart_variation_params === 'undefined' ) {
					return;
				}
				if ( form.xhr ) {
					form.xhr.abort();
				}
				cpfElement = form.$form.closest( '.cpf-type-product' );
				form.$form.block( { message: null, overlayCSS: { background: '#fff', opacity: 0.6 } } );
				currentAttributes.product_id = parseInt( form.$form.data( 'product_id' ), 10 );
				currentAttributes.discount = cpfElement.attr( 'data-discount' );
				currentAttributes.discount_type = cpfElement.attr( 'data-discount-type' );
				currentAttributes.discount_exclude_addons = cpfElement.attr( 'data-discount-exclude-addons' );

				form.xhr = $.ajax( {
					url: wc_add_to_cart_variation_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_variation' ),
					type: 'POST',
					data: currentAttributes,
					success: function( svariation ) {
						if ( svariation ) {
							form.$form.trigger( 'tc_found_variation', [ svariation ] );
						} else {
							form.$form.trigger( 'tc_reset_data' );
							attributes.chosenCount = 0;

							if ( ! form.loading ) {
								form.$form.find( '.tc-epo-element-single-variation' ).after( '<p class="wc-no-matching-variations woocommerce-info">' + wc_add_to_cart_variation_params.i18n_no_matching_variations_text + '</p>' );
								form.$form.find( '.wc-no-matching-variations' ).slideDown( 200 );
								form.$form.trigger( 'update_field', [] );
							}
						}
					},
					complete: function() {
						form.$form.unblock();
					}
				} );
			} else {
				form.$form.trigger( 'tc_update_variation_values' );

				matching_variations = form.findMatchingVariations( form.variationData, currentAttributes );
				variation = matching_variations.shift();

				if ( variation ) {
					form.$form.trigger( 'tc_found_variation', [ variation ] );
				} else {
					form.$form.trigger( 'tc_reset_data' );
					attributes.chosenCount = 0;

					if ( ! form.loading ) {
						form.$form.find( '.tc-epo-element-single-variation' ).after( '<p class="wc-no-matching-variations woocommerce-info">' + wc_add_to_cart_variation_params.i18n_no_matching_variations_text + '</p>' );
						form.$form.find( '.wc-no-matching-variations' ).slideDown( 200 );
					}
				}
			}
		} else {
			form.variationId.val( '' ).trigger( 'change' );
			form.$form.trigger( 'tc_update_variation_values' );
			form.$form.trigger( 'tc_reset_data' );
			form.$form.trigger( 'update_field', [] );
		}

		// Show reset link.
		form.toggleResetLink( attributes.chosenCount > 0 );
	};

	/**
	 * Triggered when a variation has been found which matches all attributes.
	 *
	 * @param {Event}  event     The event Object.
	 * @param {Object} variation The variation Object.
	 */
	VariationForm.prototype.onFoundVariation = function( event, variation ) {
		var form = event.data.variationForm,
			$sku = form.$form.find( '.product-meta' ).find( '.tc-product-sku' ),
			$qtyWrap = form.$wrap.find( '.tm-quantity-alt' ),
			$qty = $qtyWrap.find( 'input.tm-qty-alt' ),
			qtyMin = $.epoAPI.math.toInt( $qty.attr( 'data-min' ) ),
			qtyMax = $.epoAPI.math.toInt( $qty.attr( 'data-max' ) ),
			dataQtyMax = $qty.attr( 'data-max' ),
			purchasable = true,
			template = false,
			$template_html = '';

		if ( variation.sku ) {
			$sku.tc_set_content( variation.sku );
		} else {
			$sku.tc_reset_content();
		}

		form.$form.tc_variations_image_update( variation );
		if ( ! variation.variation_is_visible ) {
			template = wpTemplate( 'unavailable-variation-template' );
		} else {
			template = wpTemplate( 'variation-template' );
		}

		if ( form.field.attr( 'data-no-price' ) ) {
			variation.display_price = '';
			variation.display_regular_price = '';
			variation.price_html = '';
		}

		form.$form.find( '.tc-epo-element-product-container-cart' ).find( '.stock' ).remove();

		$template_html = template( {
			variation: variation
		} );
		$template_html = $template_html.replace( '/*<![CDATA[*/', '' );
		$template_html = $template_html.replace( '/*]]>*/', '' );
		form.$singleVariation.html( $template_html );
		form.variationId.val( variation.variation_id ).trigger( 'change' );

		// Hide or show qty input
		if ( variation.is_sold_individually === 'yes' ) {
			$qty.val( '1' ).attr( 'min', '1' ).attr( 'max', '1' );
			$qtyWrap.hide();
		} else {
			if ( variation.min_qty !== '' && variation.min_qty > qtyMin && qtyMin > 0 ) {
				qtyMin = variation.min_qty;
			}

			if ( variation.max_qty !== '' && variation.max_qty < qtyMax ) {
				qtyMax = variation.max_qty;
			}

			if ( qtyMin !== '' ) {
				$qty.attr( 'min', qtyMin );
			} else {
				$qty.removeAttr( 'min' );
			}
			if ( dataQtyMax !== '' ) {
				$qty.attr( 'max', qtyMax );
			} else {
				$qty.removeAttr( 'max' );
			}

			if ( qtyMax && $.epoAPI.math.toInt( $qty.val() ) > qtyMax ) {
				$qty.val( qtyMax );
			}
			if ( qtyMin > $.epoAPI.math.toInt( $qty.val() ) ) {
				$qty.val( qtyMin );
			}
			$qtyWrap.show();
		}

		if ( ! variation.is_purchasable || ! variation.is_in_stock || ! variation.variation_is_visible ) {
			purchasable = false;
			$qty.val( '0' ).attr( 'min', '0' ).attr( 'max', '0' );
			$qtyWrap.hide();
		}

		$qty.trigger( 'change' );

		// Reveal
		if ( $.epoAPI.util.trim( form.$singleVariation.text() ) ) {
			form.$singleVariation.slideDown( 200 ).trigger( 'tc_show_variation', [ variation, purchasable ] );
		} else {
			form.$singleVariation.show().trigger( 'tc_show_variation', [ variation, purchasable ] );
		}
		form.$form.trigger( 'update_field', [ variation ] );
	};

	/**
	 * Triggered when an attribute field changes.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onChange = function( event ) {
		var form = event.data.variationForm;
		var field = form.field;

		form.variationId.val( '' ).trigger( 'change' );
		form.$form.find( '.wc-no-matching-variations' ).remove();

		if ( form.useAjax ) {
			form.$form.trigger( 'tc_check_variations' );
		} else {
			form.$form.trigger( 'woocommerce_variation_select_change' );
			form.$form.trigger( 'tc_check_variations' );
		}

		// Custom event for when variation selection has been changed
		form.$form.trigger( 'woocommerce_variation_has_changed' );

		setTimeout( function() {
			field.closest( '.tcowl-carousel' ).trigger( 'refresh.owl.carousel' );
		}, 50 );
	};

	/**
	 * Updates attributes in the DOM to show valid values.
	 *
	 * @param {Event} event The event Object.
	 */
	VariationForm.prototype.onUpdateAttributes = function( event ) {
		var form = event.data.variationForm,
			attributes = form.getChosenAttributes(),
			currentAttributes = attributes.data;

		if ( form.useAjax ) {
			return;
		}

		// Loop through selects and disable/enable options based on selections.
		form.$attributeFields.each( function( index, el ) {
			var current_attr_select = $( el );
			var current_attr_name = current_attr_select.data( 'attribute_name' ) || current_attr_select.attr( 'name' );
			var show_option_none = $( el ).data( 'show_option_none' );
			var option_gt_filter = ':gt(0)';
			var attached_options_count = 0;
			var new_attr_select = $( '<select/>' );
			var selected_attr_val = current_attr_select.val() || '';
			var selected_attr_val_valid = true;
			var refSelect;
			var checkAttributes;
			var variations;
			var num;
			var i;
			var len;
			var variationAttributes;
			var attr_name;
			var attr_val;
			var variation_active;
			var $option_elements;
			var $option_element;
			var option_value;

			// Reference options set at first.
			if ( ! current_attr_select.data( 'attribute_html' ) ) {
				refSelect = current_attr_select.clone();

				refSelect.find( 'option' ).prop( 'disabled', false ).prop( 'selected', false ).removeAttr( 'attached' );

				current_attr_select.data( 'attribute_options', refSelect.find( 'option' + option_gt_filter ).get() ); // Legacy data attribute.
				current_attr_select.data( 'attribute_html', refSelect.html() );
			}

			new_attr_select.html( current_attr_select.data( 'attribute_html' ) );

			// The attribute of this select field should not be taken into account when calculating its matching variations:
			// The constraints of this attribute are shaped by the values of the other attributes.
			checkAttributes = $.extend( true, {}, currentAttributes );

			checkAttributes[ current_attr_name ] = '';

			variations = form.findMatchingVariations( form.variationData, checkAttributes );

			// Loop through variations.
			for ( num in variations ) {
				if ( typeof variations[ num ] !== 'undefined' ) {
					variationAttributes = variations[ num ].attributes;

					for ( attr_name in variationAttributes ) {
						if ( Object.prototype.hasOwnProperty.call( variationAttributes, attr_name ) ) {
							attr_val = variationAttributes[ attr_name ];
							variation_active = '';

							if ( attr_name === current_attr_name ) {
								if ( variations[ num ].variation_is_active ) {
									variation_active = 'enabled';
								}

								if ( attr_val ) {
									// Decode entities.
									attr_val = $( '<div/>' ).html( attr_val ).text();

									// Attach to matching options by value. This is done to compare
									// TEXT values rather than any HTML entities.
									$option_elements = new_attr_select.find( 'option' );
									if ( $option_elements.length ) {
										for ( i = 0, len = $option_elements.length; i < len; i++ ) {
											$option_element = $( $option_elements[ i ] );
											option_value = $option_element.val();

											if ( attr_val === option_value ) {
												$option_element.addClass( 'attached ' + variation_active );
												break;
											}
										}
									}
								} else {
									// Attach all apart from placeholder.
									new_attr_select.find( 'option:gt(0)' ).addClass( 'attached ' + variation_active );
								}
							}
						}
					}
				}
			}

			// Count available options.
			attached_options_count = new_attr_select.find( 'option.attached' ).length;

			// Check if current selection is in attached options.
			if ( selected_attr_val ) {
				selected_attr_val_valid = false;

				if ( 0 !== attached_options_count ) {
					new_attr_select.find( 'option.attached.enabled' ).each( function() {
						var thisVal = $( this ).val();

						if ( selected_attr_val === thisVal ) {
							selected_attr_val_valid = true;
							return false; // break.
						}
					} );
				}
			}

			/**
			 * Detach the placeholder if:
			 * - Valid options exist.
			 * - The current selection is non-empty.
			 * - The current selection is valid.
			 * - Placeholders are not set to be permanently visible.
			 */
			if ( attached_options_count > 0 && selected_attr_val && selected_attr_val_valid && 'no' === show_option_none ) {
				new_attr_select.find( 'option:first' ).remove();
				option_gt_filter = '';
			}

			// Detach unattached.
			new_attr_select.find( 'option' + option_gt_filter + ':not(.attached)' ).remove();

			// Finally, copy to DOM and set value.
			current_attr_select.html( new_attr_select.html() );
			current_attr_select.find( 'option' + option_gt_filter + ':not(.enabled)' ).prop( 'disabled', true );

			// Choose selected value.
			if ( selected_attr_val ) {
				// If the previously selected value is no longer available, fall back to the placeholder (it's going to be there).
				if ( selected_attr_val_valid ) {
					current_attr_select.val( selected_attr_val );
				} else {
					current_attr_select.val( '' ).trigger( 'change' );
				}
			} else {
				current_attr_select.val( '' ); // No change event to prevent infinite loop.
			}
		} );

		// Custom event for when variations have been updated.
		form.$form.trigger( 'woocommerce_update_variation_values' );
	};

	/**
	 * Get chosen attributes from form.
	 */
	VariationForm.prototype.getChosenAttributes = function() {
		var data = {};
		var count = 0;
		var chosen = 0;

		this.$attributeFields.each( function() {
			var attribute_name = $( this ).data( 'attribute_name' ) || $( this ).attr( 'name' );
			var value = $( this ).val() || '';

			if ( value.length > 0 ) {
				chosen++;
			}

			count++;
			data[ attribute_name ] = value;
		} );

		return {
			count: count,
			chosenCount: chosen,
			data: data
		};
	};

	/**
	 * Find matching variations for attributes.
	 *
	 * @param {Array} variations Variations.
	 * @param {Array} attributes attributes.
	 */
	VariationForm.prototype.findMatchingVariations = function( variations, attributes ) {
		var matching = [];
		var i;
		var variation;
		for ( i = 0; i < variations.length; i++ ) {
			variation = variations[ i ];

			if ( this.isMatch( variation.attributes, attributes ) ) {
				matching.push( variation );
			}
		}
		return matching;
	};

	/**
	 * See if attributes match.
	 *
	 * @param {Array} variation_attributes Variation attributes.
	 * @param {Array} attributes           attributes.
	 */
	VariationForm.prototype.isMatch = function( variation_attributes, attributes ) {
		var match = true;
		var val1;
		var val2;
		var attr_name;
		for ( attr_name in variation_attributes ) {
			if ( Object.prototype.hasOwnProperty.call( variation_attributes, attr_name ) ) {
				val1 = variation_attributes[ attr_name ];
				val2 = attributes[ attr_name ];
				if ( val1 !== undefined && val2 !== undefined && val1.length !== 0 && val2.length !== 0 && val1 !== val2 ) {
					match = false;
				}
			}
		}
		return match;
	};

	/**
	 * Show or hide the reset link.
	 *
	 * @param {bool} on true or false.
	 */
	VariationForm.prototype.toggleResetLink = function( on ) {
		if ( on ) {
			if ( this.$resetVariations.css( 'visibility' ) === 'hidden' ) {
				this.$resetVariations.css( 'visibility', 'visible' ).hide().fadeIn();
			}
		} else {
			this.$resetVariations.css( 'visibility', 'hidden' );
		}
	};

	/**
	 * Function to call tc_variation_form on jquery selector.
	 *
	 * @param {Object} element                   The product element
	 * @param {Object} currentCart               The current cart form
	 * @param {Object} variableProductContainers The container for the variable product
	 * @param {Object} thisEpoObject             The EPO Object
	 */
	$.fn.tc_product_variation_form = function( element, currentCart, variableProductContainers, thisEpoObject ) {
		new VariationForm( this, element, currentCart, variableProductContainers, thisEpoObject );
		this.trigger( 'tc_product_variation_form' );
		return this;
	};

	/**
	 * Stores the default text for an element so it can be reset later
	 *
	 * @param {string} content Content to set.
	 */
	$.fn.tc_set_content = function( content ) {
		if ( undefined === this.attr( 'data-o_content' ) ) {
			this.attr( 'data-o_content', this.text() );
		}
		this.text( content );
	};
	/**
	 * Stores the default text for an element so it can be reset later
	 */
	$.fn.tc_reset_content = function() {
		if ( undefined !== this.attr( 'data-o_content' ) ) {
			this.text( this.attr( 'data-o_content' ) );
		}
	};

	/**
	 * Stores a default attribute for an element so it can be reset later
	 *
	 * @param {string} attr  Attribute name.
	 * @param {string} value Value name.
	 */
	$.fn.tc_set_variation_attr = function( attr, value ) {
		if ( undefined === this.attr( 'data-o_' + attr ) ) {
			this.attr( 'data-o_' + attr, ! this.attr( attr ) ? '' : this.attr( attr ) );
		}
		if ( false === value ) {
			this.removeAttr( attr );
		} else {
			this.attr( attr, value );
		}
	};

	/**
	 * Reset a default attribute for an element so it can be reset later
	 *
	 * @param {string} attr Attribute name.
	 */
	$.fn.tc_reset_variation_attr = function( attr ) {
		if ( undefined !== this.attr( 'data-o_' + attr ) ) {
			this.attr( attr, this.attr( 'data-o_' + attr ) );
		}
	};
	/**
	 * Sets product images for the chosen variation
	 *
	 * @param {Object} variation variation object.
	 */
	$.fn.tc_variations_image_update = function( variation ) {
		var $form = this,
			$product_img_wrap = $form.find( '.tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),
			$product_img = $product_img_wrap.find( '.wp-post-image' ),
			$product_link = $product_img_wrap.find( 'a' ).eq( 0 );

		if ( variation && variation.image && variation.image.src && variation.image.src.length > 1 ) {
			$product_img.tc_set_variation_attr( 'src', variation.image.src );
			$product_img.tc_set_variation_attr( 'height', variation.image.src_h );
			$product_img.tc_set_variation_attr( 'width', variation.image.src_w );
			$product_img.tc_set_variation_attr( 'srcset', variation.image.srcset );
			$product_img.tc_set_variation_attr( 'sizes', variation.image.sizes );
			$product_img.tc_set_variation_attr( 'title', variation.image.title );
			$product_img.tc_set_variation_attr( 'data-caption', variation.image.caption );
			$product_img.tc_set_variation_attr( 'alt', variation.image.alt );
			$product_img.tc_set_variation_attr( 'data-src', variation.image.full_src );
			$product_img.tc_set_variation_attr( 'data-large_image', variation.image.full_src );
			$product_img.tc_set_variation_attr( 'data-large_image_width', variation.image.full_src_w );
			$product_img.tc_set_variation_attr( 'data-large_image_height', variation.image.full_src_h );
			$product_img_wrap.tc_set_variation_attr( 'data-thumb', variation.image.src );
			$product_link.tc_set_variation_attr( 'href', variation.image.full_src );
		} else {
			$form.tc_variations_image_reset();
		}
	};

	/**
	 * Reset main image to defaults.
	 */
	$.fn.tc_variations_image_reset = function() {
		var $form = this,
			$product_img_wrap = $form.find( '.tc-product-image, .woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),
			$product_img = $product_img_wrap.find( '.wp-post-image' ),
			$product_link = $product_img_wrap.find( 'a' ).eq( 0 );

		$product_img.tc_reset_variation_attr( 'src' );
		$product_img.tc_reset_variation_attr( 'width' );
		$product_img.tc_reset_variation_attr( 'height' );
		$product_img.tc_reset_variation_attr( 'srcset' );
		$product_img.tc_reset_variation_attr( 'sizes' );
		$product_img.tc_reset_variation_attr( 'title' );
		$product_img.tc_reset_variation_attr( 'data-caption' );
		$product_img.tc_reset_variation_attr( 'alt' );
		$product_img.tc_reset_variation_attr( 'data-src' );
		$product_img.tc_reset_variation_attr( 'data-large_image' );
		$product_img.tc_reset_variation_attr( 'data-large_image_width' );
		$product_img.tc_reset_variation_attr( 'data-large_image_height' );
		$product_img_wrap.tc_reset_variation_attr( 'data-thumb' );
		$product_link.tc_reset_variation_attr( 'href' );
	};

	/**
	 * Avoids using wp.template where possible in order to be CSP compliant.
	 * wp.template uses internally eval().
	 *
	 * @param {string} templateId The id of the template.
	 */
	function wpTemplate( templateId ) {
		var html = document.getElementById( 'tmpl-' + templateId ).textContent;
		var hard = false;
		// any <# #> interpolate (evaluate).
		hard = hard || /<#\s?data\./.test( html );
		// any data that is NOT data.variation.
		hard = hard || /{{{?\s?data\.(?!variation\.).+}}}?/.test( html );
		// any data access deeper than 1 level e.g.
		// data.variation.object.item
		// data.variation.object['item']
		// data.variation.array[0]
		hard = hard || /{{{?\s?data\.variation\.[\w-]*[^\s}]/.test( html );
		if ( hard ) {
			return window.wp.template( templateId );
		}
		return function template( data ) {
			var variation = data.variation || {};
			var replacement;
			return html.replace( /({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g, function( _, open, key, close ) {
				// Error in the format, ignore.
				if ( open.length !== close.length ) {
					return '';
				}
				replacement = variation[ key ] || '';
				// {{{ }}} => interpolate (unescaped).
				// {{  }}  => interpolate (escaped).
				// https://codex.wordpress.org/Javascript_Reference/wp.template
				if ( open.length === 2 ) {
					return window.escape( replacement );
				}
				return replacement;
			} );
		};
	}
}( window.jQuery, window, document ) );
assets/js/tm-api.js000064400000050574150755142450010232 0ustar00/**
 * The following API is shared on both frontend and backend.
 *
 * No external libraries are loaded in this file.
 *
 * 1. Polyfills
 * 2. themeComplete plugin JS API
 * 3. themeComplete jQuery extensions
 */
/*jshint bitwise: false*/
/**
 * 1. Polyfills
 *
 * The following are required methods for
 * the String, Number and Object prototype
 */
( function() {
	'use strict';

	/**
	 * String.prototype.isNumeric()
	 *
	 * Determines whether a string contains a numeric value
	 *
	 * https://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric
	 */
	if ( ! String.prototype.isNumeric ) {
		Object.defineProperty( String.prototype, 'isNumeric', {
			value: function() {
				return ! isNaN( parseFloat( this ) ) && isFinite( this );
			}
		} );
	}
}() );

// jQuery Mask Plugin v1.14.15
// github.com/igorescobar/jQuery-Mask-Plugin
window.jQuery.jMaskGlobals = {
	maskElements: '.tc-extra-product-options input'
};

/**
 * 2. ThemeComplete plugin JS API
 */

( function( $ ) {
	'use strict';

	$.epoAPI = {};
	$.epoAPI.error = false;
	$.epoAPI.math = {};
	$.epoAPI.dom = {};
	$.epoAPI.util = {};
	$.epoAPI.locale = {};
	$.epoAPI.template = {};

	$.epoAPI.math.toFloat = function( s, d ) {
		var n;

		if ( ! ( typeof s === 'string' || typeof s === 'number' ) || isNaN( s ) ) {
			return 0;
		}
		n = parseFloat( s );
		if ( isNaN( n ) ) {
			if ( d !== undefined ) {
				return d;
			}
			return s;
		}

		return n;
	};

	$.epoAPI.math.toInt = function( s, d ) {
		var n;

		if ( ! ( typeof s === 'string' || typeof s === 'number' ) || isNaN( s ) || s === '' ) {
			return 0;
		}
		n = parseInt( s, 10 );
		if ( isNaN( n ) ) {
			if ( d !== undefined ) {
				return d;
			}
			return s;
		}

		return n;
	};

	/**
	 * Rounds a number
	 * modified from http://locutus.io/php/math/round/
	 *
	 * @param {any}    value     the value to round.
	 * @param {int}    precision the precision.
	 * @param {string} mode      the rounding mode.
	 */
	$.epoAPI.math.round = function( value, precision, mode ) {
		var m;
		var f;
		var isHalf;
		var n;
		var sgn; // helper variables

		// making sure precision is integer
		precision = parseInt( precision, 10 );
		if ( ! Number.isFinite( precision ) ) {
			precision = 0;
		}
		m = Math.pow( 10, precision );
		value = value * m;

		// sign of the number
		if ( typeof value === 'number' ) {
			if ( value ) {
				if ( value < 0 ) {
					sgn = -1;
				} else {
					sgn = 1;
				}
			} else {
				sgn = 0;
			}
		} else {
			sgn = 0;
		}

		isHalf = value % 1 === 0.5 * sgn;
		f = Math.floor( value );

		if ( isHalf ) {
			switch ( mode ) {
				case 'PHP_ROUND_HALF_DOWN':
					// rounds .5 toward zero
					if ( sgn < 0 ) {
						n = 1;
					} else {
						n = 0;
					}
					value = f + n;
					break;
				case 'PHP_ROUND_HALF_EVEN':
					// rouds .5 towards the next even integer
					value = f + ( ( f % 2 ) * sgn );
					break;
				case 'PHP_ROUND_HALF_ODD':
					// rounds .5 towards the next odd integer
					n = f % 2;
					if ( n ) {
						n = 0;
					} else {
						n = 1;
					}
					value = f + n;
					break;
				default:
					// rounds .5 away from zero
					if ( sgn > 0 ) {
						n = 1;
					} else {
						n = 0;
					}
					value = f + n;
			}
		}

		if ( ! isHalf ) {
			value = Math.round( value );
		}

		return value / m;
	};

	// https://locutus.io/php/misc/uniqid/index.html
	$.epoAPI.math.uniqueid = function( prefix, moreEntropy ) {
		var retId;
		var _formatSeed = function( seed, reqWidth ) {
			seed = parseInt( seed, 10 ).toString( 16 ); // to hex str
			if ( reqWidth < seed.length ) {
				// so long we split
				return seed.slice( seed.length - reqWidth );
			}
			if ( reqWidth > seed.length ) {
				// so short we pad
				return new Array( 1 + ( reqWidth - seed.length ) ).join( '0' ) + seed;
			}
			return seed;
		};
		var radom;

		if ( prefix === undefined ) {
			prefix = '';
		}

		$.epoAPI.php = $.epoAPI.php || {};

		if ( ! $.epoAPI.php.uniqidSeed ) {
			// init seed with big random int
			$.epoAPI.php.uniqidSeed = Math.floor( Math.random() * 0x75bcd15 );
		}
		$.epoAPI.php.uniqidSeed += 1;

		// start with prefix, add current milliseconds hex string
		retId = prefix;
		retId += _formatSeed( parseInt( Date.now() / 1000, 10 ), 8 );
		// add seed hex string
		retId += _formatSeed( $.epoAPI.php.uniqidSeed, 5 );
		if ( moreEntropy ) {
			// for more entropy we add a float lower to 10
			radom = Math.random() * 10;
			retId += radom.toFixed( 8 ).toString();
		}

		return retId;
	};

	$.epoAPI.dom.id = function( id ) {
		if ( typeof id === 'undefined' ) {
			return id;
		}
		if ( ! ( typeof id === 'string' || typeof id === 'number' ) || ( typeof id === 'number' && isNaN( id ) ) ) {
			return id.toString();
		}
		return id.toString().replace( /(%|:|\.|\[|\]|,|=)/g, '\\$1' );
	};

	$.epoAPI.dom.scroll = function() {
		var scrollLeft;
		var scrollTop;

		if ( window.pageYOffset ) {
			scrollTop = window.pageYOffset;
			scrollLeft = window.pageXOffset;
		} else if ( document.documentElement && document.documentElement.scrollTop ) {
			scrollTop = document.documentElement.scrollTop;
			scrollLeft = document.documentElement.scrollLeft;
		} else if ( document.body ) {
			scrollTop = document.body.scrollTop;
			scrollLeft = document.body.scrollLeft;
		}

		return { left: scrollLeft, top: scrollTop };
	};

	$.epoAPI.dom.size = function() {
		var totalDocumentHeight;
		var totalDocumentWidth;
		var fullHeight;
		var fullWidth;
		var visibleWidth;
		var visibleHeight;

		if ( window.innerHeight && window.scrollMaxY ) {
			totalDocumentWidth = window.innerWidth + window.scrollMaxX;
			totalDocumentHeight = window.innerHeight + window.scrollMaxY;
		} else if ( document.body.scrollHeight > document.body.offsetHeight ) {
			totalDocumentWidth = document.body.scrollWidth;
			totalDocumentHeight = document.body.scrollHeight;
		} else {
			totalDocumentWidth = document.body.offsetWidth;
			totalDocumentHeight = document.body.offsetHeight;
		}

		if ( window.innerHeight ) {
			if ( document.documentElement.clientWidth ) {
				visibleWidth = document.documentElement.clientWidth;
			} else {
				visibleWidth = window.innerWidth;
			}
			visibleHeight = window.innerHeight;
		} else if ( document.documentElement && document.documentElement.clientHeight ) {
			visibleWidth = document.documentElement.clientWidth;
			visibleHeight = document.documentElement.clientHeight;
		} else if ( document.body ) {
			visibleWidth = document.body.clientWidth;
			visibleHeight = document.body.clientHeight;
		}
		if ( totalDocumentHeight < visibleHeight ) {
			fullHeight = visibleHeight;
		} else {
			fullHeight = totalDocumentHeight;
		}
		if ( totalDocumentWidth < visibleWidth ) {
			fullWidth = visibleWidth;
		} else {
			fullWidth = totalDocumentWidth;
		}

		return {
			fullWidth: fullWidth,
			fullHeight: fullHeight,

			visibleWidth: visibleWidth,
			visibleHeight: visibleHeight,

			totalWidth: totalDocumentWidth,
			totalHeight: totalDocumentHeight
		};
	};

	// jQuery trim is deprecated, provide a trim method based on String.prototype.trim
	$.epoAPI.util.trim = function( str ) {
		if ( typeof str === 'string' ) {
			// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
			return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '' );
		}
		return str;
	};

	$.epoAPI.util.parseJSON = function( s ) {
		var parsedjson;
		var JSON = window.JSON;

		try {
			parsedjson = JSON.parse( s + '' );
			if ( parsedjson && typeof parsedjson === 'object' && parsedjson !== null ) {
				return parsedjson;
			}
		} catch ( err ) {
			$.epoAPI.error = err;
			return false;
		}

		return false;
	};

	$.epoAPI.util.decodeHTML = function( html ) {
		var txt = document.createElement( 'textarea' );
		txt.innerHTML = html;
		return txt.value;
	};

	$.epoAPI.util.getStorage = function( type ) {
		var storage;
		var x;
		try {
			storage = window[ type ];
			x = '__storage_test__';
			storage.setItem( x, x );
			storage.removeItem( x );
			return storage;
		} catch ( e ) {
			return false;
		}
	};

	$.epoAPI.util.basename = function( path ) {
		return path.replace( /.*\//, '' );
	};

	// https://developer.mozilla.org/en-US/docs/Web/API/structuredClone
	// https://medium.com/javascript-in-plain-english/how-to-deep-copy-objects-and-arrays-in-javascript-7c911359b089
	$.epoAPI.util.deepCopyArray = function( inObject ) {
		var outObject;
		var value;

		if ( window.structuredClone !== undefined ) {
			return window.structuredClone( inObject );
		}

		if ( typeof inObject !== 'object' || inObject === null ) {
			return inObject; // Return the value if inObject is not an object
		}

		// Create an array or object to hold the values
		outObject = Array.isArray( inObject ) ? [] : {};

		Object.keys( inObject ).forEach( function( key ) {
			if ( inObject ) {
				value = inObject[ key ];

				// Recursively (deep) copy for nested objects, including arrays
				outObject[ key ] = typeof value === 'object' && value !== null ? $.epoAPI.util.deepCopyArray( value ) : value;
			}
		} );

		return outObject;
	};

	$.epoAPI.locale.getSystemDecimalSeparator = function() {
		var n = 1.1;

		// This gets null on languages that don't return 1 in a number format.
		n = /^1(.+)1$/.exec( n.toLocaleString() );

		if ( n ) {
			n = n[ 1 ];
		} else {
			n = ',';
		}

		return n;
	};

	$.epoAPI.template.html = function( template, obj ) {
		var $template_html = template( obj );

		$template_html = $template_html.replace( '/*<![CDATA[*/', '' );
		$template_html = $template_html.replace( '/*]]>*/', '' );

		return $template_html;
	};

	$.epoAPI.filters = {};

	$.epoAPI.addFilter = function( $tag, $function_to_add, $priority, $accepted_args ) {
		var $idx;

		$priority = parseInt( $priority, 10 );
		if ( isNaN( $priority ) ) {
			$priority = 10;
		}
		$accepted_args = parseInt( $accepted_args, 10 );
		if ( isNaN( $accepted_args ) ) {
			$accepted_args = 1;
		}
		$idx = $function_to_add + '_' + $priority;
		if ( ! $.epoAPI.filters[ $tag ] ) {
			$.epoAPI.filters[ $tag ] = {};
		}
		if ( ! $.epoAPI.filters[ $tag ][ $priority ] ) {
			$.epoAPI.filters[ $tag ][ $priority ] = {};
		}
		$.epoAPI.filters[ $tag ][ $priority ][ $idx ] = {
			func: $function_to_add,
			accepted_args: $accepted_args
		};

		return true;
	};

	$.epoAPI.removeFilter = function( $tag, $function_to_remove, $priority ) {
		var $idx;
		$priority = parseInt( $priority, 10 );
		if ( isNaN( $priority ) ) {
			$priority = 10;
		}
		$idx = $function_to_remove + '_' + $priority;

		if ( $.epoAPI.filters[ $tag ] && $.epoAPI.filters[ $tag ][ $priority ] && $.epoAPI.filters[ $tag ][ $priority ][ $idx ] ) {
			delete $.epoAPI.filters[ $tag ][ $priority ][ $idx ];
			return true;
		}

		return false;
	};

	$.epoAPI.applyFilter = function( $tag, $value ) {
		var $args = $.makeArray( arguments );
		var priorities;

		$args.splice( 0, 1 );

		if ( ! $.epoAPI.filters[ $tag ] ) {
			return $value;
		}

		priorities = $.epoAPI.filters[ $tag ];
		$.each( priorities, function( i, el ) {
			$.each( el, function( i2, el2 ) {
				var func = el2.func;

				if ( func instanceof Function ) {
					$value = func.apply( null, $args );
				} else if ( window[ func ] && window[ func ] instanceof Function ) {
					$value = window[ func ].apply( null, $args );
				}
			} );
		} );

		return $value;
	};

	// Backwards compatibility (to be removed in the future)
	$.tc_add_filter = $.epoAPI.addFilter;
	$.tc_remove_filter = $.epoAPI.removeFilter;
	$.tc_apply_filters = $.epoAPI.applyFilter;
}( window.jQuery ) );

/*
 * Formatting functions
 *
 * Code modifiled from accounting.js
 * http://openexchangerates.github.io/accounting.js/
 */

( function( $ ) {
	'use strict';

	/**
	 * Check and normalise the value of precision (must be positive integer)
	 *
	 * @param {any} val  the value to check.
	 * @param {any} base the value to return is check fails.
	 */
	function checkPrecision( val, base ) {
		val = Math.round( Math.abs( val ) );
		return isNaN( val ) ? base : val;
	}

	/**
	 * Takes a string/array of strings, removes all formatting/cruft
	 * and returns the raw float value.
	 *
	 * @param {any} value   the value to unformat.
	 * @param {any} decimal the decimal point.
	 */
	function unformat( value, decimal ) {
		var regex;
		var unformatted;

		// Recursively unformat arrays:
		if ( Array.isArray( value ) ) {
			return value.map( value, function( val ) {
				return unformat( val, decimal );
			} );
		}

		// Fails silently (need decent errors):
		value = value || 0;

		// Return the value as-is if it's already a number:
		if ( typeof value === 'number' ) {
			return value;
		}

		// Default decimal point comes from settings, but could be set to eg. "," in opts:
		decimal = decimal || '.';

		// Build regex to strip out everything except digits, decimal point and minus sign:
		regex = new RegExp( '[^0-9-' + decimal + ']', [ 'g' ] );
		unformatted = parseFloat(
			( '' + value )
				.replace( regex, '' ) // strip out any cruft
				.replace( decimal, '.' ) // make sure decimal point is standard
		);

		// This will fail silently which may cause trouble, let's wait and see:
		return ! isNaN( unformatted ) ? unformatted : 0;
	}

	/**
	 * Implementation of toFixed() that treats floats more like decimals
	 *
	 * Fixes binary rounding issues (eg. (0.615).toFixed(2) === "0.61") that present
	 * problems for accounting- and finance-related software.
	 *
	 * @param {any} value     the value to convert.
	 * @param {int} precision the precision.
	 */
	function toFixed( value, precision ) {
		var exponentialForm;
		var rounded;
		var finalResult;

		if ( ! Number.isFinite( value ) ) {
			return '-';
		}

		precision = checkPrecision( precision, 2 );

		exponentialForm = Number( unformat( value ) * Math.pow( 10, precision ) );
		rounded = Math.round( exponentialForm );
		finalResult = Number( rounded / Math.pow( 10, precision ) ).toFixed( precision );
		return finalResult;
	}

	/**
	 * Format into currency or a number, with comma-separated thousands and custom precision/decimal places
	 *
	 * opts = {
	 *     symbol: "$",    // currency symbol is '$'
	 *     format: "%s%v", // controls output: %s = symbol, %v = value (can be object, see docs)
	 *     decimal: ".",   // decimal point separator
	 *     thousand: ",",  // thousands separator
	 *     precision: 2,   // decimal places
	 * }
	 *
	 * @param {any}    number the value to convert.
	 * @param {Object} opts   the options for formatting.
	 */
	function format( number, opts ) {
		var formats;
		var useFormat;
		var negative;
		var base;
		var mod;

		// Resursively format arrays:
		if ( Array.isArray( number ) ) {
			return number.map( number, function( val ) {
				return format( val, opts );
			} );
		}

		// Clean up number:
		number = unformat( number );

		// Do not format if opts are not correct or missing
		if ( ! opts ) {
			return number;
		}

		// Clean up precision
		opts.precision = checkPrecision( opts.precision );

		// Format currency
		if ( opts.format && opts.symbol ) {
			// Check format (returns object with pos, neg and zero):
			formats = {
				pos: opts.format,
				neg: opts.format.replace( '-', '' ).replace( '%v', '-%v' ),
				zero: opts.format
			};

			// Choose which format to use for this value:
			useFormat = number > 0 ? formats.pos : number < 0 ? formats.neg : formats.zero;

			// Return with currency symbol added:
			opts.opts = {
				precision: opts.precision,
				thousand: opts.thousand,
				decimal: opts.decimal
			};

			number = useFormat.replace( '%s', opts.symbol ).replace( '%v', format( Math.abs( number ), opts.opts ) );

			// Format number
		} else {
			if ( ! Number.isFinite( number ) ) {
				return '-';
			}
			// Do some calc:
			negative = number < 0 ? '-' : '';
			base = parseInt( toFixed( Math.abs( number || 0 ), opts.precision ), 10 ) + '';
			mod = base.length > 3 ? base.length % 3 : 0;

			// Format the number:
			number = negative + ( mod ? base.substring( 0, mod ) + opts.thousand : '' ) + base.substring( mod ).replace( /(\d{3})(?=\d)/g, '$1' + opts.thousand ) + ( opts.precision ? opts.decimal + toFixed( Math.abs( number ), opts.precision ).split( '.' )[ 1 ] : '' );
		}

		return number;
	}

	$.epoAPI.math.unformat = unformat;
	$.epoAPI.math.format = format;
	$.epoAPI.math.toFixed = toFixed;
}( window.jQuery ) );

/**
 * 3. ThemeComplete jQuery extensions
 *
 * @param {Object} $ The jQuery object.
 */
( function( $ ) {
	'use strict';

	var expo;
	var rCRLF = /\r?\n/g;
	var rcheckableType = /^(?:checkbox|radio)$/i;
	var rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i;
	var rsubmittable = /^(?:input|select|textarea|keygen)/i;

	// Extend jQuery easing
	if ( ! $.easing.easeInExpo ) {
		expo = function( p ) {
			return Math.pow( p, 6 );
		};
		$.easing.easeInExpo = expo;
		$.easing.easeOutExpo = function( p ) {
			return 1 - expo( 1 - p );
		};
		$.easing.easeInOutExpo = function( p ) {
			return p < 0.5 ? expo( p * 2 ) / 2 : 1 - ( expo( ( p * -2 ) + 2 ) / 2 );
		};
	}

	// Add jQuery plugins
	$.fn.extend( {
		// Create checkbox switch
		tmcheckboxes: function() {
			var tm_settings_wrap_checkbox = this.find( ":checkbox:not('.tm-default-checkbox')" ).not( '.wp-tab-panel :checkbox, .tm-weekdays-picker-wrap :checkbox, .tm-months-picker-wrap :checkbox' );
			tm_settings_wrap_checkbox.wrap( '<label class="tm-epo-switch-wrapper-label"></label>' );
			tm_settings_wrap_checkbox.wrap( '<span class="tm-epo-switch-wrapper tc"></span>' );
			tm_settings_wrap_checkbox.after( '<span class="tc-label tm-epo-switch tc"></span>' );
			return this;
		},

		// Encode a set of HTML elements as an array of names and values.
		// Elements do not need to be inside a form
		tcSerializeArray: function() {
			return this.find( ':input' )
				.filter( function() {
					var type = this.type;

					// Use .is( ":disabled" ) so that fieldset[disabled] works
					return this.name && ! $( this ).is( ':disabled' ) && rsubmittable.test( this.nodeName ) && ! rsubmitterTypes.test( type ) && ( this.checked || ! rcheckableType.test( type ) );
				} )
				.map( function( i, elem ) {
					var val = $( this ).val();

					if ( val === null ) {
						return null;
					}

					if ( Array.isArray( val ) ) {
						return $.map( val, function( thisval ) {
							return { name: elem.name, value: thisval.replace( rCRLF, '\r\n' ) };
						} );
					}

					return { name: elem.name, value: val.replace( rCRLF, '\r\n' ) };
				} )
				.get();
		},

		// convert element to a valid JSON object
		tcSerializeObject: function() {
			var o = {};
			var a = this.tcSerializeArray();

			$.each( a, function() {
				if ( o[ this.name ] !== undefined ) {
					if ( this.name.endsWith( '[]' ) ) {
						if ( ! o[ this.name ].push ) {
							o[ this.name ] = [ o[ this.name ] ];
						}
						o[ this.name ].push( this.value || '' );
					} else {
						o[ this.name ] = this.value || '';
					}
				} else {
					o[ this.name ] = this.value || '';
				}
			} );

			return o;
		},

		// Scroll container to a specific element
		tcScrollTo: function( obj, duration, offset ) {
			var element = this;

			obj = $( obj );
			if ( obj.length === 0 ) {
				return this;
			}
			if ( ! duration ) {
				duration = 0;
			}
			if ( ! offset ) {
				offset = 0;
			}
			if ( element[ 0 ].self === window ) {
				element = $( 'html, body' );
			} else {
				if ( element.find( '.woodmart-scroll-content' ).length ) {
					element = element.find( '.woodmart-scroll-content' );
				}
				if ( ! element.offset() ) {
					element = $( 'html, body' );
				} else {
					offset = offset + ( element.scrollTop() - element.offset().top );
				}
			}

			return element.animate(
				{
					scrollTop: $( obj ).offset().top + offset
				},
				duration
			);
		},

		/**
		 * Textarea and select clone() bug workaround | Spencer Tipping
		 * Licensed under the terms of the MIT source code license
		 * https://github.com/spencertipping/jquery.fix.clone/blob/master/jquery.fix.clone.js
		 */
		tcClone: function() {
			var i;
			var l;
			var j;
			var m;
			var result = $.fn.clone.apply( this, arguments );
			var textareas = this.find( 'textarea' ).add( this.filter( 'textarea' ) );
			var resultTextareas = result.find( 'textarea' ).add( result.filter( 'textarea' ) );
			var selects = this.find( 'select' ).add( this.filter( 'select' ) );
			var resultSelects = result.find( 'select' ).add( result.filter( 'select' ) );

			for ( i = 0, l = textareas.length; i < l; i += 1 ) {
				$( resultTextareas[ i ] ).val( $( textareas[ i ] ).val() );
			}
			for ( i = 0, l = selects.length; i < l; i += 1 ) {
				for ( j = 0, m = selects[ i ].options.length; j < m; j += 1 ) {
					if ( selects[ i ].options[ j ].selected === true ) {
						resultSelects[ i ].options[ j ].selected = true;
					}
				}
			}

			return result;
		}
	} );
}( window.jQuery ) );
assets/js/spectrum.min.js000064400000074304150755142450011464 0ustar00!function(m){"use strict";var t,e,a,v=/^\s+/,w=/\s+$/,n=0,o=m.round,y=m.min,_=m.max,r=m.random,x={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},s=function(t){var e,a={};for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(a[t[e]]=e);return a}(x),k=(e="[\\s|\\(]+("+(t="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+t+")[,|\\s]+("+t+")\\s*\\)?",a="[\\s|\\(]+("+t+")[,|\\s]+("+t+")[,|\\s]+("+t+")[,|\\s]+("+t+")\\s*\\)?",{CSS_UNIT:new RegExp(t),rgb:new RegExp("rgb"+e),rgba:new RegExp("rgba"+a),hsl:new RegExp("hsl"+e),hsla:new RegExp("hsla"+a),hsv:new RegExp("hsv"+e),hsva:new RegExp("hsva"+a),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function A(t){return k.CSS_UNIT.exec(t)}function S(t){return parseInt(t,16)}function C(t){return S(t)/255}function P(t){return t=parseFloat(t),t=isNaN(t)||t<0||1<t?1:t}function R(t,e){var a;return"string"==typeof(a=t)&&-1!==a.indexOf(".")&&1===parseFloat(a)&&(t="100%"),a="string"==typeof(a=t)&&-1!==a.indexOf("%"),t=y(e,_(0,parseFloat(t))),a&&(t=parseInt(t*e,10)/100),m.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function i(t){return y(1,_(0,t))}function l(t){return 1===t.length?"0"+t:""+t}function F(t){return t=t<=1?100*t+"%":t}function c(t){return m.round(255*parseFloat(t)).toString(16)}function f(t,e,a){var n,r,o,s,i,l;if(t=R(t,255),e=R(e,255),a=R(a,255),i=((n=_(t,e,a))+(r=y(t,e,a)))/2,n===r)o=s=0;else{switch(l=n-r,s=.5<i?l/(2-n-r):l/(n+r),n){case t:o=(e-a)/l+(e<a?6:0);break;case e:o=(a-t)/l+2;break;case a:o=(t-e)/l+4}o/=6}return{h:o,s:s,l:i}}function u(t,e,a){var n,r,o,s,i,l;if(t=R(t,255),e=R(e,255),a=R(a,255),l=(i=n=_(t,e,a))-(r=y(t,e,a)),s=0===n?0:l/n,n===r)o=0;else{switch(n){case t:o=(e-a)/l+(e<a?6:0);break;case e:o=(a-t)/l+2;break;case a:o=(t-e)/l+4}o/=6}return{h:o,s:s,v:i}}function d(t,e,a,n){t=[l(o(t).toString(16)),l(o(e).toString(16)),l(o(a).toString(16))];return n&&t[0].charAt(0)===t[0].charAt(1)&&t[1].charAt(0)===t[1].charAt(1)&&t[2].charAt(0)===t[2].charAt(1)?t[0].charAt(0)+t[1].charAt(0)+t[2].charAt(0):t.join("")}function h(t,e,a,n){return[l(c(n)),l(o(t).toString(16)),l(o(e).toString(16)),l(o(a).toString(16))].join("")}function p(t){var e,a,n,r,o,s,i,l,c,f,u={r:0,g:0,b:0},d=1,h=null,p=!1,g=!1;function b(t,e,a){return a<0&&(a+=1),1<a&&--a,a<1/6?t+6*(e-t)*a:a<.5?e:a<2/3?t+(e-t)*(2/3-a)*6:t}return d=P(d="object"==typeof(t="string"==typeof t?function(t){var e,a=!1;if(t=t.replace(v,"").replace(w,"").toLowerCase(),x[t])t=x[t],a=!0;else if("transparent"===t)return{r:0,g:0,b:0,a:0,format:"name"};return(e=k.rgb.exec(t))?{r:e[1],g:e[2],b:e[3]}:(e=k.rgba.exec(t))?{r:e[1],g:e[2],b:e[3],a:e[4]}:(e=k.hsl.exec(t))?{h:e[1],s:e[2],l:e[3]}:(e=k.hsla.exec(t))?{h:e[1],s:e[2],l:e[3],a:e[4]}:(e=k.hsv.exec(t))?{h:e[1],s:e[2],v:e[3]}:(e=k.hsva.exec(t))?{h:e[1],s:e[2],v:e[3],a:e[4]}:(e=k.hex8.exec(t))?{r:S(e[1]),g:S(e[2]),b:S(e[3]),a:C(e[4]),format:a?"name":"hex8"}:(e=k.hex6.exec(t))?{r:S(e[1]),g:S(e[2]),b:S(e[3]),format:a?"name":"hex"}:(e=k.hex4.exec(t))?{r:S(e[1]+""+e[1]),g:S(e[2]+""+e[2]),b:S(e[3]+""+e[3]),a:C(e[4]+""+e[4]),format:a?"name":"hex8"}:!!(e=k.hex3.exec(t))&&{r:S(e[1]+""+e[1]),g:S(e[2]+""+e[2]),b:S(e[3]+""+e[3]),format:a?"name":"hex"}}(t):t)&&(A(t.r)&&A(t.g)&&A(t.b)?(l=t.r,c=t.g,f=t.b,u={r:255*R(l,255),g:255*R(c,255),b:255*R(f,255)},p=!0,g="%"===String(t.r).substring(String(t.r).length-1)?"prgb":"rgb"):A(t.h)&&A(t.s)&&A(t.v)?(h=F(t.s),l=F(t.v),c=t.h,f=h,r=l,c=6*R(c,360),f=R(f,100),u={r:255*[r=R(r,100),s=r*(1-(i=c-(c=m.floor(c)))*f),o=r*(1-f),o,i=r*(1-(1-i)*f),r][f=c%6],g:255*[i,r,r,s,o,o][f],b:255*[o,o,i,r,r,s][f]},p=!0,g="hsv"):A(t.h)&&A(t.s)&&A(t.l)&&(h=F(t.s),o=F(t.l),i=t.h,r=h,s=o,i=R(i,360),r=R(r,100),s=R(s,100),0===r?e=a=n=s:(e=b(r=2*s-(s=s<.5?s*(1+r):s+r-s*r),s,i+1/3),a=b(r,s,i),n=b(r,s,i-1/3)),u={r:255*e,g:255*a,b:255*n},p=!0,g="hsl"),Object.prototype.hasOwnProperty.call(t,"a"))?t.a:d),{ok:p,format:t.format||g,r:y(255,_(u.r,0)),g:y(255,_(u.g,0)),b:y(255,_(u.b,0)),a:d}}function g(t,e){var a;return e=e||{},(t=t||"")instanceof g?t:this instanceof g?(a=p(t),this._originalInput=t,this._r=a.r,this._g=a.g,this._b=a.b,this._a=a.a,this._roundA=o(100*this._a)/100,e.format?this._format=e.format:this._format=a.format,this._gradientType=e.gradientType,this._r<1&&(this._r=o(this._r)),this._g<1&&(this._g=o(this._g)),this._b<1&&(this._b=o(this._b)),this._ok=a.ok,n+=1,void(this._tc_id=n)):new g(t,e)}function b(t,e){return new g(t,e)}function H(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).s-=e/100,t.s=i(t.s),b(t)}function T(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).s+=e/100,t.s=i(t.s),b(t)}function M(t){return b(t).desaturate(100)}function O(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).l+=e/100,t.l=i(t.l),b(t)}function z(t,e){return e=0===e?0:e||10,(t=b(t).toRgb()).r=_(0,y(255,t.r-o(-e/100*255))),t.g=_(0,y(255,t.g-o(-e/100*255))),t.b=_(0,y(255,t.b-o(-e/100*255))),b(t)}function j(t,e){return e=0===e?0:e||10,(t=b(t).toHsl()).l-=e/100,t.l=i(t.l),b(t)}function E(t,e){t=b(t).toHsl(),e=(t.h+e)%360;return t.h=e<0?360+e:e,b(t)}function I(t){t=b(t).toHsl();return t.h=(t.h+180)%360,b(t)}function N(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+120)%360,s:e.s,l:e.l}),b({h:(a+240)%360,s:e.s,l:e.l})]}function q(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+90)%360,s:e.s,l:e.l}),b({h:(a+180)%360,s:e.s,l:e.l}),b({h:(a+270)%360,s:e.s,l:e.l})]}function D(t){var e=b(t).toHsl(),a=e.h;return[b(t),b({h:(a+72)%360,s:e.s,l:e.l}),b({h:(a+216)%360,s:e.s,l:e.l})]}g.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t=this.toRgb(),e=t.r/255,a=t.g/255,t=t.b/255,e=e<=.03928?e/12.92:m.pow((.055+e)/1.055,2.4),a=a<=.03928?a/12.92:m.pow((.055+a)/1.055,2.4),t=t<=.03928?t/12.92:m.pow((.055+t)/1.055,2.4);return.2126*e+.7152*a+.0722*t},setAlpha:function(t){return this._a=P(t),this._roundA=o(100*this._a)/100,this},toHsv:function(){var t=u(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=u(this._r,this._g,this._b),e=o(360*t.h),a=o(100*t.s),t=o(100*t.v);return 1===this._a?"hsv("+e+", "+a+"%, "+t+"%)":"hsva("+e+", "+a+"%, "+t+"%, "+this._roundA+")"},toHsl:function(){var t=f(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=f(this._r,this._g,this._b),e=o(360*t.h),a=o(100*t.s),t=o(100*t.l);return 1===this._a?"hsl("+e+", "+a+"%, "+t+"%)":"hsla("+e+", "+a+"%, "+t+"%, "+this._roundA+")"},toHex:function(t){return d(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return e=this._r,a=this._g,n=this._b,r=this._a,t=t,e=[l(o(e).toString(16)),l(o(a).toString(16)),l(o(n).toString(16)),l(c(r))],t&&e[0].charAt(0)===e[0].charAt(1)&&e[1].charAt(0)===e[1].charAt(1)&&e[2].charAt(0)===e[2].charAt(1)&&e[3].charAt(0)===e[3].charAt(1)?e[0].charAt(0)+e[1].charAt(0)+e[2].charAt(0)+e[3].charAt(0):e.join("");var e,a,n,r},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:o(this._r),g:o(this._g),b:o(this._b),a:this._a}},toRgbString:function(){return 1===this._a?"rgb("+o(this._r)+", "+o(this._g)+", "+o(this._b)+")":"rgba("+o(this._r)+", "+o(this._g)+", "+o(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:o(100*R(this._r,255))+"%",g:o(100*R(this._g,255))+"%",b:o(100*R(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1===this._a?"rgb("+o(100*R(this._r,255))+"%, "+o(100*R(this._g,255))+"%, "+o(100*R(this._b,255))+"%)":"rgba("+o(100*R(this._r,255))+"%, "+o(100*R(this._g,255))+"%, "+o(100*R(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&s[d(this._r,this._g,this._b,!0)]||!1},toFilter:function(t){var e="#"+h(this._r,this._g,this._b,this._a),a=e;return"progid:DXImageTransform.Microsoft.gradient("+(this._gradientType?"GradientType = 1, ":"")+"startColorstr="+e+",endColorstr="+(a=t?"#"+h((e=b(t))._r,e._g,e._b,e._a):a)+")"},toString:function(t){var e,a,n=!!t;return t=t||this._format,e=!1,a=this._a<1&&0<=this._a,n||!a||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(e=this.toRgbString()),"prgb"===t&&(e=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(e=this.toHexString()),"hex3"===t&&(e=this.toHexString(!0)),"hex4"===t&&(e=this.toHex8String(!0)),"hex8"===t&&(e=this.toHex8String()),"name"===t&&(e=this.toName()),"hsl"===t&&(e=this.toHslString()),(e="hsv"===t?this.toHsvString():e)||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return b(this.toString())},_applyModification:function(t,e){t=t.apply(null,[this].concat([].slice.call(e)));return this._r=t._r,this._g=t._g,this._b=t._b,this.setAlpha(t._a),this},lighten:function(){return this._applyModification(O,arguments)},brighten:function(){return this._applyModification(z,arguments)},darken:function(){return this._applyModification(j,arguments)},desaturate:function(){return this._applyModification(H,arguments)},saturate:function(){return this._applyModification(T,arguments)},greyscale:function(){return this._applyModification(M,arguments)},spin:function(){return this._applyModification(E,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},complement:function(){return this._applyCombination(I,arguments)},splitcomplement:function(){return this._applyCombination(D,arguments)},triad:function(){return this._applyCombination(N,arguments)},tetrad:function(){return this._applyCombination(q,arguments)}},g.fromRatio=function(t,e){var a,n;if("object"==typeof t){for(n in a={},t)Object.prototype.hasOwnProperty.call(t,n)&&(a[n]="a"===n?t[n]:F(t[n]));t=a}return b(t,e)},g.equals=function(t,e){return!(!t||!e)&&b(t).toRgbString()===b(e).toRgbString()},g.random=function(){return g.fromRatio({r:r(),g:r(),b:r()})},g.mix=function(t,e,a){return a=0===a?0:a||50,t=b(t).toRgb(),e=b(e).toRgb(),b({r:(e.r-t.r)*(a=a/100)+t.r,g:(e.g-t.g)*a+t.g,b:(e.b-t.b)*a+t.b,a:(e.a-t.a)*a+t.a})},g.readability=function(t,e){t=b(t),e=b(e);return(m.max(t.getLuminance(),e.getLuminance())+.05)/(m.min(t.getLuminance(),e.getLuminance())+.05)},g.isReadable=function(t,e,a){var n=g.readability(t,e),r=!1;switch((a={level:e="AA"!==(e=((t=(t=a)||{level:"AA",size:"small"}).level||"AA").toUpperCase())&&"AAA"!==e?"AA":e,size:e="small"!==(e=(t.size||"small").toLowerCase())&&"large"!==e?"small":e}).level+a.size){case"AAsmall":case"AAAlarge":r=4.5<=n;break;case"AAlarge":r=3<=n;break;case"AAAsmall":r=7<=n}return r},g.mostReadable=function(t,e,a){for(var n,r=null,o=0,s=(a=a||{}).includeFallbackColors,i=a.level,l=a.size,c=0;c<e.length;c+=1)o<(n=g.readability(t,e[c]))&&(o=n,r=b(e[c]));return g.isReadable(t,r,{level:i,size:l})||!s?r:(a.includeFallbackColors=!1,g.mostReadable(t,["#fff","#000"],a))},g.names=x,g.hexNames=s,void 0!==window.module&&window.module.exports?window.module.exports=g:"function"==typeof window.define&&window.define.amd?window.define(function(){return g}):window.tinycolor=g}(Math),function(t){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery"],t):"object"==typeof exports&&"object"==typeof module?window.module.exports=t(window.require("jquery")):t(window.jQuery)}(function(It){"use strict";var t,o="spectrum.id",Nt=window.tinycolor,qt={beforeShow:a,move:a,change:a,show:a,hide:a,color:!1,flat:!1,type:"color",showInput:!1,allowEmpty:!1,showButtons:!0,clickoutFiresChange:!0,showInitial:!1,showPalette:!1,showPaletteOnly:!1,hideAfterPaletteSelect:!1,togglePaletteOnly:!1,showSelectionPalette:!0,localStorageKey:!1,appendTo:"body",maxSelectionSize:8,locale:"en",cancelText:"cancel",chooseText:"choose",togglePaletteMoreText:"more",togglePaletteLessText:"less",clearText:"Clear Color Selection",preferredFormat:"hex",className:"",containerClassName:"",replacerClassName:"",showAlpha:!1,theme:"epo",palette:[["#000000","#444444","#5b5b5b","#999999","#bcbcbc","#eeeeee","#f3f6f4","#ffffff"],["#f44336","#744700","#ce7e00","#8fce00","#2986cc","#16537e","#6a329f","#c90076"],["#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#cfe2f3","#d9d2e9","#ead1dc"],["#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#9fc5e8","#b4a7d6","#d5a6bd"],["#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6fa8dc","#8e7cc3","#c27ba0"],["#cc0000","#e69138","#f1c232","#6aa84f","#45818e","#3d85c6","#674ea7","#a64d79"],["#990000","#b45f06","#bf9000","#38761d","#134f5c","#0b5394","#351c75","#741b47"],["#660000","#783f04","#7f6000","#274e13","#0c343d","#073763","#20124d","#4c1130"]],selectionPalette:[],disabled:!1,offset:null},Dt=[],Lt=!!/msie/i.exec(window.navigator.userAgent),Bt=((t=document.createElement("div").style).cssText="background-color:rgba(0,0,0,.5)",e(t.backgroundColor,"rgba")||e(t.backgroundColor,"hsla")),$t=['<button type="button" class="sp-replacer">','<span class="sp-preview"><span class="sp-preview-inner"></span></span>','<span class="sp-dd">&#9660;</span>',"</button>"].join(""),Kt=function(){var t,e="";if(Lt)for(t=1;t<=6;t++)e+="<div class='sp-"+t+"'></div>";return["<div class='sp-container sp-hidden'>","<div class='sp-palette-container'>","<div class='sp-palette sp-thumb sp-cf'></div>","<div class='sp-palette-button-container sp-cf'>","<button type='button' class='sp-palette-toggle'></button>","</div>","</div>","<div class='sp-picker-container'>","<div class='sp-top sp-cf'>","<div class='sp-fill'></div>","<div class='sp-top-inner'>","<div class='sp-color'>","<div class='sp-sat'>","<div class='sp-val'>","<div class='sp-dragger' tabindex='0'></div>","</div>","</div>","</div>","<div class='sp-clear sp-clear-display'>","</div>","<div class='sp-hue'>","<div class='sp-slider' tabindex='0'></div>",e,"</div>","</div>","<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle' tabindex='0'></div></div></div>","</div>","<div class='sp-input-container sp-cf'>","<input class='sp-input' type='text' spellcheck='false'>","</div>","<div class='sp-initial sp-thumb sp-cf'></div>","<div class='sp-button-container sp-cf'>","<button type='button' class='sp-cancel'></button>","<button type='button' class='sp-choose'></button>","</div>","</div>","</div>"].join("")}();function e(t,e){return 1!==(""+t).indexOf(e)}function Vt(t,e,a,n){for(var r,o,s,i,l=[],c=0;c<t.length;c++)(s=t[c])?(o=(r=Nt(s)).toHsl().l<.5?"sp-thumb-el sp-thumb-dark":"sp-thumb-el sp-thumb-light",o+=Nt.equals(e,s)?" sp-thumb-active":"",s=r.toString(n.preferredFormat||"rgb"),i=Bt?"background-color:"+r.toRgbString():"filter:"+r.toFilter(),l.push('<span title="'+s+'" data-color="'+r.toRgbString()+'" class="'+o+'" role="button" tabindex="0"><span class="sp-thumb-inner" style="'+i+';"></span></span>')):l.push('<span class="sp-thumb-el sp-clear-display" role="button" tabindex="0"><span class="sp-clear-palette-only" style="background-color: transparent;"></span></span>');return"<div class='sp-cf "+a+"'>"+l.join("")+"</div>"}function s(t,e){n=t,(e=e).locale=e.locale||window.navigator.language,e.locale&&(e.locale=e.locale.split("-")[0].toLowerCase()),"en"!==e.locale&&It.spectrum.localization[e.locale]&&(e=It.extend({},It.spectrum.localization[e.locale],e)),(e=It.extend({},qt,e)).callbacks={move:Wt(e.move,n),change:Wt(e.change,n),show:Wt(e.show,n),hide:Wt(e.hide,n),beforeShow:Wt(e.beforeShow,n)};var E,I,N,q,D,a,l=e,n=l.type,c="flat"===n,L=l.showSelectionPalette,r=l.localStorageKey,e=l.theme,o=l.callbacks,B=(I=j,function(){var t=this,e=arguments;q&&clearTimeout(D),!q&&D||(D=setTimeout(function(){D=null,I.apply(t,e)},N))}),f=!(N=10),$=!1,u=0,d=0,h=0,K=0,V=0,U=0,W=0,s=0,X=0,Y=0,i=1,p=[],G=[],Q={},g=l.selectionPalette.slice(0),J=l.maxSelectionSize,Z="sp-dragging",tt=!1,b=null,et=t.ownerDocument,m=It(t),at=!1,v=It(Kt,et).addClass(e),nt=v.find(".sp-picker-container"),rt=v.find(".sp-color"),ot=v.find(".sp-dragger"),st=v.find(".sp-hue"),it=v.find(".sp-slider"),lt=v.find(".sp-alpha-inner"),ct=v.find(".sp-alpha"),ft=v.find(".sp-alpha-handle"),w=v.find(".sp-input"),ut=v.find(".sp-palette"),dt=v.find(".sp-initial"),t=v.find(".sp-cancel"),ht=v.find(".sp-clear"),pt=v.find(".sp-choose"),gt=v.find(".sp-palette-toggle"),bt=m.is("input"),mt=bt&&"color"===n,y=mt?It($t).addClass(e).addClass(l.className).addClass(l.replacerClassName):It([]),vt=mt?y:m,_=y.find(".sp-preview-inner"),x=l.color||bt&&m.val(),k=!1,A=l.preferredFormat,wt=!l.showButtons||l.clickoutFiresChange,S=!x,C=l.allowEmpty,P=null,R=null,yt=null,_t=null,e=m.attr("id");function xt(){var t,e,a;if(l.showPaletteOnly&&(l.showPalette=!0),gt.text(l.showPaletteOnly?l.togglePaletteMoreText:l.togglePaletteLessText),l.palette){for(p=l.palette.slice(0),G=Array.isArray(p[0])?p:[p],Q={},t=0;t<G.length;t++)for(e=0;e<G[t].length;e++)a=Nt(G[t][e]).toRgbString(),Q[a]=!0;l.showPaletteOnly&&!x&&(x=(""===p[0][0]?p[0]:Object.keys(Q))[0])}v.toggleClass("sp-flat",c),v.toggleClass("sp-input-disabled",!l.showInput),v.toggleClass("sp-alpha-enabled",l.showAlpha),v.toggleClass("sp-clear-enabled",C),v.toggleClass("sp-buttons-disabled",!l.showButtons),v.toggleClass("sp-palette-buttons-disabled",!l.togglePaletteOnly),v.toggleClass("sp-palette-disabled",!l.showPalette),v.toggleClass("sp-palette-only",l.showPaletteOnly),v.toggleClass("sp-initial-disabled",!l.showInitial),v.addClass(l.className).addClass(l.containerClassName),j()}function kt(){var t,e;if(r){try{1<(e=(t=window.localStorage)[r].split(",#")).length&&(delete t[r],It.each(e,function(t,e){At(e)}))}catch(t){window.console.log(t)}try{g=window.localStorage[r].split(";")}catch(t){window.console.log(t)}}}function At(t){if(L){if(t=Nt(t).toRgbString(),!Q[t]&&-1===It.inArray(t,g))for(g.push(t);g.length>J;)g.shift();if(r)try{window.localStorage[r]=g.join(";")}catch(t){window.console.log(t)}}}function St(){var a=T(),t=It.map(G,function(t,e){return Vt(t,a,"sp-palette-row sp-palette-row-"+e,l)});kt(),g&&t.push(Vt(function(){var t,e,a=[];if(l.showPalette)for(t=0;t<g.length;t++)e=Nt(g[t]).toRgbString(),Q[e]||a.push(g[t]);return a.reverse().slice(0,l.maxSelectionSize)}(),a,"sp-palette-row sp-palette-row-selection",l)),ut.html(t.join(""))}function Ct(){var t,e;l.showInitial&&(t=k,e=T(),dt.html(Vt([t,e],e,"sp-palette-row-initial",l)))}function Pt(){(d<=0||u<=0||K<=0)&&j(),$=!0,v.addClass(Z),b=null,m.trigger("dragstart.spectrum",[T()])}function Rt(){$=!1,v.removeClass(Z),m.trigger("dragstop.spectrum",[T()])}function Ft(t){tt?tt=!1:null!==t&&""!==t||!C?(t=Nt(t)).isValid()?(H(t),M(),z()):w.addClass("sp-validation-error"):(H(null),M(),z())}function Ht(){var t=It.Event("beforeShow.spectrum");if(f)j();else if(m.trigger(t,[T()]),!1!==o.beforeShow(T())&&!t.isDefaultPrevented()){for(var e=0;e<Dt.length;e++)Dt[e]&&Dt[e].hide();f=!0,It(et).on("keydown.spectrum",Tt),It(et).on("click.spectrum",Mt),It(window).on("resize.spectrum",B),y.attr("aria-expanded",!0),y.addClass("sp-active"),v.removeClass("sp-hidden"),j(),O(),k=T(),Ct(),o.show(k),m.trigger("show.spectrum",[k])}}function Tt(t){27===t.keyCode&&F()}function Mt(t){2===t.button||$||(wt?z(!0):Ot(),F())}function F(){f&&!c&&(f=!1,It(et).off("keydown.spectrum",Tt),It(et).off("click.spectrum",Mt),It(window).off("resize.spectrum",B),y.attr("aria-expanded",!1),y.removeClass("sp-active"),v.addClass("sp-hidden"),o.hide(T()),m.trigger("hide.spectrum",[T()]))}function Ot(){H(k,!0),z(!0)}function H(t,e){var a;Nt.equals(t,T())?O():(t&&void 0!==t||!C?(S=!1,t=(a=Nt(t)).toHsv(),s=t.h%360/360,X=t.s,Y=t.v,i=t.a):S=!0,O(),a&&a.isValid()&&!e&&(A=l.preferredFormat||a.getFormat()))}function T(t){return t=t||{},C&&S?null:Nt.fromRatio({h:s,s:X,v:Y,a:Math.round(1e3*i)/1e3},{format:t.format||A})}function M(){O(),o.move(T()),m.trigger("move.spectrum",[T()])}function O(){var t,e,a,n,r,o;w.removeClass("sp-validation-error"),zt(),t=Nt.fromRatio({h:s,s:1,v:1}),rt.css("background-color",t.toHexString()),t=A,e=T({format:t=!(i<1)||0===i&&"name"===A||"hex"!==A&&"hex3"!==A&&"hex6"!==A&&"name"!==A?A:"rgb"}),a="",_.removeClass("sp-clear-display"),_.css("background-color","transparent"),!e&&C?_.addClass("sp-clear-display"):(n=e.toHexString(),o=e.toRgbString(),Bt||1===e.alpha?_.css("background-color",o):(_.css("background-color","transparent"),_.css("filter",e.toFilter())),l.showAlpha&&((o=e.toRgb()).a=0,r="linear-gradient(left, "+(o=Nt(o).toRgbString())+", "+n+")",Lt?lt.css("filter",Nt(o).toFilter({gradientType:1},n)):(lt.css("background","-webkit-"+r),lt.css("background","-moz-"+r),lt.css("background","-ms-"+r),lt.css("background","linear-gradient(to right, "+o+", "+n+")"))),a=e.toString(t)),l.showInput&&w.val(a),m.val(a),"text"!==l.type&&"component"!==l.type||((r=e)&&R?(o=r.isLight()||r.getAlpha()<.4?"black":"white",R.css("background-color",r.toRgbString()).css("color",o)):R.css("background-color",_t).css("color",yt)),l.showPalette&&St(),Ct()}function zt(){var t=X,e=Y;C&&S?(ft.hide(),it.hide(),ot.hide()):(ft.show(),it.show(),ot.show(),t=t*u,e=d-e*d,t=Math.max(-h,Math.min(u-h,t-h)),e=Math.max(-h,Math.min(d-h,e-h)),ot.css({top:e+"px",left:t+"px"}),e=i*V,ft.css({left:e-U/2+"px"}),t=s*K,it.css({top:t-W+"px"}))}function z(t){var e=T(),a=!Nt.equals(e,k);e&&At(e),t&&a&&(o.change(e),tt=!0,m.trigger("change",[e]))}function j(){var t,e,a,n,r,o,s,i;f&&(u=rt.width(),d=rt.height(),h=ot.height(),K=st.height(),W=it.height(),V=ct.width(),U=ft.width(),c||(v.attr("aria-haspopup",!0),v.css("position","absolute"),l.offset?v.offset(l.offset):v.offset((e=vt,a=(t=v).outerWidth(),n=t.outerHeight(),r=e.outerHeight(),t=t[0].ownerDocument,o=t.documentElement,s=o.clientWidth+It(t).scrollLeft(),o=o.clientHeight+It(t).scrollTop(),e=(t=e.offset()).left,i=t.top,i+=r,e-=Math.min(e,s<e+a&&a<s?Math.abs(e+a-s):0),{top:i-=Math.min(i,o<i+n&&n<o?Math.abs(+(n+r)):0),bottom:t.bottom,left:e,right:t.right,width:t.width,height:t.height}))),zt(),l.showPalette&&St(),m.trigger("reflow.spectrum"))}function jt(){F(),at=!0,m.attr("disabled",!0),vt.addClass("sp-disabled")}function Et(t){return(t.data&&t.data.ignore?(H(It(t.target).closest(".sp-thumb-el").data("color")),M):(H(It(t.target).closest(".sp-thumb-el").data("color")),M(),l.hideAfterPaletteSelect?(z(!0),F):z))(),!1}return void 0!==e&&0<e.length&&(bt=It('label[for="'+e+'"]')).length&&bt.on("click",function(t){return t.preventDefault(),m.spectrum("show"),!1}),Lt&&v.find("*:not(input)").attr("unselectable","on"),xt(),P=It('<span class="sp-original-input-container"></span>'),["margin"].forEach(function(t){P.css(t,m.css(t))}),"block"===m.css("display")&&P.css("display","flex"),mt?m.after(y).hide():"text"===n?(P.addClass("sp-colorize-container"),m.addClass("spectrum sp-colorize").wrap(P)):"component"===n&&(m.addClass("spectrum").wrap(P),(a=It(["<div class='sp-colorize-container sp-add-on'>","<div class='sp-colorize'></div> ","</div>"].join(""))).width(m.outerHeight()+"px").css("border-radius",m.css("border-radius")).css("border",m.css("border")),m.addClass("with-add-on").before(a)),R=m.parent().find(".sp-colorize"),yt=R.css("color"),_t=R.css("background-color"),C||ht.hide(),c?m.after(v).hide():(a=1!==(a="parent"===l.appendTo?m.parent():It(l.appendTo)).length?It("body"):a).append(v),kt(),vt.on("click.spectrum touchstart.spectrum",function(t){at||Ht(),t.stopPropagation(),It(t.target).is("input")||t.preventDefault()}),!m.is(":disabled")&&!0!==l.disabled||jt(),v.on("click",Ut),v.on("keydown",'div[role="button"]',function(t){13===t.keyCode&&(t.preventDefault(),It(this).click())}),[w,m].forEach(function(e){e.on("change",function(){Ft(e.val())}),e.on("paste",function(){setTimeout(function(){Ft(e.val())},1)}),e.on("keydown",function(t){13===t.keyCode&&(Ft(It(e).val()),e==m)&&F()})}),t.text(l.cancelText),t.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),Ot(),F()}),ht.attr("title",l.clearText),ht.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),S=!0,M(),c&&z(!0)}),pt.text(l.chooseText),pt.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),Lt&&w.is(":focus")&&w.trigger("change"),w.hasClass("sp-validation-error")||(z(!0),F())}),gt.text(l.showPaletteOnly?l.togglePaletteMoreText:l.togglePaletteLessText),gt.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),l.showPaletteOnly=!l.showPaletteOnly,l.showPaletteOnly||c||v.css("left","-="+(nt.outerWidth(!0)+5)),xt()}),Xt(ct,function(t,e,a){i=t/V,S=!1,a.shiftKey&&(i=Math.round(10*i)/10),M()},Pt,Rt),Xt(st,function(t,e){s=parseFloat(e/K),S=!1,l.showAlpha||(i=1),M()},Pt,Rt),Xt(rt,function(t,e,a){var n;a.shiftKey?b||(a=X*u,n=d-Y*d,a=Math.abs(t-a)>Math.abs(e-n),b=a?"x":"y"):b=null,n=!b||"y"===b,b&&"x"!==b||(X=parseFloat(t/u)),n&&(Y=parseFloat((d-e)/d)),S=!1,l.showAlpha||(i=1),M()},Pt,Rt),!1!==x&&""!==x?(H(x),O(),A=Nt(x).format||l.preferredFormat,At(x)):(""===x&&H(x),O()),c&&Ht(),ut.on(a=Lt?"mousedown.spectrum":"click.spectrum touchstart.spectrum",".sp-thumb-el",Et),dt.on(a,".sp-thumb-el:nth-child(1)",{ignore:!0},Et),(E={show:Ht,hide:F,toggle:function(){(f?F:Ht)()},reflow:j,option:function(t,e){return void 0===t?It.extend({},l):void 0===e?l[t]:(l[t]=e,"preferredFormat"===t&&(A=l.preferredFormat),void xt())},enable:function(){at=!1,m.attr("disabled",!1),vt.removeClass("sp-disabled")},disable:jt,offset:function(t){l.offset=t,j()},set:function(t){H(t),z()},get:T,destroy:function(){var t;m.show().removeClass("spectrum with-add-on sp-colorize"),vt.off("click.spectrum touchstart.spectrum"),v.remove(),y.remove(),R&&R.css("background-color",_t).css("color",yt),0<(t=m.closest(".sp-original-input-container")).length&&t.after(m).remove(),Dt[E.id]=null},container:v}).id=Dt.push(E)-1,E}function a(){}function Ut(t){t.stopPropagation()}function Wt(t,e){var a=Array.prototype.slice,n=a.call(arguments,2);return function(){return t.apply(e,n.concat(a.call(arguments)))}}function Xt(n,r,e,t){var o=document,s=!1,i={},l=0,c=0,f="ontouchstart"in window,a={};function u(t){t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.returnValue=!1}function d(t){var e,a;if(s){if(Lt&&o.documentMode<9&&!t.button)return h();e=(a=t.originalEvent&&t.originalEvent.touches&&t.originalEvent.touches[0])&&a.pageX||t.pageX,a=a&&a.pageY||t.pageY,e=Math.max(0,Math.min(e-i.left,c)),a=Math.max(0,Math.min(a-i.top,l)),f&&u(t),r.apply(n,[e,a,t])}}function h(){s&&(It(o).off(a),It(o.body).removeClass("sp-dragging"),setTimeout(function(){t.apply(n,arguments)},0)),s=!1}r=r||function(){},e=e||function(){},t=t||function(){},a.selectstart=u,a.dragstart=u,a["touchmove mousemove"]=d,a["touchend mouseup"]=h,It(n).on("touchstart mousedown",function(t){(t.which?3===t.which:2===t.button)||s||!1!==e.apply(n,arguments)&&(s=!0,l=It(n).height(),c=It(n).width(),i=It(n).offset(),It(o).on(a),It(o.body).addClass("sp-dragging"),d(t),u(t))})}function n(){return It.fn.spectrum.inputTypeColorSupport()}It.fn.spectrum=function(e){var t,a,n,r;return"string"==typeof e?(t=this,a=Array.prototype.slice.call(arguments,1),this.each(function(){if(n=Dt[It(this).data(o)]){if(!(r=n[e]))throw new Error("Spectrum: no such method: '"+e+"'");"get"===e?t=n.get():"container"===e?t=n.container:"option"===e?t=n.option.apply(n,a):"destroy"===e?(n.destroy(),It(this).removeData(o)):r.apply(n,a)}}),t):this.spectrum("destroy").each(function(){var t=It.extend({},It(this).data(),e);It(this).is("input")?t.flat||"flat"===t.type?t.type="flat":"color"===It(this).attr("type")&&(t.type="color"):t.type="noInput",t=s(this,t),It(this).data(o,t.id)})},It.fn.spectrum.load=!0,It.fn.spectrum.loadOpts={},It.fn.spectrum.draggable=Xt,It.fn.spectrum.defaults=qt,It.fn.spectrum.inputTypeColorSupport=function(){var t;return void 0===n._cachedResult&&(t=It("<input type='color'>")[0],n._cachedResult="color"===t.type&&""!==t.value),n._cachedResult},It.spectrum={},It.spectrum.localization={},It.spectrum.palettes={},It.fn.spectrum.processNativeColorInputs=function(){var t=It("input[type=color]");t.length&&!n()&&t.spectrum({preferredFormat:"hex6"})},It(function(){It.fn.spectrum.load&&It.fn.spectrum.processNativeColorInputs()})});assets/js/jquery.resizestop.min.js000064400000001317150755142450013341 0ustar00!function(s){"use strict";var t=Array.prototype.slice;s.extend(s.event.special,{resizestop:{add:function(e){var i=e.handler;s(this).on("resize",function(t){clearTimeout(i._timer),t.type="resizestop",t=s.proxy(i,this,t),i._timer=setTimeout(t,e.data||200)})}},resizestart:{add:function(e){var i=e.handler;s(this).on("resize",function(t){clearTimeout(i._timer),i._started||(t.type="resizestart",i.apply(this,arguments),i._started=!0),i._timer=setTimeout(s.proxy(function(){i._started=!1},this),e.data||300)})}}}),s.extend(s.fn,{resizestop:function(){s(this).on.apply(this,["resizestop"].concat(t.call(arguments)))},resizestart:function(){s(this).on.apply(this,["resizestart"].concat(t.call(arguments)))}})}(window.jQuery);assets/js/owl.carousel.js000064400000273024150755142450011455 0ustar00/**
 * Owl Carousel v2.3.4
 * Copyright 2013-2018 David Deutsch
 * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE
 * reformatted code by ThemeComplete
 */
/**
 * Owl carousel
 *
 * @param {jQuery}   $
 * @param {Window}   window
 * @param {Document} document
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 * @todo Lazy Load Icon
 * @todo prevent animationend bubling
 * @todo itemsScaleUp
 * @todo Test Zepto
 * @todo stagePadding calculate wrong active classes
 */
( function( $, window, document ) {
	'use strict';

	/**
	 * Creates a carousel.
	 *
	 * @class The Owl Carousel.
	 * @public
	 * @param {HTMLElement|jQuery} element   - The element to create the carousel for.
	 * @param {Object}             [options] - The options
	 */
	function Owl( element, options ) {
		/**
		 * Current settings for the carousel.
		 *
		 * @public
		 */
		this.settings = null;

		/**
		 * Current options set by the caller including defaults.
		 *
		 * @public
		 */
		this.options = $.extend( {}, Owl.Defaults, options );

		/**
		 * Plugin element.
		 *
		 * @public
		 */
		this.$element = $( element );

		/**
		 * Proxied event handlers.
		 *
		 * @protected
		 */
		this._handlers = {};

		/**
		 * References to the running plugins of this carousel.
		 *
		 * @protected
		 */
		this._plugins = {};

		/**
		 * Currently suppressed events to prevent them from being retriggered.
		 *
		 * @protected
		 */
		this._supress = {};

		/**
		 * Absolute current position.
		 *
		 * @protected
		 */
		this._current = null;

		/**
		 * Animation speed in milliseconds.
		 *
		 * @protected
		 */
		this._speed = null;

		/**
		 * Coordinates of all items in pixel.
		 *
		 * @todo The name of this member is missleading.
		 * @protected
		 */
		this._coordinates = [];

		/**
		 * Current breakpoint.
		 *
		 * @todo Real media queries would be nice.
		 * @protected
		 */
		this._breakpoint = null;

		/**
		 * Current width of the plugin element.
		 */
		this._width = null;

		/**
		 * All real items.
		 *
		 * @protected
		 */
		this._items = [];

		/**
		 * All cloned items.
		 *
		 * @protected
		 */
		this._clones = [];

		/**
		 * Merge values of all items.
		 *
		 * @todo Maybe this could be part of a plugin.
		 * @protected
		 */
		this._mergers = [];

		/**
		 * Widths of all items.
		 */
		this._widths = [];

		/**
		 * Invalidated parts within the update process.
		 *
		 * @protected
		 */
		this._invalidated = {};

		/**
		 * Ordered list of workers for the update process.
		 *
		 * @protected
		 */
		this._pipe = [];

		/**
		 * Current state information for the drag operation.
		 *
		 * @todo #261
		 * @protected
		 */
		this._drag = {
			time: null,
			target: null,
			pointer: null,
			stage: {
				start: null,
				current: null
			},
			direction: null
		};

		/**
		 * Current state information and their tags.
		 *
		 * @type {Object}
		 * @protected
		 */
		this._states = {
			current: {},
			tags: {
				initializing: [ 'busy' ],
				animating: [ 'busy' ],
				dragging: [ 'interacting' ]
			}
		};

		$.each(
			[ 'onResize', 'onThrottledResize' ],
			$.proxy( function( i, handler ) {
				this._handlers[ handler ] = $.proxy( this[ handler ], this );
			}, this )
		);

		$.each(
			Owl.Plugins,
			$.proxy( function( key, Plugin ) {
				this._plugins[ key.charAt( 0 ).toLowerCase() + key.slice( 1 ) ] = new Plugin( this );
			}, this )
		);

		$.each(
			Owl.Workers,
			$.proxy( function( priority, worker ) {
				this._pipe.push( {
					filter: worker.filter,
					run: $.proxy( worker.run, this )
				} );
			}, this )
		);

		this.setup();
		this.initialize();
	}

	/**
	 * Default options for the carousel.
	 *
	 * @public
	 */
	Owl.Defaults = {
		items: 3,
		loop: false,
		center: false,
		rewind: false,
		checkVisibility: true,

		mouseDrag: true,
		touchDrag: true,
		pullDrag: true,
		freeDrag: false,

		margin: 0,
		stagePadding: 0,

		merge: false,
		mergeFit: true,
		autoWidth: false,

		startPosition: 0,
		rtl: false,

		smartSpeed: 250,
		fluidSpeed: false,
		dragEndSpeed: false,

		responsive: {},
		responsiveRefreshRate: 200,
		responsiveBaseElement: window,

		fallbackEasing: 'linear',
		slideTransition: '',

		info: false,

		nestedItemSelector: false,
		itemElement: 'div',
		stageElement: 'div',

		refreshClass: 'owl-refresh',
		loadedClass: 'owl-loaded',
		loadingClass: 'owl-loading',
		rtlClass: 'owl-rtl',
		responsiveClass: 'owl-responsive',
		dragClass: 'owl-drag',
		itemClass: 'owl-item',
		stageClass: 'owl-stage',
		stageOuterClass: 'owl-stage-outer',
		grabClass: 'owl-grab'
	};

	/**
	 * Enumeration for width.
	 *
	 * @public
	 * @readonly
	 * @enum {string}
	 */
	Owl.Width = {
		Default: 'default',
		Inner: 'inner',
		Outer: 'outer'
	};

	/**
	 * Enumeration for types.
	 *
	 * @public
	 * @readonly
	 * @enum {string}
	 */
	Owl.Type = {
		Event: 'event',
		State: 'state'
	};

	/**
	 * Contains all registered plugins.
	 *
	 * @public
	 */
	Owl.Plugins = {};

	/**
	 * List of workers involved in the update process.
	 */
	Owl.Workers = [
		{
			filter: [ 'width', 'settings' ],
			run: function() {
				this._width = this.$element.width();
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function( cache ) {
				cache.current = this._items && this._items[ this.relative( this._current ) ];
			}
		},
		{
			filter: [ 'items', 'settings' ],
			run: function() {
				this.$stage.children( '.cloned' ).remove();
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function( cache ) {
				var margin = this.settings.margin || '',
					grid = ! this.settings.autoWidth,
					rtl = this.settings.rtl,
					css = {
						width: 'auto',
						'margin-left': rtl ? margin : '',
						'margin-right': rtl ? '' : margin
					};

				if ( ! grid ) {
					this.$stage.children().css( css );
				}

				cache.css = css;
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function( cache ) {
				var width = ( this.width() / this.settings.items ).toFixed( 3 ) - this.settings.margin,
					merge = null,
					iterator = this._items.length,
					grid = ! this.settings.autoWidth,
					widths = [];

				cache.items = {
					merge: false,
					width: width
				};

				while ( iterator > 0 ) {
					iterator = iterator - 1;
					merge = this._mergers[ iterator ];
					merge = ( this.settings.mergeFit && Math.min( merge, this.settings.items ) ) || merge;

					cache.items.merge = merge > 1 || cache.items.merge;

					widths[ iterator ] = ! grid ? this._items[ iterator ].width() : width * merge;
				}

				this._widths = widths;
			}
		},
		{
			filter: [ 'items', 'settings' ],
			run: function() {
				var clones = [],
					items = this._items,
					settings = this.settings,
					// TODO: Should be computed from number of min width items in stage
					view = Math.max( settings.items * 2, 4 ),
					size = Math.ceil( items.length / 2 ) * 2,
					repeat = settings.loop && items.length ? ( settings.rewind ? view : Math.max( view, size ) ) : 0,
					append = '',
					prepend = '';

				repeat /= 2;

				while ( repeat > 0 ) {
					// Switch to only using appended clones
					clones.push( this.normalize( clones.length / 2, true ) );
					append = append + items[ clones[ clones.length - 1 ] ][ 0 ].outerHTML;
					clones.push( this.normalize( items.length - 1 - ( ( clones.length - 1 ) / 2 ), true ) );
					prepend = items[ clones[ clones.length - 1 ] ][ 0 ].outerHTML + prepend;
					repeat -= 1;
				}

				this._clones = clones;

				$( append ).addClass( 'cloned' ).appendTo( this.$stage );
				$( prepend ).addClass( 'cloned' ).prependTo( this.$stage );
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function() {
				var rtl = this.settings.rtl ? 1 : -1,
					size = this._clones.length + this._items.length,
					iterator = 0,
					previous = 0,
					current = 0,
					coordinates = [];

				while ( iterator < size ) {
					previous = coordinates[ iterator - 1 ] || 0;
					current = this._widths[ this.relative( iterator ) ] + this.settings.margin;
					coordinates.push( previous + ( current * rtl ) );
					iterator = iterator + 1;
				}

				this._coordinates = coordinates;
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function() {
				var padding = this.settings.stagePadding,
					coordinates = this._coordinates,
					css = {
						width: Math.ceil( Math.abs( coordinates[ coordinates.length - 1 ] ) ) + ( padding * 2 ),
						'padding-left': padding || '',
						'padding-right': padding || ''
					};

				this.$stage.css( css );
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function( cache ) {
				var iterator = this._coordinates.length,
					grid = ! this.settings.autoWidth,
					items = this.$stage.children();

				if ( grid && cache.items.merge ) {
					while ( iterator > 0 ) {
						iterator = iterator - 1;
						cache.css.width = this._widths[ this.relative( iterator ) ];
						items.eq( iterator ).css( cache.css );
					}
				} else if ( grid ) {
					cache.css.width = cache.items.width;
					items.css( cache.css );
				}
			}
		},
		{
			filter: [ 'items' ],
			run: function() {
				if ( this._coordinates.length < 1 ) {
					this.$stage.removeAttr( 'style' );
				}
			}
		},
		{
			filter: [ 'width', 'items', 'settings' ],
			run: function( cache ) {
				cache.current = cache.current ? this.$stage.children().index( cache.current ) : 0;
				cache.current = Math.max( this.minimum(), Math.min( this.maximum(), cache.current ) );
				this.reset( cache.current );
			}
		},
		{
			filter: [ 'position' ],
			run: function() {
				this.animate( this.coordinates( this._current ) );
			}
		},
		{
			filter: [ 'width', 'position', 'items', 'settings' ],
			run: function() {
				var rtl = this.settings.rtl ? 1 : -1,
					padding = this.settings.stagePadding * 2,
					begin = this.coordinates( this.current() ) + padding,
					end = begin + ( this.width() * rtl ),
					inner,
					outer,
					matches = [],
					i,
					n;

				for ( i = 0, n = this._coordinates.length; i < n; i += 1 ) {
					inner = this._coordinates[ i - 1 ] || 0;
					outer = Math.abs( this._coordinates[ i ] ) + ( padding * rtl );

					if ( ( this.op( inner, '<=', begin ) && this.op( inner, '>', end ) ) || ( this.op( outer, '<', begin ) && this.op( outer, '>', end ) ) ) {
						matches.push( i );
					}
				}

				this.$stage.children( '.active' ).removeClass( 'active' );
				this.$stage.children( ':eq(' + matches.join( '), :eq(' ) + ')' ).addClass( 'active' );

				this.$stage.children( '.center' ).removeClass( 'center' );
				if ( this.settings.center ) {
					this.$stage.children().eq( this.current() ).addClass( 'center' );
				}
			}
		}
	];

	/**
	 * Create the stage DOM element
	 */
	Owl.prototype.initializeStage = function() {
		this.$stage = this.$element.find( '.' + this.settings.stageClass );

		// if the stage is already in the DOM, grab it and skip stage initialization
		if ( this.$stage.length ) {
			return;
		}

		this.$element.addClass( this.options.loadingClass );

		// create stage
		this.$stage = $( '<' + this.settings.stageElement + '>', {
			class: this.settings.stageClass
		} ).wrap(
			$( '<div/>', {
				class: this.settings.stageOuterClass
			} )
		);

		// append stage
		this.$element.append( this.$stage.parent() );
	};

	/**
	 * Create item DOM elements
	 */
	Owl.prototype.initializeItems = function() {
		var $items = this.$element.find( '.owl-item' );

		// if the items are already in the DOM, grab them and skip item initialization
		if ( $items.length ) {
			this._items = $items.get().map( function( item ) {
				return $( item );
			} );

			this._mergers = this._items.map( function() {
				return 1;
			} );

			this.refresh();

			return;
		}

		// append content
		this.replace( this.$element.children().not( this.$stage.parent() ) );

		// check visibility
		if ( this.isVisible() ) {
			// update view
			this.refresh();
		} else {
			// invalidate width
			this.invalidate( 'width' );
		}

		this.$element.removeClass( this.options.loadingClass ).addClass( this.options.loadedClass );
	};

	/**
	 * Initializes the carousel.
	 *
	 * @protected
	 */
	Owl.prototype.initialize = function() {
		var imgs, nestedSelector, width;
		this.enter( 'initializing' );
		this.trigger( 'initialize' );

		this.$element.toggleClass( this.settings.rtlClass, this.settings.rtl );

		if ( this.settings.autoWidth && ! this.is( 'pre-loading' ) ) {
			imgs = this.$element.find( 'img' );
			nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
			width = this.$element.children( nestedSelector ).width();

			if ( imgs.length && width <= 0 ) {
				this.preloadAutoWidthImages( imgs );
			}
		}

		this.initializeStage();
		this.initializeItems();

		// register event handlers
		this.registerEventHandlers();

		this.leave( 'initializing' );
		this.trigger( 'initialized' );
	};

	/**
	 * @returns {boolean} visibility of $element
	 *                    if you know the carousel will always be visible you can set `checkVisibility` to `false` to
	 *                    prevent the expensive browser layout forced reflow the $element.is(':visible') does
	 */
	Owl.prototype.isVisible = function() {
		return this.settings.checkVisibility ? this.$element.is( ':visible' ) : true;
	};

	/**
	 * Setups the current settings.
	 *
	 * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
	 * @todo Support for media queries by using `matchMedia` would be nice.
	 * @public
	 */
	Owl.prototype.setup = function() {
		var viewport = this.viewport(),
			overwrites = this.options.responsive,
			match = -1,
			settings = null;

		if ( ! overwrites ) {
			settings = $.extend( {}, this.options );
		} else {
			$.each( overwrites, function( breakpoint ) {
				if ( breakpoint <= viewport && breakpoint > match ) {
					match = Number( breakpoint );
				}
			} );

			settings = $.extend( {}, this.options, overwrites[ match ] );
			if ( typeof settings.stagePadding === 'function' ) {
				settings.stagePadding = settings.stagePadding();
			}
			delete settings.responsive;

			// responsive class
			if ( settings.responsiveClass ) {
				this.$element.attr( 'class', this.$element.attr( 'class' ).replace( new RegExp( '(' + this.options.responsiveClass + '-)\\S+\\s', 'g' ), '$1' + match ) );
			}
		}

		this.trigger( 'change', { property: { name: 'settings', value: settings } } );
		this._breakpoint = match;
		this.settings = settings;
		this.invalidate( 'settings' );
		this.trigger( 'changed', { property: { name: 'settings', value: this.settings } } );
	};

	/**
	 * Updates option logic if necessery.
	 *
	 * @protected
	 */
	Owl.prototype.optionsLogic = function() {
		if ( this.settings.autoWidth ) {
			this.settings.stagePadding = false;
			this.settings.merge = false;
		}
	};

	/**
	 * Prepares an item before add.
	 *
	 * @param {mixed} item
	 * @todo Rename event parameter `content` to `item`.
	 * @protected
	 * @returns {jQuery|HTMLElement} - The item container.
	 */
	Owl.prototype.prepare = function( item ) {
		var event = this.trigger( 'prepare', { content: item } );

		if ( ! event.data ) {
			event.data = $( '<' + this.settings.itemElement + '/>' )
				.addClass( this.options.itemClass )
				.append( item );
		}

		this.trigger( 'prepared', { content: event.data } );

		return event.data;
	};

	/**
	 * Updates the view.
	 *
	 * @public
	 */
	Owl.prototype.update = function() {
		var i = 0,
			n = this._pipe.length,
			filter = $.proxy( function( p ) {
				return this[ p ];
			}, this._invalidated ),
			cache = {};

		while ( i < n ) {
			if ( this._invalidated.all || $.grep( this._pipe[ i ].filter, filter ).length > 0 ) {
				this._pipe[ i ].run( cache );
			}
			i += 1;
		}

		this._invalidated = {};

		if ( ! this.is( 'valid' ) ) {
			this.enter( 'valid' );
		}
	};

	/**
	 * Gets the width of the view.
	 *
	 * @public
	 * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
	 * @returns {number} - The width of the view in pixel.
	 */
	Owl.prototype.width = function( dimension ) {
		dimension = dimension || Owl.Width.Default;
		switch ( dimension ) {
			case Owl.Width.Inner:
			case Owl.Width.Outer:
				return this._width;
			default:
				return this._width - ( this.settings.stagePadding * 2 ) + this.settings.margin;
		}
	};

	/**
	 * Refreshes the carousel primarily for adaptive purposes.
	 *
	 * @public
	 */
	Owl.prototype.refresh = function() {
		this.enter( 'refreshing' );
		this.trigger( 'refresh' );

		this.setup();

		this.optionsLogic();

		this.$element.addClass( this.options.refreshClass );

		this.update();

		this.$element.removeClass( this.options.refreshClass );

		this.leave( 'refreshing' );
		this.trigger( 'refreshed' );
	};

	/**
	 * Checks window `resize` event.
	 *
	 * @protected
	 */
	Owl.prototype.onThrottledResize = function() {
		window.clearTimeout( this.resizeTimer );
		this.resizeTimer = window.setTimeout( this._handlers.onResize, this.settings.responsiveRefreshRate );
	};

	/**
	 * Checks window `resize` event.
	 *
	 * @protected
	 */
	Owl.prototype.onResize = function() {
		if ( ! this._items.length ) {
			return false;
		}

		if ( this._width === this.$element.width() ) {
			return false;
		}

		if ( ! this.isVisible() ) {
			return false;
		}

		this.enter( 'resizing' );

		if ( this.trigger( 'resize' ).isDefaultPrevented() ) {
			this.leave( 'resizing' );
			return false;
		}

		this.invalidate( 'width' );

		this.refresh();

		this.leave( 'resizing' );
		this.trigger( 'resized' );
	};

	/**
	 * Registers event handlers.
	 *
	 * @todo Check `msPointerEnabled`
	 * @todo #261
	 * @protected
	 */
	Owl.prototype.registerEventHandlers = function() {
		if ( $.support.transition ) {
			this.$stage.on( $.support.transition.end + '.owl.core', $.proxy( this.onTransitionEnd, this ) );
		}

		if ( this.settings.responsive !== false ) {
			this.on( window, 'resize', this._handlers.onThrottledResize );
		}

		if ( this.settings.mouseDrag ) {
			this.$element.addClass( this.options.dragClass );
			this.$stage.on( 'mousedown.owl.core', $.proxy( this.onDragStart, this ) );
			this.$stage.on( 'dragstart.owl.core selectstart.owl.core', function() {
				return false;
			} );
		}

		if ( this.settings.touchDrag ) {
			this.$stage.on( 'touchstart.owl.core', $.proxy( this.onDragStart, this ) );
			this.$stage.on( 'touchcancel.owl.core', $.proxy( this.onDragEnd, this ) );
		}
	};

	/**
	 * Handles `touchstart` and `mousedown` events.
	 *
	 * @todo Horizontal swipe threshold as option
	 * @todo #261
	 * @protected
	 * @param {Event} event - The event arguments.
	 */
	Owl.prototype.onDragStart = function( event ) {
		var stage = null;

		if ( event.which === 3 ) {
			return;
		}

		if ( $.support.transform ) {
			stage = this.$stage
				.css( 'transform' )
				.replace( /.*\(|\)| /g, '' )
				.split( ',' );
			stage = {
				x: stage[ stage.length === 16 ? 12 : 4 ],
				y: stage[ stage.length === 16 ? 13 : 5 ]
			};
		} else {
			stage = this.$stage.position();
			stage = {
				x: this.settings.rtl ? stage.left + this.$stage.width() - this.width() + this.settings.margin : stage.left,
				y: stage.top
			};
		}

		if ( this.is( 'animating' ) ) {
			if ( $.support.transform ) {
				this.animate( stage.x );
			} else {
				this.$stage.stop();
			}

			this.invalidate( 'position' );
		}

		this.$element.toggleClass( this.options.grabClass, event.type === 'mousedown' );

		this.speed( 0 );

		this._drag.time = new Date().getTime();
		this._drag.target = $( event.target );
		this._drag.stage.start = stage;
		this._drag.stage.current = stage;
		this._drag.pointer = this.pointer( event );

		$( document ).on( 'mouseup.owl.core touchend.owl.core', $.proxy( this.onDragEnd, this ) );

		$( document ).one(
			'mousemove.owl.core touchmove.owl.core',
			$.proxy( function( e ) {
				var delta = this.difference( this._drag.pointer, this.pointer( e ) );

				$( document ).on( 'mousemove.owl.core touchmove.owl.core', $.proxy( this.onDragMove, this ) );

				if ( Math.abs( delta.x ) < Math.abs( delta.y ) && this.is( 'valid' ) ) {
					return;
				}

				e.preventDefault();

				this.enter( 'dragging' );
				this.trigger( 'drag' );
			}, this )
		);
	};

	/**
	 * Handles the `touchmove` and `mousemove` events.
	 *
	 * @todo #261
	 * @protected
	 * @param {Event} event - The event arguments.
	 */
	Owl.prototype.onDragMove = function( event ) {
		var minimum = null,
			maximum = null,
			pull = null,
			delta = this.difference( this._drag.pointer, this.pointer( event ) ),
			stage = this.difference( this._drag.stage.start, delta );

		if ( ! this.is( 'dragging' ) ) {
			return;
		}

		event.preventDefault();

		if ( this.settings.loop ) {
			minimum = this.coordinates( this.minimum() );
			maximum = this.coordinates( this.maximum() + 1 ) - minimum;
			stage.x = ( ( ( ( stage.x - minimum ) % maximum ) + maximum ) % maximum ) + minimum;
		} else {
			minimum = this.settings.rtl ? this.coordinates( this.maximum() ) : this.coordinates( this.minimum() );
			maximum = this.settings.rtl ? this.coordinates( this.minimum() ) : this.coordinates( this.maximum() );
			pull = this.settings.pullDrag ? ( -1 * delta.x ) / 5 : 0;
			stage.x = Math.max( Math.min( stage.x, minimum + pull ), maximum + pull );
		}

		this._drag.stage.current = stage;

		this.animate( stage.x );
	};

	/**
	 * Handles the `touchend` and `mouseup` events.
	 *
	 * @todo #261
	 * @todo Threshold for click event
	 * @protected
	 * @param {Event} event - The event arguments.
	 */
	Owl.prototype.onDragEnd = function( event ) {
		var delta = this.difference( this._drag.pointer, this.pointer( event ) ),
			stage = this._drag.stage.current,
			direction,
			isdeltax = delta.x > 0;
		if ( ( isdeltax && ! this.settings.rtl ) || ( this.settings.rtl && ! isdeltax ) ) {
			direction = 'left';
		} else {
			direction = 'right';
		}
		$( document ).off( '.owl.core' );

		this.$element.removeClass( this.options.grabClass );

		if ( ( delta.x !== 0 && this.is( 'dragging' ) ) || ! this.is( 'valid' ) ) {
			this.speed( this.settings.dragEndSpeed || this.settings.smartSpeed );
			this.current( this.closest( stage.x, delta.x !== 0 ? direction : this._drag.direction ) );
			this.invalidate( 'position' );
			this.update();

			this._drag.direction = direction;

			if ( Math.abs( delta.x ) > 3 || new Date().getTime() - this._drag.time > 300 ) {
				this._drag.target.one( 'click.owl.core', function() {
					return false;
				} );
			}
		}

		if ( ! this.is( 'dragging' ) ) {
			return;
		}

		this.leave( 'dragging' );
		this.trigger( 'dragged' );
	};

	/**
	 * Gets absolute position of the closest item for a coordinate.
	 *
	 * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
	 * @protected
	 * @param {number} coordinate - The coordinate in pixel.
	 * @param {string} direction  - The direction to check for the closest item. Ether `left` or `right`.
	 * @return {number} - The absolute position of the closest item.
	 */
	Owl.prototype.closest = function( coordinate, direction ) {
		var position = -1,
			pull = 30,
			width = this.width(),
			coordinates = this.coordinates();

		if ( ! this.settings.freeDrag ) {
			// check closest item
			$.each(
				coordinates,
				$.proxy( function( index, value ) {
					// on a left pull, check on current index
					if ( direction === 'left' && coordinate > value - pull && coordinate < value + pull ) {
						position = index;
						// on a right pull, check on previous index
						// to do so, subtract width from value and set position = index + 1
					} else if ( direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull ) {
						position = index + 1;
					} else if ( this.op( coordinate, '<', value ) && this.op( coordinate, '>', coordinates[ index + 1 ] !== undefined ? coordinates[ index + 1 ] : value - width ) ) {
						position = direction === 'left' ? index + 1 : index;
					}
					return position === -1;
				}, this )
			);
		}

		if ( ! this.settings.loop ) {
			// non loop boundries
			if ( this.op( coordinate, '>', coordinates[ this.minimum() ] ) ) {
				coordinate = this.minimum();
				position = coordinate;
			} else if ( this.op( coordinate, '<', coordinates[ this.maximum() ] ) ) {
				coordinate = this.maximum();
				position = coordinate;
			}
		}

		return position;
	};

	/**
	 * Animates the stage.
	 *
	 * @todo #270
	 * @public
	 * @param {number} coordinate - The coordinate in pixels.
	 */
	Owl.prototype.animate = function( coordinate ) {
		var animate = this.speed() > 0;

		if ( this.is( 'animating' ) ) {
			this.onTransitionEnd();
		}

		if ( animate ) {
			this.enter( 'animating' );
			this.trigger( 'translate' );
		}

		if ( $.support.transform3d && $.support.transition ) {
			this.$stage.css( {
				transform: 'translate3d(' + coordinate + 'px,0px,0px)',
				transition: ( this.speed() / 1000 ) + 's' + ( this.settings.slideTransition ? ' ' + this.settings.slideTransition : '' )
			} );
		} else if ( animate ) {
			this.$stage.animate(
				{
					left: coordinate + 'px'
				},
				this.speed(),
				this.settings.fallbackEasing,
				$.proxy( this.onTransitionEnd, this )
			);
		} else {
			this.$stage.css( {
				left: coordinate + 'px'
			} );
		}
	};

	/**
	 * Checks whether the carousel is in a specific state or not.
	 *
	 * @param {string} state - The state to check.
	 * @returns {boolean} - The flag which indicates if the carousel is busy.
	 */
	Owl.prototype.is = function( state ) {
		return this._states.current[ state ] && this._states.current[ state ] > 0;
	};

	/**
	 * Sets the absolute position of the current item.
	 *
	 * @public
	 * @param {number} [position] - The new absolute position or nothing to leave it unchanged.
	 * @returns {number} - The absolute position of the current item.
	 */
	Owl.prototype.current = function( position ) {
		var event;
		if ( position === undefined ) {
			return this._current;
		}

		if ( this._items.length === 0 ) {
			return undefined;
		}

		position = this.normalize( position );

		if ( this._current !== position ) {
			event = this.trigger( 'change', { property: { name: 'position', value: position } } );

			if ( event.data !== undefined ) {
				position = this.normalize( event.data );
			}

			this._current = position;

			this.invalidate( 'position' );

			this.trigger( 'changed', { property: { name: 'position', value: this._current } } );
		}

		return this._current;
	};

	/**
	 * Invalidates the given part of the update routine.
	 *
	 * @param {string} [part] - The part to invalidate.
	 * @returns {Array.<string>} - The invalidated parts.
	 */
	Owl.prototype.invalidate = function( part ) {
		if ( typeof part === 'string' ) {
			this._invalidated[ part ] = true;
			if ( this.is( 'valid' ) ) {
				this.leave( 'valid' );
			}
		}
		return $.map( this._invalidated, function( v, i ) {
			return i;
		} );
	};

	/**
	 * Resets the absolute position of the current item.
	 *
	 * @public
	 * @param {number} position - The absolute position of the new item.
	 */
	Owl.prototype.reset = function( position ) {
		position = this.normalize( position );

		if ( position === undefined ) {
			return;
		}

		this._speed = 0;
		this._current = position;

		this.suppress( [ 'translate', 'translated' ] );

		this.animate( this.coordinates( position ) );

		this.release( [ 'translate', 'translated' ] );
	};

	/**
	 * Normalizes an absolute or a relative position of an item.
	 *
	 * @public
	 * @param {number}  position         - The absolute or relative position to normalize.
	 * @param {boolean} [relative=false] - Whether the given position is relative or not.
	 * @returns {number} - The normalized position.
	 */
	Owl.prototype.normalize = function( position, relative ) {
		var n = this._items.length,
			m = relative ? 0 : this._clones.length;

		if ( ! this.isNumeric( position ) || n < 1 ) {
			position = undefined;
		} else if ( position < 0 || position >= n + m ) {
			position = ( ( ( ( position - ( m / 2 ) ) % n ) + n ) % n ) + ( m / 2 );
		}

		return position;
	};

	/**
	 * Converts an absolute position of an item into a relative one.
	 *
	 * @public
	 * @param {number} position - The absolute position to convert.
	 * @returns {number} - The converted position.
	 */
	Owl.prototype.relative = function( position ) {
		position -= this._clones.length / 2;
		return this.normalize( position, true );
	};

	/**
	 * Gets the maximum position for the current item.
	 *
	 * @public
	 * @param {boolean} [relative=false] - Whether to return an absolute position or a relative position.
	 * @returns {number}
	 */
	Owl.prototype.maximum = function( relative ) {
		var settings = this.settings,
			maximum = this._coordinates.length,
			iterator,
			reciprocalItemsWidth,
			elementWidth;

		if ( settings.loop ) {
			maximum = ( this._clones.length / 2 ) + this._items.length - 1;
		} else if ( settings.autoWidth || settings.merge ) {
			iterator = this._items.length;
			if ( iterator ) {
				iterator = iterator - 1;
				reciprocalItemsWidth = this._items[ iterator ].width();
				elementWidth = this.$element.width();
				while ( iterator > 0 ) {
					reciprocalItemsWidth += this._items[ iterator ].width() + this.settings.margin;
					if ( reciprocalItemsWidth > elementWidth ) {
						break;
					}
					iterator = iterator - 1;
				}
			}
			maximum = iterator + 1;
		} else if ( settings.center ) {
			maximum = this._items.length - 1;
		} else {
			maximum = this._items.length - settings.items;
		}

		if ( relative ) {
			maximum -= this._clones.length / 2;
		}

		return Math.max( maximum, 0 );
	};

	/**
	 * Gets the minimum position for the current item.
	 *
	 * @public
	 * @param {boolean} [relative=false] - Whether to return an absolute position or a relative position.
	 * @returns {number}
	 */
	Owl.prototype.minimum = function( relative ) {
		return relative ? 0 : this._clones.length / 2;
	};

	/**
	 * Gets an item at the specified relative position.
	 *
	 * @public
	 * @param {number} [position] - The relative position of the item.
	 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
	 */
	Owl.prototype.items = function( position ) {
		if ( position === undefined ) {
			return this._items.slice();
		}

		position = this.normalize( position, true );
		return this._items[ position ];
	};

	/**
	 * Gets an item at the specified relative position.
	 *
	 * @public
	 * @param {number} [position] - The relative position of the item.
	 * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
	 */
	Owl.prototype.mergers = function( position ) {
		if ( position === undefined ) {
			return this._mergers.slice();
		}

		position = this.normalize( position, true );
		return this._mergers[ position ];
	};

	/**
	 * Gets the absolute positions of clones for an item.
	 *
	 * @public
	 * @param {number} [position] - The relative position of the item.
	 * @returns {Array.<number>} - The absolute positions of clones for the item or all if no position was given.
	 */
	Owl.prototype.clones = function( position ) {
		var odd = this._clones.length / 2,
			even = odd + this._items.length,
			map = function( index ) {
				return index % 2 === 0 ? even + ( index / 2 ) : odd - ( ( index + 1 ) / 2 );
			};

		if ( position === undefined ) {
			return $.map( this._clones, function( v, i ) {
				return map( i );
			} );
		}

		return $.map( this._clones, function( v, i ) {
			return v === position ? map( i ) : null;
		} );
	};

	/**
	 * Sets the current animation speed.
	 *
	 * @public
	 * @param {number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
	 * @returns {number} - The current animation speed in milliseconds.
	 */
	Owl.prototype.speed = function( speed ) {
		if ( speed !== undefined ) {
			this._speed = speed;
		}

		return this._speed;
	};

	/**
	 * Gets the coordinate of an item.
	 *
	 * @todo The name of this method is missleanding.
	 * @public
	 * @param {number} position - The absolute position of the item within `minimum()` and `maximum()`.
	 * @returns {number|Array.<number>} - The coordinate of the item in pixel or all coordinates.
	 */
	Owl.prototype.coordinates = function( position ) {
		var multiplier = 1,
			newPosition = position - 1,
			coordinate;

		if ( position === undefined ) {
			return $.map(
				this._coordinates,
				$.proxy( function( scoordinate, index ) {
					return this.coordinates( index );
				}, this )
			);
		}

		if ( this.settings.center ) {
			if ( this.settings.rtl ) {
				multiplier = -1;
				newPosition = position + 1;
			}

			coordinate = this._coordinates[ position ];
			coordinate += ( ( this.width() - coordinate + ( this._coordinates[ newPosition ] || 0 ) ) / 2 ) * multiplier;
		} else {
			coordinate = this._coordinates[ newPosition ] || 0;
		}

		coordinate = Math.ceil( coordinate );

		return coordinate;
	};

	/**
	 * Calculates the speed for a translation.
	 *
	 * @protected
	 * @param {number} from               - The absolute position of the start item.
	 * @param {number} to                 - The absolute position of the target item.
	 * @param {number} [factor=undefined] - The time factor in milliseconds.
	 * @returns {number} - The time in milliseconds for the translation.
	 */
	Owl.prototype.duration = function( from, to, factor ) {
		if ( factor === 0 ) {
			return 0;
		}

		return Math.min( Math.max( Math.abs( to - from ), 1 ), 6 ) * Math.abs( factor || this.settings.smartSpeed );
	};

	/**
	 * Slides to the specified item.
	 *
	 * @public
	 * @param {number} position - The position of the item.
	 * @param {number} [speed]  - The time in milliseconds for the transition.
	 */
	Owl.prototype.to = function( position, speed ) {
		var current = this.current(),
			revert = null,
			distance = position - this.relative( current ),
			direction = ( distance > 0 ) - ( distance < 0 ),
			items = this._items.length,
			minimum = this.minimum(),
			maximum = this.maximum();

		if ( this.settings.loop ) {
			if ( ! this.settings.rewind && Math.abs( distance ) > items / 2 ) {
				distance += direction * -1 * items;
			}

			position = current + distance;
			revert = ( ( ( ( position - minimum ) % items ) + items ) % items ) + minimum;

			if ( revert !== position && revert - distance <= maximum && revert - distance > 0 ) {
				current = revert - distance;
				position = revert;
				this.reset( current );
			}
		} else if ( this.settings.rewind ) {
			maximum += 1;
			position = ( ( position % maximum ) + maximum ) % maximum;
		} else {
			position = Math.max( minimum, Math.min( maximum, position ) );
		}

		this.speed( this.duration( current, position, speed ) );
		this.current( position );

		if ( this.isVisible() ) {
			this.update();
		}
	};

	/**
	 * Slides to the next item.
	 *
	 * @public
	 * @param {number} [speed] - The time in milliseconds for the transition.
	 */
	Owl.prototype.next = function( speed ) {
		speed = speed || false;
		this.to( this.relative( this.current() ) + 1, speed );
	};

	/**
	 * Slides to the previous item.
	 *
	 * @public
	 * @param {number} [speed] - The time in milliseconds for the transition.
	 */
	Owl.prototype.prev = function( speed ) {
		speed = speed || false;
		this.to( this.relative( this.current() ) - 1, speed );
	};

	/**
	 * Handles the end of an animation.
	 *
	 * @protected
	 * @param {Event} event - The event arguments.
	 */
	Owl.prototype.onTransitionEnd = function( event ) {
		// if css2 animation then event object is undefined
		if ( event !== undefined ) {
			event.stopPropagation();

			// Catch only owl-stage transitionEnd event
			if ( ( event.target || event.srcElement || event.originalTarget ) !== this.$stage.get( 0 ) ) {
				return false;
			}
		}

		this.leave( 'animating' );
		this.trigger( 'translated' );
	};

	/**
	 * Gets viewport width.
	 *
	 * @protected
	 * @return {number} - The width in pixel.
	 */
	Owl.prototype.viewport = function() {
		var width;
		if ( this.options.responsiveBaseElement !== window ) {
			width = $( this.options.responsiveBaseElement ).width();
		} else if ( window.innerWidth ) {
			width = window.innerWidth;
		} else if ( document.documentElement && document.documentElement.clientWidth ) {
			width = document.documentElement.clientWidth;
		} else {
			//Cannot detect viewport width
			return width;
		}
		return width;
	};

	/**
	 * Replaces the current content.
	 *
	 * @public
	 * @param {HTMLElement|jQuery|string} content - The new content.
	 */
	Owl.prototype.replace = function( content ) {
		this.$stage.empty();
		this._items = [];

		if ( content ) {
			content = content instanceof window.jQuery ? content : $( content );
		}

		if ( this.settings.nestedItemSelector ) {
			content = content.find( '.' + this.settings.nestedItemSelector );
		}

		content
			.filter( function() {
				return this.nodeType === 1;
			} )
			.each(
				$.proxy( function( index, item ) {
					item = this.prepare( item );
					this.$stage.append( item );
					this._items.push( item );
					this._mergers.push( item.find( '[data-merge]' ).addBack( '[data-merge]' ).attr( 'data-merge' ) * 1 || 1 );
				}, this )
			);

		this.reset( this.isNumeric( this.settings.startPosition ) ? this.settings.startPosition : 0 );

		this.invalidate( 'items' );
	};

	/**
	 * Adds an item.
	 *
	 * @todo Use `item` instead of `content` for the event arguments.
	 * @public
	 * @param {HTMLElement|jQuery|string} content    - The item content to add.
	 * @param {number}                    [position] - The relative position at which to insert the item otherwise the item will be added to the end.
	 */
	Owl.prototype.add = function( content, position ) {
		var current = this.relative( this._current );

		position = position === undefined ? this._items.length : this.normalize( position, true );
		content = content instanceof window.jQuery ? content : $( content );

		this.trigger( 'add', { content: content, position: position } );

		content = this.prepare( content );

		if ( this._items.length === 0 || position === this._items.length ) {
			if ( this._items.length === 0 ) {
				this.$stage.append( content );
			}
			if ( this._items.length !== 0 ) {
				this._items[ position - 1 ].after( content );
			}
			this._items.push( content );
			this._mergers.push( content.find( '[data-merge]' ).addBack( '[data-merge]' ).attr( 'data-merge' ) * 1 || 1 );
		} else {
			this._items[ position ].before( content );
			this._items.splice( position, 0, content );
			this._mergers.splice( position, 0, content.find( '[data-merge]' ).addBack( '[data-merge]' ).attr( 'data-merge' ) * 1 || 1 );
		}

		if ( this._items[ current ] ) {
			this.reset( this._items[ current ].index() );
		}

		this.invalidate( 'items' );

		this.trigger( 'added', { content: content, position: position } );
	};

	/**
	 * Removes an item by its position.
	 *
	 * @todo Use `item` instead of `content` for the event arguments.
	 * @public
	 * @param {number} position - The relative position of the item to remove.
	 */
	Owl.prototype.remove = function( position ) {
		position = this.normalize( position, true );

		if ( position === undefined ) {
			return;
		}

		this.trigger( 'remove', { content: this._items[ position ], position: position } );

		this._items[ position ].remove();
		this._items.splice( position, 1 );
		this._mergers.splice( position, 1 );

		this.invalidate( 'items' );

		this.trigger( 'removed', { content: null, position: position } );
	};

	/**
	 * Preloads images with auto width.
	 *
	 * @param {mixed} images
	 * @todo Replace by a more generic approach
	 * @protected
	 */
	Owl.prototype.preloadAutoWidthImages = function( images ) {
		images.each(
			$.proxy( function( i, element ) {
				this.enter( 'pre-loading' );
				element = $( element );
				$( new Image() )
					.one(
						'load',
						$.proxy( function( e ) {
							element.attr( 'src', e.target.src );
							element.css( 'opacity', 1 );
							this.leave( 'pre-loading' );
							if ( ! this.is( 'pre-loading' ) && ! this.is( 'initializing' ) ) {
								this.refresh();
							}
						}, this )
					)
					.attr( 'src', element.attr( 'src' ) || element.attr( 'data-src' ) || element.attr( 'data-src-retina' ) );
			}, this )
		);
	};

	/**
	 * Destroys the carousel.
	 *
	 * @public
	 */
	Owl.prototype.destroy = function() {
		this.$element.off( '.owl.core' );
		this.$stage.off( '.owl.core' );
		$( document ).off( '.owl.core' );

		if ( this.settings.responsive !== false ) {
			window.clearTimeout( this.resizeTimer );
			this.off( window, 'resize', this._handlers.onThrottledResize );
		}

		$.map( this._plugins, function( value ) {
			return value;
		} ).forEach( function( inst ) {
			if ( inst ) {
				inst.destroy();
			}
		} );

		this.$stage.children( '.cloned' ).remove();

		this.$stage.unwrap();
		this.$stage.children().contents().unwrap();
		this.$stage.children().unwrap();
		this.$stage.remove();
		this.$element
			.removeClass( this.options.refreshClass )
			.removeClass( this.options.loadingClass )
			.removeClass( this.options.loadedClass )
			.removeClass( this.options.rtlClass )
			.removeClass( this.options.dragClass )
			.removeClass( this.options.grabClass )
			.attr( 'class', this.$element.attr( 'class' ).replace( new RegExp( this.options.responsiveClass + '-\\S+\\s', 'g' ), '' ) )
			.removeData( 'owl.carousel' );
	};

	/**
	 * Operators to calculate right-to-left and left-to-right.
	 *
	 * @protected
	 * @param {number} [a] - The left side operand.
	 * @param {string} [o] - The operator.
	 * @param {number} [b] - The right side operand.
	 */
	Owl.prototype.op = function( a, o, b ) {
		var rtl = this.settings.rtl;
		switch ( o ) {
			case '<':
				return rtl ? a > b : a < b;
			case '>':
				return rtl ? a < b : a > b;
			case '>=':
				return rtl ? a <= b : a >= b;
			case '<=':
				return rtl ? a >= b : a <= b;
			default:
				break;
		}
	};

	/**
	 * Attaches to an internal event.
	 *
	 * @protected
	 * @param {HTMLElement} element  - The event source.
	 * @param {string}      event    - The event name.
	 * @param {Function}    listener - The event handler to attach.
	 * @param {boolean}     capture  - Wether the event should be handled at the capturing phase or not.
	 */
	Owl.prototype.on = function( element, event, listener, capture ) {
		if ( element.addEventListener ) {
			element.addEventListener( event, listener, capture );
		} else if ( element.attachEvent ) {
			element.attachEvent( 'on' + event, listener );
		}
	};

	/**
	 * Detaches from an internal event.
	 *
	 * @protected
	 * @param {HTMLElement} element  - The event source.
	 * @param {string}      event    - The event name.
	 * @param {Function}    listener - The attached event handler to detach.
	 * @param {boolean}     capture  - Wether the attached event handler was registered as a capturing listener or not.
	 */
	Owl.prototype.off = function( element, event, listener, capture ) {
		if ( element.removeEventListener ) {
			element.removeEventListener( event, listener, capture );
		} else if ( element.detachEvent ) {
			element.detachEvent( 'on' + event, listener );
		}
	};

	/**
	 * Triggers a public event.
	 *
	 * @todo Remove `status`, `relatedTarget` should be used instead.
	 * @protected
	 * @param {string} name                 - The event name.
	 * @param {*}      [data=null]          - The event data.
	 * @param {string} [namespace=carousel] - The event namespace.
	 * @returns {Event} - The event arguments.
	 */
	Owl.prototype.trigger = function( name, data, namespace ) {
		var status = {
				item: { count: this._items.length, index: this.current() }
			},
			handler = $.camelCase(
				$.grep( [ 'on', name, namespace ], function( v ) {
					return v;
				} )
					.join( '-' )
					.toLowerCase()
			),
			/*eslint new-cap: [2, {capIsNewExceptions: ["Event"]}]*/
			event = $.Event( [ name, 'owl', namespace || 'carousel' ].join( '.' ).toLowerCase(), $.extend( { relatedTarget: this }, status, data ) );

		if ( ! this._supress[ name ] ) {
			$.each( this._plugins, function( sname, plugin ) {
				if ( plugin.onTrigger ) {
					plugin.onTrigger( event );
				}
			} );

			this.register( { type: Owl.Type.Event, name: name } );
			this.$element.trigger( event );

			if ( this.settings && typeof this.settings[ handler ] === 'function' ) {
				this.settings[ handler ].call( this, event );
			}
		}

		return event;
	};

	/**
	 * Enters a state.
	 *
	 * @param {mixed} name - The state name.
	 */
	Owl.prototype.enter = function( name ) {
		$.each(
			[ name ].concat( this._states.tags[ name ] || [] ),
			$.proxy( function( i, sname ) {
				if ( this._states.current[ sname ] === undefined ) {
					this._states.current[ sname ] = 0;
				}

				this._states.current[ sname ] += 1;
			}, this )
		);
	};

	/**
	 * Leaves a state.
	 *
	 * @param {mixed} name - The state name.
	 */
	Owl.prototype.leave = function( name ) {
		$.each(
			[ name ].concat( this._states.tags[ name ] || [] ),
			$.proxy( function( i, sname ) {
				this._states.current[ sname ] -= 1;
			}, this )
		);
	};

	/**
	 * Registers an event or state.
	 *
	 * @public
	 * @param {Object} object - The event or state to register.
	 */
	Owl.prototype.register = function( object ) {
		var _default;
		if ( object.type === Owl.Type.Event ) {
			if ( ! $.event.special[ object.name ] ) {
				$.event.special[ object.name ] = {};
			}

			if ( ! $.event.special[ object.name ].owl ) {
				_default = $.event.special[ object.name ]._default;
				$.event.special[ object.name ]._default = function( e ) {
					if ( _default && _default.apply && ( ! e.namespace || e.namespace.indexOf( 'owl' ) === -1 ) ) {
						return _default.apply( this, arguments );
					}
					return e.namespace && e.namespace.indexOf( 'owl' ) > -1;
				};
				$.event.special[ object.name ].owl = true;
			}
		} else if ( object.type === Owl.Type.State ) {
			if ( ! this._states.tags[ object.name ] ) {
				this._states.tags[ object.name ] = object.tags;
			} else {
				this._states.tags[ object.name ] = this._states.tags[ object.name ].concat( object.tags );
			}

			this._states.tags[ object.name ] = $.grep(
				this._states.tags[ object.name ],
				$.proxy( function( tag, i ) {
					return $.inArray( tag, this._states.tags[ object.name ] ) === i;
				}, this )
			);
		}
	};

	/**
	 * Suppresses events.
	 *
	 * @protected
	 * @param {Array.<string>} events - The events to suppress.
	 */
	Owl.prototype.suppress = function( events ) {
		$.each(
			events,
			$.proxy( function( index, event ) {
				this._supress[ event ] = true;
			}, this )
		);
	};

	/**
	 * Releases suppressed events.
	 *
	 * @protected
	 * @param {Array.<string>} events - The events to release.
	 */
	Owl.prototype.release = function( events ) {
		$.each(
			events,
			$.proxy( function( index, event ) {
				delete this._supress[ event ];
			}, this )
		);
	};

	/**
	 * Gets unified pointer coordinates from event.
	 *
	 * @todo #261
	 * @protected
	 * @param {Event} event The `mousedown` or `touchstart` event.
	 * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
	 */
	Owl.prototype.pointer = function( event ) {
		var result = { x: null, y: null };

		event = event.originalEvent || event || window.event;

		event = event.touches && event.touches.length ? event.touches[ 0 ] : event.changedTouches && event.changedTouches.length ? event.changedTouches[ 0 ] : event;

		if ( event.pageX ) {
			result.x = event.pageX;
			result.y = event.pageY;
		} else {
			result.x = event.clientX;
			result.y = event.clientY;
		}

		return result;
	};

	/**
	 * Determines if the input is a Number or something that can be coerced to a Number
	 *
	 * @protected
	 * @param {number|string|Object|Array|boolean|RegExp|Function|symbol} number The input to be tested
	 * @returns {boolean} - An indication if the input is a Number or can be coerced to a Number
	 */
	Owl.prototype.isNumeric = function( number ) {
		return ! isNaN( parseFloat( number ) );
	};

	/**
	 * Gets the difference of two vectors.
	 *
	 * @todo #261
	 * @protected
	 * @param {Object} first  The first vector.
	 * @param {Object} second The second vector.
	 * @returns {Object} - The difference.
	 */
	Owl.prototype.difference = function( first, second ) {
		return {
			x: first.x - second.x,
			y: first.y - second.y
		};
	};

	/**
	 * The jQuery Plugin for the Owl Carousel
	 *
	 * @param {mixed} option
	 * @todo Navigation plugin `next` and `prev`
	 * @public
	 */
	$.fn.tmowlCarousel = function( option ) {
		var args = Array.prototype.slice.call( arguments, 1 );

		return this.each( function() {
			var $this = $( this ),
				data = $this.data( 'owl.carousel' );

			if ( ! data ) {
				data = new Owl( this, typeof option === 'object' && option );
				$this.data( 'owl.carousel', data );

				$.each( [ 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove' ], function( i, event ) {
					data.register( { type: Owl.Type.Event, name: event } );
					data.$element.on(
						event + '.owl.carousel.core',
						$.proxy( function( e ) {
							if ( e.namespace && e.relatedTarget !== this ) {
								this.suppress( [ event ] );
								data[ event ].apply( this, [].slice.call( arguments, 1 ) );
								this.release( [ event ] );
							}
						}, data )
					);
				} );
			}

			if ( typeof option === 'string' && option.charAt( 0 ) !== '_' ) {
				data[ option ].apply( data, args );
			}
		} );
	};

	/**
	 * The constructor for the jQuery Plugin
	 *
	 * @public
	 */
	$.fn.tmowlCarousel.Constructor = Owl;
}( window.Zepto || window.jQuery, window, document ) );

/**
 * AutoRefresh Plugin
 *
 * @param {jQuery} $
 * @param {Window} window
 * @version 2.3.4
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $, window ) {
	'use strict';
	/**
	 * Creates the auto refresh plugin.
	 *
	 * @class The Auto Refresh Plugin
	 * @param {Owl} carousel - The Owl Carousel
	 */
	var AutoRefresh = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * Refresh interval.
		 *
		 * @protected
		 * @type {number}
		 */
		this._interval = null;

		/**
		 * Whether the element is currently visible or not.
		 *
		 * @protected
		 * @type {boolean}
		 */
		this._visible = null;

		/**
		 * All event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'initialized.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.autoRefresh ) {
					this.watch();
				}
			}, this )
		};

		// set default options
		this._core.options = $.extend( {}, AutoRefresh.Defaults, this._core.options );

		// register event handlers
		this._core.$element.on( this._handlers );
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	AutoRefresh.Defaults = {
		autoRefresh: true,
		autoRefreshInterval: 500
	};

	/**
	 * Watches the element.
	 */
	AutoRefresh.prototype.watch = function() {
		if ( this._interval ) {
			return;
		}

		this._visible = this._core.isVisible();
		this._interval = window.setInterval( $.proxy( this.refresh, this ), this._core.settings.autoRefreshInterval );
	};

	/**
	 * Refreshes the element.
	 */
	AutoRefresh.prototype.refresh = function() {
		if ( this._core.isVisible() === this._visible ) {
			return;
		}

		this._visible = ! this._visible;

		this._core.$element.toggleClass( 'owl-hidden', ! this._visible );

		if ( this._visible && this._core.invalidate( 'width' ) ) {
			this._core.refresh();
		}
	};

	/**
	 * Destroys the plugin.
	 */
	AutoRefresh.prototype.destroy = function() {
		var handler, property;

		window.clearInterval( this._interval );

		for ( handler in this._handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
}( window.Zepto || window.jQuery, window ) );

/**
 * Lazy Plugin
 *
 * @param {jQuery} $
 * @param {Window} window
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $, window ) {
	'use strict';
	/**
	 * Creates the lazy plugin.
	 *
	 * @class The Lazy Plugin
	 * @param {Owl} carousel - The Owl Carousel
	 */
	var Lazy = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * Already loaded items.
		 *
		 * @protected
		 * @type {Array.<jQuery>}
		 */
		this._loaded = [];

		/**
		 * Event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy( function( e ) {
				var settings;
				var n;
				var i;
				var position;
				var clones;
				var load;

				if ( ! e.namespace ) {
					return;
				}

				if ( ! this._core.settings || ! this._core.settings.lazyLoad ) {
					return;
				}

				if ( ( e.property && e.property.name === 'position' ) || e.type === 'initialized' ) {
					settings = this._core.settings;
					n = ( settings.center && Math.ceil( settings.items / 2 ) ) || settings.items;
					i = ( settings.center && n * -1 ) || 0;
					position = ( e.property && e.property.value !== undefined ? e.property.value : this._core.current() ) + i;
					clones = this._core.clones().length;
					load = $.proxy( function( ii, v ) {
						this.load( v );
					}, this );
					//TODO: Need documentation for this new option
					if ( settings.lazyLoadEager > 0 ) {
						n += settings.lazyLoadEager;
						// If the carousel is looping also preload images that are to the "left"
						if ( settings.loop ) {
							position -= settings.lazyLoadEager;
							n += 1;
						}
					}

					while ( i < n ) {
						i += 1;
						this.load( ( clones / 2 ) + this._core.relative( position ) );
						if ( clones ) {
							$.each( this._core.clones( this._core.relative( position ) ), load );
						}
						position += 1;
					}
				}
			}, this )
		};

		// set the default options
		this._core.options = $.extend( {}, Lazy.Defaults, this._core.options );

		// register event handler
		this._core.$element.on( this._handlers );
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	Lazy.Defaults = {
		lazyLoad: false,
		lazyLoadEager: 0
	};

	/**
	 * Loads all resources of an item at the specified position.
	 *
	 * @param {number} position - The absolute position of the item.
	 * @protected
	 */
	Lazy.prototype.load = function( position ) {
		var $item = this._core.$stage.children().eq( position ),
			$elements = $item && $item.find( '.owl-lazy' );

		if ( ! $elements || $.inArray( $item.get( 0 ), this._loaded ) > -1 ) {
			return;
		}

		$elements.each(
			$.proxy( function( index, element ) {
				var $element = $( element ),
					image,
					url = ( window.devicePixelRatio > 1 && $element.attr( 'data-src-retina' ) ) || $element.attr( 'data-src' ) || $element.attr( 'data-srcset' );

				this._core.trigger( 'load', { element: $element, url: url }, 'lazy' );

				if ( $element.is( 'img' ) ) {
					$element
						.one(
							'load.owl.lazy',
							$.proxy( function() {
								$element.css( 'opacity', 1 );
								this._core.trigger( 'loaded', { element: $element, url: url }, 'lazy' );
							}, this )
						)
						.attr( 'src', url );
				} else if ( $element.is( 'source' ) ) {
					$element
						.one(
							'load.owl.lazy',
							$.proxy( function() {
								this._core.trigger( 'loaded', { element: $element, url: url }, 'lazy' );
							}, this )
						)
						.attr( 'srcset', url );
				} else {
					image = new Image();
					image.onload = $.proxy( function() {
						$element.css( {
							'background-image': 'url("' + url + '")',
							opacity: '1'
						} );
						this._core.trigger( 'loaded', { element: $element, url: url }, 'lazy' );
					}, this );
					image.src = url;
				}
			}, this )
		);

		this._loaded.push( $item.get( 0 ) );
	};

	/**
	 * Destroys the plugin.
	 *
	 * @public
	 */
	Lazy.prototype.destroy = function() {
		var handler, property;

		for ( handler in this.handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this.handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.Lazy = Lazy;
}( window.Zepto || window.jQuery, window ) );

/**
 * AutoHeight Plugin
 *
 * @param {jQuery} $
 * @param {Window} window
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $, window ) {
	'use strict';
	/**
	 * Creates the auto height plugin.
	 *
	 * @class The Auto Height Plugin
	 * @param {Owl} carousel - The Owl Carousel
	 */
	var AutoHeight = function( carousel ) {
		var refThis = this;
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		this._previousHeight = null;

		/**
		 * All event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'initialized.owl.carousel refreshed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.autoHeight ) {
					this.update();
				}
			}, this ),
			'changed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.autoHeight && e.property.name === 'position' ) {
					this.update();
				}
			}, this ),
			'loaded.owl.lazy': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.autoHeight && e.element.closest( '.' + this._core.settings.itemClass ).index() === this._core.current() ) {
					this.update();
				}
			}, this )
		};

		// set default options
		this._core.options = $.extend( {}, AutoHeight.Defaults, this._core.options );

		// register event handlers
		this._core.$element.on( this._handlers );
		this._intervalId = null;

		// These changes have been taken from a PR by gavrochelegnou proposed in #1575
		// and have been made compatible with the latest jQuery version
		$( window ).on( 'load', function() {
			if ( refThis._core.settings.autoHeight ) {
				refThis.update();
			}
		} );

		// Autoresize the height of the carousel when window is resized
		// When carousel has images, the height is dependent on the width
		// and should also change on resize
		$( window ).on( 'resize', function() {
			if ( refThis._core.settings.autoHeight ) {
				if ( refThis._intervalId !== null ) {
					clearTimeout( refThis._intervalId );
				}

				refThis._intervalId = setTimeout( function() {
					refThis.update();
				}, 250 );
			}
		} );
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	AutoHeight.Defaults = {
		autoHeight: false,
		autoHeightClass: 'owl-height'
	};

	/**
	 * Updates the view.
	 */
	AutoHeight.prototype.update = function() {
		var start = this._core._current,
			end = start + this._core.settings.items,
			lazyLoadEnabled = this._core.settings.lazyLoad,
			visible = this._core.$stage.children().toArray().slice( start, end ),
			heights = [],
			maxheight = 0;

		$.each( visible, function( index, item ) {
			heights.push( $( item ).height() );
		} );

		maxheight = Math.max.apply( null, heights );

		if ( maxheight <= 1 && lazyLoadEnabled && this._previousHeight ) {
			maxheight = this._previousHeight;
		}

		this._previousHeight = maxheight;

		this._core.$stage.parent().height( maxheight ).addClass( this._core.settings.autoHeightClass );
	};

	AutoHeight.prototype.destroy = function() {
		var handler, property;

		for ( handler in this._handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
}( window.Zepto || window.jQuery ) );

/**
 * Video Plugin
 *
 * @param {jQuery}   $
 * @param {Window}   window
 * @param {Document} document
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $, window, document ) {
	'use strict';
	/**
	 * Creates the video plugin.
	 *
	 * @class The Video Plugin
	 * @param {Owl} carousel - The Owl Carousel
	 */
	var Video = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * Cache all video URLs.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._videos = {};

		/**
		 * Current playing item.
		 *
		 * @protected
		 * @type {jQuery}
		 */
		this._playing = null;

		/**
		 * All event handlers.
		 *
		 * @todo The cloned content removale is too late
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'initialized.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace ) {
					this._core.register( { type: 'state', name: 'playing', tags: [ 'interacting' ] } );
				}
			}, this ),
			'resize.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.video && this.isInFullScreen() ) {
					e.preventDefault();
				}
			}, this ),
			'refreshed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.is( 'resizing' ) ) {
					this._core.$stage.find( '.cloned .owl-video-frame' ).remove();
				}
			}, this ),
			'changed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && e.property.name === 'position' && this._playing ) {
					this.stop();
				}
			}, this ),
			'prepared.owl.carousel': $.proxy( function( e ) {
				var $element;
				if ( ! e.namespace ) {
					return;
				}

				$element = $( e.content ).find( '.owl-video' );

				if ( $element.length ) {
					$element.css( 'display', 'none' );
					this.fetch( $element, $( e.content ) );
				}
			}, this )
		};

		// set default options
		this._core.options = $.extend( {}, Video.Defaults, this._core.options );

		// register event handlers
		this._core.$element.on( this._handlers );

		this._core.$element.on(
			'click.owl.video',
			'.owl-video-play-icon',
			$.proxy( function( e ) {
				this.play( e );
			}, this )
		);
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	Video.Defaults = {
		video: false,
		videoHeight: false,
		videoWidth: false
	};

	/**
	 * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
	 *
	 * @protected
	 * @param {jQuery} target - The target containing the video data.
	 * @param {jQuery} item   - The item containing the video.
	 */
	Video.prototype.fetch = function( target, item ) {
		var type = ( function() {
				if ( target.attr( 'data-vimeo-id' ) ) {
					return 'vimeo';
				} else if ( target.attr( 'data-vzaar-id' ) ) {
					return 'vzaar';
				}
				return 'youtube';
			}() ),
			id = target.attr( 'data-vimeo-id' ) || target.attr( 'data-youtube-id' ) || target.attr( 'data-vzaar-id' ),
			width = target.attr( 'data-width' ) || this._core.settings.videoWidth,
			height = target.attr( 'data-height' ) || this._core.settings.videoHeight,
			url = target.attr( 'href' );

		if ( url ) {
			/*
             Parses the id's out of the following urls (and probably more):
             https://www.youtube.com/watch?v=:id
             https://youtu.be/:id
             https://vimeo.com/:id
             https://vimeo.com/channels/:channel/:id
             https://vimeo.com/groups/:group/videos/:id
             https://app.vzaar.com/videos/:id

             Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
             */

			id = url.match(
				// eslint-disable-next-line no-useless-escape
				/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com|be\-nocookie\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/
			);

			if ( id[ 3 ].indexOf( 'youtu' ) > -1 ) {
				type = 'youtube';
			} else if ( id[ 3 ].indexOf( 'vimeo' ) > -1 ) {
				type = 'vimeo';
			} else if ( id[ 3 ].indexOf( 'vzaar' ) > -1 ) {
				type = 'vzaar';
			} else {
				throw new Error( 'Video URL not supported.' );
			}
			id = id[ 6 ];
		} else {
			throw new Error( 'Missing video URL.' );
		}

		this._videos[ url ] = {
			type: type,
			id: id,
			width: width,
			height: height
		};

		item.attr( 'data-video', url );

		this.thumbnail( target, this._videos[ url ] );
	};

	/**
	 * Creates video thumbnail.
	 *
	 * @protected
	 * @param {jQuery} target The target containing the video data.
	 * @param {Object} video  The video info object.
	 * @see `fetch`
	 */
	Video.prototype.thumbnail = function( target, video ) {
		var tnLink,
			icon,
			path,
			dimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '',
			customTn = target.find( 'img' ),
			srcType = 'src',
			lazyClass = '',
			settings = this._core.settings,
			create = function( thispath ) {
				icon = '<div class="owl-video-play-icon"></div>';

				if ( settings.lazyLoad ) {
					tnLink = $( '<div/>', {
						class: 'owl-video-tn ' + lazyClass,
						srcType: thispath
					} );
				} else {
					tnLink = $( '<div/>', {
						class: 'owl-video-tn',
						style: 'opacity:1;background-image:url(' + thispath + ')'
					} );
				}
				target.after( tnLink );
				target.after( icon );
			};

		// wrap video content into owl-video-wrapper div
		target.wrap(
			$( '<div/>', {
				class: 'owl-video-wrapper',
				style: dimensions
			} )
		);

		if ( this._core.settings.lazyLoad ) {
			srcType = 'data-src';
			lazyClass = 'owl-lazy';
		}

		// custom thumbnail
		if ( customTn.length ) {
			create( customTn.attr( srcType ) );
			customTn.remove();
			return false;
		}

		if ( video.type === 'youtube' ) {
			path = '//img.youtube.com/vi/' + video.id + '/hqdefault.jpg';
			create( path );
		} else if ( video.type === 'vimeo' ) {
			$.ajax( {
				type: 'GET',
				url: '//vimeo.com/api/v2/video/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function( data ) {
					path = data[ 0 ].thumbnail_large;
					create( path );
				}
			} );
		} else if ( video.type === 'vzaar' ) {
			$.ajax( {
				type: 'GET',
				url: '//vzaar.com/api/videos/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function( data ) {
					path = data.framegrab_url;
					create( path );
				}
			} );
		}
	};

	/**
	 * Stops the current video.
	 *
	 * @public
	 */
	Video.prototype.stop = function() {
		this._core.trigger( 'stop', null, 'video' );
		this._playing.find( '.owl-video-frame' ).remove();
		this._playing.removeClass( 'owl-video-playing' );
		this._playing = null;
		this._core.leave( 'playing' );
		this._core.trigger( 'stopped', null, 'video' );
	};

	/**
	 * Starts the current video.
	 *
	 * @public
	 * @param {Event} event - The event arguments.
	 */
	Video.prototype.play = function( event ) {
		var target = $( event.target ),
			item = target.closest( '.' + this._core.settings.itemClass ),
			video = this._videos[ item.attr( 'data-video' ) ],
			width = video.width || '100%',
			height = video.height || this._core.$stage.height(),
			html;

		if ( this._playing ) {
			return;
		}

		this._core.enter( 'playing' );
		this._core.trigger( 'play', null, 'video' );

		item = this._core.items( this._core.relative( item.index() ) );

		this._core.reset( item.index() );

		html = $( '<iframe frameborder="0" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>' );
		html.attr( 'height', height );
		html.attr( 'width', width );
		if ( video.type === 'youtube' ) {
			html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id );
		} else if ( video.type === 'vimeo' ) {
			html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' );
		} else if ( video.type === 'vzaar' ) {
			html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' );
		}

		$( html ).wrap( '<div class="owl-video-frame" />' ).insertAfter( item.find( '.owl-video' ) );

		this._playing = item.addClass( 'owl-video-playing' );
	};

	/**
	 * Checks whether an video is currently in full screen mode or not.
	 *
	 * @todo Bad style because looks like a readonly method but changes members.
	 * @protected
	 * @returns {boolean}
	 */
	Video.prototype.isInFullScreen = function() {
		var element = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;

		return element && $( element ).parent().hasClass( 'owl-video-frame' );
	};

	/**
	 * Destroys the plugin.
	 */
	Video.prototype.destroy = function() {
		var handler, property;

		this._core.$element.off( 'click.owl.video' );

		for ( handler in this._handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.Video = Video;
}( window.Zepto || window.jQuery, window, document ) );

/**
 * Animate Plugin
 *
 * @param {jQuery} $
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $ ) {
	'use strict';
	/**
	 * Creates the animate plugin.
	 *
	 * @class The Navigation Plugin
	 * @param {Owl} scope - The Owl Carousel
	 */
	var Animate = function( scope ) {
		this.core = scope;
		this.core.options = $.extend( {}, Animate.Defaults, this.core.options );
		this.swapping = true;
		this.previous = undefined;
		this.next = undefined;

		this.handlers = {
			'change.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && e.property.name === 'position' ) {
					this.previous = this.core.current();
					this.next = e.property.value;
				}
			}, this ),
			'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace ) {
					this.swapping = e.type === 'translated';
				}
			}, this ),
			'translate.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this.swapping && ( this.core.options.animateOut || this.core.options.animateIn ) ) {
					this.swap();
				}
			}, this )
		};

		this.core.$element.on( this.handlers );
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	Animate.Defaults = {
		animateOut: false,
		animateIn: false
	};

	/**
	 * Toggles the animation classes whenever an translations starts.
	 *
	 * @protected
	 * @returns {boolean|undefined}
	 */
	Animate.prototype.swap = function() {
		var left, clear, previous, next, incoming, outgoing;
		if ( this.core.settings.items !== 1 ) {
			return;
		}

		if ( ! $.support.animation || ! $.support.transition ) {
			return;
		}

		this.core.speed( 0 );

		clear = $.proxy( this.clear, this );
		previous = this.core.$stage.children().eq( this.previous );
		next = this.core.$stage.children().eq( this.next );
		incoming = this.core.settings.animateIn;
		outgoing = this.core.settings.animateOut;

		if ( this.core.current() === this.previous ) {
			return;
		}

		if ( outgoing ) {
			left = this.core.coordinates( this.previous ) - this.core.coordinates( this.next );
			previous
				.one( $.support.animation.end, clear )
				.css( { left: left + 'px' } )
				.addClass( 'animated owl-animated-out' )
				.addClass( outgoing );
		}

		if ( incoming ) {
			next.one( $.support.animation.end, clear ).addClass( 'animated owl-animated-in' ).addClass( incoming );
		}
	};

	Animate.prototype.clear = function( e ) {
		$( e.target ).css( { left: '' } ).removeClass( 'animated owl-animated-out owl-animated-in' ).removeClass( this.core.settings.animateIn ).removeClass( this.core.settings.animateOut );
		this.core.onTransitionEnd();
	};

	/**
	 * Destroys the plugin.
	 *
	 * @public
	 */
	Animate.prototype.destroy = function() {
		var handler, property;

		for ( handler in this.handlers ) {
			if ( handler ) {
				this.core.$element.off( handler, this.handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.Animate = Animate;
}( window.Zepto || window.jQuery ) );

/**
 * Autoplay Plugin
 *
 * @param {jQuery}   $
 * @param {Window}   window
 * @param {Document} document
 * @version 2.3.4
 * @author Bartosz Wojciechowski
 * @author Artus Kolanowski
 * @author David Deutsch
 * @author Tom De Caluwé
 * @license The MIT License (MIT)
 */
( function( $, window, document ) {
	'use strict';
	/**
	 * Creates the autoplay plugin.
	 *
	 * @class The Autoplay Plugin
	 * @param {Owl} carousel The Owl Carousel
	 */
	var Autoplay = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * The autoplay timeout id.
		 *
		 * @type {number}
		 */
		this._call = null;

		/**
		 * Depending on the state of the plugin, this variable contains either
		 * the start time of the timer or the current timer value if it's
		 * paused. Since we start in a paused state we initialize the timer
		 * value.
		 *
		 * @type {number}
		 */
		this._time = 0;

		/**
		 * Stores the timeout currently used.
		 *
		 * @type {number}
		 */
		this._timeout = 0;

		/**
		 * Indicates whenever the autoplay is paused.
		 *
		 * @type {boolean}
		 */
		this._paused = true;

		/**
		 * All event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'changed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && e.property.name === 'settings' ) {
					if ( this._core.settings.autoplay ) {
						this.play();
					} else {
						this.stop();
					}
				} else if ( e.namespace && e.property.name === 'position' && this._paused ) {
					// Reset the timer. This code is triggered when the position
					// of the carousel was changed through user interaction.
					this._time = 0;
				}
			}, this ),
			'initialized.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.autoplay ) {
					this.play();
				}
			}, this ),
			'play.owl.autoplay': $.proxy( function( e, t, s ) {
				if ( e.namespace ) {
					this.play( t, s );
				}
			}, this ),
			'stop.owl.autoplay': $.proxy( function( e ) {
				if ( e.namespace ) {
					this.stop();
				}
			}, this ),
			'mouseover.owl.autoplay': $.proxy( function() {
				if ( this._core.settings.autoplayHoverPause && this._core.is( 'rotating' ) ) {
					this.pause();
				}
			}, this ),
			'mouseleave.owl.autoplay': $.proxy( function() {
				if ( this._core.settings.autoplayHoverPause && this._core.is( 'rotating' ) ) {
					this.play();
				}
			}, this ),
			'touchstart.owl.core': $.proxy( function() {
				if ( this._core.settings.autoplayHoverPause && this._core.is( 'rotating' ) ) {
					this.pause();
				}
			}, this ),
			'touchend.owl.core': $.proxy( function() {
				if ( this._core.settings.autoplayHoverPause ) {
					this.play();
				}
			}, this )
		};

		// register event handlers
		this._core.$element.on( this._handlers );

		// set default options
		this._core.options = $.extend( {}, Autoplay.Defaults, this._core.options );
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	Autoplay.Defaults = {
		autoplay: false,
		autoplayTimeout: 5000,
		autoplayHoverPause: false,
		autoplaySpeed: false
	};

	/**
	 * Transition to the next slide and set a timeout for the next transition.
	 *
	 * @private
	 * @param {number} [speed] - The animation speed for the animations.
	 */
	Autoplay.prototype._next = function( speed ) {
		this._call = window.setTimeout( $.proxy( this._next, this, speed ), ( this._timeout * ( Math.round( this.read() / this._timeout ) + 1 ) ) - this.read() );

		if ( this._core.is( 'interacting' ) || document.hidden ) {
			return;
		}
		this._core.next( speed || this._core.settings.autoplaySpeed );
	};

	/**
	 * Reads the current timer value when the timer is playing.
	 *
	 * @public
	 */
	Autoplay.prototype.read = function() {
		return new Date().getTime() - this._time;
	};

	/**
	 * Starts the autoplay.
	 *
	 * @public
	 * @param {number} [timeout] - The interval before the next animation starts.
	 * @param {number} [speed]   - The animation speed for the animations.
	 */
	Autoplay.prototype.play = function( timeout, speed ) {
		var elapsed;

		if ( ! this._core.is( 'rotating' ) ) {
			this._core.enter( 'rotating' );
		}

		timeout = timeout || this._core.settings.autoplayTimeout;

		// Calculate the elapsed time since the last transition. If the carousel
		// wasn't playing this calculation will yield zero.
		elapsed = Math.min( this._time % ( this._timeout || timeout ), timeout );

		if ( this._paused ) {
			// Start the clock.
			this._time = this.read();
			this._paused = false;
		} else {
			// Clear the active timeout to allow replacement.
			window.clearTimeout( this._call );
		}

		// Adjust the origin of the timer to match the new timeout value.
		this._time += ( this.read() % timeout ) - elapsed;

		this._timeout = timeout;
		this._call = window.setTimeout( $.proxy( this._next, this, speed ), timeout - elapsed );
	};

	/**
	 * Stops the autoplay.
	 *
	 * @public
	 */
	Autoplay.prototype.stop = function() {
		if ( this._core.is( 'rotating' ) ) {
			// Reset the clock.
			this._time = 0;
			this._paused = true;

			window.clearTimeout( this._call );
			this._core.leave( 'rotating' );
		}
	};

	/**
	 * Pauses the autoplay.
	 *
	 * @public
	 */
	Autoplay.prototype.pause = function() {
		if ( this._core.is( 'rotating' ) && ! this._paused ) {
			// Pause the clock.
			this._time = this.read();
			this._paused = true;

			window.clearTimeout( this._call );
		}
	};

	/**
	 * Destroys the plugin.
	 */
	Autoplay.prototype.destroy = function() {
		var handler, property;

		this.stop();

		for ( handler in this._handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.autoplay = Autoplay;
}( window.Zepto || window.jQuery, window, document ) );

/**
 * Navigation Plugin
 *
 * @param {jQuery} $
 * @version 2.3.4
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $ ) {
	'use strict';

	/**
	 * Creates the navigation plugin.
	 *
	 * @class The Navigation Plugin
	 * @param {Owl} carousel - The Owl Carousel.
	 */
	var Navigation = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * Indicates whether the plugin is initialized or not.
		 *
		 * @protected
		 * @type {boolean}
		 */
		this._initialized = false;

		/**
		 * The current paging indexes.
		 *
		 * @protected
		 * @type {Array}
		 */
		this._pages = [];

		/**
		 * All DOM elements of the user interface.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._controls = {};

		/**
		 * Markup for an indicator.
		 *
		 * @protected
		 * @type {Array.<string>}
		 */
		this._templates = [];

		/**
		 * The carousel element.
		 *
		 * @type {jQuery}
		 */
		this.$element = this._core.$element;

		/**
		 * Overridden methods of the carousel.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._overrides = {
			next: this._core.next,
			prev: this._core.prev,
			to: this._core.to
		};

		/**
		 * All event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'prepared.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.dotsData ) {
					this._templates.push( '<div class="' + this._core.settings.dotClass + '">' + $( e.content ).find( '[data-dot]' ).addBack( '[data-dot]' ).attr( 'data-dot' ) + '</div>' );
				}
			}, this ),
			'added.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.dotsData ) {
					this._templates.splice( e.position, 0, this._templates.pop() );
				}
			}, this ),
			'remove.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.dotsData ) {
					this._templates.splice( e.position, 1 );
				}
			}, this ),
			'changed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && e.property.name === 'position' ) {
					this.draw();
				}
			}, this ),
			'initialized.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && ! this._initialized ) {
					this._core.trigger( 'initialize', null, 'navigation' );
					this.initialize();
					this.update();
					this.draw();
					this._initialized = true;
					this._core.trigger( 'initialized', null, 'navigation' );
				}
			}, this ),
			'refreshed.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._initialized ) {
					this._core.trigger( 'refresh', null, 'navigation' );
					this.update();
					this.draw();
					this._core.trigger( 'refreshed', null, 'navigation' );
				}
			}, this )
		};

		// set default options
		this._core.options = $.extend( {}, Navigation.Defaults, this._core.options );

		// register event handlers
		this.$element.on( this._handlers );
	};

	/**
	 * Default options.
	 *
	 * @public
	 * @todo Rename `slideBy` to `navBy`
	 */
	Navigation.Defaults = {
		nav: false,
		navText: [ '<span aria-label="' + 'Previous' + '">&#x2039;</span>', '<span aria-label="' + 'Next' + '">&#x203a;</span>' ],
		navSpeed: false,
		navElement: 'button type="button" role="presentation"',
		navContainer: false,
		navContainerClass: 'owl-nav',
		navClass: [ 'owl-prev', 'owl-next' ],
		slideBy: 1,
		dotClass: 'owl-dot',
		dotsClass: 'owl-dots',
		dots: true,
		dotsEach: false,
		dotsData: false,
		dotsSpeed: false,
		dotsContainer: false
	};

	/**
	 * Initializes the layout of the plugin and extends the carousel.
	 *
	 * @protected
	 */
	Navigation.prototype.initialize = function() {
		var override,
			settings = this._core.settings;

		// create DOM structure for relative navigation
		this._controls.$relative = ( settings.navContainer ? $( settings.navContainer ) : $( '<div>' ).addClass( settings.navContainerClass ).appendTo( this.$element ) ).addClass( 'disabled' );

		this._controls.$previous = $( '<' + settings.navElement + '>' )
			.addClass( settings.navClass[ 0 ] )
			.html( settings.navText[ 0 ] )
			.prependTo( this._controls.$relative )
			.on(
				'click',
				$.proxy( function() {
					this.prev( settings.navSpeed );
				}, this )
			);
		this._controls.$next = $( '<' + settings.navElement + '>' )
			.addClass( settings.navClass[ 1 ] )
			.html( settings.navText[ 1 ] )
			.appendTo( this._controls.$relative )
			.on(
				'click',
				$.proxy( function() {
					this.next( settings.navSpeed );
				}, this )
			);

		// create DOM structure for absolute navigation
		if ( ! settings.dotsData ) {
			this._templates = [ $( '<button role="button">' ).addClass( settings.dotClass ).append( $( '<span>' ) ).prop( 'outerHTML' ) ];
		}

		this._controls.$absolute = ( settings.dotsContainer ? $( settings.dotsContainer ) : $( '<div>' ).addClass( settings.dotsClass ).appendTo( this.$element ) ).addClass( 'disabled' );

		this._controls.$absolute.on(
			'click',
			'button',
			$.proxy( function( e ) {
				var index = $( e.target ).parent().is( this._controls.$absolute ) ? $( e.target ).index() : $( e.target ).parent().index();

				e.preventDefault();

				this.to( index, settings.dotsSpeed );
			}, this )
		);

		/*$el.on('focusin', function() {
         $(document).off(".carousel");

         $(document).on('keydown.carousel', function(e) {
         if(e.keyCode == 37) {
         $el.trigger('prev.owl')
         }
         if(e.keyCode == 39) {
         $el.trigger('next.owl')
         }
         });
         });*/

		// override public methods of the carousel
		for ( override in this._overrides ) {
			if ( override ) {
				this._core[ override ] = $.proxy( this[ override ], this );
			}
		}
	};

	/**
	 * Destroys the plugin.
	 *
	 * @protected
	 */
	Navigation.prototype.destroy = function() {
		var handler, control, property, override, settings;
		settings = this._core.settings;

		for ( handler in this._handlers ) {
			if ( handler ) {
				this.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( control in this._controls ) {
			if ( control === '$relative' && settings.navContainer ) {
				this._controls[ control ].html( '' );
			} else {
				this._controls[ control ].remove();
			}
		}
		for ( override in this.overides ) {
			if ( override ) {
				this._core[ override ] = this._overrides[ override ];
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	/**
	 * Updates the internal state.
	 *
	 * @protected
	 */
	Navigation.prototype.update = function() {
		var i,
			j,
			lower = this._core.clones().length / 2,
			upper = lower + this._core.items().length,
			maximum = this._core.maximum( true ),
			settings = this._core.settings,
			size = settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items;

		if ( settings.slideBy !== 'page' ) {
			settings.slideBy = Math.min( settings.slideBy, settings.items );
		}

		if ( settings.dots || settings.slideBy === 'page' ) {
			this._pages = [];

			for ( i = lower, j = 0; i < upper; i += 1 ) {
				if ( j >= size || j === 0 ) {
					this._pages.push( {
						start: Math.min( maximum, i - lower ),
						end: i - lower + size - 1
					} );
					if ( Math.min( maximum, i - lower ) === maximum ) {
						break;
					}
					j = 0;
				}
				j += this._core.mergers( this._core.relative( i ) );
			}
		}
	};

	/**
	 * Draws the user interface.
	 *
	 * @todo The option `dotsData` wont work.
	 * @protected
	 */
	Navigation.prototype.draw = function() {
		var difference,
			settings = this._core.settings,
			disabled = this._core.items().length <= settings.items,
			index = this._core.relative( this._core.current() ),
			loop = settings.loop || settings.rewind;

		this._controls.$relative.toggleClass( 'disabled', ! settings.nav || disabled );

		if ( settings.nav ) {
			this._controls.$previous.toggleClass( 'disabled', ! loop && index <= this._core.minimum( true ) );
			this._controls.$next.toggleClass( 'disabled', ! loop && index >= this._core.maximum( true ) );
		}

		this._controls.$absolute.toggleClass( 'disabled', ! settings.dots || disabled );

		if ( settings.dots ) {
			difference = this._pages.length - this._controls.$absolute.children().length;

			if ( settings.dotsData && difference !== 0 ) {
				this._controls.$absolute.html( this._templates.join( '' ) );
			} else if ( difference > 0 ) {
				this._controls.$absolute.append( new Array( difference + 1 ).join( this._templates[ 0 ] ) );
			} else if ( difference < 0 ) {
				this._controls.$absolute.children().slice( difference ).remove();
			}

			this._controls.$absolute.find( '.active' ).removeClass( 'active' );
			this._controls.$absolute.children().eq( $.inArray( this.current(), this._pages ) ).addClass( 'active' );
		}
	};

	/**
	 * Extends event data.
	 *
	 * @protected
	 * @param {Event} event - The event object which gets thrown.
	 */
	Navigation.prototype.onTrigger = function( event ) {
		var settings = this._core.settings;

		event.page = {
			index: $.inArray( this.current(), this._pages ),
			count: this._pages.length,
			size: settings && ( settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items )
		};
	};

	/**
	 * Gets the current page position of the carousel.
	 *
	 * @protected
	 * @returns {number}
	 */
	Navigation.prototype.current = function() {
		var current = this._core.relative( this._core.current() );
		return $.grep(
			this._pages,
			$.proxy( function( page ) {
				return page.start <= current && page.end >= current;
			}, this )
		).pop();
	};

	/**
	 * Gets the current succesor/predecessor position.
	 *
	 * @param {mixed} successor
	 * @protected
	 * @returns {number}
	 */
	Navigation.prototype.getPosition = function( successor ) {
		var position,
			length,
			settings = this._core.settings;

		if ( settings.slideBy === 'page' ) {
			position = $.inArray( this.current(), this._pages );
			length = this._pages.length;
			if ( successor ) {
				position = position + 1;
			} else {
				position = position - 1;
			}
			position = this._pages[ ( ( position % length ) + length ) % length ].start;
		} else {
			position = this._core.relative( this._core.current() );
			length = this._core.items().length;
			if ( successor ) {
				position += settings.slideBy;
			} else {
				position -= settings.slideBy;
			}
		}

		return position;
	};

	/**
	 * Slides to the next item or page.
	 *
	 * @public
	 * @param {number} [speed=false] - The time in milliseconds for the transition.
	 */
	Navigation.prototype.next = function( speed ) {
		$.proxy( this._overrides.to, this._core )( this.getPosition( true ), speed );
	};

	/**
	 * Slides to the previous item or page.
	 *
	 * @public
	 * @param {number} [speed=false] - The time in milliseconds for the transition.
	 */
	Navigation.prototype.prev = function( speed ) {
		$.proxy( this._overrides.to, this._core )( this.getPosition( false ), speed );
	};

	/**
	 * Slides to the specified item or page.
	 *
	 * @public
	 * @param {number}  position         - The position of the item or page.
	 * @param {number}  [speed]          - The time in milliseconds for the transition.
	 * @param {boolean} [standard=false] - Whether to use the standard behaviour or not.
	 */
	Navigation.prototype.to = function( position, speed, standard ) {
		var length;

		if ( ! standard && this._pages.length ) {
			length = this._pages.length;
			$.proxy( this._overrides.to, this._core )( this._pages[ ( ( position % length ) + length ) % length ].start, speed );
		} else {
			$.proxy( this._overrides.to, this._core )( position, speed );
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.Navigation = Navigation;
}( window.Zepto || window.jQuery ) );

/**
 * Hash Plugin
 *
 * @param {jQuery} $
 * @param {Window} window
 * @version 2.3.4
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $, window ) {
	'use strict';

	/**
	 * Creates the hash plugin.
	 *
	 * @class The Hash Plugin
	 * @param {Owl} carousel - The Owl Carousel
	 */
	var Hash = function( carousel ) {
		/**
		 * Reference to the core.
		 *
		 * @protected
		 * @type {Owl}
		 */
		this._core = carousel;

		/**
		 * Hash index for the items.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._hashes = {};

		/**
		 * The carousel element.
		 *
		 * @type {jQuery}
		 */
		this.$element = this._core.$element;

		/**
		 * All event handlers.
		 *
		 * @protected
		 * @type {Object}
		 */
		this._handlers = {
			'initialized.owl.carousel': $.proxy( function( e ) {
				if ( e.namespace && this._core.settings.startPosition === 'URLHash' ) {
					$( window ).trigger( 'hashchange.owl.navigation' );
				}
			}, this ),
			'prepared.owl.carousel': $.proxy( function( e ) {
				var hash;
				if ( e.namespace ) {
					hash = $( e.content ).find( '[data-hash]' ).addBack( '[data-hash]' ).attr( 'data-hash' );

					if ( ! hash ) {
						return;
					}

					this._hashes[ hash ] = e.content;
				}
			}, this ),
			'changed.owl.carousel': $.proxy( function( e ) {
				var current;
				var hash;
				if ( e.namespace && e.property.name === 'position' ) {
					current = this._core.items( this._core.relative( this._core.current() ) );
					hash = $.map( this._hashes, function( item, thishash ) {
						return item === current ? thishash : null;
					} ).join();

					if ( ! hash || window.location.hash.slice( 1 ) === hash ) {
						return;
					}

					window.location.hash = hash;
				}
			}, this )
		};

		// set default options
		this._core.options = $.extend( {}, Hash.Defaults, this._core.options );

		// register the event handlers
		this.$element.on( this._handlers );

		// register event listener for hash navigation
		$( window ).on(
			'hashchange.owl.navigation',
			$.proxy( function() {
				var hash = window.location.hash.substring( 1 ),
					items = this._core.$stage.children(),
					position = this._hashes[ hash ] && items.index( this._hashes[ hash ] );

				if ( position === undefined || position === this._core.current() ) {
					return;
				}

				this._core.to( this._core.relative( position ), false, true );
			}, this )
		);
	};

	/**
	 * Default options.
	 *
	 * @public
	 */
	Hash.Defaults = {
		URLhashListener: false
	};

	/**
	 * Destroys the plugin.
	 *
	 * @public
	 */
	Hash.prototype.destroy = function() {
		var handler, property;

		$( window ).off( 'hashchange.owl.navigation' );

		for ( handler in this._handlers ) {
			if ( handler ) {
				this._core.$element.off( handler, this._handlers[ handler ] );
			}
		}
		for ( property in Object.getOwnPropertyNames( this ) ) {
			if ( typeof this[ property ] !== 'function' ) {
				this[ property ] = null;
			}
		}
	};

	$.fn.tmowlCarousel.Constructor.Plugins.Hash = Hash;
}( window.Zepto || window.jQuery, window ) );

/**
 * Support Plugin
 *
 * @param {jQuery} $
 * @version 2.3.4
 * @author Vivid Planet Software GmbH
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
( function( $ ) {
	'use strict';
	var style = $( '<support>' ).get( 0 ).style,
		prefixes = 'Webkit Moz O ms'.split( ' ' ),
		events = {
			transition: {
				end: {
					WebkitTransition: 'webkitTransitionEnd',
					MozTransition: 'transitionend',
					OTransition: 'oTransitionEnd',
					transition: 'transitionend'
				}
			},
			animation: {
				end: {
					WebkitAnimation: 'webkitAnimationEnd',
					MozAnimation: 'animationend',
					OAnimation: 'oAnimationEnd',
					animation: 'animationend'
				}
			}
		},
		tests;

	function test( property, thisprefixed ) {
		var result = false,
			upper = property.charAt( 0 ).toUpperCase() + property.slice( 1 );

		$.each( ( property + ' ' + prefixes.join( upper + ' ' ) + upper ).split( ' ' ), function( i, thisproperty ) {
			if ( style[ thisproperty ] !== undefined ) {
				result = thisprefixed ? thisproperty : true;
				return false;
			}
		} );

		return result;
	}

	function prefixed( property ) {
		return test( property, true );
	}

	tests = {
		csstransforms: function() {
			return !! test( 'transform' );
		},
		csstransforms3d: function() {
			return !! test( 'perspective' );
		},
		csstransitions: function() {
			return !! test( 'transition' );
		},
		cssanimations: function() {
			return !! test( 'animation' );
		}
	};
	if ( tests.csstransitions() ) {
		/* jshint -W053 */
		$.support.transition = new String( prefixed( 'transition' ) );
		$.support.transition.end = events.transition.end[ $.support.transition ];
	}

	if ( tests.cssanimations() ) {
		/* jshint -W053 */
		$.support.animation = new String( prefixed( 'animation' ) );
		$.support.animation.end = events.animation.end[ $.support.animation ];
	}

	if ( tests.csstransforms() ) {
		/* jshint -W053 */
		$.support.transform = new String( prefixed( 'transform' ) );
		$.support.transform3d = tests.csstransforms3d();
	}
}( window.Zepto || window.jQuery ) );
assets/js/tm-timepicker.min.js000064400000116632150755142450012375 0ustar00!function(e){"use strict";"function"==typeof window.define&&window.define.amd?window.define(["jquery","jquery-ui"],e):e(window.jQuery)}(function(k){"use strict";function n(e,t){for(var i in k.extend(e,t),t)null!==t[i]&&void 0!==t[i]||(e[i]=t[i]);return e}function u(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function h(e){function t(e,t){return-1!==e.indexOf(t)}var i=e.replace(/'.*?'/g,"").toLowerCase();return{hour:t(i,"h"),minute:t(i,"m"),second:t(i,"s"),millisec:t(i,"l"),microsec:t(i,"c"),timezone:t(i,"z"),ampm:t(i,"t")&&t(e,"h"),iso8601:t(e,"Z")}}function r(e){return 0===(e%=12)&&(e=12),String(e)}function l(e,t){var i=o(t,"separator"),t=o(t,"timeFormat").split(i).length,s=e.split(i),a=s.length;return 1<a?{dateString:s.splice(0,a-t).join(i),timeString:s.splice(0,t).join(i)}:{dateString:e,timeString:""}}function m(e,t,i,s,a){if(i=l(i,a),e=k.tm_datepicker._base_parseDate(e,i.dateString,s),""===i.timeString)return{date:e};if(s=k.tm_datepicker.parseTime(t,i.timeString,a))return{date:e,timeObj:s};throw"Wrong time format"}function T(e,t){e&&e.timezone_select&&(t=t||new Date,e.timezone_select.val(-t.getTimezoneOffset()))}function _(){this.regional=[],this.regional[""]={currentText:"Now",closeText:"Done",amNames:["AM","A"],pmNames:["PM","P"],timeFormat:"HH:mm",timeSuffix:"",timeOnlyTitle:"Choose Time",timeText:"Time",hourText:"Hour",minuteText:"Minute",secondText:"Second",millisecText:"Millisecond",microsecText:"Microsecond",timezoneText:"Time Zone",isRTL:!1},this._defaults={showButtonPanel:!0,timeOnly:!1,timeOnlyShowDate:!1,showHour:null,showMinute:null,showSecond:null,showMillisec:null,showMicrosec:null,showTimezone:null,showTime:!0,stepHour:1,stepMinute:1,stepSecond:1,stepMillisec:1,stepMicrosec:1,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMin:0,minuteMin:0,secondMin:0,millisecMin:0,microsecMin:0,hourMax:23,minuteMax:59,secondMax:59,millisecMax:999,microsecMax:999,minDateTime:null,maxDateTime:null,maxTime:null,minTime:null,onSelect:null,hourGrid:0,minuteGrid:0,secondGrid:0,millisecGrid:0,microsecGrid:0,alwaysSetTime:!0,separator:" ",altFieldTimeOnly:!0,altTimeFormat:null,altSeparator:null,altTimeSuffix:null,altRedirectFocus:!0,pickerTimeFormat:null,pickerTimeSuffix:null,showTimepicker:!0,timezoneList:null,addSliderAccess:!1,sliderAccessArgs:null,controlType:"slider",oneLine:!1,defaultValue:null,parse:"strict",afterInject:null},k.extend(this._defaults,this.regional[""])}var o=function(e,t){return(e&&e[t]?e:k.tm_timepicker._defaults)[t]};k.ui.tm_timepicker=k.ui.tm_timepicker||{},k.ui.tm_timepicker.version||(k.extend(k.ui,{tm_timepicker:{version:"1.6.3"}}),k.extend(_.prototype,{$input:null,$altInput:null,$timeObj:null,inst:null,hour_slider:null,minute_slider:null,second_slider:null,millisec_slider:null,microsec_slider:null,timezone_select:null,maxTime:null,minTime:null,hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null,hourMinOriginal:null,minuteMinOriginal:null,secondMinOriginal:null,millisecMinOriginal:null,microsecMinOriginal:null,hourMaxOriginal:null,minuteMaxOriginal:null,secondMaxOriginal:null,millisecMaxOriginal:null,microsecMaxOriginal:null,ampm:"",formattedDate:"",formattedTime:"",formattedDateTime:"",timezoneList:null,units:["hour","minute","second","millisec","microsec"],support:{},control:null,setDefaults:function(e){return n(this._defaults,e||{}),this},_newInst:function(s,e){var t,i,a,n,r,l,m,o=new _,c={},u={},d=0;for(a in this._defaults)Object.prototype.hasOwnProperty.call(this._defaults,a)&&(n=s.attr("data-"+a))&&(c[a]=n);for(i in t={beforeShow:function(e,t){if("function"==typeof o._defaults.evnts.beforeShow)return o._defaults.evnts.beforeShow.call(s[0],e,t,o)},onChangeMonthYear:function(e,t,i){"function"==typeof o._defaults.evnts.onChangeMonthYear&&o._defaults.evnts.onChangeMonthYear.call(s[0],e,t,i,o)},onClose:function(e,t){!0===o.timeDefined&&""!==s.val()&&o._updateDateTime(t),"function"==typeof o._defaults.evnts.onClose&&o._defaults.evnts.onClose.call(s[0],e,t,o)}})Object.prototype.hasOwnProperty.call(t,i)&&(u[i]=e[i]||this._defaults[i]||null);if(o._defaults=k.extend({},this._defaults,c,e,t,{evnts:u,tm_timepicker:o}),o.amNames=k.map(o._defaults.amNames,function(e){return e.toUpperCase()}),o.pmNames=k.map(o._defaults.pmNames,function(e){return e.toUpperCase()}),o.support=h(o._defaults.timeFormat+(o._defaults.pickerTimeFormat||"")+(o._defaults.altTimeFormat||"")),"string"==typeof o._defaults.controlType?("slider"===o._defaults.controlType&&void 0===k.ui.slider&&(o._defaults.controlType="select"),o.control=o._controls[o._defaults.controlType]):o.control=o._defaults.controlType,r=[-720,-660,-600,-570,-540,-480,-420,-360,-300,-270,-240,-210,-180,-120,-60,0,60,120,180,210,240,270,300,330,345,360,390,420,480,525,540,570,600,630,660,690,720,765,780,840],0<(l=(r=null!==o._defaults.timezoneList?o._defaults.timezoneList:r).length)&&"object"!=typeof r[0])for(;d<l;d+=1)m=r[d],r[d]={value:m,label:k.tm_timepicker.timezoneOffsetString(m,o.support.iso8601)};return o._defaults.timezoneList=r,o.timezone=null!==o._defaults.timezone?k.tm_timepicker.timezoneOffsetNumber(o._defaults.timezone):-1*(new Date).getTimezoneOffset(),o.hour=o._defaults.hour<o._defaults.hourMin?o._defaults.hourMin:o._defaults.hour>o._defaults.hourMax?o._defaults.hourMax:o._defaults.hour,o.minute=o._defaults.minute<o._defaults.minuteMin?o._defaults.minuteMin:o._defaults.minute>o._defaults.minuteMax?o._defaults.minuteMax:o._defaults.minute,o.second=o._defaults.second<o._defaults.secondMin?o._defaults.secondMin:o._defaults.second>o._defaults.secondMax?o._defaults.secondMax:o._defaults.second,o.millisec=o._defaults.millisec<o._defaults.millisecMin?o._defaults.millisecMin:o._defaults.millisec>o._defaults.millisecMax?o._defaults.millisecMax:o._defaults.millisec,o.microsec=o._defaults.microsec<o._defaults.microsecMin?o._defaults.microsecMin:o._defaults.microsec>o._defaults.microsecMax?o._defaults.microsecMax:o._defaults.microsec,o.ampm="",o.$input=s,o._defaults.altField&&(o.$altInput=k(o._defaults.altField),!0===o._defaults.altRedirectFocus)&&o.$altInput.css({cursor:"pointer"}).on("focus",function(){s.trigger("focus")}),0!==o._defaults.minDate&&0!==o._defaults.minDateTime||(o._defaults.minDate=new Date),0!==o._defaults.maxDate&&0!==o._defaults.maxDateTime||(o._defaults.maxDate=new Date),void 0!==o._defaults.minDate&&o._defaults.minDate instanceof Date&&(o._defaults.minDateTime=new Date(o._defaults.minDate.getTime())),void 0!==o._defaults.minDateTime&&o._defaults.minDateTime instanceof Date&&(o._defaults.minDate=new Date(o._defaults.minDateTime.getTime())),void 0!==o._defaults.maxDate&&o._defaults.maxDate instanceof Date&&(o._defaults.maxDateTime=new Date(o._defaults.maxDate.getTime())),void 0!==o._defaults.maxDateTime&&o._defaults.maxDateTime instanceof Date&&(o._defaults.maxDate=new Date(o._defaults.maxDateTime.getTime())),o.$input.on("focus",function(){o._onFocus()}),o.$input.next(".ui-tm-timepicker-trigger").on("click",function(){return o._onFocus(),!1}),o},_addTimePicker:function(e){var t=k.epoAPI.util.trim(this.$altInput&&this._defaults.altFieldTimeOnly?this.$input.val()+" "+this.$altInput.val():this.$input.val());this.timeDefined=this._parseTime(t),this._limitMinMaxDateTime(e,!1),this._injectTimePicker(),this._afterInject()},_parseTime:function(t,i){var e;if(this.inst||(this.inst=k.tm_datepicker._getInst(this.$input[0])),i||!this._defaults.timeOnly){i=k.tm_datepicker._get(this.inst,"dateFormat");try{if(!(e=m(i,this._defaults.timeFormat,t,k.tm_datepicker._getFormatConfig(this.inst),this._defaults)).timeObj)return!1;k.extend(this,e.timeObj)}catch(e){return k.tm_timepicker.log("Error parsing the date/time string: "+e+"\ndate/time string = "+t+"\ntimeFormat = "+this._defaults.timeFormat+"\ndateFormat = "+i),!1}}else{if(!(e=k.tm_datepicker.parseTime(this._defaults.timeFormat,t,this._defaults)))return!1;k.extend(this,e)}return!0},_afterInject:function(){var e=this.inst.settings;"function"==typeof e.afterInject&&e.afterInject.call(this)},_ui_tpicker_onclick:function(e){var t=k(e.target),i=t.html(),s=parseInt(i.replace(/[^0-9]/g),10),i=i.replace(/[^apm]/gi),t=t.data("for");"hour"===t&&(-1!==i.indexOf("p")&&s<12?s+=12:-1!==i.indexOf("a")&&12===s&&(s=0)),e.data.tp_inst.control.value(e.data.tp_inst,e.data.tp_inst[t+"_slider"],e.data.litem,s),e.data.tp_inst._onTimeChange(),e.data.tp_inst._onSelectHandler()},_injectTimePicker:function(){var e,t,i,s,a,r,n,l,m,o=this.inst.dpDiv,c=this.inst.settings,u=this,d="",h="",_=null,f={},p={},g=0,M=0;if(0===o.find("div.ui-tm-timepicker-div").length&&c.showTimepicker){for(t=" ui_tpicker_unit_hide",i='<div class="ui-tm-timepicker-div'+(c.isRTL?" ui-tm-timepicker-rtl":"")+(c.oneLine&&"select"===c.controlType?" ui-tm-timepicker-oneLine":"")+'"><dl><dt class="ui_tpicker_time_label'+(c.showTime?"":t)+'">'+c.timeText+'</dt><dd class="ui_tpicker_time '+(c.showTime?"":t)+'"><input class="ui_tpicker_time_input" '+(c.timeInput?"":"disabled")+"></dd>",g=0,M=this.units.length;g<M;g+=1){if(_=null!==c["show"+(h=(d=this.units[g]).substring(0,1).toUpperCase()+d.substring(1))]?c["show"+h]:this.support[d],f[d]=parseInt(c[d+"Max"]-(c[d+"Max"]-c[d+"Min"])%c["step"+h],10),p[d]=0,i+='<dt class="ui_tpicker_'+d+"_label"+(_?"":t)+'">'+c[d+"Text"]+'</dt><dd class="ui_tpicker_'+d+(_?"":t)+'"><div class="ui_tpicker_'+d+"_slider"+(_?"":t)+'"></div>',_&&0<c[d+"Grid"]){if(i+='<div><table class="ui-tpicker-grid-label"><tr>',"hour"===d)for(s=c[d+"Min"];s<=f[d];s+=parseInt(c[d+"Grid"],10))p[d]+=1,i+='<td data-for="'+d+'">'+k.tm_datepicker.formatTime(this.support.ampm?"hht":"HH",{hour:s},c)+"</td>";else for(a=c[d+"Min"];a<=f[d];a+=parseInt(c[d+"Grid"],10))p[d]+=1,i+='<td data-for="'+d+'">'+(a<10?"0":"")+a+"</td>";i+="</tr></table></div>"}i+="</dd>"}for(i+='<dt class="ui_tpicker_timezone_label'+((n=null!==c.showTimezone?c.showTimezone:this.support.timezone)?"":t)+'">'+c.timezoneText+"</dt>",r=k(i=i+('<dd class="ui_tpicker_timezone'+(n?"":t)+'"></dd>')+"</dl></div>"),!0===c.timeOnly&&(r.prepend('<div class="tm-ui-widget-header"><div class="tm-ui-tp-title">'+c.timeOnlyTitle+"</div></div>"),o.find(".tm-ui-dp-inner-container").hide()),g=0,M=u.units.length;g<M;g+=1)_=null!==c["show"+(h=(d=u.units[g]).substring(0,1).toUpperCase()+d.substring(1))]?c["show"+h]:this.support[d],u[d+"_slider"]=u.control.create(u,r.find(".ui_tpicker_"+d+"_slider"),d,u[d],c[d+"Min"],f[d],c["step"+h]),_&&0<c[d+"Grid"]&&(e=100*p[d]*c[d+"Grid"]/(f[d]-c[d+"Min"]),r.find(".ui_tpicker_"+d+" table").css({width:e+"%",marginLeft:c.isRTL?"0":e/(-2*p[d])+"%",marginRight:c.isRTL?e/(-2*p[d])+"%":"0",borderCollapse:"collapse"}).find("td").on("click",{that:this,tp_inst:u,litem:d},this._ui_tpicker_onclick).css({cursor:"pointer",width:100/p[d]+"%",textAlign:"center",overflow:"hidden"}));this.timezone_select=r.find(".ui_tpicker_timezone").append("<select></select>").find("select"),k.fn.append.apply(this.timezone_select,k.map(c.timezoneList,function(e){return k("<option />").val("object"==typeof e?e.value:e).text("object"==typeof e?e.label:e)})),void 0!==this.timezone&&null!==this.timezone&&""!==this.timezone?-1*new Date(this.inst.selectedYear,this.inst.selectedMonth,this.inst.selectedDay,12).getTimezoneOffset()===this.timezone?T(u):this.timezone_select.val(this.timezone):void 0!==this.hour&&null!==this.hour&&""!==this.hour?this.timezone_select.val(c.timezone):T(u),this.timezone_select.on("change",function(){u._onTimeChange(),u._onSelectHandler(),u._afterInject()}),(n=o.find(".tm-ui-dp-buttonpane")).length?n.before(r):o.append(r),this.$timeObj=r.find(".ui_tpicker_time_input"),this.$timeObj.on("change",function(){var e=u.inst.settings.timeFormat,e=k.tm_datepicker.parseTime(e,this.value),t=new Date;e?(t.setHours(e.hour),t.setMinutes(e.minute),t.setSeconds(e.second),k.datepicker._setTime(u.inst,t)):(this.value=u.formattedTime,this.trigger("blur"))}),null!==this.inst&&(n=this.timeDefined,this._onTimeChange(),this.timeDefined=n),this._defaults.addSliderAccess&&(l=this._defaults.sliderAccessArgs,m=this._defaults.isRTL,l.isRTL=m,setTimeout(function(){var n;0===r.find(".ui-slider-access").length&&(r.find(".ui-slider:visible").sliderAccess(l),n=r.find(".ui-slider-access:eq(0)").outerWidth(!0))&&r.find("table:visible").each(function(){var e=k(this),t=e.outerWidth(),i=e.css(m?"marginRight":"marginLeft").toString().replace("%",""),s=t-n,a={width:s,marginRight:0,marginLeft:0};a[m?"marginRight":"marginLeft"]=i*s/t+"%",e.css(a)})},10)),u._limitMinMaxDateTime(this.inst,!0)}},_limitMinMaxDateTime:function(e,t){var i,s,a=this._defaults,n=new Date(e.selectedYear,e.selectedMonth,e.selectedDay);this._defaults.showTimepicker&&(null!==k.tm_datepicker._get(e,"minDateTime")&&void 0!==k.tm_datepicker._get(e,"minDateTime")&&n&&(s=k.tm_datepicker._get(e,"minDateTime"),i=new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0),null!==this.hourMinOriginal&&null!==this.minuteMinOriginal&&null!==this.secondMinOriginal&&null!==this.millisecMinOriginal&&null!==this.microsecMinOriginal||(this.hourMinOriginal=a.hourMin,this.minuteMinOriginal=a.minuteMin,this.secondMinOriginal=a.secondMin,this.millisecMinOriginal=a.millisecMin,this.microsecMinOriginal=a.microsecMin),e.settings.timeOnly||i.getTime()===n.getTime()?(this._defaults.hourMin=s.getHours(),this.hour<=this._defaults.hourMin?(this.hour=this._defaults.hourMin,this._defaults.minuteMin=s.getMinutes(),this.minute<=this._defaults.minuteMin?(this.minute=this._defaults.minuteMin,this._defaults.secondMin=s.getSeconds(),this.second<=this._defaults.secondMin?(this.second=this._defaults.secondMin,this._defaults.millisecMin=s.getMilliseconds(),this.millisec<=this._defaults.millisecMin?(this.millisec=this._defaults.millisecMin,this._defaults.microsecMin=s.getMicroseconds()):(this.microsec<this._defaults.microsecMin&&(this.microsec=this._defaults.microsecMin),this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)):(this._defaults.hourMin=this.hourMinOriginal,this._defaults.minuteMin=this.minuteMinOriginal,this._defaults.secondMin=this.secondMinOriginal,this._defaults.millisecMin=this.millisecMinOriginal,this._defaults.microsecMin=this.microsecMinOriginal)),null!==k.tm_datepicker._get(e,"maxDateTime")&&void 0!==k.tm_datepicker._get(e,"maxDateTime")&&n&&(i=k.tm_datepicker._get(e,"maxDateTime"),s=new Date(i.getFullYear(),i.getMonth(),i.getDate(),0,0,0,0),null!==this.hourMaxOriginal&&null!==this.minuteMaxOriginal&&null!==this.secondMaxOriginal&&null!==this.millisecMaxOriginal||(this.hourMaxOriginal=a.hourMax,this.minuteMaxOriginal=a.minuteMax,this.secondMaxOriginal=a.secondMax,this.millisecMaxOriginal=a.millisecMax,this.microsecMaxOriginal=a.microsecMax),e.settings.timeOnly||s.getTime()===n.getTime()?(this._defaults.hourMax=i.getHours(),this.hour>=this._defaults.hourMax?(this.hour=this._defaults.hourMax,this._defaults.minuteMax=i.getMinutes(),this.minute>=this._defaults.minuteMax?(this.minute=this._defaults.minuteMax,this._defaults.secondMax=i.getSeconds(),this.second>=this._defaults.secondMax?(this.second=this._defaults.secondMax,this._defaults.millisecMax=i.getMilliseconds(),this.millisec>=this._defaults.millisecMax?(this.millisec=this._defaults.millisecMax,this._defaults.microsecMax=i.getMicroseconds()):(this.microsec>this._defaults.microsecMax&&(this.microsec=this._defaults.microsecMax),this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)):(this._defaults.hourMax=this.hourMaxOriginal,this._defaults.minuteMax=this.minuteMaxOriginal,this._defaults.secondMax=this.secondMaxOriginal,this._defaults.millisecMax=this.millisecMaxOriginal,this._defaults.microsecMax=this.microsecMaxOriginal)),null!==e.settings.minTime&&(a=new Date("01/01/1970 "+e.settings.minTime),parseFloat(e.settings.minTime).toString()===e.settings.minTime&&(a=new Date(Date.now()+parseFloat(e.settings.minTime))),this.hour<a.getHours()?(this._defaults.hourMin=a.getHours(),this.hour=this._defaults.hourMin,this._defaults.minuteMin=a.getMinutes(),this.minute=this._defaults.minuteMin):this.hour===a.getHours()&&this.minute<a.getMinutes()?(this._defaults.minuteMin=a.getMinutes(),this.minute=this._defaults.minuteMin):this._defaults.hourMin<a.getHours()?(this._defaults.hourMin=a.getHours(),this._defaults.minuteMin=a.getMinutes()):this._defaults.hourMin===a.getHours()===this.hour&&this._defaults.minuteMin<a.getMinutes()?this._defaults.minuteMin=a.getMinutes():this._defaults.minuteMin=0),null!==e.settings.maxTime&&(s=new Date("01/01/1970 "+e.settings.maxTime),this.hour>s.getHours()?(this._defaults.hourMax=s.getHours(),this.hour=this._defaults.hourMax,this._defaults.minuteMax=s.getMinutes(),this.minute=this._defaults.minuteMax):this.hour===s.getHours()&&this.minute>s.getMinutes()?(this._defaults.minuteMax=s.getMinutes(),this.minute=this._defaults.minuteMax):this._defaults.hourMax>s.getHours()?(this._defaults.hourMax=s.getHours(),this._defaults.minuteMax=s.getMinutes()):this._defaults.hourMax===s.getHours()===this.hour&&this._defaults.minuteMax>s.getMinutes()?this._defaults.minuteMax=s.getMinutes():this._defaults.minuteMax=59),void 0!==t)&&!0===t&&(n=parseInt(this._defaults.hourMax-(this._defaults.hourMax-this._defaults.hourMin)%this._defaults.stepHour,10),i=parseInt(this._defaults.minuteMax-(this._defaults.minuteMax-this._defaults.minuteMin)%this._defaults.stepMinute,10),a=parseInt(this._defaults.secondMax-(this._defaults.secondMax-this._defaults.secondMin)%this._defaults.stepSecond,10),e=parseInt(this._defaults.millisecMax-(this._defaults.millisecMax-this._defaults.millisecMin)%this._defaults.stepMillisec,10),s=parseInt(this._defaults.microsecMax-(this._defaults.microsecMax-this._defaults.microsecMin)%this._defaults.stepMicrosec,10),this.hour_slider&&(this.control.options(this,this.hour_slider,"hour",{min:this._defaults.hourMin,max:n,step:this._defaults.stepHour}),this.control.value(this,this.hour_slider,"hour",this.hour-this.hour%this._defaults.stepHour)),this.minute_slider&&(this.control.options(this,this.minute_slider,"minute",{min:this._defaults.minuteMin,max:i,step:this._defaults.stepMinute}),this.control.value(this,this.minute_slider,"minute",this.minute-this.minute%this._defaults.stepMinute)),this.second_slider&&(this.control.options(this,this.second_slider,"second",{min:this._defaults.secondMin,max:a,step:this._defaults.stepSecond}),this.control.value(this,this.second_slider,"second",this.second-this.second%this._defaults.stepSecond)),this.millisec_slider&&(this.control.options(this,this.millisec_slider,"millisec",{min:this._defaults.millisecMin,max:e,step:this._defaults.stepMillisec}),this.control.value(this,this.millisec_slider,"millisec",this.millisec-this.millisec%this._defaults.stepMillisec)),this.microsec_slider)&&(this.control.options(this,this.microsec_slider,"microsec",{min:this._defaults.microsecMin,max:s,step:this._defaults.stepMicrosec}),this.control.value(this,this.microsec_slider,"microsec",this.microsec-this.microsec%this._defaults.stepMicrosec))},_onTimeChange:function(){var e,t,i=!!this.hour_slider&&this.control.value(this,this.hour_slider,"hour"),s=!!this.minute_slider&&this.control.value(this,this.minute_slider,"minute"),a=!!this.second_slider&&this.control.value(this,this.second_slider,"second"),n=!!this.millisec_slider&&this.control.value(this,this.millisec_slider,"millisec"),r=!!this.microsec_slider&&this.control.value(this,this.microsec_slider,"microsec"),l=!!this.timezone_select&&this.timezone_select.val(),m=this._defaults,o=m.pickerTimeFormat||m.timeFormat,c=m.pickerTimeSuffix||m.timeSuffix;this._defaults.showTimepicker&&("object"==typeof s&&(s=!1),"object"==typeof a&&(a=!1),"object"==typeof n&&(n=!1),"object"==typeof r&&(r=!1),"object"==typeof l&&(l=!1),!1!==(i="object"==typeof i?!1:i)&&(i=parseInt(i,10)),!1!==s&&(s=parseInt(s,10)),!1!==a&&(a=parseInt(a,10)),!1!==n&&(n=parseInt(n,10)),!1!==r&&(r=parseInt(r,10)),!1!==l&&(l=l.toString()),e=m[i<12?"amNames":"pmNames"][0],(t=i!==parseInt(this.hour,10)||s!==parseInt(this.minute,10)||a!==parseInt(this.second,10)||n!==parseInt(this.millisec,10)||r!==parseInt(this.microsec,10)||0<this.ampm.length&&i<12!=(-1!==k.inArray(this.ampm.toUpperCase(),this.amNames))||null!==this.timezone&&l!==this.timezone.toString())&&(!1!==i&&(this.hour=i),!1!==s&&(this.minute=s),!1!==a&&(this.second=a),!1!==n&&(this.millisec=n),!1!==r&&(this.microsec=r),!1!==l&&(this.timezone=l),this.inst||(this.inst=k.tm_datepicker._getInst(this.$input[0])),this._limitMinMaxDateTime(this.inst,!0)),this.support.ampm&&(this.ampm=e),this.formattedTime=k.tm_datepicker.formatTime(m.timeFormat,this,m),this.$timeObj&&(o===m.timeFormat?this.$timeObj.val(this.formattedTime+c):this.$timeObj.val(k.tm_datepicker.formatTime(o,this,m)+c),this.$timeObj[0].setSelectionRange)&&(i=this.$timeObj[0].selectionStart,s=this.$timeObj[0].selectionEnd,this.$timeObj[0].setSelectionRange(i,s)),this.timeDefined=!0,t)&&this._updateDateTime()},_onSelectHandler:function(){var e=this._defaults.onSelect||this.inst.settings.onSelect,t=this.$input?this.$input[0]:null;e&&t&&e.apply(t,[this.formattedDateTime,this])},_updateDateTime:function(e){var t="",i=0<(e=this.inst||e).currentYear?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(e.selectedYear,e.selectedMonth,e.selectedDay),i=k.tm_datepicker._daylightSavingAdjust(i),s=k.tm_datepicker._get(e,"dateFormat"),a=k.tm_datepicker._getFormatConfig(e),n=null!==i&&this.timeDefined;this.formattedDate=k.tm_datepicker.formatDate(s,null===i?new Date:i,a),s=this.formattedDate,""===e.lastVal&&(e.currentYear=e.selectedYear,e.currentMonth=e.selectedMonth,e.currentDay=e.selectedDay),!0===this._defaults.timeOnly&&!1===this._defaults.timeOnlyShowDate?s=this.formattedTime:(!0!==this._defaults.timeOnly&&(this._defaults.alwaysSetTime||n)||!0===this._defaults.timeOnly&&!0===this._defaults.timeOnlyShowDate)&&(s+=this._defaults.separator+this.formattedTime+this._defaults.timeSuffix),this.formattedDateTime=s,this._defaults.showTimepicker?this.$altInput&&!1===this._defaults.timeOnly&&!0===this._defaults.altFieldTimeOnly?(this.$altInput.val(this.formattedTime),this.$input.val(this.formattedDate)):this.$altInput?(this.$input.val(s),t="",e=null!==this._defaults.altSeparator?this._defaults.altSeparator:this._defaults.separator,n=null!==this._defaults.altTimeSuffix?this._defaults.altTimeSuffix:this._defaults.timeSuffix,this._defaults.timeOnly||(t=this._defaults.altFormat?k.tm_datepicker.formatDate(this._defaults.altFormat,null===i?new Date:i,a):this.formattedDate)&&(t+=e),null!==this._defaults.altTimeFormat?t+=k.tm_datepicker.formatTime(this._defaults.altTimeFormat,this,this._defaults)+n:t+=this.formattedTime+n,this.$altInput.val(t)):this.$input.val(s):this.$input.val(this.formattedDate),this.$input.trigger("change")},_onFocus:function(){var e,t;if(!this.$input.val()&&this._defaults.defaultValue&&(this.$input.val(this._defaults.defaultValue),e=k.tm_datepicker._getInst(this.$input.get(0)),t=k.tm_datepicker._get(e,"tm_timepicker"))&&t._defaults.timeOnly&&e.input.val()!==e.lastVal)try{k.tm_datepicker._updateDatepicker(e)}catch(e){k.tm_timepicker.log(e)}},_controls:{slider:{create:function(i,e,s,t,a,n,r){var l=i._defaults.isRTL;return e.prop("slide",null).slider({orientation:"horizontal",value:l?-1*t:t,min:l?-1*n:a,max:l?-1*a:n,step:r,slide:function(e,t){i.control.value(i,k(this),s,l?-1*t.value:t.value),i._onTimeChange()},stop:function(){i._onSelectHandler()}})},options:function(e,t,i,s,a){var n;return e._defaults.isRTL?"string"==typeof s?"min"===s||"max"===s?void 0!==a?t.slider(s,-1*a):Math.abs(t.slider(s)):t.slider(s):(e=s.min,n=s.max,s.max=null,s.min=null,void 0!==e&&(s.max=-1*e),void 0!==n&&(s.min=-1*n),t.slider(s)):"string"==typeof s&&void 0!==a?t.slider(s,a):t.slider(s)},value:function(e,t,i,s){return e._defaults.isRTL?void 0!==s?t.slider("value",-1*s):Math.abs(t.slider("value")):void 0!==s?t.slider("value",s):t.slider("value")}},select:{create:function(e,t,i,s,a,n,r){for(var l='<select class="ui-tm-timepicker-select ui-state-default ui-corner-all" data-unit="'+i+'" data-min="'+a+'" data-max="'+n+'" data-step="'+r+'">',m=e._defaults.pickerTimeFormat||e._defaults.timeFormat,o=a;o<=n;o+=r)l=(l+='<option value="'+o+'"'+(o===s?" selected":"")+">")+("hour"===i?k.tm_datepicker.formatTime(k.epoAPI.util.trim(m.replace(/[^ht ]/gi,"")),{hour:o},e._defaults):"millisec"===i||"microsec"===i||10<=o?o:"0"+o.toString())+"</option>";return l+="</select>",t.children("select").remove(),k(l).appendTo(t).on("change",function(){e._onTimeChange(),e._onSelectHandler(),e._afterInject()}),t},options:function(e,t,i,s,a){var n={},r=t.children("select");if("string"==typeof s){if(void 0===a)return r.data(s);n[s]=a}else n=s;return e.control.create(e,t,r.data("unit"),r.val(),0<=n.min?n.min:r.data("min"),n.max||r.data("max"),n.step||r.data("step"))},value:function(e,t,i,s){t=t.children("select");return void 0!==s?t.val(s):t.val()}}}}),k.fn.extend({tm_timepicker:function(e){var t=Array.prototype.slice.call(arguments);return"object"==typeof(e=e||{})&&(t[0]=k.extend(e,{timeOnly:!0})),k(this).each(function(){k.fn.tm_datetimepicker.apply(k(this),t)})},tm_datetimepicker:function(t){var i=arguments;return"string"==typeof(t=t||{})?"getDate"===t||"option"===t&&2===i.length&&"string"==typeof i[1]?k.fn.tm_datepicker.apply(k(this[0]),i):this.each(function(){var e=k(this);e.tm_datepicker.apply(e,i)}):this.each(function(){var e=k(this);e.tm_datepicker(k.tm_timepicker._newInst(e,t)._defaults)})}}),k.tm_datepicker.parseDateTime=function(e,t,i,s,a){e=m(e,t,i,s,a);return e.timeObj&&(t=e.timeObj,e.date.setHours(t.hour,t.minute,t.second,t.millisec),e.date.setMicroseconds(t.microsec)),e.date},k.tm_datepicker.parseTime=function(t,i,s){function a(e,t,n){var i="^"+e.toString().replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){var t,i,s,a=e.length;switch(e.charAt(0).toLowerCase()){case"h":case"m":case"s":return 1===a?"(\\d?\\d)":"(\\d{"+a+"})";case"l":case"c":return"(\\d?\\d?\\d)";case"z":return"(z|[-+]\\d\\d:?\\d\\d|\\S+)?";case"t":return t=n.amNames,i=n.pmNames,s=[],t&&k.merge(s,t),i&&k.merge(s,i),"("+(s=k.map(s,function(e){return e.replace(/[.*+?|()[\]{}\\]/g,"\\$&")})).join("|")+")?";default:return"("+e.replace(/'/g,"").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g,function(e){return"\\"+e})+")?"}}).replace(/\s/g,"\\s?")+n.timeSuffix+"$",e=function(e){var t,i=e.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),s={h:-1,m:-1,s:-1,l:-1,c:-1,t:-1,z:-1};if(i)for(t=0;t<i.length;t+=1)-1===s[i[t].toString().charAt(0)]&&(s[i[t].toString().charAt(0)]=t+1);return s}(e),s="",a={hour:0,minute:0,second:0,millisec:0,microsec:0};return!!(t=t.match(new RegExp(i,"i")))&&(-1!==e.t&&(void 0===t[e.t]||0===t[e.t].length?a.ampm=s="":(s=-1!==k.inArray(t[e.t].toUpperCase(),k.map(n.amNames,function(e){return e.toUpperCase()}))?"AM":"PM",a.ampm=n["AM"===s?"amNames":"pmNames"][0])),-1!==e.h&&("AM"===s&&"12"===t[e.h]?a.hour=0:"PM"===s&&"12"!==t[e.h]?a.hour=parseInt(t[e.h],10)+12:a.hour=Number(t[e.h])),-1!==e.m&&(a.minute=Number(t[e.m])),-1!==e.s&&(a.second=Number(t[e.s])),-1!==e.l&&(a.millisec=Number(t[e.l])),-1!==e.c&&(a.microsec=Number(t[e.c])),-1!==e.z&&void 0!==t[e.z]&&(a.timezone=k.tm_timepicker.timezoneOffsetNumber(t[e.z])),a)}s=n(n({},k.tm_timepicker._defaults),s||{});if("function"==typeof s.parse)return s.parse(t,i,s);if("loose"!==s.parse)return a(t,i,s);var e;try{if(e=new Date("2012-01-01 "+i),isNaN(e.getTime())&&(e=new Date("2012-01-01T"+i),isNaN(e.getTime()))&&(e=new Date("01/01/2012 "+i),isNaN(e.getTime())))throw"Unable to parse time with native Date: "+i;return{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisec:e.getMilliseconds(),microsec:e.getMicroseconds(),timezone:-1*e.getTimezoneOffset()}}catch(e){try{return a(t,i,s)}catch(e){k.tm_timepicker.log("Unable to parse \ntimeString: "+i+"\ntimeFormat: "+t)}}return!1},k.tm_datepicker.formatTime=function(e,t,i){var s,a;return i=i||{},i=k.extend({},k.tm_timepicker._defaults,i),t=k.extend({hour:0,minute:0,second:0,millisec:0,microsec:0,timezone:null},t),e=e,s=i.amNames[0],11<(a=parseInt(t.hour,10))&&(s=i.pmNames[0]),e=e.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g,function(e){switch(e){case"HH":return("0"+a).slice(-2);case"H":return a;case"hh":return("0"+r(a)).slice(-2);case"h":return r(a);case"mm":return("0"+t.minute).slice(-2);case"m":return t.minute;case"ss":return("0"+t.second).slice(-2);case"s":return t.second;case"l":return("00"+t.millisec).slice(-3);case"c":return("00"+t.microsec).slice(-3);case"z":return k.tm_timepicker.timezoneOffsetString((null===t.timezone?i:t).timezone,!1);case"Z":return k.tm_timepicker.timezoneOffsetString((null===t.timezone?i:t).timezone,!0);case"T":return s.charAt(0).toUpperCase();case"TT":return s.toUpperCase();case"t":return s.charAt(0).toLowerCase();case"tt":return s.toLowerCase();default:return e.replace(/'/g,"")}})},k.tm_datepicker._base_selectDate=k.tm_datepicker._selectDate,k.tm_datepicker._selectDate=function(e,t){var i=this._getInst(k(e)[0]),s=this._get(i,"tm_timepicker");s&&i.settings.showTimepicker?(s._limitMinMaxDateTime(i,!0),s=i.inline,i.stay_open=!0,i.inline=!0,this._base_selectDate(e,t),i.inline=s,i.stay_open=!1,this._notifyChange(i),this._updateDatepicker(i)):this._base_selectDate(e,t)},k.tm_datepicker._base_updateDatepicker=k.tm_datepicker._updateDatepicker,k.tm_datepicker._updateDatepicker=function(e){var t=e.input[0];k.tm_datepicker._curInst&&k.tm_datepicker._curInst!==e&&k.tm_datepicker._datepickerShowing&&k.tm_datepicker._lastInput!==t||("boolean"!=typeof e.stay_open||!1===e.stay_open)&&(this._base_updateDatepicker(e),t=this._get(e,"tm_timepicker"))&&t._addTimePicker(e)},k.tm_datepicker._base_doKeyPress=k.tm_datepicker._doKeyPress,k.tm_datepicker._doKeyPress=function(e){var t,i,s=k.tm_datepicker._getInst(e.target),a=k.tm_datepicker._get(s,"tm_timepicker");return a&&k.tm_datepicker._get(s,"constrainInput")?(t=a.support.ampm,i=null!==a._defaults.showTimezone?a._defaults.showTimezone:a.support.timezone,s=k.tm_datepicker._possibleChars(k.tm_datepicker._get(s,"dateFormat")),t=a._defaults.timeFormat.toString().replace(/[hms]/g,"").replace(/TT/g,t?"APM":"").replace(/Tt/g,t?"AaPpMm":"").replace(/tT/g,t?"AaPpMm":"").replace(/T/g,t?"AP":"").replace(/tt/g,t?"apm":"").replace(/t/g,t?"ap":"")+" "+a._defaults.separator+a._defaults.timeSuffix+(i?a._defaults.timezoneList.join(""):"")+a._defaults.amNames.join("")+a._defaults.pmNames.join("")+s,i=String.fromCharCode(void 0===e.charCode?e.keyCode:e.charCode),e.ctrlKey||i<" "||!s||-1<t.indexOf(i)):k.tm_datepicker._base_doKeyPress(e)},k.tm_datepicker._base_updateAlternate=k.tm_datepicker._updateAlternate,k.tm_datepicker._updateAlternate=function(e){var t,i,s,a,n,r,l,m=this._get(e,"tm_timepicker");m?(t=m._defaults.altField)&&(i=this._getDate(e),s=k.tm_datepicker._getFormatConfig(e),a="",n=m._defaults.altSeparator||m._defaults.separator,r=m._defaults.altTimeSuffix||m._defaults.timeSuffix,l=null!==m._defaults.altTimeFormat?m._defaults.altTimeFormat:m._defaults.timeFormat,a+=k.tm_datepicker.formatTime(l,m,m._defaults)+r,m._defaults.timeOnly||m._defaults.altFieldTimeOnly||null===i||(a=m._defaults.altFormat?k.tm_datepicker.formatDate(m._defaults.altFormat,i,s)+n+a:m.formattedDate+n+a),k(t).val(e.input.val()?a:"")):k.tm_datepicker._base_updateAlternate(e)},k.tm_datepicker._base_doKeyUp=k.tm_datepicker._doKeyUp,k.tm_datepicker._doKeyUp=function(e){var t=k.tm_datepicker._getInst(e.target),i=k.tm_datepicker._get(t,"tm_timepicker");if(i&&i._defaults.timeOnly&&t.input.val()!==t.lastVal)try{k.tm_datepicker._updateDatepicker(t)}catch(e){k.tm_timepicker.log(e)}return k.tm_datepicker._base_doKeyUp(e)},k.tm_datepicker._base_gotoToday=k.tm_datepicker._gotoToday,k.tm_datepicker._gotoToday=function(e){var t,i,s=this._getInst(k(e)[0]);this._base_gotoToday(e),(e=this._get(s,"timepicker"))&&(t=k.tm_timepicker.timezoneOffsetNumber(e.timezone),(i=new Date).setMinutes(i.getMinutes()+i.getTimezoneOffset()+parseInt(t,10)),this._setTime(s,i),this._setDate(s,i),e._onSelectHandler())},k.tm_datepicker._disableTimepickerDatepicker=function(e){var t,i=this._getInst(e);i&&(t=this._get(i,"tm_timepicker"),k(e).tm_datepicker("getDate"),t)&&(i.settings.showTimepicker=!1,t._defaults.showTimepicker=!1,t._updateDateTime(i))},k.tm_datepicker._enableTimepickerDatepicker=function(e){var t,i=this._getInst(e);i&&(t=this._get(i,"tm_timepicker"),k(e).tm_datepicker("getDate"),t)&&(i.settings.showTimepicker=!0,t._defaults.showTimepicker=!0,t._addTimePicker(i),t._updateDateTime(i))},k.tm_datepicker._setTime=function(e,t){var i,s=this._get(e,"tm_timepicker");s&&(i=s._defaults,s.hour=t?t.getHours():i.hour,s.minute=t?t.getMinutes():i.minute,s.second=t?t.getSeconds():i.second,s.millisec=t?t.getMilliseconds():i.millisec,s.microsec=t?t.getMicroseconds():i.microsec,s._limitMinMaxDateTime(e,!0),s._onTimeChange(),s._updateDateTime(e))},k.tm_datepicker._setTimeDatepicker=function(e,t,i){var s,a,e=this._getInst(e);e&&(s=this._get(e,"tm_timepicker"))&&(this._setDateFromField(e),t)&&("string"==typeof t?(s._parseTime(t,i),(a=new Date).setHours(s.hour,s.minute,s.second,s.millisec),a.setMicroseconds(s.microsec)):(a=new Date(t.getTime())).setMicroseconds(t.getMicroseconds()),"Invalid Date"===a.toString()&&(a=void 0),this._setTime(e,a))},k.tm_datepicker._base_setDateDatepicker=k.tm_datepicker._setDateDatepicker,k.tm_datepicker._setDateDatepicker=function(e,t){var i,s=this._getInst(e),a=t;s&&("string"!=typeof t||(a=new Date(t)).getTime()||(this._base_setDateDatepicker.apply(this,arguments),a=k(e).tm_datepicker("getDate")),t=this._get(s,"tm_timepicker"),a instanceof Date?(i=new Date(a.getTime())).setMicroseconds(a.getMicroseconds()):i=a,t&&i&&(t.support.timezone||null!==t._defaults.timezone||(t.timezone=-1*i.getTimezoneOffset()),a=k.tm_timepicker.timezoneAdjust(a,k.tm_timepicker.timezoneOffsetString(-a.getTimezoneOffset()),t.timezone),i=k.tm_timepicker.timezoneAdjust(i,k.tm_timepicker.timezoneOffsetString(-i.getTimezoneOffset()),t.timezone)),this._updateDatepicker(s),this._base_setDateDatepicker.apply(this,arguments),this._setTimeDatepicker(e,i,!0))},k.tm_datepicker._base_getDateDatepicker=k.tm_datepicker._getDateDatepicker,k.tm_datepicker._getDateDatepicker=function(e,t){var i,s,a,n=this._getInst(e);if(n)return(i=this._get(n,"tm_timepicker"))?(void 0===n.lastVal&&this._setDateFromField(n,t),s=this._getDate(n),a=null,a=i.$altInput&&i._defaults.altFieldTimeOnly?i.$input.val()+" "+i.$altInput.val():("INPUT"!==i.$input.get(0).tagName&&i.$altInput?i.$altInput:i.$input).val(),s&&i._parseTime(a,!n.settings.timeOnly)&&(s.setHours(i.hour,i.minute,i.second,i.millisec),s.setMicroseconds(i.microsec),null!==i.timezone)&&(i.support.timezone||null!==i._defaults.timezone||(i.timezone=-1*s.getTimezoneOffset()),s=k.tm_timepicker.timezoneAdjust(s,i.timezone,k.tm_timepicker.timezoneOffsetString(-s.getTimezoneOffset()))),s):this._base_getDateDatepicker(e,t)},k.tm_datepicker._base_parseDate=k.tm_datepicker.parseDate,k.tm_datepicker.parseDate=function(t,i,s){var a;try{a=this._base_parseDate(t,i,s)}catch(e){if(!(0<=e.indexOf(":")))throw e;a=this._base_parseDate(t,i.substring(0,i.length-(e.length-e.indexOf(":")-2)),s),k.tm_timepicker.log("Error parsing the date string: "+e+"\ndate string = "+i+"\ndate format = "+t)}return a},k.tm_datepicker._base_formatDate=k.tm_datepicker._formatDate,k.tm_datepicker._formatDate=function(e){var t=this._get(e,"tm_timepicker");return t?(t._updateDateTime(e),t.$input.val()):this._base_formatDate(e)},k.tm_datepicker._base_optionDatepicker=k.tm_datepicker._optionDatepicker,k.tm_datepicker._optionDatepicker=function(e,t,i){var s,a,n,r,l,m,o,c=this._getInst(e);if(!c)return null;if(c=this._get(c,"tm_timepicker")){if(o=a=m=null,n=c._defaults.evnts,r={},"string"==typeof t){if("minDate"===t||"minDateTime"===t)m=i;else if("maxDate"===t||"maxDateTime"===t)a=i;else if("onSelect"===t)o=i;else if(Object.prototype.hasOwnProperty.call(n,t)){if(void 0===i)return n[t];r[t]=i,s={}}}else if("object"==typeof t)for(l in t.minDate?m=t.minDate:t.minDateTime?m=t.minDateTime:t.maxDate?a=t.maxDate:t.maxDateTime&&(a=t.maxDateTime),n)Object.prototype.hasOwnProperty.call(n,l)&&t[l]&&(r[l]=t[l]);for(l in r)Object.prototype.hasOwnProperty.call(r,l)&&(n[l]=r[l],delete(s=s||k.extend({},t))[l]);if(s&&u(s))return;if(m?(m=0===m?new Date:new Date(m),c._defaults.minDate=m,c._defaults.minDateTime=m):a?(a=0===a?new Date:new Date(a),c._defaults.maxDate=a,c._defaults.maxDateTime=a):o&&(c._defaults.onSelect=o),m||a)return o=(c=k(e)).tm_datetimepicker("getDate"),m=this._base_optionDatepicker.call(k.tm_datepicker,e,s||t,i),c.tm_datetimepicker("setDate",o),m}return void 0===i?this._base_optionDatepicker.call(k.tm_datepicker,e,t):this._base_optionDatepicker.call(k.tm_datepicker,e,s||t,i)},k.tm_timepicker=new _,k.tm_timepicker.timezoneOffsetString=function(e,t){var i;return!(isNaN(e)||840<e||e<-720)&&(i=e%60,t=t?":":"","+00:00"==(e=(0<=e?"+":"-")+("0"+Math.abs((e-i)/60)).slice(-2)+t+("0"+Math.abs(i)).slice(-2)))?"Z":e},k.tm_timepicker.timezoneOffsetNumber=function(e){var t=e.toString().replace(":","");return"Z"===t.toUpperCase()?0:/^(-|\+)\d{4}$/.test(t)?("-"===t.substring(0,1)?-1:1)*(60*parseInt(t.substring(1,3),10)+parseInt(t.substring(3,5),10)):parseInt(e,10)},k.tm_timepicker.timezoneAdjust=function(e,t,i){t=k.timepicker.timezoneOffsetNumber(t),i=k.tm_timepicker.timezoneOffsetNumber(i);return isNaN(i)||e.setMinutes(e.getMinutes()+-t- -i),e},k.tm_timepicker.timeRange=function(e,t,i){return k.tm_timepicker.handleRange("tm_timepicker",e,t,i)},k.tm_timepicker.datetimeRange=function(e,t,i){k.tm_timepicker.handleRange("tm_datetimepicker",e,t,i)},k.tm_timepicker.dateRange=function(e,t,i){k.tm_timepicker.handleRange("tm_datepicker",e,t,i)},k.tm_timepicker.handleRange=function(r,l,m,o){var e=!1;function t(e,t){var i,s,a=l[r]("getDate"),n=m[r]("getDate"),e=e[r]("getDate");null!==a&&(i=new Date(a.getTime()),s=new Date(a.getTime()),i.setMilliseconds(i.getMilliseconds()+o.minInterval),s.setMilliseconds(s.getMilliseconds()+o.maxInterval),0<o.minInterval&&n<i?m[r]("setDate",i):0<o.maxInterval&&s<n?m[r]("setDate",s):n<a&&t[r]("setDate",e))}function i(e,t,i){e.val()&&(null!==(e=e[r].call(e,"getDate"))&&0<o.minInterval&&("minDate"===i&&e.setMilliseconds(e.getMilliseconds()+o.minInterval),"maxDate"===i)&&e.setMilliseconds(e.getMilliseconds()-o.minInterval),e.getTime)&&t[r].call(t,"option",i,e)}return o=k.extend({},{minInterval:0,maxInterval:0,start:{},end:{}},o),"tm_timepicker"===r&&(e=!0,r="tm_datetimepicker"),k.fn[r].call(l,k.extend({timeOnly:e,onClose:function(){t(k(this),m)},onSelect:function(){i(k(this),m,"minDate")}},o,o.start)),k.fn[r].call(m,k.extend({timeOnly:e,onClose:function(){t(k(this),l)},onSelect:function(){i(k(this),l,"maxDate")}},o,o.end)),t(l,m),i(l,m,"minDate"),i(m,l,"maxDate"),k([l.get(0),m.get(0)])},k.tm_timepicker.log=function(){window.console&&window.console.log&&window.console.log.apply&&window.console.log.apply(window.console,Array.prototype.slice.call(arguments))},k.tm_timepicker._util={_extendRemove:n,_isEmptyObject:u,_convert24to12:r,_detectSupport:h,_selectLocalTimezone:T,_computeEffectiveSetting:o,_splitDateTime:l,_parseDateTimeInternal:m},Date.prototype.getMicroseconds||(Object.defineProperty(Date.prototype,"microseconds",{value:0,writable:!0}),Object.defineProperty(Date.prototype,"getMicroseconds",{value:function(){return this.microseconds}}),Object.defineProperty(Date.prototype,"setMicroseconds",{value:function(e){return this.setMilliseconds(this.getMilliseconds()+Math.floor(e/1e3)),this.microseconds=e%1e3,this}})),k.tm_timepicker.version="1.6.3")});assets/js/jquery.lazyloadxt.extra.js000064400000021304150755142450013663 0ustar00/**
 * Lazy Load XT v1.1.0 2016-01-12
 * http://ressio.github.io/lazy-load-xt
 * (C) 2016 RESS.io
 * Licensed under MIT
 * reformatted code by ThemeComplete
 */

( function( $, window, document ) {
	'use strict';

	// options
	var lazyLoadXT = 'lazyLoadXT',
		dataLazied = 'lazied',
		loadError = 'load error',
		classLazyHidden = 'lazy-hidden',
		docElement = document.documentElement || document.body,
		//  force load all images in Opera Mini and some mobile browsers without scroll event or getBoundingClientRect()
		forceLoad =
			window.onscroll === undefined ||
			!! window.operamini ||
			! docElement.getBoundingClientRect,
		options = {
			autoInit: true, // auto initialize in document ready
			selector: 'img[data-src]', // selector for lazyloading elements
			blankImage: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
			throttle: 99, // interval (ms) for changes check
			forceLoad: forceLoad, // force auto load all images

			loadEvent: 'pageshow', // check AJAX-loaded content in jQueryMobile
			updateEvent: 'load orientationchange resize scroll touchmove focus', // page-modified events
			forceEvent: 'lazyloadall', // force loading of all elements

			//onstart: null,
			oninit: { removeClass: 'lazy' }, // init handler
			onshow: { addClass: classLazyHidden }, // start loading handler
			onload: { removeClass: classLazyHidden, addClass: 'lazy-loaded' }, // load success handler
			onerror: { removeClass: classLazyHidden }, // error handler
			//oncomplete: null, // complete handler

			//scrollContainer: undefined,
			checkDuplicates: true
		},
		elementOptions = {
			srcAttr: 'data-src',
			edgeX: 0,
			edgeY: 0,
			visibleOnly: true
		},
		$window = $( window ),
		$isFunction = function( f ) {
			return typeof f === 'function';
		},
		$extend = $.extend,
		$data =
			$.data ||
			function( el, name ) {
				return $( el ).data( name );
			},
		elements = [],
		topLazy = 0,
		/*
         waitingMode=0 : no setTimeout
         waitingMode=1 : setTimeout, no deferred events
         waitingMode=2 : setTimeout, deferred events
         */
		waitingMode = 0;

	$[ lazyLoadXT ] = $extend( options, elementOptions, $[ lazyLoadXT ] );

	/**
	 * Return options.prop if obj.prop is undefined, otherwise return obj.prop
	 *
	 * @param {*} obj
	 * @param {*} prop
	 */
	function getOrDef( obj, prop ) {
		return obj[ prop ] === undefined ? options[ prop ] : obj[ prop ];
	}

	function scrollTop() {
		var scroll = window.pageYOffset;
		return scroll === undefined ? docElement.scrollTop : scroll;
	}

	/**
	 * Run check of lazy elements after timeout
	 */
	function timeoutLazyElements() {
		if ( waitingMode > 1 ) {
			waitingMode = 1;
			checkLazyElements();
			setTimeout( timeoutLazyElements, options.throttle );
		} else {
			waitingMode = 0;
		}
	}

	/**
	 * Queue check of lazy elements because of event e
	 *
	 * @param {Event} [e]
	 */
	function queueCheckLazyElements( e ) {
		if ( ! elements.length ) {
			return;
		}

		// fast check for scroll event without new visible elements
		if ( e && e.type === 'scroll' && e.currentTarget === window ) {
			if ( topLazy >= scrollTop() ) {
				return;
			}
		}

		if ( ! waitingMode ) {
			setTimeout( timeoutLazyElements, 0 );
		}
		waitingMode = 2;
	}

	/**
	 * Process function/object event handler
	 *
	 * @param {string} event suffix
	 * @param {jQuery} $el
	 */
	function triggerEvent( event, $el ) {
		var handler = options[ 'on' + event ];
		if ( handler ) {
			if ( $isFunction( handler ) ) {
				handler.call( $el[ 0 ] );
			} else {
				if ( handler.addClass ) {
					$el.addClass( handler.addClass );
				}
				if ( handler.removeClass ) {
					$el.removeClass( handler.removeClass );
				}
			}
		}

		$el.trigger( 'lazy' + event, [ $el ] );

		// queue next check as images may be resized after loading of actual file
		queueCheckLazyElements();
	}

	/**
	 * Trigger onload/onerror handler
	 *
	 * @param {Event} e
	 */
	function triggerLoadOrError( e ) {
		triggerEvent( e.type, $( e.currentTarget ).off( loadError, triggerLoadOrError ) );
	}

	/**
	 * Load visible elements
	 *
	 * @param {bool} [force] loading of all elements
	 */
	function checkLazyElements( force ) {
		var viewportTop, viewportHeight, viewportWidth, i, length;

		var $el, el, objData, removeNode, visible, topEdge;

		var elPos, edgeX, edgeY;

		var srcAttr, src;

		if ( ! elements.length ) {
			return;
		}

		force = force || options.forceLoad;

		topLazy = Infinity;

		viewportTop = scrollTop();
		viewportHeight = window.innerHeight || docElement.clientHeight;
		viewportWidth = window.innerWidth || docElement.clientWidth;

		for ( i = 0, length = elements.length; i < length; i += 1 ) {
			$el = elements[ i ];
			el = $el[ 0 ];
			objData = $el[ lazyLoadXT ];
			removeNode = false;
			visible = force || $data( el, dataLazied ) < 0;

			// remove items that are not in DOM
			if ( ! $.contains( docElement, el ) ) {
				removeNode = true;
			} else if ( force || ! objData.visibleOnly || el.offsetWidth || el.offsetHeight ) {
				if ( ! visible ) {
					elPos = el.getBoundingClientRect();
					edgeX = objData.edgeX;
					edgeY = objData.edgeY;

					topEdge = elPos.top + viewportTop - edgeY - viewportHeight;

					visible = topEdge <= viewportTop && elPos.bottom > -edgeY && elPos.left <= viewportWidth + edgeX && elPos.right > -edgeX;
				}

				if ( visible ) {
					$el.on( loadError, triggerLoadOrError );

					triggerEvent( 'show', $el );

					srcAttr = objData.srcAttr;
					src = $isFunction( srcAttr ) ? srcAttr( $el ) : el.getAttribute( srcAttr );

					if ( src ) {
						el.src = src;
					}

					removeNode = true;
				} else if ( topEdge < topLazy ) {
					topLazy = topEdge;
				}
			}

			if ( removeNode ) {
				$data( el, dataLazied, 0 );
				elements.splice( i, 1 );
				i = i - 1;
				length = length - 1;
			}
		}

		if ( ! length ) {
			triggerEvent( 'complete', $( docElement ) );
		}
	}

	/**
	 * Add new elements to lazy-load list:
	 * $(elements).lazyLoadXT() or $(window).lazyLoadXT()
	 *
	 * @param {Object} [overrides] override global options
	 */
	$.fn[ lazyLoadXT ] = function( overrides ) {
		var blankImage;
		var checkDuplicates;
		var scrollContainer;
		var forceShow;
		var elementOptionsOverrides = {};

		overrides = overrides || {};

		blankImage = getOrDef( overrides, 'blankImage' );
		checkDuplicates = getOrDef( overrides, 'checkDuplicates' );
		scrollContainer = getOrDef( overrides, 'scrollContainer' );
		forceShow = getOrDef( overrides, 'show' );

		// empty overrides.scrollContainer is supported by both jQuery and Zepto
		$( scrollContainer ).on( 'scroll', queueCheckLazyElements );

		Object.keys( elementOptions ).forEach( function( prop ) {
			elementOptionsOverrides[ prop ] = getOrDef( overrides, prop );
		} );

		return this.each( function( index, el ) {
			var duplicate;
			var $el;
			if ( el === window ) {
				$( options.selector ).lazyLoadXT( overrides );
			} else {
				duplicate = checkDuplicates && $data( el, dataLazied );
				$el = $( el ).data( dataLazied, forceShow ? -1 : 1 );

				// prevent duplicates
				if ( duplicate ) {
					queueCheckLazyElements();
					return;
				}

				if ( blankImage && el.tagName === 'IMG' && ! el.src ) {
					el.src = blankImage;
				}

				// clone elementOptionsOverrides object
				$el[ lazyLoadXT ] = $extend( {}, elementOptionsOverrides );

				triggerEvent( 'init', $el );

				elements.push( $el );
				queueCheckLazyElements();
			}
		} );
	};

	/**
	 * Initialize list of hidden elements
	 */
	function initLazyElements() {
		$window.lazyLoadXT();
	}

	/**
	 * Loading of all elements
	 */
	function forceLoadAll() {
		checkLazyElements( true );
	}

	/**
	 * Initialization
	 */
	// document ready
	$( function() {
		triggerEvent( 'start', $window );

		$window.on( options.updateEvent, queueCheckLazyElements ).on( options.forceEvent, forceLoadAll );

		$( document ).on( options.updateEvent, queueCheckLazyElements );

		if ( options.autoInit ) {
			$window.on( options.loadEvent, initLazyElements );
			initLazyElements(); // standard initialization
		}
	} );
}( window.jQuery || window.Zepto || window.$, window, document ) );

( function( $ ) {
	'use strict';

	var options = $.lazyLoadXT;

	options.selector += ',video,iframe[data-src]';
	options.videoPoster = 'data-poster';

	$( document ).on( 'lazyshow', 'video', function( e, $el ) {
		var srcAttr = $el.lazyLoadXT.srcAttr,
			isFuncSrcAttr = typeof srcAttr === 'function',
			changed = false;

		$el.attr( 'poster', $el.attr( options.videoPoster ) );
		$el.children( 'source,track' ).each( function( index, el ) {
			var $child = $( el ),
				src = isFuncSrcAttr ? srcAttr( $child ) : $child.attr( srcAttr );
			if ( src ) {
				$child.attr( 'src', src );
				changed = true;
			}
		} );

		// reload video
		if ( changed ) {
			this.load();
		}
	} );
}( window.jQuery || window.Zepto || window.$ ) );
assets/js/tm-math.js000064400000114700150755142450010402 0ustar00
/*jshint esversion: 6 */
( function( window ) {
	'use strict';

	var empty = function( mixedVar ) {
		var undef;
		var key;
		var i;
		var len;
		var emptyValues = [ undef, null, false, 0, '', '0' ];
		for ( i = 0, len = emptyValues.length; i < len; i++ ) {
			if ( mixedVar === emptyValues[ i ] ) {
				return true;
			}
		}
		if ( typeof mixedVar === 'object' ) {
			for ( key in mixedVar ) {
				if ( mixedVar.hasOwnProperty( key ) ) {
					return false;
				}
			}
			return true;
		}
		return false;
	};

	var array_key_exists = function( key, search ) {
		if ( ! search || ( search.constructor !== Array && search.constructor !== Object ) ) {
			return false;
		}
		return key in search;
	};

	var getNumberOfParameters = function( func ) {
		const ARROW = true;
		const FUNC_ARGS = ARROW ? /^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m : /^(function)\s*[^\(]*\(\s*([^\)]*)\)/m;
		const FUNC_ARG_SPLIT = /,/;
		const FUNC_ARG = /^\s*(_?)(.+?)\1\s*$/;
		const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;

		return ( ( func || '' )
			.toString()
			.replace( STRIP_COMMENTS, '' )
			.match( FUNC_ARGS ) || [ '', '', '' ] )[ 2 ]
			.split( FUNC_ARG_SPLIT )
			.map( function( arg ) {
				return arg.replace( FUNC_ARG, function( all, underscore, name ) {
					return name.split( '=' )[ 0 ].trim();
				} );
			} )
			.filter( String )
			.length;
	};

	var getNumberOfRequiredParameters = function( func ) {
		return func.length;
	};

	var is_scalar = function( mixedVar ) {
		return ( /boolean|number|string/ ).test( typeof mixedVar );
	};

	var gettype = function( obj ) {
		return {}.toString.call( obj ).split( ' ' )[ 1 ].slice( 0, -1 ).toLowerCase();
	};

	var floatval = function( s, d ) {
		var n;

		if ( ! ( typeof s === 'string' || typeof s === 'number' ) || isNaN( s ) ) {
			if ( d !== undefined ) {
				return d;
			}
			return 0;
		}
		n = parseFloat( s );
		if ( isNaN( n ) ) {
			if ( d !== undefined ) {
				return d;
			}
			return s;
		}

		return n;
	};

	var strcmp = function( str1, str2 ) {
		return ( ( str1 === str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
	};

	var bindec = function( binaryString ) {
		binaryString = ( binaryString + '' ).replace( /[^01]/gi, '' );
		return parseInt( binaryString, 2 );
	};

	var decbin = function( number ) {
		if ( number < 0 ) {
			number = 0xFFFFFFFF + number + 1;
		}
		return parseInt( number, 10 ).toString( 2 );
	};

	var dechex = function( number ) {
		if ( number < 0 ) {
			number = 0xFFFFFFFF + number + 1;
		}
		return parseInt( number, 10 ).toString( 16 );
	};

	var decoct = function( number ) {
		if ( number < 0 ) {
			number = 0xFFFFFFFF + number + 1;
		}
		return parseInt( number, 10 ).toString( 8 );
	};

	var deg2rad = function( angle ) {
		return angle * 0.017453292519943295; // (angle / 180) * Math.PI;
	};

	var roundWithPrecision = function( num, dec = 0 ) {
		var num_sign = num >= 0 ? 1 : -1;
		return dec === 0 ? Math.round( num ) : parseFloat( ( Math.round( ( num * Math.pow( 10, dec ) ) + ( num_sign * 0.0001 ) ) / Math.pow( 10, dec ) ).toFixed( dec ) );
	};

	var hexdec = function( hexString ) {
		hexString = ( hexString + '' ).replace( /[^a-f0-9]/gi, '' );
		return parseInt( hexString, 16 );
	};

	var octdec = function( octString ) {
		octString = ( octString + '' ).replace( /[^0-7]/gi, '' );
		return parseInt( octString, 8 );
	};

	var hypot = function( x, y ) {
		var t;
		x = Math.abs( x );
		y = Math.abs( y );
		t = Math.min( x, y );
		x = Math.max( x, y );
		t = t / x;
		return x * Math.sqrt( 1 + ( t * t ) ) || null;
	};

	var THEMECOMPLETE_EPO_MATH = {
		variables: {},
		on_var_not_found: undefined,
		on_var_validation: undefined,
		operators: {},
		functions: {},
		cache: {},
		construct: function() {
			this.add_defaults();
			this.set_division_by_zero_to_zero();
			return this;
		},
		add_operator: function( $operator ) {
			this.operators[ $operator.operator ] = $operator;
			return this;
		},
		evaluate: function( $expression, $cache = true ) {
			return this.execute( $expression, $cache );
		},
		parse: function( $expression ) {
			var $tokens;
			var result;
			var $calculator;
			var count = 0;
			var char;

			for ( char of $expression ) {
				if ( char === '(' ) {
					count++;
				} else if ( char === ')' ) {
					count--;
				}

				// If count becomes negative at any point, return false
				if ( count < 0 ) {
					return false;
				}
			}

			// If count is not zero at the end, parentheses are not balanced
			if ( count !== 0 ) {
				return false;
			}

			$tokens = new THEMECOMPLETE_EPO_MATH_Tokenizer( $expression, this.operators );
			$tokens = $tokens.tokenize().build_reverse_polish_notation();
			$calculator = new THEMECOMPLETE_EPO_MATH_Calculator( this.functions, this.operators );

			result = $calculator.calculate( $tokens, this.variables, this.on_var_not_found, this );
			if ( 'number' !== gettype( result ) || isNaN( result ) ) {
				return false;
			}
			return result;
		},
		execute: function( $expression, $cache = true ) {
			var $cache_key = $expression;
			var $calculator;
			var $tokens;
			var result;

			if ( ! array_key_exists( $cache_key, this.cache ) ) {
				$tokens = new THEMECOMPLETE_EPO_MATH_Tokenizer( $expression, this.operators );
				$tokens = $tokens.tokenize().build_reverse_polish_notation();
				if ( $cache ) {
					this.cache[ $cache_key ] = $tokens;
				}
			} else {
				$tokens = this.cache[ $cache_key ];
			}

			$calculator = new THEMECOMPLETE_EPO_MATH_Calculator( this.functions, this.operators );

			result = $calculator.calculate( $tokens, this.variables, this.on_var_not_found, this );

			if ( 'number' !== gettype( result ) || isNaN( result ) ) {
				result = 0;
			}

			return result;
		},
		add_function: function( $name, $function ) {
			this.functions[ $name ] = new THEMECOMPLETE_EPO_MATH_CustomFunction( $name, $function );
			return this;
		},
		get_vars: function() {
			return this.variables;
		},
		get_var: function( $variable ) {
			if ( ! array_key_exists( $variable, this.variables ) ) {
				if ( this.on_var_not_found && 'function' === typeof this.on_var_not_found ) {
					this.on_var_not_found( $variable );
				}
				return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Variable (' + $variable + ') not set', 'UnknownVariableError', 0 );
			}
			return this.variables[ $variable ];
		},
		set_var: function( $variable, $value ) {
			if ( this.on_var_validation && 'function' === typeof this.on_var_validation ) {
				$value = this.on_var_validation( $variable, $value );
			}
			this.variables[ $variable ] = $value;
			return this;
		},
		var_exists: function( $variable ) {
			return array_key_exists( $variable, this.variables );
		},
		set_vars: function( $variables, $clear = true ) {
			var $this = this;
			if ( $clear ) {
				this.remove_vars();
			}
			$variables.forFach( function( $value, $name ) {
				$this.set_var( $name, $value );
			} );
			return this;
		},
		set_var_not_found_handler: function( $handler ) {
			this.on_var_not_found = $handler;
			return this;
		},
		set_var_validation_handler: function( $handler ) {
			this.on_var_validation = $handler;
			return this;
		},
		remove_var: function( $variable ) {
			delete this.variables[ $variable ];
			return this;
		},
		remove_vars: function() {
			this.variables = {};
			this.on_var_not_found = null;
			return this;
		},
		get_operators: function() {
			return this.operators;
		},
		get_functions: function() {
			return this.functions;
		},
		remove_operator: function( $operator ) {
			delete this.operators[ $operator ];
		},
		set_division_by_zero_to_zero: function() {
			this.add_operator(
				new THEMECOMPLETE_EPO_MATH_Operator(
					'/',
					false,
					180,
					function( $a, $b ) {
						$a = Number( $a );
						$b = Number( $b );
						return 0 == $b ? 0 : $a / $b; // eslint-disable-line eqeqeq
					}
				)
			);
			return this;
		},
		get_cache: function() {
			return this.cache;
		},
		clear_cache: function() {
			this.cache = [];
		},
		add_defaults: function() {
			var $this = this;
			var default_operators = this.default_operators();
			var default_functions = this.default_functions();
			Object.keys( default_operators ).forEach( function( $name ) {
				var $operator = default_operators[ $name ];
				$this.add_operator( new THEMECOMPLETE_EPO_MATH_Operator( $name, $operator[ 2 ], $operator[ 1 ], $operator[ 0 ] ) );
			} );
			Object.keys( default_functions ).forEach( function( $name ) {
				var $callable = default_functions[ $name ];
				$this.add_function( $name, $callable );
			} );
			this.on_var_validation = this.default_var_validation;
			this.variables = this.default_vars();
			return this;
		},
		default_operators: function() {
			return {
				'+': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						return $a + $b;
					},
					170,
					false
				],
				'-': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						return $a - $b;
					},
					170,
					false
				],
				// unary positive token.
				uPos: [
					function( $a ) {
						$a = floatval( $a, 0 );
						return $a;
					},
					200,
					false
				],
				// unary minus token.
				uNeg: [
					function( $a ) {
						$a = floatval( $a, 0 );
						return 0 - $a;
					},
					200,
					false
				],
				'*': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						return $a * $b;
					},
					180,
					false
				],
				'/': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						if ( empty( $b ) ) {
							return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Division By Zero', 'DivisionByZeroError', 0 );
						}
						return $a / $b;
					},
					180,
					false
				],
				'^': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						return Math.pow( $a, $b );
					},
					220,
					true
				],
				'%': [
					function( $a, $b ) {
						$a = floatval( $a, 0 );
						$b = floatval( $b, 0 );
						return $a % $b;
					},
					180,
					false
				],
				'&&': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a && $b ? 1 : 0;
					},
					100,
					false
				],
				'||': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a || $b ? 1 : 0;
					},
					90,
					false
				],
				'==': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() && $b.isNumeric() ) {
							return floatval( $a ) === floatval( $b ) ? 1 : 0;
						}
						return 0 === strcmp( $a, $b ) ? 1 : 0;
					},
					140,
					false
				],
				'!=': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() && $b.isNumeric() ) {
							return floatval( $a ) !== floatval( $b ) ? 1 : 0;
						}
						return 0 !== strcmp( $a, $b ) ? 1 : 0;
					},
					140,
					false
				],
				'>=': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a >= $b ? 1 : 0;
					},
					150,
					false
				],
				'>': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a > $b ? 1 : 0;
					},
					150,
					false
				],
				'<=': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a <= $b ? 1 : 0;
					},
					150,
					false
				],
				'<': [
					function( $a, $b ) {
						$a = String( $a );
						$b = String( $b );
						if ( $a.isNumeric() ) {
							$a = floatval( $a, 0 );
						}
						if ( $b.isNumeric() ) {
							$b = floatval( $b, 0 );
						}
						return $a < $b ? 1 : 0;
					},
					150,
					false
				]
			};
		},
		default_functions: function() {
			var $this = this;
			return {
				abs: Math.abs,
				acos: Math.acos,
				acosh: Math.acosh,
				arcsin: Math.asin,
				arcctg: function( $arg ) {
					return ( Math.PI / 2 ) - Math.atan( $arg );
				},
				arccot: function( $arg ) {
					return ( Math.PI / 2 ) - Math.atan( $arg );
				},
				arccotan: function( $arg ) {
					return ( Math.PI / 2 ) - Math.atan( $arg );
				},
				arcsec: function( $arg ) {
					return Math.acos( 1 / $arg );
				},
				arccosec: function( $arg ) {
					return Math.asin( 1 / $arg );
				},
				arccsc: function( $arg ) {
					return Math.asin( 1 / $arg );
				},
				arccos: Math.acos,
				arctan: Math.atan,
				arctg: Math.atan,
				array: function( ...$args ) {
					return $args;
				},
				asin: Math.asin,
				atan: Math.atan,
				atan2: Math.atan2,
				atanh: Math.atanh,
				atn: Math.atan,

				avg: function( $arg1, ...$args ) {
					var sum;
					if ( Array.isArray( $arg1 ) ) {
						if ( 0 === $arg1.length ) {
							return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
						}
					}
					$args = [].concat.apply( [], [ $arg1, ...$args ] );

					sum = $args.reduce( function( previousValue, currentValue ) {
						return floatval( currentValue, 0 ) + floatval( previousValue, 0 );
					} );
					return sum / $args.length;
				},
				average: function( $arg1, ...$args ) {
					var sum;
					if ( Array.isArray( $arg1 ) ) {
						if ( 0 === $arg1.length ) {
							return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
						}
					}
					$args = [].concat.apply( [], [ $arg1, ...$args ] );

					sum = $args.reduce( function( previousValue, currentValue ) {
						return floatval( currentValue, 0 ) + floatval( previousValue, 0 );
					} );
					return sum / $args.length;
				},
				bindec: bindec,
				ceil: Math.ceil,
				cos: Math.cos,
				cosec: function( $arg ) {
					return Math.sin( 1 / $arg );
				},
				csc: function( $arg ) {
					return Math.sin( 1 / $arg );
				},
				cosh: Math.cosh,
				ctg: function( $arg ) {
					return Math.cos( $arg ) / Math.sin( $arg );
				},
				cot: function( $arg ) {
					return Math.cos( $arg ) / Math.sin( $arg );
				},
				cotan: function( $arg ) {
					return Math.cos( $arg ) / Math.sin( $arg );
				},
				cotg: function( $arg ) {
					return Math.cos( $arg ) / Math.sin( $arg );
				},
				ctn: function( $arg ) {
					return Math.cos( $arg ) / Math.sin( $arg );
				},
				decbin: decbin,
				dechex: dechex,
				decoct: decoct,
				deg2rad: deg2rad,
				exp: Math.exp,
				expm1: Math.expm1,
				floor: Math.floor,
				int: Math.floor,
				fmod: function( $arg1, $arg2 ) {
					return $arg1 % $arg2;
				},
				hexdec: hexdec,
				hypot: hypot,
				if: function( $expr, $trueval, $falseval ) {
					var $exres;
					if ( 0 === $expr || 1 === $expr || true === $expr || false === $expr ) {
						$exres = $expr;
					} else {
						$exres = $this.execute( $expr );
					}
					if ( $exres ) {
						return $this.execute( $trueval );
					}
					return $this.execute( $falseval );
				},
				intdiv: function( $arg1, $arg2 ) {
					return Math.trunc( Math.trunc( $arg1 ) / Math.trunc( $arg2 ) );
				},
				ln: Math.log,
				lg: Math.log10,
				log: Math.log,
				log1p: Math.log1p,
				max: function( $arg1, ...$args ) {
					var $array;
					if ( Array.isArray( $arg1 ) && 0 === $arg1.length ) {
						return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
					}
					$array = Array.isArray( $arg1 ) ? $arg1 : [ $arg1, ...$args ];
					$array = $array.map( floatval );

					return Math.max( ...$array );
				},
				min: function( $arg1, ...$args ) {
					var $array;
					if ( Array.isArray( $arg1 ) && 0 === $arg1.length ) {
						return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
					}
					$array = Array.isArray( $arg1 ) ? $arg1 : [ $arg1, ...$args ];
					$array = $array.map( floatval );

					return Math.min( ...$array );
				},
				octdec: octdec,
				pi: function() {
					return Math.PI;
				},
				pow: Math.pow,
				rad2deg: function( angle ) {
					return angle * 57.29577951308232; // angle / Math.PI * 180
				},
				round: roundWithPrecision,
				sin: Math.sin,
				sinh: Math.sinh,
				sec: function( $arg ) {
					return 1 / Math.cos( $arg );
				},
				sqrt: Math.sqrt,
				tan: Math.tan,
				tanh: Math.tanh,
				tn: Math.tan,
				tg: Math.tan,
				lookuptable: function( field, lookupTableId ) {
					var lookupTables;
					var x;
					var y;
					var table;
					var xColumn;
					var price = 0;
					var tableNum = 0;
					var TMEPOJS = window.TMEPOJS;

					if ( TMEPOJS ) {
						lookupTables = window && window.jQuery && window.jQuery.epoAPI && window.jQuery.epoAPI.util.parseJSON( TMEPOJS.lookupTables );
						if ( lookupTables ) {
							if ( Array.isArray( lookupTableId ) ) {
								tableNum = lookupTableId[ 1 ];
								lookupTableId = lookupTableId[ 0 ];
							}
							if ( empty( lookupTableId ) ) {
								return 0;
							}
							if ( empty( tableNum ) ) {
								tableNum = 0;
							}
							if ( Array.isArray( field ) ) {
								x = String( field[ 0 ] );
								y = String( field[ 1 ] );
							} else {
								x = String( field );
								y = '';
							}

							table = lookupTables[ lookupTableId ];
							if ( table ) {
								table = table[ tableNum ];
								if ( table ) {
									table = table.data;
									xColumn = table[ x ];
									if ( xColumn === undefined && x && x !== undefined ) {
										if ( x.isNumeric() && floatval( x ) === 0 ) {
											xColumn = table[ Object.keys( table )[ 0 ] ];
										} else if ( x ) {
											x = $this.find_lookup_table_index( x, table );
											xColumn = table[ x ];
										}
									}
									if ( xColumn !== undefined ) {
										if ( y && y !== undefined ) {
											y = $this.find_lookup_table_index( y, xColumn );
										} else {
											// fetch the first row since this means we want
											// a single row result
											y = Object.keys( xColumn )[ 0 ];
										}
										if ( y === 'max' ) {
											price = floatval( xColumn[ Object.keys( xColumn )[ Object.keys( xColumn ).length - 1 ] ] );
										} else {
											price = floatval( xColumn[ y ] );
										}
									}
								}
							}
						}
					}
					return price;
				},
				concat: function( $arg1, ...$args ) {
					var $array;
					if ( Array.isArray( $arg1 ) && 0 === $arg1.length ) {
						return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
					}
					$array = Array.isArray( $arg1 ) ? $arg1 : [ $arg1, ...$args ];

					return $array.join( '' );
				}
			};
		},
		find_lookup_table_index: function( value, table ) {
			var r;
			var keys = Object.keys( table );
			var hasNumericValuesOrMaxLast = function( arr ) {
				var lastElement = arr[ arr.length - 1 ];
				var areAllNumericValues = arr.every( function( val ) {
					return String( val ).isNumeric();
				} );
				return areAllNumericValues || lastElement === 'max';
			};

			if ( hasNumericValuesOrMaxLast( keys ) ) {
				value = String( value ).isNumeric() ? floatval( value ) : value;
				r = keys.map( function( n ) {
					return String( n ).isNumeric() ? floatval( n ) : n;
				} ).reduce( function( a, b ) {
					if ( b === 'max' && value > a ) {
						return b;
					}
					if ( a === 'max' && value > b ) {
						return a;
					}
					if ( a < b ) {
						if ( value > a && value <= b ) {
							return b;
						}
					} else {
						if ( ( value > b && value <= a ) || ( value > a || b === 'max' ) ) {
							return a;
						}
						return b;
					}
					if ( value > b ) {
						return b;
					}
					return a;
				} );
				keys = keys.map( function( n ) {
					return String( n ).isNumeric() ? floatval( n ) : n;
				} );

				if ( value > Math.max( ...keys ) || value < Math.min( ...keys ) ) {
					return false;
				}
			} else {
				r = value;
			}

			return r;
		},
		default_vars: function() {
			return {
				pi: 3.141592653589793,
				e: 2.718281828459045
			};
		},
		default_var_validation: function( $variable, $value ) {
			if ( ! is_scalar( $value ) && ! Array.isArray( $value ) && undefined !== $value ) {
				return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Variable (' + $variable + ') type (' + gettype( $value ) + ') is not scalar or array!', 0 );
			}
			return $value;
		}
	};

	var THEMECOMPLETE_EPO_MATH_Tokenizer = function( $input, $operators ) {
		var node = {
			tokens: [],
			input: '',
			operators: {},
			number_buffer: '',
			string_buffer: '',
			allow_negative: true,
			in_single_quoted_string: false,
			in_double_quoted_string: false,
			is_number: function( ch ) {
				return ch >= '0' && ch <= '9';
			},
			is_alpha: function( ch ) {
				return ( ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z' ) || '_' === ch;
			},
			is_dot: function( ch ) {
				return '.' === ch;
			},
			is_lp: function( ch ) {
				return '(' === ch;
			},
			is_rp: function( ch ) {
				return ')' === ch;
			},
			is_comma: function( ch ) {
				return ',' === ch;
			},
			empty_number_buffer_as_literal: function() {
				if ( this.number_buffer.length ) {
					this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, this.number_buffer ) );
					this.number_buffer = '';
				}
			},
			empty_str_buffer_as_variable: function() {
				if ( '' !== this.string_buffer ) {
					this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.VARIABLE, this.string_buffer ) );
					this.string_buffer = '';
				}
			},
			tokenize: function() {
				var is_last_char_escape = false;
				var $this = this;
				var $token_test = [];

				this.tokens = [];

				this.input.toString().split( '' ).forEach( function( ch ) {
					switch ( true ) {
						case $this.in_single_quoted_string:
							if ( '\\' === ch ) {
								if ( is_last_char_escape ) {
									$this.string_buffer += '\\';
									is_last_char_escape = false;
								} else {
									is_last_char_escape = true;
								}
								break;
							} else if ( "'" === ch ) {
								if ( is_last_char_escape ) {
									$this.string_buffer += "'";
									is_last_char_escape = false;
								} else {
									$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.STRING, $this.string_buffer ) );
									$this.in_single_quoted_string = false;
									$this.string_buffer = '';
								}
								break;
							}
							if ( is_last_char_escape ) {
								$this.string_buffer += '\\';
								is_last_char_escape = false;
							}
							$this.string_buffer += ch;
							break;
						case $this.in_double_quoted_string:
							if ( '\\' === ch ) {
								if ( is_last_char_escape ) {
									$this.string_buffer += '\\';
									is_last_char_escape = false;
								} else {
									is_last_char_escape = true;
								}
								break;
							} else if ( '"' === ch ) {
								if ( is_last_char_escape ) {
									$this.string_buffer += '"';
									is_last_char_escape = false;
								} else {
									$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.STRING, $this.string_buffer ) );
									$this.in_double_quoted_string = false;
									$this.string_buffer = '';
								}
								break;
							}
							if ( is_last_char_escape ) {
								$this.string_buffer += '\\';
								is_last_char_escape = false;
							}
							$this.string_buffer += ch;
							break;
						case '[' === ch:
							$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.FUNCTION, 'array' ) );
							$this.allow_negative = true;
							$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS, '' ) );
							break;
						case ' ' === ch || '\n' === ch || '\r' === ch || '\t' === ch:
							/**
							 * In case those tokens must not be ingored use the following
							 *
							 * $this.empty_number_buffer_as_literal();
							 * $this.empty_str_buffer_as_variable();
							 * $this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.SPACE, '' ) );
							 */
							break;
						case $this.is_number( ch ):
							if ( '' !== $this.string_buffer ) {
								$this.string_buffer += ch;
								break;
							}
							$this.number_buffer += ch;
							$this.allow_negative = false;
							break;
						case 'e' === ch.toLowerCase():
							if ( $this.number_buffer.length && -1 !== $this.number_buffer.indexOf( '.' ) ) {
								$this.number_buffer += 'e';
								$this.allow_negative = false;
								break;
							}
							/* falls through */
						case $this.is_alpha( ch ):
							if ( $this.number_buffer.length ) {
								$this.empty_number_buffer_as_literal();
								$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR, '*' ) );
							}
							$this.allow_negative = false;
							$this.string_buffer += ch;
							break;
						case '"' === ch:
							$this.in_double_quoted_string = true;
							break;
						case "'" === ch:
							$this.in_single_quoted_string = true;
							break;
						case $this.is_dot( ch ):
							$this.number_buffer += ch;
							$this.allow_negative = false;
							break;
						case $this.is_lp( ch ):
							if ( '' !== $this.string_buffer ) {
								$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.FUNCTION, $this.string_buffer ) );
								$this.string_buffer = '';
							} else if ( $this.number_buffer.length ) {
								$this.empty_number_buffer_as_literal();
								$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR, '*' ) );
							}
							$this.allow_negative = true;
							$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS, ch ) );
							break;
						case $this.is_rp( ch ) || ']' === ch :
							$this.empty_number_buffer_as_literal();
							$this.empty_str_buffer_as_variable();
							$this.allow_negative = false;
							$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.RIGHTPARENTHESIS, ch ) );
							break;
						case $this.is_comma( ch ):
							$this.empty_number_buffer_as_literal();
							$this.empty_str_buffer_as_variable();
							$this.allow_negative = true;
							$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.PARAMSEPARATOR, ch ) );
							break;
						default:
							// special case for unary operations.
							if ( '-' === ch || '+' === ch ) {
								if ( $this.allow_negative ) {
									$this.allow_negative = false;
									$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR, '-' === ch ? 'uNeg' : 'uPos' ) );
									break;
								}
								// could be in exponent, in which case negative should be added to the number_buffer.
								if ( $this.number_buffer && 'e' === $this.number_buffer[ $this.number_buffer.length - 1 ] ) {
									$this.number_buffer += ch;
									break;
								}
							}
							$this.empty_number_buffer_as_literal();
							$this.empty_str_buffer_as_variable();

							if ( '$' !== ch ) {
								if ( $this.tokens.length > 0 ) {
									if ( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR === $this.tokens[ $this.tokens.length - 1 ].type ) {
										$this.tokens[ $this.tokens.length - 1 ].value += ch;
									} else {
										$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR, ch ) );
									}
								} else {
									$this.tokens.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR, ch ) );
								}
							}
							$this.allow_negative = true;
					}
				} );
				this.empty_number_buffer_as_literal();
				this.empty_str_buffer_as_variable();

				this.tokens.forEach( function( $token, $key ) {
					$token_test[ $key ] = $token.type;
				} );
				$token_test.forEach( function( $type, $key ) {
					if ( $key > 0 && 'space' === $type && 'variable' === $token_test[ $key + 1 ] && 'variable' === $token_test[ $key - 1 ] ) {
						$this.tokens[ $key ] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, 0 );
						$this.tokens.splice( $key + 1, 1 );
						$this.tokens.splice( $key - 1, 1 );
					}
				} );
				return this;
			},
			build_reverse_polish_notation: function() {
				var $tokens = [];
				var $stack = [];
				var $param_counter = [];
				var $ctoken;
				var $f;
				var $op1;
				var $op2;
				var $this = this;

				try {
					this.tokens.forEach( function( $token ) {
						switch ( $token.type ) {
							case THEMECOMPLETE_EPO_MATH_Constants.LITERAL:
							case THEMECOMPLETE_EPO_MATH_Constants.VARIABLE:
							case THEMECOMPLETE_EPO_MATH_Constants.STRING:
								$tokens.push( $token );

								if ( $param_counter.length > 0 && 0 === $param_counter[ $param_counter.length - 1 ] ) {
									$param_counter.push( $param_counter.pop() + 1 );
								}

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.FUNCTION:
								if ( $param_counter.length > 0 && 0 === $param_counter[ $param_counter.length - 1 ] ) {
									$param_counter.push( $param_counter.pop() + 1 );
								}
								$stack.push( $token );
								$param_counter.push( 0 );

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS:
								$stack.push( $token );

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.PARAMSEPARATOR:
								while ( THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS !== $stack[ $stack.length - 1 ].type ) {
									if ( 0 === $stack.length ) {
										return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
									}
									$tokens.push( $stack.pop() );
								}
								$param_counter.push( $param_counter.pop() + 1 );

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.OPERATOR:
								if ( ! array_key_exists( $token.value, $this.operators ) ) {
									return THEMECOMPLETE_EPO_MATH_Error.trigger( $token.value, 'UnknownOperatorError', $tokens );
								}
								$op1 = $this.operators[ $token.value ];

								while ( $stack.length > 0 && THEMECOMPLETE_EPO_MATH_Constants.OPERATOR === $stack[ $stack.length - 1 ].type ) {
									if ( ! array_key_exists( $stack[ $stack.length - 1 ].value, $this.operators ) ) {
										return THEMECOMPLETE_EPO_MATH_Error.trigger( $stack[ $stack.length - 1 ].value, 'UnknownOperatorError', $tokens );
									}
									$op2 = $this.operators[ $stack[ $stack.length - 1 ].value ];

									if ( $op2.priority >= $op1.priority ) {
										$tokens.push( $stack.pop() );

										continue;
									}

									break;
								}
								$stack.push( $token );

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.RIGHTPARENTHESIS:
								while ( true ) {
									try {
										$ctoken = $stack.pop();

										if ( THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS === $ctoken.type ) {
											break;
										}
										$tokens.push( $ctoken );
									} catch ( $e ) {
										return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
									}
								}

								if ( $stack.length > 0 && THEMECOMPLETE_EPO_MATH_Constants.FUNCTION === $stack[ $stack.length - 1 ].type ) {
									$f = $stack.pop();
									$f.param_count = $param_counter.pop();
									$tokens.push( $f );
								}

								break;

							case THEMECOMPLETE_EPO_MATH_Constants.SPACE:
								// do nothing.
						}
					} );
				} catch ( $e ) {
					$tokens = [];
					return THEMECOMPLETE_EPO_MATH_Error.trigger( $e, 'Error', $tokens );
				}

				while ( 0 !== $stack.length ) {
					if ( THEMECOMPLETE_EPO_MATH_Constants.LEFTPARENTHESIS === $stack[ $stack.length - 1 ].type || THEMECOMPLETE_EPO_MATH_Constants.RIGHTPARENTHESIS === $stack[ $stack.length - 1 ].type ) {
						return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
					}

					if ( THEMECOMPLETE_EPO_MATH_Constants.SPACE === $stack[ $stack.length - 1 ].type ) {
						$stack.pop();
						continue;
					}
					$tokens.push( $stack.pop() );
				}

				return $tokens;
			}
		};
		node.input = $input;
		node.operators = $operators;
		return node;
	};

	var THEMECOMPLETE_EPO_MATH_Constants = {
		LITERAL: 'literal',
		VARIABLE: 'variable',
		OPERATOR: 'operator',
		LEFTPARENTHESIS: 'LP',
		RIGHTPARENTHESIS: 'RP',
		FUNCTION: 'function',
		PARAMSEPARATOR: 'separator',
		STRING: 'string',
		SPACE: 'space'

	};

	var THEMECOMPLETE_EPO_MATH_Token = function( $type, $value, $name ) {
		var node = {
			type: THEMECOMPLETE_EPO_MATH_Constants.LITERAL,
			value: undefined,
			name: undefined,
			param_count: null
		};
		node.type = $type;
		node.value = $value;
		node.name = $name;
		return node;
	};

	var THEMECOMPLETE_EPO_MATH_Operator = function( $operator, $is_right_assoc, $priority, $function ) {
		var node = {
			operator: '',
			is_right_assoc: false,
			priority: 0,
			function: null,
			places: 0
		};
		node.operator = $operator;
		node.is_right_assoc = $is_right_assoc;
		node.priority = $priority;
		node.function = $function;
		node.places = getNumberOfParameters( $function );

		node.execute = function( $stack ) {
			var $args = [];
			var $i;
			var $result;

			if ( $stack.length < this.places ) {
				// Empty the $stack
				$stack.splice( 0, $stack.length );
				return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Incorrect Expression', 'IncorrectExpressionError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, 0 ) );
			}

			for ( $i = 0; $i < this.places; $i++ ) {
				$args.unshift( $stack.pop().value );
			}

			$result = this.function.apply( null, $args );
			if ( 'number' !== gettype( $result ) && 'string' !== gettype( $result ) ) {
				$result = 0;
			}

			return new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, $result );
		};

		return node;
	};

	var THEMECOMPLETE_EPO_MATH_CustomFunction = function( $name, $function ) {
		var node = {
			name: '',
			function: undefined,
			required_param_count: undefined
		};

		node.name = $name;
		node.function = $function;
		node.required_param_count = getNumberOfRequiredParameters( $function );

		node.execute = function( $stack, $param_count_in_stack ) {
			var $args = [];
			var $i;
			var $argument;
			var $result;
			if ( $param_count_in_stack < this.required_param_count ) {
				$param_count_in_stack = this.required_param_count;
			}
			// We skip this section.
			if ( $param_count_in_stack < this.required_param_count ) {
				// Empty the $stack
				$stack.splice( 0, $stack.length );
				return THEMECOMPLETE_EPO_MATH_Error.trigger( this.name, 'IncorrectNumberOfFunctionParametersError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, 0 ) );
			}

			if ( $param_count_in_stack > 0 ) {
				for ( $i = 0; $i < $param_count_in_stack; $i++ ) {
					$argument = $stack.length ? $stack.pop().value : 0;
					if ( null === $argument ) {
						$argument = '0';
						$args.push( $argument );
					} else {
						$args.unshift( $argument );
					}
				}
			}

			$result = this.function.apply( null, $args );

			if ( $result === Infinity || $result === -Infinity ) {
				$result = 0;
			}

			return THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, $result );
		};

		return node;
	};

	var THEMECOMPLETE_EPO_MATH_Calculator = function( $functions, $operators ) {
		var node = {
			functions: {},
			operators: {}
		};
		node.functions = $functions;
		node.operators = $operators;

		node.calculate = function( $tokens, $variables, $on_var_not_found = null, $math_object = false ) {
			var $this = this;
			/** Array of THEMECOMPLETE_EPO_MATH_Token */
			var $stack = [];
			var $result;

			if ( empty( $tokens ) ) {
				return 0;
			}
			try {
				$tokens.forEach( function( $token ) {
					var $variable;
					var $value;
					if ( THEMECOMPLETE_EPO_MATH_Constants.LITERAL === $token.type || THEMECOMPLETE_EPO_MATH_Constants.STRING === $token.type ) {
						$stack.push( $token );
					} else if ( THEMECOMPLETE_EPO_MATH_Constants.VARIABLE === $token.type ) {
						$variable = $token.value;

						$value = null;

						if ( array_key_exists( $variable, $variables ) ) {
							$value = $variables[ $variable ];
						} else if ( $on_var_not_found && 'function' === typeof $on_var_not_found ) {
							$value = $on_var_not_found( $variable );
						} else {
							$value = $variable;
							$math_object.variables[ $variable ] = $value;
							$variables[ $variable ] = $value;
						}
						$stack.push( THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Constants.LITERAL, $value, $variable ) );
					} else if ( THEMECOMPLETE_EPO_MATH_Constants.FUNCTION === $token.type ) {
						if ( ! array_key_exists( $token.value, $this.functions ) ) {
							$math_object.add_function(
								$token.value,
								function() {
									return 0;
								}
							);
							$this.functions = $math_object.functions;
							if ( ! array_key_exists( $token.value, $this.functions ) ) {
								return THEMECOMPLETE_EPO_MATH_Error.trigger( $token.value, 'UnknownFunctionError', 0 );
							}
							THEMECOMPLETE_EPO_MATH_Error.trigger( $token.value, 'UnknownFunctionError', 0 );
						}
						$stack.push( $this.functions[ $token.value ].execute( $stack, $token.param_count ) );
					} else if ( THEMECOMPLETE_EPO_MATH_Constants.OPERATOR === $token.type ) {
						if ( ! array_key_exists( $token.value, $this.operators ) ) {
							return THEMECOMPLETE_EPO_MATH_Error.trigger( $token.value, 'UnknownOperatorError', 0 );
						}
						$stack.push( $this.operators[ $token.value ].execute( $stack ) );
					}
				} );
			} catch ( $e ) {
				if ( window.TMEPOJS && window.TMEPOJS.WP_DEBUG ) {
					window.console.log( $e );
				}
			}
			$result = $stack.pop();

			if ( undefined === $result || null === $result || ! empty( $stack ) ) {
				return THEMECOMPLETE_EPO_MATH_Error.trigger( 'Stack must be empty', 'IncorrectExpressionError', 0 );
			}

			if ( false === $result.value ) {
				$result.value = 0;
			}

			if ( true === $result.value ) {
				$result.value = 1;
			}

			if ( 'string' === gettype( $result.value ) && $result.value.isNumeric() ) {
				$result.value = floatval( $result.value );
			}

			return $result.value;
		};
		return node;
	};

	var THEMECOMPLETE_EPO_MATH_Error = {
		trigger: function( $msg, $code = '', $return = false ) {
			if ( window.TMEPOJS && window.TMEPOJS.WP_DEBUG ) {
				window.console.log( $code + '\n' + $msg );
				window.console.trace();
			}
			if ( window.TMEPOGLOBALADMINJS && window.TMEPOGLOBALADMINJS.WP_DEBUG ) {
				return $msg;
			}
			return $return;
		}
	};

	window.tcmexp = THEMECOMPLETE_EPO_MATH.construct();
}( window ) );
assets/js/tm-epo.js000064400001601617150755142450010245 0ustar00( function( window, document, $ ) {
	'use strict';

	var tcAPI = {};
	var TMEPOJS = window.TMEPOJS;
	var wp = window.wp;
	var TMEPOQTRANSLATEXJS = window.TMEPOQTRANSLATEXJS;
	var noUiSlider = window.noUiSlider;
	var ClipboardEvent = window.ClipboardEvent;
	var DataTransfer = window.DataTransfer;
	var lateVariationEvent = [];
	var latecpflogicactions = [];
	var tmLazyloadContainer = false;
	var variationsFormIsLoaded = false;
	var jBody = $( 'body' );
	var jWindow = $( window );
	var jDocument = $( document );
	var errorObject;
	var FloatingTotalsBox;
	var currentAjaxButton;
	var errorContainer = $( window );
	var tcmexp = window.tcmexp;
	var _ = window._;
	var priceCache = false;

	var getLocalInputDecimalSeparator = function() {
		if ( TMEPOJS.tm_epo_global_input_decimal_separator === '' ) {
			return TMEPOJS.currency_format_decimal_sep;
		}
		return $.epoAPI.locale.getSystemDecimalSeparator();
	};

	var getLocalDecimalSeparator = function() {
		if ( TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ) {
			return TMEPOJS.currency_format_decimal_sep;
		}
		return $.epoAPI.locale.getSystemDecimalSeparator();
	};

	var getLocalThousandSeparator = function() {
		if ( TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ) {
			return TMEPOJS.currency_format_thousand_sep;
		}
		return $.epoAPI.locale.getSystemDecimalSeparator();
	};

	var getEpoDelay = function() {
		if ( TMEPOJS.tm_epo_start_animation_delay ) {
			return TMEPOJS.tm_epo_start_animation_delay;
		} else if ( window.tc_epo_delay ) {
			return window.tc_epo_delay;
		}
		return 500;
	};

	var getEpoAnimationDelay = function() {
		if ( TMEPOJS.tm_epo_animation_delay ) {
			return TMEPOJS.tm_epo_start_animation_delay;
		} else if ( window.tc_epo_animation_delay ) {
			return window.tc_epo_animation_delay;
		}
		return 500;
	};

	var originalVal = $.fn.val;

	if ( ! TMEPOJS || ! wp ) {
		return;
	}

	// Trigger plugin events when other plugins use val.
	$.fn.val = function() {
		var result = originalVal.apply( this, arguments );
		if ( arguments.length > 0 ) {
			if ( $( this ).is( '.input-text.qty' ) ) {
				$( this ).trigger( 'change.cpf' );
			}
		}
		return result;
	};

	// Set update event for Lazy Load XT
	if ( TMEPOJS.tm_epo_no_lazy_load === 'no' && $.lazyLoadXT ) {
		$.extend( $.lazyLoadXT, {
			autoInit: false,
			updateEvent: $.lazyLoadXT.updateEvent + ' tmlazy'
		} );
	}

	tcAPI.localInputDecimalSeparator = getLocalInputDecimalSeparator();
	tcAPI.localDecimalSeparator = getLocalDecimalSeparator();
	tcAPI.localThousandSeparator = getLocalThousandSeparator();
	tcAPI.epoDelay = getEpoDelay();
	tcAPI.epoAnimationDelay = getEpoAnimationDelay();
	tcAPI.getElementFromFieldCache = [];
	tcAPI.epoSelector = '.tc-extra-product-options';
	tcAPI.associatedEpoSelector = '.tc-extra-product-options-inline';
	tcAPI.associatedEpoCart = '.tc-epo-element-product-container-cart';
	tcAPI.addToCartSelector = "input[name='add-to-cart']";
	tcAPI.tcAddToCartSelector = 'input.tc-add-to-cart';
	tcAPI.qtySelector = "input.qty,input[name='quantity'],select.qty,.drop-down-button #qty,.plus-minus-button #qty,.slider-input #amount";
	tcAPI.associateQtySelector = 'input.tm-qty-alt';
	tcAPI.addToCartButtonSelector = '.add_to_cart_button, .single_add_to_cart_button';
	tcAPI.compositeSelector = '.bto_item,.component';
	tcAPI.nativeProductPriceSelector = '.woocommerce .product p.price';
	tcAPI.associatedNativeProductPriceSelector = '.product-price .associated-price';
	tcAPI.templateEngine = $.epoAPI.applyFilter( 'tc_adjust_templateEngine', {
		price: wp.template( 'tc-price' ),
		sale_price: wp.template( 'tc-sale-price' ),
		tc_chars_remanining: wp.template( 'tc-chars-remanining' ),
		tc_final_totals: wp.template( 'tc-final-totals' ),
		tc_floating_box: wp.template( 'tc-floating-box' ),
		tc_floating_box_nks: wp.template( 'tc-floating-box-nks' ),
		tc_formatted_price: wp.template( 'tc-formatted-price' ),
		tc_formatted_sale_price: wp.template( 'tc-formatted-sale-price' ),
		tc_lightbox: wp.template( 'tc-lightbox' ),
		tc_lightbox_zoom: wp.template( 'tc-lightbox-zoom' ),
		tc_section_pop_link: wp.template( 'tc-section-pop-link' ),
		tc_upload_messages: wp.template( 'tc-upload-messages' )
	} );

	// make API available to 3rd party plugins
	$.tcAPI = function() {
		return tcAPI;
	};
	// method for accessing internal api variables
	$.tcAPIGet = function( name ) {
		return tcAPI[ name ];
	};

	// method for setting  internal api variables
	$.tcAPISet = function( name, value ) {
		tcAPI[ name ] = value;
	};

	if ( $.tc_validator ) {
		$.extend( $.tc_validator.messages, {
			required: TMEPOJS.tm_epo_global_validator_messages.required,
			email: TMEPOJS.tm_epo_global_validator_messages.email,
			url: TMEPOJS.tm_epo_global_validator_messages.url,
			number: TMEPOJS.tm_epo_global_validator_messages.number,
			digits: TMEPOJS.tm_epo_global_validator_messages.digits,
			maxlengthsingle: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.maxlengthsingle ),
			maxlength: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.maxlength ),
			minlengthsingle: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.minlengthsingle ),
			minlength: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.minlength ),
			max: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.max ),
			min: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.min ),
			step: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.step ),
			lettersonly: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.lettersonly ),
			lettersspaceonly: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.lettersspaceonly ),
			alphanumeric: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumeric ),
			alphanumericunicode: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumericunicode ),
			alphanumericunicodespace: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumericunicodespace ),
			repeaterminrows: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.repeaterminrows ),
			repeatermaxrows: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.repeatermaxrows )
		} );

		/*
		ASCII Digits
		\u0030-\u0039

		Latin Alphabet
		\u0041-\u005A\u0061-\u007A

		Latin-1 Supplement
		\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF

		Latin Extended-A
		\u0100-\u0148\u014A-\u017F

		Latin Extended-B
		\u0180-\u01BF\u01C4-\u024F

		Latin Extended Additional
		\u1E02-\u1EF3

		Greek and Coptic
		\u0370-\u03FF

		Cyrillic
		\u0400-\u04FF\u0500-\u052F

		Japanese Hiragana
		\u3040-\u309f
		Japanese Katakana
		\u30a0-\u30ff
		Japanese Kanji (common & uncommon)
		\u4e00-\u9faf
		Japanese Kanji (rare)
		\u3400-\u4dbf

		Arabic
		\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF

		\u0600-\u06ff
		\u0600-\u06FF

		Armenian
		\u0530-\u1058F

		\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F

		*/

		$.tc_validator.addMethod(
			'alphanumeric',
			function( value, element ) {
				return this.optional( element ) || /^[a-zA-Z0-9.-]+$/i.test( value );
			},
			$.tc_validator.messages.alphanumeric
		);

		$.tc_validator.addMethod(
			'lettersonly',
			function( value, element ) {
				return this.optional( element ) || /^[a-z]+$/i.test( value );
			},
			$.tc_validator.messages.lettersonly
		);

		$.tc_validator.addMethod(
			'lettersspaceonly',
			function( value, element ) {
				return this.optional( element ) || /^[a-z,\u0020]+$/i.test( value );
			},
			$.tc_validator.messages.lettersspaceonly
		);

		$.tc_validator.addMethod(
			'alphanumericunicode',
			function( value, element ) {
				return (
					this.optional( element ) ||
					/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F]+$/i.test(
						value
					)
				);
			},
			$.tc_validator.messages.alphanumericunicode
		);

		$.tc_validator.addMethod(
			'alphanumericunicodespace',
			function( value, element ) {
				return (
					this.optional( element ) ||
					/^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F,\u0020]+$/i.test(
						value
					)
				);
			},
			$.tc_validator.messages.alphanumericunicodespace
		);
		$.tc_validator.addMethod(
			'repeaterminrows',
			function( value, element, param ) {
				return $.epoAPI.math.toInt( $( element ).closest( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length ) >= $.epoAPI.math.toInt( param );
			},
			$.tc_validator.messages.repeaterminrows
		);
		$.tc_validator.addMethod(
			'repeatermaxrows',
			function( value, element, param ) {
				return $.epoAPI.math.toInt( $( element ).closest( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length ) <= $.epoAPI.math.toInt( param );
			},
			$.tc_validator.messages.repeatermaxrows
		);
		$.tc_validator.addMethod(
			'product_element_radio_qty',
			function( value, element ) {
				var qty = $( element ).closest( '.tm-element-ul-product' ).find( 'input.tc-epo-field-product.tmcp-radio:checked' ).closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val();
				return qty > 0;
			},
			$.tc_validator.messages.required
		);
		$.tc_validator.addMethod(
			'product_element_select_qty',
			function( value, element ) {
				var qty = $( element ).closest( '.tm-element-ul-product' ).find( 'select.tc-epo-field-product.tmcp-select' ).closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val();
				return qty > 0;
			},
			$.tc_validator.messages.required
		);
	}

	$.epoAPI.util.escapeSelector = ( function() {
		/* original escape string
		 *  /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
		 */
		var selectorEscape = /([!"$%&'()*+,/:;<=>?@[\]^`{|}~])/g;
		return function( selector ) {
			return selector.replace( selectorEscape, '\\$1' );
		};
	}() );

	$.epoAPI.util.unformat = function( o ) {
		var a = $.epoAPI.math.unformat( o, tcAPI.localInputDecimalSeparator );
		var n = parseFloat( a );

		if ( ! Number.isFinite( n ) ) {
			return a;
		}
		return n;
	};

	$.epoAPI.util.parseParams = function( string, decode ) {
		if ( typeof string !== 'string' || string.split === undefined ) {
			return [];
		}
		return string
			.split( '&' )
			.map( function( value ) {
				var obj = {};

				if ( decode === true ) {
					value = decodeURIComponent( value.replace( /\+/g, '%20' ) );
				}

				value = value.split( '=' ).map( function( v ) {
					var a = v.split( '?' );

					if ( a.length > 1 ) {
						return a[ 1 ];
					}
					return v;
				} );

				if ( value.length > 1 ) {
					obj[ value[ 0 ] ] = value[ 1 ];
				}

				return obj;
			} )
			.filter( function( n ) {
				return n !== null;
			} )
			.reduce( function( current, next ) {
				return Object.assign( {}, current, next );
			}, {} );
	};

	if ( ! $.tmempty ) {
		$.tmempty = function( obj ) {
			var emptyValues = [ undefined, null, false, 0, '', '0' ];
			var isEmptyValue =
				emptyValues.filter( function( item ) {
					return obj === item;
				} ).length === 1;
			var isEmptyObject = false;

			if ( typeof obj === 'object' ) {
				isEmptyObject =
					Object.keys( obj ).filter( function( key ) {
						return Object.prototype.hasOwnProperty.call( obj, key );
					} ).length === 0;
				return isEmptyObject;
			}

			return isEmptyValue || isEmptyObject;
		};
	}

	if ( ! $.tmType ) {
		$.tmType = function( obj ) {
			return Object.prototype.toString
				.call( obj )
				.match( /\s([a-zA-Z]+)/ )[ 1 ]
				.toLowerCase();
		};
	}

	if ( ! $.is_on_screen ) {
		$.fn.is_on_screen = function() {
			// we don't use jWindow because we want the current window object
			var win = $( window );
			var scroll = $.epoAPI.dom.scroll();
			var bounds = this.offset();
			var viewport = {
				top: scroll.top,
				left: scroll.left
			};

			viewport.right = viewport.left + win.width();
			viewport.bottom = viewport.top + win.height();
			bounds.right = bounds.left + this.outerWidth();
			bounds.bottom = bounds.top + this.outerHeight();

			return ! ( viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom );
		};
	}

	if ( ! $().tmtoggle ) {
		$.fn.tmtoggle = function() {
			var elements = this;
			var is_one_open_for_accordion = false;
			var init_done = 0;

			if ( elements.length === 0 ) {
				return;
			}

			if ( window.tc_accordion_offset === undefined ) {
				window.tc_accordion_offset = -100;
			}

			elements.each( function() {
				var t = $( this );
				var headers;
				var wrap;
				var wraps;

				if ( ! t.data( 'tm-toggle-init' ) ) {
					t.data( 'tm-toggle-init', 1 );
					headers = t.find( '.tm-toggle' );
					wrap = t.find( '.tm-collapse-wrap' );
					wraps = $( '.tm-collapse.tmaccordion' ).find( '.tm-toggle' );
					if ( headers.length === 0 || wrap.length === 0 ) {
						return;
					}

					if ( wrap.is( '.closed' ) ) {
						$( wrap ).removeClass( 'closed open' ).addClass( 'closed' ).hide();
						$( headers ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-down' );
						$( headers ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-closed' );
					} else {
						$( wrap ).removeClass( 'closed open' ).addClass( 'open' ).show();
						$( headers ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-up' );
						$( headers ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-open' );
						is_one_open_for_accordion = true;
					}

					headers.each( function( i, header ) {
						$( header ).on( 'closewrap.tmtoggle', function() {
							if ( t.is( '.tmaccordion' ) && $( wrap ).is( '.closed' ) ) {
								return;
							}
							$( wrap ).removeClass( 'closed open' ).addClass( 'closed' );
							$( this ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-down' );
							$( this ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-closed' );
							$( wrap ).removeClass( 'tm-animated fadein' );
							if ( t.is( '.tmaccordion' ) ) {
								$( wrap ).animate( { height: 'toggle' }, 100, function() {
									$( wrap ).hide();
								} );
							} else {
								$( wrap ).animate( { height: 'toggle' }, 100, function() {
									$( wrap ).hide();
								} );
							}
							jWindow.trigger( 'tmlazy' );
						} );

						$( header ).on( 'openwrap.tmtoggle', function( e, data ) {
							if ( t.is( '.tmaccordion' ) ) {
								$( wraps ).not( $( this ) ).trigger( 'closewrap.tmtoggle' );
							}
							$( wrap ).removeClass( 'closed open' ).addClass( 'open' );
							$( this ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-up' );
							$( this ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-open' );
							$( wrap ).show().removeClass( 'tm-animated fadein' ).addClass( 'tm-animated fadein' );
							setTimeout( function() {
								jWindow.trigger( 'tmlazy' );
							}, 200 );
							setTimeout( function() {
								if ( data === undefined && init_done && t.is( '.tmaccordion' ) && ! t.is_on_screen() ) {
									jWindow.tcScrollTo( $( header ), 10, window.tc_accordion_offset );
								}
							}, 110 );
						} );

						$( header ).on( 'click.tmtoggle', function( e ) {
							e.preventDefault();
							if ( $( wrap ).is( '.closed' ) ) {
								$( this ).trigger( 'openwrap.tmtoggle' );
							} else {
								$( this ).trigger( 'closewrap.tmtoggle' );
							}
						} );

						$( header )
							.find( '.tm-qty' )
							.closest( '.cpf-element' )
							.find( '.tm-epo-field' )
							.on( 'change.cpf', function() {
								$( header ).trigger( 'openwrap.tmtoggle' );
							} );
					} );
				}
			} );
			if ( undefined === window.tc_accordion_closed_on_page_load && ! is_one_open_for_accordion && elements.filter( '.tmaccordion' ).length > 0 ) {
				elements.filter( '.tmaccordion' ).first().find( '.tm-toggle' ).trigger( 'openwrap.tmtoggle', { nomove: 1 } );
			}
			init_done = 1;
			return elements;
		};
	}

	if ( ! $().tmpoplink ) {
		$.fn.tmpoplink = function( options ) {
			var elements = this;
			var floatbox_template;
			var settings = {
				classname: 'flasho tc-wrapper cart-popup'
			};

			if ( elements.length === 0 ) {
				return;
			}
			if ( options ) {
				settings = $.extend( {}, settings, options );
			}

			floatbox_template = function( data ) {
				return $.epoAPI.template.html( wp.template( 'tc-cart-options-popup' ), {
					title: data.title,
					id: data.id,
					html: data.html,
					close: TMEPOJS.i18n_close
				} );
			};

			return elements.each( function() {
				var t = $( this );
				var id;
				var title;
				var html;
				var $_html;

				if ( t.is( '.tc-poplink' ) ) {
					return;
				}
				t.addClass( 'tc-poplink' );
				id = $( this ).attr( 'href' );
				title = $( this ).attr( 'data-title' );
				html = $( id ).html();
				if ( ! title ) {
					title = TMEPOJS.i18n_addition_options;
				}
				$_html = floatbox_template( {
					id: 'tc-floatbox-content',
					html: html,
					title: title
				} );

				t.on( 'click.tmpoplink', function( e ) {
					$.tcFloatBox( {
						fps: 1,
						ismodal: false,
						refresh: 100,
						width: '80%',
						height: '80%',
						classname: settings.classname,
						data: $_html
					} );

					e.preventDefault();
				} );
			} );
		};
	}

	function readableFileSize( a, b, c, d, e ) {
		b = Math;
		c = b.log;
		d = 1024;
		e = c( a ) / c( d ) | 0; //eslint-disable-line no-bitwise

		return ( ( a / b.pow( d, e ) ).toFixed( e ? 2 : 0 ) ) + ' ' + ( e ? 'KMGTPEZY'[ --e ] + 'B' : 'bytes' );
	}

	function toggleState( thisProductContainerWrap, disabled ) {
		thisProductContainerWrap.toArray().forEach( function( setter ) {
			setter = $( setter );
			setter.find( ':input' ).prop( 'disabled', function( i, v ) {
				var state = $( this ).data( 'tc-state' );
				if ( state === undefined ) {
					$( this ).data( 'tc-state', v );
					return disabled;
				}
				if ( state === false ) {
					return disabled;
				}
				return state;
			} );
		} );
	}
	// Function to calculate tax amount
	function calculateTaxAmount( priceWithTax, _cart ) {
		var taxable;
		var tax_rate;
		var pricesIncludeTax;
		var tax_display_mode;
		var current_variation;
		var priceWithoutTax;
		var taxAmount = 0;

		if ( _cart ) {
			taxable = _cart.attr( 'data-taxable' );
			tax_rate = _cart.attr( 'data-tax-rate' );
			pricesIncludeTax = _cart.attr( 'data-prices-include-tax' ) || TMEPOJS.prices_include_tax;
			tax_display_mode = _cart.attr( 'data-tax-display-mode' );
			if ( _cart.data( 'current_variation' ) !== undefined ) {
				current_variation = _cart.data( 'current_variation' );
			}

			if ( current_variation !== undefined ) {
				current_variation = _cart.data( 'current_variation' );
				taxable = current_variation.tc_is_taxable;
				tax_rate = current_variation.tc_tax_rate;
			}
		}

		if ( taxable ) {
			tax_rate = parseFloat( tax_rate / 100 );

			if ( pricesIncludeTax === '1' ) {
				if ( tax_display_mode === 'incl' ) {
					priceWithTax = parseFloat( priceWithTax );

					// Calculate price without tax
					priceWithoutTax = priceWithTax / ( 1 + tax_rate );

					// Calculate tax amount
					taxAmount = priceWithTax - priceWithoutTax;
				} else {
					// Calculate price without tax
					priceWithoutTax = priceWithTax;

					// Calculate tax amount
					taxAmount = priceWithTax * tax_rate;
				}
			} else if ( tax_display_mode === 'incl' ) {
				// Calculate price without tax
				priceWithoutTax = priceWithTax / ( 1 + tax_rate );

				// Calculate tax amount
				taxAmount = priceWithTax - priceWithoutTax;
			}

			taxAmount = $.epoAPI.math.toFloat( taxAmount );
		}

		return taxAmount;
	}
	// Taxes setup
	function get_price_including_tax( price, _cart, element, force, variation, pricetype, doubleforce ) {
		var taxable;
		var tax_rate;
		var prices_include_tax;
		var is_vat_exempt;
		var non_base_location_prices;
		var taxes_of_one;
		var base_taxes_of_one;
		var modded_taxes_of_one;
		var current_variation;

		if ( ! Number.isFinite( parseFloat( price ) ) ) {
			price = 0;
		}
		price = price * 10000;
		if ( _cart ) {
			taxable = _cart.attr( 'data-taxable' );
			tax_rate = _cart.attr( 'data-tax-rate' );
			prices_include_tax = _cart.attr( 'data-prices-include-tax' ) || TMEPOJS.prices_include_tax;
			is_vat_exempt = _cart.attr( 'data-is-vat-exempt' );
			non_base_location_prices = _cart.attr( 'data-non-base-location-prices' );
			taxes_of_one = _cart.attr( 'data-taxes-of-one' );
			base_taxes_of_one = _cart.attr( 'data-base-taxes-of-one' );
			modded_taxes_of_one = _cart.attr( 'data-modded-taxes-of-one' );

			if ( _cart.data( 'current_variation' ) !== undefined ) {
				current_variation = _cart.data( 'current_variation' );
			} else if ( variation !== undefined ) {
				current_variation = variation;
			}

			if ( current_variation !== undefined ) {
				current_variation = _cart.data( 'current_variation' );
				taxable = current_variation.tc_is_taxable;
				tax_rate = current_variation.tc_tax_rate;
				non_base_location_prices = current_variation.tc_non_base_location_prices;
				taxes_of_one = current_variation.tc_taxes_of_one;
				base_taxes_of_one = current_variation.tc_base_taxes_of_one;
				modded_taxes_of_one = current_variation.tc_modded_taxes_of_one;
			}

			if ( element ) {
				if ( element.data( 'tax-obj' ) ) {
					tax_rate = element.data( 'tax-obj' );
					if ( tax_rate.has_fee === 'no' ) {
						taxable = false;
					} else if ( tax_rate.has_fee === 'yes' ) {
						taxable = true;
					}
					tax_rate = tax_rate.tax_rate;
					taxes_of_one = tax_rate / 100;
					base_taxes_of_one = tax_rate / 100;
				}
			}
			if ( taxable ) {
				if ( prices_include_tax === '1' && ! force ) {
					if ( is_vat_exempt === '1' ) {
						if ( non_base_location_prices === '1' ) {
							price = parseFloat( price ) - ( taxes_of_one * price );
						} else {
							price = parseFloat( price ) - ( base_taxes_of_one * price );
						}
					} else if ( non_base_location_prices === '1' ) {
						price = parseFloat( price ) - ( base_taxes_of_one * price ) + ( modded_taxes_of_one * price );
					}
				} else if ( element || current_variation === undefined || doubleforce ) {
					price = parseFloat( price ) + ( parseFloat( price ) * taxes_of_one );
				}
			}
		}
		price = price / 10000;

		return price;
	}

	function get_price_excluding_tax( price, _cart, element, force, variation, pricetype, doubleforce ) {
		var taxable;
		var tax_rate;
		var taxes_of_one;
		var base_taxes_of_one;
		var prices_include_tax;
		var current_variation;
		var tax_display_mode;

		if ( ! Number.isFinite( parseFloat( price ) ) ) {
			price = 0;
		}
		price = price * 10000;

		if ( _cart ) {
			tax_display_mode = _cart.attr( 'data-tax-display-mode' );

			taxable = _cart.attr( 'data-taxable' );
			tax_rate = _cart.attr( 'data-tax-rate' );
			taxes_of_one = _cart.attr( 'data-taxes-of-one' );
			base_taxes_of_one = _cart.attr( 'data-base-taxes-of-one' );
			prices_include_tax = _cart.attr( 'data-prices-include-tax' );

			if ( _cart.data( 'current_variation' ) !== undefined ) {
				current_variation = _cart.data( 'current_variation' );
			} else if ( variation !== undefined ) {
				current_variation = variation;
			}
			if ( current_variation !== undefined ) {
				taxable = current_variation.tc_is_taxable;
				tax_rate = current_variation.tc_tax_rate;
				taxes_of_one = current_variation.tc_taxes_of_one;
				base_taxes_of_one = current_variation.tc_base_taxes_of_one;
			}

			if ( element ) {
				if ( element.data( 'tax-obj' ) ) {
					tax_rate = element.data( 'tax-obj' );
					if ( tax_rate.has_fee === 'no' ) {
						taxable = false;
					} else if ( tax_rate.has_fee === 'yes' ) {
						taxable = true;
					}
					tax_rate = tax_rate.tax_rate;
					base_taxes_of_one = tax_rate / 100;
				}
			}

			if ( taxable ) {
				if ( prices_include_tax === '1' || force ) {
					if ( tax_display_mode === 'incl' ) {
						// This should never run on this function
					} else if ( element || current_variation === undefined || force || doubleforce ) {
						if ( base_taxes_of_one === taxes_of_one ) {
							price = parseFloat( price ) - parseFloat( taxes_of_one * price );
						} else {
							price = price * ( 1 - parseFloat( base_taxes_of_one ) );
						}
					}
				}
			}
		}
		price = price / 10000;

		return price;
	}

	function tm_set_tax_price( value, _cart, element, pricetype, force, variation, doubleforce ) {
		var tax_display_mode;

		if ( ! Number.isFinite( parseFloat( value ) ) ) {
			value = 0;
		}
		if ( _cart ) {
			tax_display_mode = _cart.attr( 'data-tax-display-mode' ) || TMEPOJS.tax_display_mode;
			if ( tax_display_mode === 'incl' ) {
				value = get_price_including_tax( value, _cart, element, force, variation, pricetype, doubleforce );
			} else {
				value = get_price_excluding_tax( value, _cart, element, force, variation, pricetype, doubleforce );
			}
		}
		return value;
	}

	// Return a formatted currency value
	function formatPrice( value, args ) {
		var data;
		if ( ! args ) {
			args = {};
		}
		data = $.extend( {
			symbol: '',
			format: '',
			decimal: tcAPI.localDecimalSeparator,
			thousand: tcAPI.localThousandSeparator,
			precision: TMEPOJS.currency_format_num_decimals
		}, args );

		if ( TMEPOJS.tm_epo_trim_zeros === 'yes' ) {
			if ( ( ( value % 1 ).toString() !== '0' ) === false ) {
				data.precision = 0;
			}
		}

		return $.epoAPI.applyFilter( 'tc_formatPrice', $.epoAPI.math.format( value, data ), data, value );
	}

	// Return a formatted currency value
	function tm_set_price_( value, sign, inc_tax_string ) {
		return (
			sign +
			formatPrice( value, { symbol: TMEPOJS.currency_format_symbol, format: TMEPOJS.currency_format } ) +
			inc_tax_string
		);
	}

	// Return a formatted currency value
	function tm_set_price( value, _cart, notax, taxstring, element, pricetype ) {
		var inc_tax_string = '';
		var val;
		var sign = TMEPOJS.option_plus_sign + ' ';

		if ( ! notax ) {
			value = tm_set_tax_price( value, _cart, element, pricetype );
		}

		val = Math.abs( value );

		if ( TMEPOJS.tm_epo_global_options_price_sign === 'minus' ) {
			sign = '';
		}
		if ( value < 0 ) {
			sign = TMEPOJS.option_minus_sign + ' ';
		}

		if ( _cart && taxstring ) {
			inc_tax_string = _cart.attr( 'data-tax-string' );
		}
		if ( inc_tax_string === undefined ) {
			inc_tax_string = '';
		}

		return tm_set_price_( val, sign, inc_tax_string );
	}

	// FloatingTotalsBox plugin
	FloatingTotalsBox = function( this_epo_totals_container, is_quickview, main_cart ) {
		this.this_epo_totals_container = this_epo_totals_container;
		this.is_quickview = is_quickview;
		this.main_cart = main_cart;

		if ( ! is_quickview && TMEPOJS.floating_totals_box && TMEPOJS.floating_totals_box !== 'disable' && main_cart && this_epo_totals_container.length ) {
			this.init();
			return this;
		}

		return false;
	};

	FloatingTotalsBox.prototype = {
		constructor: FloatingTotalsBox,

		onUpdate: function() {
			var tm_epo_totals_html = this.this_epo_totals_container.data( 'tm-html' );
			var tm_floating_box_data = this.this_epo_totals_container.data( 'tm-floating-box-data' );
			var values_obj = [];
			var floatingBoxHtml;
			var floatingBoxaddToCartButton;

			if ( tm_floating_box_data && tm_floating_box_data.length ) {
				$.each( tm_floating_box_data, function( i, row ) {
					if ( row.title === '' ) {
						row.title = '&nbsp;';
					}
					if ( row.value === '' ) {
						row.value = '&nbsp;';
					}
					if ( ! row.title ) {
						row.title = '&nbsp;';
					} else {
						row.title = $( '<div>' + row.title + '</div>' );
						row.title.find( 'span' ).remove();
						row.title = row.title.html();
					}

					if ( this.is_nks ) {
						if ( row.label_show !== '' ) {
							row.title = '';
						}
						if ( row.value_show !== '' ) {
							row.value = '';
						}
					}

					if ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( row.price ) === true ) {
						row.price = '';
					} else {
						row.price = tm_set_price( row.price, this.this_epo_totals_container, true, false );
					}

					values_obj.push( {
						label_show: row.label_show,
						value_show: row.value_show,
						title: row.title,
						value: row.value,
						quantity: row.quantity,
						price: row.price
					} );
				} );
			}

			if ( ( ( tm_epo_totals_html && tm_epo_totals_html === '' ) && ( ! tm_floating_box_data || ! tm_floating_box_data.length ) ) || ! ( ( tm_epo_totals_html && tm_epo_totals_html !== '' ) || this.is_nks ) ) {
				tm_epo_totals_html = '';
				this.floatingBox.hide();
			}

			floatingBoxHtml = $.epoAPI.template.html( this.engineTemplate, {
				html_before: TMEPOJS.floating_totals_box_html_before,
				html_after: TMEPOJS.floating_totals_box_html_after,
				option_label: TMEPOJS.i18n_option_label,
				option_value: TMEPOJS.i18n_option_value,
				option_qty: TMEPOJS.i18n_option_qty,
				option_price: TMEPOJS.i18n_option_price,
				values: values_obj,
				totals: tm_epo_totals_html
			} );

			this.floatingBox.html( floatingBoxHtml );
			this.onUpdateScroll();

			if ( TMEPOJS.floating_totals_box_add_button === 'yes' ) {
				floatingBoxaddToCartButton = this.main_cart.find( tcAPI.addToCartButtonSelector ).first();
				floatingBoxaddToCartButton
					.tcClone()
					.addClass( 'tc-add-to-cart-button' )
					.on( 'click', function() {
						floatingBoxaddToCartButton.trigger( 'click' );
					} )
					.appendTo( this.floatingBox );
			}
		},

		onUpdateScroll: function() {
			if ( TMEPOJS.floating_totals_box_visibility === 'always' ) {
				if ( this.floatingBox.is( ':empty' ) && ! this.is_nks_alt ) {
					this.floatingBox.hide();
				} else {
					this.floatingBox.show();
				}
				return;
			}
			if ( TMEPOJS.floating_totals_box_visibility === 'hideafterscroll' ) {
				if ( jWindow.scrollTop() > $.epoAPI.math.toFloat( TMEPOJS.floating_totals_box_pixels ) && ! this.is_nks_alt ) {
					if ( ! this.floatingBox.is( ':hidden' ) ) {
						if ( this.is_nks === false ) {
							this.floatingBox.fadeOut();
						} else {
							this.floatingBox.hide();
						}
					}
				} else if ( this.floatingBox.is( ':hidden' ) || this.is_nks_alt ) {
					if ( ! this.floatingBox.is( ':empty' ) || this.is_nks_alt ) {
						if ( this.is_nks === false ) {
							this.floatingBox.fadeIn();
						} else {
							this.floatingBox.show();
						}
					}
				}
			}

			if ( TMEPOJS.floating_totals_box_visibility === 'afterscroll' ) {
				if ( jWindow.scrollTop() > $.epoAPI.math.toFloat( TMEPOJS.floating_totals_box_pixels ) || this.is_nks_alt ) {
					if ( ( this.floatingBox.is( ':hidden' ) && ! this.floatingBox.is( ':empty' ) ) || this.is_nks_alt ) {
						if ( this.is_nks === false ) {
							this.floatingBox.fadeIn();
						} else {
							this.floatingBox.show();
						}
					} else if ( ! this.floatingBox.is( ':hidden' ) && this.floatingBox.is( ':empty' ) ) {
						if ( this.is_nks === false ) {
							this.floatingBox.fadeOut();
						} else {
							this.floatingBox.hide();
						}
					}
				} else if ( ! this.floatingBox.is( ':hidden' ) ) {
					if ( this.is_nks === false ) {
						this.floatingBox.fadeOut();
					} else {
						this.floatingBox.hide();
					}
				}
			}
		},

		addEvents: function() {
			this.onUpdate();

			this.main_cart.on( 'tm-epo-after-update', this.onUpdate.bind( this ) );
			this.main_cart.on( 'tm-epo-short-update', this.onUpdate.bind( this ) );

			if ( this.is_nks === false ) {
				jWindow.on( 'scroll', this.onUpdateScroll.bind( this ) );
			}
		},

		init: function() {
			this.floatingBox = $( '<div class="tm-floating-box ' + TMEPOJS.floating_totals_box + '"></div>' );
			this.nks_selector = $( '.tm-floating-box-nks' ).first();
			this.alt_selector = $( '.tm-floating-box-alt' ).first();
			this.engineTemplate = tcAPI.templateEngine.tc_floating_box;
			this.is_nks = false;
			this.is_nks_alt = false;

			if ( this.nks_selector.length > 0 ) {
				this.is_nks = true;
				this.floatingBox.removeClass( 'top left right bottom' ).appendTo( this.nks_selector ).show();
			} else if ( this.alt_selector.length > 0 ) {
				this.floatingBox.removeClass( 'top left right bottom' ).appendTo( this.alt_selector ).hide();
			} else {
				this.floatingBox.appendTo( 'body' ).hide();
			}

			if ( this.nks_selector.length > 0 || this.alt_selector.length > 0 ) {
				this.is_nks_alt = true;
				this.engineTemplate = tcAPI.templateEngine.tc_floating_box_nks;
			}

			this.addEvents();
		}
	};

	$.tcFloatingTotalsBox = function( this_epo_totals_container, is_quickview, main_cart ) {
		var data = false;

		if ( this_epo_totals_container && this_epo_totals_container.length && this_epo_totals_container.data( 'tcfloatingtotalsbox' ) === undefined ) {
			data = new FloatingTotalsBox( this_epo_totals_container, is_quickview, main_cart );
			this_epo_totals_container.data( 'tcfloatingtotalsbox', data );
		}

		return data;
	};

	$.tc_product_image = {};
	$.tc_product_image_store = {};

	// replace obj1 values with obj2 values
	$.tc_replace_object_values = function( obj1, obj2 ) {
		Object.keys( obj1 ).forEach( function( x ) {
			Object.keys( obj1[ x ] ).forEach( function( attr ) {
				if ( undefined !== obj2[ x ] && undefined !== obj2[ x ][ attr ] && Object.prototype.hasOwnProperty.call( obj2[ x ], attr ) ) {
					obj1[ x ][ attr ] = obj2[ x ][ attr ];
				}
			} );
		} );
		return obj1;
	};
	// copy obj2 values to obj1
	$.tc_maybe_copy_object_values = function( obj1, obj2 ) {
		Object.keys( obj2 ).forEach( function( x ) {
			Object.keys( obj2[ x ] ).forEach( function( attr ) {
				if ( undefined !== obj2[ x ] && Object.prototype.hasOwnProperty.call( obj2[ x ], attr ) && undefined !== obj2[ x ][ attr ] && ( undefined === obj1[ x ] || undefined === obj1[ x ][ attr ] ) ) {
					if ( undefined === obj1[ x ] ) {
						obj1[ x ] = {};
					}
					obj1[ x ][ attr ] = obj2[ x ][ attr ];
				}
			} );
		} );
		return obj1;
	};

	$.tc_pre_populate_store = function() {
		var obj = {};

		obj[ 0 ] = {};
		obj[ 1 ] = {};
		obj[ 2 ] = {};
		obj[ 3 ] = {};

		obj[ 0 ].src = '';
		obj[ 0 ].srcset = '';
		obj[ 0 ].sizes = '';
		obj[ 0 ].title = '';
		obj[ 0 ].alt = '';
		obj[ 0 ][ 'data-src' ] = '';
		obj[ 0 ][ 'data-large_image' ] = '';
		obj[ 0 ][ 'data-large_image_width' ] = '';
		obj[ 0 ][ 'data-large_image_height' ] = '';
		obj[ 1 ][ 'data-thumb' ] = '';
		obj[ 2 ].src = '';
		obj[ 3 ].href = '';
		obj[ 3 ].title = '';

		return obj;
	};

	$.tc_populate_store = function( img, product_element ) {
		var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' );
		var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' );
		var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 );
		var $product_img = img;
		var $product_link = img.closest( 'a' );
		var obj = {};

		obj[ 0 ] = {};
		obj[ 1 ] = {};
		obj[ 2 ] = {};
		obj[ 3 ] = {};

		obj[ 0 ].src = $product_img.attr( 'src' );
		obj[ 0 ].srcset = $product_img.attr( 'srcset' );
		obj[ 0 ].sizes = $product_img.attr( 'sizes' );
		obj[ 0 ].title = $product_img.attr( 'title' );
		obj[ 0 ].alt = $product_img.attr( 'alt' );
		obj[ 0 ][ 'data-src' ] = $product_img.attr( 'data-src' );
		obj[ 0 ][ 'data-large_image' ] = $product_img.attr( 'data-large_image' );
		obj[ 0 ][ 'data-large_image_width' ] = $product_img.attr( 'data-large_image_width' );
		obj[ 0 ][ 'data-large_image_height' ] = $product_img.attr( 'data-large_image_height' );
		obj[ 1 ][ 'data-thumb' ] = $product_img_wrap.attr( 'data-thumb' );
		obj[ 2 ].src = $gallery_img.attr( 'src' );
		obj[ 3 ].href = $product_link.attr( 'href' );
		obj[ 3 ].title = $product_link.attr( 'title' );

		return obj;
	};

	$.tc_maybe_copy_object_values_from_img = function( obj1, img, product_element ) {
		var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' );
		var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' );
		var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 );
		var $product_img = img;
		var $product_link = img.closest( 'a' );
		var attrs;
		var attr;
		var attrs_product_img = [ 'src', 'srcset', 'sizes', 'title', 'alt', 'data-src', 'data-large_image', 'data-large_image_width', 'data-large_image_height', 'large-image' ];
		var attrs_product_img_wrap = [ 'data-thumb' ];
		var attrs_gallery_img = [ 'src' ];
		var attrs_product_link = [ 'href', 'title' ];
		var all = [ $product_img, $product_img_wrap, $gallery_img, $product_link ];
		var attrs_all = [ attrs_product_img, attrs_product_img_wrap, attrs_gallery_img, attrs_product_link ];
		all.forEach( function( item, index ) {
			if ( undefined !== item && undefined !== item[ 0 ] ) {
				attrs = item[ 0 ].attributes;

				$.each( attrs, function() {
					if ( this.specified ) {
						attr = this.name;

						if ( $.inArray( attr, attrs_all[ index ] ) !== -1 && ( undefined === obj1[ index ] || ( undefined !== obj1[ index ] && undefined === obj1[ index ][ attr ] ) ) ) {
							if ( undefined === obj1[ index ] ) {
								obj1[ index ] = {};
							}
							obj1[ index ][ attr ] = this.value;
						}
					}
				} );
			}
		} );

		return obj1;
	};

	// Stores a default attribute for an element so it can be reset later
	$.fn.tc_set_attr = function( attr, value, id ) {
		if ( undefined === id ) {
			id = 0;
		}
		if ( undefined === $.tc_product_image[ id ] || ( undefined !== $.tc_product_image[ id ] && undefined === $.tc_product_image[ id ][ attr ] ) ) {
			if ( undefined === $.tc_product_image[ id ] ) {
				$.tc_product_image[ id ] = {};
			}
			$.tc_product_image[ id ][ attr ] = '';
			if ( this.attr( attr ) ) {
				$.tc_product_image[ id ][ attr ] = this.attr( attr );
			}
		}
		if ( false === value ) {
			this.removeAttr( attr );
		} else {
			this.attr( attr, value );
		}
	};

	// Reset a default attribute for an element so it can be reset later
	$.fn.tc_reset_attr = function( attr, id ) {
		if ( undefined === id ) {
			id = 0;
		}
		if ( undefined === $.tc_product_image[ id ] ) {
			return;
		}
		if ( undefined !== $.tc_product_image[ id ][ attr ] ) {
			this.attr( attr, $.tc_product_image[ id ][ attr ] );
		}
		delete $.tc_product_image[ id ][ attr ];
	};

	$.fn.tc_update_attr = function( attr, id ) {
		if ( undefined === id ) {
			id = 0;
		}
		if ( undefined !== $.tc_product_image[ id ] ) {
			$.tc_product_image[ id ][ attr ] = this.attr( attr );
		}
	};

	$.fn.tc_image_update = function( dom, image ) {
		var element = $( dom );
		var $form = this;
		var $image = $( image );
		var epo_object = $form.data( 'epo_object' );
		var image_info;
		var $product_img;
		var product_element = epo_object.main_product.closest( '#product-' + epo_object.product_id );
		var $product_element = product_element;
		var $product_link;
		var use_image_info;

		if ( product_element.length <= 0 ) {
			$product_element = epo_object.main_product.closest( '.post-' + epo_object.product_id );
		}

		if ( element.is( 'select' ) ) {
			element = element.children( 'option:selected' );
		}
		image_info = element.data( 'image-variations' );

		if ( TMEPOJS.tm_epo_global_product_image_selector !== '' ) {
			$product_img = $( TMEPOJS.tm_epo_global_product_image_selector );
		} else {
			$product_img = $product_element.find( 'a.woocommerce-main-image img, img.woocommerce-main-image,a img' ).not( '.thumbnails img,.product_list_widget img,img.emoji,a.woocommerce-product-gallery__trigger img' ).first();
		}
		$product_link = $product_img.closest( 'a' );

		if ( $product_img.length > 1 ) {
			$product_img = $product_img.first();
		}

		if ( element && image_info && $image.length > 0 ) {
			$image.removeAttr( 'data-o_src' ).removeAttr( 'data-o_title' ).removeAttr( 'data-o_alt' ).removeAttr( 'data-o_srcset' ).removeAttr( 'data-o_sizes' ).removeAttr( 'srcset' ).removeAttr( 'sizes' );

			use_image_info = image_info.imagep;
			if ( ! image_info.imagep.image_link ) {
				use_image_info = image_info.image;
			}

			$image.attr( 'title', use_image_info.image_title );
			$image.attr( 'alt', use_image_info.image_alt );
			if ( use_image_info.image_srcset ) {
				$image.attr( 'srcset', use_image_info.image_srcset );
			}
			if ( use_image_info.image_sizes ) {
				$image.attr( 'sizes', use_image_info.image_sizes );
			}

			$product_img.tc_set_attr( 'title', use_image_info.image_title );
			$product_img.tc_set_attr( 'alt', use_image_info.image_alt );

			$product_img.tc_set_attr( 'data-large-image', use_image_info.image_link );
			if ( $product_img.data.wc27_zoom_target ) {
				$product_img.data.wc27_zoom_target.tc_set_attr( 'data-thumb', use_image_info.image_link );
				$product_element.find( '.flex-control-nav li:eq(0) img' ).tc_set_attr( 'src', use_image_info.image_link );
			}

			$product_link.tc_set_attr( 'href', use_image_info.image_link );
			$product_link.tc_set_attr( 'title', use_image_info.image_caption );
		} else {
			$product_img.tc_reset_attr( 'title' );
			$product_img.tc_reset_attr( 'alt' );

			$product_img.tc_reset_attr( 'data-large-image' );
			if ( $product_img.data.wc27_zoom_target ) {
				$product_img.data.wc27_zoom_target.tc_reset_attr( 'data-thumb' );
				$product_element.find( '.flex-control-nav li:eq(0) img' ).tc_reset_attr( 'src' );
			}

			$product_link.tc_reset_attr( 'href' );
			$product_link.tc_reset_attr( 'title' );
		}
	};

	// variations checker
	$.fn.tm_find_matching_variations = function( product_variations, settings ) {
		var matching = [];
		var i;
		var variation;

		if ( product_variations ) {
			for ( i = 0; i < product_variations.length; i += 1 ) {
				variation = product_variations[ i ];

				if ( $.fn.tm_variations_match( variation.attributes, settings ) ) {
					matching.push( variation );
				}
			}
		}

		return matching;
	};

	$.fn.tm_variations_match = function( attrs1, attrs2 ) {
		var match = true;
		var val1;
		var val2;

		Object.keys( attrs1 ).forEach( function( x ) {
			if ( Object.prototype.hasOwnProperty.call( attrs1, x ) ) {
				val1 = attrs1[ x ];
				val2 = attrs2[ x ];

				if ( val1 !== undefined && val2 !== undefined && val1.length !== 0 && val2.length !== 0 && val1 !== val2 ) {
					match = false;
				}
			}
		} );

		return match;
	};

	function get_element_from_field( element ) {
		var $element = $( element );
		var data_uniqid;
		var the_epo_id;
		var _class;
		var epoContainer;

		if ( $element.length === 0 ) {
			return;
		}

		if ( $element.is( '.cpf-section' ) ) {
			return element.find( '.tm-epo-field' );
		}
		data_uniqid = $element.attr( 'data-uniqid' );
		epoContainer = $element.closest( '.tc-extra-product-options' );
		the_epo_id = epoContainer.attr( 'data-epo-id' );

		if ( ! epoContainer.is( '.reactivate' ) && tcAPI.getElementFromFieldCache && tcAPI.getElementFromFieldCache[ the_epo_id ] && tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] ) {
			return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];
		}
		_class = $element
			.attr( 'class' )
			.split( ' ' )
			.map( function( cls ) {
				if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) {
					return cls;
				}
				return null;
			} )
			.filter( function( v ) {
				if ( v !== null && v !== undefined ) {
					return v;
				}
				return null;
			} );

		if ( _class.length > 0 ) {
			_class = _class[ 0 ];
			if ( _class === 'cpf-type-product' ) {
				if ( $element.is( '.cpf-type-product-mode-product' ) || $element.is( '.cpf-type-product-checkbox' ) || $element.is( '.cpf-type-product-thumbnailmultiple' ) ) {
					_class = 'cpf-type-checkbox';
				} else if ( $element.is( '.cpf-type-product-dropdown' ) ) {
					_class = 'cpf-type-select';
				} else {
					_class = 'cpf-type-radio';
				}
			}
			switch ( _class ) {
				case 'cpf-type-radio':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-radio' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-checkbox':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-checkbox' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-select':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-select' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-selectmultiple':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-selectmultiple' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-textarea':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-textarea' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-textfield':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-textfield' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-color':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tm-color-picker' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-range':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-range' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-date':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-date' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-time':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-time' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];

				case 'cpf-type-variations':
					tcAPI.getElementFromFieldCache[ the_epo_id ] = [];
					tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.closest( '.cpf-section' ).find( '.tm-epo-field.tm-epo-variation-element' );
					return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ];
			}
		}
	}

	// tc-lightbox
	if ( ! $().tclightbox ) {
		$.fn.tclightbox = function() {
			var elements = this;

			if ( elements.length === 0 ) {
				return;
			}

			return elements.each( function() {
				var $this = $( this );
				var _imgsrc;
				var _label;
				var _input;
				var tclightboxwrap;
				var _img_button;
				var preload_img;
				var addButtonEvent;

				if ( $this.is( '.tcinit' ) ) {
					return;
				}
				_imgsrc = $this.attr( 'src' ) || $this.attr( 'data-original' );
				_label = $this.closest( 'label' );
				_input = _label.closest( '.tmcp-field-wrap' ).find( ".tm-epo-field[id='" + _label.attr( 'for' ) + "']" );
				_imgsrc = _input.attr( 'data-imagel' ) || _input.attr( 'data-imagep' ) || _input.attr( 'data-image' ) || _imgsrc;

				if ( ! _imgsrc ) {
					return;
				}

				$this.addClass( 'tcinit' ).before( $.epoAPI.template.html( tcAPI.templateEngine.tc_lightbox, {} ) );
				tclightboxwrap = $this.prev();

				$this.wrap( "<div class='tc-lightbox-image-wrap'/>" );
				$this.after( tclightboxwrap );

				_img_button = tclightboxwrap.find( '.tc-lightbox-button' );

				addButtonEvent = function() {
					_img_button.addClass( 'tcinit' ).on( 'click.tclightbox', function( buttonevent ) {
						var size;
						var _img;

						if ( $( '.tc-closing.tc-lightbox' ).length > 0 ) {
							return;
						}

						size = $.epoAPI.dom.size();
						_img = $( '<img>' )
							.addClass( 'tc-lightbox-img' )
							.attr( 'src', _imgsrc )
							.css( 'maxHeight', size.visibleHeight + 'px' )
							.css( 'maxWidth', size.visibleWidth + 'px' );

						$.tcFloatBox( {
							fps: 1,
							ismodal: false,
							refresh: 'fixed',
							width: 'auto',
							height: 'auto',
							top: '0%',
							left: '0%',
							classname: 'flasho tc-lightbox',
							animateIn: 'tc-lightbox-zoomin',
							animateOut: 'tc-lightbox-zoomout',
							data: $.epoAPI.template.html( tcAPI.templateEngine.tc_lightbox_zoom, { img: _img[ 0 ].outerHTML } ),
							zIndex: 102001,
							cancelClass: '.tc-lightbox-img, .tc-lightbox-button-close',
							unique: true
						} );

						buttonevent.preventDefault();
					} );
				};
				if ( TMEPOJS.tm_epo_preload_lightbox_image === 'yes' ) {
					preload_img = new Image();
					preload_img.src = _imgsrc;
					preload_img.onload = function() {
						addButtonEvent();
					};
				} else {
					addButtonEvent();
				}
			} );
		};
	}

	// Start Section popup
	if ( ! $().tmsectionpoplink ) {
		$.fn.tmsectionpoplink = function() {
			var elements = this;

			if ( elements.length === 0 ) {
				return;
			}

			return elements.each( function() {
				var $this = $( this );
				var id;
				var title;
				var section;
				var clicked;
				var _ovl;
				var cancelfunc;

				if ( $this.data( 'tmsectionpoplink' ) ) {
					return;
				}

				$this.data( 'tmsectionpoplink', true );
				id = $this.attr( 'data-sectionid' );
				title = TMEPOJS.i18n_addition_options;
				section = $this.closest( ".cpf-section[data-uniqid='" + id + "']" );
				clicked = false;
				_ovl = $( '<div class="fl-overlay"></div>' ).css( {
					zIndex: parseInt( $this.zIndex, 10 ) - 1,
					opacity: 0.8
				} );
				cancelfunc = function() {
					var pop = $( '#tm-section-pop-up' );
					pop.parents().removeClass( 'noanimated' );

					_ovl.unbind().remove();
					pop.after( section );
					pop.remove();

					section.find( '.tm-section-link' ).show();
					section.find( '.tm-section-pop' ).hide();
				};

				if ( $this.attr( 'data-title' ) ) {
					title = $this.attr( 'data-title' );
				}

				$this.on( 'click.tmsectionpoplink', function( e ) {
					var pop;

					e.preventDefault();
					clicked = false;
					_ovl.appendTo( 'body' ).on( 'click', cancelfunc );

					section.before(
						$.epoAPI.template.html( tcAPI.templateEngine.tc_section_pop_link, {
							title: title,
							close: TMEPOJS.i18n_close
						} )
					);

					pop = $( '#tm-section-pop-up' );

					pop.find( '.float-editbox' ).prepend( section );

					section.find( '.tm-section-link' ).hide();
					section.find( '.tm-section-pop' ).show();

					pop.parents().addClass( 'noanimated' );

					pop.find( '.floatbox-cancel' ).on( 'click', function() {
						if ( clicked ) {
							return;
						}
						clicked = true;
						cancelfunc();
					} );
					jWindow.trigger( 'tmlazy' );
					jWindow.trigger( 'tmsectionpoplink' );
				} );
			} );
		};
	} // End Section popup

	function getVariationIdSelector( currentCart ) {
		var variationIdSelector = "input[name^='variation_id']";

		if ( currentCart.find( 'input.variation_id' ).length > 0 ) {
			variationIdSelector = 'input.variation_id';
		} else {
			variationIdSelector = 'input.product-variation-id';
		}

		return variationIdSelector;
	}

	function getVariationIdElement( currentCart, not ) {
		var variationIdSelector = getVariationIdSelector( currentCart );
		var variationIdElement = currentCart.find( variationIdSelector );

		if ( currentCart.is( '.tc-epo-element-product-container-cart' ) ) {
			variationIdElement = currentCart.closest( '.tc-epo-element-product-li-container' ).find( variationIdSelector );
		} else {
			variationIdElement = currentCart.find( variationIdSelector ).not( '.tc-epo-element-product-container-variation-id ' + variationIdSelector );
		}
		if ( not ) {
			variationIdElement = variationIdElement.not( not );
		}

		return variationIdElement;
	}

	function getCurrentVariation( currentCart ) {
		var field_div;
		var newCart;

		if ( currentCart.is( '.tc-epo-element-product-container-cart' ) ) {
			field_div = currentCart.closest( '.cpf-element' );
			if ( field_div.is( '.cpf-type-product-thumbnailmultiple' ) || field_div.is( '.cpf-type-product-checkbox' ) ) {
				newCart = currentCart.closest( '.tc-epo-element-product-holder' ).find( '.tc-epo-element-product-container-variation-id' );
			} else if ( field_div.is( '.cpf-type-product-thumbnail' ) || field_div.is( '.cpf-type-product-radio' ) || field_div.is( '.cpf-type-product-dropdown' ) || field_div.is( '.cpf-type-product-single' ) ) {
				newCart = field_div.find( '.tc-epo-element-product-container-variation-id' );
			}
			if ( newCart && newCart.length ) {
				currentCart = newCart;
			}
		}
		return currentCart.find( getVariationIdSelector( currentCart ) ).val() || 0;
	}

	function getQtyElement( currentCart ) {
		var qty = currentCart.find( tcAPI.qtySelector ).last();
		if ( qty.length === 0 ) {
			qty = currentCart.find( tcAPI.associateQtySelector ).last();
		}
		qty = $.epoAPI.applyFilter( 'tc_getQtyElement', qty, currentCart );
		return qty;
	}

	function getCurrentQty( currentCart ) {
		return $.epoAPI.applyFilter( 'tc_getCurrentQty', $.epoAPI.math.toFloat( getQtyElement( currentCart ).val() ), currentCart );
	}

	function add_variation_event( name, selector, func ) {
		lateVariationEvent[ lateVariationEvent.length ] = {
			name: name,
			selector: selector,
			func: func
		};
	}

	function field_is_active( field, nochecks, single ) {
		var ret = true;
		var insideProductCheck = false;
		var productElement;
		field = $( field );
		productElement = field.filter( '.tc-epo-field-product' );
		if ( productElement.length && productElement.data( 'islogicinit' ) === undefined ) {
			insideProductCheck = true;
		}
		field.each( function( j, element ) {
			if ( ! ret && field.has( '.tc-epo-field-product' ).length ) {
				if ( insideProductCheck || productElement.is( '.tcdisabled' ) ) {
					field_check_active( element, nochecks, single );
				}
			} else {
				ret = field_check_active( element, nochecks, single ) && ret;
			}
		} );

		return ret;
	}

	function field_check_active( field, nochecks, single ) {
		var hideElement;
		var singleField;
		var ul;
		var isInsideProductElement;
		var productElementActive;
		var productElementSectionActive;
		var productElementQty;
		var section;
		var disableElements;
		var sectionLi;
		var allSectionsDisabled;

		field = $( field );
		if ( field.is( '.cpf-element' ) ) {
			hideElement = field;
			field = field.find( '.tmcp-field, .tmcp-fee-field' );
		} else {
			hideElement = field.closest( '.cpf-element' );
		}

		section = hideElement.closest( '.cpf-section' );
		sectionLi = section.closest( '.tm-extra-product-options-field' );

		if ( single ) {
			ul = field.closest( '.tmcp-ul-wrap' );
		} else {
			ul = hideElement;
		}

		if ( field.is( '.tc-epo-field-product' ) && field.data( 'islogicinit' ) === undefined ) {
			field.data( 'islogicinit', 1 );
		}

		isInsideProductElement = ! field.is( '.tc-epo-field-product' ) && hideElement.closest( '.cpf-type-product' );

		if ( isInsideProductElement.length ) {
			productElementQty = isInsideProductElement.find( tcAPI.associateQtySelector );
			if ( productElementQty.length ) {
				if ( $.epoAPI.math.toFloat( productElementQty.val() ) > 0 ) {
					field.removeClass( 'ignore' );
					productElementQty.removeClass( 'ignore' );
				} else {
					field.addClass( 'ignore' );
					productElementQty.addClass( 'ignore' );
				}
			}
			productElementActive = isInsideProductElement.data( 'isactive' );
			isInsideProductElement = isInsideProductElement.closest( '.cpf-section' );
			productElementSectionActive = isInsideProductElement.data( 'isactive' );
		}
		if ( productElementActive !== false && productElementSectionActive !== false && hideElement.data( 'isactive' ) !== false && section.data( 'isactive' ) !== false ) {
			singleField = field.first();
			field.prop( 'disabled', false );
			if ( field.data( 'tc-state' ) !== undefined ) {
				field.data( 'tc-state', false );
			}

			if ( TMEPOJS.tm_epo_show_only_active_quantities !== 'yes' ) {
				if ( singleField.is( ':radio, .cpf-type-radio' ) || singleField.is( ':checkbox, .cpf-type-checkbox' ) ) {
					field.filter( ':checked' ).closest( '.tmcp-field-wrap' ).find( '.tm-qty' ).prop( 'disabled', false );
					field.not( ':checked' ).closest( '.tmcp-field-wrap' ).find( '.tm-qty' ).prop( 'disabled', true );
				} else if ( singleField.is( 'select, .cpf-type-select, .cpf-type-selectmultiple' ) ) {
					if ( singleField.val() ) {
						ul.find( '.tm-qty' ).prop( 'disabled', false );
					} else {
						ul.find( '.tm-qty' ).prop( 'disabled', true );
					}
				} else if ( singleField.val() ) {
					ul.find( '.tm-qty' ).prop( 'disabled', false );
				} else {
					ul.find( '.tm-qty' ).prop( 'disabled', true );
				}
			} else if ( ! nochecks ) {
				hideElement.find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' );
			}

			if ( ! singleField.is( '.cpf-element' ) ) {
				field.removeClass( 'tcdisabled' ).addClass( 'tcenabled' );

				if ( field.is( '.tmcp-upload' ) ) {
					if ( field.next( '.tmcp-upload-hidden' ).length ) {
						field.next( '.tmcp-upload-hidden' ).removeClass( 'tcdisabled' ).addClass( 'tcenabled' ).prop( 'disabled', false );
					}
				}
			}

			hideElement.removeClass( 'tc-container-disabled' ).addClass( 'tc-container-enabled' );

			field.trigger( {
				type: 'tm-field-is-active',
				field: field,
				value: true
			} );
			section.removeClass( 'section-disabled' );
			sectionLi.removeClass( 'tc-hidden' );

			return true;
		}

		if ( ! field.is( '.cpf-element' ) ) {
			field.prop( 'disabled', true ).removeClass( 'tcenabled' ).addClass( 'tcdisabled' );
			if ( field.data( 'tc-state' ) !== undefined ) {
				field.data( 'tc-state', true );
			}
			hideElement.find( '.tm-qty' ).prop( 'disabled', true );
			if ( field.is( '.tmcp-upload' ) ) {
				if ( field.next( '.tmcp-upload-hidden' ).length ) {
					field.next( '.tmcp-upload-hidden' ).removeClass( 'tcenabled' ).addClass( 'tcdisabled' ).prop( 'disabled', true );
				}
			}
		}

		hideElement.removeClass( 'tc-container-enabled' ).addClass( 'tc-container-disabled' );

		field.trigger( {
			type: 'tm-field-is-active',
			field: field,
			value: false
		} );

		disableElements = section.find( '.cpf-element.tc-container-enabled' ).length === 0;
		if ( disableElements ) {
			section.addClass( 'section-disabled' );
			allSectionsDisabled = sectionLi.children( '.cpf-section' ).filter( function() {
				return ! $( this ).hasClass( 'section-disabled' );
			} ).length === 0;
			if ( allSectionsDisabled ) {
				sectionLi.addClass( 'tc-hidden' );
			}
		}

		return false;
	}

	function tm_variation_check_match( element, val2, operator ) {
		var $element = $( element );
		var epoId = $element.attr( 'data-epo_id' );
		var productId = $element.attr( 'data-product_id' );

		var variationsForm = $( ".variations_form[data-epo_id='" + epoId + "'][data-product_id='" + productId + "']" );
		var val1;
		var variationIdSelector = "input[name^='variation_id']";
		var $variationId;

		variationsForm = $.epoAPI.applyFilter( 'tm_variation_check_match_variationsForm', variationsForm, epoId, productId, $element );

		if ( variationsForm.length === 0 ) {
			return false;
		}

		$variationId = variationsForm.find( variationIdSelector );

		if ( $variationId.length === 0 ) {
			variationIdSelector = 'input.variation_id';

			$variationId = variationsForm.find( variationIdSelector );

			if ( $variationId.length === 0 ) {
				$variationId = variationsForm.closest( '.tc-epo-element-product-li-container' ).find( '.product-variation-id' );
			}
		}

		if ( element !== null && val2 !== null && element !== undefined && val2 !== undefined && element !== false && val2 !== false ) {
			if ( val2 ) {
				val2 = parseInt( val2, 10 );
			} else {
				val2 = -1;
			}
		}

		val1 = parseInt( $variationId.val(), 10 );

		if ( ! Number.isFinite( val1 ) ) {
			val1 = 0;
		}
		if ( ! Number.isFinite( val2 ) ) {
			val2 = 0;
		}

		switch ( operator ) {
			case 'is':
				return val1 !== '' && val1 === val2;

			case 'isnot':
				return val1 !== '' && val1 !== val2;

			case 'isempty':
				return val1 === '' || val1 === 0;

			case 'isnotempty':
				return val1 !== '' && val1 !== 0;

			case 'startswith':
				return val1.toString().startsWith( val2 );

			case 'endswith':
				return val1.toString().endsWith( val2 );

			case 'greaterthan':
				return parseFloat( val1 ) > parseFloat( val2 );

			case 'lessthan':
				return parseFloat( val1 ) < parseFloat( val2 );

			case 'greaterthanequal':
				return parseFloat( val1 ) >= parseFloat( val2 );

			case 'lessthanequal':
				return parseFloat( val1 ) <= parseFloat( val2 );
		}
		return false;
	}

	function tm_check_match( val1, val2, operator ) {
		if ( val1 !== null && val2 !== null ) {
			val1 = encodeURIComponent( val1 );
			if ( $.qtranxj_split ) {
				//backwards compatible
				val2 = encodeURIComponent( $.qtranxj_split( decodeURIComponent( val2 ) )[ TMEPOQTRANSLATEXJS.language ] );
			} else {
				//backwards compatible
				val2 = encodeURIComponent( decodeURIComponent( val2 ) );
			}

			if ( val1 ) {
				val1 = val1.toLowerCase();
			} else {
				val1 = '';
			}
			if ( val2 ) {
				val2 = val2.toLowerCase();
			} else {
				val2 = '';
			}
		} else {
			return false;
		}

		val1 = val1.toString();
		val2 = val2.toString();

		switch ( operator ) {
			case 'is':
				return val1 !== null && val1 === val2;

			case 'isnot':
				return val1 !== null && val1 !== val2;

			case 'isempty':
				return ! ( val1 !== 'undefined' && val1 !== undefined && val1 !== '' );

			case 'isnotempty':
				return val1 !== 'undefined' && val1 !== undefined && val1 !== '';

			case 'startswith':
				return val1.startsWith( val2 );

			case 'endswith':
				return val1.endsWith( val2 );

			case 'greaterthan':
				return parseFloat( val1 ) > parseFloat( val2 );

			case 'lessthan':
				return parseFloat( val1 ) < parseFloat( val2 );

			case 'greaterthanequal':
				return parseFloat( val1 ) >= parseFloat( val2 );

			case 'lessthanequal':
				return parseFloat( val1 ) <= parseFloat( val2 );
		}

		return false;
	}

	function tm_check_section_match( elements, operator ) {
		var any_checked;
		var val;
		var all_elements = elements.find( '.cpf-element' );
		var radio_checked;
		var checkbox_checked;
		var noSplit = false;

		if ( elements.is( '.tc-hidden' ) ) {
			if ( operator === 'isnotempty' ) {
				return false;
			} else if ( operator === 'isempty' ) {
				return true;
			}
		}

		if ( operator === 'isnotempty' ) {
			any_checked = false;
		} else if ( operator === 'isempty' ) {
			any_checked = true;
		}

		$( all_elements ).each( function( j, element ) {
			var _class;
			var elementToCheck = '';

			element = $( element );
			if ( element.is( '.cpf-type-product' ) ) {
				elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)';
			}
			if ( field_is_active( element ) ) {
				_class = element
					.attr( 'class' )
					.split( ' ' )
					.map( function( cls ) {
						if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) {
							return cls;
						}
						return null;
					} )
					.filter( function( v ) {
						if ( v !== null && v !== undefined ) {
							return v;
						}
						return null;
					} );

				if ( _class.length > 0 ) {
					_class = _class[ 0 ];
					if ( _class === 'cpf-type-product' ) {
						noSplit = true;
						if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) {
							_class = 'cpf-type-checkbox';
						} else if ( element.is( '.cpf-type-product-dropdown' ) ) {
							_class = 'cpf-type-select';
						} else {
							_class = 'cpf-type-radio';
						}
					}
					switch ( _class ) {
						case 'cpf-type-radio':
							radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck );
							if ( operator === 'isnotempty' ) {
								any_checked = any_checked || radio_checked.length > 0;
								if ( radio_checked.length > 0 ) {
									val = radio_checked.length;
								}
							} else if ( operator === 'isempty' ) {
								any_checked = any_checked && radio_checked.length === 0;
							}
							break;

						case 'cpf-type-checkbox':
							checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck );
							if ( operator === 'isnotempty' ) {
								any_checked = any_checked || checkbox_checked.length > 0;
								if ( checkbox_checked.length > 0 ) {
									val = checkbox_checked.length;
								}
							} else if ( operator === 'isempty' ) {
								any_checked = any_checked && checkbox_checked.length === 0;
							}
							break;

						case 'cpf-type-select':
							val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val();
							if ( val && ! noSplit ) {
								val = val.slice( 0, val.lastIndexOf( '_' ) );
							}
							break;

						case 'cpf-type-selectmultiple':
							val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val();
							if ( val && ! noSplit ) {
								val.forEach( function( option, i ) {
									val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) );
								} );
							}
							break;

						default:
							val = element.find( '.tm-epo-field' + elementToCheck ).val();
							break;
					}
					if ( Array.isArray( val ) ) {
						if ( operator === 'isnotempty' ) {
							any_checked = any_checked || val.some( function( item ) {
								return tm_check_match( item, '', operator );
							} );
						} else if ( operator === 'isempty' ) {
							any_checked = any_checked && val.every( function( item ) {
								return tm_check_match( item, '', operator );
							} );
						}
					} else if ( operator === 'isnotempty' ) {
						any_checked = any_checked || tm_check_match( val, '', operator );
					} else if ( operator === 'isempty' ) {
						any_checked = any_checked && tm_check_match( val, '', operator );
					}
				} else {
					any_checked = false;
				}
			}
		} );

		return any_checked;
	}

	function tm_check_field_match( f ) {
		var element = $( f.element );
		var operator = f.operator;
		var value = f.value;
		var val;
		var radio_checked;
		var checkbox_checked;
		var ret;
		var _class;
		var noSplit = false;
		var elementToCheck = '';

		if ( ! element.length ) {
			return false;
		}
		if ( element.is( '.cpf-section' ) ) {
			return tm_check_section_match( element, operator );
		}
		if ( element.is( '.cpf-type-product' ) ) {
			elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)';
		}
		_class = element
			.attr( 'class' )
			.split( ' ' )
			.map( function( cls ) {
				if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) {
					return cls;
				}
				return null;
			} )
			.filter( function( v ) {
				if ( v !== null && v !== undefined ) {
					return v;
				}
				return null;
			} );

		if ( _class.length > 0 ) {
			_class = _class[ 0 ];
			if ( _class === 'cpf-type-product' ) {
				noSplit = true;
				if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) {
					_class = 'cpf-type-checkbox';
				} else if ( element.is( '.cpf-type-product-dropdown' ) ) {
					_class = 'cpf-type-select';
				} else {
					_class = 'cpf-type-radio';
				}
			}
			switch ( _class ) {
				case 'cpf-type-radio':
					radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck );

					if ( operator === 'is' || operator === 'isnot' ) {
						if ( radio_checked.length === 0 && operator === 'is' ) {
							return false;
						}
						if ( radio_checked.length === 0 && operator === 'isnot' ) {
							return true;
						}
					}
					if ( operator === 'isnotempty' ) {
						return radio_checked.length > 0;
					}
					if ( operator === 'isempty' ) {
						return radio_checked.length === 0;
					}
					val = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ).val();
					if ( val && ! noSplit ) {
						val = val.slice( 0, val.lastIndexOf( '_' ) );
					}
					break;
				case 'cpf-type-checkbox':
					checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck );

					if ( operator === 'is' || operator === 'isnot' ) {
						if ( checkbox_checked.length === 0 && operator === 'is' ) {
							return false;
						}
						if ( checkbox_checked.length === 0 && operator === 'isnot' ) {
							return true;
						}
						ret = false;
						checkbox_checked.each( function( i, el ) {
							val = $( el ).val();
							if ( val && ! noSplit ) {
								val = val.slice( 0, val.lastIndexOf( '_' ) );
							}
							if ( tm_check_match( val, value, operator ) ) {
								ret = true;
							} else if ( operator === 'isnot' ) {
								ret = false;
								return false;
							}
						} );
						return ret;
					}
					if ( operator === 'isnotempty' ) {
						return checkbox_checked.length > 0;
					}
					if ( operator === 'isempty' ) {
						return checkbox_checked.length === 0;
					}
					break;

				case 'cpf-type-select':
					val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val();
					if ( val && ! noSplit ) {
						val = val.slice( 0, val.lastIndexOf( '_' ) );
					}
					break;

				case 'cpf-type-selectmultiple':
					val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val();
					if ( val && ! noSplit ) {
						val.forEach( function( option, i ) {
							val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) );
						} );
					}
					break;

				case 'cpf-type-variations':
					return tm_variation_check_match( element, value, operator );

				default:
					val = element.find( '.tm-epo-field' + elementToCheck ).val();
					break;
			}
			if ( Array.isArray( val ) ) {
				return val.some( function( item ) {
					return tm_check_match( item, value, operator );
				} );
			}
			return tm_check_match( val, value, operator );
		}
		return false;
	}

	function tm_check_rules( o, theevent ) {
		o.each( function() {
			var $this = $( this );
			var matches = $this.data( 'matches' );
			var toggle = $this.data( 'toggle' );
			var fields = $this.data( 'fields' );
			var checked = [];
			var show = false;

			switch ( toggle ) {
				case 'show':
					show = false;
					break;
				case 'hide':
					show = true;
					break;
			}

			$.each( fields, function( i, ifield ) {
				if ( Array.isArray( ifield ) ) {
					checked[ i ] = 0;
					$.each( ifield, function( ii, field ) {
						var fia = true;

						if ( theevent === 'cpflogic' ) {
							fia = field_is_active( $( field.element ) );
						}
						if ( fia && tm_check_field_match( field ) ) {
							checked[ i ] = parseInt( checked[ i ], 10 ) + 1;
						}
					} );
				}
			} );

			$.each( matches, function( im, match ) {
				var checkim = parseInt( checked[ im ], 10 );
				match = parseInt( match, 10 );

				if ( checkim > 0 && match === checkim ) {
					show = ! show;
					return false;
				}
			} );

			if ( show ) {
				if ( theevent === 'cpflogic' && ! $this.data( 'did_initial_activation' ) ) {
					latecpflogicactions.push( function() {
						var enabledEpos = $this.find( '.tm-epo-field.tcenabled' );
						enabledEpos.each( function( i, el ) {
							el = $( el );
							if ( ! el.data( 'initial_activation' ) && ! $this.closest( '.cpf-section' ).is( '.tc-hidden' ) && field_is_active( el ) ) {
								el.trigger( 'tc_element_epo_rules' );
								el.data( 'initial_activation', 1 );
							}
						} );
						if ( ( $this.is( '.cpf-element' ) && enabledEpos.length ) || $this.is( '.cpf-section' ) ) {
							$this.data( 'did_initial_activation', 1 );
						}
					} );
				}

				$this.removeClass( 'tc-hidden' );
			} else {
				$this.addClass( 'tc-hidden' );
			}
			$this.data( 'isactive', show );
			$this.trigger( 'tc-logic' );
		} );
	}

	function run_cpfdependson( obj ) {
		var iscpfdependson;
		var last_activate_field = [];
		var epo_object;

		if ( ! $( obj ).length ) {
			obj = 'body';
		}
		obj = $( obj );
		iscpfdependson = obj.find( '.iscpfdependson' );
		iscpfdependson.each( function( i, elements ) {
			$( elements ).each( function( j, el ) {
				tm_check_rules( $( el ) );
			} );
		} );
		iscpfdependson.each( function( i, elements ) {
			$( elements ).each( function( j, el ) {
				tm_check_rules( $( el ), 'cpflogic' );
			} );
		} );
		iscpfdependson.each( function( i, elements ) {
			$( elements ).each( function( j, o ) {
				o = $( o );
				if ( o.is( '.cpf-section' ) ) {
					o = o.find( '.cpf-element' );
				}
				o.each( function( theindex, theelement ) {
					field_is_active( $( theelement ).find( '.tm-epo-field' ) );
				} );
			} );
		} );
		latecpflogicactions.forEach( function( func ) {
			func();
		} );
		latecpflogicactions = [];
		if ( $().selectric ) {
			$( '.tm-extra-product-options select' ).selectric( 'refresh' );
		}
		setTimeout( function() {
			$( '.tm-owl-slider' ).each( function() {
				$( this ).trigger( 'refresh.owl.carousel' );
			} );
		}, 200 );

		obj.find( '.tm-product-image:checked,select.tm-product-image' ).each( function() {
			var t = $( this );
			if ( field_is_active( t ) && t.val() !== '' ) {
				last_activate_field.push( t );
			}
		} );
		if ( last_activate_field.length ) {
			last_activate_field[ last_activate_field.length - 1 ].trigger( 'tm_trigger_product_image' );
		} else {
			epo_object = obj.data( 'epo_object' );
			if ( epo_object ) {
				epo_object.main_product.trigger( 'tm_restore_product_image' );
			}
		}

		jWindow.trigger( 'cpflogicrun' );
		jWindow.trigger( 'tmlazy' );
		jWindow.trigger( 'cpflogicdone' );
	}

	// Start Conditional logic
	if ( ! $().cpfdependson ) {
		$.fn.cpfdependson = function( fields, toggle, refresh ) {
			var elements = this;
			var matches = [];

			if ( elements.length === 0 || typeof fields !== 'object' ) {
				return;
			}

			if ( ! toggle ) {
				toggle = 'show';
			}

			$.each( fields, function( i, ifield ) {
				var get_element;
				var $this_epo_container;

				matches[ i ] = 0;

				if ( Array.isArray( ifield ) ) {
					$.each( ifield, function( ii, field ) {
						if ( typeof field !== 'object' ) {
							return true;
						}
						get_element = get_element_from_field( field.element );

						if ( get_element && get_element.length > 0 ) {
							get_element.each( function( iii, element ) {
								var $element = $( element );
								var $pid1;
								var $epo_id1;
								var _events = 'change.cpflogic';

								// this essentially only works for the plugin so we use
								// cache and not recalcualte each time
								if ( ! $this_epo_container || $this_epo_container.closest( '.tc-extra-product-options-inline' ).length ) {
									$pid1 = '.tm-product-id-' + $element.closest( '.tc-extra-product-options' ).attr( 'data-product-id' );
									$epo_id1 = "[data-epo-id='" + $element.closest( '.tc-extra-product-options' ).attr( 'data-epo-id' ) + "']";
									$this_epo_container = $( '.tc-extra-product-options' + $pid1 + $epo_id1 );
								}

								if ( element && $element.length > 0 && ( ! $element.data( 'tmhaslogicevents' ) || refresh ) ) {
									if ( $element.is( '.tm-epo-variation-element' ) ) {
										// associated product event prefixes are added later
										add_variation_event( 'found_variation.tmlogic', false, function() {
											run_cpfdependson( $this_epo_container );
											jWindow.trigger( 'tm-do-epo-update' );
										} );
										add_variation_event( 'hide_variation.tmlogic', false, function() {
											run_cpfdependson( $this_epo_container );
											jWindow.trigger( 'tm-do-epo-update' );
										} );
									} else {
										if ( $element.is( ':text' ) || $element.is( 'textarea' ) ) {
											_events = 'change.cpflogic input.cpflogic';
										}
										if ( $element.is( ':input[type="number"]' ) ) {
											_events = 'change.cpflogic input.cpflogic keypress.cpflogic';
										}
										$element.off( _events ).on( _events, function() {
											run_cpfdependson( $this_epo_container );
										} );
									}
									$element.data( 'tmhaslogicevents', 1 );
								}
							} );
						}
						matches[ i ] = parseInt( matches[ i ], 10 ) + 1;
					} );
				}
			} );

			elements.each( function() {
				var $this = $( this );
				var show = false;

				$this.data( 'matches', matches ).data( 'toggle', toggle ).data( 'fields', fields );

				switch ( toggle ) {
					case 'show':
						show = false;
						break;
					case 'hide':
						show = true;
						break;
				}
				if ( show ) {
					$this.removeClass( 'tc-hidden' );
				} else {
					$this.addClass( 'tc-hidden' );
				}

				$this.data( 'isactive', show );
			} );

			elements.addClass( 'iscpfdependson is-epo-depend' ).data( 'iscpfdependson', 1 );
			return elements;
		};

		$.fn.run_cpfdependson = function() {
			run_cpfdependson();
		};
	}

	$.tcepo = {
		formSubmitEvents: {},

		oneOptionIsSelected: {},

		initialActivation: {},

		// Holds the active precentage of total current price type fields
		lateFieldsPrices: {},

		errorObject: {},

		showHideTotal: {}
	};

	function validate_logic( l ) {
		return typeof l === 'object' && 'toggle' in l && 'rules' in l && l.rules.length > 0;
	}

	function convert_rules( rules ) {
		if ( rules.what ) {
			if ( rules.what === 'all' ) {
				rules.rules = [ rules.rules ];
			} else if ( rules.what === 'any' ) {
				rules.rules = rules.rules.reduce( function( accumulator, elrule ) {
					accumulator.push( [ elrule ] );
					return accumulator;
				}, [] );
			}
			delete rules.what;
		}
		return rules;
	}

	// The following loops are required for the logic to work on composite products that have custom variations
	function cpf_section_logic( obj ) {
		var root_element = $( obj );
		var all_sections = root_element.find( '.cpf-section' );
		var search_obj;
		var cpf_section;
		var sect;
		var logic;
		var haslogic;
		var fields;
		var section;
		var element;
		var operator;
		var value;
		var obj_section;
		var obj_element;
		var closestProductElement;

		if ( root_element.is( '.cpf-section' ) ) {
			search_obj = false;
		} else {
			search_obj = all_sections;
		}

		root_element.each( function( j, obj_el ) {
			if ( $( obj_el ).is( '.cpf-section' ) ) {
				cpf_section = $( obj_el );
			} else {
				cpf_section = $( obj_el ).find( '.cpf-section' );
			}

			cpf_section.filter( '[data-haslogic="1"]' ).each( function( index, el ) {
				sect = $( el );
				logic = sect.data( 'logic' );
				// backwards compatibility conversion.
				logic = convert_rules( logic );
				haslogic = parseInt( sect.data( 'haslogic' ), 10 );
				fields = [];
				closestProductElement = sect.parent().closest( '.cpf-type-product' );

				if ( haslogic === 1 && validate_logic( logic ) ) {
					$.each( logic.rules, function( i, irule ) {
						if ( irule ) {
							if ( Array.isArray( irule ) ) {
								fields[ i ] = [];
								$.each( irule, function( ii, rule ) {
									section = rule.section;
									element = rule.element;
									operator = rule.operator;
									value = rule.value;

									if ( search_obj ) {
										if ( closestProductElement.length ) {
											obj_section = closestProductElement.find( '.cpf-section' ).filter( "[data-uniqid='" + section + "']" );
											if ( element !== section ) {
												obj_element = obj_section.find( '.cpf-element' ).eq( element );
											} else {
												obj_element = obj_section;
											}
										} else {
											obj_section = search_obj.filter( "[data-uniqid='" + section + "']" );
											if ( element !== section ) {
												obj_element = obj_section.find( '.cpf-element:not(.cpf-element .cpf-element)' ).eq( element );
											} else {
												obj_element = obj_section;
											}
										}
									} else if ( element !== section ) {
										obj_element = root_element.find( '.cpf-element' ).eq( element );
									} else {
										obj_element = obj_section;
									}

									fields[ i ].push( {
										element: obj_element,
										operator: operator,
										value: value
									} );
								} );
							}
						}
					} );
					if ( ! sect.data( 'iscpfdependson' ) ) {
						sect.data( 'cpfdependson-fields', fields );
						sect.cpfdependson( fields, logic.toggle );
					} else {
						sect.cpfdependson( sect.data( 'cpfdependson-fields' ), logic.toggle, true );
					}
				}
			} );
		} );
	}

	function cpf_element_logic( obj ) {
		var root_element = $( obj );
		var all_sections = root_element.find( '.cpf-section' ).not( '.cpf-type-product .cpf-section' );
		var search_obj;
		var current_element;
		var logic;
		var haslogic;
		var section;
		var element;
		var operator;
		var value;
		var obj_section;
		var obj_element;
		var closestProductElement;

		if ( root_element.is( '.cpf-section' ) ) {
			search_obj = false;
		} else {
			search_obj = all_sections;
		}

		root_element.find( '.cpf-element[data-haslogic="1"]' ).each( function( index, el ) {
			var fields = [];

			current_element = $( el );
			logic = current_element.data( 'logic' );
			// backwards compatibility conversion.
			logic = convert_rules( logic );

			haslogic = parseInt( current_element.data( 'haslogic' ), 10 );

			closestProductElement = current_element.parent().closest( '.cpf-type-product' );

			if ( haslogic === 1 && validate_logic( logic ) ) {
				$.each( logic.rules, function( i, irule ) {
					if ( irule ) {
						if ( Array.isArray( irule ) ) {
							fields[ i ] = [];
							$.each( irule, function( ii, rule ) {
								section = rule.section;
								element = rule.element;
								operator = rule.operator;
								value = rule.value;

								if ( search_obj ) {
									if ( closestProductElement.length ) {
										obj_section = closestProductElement.find( '.cpf-section' ).filter( "[data-uniqid='" + section + "']" );
										if ( element !== section ) {
											obj_element = obj_section.find( '.cpf-element' ).eq( element );
										} else {
											obj_element = obj_section;
										}
									} else {
										obj_section = search_obj.filter( "[data-uniqid='" + section + "']" );
										if ( element !== section ) {
											obj_element = obj_section.find( '.cpf-element:not(.cpf-element .cpf-element)' ).eq( element );
										} else {
											obj_element = obj_section;
										}
									}
								} else if ( element !== section ) {
									obj_element = root_element.find( '.cpf-element' ).eq( element );
								} else {
									obj_element = obj_section;
								}

								fields[ i ].push( {
									element: obj_element,
									operator: operator,
									value: value
								} );
							} );
						}
					}
				} );

				if ( ! current_element.data( 'iscpfdependson' ) ) {
					current_element.data( 'cpfdependson-fields', fields );
					current_element.cpfdependson( fields, logic.toggle );
				} else {
					current_element.cpfdependson( current_element.data( 'cpfdependson-fields' ), logic.toggle, true );
				}
			}
		} );
	} // End Conditional logic

	// Return price value without tax
	function tm_set_price_without_tax( value, _cart, force ) {
		var taxable;
		var tax_rate;
		var tax_display_mode;
		var prices_include_tax;

		if ( _cart ) {
			taxable = _cart.attr( 'data-taxable' );
			tax_rate = _cart.attr( 'data-tax-rate' );
			tax_display_mode = _cart.attr( 'data-tax-display-mode' );
			prices_include_tax = _cart.attr( 'data-prices-include-tax' );

			if ( force || ( taxable && tax_display_mode === 'incl' && prices_include_tax !== '1' ) ) {
				value = parseFloat( value ) / ( 1 + ( tax_rate / 100 ) );
			}
		}

		return value;
	}

	// Return price with tax
	function tm_set_price_with_tax( value, _cart, force ) {
		var taxable;
		var tax_rate;
		var tax_display_mode;
		var prices_include_tax;

		if ( _cart ) {
			taxable = _cart.attr( 'data-taxable' );
			tax_rate = _cart.attr( 'data-tax-rate' );
			tax_display_mode = _cart.attr( 'data-tax-display-mode' );
			prices_include_tax = _cart.attr( 'data-prices-include-tax' );
			if ( force || ( taxable && tax_display_mode !== 'incl' && prices_include_tax === '1' ) ) {
				value = parseFloat( value ) * ( 1 + ( tax_rate / 100 ) );
			}
		}

		return value;
	}

	// Return  price
	function tm_set_backend_price( value, _cart, variation ) {
		var taxable;
		var tax_display_mode;
		var prices_include_tax;

		if ( _cart ) {
			taxable = _cart.attr( 'data-taxable' );
			tax_display_mode = _cart.attr( 'data-tax-display-mode' );
			prices_include_tax = _cart.attr( 'data-prices-include-tax' );
			if ( taxable ) {
				if ( variation && variation.tc_tax_rate && String( variation.tc_tax_rate ) === '0' ) {
					return value;
				}
				if ( prices_include_tax === '1' ) {
					if ( tax_display_mode === 'incl' ) {
						// if we are not in the base tax
						if ( variation.tc_base_taxes_of_one !== variation.tc_modded_taxes_of_one ) {
							value = parseFloat( ( ( 1 - variation.tc_taxes_of_one ) * value ) * ( 1 / ( 1 - variation.tc_base_taxes_of_one ) ) );
						}
					} else {
						value = tm_set_price_with_tax( value, _cart );
					}
				} else if ( prices_include_tax !== '1' && tax_display_mode === 'incl' ) {
					value = tm_set_price_without_tax( value, _cart );
				}
			}
		}

		return value;
	}

	// Return a formatted currency value
	function tm_set_price_totals( value, _cart, notax, taxstring, element ) {
		var inc_tax_string = '';
		var sign = '';
		var val;

		if ( ! notax ) {
			value = tm_set_tax_price( value, _cart, element, undefined, true );
		}
		val = Math.abs( value );
		if ( _cart && taxstring ) {
			inc_tax_string = _cart.attr( 'data-tax-string' );
		}
		if ( inc_tax_string === undefined ) {
			inc_tax_string = '';
		}

		if ( value < 0 ) {
			sign = TMEPOJS.minus_sign + ' ';
		}

		return tm_set_price_( val, sign, inc_tax_string );
	}

	function replace_suffixes( value, rawValue, tc_totals_ob, totalsHolder ) {
		if ( totalsHolder.attr( 'data-tax-display-mode' ) === 'excl' ) {
			tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_excluding_tax}/g, tm_set_price_totals( tc_totals_ob[ rawValue ], totalsHolder, true, false ) );
			tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_including_tax}/g, tm_set_price_totals( tm_set_price_with_tax( tc_totals_ob[ rawValue ], totalsHolder, true ), totalsHolder, true, false ) );
		} else {
			tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_including_tax}/g, tm_set_price_totals( tc_totals_ob[ rawValue ], totalsHolder, true, false ) );
			tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_excluding_tax}/g, tm_set_price_totals( tm_set_price_without_tax( tc_totals_ob[ rawValue ], totalsHolder, true ), totalsHolder, true, false ) );
		}
		return tc_totals_ob;
	}

	function tm_force_update_price( obj, price, formated_price, original_price, original_formated_price ) {
		tm_update_price( obj, price, formated_price, original_price, original_formated_price, true );
	}

	function tm_update_price( obj, price, formated_price, original_price, original_formated_price, force ) {
		var $obj = $( obj );
		var w;
		var $ba_amount;
		var priceobj;
		var f;
		var pw;

		if ( $obj.length === 0 ) {
			return;
		}

		w = $obj.closest( '.tmcp-field-wrap' );
		pw = $obj.closest( '.tc-price-wrap' );
		f = w.find( '.tm-epo-field' );

		if ( ! force && f.attr( 'data-no-price-change' ) === '1' && f.data( 'price-changed' ) ) {
			return;
		}

		price = $.epoAPI.applyFilter( 'tc_adjust_update_price_price', price ); //number
		formated_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_formated_price', formated_price, price ); //formatted
		original_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_original_price', original_price ); //number
		original_formated_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_original_formated_price', original_formated_price, original_price ); //formatted

		if ( ! Number.isFinite( parseFloat( original_price ) ) ) {
			original_price = 0;
		}
		if ( ! Number.isFinite( parseFloat( price ) ) ) {
			price = 0;
		}

		$ba_amount = w.find( '.before-amount,.after-amount' );
		priceobj = {
			price: formated_price,
			original_price: original_formated_price
		};

		if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && ( $.tmempty( price ) === false || ( TMEPOJS.tm_epo_no_hide_price_if_original_not_zero === 'yes' && $.tmempty( price ) === true && $.tmempty( original_price ) === false ) ) ) || TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' ) {
			if ( ( $.tmempty( price ) === true && f.attr( 'data-no-price' ) === '1' ) || ( ! force && f.length > 0 && ( f.attr( 'data-no-price' ) === '1' || ( f.attr( 'data-type' ) === 'variable' && ! f.data( 'price' ) ) ) ) ) {
				pw.addClass( 'tm-hidden' );
				$obj.addClass( 'tm-hidden' );
				$obj.empty();
				$ba_amount.addClass( 'tm-hidden' );
			} else {
				if ( original_price && original_price !== undefined && parseFloat( original_price ) !== parseFloat( price ) ) {
					$obj.html( $.epoAPI.template.html( tcAPI.templateEngine.sale_price, { price: priceobj } ) );
				} else {
					$obj.html( $.epoAPI.template.html( tcAPI.templateEngine.price, { price: priceobj } ) );
				}
				pw.removeClass( 'tm-hidden' );
				$obj.removeClass( 'tm-hidden' );
				$ba_amount.removeClass( 'tm-hidden' );
			}
		} else {
			pw.addClass( 'tm-hidden' );
			$obj.addClass( 'tm-hidden' );
			$obj.empty();
			$ba_amount.addClass( 'tm-hidden' );
		}
	}

	function get_variation_current_settings( form, epoObject ) {
		var current_settings = {};

		if ( epoObject.thisForm ) {
			form = epoObject.thisForm;
		}

		form.find( '.variations select, .tc-epo-variable-product-selector' ).each( function() {
			var attribute_name;
			var value;

			// Get attribute name from data-attribute_name, or from input name
			// if it doesn't exist
			if ( typeof $( this ).data( 'attribute_name' ) !== 'undefined' ) {
				attribute_name = $( this ).data( 'attribute_name' );
			} else {
				attribute_name = $( this ).attr( 'name' );
			}

			// Encode entities
			value = $( this ).val();

			// Add to settings array
			current_settings[ attribute_name ] = value;
		} );

		return current_settings;
	}

	function do_tm_custom_variations_update( form, all_variations, epoObject ) {
		var check_if_all_are_not_set = [];
		var formSettings = get_variation_current_settings( form, epoObject );
		var redo_check = true;
		var variationId = form.find( getVariationIdSelector( form ) ).val();
		variationId = ( variationId !== '0' && variationId !== '' ) || form.find( '.cpf-type-variations' ).find( '.tm-epo-variation-element:checked' ).length > 0 || form.find( '.cpf-type-variations' ).find( '.tm-epo-variation-element option[value!=""]:selected' );

		if ( ! variationId ) {
			return;
		}
		form.find( '.cpf-type-variations' ).each( function( i, el ) {
			var t = $( el ).find( '.tm-epo-variation-element' );
			var id;
			var v;
			var exists = false;

			check_if_all_are_not_set[ i ] = true;

			if ( t.is( 'select' ) ) {
				id = $.epoAPI.dom.id( t.attr( 'data-tm-for-variation' ) );
				v = t.val();
				if ( v ) {
					check_if_all_are_not_set[ i ] = false;
				}
				t.children( 'option' ).each( function( x, o ) {
					exists = false;
					form.find( "[data-attribute_name='attribute_" + id + "']" )
						.children( 'option' )
						.each( function() {
							if ( $( this ).attr( 'value' ) === $( o ).attr( 'value' ) ) {
								exists = true;
								return false;
							}
						} );
					if ( ! exists ) {
						$( o ).prop( 'disabled', true ).hide();
					} else {
						$( o ).prop( 'disabled', false ).show();
					}
				} );
			} else {
				t.each( function( x, oe ) {
					var o = $( oe );
					var li = o.closest( 'li' );
					var input = li.find( '.tm-epo-variation-element' );
					var this_settings = $.extend( true, {}, formSettings );
					var matching_variations;
					var variation;
					var is_in_stock;

					id = o.attr( 'data-tm-for-variation' );
					v = o.val();
					if ( o.is( ':checked' ) ) {
						check_if_all_are_not_set[ i ] = false;
					}

					this_settings[ 'attribute_' + id ] = v;

					matching_variations = $.fn.tm_find_matching_variations( all_variations, this_settings );
					variation = matching_variations.shift();

					is_in_stock = variation && 'is_in_stock' in variation && variation.is_in_stock;

					if ( ! is_in_stock ) {
						if ( ! input.is( ':checked' ) && ! is_in_stock ) {
							li.addClass( 'pointereventsoff' );
						} else {
							li.removeClass( 'pointereventsoff' );
						}

						o.attr( 'disabled', 'disabled' ).addClass( 'tm-disabled' );

						input.attr( 'disabled', 'disabled' );
						input.attr( 'data-tm-disabled', 'disabled' );

						li.addClass( 'tm-attribute-disabled' ).fadeTo( 'fast', 0.5 );
					} else {
						o.prop( 'disabled', false ).removeClass( 'tm-disabled' );
						li.removeClass( 'pointereventsoff tm-attribute-disabled' ).fadeTo( 'fast', 1, function() {
							$( this ).css( 'opacity', '' );
						} );
						input.prop( 'disabled', false );
						input.removeAttr( 'data-tm-disabled' );
					}
				} );
			}
		} );

		if ( check_if_all_are_not_set ) {
			check_if_all_are_not_set.shift();

			$.each( check_if_all_are_not_set, function( i, el ) {
				if ( el === false ) {
					redo_check = false;
					return false;
				}
			} );
			if ( redo_check ) {
				form.find( '.cpf-type-variations' )
					.first()
					.each( function( i, el ) {
						var t;
						var li;
						var input;

						t = $( el ).find( '.tm-epo-variation-element' );

						if ( ! t.is( 'select' ) ) {
							t.each( function( x, o ) {
								o = $( o );
								li = o.closest( 'li' );
								input = li.find( '.tm-epo-variation-element' );
								o.prop( 'disabled', false ).removeClass( 'tm-disabled' );
								li.removeClass( 'tm-attribute-disabled' ).stop().css( 'opacity', '' );
								input.prop( 'disabled', false );
								input.removeAttr( 'data-tm-disabled' );
							} );
						}
					} );
			}
		}
	}

	function tm_custom_variations_update( form, epoObject ) {
		var data;
		var all_variations = form.data( 'product_variations' );
		var product_id = parseInt( form.data( 'product_id' ), 10 );
		var globalVariationObject = form.data( 'globalVariationObject' ) || false;

		if ( ! product_id ) {
			product_id = form.data( 'tc_product_id' );
		}

		if ( ! product_id && form.is( tcAPI.compositeSelector ) ) {
			data = form.find( '.component_options' ).data( 'options_data' );
			product_id = data[ 0 ].option_id;
			if ( ! all_variations ) {
				all_variations = form.find( '.details.component_data' ).data( 'product_variations' );
			}
		}

		if ( ! epoObject.is_associated ) {
			// Fallback to window property if not set - backwards compat
			if ( ! all_variations && window.product_variations && window.product_variations.product_id ) {
				all_variations = window.product_variations.product_id;
			}
			if ( ! all_variations && window.product_variations ) {
				all_variations = window.product_variations;
			}
			if ( ! all_variations && window[ 'product_variations_' + product_id ] ) {
				all_variations = window[ 'product_variations_' + product_id ];
			}
		}

		if ( ! all_variations ) {
			if ( ! globalVariationObject ) {
				data = {
					action: 'woocommerce_tm_get_variations_array',
					post_id: product_id
				};
				$.post(
					TMEPOJS.ajax_url,
					data,
					function( response ) {
						globalVariationObject = response;
						form.data( 'globalVariationObject', response );
						do_tm_custom_variations_update( form, globalVariationObject.variations, epoObject );
					},
					'json'
				);
			} else {
				do_tm_custom_variations_update( form, globalVariationObject.variations, epoObject );
			}

			return;
		}
		// may need 2.4 check for woocommerce_ajax_variation_threshold
		do_tm_custom_variations_update( form, all_variations, epoObject );
	}

	function tm_fix_stock( cart, html ) {
		var custom_variations;
		var section;

		if ( html === undefined ) {
			return false;
		}
		cart = $( cart );
		custom_variations = cart.find( '.tm-epo-variation-element' ).first();
		section = custom_variations.closest( '.tm-epo-variation-section' );

		if ( custom_variations.length ) {
			section.find( '.tm-stock' ).remove();
			section.append( '<div class="tm-stock">' + html + '</div>' );
			return true;
		}
		cart.find( '.tm-stock' ).remove();
		cart.find( '.variations' ).after( '<div class="tm-stock">' + html + '</div>' );
		return true;
	}

	function fix_stock( $this, form ) {
		var stock;

		if ( TMEPOJS.tm_epo_global_move_out_of_stock === 'no' ) {
			return;
		}
		stock = $this.find( '.woocommerce-variation-availability' ).last();
		if ( ! stock.length ) {
			stock = $this.find( '.stock' ).last();
		}

		if ( stock.length ) {
			form.find( '.tm-stock' ).remove();
			if ( tm_fix_stock( form, stock.prop( 'outerHTML' ) ) ) {
				stock.remove();
			}
		} else {
			form.find( '.tm-stock' ).remove();
		}
	}

	function get_main_input_id( main_product, product, id ) {
		var selector = '';
		var inputid;

		if ( id ) {
			selector = selector + "[value='" + id + "']";
		}
		if ( ! product ) {
			product = main_product;
		}
		inputid = product.find( tcAPI.addToCartSelector + selector );
		if ( inputid.length === 0 ) {
			inputid = product.find( tcAPI.tcAddToCartSelector + selector );
		}
		return inputid.last();
	}

	function get_main_form( main_product, product, selector, id ) {
		if ( ! selector ) {
			selector = 'form';
		}
		return get_main_input_id( main_product, product, id ).closest( selector );
	}

	function get_main_cart( main_product, product, selector, id ) {
		return get_main_form( main_product, product, selector, id );
	}

	function tm_get_native_prices_block( obj ) {
		var selector = $.epoAPI.applyFilter( 'tcGetNativePricesBlockSelector', '.single_variation .price', obj );

		return $( obj ).find( selector ).not( '.tc-price' );
	}

	// URL replacement setup
	function tm_set_url_fields() {
		jDocument.on( 'click.cpfurl change.cpfurl tmredirect', '.tc-url-container .tmcp-radio, .tc-url-container .tmcp-radio+label', function( e ) {
			var data_url = $( this ).attr( 'data-url' );
			if ( data_url ) {
				if ( window.location !== data_url ) {
					e.preventDefault();
					window.location = data_url;
				}
			}
		} );
		jDocument.on( 'change.cpfurl tmredirect', '.tc-url-container .tmcp-select', function( e ) {
			var data_url = $( this ).children( 'option:selected' ).attr( 'data-url' );
			if ( data_url ) {
				if ( window.location !== data_url ) {
					e.preventDefault();
					window.location = data_url;
				}
			}
		} );
	}

	function tm_floating_totals( this_epo_totals_container, is_quickview, main_cart ) {
		$.tcFloatingTotalsBox( this_epo_totals_container, is_quickview, main_cart );
	}

	function tm_show_hide_add_to_cart_button( main_product, currentEpoObject ) {
		var button;
		var qty;
		var showHideCart = currentEpoObject.showHideCart;

		if ( ! currentEpoObject.is_associated && showHideCart !== undefined ) {
			if ( TMEPOJS.tm_epo_hide_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' ) {
				button = main_product.find( tcAPI.addToCartButtonSelector ).first();
				qty = main_product.find( tcAPI.qtySelector ).first();

				if ( showHideCart ) {
					button.removeClass( 'tc-hide-add-to-cart-button' );
					qty.removeClass( 'tc-hide-add-to-cart-button' );
				} else {
					button.addClass( 'tc-hide-add-to-cart-button' );
					qty.addClass( 'tc-hide-add-to-cart-button' );
				}

				jWindow.trigger( 'epoShowHideCart', {
					main_product: main_product,
					currentEpoObject: currentEpoObject,
					showHideCart: showHideCart,
					button: button,
					qty: qty
				} );
			}
		}
	}

	function addShowHidetoEpoObject( currentEpoObject, epoEventId, epoObject ) {
		var has_epo;
		var this_epo_container;
		var epos;
		var allElementsAreSelected;
		var showHideCart = true;
		var showHideTotal = true;
		var one_option_is_selected = $.tcepo.oneOptionIsSelected[ epoEventId ];

		if ( currentEpoObject.is_associated ) {
			return currentEpoObject;
		}

		if ( typeof epoObject === 'object' ) {
			has_epo = epoObject.has_epo;
			this_epo_container = epoObject.this_epo_container;
			has_epo = has_epo && ( this_epo_container.find( '.tmcp-fee-field' ).length || this_epo_container.find( '.tmcp-field' ).not( '.cpf-type-variations .tmcp-field' ).length );
		} else {
			has_epo = epoObject;
		}

		currentEpoObject.showHideCart = undefined;
		currentEpoObject.showHideTotal = undefined;

		if ( has_epo && ( TMEPOJS.tm_epo_hide_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_totals_until_any === 'yes' || TMEPOJS.tm_epo_hide_totals_until_all_required === 'yes' || TMEPOJS.tm_epo_hide_totals_until_all === 'yes' ) ) {
			// Hide cart button until an element is chosen
			if ( TMEPOJS.tm_epo_hide_add_cart_button === 'yes' ) {
				showHideCart = one_option_is_selected;
			}

			// Hide Final total box until an element is chosen
			if ( TMEPOJS.tm_epo_hide_totals_until_any === 'yes' ) {
				showHideTotal = one_option_is_selected;
			}

			// Hide until all required elements are chosen
			if ( TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_totals_until_all_required === 'yes' ) {
				epos = currentEpoObject.this_epo_container.find( '.cpf-element' ).not( '.cpf-type-variations' ).filter( '.tc-container-enabled.tc-is-required' );
				allElementsAreSelected = epos.toArray().every( function( element ) {
					var elementToCheck = '';
					var _class;
					var noSplit = false;
					var radio_checked;
					var checkbox_checked;
					var val;

					element = $( element );
					if ( element.is( '.cpf-type-product' ) ) {
						elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)';
					}
					_class = element
						.attr( 'class' )
						.split( ' ' )
						.map( function( cls ) {
							if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) {
								return cls;
							}
							return null;
						} )
						.filter( function( v ) {
							if ( v !== null && v !== undefined ) {
								return v;
							}
							return null;
						} );

					if ( _class.length > 0 ) {
						_class = _class[ 0 ];
						if ( _class === 'cpf-type-product' ) {
							noSplit = true;
							if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) {
								_class = 'cpf-type-checkbox';
							} else if ( element.is( '.cpf-type-product-dropdown' ) ) {
								_class = 'cpf-type-select';
							} else {
								_class = 'cpf-type-radio';
							}
						}
						switch ( _class ) {
							case 'cpf-type-radio':
								radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck );
								return radio_checked.length > 0;

							case 'cpf-type-checkbox':
								checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck );
								return checkbox_checked.length > 0;

							case 'cpf-type-select':
								val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val();
								if ( val && ! noSplit ) {
									val = val.slice( 0, val.lastIndexOf( '_' ) );
								}
								break;

							case 'cpf-type-selectmultiple':
								val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val();
								if ( val && ! noSplit ) {
									val.forEach( function( option, i ) {
										val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) );
									} );
								}
								break;

							default:
								val = element.find( '.tm-epo-field' + elementToCheck ).val();
								break;
						}
						if ( Array.isArray( val ) ) {
							return val.some( function( item ) {
								return item !== '';
							} );
						}
						return val !== '';
					}
					return false;
				} );
				if ( TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' ) {
					showHideCart = allElementsAreSelected;
				}
				if ( TMEPOJS.tm_epo_hide_totals_until_all_required === 'yes' ) {
					showHideTotal = allElementsAreSelected;
				}
			}

			// Hide until all elements are chosen
			if ( TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_totals_until_all === 'yes' ) {
				epos = currentEpoObject.this_epo_container.find( '.cpf-element' ).not( '.cpf-type-variations' ).filter( '.tc-container-enabled' );
				allElementsAreSelected = epos.toArray().every( function( element ) {
					var elementToCheck = '';
					var _class;
					var noSplit = false;
					var radio_checked;
					var checkbox_checked;
					var val;

					element = $( element );
					if ( element.is( '.cpf-type-product' ) ) {
						elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)';
					}
					_class = element
						.attr( 'class' )
						.split( ' ' )
						.map( function( cls ) {
							if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) {
								return cls;
							}
							return null;
						} )
						.filter( function( v ) {
							if ( v !== null && v !== undefined ) {
								return v;
							}
							return null;
						} );

					if ( _class.length > 0 ) {
						_class = _class[ 0 ];
						if ( _class === 'cpf-type-product' ) {
							noSplit = true;
							if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) {
								_class = 'cpf-type-checkbox';
							} else if ( element.is( '.cpf-type-product-dropdown' ) ) {
								_class = 'cpf-type-select';
							} else {
								_class = 'cpf-type-radio';
							}
						}
						switch ( _class ) {
							case 'cpf-type-radio':
								radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck );
								return radio_checked.length > 0;

							case 'cpf-type-checkbox':
								checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck );
								return checkbox_checked.length > 0;

							case 'cpf-type-select':
								val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val();
								if ( val && ! noSplit ) {
									val = val.slice( 0, val.lastIndexOf( '_' ) );
								}
								break;

							case 'cpf-type-selectmultiple':
								val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val();
								if ( val && ! noSplit ) {
									val.forEach( function( option, i ) {
										val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) );
									} );
								}
								break;

							default:
								val = element.find( '.tm-epo-field' + elementToCheck ).val();
								break;
						}
						if ( Array.isArray( val ) ) {
							return val.some( function( item ) {
								return item !== '';
							} );
						}
						return val !== '';
					}
					return false;
				} );
				if ( TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' ) {
					showHideCart = allElementsAreSelected;
				}
				if ( TMEPOJS.tm_epo_hide_totals_until_all === 'yes' ) {
					showHideTotal = allElementsAreSelected;
				}
			}

			currentEpoObject.showHideCart = showHideCart;
			currentEpoObject.showHideTotal = showHideTotal;
			$.tcepo.showHideTotal[ epoEventId ] = showHideTotal;
		}

		return currentEpoObject;
	}

	function goto_error_item( item, epoEventId ) {
		var el = $.tcepo.errorObject[ epoEventId ] || item;
		var elsection;
		var elsectionlink;
		var cpfElement;
		var pos;

		if ( el ) {
			if ( TMEPOJS.tm_epo_disable_error_scroll !== 'yes' ) {
				elsection = el.closest( '.cpf-section' );
				elsectionlink = elsection.find( '.tm-section-link' );
				cpfElement = el.closest( '.cpf-element' );

				if ( elsection.find( '.tm-toggle' ).length ) {
					elsection.find( '.tm-toggle' ).trigger( 'openwrap.tmtoggle' );
				}
				if ( window.tc_validation_offset === undefined ) {
					window.tc_validation_offset = -100;
				}
				if ( elsection.is( '.section_popup' ) ) {
					errorContainer.tcScrollTo( elsectionlink, 300, window.tc_validation_offset );
					elsectionlink.trigger( 'click.tmsectionpoplink' );
				} else if ( elsection.is( '.tm-owl-slider-section' ) ) {
					pos = el.closest( '.owl-item' ).index();
					elsection.find( '.tcowl-carousel' ).trigger( 'to.owl.carousel', [ pos, 100 ] );
					setTimeout( function() {
						elsection.find( '.tcowl-carousel' ).trigger( 'refresh.owl.carousel' );

						if ( cpfElement.length > 0 ) {
							errorContainer.tcScrollTo( cpfElement, 300, window.tc_validation_offset );
						}
					}, 200 );
				} else if ( elsection.is( '.tc-tabs-section' ) ) {
					pos = el.closest( '.tc-tab-slide' ).index();
					el.closest( '.tc-tabs' ).find( '.tc-tab-headers .tc-tab-header .tab-header[data-id="tc-tab-slide' + pos + '"]' ).trigger( 'click.tmtabs' );
					setTimeout( function() {
						if ( cpfElement.length > 0 ) {
							errorContainer.tcScrollTo( cpfElement, 300, window.tc_validation_offset );
						}
					}, 200 );
				} else if ( cpfElement.length > 0 ) {
					errorContainer.tcScrollTo( cpfElement, 300, window.tc_validation_offset );
				}
			}

			if ( ! item ) {
				$.tcepo.errorObject[ epoEventId ] = false;
			}
		}
	}

	function tm_limit_c_selection( field, prevent ) {
		var allowed = parseInt( field.attr( 'data-limit' ), 10 );
		var checked = false;
		var val;
		var t;
		var q;

		if ( allowed > 0 ) {
			checked = 0;
			field
				.closest( '.tm-extra-product-options-checkbox' )
				.find( "input.tm-epo-field[type='checkbox']:checked" )
				.each( function() {
					t = $( this );
					q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' );
					if ( q.length > 0 ) {
						val = parseInt( q.val(), 10 );
						if ( val <= 0 ) {
							val = 1;
						}
						checked = parseInt( checked, 10 ) + val;
					} else {
						checked = parseInt( checked, 10 ) + 1;
					}
				} );
			if ( checked > allowed ) {
				if ( prevent ) {
					field.prop( 'checked', '' ).trigger( 'change' );
				}
				return false;
			}
		}
		return true;
	}

	function tm_exact_c_selection( field, prevent ) {
		var allowed = parseInt( field.attr( 'data-exactlimit' ), 10 );
		var checked = false;
		var val;
		var t;
		var q;

		if ( allowed > 0 ) {
			checked = 0;
			field
				.closest( '.tm-extra-product-options-checkbox' )
				.find( "input.tm-epo-field[type='checkbox']:checked" )
				.each( function() {
					t = $( this );
					q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' );
					if ( q.length > 0 ) {
						val = parseInt( q.val(), 10 );
						if ( val <= 0 ) {
							val = 1;
						}
						checked = parseInt( checked, 10 ) + val;
					} else {
						checked = parseInt( checked, 10 ) + 1;
					}
				} );
			if ( checked > allowed ) {
				if ( prevent ) {
					field.prop( 'checked', '' ).trigger( 'change' );
				}
				return false;
			}
		}
		return true;
	}

	function tm_limit_cont( fields, main_product, epoEventId ) {
		var checkall = true;
		var first_error_obj = false;
		var limit;
		var eln;
		var checked;
		var t;
		var val;
		var q;
		var ew;
		var em;
		var message;
		var field;

		fields.each( function() {
			field = $( this );
			limit = field.find( "[type='checkbox'][data-limit]" );
			if ( limit.length && field_is_active( limit ) ) {
				eln = parseInt( limit.attr( 'data-limit' ), 10 );
				checked = 0;
				field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() {
					t = $( this );
					q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' );
					if ( q.length > 0 ) {
						val = parseInt( q.val(), 10 );
						if ( val <= 0 ) {
							val = 1;
						}
						checked = parseInt( checked, 10 ) + val;
					} else {
						checked = parseInt( checked, 10 ) + 1;
					}
				} );
				ew = field.closest( '.cpf-element' );
				em = ew.find( 'div.tm-error-min' );

				if ( eln < checked ) {
					checkall = false;
					first_error_obj = field;
					if ( eln === 1 ) {
						message = TMEPOJS.tm_epo_global_validator_messages.epolimitsingle.replace( '{0}', eln );
					} else {
						message = TMEPOJS.tm_epo_global_validator_messages.epolimit.replace( '{0}', eln );
					}
					if ( em.length ) {
						em.remove();
					}
					if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) {
						field.closest( '.tc-element-container' ).before( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					} else {
						field.closest( '.tc-element-container' ).after( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					}
					main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled loading fpd-disabled' ).prop( 'disabled', false );
				} else {
					em.remove();
				}
			}
		} );
		if ( first_error_obj ) {
			$.tcepo.errorObject[ epoEventId ] = first_error_obj;
		}
		return checkall;
	}

	function tm_check_limit_cont( limit_cont, main_product, epoEventId ) {
		$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
			trigger: function() {
				return tm_limit_cont( limit_cont, main_product, epoEventId );
			},
			on_true: function() {
				return true;
			},
			on_false: function() {
				goto_error_item( $( limit_cont ).find( '.tm-epo-field' ).first(), epoEventId );
				return true;
			}
		};
	}

	function tm_exactlimit_cont( fields, main_product, epoEventId ) {
		var checkall = true;
		var first_error_obj = false;
		var exactlimit;
		var eln;
		var checked;
		var t;
		var val;
		var q;
		var ew;
		var em;
		var message;
		var field;

		fields.each( function() {
			field = $( this );
			exactlimit = field.find( "[type='checkbox'][data-exactlimit]" );
			if ( exactlimit.length && field_is_active( exactlimit ) ) {
				eln = parseInt( exactlimit.attr( 'data-exactlimit' ), 10 );
				checked = 0;
				field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() {
					t = $( this );
					q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' );
					if ( q.length > 0 ) {
						val = parseInt( q.val(), 10 );
						if ( val <= 0 ) {
							val = 1;
						}
						checked = parseInt( checked, 10 ) + val;
					} else {
						checked = parseInt( checked, 10 ) + 1;
					}
				} );
				ew = field.closest( '.cpf-element' );
				em = ew.find( 'div.tm-error-min' );

				if ( eln !== checked ) {
					checkall = false;
					first_error_obj = field;
					if ( eln === 1 ) {
						message = TMEPOJS.tm_epo_global_validator_messages.epoexactsingle.replace( '{0}', eln );
					} else {
						message = TMEPOJS.tm_epo_global_validator_messages.epoexact.replace( '{0}', eln );
					}
					if ( em.length ) {
						em.remove();
					}
					if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) {
						field.closest( '.tc-element-container' ).before( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					} else {
						field.closest( '.tc-element-container' ).after( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					}
					main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled loading fpd-disabled' ).prop( 'disabled', false );
				} else {
					em.remove();
				}
			}
		} );
		if ( first_error_obj ) {
			$.tcepo.errorObject[ epoEventId ] = first_error_obj;
		}
		return checkall;
	}

	function tm_check_exactlimit_cont( exactlimit_cont, main_product, epoEventId ) {
		$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
			trigger: function() {
				return tm_exactlimit_cont( exactlimit_cont, main_product, epoEventId );
			},
			on_true: function() {
				return true;
			},
			on_false: function() {
				goto_error_item( $( exactlimit_cont ).find( '.tm-epo-field' ).first(), epoEventId );
				return true;
			}
		};
	}

	function tm_minimumlimit_cont( fields, epoEventId ) {
		var checkall = true;
		var first_error_obj = false;
		var eln;
		var checked;
		var t;
		var val;
		var q;
		var ew;
		var em;
		var message;
		var field;

		fields.each( function() {
			var minimumlimit;

			field = $( this );
			minimumlimit = field.find( "[type='checkbox'][data-minimumlimit]" );

			if ( minimumlimit.length && field_is_active( minimumlimit ) ) {
				eln = parseInt( minimumlimit.attr( 'data-minimumlimit' ), 10 );
				checked = 0;
				field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() {
					t = $( this );
					q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' );
					if ( q.length > 0 ) {
						val = parseInt( q.val(), 10 );
						if ( val <= 0 ) {
							val = 1;
						}
						checked = parseInt( checked, 10 ) + val;
					} else {
						checked = parseInt( checked, 10 ) + 1;
					}
				} );
				ew = field.closest( '.cpf-element' );
				em = ew.find( 'div.tm-error-min' );
				if ( eln > checked ) {
					checkall = false;
					first_error_obj = field;
					if ( eln === 1 ) {
						message = TMEPOJS.tm_epo_global_validator_messages.epominsingle.replace( '{0}', eln );
					} else {
						message = TMEPOJS.tm_epo_global_validator_messages.epomin.replace( '{0}', eln );
					}
					if ( em.length ) {
						em.remove();
					}
					if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) {
						field.closest( '.tc-element-container' ).before( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					} else {
						field.closest( '.tc-element-container' ).after( '<div class="tm-error-min tm-error tc-cell tcwidth tcwidth-100">' + message + '</div>' );
					}
				} else {
					em.remove();
				}
			}
		} );

		if ( first_error_obj ) {
			$.tcepo.errorObject[ epoEventId ] = first_error_obj;
		}

		return checkall;
	}

	function tm_check_minimumlimit_cont( minimumlimit_cont, epoEventId ) {
		$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
			trigger: function() {
				return tm_minimumlimit_cont( minimumlimit_cont, epoEventId );
			},
			on_true: function() {
				return true;
			},
			on_false: function() {
				goto_error_item( false, epoEventId );
				return true;
			}
		};
	}

	function cleanPrice( price ) {
		if ( price === null ) {
			return 0;
		}

		if ( typeof price === 'object' ) {
			price = price[ 0 ];
		}

		if ( ! Number.isFinite( parseFloat( price ) ) ) {
			price = 0;
		}

		return price;
	}

	function tm_apply_dpd( price, totals, apply, force ) {
		price = cleanPrice( price );

		if ( apply ) {
			price = $.epoAPI.applyFilter( 'tc_apply_dpd', price, totals, apply, force );
		}

		return price;
	}

	function tm_calculate_product_regular_price( totals, allowfalse ) {
		var price = 0;

		if ( totals.length > 0 ) {
			price = totals.data( 'regular-price' );
		}

		price = $.epoAPI.applyFilter( 'tc_calculate_product_regular_price', price, totals );

		if ( allowfalse && price === false ) {
			return false;
		}
		price = parseFloat( price );

		if ( ! Number.isFinite( price ) ) {
			price = 0;
		}

		return price;
	}

	function tm_calculate_product_price( totals, allowfalse ) {
		var price = 0;

		if ( totals.length > 0 ) {
			price = totals.data( 'price' );
		}

		price = $.epoAPI.applyFilter( 'tc_calculate_product_price', price, totals );

		if ( allowfalse && price === false ) {
			return false;
		}
		price = parseFloat( price );

		if ( ! Number.isFinite( price ) ) {
			price = 0;
		}

		return price;
	}

	function calculateMathPrice( price, thisElement, epoObject, noevents, useOriginalPrice, funcTotal, cumulativeTotal, mathskip ) {
		var formula = price.toString();
		var val = 0;
		var matches;
		var match;
		var elementWrap;
		var allElements;
		var element;
		var reg;
		var elementPrice = 0;
		var pos;
		var type;
		var id;
		var thisVal;
		var thisValForced;
		var thisElementId = thisElement.closest( '.cpf-element' ).attr( 'data-uniqid' );
		var thisElementWrap = thisElement.closest( '.tmcp-ul-wrap' );
		var totalsHolder_tc_totals_ob = epoObject.this_epo_totals_container.data( 'totalsHolder_tc_totals_ob' );
		var thisElementIndex = thisElementWrap.find( '.tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field' ).filter( ':checked' ).index( thisElement );
		var thisElementIndexForced = thisElementWrap.find( '.tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field' ).index( thisElement );
		var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector );
		var constants = $.epoAPI.util.parseJSON( TMEPOJS.tm_epo_math ) || {};
		var productPrice;
		var dynamicProductPrice;
		var __price;
		var __price_type;

		if ( thisElementIndex === -1 && ! thisElement.is( '.tmcp-checkbox, .tmcp-radio' ) ) {
			thisElementIndex = 0;
		}
		if ( thisElementIndexForced === -1 && ! thisElement.is( '.tmcp-checkbox, .tmcp-radio' ) ) {
			thisElementIndexForced = 0;
		}

		if ( ! thisElement.is( '.tcdisabled' ) && ! noevents && ! thisElement.data( 'addedtcEpoBeforeOptionPriceCalculation' ) ) {
			jWindow.on( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId, function() {
				tm_element_epo_rules( epoObject, thisElement, undefined, undefined, undefined, true );
			} );
			jWindow.on( 'tcEpoAfterNormalOptionPriceCalculation.math' + thisElementId, function() {
				thisElement.data( 'fetchOptionPrices', false );
				thisElement.data( 'fetchOptionPrices-forced', false );
				thisElement.data( 'fetchOptionPrices-fee', false );
				thisElement.data( 'fetchOptionPrices-fee-forced', false );
				thisElement.data( 'fetchOptionPrices-sub-fee', false );
				thisElement.data( 'fetchOptionPrices-sub-fee-forced', false );
			} );
			thisElement.data( 'addedtcEpoBeforeOptionPriceCalculation', 1 );
		}

		if ( thisElement.is( '.tmcp-field' ) ) {
			if ( thisElement.data( 'fetchOptionPrices' ) ) {
				thisVal = thisElement.data( 'fetchOptionPrices' );
				thisValForced = thisElement.data( 'fetchOptionPrices-forced' );
			} else {
				thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-field', 0, 0, [], true );
				thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-field', 0, 0, [], true, true );
				thisElement.data( 'fetchOptionPrices', thisVal );
				thisElement.data( 'fetchOptionPrices-forced', thisValForced );
			}
		} else if ( thisElement.is( '.tmcp-fee-field' ) ) {
			if ( thisElement.data( 'fetchOptionPrices-fee' ) ) {
				thisVal = thisElement.data( 'fetchOptionPrices-fee' );
				thisValForced = thisElement.data( 'fetchOptionPrices-fee-forced' );
			} else {
				thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-fee-field', 0, 0, [], true );
				thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-fee-field', 0, 0, [], true, true );
				thisElement.data( 'fetchOptionPrices-fee', thisVal );
				thisElement.data( 'fetchOptionPrices-fee-forced', thisValForced );
			}
		} else if ( thisElement.is( '.tmcp-sub-fee-field' ) ) {
			if ( thisElement.data( 'fetchOptionPrices-sub-fee' ) ) {
				thisVal = thisElement.data( 'fetchOptionPrices-sub-fee' );
				thisValForced = thisElement.data( 'fetchOptionPrices-sub-fee-forced' );
			} else {
				thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-sub-fee-field', 0, 0, [], true );
				thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-sub-fee-field', 0, 0, [], true, true );
				thisElement.data( 'fetchOptionPrices-sub-fee', thisVal );
				thisElement.data( 'fetchOptionPrices-sub-fee-forced', thisValForced );
			}
		}

		Object.keys( constants ).forEach( function( key ) {
			var name;
			var value;

			if ( constants[ key ].name !== '' && constants[ key ].value !== '' ) {
				name = constants[ key ].name;
				value = constants[ key ].value;
				if ( name.startsWith( '{' ) ) {
					formula = formula.replace( name, value );
				} else if ( constants[ key ].name.isNumeric() ) {
					formula = formula.replace( '{' + name + '}', value );
				} else {
					name = new RegExp( '{' + name + '}', 'g' );
					if ( value.startsWith( '{' ) ) {
						formula = formula.replace( name, value );
					} else {
						formula = formula.replace( name, $.epoAPI.math.unformat( value.replace( ',', '.' ) ) );
					}
				}
			}
		} );

		if ( totalsHolder_tc_totals_ob !== undefined ) {
			// product quantity
			formula = formula.replace( /{quantity}/g, $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.qty ) );
			// original product price
			if ( useOriginalPrice && totalsHolder_tc_totals_ob.original_product_price !== undefined ) {
				productPrice = $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.original_product_price );
			} else {
				productPrice = $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.product_price );
			}
			if ( totalsHolder_tc_totals_ob.dynamic_product_price !== undefined ) {
				dynamicProductPrice = $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.dynamic_product_price );
			} else {
				dynamicProductPrice = 0;
			}
		} else {
			// product quantity
			formula = formula.replace( /{quantity}/g, 0 );
			// original product price
			productPrice = 0;
			dynamicProductPrice = 0;
		}

		productPrice = $.epoAPI.math.toFloat( productPrice );

		formula = formula.replace( /{product_price}/g, productPrice );
		formula = formula.replace( /{dynamic_product_price}/g, dynamicProductPrice );

		if ( ! funcTotal ) {
			funcTotal = 0;
		}
		funcTotal = $.epoAPI.math.toFloat( funcTotal );

		if ( ! cumulativeTotal ) {
			cumulativeTotal = 0;
		}
		cumulativeTotal = $.epoAPI.math.toFloat( cumulativeTotal );

		formula = formula.replace( /{options_total}/g, funcTotal );
		formula = formula.replace( /{product_price_plus_options_total}/g, productPrice + funcTotal );
		formula = formula.replace( /{cumulative_total}/g, cumulativeTotal );
		formula = formula.replace( /{product_price_plus_cumulative_total}/g, productPrice + cumulativeTotal );

		if ( thisValForced.floatingBoxData !== undefined && thisValForced.floatingBoxData[ thisElementIndexForced ] !== undefined ) {
			// the option/element value to float
			if ( thisValForced.floatingBoxData[ thisElementIndexForced ].input_type === 'number' || thisValForced.floatingBoxData[ thisElementIndexForced ].input_type === 'hidden' ) {
				formula = formula
					.replace( /{this.value}/g, $.epoAPI.math.toFloat( $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText ) ) );
			} else {
				formula = formula
					.replace( /{this.value}/g, $.epoAPI.math.toFloat( $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText, tcAPI.localDecimalSeparator ) ) );
			}
			// the option/element raw value
			formula = formula.replace( /{this.rawvalue}/g, thisValForced.floatingBoxData[ thisElementIndexForced ].valueText );
			// the option/element raw value
			formula = formula.replace( /{this.text}/g, thisValForced.floatingBoxData[ thisElementIndexForced ].valueText );
			// the option/element value length
			formula = formula
				.replace( /{this.value.length}/g, thisValForced.floatingBoxData[ thisElementIndexForced ].valueText.length );
		} else {
			formula = formula
				// the option/element value to float
				.replace( /{this.value}/g, 0 )
				// the option/element raw value
				.replace( /{this.rawvalue}/g, '' )
				// the option/element raw value
				.replace( /{this.text}/g, '' )
				// the option/element value length
				.replace( /{this.value.length}/g, 0 );
		}

		formula = formula
			// the number of options the user has selected
			.replace( /{this.count}/g, thisVal.floatingBoxData.length )
			// the total option quantity of this element
			.replace(
				/{this.count.quantity}/g,
				thisVal.floatingBoxData
					.map( function( x ) {
						return x.quantity;
					} )
					.reduce( function( acc, thisval ) {
						return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval );
					}, 0 )
			)
			// the option quantity of this element
			.replace( /{this.quantity}/g, thisElement.data( 'tm-quantity' ) );

		if ( formula.match( /\{(\s)*?field\.([^}]*)}/ ) ) {
			matches = formula.match( /\{(\s)*?field\.([^}]*)}/g );
			matches.forEach( function( field ) {
				match = field.match( /\{(\s)*?field\.([^}]*)}/ );
				if ( undefined !== match[ 2 ] && 'string' === typeof match[ 2 ] ) {
					pos = match[ 2 ].indexOf( '.', match[ 2 ].indexOf( '.' ) + 1 );
					if ( pos !== -1 ) {
						id = match[ 2 ].substring( 0, pos );
						type = match[ 2 ].substring( pos + 1 );

						if ( $.inArray( type, [ 'price', 'value', 'value.length', 'rawvalue', 'text', 'text.length', 'quantity', 'count', 'count.quantity' ] ) !== -1 ) {
							elementWrap = this_epo_container.find( "[data-uniqid='" + $.epoAPI.util.escapeSelector( id ) + "']" );
							if ( elementWrap.length ) {
								allElements = elementWrap.find( '.tmcp-field, .tmcp-fee-field, .tmcp-sub-fee-field' );
								element = allElements.first();

								if ( ! thisElement.is( '.tcdisabled' ) && ! noevents && ! thisElement.data( 'addedfieldtcEpoBeforeOptionPriceCalculation' ) ) {
									jWindow.on( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId, function() {
										tm_element_epo_rules( epoObject, thisElement, undefined, undefined, undefined, true );
										thisElement.trigger( 'tm-math-select-change-html-all' );
									} );
									thisElement.data( 'addedfieldtcEpoBeforeOptionPriceCalculation', 1 );
								}
								val = 0;
								switch ( type ) {
									case 'text':
									case 'rawvalue':
										val = '';
										break;
								}

								if ( elementWrap.is( '.tc-container-enabled' ) ) {
									if ( ! mathskip ) {
										allElements.toArray().forEach( function( singleElement ) {
											singleElement = $( singleElement );
											// For now we only recalculate dynamic elements
											if ( thisElement.attr( 'id' ) !== singleElement.attr( 'id' ) && ( thisElement.is( '.tmcp-dynamic' ) || singleElement.is( '.tmcp-dynamic' ) ) ) {
												tm_element_epo_rules( epoObject, singleElement, undefined, undefined, undefined, true, undefined, undefined, true );
											}
											if ( ! noevents && ! singleElement.data( 'addedmathevent' ) ) {
												singleElement.on( 'input.mathevent', function() {
													if ( ! thisElement.is( '.tcdisabled' ) ) {
														thisElement.trigger( 'change.cpf', { calculateMatcPrice: 1 } );
													}
												} );
												singleElement.data( 'addedmathevent', 1 );
											}
										} );
									}
									if ( element.is( '.tmcp-field' ) ) {
										val = fetchOptionPrices( epoObject, elementWrap, '.tmcp-field', 0, 0, [], true, undefined, undefined, true, undefined, undefined, true );
									} else if ( element.is( '.tmcp-fee-field' ) ) {
										val = fetchOptionPrices( epoObject, elementWrap, '.tmcp-fee-field', 0, 0, [], true, undefined, undefined, true, undefined, undefined, true );
									} else if ( element.is( '.tmcp-sub-fee-field' ) ) {
										val = fetchOptionPrices( epoObject, elementWrap, '.tmcp-sub-fee-field', 0, 0, [], true, undefined, undefined, true, undefined, undefined, true );
									}

									switch ( type ) {
										// element price
										case 'price':
											val = val.total;
											if ( thisElement.is( '.tmcp-dynamic' ) ) {
												__price = get_type( epoObject, element, 'price' );
												__price_type = get_type( epoObject, element, 'price_type' );
												if ( 'math' === __price_type && __price.includes( '{dynamic_product_price}' ) ) {
													val = 0;
												}
											}
											break;

										// element value
										case 'value':
										case 'text':
										case 'rawvalue':
											if ( val.floatingBoxData ) {
												val = val.floatingBoxData
													.map( function( x ) {
														if ( x.input_type === 'number' || x.input_type === 'hidden' ) {
															if ( type === 'text' || type === 'rawvalue' ) {
																return x.valueText;
															}
															return $.epoAPI.math.unformat( x.valueText );
														}
														if ( type === 'text' || type === 'rawvalue' ) {
															return x.valueText;
														}
														return $.epoAPI.math.unformat( x.valueText, tcAPI.localInputDecimalSeparator );
													} )
													.reduce( function( acc, thisval ) {
														if ( type === 'text' || type === 'rawvalue' ) {
															return acc + thisval;
														}
														return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval );
													}, ( type === 'text' || type === 'rawvalue' ) ? '' : 0 );

												if ( type === 'text' || type === 'rawvalue' ) {
													if ( val === '' ) {
														val = "''";
													} else if ( ! val.toString().isNumeric() ) {
														val = "'" + val.replace( "'", "\\'" ) + "'";
													}
												}
											}
											break;

										// element value length
										case 'value.length':
										case 'text.length':
											if ( val.floatingBoxData ) {
												val = val.floatingBoxData
													.map( function( x ) {
														return x.valueText;
													} )
													.reduce( function( acc, thisval ) {
														return $.epoAPI.math.toFloat( acc ) + thisval.length;
													}, 0 );
											}
											break;

										// element quantity
										// the total option quantity of this element
										case 'quantity':
										case 'count.quantity':
											if ( val.floatingBoxData ) {
												val = val.floatingBoxData
													.map( function( x ) {
														return x.quantity;
													} )
													.reduce( function( acc, thisval ) {
														return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval );
													}, 0 );
											}
											break;

										// number of element options the user has selected
										case 'count':
											if ( val.floatingBoxData ) {
												val = val.floatingBoxData.length;
											}
											break;
									}
									if ( type !== 'text' && type !== 'rawvalue' ) {
										val = $.epoAPI.math.toFloat( val );
										if ( ! Number.isFinite( val ) ) {
											val = 0;
										}
									}
								}
							} else {
								val = 0;
								switch ( type ) {
									case 'text':
									case 'rawvalue':
										val = '';
										break;
								}
							}
							reg = new RegExp( match[ 0 ] );
							if ( type === 'text' || type === 'rawvalue' ) {
								formula = val === '' ? formula.replace( reg, "''" ) : formula.replace( reg, val );
							} else {
								formula = ! Number.isFinite( val ) ? formula.replace( reg, "'" + val.replace( "'", "\\'" ) + "'" ) : formula.replace( reg, val );
							}
						}
					}
				}
			} );
		}

		try {
			elementPrice = tcmexp.evaluate( formula );
		} catch ( e ) {
			elementPrice = 0;
		}

		return elementPrice;
	}

	function get_type( epoObject, obj, type ) {
		var element = $( obj );
		var setter = element;
		var cart;
		var current_variation;
		var rules;
		var rulestype;
		var _rulestype;
		var pricetype;
		var variation_id_selector;
		var _tmcpulwrap;
		var price;
		var _rules;

		cart = epoObject.main_cart;
		variation_id_selector = "input[name^='variation_id']";
		if ( cart.find( 'input.variation_id' ).length > 0 ) {
			variation_id_selector = 'input.variation_id';
		}
		current_variation = cart.find( variation_id_selector ).val();
		// Get current woocommerce variation
		if ( ! current_variation ) {
			current_variation = 0;
		}

		if ( element.is( 'select' ) ) {
			setter = element.find( 'option:selected' );
		}

		rules = $.epoAPI.util.parseJSON( setter.attr( 'data-rules' ) );
		rulestype = $.epoAPI.util.parseJSON( setter.attr( 'data-rulestype' ) );

		pricetype = '';
		if ( typeof rules === 'object' ) {
			if ( current_variation in rules ) {
				price = rules[ current_variation ];
			} else {
				_rules = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rules' ) );

				if ( typeof _rules === 'object' ) {
					if ( current_variation in _rules ) {
						price = _rules[ current_variation ];
					} else {
						price = rules[ 0 ];
					}
				} else {
					price = rules[ 0 ];
				}
			}
			if ( typeof rulestype === 'object' ) {
				if ( current_variation in rulestype ) {
					pricetype = rulestype[ current_variation ];
				} else {
					_rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rulestype' ) );
					if ( typeof _rulestype === 'object' ) {
						if ( current_variation in _rulestype ) {
							pricetype = _rulestype[ current_variation ];
						} else {
							pricetype = rulestype[ 0 ];
						}
					} else {
						pricetype = rulestype[ 0 ];
					}
				}
			} else {
				rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-ulestype' ) );
				if ( typeof rulestype === 'object' ) {
					if ( current_variation in rulestype ) {
						pricetype = rulestype[ current_variation ];
					} else {
						pricetype = rulestype[ 0 ];
					}
				}
			}
		} else {
			_tmcpulwrap = element.closest( '.tmcp-ul-wrap' );
			rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rules' ) );

			if ( typeof rules === 'object' ) {
				if ( current_variation in rules ) {
					price = rules[ current_variation ];
				} else {
					price = rules[ 0 ];
				}
				if ( typeof rulestype === 'object' ) {
					if ( current_variation in rulestype ) {
						pricetype = rulestype[ current_variation ];
					} else {
						_rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) );
						if ( typeof _rulestype === 'object' ) {
							if ( current_variation in _rulestype ) {
								pricetype = _rulestype[ current_variation ];
							} else {
								pricetype = rulestype[ 0 ];
							}
						} else {
							pricetype = rulestype[ 0 ];
						}
					}
				} else {
					rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) );
					if ( typeof rulestype === 'object' ) {
						if ( current_variation in rulestype ) {
							pricetype = rulestype[ current_variation ];
						} else {
							pricetype = rulestype[ 0 ];
						}
					}
				}
			}
		}

		if ( typeof price === 'object' ) {
			price = price[ 0 ];
		}

		if ( typeof pricetype === 'object' ) {
			pricetype = pricetype[ 0 ];
		}
		if ( element.is( '.tmcp-fee-field' ) ) {
			if ( $.inArray( pricetype, [ 'fee', 'stepfee', 'currentstepfee' ] ) !== -1 ) {
				pricetype = '';
			}
		}

		if ( type === 'price' ) {
			return price;
		}

		return pricetype;
	}

	function wordLength( str ) {
		var regex = new RegExp( /[\p{L}\d!@#$%^&*()_+=\{[\}\]|\\"':;?/>.<,-]+/, 'gu' );
		var m;
		var len = 0;

		while ( ( m = regex.exec( str ) ) !== null ) {
			// This is necessary to avoid infinite loops with zero-width matches
			if ( m.index === regex.lastIndex ) {
				regex.lastIndex++;
			}
			len = len + m.length;
		}
		return len;
	}

	// Set field price rules
	function tm_element_epo_rules( epoObject, obj, args, setter_override, noremove, manthnoevent, funcTotal, cumulativeTotal, mathskip ) {
		var element = $( obj );
		var setterall = element;
		var cart;
		var current_variation;
		var bundleid;
		var epoTotalsContainer;
		var apply_dpd;
		var product_price;
		var product_original_price;
		var is_range_field = element.is( '.tmcp-range' );
		var rules;
		var rulestype;
		var original_rules;
		var _rules;
		var _rulestype;
		var _original_rules;
		var pricetype;
		var price;
		var original_price;
		var raw_price;
		var raw_original_price;
		var formatted_price;
		var original_formatted_price;
		var textlength;
		var freechars;
		var min_value;
		var main_product = epoObject.main_product;
		var epoEventId = epoObject.epoEventId;
		var variation_id_selector;
		var _tmcpulwrap;
		var cart_total;
		var per_product_pricing = true;
		var addedPrice = 0;
		var originalAddedPrice = 0;
		var undiscounted_raw_price;
		var undiscounted_raw_original_price;
		var undiscounted_price;
		var undiscounted_original_price;
		var isFilled;

		if ( element.data( 'associated_price_set' ) ) {
			return;
		}

		if ( ! args ) {
			cart = epoObject.main_cart;
			if ( cart.data( 'per_product_pricing' ) !== undefined ) {
				per_product_pricing = cart.data( 'per_product_pricing' );
			}
			variation_id_selector = "input[name^='variation_id']";
			if ( cart.find( 'input.variation_id' ).length > 0 ) {
				variation_id_selector = 'input.variation_id';
			}
			current_variation = cart.find( variation_id_selector ).val();

			bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, epoObject );

			// Get current woocommerce variation
			if ( ! current_variation ) {
				current_variation = 0;
			}

			epoTotalsContainer = $.epoAPI.applyFilter( 'tc_get_totals_container', epoObject.this_epo_totals_container, element, main_product, bundleid );
			product_price = tm_calculate_product_price( epoTotalsContainer );
			product_original_price = tm_calculate_product_regular_price( epoTotalsContainer );
			apply_dpd = epoTotalsContainer.data( 'fields-price-rules' );
		} else {
			cart = args.cart;
			current_variation = args.current_variation;

			bundleid = args.bundleid;
			epoTotalsContainer = args.epoTotalsContainer;
			product_price = args.product_price;
			product_original_price = args.product_original_price;
			apply_dpd = args.apply_dpd;
			per_product_pricing = args.per_product_pricing;
		}
		product_price = $.epoAPI.applyFilter( 'tc_alter_product_price', product_price, element, cart, epoTotalsContainer, bundleid );
		product_original_price = $.epoAPI.applyFilter( 'tc_alter_product_original_price', product_original_price, element, cart, epoTotalsContainer );

		if ( product_price === false || ! per_product_pricing ) {
			return;
		}

		if ( element.is( 'select' ) ) {
			setterall = element.find( 'option:selected' );
		}
		if ( setter_override ) {
			setterall = setter_override;
		}

		setterall.toArray().forEach( function( setter ) {
			setter = $( setter );

			rules = $.epoAPI.util.parseJSON( setter.attr( 'data-rules' ) );
			rulestype = $.epoAPI.util.parseJSON( setter.attr( 'data-rulestype' ) );
			original_rules = $.epoAPI.util.parseJSON( setter.attr( 'data-original-rules' ) );
			if ( element.is( '.tmcp-dynamic' ) ) {
				rules = $.epoAPI.util.parseJSON( setter.attr( 'data-formula' ) );
				original_rules = $.epoAPI.util.parseJSON( setter.attr( 'data-formula' ) );
				rulestype = $.epoAPI.util.parseJSON( setter.attr( 'data-calculation-type' ) );
			}
			if ( original_rules === undefined ) {
				original_rules = rules;
			}

			pricetype = '';
			if ( typeof rules === 'object' ) {
				if ( current_variation in rules ) {
					price = rules[ current_variation ];
					original_price = original_rules[ current_variation ];
				} else {
					_rules = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rules' ) );
					_original_rules = element.closest( '.tmcp-ul-wrap' ).data( 'original-rules' );

					if ( typeof _rules === 'object' ) {
						if ( current_variation in _rules ) {
							price = _rules[ current_variation ];
						} else {
							price = rules[ 0 ];
						}
					} else {
						price = rules[ 0 ];
					}

					if ( typeof _original_rules === 'object' ) {
						if ( current_variation in _original_rules ) {
							original_price = _original_rules[ current_variation ];
						} else {
							original_price = original_rules[ 0 ];
						}
					} else {
						original_price = original_rules[ 0 ];
					}
				}

				if ( typeof rulestype === 'object' ) {
					if ( current_variation in rulestype ) {
						pricetype = rulestype[ current_variation ];
					} else {
						_rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rulestype' ) );
						if ( typeof _rulestype === 'object' ) {
							if ( current_variation in _rulestype ) {
								pricetype = _rulestype[ current_variation ];
							} else {
								pricetype = rulestype[ 0 ];
							}
						} else {
							pricetype = rulestype[ 0 ];
						}
					}
				} else {
					rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-ulestype' ) );
					if ( typeof rulestype === 'object' ) {
						if ( current_variation in rulestype ) {
							pricetype = rulestype[ current_variation ];
						} else {
							pricetype = rulestype[ 0 ];
						}
					}
				}
			} else {
				_tmcpulwrap = element.closest( '.tmcp-ul-wrap' );
				rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rules' ) );
				original_rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-original-rules' ) );

				if ( typeof rules === 'object' ) {
					if ( current_variation in rules ) {
						price = rules[ current_variation ];
					} else {
						price = rules[ 0 ];
					}
					if ( typeof original_rules === 'object' ) {
						if ( current_variation in original_rules ) {
							original_price = original_rules[ current_variation ];
						} else {
							original_price = original_rules[ 0 ];
						}
					} else {
						original_price = price;
					}

					if ( typeof rulestype === 'object' ) {
						if ( current_variation in rulestype ) {
							pricetype = rulestype[ current_variation ];
						} else {
							_rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) );
							if ( typeof _rulestype === 'object' ) {
								if ( current_variation in _rulestype ) {
									pricetype = _rulestype[ current_variation ];
								} else {
									pricetype = rulestype[ 0 ];
								}
							} else {
								pricetype = rulestype[ 0 ];
							}
						}
					} else {
						rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) );
						if ( typeof rulestype === 'object' ) {
							if ( current_variation in rulestype ) {
								pricetype = rulestype[ current_variation ];
							} else {
								pricetype = rulestype[ 0 ];
							}
						}
					}
				}
			}

			if ( typeof pricetype === 'object' ) {
				pricetype = pricetype[ 0 ];
			}
			if ( element.is( '.tmcp-fee-field' ) ) {
				if ( $.inArray( pricetype, [ 'fee', 'stepfee', 'currentstepfee' ] ) !== -1 ) {
					pricetype = '';
				}
				apply_dpd = 0;
			}

			if ( noremove === undefined ) {
				if ( element.is( 'select' ) ) {
					element.find( 'option' ).removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' );
				} else {
					setter.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' );
				}
			}
			if ( pricetype !== 'math' ) {
				price = cleanPrice( price );
				original_price = cleanPrice( original_price );
			} else if ( typeof price === 'object' ) {
				price = price[ 0 ];
			}

			undiscounted_raw_price = price;
			undiscounted_raw_original_price = original_price;

			switch ( pricetype ) {
				case '':
					undiscounted_price = price;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd );
					// original_price No change
					break;
				case 'math':
					price = calculateMathPrice( price, element, epoObject, manthnoevent, $.epoAPI.applyFilter( 'tc_use_undiscounted_price', undefined, element, cart, epoTotalsContainer ), funcTotal, cumulativeTotal, mathskip );
					undiscounted_price = price;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd );
					original_price = calculateMathPrice( original_price, element, epoObject, true, true, funcTotal, cumulativeTotal, mathskip );
					// original_price No other change
					break;
				case 'percent_cart_total':
					cart_total = parseFloat( TMEPOJS.cart_total );

					if ( ! Number.isFinite( cart_total ) ) {
						cart_total = 0;
					}
					undiscounted_price = ( price / 100 ) * cart_total;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * cart_total;
					original_price = ( tm_apply_dpd( original_price, epoTotalsContainer, apply_dpd ) / 100 ) * cart_total;
					break;

				case 'percent':
					undiscounted_price = ( price / 100 ) * product_price;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price;
					original_price = ( original_price / 100 ) * product_original_price;
					break;
				case 'percentcurrenttotal':
					$.tcepo.lateFieldsPrices[ epoEventId ].push( {
						setter: setter,
						price: price,
						original_price: original_price,
						bundleid: bundleid,
						pricetype: pricetype
					} );
					setter.data( 'tm-price-for-late', price ).data( 'tm-original-price-for-late', original_price ).data( 'islate', 1 ).addClass( 'tm-epo-late-field' );
					undiscounted_price = 0;
					price = 0;
					original_price = 0;
					break;
				case 'fixedcurrenttotal':
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd );
					$.tcepo.lateFieldsPrices[ epoEventId ].push( {
						setter: setter,
						price: price,
						original_price: original_price,
						bundleid: bundleid,
						pricetype: pricetype
					} );
					setter.data( 'tm-price-for-late', price ).data( 'tm-original-price-for-late', original_price ).data( 'islate', 1 ).addClass( 'tm-epo-late-field' );
					undiscounted_price = 0;
					price = 0;
					original_price = 0;
					break;
				case 'word':
					undiscounted_price = price * wordLength( setter.val() );
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * wordLength( setter.val() );
					original_price = original_price * wordLength( setter.val() );
					break;
				case 'wordpercent':
					undiscounted_price = ( price / 100 ) * product_price * wordLength( setter.val() );
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * wordLength( setter.val() );
					original_price = ( original_price / 100 ) * product_original_price * wordLength( setter.val() );
					break;
				case 'wordnon':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = wordLength( setter.val() ) - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = price * textlength;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength;
					original_price = original_price * textlength;
					break;
				case 'wordpercentnon':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = wordLength( setter.val() ) - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = ( price / 100 ) * product_price * textlength;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength;
					original_price = ( original_price / 100 ) * product_original_price * textlength;
					break;

				case 'char':
					undiscounted_price = price * setter.val().length;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val().length;
					original_price = original_price * setter.val().length;
					break;
				case 'charpercent':
					undiscounted_price = ( price / 100 ) * product_price * setter.val().length;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * setter.val().length;
					original_price = ( original_price / 100 ) * product_original_price * setter.val().length;
					break;
				case 'charnospaces':
					undiscounted_price = price * setter.val().replace( /\s/g, '' ).length;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val().replace( /\s/g, '' ).length;
					original_price = original_price * setter.val().replace( /\s/g, '' ).length;
					break;
				case 'charnofirst':
					textlength = setter.val().length - 1;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = price * textlength;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength;
					original_price = original_price * textlength;
					break;

				case 'charnon':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = setter.val().length - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = price * textlength;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength;
					original_price = original_price * textlength;
					break;
				case 'charpercentnon':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = setter.val().length - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = ( price / 100 ) * product_price * textlength;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength;
					original_price = ( original_price / 100 ) * product_original_price * textlength;
					break;
				case 'charnonnospaces':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = setter.val().replace( /\s/g, '' ).length - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = price * textlength;
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength;
					original_price = original_price * textlength;
					break;
				case 'charpercentnonnospaces':
					freechars = parseInt( setter.attr( 'data-freechars' ), 10 );
					if ( ! Number.isFinite( freechars ) ) {
						freechars = 0;
					}
					textlength = setter.val().replace( /\s/g, '' ).length - freechars;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = ( price / 100 ) * product_price * textlength;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength;
					original_price = ( original_price / 100 ) * product_original_price * textlength;
					break;

				case 'charpercentnofirst':
					textlength = setter.val().length - 1;
					if ( textlength < 0 ) {
						textlength = 0;
					}
					undiscounted_price = ( price / 100 ) * product_price * textlength;
					price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength;
					original_price = ( original_price / 100 ) * product_original_price * textlength;
					break;
				case 'step':
					if ( is_range_field ) {
						undiscounted_price = price * setter.val();
						price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val();
						original_price = original_price * $.epoAPI.math.toFloat( setter.val() );
					} else {
						undiscounted_price = price * $.epoAPI.math.toFloat( setter.val() );
						price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * $.epoAPI.math.toFloat( setter.val() );
						original_price = original_price * $.epoAPI.math.toFloat( setter.val() );
					}
					break;
				case 'currentstep':
					if ( is_range_field ) {
						undiscounted_price = setter.val();
						price = tm_apply_dpd( setter.val(), epoTotalsContainer, apply_dpd );
						original_price = tm_apply_dpd( setter.val(), epoTotalsContainer, apply_dpd );
					} else {
						undiscounted_price = $.epoAPI.math.toFloat( setter.val() );
						price = tm_apply_dpd( $.epoAPI.math.toFloat( setter.val() ), epoTotalsContainer, apply_dpd );
						original_price = tm_apply_dpd( $.epoAPI.math.toFloat( setter.val() ), epoTotalsContainer, apply_dpd );
					}
					break;
				case 'intervalstep':
					if ( is_range_field ) {
						min_value = parseFloat( $( '.tm-range-picker[data-field-id="' + setter.attr( 'id' ) + '"]' ).attr( 'data-min' ) );
						undiscounted_price = price * ( setter.val() - min_value );
						price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * ( setter.val() - min_value );
						original_price = original_price * ( setter.val() - min_value );
					}
					break;
				case 'row':
					undiscounted_price = price * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 );
					price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 );
					original_price = original_price * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 );
					break;
			}

			raw_price = price;
			raw_original_price = original_price;

			undiscounted_original_price = original_price;
			undiscounted_raw_price = undiscounted_price;
			undiscounted_raw_original_price = undiscounted_original_price;

			if ( element.data( 'tm-quantity' ) ) {
				undiscounted_price = undiscounted_price * parseFloat( element.data( 'tm-quantity' ) );
				undiscounted_original_price = undiscounted_original_price * parseFloat( element.data( 'tm-quantity' ) );
				undiscounted_raw_price = undiscounted_raw_price * parseFloat( element.data( 'tm-quantity' ) );
				undiscounted_raw_original_price = undiscounted_raw_original_price * parseFloat( element.data( 'tm-quantity' ) );

				price = price * parseFloat( element.data( 'tm-quantity' ) );
				original_price = original_price * parseFloat( element.data( 'tm-quantity' ) );
				raw_price = raw_price * parseFloat( element.data( 'tm-quantity' ) );
				raw_original_price = raw_original_price * parseFloat( element.data( 'tm-quantity' ) );
			}

			addedPrice = addedPrice + parseFloat( price );
			originalAddedPrice = originalAddedPrice + parseFloat( original_price );

			formatted_price = tm_set_price( addedPrice, epoTotalsContainer, false, false, setter, pricetype );
			original_formatted_price = tm_set_price( originalAddedPrice, epoTotalsContainer, false, false, setter, pricetype );

			element.data( 'price_set', 1 );
			setter.data( 'price_set', 1 );

			setter.data( 'undiscounted_raw_price', undiscounted_raw_price );
			setter.data( 'undiscounted_raw_original_price', undiscounted_raw_original_price );
			setter.data( 'undiscounted_price', tm_set_tax_price( undiscounted_price, epoTotalsContainer, setter, pricetype ) );
			setter.data( 'undiscounted_original_price', tm_set_tax_price( undiscounted_original_price, epoTotalsContainer, setter, pricetype ) );

			setter.data( 'raw_price', raw_price );
			setter.data( 'raw_original_price', raw_original_price );
			setter.data( 'price', tm_set_tax_price( price, epoTotalsContainer, setter, pricetype ) );
			setter.data( 'original_price', tm_set_tax_price( original_price, epoTotalsContainer, setter, pricetype ) );

			if ( ! setter_override ) {
				if ( element.is( '.tc-epo-field-product' ) ) {
					isFilled = false;
					if ( element.is( 'select' ) ) {
						if ( element.val() !== '' ) {
							isFilled = true;
						}
					} else if ( ( element.is( ':checkbox' ) || element.is( ':radio' ) ) ) {
						if ( element.is( ':checked' ) ) {
							isFilled = true;
						}
					} else if ( element.val() !== '' ) {
						isFilled = true;
					}

					if ( ! isFilled ) {
						formatted_price = setter.data( 'price-html' );
						original_formatted_price = '';
					}
				}
				tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), addedPrice, formatted_price, originalAddedPrice, original_formatted_price );
				element.data( 'price-changed', 1 );
			}
		} );
	}

	function tm_epo_rules( epoObject, theCart ) {
		var all_carts;
		var variation_id_selector;
		var per_product_pricing = true;
		var current_variation;
		var bundleid;
		var epoContainer;
		var epoTotalsContainer;
		var apply_dpd;
		var rules;
		var original_rules;
		var price;
		var formatted_price;
		var original_price;
		var original_formatted_price;
		var product_price;
		var product_original_price;
		var all_fields;
		var active_fields;
		var args;
		var main_product = epoObject.main_product;
		var epoEventId = epoObject.epoEventId;
		var this_epo_container = epoObject.this_epo_container;
		var this_epo_totals_container = epoObject.this_epo_totals_container;

		if ( ! theCart ) {
			all_carts = main_product.find( '.cart' );
		} else {
			all_carts = theCart;
		}
		if ( all_carts.length <= 0 ) {
			return;
		}

		$.tcepo.lateFieldsPrices[ epoEventId ] = [];

		all_carts.toArray().forEach( function( cart ) {
			cart = $( cart );
			variation_id_selector = "input[name^='variation_id']";
			if ( cart.find( 'input.variation_id' ).length > 0 ) {
				variation_id_selector = 'input.variation_id';
			}

			if ( cart.data( 'per_product_pricing' ) !== undefined ) {
				per_product_pricing = cart.data( 'per_product_pricing' );
			}

			current_variation = cart.find( variation_id_selector ).val();
			bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, epoObject );

			// get current woocommerce variation
			if ( ! current_variation ) {
				current_variation = 0;
			}

			epoContainer = $.epoAPI.applyFilter( 'tc_get_epo_container', this_epo_container, cart, main_product, bundleid );
			epoTotalsContainer = $.epoAPI.applyFilter( 'tc_get_totals_container', this_epo_totals_container, cart, main_product, bundleid );

			// WooCommerce Dynamic Pricing & Discounts
			apply_dpd = epoTotalsContainer.data( 'fields-price-rules' );

			// set initial prices for all fields
			if ( ! epoContainer.data( 'tm_rules_init_done' ) ) {
				if ( epoTotalsContainer.data( 'force-quantity' ) ) {
					cart.find( tcAPI.qtySelector ).val( epoTotalsContainer.data( 'force-quantity' ) );
				}
				epoContainer.toArray().forEach( function( el ) {
					$( el ).closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ).data( 'tm-quantity', $( el ).val() );
				} );

				epoContainer
					.find( '.tmcp-attributes, .tmcp-elements' )
					.toArray()
					.forEach( function( element ) {
						element = $( element );
						rules = $.epoAPI.util.parseJSON( element.attr( 'data-rules' ) );
						original_rules = $.epoAPI.util.parseJSON( element.attr( 'data-original-rules' ) );

						// if rule doesn't exit then init an empty rule
						if ( typeof rules !== 'object' ) {
							rules = {
								0: '0'
							};
						}
						if ( typeof original_rules !== 'object' ) {
							original_rules = {
								0: '0'
							};
						}
						if ( typeof rules === 'object' ) {
							// we skip price validation test so that every field has at least a price of 0
							price = tm_apply_dpd( rules[ $.epoAPI.math.toFloat( current_variation ) ], epoTotalsContainer, apply_dpd );
							formatted_price = tm_set_price( price, epoTotalsContainer );
							original_price = tm_apply_dpd( original_rules[ $.epoAPI.math.toFloat( current_variation ) ], epoTotalsContainer, apply_dpd );
							original_formatted_price = tm_set_price( original_price, epoTotalsContainer );

							element
								.find( '.tmcp-field, .tmcp-fee-field ' )
								.toArray()
								.forEach( function( el ) {
									el = $( el );
									if ( per_product_pricing ) {
										if ( el.attr( 'data-no-price' ) === '1' ) {
											price = 0;
											original_price = 0;
										}
										el.data( 'raw_price', price );
										el.data( 'raw_original_price', original_price );

										el.data( 'price', tm_set_tax_price( price, epoTotalsContainer, el ) );
										el.data( 'original_price', tm_set_tax_price( original_price, epoTotalsContainer, el ) );

										tm_update_price( el.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), price, formatted_price, original_price, original_formatted_price );
									} else {
										el.data( 'price', 0 );
										el.data( 'original_price', 0 );
										el.closest( '.tmcp-field-wrap' ).find( '.amount' ).empty();
									}
								} );
						}
					} );
				epoContainer.data( 'tm_rules_init_done', 1 );
			}

			// skip specific field rules if per_product_pricing is false
			if ( ! per_product_pricing ) {
				return true;
			}

			product_price = tm_calculate_product_price( epoTotalsContainer );
			product_original_price = tm_calculate_product_regular_price( epoTotalsContainer );

			args = {
				cart: cart,
				current_variation: current_variation,
				bundleid: bundleid,
				epoTotalsContainer: epoTotalsContainer,
				product_price: product_price,
				product_original_price: product_original_price,
				apply_dpd: apply_dpd,
				per_product_pricing: per_product_pricing
			};

			all_fields = epoContainer.find( '.tmcp-field,.tmcp-sub-fee-field,.tmcp-fee-field' );
			if ( ! epoObject.is_associated ) {
				all_fields = all_fields.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-field,' + tcAPI.associatedEpoSelector + ' ' + '.tmcp-sub-fee-field,' + tcAPI.associatedEpoSelector + ' ' + '.tmcp-fee-field' );
			}
			active_fields = all_fields.filter( '.tcenabled' );

			// note: find a better way if any
			if ( ! $.tcepo.initialActivation[ epoEventId ] || ( active_fields.length === 0 && all_fields.length > 0 ) ) {
				all_fields.each( function() {
					field_is_active( $( this ) );
				} );

				$.tcepo.initialActivation[ epoEventId ] = true;
			}

			//  apply specific field rules
			all_fields.filter( '.tcenabled' ).each( function( index, element ) {
				tm_element_epo_rules( epoObject, element, args );
			} );

			all_fields.each( function( index, element ) {
				$( element ).on( 'tc_element_epo_rules', function() {
					tm_element_epo_rules( epoObject, element, args );
				} );
			} );
		} );
	}

	function add_late_fields_prices( epoObject, currentProductPrice, originalProductPrice, options_total, original_options_total, bid, _cart, applydpd ) {
		var total = 0;
		var originalTotal = 0;
		var totalFees = 0;
		var originalTotalFees = 0;
		var price;
		var originalPrice;
		var priceType;
		var setter;
		var id;
		var hidden;
		var bundleid;
		var realSetter;
		var productId;
		var epoId;
		var formattedPrice;
		var originalFormattedPrice;
		var epoEventId = epoObject.epoEventId;
		var taxPrice;
		var taxOriginalPrice;
		var hiddenName;
		var productPrice;
		var oProductPrice;
		var apply_dpd;

		if ( applydpd !== undefined ) {
			apply_dpd = applydpd;
		} else {
			apply_dpd = epoObject.this_epo_totals_container.data( 'fields-price-rules' );
		}
		productPrice = currentProductPrice;
		oProductPrice = originalProductPrice;

		$.tcepo.lateFieldsPrices[ epoEventId ].forEach( function( field ) {
			price = field.price;
			originalPrice = field.original_price;
			priceType = field.pricetype;
			setter = field.setter;
			bundleid = field.bundleid;
			realSetter = setter;

			if ( priceType === 'percentcurrenttotal' ) {
				hiddenName = '_hidden';
			} else {
				hiddenName = '_hiddenfixed';
			}

			if ( setter.is( 'option' ) ) {
				realSetter = setter.closest( 'select' );
			}

			productPrice = parseFloat( $.epoAPI.applyFilter( 'tc_alter_product_price', productPrice, realSetter, _cart, epoObject.this_epo_totals_container, bid ) );
			oProductPrice = parseFloat( $.epoAPI.applyFilter( 'tc_alter_original_product_price', oProductPrice, realSetter, _cart, epoObject.this_epo_totals_container, bid ) );

			id = $.epoAPI.dom.id( realSetter.attr( 'name' ) );
			productId = $( '.tc-totals-form.tm-totals-form-' + _cart.attr( 'data-cart-id' ) ).attr( 'data-product-id' );
			epoId = $( '.tc-totals-form.tm-totals-form-' + _cart.attr( 'data-cart-id' ) ).attr( 'data-epo-id' );
			//workaround to support composite products
			hidden = $( '.tc-extra-product-options.tm-product-id-' + productId + "[data-epo-id='" + epoId + "']" ).find( '#' + id + hiddenName );

			if ( bundleid === bid ) {
				if ( priceType === 'percentcurrenttotal' ) {
					price = ( parseFloat( price ) / 100 ) * ( tm_apply_dpd( parseFloat( productPrice ), epoObject.this_epo_totals_container, apply_dpd ) + parseFloat( options_total ) );
					originalPrice = ( parseFloat( originalPrice ) / 100 ) * ( parseFloat( oProductPrice ) + parseFloat( original_options_total ) );
				} else if ( priceType === 'fixedcurrenttotal' ) {
					price = parseFloat( price ) + parseFloat( options_total );
					originalPrice = parseFloat( originalPrice ) + parseFloat( original_options_total );
				}
				if ( realSetter.data( 'tm-quantity' ) ) {
					price = price * parseFloat( realSetter.data( 'tm-quantity' ) );
					originalPrice = originalPrice * parseFloat( realSetter.data( 'tm-quantity' ) );
				}

				if ( setter.data( 'isset' ) === 1 && field_is_active( setter ) ) {
					if ( realSetter.is( '.tmcp-field' ) ) {
						total = total + price;
						originalTotal = originalTotal + originalPrice;
					} else if ( realSetter.is( '.tmcp-fee-field' ) ) {
						totalFees = totalFees + price;
						originalTotalFees = originalTotalFees + originalPrice;
					}
				}

				taxPrice = tm_set_tax_price( price, _cart, setter );
				taxOriginalPrice = tm_set_tax_price( originalPrice, _cart, setter );

				formattedPrice = tm_set_price( price, _cart, false, false, setter );
				originalFormattedPrice = tm_set_price( originalPrice, _cart, false, false, setter );
				setter.data( 'price', taxPrice );
				setter.data( 'pricew', taxPrice );
				setter.data( 'original_price', taxOriginalPrice );
				setter.data( 'original_pricew', taxOriginalPrice );

				tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), taxPrice, formattedPrice, taxOriginalPrice, originalFormattedPrice );

				if ( hidden.length === 0 ) {
					realSetter.before( '<input type="hidden" id="' + id + hiddenName + '" name="' + id + hiddenName + '" value="' + tm_set_price_without_tax( price, _cart ) + '">' );
				}
				if ( setter.is( '.tm-epo-field.tmcp-radio' ) ) {
					if ( setter.is( ':checked' ) ) {
						hidden.val( tm_set_price_without_tax( price, _cart ) );
					}
				} else {
					hidden.val( tm_set_price_without_tax( price, _cart ) );
				}
			} else if ( setter.data( 'pricew' ) !== undefined ) {
				formattedPrice = tm_set_price( setter.data( 'pricew' ), _cart, true, false, setter );
				originalFormattedPrice = '';

				if ( setter.data( 'original_pricew' ) !== undefined ) {
					originalFormattedPrice = tm_set_price( setter.data( 'original_pricew' ), _cart, true, false, setter );
				}

				tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), setter.data( 'pricew' ), formattedPrice, setter.data( 'original_pricew' ), originalFormattedPrice );
			}
		} );

		return {
			normal: [ total, originalTotal ],
			fees: [ totalFees, originalTotalFees ]
		};
	}

	function tm_lazyload() {
		var container;

		if ( TMEPOJS.tm_epo_no_lazy_load === 'yes' ) {
			return;
		}

		if ( tmLazyloadContainer ) {
			container = $( tmLazyloadContainer ).find( 'img.tmlazy' );
		} else {
			container = $( '.tc-extra-product-options img.tmlazy' );
		}

		container.lazyLoadXT();
		container.on( 'lazyshow', function() {
			jWindow.trigger( 'lazyLoadXToncomplete' );
		} );
	}

	function tm_css_styles( obj ) {
		var slider;
		var $cart;

		if ( ! obj ) {
			return;
		}

		$cart = $( '.cart' );

		obj.find( '.tm-owl-slider-section' ).each( function() {
			slider = $( this );

			slider.find( '.tc-slider-content' ).addClass( 'tm-owl-slider' );

			slider = slider.find( '.tm-owl-slider' );

			slider
				.addClass( 'tcowl-carousel-show' )
				.addClass( 'tcowl-carousel' )
				.on( 'changed.owl.carousel', function() {
					$cart.css( 'display', 'block' ).addClass( 'slider-setup' );
				} )
				.tmowlCarousel( Object.assign( {
					rtl: TMEPOJS.isRTL === '1',
					dots: false,
					nav: true,
					items: 1,
					autoHeight: true,
					mouseDrag: false,
					touchDrag: true,
					navText: [ TMEPOJS.i18n_prev_text, TMEPOJS.i18n_next_text ],
					navClass: [ 'owl-prev button', 'owl-next button' ],
					navElement: 'a',
					loop: false,
					navRewind: false
				}, window.tmowlCarouselSettings || {} ) );

			slider.removeClass( 'tcowl-carousel-show' );
		} );

		if ( $.fn.tcTabs ) {
			obj.find( '.tc-tabs' ).tcTabs( {
				headers: 'tc-tab-headers',
				header: 'tab-header',
				dataopenattribute: 'data-tab',
				sortabletabs: false
			} );
		}
	}

	function repeaterAdd( el, elementInnerWrap ) {
		var cpf = elementInnerWrap.closest( '.cpf-element' );
		var maxRows = cpf.data( 'repeater-max-rows' );
		var repeater = elementInnerWrap.find( '.tc-repeater-element' );
		var rows = repeater.length;
		var repeaterLast = repeater.last();
		var repeaterLastUL = repeater.last().find( '.tmcp-ul-wrap' );
		var clone;
		var cloneUl;
		var originalId = el.data( 'tc-repeater-id' );
		var index = el.data( 'tc-repeater-init' );

		if ( maxRows ) {
			if ( rows >= maxRows ) {
				return false;
			}
		}

		if ( rows + 1 >= maxRows && el.is( '.tc-repeater-add' ) ) {
			el.closest( '.tc-repeater-wrap' ).addClass( 'tc-hidden' );
		}

		if ( repeaterLastUL.is( '.tm-element-ul-date, .tm-element-ul-time' ) ) {
			repeaterLastUL.find( '.tm-epo-field' ).tm_datepicker( 'destroy' );
			repeaterLastUL.find( '.tmcp-date-select' ).off();
		}
		if ( repeaterLastUL.is( '.tm-element-ul-color' ) ) {
			repeaterLastUL.find( '.tm-epo-field' ).spectrum( 'destroy' );
		}

		clone = repeaterLast.tcClone( true );

		clone.find( '.tm-epo-field' ).attr( 'id', function( i, value ) {
			return value.replace( /\_\d+$/g, '' ) + '_' + index;
		} );
		clone.find( '[data-for]' ).attr( 'data-for', function( i, value ) {
			return value.replace( /\_\d+$/g, '' ) + '_' + index;
		} );
		clone.find( '[for]' ).attr( 'for', function( i, value ) {
			return value.replace( /\_\d+$/g, '' ) + '_' + index;
		} );
		clone.find( '[data-field-id]' ).attr( 'data-field-id', function( i, value ) {
			return value.replace( /\_\d+$/g, '' ) + '_' + index;
		} );
		clone.find( '[data-tm-date]' ).attr( 'data-tm-date', function() {
			return originalId + '_' + index;
		} );
		clone.find( '.tm-epo-field' ).attr( 'name', function( i, value ) {
			return value.replace( /\[\d+\]/g, '[' + index + ']' );
		} );
		clone.find( '.tm-qty' ).attr( 'name', function( i, value ) {
			return value.replace( /\[\d+\]/g, '[' + index + ']' );
		} );
		clone.find( '.tmcp-date-select' ).attr( 'name', function( i, value ) {
			return value.replace( /\[\d+\]/g, '[' + index + ']' );
		} );
		clone.find( '.tmcp-date-select' ).attr( 'id', function( i, value ) {
			return originalId + '_' + index + '_' + value.substring( value.lastIndexOf( '_' ) + 1 );
		} );

		cloneUl = clone.find( '.tmcp-ul-wrap' );

		if ( elementInnerWrap.find( '.tc-repeater-element' ).length > 0 ) {
			elementInnerWrap.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' );
			clone.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' );
		}

		if ( cloneUl.is( '.tm-element-ul-checkbox' ) ) {
			clone.find( 'li.tmcp-field-wrap' ).removeClass( 'tc-active' );
			clone
				.find( '.tm-epo-field.tmcp-checkbox' )
				.prop( 'checked', false );
			clone
				.find( '.tm-epo-field.tmcp-checkbox' )
				.filter( function( i, x ) {
					return $.inArray( $( x ).val(), el.data( 'repeater-init-value' ) ) !== -1;
				} )
				.prop( 'checked', true )
				.closest( 'li.tmcp-field-wrap' ).addClass( 'tc-active' );
		} else if ( cloneUl.is( '.tm-element-ul-radio' ) ) {
			clone.find( 'li.tmcp-field-wrap' ).removeClass( 'tc-active' );
			clone
				.find( '.tm-epo-field.tmcp-radio' )
				.filter( function( i, x ) {
					return $( x ).val() === el.data( 'repeater-init-value' );
				} )
				.prop( 'checked', true )
				.closest( 'li.tmcp-field-wrap' ).addClass( 'tc-active' );
		} else {
			clone.find( '.tm-epo-field' ).val( el.data( 'repeater-init-value' ) );
		}

		if ( ! cloneUl.is( '.tm-element-ul-checkbox' ) && ! cloneUl.is( '.tm-element-ul-radio' ) ) {
			clone.find( '.tm-epo-field' ).val( el.data( 'repeater-init-value' ) );
		}

		el.data( 'tc-repeater-init', el.data( 'tc-repeater-init' ) + 1 );

		return [ clone, repeaterLast, repeaterLastUL ];
	}

	function repeaterAddAfter( epoObject, clone, repeaterLast, repeaterLastUL, doevents ) {
		var cloneUl = clone.find( '.tmcp-ul-wrap' );

		if ( cloneUl.is( '.tm-element-ul-range' ) ) {
			clone.find( '.tm-range-picker' ).removeData( 'tc-picker-init' ).attr( 'class', 'tm-range-picker' ).html( '' );
			setRangePickers( clone );
		}
		if ( cloneUl.is( '.tm-element-ul-date, .tm-element-ul-time' ) ) {
			tm_set_datepicker( repeaterLastUL );
			tm_set_datepicker( cloneUl );
		}
		if ( cloneUl.is( '.tm-element-ul-color' ) ) {
			tm_set_color_pickers( repeaterLastUL );
			tm_set_color_pickers( cloneUl );
		}
		clone.find( '.tm-tooltip' ).removeData( 'tctooltip' ).removeData( 'tm-has-tm-tip' );
		$.tcToolTip( clone.find( '.tm-tooltip' ) );

		//  apply specific field rules
		clone.find( '.tm-epo-field' )
			.removeData( 'addedtcEpoBeforeOptionPriceCalculation' )
			.each( function( y, elc ) {
				var element = $( elc );
				field_is_active( element, false, true );
				if ( element.is( '.tcenabled' ) ) {
					tm_element_epo_rules( epoObject, element );
				}
				element.on( 'tc_element_epo_rules', function() {
					tm_element_epo_rules( epoObject, element );
				} );
			} );
		if ( ! doevents ) {
			return;
		}
		if ( cloneUl.is( '.tm-element-ul-checkbox' ) ) {
			clone
				.find( '.tm-epo-field.tmcp-checkbox' )
				.filter( ':checked' )
				.trigger( 'change.cpf' );
		} else if ( cloneUl.is( '.tm-element-ul-radio' ) ) {
			clone
				.find( '.tm-epo-field.tmcp-radio' )
				.filter( ':checked' )
				.trigger( 'change.cpf' );
		} else {
			clone.find( '.tm-epo-field' ).trigger( 'change.cpf' );
		}
	}

	function repeaterDelete( elementInnerWrap, repeaterElement, repeaterObj, $this ) {
		var cpf = elementInnerWrap.closest( '.cpf-element' );
		var minRows = cpf.data( 'repeater-min-rows' );
		var rows = elementInnerWrap.find( '.tc-repeater-element' ).length;
		var repeaterElementIndex = repeaterElement.index();
		var message;

		if ( minRows ) {
			if ( rows <= minRows ) {
				if ( $this ) {
					message = '<div class="tm-error-repeater tm-error tc-cell tcwidth tcwidth-100">' + $.tc_validator.messages.repeaterminrows( minRows ) + '</div>';
					$this.tcToolTip( { tip: message, onetime: true, trigger: true, tipclass: 'tc-error' } );
				}
				return false;
			}
		}
		if ( rows === 1 ) {
			return;
		}
		if ( rows === 2 ) {
			elementInnerWrap.find( '.tc-repeater-delete' ).addClass( 'tc-hidden' );
		}
		if ( repeaterObj.is( '.tc-repeater-add' ) ) {
			repeaterObj.closest( '.tc-repeater-wrap' ).removeClass( 'tc-hidden' );
		}
		repeaterElement.remove();
		repeaterObj.data( 'tc-repeater-init', repeaterObj.data( 'tc-repeater-init' ) - 1 );
		if ( repeaterElementIndex + 1 === rows ) {
			return;
		}
		elementInnerWrap.find( '.tc-repeater-element' )
			.toArray()
			.forEach( function( clone, index ) {
				clone = $( clone );
				clone.find( '.tm-epo-field' ).attr( 'id', function( i, value ) {
					return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' );
				} );
				clone.find( '[data-for]' ).attr( 'data-for', function( i, value ) {
					return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' );
				} );
				clone.find( '[for]' ).attr( 'for', function( i, value ) {
					return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' );
				} );
				clone.find( '[data-field-id]' ).attr( 'data-field-id', function( i, value ) {
					return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' );
				} );
				clone.find( '[data-tm-date]' ).attr( 'data-tm-date', function( i, value ) {
					return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' );
				} );
				clone.find( '.tm-epo-field' ).attr( 'name', function( i, value ) {
					return value.replace( /\[\d+\]/g, '[' + index + ']' );
				} );
				clone.find( '.tm-qty' ).attr( 'name', function( i, value ) {
					return value.replace( /\[\d+\]/g, '[' + index + ']' );
				} );
				clone.find( '.tmcp-date-select' ).attr( 'name', function( i, value ) {
					return value.replace( /\[\d+\]/g, '[' + index + ']' );
				} );
			} );
	}

	function tm_set_repeaters( obj, epoObject ) {
		var currentCart;
		var qtyElement;
		var quantityRepeaters;
		if ( ! obj ) {
			return;
		}
		obj = $( obj );

		if ( obj.length ) {
			currentCart = epoObject.main_cart;
			qtyElement = getQtyElement( currentCart );
			qtyElement = $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantity', qtyElement, {
				epo: epoObject,
				currentCart: currentCart,
				obj: obj,
				qtyElement: qtyElement
			} );
			quantityRepeaters = obj.find( '.tc-repeater-quantity' );
			quantityRepeaters
				.toArray()
				.forEach( function( repeater, qx ) {
					var el = $( repeater );
					var tmEpoField;
					var repeaterElement;
					var length;

					if ( el.data( 'tc-repeater-init' ) ) {
						return;
					}
					repeaterElement = el.find( '.tc-repeater-element' );
					length = repeaterElement.length;
					tmEpoField = repeaterElement.first().find( '.tm-epo-field' );
					if ( tmEpoField.is( ':checkbox' ) ) {
						el.data( 'repeater-init-value',
							tmEpoField.filter( ':checked' ).toArray().map( function( x ) {
								return $( x ).val();
							} ) );
					} else if ( tmEpoField.is( ':radio' ) ) {
						el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).val() );
					} else {
						el.data( 'repeater-init-value', tmEpoField.val() );
					}
					el.data( 'tc-repeater-init', length );
					el.data( 'tc-repeater-id', tmEpoField.attr( 'id' ) );
					el.data( 'tc-repeater-name', tmEpoField.attr( 'name' ) );

					if ( qtyElement.length ) {
						qtyElement
							.off( 'change.r' + qx + 'cpf input.r' + qx + 'cpf' )
							.on( 'change.r' + qx + 'cpf input.r' + qx + 'cpf', function( event ) {
								var field = $( this );
								var prevValue = field.data( 'tm-prev-value' );
								var value = $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantityValue', field.val(), {
									epo: epoObject,
									currentCart: currentCart,
									obj: obj,
									qtyElement: qtyElement,
									field: field
								} );
								var difference = value - prevValue;
								var elementInnerWrap;
								var thisRepeaterElement;
								var i;
								var ele;
								var cloned;
								var repeaterLast;
								var repeaterLastUL;
								var fieldprevval;
								if ( prevValue === undefined ) {
									prevValue = value - 1;
									difference = value - prevValue;
								}
								if ( event.isTrigger !== undefined ) {
									prevValue = el.find( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length;
									difference = value - prevValue;
								}
								if ( difference === 0 ) {
									return;
								}
								elementInnerWrap = el.find( '.tc-element-inner-wrap' );
								fieldprevval = $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantity_tm-prev-value', field.val(), {
									epo: epoObject,
									currentCart: currentCart,
									obj: obj,
									qtyElement: qtyElement,
									field: field
								} );
								if ( fieldprevval <= 0 ) {
									fieldprevval = 1;
								}
								if ( qx === quantityRepeaters.length ) {
									field.data( 'tm-prev-value', fieldprevval );
								}
								if ( difference > 0 ) {
									thisRepeaterElement = elementInnerWrap.find( '.tc-repeater-element' ).eq( value - 1 );
									if ( thisRepeaterElement.length ) {
										return;
									}
									for ( i = 0; i < difference; i++ ) {
										cloned = repeaterAdd( el, elementInnerWrap );
										if ( cloned ) {
											if ( ele ) {
												ele = ele.add( cloned[ 0 ] );
											} else {
												ele = cloned[ 0 ];
											}
											if ( i === 0 ) {
												repeaterLast = cloned[ 1 ];
												repeaterLastUL = cloned[ 2 ];
											}
										}
									}
									if ( ele ) {
										ele.appendTo( elementInnerWrap.find( '.tc-element-container' ) );
										repeaterAddAfter( epoObject, ele, repeaterLast, repeaterLastUL );
									}
								} else {
									for ( i = value - difference; i > value; i -= 1 ) {
										thisRepeaterElement = elementInnerWrap.find( '.tc-repeater-element' ).eq( i - 1 );
										repeaterDelete( elementInnerWrap, thisRepeaterElement, el );
									}
								}
								currentCart.trigger( {
									type: 'tm-epo-update',
									norules: 2
								} );
							} );
						qtyElement.data( 'tm-prev-value', $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantityValue', qtyElement.val(), {
							epo: epoObject,
							currentCart: currentCart,
							obj: obj,
							qtyElement: qtyElement,
							field: qtyElement
						} ) ).trigger( 'change' );
					}
				} );

			obj.find( '.tc-repeater-add' )
				.toArray()
				.forEach( function( repeater ) {
					var el = $( repeater );
					var tmEpoField;
					var elementInnerWrap;
					var repeaterElement;
					var length;
					if ( el.data( 'tc-repeater-init' ) ) {
						return;
					}
					elementInnerWrap = el.closest( '.tc-element-inner-wrap' );
					repeaterElement = elementInnerWrap.find( '.tc-repeater-element' );
					length = repeaterElement.length;
					tmEpoField = repeaterElement.first().find( '.tm-epo-field' );
					if ( elementInnerWrap.find( '.tc-repeater-element' ).length > 1 ) {
						elementInnerWrap.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' );
					}
					if ( tmEpoField.is( ':checkbox' ) ) {
						el.data( 'repeater-init-value',
							tmEpoField.filter( ':checked' ).toArray().map( function( x ) {
								return $( x ).val();
							} ) );
					} else if ( tmEpoField.is( ':radio' ) ) {
						el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).val() );
					} else {
						el.data( 'repeater-init-value', tmEpoField.val() );
					}
					el.data( 'tc-repeater-init', length );
					el.data( 'tc-repeater-id', tmEpoField.attr( 'id' ) );
					el.data( 'tc-repeater-name', tmEpoField.attr( 'name' ) );

					el.on( 'click.repeater', function() {
						var ele = repeaterAdd( el, elementInnerWrap );
						if ( ele ) {
							ele[ 0 ].appendTo( elementInnerWrap.find( '.tc-element-container' ) );
							repeaterAddAfter( epoObject, ele[ 0 ], ele[ 1 ], ele[ 2 ], true );
						}
					} );
				} );

			obj.find( '.tc-repeater-delete .delete' ).on( 'click', function() {
				var $this = $( this );
				var elementInnerWrap = $this.closest( '.tc-element-inner-wrap' );
				var repeaterElement = $this.closest( '.tc-repeater-element' );
				repeaterDelete( elementInnerWrap, repeaterElement, elementInnerWrap.find( '.tc-repeater-add' ), $this );
			} );
		}
	}

	function tm_set_color_pickers( obj ) {
		if ( ! obj ) {
			return;
		}
		obj = $( obj ).find( '.tm-color-picker' );
		if ( obj.length ) {
			obj.spectrum( {
				type: 'color',
				theme: 'epo',
				showButtons: true,
				allowEmpty: true,
				showInitial: true,
				showInput: true,
				clickoutFiresChange: false,
				chooseText: TMEPOJS.closeText,
				cancelText: TMEPOJS.i18n_cancel
			} );
			obj.spectrum( 'enable' );
		}
	}

	function tm_set_lightbox( obj ) {
		if ( ! obj ) {
			return;
		}
		if ( $( obj ).length ) {
			// document ready
			$( function() {
				$( obj ).tclightbox();
			} );
		}
	}

	function has_active_changes_product_image( field ) {
		var uic = field.closest( '.tmcp-field-wrap' ).find( 'label img' );
		var src = $( uic ).first().attr( 'data-original' );

		if ( field.is( 'select.tm-product-image' ) ) {
			field = field.children( 'option:selected' );
		}

		if ( ! src ) {
			src = $( uic ).first().attr( 'src' );
		}
		if ( ! src ) {
			src = field.attr( 'data-image' );
		}
		if ( field.attr( 'data-imagep' ) ) {
			src = field.attr( 'data-imagep' );
		}
		if ( src ) {
			return true;
		}

		return false;
	}

	function tm_set_upload_fields( epoObject ) {
		var field;
		var dT;
		var name;
		var file;
		var selector = epoObject.is_associated
			? epoObject.this_epo_container.find( '.tm-epo-field.tmcp-upload' )
			: epoObject.this_epo_container.find( '.tm-epo-field.tmcp-upload' ).not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' );

		try {
			selector
				.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' )
				.toArray()
				.forEach( function( el ) {
					var dataFiles;
					var dataFilename;
					file = [];
					field = $( el );
					if ( field.attr( 'data-file' ) === '' ) {
						return false;
					}
					dataFiles = field.attr( 'data-file' ).split( '|' );
					if ( dataFiles.length === 0 ) {
						return false;
					}
					if ( ClipboardEvent || DataTransfer ) {
						dT = new ClipboardEvent( '' ).clipboardData || new DataTransfer();
					}
					dataFiles.forEach( function( dataFile ) {
						dataFilename = $.epoAPI.util.basename( dataFile );
						if ( ClipboardEvent || DataTransfer ) {
							dT.items.add( new File( [ dataFile ], dataFilename ) );
						}
						file.push( dataFile );
					} );
					if ( dT ) {
						el.files = dT.files;
					}
					file = file.join( '|' );
					name = field.attr( 'name' );
					field.trigger( 'tcupload' );
					field.after( '<input type="hidden" class="tmcp-upload-hidden" name="' + name + '" value="' + file + '">' );
					field.removeAttr( 'data-file' );
				} );
		} catch ( err ) {
			window.console.log( err );
			$( '.tm-epo-field.tmcp-upload' ).not( '.tm-multiple-file-upload' ).addClass( 'tc-nodt' );
			errorObject = err;
		}
	}

	function tm_set_upload_rules( epoObject ) {
		var epoEventId = epoObject.epoEventId;
		var this_epo_container = epoObject.this_epo_container;

		if ( TMEPOJS.tm_epo_upload_popup === 'yes' ) {
			$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
				trigger: function() {
					return true;
				},
				on_true: function() {
					var upload_fields = this_epo_container.data( 'num_uploads' );
					var thisPopup;
					var ajaxSuccessFunc;
					if ( upload_fields && Object.keys( upload_fields ).length ) {
						thisPopup = $.tcFloatBox( {
							fps: 1,
							ismodal: true,
							refresh: 'fixed',
							width: '50%',
							height: '300px',
							classname: 'flasho tc-wrapper',
							data: $.epoAPI.template.html( tcAPI.templateEngine.tc_upload_messages, {
								files: upload_fields,
								title: TMEPOJS.i18n_uploading_files,
								message: TMEPOJS.i18n_uploading_message
							} )
						} );
						ajaxSuccessFunc = function() {
							thisPopup.destroy();
							jDocument.off( 'ajaxSuccess', ajaxSuccessFunc );
						};
						jDocument.on( 'ajaxSuccess', ajaxSuccessFunc );
					}

					return true;
				},
				on_false: function() {
					return true;
				}
			};
		}
	}

	function tm_set_checkboxes_rules( epoObject ) {
		var this_epo_container = epoObject.this_epo_container;
		var main_product = epoObject.main_product;
		var epoEventId = epoObject.epoEventId;
		var limit_cont = this_epo_container.find( '.tm-limit' );
		var exactlimit_cont = this_epo_container.find( '.tm-exactlimit' );
		var minimumlimit_cont = this_epo_container.find( '.tm-minimumlimit' );

		// Limit checkbox selection
		this_epo_container.on( 'change.cpflimit', 'input.tm-epo-field.tmcp-checkbox', function() {
			var $this = $( this );
			tm_limit_c_selection( $this, true );
			tm_exact_c_selection( $this, true );
		} );
		if ( limit_cont.length ) {
			tm_check_limit_cont( limit_cont, main_product, epoEventId );
		}

		// Exact value checkbox check (Todo:check for isvisible)
		if ( exactlimit_cont.length ) {
			tm_check_exactlimit_cont( exactlimit_cont, main_product, epoEventId );
		}

		// Minimum number checkbox check (Todo:check for isvisible)
		if ( minimumlimit_cont.length ) {
			tm_check_minimumlimit_cont( minimumlimit_cont, epoEventId );
		}
	}

	function tm_theme_specific_actions( epoObject ) {
		var this_epo_container = epoObject.this_epo_container;
		var theme_name = TMEPOJS.theme_name;
		var all_epo_selects;
		var blaszok_selects;

		if ( theme_name ) {
			theme_name = theme_name.toLowerCase();
			all_epo_selects = this_epo_container.find( 'select' );

			switch ( theme_name ) {
				case 'flatsome':
				case 'flatsome-child':
				case 'flatsome child':
					all_epo_selects.wrap( '<div class="custom select-wrapper"/>' );
					break;

				case 'avada':
				case 'avada-child':
				case 'avada child':
					all_epo_selects.wrap( '<div class="avada-select-parent tm-select-parent"></div>' );
					$( '<div class="select-arrow">&#xe61f;</div>' ).appendTo( this_epo_container.find( '.tm-select-parent' ) );
					if ( window.calc_select_arrow_dimensions ) {
						window.calc_select_arrow_dimensions();
						jWindow.on( 'tmsectionpoplink cpflogicdone', function() {
							window.calc_select_arrow_dimensions();
						} );
					} else if ( window.calcSelectArrowDimensions ) {
						window.calcSelectArrowDimensions();
						jWindow.on( 'tmsectionpoplink cpflogicdone', function() {
							window.calcSelectArrowDimensions();
						} );
					}
					break;

				case 'bazar':
				case 'bazar-child':
				case 'bazar child':
					all_epo_selects.wrap( '<div class="tm-select-wrapper select-wrapper"/>' );
					break;

				case 'blaszok':
				case 'blaszok-child':
				case 'blaszok child':
					blaszok_selects = function() {
						setTimeout( function() {
							$( '.tm-extra-product-options select' )
								.not( '.hasCustomSelect' )
								.filter( ':visible' )
								.each( function() {
									if ( ! $( this ).is( '.mpcthSelect' ) ) {
										$( this ).width( $( this ).outerWidth() );
										$( this ).customSelect( { customClass: 'mpcthSelect' } );
									}
								} );
						}, 100 );
					};
					jWindow.on( 'cpflogicrun', function() {
						blaszok_selects();
					} );
					jWindow.on( 'epo_options_visible', function() {
						blaszok_selects();
					} );

					break;

				case 'handmade':
				case 'handmade child theme':
					$( '.tm-owl-slider.tcowl-carousel' ).addClass( 'manual' );
					break;
			}

			jWindow.trigger( 'tm-theme-specific-actions', {
				epo: {
					theme_name: theme_name,
					all_epo_selects: all_epo_selects
				}
			} );
		}

		// Fix added +/- quantity button on most themes.
		jDocument.off( 'click.cpf', '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus' ).on( 'click.cpf', '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus', function() {
			$( this ).closest( '.quantity' ).find( tcAPI.qtySelector ).trigger( 'change.cpf' );
		} );
	}

	function tm_custom_variations( epoObject, form, item_id, $main_product, $epo_holder ) {
		var epoEventId = epoObject.epoEventId;
		var variation_id_selector = "input[name^='variation_id']";
		var tm_epo_variation_section;
		var li_variations;
		var composite_load_test;
		var form_event;
		var type;
		var name;
		var selector;
		var func;
		var i;
		var eventName = epoObject.is_associated ? 'tc_variation_form.tmlogic' : 'wc_variation_form.tmlogic';
		var eventNamePrefix = epoObject.is_associated ? 'tc_' : '';
		var variationsForm = epoObject.variations_form;
		var variationsTable = epoObject.is_associated ? variationsForm.find( '.tc-epo-element-variations' ) : variationsForm.find( '.variations' );
		var resetSelector = epoObject.is_associated ? '.tc-epo-element-variable-reset-variations' : '.reset_variations';

		variationsForm.attr( 'data-epo_id', epoObject.epo_id );

		if ( form.find( 'input.variation_id' ).length > 0 ) {
			variation_id_selector = 'input.variation_id';
		}
		if ( $epo_holder.find( '.tm-epo-variation-element' ).length || $epo_holder.data( 'tm-epo-variation-element' ) ) {
			tm_epo_variation_section = $epo_holder.find( '.tm-epo-variation-section' ).first();
			tm_epo_variation_section.find( '.cpf-type-variations' ).attr( 'data-epo_id', epoObject.epo_id ).attr( 'data-product_id', variationsForm.attr( 'data-product_id' ) );

			$epo_holder.data( 'tm-epo-variation-element', tm_epo_variation_section.find( '.tm-epo-variation-element' ) );

			if ( item_id && item_id !== 'main' && ! epoObject.is_associated ) {
				// on composite

				variationsForm = epoObject.form;
				variationsTable = variationsForm.find( '.composite_component[data-item_id="' + item_id + '"]' ).find( '.variations' );
				variationsForm.attr( 'data-epo_id', epoObject.epo_id );

				if ( variationsTable.length === 0 ) {
					return;
				}

				li_variations = tm_epo_variation_section.closest( 'li.tm-extra-product-options-field' );
				if ( ! tm_epo_variation_section.is( '.tm-hidden' ) ) {
					variationsTable.hide();
				}

				variationsTable.after( tm_epo_variation_section.addClass( 'tm-extra-product-options nopadding' ) );
				if ( li_variations.is( ':empty' ) ) {
					li_variations.hide();
				}

				if ( ! tm_epo_variation_section.is( '.section_popup' ) ) {
					tm_epo_variation_section.removeClass( 'tc-cell' );
					tm_epo_variation_section.wrap( "<div class='tc-styled-variations'></div>" );
				} else {
					tm_epo_variation_section.wrap( "<div class='tc-styled-variations tc-row'></div>" );
				}

				composite_load_test = false;
				form.off( eventName ).on( eventName, function() {
					composite_load_test = true;
					variationsForm.on( 'click.tmlogic', '.reset_variations', function() {
						tm_epo_variation_section.find( 'select.tm-epo-variation-element' ).val( '' ).children( 'option' ).prop( 'disabled', false ).show();
						tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ).removeClass( 'tm-disabled' ).prop( 'checked', false ).closest( 'li' ).show();
						jWindow.trigger( 'tmlazy' );
						tm_epo_variation_section.find( '.tm-epo-variation-element' ).trigger( 'tm_trigger_product_image' );
						tm_epo_variation_section.find( 'li' ).removeClass( 'tc-active tm-attribute-disabled' ).css( 'opacity', '' );
					} );

					// Disable option fields that are unavaiable for current set of attributes
					form.off( 'woocommerce_update_variation_values_tmlogic' ).on( 'woocommerce_update_variation_values_tmlogic', function() {
						tm_custom_variations_update( form, epoObject );
					} );
					for ( i = 0; i < lateVariationEvent.length; i += 1 ) {
						form_event = lateVariationEvent[ i ];
						type = typeof form_event;
						if ( type === 'object' ) {
							name = typeof form_event.name === 'string' || false;
							selector = typeof form_event.selector === 'string' || false;
							func = typeof form_event.func === 'function' || false;
							if ( name && func ) {
								if ( selector === "input[name='variation_id']" ) {
									selector = variation_id_selector;
								}
								if ( form_event.selector ) {
									form.data( 'tm-styled-variations', 1 )
										.off( eventNamePrefix + form_event.name + i, selector )
										.on( eventNamePrefix + form_event.name + i, selector, form_event.func );
								} else {
									form.data( 'tm-styled-variations', 1 )
										.off( eventNamePrefix + form_event.name + i )
										.on( eventNamePrefix + form_event.name + i, form_event.func );
								}
							}
						}
					}
					lateVariationEvent = [];
					tm_epo_variation_section.find( '.tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)' ).last().trigger( 'tm_epo_variation_element_change' );
				} );
				// document ready
				$( function() {
					if ( composite_load_test === false ) {
						form.trigger( eventName );
					}
				} );
			} else {
				if ( tm_epo_variation_section.length ) {
					if ( ! tm_epo_variation_section.is( '.tm-hidden' ) ) {
						variationsTable.hide();
					}

					li_variations = tm_epo_variation_section.closest( 'li.tm-extra-product-options-field' );

					variationsTable.after( tm_epo_variation_section.addClass( 'tm-extra-product-options nopadding' ) );
					if ( li_variations.is( ':empty' ) ) {
						li_variations.hide();
					}

					if ( ! tm_epo_variation_section.is( '.section_popup' ) ) {
						tm_epo_variation_section.removeClass( 'tc-cell' );
						tm_epo_variation_section.wrap( "<div class='tc-styled-variations'></div>" );
					} else {
						tm_epo_variation_section.wrap( "<div class='tc-styled-variations tc-row'></div>" );
					}

					variationsForm.off( 'click.tmlogic', resetSelector ).on( 'click.tmlogic', resetSelector, function() {
						tm_epo_variation_section.find( 'select.tm-epo-variation-element' ).val( '' ).children( 'option' ).prop( 'disabled', false ).show();
						tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ).removeClass( 'tm-disabled' ).prop( 'checked', false ).closest( 'li' ).show();
						jWindow.trigger( 'tmlazy' );
						tm_epo_variation_section.find( '.tm-epo-variation-element' ).trigger( 'tm_trigger_product_image' );
						tm_epo_variation_section.find( 'li' ).removeClass( 'tc-active tm-attribute-disabled' ).css( 'opacity', '' );
					} );
				}

				// Disable option fields that are unavaiable for current set of attributes
				variationsForm.off( 'woocommerce_update_variation_values_tmlogic' ).on( 'woocommerce_update_variation_values_tmlogic', function() {
					tm_custom_variations_update( variationsForm, epoObject );
				} );

				for ( i = 0; i < lateVariationEvent.length; i += 1 ) {
					form_event = lateVariationEvent[ i ];
					type = typeof form_event;
					if ( type === 'object' ) {
						name = typeof form_event.name === 'string' || false;
						selector = typeof form_event.selector === 'string' || false;
						func = typeof form_event.func === 'function' || false;
						if ( name && func ) {
							if ( selector === "input[name='variation_id']" ) {
								selector = variation_id_selector;
							}
							if ( form_event.selector ) {
								variationsForm
									.data( 'tm-styled-variations', 1 )
									.off( eventNamePrefix + form_event.name + i, selector )
									.on( eventNamePrefix + form_event.name + i, selector, form_event.func );
							} else {
								variationsForm
									.data( 'tm-styled-variations', 1 )
									.off( eventNamePrefix + form_event.name + i )
									.on( eventNamePrefix + form_event.name + i, form_event.func );
							}
						}
					}
				}
				lateVariationEvent = [];
				tm_epo_variation_section.find( '.tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)' ).last().trigger( 'tm_epo_variation_element_change' );
			}

			// global event for custom variations
			$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
				trigger: function() {
					return true;
				},
				on_true: function() {
					tm_epo_variation_section.find( '.tm-epo-variation-element' ).attr( 'disabled', 'disabled' );
					return true;
				},
				on_false: function() {
					tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false );
				}
			};

			$( document.body ).on( 'added_to_cart', function() {
				tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false );
			} );
		}
	}

	function repopulate_backup_image_atts( img, product_element ) {
		var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' );
		var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' );
		var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 );
		var $product_img = img;
		var $product_link = img.closest( 'a' );

		$product_img.attr( 'data-o_' + 'src', $.tc_product_image_store[ 0 ].src );
		$product_img.attr( 'data-o_' + 'srcset', $.tc_product_image_store[ 0 ].srcset );
		$product_img.attr( 'data-o_' + 'sizes', $.tc_product_image_store[ 0 ].sizes );
		$product_img.attr( 'data-o_' + 'title', $.tc_product_image_store[ 0 ].title );
		$product_img.attr( 'data-o_' + 'alt', $.tc_product_image_store[ 0 ].alt );
		$product_img.attr( 'data-o_' + 'data-src', $.tc_product_image_store[ 0 ][ 'data-src' ] );
		$product_img.attr( 'data-o_' + 'data-large_image', $.tc_product_image_store[ 0 ][ 'data-large_image' ] );
		$product_img.attr( 'data-o_' + 'data-large_image_width', $.tc_product_image_store[ 0 ][ 'data-large_image_width' ] );
		$product_img.attr( 'data-o_' + 'data-large_image_height', $.tc_product_image_store[ 0 ][ 'data-large_image_height' ] );
		$product_img_wrap.attr( 'data-o_' + 'data-thumb', $.tc_product_image_store[ 1 ][ 'data-thumb' ] );
		if ( $.tc_product_image_store[ 2 ] ) {
			$gallery_img.attr( 'data-o_' + 'src', $.tc_product_image_store[ 2 ].src );
		}

		$product_link.attr( 'data-o_' + 'href', $.tc_product_image_store[ 3 ].href );
		$product_link.attr( 'data-o_' + 'title', $.tc_product_image_store[ 3 ].title );
	}

	function reset_saved_image( img, product_element ) {
		var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' );
		var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' );
		var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 );
		var $product_img = img;
		var $product_link = img.closest( 'a' );

		// backup current product image attributes
		if ( ! $.isEmptyObject( $.tc_product_image ) ) {
			$.tc_product_image_store = $.tc_pre_populate_store();
			$.tc_product_image_store = $.tc_maybe_copy_object_values( $.tc_product_image_store, $.tc_product_image );
		} else {
			$.tc_product_image_store = $.tc_populate_store( img, product_element );
		}

		$product_img.tc_update_attr( 'src', 0 );
		$product_img.tc_update_attr( 'srcset', 0 );
		$product_img.tc_update_attr( 'sizes', 0 );
		$product_img.tc_update_attr( 'title', 0 );
		$product_img.tc_update_attr( 'alt', 0 );
		$product_img.tc_update_attr( 'data-src', 0 );
		$product_img.tc_update_attr( 'data-large_image', 0 );
		$product_img.tc_update_attr( 'data-large_image_width', 0 );
		$product_img.tc_update_attr( 'data-large_image_height', 0 );
		$product_img_wrap.tc_update_attr( 'data-thumb', 1 );
		$gallery_img.tc_update_attr( 'src', 2 );

		$product_link.tc_update_attr( 'href', 3 );
		$product_link.tc_update_attr( 'title', 3 );
	}

	function image_update( data, img, product_element ) {
		var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' );
		var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' );
		var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 );
		var $product_img = img;
		var $product_link = img.closest( 'a' );
		var $img_zoom = $product_link.next( '.zoomImg' );

		if ( data && data.image_link && data.image_link && data.image_link.length > 1 ) {
			if ( data.full_src === null || data.full_src === '' ) {
				data.full_src = data.image_link;
			}
			if ( data.full_src_w === null || data.full_src_w === '' ) {
				data.full_src_w = $product_img.attr( 'data-large_image_width' );
			}
			if ( data.full_src_h === null || data.full_src_h === '' ) {
				data.full_src_h = $product_img.attr( 'data-large_image_height' );
			}
			if ( $product_img.length ) {
				if ( ! data.image_srcset ) {
					data.image_sizes = false;
				}
				if ( ! data.image_sizes ) {
					data.image_srcset = false;
				}
				$product_img.tc_set_attr( 'src', data.image_link, 0 );
				$product_img.tc_set_attr( 'srcset', data.image_srcset, 0 );
				$product_img.tc_set_attr( 'sizes', data.image_sizes, 0 );
				$product_img.tc_set_attr( 'title', data.image_title, 0 );
				$product_img.tc_set_attr( 'alt', data.image_alt, 0 );
				$product_img.tc_set_attr( 'data-src', data.full_src, 0 );
				$product_img.tc_set_attr( 'data-large_image', data.full_src, 0 );
				$product_img.tc_set_attr( 'data-large_image_width', data.full_src_w, 0 );
				$product_img.tc_set_attr( 'data-large_image_height', data.full_src_h, 0 );
				$product_img_wrap.tc_set_attr( 'data-thumb', data.image_link, 1 );
			}
			if ( $gallery_img.length ) {
				$gallery_img.tc_set_attr( 'src', data.image_link, 2 );
			}
			if ( $product_link.length ) {
				$product_link.tc_set_attr( 'href', data.full_src, 3 );
				$product_link.tc_set_attr( 'title', data.image_caption, 3 );
			}
			if ( $img_zoom.length ) {
				$img_zoom.tc_set_attr( 'src', data.full_src, 4 );
			}
		} else {
			if ( $product_img.length ) {
				$product_img.tc_reset_attr( 'src', 0 );
				$product_img.tc_reset_attr( 'srcset', 0 );
				$product_img.tc_reset_attr( 'sizes', 0 );
				$product_img.tc_reset_attr( 'title', 0 );
				$product_img.tc_reset_attr( 'alt', 0 );
				$product_img.tc_reset_attr( 'data-src', 0 );
				$product_img.tc_reset_attr( 'data-large_image', 0 );
				$product_img.tc_reset_attr( 'data-large_image_width', 0 );
				$product_img.tc_reset_attr( 'data-large_image_height', 0 );
				$product_img_wrap.tc_reset_attr( 'data-thumb', 1 );
			}
			if ( $gallery_img.length ) {
				$gallery_img.tc_reset_attr( 'src', 2 );
			}
			if ( $product_link.length ) {
				$product_link.tc_reset_attr( 'href', 3 );
				$product_link.tc_reset_attr( 'title', 3 );
			}
			if ( $img_zoom.length ) {
				$img_zoom.tc_reset_attr( 'src', 4 );
			}
		}
	}

	function get_main_product_image( epoObject, product_element ) {
		var img;

		if ( epoObject.is_associated ) {
			img = product_element.find( '.tc-product-image .wp-post-image' ).first();
		} else if ( TMEPOJS.tm_epo_global_product_image_selector !== '' ) {
			img = $( TMEPOJS.tm_epo_global_product_image_selector );
		} else {
			img = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();
			if ( img.length === 0 ) {
				img = product_element.find( 'a.woocommerce-main-image img, img.woocommerce-main-image,a img' ).not( '.thumbnails img,.product_list_widget img' ).first();
			}
			if ( img.length === 0 ) {
				img = product_element.find( 'img.wp-post-image' ).not( '.thumbnails img,.product_list_widget img' ).first();
			}
			if ( img.length === 0 ) {
				img = product_element.find( '.elementor-widget-wd_single_product_gallery img.wp-post-image' ).first();
			}
			if ( img.length === 0 ) {
				img = product_element.find( '.elementor-widget-ae-post-image .wp-post-image' ).first();
			}
			if ( img.length === 0 ) {
				img = $( '.woocommerce div.product div.images' ).not( '.thumbnails img,.product_list_widget img' ).first();
			}
		}

		if ( $( img ).length > 1 ) {
			img = $( img ).first();
		}

		return img;
	}

	function get_product_element( epoObject ) {
		var main_product;
		var product_id;
		var product_element;

		if ( epoObject.is_associated ) {
			return epoObject.main_product.closest( '.tc-epo-element-product-container' );
		}

		main_product = epoObject.main_product;
		product_id = epoObject.product_id;
		product_element = main_product.closest( '#product-' + product_id );

		if ( product_element.length <= 0 ) {
			product_element = main_product.closest( '.post-' + product_id );
		}

		return product_element;
	}

	function gallery_compatibility_actions( gallery_type, clone_image, preload_img, visible, event_data, $form, product_element ) {
		var gallery;
		var _elements;
		var ge;
		var galleryWidth;
		var zoomEnabled;
		var image;
		var zoom_options;

		for ( gallery in gallery_type ) {
			if ( Object.prototype.hasOwnProperty.call( gallery_type, gallery ) ) {
				gallery = gallery_type[ gallery ];

				if ( gallery.enabled ) {
					switch ( gallery.type ) {
						case 'yith':
							if ( ! clone_image ) {
								if ( ! visible ) {
									gallery.yith_wcmg_zoom.attr( 'href', gallery._yith_wcmg_default_zoom );
								} else {
									gallery.yith_wcmg_zoom.attr( 'href', gallery.yith_wcmg_default_zoom );
								}
								if ( gallery.element.data( 'yith_magnifier' ) ) {
									gallery.element.yith_magnifier( 'destroy' );
								}

								gallery.element.yith_magnifier( window.yith_magnifier_options );
							} else {
								clone_image.attr( 'srcset', preload_img ).attr( 'src-orig', preload_img );

								if ( gallery.element.data( 'yith_magnifier' ) ) {
									gallery.element.yith_magnifier( 'destroy' );
								}
								_elements = {
									elements: {
										zoom: $( '.yith_magnifier_zoom' ),
										zoomImage: clone_image,
										gallery: $( '.yith_magnifier_gallery li a' )
									}
								};

								gallery.element.yith_magnifier( $.extend( true, {}, window.yith_magnifier_options, _elements ) );
							}
							break;
						case 'iosslider':
							setTimeout(
								function( g ) {
									g.element.iosSlider( 'update' );
								}.bind( null, gallery ),
								150
							);
							break;
						case 'flexslider':
							jWindow.trigger( 'resize' );
							break;
						case 'elevatezoom':
							gallery.element.each(
								function( g, j ) {
									var elevateZoom = j( this ).data( 'elevateZoom' );
									if ( typeof elevateZoom !== 'undefined' ) {
										elevateZoom.swaptheimage( g, g );
									}
								}.bind( null, preload_img, $ )
							);
							break;
						case 'easyzoom':
							gallery.element.swap( null, preload_img );
							break;
						case 'easyzoom-flatsome':
							gallery.element.swap( preload_img, preload_img );
							break;
						case 'woocommerce':
							if ( clone_image ) {
								gallery.element.flexslider( 0 );
								gallery.element.trigger( 'woocommerce_gallery_reset_slide_position' );
								ge = gallery.element;
								window.setTimeout(
									function( g, w ) {
										g.trigger( 'woocommerce_gallery_init_zoom' );
										w.trigger( 'resize' );
									}.bind( null, ge, jWindow ),
									10
								);
							}
							break;
						case 'zoom':
							if ( product_element ) {
								galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width();
								zoomEnabled = false;

								image = gallery.element.find( 'img.wp-post-image' );
								if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {
									zoomEnabled = true;
								}

								if ( zoomEnabled ) {
									zoom_options = {
										touch: false
									};
									if ( 'ontouchstart' in window ) {
										zoom_options.on = 'click';
									}

									gallery.element.trigger( 'zoom.destroy' );
									gallery.element.zoom( zoom_options );
								} else {
									gallery.element.trigger( 'zoom.destroy' );
								}
							}
							break;
					}
				}
			}
		}

		jWindow.trigger( 'tm_gallery_compatibility_actions', {
			event_data: event_data,
			product_element: product_element,
			form: $form
		} );
	}

	function get_gallery_type( epoObject, img, product_element ) {
		// YITH WooCommerce Zoom Magnifier
		var is_yith_wcmg;
		var yith_wcmg;
		var yith_wcmg_zoom;
		var yith_wcmg_default_zoom;
		var _yith_wcmg_default_zoom;
		var yith_wcmg_default_image;

		// iosslider - Touch Enabled, Responsive jQuery Horizontal Content
		// Slider/Carousel/Image Gallery Plugin
		var is_iosSlider;
		var is_iosSlider_element;

		// ThemeFusion flexslider
		var is_flexslider;
		var is_flexslider_element;

		// elevateZoom A Jquery Image Zoom Plugin
		var is_elevateZoom;
		var is_elevateZoom_obj;

		// EasyZoom jQuery image zoom plugin
		var is_easyzoom;
		var is_easyzoom_element;

		// new flatsome easyzoom
		var is_easyzoom_flatsome;
		var is_easyzoom_flatsome_element;

		// WooCommerce 2.7x gallery
		var is_wc27_gallery;
		var is_wc27_gallery_element;
		var wc27_zoom_target;
		var wc_single_product_params;
		var zoom_target_temp;

		// fn.zoom
		var is_zoom_enabled;
		var zoom_images;
		var gallery;

		if ( epoObject.is_associated ) {
			return {};
		}

		// YITH WooCommerce Zoom Magnifier
		is_yith_wcmg = false;
		yith_wcmg = $( '.images' );
		yith_wcmg_zoom = $( '.yith_magnifier_zoom' );
		yith_wcmg_default_zoom = yith_wcmg.find( '.yith_magnifier_zoom' ).first().attr( 'href' );
		_yith_wcmg_default_zoom = yith_wcmg_default_zoom;
		yith_wcmg_default_image = yith_wcmg.find( '.yith_magnifier_zoom img' ).first().attr( 'src' );

		// iosslider - Touch Enabled, Responsive jQuery Horizontal Content
		// Slider/Carousel/Image Gallery Plugin
		is_iosSlider = false;
		is_iosSlider_element = $( '.iosSlider.product-gallery-slider,.iosSlider.product-slider' );

		// ThemeFusion flexslider
		is_flexslider = false;
		is_flexslider_element = product_element.find( '.images .fusion-flexslider' );

		// elevateZoom A Jquery Image Zoom Plugin
		is_elevateZoom = img.data( 'elevateZoom' ) || false;
		is_elevateZoom_obj = product_element.find( 'div.product-images .woocommerce-main-image' );

		// EasyZoom jQuery image zoom plugin
		is_easyzoom = false;
		is_easyzoom_element = product_element.find( '.images .easyzoom' );

		// new flatsome easyzoom
		is_easyzoom_flatsome = false;
		is_easyzoom_flatsome_element = product_element.find( '.images .easyzoom' );

		// WooCommerce 2.7x gallery
		is_wc27_gallery = false;
		is_wc27_gallery_element = product_element.find( '.woocommerce-product-gallery' );
		wc27_zoom_target = false;
		wc_single_product_params = window.wc_single_product_params;

		// fn.zoom
		is_zoom_enabled = typeof $.fn.zoom === 'function' && wc_single_product_params && wc_single_product_params.zoom_enabled;
		zoom_images = false;

		if ( window.yith_magnifier_options && yith_wcmg.data( 'yith_magnifier' ) ) {
			is_yith_wcmg = true;
		}

		if ( is_iosSlider_element.length && is_iosSlider_element.iosSlider ) {
			is_iosSlider = true;
		}

		if ( is_flexslider_element.length && is_flexslider_element.flexslider ) {
			is_flexslider = true;
		}

		if ( is_easyzoom_element.length && is_easyzoom_element.filter( '.images .easyzoom.first' ).data( 'easyZoom' ) ) {
			is_easyzoom_element = is_easyzoom_element.filter( '.images .easyzoom.first' ).data( 'easyZoom' );
			is_easyzoom = true;
		}

		if ( ! is_easyzoom ) {
			is_easyzoom_flatsome_element = product_element.find( '.images .has-image-zoom .slide' );
			if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.filter( '.images .has-image-zoom .slide.first' ).data( 'easyZoom' ) ) {
				is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.filter( '.images .has-image-zoom .slide.first' ).data( 'easyZoom' );
				is_easyzoom_flatsome = true;
			}
		}

		if ( document.readyState === 'complete' ) {
			setTimeout( function() {
				if ( is_easyzoom_element.length && is_easyzoom_element.data( 'easyZoom' ) ) {
					is_easyzoom_element = is_easyzoom_element.data( 'easyZoom' );
					is_easyzoom = true;
				}
				if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.data( 'easyZoom' ) ) {
					is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.data( 'easyZoom' );
					is_easyzoom_flatsome = true;
				}
			}, 150 );
		} else {
			jWindow.on( 'load', function() {
				setTimeout( function() {
					if ( is_easyzoom_element.length && is_easyzoom_element.data( 'easyZoom' ) ) {
						is_easyzoom_element = is_easyzoom_element.data( 'easyZoom' );
						is_easyzoom = true;
					}
					if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.data( 'easyZoom' ) ) {
						is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.data( 'easyZoom' );
						is_easyzoom_flatsome = true;
					}
				}, 150 );
			} );
		}

		if ( is_wc27_gallery_element.length && is_wc27_gallery_element.data( 'flexslider' ) ) {
			is_wc27_gallery = true;

			if ( typeof $.fn.zoom === 'function' && wc_single_product_params && wc_single_product_params.zoom_enabled ) {
				zoom_target_temp = img.closest( '.woocommerce-product-gallery__image' );

				if ( zoom_target_temp.length > 0 && img.width() > $( '.woocommerce-product-gallery' ).width() ) {
					wc27_zoom_target = zoom_target_temp;
					img.data.wc27_zoom_target = wc27_zoom_target;
				}
			}
		}

		if ( ! is_wc27_gallery && is_zoom_enabled ) {
			zoom_images = product_element.find( '.woocommerce-product-gallery__image' );
		}

		gallery = {
			is_yith_wcmg: {
				type: 'yith',
				enabled: is_yith_wcmg,
				element: yith_wcmg,
				yith_wcmg_zoom: yith_wcmg_zoom,
				_yith_wcmg_default_zoom: _yith_wcmg_default_zoom,
				yith_wcmg_default_image: yith_wcmg_default_image
			},
			is_iosSlider: {
				type: 'iosslider',
				enabled: is_iosSlider,
				element: is_iosSlider_element
			},
			is_flexslider: {
				type: 'flexslider',
				enabled: is_flexslider,
				element: is_flexslider_element
			},
			is_elevateZoom: {
				type: 'elevatezoom',
				enabled: is_elevateZoom,
				element: is_elevateZoom_obj
			},
			is_easyzoom: {
				type: 'easyzoom',
				enabled: is_easyzoom,
				element: is_easyzoom_element
			},
			is_easyzoom_flatsome: {
				type: 'easyzoom-flatsome',
				enabled: is_easyzoom_flatsome,
				element: is_easyzoom_flatsome_element
			},
			is_wc27_gallery: {
				type: 'woocommerce',
				enabled: is_wc27_gallery,
				element: is_wc27_gallery_element
			},
			is_zoom_enabled: {
				type: 'zoom',
				enabled: ! is_wc27_gallery && is_zoom_enabled,
				element: zoom_images
			}
		};

		return gallery;
	}

	function tm_product_image_self( epoObject ) {
		var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector );
		var variationsForm = epoObject.variations_form;
		var main_product = epoObject.main_product;
		var $form = epoObject.form;
		var img;
		var gallery_type;
		var product_element = get_product_element( epoObject );
		var last_active_field = [];
		var t;
		var el;
		var el_current;
		var imp;
		var selector;
		var eventNamePrefix = epoObject.is_associated ? 'tc_' : '';
		// This currently has a limitation that it doesn't work if there is variation active onload.
		var main_tc_product_image_store;

		img = get_main_product_image( epoObject, product_element );
		gallery_type = get_gallery_type( epoObject, img, product_element );

		if ( $( img ).length > 0 ) {
			$form.on( eventNamePrefix + 'reset_image.tcpi', function() {
				setTimeout( function() {
					if ( TMEPOJS.tm_epo_global_image_recalculate === 'yes' ) {
						img = get_main_product_image( epoObject, product_element );
						$.tc_product_image_store = main_tc_product_image_store;
					}
					// restore product image atts from backup
					$.tc_product_image = $.tc_replace_object_values( $.tc_product_image, $.tc_product_image_store );

					last_active_field = [];

					$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
						.add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
						.each( function() {
							t = $( this );
							if ( field_is_active( t ) && t.val() !== '' ) {
								last_active_field.push( t );
							}
						} );
					if ( last_active_field.length ) {
						last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' );
					} else {
						$.tc_product_image_store = $.tc_populate_store( img, product_element );
					}
				}, window.tc_epo_product_image_change_delay || 0 );
			} );

			$form.on( eventNamePrefix + 'found_variation.tcpi', function() {
				setTimeout( function() {
					if ( TMEPOJS.tm_epo_global_image_recalculate === 'yes' ) {
						img = get_main_product_image( epoObject, product_element );
					}
					reset_saved_image( img, product_element );

					last_active_field = [];
					$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
						.add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
						.each( function() {
							t = $( this );
							if ( field_is_active( t ) && t.val() !== '' ) {
								last_active_field.push( t );
							}
						} );
					if ( last_active_field.length ) {
						repopulate_backup_image_atts( img, product_element );
						last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' );
					}
				}, window.tc_epo_product_image_change_delay || 0 );
			} );

			$.tc_product_image_store = $.tc_maybe_copy_object_values_from_img( $.tc_product_image_store, img, product_element );
			main_tc_product_image_store = $.epoAPI.util.deepCopyArray( $.tc_product_image_store );

			main_product.off( 'tm_change_product_image' ).on( 'tm_change_product_image', function( evt, event_data ) {
				var data;
				evt.stopImmediatePropagation();

				el = event_data.element;
				el_current = event_data.element_current;
				if ( el && el_current ) {
					imp = el.data( 'imagep' );
					selector = '';
					if ( imp !== '' ) {
						selector = 'imagep';
					} else if ( el.data( 'changes-product-image' ) === 'images' ) {
						selector = 'image';
					}
					data = event_data.element_current.data( 'image-variations' );

					if ( data ) {
						data = data[ selector ];
					}

					if ( data === undefined ) {
						// Enter the following if you want to restore the original product image
						// main_product.trigger( 'tm_restore_product_image', event_data );
						return;
					}

					last_active_field = [];
					$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
						.add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
						.each( function() {
							t = $( this );
							if ( t.is( 'option' ) ) {
								t = t.closest( 'select' );
							}
							if ( field_is_active( t ) && t.val() !== '' ) {
								last_active_field.push( t );
							}
						} );

					if ( last_active_field.length ) {
						if ( ! last_active_field[ last_active_field.length - 1 ].is( el ) ) {
							return;
						}
					}

					setTimeout( function() {
						if ( TMEPOJS.tm_epo_global_image_recalculate === 'yes' ) {
							img = get_main_product_image( epoObject, product_element );
						}
						image_update( data, img, product_element );
						gallery_compatibility_actions( gallery_type, img, data.image_link, false, event_data, $form, product_element );
					}, window.tc_epo_product_image_change_delay || 0 );
				}
			} );

			main_product.off( 'tm_restore_product_image' ).on( 'tm_restore_product_image', function( evt, event_data ) {
				evt.stopImmediatePropagation();

				el = event_data ? event_data.element : false;
				last_active_field = [];

				if ( el ) {
					$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
						.add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
						.each( function() {
							t = $( this );
							if ( field_is_active( t ) && t.val() !== '' ) {
								last_active_field.push( t );
							}
						} );
					if ( last_active_field.length ) {
						if ( ! last_active_field[ last_active_field.length - 1 ].is( el ) ) {
							last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' );
							return;
						}
					}
				}

				image_update( false, img, product_element );
				gallery_compatibility_actions( gallery_type, false, img.attr( 'src' ), false, event_data, $form, product_element );
			} );

			last_active_field = [];
			$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
				.add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
				.each( function() {
					t = $( this );
					if ( field_is_active( t ) && t.val() !== '' ) {
						last_active_field.push( t );
					}
				} );
			if ( last_active_field.length ) {
				last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' );
			}
		}

		jWindow.trigger( 'tm_product_image_loaded' );
	}

	function tm_product_image_inline( epoObject ) {
		var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector );
		var main_product = epoObject.main_product;
		var product_id = epoObject.product_id;
		var $form = epoObject.form;
		var img;
		var product_element = get_product_element( epoObject );
		var gallery_type;
		var a;
		var img_src_original;
		var img_width;
		var img_height;
		var last_active_field = [];
		var t;

		img = get_main_product_image( epoObject, product_element );

		gallery_type = get_gallery_type( epoObject, img, product_element );

		if ( $( img ).length > 0 ) {
			img.data( 'tm-current-image', false );
			a = img.closest( 'a' );
			img_src_original = img.attr( 'src' );
			img_width = img.width();
			img_height = img.height();

			main_product.off( 'tm_change_product_image' ).on( 'tm_change_product_image', function( evt, e ) {
				var variation_element_section;
				var is_variation_element;
				var $this_epo_container;
				var tm_last_visible_image_element;
				var last_activate_field = [];
				var tm_current_image_element_id;
				var can_show_image;
				var $main_product;
				var $current_product_element;
				var preload_width;
				var preload_height;
				var current_cloned_image;
				var preloader;
				var clone_image;
				var preload_img;
				var preload_img_onerror;

				variation_element_section = e.element.closest( '.cpf-section' );
				is_variation_element = variation_element_section.is( '.tm-epo-variation-section' );
				$this_epo_container = e.epo_holder;
				if ( is_variation_element ) {
					$this_epo_container = variation_element_section;
				}
				tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' );
				last_activate_field = [];
				tm_current_image_element_id = e.element.attr( 'id' );
				can_show_image = true;
				$main_product = e.main_product;
				$current_product_element = $main_product.closest( '#product-' + product_id );
				preload_width = img_width;
				preload_height = img_height;
				preloader = $( "<div class='blockUI blockOverlay tm-preloader-img'></div>" );

				if ( $current_product_element.length <= 0 ) {
					$current_product_element = $main_product.closest( '.post-' + product_id );
				}

				current_cloned_image = $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' );
				if ( current_cloned_image.length === 0 ) {
					current_cloned_image = img;
				}

				preload_img_onerror = function() {
					preloader.remove();
					$form.tc_image_update( false );
					img.data( 'tm-current-image', false );
					$current_product_element.find( '.tm-clone-product-image' ).hide();
					img.show();
				};

				if ( e.src === current_cloned_image.attr( 'src' ) && current_cloned_image.is( ':visible' ) ) {
					return;
				}

				if ( e.src === false ) {
					preload_img_onerror();
					return;
				}

				preloader.css( {
					width: preload_width,
					height: preload_height
				} );

				// Get last active field
				tm_last_visible_image_element.each( function() {
					t = $( this );
					if (
						field_is_active( t ) &&
						has_active_changes_product_image( t ) &&
						tm_check_field_match( {
							element: t.closest( '.cpf-element' ),
							operator: 'isnotempty',
							value: ''
						} )
					) {
						last_activate_field.push( t );
					}
				} );
				// Get last active image
				if ( last_activate_field.length ) {
					tm_last_visible_image_element = last_activate_field[ last_activate_field.length - 1 ];
				}

				if ( tm_last_visible_image_element.attr( 'id' ) !== e.element.attr( 'id' ) ) {
					can_show_image = false;
				}

				clone_image = img.tcClone();
				preload_img = new Image();
				clone_image.removeAttr( 'data-o_src' ).removeAttr( 'data-o_title' ).removeAttr( 'data-o_alt' ).removeAttr( 'data-o_srcset' ).removeAttr( 'data-o_sizes' ).removeAttr( 'srcset' ).removeAttr( 'sizes' );

				if ( can_show_image ) {
					img.before( preloader );
				}

				gallery_type.is_yith_wcmg.yith_wcmg_default_zoom = gallery_type.is_yith_wcmg.element.find( '.yith_magnifier_zoom' ).first().attr( 'href' );
				gallery_type.is_yith_wcmg.yith_wcmg_default_image = gallery_type.is_yith_wcmg.element.find( '.yith_magnifier_zoom img' ).first().attr( 'src' );

				preload_img.onerror = function() {
					preload_img_onerror();
				};

				preload_img.onload = function() {
					if ( 'naturalHeight' in this ) {
						if ( this.naturalHeight + this.naturalWidth === 0 ) {
							this.onerror();
							return;
						}
					} else if ( this.width + this.height === 0 ) {
						this.onerror();
						return;
					}
					$current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove();
					$current_product_element.find( '.tm-clone-product-image' ).hide();
					clone_image.prop( 'src', preload_img.src ).hide();

					img.hide().after( clone_image );

					clone_image.css( 'opacity', 0 ).show();

					gallery_compatibility_actions( gallery_type, clone_image, preload_img.src );

					preloader.animate(
						{
							opacity: 0
						},
						750,
						'easeOutExpo',
						function() {
							preloader.remove();
						}
					);
					clone_image.animate(
						{
							opacity: 1
						},
						window.tc_epo_image_animation_delay || 1500,
						'easeOutExpo',
						function() {}
					);

					jWindow.trigger( 'tm_change_product_image_loaded', {
						src: e.src,
						element: e.element,
						main_product: e.main_product,
						epo_holder: e.epo_holder
					} );
				};

				clone_image
					.attr( 'id', tm_current_image_element_id + '_tmimage' )
					.addClass( 'tm-clone-product-image' )
					.hide();

				if ( clone_image.attr( 'src-orig' ) ) {
					clone_image.attr( 'src-orig', e.src );
				}

				if ( can_show_image ) {
					preload_img.src = e.src;

					$form.tc_image_update( e.element, clone_image );

					img.data( 'tm-current-image', tm_current_image_element_id );

					jWindow.trigger( 'tm_change_product_image_show', {
						src: e.src,
						element: e.element,
						main_product: e.main_product,
						epo_holder: e.epo_holder
					} );
				} else {
					clone_image.prop( 'src', e.src ).hide();
					img.after( clone_image );
				}

				jWindow.trigger( 'tm_change_product_image_end', {
					src: e.src,
					element: e.element,
					main_product: e.main_product,
					epo_holder: e.epo_holder
				} );
			} );

			main_product.off( 'tm_restore_product_image' ).on( 'tm_restore_product_image', function( evt, e ) {
				var tm_current_image_element_id;
				var $main_product;
				var $current_product_element;
				var variation_element_section;
				var is_variation_element;
				var current_element;
				var current_image_replacement;
				var found;
				var is_it_visible;
				var len;
				var el_to_check;
				var imgSrc;
				var $this_epo_container;
				var i;

				if ( ! e || ! e.element ) {
					return false;
				}

				jWindow.trigger( 'tm_restore_product_image_pre', {
					element: e.element,
					main_product: e.main_product,
					epo_holder: e.epo_holder
				} );
				tm_current_image_element_id = e.element.attr( 'id' );
				$main_product = e.main_product;
				$current_product_element = $main_product.closest( '#product-' + product_id );
				variation_element_section = e.element.closest( '.cpf-section' );
				is_variation_element = variation_element_section.is( '.tm-epo-variation-section' );
				found = false;
				imgSrc = img_src_original;
				$this_epo_container = e.epo_holder;
				if ( is_variation_element ) {
					$this_epo_container = variation_element_section;
				}

				if ( $current_product_element.length <= 0 ) {
					$current_product_element = $main_product.closest( '.post-' + product_id );
				}

				is_it_visible = $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).is( ':visible' );

				$current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove();

				if ( $current_product_element.find( '.tm-clone-product-image' ).length === 0 ) {
					img.show();
					img.data( 'tm-current-image', false );
					$form.tc_image_update( false );
				} else {
					if ( ! is_it_visible ) {
						jWindow.trigger( 'tm_restore_product_image_loaded_exit', {
							element: e.element,
							main_product: e.main_product,
							epo_holder: e.epo_holder
						} );
						return;
					}

					len = $current_product_element.find( '.tm-clone-product-image' ).length;
					tm_current_image_element_id = img.data( 'tm-current-image' );

					for ( i = len - 1; i >= 0; i -= 1 ) {
						current_image_replacement = $current_product_element.find( '.tm-clone-product-image' ).eq( i );
						current_element = current_image_replacement.attr( 'id' ).replace( '_tmimage', '' );
						el_to_check = $this_epo_container.find( "[id='" + current_element + "']" );

						if ( el_to_check.is( ':checked' ) && el_to_check.closest( '.cpf-element' ).is( ':visible' ) ) {
							$current_product_element.find( '.tm-clone-product-image' ).eq( i ).show();
							a.attr( 'href', $current_product_element.find( '.tm-clone-product-image' ).eq( i ).prop( 'src' ) );
							img.data( 'tm-current-image', current_element );
							found = true;
							break;
						} else {
							$current_product_element.find( '.tm-clone-product-image' ).eq( i ).hide();
						}
					}
					if ( ! found ) {
						img.show();
						img.data( 'tm-current-image', false );
						$form.tc_image_update( false );
					} else {
						$current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove();
					}
				}

				if ( found ) {
					imgSrc = current_image_replacement.attr( 'src' );
				}

				gallery_compatibility_actions( gallery_type, false, imgSrc, $current_product_element.find( '.tm-clone-product-image' ).filter( ':visible' ).length );

				jWindow.trigger( 'tm_restore_product_image_loaded', {
					element: e.element,
					main_product: e.main_product,
					epo_holder: e.epo_holder
				} );
			} );

			main_product.off( 'tm_attempt_product_image' ).on( 'tm_attempt_product_image', function( evt, e ) {
				var $main_product;
				var $current_product_element;
				var variation_element_section;
				var is_variation_element;
				var $this_epo_container;
				var tm_last_visible_image_element;
				var last_activate_field;
				var tm_last_visible_image_element_id;
				var current_image_replacement;
				var current_element;
				var found;
				var tm_current_image_element_id;
				var len;
				var imgSrc;
				var el_to_check;
				var tmcie_id;
				var i;

				$main_product = e.main_product;
				$current_product_element = $main_product.closest( '#product-' + product_id );
				if ( e.element ) {
					variation_element_section = e.element.closest( '.cpf-section' );
				} else {
					variation_element_section = $( $main_product.find( '.tm-epo-variation-section' ).first(), e.epo_holder );
				}
				is_variation_element = variation_element_section.is( '.tm-epo-variation-section' );
				$this_epo_container = e.epo_holder;
				if ( is_variation_element ) {
					$this_epo_container = variation_element_section;
				}
				tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' );
				last_activate_field = [];
				tm_last_visible_image_element_id = '';
				found = false;
				tm_current_image_element_id = img.data( 'tm-current-image' );
				imgSrc = img_src_original;

				if ( $current_product_element.length <= 0 ) {
					$current_product_element = $main_product.closest( '.post-' + product_id );
				}

				$this_epo_container = $main_product.find( '.tm-epo-variation-section' ).first().add( e.epo_holder );
				tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' );

				tm_last_visible_image_element.each( function() {
					t = $( this );
					if (
						field_is_active( t ) &&
						has_active_changes_product_image( t ) &&
						tm_check_field_match( {
							element: t.closest( '.cpf-element' ),
							operator: 'isnotempty',
							value: ''
						} )
					) {
						last_activate_field.push( t );
					}
				} );

				if ( last_activate_field.length ) {
					tm_last_visible_image_element = last_activate_field[ last_activate_field.length - 1 ];
					tm_last_visible_image_element_id = tm_last_visible_image_element.attr( 'id' );
				}

				if ( last_activate_field.length && tm_last_visible_image_element.length && ( ! tm_current_image_element_id || tm_last_visible_image_element_id !== tm_current_image_element_id ) ) {
					tm_last_visible_image_element.last().trigger( 'tm_trigger_product_image' );
					return;
				}

				tmcie_id = $this_epo_container.find( "[id='" + tm_current_image_element_id + "']" ).closest( '.cpf-element' );
				if ( ! tm_current_image_element_id || ( tmcie_id.data( 'isactive' ) !== false && tmcie_id.closest( '.cpf-section' ).data( 'isactive' ) !== false ) ) {
					return;
				}

				$current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove();
				len = $current_product_element.find( '.tm-clone-product-image' ).length;

				if ( len === 0 ) {
					img.show();
					img.data( 'tm-current-image', false );
					$form.tc_image_update( false );
				} else {
					for ( i = len - 1; i >= 0; i -= 1 ) {
						current_image_replacement = $current_product_element.find( '.tm-clone-product-image' ).eq( i );
						current_element = current_image_replacement.attr( 'id' ).replace( '_tmimage', '' );
						el_to_check = $this_epo_container.find( "[id='" + current_element + "']" );

						if ( el_to_check.is( ':checked' ) && el_to_check.closest( '.cpf-element' ).is( ':visible' ) ) {
							$current_product_element.find( '.tm-clone-product-image' ).eq( i ).show();
							a.attr( 'href', $current_product_element.find( '.tm-clone-product-image' ).eq( i ).prop( 'src' ) );
							img.data( 'tm-current-image', current_element );
							found = true;
							break;
						} else {
							$current_product_element.find( '.tm-clone-product-image' ).eq( i ).hide();
						}
					}

					if ( ! found ) {
						img.show();
						img.data( 'tm-current-image', false );
						$form.tc_image_update( false );
					}
				}

				if ( found ) {
					imgSrc = current_image_replacement.attr( 'src' );
				}

				gallery_compatibility_actions( gallery_type, false, imgSrc, $current_product_element.find( '.tm-clone-product-image' ).filter( ':visible' ).length );
			} );

			$( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) )
				.add( main_product.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) )
				.each( function() {
					t = $( this );
					if ( field_is_active( t ) && t.val() !== '' ) {
						last_active_field.push( t );
					}
				} );
			if ( last_active_field.length ) {
				last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' );
			}
		}

		jWindow.trigger( 'tm_product_image_loaded' );
	}

	function tm_product_image( epoObject ) {
		setTimeout( function() {
			if ( TMEPOJS.tm_epo_global_product_image_mode === 'inline' ) {
				tm_product_image_inline( epoObject );
			} else {
				tm_product_image_self( epoObject );
			}
		}, window.tc_epo_product_image_setup_delay || 0 );
	}

	function tc_compatibility( epoObject ) {
		jWindow.trigger( 'tm-epo-compatibility', {
			epo: epoObject
		} );
	}

	// Range picker setup
	function setRangePickers( obj ) {
		if ( ! noUiSlider ) {
			return;
		}
		obj.find( '.tm-range-picker' )
			.toArray()
			.forEach( function( picker ) {
				var el = $( picker );
				var $decimals = el.attr( 'data-step' ).split( '.' );
				var $tmfid = obj.find( '#' + $.epoAPI.dom.id( el.attr( 'data-field-id' ) ) );
				var $min = parseFloat( el.attr( 'data-min' ) );
				var $max = parseFloat( el.attr( 'data-max' ) );
				var $start = parseFloat( el.attr( 'data-start' ) );
				var $step = parseFloat( el.attr( 'data-step' ) );
				var $show_picker_value = el.attr( 'data-show-picker-value' );
				var $show_label = el.closest( 'li' ).find( '.tm-show-picker-value' );
				var $noofpips = parseFloat( el.attr( 'data-noofpips' ) );
				var $pips = null;
				var $tmh;

				if ( el.data( 'tc-picker-init' ) ) {
					return;
				}
				el.data( 'tc-picker-init', 1 );

				if ( $decimals.length === 1 ) {
					$decimals = 0;
				} else {
					$decimals = $decimals[ 1 ].length;
				}
				if ( ! Number.isFinite( $min ) ) {
					$min = 0;
				}
				if ( ! Number.isFinite( $max ) ) {
					$max = 0;
				}
				if ( $max <= $min ) {
					$max = parseFloat( $max ) + 1;
				}
				$start = $.epoAPI.math.unformat( $start, tcAPI.localDecimalSeparator );
				if ( ! Number.isFinite( $start ) ) {
					$start = 0;
				}
				$start = formatPrice( $start, { precision: $decimals } );
				if ( ! Number.isFinite( $step ) ) {
					$step = 0;
				}
				if ( ! Number.isFinite( $noofpips ) ) {
					$noofpips = 10;
				}
				if ( $noofpips < 2 ) {
					$noofpips = 2;
				}

				if ( el.attr( 'data-pips' ) === 'yes' ) {
					$pips = {
						mode: 'count',
						values: $noofpips,
						filter: function( value, type ) {
							value = parseFloat( $.epoAPI.math.toFixed( value, $decimals ) );

							if ( $step <= 0 ) {
								return 0;
							}

							if ( type === 1 ) {
								if ( ! Number.isInteger( value ) ) {
									return 2;
								}
							}

							return type;
						},
						format: {
							from: function( value ) {
								return $.epoAPI.math.unformat( value, tcAPI.localInputDecimalSeparator );
							},
							to: function( value ) {
								return formatPrice( value, { precision: $decimals } );
							}
						},
						density: 2
					};
				}

				noUiSlider.create( el.get( 0 ), {
					direction: TMEPOJS.text_direction,
					start: $start,
					step: $step,
					connect: 'lower',
					// Configure tapping, or make the selected range dragable.
					behaviour: 'tap',
					// Full number format support.
					format: {
						from: function( value ) {
							return $.epoAPI.math.unformat( value, tcAPI.localDecimalSeparator );
						},
						to: function( value ) {
							return formatPrice( value, { precision: $decimals } );
						}
					},
					// Support for non-linear ranges by adding intervals.
					range: {
						min: [ $min ],
						max: [ $max ]
					},
					pips: $pips,
					tooltips: {
						from: function( value ) {
							return $.epoAPI.math.unformat( value, tcAPI.localInputDecimalSeparator );
						},
						to: function( value ) {
							return formatPrice( value, { precision: $decimals } );
						}
					}
				} );

				$tmh = el.find( '.noui-handle-lower' );
				el.get( 0 ).noUiSlider.on( 'slide', function() {
					$tmfid.trigger( 'change.cpf' );
				} );
				el.get( 0 ).noUiSlider.on( 'update', function( values, handle ) {
					values[ handle ] = $.epoAPI.math.unformat( values[ handle ], tcAPI.localDecimalSeparator );
					handle = 0; //fixes rtl issue.
					if ( $show_picker_value !== 'left' && $show_picker_value !== 'right' ) {
						$tmh.attr(
							'title',
							formatPrice( values[ handle ], { precision: $decimals } )
						);
					}
					$tmfid.val( values[ handle ] ).trigger( 'change' );
					if ( $show_picker_value !== '' ) {
						$show_label.html(
							formatPrice( values[ handle ], { precision: $decimals } )
						);
					}
				} );

				if ( $show_picker_value !== '' ) {
					$show_label.html( $start );
				}

				if ( $show_picker_value !== 'left' && $show_picker_value !== 'right' ) {
					$tmh.attr( 'title', $start );
					el.addClass( 'noui-show-tooltip' );
				}
			} );
	}

	// Range picker event setup
	function setRangePickersEvents() {
		if ( ! noUiSlider || jDocument.data( 'setRangePickersEvents' ) ) {
			return;
		}
		jDocument.on( 'click', '.tm-show-picker-value', function() {
			var $this = $( this );
			var li = $this.closest( '.tmcp-field-wrap' );
			var value = li.find( '.tmcp-range' ).val();
			var edit;
			var html5Slider = $this.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' );

			$this.addClass( 'tc-hidden' ).after( $( '<input type="number" class="tm-show-picker-value-edit">' ) );
			edit = li.find( '.tm-show-picker-value-edit' );
			edit.focus().val( value ).wrap( '<div class="tm-show-picker-value-edit-wrap"></div>' );
			edit.attr( 'step', html5Slider.attr( 'data-step' ) );
			edit.attr( 'min', html5Slider.attr( 'data-min' ) );
			edit.attr( 'max', html5Slider.attr( 'data-max' ) );
			jDocument.data( 'range-picker-edit', li.find( '.tm-show-picker-value-edit' ) );
		} );
		jDocument.on( 'change input', '.tm-show-picker-value-edit', function() {
			var $this = $( this );
			var html5Slider = $this.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' );
			var $decimals = html5Slider.attr( 'data-step' ).split( '.' );
			var value = $this.val();
			if ( $decimals.length === 1 ) {
				$decimals = 0;
			} else {
				$decimals = $decimals[ 1 ].length;
			}

			html5Slider.get( 0 ).noUiSlider.set( [ formatPrice( value, { precision: $decimals } ), null ] );
		} );
		jDocument.on( 'keydown', '.tm-show-picker-value-edit', function( event ) {
			var key;

			key = event.which;
			if ( key === 13 ) {
				event.preventDefault();
			}
		} );
		jDocument.on( 'click', function( event ) {
			var $this;

			if ( ! jDocument.data( 'range-picker-edit' ) || $( event.target ).is( '.tm-show-picker-value' ) ) {
				return;
			}

			if ( $( event.target ).closest( '.tm-show-picker-value-edit-wrap' ).length === 0 ) {
				$this = jDocument.data( 'range-picker-edit' );
				$this.closest( '.tmcp-field-wrap' ).find( '.tm-show-picker-value' ).data( 'has-edit', 0 ).removeClass( 'tc-hidden' );
				$this.closest( '.tm-show-picker-value-edit-wrap' ).remove();
				jDocument.removeData( 'range-picker-edit' );
			}
		} );
		jDocument.data( 'setRangePickersEvents', 1 );
	}

	function validate_date_with_options( date, inputElement ) {
		var input = $( inputElement );
		var inst = $.tm_datepicker._getInst( input[ 0 ] );
		var enabled_only_dates = input.data( 'tc-enabled_only_dates' );
		var disabled_weekdays = input.data( 'tc-disabled_weekdays' );
		var disabled_months = input.data( 'tc-disabled_months' );
		var disabled_dates = input.data( 'tc-disabled_dates' );
		var format = input.data( 'tc-format' );
		var day = date.getDay();
		var month = date.getDay() + 1;
		var string;

		if ( ! $.tm_datepicker._isInRange( inst, date ) ) {
			return false;
		}
		if ( enabled_only_dates !== '' ) {
			string = $.tm_datepicker.formatDate( format, date );
			return enabled_only_dates.indexOf( string ) !== -1;
		}
		if ( disabled_weekdays.indexOf( day.toString() ) !== -1 ) {
			return false;
		}
		if ( disabled_months.indexOf( month.toString() ) !== -1 ) {
			return false;
		}
		if ( disabled_dates !== '' ) {
			string = $.tm_datepicker.formatDate( format, date );
			return disabled_dates.indexOf( string ) === -1;
		}
		return true;
	}

	function correctDate( days ) {
		var sign, testDate, count, added, noOfDaysToAdd;
		if ( days.toString().isNumeric() ) {
			sign = days === 0 ? days : ( days > 0 ? 1 : -1 );
			if ( sign !== 0 ) {
				testDate = new Date();
				count = 1;
				added = false;
				noOfDaysToAdd = Math.abs( days );
				while ( count <= noOfDaysToAdd ) {
					if ( added === false ) {
						added = 0;
					}
					testDate.setDate( testDate.getDate() + ( 1 * sign ) );
					added++;
					if ( testDate.getDay() !== 0 && testDate.getDay() !== 6 ) {
						count++;
					}
				}
				if ( added !== false ) {
					days = added * sign;
				}
			}
		}
		return days;
	}
	// Date and time picker setup
	function tm_set_datepicker( obj ) {
		var inputIds;
		var elem;
		var timepickerSelector = '.tm-epo-timepicker';

		if ( ! $.tm_datepicker ) {
			return;
		}

		inputIds = $( 'input' )
			.map( function() {
				return this.id;
			} )
			.get()
			.join( ' ' );

		elem = document.createElement( 'input' );
		elem.setAttribute( 'type', 'date' );

		if ( elem.type === 'text' ) {
			timepickerSelector = '.tm-epo-system-timepicker';
		}

		obj.find( timepickerSelector )
			.toArray()
			.forEach( function( el ) {
				var field = $( el );
				var _mintime = null;
				var _maxtime = null;
				var format = field.attr( 'data-time-format' ).trim();
				var date_theme = field.attr( 'data-time-theme' ).trim();
				var date_theme_size = field.attr( 'data-time-theme-size' ).trim();
				var date_theme_position = field.attr( 'data-time-theme-position' ).trim();
				var data_translation_hour = field.attr( 'data-tranlation-hour' ).trim();
				var data_translation_minute = field.attr( 'data-tranlation-minute' ).trim();
				var data_translation_second = field.attr( 'data-tranlation-second' ).trim();

				field.attr( 'type', 'text' );

				if ( field.attr( 'data-min-time' ).trim() !== '' ) {
					_mintime = field.attr( 'data-min-time' ).trim();
				}
				if ( field.attr( 'data-max-time' ).trim() !== '' ) {
					_maxtime = field.attr( 'data-max-time' ).trim();
				}

				if ( field.attr( 'data-custom-time-format' ).trim() !== '' ) {
					format = field.attr( 'data-custom-time-format' ).trim();
				}
				if ( ! data_translation_hour ) {
					data_translation_hour = TMEPOJS.hourText;
				}
				if ( ! data_translation_minute ) {
					data_translation_minute = TMEPOJS.minuteText;
				}
				if ( ! data_translation_second ) {
					data_translation_second = TMEPOJS.secondText;
				}

				field.tm_timepicker( Object.assign( {
					isRTL: TMEPOJS.isRTL,
					hourText: data_translation_hour,
					minuteText: data_translation_minute,
					secondText: data_translation_second,
					timeFormat: format,
					minTime: _mintime,
					maxTime: _maxtime,
					closeText: TMEPOJS.closeText,
					showOn: 'both',
					buttonText: '',

					beforeShow: function( input, inst ) {
						$( inst.dpDiv )
							.removeClass( inputIds )
							.removeClass( 'tm-ui-skin-epo tm-ui-skin-epo-black tm-datepicker-medium tm-datepicker-small tm-datepicker-large tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom' )
							.addClass( this.id + ' tm-bsbb-all tm-ui-skin-' + date_theme + ' tm-timepicker tm-datepicker tm-datepicker-' + date_theme_position + ' tm-datepicker-' + date_theme_size )
							.appendTo( 'body' );

						jDocument.off( 'click', '.tm-ui-dp-overlay' ).on( 'click', '.tm-ui-dp-overlay', function() {
							field.tm_timepicker( 'hide' );
						} );
						jBody.addClass( 'tm-static' );
						field.prop( 'readonly', true );

						jWindow.trigger( {
							type: 'tm-timepicker-beforeShow',
							input: input,
							inst: inst
						} );
					},
					onClose: function() {
						jBody.removeClass( 'tm-static' );
						field.prop( 'readonly', false );
						field.trigger( 'change' );
					}
				}, window.tmTimepickerSettings || window.timepicker_settings || {} ) );
				$( '#ui-tm-datepicker-div' ).hide();
			} );

		obj.find( '.tm-epo-datepicker' )
			.toArray()
			.forEach( function( el ) {
				var field = $( el );
				var startDate = parseInt( field.attr( 'data-start-year' ).trim(), 10 );
				var endDate = parseInt( field.attr( 'data-end-year' ).trim(), 10 );
				var minDate = field.attr( 'data-min-date' ).trim();
				var maxDate = field.attr( 'data-max-date' ).trim();
				var disabled_dates = field.attr( 'data-disabled-dates' ).trim();
				var enabled_only_dates = field.attr( 'data-enabled-only-dates' ).trim();
				var exlude_disabled = field.attr( 'data-exlude-disabled' ).trim();
				var disabled_weekdays = field.attr( 'data-disabled-weekdays' ).trim().split( ',' );
				var disabled_months = field.attr( 'data-disabled-months' ).trim().split( ',' );
				var format = field.attr( 'data-date-format' ).trim();
				var show = field.attr( 'data-date-showon' ).trim();
				var default_date = field.attr( 'data-date-defaultdate' ).trim();
				var date_theme = field.attr( 'data-date-theme' ).trim();
				var date_theme_size = field.attr( 'data-date-theme-size' ).trim();
				var date_theme_position = field.attr( 'data-date-theme-position' ).trim();
				var $split;
				var $index;
				var $split2;
				var $index2;

				if ( disabled_dates !== '' ) {
					$split = disabled_dates.split( ',' );
					$index = disabled_dates.indexOf( ',' );

					if ( $index !== -1 && $split.length > 0 ) {
						disabled_dates = $split;
					}
				}
				if ( enabled_only_dates !== '' ) {
					$split2 = enabled_only_dates.split( ',' );
					$index2 = enabled_only_dates.indexOf( ',' );

					if ( $index2 !== -1 && $split2.length > 0 ) {
						enabled_only_dates = $split2;
					}
				}

				if ( minDate === '' ) {
					if ( startDate === '' ) {
						minDate = null;
					} else {
						minDate = new Date( startDate, 1 - 1, 1 );
					}
				} else if ( exlude_disabled ) {
					minDate = correctDate( minDate );
				}
				if ( maxDate === '' ) {
					if ( endDate === '' ) {
						maxDate = null;
					} else {
						maxDate = new Date( endDate, 12 - 1, 31 );
					}
				} else if ( exlude_disabled ) {
					maxDate = correctDate( maxDate );
				}

				field.data( 'tc-enabled_only_dates', enabled_only_dates );
				field.data( 'tc-disabled_weekdays', disabled_weekdays );
				field.data( 'tc-disabled_months', disabled_months );
				field.data( 'tc-disabled_dates', disabled_dates );
				field.data( 'tc-format', format );

				field.tm_datepicker( Object.assign( {
					monthNames: TMEPOJS.monthNames,
					monthNamesShort: TMEPOJS.monthNamesShort,
					dayNames: TMEPOJS.dayNames,
					dayNamesShort: TMEPOJS.dayNamesShort,
					dayNamesMin: TMEPOJS.dayNamesMin,
					isRTL: TMEPOJS.isRTL,
					showOtherMonths: true,
					selectOtherMonths: true,
					showOn: show,
					defaultDate: default_date,
					buttonText: '',
					showButtonPanel: true,
					firstDay: TMEPOJS.first_day,
					closeText: TMEPOJS.closeText,
					currentText: TMEPOJS.currentText,
					dateFormat: format,
					minDate: minDate,
					maxDate: maxDate,
					onSelect: function() {
						var input = $( this );
						var id = '#' + $.epoAPI.dom.id( input.attr( 'id' ) );
						var date = input.tm_datepicker( 'getDate' );
						var day = '';
						var month = '';
						var year = '';
						var day_field = obj.find( id + '_day' );
						var month_field = obj.find( id + '_month' );
						var year_field = obj.find( id + '_year' );
						var string;
						var ld;

						if ( date ) {
							day = date.getDate();
							month = date.getMonth() + 1;
							year = date.getFullYear();
							string = $.tm_datepicker.formatDate( format, date );
							if (
								disabled_months.indexOf( month.toString() ) !== -1 ||
								disabled_weekdays.indexOf( date.getDay().toString() ) !== -1 ||
								disabled_dates.indexOf( string ) !== -1 ||
								( enabled_only_dates !== '' && enabled_only_dates.indexOf( string ) === -1 )
							) {
								ld = input.data( 'tm-last-date' );
								if ( input.data( 'tm-last-date' ) ) {
									ld = input.data( 'tm-last-date' );
								} else {
									ld = '';
								}
								input.val( ld );
								input.tm_datepicker( 'setDate', ld );
								if ( ld ) {
									date = input.tm_datepicker( 'getDate' );
									day = date.getDate();
									month = date.getMonth() + 1;
									year = date.getFullYear();
								} else {
									day = '';
									month = '';
									year = '';
								}
							}
						}

						day_field.val( day );
						month_field.val( month );
						year_field.val( year );

						input.data( 'tm-last-date', input.val() );
						input.tm_datepicker( 'hide' );
					},
					beforeShow: function( input, inst ) {
						$( inst.dpDiv )
							.removeClass( inputIds )
							.removeClass( 'tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom' )
							.addClass( this.id + ' tm-bsbb-all tm-ui-skin-' + date_theme + ' tm-datepicker tm-datepicker-' + date_theme_position + ' tm-datepicker-' + date_theme_size )
							.appendTo( 'body' );

						jDocument.off( 'click', '.tm-ui-dp-overlay' ).on( 'click', '.tm-ui-dp-overlay', function() {
							field.tm_datepicker( 'hide' );
						} );
						jDocument.off( 'click', '.ui-tm-datepicker-current' ).on( 'click', '.ui-tm-datepicker-current', function() {
							var tempDate = new Date(),
								today = $.tm_datepicker._daylightSavingAdjust( new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) );
							var day = today.getDay();
							var month = today.getMonth() + 1;
							var id = '#' + inst.id.replace( /\\\\/g, '\\' );
							var check = false;
							var string;
							var date = field.tm_datepicker( 'getDate' );

							if ( enabled_only_dates !== '' ) {
								string = $.tm_datepicker.formatDate( format, date );
								check = enabled_only_dates.indexOf( string ) !== -1;
							} else if ( disabled_months.indexOf( month.toString() ) !== -1 || disabled_weekdays.indexOf( day.toString() ) !== -1 ) {
								check = false;
							} else {
								if ( disabled_dates !== '' ) {
									string = $.tm_datepicker.formatDate( format, date );
									return [ disabled_dates.indexOf( string ) === -1, '' ];
								}
								check = true;
							}
							if ( check ) {
								$.tm_datepicker._setDate( inst, today );
								$.tm_datepicker._gotoToday( id );
							}
						} );
						jBody.addClass( 'tm-static' );

						jWindow.trigger( {
							type: 'tm-datepicker-beforeShow',
							input: input,
							inst: inst
						} );
					},
					onClose: function() {
						jBody.removeClass( 'tm-static' );
						field.trigger( 'change' );
					},
					beforeShowDay: function( date ) {
						var day = date.getDay();
						var month = date.getMonth() + 1;
						var string;

						if ( enabled_only_dates !== '' ) {
							string = $.tm_datepicker.formatDate( format, date );
							return [ enabled_only_dates.indexOf( string ) !== -1, '' ];
						}
						if ( disabled_months.indexOf( month.toString() ) !== -1 || disabled_weekdays.indexOf( day.toString() ) !== -1 ) {
							return [ false, '' ];
						}
						if ( disabled_dates !== '' ) {
							string = $.tm_datepicker.formatDate( format, date );
							return [ disabled_dates.indexOf( string ) === -1, '' ];
						}
						return [ true, '' ];
					}
				}, window.tmDatepickerSettings || {} ) );

				$( '#ui-tm-datepicker-div' ).hide();
			} );

		obj.find( '.tmcp-date-select' )
			.on( 'change.cpf', function() {
				var id = '#' + $.epoAPI.dom.id( $( this ).attr( 'data-tm-date' ) );
				var input = obj.find( id );
				var format = input.attr( 'data-date-format' );
				var day = obj.find( id + '_day' ).val();
				var month = obj.find( id + '_month' ).val();
				var year = obj.find( id + '_year' ).val();
				var dateFormat = $.tm_datepicker.formatDate( format, new Date( year, parseInt( month, 10 ) - 1, day ) );

				if ( day > 0 && month > 0 && year > 0 ) {
					input.tm_datepicker( 'setDate', dateFormat );
					input.trigger( 'change' );
				} else {
					input.val( '' );
					input.trigger( 'change.cpf' );
				}
			} )
			.on( 'focus.cpf', function() {
				var id = '#' + $.epoAPI.dom.id( $( this ).attr( 'data-tm-date' ) );
				var input = obj.find( id );
				var day_select = obj.find( id + '_day' );
				var month_select = obj.find( id + '_month' );
				var year_select = obj.find( id + '_year' );
				var day = day_select.val();
				var month = month_select.val();
				var year = year_select.val();
				var _select = $( this );

				if ( ( year !== '' && month !== '' && day !== '' ) || ( year !== '' && month !== '' && day === '' ) || ( day !== '' && year !== '' && month === '' ) || ( day !== '' && month !== '' && year === '' ) ) {
					_select
						.find( 'option' )
						.toArray()
						.forEach( function( element ) {
							var option = $( element );
							var val = option.val();
							var date_string = year + '-' + month + '-' + day;
							var d;

							if ( _select.is( '.tmcp-date-day' ) ) {
								if ( year === '' || month === '' ) {
									return;
								}
								date_string = year + '-' + month + '-' + val;
							} else if ( _select.is( '.tmcp-date-month' ) ) {
								if ( year === '' || day === '' ) {
									return;
								}
								date_string = year + '-' + val + '-' + day;
							} else if ( _select.is( '.tmcp-date-year' ) ) {
								if ( day === '' || month === '' ) {
									return;
								}
								date_string = val + '-' + month + '-' + day;
							}

							if ( val !== '' ) {
								try {
									d = $.tm_datepicker.parseDate( 'yy-mm-dd', date_string );
									if ( d ) {
										if ( validate_date_with_options( d, input ) ) {
											option.prop( 'disabled', false );
										} else {
											option.prop( 'disabled', true );
										}
									}
								} catch ( err ) {
									window.console.log( err );

									option.prop( 'disabled', true );
									errorObject = err;
								}
							}
						} );
				} else {
					day_select.find( 'option' ).prop( 'disabled', false );
					month_select.find( 'option' ).prop( 'disabled', false );
					year_select.find( 'option' ).prop( 'disabled', false );
				}
			} );

		jWindow.on( 'resizestart', function() {
			var activeElement = $( document.activeElement );

			if ( activeElement.is( '.hasDatepicker' ) ) {
				activeElement.data( 'resizestarted', true );

				// we don't use jWindow here because we want the current window width
				if ( $( window ).width() < 768 ) {
					activeElement.data( 'resizewidth', true );
					return;
				}
				activeElement.tm_datepicker( 'hide' );
			}
		} );
		jWindow.on( 'resizestop', function() {
			var activeElement = $( document.activeElement );

			if ( activeElement.is( '.hasDatepicker' ) && activeElement.data( 'resizestarted' ) ) {
				if ( activeElement.data( 'resizewidth' ) ) {
					activeElement.tm_datepicker( 'hide' );
				}
				activeElement.tm_datepicker( 'show' );
			}
			activeElement.data( 'resizestarted', false );
			activeElement.data( 'resizewidth', false );
		} );
	}

	function apply_submit_events( epoObject ) {
		var epoEventId = epoObject.epoEventId;
		var main_product = epoObject.main_product;
		var type;
		var form_is_submit = ! $.tcepo.formSubmitEvents[ epoEventId ].some( function( form_event ) {
			return typeof form_event && ( typeof form_event.trigger === 'function' || false ) && ! form_event.trigger();
		} );

		$.tcepo.formSubmitEvents[ epoEventId ].forEach( function( form_event ) {
			type = typeof form_event;
			if ( type === 'object' ) {
				if ( form_is_submit ) {
					form_event.on_true();
				} else {
					form_event.on_false();
				}
			}
		} );

		if ( ! form_is_submit ) {
			setTimeout( function() {
				main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' ).removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' );
			}, 100 );
		}

		jWindow.trigger( 'tm-apply-submit-events', {
			epo: {
				form_is_submit: form_is_submit
			}
		} );

		return form_is_submit;
	}

	function tm_apply_validation( epoObject ) {
		var form = epoObject.form;
		var this_epo_container = epoObject.this_epo_container;
		var main_product = epoObject.main_product;
		var epoEventId = epoObject.epoEventId;
		var validation_rules;
		var has_rules;

		if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' ) {
			validation_rules = {};

			this_epo_container
				.find( '.tmcp-ul-wrap' )
				.toArray()
				.forEach( function( tmcpulwrap ) {
					var field;
					var field_name;
					var subFieldName;
					var subRule;
					var productField;

					tmcpulwrap = $( tmcpulwrap );
					has_rules = tmcpulwrap.data( 'tm-validation' );
					if ( has_rules && $.tmType( has_rules ) === 'object' ) {
						field = tmcpulwrap.find( '.tm-epo-field' );
						field_name = field.first().attr( 'name' );
						if ( tmcpulwrap.is( '.tm-extra-product-options-radio.tm-element-ul-radio' ) ) {
							field_name = field.last().attr( 'name' );
							validation_rules[ field_name ] = has_rules;
						} else if ( tmcpulwrap.is( '.tm-extra-product-options-checkbox.tm-element-ul-checkbox' ) ) {
							field.each( function( f, fname ) {
								if ( 'required' in has_rules ) {
									has_rules.required = function( elem ) {
										var len = tmcpulwrap.find( 'input.tm-epo-field.tmcp-checkbox:checked' ).length;
										if ( len === 0 ) {
											if ( field.last().attr( 'name' ) === $( elem ).attr( 'name' ) ) {
												return true;
											}
											return false;
										}
										return len <= 0;
									};
								}
								validation_rules[ $( fname ).attr( 'name' ) ] = has_rules;
							} );
						} else if ( tmcpulwrap.is( '.tm-extra-product-options-product.tm-element-ul-product' ) ) {
							if ( field.is( ':checkbox' ) ) {
								field.each( function( f, fname ) {
									if ( 'required' in has_rules ) {
										productField = $( fname );
										if ( productField.is( ':checkbox' ) ) {
											has_rules.required = function( elem ) {
												var checkedFields = tmcpulwrap.find( 'input.tm-epo-field.tmcp-checkbox:checked' );
												var len = checkedFields.length;
												var qtyCheck;
												if ( len === 0 ) {
													if ( field.last().attr( 'name' ) === $( elem ).attr( 'name' ) ) {
														return true;
													}
													return false;
												}
												qtyCheck = checkedFields.map( function() {
													return $( this );
												} ).get().some( function( element ) {
													return element.closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val() <= 0;
												} );
												if ( len > 0 ) {
													return qtyCheck;
												}
												return len <= 0;
											};
											if ( productField.attr( 'data-type' ) === 'variable' ) {
												subFieldName = productField.closest( '.tc-epo-element-product-holder' ).find( '.product-variation-id' ).first().attr( 'name' );
												subRule = {
													required: function( elem ) {
														var element = $( elem );
														var holder = element.closest( '.tc-epo-element-product-holder' );
														var checkbox = holder.find( '.tc-epo-field-product' );

														if ( field_is_active( checkbox, true ) && checkbox.is( ':checked' ) ) {
															return true;
														}
														return false;
													}
												};
												validation_rules[ subFieldName ] = subRule;
											}
										}
									}
									validation_rules[ productField.attr( 'name' ) ] = has_rules;
								} );
							} else if ( field.is( ':radio' ) ) {
								has_rules.product_element_radio_qty = true;
								validation_rules[ field.attr( 'name' ) ] = has_rules;
								subFieldName = field.closest( '.tc-element-container' ).find( '.product-variation-id' ).first().attr( 'name' );
								subRule = {
									required: function( elem ) {
										var element = $( elem );
										var holder = element.closest( '.tc-element-container' );
										var radiobutton = holder.find( '.tc-epo-field-product:checked' );

										if ( radiobutton.length && radiobutton.attr( 'data-type' ) === 'variable' && field_is_active( radiobutton, true ) && radiobutton.is( ':checked' ) ) {
											return true;
										}
										return false;
									}
								};
								validation_rules[ subFieldName ] = subRule;
							} else if ( field.is( 'select' ) ) {
								has_rules.product_element_select_qty = true;
								validation_rules[ field.attr( 'name' ) ] = has_rules;
								subFieldName = field.closest( '.tc-element-container' ).find( '.product-variation-id' ).first().attr( 'name' );
								subRule = {
									required: function( elem ) {
										var element = $( elem );
										var holder = element.closest( '.tc-element-container' );
										var select = holder.find( '.tc-epo-field-product' );

										if ( select.length && select.children( ':selected' ).attr( 'data-type' ) === 'variable' && field_is_active( select, true ) ) {
											return true;
										}
										return false;
									}
								};
								validation_rules[ subFieldName ] = subRule;
							}
						} else {
							validation_rules[ field_name ] = has_rules;
						}
					}
				} );

			form.removeData( 'tc_validator' );
			form.tc_validate( {
				focusInvalid: false,
				ignore:
					tcAPI.qtySelector +
					",.tcdisabled,.tmcp-upload-hidden,#wc_bookings_field_duration,input.tm-qty:hidden[type='number'],input.input-text.qty,.ignore,.variations select,.tc-epo-variable-product-selector,.tm-extra-product-options-variations input,.tm-extra-product-options-variations select,input:not(.tc-extra-product-options input),select:not(.tc-extra-product-options select)",
				rules: validation_rules,
				errorClass: 'tm-error',
				validClass: 'tm-valid',
				errorElement: 'label',
				errorPlacement: function( error, element ) {
					error.addClass( 'tc-cell tcwidth tcwidth-100' );
					if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) {
						element.closest( '.tc-element-container' ).before( error );
					} else {
						element.closest( '.tc-element-container' ).after( error );
					}
					return false;
				},
				invalidHandler: function( event, validator ) {
					jWindow.trigger( 'tm-invalidHandler', {
						epo: {
							validator: validator
						}
					} );
					setTimeout( function() {
						if ( ! main_product.find( tcAPI.addToCartButtonSelector ).first().is( '.disabled' ) ) {
							main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' );
							main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' ).removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' );
						}
					}, 100 );
					if ( validator.errorList && validator.errorList[ 0 ] && validator.errorList[ 0 ].element ) {
						goto_error_item( $( validator.errorList[ 0 ].element ), epoEventId );
					}
				},
				submitHandler: function() {
					var ajaxSuccessFunc;
					if ( ! epoObject.is_quickview ) {
						main_product.find( tcAPI.addToCartButtonSelector ).first().addClass( 'disabled' );
						ajaxSuccessFunc = function() {
							main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' );
							jDocument.off( 'ajaxSuccess', ajaxSuccessFunc );
						};
						jDocument.on( 'ajaxSuccess', ajaxSuccessFunc );
					}
					return apply_submit_events( epoObject );
				}
			} );

			// This should handle most ajax based add to cart solutions
			form.find( tcAPI.addToCartButtonSelector ).on( 'click', function( e ) {
				if ( ! form.tc_validate().form() ) {
					e.preventDefault();
					e.stopImmediatePropagation();
				}
			} );

			return true;
		}
		return false;
	}

	function tm_form_submit_event( epoObject ) {
		var form = epoObject.form;
		var epoEventId = epoObject.epoEventId;

		jWindow.trigger( 'tm-from-submit', {
			epo: epoObject,
			functions: {
				tm_apply_validation: tm_apply_validation,
				apply_submit_events: apply_submit_events
			}
		} );
		if ( ! tm_apply_validation( epoObject ) && $.tcepo.formSubmitEvents[ epoEventId ].length ) {
			form.on( 'submit', function() {
				apply_submit_events( epoObject );
			} );
		}

		jWindow.on( 'tc_apply_validation', function() {
			return tm_apply_validation( epoObject );
		} );
	}

	function found_variation_tmepo( dataObject ) {
		var epoHolder = dataObject.epoHolder;
		var totalsHolder = dataObject.totalsHolder;
		var totalsHolderContainer = dataObject.totalsHolderContainer;
		var currentCart = dataObject.currentCart;
		var variationForm = dataObject.variationForm;
		var variation = dataObject.variation;
		var variations = totalsHolder.data( 'variations' );
		var product_price;

		totalsHolder.data( 'current_variation', variation );

		/**
		 * Currency converters that don't allow multi currency checkout will fail the following if statement
		 *
		 * if (variation.display_price!=undefined) {
		 *     product_price = variation.display_price;
		 *     totalsHolder.data('price', product_price);
		 * } else ...
		 *
		 */
		// This needs to be the first check as the next one
		// fails for taxed products as it displays the backend price only.
		if ( variation && 'display_price' in variation && ! totalsHolder.data( 'tm-epo-is-woocs' ) ) {
			product_price = variation.display_price;

			totalsHolder.data( 'priceIsWithDiscount', '1' );
			// Fancy product Designer
			totalsHolder.removeData( 'tcprice' );
		} else if ( variations && variation && variation.variation_id && variations[ variation.variation_id ] !== undefined ) {
			product_price = variations[ variation.variation_id ];

			// Fancy product Designer
			totalsHolder.removeData( 'tcprice' );
		} else if ( variation && $( variation.price_html ).find( '.amount:last' ).length ) {
			product_price = $( variation.price_html ).find( '.amount:last' ).text();
			product_price = product_price.replace( TMEPOJS.currency_format_thousand_sep, '' );
			product_price = product_price.replace( TMEPOJS.currency_format_decimal_sep, '.' );
			product_price = product_price.replace( /[^0-9.]/g, '' );
			product_price = parseFloat( product_price );

			// Fancy product Designer
			totalsHolder.removeData( 'tcprice' );
		}

		product_price = tm_set_backend_price( product_price, totalsHolder, variation );
		totalsHolder.data( 'price', product_price );

		totalsHolderContainer.find( '.cpf-product-price' ).val( product_price );

		setTimeout( function() {
			epoHolder.find( 'select.tm-epo-field' ).trigger( 'tm-select-change-html-all-math' );
		}, 100 );

		// This must be run every time to get correct results for percent price types
		// if set norules then discount will not auto work upon chosing a variation
		if ( ! variationForm.data( 'tm-styled-variations' ) ) {
			currentCart.trigger( {
				type: 'tm-epo-update'
			} );
		}
	}

	function fetchOptionPrices( epoObject, epoHolder, selector, total, original_total, floatingBoxData, showTotal, forced, setPriceTax, useUndiscountedPrice, mathTotal, cumulative, nopriceCacheSelector ) {
		var obj;
		var noDpd;
		var priceArray;
		var priceCacheSelector = 'none';
		var total_taxed;
		var original_total_taxed;
		var vat_total = 0;
		var currentTotalsContainer;
		var epoinline;
		var funcTotal;
		var cumulativeTotal;

		if ( ! nopriceCacheSelector ) {
			priceCacheSelector = epoHolder.attr( 'class' ) + epoHolder.attr( 'data-uniqid' ) + selector + epoObject.is_associated + setPriceTax + forced + setPriceTax + useUndiscountedPrice || 'none';
		}

		if ( priceCacheSelector !== 'none' && priceCache !== true && priceCache !== false && priceCache[ priceCacheSelector ] !== undefined ) {
			return priceCache[ priceCacheSelector ];
		}

		noDpd = useUndiscountedPrice ? 'undiscounted_' : '';
		obj = epoHolder.find( selector );
		if ( epoObject.is_associated === false ) {
			obj = obj.not( tcAPI.associatedEpoSelector + ' ' + selector + ',.cpf-type-variations ' + selector );
		}
		if ( ! forced ) {
			obj = obj.filter( '.tcenabled' );
		}

		if ( ! total ) {
			total = 0;
		}
		if ( ! original_total ) {
			original_total = 0;
		}

		funcTotal = total;
		cumulativeTotal = total;

		total_taxed = total;
		original_total_taxed = original_total;

		if ( ! floatingBoxData ) {
			floatingBoxData = [];
		}

		currentTotalsContainer = epoObject.this_epo_totals_container;

		if ( obj.length ) {
			obj.toArray().forEach( function( tmcpfield ) {
				var field = $( tmcpfield );
				var _value = '';
				var fieldval;
				var field_div = field.closest( '.cpf-element' );
				var field_wrap = field.closest( '.tmcp-field-wrap' );
				var field_label_show = field_div.attr( 'data-fblabelshow' );
				var field_value_show = field_div.attr( 'data-fbvalueshow' );
				var field_title = '';
				var option_quantity = field_wrap.find( '.tm-qty' ).val();
				var option_price;
				var option_price_taxed;
				var option_original_price;
				var option_original_price_taxed;
				var liw;
				var cri;
				var tl;
				var options;
				var forrangepicker;
				var $decimals;
				var _valueText = '';
				var setter;
				var dofloatingBoxData = false;

				if ( selector === '.tc-epo-field-product' ) {
					if ( field_div.is( '.cpf-type-product-thumbnailmultiple' ) || field_div.is( '.cpf-type-product-checkbox' ) ) {
						epoinline = field.closest( '.tc-epo-element-product-holder' ).find( '.tc-extra-product-options-inline' );
					} else if ( field_div.is( '.cpf-type-product-thumbnail' ) || field_div.is( '.cpf-type-product-radio' ) || field_div.is( '.cpf-type-product-dropdown' ) ) {
						epoinline = field_div.find( '.tc-epo-element-product-container[data-product_id="' + field.val() + '"]' ).find( '.tc-extra-product-options-inline' );
					} else if ( field_div.is( '.cpf-type-product-single' ) ) {
						epoinline = field_div.find( '.tc-extra-product-options-inline' );
					}
					currentTotalsContainer = $( '.tc-epo-totals' + '.tm-product-id-' + epoinline.attr( 'data-product-id' ) + '[data-epo-id="' + epoinline.attr( 'data-epo-id' ) + '"]' );
				}

				if ( currentTotalsContainer.length ) {
					if ( field_label_show === '' ) {
						field_title = field_div.find( '.tc-epo-element-label-text' ).html();
					}

					if ( option_quantity === undefined ) {
						option_quantity = '';
					}
					if ( mathTotal ) {
						tm_element_epo_rules( epoObject, field, undefined, undefined, undefined, undefined, funcTotal, cumulativeTotal );
					}
					if ( field.is( ':checkbox, :radio, :input' ) ) {
						option_price = 0;
						option_price_taxed = 0;
						option_original_price = 0;
						option_original_price_taxed = 0;
						if ( field.is( '.tmcp-checkbox, .tmcp-radio' ) ) {
							if ( forced || field.is( ':checked' ) ) {
								option_price = field.data( noDpd + 'raw_price' );
								option_price_taxed = field.data( noDpd + 'price' );
								option_original_price = field.data( noDpd + 'raw_original_price' );
								option_original_price_taxed = field.data( noDpd + 'original_price' );
								showTotal = true;
								field.data( 'isset', 1 );
								liw = field.closest( 'li.tmcp-field-wrap' );
								cri = liw.find( '.tc-image' );
								_value = '';
								_valueText = '';

								tl = field.closest( 'li.tmcp-field-wrap' ).find( '.tc-label-text' );
								if ( tl.length ) {
									_value = tl.html();
									_valueText = _value;
								}

								if ( cri.length ) {
									cri = cri.closest( '.tc-label-wrap' ).clone().addClass( 'tc-img-floating' );
									cri.find( '.tc-label, .tc-epo-style-wrapper, .tc-input-wrap' ).remove();
									_value = cri[ 0 ].outerHTML + '<span class="tc-label-text">' + _value + '</span>';
								}
								dofloatingBoxData = true;
							} else {
								field.data( 'isset', 0 );
							}
						} else if ( field.is( '.tmcp-select' ) ) {
							setter = field.find( 'option:selected' );
							option_price = setter.data( noDpd + 'raw_price' );
							option_price_taxed = setter.data( noDpd + 'price' );
							option_original_price = setter.data( noDpd + 'raw_original_price' );
							option_original_price_taxed = setter.data( noDpd + 'original_price' );

							options = field.children( 'option:selected' );
							if ( ! ( options.val() === '' && options.attr( 'data-rulestype' ) === '' ) ) {
								showTotal = true;
							}

							field.find( 'option' ).data( 'isset', 0 );
							setter.data( 'isset', 1 );

							if ( ! ( setter.val() === '' && setter.attr( 'data-rulestype' ) === '' ) ) {
								_value = setter.attr( 'data-text' );
								dofloatingBoxData = true;
								_valueText = _value;
							}
						} else if ( field.is( '.tmcp-selectmultiple' ) ) {
							setter = field.find( 'option:selected' );
							setter.toArray().forEach( function( setterel ) {
								setterel = $( setterel );
								option_price = option_price + $.epoAPI.math.toFloat( setterel.data( noDpd + 'raw_price' ) );
								option_price_taxed = option_price_taxed + $.epoAPI.math.toFloat( setterel.data( noDpd + 'price' ) );
								option_original_price = option_original_price + $.epoAPI.math.toFloat( setterel.data( noDpd + 'raw_original_price' ) );
								option_original_price_taxed = option_original_price_taxed + $.epoAPI.math.toFloat( setterel.data( noDpd + 'original_price' ) );

								options = field.children( 'option:selected' );
								if ( ! ( options.val() === '' && options.attr( 'data-rulestype' ) === '' ) ) {
									showTotal = true;
								}

								field.find( 'option' ).data( 'isset', 0 );
								setterel.data( 'isset', 1 );

								if ( ! ( setterel.val() === '' && setterel.attr( 'data-rulestype' ) === '' ) ) {
									_value = setterel.attr( 'data-text' );
									dofloatingBoxData = true;
									_valueText = _value;
								}
							} );
						} else {
							fieldval = field.val();
							if ( field.is( "[type='file']" ) ) {
								fieldval = fieldval.replace( 'C:\\fakepath\\', '' );
							}
							if ( fieldval ) {
								if ( field.is( '.tmcp-range' ) && fieldval === '0' ) {
									field.data( 'isset', 0 );
								} else {
									option_price = field.data( noDpd + 'raw_price' );
									option_price_taxed = field.data( noDpd + 'price' );
									option_original_price = field.data( noDpd + 'raw_original_price' );
									option_original_price_taxed = field.data( noDpd + 'original_price' );
									showTotal = true;
									field.data( 'isset', 1 );

									_value = fieldval;
									if ( field.is( '.tmcp-range' ) ) {
										forrangepicker = field.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' );
										$decimals = forrangepicker.attr( 'data-step' ).split( '.' );
										if ( $decimals.length === 1 ) {
											$decimals = 0;
										} else {
											$decimals = $decimals[ 1 ].length;
										}
										_value = formatPrice( _value, { precision: $decimals } );
									}
									dofloatingBoxData = true;
									if ( field.is( '.tmcp-dynamic' ) ) {
										field_label_show = 'hidden';
										field_value_show = 'hidden';
									}
									_valueText = fieldval;
								}
							} else {
								field.data( 'isset', 0 );
							}
						}
						if ( ! option_price ) {
							option_price = 0;
						}
						if ( ! option_original_price ) {
							option_original_price = 0;
						}
						if ( ! option_price_taxed ) {
							option_price_taxed = 0;
						}
						if ( ! option_original_price_taxed ) {
							option_original_price_taxed = 0;
						}
						if ( dofloatingBoxData ) {
							floatingBoxData.push( {
								title: field_title,
								value: _value,
								valueText: _valueText,
								price: option_price_taxed,
								original_price: option_original_price_taxed,
								quantity: option_quantity,
								label_show: field_label_show,
								value_show: field_value_show,
								input_type: field.attr( 'type' )
							} );
						}

						option_price_taxed = tm_set_tax_price( option_price, currentTotalsContainer, field, undefined, undefined, undefined, true );
						option_original_price_taxed = tm_set_tax_price( option_original_price, currentTotalsContainer, field, undefined, undefined, undefined, true );

						if ( setPriceTax ) {
							option_price = option_price_taxed;
							option_original_price = option_original_price_taxed;
						}

						total = $.epoAPI.math.toFloat( total ) + $.epoAPI.math.toFloat( option_price );
						total = $.epoAPI.math.toFloat( $.epoAPI.math.round( total, 10 ) );
						original_total = $.epoAPI.math.toFloat( original_total ) + $.epoAPI.math.toFloat( option_original_price );
						original_total = $.epoAPI.math.toFloat( $.epoAPI.math.round( original_total, 10 ) );

						total_taxed = $.epoAPI.math.toFloat( total_taxed ) + $.epoAPI.math.toFloat( option_price_taxed );
						total_taxed = $.epoAPI.math.toFloat( $.epoAPI.math.round( total_taxed, 10 ) );
						vat_total = vat_total + $.epoAPI.math.toFloat( calculateTaxAmount( option_price_taxed, currentTotalsContainer ) );
						original_total_taxed = $.epoAPI.math.toFloat( original_total_taxed ) + $.epoAPI.math.toFloat( option_original_price_taxed );
						original_total_taxed = $.epoAPI.math.toFloat( $.epoAPI.math.round( original_total_taxed, 10 ) );

						if ( cumulative ) {
							cumulativeTotal = total;
						}
					}
				}
			} );
		}
		priceArray = {
			total: total,
			original_total: original_total,
			total_taxed: total_taxed,
			original_total_taxed: original_total_taxed,
			vat_total: vat_total,
			floatingBoxData: floatingBoxData,
			showTotal: showTotal,
			elementsLength: obj.length
		};

		if ( priceCache === true ) {
			priceCache = {};
			priceCache[ priceCacheSelector ] = priceArray;
		} else if ( priceCache !== true && priceCache !== false ) {
			priceCache[ priceCacheSelector ] = priceArray;
		}

		return priceArray;
	}

	function show_product_html( thisEpoObject, thisMainProduct, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt ) {
		var epoObjectCopy = $.extend( true, {}, thisEpoObject );
		var item_tm_extra_product_options = thisVariableProductContainer.find( tcAPI.associatedEpoSelector );
		var item = thisVariableProductContainer;
		var newEpoObject;
		var showOnly = true;

		if ( item.closest( '.cpf-element' ).is( '.tc-hidden' ) ) {
			return;
		}

		variableProductContainers.addClass( 'tm-hidden' );
		if ( variableProductContainers.length ) {
			toggleState( variableProductContainers, true );
		}

		if ( type === 'variable' ) {
			if ( ! thisVariableProductContainer.is( '.tc-init-variations' ) ) {
				thisVariableProductContainer.addClass( 'variations_form' );
				setTimeout( function() {
					newEpoObject = tm_init_epo( item, false, item_tm_extra_product_options.attr( 'data-product-id' ), item_tm_extra_product_options.attr( 'data-epo-id' ), $this, epoObjectCopy );
					thisVariableProductContainer.addClass( 'tc-init-variations' );
					thisVariableProductContainer.tc_product_variation_form( $this, currentCart, variableProductContainers, newEpoObject );
				}, 40 );
				showOnly = false;
			} else {
				thisVariableProductContainer.trigger( 'refresh.tc-variation-form' );
			}
		} else if ( ! thisVariableProductContainer.is( '.tc-init-product' ) ) {
			thisVariableProductContainer.addClass( 'tc-init-product' );
			variableProductContainers.find( '.tc-epo-element-variable-product' ).removeClass( 'variations_form' );
			variableProductContainers.find( '.tc-epo-element-variations' ).removeClass( 'variations' );

			setTimeout( function() {
				tm_init_epo( item, false, item_tm_extra_product_options.attr( 'data-product-id' ), item_tm_extra_product_options.attr( 'data-epo-id' ), $this, epoObjectCopy );
			}, 20 );
			showOnly = false;
		}

		setTimeout( function() {
			if ( variableProductContainers.length ) {
				toggleState( thisVariableProductContainer, false );
			}
		}, 200 );
		setTimeout( function() {
			if ( qtyalt.length ) {
				qtyalt.trigger( 'change' );
			}
			if ( thisVariableProductContainer.find( tcAPI.epoSelector ).length === 0 ) {
				thisVariableProductContainer.addClass( 'no-epo' );
			}
			thisVariableProductContainer.removeClass( 'tm-hidden' );
			if ( showOnly ) {
				jWindow.trigger( 'cpflogicdone' );
				thisVariableProductContainer.find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' );
			}
			if ( isTrigger === undefined && TMEPOJS.tm_epo_global_product_element_scroll === 'yes' ) {
				jWindow.tcScrollTo( thisVariableProductContainer, 200, $.epoAPI.math.toFloat( TMEPOJS.tm_epo_global_product_element_scroll_offset ) );
			}
		}, 210 );
	}

	function epoEventHandlers( epoObject, cartContainer, alternativeCart ) {
		// if cartContainer & alternativeCart is defined we are on a non default product (eg. composite product)
		var product_id = epoObject.product_id;
		var main_product = epoObject.main_product;
		var main_cart = epoObject.main_cart;
		var this_epo_container = epoObject.this_epo_container;
		var this_totals_container = epoObject.this_totals_container;
		var this_epo_totals_container = epoObject.this_epo_totals_container;
		var epoEventId = epoObject.epoEventId;
		var main_epo_inside_form = epoObject.main_epo_inside_form;
		var epo_id_selector = epoObject.epo_id_selector;
		var epo_id = epoObject.epo_id;
		var product_id_selector = epoObject.product_id_selector;
		var itemId = 'main';
		var epoHolder;
		var totalsHolderContainer;
		var totalsHolder;
		var currentCart;
		var variation_id_selector;
		var this_product_type;
		var variationForm;
		var qtyElement;
		var finalTotalBoxMode;
		var finalTotalBoxShowFinal;
		var finalTotalBoxShowOptions;
		var eventName = epoObject.is_associated ? 'tc-variation-form' : 'wc-variation-form';
		var eventNamePrefix = epoObject.is_associated ? 'tc_' : '';
		var epoVariationSection;
		var thismaxlength;
		var epoFieldAll;
		var selectSelector;
		var epoFieldText;
		var epoResetRadio;
		var epoFieldUpload;
		var epoFieldHasClearButton;
		var tmQty;
		var tmQuantity;

		// Non default product (eg. composite product)
		if ( alternativeCart && cartContainer ) {
			itemId = $.epoAPI.applyFilter( 'tc_get_item_id', cartContainer.attr( 'data-item_id' ), cartContainer );
			epoHolder = main_product.find( '.tm-extra-product-options.tm-cart-' + itemId );
			totalsHolderContainer = main_product.find( '.tm-totals-form-' + itemId );
			totalsHolder = main_product.find( '.tm-epo-totals.tm-cart-' + itemId );
			variationForm = cartContainer.find( '.variations_form' ).first();
		// Default product
		} else {
			if ( ! main_cart || main_cart.length === 0 ) {
				if ( this_epo_container.is( '.tc-shortcode' ) ) {
					main_cart = main_product;
				} else {
					main_cart = get_main_cart( main_product, main_product, 'form', product_id );
				}
			}
			cartContainer = main_cart.parent();
			epoHolder = this_epo_container;
			totalsHolderContainer = this_totals_container;
			totalsHolder = this_epo_totals_container;
			variationForm = epoObject.variations_form;
		}

		if ( epoObject.is_associated ) {
			itemId = epoHolder.attr( 'data-cart-id' );
		}

		currentCart = alternativeCart || main_cart;
		totalsHolder.data( 'tm_for_cart', currentCart );

		variation_id_selector = getVariationIdSelector( currentCart );
		qtyElement = getQtyElement( currentCart );

		totalsHolder.data( 'variationIdElement', getVariationIdElement( currentCart, '.wceb_picker_wrap ' + variation_id_selector ) );
		totalsHolder.data( 'qty_element', qtyElement );

		this_product_type = totalsHolder.data( 'type' );

		variationForm.data( 'tc_product_id', product_id );

		finalTotalBoxMode = totalsHolder.attr( 'data-tm-epo-final-total-box' );
		finalTotalBoxShowFinal = totalsHolder.attr( 'data-tm-epo-show-final-total' );
		finalTotalBoxShowOptions = totalsHolder.attr( 'data-tm-epo-show-options-total' );

		jWindow.on( 'epoCalculateRules', function( event, dataObject ) {
			if ( event && dataObject && dataObject.currentCart ) {
				tm_epo_rules( epoObject, dataObject.currentCart );
			}
		} );

		if ( currentCart.is( 'form' ) ) {
			currentCart.on( 'reset', function() {
				var form = $( this );
				setTimeout( function() {
					$( form.data( 'epo_id_selector' ) ).find( '.tm-epo-field' ).trigger( 'change' );
				}, 1 );
			} );
		}

		tm_epo_rules( epoObject, currentCart );

		epoFieldAll = epoHolder.find( '.tm-epo-field' );
		if ( ! epoObject.is_associated ) {
			epoFieldAll = epoFieldAll.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' );
		}

		epoFieldText = epoHolder.find( '.tm-epo-field.tmcp-textarea,.tm-epo-field.tmcp-textfield' );
		if ( ! epoObject.is_associated ) {
			epoFieldText = epoFieldText.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' );
		}

		epoResetRadio = epoHolder.find( '.tm-epo-reset-radio' );
		if ( ! epoObject.is_associated ) {
			epoResetRadio = epoResetRadio.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-reset-radio' );
		}

		epoFieldUpload = epoHolder.find( '.tm-epo-field.tmcp-upload' );
		if ( ! epoObject.is_associated ) {
			epoFieldUpload = epoFieldUpload.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' );
		}

		epoFieldHasClearButton = epoHolder.find( '.tm-has-clearbutton .tm-epo-field' );
		if ( ! epoObject.is_associated ) {
			epoFieldHasClearButton = epoFieldHasClearButton.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-has-clearbutton .tm-epo-field' );
		}

		tmQty = epoHolder.find( '.tm-quantity .tm-qty' );
		if ( ! epoObject.is_associated ) {
			tmQty = tmQty.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-quantity .tm-qty' );
		}

		tmQuantity = epoHolder.find( '.tm-quantity' );
		if ( ! epoObject.is_associated ) {
			tmQuantity = tmQuantity.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-quantity' );
		}

		selectSelector = epoHolder.find( 'select.tm-epo-field' );
		if ( ! epoObject.is_associated ) {
			selectSelector = selectSelector.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' select.tm-epo-field' );
		}
		// update price amount for select elements
		selectSelector
			.off( 'tm-select-change-html' )
			.on( 'tm-select-change-html', function() {
				var field = $( this );
				var formatted_price;
				var original_formatted_price;
				var e_tip;
				var e_description;
				var sign;

				if ( field.is( '.tc-epo-field-product' ) || field.is( '.tmcp-selectmultiple' ) ) {
					return;
				}

				if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) {
					return;
				}

				formatted_price = tm_set_price( field.find( 'option:selected' ).data( 'price' ), totalsHolder, true, false, field );
				original_formatted_price = tm_set_price( field.find( 'option:selected' ).data( 'original_price' ), totalsHolder, true, false, field );
				e_tip = field.closest( '.tmcp-field-wrap' ).find( '.tc-tooltip' );
				e_description = field.closest( '.tmcp-field-wrap' ).find( '.tc-inline-description' );

				tm_update_price( field.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), field.find( 'option:selected' ).data( 'price' ), formatted_price, field.find( 'option:selected' ).data( 'original_price' ), original_formatted_price );

				if ( e_tip.length > 0 ) {
					e_tip.attr( 'data-tm-tooltip-html', field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ).trigger( 'tc-tooltip-html-changed' );
				}

				if ( e_description.length > 0 ) {
					if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) {
						e_description.html( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) );
					} else {
						e_description.html( '' );
					}
				}

				if (
					( field.find( 'option:selected' ).attr( 'data-hide-amount' ) === '0' || TMEPOJS.tm_epo_show_price_inside_option_hidden_even === 'yes' ) &&
					TMEPOJS.tm_epo_show_price_inside_option === 'yes' &&
					field.find( 'option:selected' ).attr( 'data-text' ) &&
					( field.find( 'option:selected' ).data( 'price' ) || ( TMEPOJS.tm_epo_no_hide_price_if_original_not_zero === 'yes' && field.find( 'option:selected' ).data( 'original_price' ) ) )
				) {
					if (
						( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( field.find( 'option:selected' ).data( 'price' ) ) === false ) ||
						( TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' && field.find( 'option:selected' ).attr( 'data-price' ) !== '' )
					) {
						sign = '';
						field.find( 'option:selected' ).html( field.find( 'option:selected' ).attr( 'data-text' ) + ' (' + sign + formatted_price + ')' );
					} else {
						field.find( 'option:selected' ).html( field.find( 'option:selected' ).attr( 'data-text' ) );
					}
				}

				if ( field.val() === '' ) {
					e_tip.addClass( 'tm-hidden' );
				} else if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) {
					e_tip.removeClass( 'tm-hidden' );
				} else {
					e_tip.addClass( 'tm-hidden' );
				}
			} )
			.off( 'tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math' )
			.on( 'tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math', function( event ) {
				var field = $( this );
				var e_tip;
				var e_description;
				var thisoption;
				var divider;
				var thisformatted_price;

				if ( field.is( '.tc-epo-field-product' ) ) {
					return;
				}

				e_tip = field.closest( '.tmcp-field-wrap' ).find( '.tc-tooltip' );
				e_description = field.closest( '.tmcp-field-wrap' ).find( '.tc-inline-description' );

				if ( e_tip.length > 0 ) {
					e_tip.attr( 'data-tm-tooltip-html', field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ).trigger( 'tc-tooltip-html-changed' );
				}

				if ( field.val() === '' ) {
					e_tip.addClass( 'tm-hidden' );
				} else if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) {
					e_tip.removeClass( 'tm-hidden' );
				} else {
					e_tip.addClass( 'tm-hidden' );
				}

				if ( e_description.length > 0 ) {
					if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) {
						e_description.html( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) );
					} else {
						e_description.html( '' );
					}
				}

				if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) {
					return;
				}

				if ( TMEPOJS.tm_epo_show_price_inside_option === 'yes' ) {
					field.find( 'option' ).each( function() {
						thisoption = $( this );
						if ( ! thisoption.val() ) {
							return true;
						}

						if ( event.type === 'tm-select-change-html-all' ) {
							thisoption.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' );
							tm_element_epo_rules( epoObject, field, undefined, thisoption, 1 );
						} else if ( event.type === 'tm-math-select-change-html-all' ) {
							tm_element_epo_rules( epoObject, field, undefined, thisoption, 1, true );
						} else if ( event.type === 'tm-select-change-html-all-math' ) {
							thisoption.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' );
							tm_element_epo_rules( epoObject, field, undefined, thisoption, 1, true );
						}
						divider = 1;

						if ( TMEPOJS.tm_epo_multiply_price_inside_option !== 'yes' ) {
							divider = field.data( 'tm-quantity' );
						}

						if ( ! divider ) {
							divider = 1;
						}

						if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( thisoption.data( 'price' ) ) === false ) || ( TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' && thisoption.attr( 'data-price' ) !== '' ) ) {
							thisformatted_price = tm_set_price( thisoption.data( 'price' ) / divider, totalsHolder, true, false, field );

							if ( ( thisoption.attr( 'data-hide-amount' ) === '0' || TMEPOJS.tm_epo_show_price_inside_option_hidden_even === 'yes' ) && thisoption.attr( 'data-text' ) ) {
								thisoption.html( thisoption.attr( 'data-text' ) + ' (' + thisformatted_price + ')' );
							}
						} else {
							thisoption.html( thisoption.attr( 'data-text' ) );
						}
					} );
				}
			} )
			.off( 'tm-select-price-update-html-all' )
			.on( 'tm-select-price-update-html-all', function() {
				var field = $( this );
				var thisoption;
				var divider;
				var thisformatted_price;

				if ( field.is( '.tc-epo-field-product' ) ) {
					return;
				}

				if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) {
					return;
				}

				if ( TMEPOJS.tm_epo_show_price_inside_option === 'yes' ) {
					field.find( 'option' ).each( function() {
						thisoption = $( this );
						if ( ! thisoption.val() ) {
							return true;
						}

						divider = 1;

						if ( TMEPOJS.tm_epo_multiply_price_inside_option !== 'yes' ) {
							divider = field.data( 'tm-quantity' );
						}

						if ( ! divider ) {
							divider = 1;
						}

						if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( thisoption.data( 'price' ) ) === false ) || ( TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' && thisoption.attr( 'data-price' ) !== '' ) ) {
							thisformatted_price = tm_set_price( thisoption.data( 'price' ) / divider, totalsHolder, true, false, field );

							if ( ( thisoption.attr( 'data-hide-amount' ) === '0' || TMEPOJS.tm_epo_show_price_inside_option_hidden_even === 'yes' ) && thisoption.attr( 'data-text' ) ) {
								thisoption.html( thisoption.attr( 'data-text' ) + ' (' + thisformatted_price + ')' );
							}
						} else {
							thisoption.html( thisoption.attr( 'data-text' ) );
						}
					} );
				}
			} )
			.off( 'tm-select-change' )
			.on( 'tm-select-change', function() {
				var field = $( this );
				var thisElementId = field.closest( '.cpf-element' ).attr( 'data-uniqid' );

				if ( field.is( '.tc-epo-field-product' ) ) {
					return;
				}

				if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) {
					return;
				}

				field.removeData( 'addedtcEpoBeforeOptionPriceCalculation' );
				field.removeData( 'addedfieldtcEpoBeforeOptionPriceCalculation' );
				jWindow.off( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId );
				jWindow.off( 'tcEpoAfterNormalOptionPriceCalculation.math' + thisElementId );

				field.trigger( 'tm-select-change-html' );
				field.trigger( 'tm-select-change-html-all' );

				currentCart.trigger( {
					type: 'tm-epo-update',
					norules: 1,
					element: field
				} );
			} ).trigger( 'tm-select-change-html-all' );

		// Element quantity selector
		tmQty
			.off( 'focus.cpf' )
			.on( 'focus.cpf', function() {
				var qtyField = $( this );
				var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' );
				var currentVal = parseFloat( qtyField.val() );
				var max = parseFloat( qtyField.attr( 'max' ) );
				var min = parseFloat( qtyField.attr( 'min' ) );
				var step = qtyField.attr( 'step' );
				var check1 = tm_limit_c_selection( field, false );
				var check2 = tm_exact_c_selection( field, false );
				var check3 = true;

				// Format values
				if ( ! currentVal || currentVal === '' || currentVal === 'NaN' ) {
					currentVal = 0;
				}
				if ( max === '' || max === 'NaN' ) {
					max = '';
				}
				if ( min === '' || min === 'NaN' ) {
					min = 0;
				}
				if ( step === 'any' || step === '' || step === undefined || parseFloat( step ) === 'NaN' ) {
					step = 1;
				}

				if ( currentVal < min || currentVal > max ) {
					check3 = false;
				}

				if ( check1 && check2 && check3 ) {
					qtyField.data( 'tm-prev-value', currentVal );
				} else {
					qtyField.data( 'tm-prev-value', min );
				}
			} )
			.off( 'change.cpf' )
			.on( 'change.cpf', function( event, data ) {
				var qtyField = $( this );
				var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' );
				var currentVal = parseFloat( qtyField.val() );
				var max = parseFloat( qtyField.attr( 'max' ) );
				var min = parseFloat( qtyField.attr( 'min' ) );
				var step = qtyField.attr( 'step' );
				var check1 = tm_limit_c_selection( field, false );
				var check2 = tm_exact_c_selection( field, false );
				var check3 = true;

				// Format values
				if ( ! currentVal || currentVal === '' || currentVal === 'NaN' ) {
					currentVal = 0;
				}
				if ( max === '' || max === 'NaN' ) {
					max = '';
				}
				if ( min === '' || min === 'NaN' ) {
					min = 0;
				}
				if ( step === 'any' || step === '' || step === undefined || parseFloat( step ) === 'NaN' ) {
					step = 1;
				}

				if ( currentVal < min || currentVal > max ) {
					check3 = false;
				}

				if ( check1 && check2 && check3 ) {
					if ( ! epoObject.noEpoUpdate ) {
						field.data( 'tm-quantity', qtyField.val() ).trigger( 'change', data );
					} else {
						field.data( 'tm-quantity', qtyField.val() ).trigger( 'change.cpf', data ).trigger( 'change.cpfproduct', data );
					}
					field.trigger( 'tm-select-change-html-all' );
				} else if ( qtyField.data( 'tm-prev-value' ) ) {
					qtyField.val( qtyField.data( 'tm-prev-value' ) );
				} else {
					qtyField.val( min );
				}

				qtyField.trigger( 'cpf-changed' );
			} )
			.off( 'tmaddquantity' )
			.on( 'tmaddquantity', function() {
				var qtyField = $( this );
				var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' );

				field.data( 'tm-quantity', qtyField.val() );
			} );

		// Insert characters remaining for text-areas and text-fields
		thismaxlength = epoHolder.find( '.tmcp-textfield.tm-epo-field[maxlength],textarea.tm-epo-field[maxlength]' );
		if ( ! epoObject.is_associated ) {
			thismaxlength = thismaxlength.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' );
		}

		thismaxlength.each( function() {
			var field = $( this );
			var innerWrap;
			var html;
			if ( field.data( 'tcmaxlength' ) ) {
				return;
			}
			field.data( 'tcmaxlength', 1 );
			innerWrap = field.closest( '.tmcp-field-wrap-inner' );
			html = $.epoAPI.template.html( tcAPI.templateEngine.tc_chars_remanining, {
				maxlength: field.attr( 'maxlength' ),
				characters_remaining: TMEPOJS.i18n_characters_remaining
			} );
			innerWrap.append( $( html ) );
		} );
		thismaxlength
			.off( 'change.tc_maxlen input.tc_maxlen' )
			.on( 'change.tc_maxlen input.tc_maxlen', function() {
				var field = $( this );

				field
					.closest( '.tmcp-field-wrap' )
					.find( '.tc-chars-remanining' )
					.html( parseInt( field.attr( 'maxlength' ), 10 ) - parseInt( field.val().length, 10 ) );
			} );

		// Change product image event
		epoFieldAll
			.off( 'tm_trigger_product_image' )
			.on( 'tm_trigger_product_image', function() {
				var field = $( this );
				var currentElement;
				var uic;
				var variation_element_section;
				var is_variation_element;
				var src;

				if ( field.is( '.tm-product-image:checkbox, .tm-product-image:radio, select.tm-product-image' ) ) {
					uic = field.closest( '.tmcp-field-wrap' ).find( 'label img' );
					variation_element_section = field.closest( '.cpf-section' );
					is_variation_element = variation_element_section.is( '.tm-epo-variation-section' );

					currentElement = field;
					if ( field.is( 'select.tm-product-image' ) ) {
						currentElement = field.children( 'option:selected' );
					}
					if (
						$( uic ).length > 0 ||
						( is_variation_element && currentElement.attr( 'data-image' ) !== undefined ) ||
						( currentElement.attr( 'data-image' ) !== undefined && currentElement.attr( 'data-image' ) !== '' ) ||
						( currentElement.attr( 'data-imagep' ) !== undefined && currentElement.attr( 'data-imagep' ) !== '' )
					) {
						if ( field.is( ':checked' ) || ( field.is( 'select.tm-product-image' ) && field.val() !== '' && ( field.find( 'option:selected' ).attr( 'data-rules' ) !== '' || field.is( '.tm-epo-variation-element' ) ) ) ) {
							src = $( uic ).first().attr( 'data-original' );

							if ( ! src && ! is_variation_element ) {
								src = $( uic ).first().attr( 'src' );
							}
							if ( ! src ) {
								src = currentElement.attr( 'data-image' );
							}
							if ( currentElement.attr( 'data-imagep' ) ) {
								src = currentElement.attr( 'data-imagep' );
							}
							if ( src ) {
								main_product.trigger( 'tm_change_product_image', {
									src: src,
									element: field,
									element_current: currentElement,
									main_product: main_product,
									epo_holder: epoHolder
								} );
							} else {
								main_product.trigger( 'tm_change_product_image', {
									src: false,
									element: field,
									element_current: currentElement,
									main_product: main_product,
									epo_holder: epoHolder
								} );
							}
						} else {
							main_product.trigger( 'tm_restore_product_image', {
								element: field,
								element_current: currentElement,
								main_product: main_product,
								epo_holder: epoHolder
							} );
						}
					} else {
						main_product.trigger( 'tm_restore_product_image', {
							element: field,
							element_current: currentElement,
							main_product: main_product,
							epo_holder: epoHolder
						} );
					}
				} else {
					main_product.trigger( 'tm_attempt_product_image', {
						element: field,
						element_current: currentElement,
						main_product: main_product,
						epo_holder: epoHolder
					} );
				}
			} );

		tmQuantity
			.off( 'showhide.cpfcustom' )
			.on( 'showhide.cpfcustom', function() {
				var quantity_selector = $( this );
				var field = quantity_selector.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' );
				var show = false;
				var tmqty;
				var tmqtyval;
				var tmqtymin;
				var radios;

				if ( ! field.is( '.tm-epo-variation-element' ) ) {
					if ( field.is( 'select' ) ) {
						if ( field.val() !== '' ) {
							show = true;
						}
					} else if ( field.is( ':checkbox' ) ) {
						if ( field.is( ':checked' ) ) {
							show = true;
						}
					} else if ( field.is( ':radio' ) ) {
						if ( field.is( ':checked' ) ) {
							show = true;
							if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) {
								radios = field.closest( '.tc-element-inner-wrap' ).find( '.tm-epo-field.tmcp-radio' );
								radios.each( function() {
									$( this ).closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).hide();
								} );
							}
						}
					} else if ( field.val() ) {
						show = true;
					}

					tmqty = quantity_selector.find( '.tm-qty' );
					tmqtyval = tmqty.val();
					tmqtymin = tmqty.attr( 'min' ) || '';

					if ( show ) {
						if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) {
							quantity_selector.show();
						}

						tmqty.removeClass( 'ignore' ).prop( 'disabled', false );
					} else {
						if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) {
							quantity_selector.hide();
							if ( ! tmqtyval ) {
								tmqty.val( tmqtymin );
							}
						}

						tmqty.addClass( 'ignore' ).prop( 'disabled', true );
					}

					if ( epoHolder.is( '.tc-show' ) ) {
						setTimeout( function() {
							quantity_selector.closest( '.tcowl-carousel' ).trigger( 'refresh.owl.carousel' );
						}, 200 );
					}
				}
			} );

		epoFieldAll
			.off( 'change.cpfcustom' )
			.on( 'change.cpfcustom', function() {
				$( this ).closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' );
			} );

		epoFieldAll
			.off( 'change.cpf' )
			.on( 'change.cpf', function( event, data ) {
				var field = $( this );
				var is_li = field.closest( '.tmcp-field-wrap' );
				var is_ul = field.closest( '.tmcp-ul-wrap' );
				var is_replace;
				var connector = is_ul.attr( 'data-tm-connector' );

				if ( field.is( ':checkbox, :radio' ) ) {
					if ( field.is( ':radio' ) ) {
						if ( ! data ) {
							if ( connector !== undefined ) {
								$( '[data-tm-connector="' + connector + '"]' ).find( '.tmcp-field-wrap' ).removeClass( 'tc-active' ).find( '.tm-epo-reset-radio' ).addClass( 'tm-hidden' );
							} else {
								is_ul.find( '.tmcp-field-wrap' ).removeClass( 'tc-active' );
							}
						}
						if ( connector !== undefined ) {
							$( '[data-tm-connector="' + connector + '"]' ).find( '.tmcp-field-wrap' ).removeClass( 'tc-active' ).find( '.tm-epo-reset-radio' ).addClass( 'tm-hidden' );
						}
					}
					if ( field.is( ':checked' ) ) {
						is_li.addClass( 'tc-active' );
					} else {
						is_li.removeClass( 'tc-active' );
					}
				}

				if ( ! field.is( '.tm-epo-variation-element' ) ) {
					if ( field.is( '.use_images:checkbox, .use_images:radio' ) && field.attr( 'data-imagec' ) ) {
						is_replace = is_li.find( '.radio-image,.checkbox-image' ).first();
						if ( is_replace.length > 0 ) {
							if ( field.is( ':checked' ) ) {
								is_replace.prop( 'src', field.attr( 'data-imagec' ) );
							} else {
								is_replace.prop( 'src', field.attr( 'data-image' ) );
							}
						}
					}

					if ( field.is( '.use_images:radio' ) ) {
						field
							.closest( '.cpf-type-radio' )
							.find( '.use_images:radio' )
							.not( field )
							.each( function() {
								var r = $( this );
								r.closest( '.tmcp-field-wrap' ).find( '.radio-image' ).first().prop( 'src', r.attr( 'data-image' ) );
							} );
					}

					if ( field.is( '.tmcp-range' ) ) {
						field.trigger( 'change.cpflogic' );
					}
					if ( field.is( 'select' ) ) {
						field.trigger( 'tm-select-change' );
					} else {
						if ( field.is( '.tmcp-radio' ) ) {
							field
								.closest( '.cpf-element' )
								.find( '.tm-quantity .tm-qty' )
								.each( function() {
									if ( ! $( this ).closest( 'li.tmcp-field-wrap' ).find( '.tmcp-radio' ).is( ':checked' ) ) {
										$( this ).attr( 'disabled', 'disabled' );
									} else {
										$( this ).prop( 'disabled', false );
									}
								} );
						}
						priceCache = true;
						currentCart.trigger( {
							type: 'tm-epo-update',
							norules: 1,
							element: field
						} );
						priceCache = false;
					}
				}

				field.trigger( 'tm_trigger_product_image' );

				if ( epoHolder.is( '.tc-show' ) ) {
					setTimeout( function() {
						$( '.tm-owl-slider' ).each( function() {
							$( this ).trigger( 'refresh.owl.carousel' );
						} );
					}, 200 );
				}
				main_product.trigger( 'tm_attempt_product_image', {
					element: field,
					main_product: main_product,
					epo_holder: epoHolder
				} );
			} );

		epoFieldAll.filter( '.tm-epo-field:text,input.tm-epo-field[type="number"],textarea.tm-epo-field' )
			.off( 'input.cpf' )
			.on( 'input.cpf', function() {
				$( this ).trigger( 'change.cpf' );
			} );

		epoFieldAll
			.filter( ':checkbox:checked, :radio:checked' )
			.each( function() {
				$( this ).closest( '.tmcp-field-wrap' ).addClass( 'tc-active' );
				$( this ).trigger( 'change.cpf' );
			} );

		epoFieldHasClearButton
			.off( 'change.cpfclearbutton' )
			.on( 'change.cpfclearbutton cpfclearbutton', function() {
				var field = $( this );
				var radioResetElement;
				var fieldWrap = field.closest( '.tmcp-field-wrap' );
				var fieldSearch;

				if ( field.is( ':checked' ) ) {
					fieldSearch = field.closest( '.tc-element-inner-wrap' );

					if ( fieldSearch.find( '.tc-epo-element-product-li-container' ).length ) {
						fieldSearch = fieldSearch.find( '.tmcp-ul-wrap' ).first().children( '.tmcp-field-wrap' ).not( '.tc-epo-element-product-li-container' );
					}

					radioResetElement = fieldSearch.find( '.tm-epo-reset-radio' );
					if ( ! radioResetElement.length ) {
						radioResetElement = field.closest( '.tc-element-inner-wrap' ).find( '.tm-epo-reset-radio' ).first();
					}
					radioResetElement.removeClass( 'tm-hidden' );

					fieldWrap.append( radioResetElement );
				}
			} );

		epoResetRadio
			.off( 'click.cpf' )
			.on( 'click.cpf', function() {
				var radioResetElement = $( this );
				var fieldContainer = radioResetElement.closest( '.tc-element-inner-wrap' );
				var checkedRadios = fieldContainer.find( '.tm-epo-field.tmcp-radio:checked' );

				if ( checkedRadios.length ) {
					checkedRadios.prop( 'checked', false );
					checkedRadios.trigger( 'change', { forced: 1 } );
				}

				radioResetElement.addClass( 'tm-hidden' );
			} );

		if ( _ && _.debounce ) {
			epoFieldText.on( 'keyup',
				_.debounce( function() {
					var $this = $( this );

					if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' && $.tc_validator && $this.closest( '.tmcp-ul-wrap' ).data( 'tm-validation' ) && $this.tc_rules() ) {
						currentCart.tc_validate().element( $this );
					}
					$this.trigger( 'change.cpf' );
					$this.closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' );
				}, 10 )
			);
		}

		epoFieldUpload
			.off( 'change.cpfv tcupload' )
			.on( 'change.cpfv tcupload', function() {
				var field = $( this );
				var label = field.closest( 'label' );
				var li = field.closest( '.tmcp-field-wrap' );
				var cpfUploadContainer = li.find( '.cpf-upload-container' );
				var name = li.find( '.tm-filename' );
				var val = field.val().replace( 'C:\\fakepath\\', '' );
				var valHidden = [];
				var num_uploads;
				var windowURL = window.URL || window.webkitURL;
				var files;
				var image;
				var uploadPreview = li.find( '.tc-upload-preview' );
				var addImage;
				var uniqid;

				if ( cpfUploadContainer.length && name.length <= 0 ) {
					name = $( '<span class="tm-filename"></span>' );
					label.after( name );
				}
				if ( val === undefined || val === 'undefined' ) {
					val = '';
				}

				field.next( '.tmcp-upload-hidden' ).remove();

				valHidden = field.attr( 'data-file' );
				valHidden = valHidden ? valHidden.split( '|' ) : [];
				if ( this.files ) {
					files = Array.from( this.files );
				} else if ( valHidden.length > 0 ) {
					files = valHidden;
				}

				if ( files.length > 1 ) {
					name.html( '' + files.length + ' ' + ( files.length === 1 ? TMEPOJS.i18n_file : TMEPOJS.i18n_files ) );
				} else if ( files.length === 1 ) {
					name.html( val );
				} else {
					name.empty();
				}
				if ( ! uploadPreview.length ) {
					uploadPreview = $( '<div class="tc-upload-preview tc-hidden"></div>' );
					li.append( uploadPreview );
				}

				uploadPreview.empty();

				num_uploads = epoHolder.data( 'num_uploads' );
				if ( ! num_uploads ) {
					num_uploads = [];
				}
				uniqid = field.closest( '.cpf-element' ).attr( 'data-uniqid' );
				if ( ! num_uploads[ uniqid ] ) {
					num_uploads[ uniqid ] = [];
				}

				if ( ( val || files.length > 0 ) && windowURL && windowURL.createObjectURL ) {
					if ( TMEPOJS.tm_epo_upload_inline_image_preview === 'yes' ) {
						if ( files.length > 1 ) {
							uploadPreview.addClass( 'multiple' );
						} else {
							uploadPreview.removeClass( 'multiple' );
						}
						uploadPreview.removeClass( 'tc-hidden' );
					}
					addImage = function( dataFile, src, i, fileHolder, ext ) {
						var size = field[ 0 ].files && field[ 0 ].files[ i ] && field[ 0 ].files[ i ].size ? field[ 0 ].files[ i ].size : 0;
						var imageHTML = '<div class="tc-upload-image">';
						if ( src ) {
							imageHTML = imageHTML + '<img src="' + src + '">';
						} else {
							imageHTML = imageHTML + '<div class="tc-file-ext-overlay"></div>';
						}
						imageHTML = imageHTML + '<div class="tc-file-name">' + dataFile.name + '</div>';
						if ( ClipboardEvent || DataTransfer ) {
							imageHTML = imageHTML + '<button type="button" class="tc-upload-remove"><svg width="26" height="26" viewBox="0 0 26 26" xmlns="http://www.w3.org/2000/svg"><path d="M11.586 13l-2.293 2.293a1 1 0 0 0 1.414 1.414L13 14.414l2.293 2.293a1 1 0 0 0 1.414-1.414L14.414 13l2.293-2.293a1 1 0 0 0-1.414-1.414L13 11.586l-2.293-2.293a1 1 0 0 0-1.414 1.414L11.586 13z" fill="currentColor" fill-rule="nonzero"/></svg></button>';
						}
						if ( ext ) {
							imageHTML = imageHTML + '<div class="tc-file-ext">' + ext + '</div>';
						}
						imageHTML = imageHTML + '<div class="tc-file-size">' + readableFileSize( size ) + '</div>';
						imageHTML = imageHTML + '</div>';
						fileHolder.append( imageHTML );
					};

					files.forEach( function( dataFile, i ) {
						var fileHolder;
						if ( TMEPOJS.tm_epo_upload_inline_image_preview === 'yes' ) {
							fileHolder = $( '<div class="tc-upload-file"></div>' );
							uploadPreview.append( fileHolder );
							image = new Image();
							image.onload = function() {
								addImage( dataFile, this.src, i, fileHolder );
							};
							image.onerror = function() {
								addImage( dataFile, false, i, fileHolder, dataFile.name.split( '.' ).pop() );
							};
							if ( valHidden.length > 0 ) {
								image.src = valHidden[ i ];
							} else {
								image.src = windowURL.createObjectURL( dataFile );
								windowURL.revokeObjectURL( dataFile );
							}
						}
						num_uploads[ uniqid ].push( dataFile.name );
					} );
					epoHolder.data( 'num_uploads', num_uploads );
				} else {
					delete num_uploads[ uniqid ];
				}
				if ( num_uploads[ uniqid ] && num_uploads[ uniqid ].length === 0 ) {
					delete num_uploads[ uniqid ];
				}
			} );

		jDocument.on( 'click', '.tc-upload-remove', function() {
			var $this = $( this );
			var val;
			var cpfElement;
			var input;
			var fileWrap;
			var li;
			var uploadPreview;
			var name;
			var index;
			var files;
			var dT;
			var num_uploads;
			var uniqid;
			var uploadHidden;
			var dataFiles;

			if ( ClipboardEvent || DataTransfer ) {
				cpfElement = $this.closest( '.cpf-element' );
				input = cpfElement.find( '.tm-epo-field' );
				fileWrap = $this.closest( '.tc-upload-file' );
				li = $this.closest( '.tmcp-field-wrap' );
				uploadPreview = li.find( '.tc-upload-preview' );
				name = li.find( '.tm-filename' );
				index = fileWrap.index();
				val = input.val().replace( 'C:\\fakepath\\', '' );
				if ( val === undefined || val === 'undefined' ) {
					val = '';
				}

				files = Array.from( input[ 0 ].files );
				files.splice( index, 1 );
				dT = new ClipboardEvent( '' ).clipboardData || new DataTransfer();

				files.forEach( function( dataFile ) {
					dT.items.add( dataFile );
				} );

				if ( files.length > 1 ) {
					uploadPreview.addClass( 'multiple' );
				} else {
					uploadPreview.removeClass( 'multiple' );
				}

				input[ 0 ].files = dT.files;
				fileWrap.remove();
				if ( dT.files.length > 1 ) {
					name.html( '' + dT.files.length + ' ' + ( dT.files.length === 1 ? TMEPOJS.i18n_file : TMEPOJS.i18n_files ) );
				} else if ( dT.files.length === 1 ) {
					name.html( val );
				} else {
					name.empty();
				}

				num_uploads = epoHolder.data( 'num_uploads' );
				if ( ! num_uploads ) {
					num_uploads = [];
				}
				uniqid = cpfElement.closest( '.cpf-element' ).attr( 'data-uniqid' );
				if ( ! num_uploads[ uniqid ] ) {
					num_uploads[ uniqid ] = [];
				}

				num_uploads[ uniqid ].splice( index, 1 );
				if ( num_uploads[ uniqid ].length === 0 ) {
					delete num_uploads[ uniqid ];
					input.val( '' );
				}

				uploadHidden = input.next( '.tmcp-upload-hidden' );
				if ( uploadHidden.length ) {
					dataFiles = uploadHidden.val().split( '|' );
					if ( dataFiles.length > 0 ) {
						dataFiles.splice( index, 1 );
					}
					if ( dataFiles.length === 0 ) {
						uploadHidden.remove();
					} else {
						uploadHidden.val( dataFiles.join( '|' ) );
					}
				}

				epoHolder.data( 'num_uploads', num_uploads );
			}
		} );

		qtyElement
			.off( 'change.cpf input.cpf' )
			.on( 'change.cpf input.cpf', function() {
				var field = $( this );

				currentCart.trigger( 'tm-epo-check-dpd' );
				field.data( 'tm-prev-value', field.val() );
				// It is required than when you update the product quantity
				// to recalculate the option price to accommodate price types
				// that depend on quantity
				currentCart.trigger( {
					type: 'tm-epo-update',
					norules: 2
				} );
			} )
			.data( 'tm-prev-value', qtyElement.val() );

		// Support for math formula on associated products when they are initially hidden
		epoHolder
			.find( '.cpf-type-product' )
			.off( 'tc-logic' )
			.on( 'tc-logic', function() {
				var $this = $( this );
				if ( $this.find( '.tc-init' ).length ) {
					return;
				}
				if ( $this.data( 'isactive' ) && ! $this.data( 'donetclogic' ) ) {
					$this.data( 'donetclogic', true );
					$this.find( '.tc-epo-field-product' ).trigger( 'change.cpfproduct', { forced: 3 } );
				}
			} );

		// Product element checkbox required status fix
		epoHolder
			.find( '.cpf-type-product .tc-epo-field-product.tc-epo-field-product-checkbox' )
			.off( 'change.cpfrequired' )
			.on( 'change.cpfrequired', function() {
				var $this = $( this );
				var cpfElement = $this.closest( '.cpf-element' );
				var checkboxes;
				var checkboxesChecked;
				var checkboxesNotChecked;
				if ( cpfElement.is( '.tc-is-required' ) ) {
					checkboxes = cpfElement.find( '.tmcp-field.tc-epo-field-product-checkbox' );
					checkboxesNotChecked = checkboxes.not( ':checked' );
					checkboxesChecked = cpfElement.find( '.tmcp-field.tc-epo-field-product-checkbox:checked' );

					if ( checkboxesChecked.length > 0 ) {
						checkboxesNotChecked.prop( 'required', false );
						checkboxesChecked.prop( 'required', true );
					} else {
						checkboxes.attr( 'required', true );
						checkboxes.prop( 'required', true );
					}
				}
			} );

		// Product element variable product support
		epoHolder
			.find( '.cpf-type-product .tc-epo-field-product' )
			.off( 'change.cpfproduct' )
			.on( 'change.cpfproduct', function( e, data ) {
				var $this = $( this );
				var value;
				var type;
				var selected;
				var variableProductContainers;
				var thisVariableProductContainer;
				var elementContainer = $this.closest( '.cpf-element' );
				var productContainerWraps = elementContainer.find( '.tc-epo-element-product-container-wrap' );
				var thisProductContainerWrap = $this.closest( '.tmcp-field-wrap' ).find( '.tc-epo-element-product-container-wrap' );
				var hasProductContainerWrap = thisProductContainerWrap.length > 0;
				var postData;
				var skip = false;
				var isTrigger = 1000;
				var qtyalt;
				var associatedSetter = $this;
				var associatedElement;
				var isFilled;
				var productPrice;
				var originalProductPrice;
				var epoField = elementContainer.find( '.tm-epo-field' ).not( '.tc-epo-element-product-li-container .tm-epo-field' );
				var checked = epoField.filter( ':checked' );
				var qty;
				var counter = $this.attr( 'data-counter' );

				if ( false === elementContainer.data( 'isactive' ) ) {
					return;
				}
				if ( data && data.forced === 2 ) {
					return;
				}

				if ( e.isTrigger !== undefined && $this.data( 'triggeredonce' ) && ! ( data && data.forced ) ) {
					return;
				}

				$this.data( 'triggeredonce', 1 );

				if ( ! $this.is( ':checkbox' ) ) {
					isTrigger = e.isTrigger;
				}

				if ( epoField.is( ':radio' ) ) {
					if ( checked.length > 0 ) {
						qty = checked.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' );
					}
				} else if ( epoField.is( ':checkbox' ) ) {
					if ( checked.length > 0 ) {
						qty = $this.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' );
					}
				} else {
					qty = epoField.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' );
				}

				if ( $this.is( ':checkbox' ) ) {
					if ( $this.is( '.tc-epo-field-product-hidden' ) ) {
						if ( $this.is( ':checked' ) ) {
							productContainerWraps.addClass( 'tc-active-product' );
						} else {
							productContainerWraps.removeClass( 'tc-active-product' );
						}

						value = $this.val();
						type = $this.attr( 'data-type' );
						elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' );
					} else {
						if ( ! $this.is( ':checked' ) ) {
							if ( hasProductContainerWrap ) {
								thisProductContainerWrap.addClass( 'tm-hidden' );
							}
							if ( ! ( data && data.forced ) ) {
								return;
							}
							skip = true;
						} else if ( hasProductContainerWrap ) {
							thisProductContainerWrap.removeClass( 'tm-hidden' );
						}
						if ( ! skip ) {
							value = $this.val();
							type = $this.attr( 'data-type' );
							elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' );
						}
					}
				} else if ( $this.is( ':radio' ) ) {
					if ( ! $this.is( ':checked' ) ) {
						if ( hasProductContainerWrap ) {
							thisProductContainerWrap.addClass( 'tm-hidden' );
						}
						if ( ! ( data && data.forced ) ) {
							return;
						}
						skip = true;
					} else if ( hasProductContainerWrap ) {
						productContainerWraps.addClass( 'tm-hidden' );
						thisProductContainerWrap.removeClass( 'tm-hidden' );
					}
					if ( ! skip ) {
						value = $this.val();
						type = $this.attr( 'data-type' );
						elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' );
					}
				} else if ( $this.is( 'select' ) ) {
					selected = $this.children( ':selected' );
					associatedSetter = selected;
					counter = selected.index();
					if ( $this.children( ':first' ).val() === '' ) {
						counter--;
					}
					value = $this.val();
					type = selected.attr( 'data-type' );
					elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' );
				}

				if ( $this.is( '.tc-epo-field-product-checkbox' ) ) {
					variableProductContainers = thisProductContainerWrap.find( '.tc-epo-element-product-container' );
				} else {
					variableProductContainers = elementContainer.find( '.tc-epo-element-product-container' );
				}

				thisVariableProductContainer = variableProductContainers.filter( '[data-product_id="' + value + '"]' );

				qtyalt = thisVariableProductContainer.find( tcAPI.associateQtySelector );

				if ( productContainerWraps.html() !== '' && qty && qty.length > 0 && qtyalt.length === 0 ) {
					qty.val( 0 );
				}
				if ( $this.is( ':checkbox' ) ) {
					if ( $this.is( '.tc-epo-field-product-hidden' ) ) {
						if ( $this.is( ':checked' ) ) {
							if ( qtyalt.val() === '0' ) {
								if ( qtyalt.attr( 'min' ) !== '0' ) {
									qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' );
								}
							}
						} else {
							qtyalt.val( 0 );
							qtyalt.closest( '.tm-quantity-alt' ).removeClass( 'tm-hidden' );
							if ( data.forced !== 1 ) {
								qtyalt.closest( '.tm-quantity-alt' ).find( '.single_add_to_cart_product' ).trigger( 'cpfqtybutton' );
							}
							productContainerWraps.find( tcAPI.associatedEpoCart ).trigger( 'tm-epo-update' );
						}
					}
				} else if ( $this.is( ':radio' ) ) {
					if ( $this.val() && ! $this.data( 'set_initial' ) ) {
						if ( qtyalt.val() === '0' ) {
							if ( qtyalt.attr( 'min' ) !== '0' ) {
								qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' );
							}
							$this.data( 'set_initial', 1 );
						}
					}
				} else if ( $this.is( 'select' ) ) {
					if ( $this.val() && ! $this.data( 'set_initial' ) ) {
						if ( qtyalt.val() === '0' ) {
							if ( qtyalt.attr( 'min' ) !== '0' ) {
								qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' );
							}
							$this.data( 'set_initial', 1 );
						}
					}
				} else {
					return;
				}

				if ( ! value ) {
					variableProductContainers.addClass( 'tm-hidden' );
					productPrice = $.epoAPI.util.parseJSON( associatedSetter.attr( 'data-rules' ) );
					productPrice = productPrice[ 0 ] || 0;
					originalProductPrice = $.epoAPI.util.parseJSON( associatedSetter.attr( 'data-original-rules' ) );
					originalProductPrice = originalProductPrice || 0;
					if ( associatedSetter.is( '.tcenabled' ) ) {
						associatedSetter.data( 'associated_price_set', 1 );
					}
					associatedSetter.data( 'price_set', 1 );
					associatedSetter.data( 'raw_price', productPrice );
					associatedSetter.data( 'raw_original_price', originalProductPrice );
					associatedSetter.data( 'price', productPrice );
					associatedSetter.data( 'original_price', originalProductPrice );

					associatedElement = associatedSetter;
					if ( associatedElement.is( 'option' ) ) {
						associatedElement = associatedSetter.closest( 'select' );
					}
					isFilled = false;
					if ( associatedElement.is( '.tc-epo-field-product' ) ) {
						if ( associatedElement.is( 'select' ) ) {
							if ( associatedElement.val() !== '' ) {
								isFilled = true;
							}
						} else if ( ( associatedElement.is( ':checkbox' ) || associatedElement.is( ':radio' ) ) ) {
							if ( associatedElement.is( ':checked' ) ) {
								isFilled = true;
							}
						} else if ( associatedElement.val() !== '' ) {
							isFilled = true;
						}
					}
					tm_force_update_price(
						associatedSetter
							.closest( '.tmcp-field-wrap' )
							.find( '.tc-price' )
							.not( tcAPI.associatedEpoSelector + ' .tc-price' ),
						productPrice,
						isFilled ? tm_set_price_totals( productPrice ) : associatedSetter.data( 'price-html' ),
						originalProductPrice,
						isFilled ? tm_set_price_totals( originalProductPrice ) : ''
					);

					qtyElement.trigger( 'change.cpf' );

					return;
				}

				if ( thisVariableProductContainer.length === 0 ) {
					// parent_id is used for customization purposes.
					postData = {
						action: 'wc_epo_get_associated_product_html',
						product_id: value,
						parent_id: epoHolder.attr( 'data-product-id' ),
						mode: elementContainer.attr( 'data-mode' ),
						layout_mode: elementContainer.attr( 'data-product-layout-mode' ),
						uniqid: elementContainer.attr( 'data-uniqid' ),
						name: $this.attr( 'name' ),
						counter: counter,
						quantity_min: elementContainer.attr( 'data-quantity-min' ),
						quantity_max: elementContainer.attr( 'data-quantity-max' ),
						priced_individually: elementContainer.attr( 'data-priced-individually' ),
						discount: elementContainer.attr( 'data-discount' ),
						discount_type: elementContainer.attr( 'data-discount-type' ),
						discount_exclude_addons: elementContainer.attr( 'data-discount-exclude-addons' ),
						show_image: elementContainer.attr( 'data-show-image' ),
						show_title: elementContainer.attr( 'data-show-title' ),
						show_title_link: elementContainer.attr( 'data-show-title-link' ),
						show_price: elementContainer.attr( 'data-show-price' ),
						show_description: elementContainer.attr( 'data-show-description' ),
						show_meta: elementContainer.attr( 'data-show-meta' ),
						disable_epo: elementContainer.attr( 'data-disable-epo' )
					};

					elementContainer.block( { message: null, overlayCSS: { background: '#fff', opacity: 0.6 } } );
					$.ajax( {
						url: TMEPOJS.ajax_url,
						type: 'POST',
						data: postData,
						dataType: 'json',
						success: function( response ) {
							if ( response.result === 200 ) {
								thisVariableProductContainer = $( response.html );
								if ( hasProductContainerWrap ) {
									$this.closest( '.tmcp-field-wrap' ).find( '.tc-epo-element-product-container-wrap' ).empty().append( thisVariableProductContainer );
								} else {
									elementContainer.find( '.tc-epo-element-product-container-wrap' ).append( thisVariableProductContainer );
								}
								show_product_html( epoObject, main_product, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt );
								thisVariableProductContainer.find( tcAPI.associateQtySelector ).trigger( 'change' );
							}
						},
						complete: function() {
							elementContainer.unblock();
						}
					} );
				} else {
					show_product_html( epoObject, main_product, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt );
					thisVariableProductContainer.find( tcAPI.associateQtySelector ).trigger( 'change' );
				}
			} );

		jDocument
			.off( 'click.cpfqtybutton cpfqtybutton', '.cpf-type-product .single_add_to_cart_product' )
			.on( 'click.cpfqtybutton cpfqtybutton', '.cpf-type-product .single_add_to_cart_product', function() {
				var $this = $( this );
				var qtyalt = $this.closest( '.tm-quantity-alt' ).find( tcAPI.associateQtySelector );
				var isAdd = $this.is( '.alt' );
				var productContainerWraps = $this.closest( '.cpf-element' ).find( '.tc-epo-element-product-container-wrap' );
				var qtyMin;
				var qtyMax;

				if ( $this.data( 'inittriggeredonce' ) ) {
					qtyMin = $.epoAPI.math.toInt( qtyalt.attr( 'data-min' ) );
					qtyMax = $.epoAPI.math.toInt( qtyalt.attr( 'data-max' ) );
					if ( isAdd ) {
						productContainerWraps.addClass( 'tc-active-product' );
						qtyalt.attr( 'min', qtyMin );
						if ( qtyMax ) {
							qtyalt.attr( 'max', qtyMax );
						}
						if ( qtyalt.val() === '0' ) {
							if ( qtyalt.attr( 'min' ) === '0' ) {
								qtyalt.val( 1 ).trigger( 'change' );
							} else {
								qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' );
							}
						}
						$this.removeClass( 'alt' ).text( $this.attr( 'data-remove' ) );
					} else {
						productContainerWraps.removeClass( 'tc-active-product' );
						qtyalt.val( 0 ).trigger( 'change' );
						qtyalt.closest( '.tm-quantity-alt' ).removeClass( 'tm-hidden' );
						$this.addClass( 'alt' ).text( $this.attr( 'data-add' ) );
					}
				}

				$this.data( 'inittriggeredonce', 1 );

				productContainerWraps.find( tcAPI.associatedEpoCart ).trigger( 'tm-epo-update' );
			} );

		jDocument
			.off( 'change.cpfqtyalt input.cpfqtyalt', '.cpf-type-product ' + tcAPI.associateQtySelector )
			.on( 'change.cpfqtyalt input.cpfqtyalt', '.cpf-type-product ' + tcAPI.associateQtySelector, function() {
				var $this = $( this );
				var epoField = $this.closest( '.cpf-element' ).find( '.tm-epo-field' ).not( '.tc-epo-element-product-li-container .tm-epo-field' );
				var addButton = $this.closest( '.tm-quantity-alt' ).find( '.single_add_to_cart_product' );
				var checked = epoField.filter( ':checked' );
				var qty;
				var qtyMin;
				var qtyMax;
				var associatedEpoCart;

				qtyMin = $.epoAPI.math.toInt( $this.attr( 'min' ) );
				qtyMax = $.epoAPI.math.toInt( $this.attr( 'max' ) );

				if ( epoField.is( '.tc-epo-field-product-hidden' ) && epoField.is( ':checkbox' ) ) {
					if ( checked.length === 0 && $this.val() !== '0' ) {
						epoField.prop( 'checked', true ).trigger( 'change' );
						checked = epoField.filter( ':checked' );
					} else if ( $this.val() === '0' && checked.length ) {
						epoField.prop( 'checked', false ).trigger( 'change' );
					}
				}

				if ( epoField.is( ':radio' ) ) {
					if ( checked.length === 0 ) {
						return;
					}
					qty = checked.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ).not( '.tc-element-qty' );
				} else if ( epoField.is( ':checkbox' ) ) {
					if ( checked.length === 0 ) {
						return;
					}
					qty = $this.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ).not( '.tc-element-qty' );
				} else {
					qty = epoField.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ).not( '.tc-element-qty' );
				}

				if ( qty.length === 0 ) {
					return;
				}

				qty.attr( 'min', qtyMin );
				if ( qtyMax ) {
					qty.attr( 'max', qtyMax );
				}
				associatedEpoCart = $this.closest( '.tc-epo-element-product-container' ).find( tcAPI.associatedEpoCart );
				associatedEpoCart.trigger( 'tm-epo-update' );

				qty.val( $this.val() );

				if ( $.epoAPI.math.toFloat( $this.val() ) > 0 ) {
					associatedEpoCart.find( '.tm-epo-field.tcenabled' ).removeClass( 'ignore' );
					$this.removeClass( 'ignore' );
				} else {
					associatedEpoCart.find( '.tm-epo-field.tcenabled' ).addClass( 'ignore' );
					$this.addClass( 'ignore' );
				}
				epoField.trigger( 'change.cpfproduct', { forced: 2 } );
				if ( addButton.data( 'inittriggeredonce' ) ) {
					if ( $this.val() === '0' ) {
						addButton.removeClass( 'alt' );
					} else {
						addButton.addClass( 'alt' );
					}
				}
				addButton.trigger( 'cpfqtybutton' );
			} );

		// Global update event
		currentCart.off( 'tm-epo-update' ).on( 'tm-epo-update', function( event ) {
			var cart = $( this );
			var bundleid;
			var productPrice = false;
			var rawProductPrice = 0;
			var productRegularPrice = false;
			var rawProductRegularPrice = 0;
			var total = 0;
			var original_total = 0;
			var showTotal = false;
			var cartQty;
			var elementQty = 1;
			var priceOverrideMode;
			var perProductPricing = true;
			var floatingBoxData = [];
			var currentVariation;
			var cart_fee_options_total = 0;
			var cart_fee_options_original_total = 0;
			var _total;
			var _original_total;
			var late_total_price;
			var tc_totals_ob = {};
			var formatted_options_total;
			var formatted_options_original_total;
			var formatted_fees_total;
			var formatted_fees_original_total;
			var formatted_final_total;
			var formatted_final_original_total;
			var extraFee = 0;
			var raw_extraFee = 0;
			var product_total_price;
			var product_total_original_price;
			var calculateFinalProductPrice;
			var total_plus_fee;
			var original_total_plus_fee;
			var product_total_price_without_options;
			var unit_price;
			var unit_original_price;
			var formatted_unit_price;
			var formatted_unit_original_price;
			var html;
			var show_options_total = false;
			var show_vat_options_total = false;
			var show_fees_total = false;
			var formatted_extra_fee = '';
			var show_extra_fee = false;
			var show_final_total = false;
			var hide_native_price;
			var update_native_html;
			var _fprice;
			var _f_regular_price;
			var customerPriceFormat;
			var currentEpoObject;
			var raw_total;
			var raw__total;
			var raw_original_total;
			var raw__original_total;
			var raw_cart_fee_options_total;
			var raw_cart_fee_options_original_total;
			var raw_total_plus_fee;
			var raw_original_total_plus_fee;
			var raw_product_total_price_without_options;
			var raw_product_total_price;
			var raw_product_total_original_price;
			var fetch;
			var customer_price_format_wrap_start = '';
			var customer_price_format_wrap_end = '';
			var associatedSetter;
			var associatedPrice;
			var associatedRawPrice;
			var associatedOriginalPrice;
			var associatedRawOriginalPrice;
			var associatedFormattedPrice;
			var associatedFormattedOriginalPrice;
			var nativeProductPriceSelector;
			var elementsLength;
			var productFieldSyncVatTotal = 0;
			var productFieldSyncTotal = 0;
			var productFieldSyncOriginalTotal = 0;
			var productFieldSyncTotalTaxed = 0;
			var productFieldSyncOriginalTotalTaxed = 0;
			var totalProductField = 0;
			var originalTotalProductField = 0;
			var totalProductFieldTaxed = 0;
			var originalTotalProductFieldTaxed = 0;
			var _ftotal;
			var _foriginal_total;
			var totalsHolder_tc_totals_ob;
			var temp;
			var vat_options_total;
			var vat_options_total_plus_fee;
			var formatted_vat_options_total;
			var formatted_vat_options_total_plus_fee;
			var vat_total;
			var formatted_vat_total;
			var vat_product_base;
			var formatted_vat_product_base;
			var pricesIncludeTax;
			var dynamicCheck;
			var dynamicProductPrice = 0;

			if ( event.epoObject ) {
				currentEpoObject = $.extend( true, {}, event.epoObject );
			} else {
				currentEpoObject = $.extend( true, {}, epoObject );
			}

			if ( ! currentEpoObject ) {
				return;
			}

			if ( currentEpoObject.noEpoUpdate ) {
				return;
			}

			jWindow.trigger( 'tcEpoUpdateStart', {
				epo: currentEpoObject,
				alternativeCart: currentEpoObject,
				this_product_type: this_product_type,
				cart: cart,
				totalsHolder: totalsHolder,
				fetchOptionPrices: fetchOptionPrices,
				epoHolder: epoHolder
			} );

			bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, currentEpoObject );
			priceOverrideMode = totalsHolder.attr( 'data-price-override' );
			cartQty = getCurrentQty( cart );
			currentVariation = getCurrentVariation( cart );

			if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) {
				cartQty = parseFloat(
					currentEpoObject.main_product
						.find( tcAPI.associateQtySelector )
						.not( tcAPI.associatedEpoSelector + ' ' + tcAPI.qtySelector )
						.last()
						.val()
				);
			}

			event.stopImmediatePropagation();

			productPrice = $.epoAPI.applyFilter( 'tcGetCurrentProductPrice', tm_calculate_product_price( totalsHolder, true ), currentCart, totalsHolder );

			rawProductPrice = productPrice;

			productRegularPrice = $.epoAPI.applyFilter( 'tcGetCurrentProductRegularPrice', tm_calculate_product_regular_price( totalsHolder, true ), currentCart, totalsHolder );

			rawProductRegularPrice = productRegularPrice;

			productPrice = $.epoAPI.applyFilter( 'tcCalculateCurrentProductPrice', productPrice, {
				epo: currentEpoObject,
				alternativeCart: alternativeCart,
				cart: cart,
				main_product: main_product
			} );

			if ( ! Number.isFinite( cartQty ) ) {
				if ( totalsHolder.attr( 'data-is-sold-individually' ) || getQtyElement( cart ).length === 0 ) {
					cartQty = 1;
				}
			}

			// needed for inital math calculation
			totalsHolder_tc_totals_ob = {
				qty: cartQty,
				product_price: rawProductPrice,
				original_product_price: rawProductRegularPrice
			};
			totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );

			if ( ! event.norules ) {
				tm_epo_rules( currentEpoObject, cart );
			} else if ( event.norules ) {
				if ( event.norules === 1 ) {
					tm_element_epo_rules( currentEpoObject, event.element );
				}
				$.tcepo.lateFieldsPrices[ epoEventId ] = [];

				epoHolder
					.find( '.tm-epo-late-field' )
					.toArray()
					.forEach( function( setter ) {
						setter = $( setter );
						setter.data( 'price', 0 );
						$.tcepo.lateFieldsPrices[ epoEventId ].push( {
							setter: setter,
							price: setter.data( 'tm-price-for-late' ),
							original_price: setter.data( 'tm-original-price-for-late' ),
							bundleid: bundleid,
							pricetype: get_type( currentEpoObject, setter, 'price_type' )
						} );
					} );
			}

			// Check for dynamic elements.
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-dynamic.dynamic-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)', 0, 0, floatingBoxData, showTotal, undefined, undefined, undefined, true );
				productPrice = fetch.total;
				dynamicProductPrice = productPrice;
				rawProductRegularPrice = fetch.original_total;
				totalsHolderContainer.find( '.cpf-dynamic-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.dynamic_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) {
				associatedSetter = currentEpoObject.associated_connect;
				if ( currentEpoObject.associated_connect.is( 'select' ) ) {
					associatedSetter = currentEpoObject.associated_connect.find( 'option:selected' );
				}
			}

			// No reason to continue if the product price is invalid
			if ( productPrice === false ) {
				totalsHolder.data( 'tm-floating-box-data', [] );
				totalsHolder.empty();
				if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) {
					tm_force_update_price(
						associatedSetter
							.closest( '.tmcp-field-wrap' )
							.find( '.tc-price' )
							.not( tcAPI.associatedEpoSelector + ' .tc-price' ),
						0,
						'',
						0,
						''
					);
				}
				main_cart.trigger( 'tm-epo-short-update', {
					container: cartContainer
				} );
				return;
			}

			elementQty = $.epoAPI.applyFilter( 'tcAlterElementQty', elementQty, {
				epo: currentEpoObject,
				alternativeCart: alternativeCart,
				currentCart: currentCart,
				main_product: main_product
			} );

			if ( currentCart.data( 'per_product_pricing' ) !== undefined ) {
				perProductPricing = currentCart.data( 'per_product_pricing' );
			}

			perProductPricing = $.epoAPI.applyFilter( 'tcCalculatePerProductPricing', perProductPricing, {
				epo: currentEpoObject,
				alternativeCart: alternativeCart,
				cart: cart,
				main_product: main_product
			} );

			if ( main_epo_inside_form && TMEPOJS.tm_epo_totals_box_placement === 'woocommerce_before_add_to_cart_button' ) {
				if ( ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) && ! totalsHolder.data( 'moved_inside' ) ) {
					totalsHolder.data( 'moved_inside', 1 );
				}
			}

			jWindow.trigger( 'tcEpoBeforeOptionPriceCalculation', {
				epo: currentEpoObject,
				alternativeCart: currentEpoObject,
				this_product_type: this_product_type,
				cart: cart,
				totalsHolder: totalsHolder,
				fetchOptionPrices: fetchOptionPrices,
				epoHolder: epoHolder,
				total: total,
				original_total: original_total,
				floatingBoxData: floatingBoxData,
				showTotal: showTotal,
				cart_fee_options_total: cart_fee_options_total,
				cart_fee_options_original_total: cart_fee_options_original_total
			} );

			if ( ! currentEpoObject.associated_connect && ! event.noassociated ) {
				if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && ! cart.is( $.tcAPI().associatedEpoCart ) ) {
					cart.find( $.tcAPI().associatedEpoCart ).filter( ':visible' ).toArray().forEach( function( acart ) {
						$( acart ).trigger( {
							type: 'tm-epo-update',
							noassociated: 1
						} );
					} );
				}
			}

			fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field:not(.tmcp-dynamic,.tc-epo-field-product, .tc-is-math-special, .tc-is-math-cumulative)', total, original_total, floatingBoxData, showTotal );
			total = fetch.total;
			original_total = fetch.original_total;
			floatingBoxData = fetch.floatingBoxData;
			showTotal = fetch.showTotal;
			elementsLength = fetch.elementsLength;

			fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tc-epo-field-product', productFieldSyncTotal, productFieldSyncOriginalTotal, floatingBoxData, showTotal );
			productFieldSyncTotal = fetch.total;
			productFieldSyncOriginalTotal = fetch.original_total;
			productFieldSyncTotalTaxed = fetch.total_taxed;
			productFieldSyncOriginalTotalTaxed = fetch.original_total_taxed;
			productFieldSyncVatTotal = fetch.vat_total;
			floatingBoxData = fetch.floatingBoxData;
			showTotal = fetch.showTotal;
			elementsLength = elementsLength + fetch.elementsLength;

			totalsHolder.data( 'tm-floating-box-data', floatingBoxData );

			fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-fee-field', cart_fee_options_total, cart_fee_options_original_total, floatingBoxData, showTotal, false, true );
			cart_fee_options_total = fetch.total;
			cart_fee_options_original_total = fetch.original_total;
			floatingBoxData = fetch.floatingBoxData;
			showTotal = fetch.showTotal;
			elementsLength = elementsLength + fetch.elementsLength;

			jWindow.trigger( 'tcEpoAfterNormalOptionPriceCalculation', {
				epo: currentEpoObject,
				alternativeCart: currentEpoObject,
				this_product_type: this_product_type,
				cart: cart,
				totalsHolder: totalsHolder,
				fetchOptionPrices: fetchOptionPrices,
				epoHolder: epoHolder,
				total: total,
				original_total: original_total,
				floatingBoxData: floatingBoxData,
				showTotal: showTotal,
				cart_fee_options_total: cart_fee_options_total,
				cart_fee_options_original_total: cart_fee_options_original_total
			} );

			// Original price + options price type requires this here.
			_total = total;
			_original_total = original_total;

			late_total_price = add_late_fields_prices( currentEpoObject, parseFloat( productPrice ), parseFloat( rawProductRegularPrice ), parseFloat( _total + productFieldSyncTotal ), parseFloat( _original_total + productFieldSyncOriginalTotal ), bundleid, totalsHolder );

			fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tc-is-math-special:not(.tmcp-dynamic)', total, original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true );
			total = fetch.total;
			original_total = fetch.original_total;
			floatingBoxData = fetch.floatingBoxData;
			showTotal = fetch.showTotal;
			elementsLength = elementsLength + fetch.elementsLength;

			_total = total;
			_original_total = original_total;

			_total = _total + late_total_price.normal[ 0 ];
			_original_total = _original_total + late_total_price.normal[ 1 ];

			cart_fee_options_total = cart_fee_options_total + late_total_price.fees[ 0 ];
			cart_fee_options_original_total = cart_fee_options_original_total + late_total_price.fees[ 1 ];

			total = _total;
			original_total = _original_total;
			fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tc-is-math-cumulative:not(.tmcp-dynamic)', total, original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true, true );
			total = fetch.total;
			original_total = fetch.original_total;
			floatingBoxData = fetch.floatingBoxData;
			showTotal = fetch.showTotal;
			elementsLength = elementsLength + fetch.elementsLength;

			_total = total;
			_original_total = original_total;

			// Check for dynamic elements.
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.dynamic-product-price.tc-is-math-special' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.dynamic-product-price.tc-is-math-special' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-special', dynamicProductPrice + total, dynamicProductPrice + original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true );
				dynamicProductPrice = $.epoAPI.math.toFloat( fetch.total ) - $.epoAPI.math.toFloat( total );
				productPrice = dynamicProductPrice;
				rawProductRegularPrice = $.epoAPI.math.toFloat( fetch.original_total ) - $.epoAPI.math.toFloat( original_total );
				totalsHolderContainer.find( '.cpf-dynamic-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.dynamic_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tmcp-dynamic.dynamic-product-price.tc-is-math-cumulative', dynamicProductPrice + total, dynamicProductPrice + original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true );
				dynamicProductPrice = $.epoAPI.math.toFloat( fetch.total ) - $.epoAPI.math.toFloat( total );
				productPrice = dynamicProductPrice;
				rawProductRegularPrice = $.epoAPI.math.toFloat( fetch.original_total ) - $.epoAPI.math.toFloat( original_total );
				totalsHolderContainer.find( '.cpf-dynamic-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.dynamic_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			// Check if there are any dynamic product price elements
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.dynamic-product-price' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.dynamic-product-price' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( ! dynamicCheck.length > 0 ) {
				totalsHolderContainer.find( '.cpf-dynamic-product-price' ).val( '' );
			}

			// Dynamic Calculation
			dynamicProductPrice = 0;
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					var setterVal;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-dynamic.calculation:not(.tc-is-math-special, .tc-is-math-cumulative)', dynamicProductPrice, dynamicProductPrice, [], true, true );
					setterVal = f.total;
					if ( setter.is( '.result-as-price' ) ) {
						setterVal = tm_set_price_totals( setterVal, totalsHolder, true, false );
					}
					ulWrap.find( '.tc-result' ).html( setterVal );
				} );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.calculation.tc-is-math-special' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.calculation.tc-is-math-special' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					var setterVal;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-field.tmcp-dynamic.calculation.tc-is-math-special', dynamicProductPrice + total, dynamicProductPrice + original_total, [], true, true, undefined, undefined, true );
					setterVal = $.epoAPI.math.toFloat( f.total ) - $.epoAPI.math.toFloat( total );
					if ( setter.is( '.result-as-price' ) ) {
						setterVal = tm_set_price_totals( setterVal, totalsHolder, true, false );
					}
					ulWrap.find( '.tc-result' ).html( setterVal );
				} );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.calculation.tc-is-math-cumulative' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.calculation.tc-is-math-cumulative' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					var setterVal;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-field.tmcp-dynamic.calculation.tc-is-math-cumulative', dynamicProductPrice + total, dynamicProductPrice + original_total, [], true, true, undefined, undefined, true );
					setterVal = $.epoAPI.math.toFloat( f.total ) - $.epoAPI.math.toFloat( total );
					if ( setter.is( '.result-as-price' ) ) {
						setterVal = tm_set_price_totals( setterVal, totalsHolder, true, false );
					}
					ulWrap.find( '.tc-result' ).html( setterVal );
				} );
			}

			// Dynamic Weight
			dynamicProductPrice = 0;
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-dynamic.change-product-weight:not(.tc-is-math-special, .tc-is-math-cumulative)', dynamicProductPrice, dynamicProductPrice, [], true, true );
					ulWrap.find( '.tc-result' ).html( f.total );
				} );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.change-product-weight.tc-is-math-special' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.change-product-weight.tc-is-math-special' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-special', dynamicProductPrice + total, dynamicProductPrice + original_total, [], true, true, undefined, undefined, true );
					ulWrap.find( '.tc-result' ).html( $.epoAPI.math.toFloat( f.total ) - $.epoAPI.math.toFloat( total ) );
				} );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.change-product-weight.tc-is-math-cumulative' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.change-product-weight.tc-is-math-cumulative' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				dynamicCheck.toArray().forEach( function( setter ) {
					var f;
					var ulWrap;
					setter = $( setter );
					ulWrap = setter.closest( '.tmcp-ul-wrap' );
					f = fetchOptionPrices( epoObject, ulWrap, '.tmcp-field.tmcp-dynamic.change-product-weight.tc-is-math-cumulative', dynamicProductPrice + total, dynamicProductPrice + original_total, [], true, true, undefined, undefined, true );
					ulWrap.find( '.tc-result' ).html( $.epoAPI.math.toFloat( f.total ) - $.epoAPI.math.toFloat( total ) );
				} );
			}

			// Check for dynamic override elements
			dynamicProductPrice = 0;
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-dynamic.override-product-price:not(.tc-is-math-special, .tc-is-math-cumulative)', dynamicProductPrice, dynamicProductPrice, floatingBoxData, showTotal );
				dynamicProductPrice = fetch.total;
				productPrice = dynamicProductPrice;
				rawProductRegularPrice = fetch.original_total;
				_total = dynamicProductPrice;
				_original_total = dynamicProductPrice;
				totalsHolderContainer.find( '.cpf-override-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.override_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.override-product-price.tc-is-math-special' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.override-product-price.tc-is-math-special' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-special', dynamicProductPrice + total, dynamicProductPrice + original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true );
				dynamicProductPrice = $.epoAPI.math.toFloat( fetch.total ) - $.epoAPI.math.toFloat( total );
				productPrice = dynamicProductPrice;
				rawProductRegularPrice = $.epoAPI.math.toFloat( fetch.original_total ) - $.epoAPI.math.toFloat( original_total );
				_total = dynamicProductPrice;
				_original_total = dynamicProductPrice;
				totalsHolderContainer.find( '.cpf-override-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.override_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			dynamicCheck = epoHolder.find( '.tmcp-dynamic.override-product-price.tc-is-math-cumulative' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.override-product-price.tc-is-math-cumulative' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( dynamicCheck.length > 0 ) {
				fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field.tmcp-dynamic.override-product-price.tc-is-math-cumulative', dynamicProductPrice + total, dynamicProductPrice + original_total, floatingBoxData, showTotal, undefined, undefined, undefined, true );
				dynamicProductPrice = $.epoAPI.math.toFloat( fetch.total ) - $.epoAPI.math.toFloat( total );
				productPrice = dynamicProductPrice;
				rawProductRegularPrice = $.epoAPI.math.toFloat( fetch.original_total ) - $.epoAPI.math.toFloat( original_total );
				_total = dynamicProductPrice;
				_original_total = dynamicProductPrice;
				totalsHolderContainer.find( '.cpf-override-product-price' ).val( dynamicProductPrice );
				totalsHolder_tc_totals_ob.override_product_price = dynamicProductPrice;
				totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob );
			}

			// Check if there are any dynamic override elements
			dynamicCheck = epoHolder.find( '.tmcp-dynamic.override-product-price' );
			if ( currentEpoObject.is_associated === false ) {
				dynamicCheck = dynamicCheck.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-dynamic.override-product-price' );
			}
			dynamicCheck = dynamicCheck.filter( '.tcenabled' );
			if ( ! dynamicCheck.length > 0 ) {
				totalsHolderContainer.find( '.cpf-override-product-price' ).val( '' );
			} else {
				_total = 0;
				_original_total = 0;
			}

			jWindow.trigger( 'tcEpoAfterOptionPriceCalculation', {
				epo: currentEpoObject,
				alternativeCart: currentEpoObject,
				this_product_type: this_product_type,
				cart: cart,
				totalsHolder: totalsHolder,
				fetchOptionPrices: fetchOptionPrices,
				epoHolder: epoHolder,
				total: total,
				original_total: original_total,
				floatingBoxData: floatingBoxData,
				showTotal: showTotal,
				cart_fee_options_total: cart_fee_options_total,
				cart_fee_options_original_total: cart_fee_options_original_total
			} );

			setTimeout( function() {
				epoHolder.find( 'select.tm-epo-field' ).trigger( 'tm-select-price-update-html-all' );
			}, 1 );

			$.tcepo.oneOptionIsSelected[ epoEventId ] = showTotal;
			currentEpoObject = addShowHidetoEpoObject( currentEpoObject, epoEventId, elementsLength );
			tm_show_hide_add_to_cart_button( main_product, currentEpoObject );

			if ( cart_fee_options_total > 0 ) {
				showTotal = true;
			}

			if ( alternativeCart && ! perProductPricing ) {
				showTotal = false;
			}

			if (
				finalTotalBoxMode === 'enable' ||
				finalTotalBoxMode === 'hideifoptionsiszero' ||
				finalTotalBoxMode === 'hideiftotaliszero'
			) {
				showTotal = true;
			}

			if ( cartQty > 1 ) {
				showTotal = true;
			}
			if ( ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) && ! $.epoAPI.math.toFloat( currentVariation ) ) {
				showTotal = false;
			}

			if ( finalTotalBoxMode === 'disable' ) {
				showTotal = false;
			}
			if ( TMEPOJS.tm_epo_change_variation_price === 'yes' || TMEPOJS.tm_epo_change_original_price === 'yes' ) {
				showTotal = true;
			}

			if ( currentEpoObject.is_associated && ! perProductPricing ) {
				showTotal = false;
			}

			if ( TMEPOJS.tm_epo_total_price_as_unit_price === 'yes' ) {
				cartQty = 1;
			}

			product_total_price = parseFloat( productPrice * cartQty );

			if ( TMEPOJS.extraFee ) {
				extraFee = parseFloat( TMEPOJS.extraFee );
				if ( ! Number.isFinite( extraFee ) ) {
					extraFee = 0;
				}
			}

			calculateFinalProductPrice = $.epoAPI.applyFilter( 'tcCalculateFinalProductPrice', false, {
				alternativeCart: alternativeCart,
				product_price: productPrice,
				product_total_price: product_total_price,
				v_product_price: rawProductPrice,
				tm_set_tax_price: tm_set_tax_price,
				main_product: main_product,
				totalsHolder: totalsHolder,
				cartQty: cartQty
			} );

			if (
				calculateFinalProductPrice !== false &&
				typeof calculateFinalProductPrice === 'object' &&
				Object.prototype.hasOwnProperty.call( calculateFinalProductPrice, 'productPrice' ) &&
				Object.prototype.hasOwnProperty.call( calculateFinalProductPrice, 'productTotalPrice' )
			) {
				productPrice = calculateFinalProductPrice.productPrice;
				product_total_price = calculateFinalProductPrice.productTotalPrice;
			}

			_total = $.epoAPI.applyFilter( 'tc_adjust_options_price_per_unit', _total, product_total_price );
			total = parseFloat( _total * cartQty * elementQty );
			total = $.epoAPI.applyFilter( 'tc_adjust_options_total_price', total, cartQty, elementQty, _total, totalsHolder );
			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'no' ) {
				totalProductField = parseFloat( productFieldSyncTotal );
				totalProductFieldTaxed = parseFloat( productFieldSyncTotalTaxed );
			} else {
				totalProductField = parseFloat( productFieldSyncTotal * cartQty * elementQty );
				totalProductFieldTaxed = parseFloat( productFieldSyncTotalTaxed * cartQty * elementQty );
			}
			totalProductField = $.epoAPI.applyFilter( 'tc_adjust_options_productfield_total_price', totalProductField, cartQty, elementQty, _total, totalsHolder );
			totalProductFieldTaxed = $.epoAPI.applyFilter( 'tc_adjust_options_productfield_total_price_taxed', totalProductFieldTaxed, cartQty, elementQty, _total, totalsHolder );

			_original_total = $.epoAPI.applyFilter( 'tc_adjust_options_price_per_unit', _original_total, product_total_price );
			original_total = parseFloat( _original_total * cartQty * elementQty );
			original_total = $.epoAPI.applyFilter( 'tc_adjust_options_original_total_price', original_total, cartQty, elementQty, _original_total, totalsHolder );
			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'no' ) {
				originalTotalProductField = parseFloat( productFieldSyncOriginalTotal );
				originalTotalProductFieldTaxed = parseFloat( productFieldSyncOriginalTotalTaxed );
			} else {
				originalTotalProductField = parseFloat( productFieldSyncOriginalTotal * cartQty * elementQty );
				originalTotalProductFieldTaxed = parseFloat( productFieldSyncOriginalTotalTaxed * cartQty * elementQty );
			}
			originalTotalProductField = $.epoAPI.applyFilter( 'tc_adjust_options_productfield_original_total_price', originalTotalProductField, cartQty, elementQty, _original_total, totalsHolder );
			originalTotalProductFieldTaxed = $.epoAPI.applyFilter( 'tc_adjust_options_productfield_original_total_price_taxed', originalTotalProductFieldTaxed, cartQty, elementQty, _original_total, totalsHolder );

			if ( priceOverrideMode === '1' && parseFloat( total ) > 0 ) {
				productPrice = 0;
				rawProductPrice = 0;
				product_total_price = 0;
			}

			product_total_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_price_without_options', product_total_price );

			total = $.epoAPI.applyFilter( 'tcAdjustTotal', total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );
			totalProductField = $.epoAPI.applyFilter( 'tcAdjustProductFieldTotal', totalProductField, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );
			totalProductFieldTaxed = $.epoAPI.applyFilter( 'tcAdjustProductFieldTotalTaxed', totalProductFieldTaxed, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );
			original_total = $.epoAPI.applyFilter( 'tcAdjustOriginalTotal', original_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );
			originalTotalProductField = $.epoAPI.applyFilter( 'tcAdjustProductFieldOriginalTotal', originalTotalProductField, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );
			originalTotalProductFieldTaxed = $.epoAPI.applyFilter( 'tcAdjustProductFieldOriginalTotalTaxed', originalTotalProductFieldTaxed, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				cart: cart,
				main_product: main_product
			} );

			total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_total', total, totalsHolder ) );
			cart_fee_options_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_totals_fee', cart_fee_options_total, totalsHolder ) );
			original_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_original_total', original_total, totalsHolder ) );
			cart_fee_options_original_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_original_total_fee', cart_fee_options_original_total, totalsHolder ) );
			raw_extraFee = extraFee;

			total_plus_fee = total + cart_fee_options_total;
			original_total_plus_fee = original_total + cart_fee_options_original_total;

			raw_total = total;
			raw__total = _total;

			raw_cart_fee_options_total = cart_fee_options_total;
			raw_total_plus_fee = total_plus_fee;

			raw_original_total = original_total;
			raw__original_total = _original_total;

			raw_cart_fee_options_original_total = cart_fee_options_original_total;
			raw_original_total_plus_fee = original_total_plus_fee;

			raw_product_total_price_without_options = product_total_price;
			raw_product_total_price = parseFloat( product_total_price + total_plus_fee + raw_extraFee );
			raw_product_total_original_price = parseFloat( rawProductRegularPrice + original_total_plus_fee + raw_extraFee );

			productPrice = tm_set_tax_price( productPrice, totalsHolder, undefined, undefined, undefined, undefined, true );
			productRegularPrice = tm_set_tax_price( productRegularPrice, totalsHolder, undefined, undefined, undefined, undefined, true );
			product_total_price = tm_set_tax_price( product_total_price, totalsHolder, undefined, undefined, undefined, undefined, true );

			total = tm_set_tax_price( total, totalsHolder, undefined, undefined, undefined, undefined, true );
			_total = tm_set_tax_price( _total, totalsHolder, undefined, undefined, undefined, undefined, true );

			cart_fee_options_total = tm_set_tax_price( cart_fee_options_total, totalsHolder, undefined, undefined, undefined, undefined, true );
			total_plus_fee = parseFloat( cart_fee_options_total ) + parseFloat( total );

			original_total = tm_set_tax_price( original_total, totalsHolder, undefined, undefined, undefined, undefined, true );
			_original_total = tm_set_tax_price( _original_total, totalsHolder, undefined, undefined, undefined, undefined, true );

			cart_fee_options_original_total = tm_set_tax_price( cart_fee_options_original_total, totalsHolder, undefined, undefined, undefined, undefined, true );
			original_total_plus_fee = parseFloat( cart_fee_options_original_total ) + parseFloat( original_total );

			extraFee = tm_set_tax_price( extraFee, totalsHolder, undefined, undefined, undefined, undefined, true );

			// Calculate product price
			product_total_price_without_options = product_total_price;
			product_total_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_price', parseFloat( product_total_price + total_plus_fee + extraFee ), product_total_price_without_options, total_plus_fee, extraFee, total, cart_fee_options_total, totalsHolder );
			product_total_original_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_original_price', parseFloat( product_total_price_without_options + original_total_plus_fee + extraFee ), product_total_price_without_options, original_total_plus_fee, extraFee, original_total, cart_fee_options_original_total, totalsHolder );

			// Calculate vat options total
			pricesIncludeTax = totalsHolder.attr( 'data-prices-include-tax' ) || TMEPOJS.prices_include_tax;
			if ( pricesIncludeTax === '1' ) {
				vat_options_total = productFieldSyncVatTotal + parseFloat( calculateTaxAmount( total, totalsHolder ) );
				vat_options_total_plus_fee = productFieldSyncVatTotal + parseFloat( calculateTaxAmount( total_plus_fee, totalsHolder ) );
				vat_total = productFieldSyncVatTotal + parseFloat( calculateTaxAmount( product_total_price, totalsHolder ) );
				vat_product_base = parseFloat( calculateTaxAmount( product_total_price_without_options, totalsHolder ) );
			} else {
				vat_options_total = productFieldSyncVatTotal + parseFloat( total - raw_total );
				vat_options_total_plus_fee = productFieldSyncVatTotal + parseFloat( total_plus_fee - raw_total_plus_fee );
				vat_total = productFieldSyncVatTotal + parseFloat( product_total_price - raw_product_total_price );
				vat_product_base = parseFloat( product_total_price_without_options - raw_product_total_price_without_options );
			}

			raw_total = raw_total + totalProductField;
			raw__total = raw__total + totalProductField;
			raw_total_plus_fee = raw_total_plus_fee + totalProductField;
			raw_original_total = raw_original_total + originalTotalProductField;
			raw__original_total = raw__original_total + originalTotalProductField;
			raw_original_total_plus_fee = raw_original_total_plus_fee + originalTotalProductField;
			raw_product_total_price = raw_product_total_price + totalProductField;
			raw_product_total_original_price = raw_product_total_original_price + originalTotalProductField;
			total = total + totalProductFieldTaxed;
			_total = _total + totalProductFieldTaxed;
			total_plus_fee = total_plus_fee + totalProductFieldTaxed;
			original_total = original_total + originalTotalProductFieldTaxed;
			_original_total = _original_total + originalTotalProductFieldTaxed;
			original_total_plus_fee = original_total_plus_fee + originalTotalProductFieldTaxed;
			product_total_price = product_total_price + totalProductFieldTaxed;
			product_total_original_price = product_total_original_price + originalTotalProductFieldTaxed;

			// Calculate unit price
			unit_price = parseFloat( productPrice + parseFloat( _total ) );
			unit_original_price = parseFloat( productPrice + parseFloat( _original_total ) );
			if ( TMEPOJS.tm_epo_fees_on_unit_price === 'yes' ) {
				unit_price = parseFloat( productPrice + parseFloat( _total ) + parseFloat( parseFloat( cart_fee_options_total ) / cartQty ) );
				unit_original_price = parseFloat( productPrice + parseFloat( _original_total ) + parseFloat( parseFloat( cart_fee_options_original_total ) / cartQty ) );
			}

			// Format unit price
			formatted_unit_price = tm_set_price_totals( unit_price, totalsHolder, true, true );
			formatted_unit_original_price = tm_set_price_totals( unit_original_price, totalsHolder, true, true );

			// Format extra fee
			if ( extraFee ) {
				show_extra_fee = true;
				formatted_extra_fee = tm_set_price_totals( extraFee, totalsHolder, true, true );
			}

			// Format final total
			formatted_final_total = tm_set_price_totals( product_total_price, totalsHolder, true, true );
			formatted_final_original_total = tm_set_price_totals( product_total_original_price, totalsHolder, true, true );

			// Format options total
			formatted_options_total = tm_set_price_totals( total, totalsHolder, true, true );

			// Format fees total
			formatted_fees_total = tm_set_price_totals( cart_fee_options_total, totalsHolder, true, true );

			// Format options original total
			formatted_options_original_total = tm_set_price_totals( original_total, totalsHolder, true, true );

			// Format fees original total
			formatted_fees_original_total = tm_set_price_totals( cart_fee_options_original_total, totalsHolder, true, true );

			// Format vat options total
			formatted_vat_options_total = tm_set_price_totals( vat_options_total );
			formatted_vat_options_total_plus_fee = tm_set_price_totals( vat_options_total_plus_fee );
			formatted_vat_total = tm_set_price_totals( vat_total );
			formatted_vat_product_base = tm_set_price_totals( vat_product_base );

			// Backwards compatibility
			formatted_unit_price = $.epoAPI.applyFilter( 'tc_adjust_formatted_unit_price', formatted_unit_price, productPrice, _total, cart_fee_options_total, cartQty );
			formatted_options_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_options_total', formatted_options_total, total, _total, cartQty );
			formatted_fees_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_fees_total', formatted_fees_total, cart_fee_options_total );
			formatted_final_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_final_total', formatted_final_total, product_total_price, product_total_price_without_options, total_plus_fee, extraFee, cartQty );

			formatted_unit_price = $.epoAPI.applyFilter( 'tcAdjustFormattedUnitPrice', formatted_unit_price, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				unit_price: unit_price,
				productPrice: productPrice,
				_total: _total,
				total_plcart_fee_options_totals_fee: cart_fee_options_total,
				cartQty: cartQty
			} );
			formatted_unit_original_price = $.epoAPI.applyFilter( 'tcAdjustFormattedUnitOriginalPrice', formatted_unit_original_price, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				unit_original_price: unit_original_price,
				productPrice: productPrice,
				_original_total: _original_total,
				total_plcart_fee_options_totals_fee: cart_fee_options_total,
				cartQty: cartQty
			} );
			formatted_options_total = $.epoAPI.applyFilter( 'tcAdjustFormattedOptionsTotal', formatted_options_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				total: total,
				_total: _total,
				total_plus_fee: total_plus_fee,
				extraFee: extraFee,
				cartQty: cartQty
			} );
			formatted_options_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedOptionsOriginalTotal', formatted_options_original_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				original_total: original_total,
				_original_total: _original_total,
				original_total_plus_fee: original_total_plus_fee,
				extraFee: extraFee,
				cartQty: cartQty
			} );
			formatted_fees_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFeesTotal', formatted_fees_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				cart_fee_options_total: cart_fee_options_total,
				extraFee: extraFee,
				cartQty: cartQty
			} );
			formatted_fees_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFeesOriginalTotal', formatted_fees_original_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				cart_fee_options_original_total: cart_fee_options_original_total,
				extraFee: extraFee,
				cartQty: cartQty
			} );
			formatted_final_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFinalTotal', formatted_final_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				product_total_price: product_total_price,
				product_total_price_without_options: product_total_price_without_options,
				total_plus_fee: total_plus_fee,
				extraFee: extraFee,
				cartQty: cartQty
			} );
			formatted_final_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFinalOriginalTotal', formatted_final_original_total, {
				epo: currentEpoObject,
				totalsHolder: totalsHolder,
				event: event,
				product_total_original_price: product_total_original_price,
				product_total_price_without_options: product_total_price_without_options,
				original_total_plus_fee: original_total_plus_fee,
				extraFee: extraFee,
				cartQty: cartQty
			} );

			if ( ( total > 0 && finalTotalBoxShowOptions === 'showtgz' ) || finalTotalBoxShowOptions === 'show' ) {
				show_options_total = true;
				if ( TMEPOJS.tm_epo_enable_vat_options_total === 'yes' ) {
					show_vat_options_total = true;
				}
			}
			if ( cart_fee_options_total !== 0 ) {
				show_fees_total = true;
			}

			if ( formatted_final_total && finalTotalBoxShowFinal === 'show' ) {
				show_final_total = true;
			}

			tc_totals_ob = {
				qty: cartQty,
				product_price: productPrice,
				raw_product_price: rawProductPrice,
				product_regular_price: productRegularPrice,
				raw_product_regular_price: rawProductRegularPrice,
				formatted_product_price: tm_set_price_totals( parseFloat( productPrice ) * cartQty ),

				late_total_prices: late_total_price,
				late_total_price: tm_set_tax_price( late_total_price[ 0 ], totalsHolder ),
				late_total_original_price: tm_set_tax_price( late_total_price[ 1 ], totalsHolder ),

				raw_options_price_per_unit: raw__total,
				raw_options_total_price: raw_total,
				raw_cart_fee_options_total_price: raw_cart_fee_options_total,
				raw_total_plus_fee: raw_total_plus_fee,

				raw_options_original_price_per_unit: raw__original_total,
				raw_options_original_total_price: raw_original_total,
				raw_cart_fee_options_original_total_price: raw_cart_fee_options_original_total,
				raw_original_total_plus_fee: raw_original_total_plus_fee,

				raw_product_total_price: raw_product_total_price,
				raw_product_total_original_price: raw_product_total_original_price,
				raw_product_total_price_without_options: raw_product_total_price_without_options,

				options_price_per_unit: _total,
				options_total_price: total,
				cart_fee_options_total_price: cart_fee_options_total,
				total_plus_fee: total_plus_fee,

				options_original_price_per_unit: _original_total,
				options_original_total_price: original_total,
				cart_fee_options_total_original_price: cart_fee_options_original_total,
				original_total_plus_fee: original_total_plus_fee,

				vat_options_total: vat_options_total,
				vat_options_total_plus_fee: vat_options_total_plus_fee,
				formatted_vat_options_total: formatted_vat_options_total,
				formatted_vat_options_total_plus_fee: formatted_vat_options_total_plus_fee,
				vat_total: vat_total,
				formatted_vat_total: formatted_vat_total,
				vat_product_base: vat_product_base,
				formatted_vat_product_base: formatted_vat_product_base,

				product_total_price: product_total_price,
				product_total_original_price: product_total_original_price,
				product_total_price_without_options: product_total_price_without_options,

				product_unit_price: unit_price,
				product_unit_original_price: unit_original_price,
				formatted_unit_price: formatted_unit_price,
				formatted_options_total: formatted_options_total,
				formatted_fees_total: formatted_fees_total,
				formatted_final_total: formatted_final_total,

				formatted_unit_original_price: formatted_unit_original_price,
				formatted_options_original_total: formatted_options_original_total,
				formatted_fees_original_total: formatted_fees_original_total,
				formatted_final_original_total: formatted_final_original_total,

				formatted_extra_fee: formatted_extra_fee,

				show_options_total: show_options_total,
				show_fees_total: show_fees_total,
				show_extra_fee: show_extra_fee,
				show_final_total: show_final_total,
				show_options_vat: show_vat_options_total,

				unit_price: TMEPOJS.i18n_unit_price,
				show_unit_price: TMEPOJS.tm_epo_show_unit_price === 'yes',
				options_total: TMEPOJS.i18n_options_total,
				fees_total: TMEPOJS.i18n_fees_total,
				extra_fee: TMEPOJS.i18n_extra_fee,
				final_total: TMEPOJS.i18n_final_total,
				options_vat_total: TMEPOJS.i18n_vat_options_total,

				totals_box_before_unit_price: TMEPOJS.totals_box_before_unit_price,
				totals_box_after_unit_price: TMEPOJS.totals_box_after_unit_price,
				totals_box_before_vat_options_totals_price: TMEPOJS.totals_box_before_vat_options_totals_price,
				totals_box_after_vat_options_totals_price: TMEPOJS.totals_box_after_vat_options_totals_price,
				totals_box_before_options_totals_price: TMEPOJS.totals_box_before_options_totals_price,
				totals_box_after_options_totals_price: TMEPOJS.totals_box_after_options_totals_price,
				totals_box_before_fee_totals_price: TMEPOJS.totals_box_before_fee_totals_price,
				totals_box_after_fee_totals_price: TMEPOJS.totals_box_after_fee_totals_price,
				totals_box_before_extra_fee_price: TMEPOJS.totals_box_before_extra_fee_price,
				totals_box_after_extra_fee_price: TMEPOJS.totals_box_after_extra_fee_price,
				totals_box_before_final_totals_price: TMEPOJS.totals_box_before_final_totals_price,
				totals_box_after_final_totals_price: TMEPOJS.totals_box_after_final_totals_price
			};

			if ( TMEPOJS.customer_price_format ) {
				customer_price_format_wrap_start = TMEPOJS.customer_price_format_wrap_start;
				customer_price_format_wrap_end = TMEPOJS.customer_price_format_wrap_end;
				customerPriceFormat = TMEPOJS.customer_price_format;
			}

			if ( formatted_options_total && total > 0 ) {
				_ftotal = formatPrice( total );
				_foriginal_total = formatPrice( original_total );
				if ( customerPriceFormat ) {
					_ftotal = customerPriceFormat.replace( '__PRICE__', _ftotal ).replace( '__CODE__', TMEPOJS.current_currency );
					if ( ! totalsHolder.data( 'is-on-sale' ) ) {
						_foriginal_total = customerPriceFormat.replace( '__PRICE__', _foriginal_total ).replace( '__CODE__', TMEPOJS.current_currency );
					}
				}
				_ftotal = $.epoAPI.applyFilter( 'tcFilterFormattedFTotal', _ftotal, {
					epo: currentEpoObject,
					totalsHolder: totalsHolder,
					event: event,
					total: total,
					_total: _total,
					total_plus_fee: total_plus_fee,
					extraFee: extraFee,
					cartQty: cartQty
				} );
				_foriginal_total = $.epoAPI.applyFilter( 'tcFilterFormattedFOriginalTotal', _foriginal_total, {
					epo: currentEpoObject,
					totalsHolder: totalsHolder,
					event: event,
					original_total: original_total,
					total: original_total,
					_total: _total,
					total_plus_fee: total_plus_fee,
					extraFee: extraFee,
					cartQty: cartQty
				} );
				if ( TMEPOJS.tm_epo_enable_original_final_total === 'yes' && total !== original_total ) {
					tc_totals_ob.formatted_options_total = $.epoAPI.util.decodeHTML(
						$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, {
							price: _foriginal_total,
							sale_price: _ftotal,
							customer_price_format_wrap_start: customer_price_format_wrap_start,
							customer_price_format_wrap_end: customer_price_format_wrap_end
						} )
					);
					tc_totals_ob._foriginal_total = _foriginal_total;
					tc_totals_ob._ftotal = _ftotal;
				} else {
					tc_totals_ob.formatted_options_total = $.epoAPI.util.decodeHTML(
						$.epoAPI.util.decodeHTML(
							$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
								price: _ftotal,
								customer_price_format_wrap_start: customer_price_format_wrap_start,
								customer_price_format_wrap_end: customer_price_format_wrap_end
							} )
						)
					);
				}
			}

			if ( formatted_final_total && product_total_price >= 0 ) {
				_fprice = formatPrice( product_total_price );
				if ( priceOverrideMode === '1' && parseFloat( total ) > 0 ) {
					_f_regular_price = parseFloat( raw_original_total_plus_fee + extraFee );
				} else {
					_f_regular_price = parseFloat( parseFloat( rawProductRegularPrice * cartQty ) + raw_original_total_plus_fee + extraFee );
				}
				if ( customerPriceFormat ) {
					_fprice = customerPriceFormat.replace( '__PRICE__', _fprice ).replace( '__CODE__', TMEPOJS.current_currency );
					if ( ! totalsHolder.data( 'is-on-sale' ) ) {
						_f_regular_price = customerPriceFormat.replace( '__PRICE__', _f_regular_price ).replace( '__CODE__', TMEPOJS.current_currency );
					}
				}

				_fprice = $.epoAPI.applyFilter( 'tc_adjust_native_price', _fprice, product_total_price );
				_f_regular_price = tm_set_tax_price( _f_regular_price, totalsHolder, undefined, undefined, undefined, undefined, true );
				_f_regular_price = formatPrice( _f_regular_price );
				_f_regular_price = $.epoAPI.applyFilter( 'tc_adjust_native_regular_price', _f_regular_price, product_total_price );

				if ( TMEPOJS.tm_epo_enable_original_final_total === 'yes' && ( ( totalsHolder.data( 'is-on-sale' ) && priceOverrideMode !== '1' ) || _f_regular_price !== _fprice ) ) {
					tc_totals_ob.formatted_final_total = $.epoAPI.util.decodeHTML(
						$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, {
							price: _f_regular_price,
							sale_price: _fprice,
							customer_price_format_wrap_start: customer_price_format_wrap_start,
							customer_price_format_wrap_end: customer_price_format_wrap_end
						} )
					);
				} else {
					tc_totals_ob.formatted_final_total = $.epoAPI.util.decodeHTML(
						$.epoAPI.util.decodeHTML(
							$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
								price: _fprice,
								customer_price_format_wrap_start: customer_price_format_wrap_start,
								customer_price_format_wrap_end: customer_price_format_wrap_end
							} )
						)
					);
				}
				tc_totals_ob._f_regular_price = _f_regular_price;
				tc_totals_ob._fprice = _fprice;
			}

			tc_totals_ob = replace_suffixes( 'formatted_fees_original_total', 'cart_fee_options_total_original_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_fees_total', 'cart_fee_options_total_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_final_original_total', 'product_total_original_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_final_total', 'product_total_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_options_original_total', 'options_original_total_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_options_total', 'options_total_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_unit_original_price', 'product_unit_original_price', tc_totals_ob, totalsHolder );
			tc_totals_ob = replace_suffixes( 'formatted_unit_price', 'product_unit_price', tc_totals_ob, totalsHolder );

			if ( $.tcepo.showHideTotal !== undefined && $.tcepo.showHideTotal[ epoEventId ] !== undefined ) {
				showTotal = $.tcepo.showHideTotal[ epoEventId ];
			}

			tc_totals_ob = $.epoAPI.applyFilter( 'tc_adjust_tc_totals_ob', tc_totals_ob, {
				epo_object: currentEpoObject,
				showTotal: showTotal,
				epoHolder: epoHolder,
				totalsHolder: totalsHolder,
				tm_set_price: tm_set_price,
				tm_set_price_totals: tm_set_price_totals,
				product_total_price: product_total_price,
				product_price: productPrice,
				qty: cartQty
			} );

			if ( tc_totals_ob.showTotal !== undefined ) {
				showTotal = tc_totals_ob.showTotal;
			}

			currentEpoObject.tc_totals_ob = tc_totals_ob;

			showTotal = $.epoAPI.applyFilter( 'tcFinalTotalsBoxVisibility', showTotal, {
				epo: currentEpoObject,
				alternativeCart: alternativeCart,
				cart: cart,
				main_product: main_product,
				totalsHolder: totalsHolder,
				this_epo_totals_container: this_epo_totals_container
			} );

			html = $.epoAPI.template.html( tcAPI.templateEngine.tc_final_totals, tc_totals_ob );

			totalsHolder.data( 'tm-html', html );
			totalsHolder.data( 'tc_totals_ob', tc_totals_ob );

			if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) {
				if ( currentEpoObject.associated_connect.attr( 'data-no-price' ) === '1' ) {
					associatedPrice = 0;
					associatedRawPrice = 0;
					associatedOriginalPrice = 0;
					associatedRawOriginalPrice = 0;
					associatedFormattedPrice = '';
					associatedFormattedOriginalPrice = '';
					tm_force_update_price(
						associatedSetter
							.closest( '.tmcp-field-wrap' )
							.find( '.tc-price' )
							.not( tcAPI.associatedEpoSelector + ' .tc-price' ),
						associatedPrice,
						associatedFormattedPrice,
						associatedOriginalPrice,
						associatedFormattedOriginalPrice
					);
				} else {
					associatedPrice = tc_totals_ob.product_price + tc_totals_ob.options_price_per_unit + ( tc_totals_ob.cart_fee_options_total_price / tc_totals_ob.qty );
					associatedRawPrice = tc_totals_ob.raw_product_price + tc_totals_ob.raw_options_price_per_unit + ( tc_totals_ob.raw_cart_fee_options_total_price / tc_totals_ob.qty );
					associatedOriginalPrice = tc_totals_ob.product_regular_price + tc_totals_ob.options_original_price_per_unit + ( tc_totals_ob.cart_fee_options_total_original_price / tc_totals_ob.qty );
					associatedRawOriginalPrice = tc_totals_ob.raw_product_regular_price + tc_totals_ob.raw_options_original_price_per_unit + ( tc_totals_ob.raw_cart_fee_options_original_total_price / tc_totals_ob.qty );

					associatedFormattedPrice = tm_set_price( associatedPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter );
					associatedFormattedOriginalPrice = tm_set_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter );

					// Mainly used to update the price of the associated element when the associated product is variable.
					tm_force_update_price(
						associatedSetter
							.closest( '.tmcp-field-wrap' )
							.find( '.tc-price' )
							.not( tcAPI.associatedEpoSelector + ' .tc-price' ),
						associatedPrice,
						associatedFormattedPrice,
						associatedOriginalPrice,
						associatedFormattedOriginalPrice
					);

					currentEpoObject.associated_connect.data( 'tm-quantity', tc_totals_ob.qty );

					if ( currentEpoObject.associated_connect.data( 'tm-quantity' ) ) {
						associatedPrice = associatedPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) );
						associatedRawPrice = associatedRawPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) );
						associatedOriginalPrice = associatedOriginalPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) );
						associatedRawOriginalPrice = associatedRawOriginalPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) );
					}

					associatedFormattedPrice = tm_set_price( associatedPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter );
					associatedFormattedOriginalPrice = tm_set_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter );
				}

				currentEpoObject.associated_connect.data( 'price_set', 1 );
				if ( associatedSetter.is( '.tcenabled' ) ) {
					associatedSetter.data( 'associated_price_set', 1 );
				}
				associatedSetter.data( 'price_set', 1 );
				associatedSetter.data( 'raw_price', associatedRawPrice );
				associatedSetter.data( 'raw_original_price', associatedRawOriginalPrice );
				associatedSetter.data( 'price', tm_set_tax_price( associatedPrice, currentEpoObject.this_epo_totals_containe, associatedSetter ) );
				associatedSetter.data( 'original_price', tm_set_tax_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, associatedSetter ) );

				currentEpoObject.associated_connect.data( 'price-changed', 1 );

				setTimeout( function() {
					if ( ! ( currentEpoObject.associated_connect && event.noassociated ) ) {
						currentEpoObject.mainEpoObject.main_cart.trigger( {
							type: 'tm-epo-update',
							norules: 2
						} );
					}
				}, 20 );
			}

			jWindow.trigger( 'tcEpoAfterCalculateTotals', {
				epo: currentEpoObject,
				alternativeCart: alternativeCart,
				this_product_type: this_product_type,
				cart: cart,
				bundleid: bundleid,
				totalsObject: tc_totals_ob,
				main_product: main_product,
				per_product_pricing: perProductPricing
			} );

			hide_native_price = $.epoAPI.applyFilter( 'hide_native_price', true );

			if ( cartQty > 0 ) {
				// hide native prices
				if ( TMEPOJS.tm_epo_change_variation_price === 'yes' ) {
					if ( hide_native_price === true && finalTotalBoxMode !== 'disable' ) {
						tm_get_native_prices_block( cart ).hide();
					} else {
						tm_get_native_prices_block( cart ).show();
					}
				}

				if ( ! showTotal ||
					finalTotalBoxMode === 'disable' ||
					( finalTotalBoxMode === 'hideiftotaliszero' && product_total_price === 0 ) ||
					( finalTotalBoxMode === 'hideifoptionsiszero' && total_plus_fee === 0 )
				) {
					html = '';
					totalsHolder.html( html );
					totalsHolder.data( 'tm-floating-box-data', [] );
				} else {
					totalsHolder.html( html );

					jWindow.trigger( 'tc-totals-container', {
						epo: tc_totals_ob,
						totals_holder: totalsHolder,
						data: {
							epo_object: currentEpoObject,
							tm_set_price: tm_set_price,
							tm_set_price_totals: tm_set_price_totals,
							product_total_price: product_total_price,
							product_price: productPrice,
							qty: cartQty
						},
						tm_epo_js: TMEPOJS
					} );
				}

				if ( formatted_final_total && product_total_price >= 0 ) {
					update_native_html = tm_get_native_prices_block( cart );

					if ( TMEPOJS.tm_epo_change_variation_price === 'yes' ) {
						if ( totalsHolder.data( 'is-on-sale' ) ) {
							temp = $.epoAPI.util.decodeHTML(
								$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, {
									price: _f_regular_price,
									sale_price: _fprice,
									customer_price_format_wrap_start: customer_price_format_wrap_start,
									customer_price_format_wrap_end: customer_price_format_wrap_end,
									before_price_text: TMEPOJS.variation_price_before_price_text,
									after_price_text: TMEPOJS.variation_price_after_price_text
								} )
							);
							temp = {
								formatted: temp,
								raw: tc_totals_ob.product_total_price
							};
							temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder );
							temp = temp.formatted;
							update_native_html
								.html( temp )
								.show();
						} else {
							temp = $.epoAPI.util.decodeHTML(
								$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
									price: _fprice,
									customer_price_format_wrap_start: customer_price_format_wrap_start,
									customer_price_format_wrap_end: customer_price_format_wrap_end,
									before_price_text: TMEPOJS.variation_price_before_price_text,
									after_price_text: TMEPOJS.variation_price_after_price_text
								} )
							);
							temp = {
								formatted: temp,
								raw: tc_totals_ob.product_total_price
							};
							temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder );
							temp = temp.formatted;
							update_native_html
								.html( temp )
								.show();
						}
					}

					if ( TMEPOJS.tm_epo_change_original_price === 'yes' ) {
						if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) {
							if ( currentEpoObject.associated_connect ) {
								nativeProductPriceSelector = currentEpoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector );
							} else {
								nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector );
							}

							if ( nativeProductPriceSelector.length === 0 && main_product.is( '.tc-after-shop-loop' ) ) {
								nativeProductPriceSelector = main_product.closest( '.product' ).find( '.price' );
							}
							if ( nativeProductPriceSelector.data( 'tc-original-html' ) === undefined ) {
								nativeProductPriceSelector.data( 'tc-original-html', nativeProductPriceSelector.html() );
							}
							if ( product_total_price > 0 ) {
								if ( totalsHolder.data( 'is-on-sale' ) ) {
									temp = $.epoAPI.util.decodeHTML(
										$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, {
											price: _f_regular_price,
											sale_price: _fprice,
											customer_price_format_wrap_start: customer_price_format_wrap_start,
											customer_price_format_wrap_end: customer_price_format_wrap_end,
											before_price_text: TMEPOJS.product_price_before_price_text,
											after_price_text: TMEPOJS.product_price_after_price_text
										} )
									);
									temp = {
										formatted: temp,
										raw: tc_totals_ob.product_total_price
									};
									temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder );
									temp = temp.formatted;
									nativeProductPriceSelector
										.html( temp )
										.show();
								} else {
									temp = $.epoAPI.util.decodeHTML(
										$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
											price: _fprice,
											customer_price_format_wrap_start: customer_price_format_wrap_start,
											customer_price_format_wrap_end: customer_price_format_wrap_end,
											before_price_text: TMEPOJS.product_price_before_price_text,
											after_price_text: TMEPOJS.product_price_after_price_text
										} )
									);
									temp = {
										formatted: temp,
										raw: tc_totals_ob.product_total_price
									};
									temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder );
									temp = temp.formatted;
									nativeProductPriceSelector
										.html( temp )
										.show();
								}
							} else if ( this_product_type && this_product_type !== 'composite' ) {
								if ( currentEpoObject.associated_connect ) {
									if ( currentEpoObject.variations_form.length ) {
										temp = currentEpoObject.this_epo_totals_container.data( 'variationIdElement' );
										if ( temp.length > 0 ) {
											temp = parseFloat( temp.val() );
											if ( ! ( ! temp || temp === 0 ) ) {
												nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.assoc_current_free_text ) );
											}
										}
									} else {
										nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.assoc_current_free_text ) );
									}
								} else {
									nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.current_free_text ) );
								}
							}
						}

						jWindow.trigger( 'tcEpoMaybeChangePriceHtml', {
							epo: currentEpoObject,
							alternativeCart: alternativeCart,
							this_product_type: this_product_type,
							cart: cart,
							bundleid: bundleid,
							totalsObject: tc_totals_ob,
							main_product: main_product,
							nativePrice: _fprice
						} );
					}
				}

				if ( alternativeCart ) {
					main_cart.trigger( {
						type: 'tm-epo-update',
						norules: 1
					} );
				} else {
					this_epo_totals_container.data( 'is_active', true );
				}
			} else {
				if ( currentEpoObject.associated_connect ) {
					nativeProductPriceSelector = currentEpoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector );
					nativeProductPriceSelector.html( nativeProductPriceSelector.data( 'tc-original-html' ) );
				}

				tm_get_native_prices_block( cart ).each( function() {
					var $npb = $( this );
					if ( ! $npb.data( 'tm-original-html' ) ) {
						$npb.data( 'tm-original-html', $npb.html() );
					} else {
						$npb.html( $npb.data( 'tm-original-html' ) );
					}
				} );

				if ( rawProductPrice === 0 && TMEPOJS.tm_epo_remove_free_price_label === 'yes' ) {
					tm_get_native_prices_block( cart ).hide();
				} else if ( TMEPOJS.tm_epo_change_variation_price === 'yes' && ! ( hide_native_price === true && finalTotalBoxMode !== 'disable' ) ) {
					tm_get_native_prices_block( cart ).show();
				}

				totalsHolder.empty();

				if ( alternativeCart ) {
					main_cart.trigger( {
						type: 'tm-epo-update',
						norules: 1
					} );
				}
			}

			main_cart.trigger( 'tm-epo-after-update', {
				container: cartContainer
			} );

			jWindow.trigger( 'tc-epo-after-update', {
				epo: tc_totals_ob,
				totals_holder: totalsHolder,
				data: {
					epo_object: currentEpoObject,
					add_late_fields_prices: add_late_fields_prices,
					tm_set_price: tm_set_price,
					tm_set_price_totals: tm_set_price_totals,
					product_total_price: product_total_price,
					product_price: productPrice,
					qty: cartQty,
					bundleid: bundleid,
					currentCart: currentCart
				},
				tm_epo_js: TMEPOJS
			} );
		} );

		if ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) {
			epoVariationSection = epoHolder.find( '.tm-epo-variation-section' ).first();

			// Custom variation events
			epoVariationSection
				.find( '.tm-epo-reset-variation' )
				.off( 'click.cpfv' )
				.on( 'click.cpfv', function() {
					var field = $( this );
					var id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) );
					var section = field.closest( '.cpf-type-variations' );
					var inputs = field.closest( '.cpf-element' ).find( '.tm-epo-variation-element' );
					var lis = field.closest( '.cpf-element' ).find( '.tmcp-field-wrap' );

					inputs.prop( 'checked', false );
					lis.removeClass( 'tc-active' );
					variationForm
						.find( "[data-attribute_name='attribute_" + id + "']" )
						.val( '' )
						.trigger( 'change' );
					variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' );

					main_product
						.find( '.cpf-type-variations' )
						.not( section )
						.each( function( i, el ) {
							variationForm.find( "[data-attribute_name='attribute_" + $.epoAPI.dom.id( $( el ).find( '.tm-epo-variation-element' ).first().attr( 'data-tm-for-variation' ) ) + "']" ).trigger( 'focusin' );
						} );
					field.trigger( 'blur' );
					variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' );
				} );

			epoVariationSection
				.find( 'input.tm-epo-variation-element,input.tm-epo-variation-element + span' )
				.off( 'mouseup.cpfv' )
				.on( 'mouseup.cpfv', function() {
					var field = $( this );
					var id;

					if ( field.is( 'span' ) ) {
						field = field.prev( 'input' );
					}
					if ( field.attr( 'disabled' ) ) {
						variationForm.find( '.reset_variations' ).trigger( 'click' );
					}
					id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) );
					variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' );
				} );

			epoVariationSection
				.off( 'click.' + eventName + '.tmepo', '.reset_variations, .tc-epo-element-variable-reset-variations' )
				.on( 'click.' + eventName + '.tmepo', '.reset_variations, .tc-epo-element-variable-reset-variations', { _epoObject: epoObject }, function( event ) {
					var _nativeProductPriceSelector;
					if ( TMEPOJS.tm_epo_change_original_price === 'yes' ) {
						if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) {
							if ( event.data._epoObject.associated_connect ) {
								_nativeProductPriceSelector = event.data._epoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector );
							} else {
								_nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector );
							}
							if ( _nativeProductPriceSelector.data( 'tc-original-html' ) ) {
								_nativeProductPriceSelector.html( _nativeProductPriceSelector.data( 'tc-original-html' ) );
							}
						}
					}
					variationForm.find( '.variations .reset_variations, .tc-epo-element-variable-reset-variations' ).first().trigger( 'click' );
				} );

			epoVariationSection
				.find( '.tm-epo-variation-element' )
				.off( 'change.cpfv tm_epo_variation_element_change' )
				.on( 'change.cpfv tm_epo_variation_element_change', function( e ) {
					var field = $( this );
					var id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) );
					var value = field.val();
					var section = field.closest( '.cpf-type-variations' );
					var nativeSelect = variationForm.find( "[data-attribute_name='attribute_" + id + "']" );
					var exists;

					if ( field.closest( '.tm-epo-variation-section' ).is( '.tm-hidden' ) ) {
						return;
					}

					if ( ! ( e && e.type && e.type === 'tm_epo_variation_element_change' ) ) {
						exists = false;
						nativeSelect.each( function() {
							if ( this.value === value ) {
								exists = true;
								return false;
							}
						} );
						if ( ! exists ) {
							nativeSelect.trigger( 'focusin' );
						}
						nativeSelect.val( value ).trigger( 'change' );
					}

					if ( ! value ) {
						nativeSelect.trigger( 'focusin' );
					}

					main_product
						.find( '.cpf-type-variations' )
						.not( section )
						.each( function() {
							variationForm.find( '#' + $.epoAPI.dom.id( $( this ).find( '.tm-epo-variation-element' ).first().attr( 'data-tm-for-variation' ) ) ).trigger( 'focusin' );
						} );

					field.trigger( 'blur' );
					variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' );
				} )
				.off( 'focusin.cpfv' )
				.on( 'focusin.cpfv', function() {
					var field = $( this );
					var id;

					if ( ! field.is( 'select' ) ) {
						return;
					}

					id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) );
					variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' );
					variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' );
				} );

			variationForm.off( eventNamePrefix + 'found_variation.tmepo tm_fix_stock', '.single_variation_wrap' ).on( eventNamePrefix + 'found_variation.tmepo tm_fix_stock', '.single_variation_wrap', function() {
				fix_stock( $( this ), cartContainer );
			} );

			// update prices when a variation is found
			variationForm
				.off( eventNamePrefix + 'found_variation.tmepo' )
				.on( eventNamePrefix + 'found_variation.tmepo', function( event, variation ) {
					var form = $( this );

					totalsHolder.data( 'is-on-sale', variation.tc_is_on_sale );
					totalsHolder.data( 'regular-price', tm_set_backend_price( variation.display_regular_price, totalsHolder, variation ) );

					jWindow.trigger( 'tm-epo-found-variation', {
						epo: epoObject,
						totalsHolder: totalsHolder,
						totalsHolderContainer: totalsHolderContainer,
						currentCart: currentCart,
						variationForm: form,
						variation: variation
					} );

					found_variation_tmepo( {
						epoHolder: epoHolder,
						totalsHolder: totalsHolder,
						totalsHolderContainer: totalsHolderContainer,
						currentCart: currentCart,
						variationForm: form,
						variation: variation
					} );

					fix_stock( form, cartContainer );
				} )
				.off( eventNamePrefix + 'hide_variation.tmepo' )
				.on( eventNamePrefix + 'hide_variation.tmepo', { _epoObject: epoObject }, function( event ) {
					var _nativeProductPriceSelector;
					if ( TMEPOJS.tm_epo_change_original_price === 'yes' ) {
						if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) {
							if ( event.data._epoObject.associated_connect ) {
								_nativeProductPriceSelector = event.data._epoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector );
							} else {
								_nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector );
							}
							if ( _nativeProductPriceSelector.data( 'tc-original-html' ) ) {
								_nativeProductPriceSelector.html( _nativeProductPriceSelector.data( 'tc-original-html' ) );
							}
						}
					}
					totalsHolder.data( 'price', false );
					// Fancy product Designer
					totalsHolder.removeData( 'tcprice' );
					currentCart.trigger( {
						type: 'tm-epo-update',
						norules: 2
					} );
				} )
				.off( eventNamePrefix + 'check_variations.tmepo' )
				.on( eventNamePrefix + 'check_variations.tmepo', function() {
					var data = {};
					var chosen = 0;
					var reset = epoVariationSection.find( '.reset_variations' );

					variationForm.find( '.variations select, .tc-epo-variable-product-selector' ).each( function() {
						var attribute_name = $( this ).data( 'attribute_name' ) || $( this ).attr( 'name' );
						var value = $( this ).val() || '';

						if ( value.length > 0 ) {
							chosen++;
						}

						data[ attribute_name ] = value;
					} );

					if ( chosen > 0 ) {
						if ( reset.css( 'visibility' ) === 'hidden' ) {
							reset.css( 'visibility', 'visible' ).hide().fadeIn();
						}
					} else {
						reset.css( 'visibility', 'hidden' );
					}
				} )
				.trigger( eventNamePrefix + 'check_variations' );

			tm_custom_variations( epoObject, cartContainer, itemId, main_product, epoHolder );
		}

		selectSelector.trigger( 'tm-select-change-html' );
		tmQty.trigger( 'change.cpf', { init: 1 } );
		tmQuantity.trigger( 'showhide.cpfcustom' );
		epoFieldHasClearButton.filter( ':checked' ).trigger( 'cpfclearbutton' );

		jWindow.on( 'tm-do-epo-update', function() {
			// This must be run every time to get correct results for percent price types
			// if set norules then discount will not auto work upon chosing a variation
			currentCart.trigger( {
				type: 'tm-epo-update'
				//"norules": 2
			} );
		} );

		jWindow.trigger( 'tm-epo-init-events', {
			epo: {
				epo_id: epo_id,
				form: epoObject.form,
				currentCart: currentCart,
				cart_container: cartContainer,
				epo_holder: epoHolder,
				totals_holder_container: totalsHolderContainer,
				totals_holder: totalsHolder,
				main_cart: main_cart,
				main_epo_inside_form: main_epo_inside_form,
				product_id_selector: product_id_selector,
				epo_id_selector: epo_id_selector,
				product_id: product_id,
				this_epo_container: this_epo_container,
				this_totals_container: this_totals_container,
				this_epo_totals_container: this_epo_totals_container
			}
		} );

		jWindow.trigger( 'epoEventHandlers', {
			epo: epoObject,
			currentCart: currentCart,
			cartContainer: cartContainer,
			qtyElement: qtyElement,
			epoHolder: epoHolder,
			totalsHolderContainer: totalsHolderContainer,
			totalsHolder: totalsHolder,
			variationForm: variationForm,
			variation_id_selector: variation_id_selector,
			main_epo_inside_form: main_epo_inside_form,
			this_product_type: this_product_type,
			get_price_excluding_tax: get_price_excluding_tax,
			get_price_including_tax: get_price_including_tax
		} );

		// show final totals
		if ( finalTotalBoxMode !== 'disable' ) {
			totalsHolderContainer.addClass( 'tc-show' );
		}

		// show extra options
		jWindow.trigger( 'epo_options_before_visible' );

		if ( TMEPOJS.tm_epo_progressive_display === 'yes' ) {
			setTimeout( function() {
				epoHolder
					.css( 'opacity', 0 )
					.addClass( 'tc-show' )
					.animate(
						{
							opacity: 1
						},
						tcAPI.epoAnimationDelay,
						'easeOutExpo',
						function() {
							jWindow.trigger( 'epo_options_visible' );
							jWindow.trigger( 'tmlazy' );
						}
					);
			}, tcAPI.epoDelay );
		} else {
			epoHolder.addClass( 'tc-show' );
			jWindow.trigger( 'epo_options_visible' );
			jWindow.trigger( 'tmlazy' );
		}

		main_product.addClass( 'tc-init' );
	}

	function run_wc_variation_form_cpf( epoObject ) {
		var form = epoObject.variations_form;
		var cart = epoObject.main_cart;
		var this_epo_container = epoObject.this_epo_container;
		var eventName = epoObject.is_associated ? 'tc_variation_form.cpf' : 'wc_variation_form.cpf';

		form.off( eventName ).on( eventName, function() {
			if ( form.data( 'epo_loaded' ) ) {
				return;
			}

			// Start Condition Logic
			cpf_section_logic( this_epo_container );
			cpf_element_logic( this_epo_container );

			// Init field price rules
			$.tcepo.lateFieldsPrices[ epoObject.epoEventId ] = [];

			epoEventHandlers( epoObject );
			tm_set_upload_fields( epoObject );
			tm_product_image( epoObject );

			epoObject.noEpoUpdate = false;

			setTimeout( function() {
				run_cpfdependson( this_epo_container );
				cart.trigger( {
					type: 'tm-epo-update',
					rules: 'init'
				} );
			}, 10 );

			form.data( 'epo_loaded', true );
		} );

		if ( variationsFormIsLoaded ) {
			form.trigger( eventName );
		}

		jWindow.trigger( 'epo-after-init', { epo: epoObject } );
	}

	function detect_variation_swatches_interval( epoObject ) {
		var $id = requestAnimationFrame( function() {
			detect_variation_swatches_interval( epoObject );
		} );
		var obj = epoObject.variations_form;
		var bound = obj.data( 'bound' );
		var eventName = epoObject.is_associated ? 'tc_variation_form.cpf' : 'wc_variation_form.cpf';

		if ( bound ) {
			cancelAnimationFrame( $id );
			run_wc_variation_form_cpf( epoObject );
			obj.trigger( eventName );
		}
	}

	function manualInitEPO( epoObject, item, itemCart, itemEpoContainer, main_product ) {
		var epoObjectOriginal = $.extend( true, {}, epoObject );
		var product_id = itemEpoContainer.attr( 'data-product-id' );
		var epo_id = itemEpoContainer.attr( 'data-epo-id' );
		var product_id_selector = '.tm-product-id-' + product_id;
		var epo_id_selector = "[data-epo-id='" + epo_id + "']";
		var epoEventId = 'p' + product_id + 'e' + epo_id;
		var this_epo_container = $( '.tc-extra-product-options' + product_id_selector + epo_id_selector );
		var this_totals_container = $( '.tc-totals-form' + product_id_selector + epo_id_selector );
		var this_epo_totals_container = $( '.tc-epo-totals' + product_id_selector + epo_id_selector );

		epoObject.isManual = true;

		$.tcepo.formSubmitEvents[ epoEventId ] = [];
		$.tcepo.errorObject[ epoEventId ] = false;
		$.tcepo.initialActivation[ epoEventId ] = false;

		epoObject.product_id = product_id;
		epoObject.product_id_selector = product_id_selector;
		epoObject.epo_id = epo_id;
		epoObject.epo_id_selector = epo_id_selector;
		epoObject.epoEventId = epoEventId;
		epoObject.noEpoUpdate = true;
		epoObject.thisForm = item;
		epoObject.this_epo_container = this_epo_container;
		epoObject.this_totals_container = this_totals_container;
		epoObject.this_epo_totals_container = this_epo_totals_container;

		tm_lazyload();
		main_product.find( '.tm-collapse' ).tmtoggle();
		main_product.find( '.tm-section-link' ).tmsectionpoplink();

		tm_set_datepicker( item );
		setRangePickers( item );
		setRangePickersEvents();
		tm_set_repeaters( item, epoObject );
		tm_css_styles( item );
		tm_set_color_pickers( itemEpoContainer );
		tm_set_lightbox( itemEpoContainer.find( '.tc-lightbox-image' ).not( '.tm-extra-product-options-variations .radio-image' ) );

		// Start Condition Logic
		cpf_section_logic( itemEpoContainer );
		cpf_element_logic( itemEpoContainer );
		run_cpfdependson( itemEpoContainer );

		$.tcToolTip( item.find( '.tm-tooltip' ) );
		epoEventHandlers( epoObject, item, itemCart );

		epoObject.noEpoUpdate = false;

		itemCart.trigger( {
			type: 'tm-epo-update',
			norules: 2
		} );
		setTimeout( function() {
			epoObject.main_cart.trigger( {
				type: 'tm-epo-update',
				epoObject: epoObjectOriginal,
				norules: 1
			} );
		}, 200 );
		fix_stock( itemCart, item );
	}

	function tm_init_epo( main_product, is_quickview, product_id, epo_id, associated_connect, mainEpoObject, reactivate ) {
		// Holds the main cart when using Composite Products
		var main_cart = false;
		var main_epo_inside_form = false;
		var main_totals_inside_form = false;
		var epoEventId;
		var has_epo = typeof product_id !== 'undefined';
		var not_has_epo = false;
		var add_to_cart_field;
		var product_id_selector;
		var epo_id_selector;
		var this_epo_container;
		var this_totals_container;
		var this_epo_totals_container;
		var epo_object;
		var variations_form;
		var detect_variation_swatches = $( '.variation_form_section .variations-table' ).length > 0;
		var is_associated = false;

		main_product = $( main_product );

		if ( main_product.is( '.tc-init' ) && ! reactivate ) {
			return true;
		}

		if ( is_quickview ) {
			errorContainer = main_product;
		} else {
			errorContainer = $( window );
		}

		jWindow.trigger( 'tm-epo-init-start' );

		if ( ! has_epo ) {
			if ( main_product.is( '.product' ) ) {
				not_has_epo = true;
				has_epo = jBody.find( tcAPI.epoSelector ).length;
			}
		}

		// return if product has no extra options and the totals box is not enabled for all products
		if ( ! has_epo && TMEPOJS.tm_epo_enable_final_total_box_all === 'no' && ! main_product.is( '.tm-no-options-composite' ) ) {
			jWindow.trigger( 'tm-epo-init-end-no-options' );
			return;
		}

		// set the main_product variable again for products that have no extra options
		if ( not_has_epo ) {
			jWindow.trigger( 'tm-epo-init-no-options' );
			if ( main_product.is( '.product' ) && ! ( main_product.is( '.tm-no-options-pxq' ) || main_product.is( '.tm-no-options-composite' ) ) ) {
				main_product = jBody;
			}
		}

		if ( ! product_id ) {
			add_to_cart_field = main_product.find( tcAPI.addToCartSelector ).last();
			if ( add_to_cart_field.length > 0 ) {
				product_id = add_to_cart_field.val();
			} else {
				add_to_cart_field = $( '.tc-totals-form.tm-totals-form-main' );
				product_id = add_to_cart_field.attr( 'data-product-id' );
			}
			if ( ! product_id ) {
				product_id = '';
			}
		}

		if ( ! epo_id ) {
			epo_id = parseInt( main_product.find( 'input.tm-epo-counter' ).last().val(), 10 );

			if ( ! Number.isFinite( epo_id ) ) {
				epo_id = '';
			}
		}

		product_id_selector = '.tm-product-id-' + product_id;
		epo_id_selector = "[data-epo-id='" + epo_id + "']";
		this_epo_container = $( '.tc-extra-product-options' + product_id_selector + epo_id_selector );
		this_totals_container = $( '.tc-totals-form' + product_id_selector + epo_id_selector );
		this_epo_totals_container = $( '.tc-epo-totals' + product_id_selector + epo_id_selector );
		variations_form = main_product.find( '.variations_form' ).not( '.composite_component .variations_form' ).first();
		epoEventId = 'p' + product_id + 'e' + epo_id;

		if ( variations_form && variations_form.attr( 'data-product_id' ) ) {
			if ( variations_form.attr( 'data-product_id' ) !== product_id ) {
				variations_form = main_product.find( ".variations_form[data-product_id='" + product_id + "']" );
			}
		}

		main_cart = get_main_cart( main_product, main_product, 'form', product_id );
		if ( main_cart.length === 0 ) {
			if ( main_product.is( '.tc-shortcode-wrap' ) ) {
				main_cart = get_main_cart( this_totals_container, this_totals_container, '.tc-totals-form', product_id );
			} else if ( main_product.is( '.tc-epo-element-product-container' ) ) {
				main_cart = main_product.find( tcAPI.associatedEpoCart );
				// should never be 0
				if ( main_cart.length === 0 ) {
					main_cart = this_epo_container.parent( tcAPI.associatedEpoSelector );
					if ( main_cart.length === 0 ) {
						main_cart = main_product.find( '.tc-epo-element-product-container-right' );
					}
				}
				is_associated = true;
			}
		}

		if ( is_associated && variations_form.length === 0 && main_product.is( '.variations_form' ) ) {
			variations_form = main_product;
		}

		$.tcepo.formSubmitEvents[ epoEventId ] = [];
		$.tcepo.errorObject[ epoEventId ] = false;
		$.tcepo.initialActivation[ epoEventId ] = false;

		if ( main_cart.find( tcAPI.epoSelector ).length > 0 ) {
			main_epo_inside_form = true;
		}
		if ( main_cart.find( '.tc-totals-form' ).length > 0 ) {
			main_totals_inside_form = true;
		}

		if ( ! main_totals_inside_form ) {
			$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
				trigger: function() {
					return true;
				},
				on_true: function() {
					// hidden fields see totals.php
					var epos_hidden = $( '.tc-totals-form.tm-product-id-' + product_id + "[data-epo-id='" + epo_id + "']" ).tcClone();
					var formepo = $( '<div class="tm-hidden tm-formepo-normal"></div>' );

					main_cart.find( '.tm-formepo-normal' ).remove();
					formepo.append( epos_hidden );
					main_cart.append( formepo );
					return true;
				},
				on_false: function() {
					setTimeout( function() {
						$( '.tm-formepo-normal' ).remove();
					}, 100 );
				}
			};
		}
		if ( ! main_epo_inside_form ) {
			$.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = {
				trigger: function() {
					return true;
				},
				on_true: function() {
					// visible fields
					var epos = $( tcAPI.epoSelector + '.tm-product-id-' + product_id + "[data-epo-id='" + epo_id + "']" )
						.tcClone()
						.addClass( 'formepo' );
					var formepo = $( '<div class="tm-hidden tm-formepo"></div>' );

					main_cart.find( '.tm-formepo' ).remove();
					formepo.append( epos );

					main_cart.append( formepo );
					return true;
				},
				on_false: function() {
					setTimeout( function() {
						$( '.tm-formepo' ).remove();
					}, 100 );
				}
			};
		}

		epo_object = {
			main_product: main_product,
			main_cart: main_cart,
			epo_id: epo_id,
			form: get_main_form( main_product ),
			main_epo_inside_form: main_epo_inside_form,
			product_id_selector: product_id_selector,
			epo_id_selector: epo_id_selector,
			product_id: product_id,
			this_epo_container: this_epo_container,
			this_totals_container: this_totals_container,
			this_epo_totals_container: this_epo_totals_container,
			qtySelector: tcAPI.qtySelector,
			manualInitEPO: manualInitEPO,
			epoEventId: epoEventId,
			variations_form: variations_form,
			has_epo: has_epo,
			is_quickview: is_quickview,
			is_associated: is_associated,
			is_epo_shortcode: this_epo_container.is( '.tc-shortcode' ),
			mainEpoObject: mainEpoObject,
			associated_connect: associated_connect,
			noEpoUpdate: true
		};

		$( epo_object.form ).data( 'epo_object', epo_object );
		this_epo_container.data( 'epo_object', epo_object );

		main_cart.data( 'product_id', product_id ).data( 'epo_id', epo_id ).data( 'product_id_selector', product_id_selector ).data( 'epo_id_selector', epo_id_selector );

		tm_set_checkboxes_rules( epo_object );
		tm_set_upload_rules( epo_object );
		tm_set_datepicker( this_epo_container );
		setRangePickers( this_epo_container );
		setRangePickersEvents();
		tm_set_repeaters( this_epo_container, epo_object );
		tm_set_url_fields();

		$.tcToolTip( this_epo_container.find( '.tm-tooltip' ) );

		this_epo_container.find( '.tm-collapse' ).tmtoggle();
		this_epo_container.find( '.tm-section-link' ).tmsectionpoplink();

		if ( reactivate ) {
			this_epo_container.addClass( 'reactivate' );
		}

		if ( variations_form.length > 0 ) {
			if ( reactivate ) {
				variations_form.data( 'epo_loaded', false );
			}
			this_epo_totals_container.data( 'price', false );
			if ( detect_variation_swatches ) {
				detect_variation_swatches_interval( epo_object );
			} else {
				run_wc_variation_form_cpf( epo_object );
			}
		} else {
			setTimeout( function() {
				// Start Condition Logic
				cpf_section_logic( this_epo_container );
				cpf_element_logic( this_epo_container );
				run_cpfdependson( this_epo_container );

				// Init field price rules
				$.tcepo.lateFieldsPrices[ epoEventId ] = [];
				epoEventHandlers( epo_object );
				tm_set_upload_fields( epo_object );
				tm_product_image( epo_object );

				jWindow.trigger( 'epo-after-init-in-timeout', { epo: epo_object } );

				main_cart.trigger( 'tm-epo-check-dpd' );
				epo_object.noEpoUpdate = false;
				main_cart.trigger( {
					type: 'tm-epo-update',
					rules: 'init'
				} );
			}, 20 );
			jWindow.trigger( 'epo-after-init', { epo: epo_object } );
		}

		tm_lazyload();

		tm_css_styles( this_epo_container );
		tm_set_color_pickers( this_epo_container );
		tm_set_lightbox( this_epo_container.find( '.tc-lightbox-image' ).not( '.tm-extra-product-options-variations .radio-image' ) );
		tm_theme_specific_actions( epo_object );
		tc_compatibility( epo_object );

		if ( ! is_associated ) {
			tm_floating_totals( this_epo_totals_container, is_quickview, main_cart );
			tm_form_submit_event( epo_object );
			epo_object = addShowHidetoEpoObject( epo_object, epoEventId, epo_object );
			tm_show_hide_add_to_cart_button( main_product, epo_object );
		}

		jWindow.trigger( 'tm-epo-init-end', { epo: epo_object } );

		return epo_object;
	}

	function manual_init( container, reactivate ) {
		var $this = $( container );
		var product_id = $this.attr( 'data-product-id' );
		var epo_id = $this.attr( 'data-epo-id' );
		var quickview_floating = false;
		var testForm = $this.parent();
		if ( ! testForm.is( 'form' ) ) {
			testForm = $this.closest( 'form' );
			if ( ! testForm.is( 'form' ) ) {
				testForm = $this.parent();
			}
		}
		testForm = testForm.parent();

		tm_init_epo( testForm, quickview_floating, product_id, epo_id, undefined, undefined, reactivate );
	}

	function init_epo_plugin() {
		var epo_container;
		var epo_options_container;

		if ( TMEPOJS.tm_epo_no_lazy_load === 'no' ) {
			$.extend( $.lazyLoadXT, {
				autoInit: false,
				selector: 'img.tmlazy',
				srcAttr: 'data-original',
				visibleOnly: false,
				updateEvent: $.lazyLoadXT.updateEvent + ' tmlazy'
			} );
		}
		/*
		 * tm-no-options-pxq = product has not options but the "Enable Final total box for all products" is on
		 * tm-no-options-composite = product is a composite product with no options but at least one of its bundles have options
		 */
		epo_container = $( '.tm-no-options-pxq, .tm-no-options-composite' );

		if ( epo_container.length > 0 ) {
			// Special cases
			// -------------
			// Price x Quantity display (.tm-no-options-pxq) & composite
			// without option but a component has extra options
			// (.tm-no-options-composite)

			epo_container.addClass( 'initializing' );

			epo_container.each( function( loop_index, product_wrap ) {
				var inputepoid;
				product_wrap = $( product_wrap );
				inputepoid = product_wrap.find( 'input.tm-epo-counter' );
				if ( inputepoid.length > 1 ) {
					inputepoid.each( function() {
						var currentepoid = $( this );
						var currentcart = currentepoid.closest( '.cart' );
						var currentcartparent = currentcart.parent();
						if ( currentcartparent.is( 'form' ) ) {
							currentcartparent = currentcartparent.parent();
						}

						if ( ! currentcartparent.is( '.initializing' ) ) {
							tm_init_epo( currentcartparent, false, undefined, parseInt( currentepoid.val(), 10 ) );
						}
					} );
				} else {
					tm_init_epo( product_wrap, false );
				}
				epo_container.removeClass( 'initializing' );
			} );
		}

		// The setTimeout is used for compatibility with
		// skeleton screen mode that some themes have

		setTimeout( function() {
			try {
				// new main way of calling tm_init_epo
				// -----------------------------------
				// Normal product pages

				epo_options_container = $( tcAPI.epoSelector ).not( tcAPI.associatedEpoSelector + ' ' + tcAPI.epoSelector + ', .tm-no-options-pxq, .tm-no-options-composite, .wc-product-table ' + tcAPI.epoSelector );

				if ( epo_options_container.length > 0 ) {
					epo_container.addClass( 'initializing' );
					epo_options_container.each( function() {
						var $this = $( this );
						var product_id = $this.attr( 'data-product-id' );
						var epo_id = $this.attr( 'data-epo-id' );
						var quickview_floating = false;
						var jProductWrap;
						var addInputs = false;
						var inputepoid;

						// First check if we are in a loop.
						jProductWrap = $this.closest( '.tc-after-shop-loop.tm-has-options' );

						if ( jProductWrap.length === 0 ) {
							// Check based on plugin add to cart selector.
							jProductWrap = $( tcAPI.tcAddToCartSelector + "[data-epo-id='" + epo_id + "'][value='" + product_id + "']" )
								.closest( 'form,.cart' )
								.first()
								.parent();
							// Check based on native add to cart selector.
							if ( jProductWrap.length === 0 ) {
								jProductWrap = $( tcAPI.addToCartSelector + "[value='" + product_id + "']" )
									.closest( 'form,.cart' )
									.first()
									.parent();
								if ( jProductWrap.length === 0 ) {
									// Check if we are in a shortcode
									jProductWrap = $this.closest( 'form,.cart' ).first().parent( '.tm-has-options' );
									if ( jProductWrap.length === 0 ) {
										if ( $this.is( '.tc-shortcode' ) ) {
											jProductWrap = $this.wrap( '<div class="tc-shortcode-wrap tc-wrap-' + epo_id + '"></div>' );
											jProductWrap = $this.parent();
										}
										if ( jProductWrap.length > 0 ) {
											addInputs = true;
										}
									}
								}
							}
						} else {
							addInputs = true;
						}

						if ( jProductWrap.length > 0 ) {
							if ( addInputs ) {
								// in shop (variation logic will not work here)
								quickview_floating = true;
								$this
									.closest( 'form,.cart' )
									.first()
									.append( $( '<input name="add-to-cart" value="' + product_id + '" type="hidden">' ) );
								$this.closest( 'form,.cart' ).first().append( $( '<input type="hidden" value="" class="variation_id" name="variation_id">' ) );
							}

							if ( jProductWrap.is( 'form' ) ) {
								jProductWrap = jProductWrap.parent();
							}

							inputepoid = jProductWrap.find( 'input.tm-epo-counter' );
							if ( inputepoid.length > 1 ) {
								inputepoid.each( function() {
									var currentepoid = $( this );
									var currentcart = currentepoid.closest( '.cart' );
									var currentcartparent = currentcart.parent();
									if ( currentcartparent.is( 'form' ) ) {
										currentcartparent = currentcartparent.parent();
									}

									if ( ! currentcartparent.is( '.initializing' ) ) {
										tm_init_epo( currentcartparent, quickview_floating, product_id, parseInt( currentepoid.val(), 10 ) );
									}
								} );
							} else {
								tm_init_epo( jProductWrap, quickview_floating, product_id, epo_id );
							}
						}
					} );
					epo_container.removeClass( 'initializing' );
				}
			} catch ( err ) {
				window.console.log( err );
				errorObject = err;
			}
		}, 1 );
	}

	$.tcepo.tm_init_epo = function( main_product, is_quickview, product_id, epo_id ) {
		tm_init_epo( main_product, is_quickview, product_id, epo_id );
	};

	$.tcepo.tmLazyloadContainer = function( container ) {
		tmLazyloadContainer = container;
	};

	jWindow.on( 'tc_manual_init', function( evt, container ) {
		var reactivate;
		if ( 'container' in container && 'reactivate' in container ) {
			reactivate = container.reactivate;
			container = container.container;
		}
		manual_init( container, reactivate );
	} );

	function tcAjaxAddToCart( $this ) {
		var _pid;
		var epos;
		var _cpf_product_price;
		var _dynamic_product_price;
		var _override_product_price;
		var form_prefix;
		var epoid;
		var obj;
		var data;
		var tcTotalsForm;

		currentAjaxButton = $this;
		_pid = currentAjaxButton.attr( 'data-product_id' );
		if ( undefined === _pid ) {
			_pid = currentAjaxButton.val();
		}

		if ( undefined !== _pid ) {
			epoid = currentAjaxButton.closest( '.cart' ).find( '.tm-epo-counter' ).val();
			if ( ! epoid ) {
				epoid = currentAjaxButton.attr( 'data-epo-id' );
				if ( ! epoid ) {
					return;
				}
			}
			if ( currentAjaxButton.closest( '.tm-has-options' ).length !== 1 && currentAjaxButton.attr( 'data-epo-id' ) === undefined ) {
				return;
			}

			obj = {};

			epos = $( '.tc-extra-product-options.tm-product-id-' + _pid + '[data-epo-id="' + epoid + '"]' );

			if ( epos.length > 1 ) {
				if ( epos.filter( '.formepo' ) ) {
					epos = epos.filter( '.formepo' );
				} else {
					epos = epos.first();
				}
			}

			if ( epos.length === 1 ) {
				tcTotalsForm = $( '.tc-totals-form.tm-product-id-' + _pid + '[data-epo-id="' + epoid + '"]' );
				_cpf_product_price = tcTotalsForm.find( '.cpf-product-price' ).val();
				_dynamic_product_price = tcTotalsForm.find( '.cpf-dynamic-product-price' ).val();
				_override_product_price = tcTotalsForm.find( '.cpf-override-product-price' ).val();
				form_prefix = tcTotalsForm.find( '.tc_form_prefix' ).val();

				obj = $.extend( obj, {
					tcajax: 1,
					tcaddtocart: _pid,
					cpf_product_price: _cpf_product_price,
					dynamic_product_price: _dynamic_product_price,
					override_product_price: _override_product_price
				} );
				if ( form_prefix ) {
					obj.tc_form_prefix = form_prefix;
				}
			}

			data = currentAjaxButton.data();
			TMEPOJS.ajaxbuttondata = $.epoAPI.util.deepCopyArray( data );
			TMEPOJS.ajaxbutton = currentAjaxButton;

			currentAjaxButton.removeData();
			currentAjaxButton.data( $.extend( data, epos.tcSerializeObject(), obj ) );

			TMEPOJS.ajaxdata = {
				epos: epos,
				_pid: _pid,
				data: data
			};
		}
	}

	function ajaxAddToCartFunctions() {
		// Betheme ajax add to cart.
		$( document ).on( 'click.tcajax', 'body.mfn-ajax-add-to-cart .single_add_to_cart_button:not(.disabled)', function() {
			var formepo;
			var $this = $( this );
			tcAjaxAddToCart( $this );
			TMEPOJS.ajaxdata.cart = $this.closest( '.cart' );
			TMEPOJS.ajaxdata.cart.find( '.tm-formepo' ).remove();
			formepo = $( "<div class='tm-hidden tm-formepo'></div>" );
			formepo.append( TMEPOJS.ajaxdata.epos.tcClone().addClass( 'formepo' ) );
			$this.after( formepo );
		} );

		jBody.on( 'click.tcajax', '.ajax_add_to_cart', function() {
			tcAjaxAddToCart( $( this ) );
			if ( undefined !== TMEPOJS.ajaxdata ) {
				delete TMEPOJS.ajaxdata;
			}
		} );

		$( document.body ).on( 'added_to_cart', function() {
			if ( TMEPOJS.ajaxbuttondata && TMEPOJS.ajaxbutton instanceof $ ) {
				TMEPOJS.ajaxbutton.removeData();
				TMEPOJS.ajaxbutton.data( TMEPOJS.ajaxbuttondata );
			}
		} );
	}

	// This needs to run here to register our event handlers before WooCommerce.
	ajaxAddToCartFunctions();

	// document ready
	$( function() {
		tcAPI = $.epoAPI.applyFilter( 'tc_api', tcAPI );

		jWindow.on( 'lazyLoadXToncomplete', function() {
			$( '.tm-owl-slider' ).each( function() {
				$( this ).trigger( 'refresh.owl.carousel' );
			} );
		} );

		jWindow.on( 'tc_init_epo_plugin', function( evt ) {
			init_epo_plugin( evt );
		} );

		jWindow.on( 'tcShowLastError', function() {
			window.console.log( errorObject );
		} );

		$.ajaxPrefilter( function( options, originalOptions ) {
			var found = false;
			var hashes;
			var hash;
			var i;
			var params;
			var $thisbutton;
			var _data;
			var _urldata;
			var _pid;
			var epos;
			var _cpf_product_price;
			var _dynamic_product_price;
			var _override_product_price;
			var form_prefix;
			var obj;
			var oldData;
			var formData;
			var can_be_added = false;
			var associativeArray = {};
			var tcTotalsForm;

			if ( TMEPOJS.tm_epo_enable_in_shop === 'yes' ) {
				hashes = options.url.split( '?' );

				if ( hashes && hashes.length >= 1 ) {
					hashes = hashes[ 1 ];
					if ( hashes ) {
						hash = hashes.split( '&' );
						for ( i = 0; i < hash.length; i += 1 ) {
							params = hash[ i ].split( '=' );
							if ( params.length >= 1 ) {
								if ( params[ 0 ] && params[ 1 ] && params[ 0 ] === 'wc-ajax' && params[ 1 ] === 'add_to_cart' ) {
									found = true;
								}
							}
						}
						if ( found ) {
							options.originalsuccess = options.success;
							options.success = function( response ) {
								if ( response && response.error && response.product_url ) {
									if ( currentAjaxButton && currentAjaxButton.length === 1 ) {
										$thisbutton = currentAjaxButton;
									}
									$thisbutton = $( ".ajax_add_to_cart[data-product_id='" + originalOptions.data.product_id + "']" );
									$thisbutton.removeClass( 'added' );
									$thisbutton.removeClass( 'loading' );
								} else {
									options.originalsuccess.call( null, response );
								}
							};
						}
					}
				}
			}

			if ( FormData && originalOptions.data ) {
				_data = originalOptions.data;
				if ( typeof originalOptions.data === 'string' ) {
					_data = $.epoAPI.util.parseParams( originalOptions.data );
				}
				if ( typeof _data[ 0 ] === 'object' ) {
					_data.forEach( function( item ) {
						associativeArray[ item.name ] = item.value;
					} );
					_data = associativeArray;
				}

				_urldata = [];
				if ( originalOptions.url && originalOptions.url.indexOf ) {
					_urldata = $.epoAPI.util.parseParams( originalOptions.url.slice( originalOptions.url.indexOf( '?' ) + 1 ) );
				}

				if ( 'quantity' in _data && _data.tcaddtocart && ( _data.product_id || _data[ 'add-to-cart' ] || _urldata.product_id || _urldata[ 'add-to-cart' ] ) ) {
					can_be_added = true;
					_pid = _data.tcaddtocart;
				} else if ( Array.isArray( _data ) ) {
					can_be_added = _data.some( function( item ) {
						return item.name === 'quantity';
					} ) && _data.some( function( item ) {
						return item.name === 'add-to-cart';
					} ) && _data.some( function( item ) {
						return item.name === 'tcaddtocart';
					} );
					_pid = _data.find( function( item ) {
						return item.name === 'tcaddtocart';
					} );
					if ( _pid ) {
						_pid = _pid.value;
					} else {
						_pid = false;
					}
				}

				if ( can_be_added ) {
					if ( currentAjaxButton && currentAjaxButton.length === 1 && currentAjaxButton.closest( '.tm-has-options' ).length === 1 ) {
						epos = currentAjaxButton.closest( '.tm-has-options' ).find( '.tc-extra-product-options.tm-product-id-' + _pid );
					} else {
						epos = $( '.tc-extra-product-options.tm-product-id-' + _pid );
					}

					if ( epos.length > 1 ) {
						if ( epos.filter( '.formepo' ) ) {
							epos = epos.filter( '.formepo' );
						} else {
							epos = epos.first();
						}
					}
					if ( epos.length === 1 ) {
						tcTotalsForm = $( '.tc-totals-form.tm-product-id-' + _pid );
						_cpf_product_price = tcTotalsForm.find( '.cpf-product-price' ).val();
						_dynamic_product_price = tcTotalsForm.find( '.cpf-dynamic-product-price' ).val();
						_override_product_price = tcTotalsForm.find( '.cpf-override-product-price' ).val();
						form_prefix = tcTotalsForm.find( '.tc_form_prefix' ).val();
						obj = {
							tcajax: 1,
							tcaddtocart: _pid,
							cpf_product_price: _cpf_product_price,
							dynamic_product_price: _dynamic_product_price,
							override_product_price: _override_product_price
						};
						if ( form_prefix ) {
							obj.tc_form_prefix = form_prefix;
						}

						oldData = $.epoAPI.util.parseParams( options.data, true );
						oldData = $.extend( oldData, epos.tcSerializeObject(), obj );
						formData = new FormData();

						Object.keys( oldData ).forEach( function( key ) {
							if ( key ) {
								formData.append( key, oldData[ key ] );
							}
						} );

						epos.find( ':file' )
							.toArray()
							.forEach( function( el ) {
								for ( i = 0; i < $( el )[ 0 ].files.length; i++ ) {
									if ( ! el.multiple ) {
										formData.delete( $( el ).attr( 'name' ) );
									}
									formData.append( $( el ).attr( 'name' ), $( el )[ 0 ].files[ i ] );
								}
							} );

						options.data = formData;
						options.contentType = false;
						options.cache = false;
						options.processData = false;
					}
				}
			}
		} );

		jDocument.ajaxSuccess( function( event, request, settings ) {
			// quickview plugins
			var qv_container = TMEPOJS.quickview_array || 'null';
			var fromaddons = TMEPOJS.quickview_container || 'null';
			var added = {};
			var selectors;
			var container;
			var product_id;
			var epo_id;
			var noProductCheck;
			var testContainer;
			var parsedUrl;
			var time = 1;
			var detectContainer;
			var requestContainer;

			if ( undefined !== TMEPOJS.ajaxdata ) {
				TMEPOJS.ajaxdata.cart.find( '.tm-formepo' ).remove();
				delete TMEPOJS.ajaxdata;
			}

			parsedUrl = $.epoAPI.util.parseParams( settings.data );
			if ( parsedUrl.action === 'wc_epo_get_associated_product_html' ) {
				return;
			}

			$( '.tm-formepo-normal' ).remove();
			$( '.tm-formepo' ).remove();

			//fix for menu cart pop up
			$( '.tm-cart-link' ).tmpoplink();

			qv_container = $.epoAPI.util.parseJSON( qv_container );

			fromaddons = $.epoAPI.util.parseJSON( fromaddons );

			for ( selectors in fromaddons ) {
				if ( Object.prototype.hasOwnProperty.call( fromaddons, selectors ) ) {
					added[ fromaddons[ selectors ][ 0 ] ] = $( fromaddons[ selectors ][ 1 ] );
				}
			}

			$.extend( qv_container, added );

			detectContainer = function() {
				var keyfound = false;
				Object.keys( qv_container ).forEach( function( key ) {
					if ( $( qv_container[ key ] ).length ) {
						keyfound = key;
					}
				} );
				return keyfound;
			};
			requestContainer = function( times ) {
				var id = requestAnimationFrame( function() {
					setTimeout( function() {
						requestContainer( times - 1 );
					}, 200 );
				} );
				var key = detectContainer();
				var epoContainer;

				if ( key || 0 === times ) {
					cancelAnimationFrame( id );
					if ( key ) {
						noProductCheck = false;
						container = $( qv_container[ key ] );

						if ( key === 'woothemes_quick_view' && container.is( '.fusion-woocommerce-quick-view-container' ) ) {
							return true;
						}

						if ( key === 'fusion_quick_view_load' && container.find( tcAPI.epoSelector ).length === 0 ) {
							return true;
						}

						if ( key === 'woodmart_quick_shop' ) {
							parsedUrl = $.epoAPI.util.parseParams( settings.url );
							if ( parsedUrl.action === 'woodmart_quick_shop' ) {
								testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + '.post-' + parsedUrl.id ) );
								if ( testContainer.length ) {
									container = testContainer;
									noProductCheck = true;
								}
							}
						}
						if ( key === 'woodmart_quick_view' ) {
							parsedUrl = $.epoAPI.util.parseParams( settings.url );
							if ( parsedUrl.action === 'woodmart_quick_view' ) {
								testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + '.post-' + parsedUrl.id ) );
								if ( testContainer.length ) {
									container = testContainer;
									noProductCheck = true;
								}
							}
						}

						if ( key === 'quickview_pro' ) {
							parsedUrl = settings.url.split( '/' );
							if ( parsedUrl.length ) {
								testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + ' .post-' + parsedUrl[ parsedUrl.length - 1 ] ) );
								if ( testContainer.length ) {
									container = testContainer;
									noProductCheck = true;
								}
							}
						}

						if ( key === 'exwoofood_booking_info' || key === 'wqv_popup_content' || key === 'wp_food' || key === 'jet_popup_get_content' ) {
							noProductCheck = true;
						}

						if ( key === 'woofood' && settings.data ) {
							parsedUrl = $.epoAPI.util.parseParams( settings.data );
							if ( parsedUrl.action === 'woofood_quickview_ajax' ) {
								testContainer = testContainer = container.find( 'form' ).parent();
								if ( testContainer.length ) {
									container = testContainer;
									noProductCheck = true;
								}
							}
						}

						if ( container.find( '.product' ).length === 0 && container.is( '.product' ) ) {
							noProductCheck = true;
						}

						if ( ( container.find( '.product' ).length > 0 || noProductCheck ) ) {
							container.removeClass( 'tc-init' );

							if (
								key === 'fusion_quick_view_load' ||
								key === 'jet_popup_get_content' ||
								key === 'wp_food' ||
								key === 'woodmart_quick_shop' ||
								key === 'woodmart_quick_view' ||
								key === 'lightboxpro' ||
								key === 'jckqv_quick_view' ||
								key === 'yith_quick_view' ||
								key === 'theme_flatsome'
							) {
								variationsFormIsLoaded = true;
							}
							tmLazyloadContainer = container;
							if ( tmLazyloadContainer.length > 1 ) {
								while ( tmLazyloadContainer.length > 1 ) {
									tmLazyloadContainer = tmLazyloadContainer.filter( function() {
										return $( this ).find( tcAPI.epoSelector ).length > 0;
									} );
									if ( tmLazyloadContainer.length === 0 ) {
										break;
									}
								}
								if ( tmLazyloadContainer.length === 0 ) {
									setTimeout( function() {
										requestContainer( 10 );
									}, 1000 );

									return true;
								}
							}

							epoContainer = tmLazyloadContainer.find( tcAPI.epoSelector );
							if ( epoContainer.length === 0 ) {
								delete qv_container[ key ];
								requestContainer( 10 );
								return true;
							}

							if ( key === 'fusion_quick_view_load' ) {
								time = 1400;
							}

							setTimeout( function() {
								product_id = epoContainer.attr( 'data-product-id' );
								epo_id = epoContainer.attr( 'data-epo-id' );
								if ( key === 'woodmart_quick_shop' ) {
									container.addClass( 'has-options' );
								}

								// Reset element cache
								tcAPI.getElementFromFieldCache = [];
								tm_init_epo( tmLazyloadContainer, true, product_id, epo_id );
								jWindow.trigger( 'tmlazy' );
								jWindow.trigger( 'tm_epo_loaded_quickview' );
								if ( $.jMaskGlobals ) {
									tmLazyloadContainer.find( $.jMaskGlobals.maskElements ).each( function() {
										var t = $( this );

										if ( t.attr( 'data-mask' ) ) {
											t.mask( t.attr( 'data-mask' ) );
										}
									} );
								}
							}, time );
						}
					}
				}
			};
			requestContainer( 10 );
		} );

		init_epo_plugin();

		$( '.tm-cart-link' ).tmpoplink();
		jBody.on( 'updated_checkout wc_fragments_loaded wc_fragments_refreshed wc_fragment_refresh', function() {
			$( '.tm-cart-link' ).tmpoplink();
		} );

		jWindow.trigger( 'tmlazy' );

		jWindow.trigger( 'tm_epo_loaded' );
	} );

	function associated_table_item() {
		$( '.tc-associated-table-product td.product-name' ).each( function() {
			var el = $( this );
			if ( el.find( '.product-name' ).length === 0 ) {
				el.wrapInner( $( '<div class="tc-associated-table-product-indent"></div>' ) );
			}
		} );
	}

	// Associated product cart indent
	jBody.on( 'updated_checkout updated_cart_totals', function() {
		associated_table_item();
	} );

	associated_table_item();

	// document ready
	$( function() {
		// Remove accept attribute from upload buttons when in Facebook or Instagram internral browser
		var ua = navigator.userAgent || navigator.vendor || window.opera;
		ua = ( ua.indexOf( 'FBAN' ) > -1 ) || ( ua.indexOf( 'FBAV' ) > -1 ) || ( ua.indexOf( 'Instagram' ) > -1 );
		if ( ua ) {
			$( '.tmcp-upload' ).removeAttr( 'accept' );
		}

		// Fix several custom quantity buttons on themes
		jDocument.on( 'click', '.quantity .jckqv-qty-spinner, .quantity .ui-spinner-button', function() {
			$( this ).closest( '.quantity' ).find( tcAPI.qtySelector ).trigger( 'change' );
		} );

		// bulk variations forms plugin
		$( '#wholesale_form' ).on( 'submit', function() {
			var _product_id = $( 'form.cart' ).find( tcAPI.addToCartSelector ).val();
			// visible fields
			var epos = $( tcAPI.epoSelector + ".tm-cart-main[data-product-id='" + _product_id + "']" ).tcClone();
			// hidden fields see totals.php
			var epos_hidden = $( ".tm-totals-form-main[data-product-id='" + _product_id + "']" ).tcClone();
			var formepo = $( "<div class='tm-hidden tm-formepo'></div>" );

			formepo.append( epos );
			formepo.append( epos_hidden );
			$( this ).append( formepo );
			return true;
		} );

		// Disable quote button if option validation fails
		jDocument.on( 'click', '#add_to_quote', function( e ) {
			var form;
			var epo_id;
			var epos;

			if ( TMEPOJS && TMEPOJS.tm_epo_global_enable_validation === 'yes' ) {
				form = $( this ).parents( 'form' );
				epo_id = parseInt( form.find( '.tm-epo-counter' ).val(), 10 );
				epos = $( tcAPI.epoSelector + "[data-epo-id='" + epo_id + "']" );

				// not validated
				if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' && $.tc_validator && form.length > 0 && epos.length > 0 && ! form.tc_validate().form() ) {
					e.stopImmediatePropagation();
				}
			}
		} );

		// PayPal for WooCommerce (PayPal Express Checkout button fix)
		$( '.single_add_to_cart_button.paypal_checkout_button' ).on( 'click', function( event ) {
			// this is the selector used by the paypal checkout plugin
			var form = $( '.cart' );
			var validator;

			if ( form.data( 'tc_validator' ) ) {
				validator = form.data( 'tc_validator' );
				if ( validator.errorList ) {
					event.stopImmediatePropagation();
				}
			}
		} );

		$( '.wc-product-table' ).on( 'init.wcpt', function( event, table ) {
			table.$table.find( tcAPI.epoSelector ).addClass( 'hidden' );
			table.$table.find( 'thead tr' ).append( '<th>&nbsp;</th>' );
			setTimeout( function() {
				table.$table.find( '.cart:not(.cart_group)' ).each( function() {
					var epo = $( this ).find( tcAPI.epoSelector );
					var tr = epo.closest( 'tr' );

					$( "<td class='wc-product-table-epo'></td>" ).appendTo( tr ).append( epo );
					$( window ).trigger( 'tc_manual_init', epo );
					epo.removeClass( 'hidden' );
				} );
			}, 500 );
		} );
	} );
}( window, document, window.jQuery ) );
assets/js/spectrum.js000064400000224470150755142450010703 0ustar00// TinyColor v1.4.1
// https://github.com/bgrins/TinyColor
// Brian Grinstead, MIT License
// reformatted code by ThemeComplete
( function( Math ) {
	'use strict';

	var trimLeft = /^\s+/,
		trimRight = /\s+$/,
		tinyCounter = 0,
		mathRound = Math.round,
		mathMin = Math.min,
		mathMax = Math.max,
		mathRandom = Math.random;

	var names = {
		aliceblue: 'f0f8ff',
		antiquewhite: 'faebd7',
		aqua: '0ff',
		aquamarine: '7fffd4',
		azure: 'f0ffff',
		beige: 'f5f5dc',
		bisque: 'ffe4c4',
		black: '000',
		blanchedalmond: 'ffebcd',
		blue: '00f',
		blueviolet: '8a2be2',
		brown: 'a52a2a',
		burlywood: 'deb887',
		burntsienna: 'ea7e5d',
		cadetblue: '5f9ea0',
		chartreuse: '7fff00',
		chocolate: 'd2691e',
		coral: 'ff7f50',
		cornflowerblue: '6495ed',
		cornsilk: 'fff8dc',
		crimson: 'dc143c',
		cyan: '0ff',
		darkblue: '00008b',
		darkcyan: '008b8b',
		darkgoldenrod: 'b8860b',
		darkgray: 'a9a9a9',
		darkgreen: '006400',
		darkgrey: 'a9a9a9',
		darkkhaki: 'bdb76b',
		darkmagenta: '8b008b',
		darkolivegreen: '556b2f',
		darkorange: 'ff8c00',
		darkorchid: '9932cc',
		darkred: '8b0000',
		darksalmon: 'e9967a',
		darkseagreen: '8fbc8f',
		darkslateblue: '483d8b',
		darkslategray: '2f4f4f',
		darkslategrey: '2f4f4f',
		darkturquoise: '00ced1',
		darkviolet: '9400d3',
		deeppink: 'ff1493',
		deepskyblue: '00bfff',
		dimgray: '696969',
		dimgrey: '696969',
		dodgerblue: '1e90ff',
		firebrick: 'b22222',
		floralwhite: 'fffaf0',
		forestgreen: '228b22',
		fuchsia: 'f0f',
		gainsboro: 'dcdcdc',
		ghostwhite: 'f8f8ff',
		gold: 'ffd700',
		goldenrod: 'daa520',
		gray: '808080',
		green: '008000',
		greenyellow: 'adff2f',
		grey: '808080',
		honeydew: 'f0fff0',
		hotpink: 'ff69b4',
		indianred: 'cd5c5c',
		indigo: '4b0082',
		ivory: 'fffff0',
		khaki: 'f0e68c',
		lavender: 'e6e6fa',
		lavenderblush: 'fff0f5',
		lawngreen: '7cfc00',
		lemonchiffon: 'fffacd',
		lightblue: 'add8e6',
		lightcoral: 'f08080',
		lightcyan: 'e0ffff',
		lightgoldenrodyellow: 'fafad2',
		lightgray: 'd3d3d3',
		lightgreen: '90ee90',
		lightgrey: 'd3d3d3',
		lightpink: 'ffb6c1',
		lightsalmon: 'ffa07a',
		lightseagreen: '20b2aa',
		lightskyblue: '87cefa',
		lightslategray: '789',
		lightslategrey: '789',
		lightsteelblue: 'b0c4de',
		lightyellow: 'ffffe0',
		lime: '0f0',
		limegreen: '32cd32',
		linen: 'faf0e6',
		magenta: 'f0f',
		maroon: '800000',
		mediumaquamarine: '66cdaa',
		mediumblue: '0000cd',
		mediumorchid: 'ba55d3',
		mediumpurple: '9370db',
		mediumseagreen: '3cb371',
		mediumslateblue: '7b68ee',
		mediumspringgreen: '00fa9a',
		mediumturquoise: '48d1cc',
		mediumvioletred: 'c71585',
		midnightblue: '191970',
		mintcream: 'f5fffa',
		mistyrose: 'ffe4e1',
		moccasin: 'ffe4b5',
		navajowhite: 'ffdead',
		navy: '000080',
		oldlace: 'fdf5e6',
		olive: '808000',
		olivedrab: '6b8e23',
		orange: 'ffa500',
		orangered: 'ff4500',
		orchid: 'da70d6',
		palegoldenrod: 'eee8aa',
		palegreen: '98fb98',
		paleturquoise: 'afeeee',
		palevioletred: 'db7093',
		papayawhip: 'ffefd5',
		peachpuff: 'ffdab9',
		peru: 'cd853f',
		pink: 'ffc0cb',
		plum: 'dda0dd',
		powderblue: 'b0e0e6',
		purple: '800080',
		rebeccapurple: '663399',
		red: 'f00',
		rosybrown: 'bc8f8f',
		royalblue: '4169e1',
		saddlebrown: '8b4513',
		salmon: 'fa8072',
		sandybrown: 'f4a460',
		seagreen: '2e8b57',
		seashell: 'fff5ee',
		sienna: 'a0522d',
		silver: 'c0c0c0',
		skyblue: '87ceeb',
		slateblue: '6a5acd',
		slategray: '708090',
		slategrey: '708090',
		snow: 'fffafa',
		springgreen: '00ff7f',
		steelblue: '4682b4',
		tan: 'd2b48c',
		teal: '008080',
		thistle: 'd8bfd8',
		tomato: 'ff6347',
		turquoise: '40e0d0',
		violet: 'ee82ee',
		wheat: 'f5deb3',
		white: 'fff',
		whitesmoke: 'f5f5f5',
		yellow: 'ff0',
		yellowgreen: '9acd32'
	};

	// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
	var flip = function( o ) {
		var flipped = {};
		var i;
		for ( i in o ) {
			if ( Object.prototype.hasOwnProperty.call( o, i ) ) {
				flipped[ o[ i ] ] = i;
			}
		}
		return flipped;
	};

	var hexNames = flip( names );

	var matchers = ( function() {
		// <http://www.w3.org/TR/css3-values/#integers>
		var CSS_INTEGER = '[-\\+]?\\d+%?';

		// <http://www.w3.org/TR/css3-values/#number-value>
		var CSS_NUMBER = '[-\\+]?\\d*\\.\\d+%?';

		// Allow positive/negative integer/number.  Don't capture the either/or, just the entire outcome.
		var CSS_UNIT = '(?:' + CSS_NUMBER + ')|(?:' + CSS_INTEGER + ')';

		// Actual matching.
		// Parentheses and commas are optional, but not required.
		// Whitespace can take the place of commas or opening paren
		var PERMISSIVE_MATCH3 = '[\\s|\\(]+(' + CSS_UNIT + ')[,|\\s]+(' + CSS_UNIT + ')[,|\\s]+(' + CSS_UNIT + ')\\s*\\)?';
		var PERMISSIVE_MATCH4 = '[\\s|\\(]+(' + CSS_UNIT + ')[,|\\s]+(' + CSS_UNIT + ')[,|\\s]+(' + CSS_UNIT + ')[,|\\s]+(' + CSS_UNIT + ')\\s*\\)?';

		return {
			CSS_UNIT: new RegExp( CSS_UNIT ),
			rgb: new RegExp( 'rgb' + PERMISSIVE_MATCH3 ),
			rgba: new RegExp( 'rgba' + PERMISSIVE_MATCH4 ),
			hsl: new RegExp( 'hsl' + PERMISSIVE_MATCH3 ),
			hsla: new RegExp( 'hsla' + PERMISSIVE_MATCH4 ),
			hsv: new RegExp( 'hsv' + PERMISSIVE_MATCH3 ),
			hsva: new RegExp( 'hsva' + PERMISSIVE_MATCH4 ),
			hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
			hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
			hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
			hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
		};
	}() );

	// `isValidCSSUnit`
	// Take in a single string / number and check to see if it looks like a CSS unit
	// (see `matchers` above for definition).
	function isValidCSSUnit( color ) {
		return !! matchers.CSS_UNIT.exec( color );
	}

	// Parse a base-16 hex value into a base-10 integer
	function parseIntFromHex( val ) {
		return parseInt( val, 16 );
	}

	// Converts a hex value to a decimal
	function convertHexToDecimal( h ) {
		return parseIntFromHex( h ) / 255;
	}

	// `stringInputToObject`
	// Permissive string parsing.  Take in a number of formats, and output an object
	// based on detected format.  Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
	function stringInputToObject( color ) {
		var named = false;
		var match;
		color = color.replace( trimLeft, '' ).replace( trimRight, '' ).toLowerCase();

		if ( names[ color ] ) {
			color = names[ color ];
			named = true;
		} else if ( color === 'transparent' ) {
			return { r: 0, g: 0, b: 0, a: 0, format: 'name' };
		}

		// Try to match string input using regular expressions.
		// Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
		// Just return an object and let the conversion functions handle that.
		// This way the result will be the same whether the TinyColor is initialized with string or object.

		if ( ( match = matchers.rgb.exec( color ) ) ) {
			return { r: match[ 1 ], g: match[ 2 ], b: match[ 3 ] };
		}
		if ( ( match = matchers.rgba.exec( color ) ) ) {
			return { r: match[ 1 ], g: match[ 2 ], b: match[ 3 ], a: match[ 4 ] };
		}
		if ( ( match = matchers.hsl.exec( color ) ) ) {
			return { h: match[ 1 ], s: match[ 2 ], l: match[ 3 ] };
		}
		if ( ( match = matchers.hsla.exec( color ) ) ) {
			return { h: match[ 1 ], s: match[ 2 ], l: match[ 3 ], a: match[ 4 ] };
		}
		if ( ( match = matchers.hsv.exec( color ) ) ) {
			return { h: match[ 1 ], s: match[ 2 ], v: match[ 3 ] };
		}
		if ( ( match = matchers.hsva.exec( color ) ) ) {
			return { h: match[ 1 ], s: match[ 2 ], v: match[ 3 ], a: match[ 4 ] };
		}
		if ( ( match = matchers.hex8.exec( color ) ) ) {
			return {
				r: parseIntFromHex( match[ 1 ] ),
				g: parseIntFromHex( match[ 2 ] ),
				b: parseIntFromHex( match[ 3 ] ),
				a: convertHexToDecimal( match[ 4 ] ),
				format: named ? 'name' : 'hex8'
			};
		}
		if ( ( match = matchers.hex6.exec( color ) ) ) {
			return {
				r: parseIntFromHex( match[ 1 ] ),
				g: parseIntFromHex( match[ 2 ] ),
				b: parseIntFromHex( match[ 3 ] ),
				format: named ? 'name' : 'hex'
			};
		}
		if ( ( match = matchers.hex4.exec( color ) ) ) {
			return {
				r: parseIntFromHex( match[ 1 ] + '' + match[ 1 ] ),
				g: parseIntFromHex( match[ 2 ] + '' + match[ 2 ] ),
				b: parseIntFromHex( match[ 3 ] + '' + match[ 3 ] ),
				a: convertHexToDecimal( match[ 4 ] + '' + match[ 4 ] ),
				format: named ? 'name' : 'hex8'
			};
		}
		if ( ( match = matchers.hex3.exec( color ) ) ) {
			return {
				r: parseIntFromHex( match[ 1 ] + '' + match[ 1 ] ),
				g: parseIntFromHex( match[ 2 ] + '' + match[ 2 ] ),
				b: parseIntFromHex( match[ 3 ] + '' + match[ 3 ] ),
				format: named ? 'name' : 'hex'
			};
		}

		return false;
	}

	function validateWCAG2Parms( parms ) {
		// return valid WCAG2 parms for isReadable.
		// If input parms are invalid, return {"level":"AA", "size":"small"}
		var level, size;
		parms = parms || { level: 'AA', size: 'small' };
		level = ( parms.level || 'AA' ).toUpperCase();
		size = ( parms.size || 'small' ).toLowerCase();
		if ( level !== 'AA' && level !== 'AAA' ) {
			level = 'AA';
		}
		if ( size !== 'small' && size !== 'large' ) {
			size = 'small';
		}
		return { level: level, size: size };
	}

	// Utilities
	// ---------

	// Return a valid alpha value [0,1] with all invalid values being set to 1
	function boundAlpha( a ) {
		a = parseFloat( a );

		if ( isNaN( a ) || a < 0 || a > 1 ) {
			a = 1;
		}

		return a;
	}

	// Check to see if string passed in is a percentage
	function isPercentage( n ) {
		return typeof n === 'string' && n.indexOf( '%' ) !== -1;
	}

	// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
	// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
	function isOnePointZero( n ) {
		return typeof n === 'string' && n.indexOf( '.' ) !== -1 && parseFloat( n ) === 1;
	}

	// Take input from [0, n] and return it as [0, 1]
	function bound01( n, max ) {
		var processPercent;
		if ( isOnePointZero( n ) ) {
			n = '100%';
		}

		processPercent = isPercentage( n );
		n = mathMin( max, mathMax( 0, parseFloat( n ) ) );

		// Automatically convert percentage into number
		if ( processPercent ) {
			n = parseInt( n * max, 10 ) / 100;
		}

		// Handle floating point rounding errors
		if ( Math.abs( n - max ) < 0.000001 ) {
			return 1;
		}

		// Convert into [0, 1] range if it isn't already
		return ( n % max ) / parseFloat( max );
	}

	// Force a number between 0 and 1
	function clamp01( val ) {
		return mathMin( 1, mathMax( 0, val ) );
	}

	// Force a hex value to have 2 characters
	function pad2( c ) {
		return c.length === 1 ? '0' + c : '' + c;
	}

	// Replace a decimal with it's percentage value
	function convertToPercentage( n ) {
		if ( n <= 1 ) {
			n = ( n * 100 ) + '%';
		}

		return n;
	}

	// Converts a decimal to a hex value
	function convertDecimalToHex( d ) {
		return Math.round( parseFloat( d ) * 255 ).toString( 16 );
	}

	// Conversion Functions
	// --------------------

	// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
	// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>

	// `rgbToRgb`
	// Handle bounds / percentage checking to conform to CSS color spec
	// <http://www.w3.org/TR/css3-color/>
	// *Assumes:* r, g, b in [0, 255] or [0, 1]
	// *Returns:* { r, g, b } in [0, 255]
	function rgbToRgb( r, g, b ) {
		return {
			r: bound01( r, 255 ) * 255,
			g: bound01( g, 255 ) * 255,
			b: bound01( b, 255 ) * 255
		};
	}

	// `rgbToHsl`
	// Converts an RGB color value to HSL.
	// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
	// *Returns:* { h, s, l } in [0,1]
	function rgbToHsl( r, g, b ) {
		var max;
		var min;
		var h;
		var s;
		var l;
		var d;

		r = bound01( r, 255 );
		g = bound01( g, 255 );
		b = bound01( b, 255 );

		max = mathMax( r, g, b );
		min = mathMin( r, g, b );
		l = ( max + min ) / 2;

		if ( max === min ) {
			h = s = 0; // achromatic
		} else {
			d = max - min;
			s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
			switch ( max ) {
				case r:
					h = ( ( g - b ) / d ) + ( g < b ? 6 : 0 );
					break;
				case g:
					h = ( ( b - r ) / d ) + 2;
					break;
				case b:
					h = ( ( r - g ) / d ) + 4;
					break;
			}

			h /= 6;
		}

		return { h: h, s: s, l: l };
	}

	// `hslToRgb`
	// Converts an HSL color value to RGB.
	// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
	// *Returns:* { r, g, b } in the set [0, 255]
	function hslToRgb( h, s, l ) {
		var r;
		var g;
		var b;
		var q;
		var p;

		h = bound01( h, 360 );
		s = bound01( s, 100 );
		l = bound01( l, 100 );

		function hue2rgb( pp, qq, t ) {
			if ( t < 0 ) {
				t += 1;
			}
			if ( t > 1 ) {
				t -= 1;
			}
			if ( t < 1 / 6 ) {
				return pp + ( ( qq - pp ) * 6 * t );
			}
			if ( t < 1 / 2 ) {
				return qq;
			}
			if ( t < 2 / 3 ) {
				return pp + ( ( qq - pp ) * ( ( 2 / 3 ) - t ) * 6 );
			}
			return pp;
		}

		if ( s === 0 ) {
			r = g = b = l; // achromatic
		} else {
			q = l < 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
			p = ( 2 * l ) - q;
			r = hue2rgb( p, q, h + ( 1 / 3 ) );
			g = hue2rgb( p, q, h );
			b = hue2rgb( p, q, h - ( 1 / 3 ) );
		}

		return { r: r * 255, g: g * 255, b: b * 255 };
	}

	// `rgbToHsv`
	// Converts an RGB color value to HSV
	// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
	// *Returns:* { h, s, v } in [0,1]
	function rgbToHsv( r, g, b ) {
		var max;
		var min;
		var h;
		var s;
		var v;
		var d;

		r = bound01( r, 255 );
		g = bound01( g, 255 );
		b = bound01( b, 255 );

		max = mathMax( r, g, b );
		min = mathMin( r, g, b );
		v = max;

		d = max - min;
		s = max === 0 ? 0 : d / max;

		if ( max === min ) {
			h = 0; // achromatic
		} else {
			switch ( max ) {
				case r:
					h = ( ( g - b ) / d ) + ( g < b ? 6 : 0 );
					break;
				case g:
					h = ( ( b - r ) / d ) + 2;
					break;
				case b:
					h = ( ( r - g ) / d ) + 4;
					break;
			}
			h /= 6;
		}
		return { h: h, s: s, v: v };
	}

	// `hsvToRgb`
	// Converts an HSV color value to RGB.
	// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
	// *Returns:* { r, g, b } in the set [0, 255]
	function hsvToRgb( h, s, v ) {
		var i;
		var f;
		var p;
		var q;
		var t;
		var mod;
		var r;
		var g;
		var b;

		h = bound01( h, 360 ) * 6;
		s = bound01( s, 100 );
		v = bound01( v, 100 );

		i = Math.floor( h );
		f = h - i;
		p = v * ( 1 - s );
		q = v * ( 1 - ( f * s ) );
		t = v * ( 1 - ( ( 1 - f ) * s ) );
		mod = i % 6;
		r = [ v, q, p, p, t, v ][ mod ];
		g = [ t, v, v, q, p, p ][ mod ];
		b = [ p, p, t, v, v, q ][ mod ];

		return { r: r * 255, g: g * 255, b: b * 255 };
	}

	// `rgbToHex`
	// Converts an RGB color to hex
	// Assumes r, g, and b are contained in the set [0, 255]
	// Returns a 3 or 6 character hex
	function rgbToHex( r, g, b, allow3Char ) {
		var hex = [ pad2( mathRound( r ).toString( 16 ) ), pad2( mathRound( g ).toString( 16 ) ), pad2( mathRound( b ).toString( 16 ) ) ];

		// Return a 3 character hex if possible
		if ( allow3Char && hex[ 0 ].charAt( 0 ) === hex[ 0 ].charAt( 1 ) && hex[ 1 ].charAt( 0 ) === hex[ 1 ].charAt( 1 ) && hex[ 2 ].charAt( 0 ) === hex[ 2 ].charAt( 1 ) ) {
			return hex[ 0 ].charAt( 0 ) + hex[ 1 ].charAt( 0 ) + hex[ 2 ].charAt( 0 );
		}

		return hex.join( '' );
	}

	// `rgbaToHex`
	// Converts an RGBA color plus alpha transparency to hex
	// Assumes r, g, b are contained in the set [0, 255] and
	// a in [0, 1]. Returns a 4 or 8 character rgba hex
	function rgbaToHex( r, g, b, a, allow4Char ) {
		var hex = [ pad2( mathRound( r ).toString( 16 ) ), pad2( mathRound( g ).toString( 16 ) ), pad2( mathRound( b ).toString( 16 ) ), pad2( convertDecimalToHex( a ) ) ];

		// Return a 4 character hex if possible
		if ( allow4Char && hex[ 0 ].charAt( 0 ) === hex[ 0 ].charAt( 1 ) && hex[ 1 ].charAt( 0 ) === hex[ 1 ].charAt( 1 ) && hex[ 2 ].charAt( 0 ) === hex[ 2 ].charAt( 1 ) && hex[ 3 ].charAt( 0 ) === hex[ 3 ].charAt( 1 ) ) {
			return hex[ 0 ].charAt( 0 ) + hex[ 1 ].charAt( 0 ) + hex[ 2 ].charAt( 0 ) + hex[ 3 ].charAt( 0 );
		}

		return hex.join( '' );
	}

	// `rgbaToArgbHex`
	// Converts an RGBA color to an ARGB Hex8 string
	// Rarely used, but required for "toFilter()"
	function rgbaToArgbHex( r, g, b, a ) {
		var hex = [ pad2( convertDecimalToHex( a ) ), pad2( mathRound( r ).toString( 16 ) ), pad2( mathRound( g ).toString( 16 ) ), pad2( mathRound( b ).toString( 16 ) ) ];

		return hex.join( '' );
	}

	// Given a string or object, convert that input to RGB
	// Possible string inputs:
	//
	//     "red"
	//     "#f00" or "f00"
	//     "#ff0000" or "ff0000"
	//     "#ff000000" or "ff000000"
	//     "rgb 255 0 0" or "rgb (255, 0, 0)"
	//     "rgb 1.0 0 0" or "rgb (1, 0, 0)"
	//     "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
	//     "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
	//     "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
	//     "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
	//     "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
	//
	function inputToRGB( color ) {
		var rgb = { r: 0, g: 0, b: 0 };
		var a = 1;
		var s = null;
		var v = null;
		var l = null;
		var ok = false;
		var format = false;

		if ( typeof color === 'string' ) {
			color = stringInputToObject( color );
		}

		if ( typeof color === 'object' ) {
			if ( isValidCSSUnit( color.r ) && isValidCSSUnit( color.g ) && isValidCSSUnit( color.b ) ) {
				rgb = rgbToRgb( color.r, color.g, color.b );
				ok = true;
				format = String( color.r ).substring( String( color.r ).length - 1 ) === '%' ? 'prgb' : 'rgb';
			} else if ( isValidCSSUnit( color.h ) && isValidCSSUnit( color.s ) && isValidCSSUnit( color.v ) ) {
				s = convertToPercentage( color.s );
				v = convertToPercentage( color.v );
				rgb = hsvToRgb( color.h, s, v );
				ok = true;
				format = 'hsv';
			} else if ( isValidCSSUnit( color.h ) && isValidCSSUnit( color.s ) && isValidCSSUnit( color.l ) ) {
				s = convertToPercentage( color.s );
				l = convertToPercentage( color.l );
				rgb = hslToRgb( color.h, s, l );
				ok = true;
				format = 'hsl';
			}

			if ( Object.prototype.hasOwnProperty.call( color, 'a' ) ) {
				a = color.a;
			}
		}

		a = boundAlpha( a );

		return {
			ok: ok,
			format: color.format || format,
			r: mathMin( 255, mathMax( rgb.r, 0 ) ),
			g: mathMin( 255, mathMax( rgb.g, 0 ) ),
			b: mathMin( 255, mathMax( rgb.b, 0 ) ),
			a: a
		};
	}

	function TinyColor( color, opts ) {
		var rgb;
		color = color ? color : '';
		opts = opts || {};

		// If input is already a TinyColor, return itself
		if ( color instanceof TinyColor ) {
			return color;
		}
		// If we are called as a function, call using new instead
		if ( ! ( this instanceof TinyColor ) ) {
			return new TinyColor( color, opts );
		}

		rgb = inputToRGB( color );
		this._originalInput = color;
		this._r = rgb.r;
		this._g = rgb.g;
		this._b = rgb.b;
		this._a = rgb.a;
		this._roundA = mathRound( 100 * this._a ) / 100;
		if ( opts.format ) {
			this._format = opts.format;
		} else {
			this._format = rgb.format;
		}

		this._gradientType = opts.gradientType;

		// Don't let the range of [0,255] come back in [0,1].
		// Potentially lose a little bit of precision here, but will fix issues where
		// .5 gets interpreted as half of the total, instead of half of 1
		// If it was supposed to be 128, this was already taken care of by `inputToRgb`
		if ( this._r < 1 ) {
			this._r = mathRound( this._r );
		}
		if ( this._g < 1 ) {
			this._g = mathRound( this._g );
		}
		if ( this._b < 1 ) {
			this._b = mathRound( this._b );
		}

		this._ok = rgb.ok;
		tinyCounter = tinyCounter + 1;
		this._tc_id = tinyCounter;
	}

	function newTinyColor( color, opts ) {
		return new TinyColor( color, opts );
	}

	// Modification Functions
	// ----------------------
	// Thanks to less.js for some of the basics here
	// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>

	function desaturate( color, amount ) {
		var hsl;
		amount = amount === 0 ? 0 : amount || 10;
		hsl = newTinyColor( color ).toHsl();
		hsl.s -= amount / 100;
		hsl.s = clamp01( hsl.s );
		return newTinyColor( hsl );
	}

	function saturate( color, amount ) {
		var hsl;
		amount = amount === 0 ? 0 : amount || 10;
		hsl = newTinyColor( color ).toHsl();
		hsl.s += amount / 100;
		hsl.s = clamp01( hsl.s );
		return newTinyColor( hsl );
	}

	function greyscale( color ) {
		return newTinyColor( color ).desaturate( 100 );
	}

	function lighten( color, amount ) {
		var hsl;
		amount = amount === 0 ? 0 : amount || 10;
		hsl = newTinyColor( color ).toHsl();
		hsl.l += amount / 100;
		hsl.l = clamp01( hsl.l );
		return newTinyColor( hsl );
	}

	function brighten( color, amount ) {
		var rgb;
		amount = amount === 0 ? 0 : amount || 10;
		rgb = newTinyColor( color ).toRgb();
		rgb.r = mathMax( 0, mathMin( 255, rgb.r - mathRound( 255 * -( amount / 100 ) ) ) );
		rgb.g = mathMax( 0, mathMin( 255, rgb.g - mathRound( 255 * -( amount / 100 ) ) ) );
		rgb.b = mathMax( 0, mathMin( 255, rgb.b - mathRound( 255 * -( amount / 100 ) ) ) );
		return newTinyColor( rgb );
	}

	function darken( color, amount ) {
		var hsl;
		amount = amount === 0 ? 0 : amount || 10;
		hsl = newTinyColor( color ).toHsl();
		hsl.l -= amount / 100;
		hsl.l = clamp01( hsl.l );
		return newTinyColor( hsl );
	}

	// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
	// Values outside of this range will be wrapped into this range.
	function spin( color, amount ) {
		var hsl = newTinyColor( color ).toHsl();
		var hue = ( hsl.h + amount ) % 360;
		hsl.h = hue < 0 ? 360 + hue : hue;
		return newTinyColor( hsl );
	}

	// Combination Functions
	// ---------------------
	// Thanks to jQuery xColor for some of the ideas behind these
	// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>

	function complement( color ) {
		var hsl = newTinyColor( color ).toHsl();
		hsl.h = ( hsl.h + 180 ) % 360;
		return newTinyColor( hsl );
	}

	function triad( color ) {
		var hsl = newTinyColor( color ).toHsl();
		var h = hsl.h;
		return [ newTinyColor( color ), newTinyColor( { h: ( h + 120 ) % 360, s: hsl.s, l: hsl.l } ), newTinyColor( { h: ( h + 240 ) % 360, s: hsl.s, l: hsl.l } ) ];
	}

	function tetrad( color ) {
		var hsl = newTinyColor( color ).toHsl();
		var h = hsl.h;
		return [ newTinyColor( color ), newTinyColor( { h: ( h + 90 ) % 360, s: hsl.s, l: hsl.l } ), newTinyColor( { h: ( h + 180 ) % 360, s: hsl.s, l: hsl.l } ), newTinyColor( { h: ( h + 270 ) % 360, s: hsl.s, l: hsl.l } ) ];
	}

	function splitcomplement( color ) {
		var hsl = newTinyColor( color ).toHsl();
		var h = hsl.h;
		return [ newTinyColor( color ), newTinyColor( { h: ( h + 72 ) % 360, s: hsl.s, l: hsl.l } ), newTinyColor( { h: ( h + 216 ) % 360, s: hsl.s, l: hsl.l } ) ];
	}

	/*function analogous(color, results, slices) {
     results = results || 6;
     slices = slices || 30;

     var hsl = newTinyColor(color).toHsl();
     var part = 360 / slices;
     var ret = [newTinyColor(color)];

     for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results;) {
     hsl.h = (hsl.h + part) % 360;
     ret.push(newTinyColor(hsl));
     }
     return ret;
     }

     function monochromatic(color, results) {
     var hsv;
     var h;
     var s;
     var v;
     var ret;
     var modification;
     results = results || 6;
     hsv = newTinyColor(color).toHsv();
     h = hsv.h;
     s = hsv.s;
     v = hsv.v;
     ret = [];
     modification = 1 / results;

     while (results--) {
     ret.push(newTinyColor({h: h, s: s, v: v}));
     v = (v + modification) % 1;
     }

     return ret;
     }*/

	TinyColor.prototype = {
		isDark: function() {
			return this.getBrightness() < 128;
		},
		isLight: function() {
			return ! this.isDark();
		},
		isValid: function() {
			return this._ok;
		},
		getOriginalInput: function() {
			return this._originalInput;
		},
		getFormat: function() {
			return this._format;
		},
		getAlpha: function() {
			return this._a;
		},
		getBrightness: function() {
			//http://www.w3.org/TR/AERT#color-contrast
			var rgb = this.toRgb();
			return ( ( rgb.r * 299 ) + ( rgb.g * 587 ) + ( rgb.b * 114 ) ) / 1000;
		},
		getLuminance: function() {
			//http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
			var rgb = this.toRgb();
			var RsRGB, GsRGB, BsRGB, R, G, B;
			RsRGB = rgb.r / 255;
			GsRGB = rgb.g / 255;
			BsRGB = rgb.b / 255;

			if ( RsRGB <= 0.03928 ) {
				R = RsRGB / 12.92;
			} else {
				R = Math.pow( ( RsRGB + 0.055 ) / 1.055, 2.4 );
			}
			if ( GsRGB <= 0.03928 ) {
				G = GsRGB / 12.92;
			} else {
				G = Math.pow( ( GsRGB + 0.055 ) / 1.055, 2.4 );
			}
			if ( BsRGB <= 0.03928 ) {
				B = BsRGB / 12.92;
			} else {
				B = Math.pow( ( BsRGB + 0.055 ) / 1.055, 2.4 );
			}
			return ( 0.2126 * R ) + ( 0.7152 * G ) + ( 0.0722 * B );
		},
		setAlpha: function( value ) {
			this._a = boundAlpha( value );
			this._roundA = mathRound( 100 * this._a ) / 100;
			return this;
		},
		toHsv: function() {
			var hsv = rgbToHsv( this._r, this._g, this._b );
			return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
		},
		toHsvString: function() {
			var hsv = rgbToHsv( this._r, this._g, this._b );
			var h = mathRound( hsv.h * 360 ),
				s = mathRound( hsv.s * 100 ),
				v = mathRound( hsv.v * 100 );
			return this._a === 1 ? 'hsv(' + h + ', ' + s + '%, ' + v + '%)' : 'hsva(' + h + ', ' + s + '%, ' + v + '%, ' + this._roundA + ')';
		},
		toHsl: function() {
			var hsl = rgbToHsl( this._r, this._g, this._b );
			return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
		},
		toHslString: function() {
			var hsl = rgbToHsl( this._r, this._g, this._b );
			var h = mathRound( hsl.h * 360 ),
				s = mathRound( hsl.s * 100 ),
				l = mathRound( hsl.l * 100 );
			return this._a === 1 ? 'hsl(' + h + ', ' + s + '%, ' + l + '%)' : 'hsla(' + h + ', ' + s + '%, ' + l + '%, ' + this._roundA + ')';
		},
		toHex: function( allow3Char ) {
			return rgbToHex( this._r, this._g, this._b, allow3Char );
		},
		toHexString: function( allow3Char ) {
			return '#' + this.toHex( allow3Char );
		},
		toHex8: function( allow4Char ) {
			return rgbaToHex( this._r, this._g, this._b, this._a, allow4Char );
		},
		toHex8String: function( allow4Char ) {
			return '#' + this.toHex8( allow4Char );
		},
		toRgb: function() {
			return { r: mathRound( this._r ), g: mathRound( this._g ), b: mathRound( this._b ), a: this._a };
		},
		toRgbString: function() {
			return this._a === 1 ? 'rgb(' + mathRound( this._r ) + ', ' + mathRound( this._g ) + ', ' + mathRound( this._b ) + ')' : 'rgba(' + mathRound( this._r ) + ', ' + mathRound( this._g ) + ', ' + mathRound( this._b ) + ', ' + this._roundA + ')';
		},
		toPercentageRgb: function() {
			return {
				r: mathRound( bound01( this._r, 255 ) * 100 ) + '%',
				g: mathRound( bound01( this._g, 255 ) * 100 ) + '%',
				b: mathRound( bound01( this._b, 255 ) * 100 ) + '%',
				a: this._a
			};
		},
		toPercentageRgbString: function() {
			return this._a === 1 ? 'rgb(' + mathRound( bound01( this._r, 255 ) * 100 ) + '%, ' + mathRound( bound01( this._g, 255 ) * 100 ) + '%, ' + mathRound( bound01( this._b, 255 ) * 100 ) + '%)'
				: 'rgba(' + mathRound( bound01( this._r, 255 ) * 100 ) + '%, ' + mathRound( bound01( this._g, 255 ) * 100 ) + '%, ' + mathRound( bound01( this._b, 255 ) * 100 ) + '%, ' + this._roundA + ')';
		},
		toName: function() {
			if ( this._a === 0 ) {
				return 'transparent';
			}

			if ( this._a < 1 ) {
				return false;
			}

			return hexNames[ rgbToHex( this._r, this._g, this._b, true ) ] || false;
		},
		toFilter: function( secondColor ) {
			var hex8String = '#' + rgbaToArgbHex( this._r, this._g, this._b, this._a );
			var secondHex8String = hex8String;
			var gradientType = this._gradientType ? 'GradientType = 1, ' : '';
			var s;
			if ( secondColor ) {
				s = newTinyColor( secondColor );
				secondHex8String = '#' + rgbaToArgbHex( s._r, s._g, s._b, s._a );
			}

			return 'progid:DXImageTransform.Microsoft.gradient(' + gradientType + 'startColorstr=' + hex8String + ',endColorstr=' + secondHex8String + ')';
		},
		toString: function( format ) {
			var formatSet = !! format;
			var formattedString;
			var hasAlpha;
			var needsAlphaFormat;
			format = format || this._format;

			formattedString = false;
			hasAlpha = this._a < 1 && this._a >= 0;
			needsAlphaFormat = ! formatSet && hasAlpha && ( format === 'hex' || format === 'hex6' || format === 'hex3' || format === 'hex4' || format === 'hex8' || format === 'name' );

			if ( needsAlphaFormat ) {
				// Special case for "transparent", all other non-alpha formats
				// will return rgba when there is transparency.
				if ( format === 'name' && this._a === 0 ) {
					return this.toName();
				}
				return this.toRgbString();
			}
			if ( format === 'rgb' ) {
				formattedString = this.toRgbString();
			}
			if ( format === 'prgb' ) {
				formattedString = this.toPercentageRgbString();
			}
			if ( format === 'hex' || format === 'hex6' ) {
				formattedString = this.toHexString();
			}
			if ( format === 'hex3' ) {
				formattedString = this.toHexString( true );
			}
			if ( format === 'hex4' ) {
				formattedString = this.toHex8String( true );
			}
			if ( format === 'hex8' ) {
				formattedString = this.toHex8String();
			}
			if ( format === 'name' ) {
				formattedString = this.toName();
			}
			if ( format === 'hsl' ) {
				formattedString = this.toHslString();
			}
			if ( format === 'hsv' ) {
				formattedString = this.toHsvString();
			}

			return formattedString || this.toHexString();
		},
		clone: function() {
			return newTinyColor( this.toString() );
		},

		_applyModification: function( fn, args ) {
			var color = fn.apply( null, [ this ].concat( [].slice.call( args ) ) );
			this._r = color._r;
			this._g = color._g;
			this._b = color._b;
			this.setAlpha( color._a );
			return this;
		},
		lighten: function() {
			return this._applyModification( lighten, arguments );
		},
		brighten: function() {
			return this._applyModification( brighten, arguments );
		},
		darken: function() {
			return this._applyModification( darken, arguments );
		},
		desaturate: function() {
			return this._applyModification( desaturate, arguments );
		},
		saturate: function() {
			return this._applyModification( saturate, arguments );
		},
		greyscale: function() {
			return this._applyModification( greyscale, arguments );
		},
		spin: function() {
			return this._applyModification( spin, arguments );
		},

		_applyCombination: function( fn, args ) {
			return fn.apply( null, [ this ].concat( [].slice.call( args ) ) );
		},
		/*analogous: function () {
         return this._applyCombination(analogous, arguments);
         },*/
		complement: function() {
			return this._applyCombination( complement, arguments );
		},
		/*monochromatic: function () {
         return this._applyCombination(monochromatic, arguments);
         },*/
		splitcomplement: function() {
			return this._applyCombination( splitcomplement, arguments );
		},
		triad: function() {
			return this._applyCombination( triad, arguments );
		},
		tetrad: function() {
			return this._applyCombination( tetrad, arguments );
		}
	};

	// If input is an object, force 1 into "1.0" to handle ratios properly
	// String input requires "1.0" as input, so 1 will be treated as 1
	TinyColor.fromRatio = function( color, opts ) {
		var newColor;
		var i;
		if ( typeof color === 'object' ) {
			newColor = {};
			for ( i in color ) {
				if ( Object.prototype.hasOwnProperty.call( color, i ) ) {
					if ( i === 'a' ) {
						newColor[ i ] = color[ i ];
					} else {
						newColor[ i ] = convertToPercentage( color[ i ] );
					}
				}
			}
			color = newColor;
		}

		return newTinyColor( color, opts );
	};

	// `equals`
	// Can be called with any TinyColor input
	TinyColor.equals = function( color1, color2 ) {
		if ( ! color1 || ! color2 ) {
			return false;
		}
		return newTinyColor( color1 ).toRgbString() === newTinyColor( color2 ).toRgbString();
	};

	TinyColor.random = function() {
		return TinyColor.fromRatio( {
			r: mathRandom(),
			g: mathRandom(),
			b: mathRandom()
		} );
	};

	// Utility Functions
	// ---------------------

	TinyColor.mix = function( color1, color2, amount ) {
		var rgb1;
		var rgb2;
		var p;
		var rgba;

		amount = amount === 0 ? 0 : amount || 50;

		rgb1 = newTinyColor( color1 ).toRgb();
		rgb2 = newTinyColor( color2 ).toRgb();

		p = amount / 100;

		rgba = {
			r: ( ( rgb2.r - rgb1.r ) * p ) + rgb1.r,
			g: ( ( rgb2.g - rgb1.g ) * p ) + rgb1.g,
			b: ( ( rgb2.b - rgb1.b ) * p ) + rgb1.b,
			a: ( ( rgb2.a - rgb1.a ) * p ) + rgb1.a
		};

		return newTinyColor( rgba );
	};

	// Readability Functions
	// ---------------------
	// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)

	// `contrast`
	// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
	TinyColor.readability = function( color1, color2 ) {
		var c1 = newTinyColor( color1 );
		var c2 = newTinyColor( color2 );
		return ( Math.max( c1.getLuminance(), c2.getLuminance() ) + 0.05 ) / ( Math.min( c1.getLuminance(), c2.getLuminance() ) + 0.05 );
	};

	// `isReadable`
	// Ensure that foreground and background color combinations meet WCAG2 guidelines.
	// The third argument is an optional Object.
	//      the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
	//      the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
	// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.

	// *Example*
	//    TinyColor.isReadable("#000", "#111") => false
	//    TinyColor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
	TinyColor.isReadable = function( color1, color2, wcag2 ) {
		var readability = TinyColor.readability( color1, color2 );
		var wcag2Parms, out;

		out = false;

		wcag2Parms = validateWCAG2Parms( wcag2 );
		switch ( wcag2Parms.level + wcag2Parms.size ) {
			case 'AAsmall':
			case 'AAAlarge':
				out = readability >= 4.5;
				break;
			case 'AAlarge':
				out = readability >= 3;
				break;
			case 'AAAsmall':
				out = readability >= 7;
				break;
		}
		return out;
	};

	// `mostReadable`
	// Given a base color and a list of possible foreground or background
	// colors for that base, returns the most readable color.
	// Optionally returns Black or White if the most readable color is unreadable.
	// *Example*
	//    TinyColor.mostReadable(TinyColor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
	//    TinyColor.mostReadable(TinyColor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString();  // "#ffffff"
	//    TinyColor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
	//    TinyColor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
	TinyColor.mostReadable = function( baseColor, colorList, args ) {
		var bestColor = null;
		var bestScore = 0;
		var readability;
		var includeFallbackColors;
		var level;
		var size;
		var i;
		args = args || {};
		includeFallbackColors = args.includeFallbackColors;
		level = args.level;
		size = args.size;

		for ( i = 0; i < colorList.length; i += 1 ) {
			readability = TinyColor.readability( baseColor, colorList[ i ] );
			if ( readability > bestScore ) {
				bestScore = readability;
				bestColor = newTinyColor( colorList[ i ] );
			}
		}

		if ( TinyColor.isReadable( baseColor, bestColor, { level: level, size: size } ) || ! includeFallbackColors ) {
			return bestColor;
		}
		args.includeFallbackColors = false;
		return TinyColor.mostReadable( baseColor, [ '#fff', '#000' ], args );
	};

	// Big List of Colors
	// ------------------
	// <http://www.w3.org/TR/css3-color/#svg-color>
	TinyColor.names = names;

	// Make it easy to access colors via `hexNames[hex]`
	TinyColor.hexNames = hexNames;

	// Node: Export function
	if ( typeof window.module !== 'undefined' && window.module.exports ) {
		window.module.exports = TinyColor;
	} else if ( typeof window.define === 'function' && window.define.amd ) { // AMD/requirejs: Define the module
		window.define( function() {
			return TinyColor;
		} );
	} else { // Browser: Expose to window
		window.tinycolor = TinyColor;
	}
}( Math ) );

// Spectrum Colorpicker v2.0.10
// https://github.com/seballot/spectrum
// Author: Brian Grinstead
// License: MIT

( function( factory ) {
	'use strict';

	if ( typeof window.define === 'function' && window.define.amd ) {
		// AMD
		window.define( [ 'jquery' ], factory );
	} else if ( typeof exports === 'object' && typeof module === 'object' ) {
		// CommonJS
		window.module.exports = factory( window.require( 'jquery' ) );
	} else {
		// Browser
		factory( window.jQuery );
	}
}( function( $ ) {
	'use strict';

	var dataID = 'spectrum.id';
	var tinycolor = window.tinycolor;
	var defaultOpts = {
			// Callbacks
			beforeShow: noop,
			move: noop,
			change: noop,
			show: noop,
			hide: noop,

			// Options
			color: false,
			flat: false, // Deprecated - use type instead
			type: 'color', // text, color, component or flat
			showInput: false,
			allowEmpty: false,
			showButtons: true,
			clickoutFiresChange: true,
			showInitial: false,
			showPalette: false,
			showPaletteOnly: false,
			hideAfterPaletteSelect: false,
			togglePaletteOnly: false,
			showSelectionPalette: true,
			localStorageKey: false,
			appendTo: 'body',
			maxSelectionSize: 8,
			locale: 'en',
			cancelText: 'cancel',
			chooseText: 'choose',
			togglePaletteMoreText: 'more',
			togglePaletteLessText: 'less',
			clearText: 'Clear Color Selection',
			preferredFormat: 'hex',
			className: '', // Deprecated - use containerClassName and replacerClassName instead.
			containerClassName: '',
			replacerClassName: '',
			showAlpha: false,
			theme: 'epo',
			palette: [
				[ '#000000', '#444444', '#5b5b5b', '#999999', '#bcbcbc', '#eeeeee', '#f3f6f4', '#ffffff' ],
				[ '#f44336', '#744700', '#ce7e00', '#8fce00', '#2986cc', '#16537e', '#6a329f', '#c90076' ],
				[ '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#cfe2f3', '#d9d2e9', '#ead1dc' ],
				[ '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8', '#b4a7d6', '#d5a6bd' ],
				[ '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6fa8dc', '#8e7cc3', '#c27ba0' ],
				[ '#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3d85c6', '#674ea7', '#a64d79' ],
				[ '#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#0b5394', '#351c75', '#741b47' ],
				[ '#660000', '#783f04', '#7f6000', '#274e13', '#0c343d', '#073763', '#20124d', '#4c1130' ]
			],
			selectionPalette: [],
			disabled: false,
			offset: null
		},
		spectrums = [],
		IE = !! /msie/i.exec( window.navigator.userAgent ),
		rgbaSupport = ( function() {
			var contains = function( str, substr ) {
				return ( '' + str ).indexOf( substr ) !== 1;
			};
			var elem = document.createElement( 'div' );
			var style = elem.style;
			style.cssText = 'background-color:rgba(0,0,0,.5)';
			return contains( style.backgroundColor, 'rgba' ) || contains( style.backgroundColor, 'hsla' );
		}() ),
		replaceInput = [
			'<button type="button" class="sp-replacer">',
			'<span class="sp-preview"><span class="sp-preview-inner"></span></span>',
			'<span class="sp-dd">&#9660;</span>',
			'</button>'
		].join( '' ),
		markup = ( function() {
			var i;
			// IE does not support gradients with multiple stops, so we need to simulate
			//  that for the rainbow slider with 8 divs that each have a single gradient
			var gradientFix = '';
			if ( IE ) {
				for ( i = 1; i <= 6; i++ ) {
					gradientFix += "<div class='sp-" + i + "'></div>";
				}
			}

			return [
				"<div class='sp-container sp-hidden'>",
				"<div class='sp-palette-container'>",
				"<div class='sp-palette sp-thumb sp-cf'></div>",
				"<div class='sp-palette-button-container sp-cf'>",
				"<button type='button' class='sp-palette-toggle'></button>",
				'</div>',
				'</div>',
				"<div class='sp-picker-container'>",
				"<div class='sp-top sp-cf'>",
				"<div class='sp-fill'></div>",
				"<div class='sp-top-inner'>",
				"<div class='sp-color'>",
				"<div class='sp-sat'>",
				"<div class='sp-val'>",
				"<div class='sp-dragger' tabindex='0'></div>",
				'</div>',
				'</div>',
				'</div>',
				"<div class='sp-clear sp-clear-display'>",
				'</div>',
				"<div class='sp-hue'>",
				"<div class='sp-slider' tabindex='0'></div>",
				gradientFix,
				'</div>',
				'</div>',
				"<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle' tabindex='0'></div></div></div>",
				'</div>',
				"<div class='sp-input-container sp-cf'>",
				"<input class='sp-input' type='text' spellcheck='false'>",
				'</div>',
				"<div class='sp-initial sp-thumb sp-cf'></div>",
				"<div class='sp-button-container sp-cf'>",
				"<button type='button' class='sp-cancel'></button>",
				"<button type='button' class='sp-choose'></button>",
				'</div>',
				'</div>',
				'</div>'
			].join( '' );
		}() );

	function paletteTemplate( p, color, className, opts ) {
		var html = [];
		var i;
		var current;
		var tiny;
		var c;
		var formattedString;
		var swatchStyle;
		for ( i = 0; i < p.length; i++ ) {
			current = p[ i ];
			if ( current ) {
				tiny = tinycolor( current );
				c = tiny.toHsl().l < 0.5 ? 'sp-thumb-el sp-thumb-dark' : 'sp-thumb-el sp-thumb-light';
				c += tinycolor.equals( color, current ) ? ' sp-thumb-active' : '';
				formattedString = tiny.toString( opts.preferredFormat || 'rgb' );
				swatchStyle = rgbaSupport ? 'background-color:' + tiny.toRgbString() : 'filter:' + tiny.toFilter();
				html.push( '<span title="' + formattedString + '" data-color="' + tiny.toRgbString() + '" class="' + c + '" role="button" tabindex="0"><span class="sp-thumb-inner" style="' + swatchStyle + ';"></span></span>' );
			} else {
				html.push( '<span class="sp-thumb-el sp-clear-display" role="button" tabindex="0"><span class="sp-clear-palette-only" style="background-color: transparent;"></span></span>' );
			}
		}
		return "<div class='sp-cf " + className + "'>" + html.join( '' ) + '</div>';
	}

	function hideAll() {
		var i;
		for ( i = 0; i < spectrums.length; i++ ) {
			if ( spectrums[ i ] ) {
				spectrums[ i ].hide();
			}
		}
	}

	function instanceOptions( o, callbackContext ) {
		var opts;
		o.locale = o.locale || window.navigator.language;
		if ( o.locale ) {
			o.locale = o.locale.split( '-' )[ 0 ].toLowerCase();
		} // handle locale like "fr-FR"
		if ( o.locale !== 'en' && $.spectrum.localization[ o.locale ] ) {
			o = $.extend( {}, $.spectrum.localization[ o.locale ], o );
		}
		opts = $.extend( {}, defaultOpts, o );

		opts.callbacks = {
			move: bind( opts.move, callbackContext ),
			change: bind( opts.change, callbackContext ),
			show: bind( opts.show, callbackContext ),
			hide: bind( opts.hide, callbackContext ),
			beforeShow: bind( opts.beforeShow, callbackContext )
		};

		return opts;
	}

	function spectrum( element, o ) {
		var spect;

		var opts = instanceOptions( o, element ),
			type = opts.type,
			flat = type === 'flat',
			showSelectionPalette = opts.showSelectionPalette,
			localStorageKey = opts.localStorageKey,
			theme = opts.theme,
			callbacks = opts.callbacks,
			resize = throttle( reflow, 10 ),
			visible = false,
			isDragging = false,
			dragWidth = 0,
			dragHeight = 0,
			dragHelperHeight = 0,
			slideHeight = 0,
			alphaWidth = 0,
			alphaSlideHelperWidth = 0,
			slideHelperHeight = 0,
			currentHue = 0,
			currentSaturation = 0,
			currentValue = 0,
			currentAlpha = 1,
			palette = [],
			paletteArray = [],
			paletteLookup = {},
			selectionPalette = opts.selectionPalette.slice( 0 ),
			maxSelectionSize = opts.maxSelectionSize,
			draggingClass = 'sp-dragging',
			abortNextInputChange = false,
			shiftMovementDirection = null;

		var doc = element.ownerDocument,
			boundElement = $( element ),
			disabled = false,
			container = $( markup, doc ).addClass( theme ),
			pickerContainer = container.find( '.sp-picker-container' ),
			dragger = container.find( '.sp-color' ),
			dragHelper = container.find( '.sp-dragger' ),
			slider = container.find( '.sp-hue' ),
			slideHelper = container.find( '.sp-slider' ),
			alphaSliderInner = container.find( '.sp-alpha-inner' ),
			alphaSlider = container.find( '.sp-alpha' ),
			alphaSlideHelper = container.find( '.sp-alpha-handle' ),
			textInput = container.find( '.sp-input' ),
			paletteContainer = container.find( '.sp-palette' ),
			initialColorContainer = container.find( '.sp-initial' ),
			cancelButton = container.find( '.sp-cancel' ),
			clearButton = container.find( '.sp-clear' ),
			chooseButton = container.find( '.sp-choose' ),
			toggleButton = container.find( '.sp-palette-toggle' ),
			isInput = boundElement.is( 'input' ),
			shouldReplace = isInput && type === 'color',
			replacer = shouldReplace ? $( replaceInput ).addClass( theme ).addClass( opts.className ).addClass( opts.replacerClassName ) : $( [] ),
			offsetElement = shouldReplace ? replacer : boundElement,
			previewElement = replacer.find( '.sp-preview-inner' ),
			initialColor = opts.color || ( isInput && boundElement.val() ),
			colorOnShow = false,
			currentPreferredFormat = opts.preferredFormat,
			clickoutFiresChange = ! opts.showButtons || opts.clickoutFiresChange,
			isEmpty = ! initialColor,
			allowEmpty = opts.allowEmpty;

		// Element to be updated with the input color. Populated in initialize method
		var originalInputContainer = null,
			colorizeElement = null,
			colorizeElementInitialColor = null,
			colorizeElementInitialBackground = null;

		//If there is a label for this element, when clicked on, show the colour picker
		var thisId = boundElement.attr( 'id' );
		var label;

		if ( thisId !== undefined && thisId.length > 0 ) {
			label = $( 'label[for="' + thisId + '"]' );
			if ( label.length ) {
				label.on( 'click', function( e ) {
					e.preventDefault();
					boundElement.spectrum( 'show' );
					return false;
				} );
			}
		}

		function applyOptions() {
			var i;
			var j;
			var rgb;

			if ( opts.showPaletteOnly ) {
				opts.showPalette = true;
			}

			toggleButton.text( opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText );

			if ( opts.palette ) {
				palette = opts.palette.slice( 0 );
				paletteArray = Array.isArray( palette[ 0 ] ) ? palette : [ palette ];
				paletteLookup = {};
				for ( i = 0; i < paletteArray.length; i++ ) {
					for ( j = 0; j < paletteArray[ i ].length; j++ ) {
						rgb = tinycolor( paletteArray[ i ][ j ] ).toRgbString();
						paletteLookup[ rgb ] = true;
					}
				}

				// if showPaletteOnly and didn't set initialcolor
				// set initialcolor to first palette
				if ( opts.showPaletteOnly && ! initialColor ) {
					initialColor = palette[ 0 ][ 0 ] === '' ? palette[ 0 ][ 0 ] : Object.keys( paletteLookup )[ 0 ];
				}
			}

			container.toggleClass( 'sp-flat', flat );
			container.toggleClass( 'sp-input-disabled', ! opts.showInput );
			container.toggleClass( 'sp-alpha-enabled', opts.showAlpha );
			container.toggleClass( 'sp-clear-enabled', allowEmpty );
			container.toggleClass( 'sp-buttons-disabled', ! opts.showButtons );
			container.toggleClass( 'sp-palette-buttons-disabled', ! opts.togglePaletteOnly );
			container.toggleClass( 'sp-palette-disabled', ! opts.showPalette );
			container.toggleClass( 'sp-palette-only', opts.showPaletteOnly );
			container.toggleClass( 'sp-initial-disabled', ! opts.showInitial );
			container.addClass( opts.className ).addClass( opts.containerClassName );

			reflow();
		}

		function initialize() {
			var addOn;
			var appendTo;
			var paletteEvent;

			if ( IE ) {
				container.find( '*:not(input)' ).attr( 'unselectable', 'on' );
			}

			applyOptions();

			originalInputContainer = $( '<span class="sp-original-input-container"></span>' );
			[ 'margin' ].forEach( function( cssProp ) {
				originalInputContainer.css( cssProp, boundElement.css( cssProp ) );
			} );
			// inline-flex by default, switching to flex if needed
			if ( boundElement.css( 'display' ) === 'block' ) {
				originalInputContainer.css( 'display', 'flex' );
			}

			if ( shouldReplace ) {
				boundElement.after( replacer ).hide();
			} else if ( type === 'text' ) {
				originalInputContainer.addClass( 'sp-colorize-container' );
				boundElement.addClass( 'spectrum sp-colorize' ).wrap( originalInputContainer );
			} else if ( type === 'component' ) {
				boundElement.addClass( 'spectrum' ).wrap( originalInputContainer );
				addOn = $( [ "<div class='sp-colorize-container sp-add-on'>", "<div class='sp-colorize'></div> ", '</div>' ].join( '' ) );
				addOn
					.width( boundElement.outerHeight() + 'px' )
					.css( 'border-radius', boundElement.css( 'border-radius' ) )
					.css( 'border', boundElement.css( 'border' ) );
				boundElement.addClass( 'with-add-on' ).before( addOn );
			}

			colorizeElement = boundElement.parent().find( '.sp-colorize' );
			colorizeElementInitialColor = colorizeElement.css( 'color' );
			colorizeElementInitialBackground = colorizeElement.css( 'background-color' );

			if ( ! allowEmpty ) {
				clearButton.hide();
			}

			if ( flat ) {
				boundElement.after( container ).hide();
			} else {
				appendTo = opts.appendTo === 'parent' ? boundElement.parent() : $( opts.appendTo );
				if ( appendTo.length !== 1 ) {
					appendTo = $( 'body' );
				}

				appendTo.append( container );
			}

			updateSelectionPaletteFromStorage();

			offsetElement.on( 'click.spectrum touchstart.spectrum', function( e ) {
				if ( ! disabled ) {
					show();
				}

				e.stopPropagation();

				if ( ! $( e.target ).is( 'input' ) ) {
					e.preventDefault();
				}
			} );

			if ( boundElement.is( ':disabled' ) || opts.disabled === true ) {
				disable();
			}

			// Prevent clicks from bubbling up to document.  This would cause it to be hidden.
			container.on( 'click', stopPropagation );

			container.on( 'keydown', 'div[role="button"]', function( e ) {
				if ( e.keyCode === 13 ) {
					e.preventDefault();
					$( this ).click();
				}
			} );

			// Handle user typed input
			[ textInput, boundElement ].forEach( function( input ) {
				input.on( 'change', function() {
					setFromTextInput( input.val() );
				} );
				input.on( 'paste', function() {
					setTimeout( function() {
						setFromTextInput( input.val() );
					}, 1 );
				} );
				input.on( 'keydown', function( e ) {
					if ( e.keyCode === 13 ) {
						setFromTextInput( $( input ).val() );
						// eslint-disable-next-line eqeqeq
						if ( input == boundElement ) {
							hide();
						}
					}
				} );
			} );

			cancelButton.text( opts.cancelText );
			cancelButton.on( 'click.spectrum', function( e ) {
				e.stopPropagation();
				e.preventDefault();
				revert();
				hide();
			} );

			clearButton.attr( 'title', opts.clearText );
			clearButton.on( 'click.spectrum', function( e ) {
				e.stopPropagation();
				e.preventDefault();
				isEmpty = true;
				move();

				if ( flat ) {
					//for the flat style, this is a change event
					updateOriginalInput( true );
				}
			} );

			chooseButton.text( opts.chooseText );
			chooseButton.on( 'click.spectrum', function( e ) {
				e.stopPropagation();
				e.preventDefault();

				if ( IE && textInput.is( ':focus' ) ) {
					textInput.trigger( 'change' );
				}

				if ( isValid() ) {
					updateOriginalInput( true );
					hide();
				}
			} );

			toggleButton.text( opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText );
			toggleButton.on( 'click.spectrum', function( e ) {
				e.stopPropagation();
				e.preventDefault();

				opts.showPaletteOnly = ! opts.showPaletteOnly;

				// To make sure the Picker area is drawn on the right, next to the
				// Palette area (and not below the palette), first move the Palette
				// to the left to make space for the picker, plus 5px extra.
				// The 'applyOptions' function puts the whole container back into place
				// and takes care of the button-text and the sp-palette-only CSS class.
				if ( ! opts.showPaletteOnly && ! flat ) {
					container.css( 'left', '-=' + ( pickerContainer.outerWidth( true ) + 5 ) );
				}
				applyOptions();
			} );

			draggable(
				alphaSlider,
				function( dragX, dragY, e ) {
					currentAlpha = dragX / alphaWidth;
					isEmpty = false;
					if ( e.shiftKey ) {
						currentAlpha = Math.round( currentAlpha * 10 ) / 10;
					}

					move();
				},
				dragStart,
				dragStop
			);

			draggable(
				slider,
				function( dragX, dragY ) {
					currentHue = parseFloat( dragY / slideHeight );
					isEmpty = false;
					if ( ! opts.showAlpha ) {
						currentAlpha = 1;
					}
					move();
				},
				dragStart,
				dragStop
			);

			draggable(
				dragger,
				function( dragX, dragY, e ) {
					var oldDragX;
					var oldDragY;
					var furtherFromX;
					var setSaturation;
					var setValue;
					// shift+drag should snap the movement to either the x or y axis.
					if ( ! e.shiftKey ) {
						shiftMovementDirection = null;
					} else if ( ! shiftMovementDirection ) {
						oldDragX = currentSaturation * dragWidth;
						oldDragY = dragHeight - ( currentValue * dragHeight );
						furtherFromX = Math.abs( dragX - oldDragX ) > Math.abs( dragY - oldDragY );

						shiftMovementDirection = furtherFromX ? 'x' : 'y';
					}

					setSaturation = ! shiftMovementDirection || shiftMovementDirection === 'x';
					setValue = ! shiftMovementDirection || shiftMovementDirection === 'y';

					if ( setSaturation ) {
						currentSaturation = parseFloat( dragX / dragWidth );
					}
					if ( setValue ) {
						currentValue = parseFloat( ( dragHeight - dragY ) / dragHeight );
					}

					isEmpty = false;
					if ( ! opts.showAlpha ) {
						currentAlpha = 1;
					}

					move();
				},
				dragStart,
				dragStop
			);

			if ( initialColor !== false && initialColor !== '' ) {
				set( initialColor );

				// In case color was black - update the preview UI and set the format
				// since the set function will not run (default color is black).
				updateUI();
				currentPreferredFormat = tinycolor( initialColor ).format || opts.preferredFormat;
				addColorToSelectionPalette( initialColor );
			} else if ( initialColor === '' ) {
				set( initialColor );
				updateUI();
			} else {
				updateUI();
			}

			if ( flat ) {
				show();
			}

			function paletteElementClick( e ) {
				if ( e.data && e.data.ignore ) {
					set( $( e.target ).closest( '.sp-thumb-el' ).data( 'color' ) );
					move();
				} else {
					set( $( e.target ).closest( '.sp-thumb-el' ).data( 'color' ) );
					move();

					// If the picker is going to close immediately, a palette selection
					// is a change.  Otherwise, it's a move only.
					if ( opts.hideAfterPaletteSelect ) {
						updateOriginalInput( true );
						hide();
					} else {
						updateOriginalInput();
					}
				}

				return false;
			}

			paletteEvent = IE ? 'mousedown.spectrum' : 'click.spectrum touchstart.spectrum';
			paletteContainer.on( paletteEvent, '.sp-thumb-el', paletteElementClick );
			initialColorContainer.on( paletteEvent, '.sp-thumb-el:nth-child(1)', { ignore: true }, paletteElementClick );
		}

		function updateSelectionPaletteFromStorage() {
			var localStorage;
			var oldPalette;

			if ( localStorageKey ) {
				// Migrate old palettes over to new format.  May want to remove this eventually.
				try {
					localStorage = window.localStorage;
					oldPalette = localStorage[ localStorageKey ].split( ',#' );
					if ( oldPalette.length > 1 ) {
						delete localStorage[ localStorageKey ];
						$.each( oldPalette, function( i, c ) {
							addColorToSelectionPalette( c );
						} );
					}
				} catch ( e ) {
					window.console.log( e );
				}

				try {
					selectionPalette = window.localStorage[ localStorageKey ].split( ';' );
				} catch ( e ) {
					window.console.log( e );
				}
			}
		}

		function addColorToSelectionPalette( color ) {
			var rgb;
			if ( showSelectionPalette ) {
				rgb = tinycolor( color ).toRgbString();
				if ( ! paletteLookup[ rgb ] && $.inArray( rgb, selectionPalette ) === -1 ) {
					selectionPalette.push( rgb );
					while ( selectionPalette.length > maxSelectionSize ) {
						selectionPalette.shift();
					}
				}

				if ( localStorageKey ) {
					try {
						window.localStorage[ localStorageKey ] = selectionPalette.join( ';' );
					} catch ( e ) {
						window.console.log( e );
					}
				}
			}
		}

		function getUniqueSelectionPalette() {
			var unique = [];
			var i;
			var rgb;
			if ( opts.showPalette ) {
				for ( i = 0; i < selectionPalette.length; i++ ) {
					rgb = tinycolor( selectionPalette[ i ] ).toRgbString();

					if ( ! paletteLookup[ rgb ] ) {
						unique.push( selectionPalette[ i ] );
					}
				}
			}

			return unique.reverse().slice( 0, opts.maxSelectionSize );
		}

		function drawPalette() {
			var currentColor = get();

			var html = $.map( paletteArray, function( thispalette, i ) {
				return paletteTemplate( thispalette, currentColor, 'sp-palette-row sp-palette-row-' + i, opts );
			} );

			updateSelectionPaletteFromStorage();

			if ( selectionPalette ) {
				html.push( paletteTemplate( getUniqueSelectionPalette(), currentColor, 'sp-palette-row sp-palette-row-selection', opts ) );
			}

			paletteContainer.html( html.join( '' ) );
		}

		function drawInitial() {
			var initial;
			var current;
			if ( opts.showInitial ) {
				initial = colorOnShow;
				current = get();
				initialColorContainer.html( paletteTemplate( [ initial, current ], current, 'sp-palette-row-initial', opts ) );
			}
		}

		function dragStart() {
			if ( dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0 ) {
				reflow();
			}
			isDragging = true;
			container.addClass( draggingClass );
			shiftMovementDirection = null;
			boundElement.trigger( 'dragstart.spectrum', [ get() ] );
		}

		function dragStop() {
			isDragging = false;
			container.removeClass( draggingClass );
			boundElement.trigger( 'dragstop.spectrum', [ get() ] );
		}

		function setFromTextInput( value ) {
			var tiny;
			if ( abortNextInputChange ) {
				abortNextInputChange = false;
				return;
			}
			if ( ( value === null || value === '' ) && allowEmpty ) {
				set( null );
				move();
				updateOriginalInput();
			} else {
				tiny = tinycolor( value );
				if ( tiny.isValid() ) {
					set( tiny );
					move();
					updateOriginalInput();
				} else {
					textInput.addClass( 'sp-validation-error' );
				}
			}
		}

		function toggle() {
			if ( visible ) {
				hide();
			} else {
				show();
			}
		}

		function show() {
			// debugger;
			var event = $.Event( 'beforeShow.spectrum' );

			if ( visible ) {
				reflow();
				return;
			}

			boundElement.trigger( event, [ get() ] );

			if ( callbacks.beforeShow( get() ) === false || event.isDefaultPrevented() ) {
				return;
			}

			hideAll();
			visible = true;

			$( doc ).on( 'keydown.spectrum', onkeydown );
			$( doc ).on( 'click.spectrum', clickout );
			$( window ).on( 'resize.spectrum', resize );
			replacer.attr( 'aria-expanded', true );
			replacer.addClass( 'sp-active' );
			container.removeClass( 'sp-hidden' );

			reflow();
			updateUI();

			colorOnShow = get();

			drawInitial();
			callbacks.show( colorOnShow );
			boundElement.trigger( 'show.spectrum', [ colorOnShow ] );
		}

		function onkeydown( e ) {
			// Close on ESC
			if ( e.keyCode === 27 ) {
				hide();
			}
		}

		function clickout( e ) {
			// Return on right click.
			if ( e.button === 2 ) {
				return;
			}

			// If a drag event was happening during the mouseup, don't hide
			// on click.
			if ( isDragging ) {
				return;
			}

			if ( clickoutFiresChange ) {
				updateOriginalInput( true );
			} else {
				revert();
			}
			hide();
		}

		function hide() {
			// Return if hiding is unnecessary
			if ( ! visible || flat ) {
				return;
			}
			visible = false;

			$( doc ).off( 'keydown.spectrum', onkeydown );
			$( doc ).off( 'click.spectrum', clickout );
			$( window ).off( 'resize.spectrum', resize );

			replacer.attr( 'aria-expanded', false );
			replacer.removeClass( 'sp-active' );
			container.addClass( 'sp-hidden' );

			callbacks.hide( get() );
			boundElement.trigger( 'hide.spectrum', [ get() ] );
		}

		function revert() {
			set( colorOnShow, true );
			updateOriginalInput( true );
		}

		function set( color, ignoreFormatChange ) {
			var newColor, newHsv;
			if ( tinycolor.equals( color, get() ) ) {
				// Update UI just in case a validation error needs
				// to be cleared.
				updateUI();
				return;
			}

			if ( ( ! color || color === undefined ) && allowEmpty ) {
				isEmpty = true;
			} else {
				isEmpty = false;
				newColor = tinycolor( color );
				newHsv = newColor.toHsv();

				currentHue = ( newHsv.h % 360 ) / 360;
				currentSaturation = newHsv.s;
				currentValue = newHsv.v;
				currentAlpha = newHsv.a;
			}
			updateUI();

			if ( newColor && newColor.isValid() && ! ignoreFormatChange ) {
				currentPreferredFormat = opts.preferredFormat || newColor.getFormat();
			}
		}

		function get( thisopts ) {
			thisopts = thisopts || {};

			if ( allowEmpty && isEmpty ) {
				return null;
			}

			return tinycolor.fromRatio(
				{
					h: currentHue,
					s: currentSaturation,
					v: currentValue,
					a: Math.round( currentAlpha * 1000 ) / 1000
				},
				{ format: thisopts.format || currentPreferredFormat }
			);
		}

		function isValid() {
			return ! textInput.hasClass( 'sp-validation-error' );
		}

		function move() {
			updateUI();

			callbacks.move( get() );
			boundElement.trigger( 'move.spectrum', [ get() ] );
		}

		function updateUI() {
			var flatColor;
			var format;
			var realColor;
			var displayColor;
			var realHex;
			var realRgb;
			var rgb;
			var realAlpha;
			var gradient;
			var color;
			var textColor;

			textInput.removeClass( 'sp-validation-error' );

			updateHelperLocations();

			// Update dragger background color (gradients take care of saturation and value).
			flatColor = tinycolor.fromRatio( { h: currentHue, s: 1, v: 1 } );
			dragger.css( 'background-color', flatColor.toHexString() );

			// Get a format that alpha will be included in (hex and names ignore alpha)
			format = currentPreferredFormat;
			if ( currentAlpha < 1 && ! ( currentAlpha === 0 && format === 'name' ) ) {
				if ( format === 'hex' || format === 'hex3' || format === 'hex6' || format === 'name' ) {
					format = 'rgb';
				}
			}

			realColor = get( { format: format } );
			displayColor = '';

			//reset background info for preview element
			previewElement.removeClass( 'sp-clear-display' );
			previewElement.css( 'background-color', 'transparent' );

			if ( ! realColor && allowEmpty ) {
				// Update the replaced elements background with icon indicating no color selection
				previewElement.addClass( 'sp-clear-display' );
			} else {
				realHex = realColor.toHexString();
				realRgb = realColor.toRgbString();

				// Update the replaced elements background color (with actual selected color)
				if ( rgbaSupport || realColor.alpha === 1 ) {
					previewElement.css( 'background-color', realRgb );
				} else {
					previewElement.css( 'background-color', 'transparent' );
					previewElement.css( 'filter', realColor.toFilter() );
				}

				if ( opts.showAlpha ) {
					rgb = realColor.toRgb();
					rgb.a = 0;
					realAlpha = tinycolor( rgb ).toRgbString();
					gradient = 'linear-gradient(left, ' + realAlpha + ', ' + realHex + ')';

					if ( IE ) {
						alphaSliderInner.css( 'filter', tinycolor( realAlpha ).toFilter( { gradientType: 1 }, realHex ) );
					} else {
						alphaSliderInner.css( 'background', '-webkit-' + gradient );
						alphaSliderInner.css( 'background', '-moz-' + gradient );
						alphaSliderInner.css( 'background', '-ms-' + gradient );
						// Use current syntax gradient on unprefixed property.
						alphaSliderInner.css( 'background', 'linear-gradient(to right, ' + realAlpha + ', ' + realHex + ')' );
					}
				}

				displayColor = realColor.toString( format );
			}

			// Update the text entry input as it changes happen
			if ( opts.showInput ) {
				textInput.val( displayColor );
			}
			boundElement.val( displayColor );
			if ( opts.type === 'text' || opts.type === 'component' ) {
				color = realColor;
				if ( color && colorizeElement ) {
					textColor = color.isLight() || color.getAlpha() < 0.4 ? 'black' : 'white';
					colorizeElement.css( 'background-color', color.toRgbString() ).css( 'color', textColor );
				} else {
					colorizeElement.css( 'background-color', colorizeElementInitialBackground ).css( 'color', colorizeElementInitialColor );
				}
			}

			if ( opts.showPalette ) {
				drawPalette();
			}

			drawInitial();
		}

		function updateHelperLocations() {
			var s = currentSaturation;
			var v = currentValue;
			var dragX;
			var dragY;
			var alphaX;
			var slideY;

			if ( allowEmpty && isEmpty ) {
				//if selected color is empty, hide the helpers
				alphaSlideHelper.hide();
				slideHelper.hide();
				dragHelper.hide();
			} else {
				//make sure helpers are visible
				alphaSlideHelper.show();
				slideHelper.show();
				dragHelper.show();

				// Where to show the little circle in that displays your current selected color
				dragX = s * dragWidth;
				dragY = dragHeight - ( v * dragHeight );
				dragX = Math.max( -dragHelperHeight, Math.min( dragWidth - dragHelperHeight, dragX - dragHelperHeight ) );
				dragY = Math.max( -dragHelperHeight, Math.min( dragHeight - dragHelperHeight, dragY - dragHelperHeight ) );
				dragHelper.css( {
					top: dragY + 'px',
					left: dragX + 'px'
				} );

				alphaX = currentAlpha * alphaWidth;
				alphaSlideHelper.css( {
					left: alphaX - ( alphaSlideHelperWidth / 2 ) + 'px'
				} );

				// Where to show the bar that displays your current selected hue
				slideY = currentHue * slideHeight;
				slideHelper.css( {
					top: slideY - slideHelperHeight + 'px'
				} );
			}
		}

		function updateOriginalInput( fireCallback ) {
			var color = get(),
				hasChanged = ! tinycolor.equals( color, colorOnShow );

			if ( color ) {
				// Update the selection palette with the current color
				addColorToSelectionPalette( color );
			}

			if ( fireCallback && hasChanged ) {
				callbacks.change( color );
				// we trigger the change event or input, but the input change event is also binded
				// to some spectrum processing, that we do no need
				abortNextInputChange = true;
				boundElement.trigger( 'change', [ color ] );
			}
		}

		function reflow() {
			if ( ! visible ) {
				return; // Calculations would be useless and wouldn't be reliable anyways
			}
			dragWidth = dragger.width();
			dragHeight = dragger.height();
			dragHelperHeight = dragHelper.height();
			slideHeight = slider.height();
			slideHelperHeight = slideHelper.height();
			alphaWidth = alphaSlider.width();
			alphaSlideHelperWidth = alphaSlideHelper.width();

			if ( ! flat ) {
				container.attr( 'aria-haspopup', true );
				container.css( 'position', 'absolute' );
				if ( opts.offset ) {
					container.offset( opts.offset );
				} else {
					container.offset( getOffset( container, offsetElement ) );
				}
			}

			updateHelperLocations();

			if ( opts.showPalette ) {
				drawPalette();
			}

			boundElement.trigger( 'reflow.spectrum' );
		}

		function destroy() {
			var oInputContainer;
			boundElement.show().removeClass( 'spectrum with-add-on sp-colorize' );
			offsetElement.off( 'click.spectrum touchstart.spectrum' );
			container.remove();
			replacer.remove();
			if ( colorizeElement ) {
				colorizeElement.css( 'background-color', colorizeElementInitialBackground ).css( 'color', colorizeElementInitialColor );
			}
			oInputContainer = boundElement.closest( '.sp-original-input-container' );
			if ( oInputContainer.length > 0 ) {
				oInputContainer.after( boundElement ).remove();
			}
			spectrums[ spect.id ] = null;
		}

		function option( optionName, optionValue ) {
			if ( optionName === undefined ) {
				return $.extend( {}, opts );
			}
			if ( optionValue === undefined ) {
				return opts[ optionName ];
			}

			opts[ optionName ] = optionValue;

			if ( optionName === 'preferredFormat' ) {
				currentPreferredFormat = opts.preferredFormat;
			}
			applyOptions();
		}

		function enable() {
			disabled = false;
			boundElement.attr( 'disabled', false );
			offsetElement.removeClass( 'sp-disabled' );
		}

		function disable() {
			hide();
			disabled = true;
			boundElement.attr( 'disabled', true );
			offsetElement.addClass( 'sp-disabled' );
		}

		function setOffset( coord ) {
			opts.offset = coord;
			reflow();
		}

		initialize();

		spect = {
			show: show,
			hide: hide,
			toggle: toggle,
			reflow: reflow,
			option: option,
			enable: enable,
			disable: disable,
			offset: setOffset,
			set: function( c ) {
				set( c );
				updateOriginalInput();
			},
			get: get,
			destroy: destroy,
			container: container
		};

		spect.id = spectrums.push( spect ) - 1;

		return spect;
	}

	// checkOffset - get the offset below/above and left/right element depending on screen position
	// Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
	function getOffset( picker, input ) {
		var extraY = 0;
		var dpWidth = picker.outerWidth();
		var dpHeight = picker.outerHeight();
		var inputHeight = input.outerHeight();
		var doc = picker[ 0 ].ownerDocument;
		var docElem = doc.documentElement;
		var viewWidth = docElem.clientWidth + $( doc ).scrollLeft();
		var viewHeight = docElem.clientHeight + $( doc ).scrollTop();
		var offset = input.offset();
		var offsetLeft = offset.left;
		var offsetTop = offset.top;

		offsetTop += inputHeight;

		offsetLeft -= Math.min( offsetLeft, offsetLeft + dpWidth > viewWidth && viewWidth > dpWidth ? Math.abs( offsetLeft + dpWidth - viewWidth ) : 0 );

		offsetTop -= Math.min( offsetTop, offsetTop + dpHeight > viewHeight && viewHeight > dpHeight ? Math.abs( dpHeight + inputHeight - extraY ) : extraY );

		return {
			top: offsetTop,
			bottom: offset.bottom,
			left: offsetLeft,
			right: offset.right,
			width: offset.width,
			height: offset.height
		};
	}

	// noop - do nothing
	function noop() {}

	// stopPropagation - makes the code only doing this a little easier to read in line
	function stopPropagation( e ) {
		e.stopPropagation();
	}

	// Create a function bound to a given object
	// Thanks to underscore.js
	function bind( func, obj ) {
		var slice = Array.prototype.slice;
		var args = slice.call( arguments, 2 );
		return function() {
			return func.apply( obj, args.concat( slice.call( arguments ) ) );
		};
	}

	// Lightweight drag helper.  Handles containment within the element, so that
	// when dragging, the x is within [0,element.width] and y is within [0,element.height]
	function draggable( element, onmove, onstart, onstop ) {
		var doc = document;
		var dragging = false;
		var offset = {};
		var maxHeight = 0;
		var maxWidth = 0;
		var hasTouch = 'ontouchstart' in window;
		var duringDragEvents = {};

		onmove = onmove || function() {};
		onstart = onstart || function() {};
		onstop = onstop || function() {};

		duringDragEvents.selectstart = prevent;
		duringDragEvents.dragstart = prevent;
		duringDragEvents[ 'touchmove mousemove' ] = move;
		duringDragEvents[ 'touchend mouseup' ] = stop;

		function prevent( e ) {
			if ( e.stopPropagation ) {
				e.stopPropagation();
			}
			if ( e.preventDefault ) {
				e.preventDefault();
			}
			e.returnValue = false;
		}

		function move( e ) {
			var t0;
			var pageX;
			var pageY;
			var dragX;
			var dragY;
			if ( dragging ) {
				// Mouseup happened outside of window
				if ( IE && doc.documentMode < 9 && ! e.button ) {
					return stop();
				}

				t0 = e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[ 0 ];
				pageX = ( t0 && t0.pageX ) || e.pageX;
				pageY = ( t0 && t0.pageY ) || e.pageY;

				dragX = Math.max( 0, Math.min( pageX - offset.left, maxWidth ) );
				dragY = Math.max( 0, Math.min( pageY - offset.top, maxHeight ) );

				if ( hasTouch ) {
					// Stop scrolling in iOS
					prevent( e );
				}

				onmove.apply( element, [ dragX, dragY, e ] );
			}
		}

		function start( e ) {
			var rightclick = e.which ? e.which === 3 : e.button === 2;

			if ( ! rightclick && ! dragging ) {
				if ( onstart.apply( element, arguments ) !== false ) {
					dragging = true;
					maxHeight = $( element ).height();
					maxWidth = $( element ).width();
					offset = $( element ).offset();

					$( doc ).on( duringDragEvents );
					$( doc.body ).addClass( 'sp-dragging' );

					move( e );

					prevent( e );
				}
			}
		}

		function stop() {
			if ( dragging ) {
				$( doc ).off( duringDragEvents );
				$( doc.body ).removeClass( 'sp-dragging' );

				// Wait a tick before notifying observers to allow the click event
				// to fire in Chrome.
				setTimeout( function() {
					onstop.apply( element, arguments );
				}, 0 );
			}
			dragging = false;
		}

		$( element ).on( 'touchstart mousedown', start );
	}

	function throttle( func, wait, debounce ) {
		var timeout;
		return function() {
			var context = this,
				args = arguments;
			var throttler = function() {
				timeout = null;
				func.apply( context, args );
			};
			if ( debounce ) {
				clearTimeout( timeout );
			}
			if ( debounce || ! timeout ) {
				timeout = setTimeout( throttler, wait );
			}
		};
	}

	function inputTypeColorSupport() {
		return $.fn.spectrum.inputTypeColorSupport();
	}

	// Define a jQuery plugin
	$.fn.spectrum = function( opts ) {
		var returnValue;
		var args;
		var spect;
		var method;

		if ( typeof opts === 'string' ) {
			returnValue = this;
			args = Array.prototype.slice.call( arguments, 1 );

			this.each( function() {
				spect = spectrums[ $( this ).data( dataID ) ];
				if ( spect ) {
					method = spect[ opts ];
					if ( ! method ) {
						throw new Error( "Spectrum: no such method: '" + opts + "'" );
					}

					if ( opts === 'get' ) {
						returnValue = spect.get();
					} else if ( opts === 'container' ) {
						returnValue = spect.container;
					} else if ( opts === 'option' ) {
						returnValue = spect.option.apply( spect, args );
					} else if ( opts === 'destroy' ) {
						spect.destroy();
						$( this ).removeData( dataID );
					} else {
						method.apply( spect, args );
					}
				}
			} );

			return returnValue;
		}

		// Initializing a new instance of spectrum
		return this.spectrum( 'destroy' ).each( function() {
			var options = $.extend( {}, $( this ).data(), opts );
			var thisspect;
			// Infer default type from input params and deprecated options
			if ( ! $( this ).is( 'input' ) ) {
				options.type = 'noInput';
			} else if ( options.flat || options.type === 'flat' ) {
				options.type = 'flat';
			} else if ( $( this ).attr( 'type' ) === 'color' ) {
				options.type = 'color';
			}

			thisspect = spectrum( this, options );
			$( this ).data( dataID, thisspect.id );
		} );
	};

	$.fn.spectrum.load = true;
	$.fn.spectrum.loadOpts = {};
	$.fn.spectrum.draggable = draggable;
	$.fn.spectrum.defaults = defaultOpts;
	$.fn.spectrum.inputTypeColorSupport = function() {
		var colorInput;
		if ( typeof inputTypeColorSupport._cachedResult === 'undefined' ) {
			colorInput = $( "<input type='color'>" )[ 0 ]; // if color element is supported, value will default to not null
			inputTypeColorSupport._cachedResult = colorInput.type === 'color' && colorInput.value !== '';
		}
		return inputTypeColorSupport._cachedResult;
	};

	$.spectrum = {};
	$.spectrum.localization = {};
	$.spectrum.palettes = {};

	$.fn.spectrum.processNativeColorInputs = function() {
		var colorInputs = $( 'input[type=color]' );
		if ( colorInputs.length && ! inputTypeColorSupport() ) {
			colorInputs.spectrum( {
				preferredFormat: 'hex6'
			} );
		}
	};

	$( function() {
		if ( $.fn.spectrum.load ) {
			$.fn.spectrum.processNativeColorInputs();
		}
	} );
} ) );
assets/js/jquery.lazyloadxt.extra.min.js000064400000005444150755142450014454 0ustar00!function(h,g,t){"use strict";var m="lazyLoadXT",y="lazied",p="load error",e="lazy-hidden",w=t.documentElement||t.body,C={autoInit:!0,selector:"img[data-src]",blankImage:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",throttle:99,forceLoad:void 0===g.onscroll||!!g.operamini||!w.getBoundingClientRect,loadEvent:"pageshow",updateEvent:"load orientationchange resize scroll touchmove focus",forceEvent:"lazyloadall",oninit:{removeClass:"lazy"},onshow:{addClass:e},onload:{removeClass:e,addClass:"lazy-loaded"},onerror:{removeClass:e},checkDuplicates:!0},o={srcAttr:"data-src",edgeX:0,edgeY:0,visibleOnly:!0},n=h(g),z=function(t){return"function"==typeof t},s=h.extend,E=h.data||function(t,e){return h(t).data(e)},T=[],b=0,a=0;function d(t,e){return(void 0===t[e]?C:t)[e]}function L(){var t=g.pageYOffset;return void 0===t?w.scrollTop:t}function r(){1<a?(a=1,i(),setTimeout(r,C.throttle)):a=0}function u(t){!T.length||t&&"scroll"===t.type&&t.currentTarget===g&&b>=L()||(a||setTimeout(r,0),a=2)}function I(t,e){var o=C["on"+t];o&&(z(o)?o.call(e[0]):(o.addClass&&e.addClass(o.addClass),o.removeClass&&e.removeClass(o.removeClass))),e.trigger("lazy"+t,[e]),u()}function X(t){I(t.type,h(t.currentTarget).off(p,X))}function i(t){var e,o,n,a,r,i,c,l,s,d,u,f,A,v;if(T.length){for(t=t||C.forceLoad,b=1/0,e=L(),o=g.innerHeight||w.clientHeight,n=g.innerWidth||w.clientWidth,a=0,r=T.length;a<r;a+=1)c=(i=T[a])[0],l=i[m],s=!1,d=t||E(c,y)<0,h.contains(w,c)?(t||!l.visibleOnly||c.offsetWidth||c.offsetHeight)&&(d||(v=c.getBoundingClientRect(),f=l.edgeX,A=l.edgeY,d=(u=v.top+e-A-o)<=e&&v.bottom>-A&&v.left<=n+f&&v.right>-f),d?(i.on(p,X),I("show",i),A=l.srcAttr,(v=z(A)?A(i):c.getAttribute(A))&&(c.src=v),s=!0):u<b&&(b=u)):s=!0,s&&(E(c,y,0),T.splice(a,1),a-=1,r-=1);r||I("complete",h(w))}}function c(){n.lazyLoadXT()}function l(){i(!0)}h[m]=s(C,o,h[m]),h.fn[m]=function(a){var r={},i=d(a=a||{},"blankImage"),c=d(a,"checkDuplicates"),t=d(a,"scrollContainer"),l=d(a,"show");return h(t).on("scroll",u),Object.keys(o).forEach(function(t){r[t]=d(a,t)}),this.each(function(t,e){var o,n;e===g?h(C.selector).lazyLoadXT(a):(o=c&&E(e,y),n=h(e).data(y,l?-1:1),o||(i&&"IMG"===e.tagName&&!e.src&&(e.src=i),n[m]=s({},r),I("init",n),T.push(n)),u())})},h(function(){I("start",n),n.on(C.updateEvent,u).on(C.forceEvent,l),h(t).on(C.updateEvent,u),C.autoInit&&(n.on(C.loadEvent,c),c())})}(window.jQuery||window.Zepto||window.$,window,document),function(i){"use strict";var o=i.lazyLoadXT;o.selector+=",video,iframe[data-src]",o.videoPoster="data-poster",i(document).on("lazyshow","video",function(t,e){var n=e.lazyLoadXT.srcAttr,a="function"==typeof n,r=!1;e.attr("poster",e.attr(o.videoPoster)),e.children("source,track").each(function(t,e){var e=i(e),o=a?n(e):e.attr(n);o&&(e.attr("src",o),r=!0)}),r&&this.load()})}(window.jQuery||window.Zepto||window.$);assets/js/jquery.tctabs.js000064400000060605150755142450011635 0ustar00/**
 * jQuery Tabs plugin
 * Creates a tabular interface
 *
 * @param {Object} $ The jQuery object
 * @version: v1.1
 * @author: ThemeComplete
 *
 * Copyright 2022 ThemeComplete
 */
( function( $ ) {
	'use strict';

	var localStorage = $.epoAPI.util.getStorage( 'localStorage' );
	var confirm = window.confirm;

	var Tabs = function( dom, options ) {
		this.elements = $( dom );
		this.last = [];
		this.current = [];
		this.enableEvents = true;
		this.backup = [];

		this.options = $.extend( {}, $.fn.tcTabs.defaults, options );

		if ( this.elements.length > 0 ) {
			this.init();
			return this;
		}

		return false;
	};

	Tabs.prototype = {
		constructor: Tabs,

		set: function( options ) {
			this.options = $.extend( {}, this.options, options );
			this.init( true );
		},

		addHeaderEvents: function( t, index, tc, header, theaderswrap, theaders, scrollLeftButton, scrollRightButton, state ) {
			var additional_events = '';
			var ithis = this;

			header.off( 'closetab.tmtabs' ).on( 'closetab.tmtabs', function() {
				var $this = $( this );
				var _tab = t.find( $this.data( 'tab' ) );

				$this.removeClass( 'closed open' ).addClass( 'closed' );
				$this
					.find( '.tm-arrow' )
					.removeClass( ithis.options.classdown + ' ' + ithis.options.classup )
					.addClass( ithis.options.classdown );
				if ( ithis.options.useclasstohide ) {
					_tab.addClass( 'tm-hide' ).removeClass( 'tm-show' );
				} else {
					_tab.hide();
				}
				_tab.removeClass( 'tm-animated ' + ithis.options.animationclass );
				$( window ).trigger( 'tc-closetab.tmtabs', {
					header: $this,
					tab: _tab
				} );
			} );

			header.off( 'opentab.tmtabs' ).on( 'opentab.tmtabs', function() {
				var $this = $( this );
				var _tab = t.find( $this.data( 'tab' ) );

				$this.removeClass( 'closed open' ).addClass( 'open' );
				$this
					.find( '.tm-arrow' )
					.removeClass( ithis.options.classdown + ' ' + ithis.options.classup )
					.addClass( ithis.options.classup );

				if ( ithis.options.useclasstohide ) {
					_tab.removeClass( 'tm-hide' ).addClass( 'tm-show' );
				} else {
					_tab.show();
				}
				_tab.removeClass( 'tm-animated ' + ithis.options.animationclass ).addClass( 'tm-animated ' + ithis.options.animationclass );
				ithis.current[ index ] = $this.data( 'tab' );
				$( window ).trigger( 'tc-opentab.tmtabs', {
					header: $this,
					tab: ithis.current[ index ],
					table: _tab
				} );
				ithis.scrollIntoView( t, $this, state );
			} );

			if ( ithis.options.showonhover === true || typeof ithis.options.showonhover === 'function' ) {
				additional_events = ' mouseover';
			}

			header.off( 'keydown.tmtabs' ).on( 'keydown.tmtabs', function( e ) {
				var $this = $( this );
				var prevnext;

				if ( e.keyCode === 13 ) {
					$this.trigger( 'click.tmtabs' );
				}
				if ( e.keyCode === 40 ) {
					prevnext = $this.closest( '.tm-box' ).next().find( '.' + ithis.options.header );
				}
				if ( e.keyCode === 38 ) {
					prevnext = $this.closest( '.tm-box' ).prev().find( '.' + ithis.options.header );
				}
				if ( prevnext && prevnext.length ) {
					$this.trigger( 'blur' );
					prevnext.trigger( ' focus' ).trigger( 'click' );
					e.preventDefault();
				}
			} );

			header.off( 'click.tmtabs' ).on( 'click.tmtabs' + additional_events, function( e ) {
				var $this = $( this );
				e.preventDefault();
				if ( e.type === 'mouseover' && typeof ithis.options.showonhover === 'function' && ! ithis.options.showonhover.call() ) {
					return;
				}
				if ( ithis.current[ index ] === $this.data( 'tab' ) ) {
					$( window ).trigger( 'tc-isopentab.tmtabs', {
						header: $this,
						tab: ithis.current[ index ],
						table: t.find( ithis.current[ index ] )
					} );
					return;
				}
				if ( ithis.last[ index ] ) {
					$( ithis.last[ index ] ).trigger( 'closetab.tmtabs' );
				}
				$this.trigger( 'opentab.tmtabs' );
				ithis.last[ index ] = $this;
				if ( localStorage ) {
					localStorage.setItem( 'tmadmintab-' + tc, $this.attr( ithis.options.dataopenattribute ) );
				}
				$( window ).trigger( 'tc-tmtabs-clicked', {
					tc: tc,
					options: ithis.options,
					header: $this,
					tab: ithis.current[ index ],
					table: t.find( ithis.current[ index ] )
				} );
			} );

			if ( this.options.deletebutton ) {
				header.append( this.options.deletebuttonhtml );
				header
					.find( '.' + this.options.deleteheader )
					.off( 'click.tmtabs' )
					.on( 'click.tmtabs', function( e ) {
						var $t = $( this );
						var $tmbox = $t.closest( '.tm-box' );
						var $header = $tmbox.find( '.' + ithis.options.header );
						var $tab = t.find( '.' + $header.attr( ithis.options.dataattribute ) );

						e.stopPropagation();

						if ( t.find( '.' + ithis.options.headers + ' ' + '.' + ithis.options.header ).length < 2 ) {
							return;
						}
						if ( ithis.options.deleteconfirm ) {
							if ( ! confirm( window.TMEPOGLOBALADMINJS.i18n_builder_delete ) ) {
								return;
							}
						}

						if ( typeof ithis.options.beforedeletetab === 'function' ) {
							ithis.options.beforedeletetab.call( t, $t, $tab );
						}

						$tab.remove();
						if ( $header.is( '.open' ) ) {
							if ( $tmbox.next().find( '.' + ithis.options.header ).is( '.closed' ) ) {
								$tmbox.next().find( '.' + ithis.options.header ).trigger( 'click.tmtabs' );
							} else if ( $tmbox.prev().find( '.' + ithis.options.header ).is( '.closed' ) ) {
								$tmbox.prev().find( '.' + ithis.options.header ).trigger( 'click.tmtabs' );
							}
						}
						$tmbox.remove();

						ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
						if ( typeof ithis.options.afterdeletetab === 'function' ) {
							ithis.options.afterdeletetab.call( t );
						}
					} );
			} else {
				header.find( '.' + this.options.deleteheader ).remove();
			}

			if ( this.options.editbutton ) {
				header.append( ithis.options.editbuttonhtml );
				header
					.find( '.' + ithis.options.editheader )
					.off( 'click.tmtabs' )
					.on( 'click.tmtabs', function( event ) {
						var $t;
						var $tab;
						if ( ithis.enableEvents && typeof ithis.options.oneditbutton === 'function' ) {
							event.stopPropagation();
							$t = $( this );
							$tab = t.find( '.' + $t.closest( '.tm-box' ).find( '.' + ithis.options.header ).attr( ithis.options.dataattribute ) );
							ithis.options.oneditbutton.call( t, $t, $tab );
						}
					} );
			} else {
				header.find( '.' + this.options.editheader ).remove();
			}
		},

		initHeader: function( header, t, index, theaderswrap, theaders, scrollLeftButton, scrollRightButton, state ) {
			var id;
			var init_open = 0;
			var tc = t.attr( 'class' );

			header = $( header );
			id = '.' + header.attr( this.options.dataattribute );
			header.data( 'tab', id );
			if ( this.options.useclasstohide ) {
				t.find( id ).addClass( 'tm-hide' ).removeClass( 'tm-show' );
			} else {
				t.find( id ).hide();
			}
			t.find( id ).data( 'state', 'closed' );
			if ( ! init_open && header.is( '.open' ) ) {
				header.removeClass( 'closed open' ).addClass( 'open' ).data( 'state', 'open' );
				header
					.find( '.tm-arrow' )
					.removeClass( this.options.classdown + ' ' + this.options.classup )
					.addClass( this.options.classup );
				if ( this.options.useclasstohide ) {
					t.find( id ).removeClass( 'tm-hide' ).addClass( 'tm-show' );
				} else {
					t.find( id ).show();
				}
				t.find( id ).data( 'state', 'open' );
				init_open = 1;
				this.current[ index ] = id;
				this.last[ index ] = header;
			} else {
				header.removeClass( 'closed open' ).addClass( 'closed' ).data( 'state', 'closed' );
			}

			this.addHeaderEvents( t, index, tc, header, theaderswrap, theaders, scrollLeftButton, scrollRightButton, state );
		},

		checkSize: function( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, setScrollWidth ) {
			var panelWidth;
			var openedHeader;
			var props = [];
			var hiddenParents = theaders.parents().addBack().not( ':visible' );

			// When tabs element is hidden its width cannot be calcualted
			// so we revert the visibility for this procedure only
			hiddenParents.each( function() {
				var $this = $( this );
				var styleDisplay = this.style.display;
				var cssDisplay = $this.css( 'display' );
				var styleVisibility = this.style.visibility;
				var cssVisibility = $this.css( 'visibility' );
				var obj;
				var did = false;
				obj = {
					styleDisplay: styleDisplay,
					cssDisplay: cssDisplay,
					styleVisibility: styleVisibility,
					cssVisibility: cssVisibility,
					display: null,
					visibility: null,
					element: $this
				};
				if ( styleDisplay === 'none' ) {
					this.style.display = '';
					obj.display = true;
					if ( $this.css( 'display' ) === 'none' ) {
						this.style.display = 'block';
					}
					did = true;
				}
				if ( styleVisibility === 'hidden' ) {
					this.style.visibility = '';
					obj.visibility = true;
					if ( $this.css( 'visibility' ) === 'hidden' ) {
						this.style.visibility = 'visible';
					}
					did = true;
				}

				if ( did ) {
					props.push( obj );
				}
			} );

			panelWidth = Math.round( theaders.outerWidth() );

			if ( theaders.is( '.has-scroll-arrows' ) ) {
				theaders.removeClass( '.has-scroll-arrows' );
				panelWidth = Math.round( theaderswrap.outerWidth() );
			}

			if ( setScrollWidth ) {
				openedHeader = theaders.find( '.' + this.options.header + '.open' );
				if ( openedHeader.length ) {
					openedHeader.removeClass( 'open' );
				}
				state.scrollWidth = theaders[ 0 ].scrollWidth;
				if ( openedHeader.length ) {
					openedHeader.addClass( 'open' );
				}
			}

			if ( state.scrollWidth > panelWidth ) {
				scrollRightButton.addClass( 'scroll-arrow-show' );
				scrollLeftButton.addClass( 'scroll-arrow-show' );
				theaders.addClass( 'has-scroll-arrows' );

				if ( state.scrollWidth - panelWidth === theaders.scrollLeft() ) {
					scrollRightButton.addClass( 'scroll-arrow-disabled scroll-arrow-right-disabled' );
				} else {
					scrollRightButton.removeClass( 'scroll-arrow-disabled scroll-arrow-right-disabled' );
				}
				if ( theaders.scrollLeft() === 0 ) {
					scrollLeftButton.addClass( 'scroll-arrow-disabled scroll-arrow-left-disabled' );
				} else {
					scrollLeftButton.removeClass( 'scroll-arrow-disabled scroll-arrow-left-disabled' );
				}
			} else {
				scrollRightButton.removeClass( 'scroll-arrow-show' );
				scrollLeftButton.removeClass( 'scroll-arrow-show' );
				theaders[ 0 ].scrollLeft = 0;
				theaders.removeClass( 'has-scroll-arrows' );
			}

			props.forEach( function( o ) {
				if ( o.display ) {
					o.element[ 0 ].style.display = o.styleDisplay;
				}
				if ( o.visibility ) {
					o.element[ 0 ].style.visibility = o.styleVisibility;
				}
			} );
		},

		scrollIntoView: function( t, header, state ) {
			var left = state.scrollPos;
			var theaders = t.find( '.' + this.options.headers );
			var scrollWidth = theaders.width();

			if ( theaders.is( '.has-scroll-arrows' ) && header && typeof ( header ) !== 'undefined' && header.position() && typeof ( header.position() ) !== 'undefined' ) {
				if ( header.position().left < 0 ) {
					state.scrollPos = Math.max( left + header.position().left + 1, 0 );
					theaders.animate( { scrollLeft: ( state.scrollPos + 1 ) + 'px' }, this.options.scrollDuration );
				} else if ( ( header.position().left + header.outerWidth() ) > scrollWidth ) {
					state.scrollPos = Math.min( left + ( ( header.position().left + header.outerWidth() ) - scrollWidth ), theaders[ 0 ].scrollWidth - theaders.outerWidth() );
					theaders.animate( { scrollLeft: ( state.scrollPos - 1 ) + 'px' }, this.options.scrollDuration );
				}
			}
		},

		initElement: function( t, index, state, uniqid ) {
			var ithis = this;
			var tc = t.attr( 'class' );
			var theaders;
			var theaderswrap;
			var scrollLeftButton;
			var scrollRightButton;
			var headers = t.find( '.' + this.options.headers + ' ' + '.' + this.options.header );
			var ohp = 0;
			var ohpid = '';
			var _selected_tab;
			var vars = {};
			var initialIndex;
			var pressHoldTimeout;

			if ( headers.length === 0 ) {
				return;
			}

			theaders = t.find( '.' + this.options.headers );
			theaders.wrap( '<div class="' + this.options.headersWrap + '"></div>' );
			theaderswrap = t.find( '.' + this.options.headersWrap );

			if ( this.options.scroll ) {
				theaderswrap.html( '<div class="tc-scroll-left-arrow"></div>' + theaderswrap.html() + '<div class="tc-scroll-right-arrow"></div>' );
				headers = t.find( '.' + this.options.headers + ' ' + '.' + this.options.header );
				theaders = t.find( '.' + this.options.headers );
				scrollLeftButton = t.find( '.tc-scroll-left-arrow' );
				scrollRightButton = t.find( '.tc-scroll-right-arrow' );

				// Mousewheel support, if present.
				if ( typeof $.fn.mousewheel === 'function' ) {
					theaders.mousewheel( function( event, delta ) {
						// Only do mousewheel scrolling if scrolling is necessary
						if ( scrollRightButton.css( 'display' ) !== 'none' ) {
							this.scrollLeft -= ( delta * 30 );
							state.scrollPos = this.scrollLeft;
							event.preventDefault();
						}
					} );
				}

				// Set initial scroll position
				theaders.animate( { scrollLeft: state.scrollPos + 'px' }, 0 );

				this.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
				$( window ).off( 'resize.tmtabs' + uniqid ).on( 'resize.tmtabs' + uniqid, function() {
					ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
				} );

				t.off( 'refresh.tmtabs' + uniqid ).on( 'refresh.tmtabs' + uniqid, function() {
					ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
				} );

				// Document load
				$( function() {
					ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
				} );

				scrollRightButton.off( 'mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs' )
					.on( 'mousedown.tmtabs', function( e ) {
						var scrollRightFunc = function() {
							var left = theaders.scrollLeft();
							state.scrollPos = Math.min( left + ithis.options.scrollDistance, state.scrollWidth - theaders.outerWidth() );
							theaders.animate(
								{
									scrollLeft: state.scrollPos + 'px'
								},
								ithis.options.scrollDuration,
								function() {
									ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state );
								}
							);
						};
						e.stopPropagation();
						scrollRightFunc();

						pressHoldTimeout = setInterval( function() {
							scrollRightFunc();
						}, ithis.options.scrollDuration );
					} ).on( 'mouseup.tmtabs mouseleave.tmtabs', function() {
						clearInterval( pressHoldTimeout );
					} ).on( 'mouseover.tmtabs', function() {
						$( this ).addClass( 'scroll-arrow-over scroll-arrow-right-over' );
					} ).on( 'mouseout.tmtabs', function() {
						$( this ).removeClass( 'scroll-arrow-over scroll-arrow-right-over' );
					} );

				scrollLeftButton.off( 'mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs' )
					.on( 'mousedown.tmtabs', function( e ) {
						var scrollLeftFunc = function() {
							var left = theaders.scrollLeft();
							state.scrollPos = Math.max( left - ithis.options.scrollDistance, 0 );
							theaders.animate(
								{
									scrollLeft: state.scrollPos + 'px'
								},
								ithis.options.scrollDuration,
								function() {
									ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state );
								}
							);
						};
						e.stopPropagation();
						scrollLeftFunc();

						pressHoldTimeout = setInterval( function() {
							scrollLeftFunc();
						}, ithis.options.scrollDuration );
					} ).on( 'mouseup.tmtabs mouseleave.tmtabs', function() {
						clearInterval( pressHoldTimeout );
					} ).on( 'mouseover.tmtabs', function() {
						$( this ).addClass( 'scroll-arrow-over scroll-arrow-left-over' );
					} ).on( 'mouseout.tmtabs', function() {
						$( this ).removeClass( 'scroll-arrow-over scroll-arrow-left-over' );
					} );
			}

			window.location.href.replace( /[?&]+([^=&]+)=([^&]*)/gi, function( m, key, value ) {
				vars[ key ] = value;
			} );

			this.last[ index ] = false;
			this.current[ index ] = '';

			t.data( 'tm-has-tmtabs', 1 );

			headers.each( function( i, header ) {
				ithis.initHeader( header, t, index, theaderswrap, theaders, scrollLeftButton, scrollRightButton, state );
			} );

			if ( this.options.sortabletabs ) {
				t.find( '.' + this.options.headers + ':not(.section_elements ' + '.' + this.options.headers + ',.tm-settings-wrap ' + '.' + this.options.headers + ',.builder-element-wrap ' + '.' + this.options.headers + ')' ).sortable( {
					cursor: 'move',
					items: '.tm-box:not(.tm-add-box)',
					start: function( e, ui ) {
						var $tab;
						$tab = t.find( '.' + ui.item.closest( '.tm-box' ).find( '.' + ithis.options.header ).attr( ithis.options.dataattribute ) );
						ohp = ui.item.index();
						ohpid = ui.item.find( '.' + ithis.options.header ).attr( ithis.options.dataopenattribute );

						initialIndex = $.tmEPOAdmin.find_index( true, $tab.find( '.bitem' ).first() );

						if ( typeof ithis.options.beforemovetab === 'function' ) {
							ithis.options.beforemovetab.call( this, ohp, $tab, initialIndex );
						}
						ithis.enableEvents = false;
					},
					stop: function( e, ui ) {
						var original_item;
						var new_index;
						var replaced_item;
						var $tab;
						var originalItemCopy;

						$tab = t.find( '.' + ui.item.closest( '.tm-box' ).find( '.' + ithis.options.header ).attr( ithis.options.dataattribute ) );
						original_item = t.find( '.' + ithis.options.slide + '.' + ohpid );
						new_index = t
							.find( '.' + ithis.options.headers + ' ' + '.' + ithis.options.header + '[' + ithis.options.dataopenattribute + '=\'' + ohpid + '\']' )
							.parent()
							.index();
						if ( new_index !== ohp ) {
							replaced_item = t.find( '.' + ithis.options.slide ).eq( new_index );
							originalItemCopy = original_item.tcClone();
							originalItemCopy.find( '.bitem' ).remove();
							if ( new_index > ohp ) {
								replaced_item.after( originalItemCopy );
							} else if ( new_index < ohp ) {
								replaced_item.before( originalItemCopy );
							}
							original_item.find( '.bitem' ).toArray().forEach( function( el ) {
								el = $( el );
								if ( typeof ithis.options.beforemovebitem === 'function' ) {
									ithis.options.beforemovebitem.call( this, new_index, ohp, $tab, initialIndex, el );
								}
								originalItemCopy.append( el );
								if ( typeof ithis.options.aftermovebitem === 'function' ) {
									ithis.options.aftermovebitem.call( this, new_index, ohp, $tab, initialIndex, el );
								}
							} );
							original_item.remove();
							if ( typeof ithis.options.aftermovetab === 'function' ) {
								ithis.options.aftermovetab.call( this, new_index, ohp, $tab, initialIndex );
							}
						}
						ithis.enableEvents = true;
					},
					cancel: '.tm-add-box',
					forcePlaceholderSize: true,
					revert: 200,
					placeholder: 'tm-box pl',
					tolerance: 'pointer'
				} );
			}

			if ( this.options.addbutton ) {
				theaderswrap.append( this.options.addbuttonhtml );
				t.addClass( 'has-add-button' ).find( '.' + this.options.addheader ).off( 'click.tmtabs' ).on( 'click.tmtabs', function( e ) {
					var allHeaders = t.find( '.' + ithis.options.headers + ' ' + '.' + ithis.options.header );
					var last_header = allHeaders.last();
					var id = last_header.attr( ithis.options.dataattribute );
					var last_tab = t.find( '.' + id );
					var new_header = last_header.tcClone().off( 'closetab.tmtabs opentab.tmtabs click.tmtabs' );
					var new_tab = last_tab.tcClone().empty();
					var newid = ithis.options.slide + allHeaders.length;

					e.preventDefault();

					new_header
						.html( '<span class="tab-text">' + ( t.find( '.' + ithis.options.headers + ' ' + '.' + ithis.options.header ).length + 1 ) + '</span>' )
						.removeClass( 'closed open' )
						.addClass( 'closed' )
						.data( 'tab', '.' + newid )
						.data( 'state', 'closed' )
						.attr( ithis.options.dataattribute, newid );
					new_tab.removeClass( id ).addClass( newid );
					if ( ithis.options.useclasstohide ) {
						new_tab.addClass( 'tm-hide' ).removeClass( '.tm-show' );
					} else {
						new_tab.hide();
					}
					new_tab.removeClass( 'tm-animated ' + ithis.options.animationclass );

					last_header.closest( '.tm-box' ).after( new_header );

					new_header.wrap( '<div class="tm-box"></div>' );

					ithis.addHeaderEvents( t, index, tc, new_header, theaderswrap, theaders, scrollLeftButton, scrollRightButton, state );
					last_tab.after( new_tab );
					if ( ithis.options.scroll ) {
						// ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
						theaders.animate(
							{
								scrollLeft: new_header.width() + 'px'
							},
							ithis.options.scrollDuration,
							function() {
								ithis.checkSize( theaderswrap, theaders, scrollLeftButton, scrollRightButton, state, true );
							}
						);
					}
					if ( typeof ithis.options.afteraddtab === 'function' ) {
						ithis.options.afteraddtab.call( this, new_header, new_tab );
					}
				} );
			} else {
				theaderswrap.find( '.' + this.options.addheader ).remove();
			}

			if ( this.options.selectedtab === 'auto' ) {
				if ( localStorage ) {
					_selected_tab = localStorage.getItem( 'tmadmintab-' + tc );
				}
				if ( vars.selected_tab !== undefined ) {
					_selected_tab = vars.selected_tab;
				}
				if ( vars.menu !== undefined ) {
					_selected_tab = vars.menu;
				}
				if ( _selected_tab === undefined || _selected_tab === null ) {
					_selected_tab = t.find( '.' + this.options.header ).eq( 0 ).attr( this.options.dataopenattribute );
				}
				if ( ! t.find( '.' + this.options.header + '[' + this.options.dataopenattribute + '="' + _selected_tab + '"]' ).is( ':visible' ) ) {
					t.find( '.' + this.options.header ).eq( 0 ).trigger( 'click.tmtabs' );
				} else {
					t.find( '.' + this.options.header + '[' + this.options.dataopenattribute + '="' + _selected_tab + '"]' ).trigger( 'click.tmtabs' );
				}
			} else if ( this.options.selectedtab !== false ) {
				_selected_tab = parseInt( this.options.selectedtab, 10 );
				t.find( '.' + this.options.header + ':eq(' + _selected_tab + ')' ).trigger( 'click.tmtabs' );
			}
		},

		init: function( nobackup ) {
			var ithis = this;
			this.elements.each( function( index ) {
				var t = $( this );
				var display;
				var state = {};
				var backup = t.html();

				if ( ! nobackup && ithis.backup[ index ] ) {
					t.html( ithis.backup[ index ] );
				} else {
					ithis.backup[ index ] = backup;
				}
				state.scrollPos = 0;
				state.scrollWidth = 0;
				display = t.css( 'display' );
				t.show();
				ithis.initElement( t, index, state, $.epoAPI.math.uniqueid( '' ) );
				t.css( 'display', display );
			} );
		}
	};

	$.fn.tcTabs = function( option ) {
		var methodReturn;
		var targets = $( this );
		var data = targets.data( 'tctabs' );
		var options;
		var ret;
		var args = $.makeArray( arguments );
		args.splice( 0, 1 );

		if ( typeof option === 'object' ) {
			options = option;
		} else {
			options = {};
		}

		if ( ! data ) {
			data = new Tabs( this, options );
			targets.data( 'tctabs', data );
		}

		if ( typeof option === 'string' ) {
			methodReturn = data[ option ].apply( data, args );
		}

		if ( methodReturn === undefined ) {
			ret = targets;
		} else {
			ret = methodReturn;
		}

		return ret;
	};

	$.fn.tcTabs.defaults = {
		headers: 'tm-tab-headers',
		headersWrap: 'tc-tab-headers-wrap',
		header: 'tab-header',
		slide: 'tc-tab-slide',

		classdown: 'tcfa-angle-down',
		classup: 'tcfa-angle-up',
		animationclass: 'appear',

		dataattribute: 'data-id',
		dataopenattribute: 'data-id',
		selectedtab: 'auto',
		showonhover: false,
		useclasstohide: true,
		sortabletabs: true,

		addbutton: false,
		addheader: 'tm-add-tab',
		addbuttonhtml: '<div class="tm-add-tab"><span class="tmicon tcfa tcfa-plus"></span></div>',
		afteraddtab: null,

		beforemovetab: null,
		aftermovetab: null,
		beforemovebitem: null,
		aftermovebitem: null,

		deletebutton: false,
		deletebuttonhtml: '<div class="tm-del-tab"><span class="tcfa tcfa-times"></span></div>',
		deleteheader: 'tm-del-tab',
		deleteconfirm: false,
		beforedeletetab: null,
		afterdeletetab: null,

		editbutton: false,
		editbuttonhtml: '<span class="tm-edit-tab"><span class="tcfa tcfa-edit"></span></span>',
		editheader: 'tm-edit-tab',
		oneditbutton: null,

		scroll: true,
		scrollDistance: 300,
		scrollDuration: 300
	};

	$.fn.tcTabs.Constructor = Tabs;

	$.fn.tmtabs = $.fn.tcTabs;
}( window.jQuery ) );
assets/js/tm-api.min.js000064400000017773150755142450011020 0ustar00!function(){"use strict";String.prototype.isNumeric||Object.defineProperty(String.prototype,"isNumeric",{value:function(){return!isNaN(parseFloat(this))&&isFinite(this)}})}(),window.jQuery.jMaskGlobals={maskElements:".tc-extra-product-options input"},function(i){"use strict";i.epoAPI={},i.epoAPI.error=!1,i.epoAPI.math={},i.epoAPI.dom={},i.epoAPI.util={},i.epoAPI.locale={},i.epoAPI.template={},i.epoAPI.math.toFloat=function(e,t){var n;return"string"!=typeof e&&"number"!=typeof e||isNaN(e)?0:(n=parseFloat(e),isNaN(n)?void 0!==t?t:e:n)},i.epoAPI.math.toInt=function(e,t){var n;return"string"!=typeof e&&"number"!=typeof e||isNaN(e)||""===e?0:(n=parseInt(e,10),isNaN(n)?void 0!==t?t:e:n)},i.epoAPI.math.round=function(e,t,n){var o,r,i;if(t=parseInt(t,10),Number.isFinite(t)||(t=0),r=(e*=t=Math.pow(10,t))%1==.5*(i="number"==typeof e&&e?e<0?-1:1:0),o=Math.floor(e),r)switch(n){case"PHP_ROUND_HALF_DOWN":e=o+(i<0?1:0);break;case"PHP_ROUND_HALF_EVEN":e=o+o%2*i;break;case"PHP_ROUND_HALF_ODD":e=o+(o%2?0:1);break;default:e=o+(0<i?1:0)}return(e=r?e:Math.round(e))/t},i.epoAPI.math.uniqueid=function(e,t){function n(e,t){return t<(e=parseInt(e,10).toString(16)).length?e.slice(e.length-t):t>e.length?new Array(t-e.length+1).join("0")+e:e}return void 0===e&&(e=""),i.epoAPI.php=i.epoAPI.php||{},i.epoAPI.php.uniqidSeed||(i.epoAPI.php.uniqidSeed=Math.floor(123456789*Math.random())),i.epoAPI.php.uniqidSeed+=1,e=e,e=(e+=n(parseInt(Date.now()/1e3,10),8))+n(i.epoAPI.php.uniqidSeed,5),t&&(e+=(10*Math.random()).toFixed(8).toString()),e},i.epoAPI.dom.id=function(e){return void 0===e?e:"string"!=typeof e&&"number"!=typeof e||"number"==typeof e&&isNaN(e)?e.toString():e.toString().replace(/(%|:|\.|\[|\]|,|=)/g,"\\$1")},i.epoAPI.dom.scroll=function(){var e,t;return window.pageYOffset?(t=window.pageYOffset,e=window.pageXOffset):document.documentElement&&document.documentElement.scrollTop?(t=document.documentElement.scrollTop,e=document.documentElement.scrollLeft):document.body&&(t=document.body.scrollTop,e=document.body.scrollLeft),{left:e,top:t}},i.epoAPI.dom.size=function(){var e,t,n,o=window.innerHeight&&window.scrollMaxY?(e=window.innerWidth+window.scrollMaxX,window.innerHeight+window.scrollMaxY):document.body.scrollHeight>document.body.offsetHeight?(e=document.body.scrollWidth,document.body.scrollHeight):(e=document.body.offsetWidth,document.body.offsetHeight);return window.innerHeight?(t=document.documentElement.clientWidth||window.innerWidth,n=window.innerHeight):document.documentElement&&document.documentElement.clientHeight?(t=document.documentElement.clientWidth,n=document.documentElement.clientHeight):document.body&&(t=document.body.clientWidth,n=document.body.clientHeight),{fullWidth:e<t?t:e,fullHeight:o<n?n:o,visibleWidth:t,visibleHeight:n,totalWidth:e,totalHeight:o}},i.epoAPI.util.trim=function(e){return"string"==typeof e?e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""):e},i.epoAPI.util.parseJSON=function(e){var t,n=window.JSON;try{if((t=n.parse(e+""))&&"object"==typeof t&&null!==t)return t}catch(e){i.epoAPI.error=e}return!1},i.epoAPI.util.decodeHTML=function(e){var t=document.createElement("textarea");return t.innerHTML=e,t.value},i.epoAPI.util.getStorage=function(e){var t,n;try{return t=window[e],n="__storage_test__",t.setItem(n,n),t.removeItem(n),t}catch(e){return!1}},i.epoAPI.util.basename=function(e){return e.replace(/.*\//,"")},i.epoAPI.util.deepCopyArray=function(t){var n,o;return void 0!==window.structuredClone?window.structuredClone(t):"object"!=typeof t||null===t?t:(n=Array.isArray(t)?[]:{},Object.keys(t).forEach(function(e){t&&(o=t[e],n[e]="object"==typeof o&&null!==o?i.epoAPI.util.deepCopyArray(o):o)}),n)},i.epoAPI.locale.getSystemDecimalSeparator=function(){var e=1.1;return e=(e=/^1(.+)1$/.exec(e.toLocaleString()))?e[1]:","},i.epoAPI.template.html=function(e,t){e=e(t);return e=(e=e.replace("/*<![CDATA[*/","")).replace("/*]]>*/","")},i.epoAPI.filters={},i.epoAPI.addFilter=function(e,t,n,o){var r;return n=parseInt(n,10),isNaN(n)&&(n=10),o=parseInt(o,10),isNaN(o)&&(o=1),r=t+"_"+n,i.epoAPI.filters[e]||(i.epoAPI.filters[e]={}),i.epoAPI.filters[e][n]||(i.epoAPI.filters[e][n]={}),i.epoAPI.filters[e][n][r]={func:t,accepted_args:o},!0},i.epoAPI.removeFilter=function(e,t,n){return n=parseInt(n,10),t=t+"_"+(n=isNaN(n)?10:n),!!(i.epoAPI.filters[e]&&i.epoAPI.filters[e][n]&&i.epoAPI.filters[e][n][t])&&(delete i.epoAPI.filters[e][n][t],!0)},i.epoAPI.applyFilter=function(e,n){var o=i.makeArray(arguments);return o.splice(0,1),i.epoAPI.filters[e]&&(e=i.epoAPI.filters[e],i.each(e,function(e,t){i.each(t,function(e,t){t=t.func;t instanceof Function?n=t.apply(null,o):window[t]&&window[t]instanceof Function&&(n=window[t].apply(null,o))})})),n},i.tc_add_filter=i.epoAPI.addFilter,i.tc_remove_filter=i.epoAPI.removeFilter,i.tc_apply_filters=i.epoAPI.applyFilter}(window.jQuery),function(e){"use strict";function i(e,t){return e=Math.round(Math.abs(e)),isNaN(e)?t:e}function a(e,t){var n;return Array.isArray(e)?e.map(e,function(e){return a(e,t)}):"number"==typeof(e=e||0)?e:(t=t||".",n=new RegExp("[^0-9-"+t+"]",["g"]),e=parseFloat((""+e).replace(n,"").replace(t,".")),isNaN(e)?0:e)}function c(e,t){return Number.isFinite(e)?(t=i(t,2),e=Number(a(e)*Math.pow(10,t)),e=Math.round(e),Number(e/Math.pow(10,t)).toFixed(t)):"-"}e.epoAPI.math.unformat=a,e.epoAPI.math.format=function t(e,n){var o,r;if(Array.isArray(e))return e.map(e,function(e){return t(e,n)});if(e=a(e),n)if(n.precision=i(n.precision),n.format&&n.symbol)o={pos:n.format,neg:n.format.replace("-","").replace("%v","-%v"),zero:n.format},o=0<e?o.pos:e<0?o.neg:o.zero,n.opts={precision:n.precision,thousand:n.thousand,decimal:n.decimal},e=o.replace("%s",n.symbol).replace("%v",t(Math.abs(e),n.opts));else{if(!Number.isFinite(e))return"-";e=(e<0?"-":"")+((r=3<(o=parseInt(c(Math.abs(e||0),n.precision),10)+"").length?o.length%3:0)?o.substring(0,r)+n.thousand:"")+o.substring(r).replace(/(\d{3})(?=\d)/g,"$1"+n.thousand)+(n.precision?n.decimal+c(Math.abs(e),n.precision).split(".")[1]:"")}return e},e.epoAPI.math.toFixed=c}(window.jQuery),function(l){"use strict";var t,o=/\r?\n/g,n=/^(?:checkbox|radio)$/i,r=/^(?:submit|button|image|reset|file)$/i,i=/^(?:input|select|textarea|keygen)/i;l.easing.easeInExpo||(l.easing.easeInExpo=t=function(e){return Math.pow(e,6)},l.easing.easeOutExpo=function(e){return 1-t(1-e)},l.easing.easeInOutExpo=function(e){return e<.5?t(2*e)/2:1-t(-2*e+2)/2}),l.fn.extend({tmcheckboxes:function(){var e=this.find(":checkbox:not('.tm-default-checkbox')").not(".wp-tab-panel :checkbox, .tm-weekdays-picker-wrap :checkbox, .tm-months-picker-wrap :checkbox");return e.wrap('<label class="tm-epo-switch-wrapper-label"></label>'),e.wrap('<span class="tm-epo-switch-wrapper tc"></span>'),e.after('<span class="tc-label tm-epo-switch tc"></span>'),this},tcSerializeArray:function(){return this.find(":input").filter(function(){var e=this.type;return this.name&&!l(this).is(":disabled")&&i.test(this.nodeName)&&!r.test(e)&&(this.checked||!n.test(e))}).map(function(e,t){var n=l(this).val();return null===n?null:Array.isArray(n)?l.map(n,function(e){return{name:t.name,value:e.replace(o,"\r\n")}}):{name:t.name,value:n.replace(o,"\r\n")}}).get()},tcSerializeObject:function(){var e={},t=this.tcSerializeArray();return l.each(t,function(){void 0!==e[this.name]&&this.name.endsWith("[]")?(e[this.name].push||(e[this.name]=[e[this.name]]),e[this.name].push(this.value||"")):e[this.name]=this.value||""}),e},tcScrollTo:function(e,t,n){var o=this;return 0===(e=l(e)).length?this:(t=t||0,n=n||0,o[0].self!==window&&(o=o.find(".woodmart-scroll-content").length?o.find(".woodmart-scroll-content"):o).offset()?n+=o.scrollTop()-o.offset().top:o=l("html, body"),o.animate({scrollTop:l(e).offset().top+n},t))},tcClone:function(){for(var e,t,n=l.fn.clone.apply(this,arguments),o=this.find("textarea").add(this.filter("textarea")),r=n.find("textarea").add(n.filter("textarea")),i=this.find("select").add(this.filter("select")),a=n.find("select").add(n.filter("select")),c=0,s=o.length;c<s;c+=1)l(r[c]).val(l(o[c]).val());for(c=0,s=i.length;c<s;c+=1)for(e=0,t=i[c].options.length;e<t;e+=1)!0===i[c].options[e].selected&&(a[c].options[e].selected=!0);return n}})}(window.jQuery);assets/js/tm-datepicker.js000064400000254607150755142450011577 0ustar00/*! jQuery UI - v1.12.1 - 2019-02-17
 * http://jqueryui.com
 * Modified version of jQuery Datepicker
 * Copyright jQuery Foundation and other contributors; Licensed MIT */

( function( factory ) {
	'use strict';
	if ( typeof window.define === 'function' && window.define.amd ) {
		// AMD. Register as an anonymous module.
		window.define( [ 'jquery' ], factory );
	} else {
		// Browser globals
		factory( window.jQuery );
	}
}( function( $ ) {
	'use strict';
	/*!
	 * jQuery UI Datepicker 1.12.1 (Modified version of jQuery Datepicker)
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 *
	 * http://api.jqueryui.com/datepicker/
	 */

	var datepicker_instActive;

	$.ui.tm_datepicker = $.ui.tm_datepicker || {};
	if ( $.ui.tm_datepicker.version ) {
		return;
	}

	$.extend( $.ui, { tm_datepicker: { version: '1.11.4' } } );

	function datepicker_getZindex( elem ) {
		var position, value;
		while ( elem.length && elem[ 0 ] !== document ) {
			// Ignore z-index if position is set to a value where z-index is ignored by the browser
			// This makes behavior of this function consistent across browsers
			// WebKit always returns auto if the element is positioned
			position = elem.css( 'position' );
			if ( position === 'absolute' || position === 'relative' || position === 'fixed' ) {
				// IE returns 0 when zIndex is not specified
				// other browsers return a string
				// we ignore the case of nested elements with an explicit value of 0
				value = parseInt( elem.css( 'zIndex' ), 10 );
				if ( ! isNaN( value ) && value !== 0 ) {
					return value;
				}
			}
			elem = elem.parent();
		}

		return 0;
	}

	/*
	 * Bind hover events for datepicker elements.
	 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
	 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
	 */
	function datepicker_handleMouseover( that ) {
		if ( ! $.tm_datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
			$( that ).parents( '.ui-tm-datepicker-calendar' ).find( 'a' ).removeClass( 'ui-state-hover' );
			$( that ).addClass( 'ui-state-hover' );
			if ( that.className.indexOf( 'ui-tm-datepicker-prev' ) !== -1 ) {
				$( that ).addClass( 'ui-tm-datepicker-prev-hover' );
			}
			if ( that.className.indexOf( 'ui-tm-datepicker-next' ) !== -1 ) {
				$( that ).addClass( 'ui-tm-datepicker-next-hover' );
			}
		}
	}

	function datepicker_bindHover( dpDiv ) {
		var selector = 'button, .ui-tm-datepicker-prev, .ui-tm-datepicker-next, .ui-tm-datepicker-calendar td a';
		return dpDiv
			.on( 'mouseout', selector, function() {
				$( this ).removeClass( 'ui-state-hover' );
				if ( this.className.indexOf( 'ui-tm-datepicker-prev' ) !== -1 ) {
					$( this ).removeClass( 'ui-tm-datepicker-prev-hover' );
				}
				if ( this.className.indexOf( 'ui-tm-datepicker-next' ) !== -1 ) {
					$( this ).removeClass( 'ui-tm-datepicker-next-hover' );
				}
			} )
			.on( 'mouseover', selector, function() {
				datepicker_handleMouseover( this );
			} );
	}

	/* jQuery extend now ignores nulls! */
	function datepicker_extendRemove( target, props ) {
		var name;

		$.extend( target, props );
		for ( name in props ) {
			if ( props[ name ] === null ) {
				target[ name ] = props[ name ];
			}
		}
		return target;
	}

	/* Date picker manager.
     Use the singleton instance of this class, $.tm_datepicker, to interact with the date picker.
     Settings for (groups of) date pickers are maintained in an instance object,
     allowing multiple different settings on the same page. */

	function Datepicker() {
		this._curInst = null; // The current instance in use
		this._keyEvent = false; // If the last event was a key event
		this._disabledInputs = []; // List of date picker inputs that have been disabled
		this._datepickerShowing = false; // True if the popup picker is showing , false if not
		this._inDialog = false; // True if showing within a "dialog", false if not
		this._mainDivId = 'ui-tm-datepicker-div'; // The ID of the main datepicker division
		this._inlineClass = 'ui-tm-datepicker-inline'; // The name of the inline marker class
		this._appendClass = 'ui-tm-datepicker-append'; // The name of the append marker class
		this._triggerClass = 'ui-tm-datepicker-trigger'; // The name of the trigger marker class
		this._dialogClass = 'ui-tm-datepicker-dialog'; // The name of the dialog marker class
		this._disableClass = 'ui-tm-datepicker-disabled'; // The name of the disabled covering marker class
		this._unselectableClass = 'ui-tm-datepicker-unselectable'; // The name of the unselectable cell marker class
		this._currentClass = 'ui-tm-datepicker-current-day'; // The name of the current day marker class
		this._dayOverClass = 'ui-tm-datepicker-days-cell-over'; // The name of the day hover marker class
		this.regional = []; // Available regional settings, indexed by language code
		this.regional[ '' ] = {
			// Default regional settings
			closeText: 'Done', // Display text for close link
			prevText: 'Prev', // Display text for previous month link
			nextText: 'Next', // Display text for next month link
			currentText: 'Today', // Display text for current month link
			monthNames: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ], // Names of months for drop-down and formatting
			monthNamesShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ], // For formatting
			dayNames: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ], // For formatting
			dayNamesShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ], // For formatting
			dayNamesMin: [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ], // Column headings for days starting at Sunday
			weekHeader: 'Wk', // Column header for week of the year
			dateFormat: 'mm/dd/yy', // See format options on parseDate
			firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
			isRTL: false, // True if right-to-left language, false if left-to-right
			showMonthAfterYear: false, // True if the year select precedes month, false for month then year
			yearSuffix: '' // Additional text to append to the year in the month headers
		};
		this._defaults = {
			// Global defaults for all the date picker instances
			showOn: 'focus', // "focus" for popup on focus,
			// "button" for trigger button, or "both" for either
			showAnim: 'fadeIn', // Name of jQuery animation for popup
			showOptions: {}, // Options for enhanced animations
			defaultDate: null, // Used when field is blank: actual date,
			// +/-number for offset from today, null for today
			appendText: '', // Display text following the input box, e.g. showing the format
			buttonText: '...', // Text for trigger button
			buttonImage: '', // URL for trigger button image
			buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
			hideIfNoPrevNext: false, // True to hide next/previous month links
			// if not applicable, false to just disable them
			navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
			gotoCurrent: false, // True if today link goes back to current selection instead
			changeMonth: false, // True if month can be selected directly, false if only prev/next
			changeYear: false, // True if year can be selected directly, false if only prev/next
			yearRange: 'c-10:c+10', // Range of years to display in drop-down,
			// either relative to today's year (-nn:+nn), relative to currently displayed year
			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
			showOtherMonths: false, // True to show dates in other months, false to leave blank
			selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
			showWeek: false, // True to show week of the year, false to not show it
			calculateWeek: this.iso8601Week, // How to calculate the week of the year,
			// takes a Date and returns the number of the week for it
			shortYearCutoff: '+10', // Short year values < this are in the current century,
			// > this are in the previous century,
			// string value starting with "+" for current year + value
			minDate: null, // The earliest selectable date, or null for no limit
			maxDate: null, // The latest selectable date, or null for no limit
			duration: 'fast', // Duration of display/closure
			beforeShowDay: null, // Function that takes a date and returns an array with
			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
			// [2] = cell title (optional), e.g. $.tm_datepicker.noWeekends
			beforeShow: null, // Function that takes an input field and
			// returns a set of custom settings for the date picker
			onSelect: null, // Define a callback function when a date is selected
			onChangeMonthYear: null, // Define a callback function when the month or year is changed
			onClose: null, // Define a callback function when the datepicker is closed
			numberOfMonths: 1, // Number of months to show at a time
			showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
			stepMonths: 1, // Number of months to step back/forward
			stepBigMonths: 12, // Number of months to step back/forward for the big links
			altField: '', // Selector for an alternate field to store selected dates into
			altFormat: '', // The date format to use for the alternate field
			constrainInput: true, // The input is constrained by the current date format
			showButtonPanel: false, // True to show button panel, false to not show it
			autoSize: false, // True to size the input for the date format, false to leave as is
			disabled: false // The initial disabled state
		};
		$.extend( this._defaults, this.regional[ '' ] );
		this.regional.en = $.extend( true, {}, this.regional[ '' ] );
		this.regional[ 'en-US' ] = $.extend( true, {}, this.regional.en );
		this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
	}

	$.extend( Datepicker.prototype, {
		/* Class name added to elements to indicate already configured with a date picker. */
		markerClassName: 'hasDatepicker',

		//Keep track of the maximum number of rows displayed (see #7043)
		maxRows: 4,

		// TODO rename to "widget" when switching to widget factory
		_widgetDatepicker: function() {
			return this.dpDiv;
		},

		/* Override the default settings for all instances of the date picker.
		 * @param  settings  object - the new settings to use as defaults (anonymous object)
		 * @return the manager object
		 */
		setDefaults: function( settings ) {
			datepicker_extendRemove( this._defaults, settings || {} );
			return this;
		},

		/* Attach the date picker to a jQuery selection.
		 * @param  target   element - the target input field or division or span
		 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
		 */
		_attachDatepicker: function( target, settings ) {
			var nodeName, inline, inst;
			nodeName = target.nodeName.toLowerCase();
			inline = nodeName === 'div' || nodeName === 'span';
			if ( ! target.id ) {
				this.uuid += 1;
				target.id = 'dp' + this.uuid;
			}
			inst = this._newInst( $( target ), inline );
			inst.settings = $.extend( {}, settings || {} );
			if ( nodeName === 'input' ) {
				this._connectDatepicker( target, inst );
			} else if ( inline ) {
				this._inlineDatepicker( target, inst );
			}
		},

		/* Create a new instance object. */
		_newInst: function( target, inline ) {
			var id = target[ 0 ].id.replace( /([^A-Za-z0-9_-])/g, '\\\\$1' ); // escape jQuery meta chars
			return {
				id: id,
				input: target, // associated target
				selectedDay: 0,
				selectedMonth: 0,
				selectedYear: 0, // current selection
				drawMonth: 0,
				drawYear: 0, // month being drawn
				inline: inline, // is datepicker inline or not
				// presentation div
				dpDiv: ! inline ? this.dpDiv : datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-tm-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) )
			};
		},

		/* Attach the date picker to an input field. */
		_connectDatepicker: function( target, inst ) {
			var input = $( target );
			inst.append = $( [] );
			inst.trigger = $( [] );
			if ( input.hasClass( this.markerClassName ) ) {
				return;
			}
			this._attachments( input, inst );
			input.addClass( this.markerClassName ).on( 'keydown', this._doKeyDown ).on( 'keypress', this._doKeyPress ).on( 'keyup', this._doKeyUp );
			this._autoSize( inst );
			$.data( target, 'datepicker', inst );

			//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
			if ( inst.settings.disabled ) {
				this._disableDatepicker( target );
			}
		},

		/* Make attachments based on settings. */
		_attachments: function( input, inst ) {
			var showOn,
				buttonText,
				buttonImage,
				appendText = this._get( inst, 'appendText' ),
				isRTL = this._get( inst, 'isRTL' );

			if ( inst.append ) {
				inst.append.remove();
			}
			if ( appendText ) {
				inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + '</span>' );
				input[ isRTL ? 'before' : 'after' ]( inst.append );
			}

			input.off( 'focus', this._showDatepicker );

			if ( inst.trigger ) {
				inst.trigger.remove();
			}

			showOn = this._get( inst, 'showOn' );
			if ( showOn === 'focus' || showOn === 'both' ) {
				// pop-up date picker when in the marked field
				input.on( 'focus', this._showDatepicker );
			}
			if ( showOn === 'button' || showOn === 'both' ) {
				// pop-up date picker when button clicked
				buttonText = this._get( inst, 'buttonText' );
				buttonImage = this._get( inst, 'buttonImage' );
				inst.trigger = $(
					this._get( inst, 'buttonImageOnly' )
						? $( '<img/>' ).addClass( this._triggerClass ).attr( { src: buttonImage, alt: buttonText, title: buttonText } )
						: $( "<button type='button'></button>" )
							.addClass( this._triggerClass )
							.html( ! buttonImage ? buttonText : $( '<img/>' ).attr( { src: buttonImage, alt: buttonText, title: buttonText } ) )
				);
				input[ isRTL ? 'before' : 'after' ]( inst.trigger );
				inst.trigger.on( 'click', function() {
					if ( $.tm_datepicker._datepickerShowing && $.tm_datepicker._lastInput === input[ 0 ] ) {
						$.tm_datepicker._hideDatepicker();
					} else if ( $.tm_datepicker._datepickerShowing && $.tm_datepicker._lastInput !== input[ 0 ] ) {
						$.tm_datepicker._hideDatepicker();
						$.tm_datepicker._showDatepicker( input[ 0 ] );
					} else {
						$.tm_datepicker._showDatepicker( input[ 0 ] );
					}
					return false;
				} );
			}
		},

		/* Apply the maximum length for the date format. */
		_autoSize: function( inst ) {
			var findMax;
			var max;
			var maxI;
			var i;
			var date;
			var dateFormat = this._get( inst, 'dateFormat' );

			if ( this._get( inst, 'autoSize' ) && ! inst.inline ) {
				date = new Date( 2009, 12 - 1, 20 ); // Ensure double digits
				dateFormat = this._get( inst, 'dateFormat' );

				if ( dateFormat.match( /[DM]/ ) ) {
					findMax = function( names ) {
						max = 0;
						maxI = 0;
						for ( i = 0; i < names.length; i += 1 ) {
							if ( names[ i ].length > max ) {
								max = names[ i ].length;
								maxI = i;
							}
						}
						return maxI;
					};
					date.setMonth( findMax( this._get( inst, dateFormat.match( /MM/ ) ? 'monthNames' : 'monthNamesShort' ) ) );
					date.setDate( findMax( this._get( inst, dateFormat.match( /DD/ ) ? 'dayNames' : 'dayNamesShort' ) ) + 20 - date.getDay() );
				}
				inst.input.attr( 'size', this._formatDate( inst, date ).length );
			}
		},

		/* Attach an inline date picker to a div. */
		_inlineDatepicker: function( target, inst ) {
			var divSpan = $( target );
			if ( divSpan.hasClass( this.markerClassName ) ) {
				return;
			}
			divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
			$.data( target, 'datepicker', inst );
			this._setDate( inst, this._getDefaultDate( inst ), true );
			this._updateDatepicker( inst );
			this._updateAlternate( inst );

			//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
			if ( inst.settings.disabled ) {
				this._disableDatepicker( target );
			}

			// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
			// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
			inst.dpDiv.css( 'display', 'block' );
		},

		/* Pop-up the date picker in a "dialog" box.
		 * @param  input element - ignored
		 * @param  date string or Date - the initial date to display
		 * @param  onSelect  function - the function to call when a date is selected
		 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
		 * @param  pos int[2] - coordinates for the dialog's position within the screen or
		 *                  event - with x/y coordinates or
		 *                  leave empty for default (screen centre)
		 * @return the manager object
		 */
		_dialogDatepicker: function( input, date, onSelect, settings, pos ) {
			var id,
				browserWidth,
				browserHeight,
				scrollX,
				scrollY,
				inst = this._dialogInst; // internal instance

			if ( ! inst ) {
				this.uuid += 1;
				id = 'dp' + this.uuid;
				this._dialogInput = $( "<input type='text' id='" + id + "'>" );
				this._dialogInput.on( 'keydown', this._doKeyDown );
				$( 'body' ).append( this._dialogInput );
				inst = this._newInst( this._dialogInput, false );
				this._dialogInst = inst;
				inst.settings = {};
				$.data( this._dialogInput[ 0 ], 'datepicker', inst );
			}
			datepicker_extendRemove( inst.settings, settings || {} );
			date = date && date.constructor === Date ? this._formatDate( inst, date ) : date;
			this._dialogInput.val( date );

			this._pos = pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null;
			if ( ! this._pos ) {
				browserWidth = document.documentElement.clientWidth;
				browserHeight = document.documentElement.clientHeight;
				scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
				scrollY = document.documentElement.scrollTop || document.body.scrollTop;
				this._pos =
					// should use actual width/height below
					[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
			}

			// Move input on screen for focus, but hidden behind dialog
			this._dialogInput.css( 'left', this._pos[ 0 ] + 20 + 'px' ).css( 'top', this._pos[ 1 ] + 'px' );
			inst.settings.onSelect = onSelect;
			this._inDialog = true;
			this.dpDiv.addClass( this._dialogClass );
			this._showDatepicker( this._dialogInput[ 0 ] );
			if ( $.blockUI ) {
				$.blockUI( this.dpDiv );
			}
			$.data( this._dialogInput[ 0 ], 'datepicker', inst );
			return this;
		},

		/* Detach a datepicker from its control.
		 * @param  target   element - the target input field or division or span
		 */
		_destroyDatepicker: function( target ) {
			var nodeName,
				$target = $( target ),
				inst = $.data( target, 'datepicker' );

			if ( ! $target.hasClass( this.markerClassName ) ) {
				return;
			}

			nodeName = target.nodeName.toLowerCase();
			$.removeData( target, 'datepicker' );
			if ( nodeName === 'input' ) {
				inst.append.remove();
				inst.trigger.remove();
				$target.removeClass( this.markerClassName ).off( 'focus', this._showDatepicker ).off( 'keydown', this._doKeyDown ).off( 'keypress', this._doKeyPress ).off( 'keyup', this._doKeyUp );
			} else if ( nodeName === 'div' || nodeName === 'span' ) {
				$target.removeClass( this.markerClassName ).empty();
			}

			if ( datepicker_instActive === inst ) {
				datepicker_instActive = null;
			}
		},

		/* Enable the date picker to a jQuery selection.
		 * @param  target   element - the target input field or division or span
		 */
		_enableDatepicker: function( target ) {
			var nodeName,
				inline,
				$target = $( target ),
				inst = $.data( target, 'datepicker' );

			if ( ! $target.hasClass( this.markerClassName ) ) {
				return;
			}

			nodeName = target.nodeName.toLowerCase();
			if ( nodeName === 'input' ) {
				target.disabled = false;
				inst.trigger
					.filter( 'button' )
					.each( function() {
						this.disabled = false;
					} )
					.end()
					.filter( 'img' )
					.css( { opacity: '1.0', cursor: '' } );
			} else if ( nodeName === 'div' || nodeName === 'span' ) {
				inline = $target.children( '.' + this._inlineClass );
				inline.children().removeClass( 'ui-state-disabled' );
				inline.find( 'select.ui-tm-datepicker-month, select.ui-tm-datepicker-year' ).prop( 'disabled', false );
			}
			this._disabledInputs = $.map( this._disabledInputs, function( value ) {
				return value === target ? null : value;
			} ); // delete entry
		},

		/* Disable the date picker to a jQuery selection.
		 * @param  target   element - the target input field or division or span
		 */
		_disableDatepicker: function( target ) {
			var nodeName,
				inline,
				$target = $( target ),
				inst = $.data( target, 'datepicker' );

			if ( ! $target.hasClass( this.markerClassName ) ) {
				return;
			}

			nodeName = target.nodeName.toLowerCase();
			if ( nodeName === 'input' ) {
				target.disabled = true;
				inst.trigger
					.filter( 'button' )
					.each( function() {
						this.disabled = true;
					} )
					.end()
					.filter( 'img' )
					.css( { opacity: '0.5', cursor: 'default' } );
			} else if ( nodeName === 'div' || nodeName === 'span' ) {
				inline = $target.children( '.' + this._inlineClass );
				inline.children().addClass( 'ui-state-disabled' );
				inline.find( 'select.ui-tm-datepicker-month, select.ui-tm-datepicker-year' ).prop( 'disabled', true );
			}
			this._disabledInputs = $.map( this._disabledInputs, function( value ) {
				return value === target ? null : value;
			} ); // delete entry
			this._disabledInputs[ this._disabledInputs.length ] = target;
		},

		/* Is the first field in a jQuery collection disabled as a datepicker?
		 * @param  target   element - the target input field or division or span
		 * @return boolean - true if disabled, false if enabled
		 */
		_isDisabledDatepicker: function( target ) {
			var i;
			if ( ! target ) {
				return false;
			}
			for ( i = 0; i < this._disabledInputs.length; i += 1 ) {
				if ( this._disabledInputs[ i ] === target ) {
					return true;
				}
			}
			return false;
		},

		/* Retrieve the instance data for the target control.
		 * @param  target  element - the target input field or division or span
		 * @return  object - the associated instance data
		 * @throws  error if a jQuery problem getting data
		 */
		_getInst: function( target ) {
			try {
				return $.data( target, 'datepicker' );
			} catch ( err ) {
				throw 'Missing instance data for this datepicker';
			}
		},

		/* Update or retrieve the settings for a date picker attached to an input field or division.
		 * @param  target  element - the target input field or division or span
		 * @param  name object - the new settings to update or
		 *              string - the name of the setting to change or retrieve,
		 *              when retrieving also "all" for all instance settings or
		 *              "defaults" for all global defaults
		 * @param  value   any - the new value for the setting
		 *              (omit if above is an object or to retrieve a value)
		 */
		_optionDatepicker: function( target, name, value ) {
			var settings,
				date,
				minDate,
				maxDate,
				inst = this._getInst( target );

			if ( arguments.length === 2 && typeof name === 'string' ) {
				return name === 'defaults' ? $.extend( {}, $.tm_datepicker._defaults ) : inst ? ( name === 'all' ? $.extend( {}, inst.settings ) : this._get( inst, name ) ) : null;
			}

			settings = name || {};
			if ( typeof name === 'string' ) {
				settings = {};
				settings[ name ] = value;
			}

			if ( inst ) {
				if ( this._curInst === inst ) {
					this._hideDatepicker();
				}

				date = this._getDateDatepicker( target, true );
				minDate = this._getMinMaxDate( inst, 'min' );
				maxDate = this._getMinMaxDate( inst, 'max' );
				datepicker_extendRemove( inst.settings, settings );

				// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
				if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
					inst.settings.minDate = this._formatDate( inst, minDate );
				}
				if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
					inst.settings.maxDate = this._formatDate( inst, maxDate );
				}
				if ( 'disabled' in settings ) {
					if ( settings.disabled ) {
						this._disableDatepicker( target );
					} else {
						this._enableDatepicker( target );
					}
				}
				this._attachments( $( target ), inst );
				this._autoSize( inst );
				this._setDate( inst, date );
				this._updateAlternate( inst );
				this._updateDatepicker( inst );
			}
		},

		// Change method deprecated
		_changeDatepicker: function( target, name, value ) {
			this._optionDatepicker( target, name, value );
		},

		/* Redraw the date picker attached to an input field or division.
		 * @param  target  element - the target input field or division or span
		 */
		_refreshDatepicker: function( target ) {
			var inst = this._getInst( target );
			if ( inst ) {
				this._updateDatepicker( inst );
			}
		},

		/* Set the dates for a jQuery selection.
		 * @param  target element - the target input field or division or span
		 * @param  date Date - the new date
		 */
		_setDateDatepicker: function( target, date ) {
			var inst = this._getInst( target );
			if ( inst ) {
				this._setDate( inst, date );
				this._updateDatepicker( inst );
				this._updateAlternate( inst );
			}
		},

		/* Get the date(s) for the first entry in a jQuery selection.
		 * @param  target element - the target input field or division or span
		 * @param  noDefault boolean - true if no default date is to be used
		 * @return Date - the current date
		 */
		_getDateDatepicker: function( target, noDefault ) {
			var inst = this._getInst( target );
			if ( inst && ! inst.inline ) {
				this._setDateFromField( inst, noDefault );
			}
			return inst ? this._getDate( inst ) : null;
		},

		/* Handle keystrokes. */
		_doKeyDown: function( event ) {
			var onSelect,
				dateStr,
				sel,
				inst = $.tm_datepicker._getInst( event.target ),
				handled = true,
				isRTL = inst.dpDiv.is( '.ui-tm-datepicker-rtl' );

			inst._keyEvent = true;
			if ( $.tm_datepicker._datepickerShowing ) {
				switch ( event.keyCode ) {
					case 9:
						$.tm_datepicker._hideDatepicker();
						handled = false;
						break; // hide on tab out
					case 13:
						sel = $( 'td.' + $.tm_datepicker._dayOverClass + ':not(.' + $.tm_datepicker._currentClass + ')', inst.dpDiv );
						if ( sel[ 0 ] ) {
							$.tm_datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
						}

						onSelect = $.tm_datepicker._get( inst, 'onSelect' );
						if ( onSelect ) {
							dateStr = $.tm_datepicker._formatDate( inst );

							// Trigger custom callback
							onSelect.apply( inst.input ? inst.input[ 0 ] : null, [ dateStr, inst ] );
						} else {
							$.tm_datepicker._hideDatepicker();
						}

						return false; // don't submit the form
					case 27:
						$.tm_datepicker._hideDatepicker();
						break; // hide on escape
					case 33:
						$.tm_datepicker._adjustDate( event.target, event.ctrlKey ? -$.tm_datepicker._get( inst, 'stepBigMonths' ) : -$.tm_datepicker._get( inst, 'stepMonths' ), 'M' );
						break; // previous month/year on page up/+ ctrl
					case 34:
						$.tm_datepicker._adjustDate( event.target, event.ctrlKey ? +$.tm_datepicker._get( inst, 'stepBigMonths' ) : +$.tm_datepicker._get( inst, 'stepMonths' ), 'M' );
						break; // next month/year on page down/+ ctrl
					case 35:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._clearDate( event.target );
						}
						handled = event.ctrlKey || event.metaKey;
						break; // clear on ctrl or command +end
					case 36:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._gotoToday( event.target );
						}
						handled = event.ctrlKey || event.metaKey;
						break; // current on ctrl or command +home
					case 37:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._adjustDate( event.target, isRTL ? +1 : -1, 'D' );
						}
						handled = event.ctrlKey || event.metaKey;
						// -1 day on ctrl or command +left
						if ( event.originalEvent.altKey ) {
							$.tm_datepicker._adjustDate( event.target, event.ctrlKey ? -$.tm_datepicker._get( inst, 'stepBigMonths' ) : -$.tm_datepicker._get( inst, 'stepMonths' ), 'M' );
						}
						// next month/year on alt +left on Mac
						break;
					case 38:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._adjustDate( event.target, -7, 'D' );
						}
						handled = event.ctrlKey || event.metaKey;
						break; // -1 week on ctrl or command +up
					case 39:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._adjustDate( event.target, isRTL ? -1 : +1, 'D' );
						}
						handled = event.ctrlKey || event.metaKey;
						// +1 day on ctrl or command +right
						if ( event.originalEvent.altKey ) {
							$.tm_datepicker._adjustDate( event.target, event.ctrlKey ? +$.tm_datepicker._get( inst, 'stepBigMonths' ) : +$.tm_datepicker._get( inst, 'stepMonths' ), 'M' );
						}
						// next month/year on alt +right
						break;
					case 40:
						if ( event.ctrlKey || event.metaKey ) {
							$.tm_datepicker._adjustDate( event.target, +7, 'D' );
						}
						handled = event.ctrlKey || event.metaKey;
						break; // +1 week on ctrl or command +down
					default:
						handled = false;
				}
			} else if ( event.keyCode === 36 && event.ctrlKey ) {
				// display the date picker on ctrl+home
				$.tm_datepicker._showDatepicker( this );
			} else {
				handled = false;
			}

			if ( handled ) {
				event.preventDefault();
				event.stopPropagation();
			}
		},

		/* Filter entered characters - based on date format. */
		_doKeyPress: function( event ) {
			var chars,
				chr,
				inst = $.tm_datepicker._getInst( event.target );

			if ( $.tm_datepicker._get( inst, 'constrainInput' ) ) {
				chars = $.tm_datepicker._possibleChars( $.tm_datepicker._get( inst, 'dateFormat' ) );
				chr = String.fromCharCode( event.charCode === null ? event.keyCode : event.charCode );
				return event.ctrlKey || event.metaKey || chr < ' ' || ! chars || chars.indexOf( chr ) > -1;
			}
		},

		/* Synchronise manual entry and field/alternate field. */
		_doKeyUp: function( event ) {
			var date,
				inst = $.tm_datepicker._getInst( event.target );

			if ( inst.input.val() !== inst.lastVal ) {
				try {
					date = $.tm_datepicker.parseDate( $.tm_datepicker._get( inst, 'dateFormat' ), inst.input ? inst.input.val() : null, $.tm_datepicker._getFormatConfig( inst ) );

					if ( date ) {
						// only if valid
						$.tm_datepicker._setDateFromField( inst );
						$.tm_datepicker._updateAlternate( inst );
						$.tm_datepicker._updateDatepicker( inst );
					}
				} catch ( err ) {
					return false;
				}
			}
			return true;
		},

		/* Pop-up the date picker for a given input field.
		 * If false returned from beforeShow event handler do not show.
		 * @param  input  element - the input field attached to the date picker or
		 *                  event - if triggered by focus
		 */
		_showDatepicker: function( input ) {
			var inst;
			var beforeShow;
			var beforeShowSettings;
			var isFixed;
			var offset;
			var showAnim;
			var duration;

			input = input.target || input;
			if ( input.nodeName.toLowerCase() !== 'input' ) {
				// find from button/image trigger
				input = $( 'input', input.parentNode )[ 0 ];
			}

			if ( $.tm_datepicker._isDisabledDatepicker( input ) || $.tm_datepicker._lastInput === input ) {
				// already here
				return;
			}

			inst = $.tm_datepicker._getInst( input );
			if ( $.tm_datepicker._curInst && $.tm_datepicker._curInst !== inst ) {
				$.tm_datepicker._curInst.dpDiv.stop( true, true );
				if ( inst && $.tm_datepicker._datepickerShowing ) {
					$.tm_datepicker._hideDatepicker( $.tm_datepicker._curInst.input[ 0 ] );
				}
			}

			beforeShow = $.tm_datepicker._get( inst, 'beforeShow' );
			beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
			if ( beforeShowSettings === false ) {
				return;
			}
			datepicker_extendRemove( inst.settings, beforeShowSettings );

			inst.lastVal = null;
			$.tm_datepicker._lastInput = input;
			$.tm_datepicker._setDateFromField( inst );

			if ( $.tm_datepicker._inDialog ) {
				// hide cursor
				input.value = '';
			}
			if ( ! $.tm_datepicker._pos ) {
				// position below input
				$.tm_datepicker._pos = $.tm_datepicker._findPos( input );
				$.tm_datepicker._pos[ 1 ] += input.offsetHeight; // add the height
			}

			isFixed = false;
			$( input )
				.parents()
				.each( function() {
					isFixed = isFixed || $( this ).css( 'position' ) === 'fixed';
					return ! isFixed;
				} );

			offset = { left: $.tm_datepicker._pos[ 0 ], top: $.tm_datepicker._pos[ 1 ] };
			$.tm_datepicker._pos = null;
			//to avoid flashes on Firefox
			inst.dpDiv.empty();
			// determine sizing offscreen
			inst.dpDiv.css( { position: 'absolute', display: 'block', top: '-1000px' } );
			$.tm_datepicker._updateDatepicker( inst );
			// fix width for dynamic number of date pickers
			// and adjust position before showing
			offset = $.tm_datepicker._checkOffset( inst, offset, isFixed );
			inst.dpDiv.css( {
				position: $.tm_datepicker._inDialog && $.blockUI ? 'static' : isFixed ? 'fixed' : 'absolute',
				display: 'none',
				left: offset.left + 'px',
				top: offset.top + 'px'
			} );

			if ( ! inst.inline ) {
				showAnim = $.tm_datepicker._get( inst, 'showAnim' );
				duration = $.tm_datepicker._get( inst, 'duration' );
				inst.dpDiv.css( 'z-index', datepicker_getZindex( $( input ) ) + 1 );
				$.tm_datepicker._datepickerShowing = true;

				if ( $.effects && $.effects.effect[ showAnim ] ) {
					inst.dpDiv.show( showAnim, $.tm_datepicker._get( inst, 'showOptions' ), duration );
				} else {
					inst.dpDiv[ showAnim || 'show' ]( showAnim ? duration : null );
				}

				if ( $.tm_datepicker._shouldFocusInput( inst ) ) {
					inst.input.trigger( 'focus' );
				}

				$.tm_datepicker._curInst = inst;
			}
		},

		/* Generate the date picker content. */
		_updateDatepicker: function( inst ) {
			var origyearshtml;
			var numMonths;
			var cols;
			var width = 17;
			var activeCell;

			this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
			datepicker_instActive = inst; // for delegate hover events
			inst.dpDiv.empty().append( this._generateHTML( inst ) );
			this._attachHandlers( inst );

			numMonths = this._getNumberOfMonths( inst );
			cols = numMonths[ 1 ];
			activeCell = inst.dpDiv.find( '.' + this._dayOverClass + ' a' );

			if ( activeCell.length > 0 ) {
				datepicker_handleMouseover.apply( activeCell.get( 0 ), [ activeCell.get( 0 ) ] );
			}

			inst.dpDiv.removeClass( 'ui-tm-datepicker-multi-2 ui-tm-datepicker-multi-3 ui-tm-datepicker-multi-4' ).width( '' );
			if ( cols > 1 ) {
				inst.dpDiv.addClass( 'ui-tm-datepicker-multi-' + cols ).css( 'width', ( width * cols ) + 'em' );
			}
			inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? 'add' : 'remove' ) + 'Class' ]( 'ui-tm-datepicker-multi' );
			inst.dpDiv[ ( this._get( inst, 'isRTL' ) ? 'add' : 'remove' ) + 'Class' ]( 'ui-tm-datepicker-rtl' );

			if ( inst === $.tm_datepicker._curInst && $.tm_datepicker._datepickerShowing && $.tm_datepicker._shouldFocusInput( inst ) ) {
				inst.input.trigger( 'focus' );
			}

			// deffered render of the years select (to avoid flashes on Firefox)
			if ( inst.yearshtml ) {
				origyearshtml = inst.yearshtml;
				setTimeout( function() {
					//assure that inst.yearshtml didn't change.
					if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
						inst.dpDiv.find( 'select.ui-tm-datepicker-year:first' ).replaceWith( inst.yearshtml );
					}
					origyearshtml = null;
					inst.yearshtml = null;
				}, 0 );
			}
		},

		// #6694 - don't focus the input if it's already focused
		// this breaks the change event in IE
		// Support: IE and jQuery <1.9
		_shouldFocusInput: function( inst ) {
			return inst.input && inst.input.is( ':visible' ) && ! inst.input.is( ':disabled' ) && ! inst.input.is( ':focus' );
		},

		/* Check positioning to remain on screen. */
		_checkOffset: function( inst, offset, isFixed ) {
			var dpWidth = inst.dpDiv.outerWidth(),
				dpHeight = inst.dpDiv.outerHeight(),
				inputWidth = inst.input ? inst.input.outerWidth() : 0,
				inputHeight = inst.input ? inst.input.outerHeight() : 0,
				viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
				viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );

			offset.left -= this._get( inst, 'isRTL' ) ? dpWidth - inputWidth : 0;
			offset.left -= isFixed && offset.left === inst.input.offset().left ? $( document ).scrollLeft() : 0;
			offset.top -= isFixed && offset.top === inst.input.offset().top + inputHeight ? $( document ).scrollTop() : 0;

			// Now check if datepicker is showing outside window viewport - move to a better place if so.
			offset.left -= Math.min( offset.left, offset.left + dpWidth > viewWidth && viewWidth > dpWidth ? Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
			offset.top -= Math.min( offset.top, offset.top + dpHeight > viewHeight && viewHeight > dpHeight ? Math.abs( dpHeight + inputHeight ) : 0 );

			return offset;
		},

		/* Find an object's position on the screen. */
		_findPos: function( obj ) {
			var position,
				inst = this._getInst( obj ),
				isRTL = this._get( inst, 'isRTL' );

			while ( obj && ( obj.type === 'hidden' || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
				obj = obj[ isRTL ? 'previousSibling' : 'nextSibling' ];
			}

			position = $( obj ).offset();
			return [ position.left, position.top ];
		},

		/* Hide the date picker from view.
		 * @param  input  element - the input field attached to the date picker
		 */
		_hideDatepicker: function( input ) {
			var showAnim,
				duration,
				postProcess,
				onClose,
				inst = this._curInst;

			if ( ! inst || ( input && inst !== $.data( input, 'datepicker' ) ) ) {
				return;
			}

			if ( this._datepickerShowing ) {
				showAnim = this._get( inst, 'showAnim' );
				duration = this._get( inst, 'duration' );
				postProcess = function() {
					$.tm_datepicker._tidyDialog( inst );
				};

				// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
				if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
					inst.dpDiv.hide( showAnim, $.tm_datepicker._get( inst, 'showOptions' ), duration, postProcess );
				} else {
					inst.dpDiv[ showAnim === 'slideDown' ? 'slideUp' : showAnim === 'fadeIn' ? 'fadeOut' : 'hide' ]( showAnim ? duration : null, postProcess );
				}

				if ( ! showAnim ) {
					postProcess();
				}
				this._datepickerShowing = false;

				onClose = this._get( inst, 'onClose' );
				if ( onClose ) {
					onClose.apply( inst.input ? inst.input[ 0 ] : null, [ inst.input ? inst.input.val() : '', inst ] );
				}

				this._lastInput = null;
				if ( this._inDialog ) {
					this._dialogInput.css( { position: 'absolute', left: '0', top: '-100px' } );
					if ( $.blockUI ) {
						$.unblockUI();
						$( 'body' ).append( this.dpDiv );
					}
				}
				this._inDialog = false;
			}
		},

		/* Tidy up after a dialog display. */
		_tidyDialog: function( inst ) {
			inst.dpDiv.removeClass( this._dialogClass ).off( '.ui-tm-datepicker-calendar' );
		},

		/* Close date picker if clicked elsewhere. */
		_checkExternalClick: function( event ) {
			var $target;
			var inst;

			if ( ! $.tm_datepicker._curInst ) {
				return;
			}

			$target = $( event.target );
			inst = $.tm_datepicker._getInst( $target[ 0 ] );

			if ( ( $target[ 0 ].id !== $.tm_datepicker._mainDivId && $target.parents( '#' + $.tm_datepicker._mainDivId ).length === 0 && ! $target.hasClass( $.tm_datepicker.markerClassName ) && ! $target.closest( '.' + $.tm_datepicker._triggerClass ).length && $.tm_datepicker._datepickerShowing && ! ( $.tm_datepicker._inDialog && $.blockUI ) ) || ( $target.hasClass( $.tm_datepicker.markerClassName ) && $.tm_datepicker._curInst !== inst ) ) {
				$.tm_datepicker._hideDatepicker();
			}
		},

		/* Adjust one of the date sub-fields. */
		_adjustDate: function( id, offset, period ) {
			var target = $( id ),
				inst = this._getInst( target[ 0 ] );

			if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
				return;
			}
			this._adjustInstDate(
				inst,
				offset + ( period === 'M' ? this._get( inst, 'showCurrentAtPos' ) : 0 ), // undo positioning
				period
			);
			this._updateDatepicker( inst );
		},

		/* Action for current link. */
		_gotoToday: function( id ) {
			var date,
				target = $( id ),
				inst = this._getInst( target[ 0 ] );

			if ( this._get( inst, 'gotoCurrent' ) && inst.currentDay ) {
				inst.selectedDay = inst.currentDay;
				inst.drawMonth = inst.currentMonth;
				inst.selectedMonth = inst.currentMonth;
				inst.drawYear = inst.currentYear;
				inst.selectedYear = inst.currentYear;
			} else {
				date = new Date();
				inst.selectedDay = date.getDate();
				inst.drawMonth = date.getMonth();
				inst.selectedMonth = inst.drawMonth;
				inst.drawYear = date.getFullYear();
				inst.selectedYear = inst.drawYear;
			}
			this._notifyChange( inst );
			this._adjustDate( target );
		},

		/* Action for selecting a new month/year. */
		_selectMonthYear: function( id, select, period ) {
			var target = $( id ),
				inst = this._getInst( target[ 0 ] );

			inst[ 'selected' + ( period === 'M' ? 'Month' : 'Year' ) ] = parseInt( select.options[ select.selectedIndex ].value, 10 );
			inst[ 'draw' + ( period === 'M' ? 'Month' : 'Year' ) ] = parseInt( select.options[ select.selectedIndex ].value, 10 );

			this._notifyChange( inst );
			this._adjustDate( target );
		},

		/* Action for selecting a day. */
		_selectDay: function( id, month, year, td ) {
			var inst,
				target = $( id );

			if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
				return;
			}

			inst = this._getInst( target[ 0 ] );
			inst.selectedDay = $( 'a', td ).html();
			inst.currentDay = inst.selectedDay;
			inst.selectedMonth = month;
			inst.currentMonth = month;
			inst.selectedYear = year;
			inst.currentYear = year;
			this._selectDate( id, this._formatDate( inst, inst.currentDay, inst.currentMonth, inst.currentYear ) );
		},

		/* Erase the input field and hide the date picker. */
		_clearDate: function( id ) {
			var target = $( id );
			this._selectDate( target, '' );
		},

		/* Update the input field with the selected date. */
		_selectDate: function( id, dateStr ) {
			var onSelect,
				target = $( id ),
				inst = this._getInst( target[ 0 ] );

			dateStr = dateStr !== null ? dateStr : this._formatDate( inst );
			if ( inst.input ) {
				inst.input.val( dateStr );
			}
			this._updateAlternate( inst );

			onSelect = this._get( inst, 'onSelect' );
			if ( onSelect ) {
				onSelect.apply( inst.input ? inst.input[ 0 ] : null, [ dateStr, inst ] ); // trigger custom callback
			} else if ( inst.input ) {
				inst.input.trigger( 'change' ); // fire the change event
			}

			if ( inst.inline ) {
				this._updateDatepicker( inst );
			} else {
				this._hideDatepicker();
				this._lastInput = inst.input[ 0 ];
				if ( typeof inst.input[ 0 ] !== 'object' ) {
					inst.input.trigger( 'focus' ); // restore focus
				}
				this._lastInput = null;
			}
		},

		/* Update any alternate field to synchronise with the main field. */
		_updateAlternate: function( inst ) {
			var altFormat,
				date,
				dateStr,
				altField = this._get( inst, 'altField' );

			if ( altField ) {
				// update alternate field too
				altFormat = this._get( inst, 'altFormat' ) || this._get( inst, 'dateFormat' );
				date = this._getDate( inst );
				dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
				$( altField ).val( dateStr );
			}
		},

		/* Set as beforeShowDay function to prevent selection of weekends.
		 * @param  date  Date - the date to customise
		 * @return [boolean, string] - is this date selectable?, what is its CSS class?
		 */
		noWeekends: function( date ) {
			var day = date.getDay();
			return [ day > 0 && day < 6, '' ];
		},

		/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
		 * @param  date  Date - the date to get the week for
		 * @return  number - the number of the week within the year that contains this date
		 */
		iso8601Week: function( date ) {
			var time,
				checkDate = new Date( date.getTime() );

			// Find Thursday of this week starting on Monday
			checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );

			time = checkDate.getTime();
			checkDate.setMonth( 0 ); // Compare with Jan 1
			checkDate.setDate( 1 );
			return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
		},

		/* Parse a string value into a date object.
		 * See formatDate below for the possible formats.
		 *
		 * @param  format string - the expected format of the date
		 * @param  value string - the date in the above format
		 * @param  settings Object - attributes include:
		 *                  shortYearCutoff  number - the cutoff year for determining the century (optional)
		 *                  dayNamesShort   string[7] - abbreviated names of the days from Sunday (optional)
		 *                  dayNames        string[7] - names of the days from Sunday (optional)
		 *                  monthNamesShort string[12] - abbreviated names of the months (optional)
		 *                  monthNames      string[12] - names of the months (optional)
		 * @return  Date - the extracted date value or null if value is blank
		 */
		parseDate: function( format, value, settings ) {
			var iFormat;
			var dim;
			var extra;
			var iValue = 0;
			var shortYearCutoffTemp;
			var shortYearCutoff;
			var dayNamesShort;
			var dayNames;
			var monthNamesShort;
			var monthNames;
			var year = -1;
			var month = -1;
			var day = -1;
			var doy = -1;
			var literal = false;
			var date;
			var lookAhead;
			var getNumber;
			var getName;
			var checkLiteral;
			var condition;

			if ( format === null || value === null ) {
				throw 'Invalid arguments';
			}

			value = typeof value === 'object' ? value.toString() : value + '';
			if ( value === '' ) {
				return null;
			}

			shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff;
			shortYearCutoff = typeof shortYearCutoffTemp !== 'string' ? shortYearCutoffTemp : ( new Date().getFullYear() % 100 ) + parseInt( shortYearCutoffTemp, 10 );
			dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort;
			dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames;
			monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort;
			monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames;

			// Check whether a format character is doubled
			lookAhead = function( match ) {
				var matches = iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match;
				if ( matches ) {
					iFormat = iFormat + 1;
				}
				return matches;
			};

			// Extract a number from the string value
			getNumber = function( match ) {
				var isDoubled = lookAhead( match ),
					size = match === '@' ? 14 : match === '!' ? 20 : match === 'y' && isDoubled ? 4 : match === 'o' ? 3 : 2,
					minSize = match === 'y' ? size : 1,
					digits = new RegExp( '^\\d{' + minSize + ',' + size + '}' ),
					num = value.substring( iValue ).match( digits );
				if ( ! num ) {
					throw 'Missing number at position ' + iValue;
				}
				iValue += num[ 0 ].length;
				return parseInt( num[ 0 ], 10 );
			};

			// Extract a name from the string value and convert to an index
			getName = function( match, shortNames, longNames ) {
				var index = -1,
					names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
						return [ [ k, v ] ];
					} ).sort( function( a, b ) {
						return -( a[ 1 ].length - b[ 1 ].length );
					} );

				$.each( names, function( i, pair ) {
					var name = pair[ 1 ];
					if ( value.substring( iValue, parseInt( iValue, 10 ) + name.length ).toLowerCase() === name.toLowerCase() ) {
						index = pair[ 0 ];
						iValue += name.length;
						return false;
					}
				} );
				if ( index !== -1 ) {
					return index + 1;
				}
				throw 'Unknown name at position ' + iValue;
			};

			// Confirm that a literal character matches the string value
			checkLiteral = function() {
				if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
					throw 'Unexpected literal at position ' + iValue;
				}
				iValue = iValue + 1;
			};

			for ( iFormat = 0; iFormat < format.length; iFormat += 1 ) {
				if ( literal ) {
					if ( format.charAt( iFormat ) === "'" && ! lookAhead( "'" ) ) {
						literal = false;
					} else {
						checkLiteral();
					}
				} else {
					switch ( format.charAt( iFormat ) ) {
						case 'd':
							day = getNumber( 'd' );
							break;
						case 'D':
							getName( 'D', dayNamesShort, dayNames );
							break;
						case 'o':
							doy = getNumber( 'o' );
							break;
						case 'm':
							month = getNumber( 'm' );
							break;
						case 'M':
							month = getName( 'M', monthNamesShort, monthNames );
							break;
						case 'y':
							year = getNumber( 'y' );
							break;
						case '@':
							date = new Date( getNumber( '@' ) );
							year = date.getFullYear();
							month = date.getMonth() + 1;
							day = date.getDate();
							break;
						case '!':
							date = new Date( ( getNumber( '!' ) - this._ticksTo1970 ) / 10000 );
							year = date.getFullYear();
							month = date.getMonth() + 1;
							day = date.getDate();
							break;
						case "'":
							if ( lookAhead( "'" ) ) {
								checkLiteral();
							} else {
								literal = true;
							}
							break;
						default:
							checkLiteral();
					}
				}
			}

			if ( iValue < value.length ) {
				extra = value.substring( iValue );
				if ( ! /^\s+/.test( extra ) ) {
					throw 'Extra/unparsed characters found in date: ' + extra;
				}
			}

			if ( year === -1 ) {
				year = new Date().getFullYear();
			} else if ( year < 100 ) {
				year += new Date().getFullYear() - ( new Date().getFullYear() % 100 ) + ( year <= shortYearCutoff ? 0 : -100 );
			}

			if ( doy > -1 ) {
				month = 1;
				day = doy;
				condition = true;
				do {
					dim = this._getDaysInMonth( year, month - 1 );
					if ( day <= dim ) {
						condition = false;
					} else {
						month = month + 1;
						day -= dim;
					}
				} while ( condition );
			}

			date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
			if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
				throw 'Invalid date'; // E.g. 31/02/00
			}
			return date;
		},

		/* Standard date formats. */
		ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
		COOKIE: 'D, dd M yy',
		ISO_8601: 'yy-mm-dd',
		RFC_822: 'D, d M y',
		RFC_850: 'DD, dd-M-y',
		RFC_1036: 'D, d M y',
		RFC_1123: 'D, d M yy',
		RFC_2822: 'D, d M yy',
		RSS: 'D, d M y', // RFC 822
		TICKS: '!',
		TIMESTAMP: '@',
		W3C: 'yy-mm-dd', // ISO 8601

		_ticksTo1970: ( ( ( 1970 - 1 ) * 365 ) + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) + Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000,

		/* Format a date object into a string value.
		 * The format can be combinations of the following:
		 * d  - day of month (no leading zero)
		 * dd - day of month (two digit)
		 * o  - day of year (no leading zeros)
		 * oo - day of year (three digit)
		 * D  - day name short
		 * DD - day name long
		 * m  - month of year (no leading zero)
		 * mm - month of year (two digit)
		 * M  - month name short
		 * MM - month name long
		 * y  - year (two digit)
		 * yy - year (four digit)
		 * @ - Unix timestamp (ms since 01/01/1970)
		 * ! - Windows ticks (100ns since 01/01/0001)
		 * "..." - literal text
		 * '' - single quote
		 *
		 * @param  format string - the desired format of the date
		 * @param  date Date - the date value to format
		 * @param  settings Object - attributes include:
		 *                  dayNamesShort   string[7] - abbreviated names of the days from Sunday (optional)
		 *                  dayNames        string[7] - names of the days from Sunday (optional)
		 *                  monthNamesShort string[12] - abbreviated names of the months (optional)
		 *                  monthNames      string[12] - names of the months (optional)
		 * @return  string - the date in the above format
		 */
		formatDate: function( format, date, settings ) {
			var iFormat,
				dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
				dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
				monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
				monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
				// Check whether a format character is doubled
				lookAhead = function( match ) {
					var matches = iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match;
					if ( matches ) {
						iFormat = iFormat + 1;
					}
					return matches;
				},
				// Format a number, with leading zero if necessary
				formatNumber = function( match, value, len ) {
					var num = '' + value;
					if ( lookAhead( match ) ) {
						while ( num.length < len ) {
							num = '0' + num;
						}
					}
					return num;
				},
				// Format a name, short or long as requested
				formatName = function( match, value, shortNames, longNames ) {
					return lookAhead( match ) ? longNames[ value ] : shortNames[ value ];
				},
				output = '',
				literal = false;

			if ( ! date ) {
				return '';
			}

			if ( date ) {
				for ( iFormat = 0; iFormat < format.length; iFormat += 1 ) {
					if ( literal ) {
						if ( format.charAt( iFormat ) === "'" && ! lookAhead( "'" ) ) {
							literal = false;
						} else {
							output += format.charAt( iFormat );
						}
					} else {
						switch ( format.charAt( iFormat ) ) {
							case 'd':
								output += formatNumber( 'd', date.getDate(), 2 );
								break;
							case 'D':
								output += formatName( 'D', date.getDay(), dayNamesShort, dayNames );
								break;
							case 'o':
								output += formatNumber( 'o', Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
								break;
							case 'm':
								output += formatNumber( 'm', date.getMonth() + 1, 2 );
								break;
							case 'M':
								output += formatName( 'M', date.getMonth(), monthNamesShort, monthNames );
								break;
							case 'y':
								output += lookAhead( 'y' ) ? date.getFullYear() : ( date.getFullYear() % 100 < 10 ? '0' : '' ) + ( date.getFullYear() % 100 );
								break;
							case '@':
								output += date.getTime();
								break;
							case '!':
								output += ( date.getTime() * 10000 ) + this._ticksTo1970;
								break;
							case "'":
								if ( lookAhead( "'" ) ) {
									output += "'";
								} else {
									literal = true;
								}
								break;
							default:
								output += format.charAt( iFormat );
						}
					}
				}
			}
			return output;
		},

		/* Extract all possible characters from the date format. */
		_possibleChars: function( format ) {
			var iFormat,
				chars = '',
				literal = false,
				// Check whether a format character is doubled
				lookAhead = function( match ) {
					var matches = iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match;
					if ( matches ) {
						iFormat = iFormat + 1;
					}
					return matches;
				};

			for ( iFormat = 0; iFormat < format.length; iFormat += 1 ) {
				if ( literal ) {
					if ( format.charAt( iFormat ) === "'" && ! lookAhead( "'" ) ) {
						literal = false;
					} else {
						chars += format.charAt( iFormat );
					}
				} else {
					switch ( format.charAt( iFormat ) ) {
						case 'd':
						case 'm':
						case 'y':
						case '@':
							chars += '0123456789';
							break;
						case 'D':
						case 'M':
							return null; // Accept anything
						case "'":
							if ( lookAhead( "'" ) ) {
								chars += "'";
							} else {
								literal = true;
							}
							break;
						default:
							chars += format.charAt( iFormat );
					}
				}
			}
			return chars;
		},

		/* Get a setting value, defaulting if necessary. */
		_get: function( inst, name ) {
			return inst.settings[ name ] !== undefined ? inst.settings[ name ] : this._defaults[ name ];
		},

		/* Parse existing date and initialise date picker. */
		_setDateFromField: function( inst, noDefault ) {
			var dateFormat;
			var dates;
			var defaultDate;
			var date;
			var settings;

			if ( inst.input.val() === inst.lastVal ) {
				return;
			}

			dateFormat = this._get( inst, 'dateFormat' );
			dates = inst.input ? inst.input.val() : null;
			defaultDate = this._getDefaultDate( inst );
			date = defaultDate;
			settings = this._getFormatConfig( inst );

			inst.lastVal = dates;

			try {
				date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
			} catch ( event ) {
				dates = noDefault ? '' : dates;
			}
			inst.selectedDay = date.getDate();
			inst.selectedMonth = date.getMonth();
			inst.drawMonth = inst.selectedMonth;
			inst.selectedYear = date.getFullYear();
			inst.drawYear = inst.selectedYear;
			inst.currentDay = dates ? date.getDate() : 0;
			inst.currentMonth = dates ? date.getMonth() : 0;
			inst.currentYear = dates ? date.getFullYear() : 0;
			this._adjustInstDate( inst );
		},

		/* Retrieve the default date shown on opening. */
		_getDefaultDate: function( inst ) {
			return this._restrictMinMax( inst, this._determineDate( inst, this._get( inst, 'defaultDate' ), new Date() ) );
		},

		/* A date may be specified as an exact value or a relative one. */
		_determineDate: function( inst, date, defaultDate ) {
			var offsetNumeric = function( offset ) {
					var sdate = new Date();
					sdate.setDate( sdate.getDate() + offset );
					return sdate;
				},
				offsetString = function( offset ) {
					var sdate;
					var year;
					var month;
					var day;
					var pattern;
					var matches;

					try {
						return $.tm_datepicker.parseDate( $.tm_datepicker._get( inst, 'dateFormat' ), offset, $.tm_datepicker._getFormatConfig( inst ) );
					} catch ( e ) {
						// Ignore
					}

					sdate = ( offset.toLowerCase().match( /^c/ ) ? $.tm_datepicker._getDate( inst ) : null ) || new Date();
					year = sdate.getFullYear();
					month = sdate.getMonth();
					day = sdate.getDate();
					pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
					matches = pattern.exec( offset );

					while ( matches ) {
						switch ( matches[ 2 ] || 'd' ) {
							case 'd':
							case 'D':
								day += parseInt( matches[ 1 ], 10 );
								break;
							case 'w':
							case 'W':
								day += parseInt( matches[ 1 ], 10 ) * 7;
								break;
							case 'm':
							case 'M':
								month += parseInt( matches[ 1 ], 10 );
								day = Math.min( day, $.tm_datepicker._getDaysInMonth( year, month ) );
								break;
							case 'y':
							case 'Y':
								year += parseInt( matches[ 1 ], 10 );
								day = Math.min( day, $.tm_datepicker._getDaysInMonth( year, month ) );
								break;
						}
						matches = pattern.exec( offset );
					}
					return new Date( year, month, day );
				},
				newDate = date === null || date === '' ? defaultDate : typeof date === 'string' ? offsetString( date ) : typeof date === 'number' ? ( ! Number.isFinite( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() );

			newDate = newDate && newDate.toString() === 'Invalid Date' ? defaultDate : newDate;
			if ( newDate ) {
				newDate.setHours( 0 );
				newDate.setMinutes( 0 );
				newDate.setSeconds( 0 );
				newDate.setMilliseconds( 0 );
			}
			return this._daylightSavingAdjust( newDate );
		},

		/* Handle switch to/from daylight saving.
		 * Hours may be non-zero on daylight saving cut-over:
		 * > 12 when midnight changeover, but then cannot generate
		 * midnight datetime, so jump to 1AM, otherwise reset.
		 * @param  date  (Date) the date to check
		 * @return  (Date) the corrected date
		 */
		_daylightSavingAdjust: function( date ) {
			if ( ! date ) {
				return null;
			}
			date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
			return date;
		},

		/* Set the date(s) directly. */
		_setDate: function( inst, date, noChange ) {
			var clear = ! date,
				origMonth = inst.selectedMonth,
				origYear = inst.selectedYear,
				newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );

			inst.currentDay = newDate.getDate();
			inst.selectedDay = inst.currentDay;
			inst.currentMonth = newDate.getMonth();
			inst.drawMonth = inst.currentMonth;
			inst.selectedMonth = inst.currentMonth;
			inst.currentYear = newDate.getFullYear();
			inst.drawYear = inst.currentYear;
			inst.selectedYear = inst.currentYear;
			if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && ! noChange ) {
				this._notifyChange( inst );
			}
			this._adjustInstDate( inst );
			if ( inst.input ) {
				inst.input.val( clear ? '' : this._formatDate( inst ) );
			}
		},

		/* Retrieve the date(s) directly. */
		_getDate: function( inst ) {
			var startDate = ! inst.currentYear || ( inst.input && inst.input.val() === '' ) ? null : this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) );
			return startDate;
		},

		/* Attach the onxxx handlers.  These are declared statically so
		 * they work with static code transformers like Caja.
		 */
		_attachHandlers: function( inst ) {
			var stepMonths = this._get( inst, 'stepMonths' ),
				id = '#' + inst.id.replace( /\\\\/g, '\\' );
			inst.dpDiv.find( '[data-handler]' ).map( function() {
				var handler = {
					prevM: function() {
						$.tm_datepicker._adjustDate( id, -1, 'M' );
					},
					nextM: function() {
						$.tm_datepicker._adjustDate( id, +1, 'M' );
					},
					prevY: function() {
						$.tm_datepicker._adjustDate( id, -1, 'Y' );
					},
					nextY: function() {
						$.tm_datepicker._adjustDate( id, +1, 'Y' );
					},
					prev: function() {
						$.tm_datepicker._adjustDate( id, -stepMonths, 'M' );
					},
					next: function() {
						$.tm_datepicker._adjustDate( id, +stepMonths, 'M' );
					},
					hide: function() {
						$.tm_datepicker._hideDatepicker();
					},
					today: function() {
						/*var tempDate = new Date(),
                         today = $.tm_datepicker._daylightSavingAdjust(
                         new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate()));
                         $.tm_datepicker._setDate(inst, today);
                         $.tm_datepicker._gotoToday(id);*/
					},
					selectDay: function() {
						$.tm_datepicker._selectDay( id, +this.getAttribute( 'data-month' ), +this.getAttribute( 'data-year' ), this );
						return false;
					},
					selectMonth: function() {
						$.tm_datepicker._selectMonthYear( id, this, 'M' );
						return false;
					},
					selectYear: function() {
						$.tm_datepicker._selectMonthYear( id, this, 'Y' );
						return false;
					}
				};
				$( this ).on( this.getAttribute( 'data-event' ), handler[ this.getAttribute( 'data-handler' ) ] );
				return null;
			} );
		},
		/* Determines if we should allow a "next/prev" month display change. */
		_tm_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
			var date = this._daylightSavingAdjust( new Date( curYear, curMonth + offset, 1 ) );

			if ( offset < 0 ) {
				date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
			}
			return this._isInRange( inst, date );
		},

		/* Generate the HTML for the current state of the date picker. */
		_generateHTML: function( inst ) {
			var maxDraw,
				prevText,
				prev,
				nextText,
				next,
				currentText,
				gotoDate,
				firstDay,
				showWeek,
				dayNames,
				dayNamesMin,
				monthNames,
				beforeShowDay,
				showOtherMonths,
				selectOtherMonths,
				defaultDate,
				html,
				dow,
				row,
				group,
				col,
				selectedDate,
				cornerClass,
				calender,
				thead,
				day,
				daysInMonth,
				leadDays,
				curRows,
				numRows,
				printDate,
				dRow,
				tbody,
				daySettings,
				otherMonth,
				unselectable,
				tempDate = new Date(),
				today = this._daylightSavingAdjust( new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
				isRTL = this._get( inst, 'isRTL' ),
				showButtonPanel = this._get( inst, 'showButtonPanel' ),
				hideIfNoPrevNext = this._get( inst, 'hideIfNoPrevNext' ),
				navigationAsDateFormat = this._get( inst, 'navigationAsDateFormat' ),
				numMonths = this._getNumberOfMonths( inst ),
				showCurrentAtPos = this._get( inst, 'showCurrentAtPos' ),
				stepMonths = this._get( inst, 'stepMonths' ),
				isMultiMonth = numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1,
				currentDate = this._daylightSavingAdjust( ! inst.currentDay ? new Date( 9999, 9, 9 ) : new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ),
				minDate = this._getMinMaxDate( inst, 'min' ),
				maxDate = this._getMinMaxDate( inst, 'max' ),
				drawMonth = inst.drawMonth - showCurrentAtPos,
				drawYear = inst.drawYear,
				tm_month,
				tm_year,
				tm_prev_arrow_m,
				tm_next_arrow_m,
				tm_prev_arrow_y,
				tm_next_arrow_y,
				tm_controls,
				tm_buttonPanel;
			var can_adjust_1;
			var can_adjust_2;
			var can_adjust_3;
			var can_adjust_4;

			if ( drawMonth < 0 ) {
				drawMonth += 12;
				drawYear -= 1;
			}
			if ( maxDate ) {
				maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(), maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
				maxDraw = minDate && maxDraw < minDate ? minDate : maxDraw;
				while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
					drawMonth -= 1;
					if ( drawMonth < 0 ) {
						drawMonth = 11;
						drawYear -= 1;
					}
				}
			}
			inst.drawMonth = drawMonth;
			inst.drawYear = drawYear;

			prevText = this._get( inst, 'prevText' );
			prevText = ! navigationAsDateFormat ? prevText : this.formatDate( prevText, this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ), this._getFormatConfig( inst ) );

			prev = this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ? "<a class='ui-tm-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" + " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? 'e' : 'w' ) + "'>" + prevText + '</span></a>' : hideIfNoPrevNext ? '' : "<a class='ui-tm-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? 'e' : 'w' ) + "'>" + prevText + '</span></a>';

			nextText = this._get( inst, 'nextText' );
			nextText = ! navigationAsDateFormat ? nextText : this.formatDate( nextText, this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ), this._getFormatConfig( inst ) );

			next = this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ? "<a class='ui-tm-datepicker-next ui-corner-all' data-handler='next' data-event='click'" + " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? 'w' : 'e' ) + "'>" + nextText + '</span></a>' : hideIfNoPrevNext ? '' : "<a class='ui-tm-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? 'w' : 'e' ) + "'>" + nextText + '</span></a>';

			currentText = this._get( inst, 'currentText' );
			gotoDate = this._get( inst, 'gotoCurrent' ) && inst.currentDay ? currentDate : today;
			currentText = ! navigationAsDateFormat ? currentText : this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) );

			tm_controls = ! inst.inline ? "<div class='tm-ui-dp-btn-wrap tm-ui-dp-close'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-close' data-handler='hide' data-event='click'>" + this._get( inst, 'closeText' ) + '</div></div>' : '';

			tm_buttonPanel = showButtonPanel ? "<div class='tm-ui-dp-buttonpane'>" + ( isRTL ? tm_controls : '' ) + ( this._isInRange( inst, gotoDate ) ? "<div class='tm-ui-dp-btn-wrap tm-ui-dp-current'><div role='button' class='tm-ui-dp-btn ui-tm-datepicker-current' data-handler='today' data-event='click'" + '>' + currentText + '</div></div>' : '' ) + ( isRTL ? '' : tm_controls ) + '</div>' : '';

			firstDay = parseInt( this._get( inst, 'firstDay' ), 10 );
			firstDay = isNaN( firstDay ) ? 0 : firstDay;

			showWeek = this._get( inst, 'showWeek' );
			dayNames = this._get( inst, 'dayNames' );
			dayNamesMin = this._get( inst, 'dayNamesMin' );
			monthNames = this._get( inst, 'monthNames' );
			//monthNamesShort = this._get(inst, "monthNamesShort");
			beforeShowDay = this._get( inst, 'beforeShowDay' );
			showOtherMonths = this._get( inst, 'showOtherMonths' );
			selectOtherMonths = this._get( inst, 'selectOtherMonths' );
			defaultDate = this._getDefaultDate( inst );
			html = '';

			can_adjust_1 = this._tm_canAdjustMonth( inst, -1, drawYear, drawMonth );
			can_adjust_2 = this._tm_canAdjustMonth( inst, +1, drawYear, drawMonth );
			can_adjust_3 = this._tm_canAdjustMonth( inst, -12, drawYear, drawMonth );
			can_adjust_4 = this._tm_canAdjustMonth( inst, +12, drawYear, drawMonth );

			tm_prev_arrow_m = '<div class="tm-ui-dp-button-prev tm-ui-dp-button">' + '<div ' + ( can_adjust_1 ? 'data-handler="prevM" data-event="click" ' : '' ) + 'aria-label="' + prevText + '" class="' + ( can_adjust_1 ? '' : 'tm-ui-dp-button-disabled ' ) + 'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div>' + '</div>';
			tm_next_arrow_m = '<div class="tm-ui-dp-button-next tm-ui-dp-button">' + '<div ' + ( can_adjust_2 ? 'data-handler="nextM" data-event="click" ' : '' ) + 'aria-label="' + nextText + '" class="' + ( can_adjust_2 ? '' : 'tm-ui-dp-button-disabled ' ) + 'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div>' + '</div>';
			tm_prev_arrow_y = '<div class="tm-ui-dp-button-prev tm-ui-dp-button">' + '<div ' + ( can_adjust_3 ? 'data-handler="prevY" data-event="click" ' : '' ) + 'aria-label="' + prevText + '" class="' + ( can_adjust_3 ? '' : 'tm-ui-dp-button-disabled ' ) + 'tm-ui-dp-button-arrow tcfa tcfa-angle-left" tabindex="0" role="button"></div>' + '</div>';
			tm_next_arrow_y = '<div class="tm-ui-dp-button-next tm-ui-dp-button">' + '<div ' + ( can_adjust_4 ? 'data-handler="nextY" data-event="click" ' : '' ) + 'aria-label="' + nextText + '" class="' + ( can_adjust_4 ? '' : 'tm-ui-dp-button-disabled ' ) + 'tm-ui-dp-button-arrow tcfa tcfa-angle-right" tabindex="0" role="button"></div>' + '</div>';

			tm_month = hideIfNoPrevNext ? '' : '<div class="tm-ui-dp-title-button">' + ( isRTL ? tm_next_arrow_m : tm_prev_arrow_m ) + '<span aria-label="' + monthNames[ drawMonth ] + '" role="button" class="tm-ui-dp-month">' + monthNames[ drawMonth ] + '</span>' + ( isRTL ? tm_prev_arrow_m : tm_next_arrow_m ) + '</div>';

			tm_year = hideIfNoPrevNext ? '' : '<div class="tm-ui-dp-title-button">' + ( isRTL ? tm_next_arrow_y : tm_prev_arrow_y ) + '<span class="tm-ui-dp-year" role="button" aria-label="' + drawYear + '">' + drawYear + '</span>' + ( isRTL ? tm_prev_arrow_y : tm_next_arrow_y ) + '</div>';

			html += "<div class='tm-ui-dp-wrap'>" + "<div class='tm-ui-dp-overlay'></div>" + "<div class='tm-ui-dp'>" + "<div class='tm-ui-dp-container'>" + "<div class='tm-ui-dp-inner-container'>" + "<div class='tm-ui-dp-ui'>" + "<div class='tm-ui-dp-ui-inner'>" + "<div class='tm-ui-dp-main-wrap'>" + "<div class='tm-ui-dp-main'>";

			for ( row = 0; row < numMonths[ 0 ]; row += 1 ) {
				group = '';
				this.maxRows = 4;
				for ( col = 0; col < numMonths[ 1 ]; col += 1 ) {
					selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
					cornerClass = ' ui-corner-all';
					calender = '';
					if ( isMultiMonth ) {
						calender += "<div class='ui-tm-datepicker-group";
						if ( numMonths[ 1 ] > 1 ) {
							switch ( col ) {
								case 0:
									calender += ' ui-tm-datepicker-group-first';
									cornerClass = ' ui-corner-' + ( isRTL ? 'right' : 'left' );
									break;
								case numMonths[ 1 ] - 1:
									calender += ' ui-tm-datepicker-group-last';
									cornerClass = ' ui-corner-' + ( isRTL ? 'left' : 'right' );
									break;
								default:
									calender += ' ui-tm-datepicker-group-middle';
									cornerClass = '';
									break;
							}
						}
						calender += "'>";
					}
					calender +=
						"<div class='tm-ui-dp-header ui-tm-datepicker-header ui-widget-header ui-helper-clearfix" +
						cornerClass +
						"'>" +
						( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : '' ) +
						( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : '' ) +
						// month headers

						'<div class="ui-tm-datepicker-title tm-ui-dp-title">' +
						( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? tm_year + tm_month : tm_month + tm_year ) : '' ) +
						'</div>' +
						'</div>';

					calender += "<div class='tm-ui-dp-main-content'>";

					/* Days start */
					calender += "<div class='tm-ui-dp-main-header-wrap'><div class='tm-ui-dp-main-header'>";
					calender += "<table class='ui-tm-datepicker-calendar'><tbody>" + '<tr>';
					thead = showWeek ? "<th class='ui-tm-datepicker-week-col'>" + this._get( inst, 'weekHeader' ) + '</th>' : '';
					for ( dow = 0; dow < 7; dow += 1 ) {
						// days of the week
						day = ( dow + firstDay ) % 7;
						thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-tm-datepicker-week-end'" : '' ) + '>' + "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + '</span></th>';
					}
					calender += thead + '</tr></tbody></table>';
					calender += '</div></div>';
					/* Days end */

					calender += "<div class='tm-ui-dp-main-table'>";

					daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
					if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
						inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
					}
					leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
					curRows = 6;
					numRows = isMultiMonth ? ( this.maxRows > curRows ? this.maxRows : curRows ) : curRows; //If multiple months, use the higher number of rows
					// (see #7043)
					this.maxRows = numRows;
					printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
					for ( dRow = 0; dRow < numRows; dRow += 1 ) {
						// create date picker rows
						calender += "<div class='tm-ui-dp-main-row'>";
						tbody = ! showWeek ? '' : "<div class='ui-tm-datepicker-week-col'>" + this._get( inst, 'calculateWeek' )( printDate ) + '</div>';
						for ( dow = 0; dow < 7; dow += 1 ) {
							// create date picker days
							daySettings = beforeShowDay ? beforeShowDay.apply( inst.input ? inst.input[ 0 ] : null, [ printDate ] ) : [ true, '' ];
							otherMonth = printDate.getMonth() !== drawMonth;
							unselectable = ( otherMonth && ! selectOtherMonths ) || ! daySettings[ 0 ] || ( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );

							tbody +=
								"<div class='tm-ui-dp-main-cell " +
								( ( dow + firstDay + 6 ) % 7 >= 5 ? ' ui-tm-datepicker-week-end' : '' ) + // highlight weekends
								( otherMonth ? ' ui-tm-datepicker-other-month' : '' ) + // highlight days from other months
								( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || ( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ? ' ' + this._dayOverClass : '' ) +
								( unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled' : '' ) + // highlight unselectable days
								( otherMonth && ! showOtherMonths ? '' : ' ' + daySettings[ 1 ] + ( printDate.getTime() === currentDate.getTime() ? ' ' + this._currentClass : '' ) + ( printDate.getTime() === today.getTime() ? ' ui-tm-datepicker-today' : '' ) ) +
								"'" + // highlight today (if different)
								( ( ! otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, '&#39;' ) + "'" : '' ) + // cell
								// title
								( unselectable ? '' : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) +
								'>' + // actions
								"<div class='tm-ui-dp-main-cell-inner'>" +
								"<div class='tm-ui-dp-main-cell-content'>" +
								( otherMonth && ! showOtherMonths ? '&#xa0;' : unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + '</span>' : "<a class='ui-state-default" + ( printDate.getTime() === today.getTime() ? ' ui-state-highlight' : '' ) + ( printDate.getTime() === currentDate.getTime() ? ' ui-state-active' : '' ) + ( otherMonth ? ' ui-priority-secondary' : '' ) + "' href='#'>" + printDate.getDate() + '</a>' ) +
								'</div></div>' +
								'</div>'; // display selectable date
							printDate.setDate( printDate.getDate() + 1 );
							printDate = this._daylightSavingAdjust( printDate );
						}
						calender += tbody + '</div>';
					}
					drawMonth += 1;
					if ( drawMonth > 11 ) {
						drawMonth = 0;
						drawYear += 1;
					}

					calender += '</div>';

					calender += '</div>' + ( isMultiMonth ? '</div>' + ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ? "<div class='ui-tm-datepicker-row-break'></div>" : '' ) : '' );
					group += calender;
				}
				html += group;
			}
			html += '</div></div></div></div></div>';
			html += tm_buttonPanel;
			html += '</div></div></div>';
			inst._keyEvent = false;
			return html;
		},

		/* Generate the month and year header. */
		_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate, secondary, monthNames, monthNamesShort ) {
			var inMinYear,
				inMaxYear,
				month,
				years,
				thisYear,
				determineYear,
				year,
				endYear,
				changeMonth = this._get( inst, 'changeMonth' ),
				changeYear = this._get( inst, 'changeYear' ),
				showMonthAfterYear = this._get( inst, 'showMonthAfterYear' ),
				html = "<div class='ui-tm-datepicker-title'>",
				monthHtml = '';

			// month selection
			if ( secondary || ! changeMonth ) {
				monthHtml += "<span class='ui-tm-datepicker-month'>" + monthNames[ drawMonth ] + '</span>';
			} else {
				inMinYear = minDate && minDate.getFullYear() === drawYear;
				inMaxYear = maxDate && maxDate.getFullYear() === drawYear;
				monthHtml += "<select class='ui-tm-datepicker-month' data-handler='selectMonth' data-event='change'>";
				for ( month = 0; month < 12; month += 1 ) {
					if ( ( ! inMinYear || month >= minDate.getMonth() ) && ( ! inMaxYear || month <= maxDate.getMonth() ) ) {
						monthHtml += "<option value='" + month + "'" + ( month === drawMonth ? " selected='selected'" : '' ) + '>' + monthNamesShort[ month ] + '</option>';
					}
				}
				monthHtml += '</select>';
			}

			if ( ! showMonthAfterYear ) {
				html += monthHtml + ( secondary || ! ( changeMonth && changeYear ) ? '&#xa0;' : '' );
			}

			// year selection
			if ( ! inst.yearshtml ) {
				inst.yearshtml = '';
				if ( secondary || ! changeYear ) {
					html += "<span class='ui-tm-datepicker-year'>" + drawYear + '</span>';
				} else {
					// determine range of years to display
					years = this._get( inst, 'yearRange' ).split( ':' );
					thisYear = new Date().getFullYear();
					determineYear = function( value ) {
						var syear = value.match( /c[+-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) : value.match( /[+-].*/ ) ? thisYear + parseInt( value, 10 ) : parseInt( value, 10 );
						return isNaN( syear ) ? thisYear : syear;
					};
					year = determineYear( years[ 0 ] );
					endYear = Math.max( year, determineYear( years[ 1 ] || '' ) );
					year = minDate ? Math.max( year, minDate.getFullYear() ) : year;
					endYear = maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear;
					inst.yearshtml += "<select class='ui-tm-datepicker-year' data-handler='selectYear' data-event='change'>";
					for ( ; year <= endYear; year += 1 ) {
						inst.yearshtml += "<option value='" + year + "'" + ( year === drawYear ? " selected='selected'" : '' ) + '>' + year + '</option>';
					}
					inst.yearshtml += '</select>';

					html += inst.yearshtml;
					inst.yearshtml = null;
				}
			}

			html += this._get( inst, 'yearSuffix' );
			if ( showMonthAfterYear ) {
				html += ( secondary || ! ( changeMonth && changeYear ) ? '&#xa0;' : '' ) + monthHtml;
			}
			html += '</div>'; // Close datepicker_header
			return html;
		},

		/* Adjust one of the date sub-fields. */
		_adjustInstDate: function( inst, offset, period ) {
			var year = inst.selectedYear + ( period === 'Y' ? offset : 0 ),
				month = inst.selectedMonth + ( period === 'M' ? offset : 0 ),
				day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === 'D' ? offset : 0 ),
				date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );

			inst.selectedDay = date.getDate();
			inst.selectedMonth = date.getMonth();
			inst.drawMonth = inst.selectedMonth;
			inst.selectedYear = date.getFullYear();
			inst.drawYear = inst.selectedYear;
			if ( period === 'M' || period === 'Y' ) {
				this._notifyChange( inst );
			}
		},

		/* Ensure a date is within any min/max bounds. */
		_restrictMinMax: function( inst, date ) {
			var minDate = this._getMinMaxDate( inst, 'min' ),
				maxDate = this._getMinMaxDate( inst, 'max' ),
				newDate = minDate && date < minDate ? minDate : date;
			return maxDate && newDate > maxDate ? maxDate : newDate;
		},

		/* Notify change of month/year. */
		_notifyChange: function( inst ) {
			var onChange = this._get( inst, 'onChangeMonthYear' );
			if ( onChange ) {
				onChange.apply( inst.input ? inst.input[ 0 ] : null, [ inst.selectedYear, inst.selectedMonth + 1, inst ] );
			}
		},

		/* Determine the number of months to show. */
		_getNumberOfMonths: function( inst ) {
			var numMonths = this._get( inst, 'numberOfMonths' );
			return numMonths === null ? [ 1, 1 ] : typeof numMonths === 'number' ? [ 1, numMonths ] : numMonths;
		},

		/* Determine the current maximum date - ensure no time components are set. */
		_getMinMaxDate: function( inst, minMax ) {
			return this._determineDate( inst, this._get( inst, minMax + 'Date' ), null );
		},

		/* Find the number of days in a given month. */
		_getDaysInMonth: function( year, month ) {
			return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
		},

		/* Find the day of the week of the first of a month. */
		_getFirstDayOfMonth: function( year, month ) {
			return new Date( year, month, 1 ).getDay();
		},

		/* Determines if we should allow a "next/prev" month display change. */
		_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
			var numMonths = this._getNumberOfMonths( inst ),
				date = this._daylightSavingAdjust( new Date( curYear, curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );

			if ( offset < 0 ) {
				date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
			}
			return this._isInRange( inst, date );
		},

		/* Is the given date in the accepted range? */
		_isInRange: function( inst, date ) {
			var yearSplit,
				currentYear,
				minDate = this._getMinMaxDate( inst, 'min' ),
				maxDate = this._getMinMaxDate( inst, 'max' ),
				minYear = null,
				maxYear = null,
				years = this._get( inst, 'yearRange' );
			if ( years ) {
				yearSplit = years.split( ':' );
				currentYear = new Date().getFullYear();
				minYear = parseInt( yearSplit[ 0 ], 10 );
				maxYear = parseInt( yearSplit[ 1 ], 10 );
				if ( yearSplit[ 0 ].match( /[+-].*/ ) ) {
					minYear += currentYear;
				}
				if ( yearSplit[ 1 ].match( /[+-].*/ ) ) {
					maxYear += currentYear;
				}
			}

			return ( ! minDate || date.getTime() >= minDate.getTime() ) && ( ! maxDate || date.getTime() <= maxDate.getTime() ) && ( ! minYear || date.getFullYear() >= minYear ) && ( ! maxYear || date.getFullYear() <= maxYear );
		},

		/* Provide the configuration settings for formatting/parsing. */
		_getFormatConfig: function( inst ) {
			var shortYearCutoff = this._get( inst, 'shortYearCutoff' );
			shortYearCutoff = typeof shortYearCutoff !== 'string' ? shortYearCutoff : ( new Date().getFullYear() % 100 ) + parseInt( shortYearCutoff, 10 );
			return {
				shortYearCutoff: shortYearCutoff,
				dayNamesShort: this._get( inst, 'dayNamesShort' ),
				dayNames: this._get( inst, 'dayNames' ),
				monthNamesShort: this._get( inst, 'monthNamesShort' ),
				monthNames: this._get( inst, 'monthNames' )
			};
		},

		/* Format the given date for display. */
		_formatDate: function( inst, day, month, year ) {
			var date;

			if ( ! day ) {
				inst.currentDay = inst.selectedDay;
				inst.currentMonth = inst.selectedMonth;
				inst.currentYear = inst.selectedYear;
			}
			date = day ? ( typeof day === 'object' ? day : this._daylightSavingAdjust( new Date( year, month, day ) ) ) : this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) );
			return this.formatDate( this._get( inst, 'dateFormat' ), date, this._getFormatConfig( inst ) );
		}
	} );

	/* Invoke the datepicker functionality.
     @param  options  string - a command, optionally followed by additional parameters or
     Object - settings for attaching new datepicker functionality
     @return  jQuery object */
	$.fn.tm_datepicker = function( options ) {
		var otherArgs;

		/* Verify an empty collection wasn't passed - Fixes #6976 */
		if ( ! this.length ) {
			return this;
		}

		/* Initialise the date picker. */
		if ( ! $.tm_datepicker.initialized ) {
			$( document ).on( 'mousedown', $.tm_datepicker._checkExternalClick );
			$.tm_datepicker.initialized = true;
		}

		/* Append datepicker main container to body if not exist. */
		if ( $( '#' + $.tm_datepicker._mainDivId ).length === 0 ) {
			$( 'body' ).append( $.tm_datepicker.dpDiv );
		}

		otherArgs = Array.prototype.slice.call( arguments, 1 );
		if ( typeof options === 'string' && ( options === 'isDisabled' || options === 'getDate' || options === 'widget' ) ) {
			return $.tm_datepicker[ '_' + options + 'Datepicker' ].apply( $.tm_datepicker, [ this[ 0 ] ].concat( otherArgs ) );
		}
		if ( options === 'option' && arguments.length === 2 && typeof arguments[ 1 ] === 'string' ) {
			return $.tm_datepicker[ '_' + options + 'Datepicker' ].apply( $.tm_datepicker, [ this[ 0 ] ].concat( otherArgs ) );
		}
		return this.each( function() {
			if ( typeof options === 'string' ) {
				$.tm_datepicker[ '_' + options + 'Datepicker' ].apply( $.tm_datepicker, [ this ].concat( otherArgs ) );
			} else {
				$.tm_datepicker._attachDatepicker( this, options );
			}
		} );
	};

	$.tm_datepicker = new Datepicker(); // singleton instance
	$.tm_datepicker.initialized = false;
	$.tm_datepicker.uuid = new Date().getTime();
	$.tm_datepicker.version = '1.11.4';
} ) );
assets/js/nouislider.js000064400000250367150755142450011222 0ustar00/*! nouislider - 15.7.1 - 6/14/2023 */
// reformatted code by ThemeComplete
( function( global, factory ) {
	'use strict';

	factory( global.noUiSlider = {} );
}( this, ( function( exports ) {
	'use strict';

	var nouislider;
	//region Defaults
	var defaultFormatter = {
		to: function( value ) {
			return value === undefined ? '' : value.toFixed( 2 );
		},
		from: Number
	};
	var cssClasses = {
		target: 'target',
		base: 'base',
		origin: 'origin',
		handle: 'handle',
		handleLower: 'handle-lower',
		handleUpper: 'handle-upper',
		touchArea: 'touch-area',
		horizontal: 'horizontal',
		vertical: 'vertical',
		background: 'background',
		connect: 'connect',
		connects: 'connects',
		ltr: 'ltr',
		rtl: 'rtl',
		textDirectionLtr: 'txt-dir-ltr',
		textDirectionRtl: 'txt-dir-rtl',
		draggable: 'draggable',
		drag: 'state-drag',
		tap: 'state-tap',
		active: 'active',
		tooltip: 'tooltip',
		pips: 'pips',
		pipsHorizontal: 'pips-horizontal',
		pipsVertical: 'pips-vertical',
		marker: 'marker',
		markerHorizontal: 'marker-horizontal',
		markerVertical: 'marker-vertical',
		markerNormal: 'marker-normal',
		markerLarge: 'marker-large',
		markerSub: 'marker-sub',
		value: 'value',
		valueHorizontal: 'value-horizontal',
		valueVertical: 'value-vertical',
		valueNormal: 'value-normal',
		valueLarge: 'value-large',
		valueSub: 'value-sub'
	};
	// Namespaces of internal event listeners
	var INTERNAL_EVENT_NS = {
		tooltips: '.__tooltips',
		aria: '.__aria'
	};
	//endregion
	//region Spectrum
	var Spectrum = /** @class */ ( function() {
		function Spectrumc( entry, snap, singleStep ) {
			var index;
			var ordered = [];
			this.xPct = [];
			this.xVal = [];
			this.xSteps = [];
			this.xNumSteps = [];
			this.xHighestCompleteStep = [];
			this.xSteps = [ singleStep || false ];
			this.xNumSteps = [ false ];
			this.snap = snap;
			// Map the object keys to an array.
			Object.keys( entry ).forEach( function( iindex ) {
				ordered.push( [ asArray( entry[ iindex ] ), iindex ] );
			} );
			// Sort all entries by value (numeric sort).
			ordered.sort( function( a, b ) {
				return a[ 0 ][ 0 ] - b[ 0 ][ 0 ];
			} );
			// Convert all entries to subranges.
			for ( index = 0; index < ordered.length; index++ ) {
				this.handleEntryPoint( ordered[ index ][ 1 ], ordered[ index ][ 0 ] );
			}
			// Store the actual step values.
			// xSteps is sorted in the same order as xPct and xVal.
			this.xNumSteps = this.xSteps.slice( 0 );
			// Convert all numeric steps to the percentage of the subrange they represent.
			for ( index = 0; index < this.xNumSteps.length; index++ ) {
				this.handleStepPoint( index, this.xNumSteps[ index ] );
			}
		}
		Spectrumc.prototype.getDistance = function( value ) {
			var index;
			var distances = [];
			for ( index = 0; index < this.xNumSteps.length - 1; index++ ) {
				distances[ index ] = fromPercentage( this.xVal, value, index );
			}
			return distances;
		};
		// Calculate the percentual distance over the whole scale of ranges.
		// direction: 0 = backwards / 1 = forwards
		Spectrumc.prototype.getAbsoluteDistance = function( value, distances, direction ) {
			var xPct_index = 0;
			var start_factor;
			var rest_factor = 1;
			var rest_rel_distance;
			var range_pct = 0;
			var rel_range_distance = 0;
			var abs_distance_counter = 0;
			var range_counter = 0;

			// Calculate range where to start calculation
			if ( value < this.xPct[ this.xPct.length - 1 ] ) {
				while ( value > this.xPct[ xPct_index + 1 ] ) {
					xPct_index++;
				}
			} else if ( value === this.xPct[ this.xPct.length - 1 ] ) {
				xPct_index = this.xPct.length - 2;
			}
			// If looking backwards and the value is exactly at a range separator then look one range further
			if ( ! direction && value === this.xPct[ xPct_index + 1 ] ) {
				xPct_index++;
			}
			if ( distances === null ) {
				distances = [];
			}
			rest_rel_distance = distances[ xPct_index ];

			// Calculate what part of the start range the value is
			if ( direction ) {
				start_factor = ( value - this.xPct[ xPct_index ] ) / ( this.xPct[ xPct_index + 1 ] - this.xPct[ xPct_index ] );
			} else {
				start_factor = ( this.xPct[ xPct_index + 1 ] - value ) / ( this.xPct[ xPct_index + 1 ] - this.xPct[ xPct_index ] );
			}
			// Do until the complete distance across ranges is calculated
			while ( rest_rel_distance > 0 ) {
				// Calculate the percentage of total range
				range_pct = this.xPct[ xPct_index + 1 + range_counter ] - this.xPct[ xPct_index + range_counter ];
				// Detect if the margin, padding or limit is larger then the current range and calculate
				if ( ( distances[ xPct_index + range_counter ] * rest_factor ) + 100 - ( start_factor * 100 ) > 100 ) {
					// If larger then take the percentual distance of the whole range
					rel_range_distance = range_pct * start_factor;
					// Rest factor of relative percentual distance still to be calculated
					rest_factor = ( rest_rel_distance - ( 100 * start_factor ) ) / distances[ xPct_index + range_counter ];
					// Set start factor to 1 as for next range it does not apply.
					start_factor = 1;
				} else {
					// If smaller or equal then take the percentual distance of the calculate percentual part of that range
					rel_range_distance = ( ( distances[ xPct_index + range_counter ] * range_pct ) / 100 ) * rest_factor;
					// No rest left as the rest fits in current range
					rest_factor = 0;
				}
				if ( direction ) {
					abs_distance_counter = abs_distance_counter - rel_range_distance;
					// Limit range to first range when distance becomes outside of minimum range
					if ( this.xPct.length + range_counter >= 1 ) {
						range_counter--;
					}
				} else {
					abs_distance_counter = abs_distance_counter + rel_range_distance;
					// Limit range to last range when distance becomes outside of maximum range
					if ( this.xPct.length - range_counter >= 1 ) {
						range_counter++;
					}
				}
				// Rest of relative percentual distance still to be calculated
				rest_rel_distance = distances[ xPct_index + range_counter ] * rest_factor;
			}
			return value + abs_distance_counter;
		};
		Spectrumc.prototype.toStepping = function( value ) {
			value = toStepping( this.xVal, this.xPct, value );
			return value;
		};
		Spectrumc.prototype.fromStepping = function( value ) {
			return fromStepping( this.xVal, this.xPct, value );
		};
		Spectrumc.prototype.getStep = function( value ) {
			value = getStep( this.xPct, this.xSteps, this.snap, value );
			return value;
		};
		Spectrumc.prototype.getDefaultStep = function( value, isDown, size ) {
			var j = getJ( value, this.xPct );
			// When at the top or stepping down, look at the previous sub-range
			if ( value === 100 || ( isDown && value === this.xPct[ j - 1 ] ) ) {
				j = Math.max( j - 1, 1 );
			}
			return ( this.xVal[ j ] - this.xVal[ j - 1 ] ) / size;
		};
		Spectrumc.prototype.getNearbySteps = function( value ) {
			var j = getJ( value, this.xPct );
			return {
				stepBefore: {
					startValue: this.xVal[ j - 2 ],
					step: this.xNumSteps[ j - 2 ],
					highestStep: this.xHighestCompleteStep[ j - 2 ]
				},
				thisStep: {
					startValue: this.xVal[ j - 1 ],
					step: this.xNumSteps[ j - 1 ],
					highestStep: this.xHighestCompleteStep[ j - 1 ]
				},
				stepAfter: {
					startValue: this.xVal[ j ],
					step: this.xNumSteps[ j ],
					highestStep: this.xHighestCompleteStep[ j ]
				}
			};
		};
		Spectrumc.prototype.countStepDecimals = function() {
			var stepDecimals = this.xNumSteps.map( countDecimals );
			return Math.max.apply( null, stepDecimals );
		};
		Spectrumc.prototype.hasNoSize = function() {
			return this.xVal[ 0 ] === this.xVal[ this.xVal.length - 1 ];
		};
		// Outside testing
		Spectrumc.prototype.convert = function( value ) {
			return this.getStep( this.toStepping( value ) );
		};
		Spectrumc.prototype.handleEntryPoint = function( index, value ) {
			var percentage;
			var value1;
			// Covert min/max syntax to 0 and 100.
			if ( index === 'min' ) {
				percentage = 0;
			} else if ( index === 'max' ) {
				percentage = 100;
			} else {
				percentage = parseFloat( index );
			}
			// Check for correct input.
			if ( ! isNumeric( percentage ) || ! isNumeric( value[ 0 ] ) ) {
				throw new Error( "noUiSlider: 'range' value isn't numeric." );
			}
			// Store values.
			this.xPct.push( percentage );
			this.xVal.push( value[ 0 ] );
			value1 = Number( value[ 1 ] );
			// NaN will evaluate to false too, but to keep
			// logging clear, set step explicitly. Make sure
			// not to override the 'step' setting with false.
			if ( ! percentage ) {
				if ( ! isNaN( value1 ) ) {
					this.xSteps[ 0 ] = value1;
				}
			} else {
				this.xSteps.push( isNaN( value1 ) ? false : value1 );
			}
			this.xHighestCompleteStep.push( 0 );
		};
		Spectrumc.prototype.handleStepPoint = function( i, n ) {
			var totalSteps;
			var highestStep;
			var step;
			// Ignore 'false' stepping.
			if ( ! n ) {
				return;
			}
			// Step over zero-length ranges (#948);
			if ( this.xVal[ i ] === this.xVal[ i + 1 ] ) {
				this.xSteps[ i ] = this.xHighestCompleteStep[ i ] = this.xVal[ i ];
				return;
			}
			// Factor to range ratio
			this.xSteps[ i ] =
                fromPercentage( [ this.xVal[ i ], this.xVal[ i + 1 ] ], n, 0 ) / subRangeRatio( this.xPct[ i ], this.xPct[ i + 1 ] );
			totalSteps = ( this.xVal[ i + 1 ] - this.xVal[ i ] ) / this.xNumSteps[ i ];
			highestStep = Math.ceil( Number( totalSteps.toFixed( 3 ) ) - 1 );
			step = this.xVal[ i ] + ( this.xNumSteps[ i ] * highestStep );
			this.xHighestCompleteStep[ i ] = step;
		};
		return Spectrumc;
	}() );
	//endregion
	exports.PipsMode = void 0;
	( function( PipsMode ) {
		PipsMode.Range = 'range';
		PipsMode.Steps = 'steps';
		PipsMode.Positions = 'positions';
		PipsMode.Count = 'count';
		PipsMode.Values = 'values';
	}( exports.PipsMode || ( exports.PipsMode = {} ) ) );
	exports.PipsType = void 0;
	( function( PipsType ) {
		PipsType[ PipsType.None = -1 ] = 'None';
		PipsType[ PipsType.NoValue = 0 ] = 'NoValue';
		PipsType[ PipsType.LargeValue = 1 ] = 'LargeValue';
		PipsType[ PipsType.SmallValue = 2 ] = 'SmallValue';
	}( exports.PipsType || ( exports.PipsType = {} ) ) );
	//region Helper Methods
	function isValidFormatter( entry ) {
		return isValidPartialFormatter( entry ) && typeof entry.from === 'function';
	}
	function isValidPartialFormatter( entry ) {
		// partial formatters only need a to function and not a from function
		return typeof entry === 'object' && typeof entry.to === 'function';
	}
	function removeElement( el ) {
		el.parentElement.removeChild( el );
	}
	function isSet( value ) {
		return value !== null && value !== undefined;
	}
	// Bindable version
	function preventDefault( e ) {
		e.preventDefault();
	}
	// Removes duplicates from an array.
	function unique( array ) {
		return array.filter( function( a ) {
			return ! this[ a ] ? ( this[ a ] = true ) : false;
		}, {} );
	}
	// Round a value to the closest 'to'.
	function closest( value, to ) {
		return Math.round( value / to ) * to;
	}
	// Current position of an element relative to the document.
	function offset( elem, orientation ) {
		var rect = elem.getBoundingClientRect();
		var doc = elem.ownerDocument;
		var docElem = doc.documentElement;
		var pageOffset = getPageOffset( doc );
		// getBoundingClientRect contains left scroll in Chrome on Android.
		// I haven't found a feature detection that proves this. Worst case
		// scenario on mis-match: the 'tap' feature on horizontal sliders breaks.
		if ( /webkit.*Chrome.*Mobile/i.test( navigator.userAgent ) ) {
			pageOffset.x = 0;
		}
		return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft;
	}
	// Checks whether a value is numerical.
	function isNumeric( a ) {
		return typeof a === 'number' && ! isNaN( a ) && isFinite( a );
	}
	// Sets a class and removes it after [duration] ms.
	function addClassFor( element, className, duration ) {
		if ( duration > 0 ) {
			addClass( element, className );
			setTimeout( function() {
				removeClass( element, className );
			}, duration );
		}
	}
	// Limits a value to 0 - 100
	function limit( a ) {
		return Math.max( Math.min( a, 100 ), 0 );
	}
	// Wraps a variable as an array, if it isn't one yet.
	// Note that an input array is returned by reference!
	function asArray( a ) {
		return Array.isArray( a ) ? a : [ a ];
	}
	// Counts decimals
	function countDecimals( numStr ) {
		var pieces;
		numStr = String( numStr );
		pieces = numStr.split( '.' );
		return pieces.length > 1 ? pieces[ 1 ].length : 0;
	}
	// http://youmightnotneedjquery.com/#add_class
	function addClass( el, className ) {
		if ( el.classList && ! /\s/.test( className ) ) {
			el.classList.add( className );
		} else {
			el.className += ' ' + className;
		}
	}
	// http://youmightnotneedjquery.com/#remove_class
	function removeClass( el, className ) {
		if ( el.classList && ! /\s/.test( className ) ) {
			el.classList.remove( className );
		} else {
			el.className = el.className.replace( new RegExp( '(^|\\b)' + className.split( ' ' ).join( '|' ) + '(\\b|$)', 'gi' ), ' ' );
		}
	}
	// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/
	function hasClass( el, className ) {
		return el.classList ? el.classList.contains( className ) : new RegExp( '\\b' + className + '\\b' ).test( el.className );
	}
	// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes
	function getPageOffset( doc ) {
		var supportPageOffset = window.pageXOffset !== undefined;
		var isCSS1Compat = ( doc.compatMode || '' ) === 'CSS1Compat';
		var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft;
		var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop;
		return {
			x: x,
			y: y
		};
	}
	// we provide a function to compute constants instead
	// of accessing window.* as soon as the module needs it
	// so that we do not compute anything if not needed
	function getActions() {
		// Determine the events to bind. IE11 implements pointerEvents without
		// a prefix, which breaks compatibility with the IE10 implementation.
		return window.navigator.pointerEnabled ? {
			start: 'pointerdown',
			move: 'pointermove',
			end: 'pointerup'
		} : window.navigator.msPointerEnabled ? {
			start: 'MSPointerDown',
			move: 'MSPointerMove',
			end: 'MSPointerUp'
		} : {
			start: 'mousedown touchstart',
			move: 'mousemove touchmove',
			end: 'mouseup touchend'
		};
	}
	// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
	// Issue #785
	function getSupportsPassive() {
		var supportsPassive = false;
		/* eslint-disable */
        try {
            var opts = Object.defineProperty({}, "passive", {
                get: function () {
                    supportsPassive = true;
                },
            });
            // @ts-ignore
            window.addEventListener("test", null, opts);
        }
        catch (e) { }
        /* eslint-enable */
		return supportsPassive;
	}
	function getSupportsTouchActionNone() {
		return window.CSS && CSS.supports && CSS.supports( 'touch-action', 'none' );
	}
	//endregion
	//region Range Calculation
	// Determine the size of a sub-range in relation to a full range.
	function subRangeRatio( pa, pb ) {
		return 100 / ( pb - pa );
	}
	// (percentage) How many percent is this value of this range?
	function fromPercentage( range, value, startRange ) {
		return ( value * 100 ) / ( range[ startRange + 1 ] - range[ startRange ] );
	}
	// (percentage) Where is this value on this range?
	function toPercentage( range, value ) {
		return fromPercentage( range, range[ 0 ] < 0 ? value + Math.abs( range[ 0 ] ) : value - range[ 0 ], 0 );
	}
	// (value) How much is this percentage on this range?
	function isPercentage( range, value ) {
		return ( ( value * ( range[ 1 ] - range[ 0 ] ) ) / 100 ) + range[ 0 ];
	}
	function getJ( value, arr ) {
		var j = 1;
		while ( value >= arr[ j ] ) {
			j += 1;
		}
		return j;
	}
	// (percentage) Input a value, find where, on a scale of 0-100, it applies.
	function toStepping( xVal, xPct, value ) {
		var j;
		var va;
		var vb;
		var pa;
		var pb;
		if ( value >= xVal.slice( -1 )[ 0 ] ) {
			return 100;
		}
		j = getJ( value, xVal );
		va = xVal[ j - 1 ];
		vb = xVal[ j ];
		pa = xPct[ j - 1 ];
		pb = xPct[ j ];
		return pa + ( toPercentage( [ va, vb ], value ) / subRangeRatio( pa, pb ) );
	}
	// (value) Input a percentage, find where it is on the specified range.
	function fromStepping( xVal, xPct, value ) {
		var j;
		var va;
		var vb;
		var pa;
		var pb;
		// There is no range group that fits 100
		if ( value >= 100 ) {
			return xVal.slice( -1 )[ 0 ];
		}
		j = getJ( value, xPct );
		va = xVal[ j - 1 ];
		vb = xVal[ j ];
		pa = xPct[ j - 1 ];
		pb = xPct[ j ];
		return isPercentage( [ va, vb ], ( value - pa ) * subRangeRatio( pa, pb ) );
	}
	// (percentage) Get the step that applies at a certain value.
	function getStep( xPct, xSteps, snap, value ) {
		var j;
		var a;
		var b;
		if ( value === 100 ) {
			return value;
		}
		j = getJ( value, xPct );
		a = xPct[ j - 1 ];
		b = xPct[ j ];
		// If 'snap' is set, steps are used as fixed points on the slider.
		if ( snap ) {
			// Find the closest position, a or b.
			if ( value - a > ( b - a ) / 2 ) {
				return b;
			}
			return a;
		}
		if ( ! xSteps[ j - 1 ] ) {
			return value;
		}
		return xPct[ j - 1 ] + closest( value - xPct[ j - 1 ], xSteps[ j - 1 ] );
	}
	//endregion
	//region Options
	/*	Every input option is tested and parsed. This will prevent
        endless validation in internal methods. These tests are
        structured with an item for every option available. An
        option can be marked as required by setting the 'r' flag.
        The testing function is provided with three arguments:
            - The provided value for the option;
            - A reference to the options object;
            - The name for the option;

        The testing function returns false when an error is detected,
        or true when everything is OK. It can also modify the option
        object, to make sure all values can be correctly looped elsewhere. */

	function testStep( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'step' is not numeric." );
		}
		// The step option can still be used to set stepping
		// for linear sliders. Overwritten if set in 'range'.
		parsed.singleStep = entry;
	}
	function testKeyboardPageMultiplier( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'keyboardPageMultiplier' is not numeric." );
		}
		parsed.keyboardPageMultiplier = entry;
	}
	function testKeyboardMultiplier( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'keyboardMultiplier' is not numeric." );
		}
		parsed.keyboardMultiplier = entry;
	}
	function testKeyboardDefaultStep( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'keyboardDefaultStep' is not numeric." );
		}
		parsed.keyboardDefaultStep = entry;
	}
	function testRange( parsed, entry ) {
		// Filter incorrect input.
		if ( typeof entry !== 'object' || Array.isArray( entry ) ) {
			throw new Error( "noUiSlider: 'range' is not an object." );
		}
		// Catch missing start or end.
		if ( entry.min === undefined || entry.max === undefined ) {
			throw new Error( "noUiSlider: Missing 'min' or 'max' in 'range'." );
		}
		parsed.spectrum = new Spectrum( entry, parsed.snap || false, parsed.singleStep );
	}
	function testStart( parsed, entry ) {
		entry = asArray( entry );
		// Validate input. Values aren't tested, as the public .val method
		// will always provide a valid location.
		if ( ! Array.isArray( entry ) || ! entry.length ) {
			throw new Error( "noUiSlider: 'start' option is incorrect." );
		}
		// Store the number of handles.
		parsed.handles = entry.length;
		// When the slider is initialized, the .val method will
		// be called with the start options.
		parsed.start = entry;
	}
	function testSnap( parsed, entry ) {
		if ( typeof entry !== 'boolean' ) {
			throw new Error( "noUiSlider: 'snap' option must be a boolean." );
		}
		// Enforce 100% stepping within subranges.
		parsed.snap = entry;
	}
	function testAnimate( parsed, entry ) {
		if ( typeof entry !== 'boolean' ) {
			throw new Error( "noUiSlider: 'animate' option must be a boolean." );
		}
		// Enforce 100% stepping within subranges.
		parsed.animate = entry;
	}
	function testAnimationDuration( parsed, entry ) {
		if ( typeof entry !== 'number' ) {
			throw new Error( "noUiSlider: 'animationDuration' option must be a number." );
		}
		parsed.animationDuration = entry;
	}
	function testConnect( parsed, entry ) {
		var connect = [ false ];
		var i;
		// Map legacy options
		if ( entry === 'lower' ) {
			entry = [ true, false ];
		} else if ( entry === 'upper' ) {
			entry = [ false, true ];
		}
		// Handle boolean options
		if ( entry === true || entry === false ) {
			for ( i = 1; i < parsed.handles; i++ ) {
				connect.push( entry );
			}
			connect.push( false );
		} else if ( ! Array.isArray( entry ) || ! entry.length || entry.length !== parsed.handles + 1 ) { // Reject invalid input
			throw new Error( "noUiSlider: 'connect' option doesn't match handle count." );
		} else {
			connect = entry;
		}
		parsed.connect = connect;
	}
	function testOrientation( parsed, entry ) {
		// Set orientation to an a numerical value for easy
		// array selection.
		switch ( entry ) {
			case 'horizontal':
				parsed.ort = 0;
				break;
			case 'vertical':
				parsed.ort = 1;
				break;
			default:
				throw new Error( "noUiSlider: 'orientation' option is invalid." );
		}
	}
	function testMargin( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'margin' option must be numeric." );
		}
		// Issue #582
		if ( entry === 0 ) {
			return;
		}
		parsed.margin = parsed.spectrum.getDistance( entry );
	}
	function testLimit( parsed, entry ) {
		if ( ! isNumeric( entry ) ) {
			throw new Error( "noUiSlider: 'limit' option must be numeric." );
		}
		parsed.limit = parsed.spectrum.getDistance( entry );
		if ( ! parsed.limit || parsed.handles < 2 ) {
			throw new Error( "noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles." );
		}
	}
	function testPadding( parsed, entry ) {
		var index;
		var totalPadding;
		var firstValue;
		var lastValue;
		if ( ! isNumeric( entry ) && ! Array.isArray( entry ) ) {
			throw new Error( "noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers." );
		}
		if ( Array.isArray( entry ) && ! ( entry.length === 2 || isNumeric( entry[ 0 ] ) || isNumeric( entry[ 1 ] ) ) ) {
			throw new Error( "noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers." );
		}
		if ( entry === 0 ) {
			return;
		}
		if ( ! Array.isArray( entry ) ) {
			entry = [ entry, entry ];
		}
		// 'getDistance' returns false for invalid values.
		parsed.padding = [ parsed.spectrum.getDistance( entry[ 0 ] ), parsed.spectrum.getDistance( entry[ 1 ] ) ];
		for ( index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++ ) {
			// last "range" can't contain step size as it is purely an endpoint.
			if ( parsed.padding[ 0 ][ index ] < 0 || parsed.padding[ 1 ][ index ] < 0 ) {
				throw new Error( "noUiSlider: 'padding' option must be a positive number(s)." );
			}
		}
		totalPadding = entry[ 0 ] + entry[ 1 ];
		firstValue = parsed.spectrum.xVal[ 0 ];
		lastValue = parsed.spectrum.xVal[ parsed.spectrum.xVal.length - 1 ];
		if ( totalPadding / ( lastValue - firstValue ) > 1 ) {
			throw new Error( "noUiSlider: 'padding' option must not exceed 100% of the range." );
		}
	}
	function testDirection( parsed, entry ) {
		// Set direction as a numerical value for easy parsing.
		// Invert connection for RTL sliders, so that the proper
		// handles get the connect/background classes.
		switch ( entry ) {
			case 'ltr':
				parsed.dir = 0;
				break;
			case 'rtl':
				parsed.dir = 1;
				break;
			default:
				throw new Error( "noUiSlider: 'direction' option was not recognized." );
		}
	}
	function testBehaviour( parsed, entry ) {
		var tap;
		var drag;
		var fixed;
		var snap;
		var hover;
		var unconstrained;
		var dragAll;
		var smoothSteps;
		// Make sure the input is a string.
		if ( typeof entry !== 'string' ) {
			throw new Error( "noUiSlider: 'behaviour' must be a string containing options." );
		}
		// Check if the string contains any keywords.
		// None are required.
		tap = entry.indexOf( 'tap' ) >= 0;
		drag = entry.indexOf( 'drag' ) >= 0;
		fixed = entry.indexOf( 'fixed' ) >= 0;
		snap = entry.indexOf( 'snap' ) >= 0;
		hover = entry.indexOf( 'hover' ) >= 0;
		unconstrained = entry.indexOf( 'unconstrained' ) >= 0;
		dragAll = entry.indexOf( 'drag-all' ) >= 0;
		smoothSteps = entry.indexOf( 'smooth-steps' ) >= 0;
		if ( fixed ) {
			if ( parsed.handles !== 2 ) {
				throw new Error( "noUiSlider: 'fixed' behaviour must be used with 2 handles" );
			}
			// Use margin to enforce fixed state
			testMargin( parsed, parsed.start[ 1 ] - parsed.start[ 0 ] );
		}
		if ( unconstrained && ( parsed.margin || parsed.limit ) ) {
			throw new Error( "noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit" );
		}
		parsed.events = {
			tap: tap || snap,
			drag: drag,
			dragAll: dragAll,
			smoothSteps: smoothSteps,
			fixed: fixed,
			snap: snap,
			hover: hover,
			unconstrained: unconstrained
		};
	}
	function testTooltips( parsed, entry ) {
		var i;
		if ( entry === false ) {
			return;
		}
		if ( entry === true || isValidPartialFormatter( entry ) ) {
			parsed.tooltips = [];
			for ( i = 0; i < parsed.handles; i++ ) {
				parsed.tooltips.push( entry );
			}
		} else {
			entry = asArray( entry );
			if ( entry.length !== parsed.handles ) {
				throw new Error( 'noUiSlider: must pass a formatter for all handles.' );
			}
			entry.forEach( function( formatter ) {
				if ( typeof formatter !== 'boolean' && ! isValidPartialFormatter( formatter ) ) {
					throw new Error( "noUiSlider: 'tooltips' must be passed a formatter or 'false'." );
				}
			} );
			parsed.tooltips = entry;
		}
	}
	function testHandleAttributes( parsed, entry ) {
		if ( entry.length !== parsed.handles ) {
			throw new Error( 'noUiSlider: must pass a attributes for all handles.' );
		}
		parsed.handleAttributes = entry;
	}
	function testAriaFormat( parsed, entry ) {
		if ( ! isValidPartialFormatter( entry ) ) {
			throw new Error( "noUiSlider: 'ariaFormat' requires 'to' method." );
		}
		parsed.ariaFormat = entry;
	}
	function testFormat( parsed, entry ) {
		if ( ! isValidFormatter( entry ) ) {
			throw new Error( "noUiSlider: 'format' requires 'to' and 'from' methods." );
		}
		parsed.format = entry;
	}
	function testKeyboardSupport( parsed, entry ) {
		if ( typeof entry !== 'boolean' ) {
			throw new Error( "noUiSlider: 'keyboardSupport' option must be a boolean." );
		}
		parsed.keyboardSupport = entry;
	}
	function testDocumentElement( parsed, entry ) {
		// This is an advanced option. Passed values are used without validation.
		parsed.documentElement = entry;
	}
	function testCssPrefix( parsed, entry ) {
		if ( typeof entry !== 'string' && entry !== false ) {
			throw new Error( "noUiSlider: 'cssPrefix' must be a string or `false`." );
		}
		parsed.cssPrefix = entry;
	}
	function testCssClasses( parsed, entry ) {
		if ( typeof entry !== 'object' ) {
			throw new Error( "noUiSlider: 'cssClasses' must be an object." );
		}
		if ( typeof parsed.cssPrefix === 'string' ) {
			parsed.cssClasses = {};
			Object.keys( entry ).forEach( function( key ) {
				parsed.cssClasses[ key ] = parsed.cssPrefix + entry[ key ];
			} );
		} else {
			parsed.cssClasses = entry;
		}
	}
	// Test all developer settings and parse to assumption-safe values.
	function testOptions( options ) {
		// To prove a fix for #537, freeze options here.
		// If the object is modified, an error will be thrown.
		// Object.freeze(options);
		var parsed = {
			margin: null,
			limit: null,
			padding: null,
			animate: true,
			animationDuration: 300,
			ariaFormat: defaultFormatter,
			format: defaultFormatter
		};
		// Tests are executed in the order they are presented here.
		var tests = {
			step: { r: false, t: testStep },
			keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier },
			keyboardMultiplier: { r: false, t: testKeyboardMultiplier },
			keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep },
			start: { r: true, t: testStart },
			connect: { r: true, t: testConnect },
			direction: { r: true, t: testDirection },
			snap: { r: false, t: testSnap },
			animate: { r: false, t: testAnimate },
			animationDuration: { r: false, t: testAnimationDuration },
			range: { r: true, t: testRange },
			orientation: { r: false, t: testOrientation },
			margin: { r: false, t: testMargin },
			limit: { r: false, t: testLimit },
			padding: { r: false, t: testPadding },
			behaviour: { r: true, t: testBehaviour },
			ariaFormat: { r: false, t: testAriaFormat },
			format: { r: false, t: testFormat },
			tooltips: { r: false, t: testTooltips },
			keyboardSupport: { r: true, t: testKeyboardSupport },
			documentElement: { r: false, t: testDocumentElement },
			cssPrefix: { r: true, t: testCssPrefix },
			cssClasses: { r: true, t: testCssClasses },
			handleAttributes: { r: false, t: testHandleAttributes }
		};
		var defaults = {
			connect: false,
			direction: 'ltr',
			behaviour: 'tap',
			orientation: 'horizontal',
			keyboardSupport: true,
			cssPrefix: 'noui-',
			cssClasses: cssClasses,
			keyboardPageMultiplier: 5,
			keyboardMultiplier: 1,
			keyboardDefaultStep: 10
		};
		var d;
		var msPrefix;
		var noPrefix;
		var styles;
		// AriaFormat defaults to regular format, if any.
		if ( options.format && ! options.ariaFormat ) {
			options.ariaFormat = options.format;
		}
		// Run all options through a testing mechanism to ensure correct
		// input. It should be noted that options might get modified to
		// be handled properly. E.g. wrapping integers in arrays.
		Object.keys( tests ).forEach( function( name ) {
			// If the option isn't set, but it is required, throw an error.
			if ( ! isSet( options[ name ] ) && defaults[ name ] === undefined ) {
				if ( tests[ name ].r ) {
					throw new Error( "noUiSlider: '" + name + "' is required." );
				}
				return;
			}
			tests[ name ].t( parsed, ! isSet( options[ name ] ) ? defaults[ name ] : options[ name ] );
		} );
		// Forward pips options
		parsed.pips = options.pips;
		// All recent browsers accept unprefixed transform.
		// We need -ms- for IE9 and -webkit- for older Android;
		// Assume use of -webkit- if unprefixed and -ms- are not supported.
		// https://caniuse.com/#feat=transforms2d
		d = document.createElement( 'div' );
		msPrefix = d.style.msTransform !== undefined;
		noPrefix = d.style.transform !== undefined;
		parsed.transformRule = noPrefix ? 'transform' : msPrefix ? 'msTransform' : 'webkitTransform';
		// Pips don't move, so we can place them using left/top.
		styles = [
			[ 'left', 'top' ],
			[ 'right', 'bottom' ]
		];
		parsed.style = styles[ parsed.dir ][ parsed.ort ];
		return parsed;
	}
	//endregion
	function scope( target, options, originalOptions ) {
		var actions = getActions();
		var supportsTouchActionNone = getSupportsTouchActionNone();
		var supportsPassive = supportsTouchActionNone && getSupportsPassive();
		// All variables local to 'scope' are prefixed with 'scope_'
		// Slider DOM Nodes
		var scope_Target = target;
		var scope_Base;
		var scope_Handles;
		var scope_Connects;
		var scope_Pips;
		var scope_Tooltips;
		// Slider state values
		var scope_Spectrum = options.spectrum;
		var scope_Values = [];
		var scope_Locations = [];
		var scope_HandleNumbers = [];
		var scope_ActiveHandlesCount = 0;
		var scope_Events = {};
		// Document Nodes
		var scope_Document = target.ownerDocument;
		var scope_DocumentElement = options.documentElement || scope_Document.documentElement;
		var scope_Body = scope_Document.body;
		// For horizontal sliders in standard ltr documents,
		// make .noUi-origin overflow to the left so the document doesn't scroll.
		var scope_DirOffset = scope_Document.dir === 'rtl' || options.ort === 1 ? 0 : 100;
		var scope_Self;
		// Creates a node, adds it to target, returns the new node.
		function addNodeTo( addTarget, className ) {
			var div = scope_Document.createElement( 'div' );
			if ( className ) {
				addClass( div, className );
			}
			addTarget.appendChild( div );
			return div;
		}
		// Append a origin to the base
		function addOrigin( base, handleNumber ) {
			var origin = addNodeTo( base, options.cssClasses.origin );
			var handle = addNodeTo( origin, options.cssClasses.handle );
			var attributes_1;
			addNodeTo( handle, options.cssClasses.touchArea );
			handle.setAttribute( 'data-handle', String( handleNumber ) );
			if ( options.keyboardSupport ) {
				// https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex
				// 0 = focusable and reachable
				handle.setAttribute( 'tabindex', '0' );
				handle.addEventListener( 'keydown', function( event ) {
					return eventKeydown( event, handleNumber );
				} );
			}
			if ( options.handleAttributes !== undefined ) {
				attributes_1 = options.handleAttributes[ handleNumber ];
				Object.keys( attributes_1 ).forEach( function( attribute ) {
					handle.setAttribute( attribute, attributes_1[ attribute ] );
				} );
			}
			handle.setAttribute( 'role', 'slider' );
			handle.setAttribute( 'aria-orientation', options.ort ? 'vertical' : 'horizontal' );
			if ( handleNumber === 0 ) {
				addClass( handle, options.cssClasses.handleLower );
			} else if ( handleNumber === options.handles - 1 ) {
				addClass( handle, options.cssClasses.handleUpper );
			}
			origin.handle = handle;
			return origin;
		}
		// Insert nodes for connect elements
		function addConnect( base, add ) {
			if ( ! add ) {
				return false;
			}
			return addNodeTo( base, options.cssClasses.connect );
		}
		// Add handles to the slider base.
		function addElements( connectOptions, base ) {
			var connectBase = addNodeTo( base, options.cssClasses.connects );
			var i;
			scope_Handles = [];
			scope_Connects = [];
			scope_Connects.push( addConnect( connectBase, connectOptions[ 0 ] ) );
			// [::::O====O====O====]
			// connectOptions = [0, 1, 1, 1]
			for ( i = 0; i < options.handles; i++ ) {
				// Keep a list of all added handles.
				scope_Handles.push( addOrigin( base, i ) );
				scope_HandleNumbers[ i ] = i;
				scope_Connects.push( addConnect( connectBase, connectOptions[ i + 1 ] ) );
			}
		}
		// Initialize a single slider.
		function addSlider( addTarget ) {
			var textDirection;
			// Apply classes and data to the target.
			addClass( addTarget, options.cssClasses.target );
			if ( options.dir === 0 ) {
				addClass( addTarget, options.cssClasses.ltr );
			} else {
				addClass( addTarget, options.cssClasses.rtl );
			}
			if ( options.ort === 0 ) {
				addClass( addTarget, options.cssClasses.horizontal );
			} else {
				addClass( addTarget, options.cssClasses.vertical );
			}
			textDirection = getComputedStyle( addTarget ).direction;
			if ( textDirection === 'rtl' ) {
				addClass( addTarget, options.cssClasses.textDirectionRtl );
			} else {
				addClass( addTarget, options.cssClasses.textDirectionLtr );
			}
			return addNodeTo( addTarget, options.cssClasses.base );
		}
		function addTooltip( handle, handleNumber ) {
			if ( ! options.tooltips || ! options.tooltips[ handleNumber ] ) {
				return false;
			}
			return addNodeTo( handle.firstChild, options.cssClasses.tooltip );
		}
		function isSliderDisabled() {
			return scope_Target.hasAttribute( 'disabled' );
		}
		// Disable the slider dragging if any handle is disabled
		function isHandleDisabled( handleNumber ) {
			var handleOrigin = scope_Handles[ handleNumber ];
			return handleOrigin.hasAttribute( 'disabled' );
		}
		function disable( handleNumber ) {
			if ( handleNumber !== null && handleNumber !== undefined ) {
				scope_Handles[ handleNumber ].setAttribute( 'disabled', '' );
				scope_Handles[ handleNumber ].handle.removeAttribute( 'tabindex' );
			} else {
				scope_Target.setAttribute( 'disabled', '' );
				scope_Handles.forEach( function( handle ) {
					handle.handle.removeAttribute( 'tabindex' );
				} );
			}
		}
		function enable( handleNumber ) {
			if ( handleNumber !== null && handleNumber !== undefined ) {
				scope_Handles[ handleNumber ].removeAttribute( 'disabled' );
				scope_Handles[ handleNumber ].handle.setAttribute( 'tabindex', '0' );
			} else {
				scope_Target.removeAttribute( 'disabled' );
				scope_Handles.forEach( function( handle ) {
					handle.removeAttribute( 'disabled' );
					handle.handle.setAttribute( 'tabindex', '0' );
				} );
			}
		}
		function removeTooltips() {
			if ( scope_Tooltips ) {
				removeEvent( 'update' + INTERNAL_EVENT_NS.tooltips );
				scope_Tooltips.forEach( function( tooltip ) {
					if ( tooltip ) {
						removeElement( tooltip );
					}
				} );
				scope_Tooltips = null;
			}
		}
		// The tooltips option is a shorthand for using the 'update' event.
		function tooltips() {
			var formattedValue;
			removeTooltips();
			// Tooltips are added with options.tooltips in original order.
			scope_Tooltips = scope_Handles.map( addTooltip );
			bindEvent( 'update' + INTERNAL_EVENT_NS.tooltips, function( values, handleNumber, unencoded ) {
				if ( ! scope_Tooltips || ! options.tooltips ) {
					return;
				}
				if ( scope_Tooltips[ handleNumber ] === false ) {
					return;
				}
				formattedValue = values[ handleNumber ];
				if ( options.tooltips[ handleNumber ] !== true ) {
					formattedValue = options.tooltips[ handleNumber ].to( unencoded[ handleNumber ] );
				}
				scope_Tooltips[ handleNumber ].innerHTML = formattedValue;
			} );
		}
		function aria() {
			removeEvent( 'update' + INTERNAL_EVENT_NS.aria );
			bindEvent( 'update' + INTERNAL_EVENT_NS.aria, function( values, handleNumber, unencoded, tap, positions ) {
				// Update Aria Values for all handles, as a change in one changes min and max values for the next.
				scope_HandleNumbers.forEach( function( index ) {
					var handle = scope_Handles[ index ];
					var min = checkHandlePosition( scope_Locations, index, 0, true, true, true );
					var max = checkHandlePosition( scope_Locations, index, 100, true, true, true );
					var now = positions[ index ];
					// Formatted value for display
					var text = String( options.ariaFormat.to( unencoded[ index ] ) );
					// Map to slider range values
					min = scope_Spectrum.fromStepping( min ).toFixed( 1 );
					max = scope_Spectrum.fromStepping( max ).toFixed( 1 );
					now = scope_Spectrum.fromStepping( now ).toFixed( 1 );
					handle.children[ 0 ].setAttribute( 'aria-valuemin', min );
					handle.children[ 0 ].setAttribute( 'aria-valuemax', max );
					handle.children[ 0 ].setAttribute( 'aria-valuenow', now );
					handle.children[ 0 ].setAttribute( 'aria-valuetext', text );
				} );
			} );
		}
		function getGroup( ipips ) {
			var interval;
			var spread;
			var values;
			// Use the range.
			if ( ipips.mode === exports.PipsMode.Range || ipips.mode === exports.PipsMode.Steps ) {
				return scope_Spectrum.xVal;
			}
			if ( ipips.mode === exports.PipsMode.Count ) {
				if ( ipips.values < 2 ) {
					throw new Error( "noUiSlider: 'values' (>= 2) required for mode 'count'." );
				}
				// Divide 0 - 100 in 'count' parts.
				interval = ipips.values - 1;
				spread = 100 / interval;
				values = [];
				// List these parts and have them handled as 'positions'.
				while ( interval-- ) {
					values[ interval ] = interval * spread;
				}
				values.push( 100 );
				return mapToRange( values, ipips.stepped );
			}
			if ( ipips.mode === exports.PipsMode.Positions ) {
				// Map all percentages to on-range values.
				return mapToRange( ipips.values, ipips.stepped );
			}
			if ( ipips.mode === exports.PipsMode.Values ) {
				// If the value must be stepped, it needs to be converted to a percentage first.
				if ( ipips.stepped ) {
					return ipips.values.map( function( value ) {
						// Convert to percentage, apply step, return to value.
						return scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) );
					} );
				}
				// Otherwise, we can simply use the values.
				return ipips.values;
			}
			return []; // ipips.mode = never
		}
		function mapToRange( values, stepped ) {
			return values.map( function( value ) {
				return scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value );
			} );
		}
		function generateSpread( ipips ) {
			var group = getGroup( ipips );
			var indexes = {};
			var firstInRange = scope_Spectrum.xVal[ 0 ];
			var lastInRange = scope_Spectrum.xVal[ scope_Spectrum.xVal.length - 1 ];
			var ignoreFirst = false;
			var ignoreLast = false;
			var prevPct = 0;
			function safeIncrement( value, increment ) {
				// Avoid floating point variance by dropping the smallest decimal places.
				return Number( ( value + increment ).toFixed( 7 ) );
			}
			// Create a copy of the group, sort it and filter away all duplicates.
			group = unique( group.slice().sort( function( a, b ) {
				return a - b;
			} ) );
			// Make sure the range starts with the first element.
			if ( group[ 0 ] !== firstInRange ) {
				group.unshift( firstInRange );
				ignoreFirst = true;
			}
			// Likewise for the last one.
			if ( group[ group.length - 1 ] !== lastInRange ) {
				group.push( lastInRange );
				ignoreLast = true;
			}
			group.forEach( function( current, index ) {
				// Get the current step and the lower + upper positions.
				var step;
				var i;
				var q;
				var low = current;
				var high = group[ index + 1 ];
				var newPct;
				var pctDifference;
				var pctPos;
				var type;
				var steps;
				var realSteps;
				var stepSize;
				var isSteps = ipips.mode === exports.PipsMode.Steps;
				// When using 'steps' mode, use the provided steps.
				// Otherwise, we'll step on to the next subrange.
				if ( isSteps ) {
					step = scope_Spectrum.xNumSteps[ index ];
				}
				// Default to a 'full' step.
				if ( ! step ) {
					step = high - low;
				}
				// If high is undefined we are at the last subrange. Make sure it iterates once (#1088)
				if ( high === undefined ) {
					high = low;
				}
				// Make sure step isn't 0, which would cause an infinite loop (#654)
				step = Math.max( step, 0.0000001 );
				// Find all steps in the subrange.
				for ( i = low; i <= high; i = safeIncrement( i, step ) ) {
					// Get the percentage value for the current step,
					// calculate the size for the subrange.
					newPct = scope_Spectrum.toStepping( i );
					pctDifference = newPct - prevPct;
					steps = pctDifference / ( ipips.density || 1 );
					realSteps = Math.round( steps );
					// This ratio represents the amount of percentage-space a point indicates.
					// For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided.
					// Round the percentage offset to an even number, then divide by two
					// to spread the offset on both sides of the range.
					stepSize = pctDifference / realSteps;
					// Divide all points evenly, adding the correct number to this subrange.
					// Run up to <= so that 100% gets a point, event if ignoreLast is set.
					for ( q = 1; q <= realSteps; q += 1 ) {
						// The ratio between the rounded value and the actual size might be ~1% off.
						// Correct the percentage offset by the number of points
						// per subrange. density = 1 will result in 100 points on the
						// full range, 2 for 50, 4 for 25, etc.
						pctPos = prevPct + ( q * stepSize );
						indexes[ pctPos.toFixed( 5 ) ] = [ scope_Spectrum.fromStepping( pctPos ), 0 ];
					}
					// Determine the point type.
					type = group.indexOf( i ) > -1 ? exports.PipsType.LargeValue : isSteps ? exports.PipsType.SmallValue : exports.PipsType.NoValue;
					// Enforce the 'ignoreFirst' option by overwriting the type for 0.
					if ( ! index && ignoreFirst && i !== high ) {
						type = 0;
					}
					if ( ! ( i === high && ignoreLast ) ) {
						// Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value.
						indexes[ newPct.toFixed( 5 ) ] = [ i, type ];
					}
					// Update the percentage count.
					prevPct = newPct;
				}
			} );
			return indexes;
		}
		function addMarking( spread, filterFunc, formatter ) {
			var _a, _b;
			var element = scope_Document.createElement( 'div' );
			var valueSizeClasses = ( _a = {},
			_a[ exports.PipsType.None ] = '',
			_a[ exports.PipsType.NoValue ] = options.cssClasses.valueNormal,
			_a[ exports.PipsType.LargeValue ] = options.cssClasses.valueLarge,
			_a[ exports.PipsType.SmallValue ] = options.cssClasses.valueSub,
			_a );
			var markerSizeClasses = ( _b = {},
			_b[ exports.PipsType.None ] = '',
			_b[ exports.PipsType.NoValue ] = options.cssClasses.markerNormal,
			_b[ exports.PipsType.LargeValue ] = options.cssClasses.markerLarge,
			_b[ exports.PipsType.SmallValue ] = options.cssClasses.markerSub,
			_b );
			var valueOrientationClasses = [ options.cssClasses.valueHorizontal, options.cssClasses.valueVertical ];
			var markerOrientationClasses = [ options.cssClasses.markerHorizontal, options.cssClasses.markerVertical ];
			addClass( element, options.cssClasses.pips );
			addClass( element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical );
			function getClasses( type, source ) {
				var a = source === options.cssClasses.value;
				var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses;
				var sizeClasses = a ? valueSizeClasses : markerSizeClasses;
				return source + ' ' + orientationClasses[ options.ort ] + ' ' + sizeClasses[ type ];
			}
			function addSpread( key, value, type ) {
				var node;
				// Apply the filter function, if it is set.
				type = filterFunc ? filterFunc( value, type ) : type;
				if ( type === exports.PipsType.None ) {
					return;
				}
				// Add a marker for every point
				node = addNodeTo( element, false );
				node.className = getClasses( type, options.cssClasses.marker );
				node.style[ options.style ] = key + '%';
				// Values are only appended for points marked '1' or '2'.
				if ( type > exports.PipsType.NoValue ) {
					node = addNodeTo( element, false );
					node.className = getClasses( type, options.cssClasses.value );
					node.setAttribute( 'data-value', String( value ) );
					node.style[ options.style ] = key + '%';
					node.innerHTML = String( formatter.to( value ) );
				}
			}
			// Append all points.
			Object.keys( spread ).forEach( function( key ) {
				addSpread( key, spread[ key ][ 0 ], spread[ key ][ 1 ] );
			} );
			return element;
		}
		function removePips() {
			if ( scope_Pips ) {
				removeElement( scope_Pips );
				scope_Pips = null;
			}
		}
		function pips( ipips ) {
			var filter;
			var spread;
			var format;
			// Fix #669
			removePips();
			spread = generateSpread( ipips );
			filter = ipips.filter;
			format = ipips.format || {
				to: function( value ) {
					return String( Math.round( value ) );
				}
			};
			scope_Pips = scope_Target.appendChild( addMarking( spread, filter, format ) );
			return scope_Pips;
		}
		// Shorthand for base dimensions.
		function baseSize() {
			var rect = scope_Base.getBoundingClientRect();
			var alt = ( 'offset' + [ 'Width', 'Height' ][ options.ort ] );
			return options.ort === 0 ? rect.width || scope_Base[ alt ] : rect.height || scope_Base[ alt ];
		}
		// Handler for attaching events trough a proxy.
		function attachEvent( events, element, callback, data ) {
			// This function can be used to 'filter' events to the slider.
			// element is a node, not a nodeList
			var method = function( event ) {
				var e = fixEvent( event, data.pageOffset, data.target || element );
				// fixEvent returns false if this event has a different target
				// when handling (multi-) touch events;
				if ( ! e ) {
					return false;
				}
				// doNotReject is passed by all end events to make sure released touches
				// are not rejected, leaving the slider "stuck" to the cursor;
				if ( isSliderDisabled() && ! data.doNotReject ) {
					return false;
				}
				// Stop if an active 'tap' transition is taking place.
				if ( hasClass( scope_Target, options.cssClasses.tap ) && ! data.doNotReject ) {
					return false;
				}
				// Ignore right or middle clicks on start #454
				if ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) {
					return false;
				}
				// Ignore right or middle clicks on start #454
				if ( data.hover && e.buttons ) {
					return false;
				}
				// 'supportsPassive' is only true if a browser also supports touch-action: none in CSS.
				// iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support
				// touch-action: manipulation, but that allows panning, which breaks
				// sliders after zooming/on non-responsive pages.
				// See: https://bugs.webkit.org/show_bug.cgi?id=133112
				if ( ! supportsPassive ) {
					e.preventDefault();
				}
				e.calcPoint = e.points[ options.ort ];
				// Call the event handler with the event [ and additional data ].
				callback( e, data );
			};
			var methods = [];
			// Bind a closure on the target for every event type.
			events.split( ' ' ).forEach( function( eventName ) {
				element.addEventListener( eventName, method, supportsPassive ? { passive: true } : false );
				methods.push( [ eventName, method ] );
			} );
			return methods;
		}
		// Provide a clean event with standardized offset values.
		function fixEvent( e, pageOffset, eventTarget ) {
			// Filter the event to register the type, which can be
			// touch, mouse or pointer. Offset changes need to be
			// made on an event specific basis.
			var touch = e.type.indexOf( 'touch' ) === 0;
			var mouse = e.type.indexOf( 'mouse' ) === 0;
			var pointer = e.type.indexOf( 'pointer' ) === 0;
			var x = 0;
			var y = 0;
			var isTouchOnTarget;
			var targetTouches;
			var targetTouch;
			// IE10 implemented pointer events with a prefix;
			if ( e.type.indexOf( 'MSPointer' ) === 0 ) {
				pointer = true;
			}
			// Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with
			// the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore
			// events that have no touches or buttons associated with them. (#1057, #1079, #1095)
			if ( e.type === 'mousedown' && ! e.buttons && ! e.touches ) {
				return false;
			}
			// The only thing one handle should be concerned about is the touches that originated on top of it.
			if ( touch ) {
				// Returns true if a touch originated on the target.
				isTouchOnTarget = function( checkTouch ) {
					return ( checkTouch.target === eventTarget ||
                        eventTarget.contains( checkTouch.target ) ||
                        ( e.composed && e.composedPath().shift() === eventTarget ) );
				};
				// In the case of touchstart events, we need to make sure there is still no more than one
				// touch on the target so we look amongst all touches.
				if ( e.type === 'touchstart' ) {
					targetTouches = Array.prototype.filter.call( e.touches, isTouchOnTarget );
					// Do not support more than one touch per handle.
					if ( targetTouches.length > 1 ) {
						return false;
					}
					x = targetTouches[ 0 ].pageX;
					y = targetTouches[ 0 ].pageY;
				} else {
					// In the other cases, find on changedTouches is enough.
					targetTouch = Array.prototype.find.call( e.changedTouches, isTouchOnTarget );
					// Cancel if the target touch has not moved.
					if ( ! targetTouch ) {
						return false;
					}
					x = targetTouch.pageX;
					y = targetTouch.pageY;
				}
			}
			pageOffset = pageOffset || getPageOffset( scope_Document );
			if ( mouse || pointer ) {
				x = e.clientX + pageOffset.x;
				y = e.clientY + pageOffset.y;
			}
			e.pageOffset = pageOffset;
			e.points = [ x, y ];
			e.cursor = mouse || pointer; // Fix #435
			return e;
		}
		// Translate a coordinate in the document to a percentage on the slider
		function calcPointToPercentage( calcPoint ) {
			var location = calcPoint - offset( scope_Base, options.ort );
			var proposal = ( location * 100 ) / baseSize();
			// Clamp proposal between 0% and 100%
			// Out-of-bound coordinates may occur when .noUi-base pseudo-elements
			// are used (e.g. contained handles feature)
			proposal = limit( proposal );
			return options.dir ? 100 - proposal : proposal;
		}
		// Find handle closest to a certain percentage on the slider
		function getClosestHandle( clickedPosition ) {
			var smallestDifference = 100;
			var handleNumber = false;
			scope_Handles.forEach( function( handle, index ) {
				var handlePosition;
				var differenceWithThisHandle;
				var clickAtEdge;
				var isCloser;
				var isCloserAfter;
				// Disabled handles are ignored
				if ( isHandleDisabled( index ) ) {
					return;
				}
				handlePosition = scope_Locations[ index ];
				differenceWithThisHandle = Math.abs( handlePosition - clickedPosition );
				// Initial state
				clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100;
				// Difference with this handle is smaller than the previously checked handle
				isCloser = differenceWithThisHandle < smallestDifference;
				isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition;
				if ( isCloser || isCloserAfter || clickAtEdge ) {
					handleNumber = index;
					smallestDifference = differenceWithThisHandle;
				}
			} );
			return handleNumber;
		}
		// Fire 'end' when a mouse or pen leaves the document.
		function documentLeave( event, data ) {
			if ( event.type === 'mouseout' &&
                event.target.nodeName === 'HTML' &&
                event.relatedTarget === null ) {
				eventEnd( event, data );
			}
		}
		// Handle movement on document for handle and range drag.
		function eventMove( event, data ) {
			var movement;
			var proposal;
			// Fix #498
			// Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty).
			// https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero
			// IE9 has .buttons and .which zero on mousemove.
			// Firefox breaks the spec MDN defines.
			if ( navigator.appVersion.indexOf( 'MSIE 9' ) === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) {
				return eventEnd( event, data );
			}
			// Check if we are moving up or down
			movement = ( options.dir ? -1 : 1 ) * ( event.calcPoint - data.startCalcPoint );
			// Convert the movement into a percentage of the slider width/height
			proposal = ( movement * 100 ) / data.baseSize;
			moveHandles( movement > 0, proposal, data.locations, data.handleNumbers, data.connect );
		}
		// Unbind move events on document, call callbacks.
		function eventEnd( event, data ) {
			// The handle is no longer active, so remove the class.
			if ( data.handle ) {
				removeClass( data.handle, options.cssClasses.active );
				scope_ActiveHandlesCount -= 1;
			}
			// Unbind the move and end events, which are added on 'start'.
			data.listeners.forEach( function( c ) {
				scope_DocumentElement.removeEventListener( c[ 0 ], c[ 1 ] );
			} );
			if ( scope_ActiveHandlesCount === 0 ) {
				// Remove dragging class.
				removeClass( scope_Target, options.cssClasses.drag );
				setZindex();
				// Remove cursor styles and text-selection events bound to the body.
				if ( event.cursor ) {
					scope_Body.style.cursor = '';
					scope_Body.removeEventListener( 'selectstart', preventDefault );
				}
			}
			if ( options.events.smoothSteps ) {
				data.handleNumbers.forEach( function( handleNumber ) {
					setHandle( handleNumber, scope_Locations[ handleNumber ], true, true, false, false );
				} );
				data.handleNumbers.forEach( function( handleNumber ) {
					fireEvent( 'update', handleNumber );
				} );
			}
			data.handleNumbers.forEach( function( handleNumber ) {
				fireEvent( 'change', handleNumber );
				fireEvent( 'set', handleNumber );
				fireEvent( 'end', handleNumber );
			} );
		}
		// Bind move events on document.
		function eventStart( event, data ) {
			var handle;
			var handleOrigin;
			var listeners;
			var moveEvent;
			var endEvent;
			var outEvent;
			// Ignore event if any handle is disabled
			if ( data.handleNumbers.some( isHandleDisabled ) ) {
				return;
			}
			if ( data.handleNumbers.length === 1 ) {
				handleOrigin = scope_Handles[ data.handleNumbers[ 0 ] ];
				handle = handleOrigin.children[ 0 ];
				scope_ActiveHandlesCount += 1;
				// Mark the handle as 'active' so it can be styled.
				addClass( handle, options.cssClasses.active );
			}
			// A drag should never propagate up to the 'tap' event.
			event.stopPropagation();
			// Record the event listeners.
			listeners = [];
			// Attach the move and end events.
			moveEvent = attachEvent( actions.move, scope_DocumentElement, eventMove, {
				// The event target has changed so we need to propagate the original one so that we keep
				// relying on it to extract target touches.
				target: event.target,
				handle: handle,
				connect: data.connect,
				listeners: listeners,
				startCalcPoint: event.calcPoint,
				baseSize: baseSize(),
				pageOffset: event.pageOffset,
				handleNumbers: data.handleNumbers,
				buttonsProperty: event.buttons,
				locations: scope_Locations.slice()
			} );
			endEvent = attachEvent( actions.end, scope_DocumentElement, eventEnd, {
				target: event.target,
				handle: handle,
				listeners: listeners,
				doNotReject: true,
				handleNumbers: data.handleNumbers
			} );
			outEvent = attachEvent( 'mouseout', scope_DocumentElement, documentLeave, {
				target: event.target,
				handle: handle,
				listeners: listeners,
				doNotReject: true,
				handleNumbers: data.handleNumbers
			} );
			// We want to make sure we pushed the listeners in the listener list rather than creating
			// a new one as it has already been passed to the event handlers.
			listeners.push.apply( listeners, moveEvent.concat( endEvent, outEvent ) );
			// Text selection isn't an issue on touch devices,
			// so adding cursor styles can be skipped.
			if ( event.cursor ) {
				// Prevent the 'I' cursor and extend the range-drag cursor.
				scope_Body.style.cursor = getComputedStyle( event.target ).cursor;
				// Mark the target with a dragging state.
				if ( scope_Handles.length > 1 ) {
					addClass( scope_Target, options.cssClasses.drag );
				}
				// Prevent text selection when dragging the handles.
				// In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move,
				// which is scroll blocking. The selectstart event is supported by FireFox starting from version 52,
				// meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there.
				// The 'cursor' flag is false.
				// See: http://caniuse.com/#search=selectstart
				scope_Body.addEventListener( 'selectstart', preventDefault, false );
			}
			data.handleNumbers.forEach( function( handleNumber ) {
				fireEvent( 'start', handleNumber );
			} );
		}
		// Move closest handle to tapped location.
		function eventTap( event ) {
			var proposal;
			var handleNumber;
			// The tap event shouldn't propagate up
			event.stopPropagation();
			proposal = calcPointToPercentage( event.calcPoint );
			handleNumber = getClosestHandle( proposal );
			// Tackle the case that all handles are 'disabled'.
			if ( handleNumber === false ) {
				return;
			}
			// Flag the slider as it is now in a transitional state.
			// Transition takes a configurable amount of ms (default 300). Re-enable the slider after that.
			if ( ! options.events.snap ) {
				addClassFor( scope_Target, options.cssClasses.tap, options.animationDuration );
			}
			setHandle( handleNumber, proposal, true, true );
			setZindex();
			fireEvent( 'slide', handleNumber, true );
			fireEvent( 'update', handleNumber, true );
			if ( ! options.events.snap ) {
				fireEvent( 'change', handleNumber, true );
				fireEvent( 'set', handleNumber, true );
			} else {
				eventStart( event, { handleNumbers: [ handleNumber ] } );
			}
		}
		// Fires a 'hover' event for a hovered mouse/pen position.
		function eventHover( event ) {
			var proposal = calcPointToPercentage( event.calcPoint );
			var to = scope_Spectrum.getStep( proposal );
			var value = scope_Spectrum.fromStepping( to );
			Object.keys( scope_Events ).forEach( function( targetEvent ) {
				if ( 'hover' === targetEvent.split( '.' )[ 0 ] ) {
					scope_Events[ targetEvent ].forEach( function( callback ) {
						callback.call( scope_Self, value );
					} );
				}
			} );
		}
		// Handles keydown on focused handles
		// Don't move the document when pressing arrow keys on focused handles
		function eventKeydown( event, handleNumber ) {
			var horizontalKeys;
			var verticalKeys;
			var largeStepKeys;
			var edgeKeys;
			var key;
			var isLargeDown;
			var isLargeUp;
			var isDown;
			var isUp;
			var isMin;
			var isMax;
			var to;
			var direction;
			var steps;
			var step;
			if ( isSliderDisabled() || isHandleDisabled( handleNumber ) ) {
				return false;
			}
			horizontalKeys = [ 'Left', 'Right' ];
			verticalKeys = [ 'Down', 'Up' ];
			largeStepKeys = [ 'PageDown', 'PageUp' ];
			edgeKeys = [ 'Home', 'End' ];
			if ( options.dir && ! options.ort ) {
				// On an right-to-left slider, the left and right keys act inverted
				horizontalKeys.reverse();
			} else if ( options.ort && ! options.dir ) {
				// On a top-to-bottom slider, the up and down keys act inverted
				verticalKeys.reverse();
				largeStepKeys.reverse();
			}
			// Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
			key = event.key.replace( 'Arrow', '' );
			isLargeDown = key === largeStepKeys[ 0 ];
			isLargeUp = key === largeStepKeys[ 1 ];
			isDown = key === verticalKeys[ 0 ] || key === horizontalKeys[ 0 ] || isLargeDown;
			isUp = key === verticalKeys[ 1 ] || key === horizontalKeys[ 1 ] || isLargeUp;
			isMin = key === edgeKeys[ 0 ];
			isMax = key === edgeKeys[ 1 ];
			if ( ! isDown && ! isUp && ! isMin && ! isMax ) {
				return true;
			}
			event.preventDefault();
			if ( isUp || isDown ) {
				direction = isDown ? 0 : 1;
				steps = getNextStepsForHandle( handleNumber );
				step = steps[ direction ];
				// At the edge of a slider, do nothing
				if ( step === null ) {
					return false;
				}
				// No step set, use the default of 10% of the sub-range
				if ( step === false ) {
					step = scope_Spectrum.getDefaultStep( scope_Locations[ handleNumber ], isDown, options.keyboardDefaultStep );
				}
				if ( isLargeUp || isLargeDown ) {
					step *= options.keyboardPageMultiplier;
				} else {
					step *= options.keyboardMultiplier;
				}
				// Step over zero-length ranges (#948);
				step = Math.max( step, 0.0000001 );
				// Decrement for down steps
				step = ( isDown ? -1 : 1 ) * step;
				to = scope_Values[ handleNumber ] + step;
			} else if ( isMax ) {
				// End key
				to = options.spectrum.xVal[ options.spectrum.xVal.length - 1 ];
			} else {
				// Home key
				to = options.spectrum.xVal[ 0 ];
			}
			setHandle( handleNumber, scope_Spectrum.toStepping( to ), true, true );
			fireEvent( 'slide', handleNumber );
			fireEvent( 'update', handleNumber );
			fireEvent( 'change', handleNumber );
			fireEvent( 'set', handleNumber );
			return false;
		}
		// Attach events to several slider parts.
		function bindSliderEvents( behaviour ) {
			var handleBefore;
			var handleAfter;
			var eventHolders;
			var handlesToDrag;
			var handleNumbersToDrag;
			// Attach the standard drag event to the handles.
			if ( ! behaviour.fixed ) {
				scope_Handles.forEach( function( handle, index ) {
					// These events are only bound to the visual handle
					// element, not the 'real' origin element.
					attachEvent( actions.start, handle.children[ 0 ], eventStart, {
						handleNumbers: [ index ]
					} );
				} );
			}
			// Attach the tap event to the slider base.
			if ( behaviour.tap ) {
				attachEvent( actions.start, scope_Base, eventTap, {} );
			}
			// Fire hover events
			if ( behaviour.hover ) {
				attachEvent( actions.move, scope_Base, eventHover, {
					hover: true
				} );
			}
			// Make the range draggable.
			if ( behaviour.drag ) {
				scope_Connects.forEach( function( connect, index ) {
					if ( connect === false || index === 0 || index === scope_Connects.length - 1 ) {
						return;
					}
					handleBefore = scope_Handles[ index - 1 ];
					handleAfter = scope_Handles[ index ];
					eventHolders = [ connect ];
					handlesToDrag = [ handleBefore, handleAfter ];
					handleNumbersToDrag = [ index - 1, index ];
					addClass( connect, options.cssClasses.draggable );
					// When the range is fixed, the entire range can
					// be dragged by the handles. The handle in the first
					// origin will propagate the start event upward,
					// but it needs to be bound manually on the other.
					if ( behaviour.fixed ) {
						eventHolders.push( handleBefore.children[ 0 ] );
						eventHolders.push( handleAfter.children[ 0 ] );
					}
					if ( behaviour.dragAll ) {
						handlesToDrag = scope_Handles;
						handleNumbersToDrag = scope_HandleNumbers;
					}
					eventHolders.forEach( function( eventHolder ) {
						attachEvent( actions.start, eventHolder, eventStart, {
							handles: handlesToDrag,
							handleNumbers: handleNumbersToDrag,
							connect: connect
						} );
					} );
				} );
			}
		}
		// Attach an event to this slider, possibly including a namespace
		function bindEvent( namespacedEvent, callback ) {
			scope_Events[ namespacedEvent ] = scope_Events[ namespacedEvent ] || [];
			scope_Events[ namespacedEvent ].push( callback );
			// If the event bound is 'update,' fire it immediately for all handles.
			if ( namespacedEvent.split( '.' )[ 0 ] === 'update' ) {
				scope_Handles.forEach( function( a, index ) {
					fireEvent( 'update', index );
				} );
			}
		}
		function isInternalNamespace( namespace ) {
			return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips;
		}
		// Undo attachment of event
		function removeEvent( namespacedEvent ) {
			var event = namespacedEvent && namespacedEvent.split( '.' )[ 0 ];
			var namespace = event ? namespacedEvent.substring( event.length ) : namespacedEvent;
			Object.keys( scope_Events ).forEach( function( bind ) {
				var tEvent = bind.split( '.' )[ 0 ];
				var tNamespace = bind.substring( tEvent.length );
				if ( ( ! event || event === tEvent ) && ( ! namespace || namespace === tNamespace ) ) {
					// only delete protected internal event if intentional
					if ( ! isInternalNamespace( tNamespace ) || namespace === tNamespace ) {
						delete scope_Events[ bind ];
					}
				}
			} );
		}
		// External event handling
		function fireEvent( eventName, handleNumber, tap ) {
			Object.keys( scope_Events ).forEach( function( targetEvent ) {
				var eventType = targetEvent.split( '.' )[ 0 ];
				if ( eventName === eventType ) {
					scope_Events[ targetEvent ].forEach( function( callback ) {
						callback.call(
							// Use the slider public API as the scope ('this')
							scope_Self,
							// Return values as array, so arg_1[arg_2] is always valid.
							scope_Values.map( options.format.to ),
							// Handle index, 0 or 1
							handleNumber,
							// Un-formatted slider values
							scope_Values.slice(),
							// Event is fired by tap, true or false
							tap || false,
							// Left offset of the handle, in relation to the slider
							scope_Locations.slice(),
							// add the slider public API to an accessible parameter when this is unavailable
							scope_Self );
					} );
				}
			} );
		}
		// Split out the handle positioning logic so the Move event can use it, too
		function checkHandlePosition( reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps ) {
			var distance;
			// For sliders with multiple handles, limit movement to the other handle.
			// Apply the margin option by adding it to the handle positions.
			if ( scope_Handles.length > 1 && ! options.events.unconstrained ) {
				if ( lookBackward && handleNumber > 0 ) {
					distance = scope_Spectrum.getAbsoluteDistance( reference[ handleNumber - 1 ], options.margin, false );
					to = Math.max( to, distance );
				}
				if ( lookForward && handleNumber < scope_Handles.length - 1 ) {
					distance = scope_Spectrum.getAbsoluteDistance( reference[ handleNumber + 1 ], options.margin, true );
					to = Math.min( to, distance );
				}
			}
			// The limit option has the opposite effect, limiting handles to a
			// maximum distance from another. Limit must be > 0, as otherwise
			// handles would be unmovable.
			if ( scope_Handles.length > 1 && options.limit ) {
				if ( lookBackward && handleNumber > 0 ) {
					distance = scope_Spectrum.getAbsoluteDistance( reference[ handleNumber - 1 ], options.limit, false );
					to = Math.min( to, distance );
				}
				if ( lookForward && handleNumber < scope_Handles.length - 1 ) {
					distance = scope_Spectrum.getAbsoluteDistance( reference[ handleNumber + 1 ], options.limit, true );
					to = Math.max( to, distance );
				}
			}
			// The padding option keeps the handles a certain distance from the
			// edges of the slider. Padding must be > 0.
			if ( options.padding ) {
				if ( handleNumber === 0 ) {
					distance = scope_Spectrum.getAbsoluteDistance( 0, options.padding[ 0 ], false );
					to = Math.max( to, distance );
				}
				if ( handleNumber === scope_Handles.length - 1 ) {
					distance = scope_Spectrum.getAbsoluteDistance( 100, options.padding[ 1 ], true );
					to = Math.min( to, distance );
				}
			}
			if ( ! smoothSteps ) {
				to = scope_Spectrum.getStep( to );
			}
			// Limit percentage to the 0 - 100 range
			to = limit( to );
			// Return false if handle can't move
			if ( to === reference[ handleNumber ] && ! getValue ) {
				return false;
			}
			return to;
		}
		// Uses slider orientation to create CSS rules. a = base value;
		function inRuleOrder( v, a ) {
			var o = options.ort;
			return ( o ? a : v ) + ', ' + ( o ? v : a );
		}
		// Moves handle(s) by a percentage
		// (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...])
		function moveHandles( upward, proposal, locations, handleNumbers, connect ) {
			var proposals = locations.slice();
			// Store first handle now, so we still have it in case handleNumbers is reversed
			var firstHandle = handleNumbers[ 0 ];
			var smoothSteps = options.events.smoothSteps;
			var b = [ ! upward, upward ];
			var f = [ upward, ! upward ];
			var state = false;
			// Copy handleNumbers so we don't change the dataset
			handleNumbers = handleNumbers.slice();
			// Check to see which handle is 'leading'.
			// If that one can't move the second can't either.
			if ( upward ) {
				handleNumbers.reverse();
			}
			// Step 1: get the maximum percentage that any of the handles can move
			if ( handleNumbers.length > 1 ) {
				handleNumbers.forEach( function( handleNumber, o ) {
					var to = checkHandlePosition( proposals, handleNumber, proposals[ handleNumber ] + proposal, b[ o ], f[ o ], false, smoothSteps );
					// Stop if one of the handles can't move.
					if ( to === false ) {
						proposal = 0;
					} else {
						proposal = to - proposals[ handleNumber ];
						proposals[ handleNumber ] = to;
					}
				} );
			} else { // If using one handle, check backward AND forward
				b = f = [ true ];
			}
			// Step 2: Try to set the handles with the found percentage
			handleNumbers.forEach( function( handleNumber, o ) {
				state =
                    setHandle( handleNumber, locations[ handleNumber ] + proposal, b[ o ], f[ o ], false, smoothSteps ) || state;
			} );
			// Step 3: If a handle moved, fire events
			if ( state ) {
				handleNumbers.forEach( function( handleNumber ) {
					fireEvent( 'update', handleNumber );
					fireEvent( 'slide', handleNumber );
				} );
				// If target is a connect, then fire drag event
				if ( connect !== undefined ) {
					fireEvent( 'drag', firstHandle );
				}
			}
		}
		// Takes a base value and an offset. This offset is used for the connect bar size.
		// In the initial design for this feature, the origin element was 1% wide.
		// Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature
		// in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223
		function transformDirection( a, b ) {
			return options.dir ? 100 - a - b : a;
		}
		// Updates scope_Locations and scope_Values, updates visual state
		function updateHandlePosition( handleNumber, to ) {
			var translation;
			var translateRule;
			// Update locations.
			scope_Locations[ handleNumber ] = to;
			// Convert the value to the slider stepping/range.
			scope_Values[ handleNumber ] = scope_Spectrum.fromStepping( to );
			translation = transformDirection( to, 0 ) - scope_DirOffset;
			translateRule = 'translate(' + inRuleOrder( translation + '%', '0' ) + ')';
			scope_Handles[ handleNumber ].style[ options.transformRule ] = translateRule;
			updateConnect( handleNumber );
			updateConnect( handleNumber + 1 );
		}
		// Handles before the slider middle are stacked later = higher,
		// Handles after the middle later is lower
		// [[7] [8] .......... | .......... [5] [4]
		function setZindex() {
			scope_HandleNumbers.forEach( function( handleNumber ) {
				var dir = scope_Locations[ handleNumber ] > 50 ? -1 : 1;
				var zIndex = 3 + ( scope_Handles.length + ( dir * handleNumber ) );
				scope_Handles[ handleNumber ].style.zIndex = String( zIndex );
			} );
		}
		// Test suggested values and apply margin, step.
		// if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436)
		function setHandle( handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps ) {
			if ( ! exactInput ) {
				to = checkHandlePosition( scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps );
			}
			if ( to === false ) {
				return false;
			}
			updateHandlePosition( handleNumber, to );
			return true;
		}
		// Updates style attribute for connect nodes
		function updateConnect( index ) {
			var l;
			var h;
			var connectWidth;
			var translateRule;
			var scaleRule;
			// Skip connects set to false
			if ( ! scope_Connects[ index ] ) {
				return;
			}
			l = 0;
			h = 100;
			if ( index !== 0 ) {
				l = scope_Locations[ index - 1 ];
			}
			if ( index !== scope_Connects.length - 1 ) {
				h = scope_Locations[ index ];
			}
			// We use two rules:
			// 'translate' to change the left/top offset;
			// 'scale' to change the width of the element;
			// As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base)
			connectWidth = h - l;
			translateRule = 'translate(' + inRuleOrder( transformDirection( l, connectWidth ) + '%', '0' ) + ')';
			scaleRule = 'scale(' + inRuleOrder( connectWidth / 100, '1' ) + ')';
			scope_Connects[ index ].style[ options.transformRule ] =
                translateRule + ' ' + scaleRule;
		}
		// Parses value passed to .set method. Returns current value if not parse-able.
		function resolveToValue( to, handleNumber ) {
			// Setting with null indicates an 'ignore'.
			// Inputting 'false' is invalid.
			if ( to === null || to === false || to === undefined ) {
				return scope_Locations[ handleNumber ];
			}
			// If a formatted number was passed, attempt to decode it.
			if ( typeof to === 'number' ) {
				to = String( to );
			}
			to = options.format.from( to );
			if ( to !== false ) {
				to = scope_Spectrum.toStepping( to );
			}
			// If parsing the number failed, use the current value.
			if ( to === false || isNaN( to ) ) {
				return scope_Locations[ handleNumber ];
			}
			return to;
		}
		function scope_HandleNumbersCallback( exactInput ) {
			return function( handleNumber ) {
				setHandle( handleNumber, scope_Locations[ handleNumber ], true, true, exactInput );
			};
		}
		// Set the slider value.
		function valueSet( input, fireSetEvent, exactInput ) {
			var values = asArray( input );
			var isInit = scope_Locations[ 0 ] === undefined;
			var i;
			var space_1;
			// Event fires by default
			fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent;
			// Animation is optional.
			// Make sure the initial values were set before using animated placement.
			if ( options.animate && ! isInit ) {
				addClassFor( scope_Target, options.cssClasses.tap, options.animationDuration );
			}
			// First pass, without lookAhead but with lookBackward. Values are set from left to right.
			scope_HandleNumbers.forEach( function( handleNumber ) {
				setHandle( handleNumber, resolveToValue( values[ handleNumber ], handleNumber ), true, false, exactInput );
			} );
			i = scope_HandleNumbers.length === 1 ? 0 : 1;
			// Spread handles evenly across the slider if the range has no size (min=max)
			if ( isInit && scope_Spectrum.hasNoSize() ) {
				exactInput = true;
				scope_Locations[ 0 ] = 0;
				if ( scope_HandleNumbers.length > 1 ) {
					space_1 = 100 / ( scope_HandleNumbers.length - 1 );
					scope_HandleNumbers.forEach( function( handleNumber ) {
						scope_Locations[ handleNumber ] = handleNumber * space_1;
					} );
				}
			}
			// Secondary passes. Now that all base values are set, apply constraints.
			// Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009)
			for ( ; i < scope_HandleNumbers.length; ++i ) {
				scope_HandleNumbers.forEach( scope_HandleNumbersCallback( exactInput ) );
			}
			setZindex();
			scope_HandleNumbers.forEach( function( handleNumber ) {
				fireEvent( 'update', handleNumber );
				// Fire the event only for handles that received a new value, as per #579
				if ( values[ handleNumber ] !== null && fireSetEvent ) {
					fireEvent( 'set', handleNumber );
				}
			} );
		}
		// Reset slider to initial values
		function valueReset( fireSetEvent ) {
			valueSet( options.start, fireSetEvent );
		}
		// Set value for a single handle
		function valueSetHandle( handleNumber, value, fireSetEvent, exactInput ) {
			// Ensure numeric input
			handleNumber = Number( handleNumber );
			if ( ! ( handleNumber >= 0 && handleNumber < scope_HandleNumbers.length ) ) {
				throw new Error( 'noUiSlider: invalid handle number, got: ' + handleNumber );
			}
			// Look both backward and forward, since we don't want this handle to "push" other handles (#960);
			// The exactInput argument can be used to ignore slider stepping (#436)
			setHandle( handleNumber, resolveToValue( value, handleNumber ), true, true, exactInput );
			fireEvent( 'update', handleNumber );
			if ( fireSetEvent ) {
				fireEvent( 'set', handleNumber );
			}
		}
		// Get the slider value.
		function valueGet( unencoded ) {
			var values;
			if ( unencoded === void 0 ) {
				unencoded = false;
			}
			if ( unencoded ) {
				// return a copy of the raw values
				return scope_Values.length === 1 ? scope_Values[ 0 ] : scope_Values.slice( 0 );
			}
			values = scope_Values.map( options.format.to );
			// If only one handle is used, return a single value.
			if ( values.length === 1 ) {
				return values[ 0 ];
			}
			return values;
		}
		// Removes classes from the root and empties it.
		function destroy() {
			// remove protected internal listeners
			removeEvent( INTERNAL_EVENT_NS.aria );
			removeEvent( INTERNAL_EVENT_NS.tooltips );
			Object.keys( options.cssClasses ).forEach( function( key ) {
				removeClass( scope_Target, options.cssClasses[ key ] );
			} );
			while ( scope_Target.firstChild ) {
				scope_Target.removeChild( scope_Target.firstChild );
			}
			delete scope_Target.noUiSlider;
		}
		function getNextStepsForHandle( handleNumber ) {
			var location = scope_Locations[ handleNumber ];
			var nearbySteps = scope_Spectrum.getNearbySteps( location );
			var value = scope_Values[ handleNumber ];
			var increment = nearbySteps.thisStep.step;
			var decrement = null;
			var stepDecimals;
			// If snapped, directly use defined step value
			if ( options.snap ) {
				return [
					value - nearbySteps.stepBefore.startValue || null,
					nearbySteps.stepAfter.startValue - value || null
				];
			}
			// If the next value in this step moves into the next step,
			// the increment is the start of the next step - the current value
			if ( increment !== false ) {
				if ( value + increment > nearbySteps.stepAfter.startValue ) {
					increment = nearbySteps.stepAfter.startValue - value;
				}
			}
			// If the value is beyond the starting point
			if ( value > nearbySteps.thisStep.startValue ) {
				decrement = nearbySteps.thisStep.step;
			} else if ( nearbySteps.stepBefore.step === false ) {
				decrement = false;
			} else { // If a handle is at the start of a step, it always steps back into the previous step first
				decrement = value - nearbySteps.stepBefore.highestStep;
			}
			// Now, if at the slider edges, there is no in/decrement
			if ( location === 100 ) {
				increment = null;
			} else if ( location === 0 ) {
				decrement = null;
			}
			// As per #391, the comparison for the decrement step can have some rounding issues.
			stepDecimals = scope_Spectrum.countStepDecimals();
			// Round per #391
			if ( increment !== null && increment !== false ) {
				increment = Number( increment.toFixed( stepDecimals ) );
			}
			if ( decrement !== null && decrement !== false ) {
				decrement = Number( decrement.toFixed( stepDecimals ) );
			}
			return [ decrement, increment ];
		}
		// Get the current step size for the slider.
		function getNextSteps() {
			return scope_HandleNumbers.map( getNextStepsForHandle );
		}
		// Updatable: margin, limit, padding, step, range, animate, snap
		function updateOptions( optionsToUpdate, fireSetEvent ) {
			// Spectrum is created using the range, snap, direction and step options.
			// 'snap' and 'step' can be updated.
			// If 'snap' and 'step' are not passed, they should remain unchanged.
			var v = valueGet();
			var updateAble = [
				'margin',
				'limit',
				'padding',
				'range',
				'animate',
				'snap',
				'step',
				'format',
				'pips',
				'tooltips'
			];
			var newOptions;
			// Only change options that we're actually passed to update.
			updateAble.forEach( function( name ) {
				// Check for undefined. null removes the value.
				if ( optionsToUpdate[ name ] !== undefined ) {
					originalOptions[ name ] = optionsToUpdate[ name ];
				}
			} );
			newOptions = testOptions( originalOptions );
			// Load new options into the slider state
			updateAble.forEach( function( name ) {
				if ( optionsToUpdate[ name ] !== undefined ) {
					options[ name ] = newOptions[ name ];
				}
			} );
			scope_Spectrum = newOptions.spectrum;
			// Limit, margin and padding depend on the spectrum but are stored outside of it. (#677)
			options.margin = newOptions.margin;
			options.limit = newOptions.limit;
			options.padding = newOptions.padding;
			// Update pips, removes existing.
			if ( options.pips ) {
				pips( options.pips );
			} else {
				removePips();
			}
			// Update tooltips, removes existing.
			if ( options.tooltips ) {
				tooltips();
			} else {
				removeTooltips();
			}
			// Invalidate the current positioning so valueSet forces an update.
			scope_Locations = [];
			valueSet( isSet( optionsToUpdate.start ) ? optionsToUpdate.start : v, fireSetEvent );
		}
		// Initialization steps
		function setupSlider() {
			// Create the base element, initialize HTML and set classes.
			// Add handles and connect elements.
			scope_Base = addSlider( scope_Target );
			addElements( options.connect, scope_Base );
			// Attach user events.
			bindSliderEvents( options.events );
			// Use the public value method to set the start values.
			valueSet( options.start );
			if ( options.pips ) {
				pips( options.pips );
			}
			if ( options.tooltips ) {
				tooltips();
			}
			aria();
		}
		setupSlider();
		scope_Self = {
			destroy: destroy,
			steps: getNextSteps,
			on: bindEvent,
			off: removeEvent,
			get: valueGet,
			set: valueSet,
			setHandle: valueSetHandle,
			reset: valueReset,
			disable: disable,
			enable: enable,
			// Exposed for unit testing, don't use this in your application.
			__moveHandles: function( upward, proposal, handleNumbers ) {
				moveHandles( upward, proposal, scope_Locations, handleNumbers );
			},
			options: originalOptions,
			updateOptions: updateOptions,
			target: scope_Target,
			removePips: removePips,
			removeTooltips: removeTooltips,
			getPositions: function() {
				return scope_Locations.slice();
			},
			getTooltips: function() {
				return scope_Tooltips;
			},
			getOrigins: function() {
				return scope_Handles;
			},
			pips: pips // Issue #594
		};
		return scope_Self;
	}
	// Run the standard initializer
	function initialize( target, originalOptions ) {
		var options;
		var api;
		if ( ! target || ! target.nodeName ) {
			throw new Error( 'noUiSlider: create requires a single element, got: ' + target );
		}
		// Throw an error if the slider was already initialized.
		if ( target.noUiSlider ) {
			throw new Error( 'noUiSlider: Slider was already initialized.' );
		}
		// Test the options and create the slider environment;
		options = testOptions( originalOptions );
		api = scope( target, options, originalOptions );
		target.noUiSlider = api;
		return api;
	}
	nouislider = {
		// Exposed for unit testing, don't use this in your application.
		__spectrum: Spectrum,
		// A reference to the default classes, allows global changes.
		// Use the cssClasses option for changes to one slider.
		cssClasses: cssClasses,
		create: initialize
	};

	exports.create = initialize;
	exports.cssClasses = cssClasses;
	exports.default = nouislider;

	Object.defineProperty( exports, '__esModule', { value: true } );
} ) ) );
assets/js/nouislider.min.js000064400000071475150755142450012005 0ustar00!function(e){"use strict";!function(Pe){"use strict";var e,l={to:function(e){return e===undefined?"":e.toFixed(2)},from:Number},u={target:"target",base:"base",origin:"origin",handle:"handle",handleLower:"handle-lower",handleUpper:"handle-upper",touchArea:"touch-area",horizontal:"horizontal",vertical:"vertical",background:"background",connect:"connect",connects:"connects",ltr:"ltr",rtl:"rtl",textDirectionLtr:"txt-dir-ltr",textDirectionRtl:"txt-dir-rtl",draggable:"draggable",drag:"state-drag",tap:"state-tap",active:"active",tooltip:"tooltip",pips:"pips",pipsHorizontal:"pips-horizontal",pipsVertical:"pips-vertical",marker:"marker",markerHorizontal:"marker-horizontal",markerVertical:"marker-vertical",markerNormal:"marker-normal",markerLarge:"marker-large",markerSub:"marker-sub",value:"value",valueHorizontal:"value-horizontal",valueVertical:"value-vertical",valueNormal:"value-normal",valueLarge:"value-large",valueSub:"value-sub"},Ce={tooltips:".__tooltips",aria:".__aria"},r=function(){function e(t,e,r){var n;var i=[];this.xPct=[];this.xVal=[];this.xSteps=[];this.xNumSteps=[];this.xHighestCompleteStep=[];this.xSteps=[r||false];this.xNumSteps=[false];this.snap=e;Object.keys(t).forEach(function(e){i.push([Oe(t[e]),e])});i.sort(function(e,t){return e[0][0]-t[0][0]});for(n=0;n<i.length;n++)this.handleEntryPoint(i[n][1],i[n][0]);this.xNumSteps=this.xSteps.slice(0);for(n=0;n<this.xNumSteps.length;n++)this.handleStepPoint(n,this.xNumSteps[n])}e.prototype.getDistance=function(e){var t;var r=[];for(t=0;t<this.xNumSteps.length-1;t++)r[t]=p(this.xVal,e,t);return r};e.prototype.getAbsoluteDistance=function(e,t,r){var n=0;var i;var a=1;var s;var o=0;var l=0;var u=0;var f=0;if(e<this.xPct[this.xPct.length-1])while(e>this.xPct[n+1])n++;else if(e===this.xPct[this.xPct.length-1])n=this.xPct.length-2;if(!r&&e===this.xPct[n+1])n++;if(t===null)t=[];s=t[n];if(r)i=(e-this.xPct[n])/(this.xPct[n+1]-this.xPct[n]);else i=(this.xPct[n+1]-e)/(this.xPct[n+1]-this.xPct[n]);while(s>0){o=this.xPct[n+1+f]-this.xPct[n+f];if(t[n+f]*a+100-i*100>100){l=o*i;a=(s-100*i)/t[n+f];i=1}else{l=t[n+f]*o/100*a;a=0}if(r){u=u-l;if(this.xPct.length+f>=1)f--}else{u=u+l;if(this.xPct.length-f>=1)f++}s=t[n+f]*a}return e+u};e.prototype.toStepping=function(e){e=b(this.xVal,this.xPct,e);return e};e.prototype.fromStepping=function(e){return S(this.xVal,this.xPct,e)};e.prototype.getStep=function(e){e=x(this.xPct,this.xSteps,this.snap,e);return e};e.prototype.getDefaultStep=function(e,t,r){var n=v(e,this.xPct);if(e===100||t&&e===this.xPct[n-1])n=Math.max(n-1,1);return(this.xVal[n]-this.xVal[n-1])/r};e.prototype.getNearbySteps=function(e){var t=v(e,this.xPct);return{stepBefore:{startValue:this.xVal[t-2],step:this.xNumSteps[t-2],highestStep:this.xHighestCompleteStep[t-2]},thisStep:{startValue:this.xVal[t-1],step:this.xNumSteps[t-1],highestStep:this.xHighestCompleteStep[t-1]},stepAfter:{startValue:this.xVal[t],step:this.xNumSteps[t],highestStep:this.xHighestCompleteStep[t]}}};e.prototype.countStepDecimals=function(){var e=this.xNumSteps.map(f);return Math.max.apply(null,e)};e.prototype.hasNoSize=function(){return this.xVal[0]===this.xVal[this.xVal.length-1]};e.prototype.convert=function(e){return this.getStep(this.toStepping(e))};e.prototype.handleEntryPoint=function(e,t){var r;var n;if(e==="min")r=0;else if(e==="max")r=100;else r=parseFloat(e);if(!s(r)||!s(t[0]))throw new Error("noUiSlider: 'range' value isn't numeric.");this.xPct.push(r);this.xVal.push(t[0]);n=Number(t[1]);if(!r){if(!isNaN(n))this.xSteps[0]=n}else this.xSteps.push(isNaN(n)?false:n);this.xHighestCompleteStep.push(0)};e.prototype.handleStepPoint=function(e,t){var r;var n;var i;if(!t)return;if(this.xVal[e]===this.xVal[e+1]){this.xSteps[e]=this.xHighestCompleteStep[e]=this.xVal[e];return}this.xSteps[e]=p([this.xVal[e],this.xVal[e+1]],t,0)/c(this.xPct[e],this.xPct[e+1]);r=(this.xVal[e+1]-this.xVal[e])/this.xNumSteps[e];n=Math.ceil(Number(r.toFixed(3))-1);i=this.xVal[e]+this.xNumSteps[e]*n;this.xHighestCompleteStep[e]=i};return e}(),t=(Pe.PipsMode=void 0,Pe.PipsMode||(Pe.PipsMode={})),n=(t.Range="range",t.Steps="steps",t.Positions="positions",t.Count="count",t.Values="values",Pe.PipsType=void 0,Pe.PipsType||(Pe.PipsType={}));function i(e){return a(e)&&typeof e.from==="function"}function a(e){return typeof e==="object"&&typeof e.to==="function"}function Ne(e){e.parentElement.removeChild(e)}function Ve(e){return e!==null&&e!==undefined}function Ae(e){e.preventDefault()}function ke(e){return e.filter(function(e){return!this[e]?this[e]=true:false},{})}function o(e,t){return Math.round(e/t)*t}function Me(e,t){var r=e.getBoundingClientRect();var n=e.ownerDocument;var i=n.documentElement;var a=je(n);if(/webkit.*Chrome.*Mobile/i.test(navigator.userAgent))a.x=0;return t?r.top+a.y-i.clientTop:r.left+a.x-i.clientLeft}function s(e){return typeof e==="number"&&!isNaN(e)&&isFinite(e)}function Ue(e,t,r){if(r>0){Le(e,t);setTimeout(function(){Te(e,t)},r)}}function De(e){return Math.max(Math.min(e,100),0)}function Oe(e){return Array.isArray(e)?e:[e]}function f(e){var t;e=String(e);t=e.split(".");return t.length>1?t[1].length:0}function Le(e,t){if(e.classList&&!/\s/.test(t))e.classList.add(t);else e.className+=" "+t}function Te(e,t){if(e.classList&&!/\s/.test(t))e.classList.remove(t);else e.className=e.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")}function ze(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function je(e){var t=window.pageXOffset!==undefined;var r=(e.compatMode||"")==="CSS1Compat";var n=t?window.pageXOffset:r?e.documentElement.scrollLeft:e.body.scrollLeft;var i=t?window.pageYOffset:r?e.documentElement.scrollTop:e.body.scrollTop;return{x:n,y:i}}function He(){return window.navigator.pointerEnabled?{start:"pointerdown",move:"pointermove",end:"pointerup"}:window.navigator.msPointerEnabled?{start:"MSPointerDown",move:"MSPointerMove",end:"MSPointerUp"}:{start:"mousedown touchstart",move:"mousemove touchmove",end:"mouseup touchend"}}function Fe(){var e=false;try{var t=Object.defineProperty({},"passive",{get:function(){e=true}});window.addEventListener("test",null,t)}catch(e){}return e}function Re(){return window.CSS&&CSS.supports&&CSS.supports("touch-action","none")}function c(e,t){return 100/(t-e)}function p(e,t,r){return t*100/(e[r+1]-e[r])}function d(e,t){return p(e,e[0]<0?t+Math.abs(e[0]):t-e[0],0)}function h(e,t){return t*(e[1]-e[0])/100+e[0]}function v(e,t){var r=1;while(e>=t[r])r+=1;return r}function b(e,t,r){var n;var i;var a;var s;var o;if(r>=e.slice(-1)[0])return 100;n=v(r,e);i=e[n-1];a=e[n];s=t[n-1];o=t[n];return s+d([i,a],r)/c(s,o)}function S(e,t,r){var n;var i;var a;var s;var o;if(r>=100)return e.slice(-1)[0];n=v(r,t);i=e[n-1];a=e[n];s=t[n-1];o=t[n];return h([i,a],(r-s)*c(s,o))}function x(e,t,r,n){var i;var a;var s;if(n===100)return n;i=v(n,e);a=e[i-1];s=e[i];if(r){if(n-a>(s-a)/2)return s;return a}if(!t[i-1])return n;return e[i-1]+o(n-e[i-1],t[i-1])}function y(e,t){if(!s(t))throw new Error("noUiSlider: 'step' is not numeric.");e.singleStep=t}function w(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric.");e.keyboardPageMultiplier=t}function E(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric.");e.keyboardMultiplier=t}function P(e,t){if(!s(t))throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric.");e.keyboardDefaultStep=t}function C(e,t){if(typeof t!=="object"||Array.isArray(t))throw new Error("noUiSlider: 'range' is not an object.");if(t.min===undefined||t.max===undefined)throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'.");e.spectrum=new r(t,e.snap||false,e.singleStep)}function N(e,t){t=Oe(t);if(!Array.isArray(t)||!t.length)throw new Error("noUiSlider: 'start' option is incorrect.");e.handles=t.length;e.start=t}function V(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'snap' option must be a boolean.");e.snap=t}function A(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'animate' option must be a boolean.");e.animate=t}function k(e,t){if(typeof t!=="number")throw new Error("noUiSlider: 'animationDuration' option must be a number.");e.animationDuration=t}function M(e,t){var r=[false];var n;if(t==="lower")t=[true,false];else if(t==="upper")t=[false,true];if(t===true||t===false){for(n=1;n<e.handles;n++)r.push(t);r.push(false)}else if(!Array.isArray(t)||!t.length||t.length!==e.handles+1)throw new Error("noUiSlider: 'connect' option doesn't match handle count.");else r=t;e.connect=r}function U(e,t){switch(t){case"horizontal":e.ort=0;break;case"vertical":e.ort=1;break;default:throw new Error("noUiSlider: 'orientation' option is invalid.")}}function m(e,t){if(!s(t))throw new Error("noUiSlider: 'margin' option must be numeric.");if(t===0)return;e.margin=e.spectrum.getDistance(t)}function D(e,t){if(!s(t))throw new Error("noUiSlider: 'limit' option must be numeric.");e.limit=e.spectrum.getDistance(t);if(!e.limit||e.handles<2)throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles.")}function O(e,t){var r;var n;var i;var a;if(!s(t)&&!Array.isArray(t))throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");if(Array.isArray(t)&&!(t.length===2||s(t[0])||s(t[1])))throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers.");if(t===0)return;if(!Array.isArray(t))t=[t,t];e.padding=[e.spectrum.getDistance(t[0]),e.spectrum.getDistance(t[1])];for(r=0;r<e.spectrum.xNumSteps.length-1;r++)if(e.padding[0][r]<0||e.padding[1][r]<0)throw new Error("noUiSlider: 'padding' option must be a positive number(s).");n=t[0]+t[1];i=e.spectrum.xVal[0];a=e.spectrum.xVal[e.spectrum.xVal.length-1];if(n/(a-i)>1)throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range.")}function L(e,t){switch(t){case"ltr":e.dir=0;break;case"rtl":e.dir=1;break;default:throw new Error("noUiSlider: 'direction' option was not recognized.")}}function T(e,t){var r;var n;var i;var a;var s;var o;var l;var u;if(typeof t!=="string")throw new Error("noUiSlider: 'behaviour' must be a string containing options.");r=t.indexOf("tap")>=0;n=t.indexOf("drag")>=0;i=t.indexOf("fixed")>=0;a=t.indexOf("snap")>=0;s=t.indexOf("hover")>=0;o=t.indexOf("unconstrained")>=0;l=t.indexOf("drag-all")>=0;u=t.indexOf("smooth-steps")>=0;if(i){if(e.handles!==2)throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles");m(e,e.start[1]-e.start[0])}if(o&&(e.margin||e.limit))throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit");e.events={tap:r||a,drag:n,dragAll:l,smoothSteps:u,fixed:i,snap:a,hover:s,unconstrained:o}}function z(e,t){var r;if(t===false)return;if(t===true||a(t)){e.tooltips=[];for(r=0;r<e.handles;r++)e.tooltips.push(t)}else{t=Oe(t);if(t.length!==e.handles)throw new Error("noUiSlider: must pass a formatter for all handles.");t.forEach(function(e){if(typeof e!=="boolean"&&!a(e))throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'.")});e.tooltips=t}}function j(e,t){if(t.length!==e.handles)throw new Error("noUiSlider: must pass a attributes for all handles.");e.handleAttributes=t}function H(e,t){if(!a(t))throw new Error("noUiSlider: 'ariaFormat' requires 'to' method.");e.ariaFormat=t}function F(e,t){if(!i(t))throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods.");e.format=t}function R(e,t){if(typeof t!=="boolean")throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean.");e.keyboardSupport=t}function _(e,t){e.documentElement=t}function B(e,t){if(typeof t!=="string"&&t!==false)throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`.");e.cssPrefix=t}function q(t,r){if(typeof r!=="object")throw new Error("noUiSlider: 'cssClasses' must be an object.");if(typeof t.cssPrefix==="string"){t.cssClasses={};Object.keys(r).forEach(function(e){t.cssClasses[e]=t.cssPrefix+r[e]})}else t.cssClasses=r}function _e(t){var r={margin:null,limit:null,padding:null,animate:true,animationDuration:300,ariaFormat:l,format:l};var n={step:{r:false,t:y},keyboardPageMultiplier:{r:false,t:w},keyboardMultiplier:{r:false,t:E},keyboardDefaultStep:{r:false,t:P},start:{r:true,t:N},connect:{r:true,t:M},direction:{r:true,t:L},snap:{r:false,t:V},animate:{r:false,t:A},animationDuration:{r:false,t:k},range:{r:true,t:C},orientation:{r:false,t:U},margin:{r:false,t:m},limit:{r:false,t:D},padding:{r:false,t:O},behaviour:{r:true,t:T},ariaFormat:{r:false,t:H},format:{r:false,t:F},tooltips:{r:false,t:z},keyboardSupport:{r:true,t:R},documentElement:{r:false,t:_},cssPrefix:{r:true,t:B},cssClasses:{r:true,t:q},handleAttributes:{r:false,t:j}};var i={connect:false,direction:"ltr",behaviour:"tap",orientation:"horizontal",keyboardSupport:true,cssPrefix:"noui-",cssClasses:u,keyboardPageMultiplier:5,keyboardMultiplier:1,keyboardDefaultStep:10};var e;var a;var s;var o;if(t.format&&!t.ariaFormat)t.ariaFormat=t.format;Object.keys(n).forEach(function(e){if(!Ve(t[e])&&i[e]===undefined){if(n[e].r)throw new Error("noUiSlider: '"+e+"' is required.");return}n[e].t(r,!Ve(t[e])?i[e]:t[e])});r.pips=t.pips;e=document.createElement("div");a=e.style.msTransform!==undefined;s=e.style.transform!==undefined;r.transformRule=s?"transform":a?"msTransform":"webkitTransform";o=[["left","top"],["right","bottom"]];r.style=o[r.dir][r.ort];return r}function X(e,g,a){var l=He();var n=Re();var j=n&&Fe();var u=e;var f;var c;var p;var i;var s;var w=g.spectrum;var b=[];var S=[];var d=[];var h=0;var o={};var v=e.ownerDocument;var m=g.documentElement||v.documentElement;var x=v.body;var H=v.dir==="rtl"||g.ort===1?0:100;var y;function E(e,t){var r=v.createElement("div");if(t)Le(r,t);e.appendChild(r);return r}function F(e,t){var r=E(e,g.cssClasses.origin);var n=E(r,g.cssClasses.handle);var i;E(n,g.cssClasses.touchArea);n.setAttribute("data-handle",String(t));if(g.keyboardSupport){n.setAttribute("tabindex","0");n.addEventListener("keydown",function(e){return oe(e,t)})}if(g.handleAttributes!==undefined){i=g.handleAttributes[t];Object.keys(i).forEach(function(e){n.setAttribute(e,i[e])})}n.setAttribute("role","slider");n.setAttribute("aria-orientation",g.ort?"vertical":"horizontal");if(t===0)Le(n,g.cssClasses.handleLower);else if(t===g.handles-1)Le(n,g.cssClasses.handleUpper);r.handle=n;return r}function R(e,t){if(!t)return false;return E(e,g.cssClasses.connect)}function _(e,t){var r=E(t,g.cssClasses.connects);var n;c=[];p=[];p.push(R(r,e[0]));for(n=0;n<g.handles;n++){c.push(F(t,n));d[n]=n;p.push(R(r,e[n+1]))}}function B(e){var t;Le(e,g.cssClasses.target);if(g.dir===0)Le(e,g.cssClasses.ltr);else Le(e,g.cssClasses.rtl);if(g.ort===0)Le(e,g.cssClasses.horizontal);else Le(e,g.cssClasses.vertical);t=getComputedStyle(e).direction;if(t==="rtl")Le(e,g.cssClasses.textDirectionRtl);else Le(e,g.cssClasses.textDirectionLtr);return E(e,g.cssClasses.base)}function q(e,t){if(!g.tooltips||!g.tooltips[t])return false;return E(e.firstChild,g.cssClasses.tooltip)}function X(){return u.hasAttribute("disabled")}function P(e){var t=c[e];return t.hasAttribute("disabled")}function Y(e){if(e!==null&&e!==undefined){c[e].setAttribute("disabled","");c[e].handle.removeAttribute("tabindex")}else{u.setAttribute("disabled","");c.forEach(function(e){e.handle.removeAttribute("tabindex")})}}function I(e){if(e!==null&&e!==undefined){c[e].removeAttribute("disabled");c[e].handle.setAttribute("tabindex","0")}else{u.removeAttribute("disabled");c.forEach(function(e){e.removeAttribute("disabled");e.handle.setAttribute("tabindex","0")})}}function C(){if(s){r("update"+Ce.tooltips);s.forEach(function(e){if(e)Ne(e)});s=null}}function W(){var n;C();s=c.map(q);t("update"+Ce.tooltips,function(e,t,r){if(!s||!g.tooltips)return;if(s[t]===false)return;n=e[t];if(g.tooltips[t]!==true)n=g.tooltips[t].to(r[t]);s[t].innerHTML=n})}function $(){r("update"+Ce.aria);t("update"+Ce.aria,function(e,t,s,r,o){d.forEach(function(e){var t=c[e];var r=D(S,e,0,true,true,true);var n=D(S,e,100,true,true,true);var i=o[e];var a=String(g.ariaFormat.to(s[e]));r=w.fromStepping(r).toFixed(1);n=w.fromStepping(n).toFixed(1);i=w.fromStepping(i).toFixed(1);t.children[0].setAttribute("aria-valuemin",r);t.children[0].setAttribute("aria-valuemax",n);t.children[0].setAttribute("aria-valuenow",i);t.children[0].setAttribute("aria-valuetext",a)})})}function G(e){var t;var r;var n;if(e.mode===Pe.PipsMode.Range||e.mode===Pe.PipsMode.Steps)return w.xVal;if(e.mode===Pe.PipsMode.Count){if(e.values<2)throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'.");t=e.values-1;r=100/t;n=[];while(t--)n[t]=t*r;n.push(100);return J(n,e.stepped)}if(e.mode===Pe.PipsMode.Positions)return J(e.values,e.stepped);if(e.mode===Pe.PipsMode.Values){if(e.stepped)return e.values.map(function(e){return w.fromStepping(w.getStep(w.toStepping(e)))});return e.values}return[]}function J(e,t){return e.map(function(e){return w.fromStepping(t?w.getStep(e):e)})}function K(v){var m=G(v);var g={};var e=w.xVal[0];var t=w.xVal[w.xVal.length-1];var b=false;var S=false;var x=0;function y(e,t){return Number((e+t).toFixed(7))}m=ke(m.slice().sort(function(e,t){return e-t}));if(m[0]!==e){m.unshift(e);b=true}if(m[m.length-1]!==t){m.push(t);S=true}m.forEach(function(e,t){var r;var n;var i;var a=e;var s=m[t+1];var o;var l;var u;var f;var c;var p;var d;var h=v.mode===Pe.PipsMode.Steps;if(h)r=w.xNumSteps[t];if(!r)r=s-a;if(s===undefined)s=a;r=Math.max(r,1e-7);for(n=a;n<=s;n=y(n,r)){o=w.toStepping(n);l=o-x;c=l/(v.density||1);p=Math.round(c);d=l/p;for(i=1;i<=p;i+=1){u=x+i*d;g[u.toFixed(5)]=[w.fromStepping(u),0]}f=m.indexOf(n)>-1?Pe.PipsType.LargeValue:h?Pe.PipsType.SmallValue:Pe.PipsType.NoValue;if(!t&&b&&n!==s)f=0;if(!(n===s&&S))g[o.toFixed(5)]=[n,f];x=o}});return g}function Q(t,i,a){var e,r;var s=v.createElement("div");var o=(e={},e[Pe.PipsType.None]="",e[Pe.PipsType.NoValue]=g.cssClasses.valueNormal,e[Pe.PipsType.LargeValue]=g.cssClasses.valueLarge,e[Pe.PipsType.SmallValue]=g.cssClasses.valueSub,e);var l=(r={},r[Pe.PipsType.None]="",r[Pe.PipsType.NoValue]=g.cssClasses.markerNormal,r[Pe.PipsType.LargeValue]=g.cssClasses.markerLarge,r[Pe.PipsType.SmallValue]=g.cssClasses.markerSub,r);var u=[g.cssClasses.valueHorizontal,g.cssClasses.valueVertical];var f=[g.cssClasses.markerHorizontal,g.cssClasses.markerVertical];Le(s,g.cssClasses.pips);Le(s,g.ort===0?g.cssClasses.pipsHorizontal:g.cssClasses.pipsVertical);function c(e,t){var r=t===g.cssClasses.value;var n=r?u:f;var i=r?o:l;return t+" "+n[g.ort]+" "+i[e]}function n(e,t,r){var n;r=i?i(t,r):r;if(r===Pe.PipsType.None)return;n=E(s,false);n.className=c(r,g.cssClasses.marker);n.style[g.style]=e+"%";if(r>Pe.PipsType.NoValue){n=E(s,false);n.className=c(r,g.cssClasses.value);n.setAttribute("data-value",String(t));n.style[g.style]=e+"%";n.innerHTML=String(a.to(t))}}Object.keys(t).forEach(function(e){n(e,t[e][0],t[e][1])});return s}function N(){if(i){Ne(i);i=null}}function V(e){var t;var r;var n;N();r=K(e);t=e.filter;n=e.format||{to:function(e){return String(Math.round(e))}};i=u.appendChild(Q(r,t,n));return i}function Z(){var e=f.getBoundingClientRect();var t="offset"+["Width","Height"][g.ort];return g.ort===0?e.width||f[t]:e.height||f[t]}function A(r,n,i,a){var t=function(e){var t=ee(e,a.pageOffset,a.target||n);if(!t)return false;if(X()&&!a.doNotReject)return false;if(ze(u,g.cssClasses.tap)&&!a.doNotReject)return false;if(r===l.start&&t.buttons!==undefined&&t.buttons>1)return false;if(a.hover&&t.buttons)return false;if(!j)t.preventDefault();t.calcPoint=t.points[g.ort];i(t,a)};var s=[];r.split(" ").forEach(function(e){n.addEventListener(e,t,j?{passive:true}:false);s.push([e,t])});return s}function ee(t,e,r){var n=t.type.indexOf("touch")===0;var i=t.type.indexOf("mouse")===0;var a=t.type.indexOf("pointer")===0;var s=0;var o=0;var l;var u;var f;if(t.type.indexOf("MSPointer")===0)a=true;if(t.type==="mousedown"&&!t.buttons&&!t.touches)return false;if(n){l=function(e){return e.target===r||r.contains(e.target)||t.composed&&t.composedPath().shift()===r};if(t.type==="touchstart"){u=Array.prototype.filter.call(t.touches,l);if(u.length>1)return false;s=u[0].pageX;o=u[0].pageY}else{f=Array.prototype.find.call(t.changedTouches,l);if(!f)return false;s=f.pageX;o=f.pageY}}e=e||je(v);if(i||a){s=t.clientX+e.x;o=t.clientY+e.y}t.pageOffset=e;t.points=[s,o];t.cursor=i||a;return t}function te(e){var t=e-Me(f,g.ort);var r=t*100/Z();r=De(r);return g.dir?100-r:r}function re(o){var l=100;var u=false;c.forEach(function(e,t){var r;var n;var i;var a;var s;if(P(t))return;r=S[t];n=Math.abs(r-o);i=n===100&&l===100;a=n<l;s=n<=l&&o>r;if(a||s||i){u=t;l=n}});return u}function ne(e,t){if(e.type==="mouseout"&&e.target.nodeName==="HTML"&&e.relatedTarget===null)k(e,t)}function ie(e,t){var r;var n;if(navigator.appVersion.indexOf("MSIE 9")===-1&&e.buttons===0&&t.buttonsProperty!==0)return k(e,t);r=(g.dir?-1:1)*(e.calcPoint-t.startCalcPoint);n=r*100/t.baseSize;fe(r>0,n,t.locations,t.handleNumbers,t.connect)}function k(e,t){if(t.handle){Te(t.handle,g.cssClasses.active);h-=1}t.listeners.forEach(function(e){m.removeEventListener(e[0],e[1])});if(h===0){Te(u,g.cssClasses.drag);L();if(e.cursor){x.style.cursor="";x.removeEventListener("selectstart",Ae)}}if(g.events.smoothSteps){t.handleNumbers.forEach(function(e){T(e,S[e],true,true,false,false)});t.handleNumbers.forEach(function(e){U("update",e)})}t.handleNumbers.forEach(function(e){U("change",e);U("set",e);U("end",e)})}function M(e,t){var r;var n;var i;var a;var s;var o;if(t.handleNumbers.some(P))return;if(t.handleNumbers.length===1){n=c[t.handleNumbers[0]];r=n.children[0];h+=1;Le(r,g.cssClasses.active)}e.stopPropagation();i=[];a=A(l.move,m,ie,{target:e.target,handle:r,connect:t.connect,listeners:i,startCalcPoint:e.calcPoint,baseSize:Z(),pageOffset:e.pageOffset,handleNumbers:t.handleNumbers,buttonsProperty:e.buttons,locations:S.slice()});s=A(l.end,m,k,{target:e.target,handle:r,listeners:i,doNotReject:true,handleNumbers:t.handleNumbers});o=A("mouseout",m,ne,{target:e.target,handle:r,listeners:i,doNotReject:true,handleNumbers:t.handleNumbers});i.push.apply(i,a.concat(s,o));if(e.cursor){x.style.cursor=getComputedStyle(e.target).cursor;if(c.length>1)Le(u,g.cssClasses.drag);x.addEventListener("selectstart",Ae,false)}t.handleNumbers.forEach(function(e){U("start",e)})}function ae(e){var t;var r;e.stopPropagation();t=te(e.calcPoint);r=re(t);if(r===false)return;if(!g.events.snap)Ue(u,g.cssClasses.tap,g.animationDuration);T(r,t,true,true);L();U("slide",r,true);U("update",r,true);if(!g.events.snap){U("change",r,true);U("set",r,true)}else M(e,{handleNumbers:[r]})}function se(e){var t=te(e.calcPoint);var r=w.getStep(t);var n=w.fromStepping(r);Object.keys(o).forEach(function(e){if("hover"===e.split(".")[0])o[e].forEach(function(e){e.call(y,n)})})}function oe(e,t){var r;var n;var i;var a;var s;var o;var l;var u;var f;var c;var p;var d;var h;var v;var m;if(X()||P(t))return false;r=["Left","Right"];n=["Down","Up"];i=["PageDown","PageUp"];a=["Home","End"];if(g.dir&&!g.ort)r.reverse();else if(g.ort&&!g.dir){n.reverse();i.reverse()}s=e.key.replace("Arrow","");o=s===i[0];l=s===i[1];u=s===n[0]||s===r[0]||o;f=s===n[1]||s===r[1]||l;c=s===a[0];p=s===a[1];if(!u&&!f&&!c&&!p)return true;e.preventDefault();if(f||u){h=u?0:1;v=xe(t);m=v[h];if(m===null)return false;if(m===false)m=w.getDefaultStep(S[t],u,g.keyboardDefaultStep);if(l||o)m*=g.keyboardPageMultiplier;else m*=g.keyboardMultiplier;m=Math.max(m,1e-7);m=(u?-1:1)*m;d=b[t]+m}else if(p)d=g.spectrum.xVal[g.spectrum.xVal.length-1];else d=g.spectrum.xVal[0];T(t,w.toStepping(d),true,true);U("slide",t);U("update",t);U("change",t);U("set",t);return false}function le(r){var n;var i;var a;var s;var o;if(!r.fixed)c.forEach(function(e,t){A(l.start,e.children[0],M,{handleNumbers:[t]})});if(r.tap)A(l.start,f,ae,{});if(r.hover)A(l.move,f,se,{hover:true});if(r.drag)p.forEach(function(t,e){if(t===false||e===0||e===p.length-1)return;n=c[e-1];i=c[e];a=[t];s=[n,i];o=[e-1,e];Le(t,g.cssClasses.draggable);if(r.fixed){a.push(n.children[0]);a.push(i.children[0])}if(r.dragAll){s=c;o=d}a.forEach(function(e){A(l.start,e,M,{handles:s,handleNumbers:o,connect:t})})})}function t(e,t){o[e]=o[e]||[];o[e].push(t);if(e.split(".")[0]==="update")c.forEach(function(e,t){U("update",t)})}function ue(e){return e===Ce.aria||e===Ce.tooltips}function r(e){var n=e&&e.split(".")[0];var i=n?e.substring(n.length):e;Object.keys(o).forEach(function(e){var t=e.split(".")[0];var r=e.substring(t.length);if((!n||n===t)&&(!i||i===r))if(!ue(r)||i===r)delete o[e]})}function U(r,n,i){Object.keys(o).forEach(function(e){var t=e.split(".")[0];if(r===t)o[e].forEach(function(e){e.call(y,b.map(g.format.to),n,b.slice(),i||false,S.slice(),y)})})}function D(e,t,r,n,i,a,s){var o;if(c.length>1&&!g.events.unconstrained){if(n&&t>0){o=w.getAbsoluteDistance(e[t-1],g.margin,false);r=Math.max(r,o)}if(i&&t<c.length-1){o=w.getAbsoluteDistance(e[t+1],g.margin,true);r=Math.min(r,o)}}if(c.length>1&&g.limit){if(n&&t>0){o=w.getAbsoluteDistance(e[t-1],g.limit,false);r=Math.min(r,o)}if(i&&t<c.length-1){o=w.getAbsoluteDistance(e[t+1],g.limit,true);r=Math.max(r,o)}}if(g.padding){if(t===0){o=w.getAbsoluteDistance(0,g.padding[0],false);r=Math.max(r,o)}if(t===c.length-1){o=w.getAbsoluteDistance(100,g.padding[1],true);r=Math.min(r,o)}}if(!s)r=w.getStep(r);r=De(r);if(r===e[t]&&!a)return false;return r}function O(e,t){var r=g.ort;return(r?t:e)+", "+(r?e:t)}function fe(e,n,r,t,i){var a=r.slice();var s=t[0];var o=g.events.smoothSteps;var l=[!e,e];var u=[e,!e];var f=false;t=t.slice();if(e)t.reverse();if(t.length>1)t.forEach(function(e,t){var r=D(a,e,a[e]+n,l[t],u[t],false,o);if(r===false)n=0;else{n=r-a[e];a[e]=r}});else l=u=[true];t.forEach(function(e,t){f=T(e,r[e]+n,l[t],u[t],false,o)||f});if(f){t.forEach(function(e){U("update",e);U("slide",e)});if(i!==undefined)U("drag",s)}}function ce(e,t){return g.dir?100-e-t:e}function pe(e,t){var r;var n;S[e]=t;b[e]=w.fromStepping(t);r=ce(t,0)-H;n="translate("+O(r+"%","0")+")";c[e].style[g.transformRule]=n;de(e);de(e+1)}function L(){d.forEach(function(e){var t=S[e]>50?-1:1;var r=3+(c.length+t*e);c[e].style.zIndex=String(r)})}function T(e,t,r,n,i,a){if(!i)t=D(S,e,t,r,n,false,a);if(t===false)return false;pe(e,t);return true}function de(e){var t;var r;var n;var i;var a;if(!p[e])return;t=0;r=100;if(e!==0)t=S[e-1];if(e!==p.length-1)r=S[e];n=r-t;i="translate("+O(ce(t,n)+"%","0")+")";a="scale("+O(n/100,"1")+")";p[e].style[g.transformRule]=i+" "+a}function he(e,t){if(e===null||e===false||e===undefined)return S[t];if(typeof e==="number")e=String(e);e=g.format.from(e);if(e!==false)e=w.toStepping(e);if(e===false||isNaN(e))return S[t];return e}function ve(t){return function(e){T(e,S[e],true,true,t)}}function z(e,t,r){var n=Oe(e);var i=S[0]===undefined;var a;var s;t=t===undefined?true:t;if(g.animate&&!i)Ue(u,g.cssClasses.tap,g.animationDuration);d.forEach(function(e){T(e,he(n[e],e),true,false,r)});a=d.length===1?0:1;if(i&&w.hasNoSize()){r=true;S[0]=0;if(d.length>1){s=100/(d.length-1);d.forEach(function(e){S[e]=e*s})}}for(;a<d.length;++a)d.forEach(ve(r));L();d.forEach(function(e){U("update",e);if(n[e]!==null&&t)U("set",e)})}function me(e){z(g.start,e)}function ge(e,t,r,n){e=Number(e);if(!(e>=0&&e<d.length))throw new Error("noUiSlider: invalid handle number, got: "+e);T(e,he(t,e),true,true,n);U("update",e);if(r)U("set",e)}function be(e){var t;if(e===void 0)e=false;if(e)return b.length===1?b[0]:b.slice(0);t=b.map(g.format.to);if(t.length===1)return t[0];return t}function Se(){r(Ce.aria);r(Ce.tooltips);Object.keys(g.cssClasses).forEach(function(e){Te(u,g.cssClasses[e])});while(u.firstChild)u.removeChild(u.firstChild);delete u.noUiSlider}function xe(e){var t=S[e];var r=w.getNearbySteps(t);var n=b[e];var i=r.thisStep.step;var a=null;var s;if(g.snap)return[n-r.stepBefore.startValue||null,r.stepAfter.startValue-n||null];if(i!==false)if(n+i>r.stepAfter.startValue)i=r.stepAfter.startValue-n;if(n>r.thisStep.startValue)a=r.thisStep.step;else if(r.stepBefore.step===false)a=false;else a=n-r.stepBefore.highestStep;if(t===100)i=null;else if(t===0)a=null;s=w.countStepDecimals();if(i!==null&&i!==false)i=Number(i.toFixed(s));if(a!==null&&a!==false)a=Number(a.toFixed(s));return[a,i]}function ye(){return d.map(xe)}function we(t,e){var r=be();var n=["margin","limit","padding","range","animate","snap","step","format","pips","tooltips"];var i;n.forEach(function(e){if(t[e]!==undefined)a[e]=t[e]});i=_e(a);n.forEach(function(e){if(t[e]!==undefined)g[e]=i[e]});w=i.spectrum;g.margin=i.margin;g.limit=i.limit;g.padding=i.padding;if(g.pips)V(g.pips);else N();if(g.tooltips)W();else C();S=[];z(Ve(t.start)?t.start:r,e)}function Ee(){f=B(u);_(g.connect,f);le(g.events);z(g.start);if(g.pips)V(g.pips);if(g.tooltips)W();$()}Ee();y={destroy:Se,steps:ye,on:t,off:r,get:be,set:z,setHandle:ge,reset:me,disable:Y,enable:I,__moveHandles:function(e,t,r){fe(e,t,S,r)},options:a,updateOptions:we,target:u,removePips:N,removeTooltips:C,getPositions:function(){return S.slice()},getTooltips:function(){return s},getOrigins:function(){return c},pips:V};return y}function g(e,t){var r;var n;if(!e||!e.nodeName)throw new Error("noUiSlider: create requires a single element, got: "+e);if(e.noUiSlider)throw new Error("noUiSlider: Slider was already initialized.");r=_e(t);n=X(e,r,t);e.noUiSlider=n;return n}n[n.None=-1]="None",n[n.NoValue=0]="NoValue",n[n.LargeValue=1]="LargeValue",n[n.SmallValue=2]="SmallValue",e={__spectrum:r,cssClasses:u,create:g},Pe.create=g,Pe.cssClasses=u,Pe.default=e,Object.defineProperty(Pe,"__esModule",{value:true})}(e.noUiSlider={})}(this);assets/js/jquery.tctabs.min.js000064400000033120150755142450012407 0ustar00!function(w){"use strict";function n(t,s){return this.elements=w(t),this.last=[],this.current=[],this.enableEvents=!0,this.backup=[],this.options=w.extend({},w.fn.tcTabs.defaults,s),0<this.elements.length&&(this.init(),this)}var y=w.epoAPI.util.getStorage("localStorage"),h=window.confirm;n.prototype={constructor:n,set:function(t){this.options=w.extend({},this.options,t),this.init(!0)},addHeaderEvents:function(i,o,e,t,n,l,r,d,c){var s="",p=this;t.off("closetab.tmtabs").on("closetab.tmtabs",function(){var t=w(this),s=i.find(t.data("tab"));t.removeClass("closed open").addClass("closed"),t.find(".tm-arrow").removeClass(p.options.classdown+" "+p.options.classup).addClass(p.options.classdown),p.options.useclasstohide?s.addClass("tm-hide").removeClass("tm-show"):s.hide(),s.removeClass("tm-animated "+p.options.animationclass),w(window).trigger("tc-closetab.tmtabs",{header:t,tab:s})}),t.off("opentab.tmtabs").on("opentab.tmtabs",function(){var t=w(this),s=i.find(t.data("tab"));t.removeClass("closed open").addClass("open"),t.find(".tm-arrow").removeClass(p.options.classdown+" "+p.options.classup).addClass(p.options.classup),p.options.useclasstohide?s.removeClass("tm-hide").addClass("tm-show"):s.show(),s.removeClass("tm-animated "+p.options.animationclass).addClass("tm-animated "+p.options.animationclass),p.current[o]=t.data("tab"),w(window).trigger("tc-opentab.tmtabs",{header:t,tab:p.current[o],table:s}),p.scrollIntoView(i,t,c)}),!0!==p.options.showonhover&&"function"!=typeof p.options.showonhover||(s=" mouseover"),t.off("keydown.tmtabs").on("keydown.tmtabs",function(t){var s,o=w(this);13===t.keyCode&&o.trigger("click.tmtabs"),40===t.keyCode&&(s=o.closest(".tm-box").next().find("."+p.options.header)),(s=38===t.keyCode?o.closest(".tm-box").prev().find("."+p.options.header):s)&&s.length&&(o.trigger("blur"),s.trigger(" focus").trigger("click"),t.preventDefault())}),t.off("click.tmtabs").on("click.tmtabs"+s,function(t){var s=w(this);t.preventDefault(),"mouseover"===t.type&&"function"==typeof p.options.showonhover&&!p.options.showonhover.call()||(p.current[o]===s.data("tab")?w(window).trigger("tc-isopentab.tmtabs",{header:s,tab:p.current[o],table:i.find(p.current[o])}):(p.last[o]&&w(p.last[o]).trigger("closetab.tmtabs"),s.trigger("opentab.tmtabs"),p.last[o]=s,y&&y.setItem("tmadmintab-"+e,s.attr(p.options.dataopenattribute)),w(window).trigger("tc-tmtabs-clicked",{tc:e,options:p.options,header:s,tab:p.current[o],table:i.find(p.current[o])})))}),this.options.deletebutton?(t.append(this.options.deletebuttonhtml),t.find("."+this.options.deleteheader).off("click.tmtabs").on("click.tmtabs",function(t){var s=w(this),o=s.closest(".tm-box"),e=o.find("."+p.options.header),a=i.find("."+e.attr(p.options.dataattribute));t.stopPropagation(),i.find("."+p.options.headers+" ."+p.options.header).length<2||p.options.deleteconfirm&&!h(window.TMEPOGLOBALADMINJS.i18n_builder_delete)||("function"==typeof p.options.beforedeletetab&&p.options.beforedeletetab.call(i,s,a),a.remove(),e.is(".open")&&(o.next().find("."+p.options.header).is(".closed")?o.next().find("."+p.options.header).trigger("click.tmtabs"):o.prev().find("."+p.options.header).is(".closed")&&o.prev().find("."+p.options.header).trigger("click.tmtabs")),o.remove(),p.checkSize(n,l,r,d,c,!0),"function"==typeof p.options.afterdeletetab&&p.options.afterdeletetab.call(i))})):t.find("."+this.options.deleteheader).remove(),this.options.editbutton?(t.append(p.options.editbuttonhtml),t.find("."+p.options.editheader).off("click.tmtabs").on("click.tmtabs",function(t){var s;p.enableEvents&&"function"==typeof p.options.oneditbutton&&(t.stopPropagation(),t=w(this),s=i.find("."+t.closest(".tm-box").find("."+p.options.header).attr(p.options.dataattribute)),p.options.oneditbutton.call(i,t,s))})):t.find("."+this.options.editheader).remove()},initHeader:function(t,s,o,e,a,i,n,l){var r=s.attr("class"),d="."+(t=w(t)).attr(this.options.dataattribute);t.data("tab",d),this.options.useclasstohide?s.find(d).addClass("tm-hide").removeClass("tm-show"):s.find(d).hide(),s.find(d).data("state","closed"),t.is(".open")?(t.removeClass("closed open").addClass("open").data("state","open"),t.find(".tm-arrow").removeClass(this.options.classdown+" "+this.options.classup).addClass(this.options.classup),this.options.useclasstohide?s.find(d).removeClass("tm-hide").addClass("tm-show"):s.find(d).show(),s.find(d).data("state","open"),this.current[o]=d,this.last[o]=t):t.removeClass("closed open").addClass("closed").data("state","closed"),this.addHeaderEvents(s,o,r,t,e,a,i,n,l)},checkSize:function(t,s,o,e,a,i){var n,l=[];s.parents().addBack().not(":visible").each(function(){var t=w(this),s=this.style.display,o=t.css("display"),e=this.style.visibility,a=!1,o={styleDisplay:s,cssDisplay:o,styleVisibility:e,cssVisibility:t.css("visibility"),display:null,visibility:null,element:t};"none"===s&&(this.style.display="",o.display=!0,"none"===t.css("display")&&(this.style.display="block"),a=!0),"hidden"===e&&(this.style.visibility="",o.visibility=!0,"hidden"===t.css("visibility")&&(this.style.visibility="visible"),a=!0),a&&l.push(o)}),n=Math.round(s.outerWidth()),s.is(".has-scroll-arrows")&&(s.removeClass(".has-scroll-arrows"),n=Math.round(t.outerWidth())),i&&((t=s.find("."+this.options.header+".open")).length&&t.removeClass("open"),a.scrollWidth=s[0].scrollWidth,t.length)&&t.addClass("open"),a.scrollWidth>n?(e.addClass("scroll-arrow-show"),o.addClass("scroll-arrow-show"),s.addClass("has-scroll-arrows"),a.scrollWidth-n===s.scrollLeft()?e.addClass("scroll-arrow-disabled scroll-arrow-right-disabled"):e.removeClass("scroll-arrow-disabled scroll-arrow-right-disabled"),0===s.scrollLeft()?o.addClass("scroll-arrow-disabled scroll-arrow-left-disabled"):o.removeClass("scroll-arrow-disabled scroll-arrow-left-disabled")):(e.removeClass("scroll-arrow-show"),o.removeClass("scroll-arrow-show"),s[0].scrollLeft=0,s.removeClass("has-scroll-arrows")),l.forEach(function(t){t.display&&(t.element[0].style.display=t.styleDisplay),t.visibility&&(t.element[0].style.visibility=t.styleVisibility)})},scrollIntoView:function(t,s,o){var e=o.scrollPos,t=t.find("."+this.options.headers),a=t.width();t.is(".has-scroll-arrows")&&s&&void 0!==s&&s.position()&&void 0!==s.position()&&(s.position().left<0?(o.scrollPos=Math.max(e+s.position().left+1,0),t.animate({scrollLeft:o.scrollPos+1+"px"},this.options.scrollDuration)):s.position().left+s.outerWidth()>a&&(o.scrollPos=Math.min(e+(s.position().left+s.outerWidth()-a),t[0].scrollWidth-t.outerWidth()),t.animate({scrollLeft:o.scrollPos-1+"px"},this.options.scrollDuration)))},initElement:function(l,r,d,t){var c,p,h,m,s,n,o,f=this,b=l.attr("class"),e=l.find("."+this.options.headers+" ."+this.options.header),u=0,v="",a={};0!==e.length&&((c=l.find("."+this.options.headers)).wrap('<div class="'+this.options.headersWrap+'"></div>'),p=l.find("."+this.options.headersWrap),this.options.scroll&&(p.html('<div class="tc-scroll-left-arrow"></div>'+p.html()+'<div class="tc-scroll-right-arrow"></div>'),e=l.find("."+this.options.headers+" ."+this.options.header),c=l.find("."+this.options.headers),h=l.find(".tc-scroll-left-arrow"),m=l.find(".tc-scroll-right-arrow"),"function"==typeof w.fn.mousewheel&&c.mousewheel(function(t,s){"none"!==m.css("display")&&(this.scrollLeft-=30*s,d.scrollPos=this.scrollLeft,t.preventDefault())}),c.animate({scrollLeft:d.scrollPos+"px"},0),this.checkSize(p,c,h,m,d,!0),w(window).off("resize.tmtabs"+t).on("resize.tmtabs"+t,function(){f.checkSize(p,c,h,m,d,!0)}),l.off("refresh.tmtabs"+t).on("refresh.tmtabs"+t,function(){f.checkSize(p,c,h,m,d,!0)}),w(function(){f.checkSize(p,c,h,m,d,!0)}),m.off("mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs").on("mousedown.tmtabs",function(t){function s(){var t=c.scrollLeft();d.scrollPos=Math.min(t+f.options.scrollDistance,d.scrollWidth-c.outerWidth()),c.animate({scrollLeft:d.scrollPos+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d)})}t.stopPropagation(),s(),o=setInterval(function(){s()},f.options.scrollDuration)}).on("mouseup.tmtabs mouseleave.tmtabs",function(){clearInterval(o)}).on("mouseover.tmtabs",function(){w(this).addClass("scroll-arrow-over scroll-arrow-right-over")}).on("mouseout.tmtabs",function(){w(this).removeClass("scroll-arrow-over scroll-arrow-right-over")}),h.off("mousedown.tmtabs mouseup.tmtabs mouseleave.tmtabs mouseover.tmtabs mouseout.tmtabs").on("mousedown.tmtabs",function(t){function s(){var t=c.scrollLeft();d.scrollPos=Math.max(t-f.options.scrollDistance,0),c.animate({scrollLeft:d.scrollPos+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d)})}t.stopPropagation(),s(),o=setInterval(function(){s()},f.options.scrollDuration)}).on("mouseup.tmtabs mouseleave.tmtabs",function(){clearInterval(o)}).on("mouseover.tmtabs",function(){w(this).addClass("scroll-arrow-over scroll-arrow-left-over")}).on("mouseout.tmtabs",function(){w(this).removeClass("scroll-arrow-over scroll-arrow-left-over")})),window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(t,s,o){a[s]=o}),this.last[r]=!1,this.current[r]="",l.data("tm-has-tmtabs",1),e.each(function(t,s){f.initHeader(s,l,r,p,c,h,m,d)}),this.options.sortabletabs&&l.find("."+this.options.headers+":not(.section_elements ."+this.options.headers+",.tm-settings-wrap ."+this.options.headers+",.builder-element-wrap ."+this.options.headers+")").sortable({cursor:"move",items:".tm-box:not(.tm-add-box)",start:function(t,s){var o=l.find("."+s.item.closest(".tm-box").find("."+f.options.header).attr(f.options.dataattribute));u=s.item.index(),v=s.item.find("."+f.options.header).attr(f.options.dataopenattribute),n=w.tmEPOAdmin.find_index(!0,o.find(".bitem").first()),"function"==typeof f.options.beforemovetab&&f.options.beforemovetab.call(this,u,o,n),f.enableEvents=!1},stop:function(t,s){var o,e,a=l.find("."+s.item.closest(".tm-box").find("."+f.options.header).attr(f.options.dataattribute)),s=l.find("."+f.options.slide+"."+v),i=l.find("."+f.options.headers+" ."+f.options.header+"["+f.options.dataopenattribute+"='"+v+"']").parent().index();i!==u&&(o=l.find("."+f.options.slide).eq(i),(e=s.tcClone()).find(".bitem").remove(),u<i?o.after(e):i<u&&o.before(e),s.find(".bitem").toArray().forEach(function(t){t=w(t),"function"==typeof f.options.beforemovebitem&&f.options.beforemovebitem.call(this,i,u,a,n,t),e.append(t),"function"==typeof f.options.aftermovebitem&&f.options.aftermovebitem.call(this,i,u,a,n,t)}),s.remove(),"function"==typeof f.options.aftermovetab)&&f.options.aftermovetab.call(this,i,u,a,n),f.enableEvents=!0},cancel:".tm-add-box",forcePlaceholderSize:!0,revert:200,placeholder:"tm-box pl",tolerance:"pointer"}),this.options.addbutton?(p.append(this.options.addbuttonhtml),l.addClass("has-add-button").find("."+this.options.addheader).off("click.tmtabs").on("click.tmtabs",function(t){var s=l.find("."+f.options.headers+" ."+f.options.header),o=s.last(),e=o.attr(f.options.dataattribute),a=l.find("."+e),i=o.tcClone().off("closetab.tmtabs opentab.tmtabs click.tmtabs"),n=a.tcClone().empty(),s=f.options.slide+s.length;t.preventDefault(),i.html('<span class="tab-text">'+(l.find("."+f.options.headers+" ."+f.options.header).length+1)+"</span>").removeClass("closed open").addClass("closed").data("tab","."+s).data("state","closed").attr(f.options.dataattribute,s),n.removeClass(e).addClass(s),f.options.useclasstohide?n.addClass("tm-hide").removeClass(".tm-show"):n.hide(),n.removeClass("tm-animated "+f.options.animationclass),o.closest(".tm-box").after(i),i.wrap('<div class="tm-box"></div>'),f.addHeaderEvents(l,r,b,i,p,c,h,m,d),a.after(n),f.options.scroll&&c.animate({scrollLeft:i.width()+"px"},f.options.scrollDuration,function(){f.checkSize(p,c,h,m,d,!0)}),"function"==typeof f.options.afteraddtab&&f.options.afteraddtab.call(this,i,n)})):p.find("."+this.options.addheader).remove(),"auto"===this.options.selectedtab?(y&&(s=y.getItem("tmadmintab-"+b)),void 0!==a.selected_tab&&(s=a.selected_tab),null==(s=void 0!==a.menu?a.menu:s)&&(s=l.find("."+this.options.header).eq(0).attr(this.options.dataopenattribute)),(l.find("."+this.options.header+"["+this.options.dataopenattribute+'="'+s+'"]').is(":visible")?l.find("."+this.options.header+"["+this.options.dataopenattribute+'="'+s+'"]'):l.find("."+this.options.header).eq(0)).trigger("click.tmtabs")):!1!==this.options.selectedtab&&(s=parseInt(this.options.selectedtab,10),l.find("."+this.options.header+":eq("+s+")").trigger("click.tmtabs")))},init:function(a){var i=this;this.elements.each(function(t){var s=w(this),o={},e=s.html();!a&&i.backup[t]?s.html(i.backup[t]):i.backup[t]=e,o.scrollPos=0,o.scrollWidth=0,e=s.css("display"),s.show(),i.initElement(s,t,o,w.epoAPI.math.uniqueid("")),s.css("display",e)})}},w.fn.tcTabs=function(t){var s,o,e=w(this),a=e.data("tctabs"),i=w.makeArray(arguments);return i.splice(0,1),o="object"==typeof t?t:{},a||(a=new n(this,o),e.data("tctabs",a)),void 0===(s="string"==typeof t?a[t].apply(a,i):s)?e:s},w.fn.tcTabs.defaults={headers:"tm-tab-headers",headersWrap:"tc-tab-headers-wrap",header:"tab-header",slide:"tc-tab-slide",classdown:"tcfa-angle-down",classup:"tcfa-angle-up",animationclass:"appear",dataattribute:"data-id",dataopenattribute:"data-id",selectedtab:"auto",showonhover:!1,useclasstohide:!0,sortabletabs:!0,addbutton:!1,addheader:"tm-add-tab",addbuttonhtml:'<div class="tm-add-tab"><span class="tmicon tcfa tcfa-plus"></span></div>',afteraddtab:null,beforemovetab:null,aftermovetab:null,beforemovebitem:null,aftermovebitem:null,deletebutton:!1,deletebuttonhtml:'<div class="tm-del-tab"><span class="tcfa tcfa-times"></span></div>',deleteheader:"tm-del-tab",deleteconfirm:!1,beforedeletetab:null,afterdeletetab:null,editbutton:!1,editbuttonhtml:'<span class="tm-edit-tab"><span class="tcfa tcfa-edit"></span></span>',editheader:"tm-edit-tab",oneditbutton:null,scroll:!0,scrollDistance:300,scrollDuration:300},w.fn.tcTabs.Constructor=n,w.fn.tmtabs=w.fn.tcTabs}(window.jQuery);wpml-config.xml000064400000006412150755142450007523 0ustar00<wpml-config>
    <admin-texts>
        <key name="tm_epo_separator_cart_text"/>
        <key name="tm_epo_final_total_text"/>
        <key name="tm_epo_update_cart_text"/>
        <key name="tm_epo_options_unit_price_text"/>
        <key name="tm_epo_options_total_text"/>
        <key name="tm_epo_fees_total_text"/>
        <key name="tm_epo_subscription_fee_text"/>
        <key name="tm_epo_replacement_free_price_text"/>
        <key name="tm_epo_reset_variation_text"/>
        <key name="tm_epo_edit_options_text"/>
        <key name="tm_epo_additional_options_text"/>
        <key name="tm_epo_close_button_text"/>
        <key name="tm_epo_closeText"/>
        <key name="tm_epo_currentText"/>
        <key name="tm_epo_slider_prev_text"/>
        <key name="tm_epo_slider_next_text"/>
        <key name="tm_epo_force_select_text"/>
        <key name="tm_epo_empty_cart_text"/>
        <key name="tm_epo_this_field_is_required_text"/>
        <key name="tm_epo_characters_remaining_text"/>
        <key name="tm_epo_uploading_files_text"/>
        <key name="tm_epo_uploading_message_text"/>
        <key name="tm_epo_select_file_text"/>
        <key name="tm_epo_no_zero_priced_products_text"/>
        <key name="tm_epo_no_negative_priced_products_text"/>
        <key name="tm_epo_add_button_text_associated_products"/>
        <key name="tm_epo_remove_button_text_associated_products"/>
        <key name="tm_epo_add_button_text_repeater"/>
        <key name="tm_epo_global_required_indicator"/>
        <key name="tm_epo_global_date_timezone"/>
        <key name="tm_epo_popup_section_button_text"/>
        <key name="tm_epo_vat_options_total_text"/>
        <key name="tm_epo_uploading_num_file"/>
        <key name="tm_epo_uploading_num_files"/>
    </admin-texts>
    <custom-types>
        <custom-type translate="0">tm_global_cp</custom-type>
        <custom-type translate="0">tm_product_cp</custom-type>
        <custom-type translate="0">tm_template_cp</custom-type>
        <custom-type translate="2" display-as-translated="1">tm_lookuptable_cp</custom-type>
    </custom-types>
    <custom-fields>
        <custom-field action="copy">tmcp_attribute</custom-field>
        <custom-field action="copy">tmcp_attribute_is_taxonomy</custom-field>
        <custom-field action="copy">tmcp_hide_price</custom-field>
        <custom-field action="copy">tmcp_limit</custom-field>
        <custom-field action="copy">tmcp_required</custom-field>
        <custom-field action="copy">tmcp_type</custom-field>
        <custom-field action="ignore">tm_meta</custom-field>
        <custom-field action="copy">tm_meta_cpf</custom-field>
        <custom-field action="copy">tm_meta_apply_mode</custom-field>
        <custom-field action="ignore">tm_meta_lang</custom-field>
        <custom-field action="ignore">tm_meta_parent_post_id</custom-field>
        <custom-field action="ignore">tm_meta_product_ids</custom-field>
        <custom-field action="ignore">tm_meta_product_exclude_ids</custom-field>
        <custom-field action="ignore">tm_meta_enabled_roles</custom-field>
        <custom-field action="ignore">tm_meta_disabled_roles</custom-field>
        <custom-field action="ignore">tm_meta_wpml</custom-field>
        <custom-field action="copy-once">lookuptable_meta</custom-field>
    </custom-fields>
</wpml-config>includes/class-themecomplete-extra-product-options-setup.php000064400000023237150755142450020466 0ustar00<?php
/**
 * Extra Product Options Setup
 *
 * @package Extra Product Options
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Setup
 *
 * This class is responsible for setting up the plugin.
 *
 * @package Extra Product Options
 * @author  ThemeComplete
 * @version 6.4
 */
final class Themecomplete_Extra_Product_Options_Setup {
	/**
	 * The single instance of the class
	 *
	 * @var Themecomplete_Extra_Product_Options_Setup|null
	 */
	protected static $instance = null;

	/**
	 * Main Extra Product Options Instance
	 *
	 * Ensures only one instance of Extra Product Options is loaded or can be loaded.
	 *
	 * @since 4.8
	 * @static
	 * @return Themecomplete_Extra_Product_Options_Setup
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Cloning is forbidden
	 *
	 * @since 4.8
	 */
	public function __clone() {
		_doing_it_wrong( __FUNCTION__, esc_html__( 'Cloning is forbidden.', 'woocommerce-tm-extra-product-options' ), '4.8' );
	}

	/**
	 * Unserializing instances of this class is forbidden
	 *
	 * @since 4.8
	 */
	public function __wakeup() {
		_doing_it_wrong( __FUNCTION__, esc_html__( 'Unserializing instances of this class is forbidden.', 'woocommerce-tm-extra-product-options' ), '4.8' );
	}

	/**
	 * Class Constructor
	 *
	 * @since 4.8
	 */
	public function __construct() {
		// Declare HPOS compatiblity.
		add_action( 'before_woocommerce_init', [ $this, 'before_woocommerce_init' ], 10 );

		if ( function_exists( 'wp_installing' ) && wp_installing() ) {
			return;
		}

		$this->define_constants();
		$this->includes();
		$this->init_hooks();

		do_action( 'epo_loaded' );
	}

	/**
	 * Declare HPOS compatiblity
	 *
	 * @since 6.2
	 * @return void
	 */
	public function before_woocommerce_init() {
		if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
			\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', THEMECOMPLETE_EPO_PLUGIN_FILE, true );
		}
	}

	/**
	 * Define constant if not already set
	 *
	 * @param string         $name  Constant name.
	 * @param string|boolean $value Constant value.
	 *
	 * @since 4.8
	 * @return void
	 */
	private function define( $name, $value ) {
		if ( ! defined( $name ) ) {
			define( $name, $value );
		}
	}

	/**
	 * What type of request is this?
	 *
	 * @param string $type admin, ajax, cron or frontend.
	 *
	 * @since 4.8
	 * @return boolean
	 */
	private function is_request( $type ) {
		$ret = false;
		switch ( $type ) {
			case 'admin':
				$ret = is_admin();
				break;
			case 'ajax':
				$ret = defined( 'DOING_AJAX' );
				break;
			case 'frontend':
				$ret = ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! defined( 'REST_REQUEST' );
				break;
		}

		return $ret;
	}

	/**
	 * Define constants
	 *
	 * @since 4.8
	 * @return void
	 */
	private function define_constants() {
		$version = get_file_data(
			THEMECOMPLETE_EPO_PLUGIN_FILE,
			[
				'version'      => 'Version',
				'wp_required'  => 'Requires at least',
				'wc_required'  => 'WC requires at least',
				'php_required' => 'Requires PHP',
			]
		);

		$this->define( 'THEMECOMPLETE_EPO_ABSPATH', dirname( THEMECOMPLETE_EPO_PLUGIN_FILE ) . '/' );
		$this->define( 'THEMECOMPLETE_EPO_VERSION', $version['version'] );
		$this->define( 'THEMECOMPLETE_EPO_WP_VERSION', $version['wp_required'] );
		$this->define( 'THEMECOMPLETE_EPO_WC_VERSION', $version['wc_required'] );
		$this->define( 'THEMECOMPLETE_EPO_PHP_VERSION', $version['php_required'] );
		$this->define( 'THEMECOMPLETE_EPO_PLUGIN_ID', '7908619' );
		$this->define( 'THEMECOMPLETE_EPO_LOCAL_POST_TYPE', 'tm_product_cp' );
		$this->define( 'THEMECOMPLETE_EPO_GLOBAL_POST_TYPE', 'tm_global_cp' );
		$this->define( 'THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK', 'tm-global-epo' );
		$this->define( 'THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE', 'tm_template_cp' );
		$this->define( 'THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE', 'tm_lookuptable_cp' );
		$this->define( 'THEMECOMPLETE_EPO_WPML_LANG_META', 'tm_meta_lang' );
		$this->define( 'THEMECOMPLETE_EPO_WPML_PARENT_POSTID', 'tm_meta_parent_post_id' );
		$this->define( 'THEMECOMPLETE_EPO_PLUGIN_PATH', untrailingslashit( plugin_dir_path( THEMECOMPLETE_EPO_PLUGIN_FILE ) ) );
		$this->define( 'THEMECOMPLETE_EPO_ADMIN_PATH', THEMECOMPLETE_EPO_PLUGIN_PATH . '/admin/' );
		$this->define( 'THEMECOMPLETE_EPO_INCLUDES_PATH', THEMECOMPLETE_EPO_PLUGIN_PATH . '/includes/' );
		$this->define( 'THEMECOMPLETE_EPO_COMPATIBILITY_PATH', THEMECOMPLETE_EPO_INCLUDES_PATH . 'compatibility/' );
		$this->define( 'THEMECOMPLETE_EPO_TEMPLATE_PATH', THEMECOMPLETE_EPO_PLUGIN_PATH . '/templates/' );
		$this->define( 'THEMECOMPLETE_EPO_PLUGIN_URL', untrailingslashit( plugins_url( '/', THEMECOMPLETE_EPO_PLUGIN_FILE ) ) );
		$this->define( 'THEMECOMPLETE_EPO_INCLUDES_URL', THEMECOMPLETE_EPO_PLUGIN_URL . '/includes/' );
		$this->define( 'THEMECOMPLETE_EPO_COMPATIBILITY_URL', THEMECOMPLETE_EPO_INCLUDES_URL . 'compatibility/' );
		$this->define( 'THEMECOMPLETE_EPO_PLUGIN_NAME_HOOK', plugin_basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) );
		$this->define( 'THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID', 'tm_extra_product_options' );
		$this->define( 'THEMECOMPLETE_EPO_DIRECTORY', dirname( plugin_basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) ) );
		$this->define( 'THEMECOMPLETE_EPO_PLUGIN_SLUG', THEMECOMPLETE_EPO_DIRECTORY . '/' . basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) );
		$this->define( 'THEMECOMPLETE_EPO_FILE_SLUG', basename( THEMECOMPLETE_EPO_PLUGIN_FILE, '.php' ) );
		$this->define( 'THEMECOMPLETE_SUPPORTED_ECO_VERSION', '2.0' );
		$this->define( 'THEMECOMPLETE_EPO_NAMESPACE', 'tm-extra-product-options' );
		$this->define( 'THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE', 'TM Extra Product Options' );
	}

	/**
	 * Include required core files used in admin and on the frontend
	 *
	 * @since 4.8
	 * @return void
	 */
	public function includes() {
		// Plugin compatibility functions.
		require_once THEMECOMPLETE_EPO_INCLUDES_PATH . 'functions/compatibility-functions.php';

		// Class autoloader.
		include_once THEMECOMPLETE_EPO_INCLUDES_PATH . 'class-themecomplete-epo-autoloader.php';

		// Functions.
		include_once THEMECOMPLETE_EPO_INCLUDES_PATH . 'functions/epo-functions.php';
	}

	/**
	 * Hook into actions and filters
	 *
	 * @since 4.8
	 * @return void
	 */
	private function init_hooks() {
		// Check if the plugin can be activated.
		register_activation_hook( THEMECOMPLETE_EPO_PLUGIN_FILE, [ 'THEMECOMPLETE_EPO_CHECK_Base', 'activation_check' ] );

		if ( THEMECOMPLETE_EPO_CHECK()->stop_plugin() ) {
			return;
		}

		// Initialize updater.
		THEMECOMPLETE_EPO_LICENSE();
		THEMECOMPLETE_EPO_UPDATER();

		// Load plugin textdomain.
		add_action( 'plugins_loaded', [ $this, 'load_textdomain' ], 10 );

		// Register post types.
		$priority = get_option( 'tm_epo_post_type_hook_priority' );
		if ( ! is_numeric( $priority ) ) {
			// The priority is 100 for compatibility with JetWooBuilder Custom Taxonomy Template.
			$priority = 100;
		} else {
			$priority = intval( $priority );
		}
		add_action( 'init', [ 'THEMECOMPLETE_EPO_POST_TYPES', 'register' ], $priority );

		// Load admin interface.
		if ( $this->is_request( 'admin' ) ) {

			// Add settings page.
			add_filter( 'woocommerce_get_settings_pages', [ $this, 'wc_admin_settings_page' ] );

			// woocommerce_bundle_rate_shipping chosen fix by removing.
			add_action( 'admin_enqueue_scripts', [ $this, 'fix_woocommerce_bundle_rate_shipping_scripts' ], 99 );

			// Globals Admin Interface.
			THEMECOMPLETE_EPO_ADMIN_GLOBAL();

			// Admin Interface.
			THEMECOMPLETE_EPO_ADMIN();

			// Admin Lookup Table Interface.
			THEMECOMPLETE_EPO_ADMIN_LOOKUPTABLE();

		} else {

			// Add shortcodes.
			add_action( 'init', [ 'THEMECOMPLETE_EPO_Shortcodes', 'add' ] );

		}

		// Add widgets.
		add_action( 'widgets_init', [ 'THEMECOMPLETE_EPO_Widgets', 'register' ] );

		// Main plugin interface.
		THEMECOMPLETE_EPO();
	}

	/**
	 * Load plugin textdomain
	 *
	 * @since 4.8
	 * @return void
	 */
	public function load_textdomain() {
		if ( get_option( 'tm_epo_enable_translations', 'yes' ) === 'no' ) {
			return;
		}

		$domain     = THEMECOMPLETE_EPO_DIRECTORY;
		$locale     = apply_filters( 'plugin_locale', get_locale(), $domain );
		$global_mo  = trailingslashit( WP_LANG_DIR ) . 'plugins/' . $domain . '-' . $locale . '.mo';
		$global_mo2 = trailingslashit( WP_LANG_DIR ) . 'plugins/' . $domain . '/' . $domain . '-' . $locale . '.mo';

		if ( file_exists( $global_mo ) ) {
			// (wp-content/languages/plugins/plugin-name-$locale.mo).
			load_textdomain( $domain, $global_mo );
		} elseif ( file_exists( $global_mo2 ) ) {
			// (wp-content/languages/plugins/plugin-name/plugin-name-$locale.mo).
			load_textdomain( $domain, $global_mo2 );
		} else {
			// (wp-content/plugins/plugin-name/languages/plugin-name-$locale.mo).
			load_plugin_textdomain( 'woocommerce-tm-extra-product-options', false, $domain . '/languages/' );
		}
	}

	/**
	 * Admin Settings Page
	 *
	 * @param array<mixed> $settings Settings array.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_admin_settings_page( $settings = [] ) {
		if ( class_exists( 'WC_Settings_Page' ) ) {

			$_setting = new THEMECOMPLETE_EPO_ADMIN_SETTINGS();

			if ( $_setting instanceof WC_Settings_Page ) {
				$settings[] = $_setting;
			}
		}

		return $settings;
	}

	/**
	 * Fix woocommerce_bundle_rate_shipping select chosen js conflict by removing
	 *
	 * @since 4.8
	 * @return void
	 */
	public function fix_woocommerce_bundle_rate_shipping_scripts() {
		// phpcs:ignore
		if ( ! ( isset( $_GET['page'] ) && isset( $_GET['tab'] ) && $_GET['page'] === 'wc-settings' && $_GET['tab'] === 'shipping' ) ) {
			wp_dequeue_script( 'woocommerce_bundle_rate_shipping_admin_js' );
		}
	}
}
includes/widgets/index.php000064400000000126150755142450011647 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/widgets/class-themecomplete-epo-widget-action.php000064400000006040150755142450020014 0ustar00<?php
/**
 * Epo Widget
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Epo Widget
 * (Used for for echoing a custom action)
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
class THEMECOMPLETE_EPO_Widget_Action extends WP_Widget {

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		$widget_ops = [
			'classname'   => 'tc_epo_show_widget',
			'description' => esc_html__( 'Echo a custom action', 'woocommerce-tm-extra-product-options' ),
		];

		$control_ops = [
			'width'   => 300,
			'height'  => 350,
			'id_base' => 'tc_epo_show_widget',
		];

		parent::__construct( 'tc_epo_show_widget', esc_html__( 'EPO custom action', 'woocommerce-tm-extra-product-options' ), $widget_ops, $control_ops );
	}

	/**
	 * Echoes the widget content
	 *
	 * @param array<mixed> $args widget arguments.
	 * @param array<mixed> $instance The settings for the particular instance of the widget.
	 * @return void
	 */
	public function widget( $args, $instance ) {
		$title  = empty( $instance['title'] ) ? '' : $instance['title'];
		$action = empty( $instance['action'] ) ? 'tc_show_epo' : $instance['action'];

		echo wp_kses_post( $args['before_widget'] );
		echo esc_html( $title );
		do_action( $action );

		echo wp_kses_post( $args['after_widget'] );
	}

	/**
	 * Updates a particular instance of a widget
	 *
	 * @param array<mixed> $new_instance New settings for this instance as input by the user via
	 *                            WP_Widget::form().
	 * @param array<mixed> $old_instance Old settings for this instance.
	 *
	 * @return array<mixed> Settings to save or bool false to cancel saving.
	 */
	public function update( $new_instance, $old_instance ) {
		$instance           = $old_instance;
		$instance['title']  = wp_strip_all_tags( $new_instance['title'] );
		$instance['action'] = wp_strip_all_tags( $new_instance['action'] );

		return $instance;
	}

	/**
	 * Outputs the settings update form
	 *
	 * @param array<mixed> $instance Current settings.
	 * @return string      Default return is 'noform'.
	 */
	public function form( $instance ) {
		$title  = isset( $instance['title'] ) ? $instance['title'] : '';
		$action = isset( $instance['action'] ) ? $instance['action'] : '';

		?>
		<p>
			<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'woocommerce-tm-extra-product-options' ); ?></label>
			<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
		</p>
		<p>
			<label for="<?php echo esc_attr( $this->get_field_id( 'action' ) ); ?>"><?php esc_html_e( 'Custom action:', 'woocommerce-tm-extra-product-options' ); ?></label>
			<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'action' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'action' ) ); ?>" type="text" value="<?php echo esc_attr( $action ); ?>">
		</p>

		<?php

		return 'noform';
	}
}
includes/fields/class-themecomplete-epo-fields-selectmultiple.php000064400000023522150755142450021361 0ustar00<?php
/**
 * Multi-Select Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Multi-Select Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_selectmultiple extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$changes_product_image = empty( $element['changes_product_image'] ) ? '' : $element['changes_product_image'];

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$display = [
			'options'               => [],
			'options_array'         => [],
			'use_url'               => isset( $element['use_url'] ) ? $element['use_url'] : '',
			'textbeforeprice'       => isset( $element['text_before_price'] ) ? $element['text_before_price'] : '',
			'textafterprice'        => isset( $element['text_after_price'] ) ? $element['text_after_price'] : '',
			'hide_amount'           => $this->get_value( $element, 'hide_amount', '' ),
			'changes_product_image' => $changes_product_image,
			'quantity'              => isset( $element['quantity'] ) ? $element['quantity'] : '',
			'class_label'           => $class_label,
		];

		$_default_value_counter           = 0;
		$display['default_value_counter'] = false;

		$selected_value = '';
		if ( isset( $args['posted_name'] ) ) {
			$name = $args['posted_name'];
			if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ $name ] ) ) {
				$selected_value = $this->post_data[ $name ];
			} elseif ( empty( $this->post_data ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
			} elseif ( THEMECOMPLETE_EPO()->is_quick_view() || ( empty( $this->post_data ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) {
				$selected_value = -1;
			}
		}

		$selected_value = apply_filters( 'wc_epo_default_value', $selected_value, $element );

		if ( is_array( $selected_value ) ) {

			if ( isset( $args['get_posted_key'] ) && isset( $selected_value[ $args['get_posted_key'] ] ) ) {
				$selected_value = $selected_value[ $args['get_posted_key'] ];
			} else {
				$selected_value = '';
			}
		}

		foreach ( $element['options'] as $value => $label ) {
			$default_value = isset( $element['default_value'] ) && isset( $element['default_value'][ $_default_value_counter ] )
				?
				( ( '' !== $element['default_value'][ $_default_value_counter ] )
					? ( (int) $element['default_value'][ $_default_value_counter ] )
					: false )
				: false;

			$selected = false;

			if ( -1 === $selected_value ) {
				if ( ( THEMECOMPLETE_EPO()->is_quick_view() || ( ( empty( $this->post_data ) || ( ! empty( $this->post_data ) && ! isset( $this->post_data['quantity'] ) ) ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) ) {
					if ( false !== $default_value ) {
						$selected = true;
					}
				}
			} elseif ( $default_value && ! empty( $element['default_value_override'] ) && isset( $element['default_value'] ) ) {
				$selected = true;
			} elseif ( is_array( $selected_value ) && in_array( esc_attr( $value ), array_map( 'esc_attr', array_map( 'stripcslashes', $selected_value ) ), true ) ) {
				$selected = true;
			}
			if ( $selected ) {
				$display['default_value_counter'] = $value;
			}

			$data_url = isset( $element['url'][ $_default_value_counter ] ) ? $element['url'][ $_default_value_counter ] : '';

			$css_class = apply_filters( 'wc_epo_multiple_options_css_class', '', $element, $_default_value_counter );
			if ( '' !== $css_class ) {
				$css_class = ' ' . $css_class;
			}

			$image_variations = [];
			if ( $changes_product_image ) {
				$image_link       = '';
				$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'image' );

				$image_link       = isset( $element['imagesp'][ $_default_value_counter ] ) ? $element['imagesp'][ $_default_value_counter ] : '';
				$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'imagep' );
			}

			$value_to_show = isset( $element['original_options'] ) && isset( $element['original_options'][ $value ] ) ? $element['original_options'][ $value ] : $value;

			$text = apply_filters( 'woocommerce_tm_epo_option_name', $label, $element, $_default_value_counter, $value, $label );
			$text = apply_filters( 'wc_epo_kses', $text, $text );

			$option = [
				'selected'            => $selected,
				'current'             => true,
				'value_to_show'       => $value_to_show,
				'css_class'           => $css_class,
				'data_url'            => $data_url,
				'data_imagep'         => isset( $element['imagesp'][ $_default_value_counter ] ) ? $element['imagesp'][ $_default_value_counter ] : '',
				'data_price'          => isset( $element['rules_filtered'][ $value ][0] ) ? $element['rules_filtered'][ $value ][0] : 0,
				'tm_tooltip_html'     => ( isset( $element['cdescription'] ) && isset( $element['cdescription'][ $_default_value_counter ] ) ) ? apply_filters( 'wc_epo_kses', $element['cdescription'][ $_default_value_counter ], $element['cdescription'][ $_default_value_counter ] ) : '',
				'image_variations'    => wp_json_encode( $image_variations ),
				'data_rules'          => isset( $element['rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['rules_filtered'][ $value ] ) ) : '',
				'data_original_rules' => isset( $element['original_rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['original_rules_filtered'][ $value ] ) ) : '',
				'data_rulestype'      => isset( $element['rules_type'][ $value ] ) ? wp_json_encode( ( $element['rules_type'][ $value ] ) ) : '',
				'data_text'           => $label,
				'data_hide_amount'    => empty( $element['hide_amount'] ) ? '0' : '1',
				'text'                => $text,
			];

			$option               = apply_filters( 'wc_epo_select_options', $option, $element, $_default_value_counter );
			$display['options'][] = apply_filters( 'wc_epo_multiple_options', $option, $element, $_default_value_counter );

			$display['options_array'][] = [
				'value'            => $value,
				'data_url'         => $data_url,
				'image_variations' => wp_json_encode( $image_variations ),
				'imagep'           => ( isset( $element['imagesp'][ $_default_value_counter ] ) ? $element['imagesp'][ $_default_value_counter ] : '' ),
				'price'            => ( isset( $element['rules_filtered'][ $value ][0] ) ? $element['rules_filtered'][ $value ][0] : 0 ),
				'cdescription'     => ( isset( $element['cdescription'] ) ? ( isset( $element['cdescription'][ $_default_value_counter ] ) ? $element['cdescription'][ $_default_value_counter ] : '' ) : '' ),
				'rules'            => ( isset( $element['rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['rules_filtered'][ $value ] ) ) : '' ),
				'original_rules'   => ( isset( $element['original_rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['original_rules_filtered'][ $value ] ) ) : '' ),
				'rulestype'        => ( isset( $element['rules_type'][ $value ] ) ? wp_json_encode( ( $element['rules_type'][ $value ] ) ) : '' ),
				'label'            => apply_filters( 'woocommerce_tm_epo_option_name', $label, $element, $_default_value_counter, $value, $label ),
			];

			++$_default_value_counter;
		}

		$display['element'] = $element;

		if ( ! empty( $changes_product_image ) ) {
			$fieldtype            = $args['fieldtype'] . ' tm-product-image';
			$display['fieldtype'] = $fieldtype;
		}

		if ( ! empty( $args['element_data_attr'] ) && is_array( $args['element_data_attr'] ) ) {
			$display['element_data_attr'] = $args['element_data_attr'];
		} else {
			$display['element_data_attr'] = [];
		}

		return apply_filters( 'wc_epo_display_field_select', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-color.php000064400000005235150755142450017445 0ustar00<?php
/**
 * Color Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Color Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_color extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {
		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}
		$display = [
			'default_value'     => $this->get_value( $element, 'default_value', '' ),
			'get_default_value' => $this->get_default_value( $element, $args ),
			'textbeforeprice'   => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'    => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'       => $this->get_value( $element, 'hide_amount', '' ),
			'quantity'          => $this->get_value( $element, 'quantity', '' ),
			'class_label'       => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_color', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-dynamic.php000064400000005356150755142450017757 0ustar00<?php
/**
 * Dynamic Calculations Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4.3
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Dynamic Calculations Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4.3
 */
class THEMECOMPLETE_EPO_FIELDS_dynamic extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function display_field( $element = [], $args = [] ) {
		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$operation_mode = $this->get_value( $element, 'mode', '' );

		$hide = $this->get_value( $element, 'hide', '' );

		$hide_amount = '';
		if ( ! empty( $hide ) || 'override_product_price' !== $operation_mode ) {
			$hide_amount = 'hidden';
		}

		$result_label = $this->get_value( $element, 'result_label', '' );

		$operation_mode = $this->get_value( $element, 'mode', '' );
		if ( 'dynamic_product_price' === $operation_mode ) {
			$result_label = '';
		}

		$rules      = isset( $element['rules_filtered'] ) ? wp_json_encode( ( $element['rules_filtered'] ) ) : '';
		$rules_type = isset( $element['rules_type'] ) ? wp_json_encode( ( $element['rules_type'] ) ) : '';

		$display = [
			'textbeforeprice'  => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'   => $this->get_value( $element, 'text_after_price', '' ),
			'class_label'      => $class_label,
			'hide_amount'      => $hide_amount,
			'operation_mode'   => $operation_mode,
			'hide'             => $hide,
			'result_label'     => $result_label,
			'formula'          => $rules,
			'calculation_type' => $rules_type,
		];

		if ( 'override_product_price' !== $operation_mode ) {
			$display['rules']          = '';
			$display['original_rules'] = '';
			$display['rules_type']     = '';
		}

		return apply_filters( 'wc_epo_display_field_dynamic', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}

	/**
	 * Function to filter the result data
	 *
	 * @param array<mixed> $ret The data result.
	 * @param string       $type 'normal' or 'fee'.
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function result( $ret = [], $type = '' ) {
		$ret['hidelabelincart']  = 'hidden';
		$ret['hidevalueincart']  = 'hidden';
		$ret['hidelabelinorder'] = 'hidden';
		$ret['hidevalueinorder'] = 'hidden';

		return apply_filters( 'wc_epo_save_cart_item_data', $ret, $type, $this );
	}
}
includes/fields/class-themecomplete-epo-fields-multiple-file-upload.php000064400000040725150755142450022364 0ustar00<?php
/**
 * Multiple Upload Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4.2
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Multiple Upload Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4.2
 */
class THEMECOMPLETE_EPO_FIELDS_multiple_file_upload extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 6.4.2
	 */
	public function display_field( $element = [], $args = [] ) {

		$saved_value = '';
		if ( ! empty( THEMECOMPLETE_EPO_CART()->last_added_cart_key ) || ( THEMECOMPLETE_EPO()->is_edit_mode() && THEMECOMPLETE_EPO()->cart_edit_key ) ) {
			$cart_item_key = THEMECOMPLETE_EPO()->is_edit_mode() ? THEMECOMPLETE_EPO()->cart_edit_key : THEMECOMPLETE_EPO_CART()->last_added_cart_key;
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );

			if ( $cart_item ) {
				if ( isset( $cart_item['tmcartepo'] ) ) {
					$saved_epos = $cart_item['tmcartepo'];
					foreach ( $saved_epos as $key => $val ) {
						if ( $element['uniqid'] === $val['section'] ) {
							$saved_value = $val['value'];
							break;
						}
					}
				}
				if ( empty( $saved_value ) && isset( $cart_item['tmcartfees'] ) ) {
					$saved_epos = $cart_item['tmcartfees'];
					foreach ( $saved_epos as $key => $val ) {
						if ( $element['uniqid'] === $val['section'] ) {
							$saved_value = $val['value'];
							break;
						}
					}
				}
			}
		}
		$style = $this->get_value( $element, 'button_type', '' );

		$upload_text = '';
		switch ( $style ) {
			case '':
				$style = ' cpf-upload-container-basic';
				break;
			case 'button':
				$style       = ' cpf-upload-container';
				$upload_text = ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_file_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_file_text' ) ) : esc_html__( 'Select file(s)', 'woocommerce-tm-extra-product-options' ) );
				break;
		}

		/* translators: %s file size */
		$max_file_size_text = sprintf( esc_html__( '(max file size %s)', 'woocommerce-tm-extra-product-options' ), size_format( wp_max_upload_size() ) );

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}
		$display = [
			'max_size'           => size_format( wp_max_upload_size() ),
			'style'              => $style,
			'textbeforeprice'    => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'     => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'        => $this->get_value( $element, 'hide_amount', '' ),
			'quantity'           => $this->get_value( $element, 'quantity', '' ),
			'saved_value'        => $saved_value,
			'upload_text'        => $upload_text,
			'max_file_size_text' => $max_file_size_text,
			'allowed_mimes'      => implode( ', ', THEMECOMPLETE_EPO()->get_allowed_mimes() ),
			'class_label'        => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_multiple_file_upload', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 6.4.2
	 */
	public function validate() {

		$passed  = true;
		$message = [];
		$files   = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		foreach ( $this->field_names as $attribute ) {
			if ( isset( $files[ $attribute ] ) ) {
				$file          = $files[ $attribute ];
				$file_name     = '';
				$file_tmp_name = '';
				if ( ! empty( $file ) ) {
					$file_name     = $file['name'];
					$file_tmp_name = $file['tmp_name'];
				}
				if ( ! ( isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] ) ) {
					if ( $this->element['required'] && ( empty( $file ) || empty( $file_name ) ) ) {
						$passed    = false;
						$message[] = 'required';
						break;
					} elseif ( ! empty( $file_name ) && is_array( $file_name ) ) {
						$name     = (array) $file_name;
						$tmp_name = (array) $file_tmp_name;
						foreach ( $name as $name_id => $name_value ) {
							if ( $this->element['required'] && empty( $name_value ) ) {
								$passed    = false;
								$message[] = 'required';
								break 2;
							} elseif ( ! empty( $name_value ) ) {
								$ext   = strtolower( pathinfo( $name_value, PATHINFO_EXTENSION ) );
								$check = true;
								if ( apply_filters( 'wc_epo_no_upload_to_png', true ) && in_array( $ext, [ 'jpg', 'png', 'gif' ], true ) ) {
									$check = THEMECOMPLETE_EPO_HELPER()->upload_to_png( $tmp_name[ $name_id ], $tmp_name[ $name_id ] );
								}
								if ( false === $check ) {
									$passed = false;
									/* translators: %s file name. */
									$message[] = sprintf( esc_html__( '%s is not a valid image file!', 'woocommerce-tm-extra-product-options' ), $name_value );
									break 2;
								}
							}
						}
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}

	/**
	 * Add field data to cart (single type fields)
	 *
	 * @return false|array<mixed>
	 * @since 6.4.2
	 */
	public function add_cart_item_data_single() {
		$files = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		$can_be_added = false;
		$posted_check = false;
		if ( isset( $this->post_data[ $this->attribute ] ) && '' !== $this->post_data[ $this->attribute ] ) {
			$posted_check = true;
		}
		if ( $posted_check ) {
			$value        = $this->post_data[ $this->attribute ];
			$can_be_added = true;
		} elseif ( ! empty( $files[ $this->attribute ] ) && ! empty( $files[ $this->attribute ]['name'] ) ) {
			if ( is_array( $files[ $this->attribute ]['name'] ) ) {
				$file_object = [];
				$upload      = [];
				$value       = [];
				foreach ( $files[ $this->attribute ]['name'] as $index => $file ) {
					if ( $file ) {
						foreach ( $files[ $this->attribute ] as $att => $value_object ) {
							$file_object[ $att ] = $value_object[ $index ];
						}
						$upload[ $index ] = THEMECOMPLETE_EPO()->upload_file( $file_object, $this->key_id, $this->keyvalue_id );
						if ( false !== $upload[ $index ] ) {
							if ( empty( $upload[ $index ]['error'] ) && ! empty( $upload[ $index ]['file'] ) ) {
								$value[ $index ] = wc_clean( $upload[ $index ]['url'] );
								if ( empty( $upload[ $index ]['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
									wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
								}
								$can_be_added = true;
							} else {
								wc_add_notice( $upload[ $index ]['error'], 'error' );
							}
						}
					}
				}
			} else {
				$upload = THEMECOMPLETE_EPO()->upload_file( $files[ $this->attribute ], $this->key_id, $this->keyvalue_id );
				if ( false !== $upload ) {
					if ( empty( $upload['error'] ) && ! empty( $upload['file'] ) ) {
						$value = wc_clean( $upload['url'] );
						if ( empty( $upload['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
							wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
						}
						$can_be_added = true;

					} else {
						wc_add_notice( $upload['error'], 'error' );
					}
				}
			}
		}

		if ( isset( $upload ) && isset( $value ) && ! empty( $value ) && $can_be_added ) {
			if ( ! is_array( $upload ) ) {
				$upload = [ $upload ];
			}
			if ( ! is_array( $value ) ) {
				$value = [ $value ];
			}
			if ( count( $value ) === 1 ) {
				if ( ! empty( $value[0] ) ) {
					$test = explode( '|', $value[0] );
					if ( is_array( $test ) && count( $test ) > 1 ) {
						$value = $test;
					}
				}
			}
			$value = THEMECOMPLETE_EPO_HELPER()->to_ssl( $value );

			$display_value = [];
			foreach ( $value as $v ) {
				$display_value[] = THEMECOMPLETE_EPO_ORDER()->display_meta_value( $v, 1, 'always' );
			}

			$value         = implode( '|', $value );
			$display_value = implode( '|', $display_value );

			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, 1, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			if ( empty( $this->key ) ) {
				$_price = 0;
			}

			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				[
					'mode'                             => 'builder',
					'cssclass'                         => $this->element['class'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $value,
					'post_name'                        => $this->attribute,
					'display'                          => $display_value,
					'price'                            => $_price,
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( 1 ),
					'quantity'                         => 1,
					'quantity_selector'                => '',
					'multiple_values'                  => '|',
					'multiple'                         => '1',
					'key'                              => 0,
					'use_images'                       => false,
					'changes_product_image'            => false,
					'imagesp'                          => '',
					'images'                           => '',
					'file'                             => isset( $upload['file'] ) ? $upload : '',
				],
				$this
			);
		}

		return false;
	}

	/**
	 * Add field data to cart (fees single)
	 *
	 * @return false|array<mixed>
	 * @since 6.4.2
	 */
	public function add_cart_item_data_cart_fees_single() {
		$files = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		$can_be_added = false;
		$posted_check = false;
		if ( isset( $this->post_data[ $this->attribute ] ) && '' !== $this->post_data[ $this->attribute ] ) {
			$posted_check = true;
		}
		if ( $posted_check ) {
			$value        = $this->post_data[ $this->attribute ];
			$can_be_added = true;
		} elseif ( ! empty( $files[ $this->attribute ] ) && ! empty( $files[ $this->attribute ]['name'] ) ) {
			if ( is_array( $files[ $this->attribute ]['name'] ) ) {
				$file_object = [];
				$upload      = [];
				$value       = [];
				foreach ( $files[ $this->attribute ]['name'] as $index => $file ) {
					if ( $file ) {
						foreach ( $files[ $this->attribute ] as $att => $value_object ) {
							$file_object[ $att ] = $value_object[ $index ];
						}
						$upload[ $index ] = THEMECOMPLETE_EPO()->upload_file( $file_object, $this->key_id, $this->keyvalue_id );
						if ( false !== $upload[ $index ] ) {
							if ( empty( $upload[ $index ]['error'] ) && ! empty( $upload[ $index ]['file'] ) ) {
								$value[ $index ] = wc_clean( $upload[ $index ]['url'] );
								if ( empty( $upload[ $index ]['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
									wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
								}
								$can_be_added = true;
							} else {
								wc_add_notice( $upload[ $index ]['error'], 'error' );
							}
						}
					}
				}
			} else {
				$upload = THEMECOMPLETE_EPO()->upload_file( $files[ $this->attribute ], $this->key_id, $this->keyvalue_id );
				if ( false !== $upload ) {
					if ( empty( $upload['error'] ) && ! empty( $upload['file'] ) ) {
						$value = wc_clean( $upload['url'] );
						if ( empty( $upload['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
							wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
						}
						$can_be_added = true;

					} else {
						wc_add_notice( $upload['error'], 'error' );
					}
				}
			}
		}

		if ( isset( $upload ) && isset( $value ) && ! empty( $value ) && $can_be_added ) {
			if ( ! is_array( $upload ) ) {
				$upload = [ $upload ];
			}
			if ( ! is_array( $value ) ) {
				$value = [ $value ];
			}
			if ( count( $value ) === 1 ) {
				if ( ! empty( $value[0] ) ) {
					$test = explode( '|', $value[0] );
					if ( is_array( $test ) && count( $test ) > 1 ) {
						$value = $test;
					}
				}
			}
			$value = THEMECOMPLETE_EPO_HELPER()->to_ssl( $value );

			$display_value = [];
			foreach ( $value as $v ) {
				$display_value[] = THEMECOMPLETE_EPO_ORDER()->display_meta_value( $v, 0, 'always' );
			}

			$value         = implode( '|', $value );
			$display_value = implode( '|', $display_value );

			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, 1, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			if ( empty( $this->key ) ) {
				$_price = 0;
			}

			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				[
					'mode'                             => 'builder',
					'include_tax_for_fee_price_type'   => $this->element['include_tax_for_fee_price_type'],
					'tax_class_for_fee_price_type'     => $this->element['tax_class_for_fee_price_type'],
					'cssclass'                         => $this->element['class'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $value,
					'post_name'                        => $this->attribute,
					'display'                          => $display_value,
					'price'                            => THEMECOMPLETE_EPO_CART()->calculate_fee_price( $_price, $this->product_id, $this->element ),
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( 1 ),
					'quantity'                         => 1,
					'quantity_selector'                => '',
					'multiple_values'                  => '|',
					'multiple'                         => '1',
					'key'                              => 0,
					'use_images'                       => false,
					'changes_product_image'            => false,
					'imagesp'                          => '',
					'images'                           => '',
					'cart_fees'                        => 'multiple',
					'file'                             => isset( $upload['file'] ) ? $upload : '',
				],
				$this
			);
		}

		return false;
	}
}
includes/fields/class-themecomplete-epo-fields-textarea.php000064400000011346150755142450020144 0ustar00<?php
/**
 * Textarea Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Textarea Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_textarea extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$min_chars = $this->get_value( $element, 'min_chars', '' );
		$max_chars = $this->get_value( $element, 'max_chars', '' );

		$min_chars = '' !== $min_chars ? absint( $element['min_chars'] ) : '';
		$max_chars = '' !== $max_chars ? absint( $element['max_chars'] ) : '';

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$display = [
			'default_value'     => $this->get_value( $element, 'default_value', '' ),
			'get_default_value' => $this->get_default_value( $element, $args ),
			'textbeforeprice'   => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'    => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'       => $this->get_value( $element, 'hide_amount', '' ),
			'placeholder'       => $this->get_value( $element, 'placeholder', '' ),
			'quantity'          => $this->get_value( $element, 'quantity', '' ),
			'freechars'         => $this->get_value( $element, 'freechars', '' ),
			'min_chars'         => $min_chars,
			'max_chars'         => $max_chars,
			'class_label'       => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_textarea', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
			if ( $this->element['min_chars'] ) {
				$val = false;
				if ( isset( $this->epo_post_fields[ $attribute ] ) ) {
					$val = $this->epo_post_fields[ $attribute ];
					$val = preg_replace( "/\r\n/", "\n", $val );
				}
				if ( ! is_array( $val ) ) {
					$val = [ $val ];
				}
				foreach ( $val as $val_value ) {
					if ( '' !== $val_value && ( false !== $val_value && strlen( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $val_value ) ) < (int) $this->element['min_chars'] ) ) {
						$passed = false;
						/* translators: %1 number of characters %2 element label. */
						$message[] = sprintf( esc_html__( 'You must enter at least %1$s characters for "%2$s".', 'woocommerce-tm-extra-product-options' ), (int) $this->element['min_chars'], $this->element['label'] );
						break;
					}
				}
			}
			if ( $this->element['max_chars'] ) {
				$val = false;
				if ( isset( $this->epo_post_fields[ $attribute ] ) ) {
					$val = $this->epo_post_fields[ $attribute ];
					$val = preg_replace( "/\r\n/", "\n", $val );
				}

				if ( ! is_array( $val ) ) {
					$val = [ $val ];
				}

				foreach ( $val as $val_value ) {
					if ( '' !== $val_value && ( false !== $val_value && strlen( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $val_value ) ) > (int) $this->element['max_chars'] ) ) {
						$passed = false;
						/* translators: %1 number of characters %2 element label. */
						$message[] = sprintf( esc_html__( 'You cannot enter more than %1$s characters for "%2$s".', 'woocommerce-tm-extra-product-options' ), (int) $this->element['max_chars'], $this->element['label'] );
						break;
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-variations.php000064400000003442150755142450020504 0ustar00<?php
/**
 * Styled Variations Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Styled Variations Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_variations extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @since 1.0
	 *
	 * @return array<mixed>
	 */
	public function display_field( $element = [], $args = [] ) {

		$current_builder = $element['builder'];

		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$id_for_meta              = $args['product_id'];
			$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $args['product_id'] );
			if ( ! $wpml_is_original_product ) {
				$id_for_meta = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $args['product_id'] ) );
			}

			$builder = themecomplete_get_post_meta( $id_for_meta, 'tm_meta', true );

			if ( ! $current_builder ) {

				if ( ! isset( $builder['tmfbuilder'] ) ) {
					$builder['tmfbuilder'] = [];
				}
				$current_builder = $builder['tmfbuilder'];

			}
		}

		$variations_disabled = is_array( $current_builder ) && isset( $current_builder['variations_disabled'] ) ? $current_builder['variations_disabled'] : '';
		$display             = [
			'builder'                    => $current_builder,
			'variation_section_disabled' => $variations_disabled,
		];

		return apply_filters( 'wc_epo_display_field_variations', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<bool>
	 * @since 1.0
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-range.php000064400000013737150755142450017431 0ustar00<?php
/**
 * Range Picker Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Range Picker Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_range extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$default_value = $this->get_value( $element, 'default_value', '' );
		$min           = $this->get_value( $element, 'min', '' );
		if ( '' !== $min && '' === $default_value ) {
			$default_value = $min;
		}

		$display = [
			'default_value'     => $default_value,
			'get_default_value' => $this->get_default_value( $element, $args, 'notempty', $min ),
			'textbeforeprice'   => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'    => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'       => $this->get_value( $element, 'hide_amount', '' ),
			'min'               => $min,
			'max'               => $this->get_value( $element, 'max', '' ),
			'step'              => $this->get_value( $element, 'step', '' ),
			'pips'              => $this->get_value( $element, 'pips', '' ),
			'noofpips'          => $this->get_value( $element, 'noofpips', '' ),
			'show_picker_value' => $this->get_value( $element, 'show_picker_value', '' ),
			'quantity'          => $this->get_value( $element, 'quantity', '' ),
		];

		return apply_filters( 'wc_epo_display_field_range', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @since 1.0
	 * @return array<mixed>
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}

	/**
	 * Add field data to cart (single type fields)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_single() {
		if ( ! $this->is_setup() ) {
			return false;
		}
		if ( ! empty( $this->key ) ) {

			$attribute_quantity = isset( $this->post_data[ $this->attribute_quantity ] ) ? $this->post_data[ $this->attribute_quantity ] : 1;
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->key_id ] ) ) {
				$attribute_quantity = $attribute_quantity[ $this->key_id ];
				if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->keyvalue_id ] ) ) {
					$attribute_quantity = $attribute_quantity[ $this->keyvalue_id ];
				}
			}
			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, $attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				[
					'mode'                             => 'builder',
					'cssclass'                         => $this->element['class'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $this->key,
					'post_name'                        => $this->attribute,
					'price'                            => $_price,
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( $attribute_quantity ),
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'quantity'                         => $attribute_quantity,
					'quantity_selector'                => isset( $this->element['quantity'] ) ? $this->element['quantity'] : '',
				],
				$this
			);

		}

		return false;
	}
}
includes/fields/class-themecomplete-epo-fields-select.php000064400000025236150755142450017611 0ustar00<?php
/**
 * Select Box Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Select Box Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_select extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$changes_product_image = empty( $element['changes_product_image'] ) ? '' : $element['changes_product_image'];

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$display = [
			'options'               => [],
			'options_array'         => [],
			'use_url'               => isset( $element['use_url'] ) ? $element['use_url'] : '',
			'textbeforeprice'       => isset( $element['text_before_price'] ) ? $element['text_before_price'] : '',
			'textafterprice'        => isset( $element['text_after_price'] ) ? $element['text_after_price'] : '',
			'hide_amount'           => $this->get_value( $element, 'hide_amount', '' ),
			'changes_product_image' => $changes_product_image,
			'quantity'              => isset( $element['quantity'] ) ? $element['quantity'] : '',
			'placeholder'           => isset( $element['placeholder'] ) ? $element['placeholder'] : '',
			'class_label'           => $class_label,
		];

		$_default_value_counter           = 0;
		$display['default_value_counter'] = false;
		if ( ! isset( $element['placeholder'] ) || '' !== $element['placeholder'] ) {
			$placeholdertext      = apply_filters( 'woocommerce_tm_epo_option_name', $element['placeholder'], $element, $_default_value_counter );
			$display['options'][] = [
				'value_to_show'  => '',
				'data_price'     => '',
				'data_rules'     => '',
				'data_rulestype' => '',
				'text'           => apply_filters( 'wc_epo_kses', $placeholdertext, $placeholdertext ),
			];
		}

		$selected_value = '';
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ 'tmcp_' . $args['name_inc'] ] ) ) {
			$selected_value = $this->post_data[ 'tmcp_' . $args['name_inc'] ];
		} elseif ( empty( $this->post_data ) && isset( $_REQUEST[ 'tmcp_' . $args['name_inc'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$selected_value = wp_unslash( $_REQUEST[ 'tmcp_' . $args['name_inc'] ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
		} elseif ( THEMECOMPLETE_EPO()->is_quick_view() || ( empty( $this->post_data ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) || ( isset( $args['posted_name'] ) && ! empty( $this->post_data ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$selected_value = -1;
		}

		$selected_value = apply_filters( 'wc_epo_default_value', $selected_value, $element );

		if ( is_array( $selected_value ) ) {
			if ( isset( $args['get_posted_key'] ) && isset( $selected_value[ $args['get_posted_key'] ] ) ) {
				$selected_value = $selected_value[ $args['get_posted_key'] ];
			} else {
				$selected_value = '';
			}
		}

		foreach ( $element['options'] as $value => $label ) {
			$default_value = isset( $element['default_value'] )
				?
				( ( '' !== $element['default_value'] )
					? ( (int) $element['default_value'] === (int) $_default_value_counter )
					: false )
				: false;

			$selected = false;

			if ( -1 === $selected_value ) {
				if ( ( THEMECOMPLETE_EPO()->is_quick_view() || ( ( empty( $this->post_data ) || ( ! empty( $this->post_data ) && ( ! isset( $this->post_data['quantity'] ) || ( isset( $args['posted_name'] ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) ) ) ) ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					if ( $default_value ) {
						$selected = true;
					}
				}
			} elseif ( $default_value && ! empty( $element['default_value_override'] ) && isset( $element['default_value'] ) ) {
				$selected = true;
			} elseif ( esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $value ) ) {
				$selected = true;
			}
			if ( $selected ) {
				$display['default_value_counter'] = $value;
			}

			$data_url = isset( $element['url'][ $_default_value_counter ] ) ? $element['url'][ $_default_value_counter ] : '';

			$css_class = apply_filters( 'wc_epo_multiple_options_css_class', '', $element, $_default_value_counter );
			if ( '' !== $css_class ) {
				$css_class = ' ' . $css_class;
			}

			$imagep = isset( $element['imagesp'][ $_default_value_counter ] ) ? $element['imagesp'][ $_default_value_counter ] : '';
			if ( 'relative' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_image_mode' ) ) {
				if ( str_contains( $imagep, get_site_url() ) ) {
					$imagep = wp_make_link_relative( $imagep );
				}
			}

			$image_variations = [];
			if ( $changes_product_image ) {
				$image_link       = '';
				$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'image' );

				$image_link       = $imagep;
				$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'imagep' );
			}

			$value_to_show = isset( $element['original_options'] ) && isset( $element['original_options'][ $value ] ) ? $element['original_options'][ $value ] : $value;

			$text   = apply_filters( 'woocommerce_tm_epo_option_name', $label, $element, $_default_value_counter, $value, $label );
			$text   = apply_filters( 'wc_epo_kses', $text, $text );
			$option = [
				'selected'            => $selected,
				'current'             => true,
				'value_to_show'       => $value_to_show,
				'css_class'           => $css_class,
				'data_url'            => $data_url,
				'data_imagep'         => $imagep,
				'data_price'          => isset( $element['rules_filtered'][ $value ][0] ) ? $element['rules_filtered'][ $value ][0] : 0,
				'tm_tooltip_html'     => ( isset( $element['cdescription'] ) && isset( $element['cdescription'][ $_default_value_counter ] ) ) ? apply_filters( 'wc_epo_kses', $element['cdescription'][ $_default_value_counter ], $element['cdescription'][ $_default_value_counter ] ) : '',
				'image_variations'    => wp_json_encode( $image_variations ),
				'data_rules'          => isset( $element['rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['rules_filtered'][ $value ] ) ) : '',
				'data_original_rules' => isset( $element['original_rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['original_rules_filtered'][ $value ] ) ) : '',
				'data_rulestype'      => isset( $element['rules_type'][ $value ] ) ? wp_json_encode( ( $element['rules_type'][ $value ] ) ) : '',
				'data_text'           => $label,
				'data_hide_amount'    => empty( $element['hide_amount'] ) ? '0' : '1',
				'text'                => $text,
			];

			$option               = apply_filters( 'wc_epo_select_options', $option, $element, $_default_value_counter );
			$display['options'][] = apply_filters( 'wc_epo_multiple_options', $option, $element, $_default_value_counter );

			$display['options_array'][] = [
				'value'            => $value,
				'data_url'         => $data_url,
				'image_variations' => wp_json_encode( $image_variations ),
				'imagep'           => ( isset( $element['imagesp'][ $_default_value_counter ] ) ? $element['imagesp'][ $_default_value_counter ] : '' ),
				'price'            => ( isset( $element['rules_filtered'][ $value ][0] ) ? $element['rules_filtered'][ $value ][0] : 0 ),
				'cdescription'     => ( isset( $element['cdescription'] ) ? ( isset( $element['cdescription'][ $_default_value_counter ] ) ? $element['cdescription'][ $_default_value_counter ] : '' ) : '' ),
				'rules'            => ( isset( $element['rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['rules_filtered'][ $value ] ) ) : '' ),
				'original_rules'   => ( isset( $element['original_rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['original_rules_filtered'][ $value ] ) ) : '' ),
				'rulestype'        => ( isset( $element['rules_type'][ $value ] ) ? wp_json_encode( ( $element['rules_type'][ $value ] ) ) : '' ),
				'label'            => apply_filters( 'woocommerce_tm_epo_option_name', $label, $element, $_default_value_counter, $value, $label ),
			];

			++$_default_value_counter;
		}

		$display['element'] = $element;

		if ( ! empty( $changes_product_image ) ) {
			$fieldtype            = $args['fieldtype'] . ' tm-product-image';
			$display['fieldtype'] = $fieldtype;
		}

		if ( ! empty( $args['element_data_attr'] ) && is_array( $args['element_data_attr'] ) ) {
			$display['element_data_attr'] = $args['element_data_attr'];
		} else {
			$display['element_data_attr'] = [];
		}

		return apply_filters( 'wc_epo_display_field_select', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields.php000064400000101524150755142450016327 0ustar00<?php
/**
 * Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Field class
 *
 * This class acts as the base class
 * for the various field options.
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 */
class THEMECOMPLETE_EPO_FIELDS {

	/**
	 * The product id
	 *
	 * @var float|null
	 */
	public $product_id;

	/**
	 * The element array
	 *
	 * @var array<mixed>
	 */
	public $element = [];

	/**
	 * Array of element arguments to save
	 *
	 * @var array<mixed>|null
	 */
	public $order_saved_element;

	/**
	 * The posted element name
	 *
	 * @var string|false
	 */
	public $attribute = false;

	/**
	 * The quantity name of the element
	 *
	 * @var string|null
	 */
	public $attribute_quantity;

	/**
	 * The posted element quantity
	 *
	 * @var float|array<mixed>|false
	 */
	public $posted_attribute_quantity = false;

	/**
	 * The array key of the posted element values array
	 *
	 * @var integer
	 */
	public $key_id = 0;

	/**
	 * The array key for the values of the posted element values array
	 *
	 * @var integer
	 */
	public $keyvalue_id = 0;

	/**
	 * The posted element value
	 *
	 * @var string|array<mixed>
	 */
	public $key = '';

	/**
	 * If the product has pricing, true or false
	 *
	 * @var boolean|null
	 */
	public $per_product_pricing;

	/**
	 * The product price
	 *
	 * @var float|false
	 */
	public $cpf_product_price = false;

	/**
	 * The variation id
	 *
	 * @var integer|false
	 */
	public $variation_id = false;

	/**
	 * The posted data
	 *
	 * @var array<mixed>
	 */
	public $post_data = [];

	/**
	 * Holds builder element type
	 *
	 * @var mixed
	 */
	public $holder;

	/**
	 * Holds builder element fee type
	 *
	 * @var mixed
	 */
	public $holder_cart_fees;

	/**
	 * The posted fields array
	 *
	 * @var array<mixed>
	 */
	public $epo_post_fields = [];

	/**
	 * The current loop
	 *
	 * @var integer|false
	 */
	public $loop = false;

	/**
	 * The form prefix
	 *
	 * @var string|null
	 */
	public $form_prefix;

	/**
	 * The posted html names of the normal elements
	 *
	 * @var array<mixed>
	 */
	public $tmcp_attributes = [];

	/**
	 * The posted html names of the fee elements
	 *
	 * @var array<mixed>
	 */
	public $tmcp_attributes_fee = [];

	/**
	 * The html names of the elements
	 *
	 * @var array<mixed>
	 */
	public $field_names = [];

	/**
	 * If the element has a repeater
	 *
	 * @var mixed
	 */
	public $repeater = false;

	/**
	 * Custom help data
	 * This is used in places where we need to add a custom property
	 *
	 * @var array<mixed>
	 */
	public $data_store = [];

	/**
	 * If all variables are setup
	 *
	 * @var boolean
	 */
	private $setup = false;

	/**
	 * Class Constructor
	 *
	 * @param integer|false     $product_id The product id.
	 * @param array<mixed>      $element The element array.
	 * @param boolean|false     $per_product_pricing If the product has pricing, true or false.
	 * @param float|false       $cpf_product_price The product price.
	 * @param integer|false     $variation_id The variation id.
	 * @param array<mixed>|null $post_data The posted data.
	 * @since 1.0
	 */
	public function __construct( $product_id = false, $element = [], $per_product_pricing = false, $cpf_product_price = false, $variation_id = false, $post_data = null ) {
		// @phpstan-ignore-next-line
		if ( is_null( $post_data ) && isset( $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post_data = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification
		}
		if ( empty( $post_data ) && isset( $_REQUEST['tcajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$post_data = wp_unslash( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}
		if ( ! is_array( $post_data ) ) {
			$post_data = [];
		}
		$this->post_data = $post_data;
		if ( false !== $product_id ) {
			$this->product_id          = $product_id;
			$this->element             = $element;
			$this->order_saved_element = [
				'type'       => $element['type'],
				'rules'      => $element['rules'],
				'rules_type' => $element['rules_type'],
				'_'          => [ 'price_type' => false ],
			];
			$this->per_product_pricing = $per_product_pricing;
			$this->cpf_product_price   = $cpf_product_price;
			$this->variation_id        = $variation_id;
			$this->holder              = THEMECOMPLETE_EPO()->tm_builder_elements[ $this->element['type'] ]->type;
			$this->holder_cart_fees    = THEMECOMPLETE_EPO()->tm_builder_elements[ $this->element['type'] ]->fee_type;
			$this->setup               = true;
		}
	}

	/**
	 * Check if all variables are setup
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_setup() {
		return $this->setup;
	}

	/**
	 * Gets the saved value
	 *
	 * @param array<mixed> $element The element array.
	 * @param string       $name The name of the element array key to fetch.
	 * @param mixed        $default_value The default value.
	 * @param string       $prefix The value prefix.
	 * @return mixed
	 * @since 6.0
	 */
	public function get_value( $element = [], $name = '', $default_value = '', $prefix = '' ) {
		$value = isset( $element[ $name ] ) ? $element[ $name ] : $default_value;

		if ( ! is_array( $value ) ) {
			$value = $prefix . $value;
		}

		$value = apply_filters( 'wc_epo_fetch_' . esc_attr( $name ), $value, $element );

		return $value;
	}

	/**
	 * Gets the saved value
	 *
	 * @param array<mixed> $element The element array.
	 * @param string       $name The name of the element array key to fetch.
	 * @param string       $default_value The default value.
	 * @return mixed
	 * @since 6.0
	 */
	public function get_value_no_empty( $element = [], $name = '', $default_value = '' ) {
		$value = isset( $element[ $name ] ) && ! empty( $element[ $name ] ) ? $element[ $name ] : $default_value;
		$value = apply_filters( 'wc_epo_fetch_' . esc_attr( $name ), $value, $element );
		return $value;
	}

	/**
	 * Gets the default value for display
	 *
	 * @param array<mixed>   $element The element array.
	 * @param array<mixed>   $args Array of arguments.
	 * @param boolean|string $use_default_value if the default element value should be fetched.
	 * @param string|false   $alt_value The value to return if everythign else fail.
	 * @return mixed
	 * @since 6.0
	 */
	public function get_default_value( $element = [], $args = [], $use_default_value = true, $alt_value = false ) {
		$get_default_value = '';
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ $args['posted_name'] ] ) ) {
			// Data is already unslashed.
			$get_default_value = $this->post_data[ $args['posted_name'] ];
		} elseif ( empty( $this->post_data ) && isset( $_REQUEST[ $args['posted_name'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$get_default_value = wp_unslash( $_REQUEST[ $args['posted_name'] ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		} elseif ( $use_default_value ) {
			$default_value = $this->get_value( $element, 'default_value', '' );
			if ( 'notempty' === $use_default_value ) {
				if ( '' !== $default_value ) {
					$get_default_value = $default_value;
				} elseif ( false !== $alt_value ) {
					$get_default_value = $alt_value;
				}
			} elseif ( true === $use_default_value ) {
				$get_default_value = $default_value;
			}
		} elseif ( false !== $alt_value ) {
			$get_default_value = $alt_value;
		}
		$get_default_value = apply_filters( 'wc_epo_get_default_value', $get_default_value, $element, isset( $args['value'] ) ? $args['value'] : '' );
		if ( is_array( $get_default_value ) ) {

			if ( isset( $args['get_posted_key'] ) && isset( $get_default_value[ $args['get_posted_key'] ] ) ) {
				$get_default_value = $get_default_value[ $args['get_posted_key'] ];
			} else {
				$get_default_value = $get_default_value[0];
			}
		}
		return $get_default_value;
	}

	/**
	 * Return price per currency array
	 *
	 * @param float|array<mixed>|false $attribute_quantity The element quantity.
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function fill_currencies( $attribute_quantity = 1 ) {
		$price_per_currencies = isset( $this->element['price_per_currencies'] ) ? $this->element['price_per_currencies'] : [];
		$price_per_currency   = [];
		$current_currency     = themecomplete_get_woocommerce_currency();
		foreach ( $price_per_currencies as $currency => $price_rule ) {
			$copy_element                         = $this->element;
			$copy_element['price_rules_original'] = $copy_element['price_rules'];
			$copy_element['price_rules']          = $price_rule;
			$currency_price                       = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $copy_element, $this->key, $this->attribute, $attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id, '', $currency, $current_currency, $price_per_currencies );
			$price_per_currency[ $currency ]      = $currency_price;
		}
		return $price_per_currency;
	}

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) { // phpcs:ignore
		return [];
	}

	/**
	 * Pre display field actions
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function display_field_pre( $element = [], $args = [] ) {
	}

	/**
	 * Field pre validation
	 *
	 * @param array<mixed>  $epo_post_fields The posted fields array.
	 * @param array<mixed>  $element The element array.
	 * @param integer|false $loop The current loop.
	 * @param string        $form_prefix The form prefix.
	 * @return array<mixed>
	 * @since 1.0
	 */
	final public function validate_field( $epo_post_fields = [], $element = [], $loop = false, $form_prefix = '' ) {
		$this->epo_post_fields     = $epo_post_fields;
		$this->element             = $element;
		$this->loop                = $loop;
		$this->form_prefix         = $form_prefix;
		$this->tmcp_attributes     = THEMECOMPLETE_EPO()->get_post_names( $element['options'], $element['type'], $loop, $form_prefix, '', $element );
		$this->tmcp_attributes_fee = THEMECOMPLETE_EPO()->get_post_names( $element['options'], $element['type'], $loop, $form_prefix, THEMECOMPLETE_EPO()->cart_fee_name, $element );

		$is_fee = false;
		if ( isset( $this->element['is_cart_fee'] ) ) {
			if ( is_array( $this->element['is_cart_fee'] ) && isset( $this->element['is_cart_fee'][ $loop ] ) ) {
				$is_fee = $this->element['is_cart_fee'][ $loop ];
			} elseif ( ! is_array( $this->element['is_cart_fee'] ) ) {
				$is_fee = $this->element['is_cart_fee'];
			}
		}

		if ( $is_fee ) {
			$this->field_names = $this->tmcp_attributes_fee;
		} else {
			$this->field_names = $this->tmcp_attributes;
			$this->field_names = apply_filters( 'wc_epo_validate_field_field_names', $this->field_names, $this, $element, $loop, $form_prefix );
		}

		return $this->validate();
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}

	/**
	 * Function to filter the result data
	 *
	 * @param array<mixed> $ret The data result.
	 * @param string       $type 'normal' or 'fee'.
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function result( $ret = [], $type = '' ) {
		return apply_filters( 'wc_epo_save_cart_item_data', $ret, $type, $this );
	}

	/**
	 * Add field data to cart
	 *
	 * @param string|false        $attribute The posted element name.
	 * @param string|array<mixed> $key The posted element value.
	 * @param integer             $key_id The array key of the posted element values array.
	 * @param integer             $keyvalue_id The array key for the values of the posted element values array.
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	final public function add_cart_item_data( $attribute = false, $key = '', $key_id = 0, $keyvalue_id = 0 ) {
		if ( ! $this->setup ) {
			return false;
		}
		$this->key_id             = $key_id;
		$this->keyvalue_id        = $keyvalue_id;
		$this->attribute          = $attribute;
		$this->attribute_quantity = $attribute . '_quantity';
		$this->key                = $key;

		$attribute_quantity = isset( $this->post_data[ $this->attribute_quantity ] ) ? $this->post_data[ $this->attribute_quantity ] : 1;
		if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->key_id ] ) ) {
			$attribute_quantity = $attribute_quantity[ $this->key_id ];
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->keyvalue_id ] ) ) {
				$attribute_quantity = $attribute_quantity[ $this->keyvalue_id ];
			}
		}
		$this->posted_attribute_quantity = floatval( $attribute_quantity );

		$string = $this->key;

		if ( ! is_array( $string ) ) {
			$pattern = '/^(.+?_\d+)-\d+$/';

			if ( preg_match( $pattern, $string, $matches ) ) {
				$this->key = $matches[1];
			}
		}

		$ret = false;
		if ( 'single' === $this->holder || 'multipleallsingle' === $this->holder ) {
			$ret = $this->add_cart_item_data_single();
		} elseif ( 'multiple' === $this->holder || 'multipleall' === $this->holder || 'multiplesingle' === $this->holder || 'singlemultiple' === $this->holder ) {
			$ret = $this->add_cart_item_data_multiple();
		}

		if ( false !== $ret ) {

			$_price_type = THEMECOMPLETE_EPO()->get_element_price_type( '', $this->element, $this->key, $this->per_product_pricing, $this->variation_id );
			if ( is_array( $this->order_saved_element ) ) {
				$this->order_saved_element['_'] = [ 'price_type' => $_price_type ];
			}
			if ( 'math' === $_price_type ) {
				$_price = THEMECOMPLETE_EPO()->get_element_price( 0, $_price_type, $this->element, $this->key, $this->per_product_pricing, $this->variation_id );
				if ( is_array( $_price ) ) {
					$_price = $_price['price'];
				}
				if ( str_contains( $_price, '{quantity}' ) || str_contains( $_price, '{product_price}' ) || str_contains( $_price, '{dynamic_product_price}' ) || THEMECOMPLETE_EPO()->has_math_special_variable( $_price ) ) {
					$ret['price_formula'] = $_price;
				}

				if ( 'change_product_weight' === $this->element['mode'] ) {
					$this_key = $this->key;
					if ( is_array( $this_key ) ) {
						$this_key = '0';
					}
					$ret['weight'] = THEMECOMPLETE_EPO()->calculate_math_price( $_price, $this->post_data, $this->element, $this_key, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
				}
			}
			if ( false !== $this->repeater ) {
				$ret['repeater'] = $this->repeater;
			}
			$ret['key_id']      = $this->key_id;
			$ret['keyvalue_id'] = $this->keyvalue_id;

			return $this->result( $ret, 'normal' );

		}

		return false;
	}

	/**
	 * Add field data to cart (fees)
	 *
	 * @param string|false $attribute The posted element name.
	 * @param string       $key The posted element value.
	 * @param integer      $key_id The array key of the posted element values array.
	 * @param integer      $keyvalue_id The array key for the values of the posted element values array.
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	final public function add_cart_item_data_cart_fees( $attribute = false, $key = '', $key_id = 0, $keyvalue_id = 0 ) {
		if ( ! $this->setup ) {
			return false;
		}
		$this->key_id             = $key_id;
		$this->keyvalue_id        = $keyvalue_id;
		$this->attribute          = $attribute;
		$this->attribute_quantity = $attribute . '_quantity';
		$this->key                = $key;

		$attribute_quantity = isset( $this->post_data[ $this->attribute_quantity ] ) ? $this->post_data[ $this->attribute_quantity ] : 1;
		if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->key_id ] ) ) {
			$attribute_quantity = $attribute_quantity[ $this->key_id ];
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $this->keyvalue_id ] ) ) {
				$attribute_quantity = $attribute_quantity[ $this->keyvalue_id ];
			}
		}
		$this->posted_attribute_quantity = $attribute_quantity;

		$ret = false;
		if ( 'single' === $this->holder_cart_fees ) {
			$ret = $this->add_cart_item_data_cart_fees_single();
		} elseif ( 'multiple' === $this->holder_cart_fees ) {
			$ret = $this->add_cart_item_data_cart_fees_multiple();
		}

		if ( false !== $ret ) {

			$_price_type = THEMECOMPLETE_EPO()->get_element_price_type( '', $this->element, $this->key, $this->per_product_pricing, $this->variation_id );
			if ( is_array( $this->order_saved_element ) ) {
				$this->order_saved_element['_'] = [ 'price_type' => $_price_type ];
			}
			if ( 'math' === $_price_type ) {
				$_price = THEMECOMPLETE_EPO()->get_element_price( 0, $_price_type, $this->element, $this->key, $this->per_product_pricing, $this->variation_id );
				if ( is_array( $_price ) ) {
					$_price = $_price['price'];
				}
				if ( str_contains( $_price, '{quantity}' ) || str_contains( $_price, '{product_price}' ) || str_contains( $_price, '{dynamic_product_price}' ) || THEMECOMPLETE_EPO()->has_math_special_variable( $_price ) ) {
					$ret['price_formula'] = $_price;
				}
			}
			if ( false !== $this->repeater ) {
				$ret['repeater'] = $this->repeater;
			}
			$ret['key_id']      = $this->key_id;
			$ret['keyvalue_id'] = $this->keyvalue_id;
			return $this->result( $ret, 'fee' );

		}

		return false;
	}

	/**
	 * Add field data to cart (single type fields)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_single() {
		if ( ! $this->setup ) {
			return false;
		}
		if ( '' !== $this->key ) {

			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );

			$ret = [
				'mode'                             => 'builder',
				'cssclass'                         => $this->element['class'],
				'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
				'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
				'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
				'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
				'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
				'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
				'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
				'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
				'element'                          => $this->order_saved_element,
				'name'                             => $this->element['label'],
				'value'                            => $this->key,
				'post_name'                        => $this->attribute,
				'price'                            => $_price,
				'section'                          => $this->element['uniqid'],
				'section_label'                    => $this->element['label'],
				'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
				'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
				'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
				'price_per_currency'               => $this->fill_currencies( $this->posted_attribute_quantity ),
				'quantity'                         => $this->posted_attribute_quantity,
				'quantity_selector'                => isset( $this->element['quantity'] ) ? $this->element['quantity'] : '',
			];
			if ( 'dynamic' === $this->element['type'] ) {
				$ret['dynamic'] = $this->element['mode'];
			}

			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				$ret,
				$this
			);
		}

		return false;
	}

	/**
	 * Add field data to cart (multiple type fields)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_multiple() {
		if ( ! $this->setup ) {
			return false;
		}

		// multiple support.
		$value  = false;
		$prices = false;
		if ( is_array( $this->key ) ) {
			$value   = [];
			$prices  = [];
			$thiskey = $this->key;
			foreach ( $this->key as $thiskeyvalue ) {
				$thiskey                 = esc_attr( $thiskeyvalue );
				$value[]                 = $this->element['options'][ $thiskey ];
				$prices[ $thiskeyvalue ] = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $thiskeyvalue, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );

			}
		} elseif ( isset( $this->element['options'][ esc_attr( $this->key ) ] ) ) {
			$thiskey = esc_attr( $this->key );
			$value   = $this->element['options'][ $thiskey ];
		}
		if ( false !== $value ) {
			$_price     = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			$use_images = ( 'image' === $this->element['replacement_mode'] ) ? ( 'center' === $this->element['swatch_position'] ? 'images' : $this->element['swatch_position'] ) : '';
			if ( $use_images ) {
				$_image_key = array_search( $this->key, $this->element['option_values'], true );
				if ( false === $_image_key ) {
					$_image_key = false;
				}
			} else {
				$_image_key = false;
			}

			$use_colors = ( 'color' === $this->element['replacement_mode'] ) ? ( 'center' === $this->element['swatch_position'] ? 'color' : $this->element['swatch_position'] ) : '';

			if ( $use_colors ) {
				$_color_key = array_search( $this->key, $this->element['option_values'], true );
				if ( false === $_color_key ) {
					$_color_key = false;
				}
			} else {
				$_color_key = false;
			}

			$changes_product_image = ! empty( $this->element['changes_product_image'] ) ? $this->element['changes_product_image'] : '';
			if ( $changes_product_image ) {
				$c_image_key = array_search( $this->key, $this->element['option_values'], true );
				if ( false === $c_image_key ) {
					$c_image_key = false;
				}
			} else {
				$c_image_key = false;
			}

			$ret = [
				'mode'                             => 'builder',
				'cssclass'                         => $this->element['class'],
				'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
				'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
				'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
				'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
				'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
				'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
				'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
				'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
				'element'                          => $this->order_saved_element,
				'name'                             => $this->element['label'],
				'value'                            => $value,
				'post_name'                        => $this->attribute,
				'price'                            => $_price,
				'section'                          => $this->element['uniqid'],
				'section_label'                    => $this->element['label'],
				'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
				'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
				'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
				'price_per_currency'               => $this->fill_currencies( $this->posted_attribute_quantity ),
				'quantity'                         => $this->posted_attribute_quantity,
				'quantity_selector'                => isset( $this->element['quantity'] ) ? $this->element['quantity'] : '',
				'multiple'                         => '1',
				'key'                              => isset( $thiskey ) ? $thiskey : '',
				'use_images'                       => $use_images,
				'use_colors'                       => $use_colors,
				'changes_product_image'            => $changes_product_image,
				'imagesp'                          => ( false !== $c_image_key && isset( $this->element['imagesp'][ $c_image_key ] ) ) ? $this->element['imagesp'][ $c_image_key ] : '',
				'images'                           => ( false !== $_image_key && isset( $this->element['images'][ $_image_key ] ) ) ? $this->element['images'][ $_image_key ] : '',
				'imagesc'                          => ( false !== $_image_key && isset( $this->element['imagesc'][ $_image_key ] ) && ! empty( $this->element['imagesc'][ $_image_key ] ) ) ? $this->element['imagesc'][ $_image_key ] : '',
				'color'                            => ( false !== $_color_key && isset( $this->element['color'][ $_color_key ] ) ) ? ( empty( $this->element['color'][ $_color_key ] ) ? 'transparent' : $this->element['color'][ $_color_key ] ) : '',
			];

			if ( is_array( $this->key ) ) {
				$ret['original_key'] = $this->key;
			}
			if ( false !== $prices ) {
				$ret['prices'] = $prices;
			}

			return apply_filters(
				'wc_epo_add_cart_item_data_multiple',
				$ret,
				$this
			);
		}

		return false;
	}

	/**
	 * Add field data to cart (fees single)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_cart_fees_single() {
		if ( ! $this->setup ) {
			return false;
		}
		if ( '' !== $this->key ) {
			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			$ret    = [
				'mode'                             => 'builder',
				'cssclass'                         => $this->element['class'],
				'include_tax_for_fee_price_type'   => $this->element['include_tax_for_fee_price_type'],
				'tax_class_for_fee_price_type'     => $this->element['tax_class_for_fee_price_type'],
				'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
				'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
				'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
				'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
				'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
				'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
				'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
				'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
				'element'                          => $this->order_saved_element,
				'name'                             => $this->element['label'],
				'value'                            => $this->key,
				'post_name'                        => $this->attribute,
				'price'                            => THEMECOMPLETE_EPO_CART()->calculate_fee_price( $_price, $this->product_id, $this->element ),
				'section'                          => $this->element['uniqid'],
				'section_label'                    => $this->element['label'],
				'percentcurrenttotal'              => 0,
				'fixedcurrenttotal'                => 0,
				'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
				'price_per_currency'               => $this->fill_currencies( $this->posted_attribute_quantity ),
				'quantity'                         => $this->posted_attribute_quantity,
				'quantity_selector'                => isset( $this->element['quantity'] ) ? $this->element['quantity'] : '',
				'cart_fees'                        => 'single',
			];
			return apply_filters(
				'wc_epo_add_cart_item_data_cart_fees_single',
				$ret,
				$this
			);
		}

		return false;
	}

	/**
	 * Add field data to cart (fees multiple)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_cart_fees_multiple() {
		if ( ! $this->setup ) {
			return false;
		}
		if ( empty( $this->key ) ) {
			return false;
		}
		// select placeholder check.
		if ( ! is_array( $this->key ) && isset( $this->element['options'][ esc_attr( $this->key ) ] ) ) {
			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, $this->posted_attribute_quantity, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );

			$use_images = ( 'image' === $this->element['replacement_mode'] ) ? ( 'center' === $this->element['swatch_position'] ? 'images' : $this->element['swatch_position'] ) : '';

			if ( $use_images ) {
				$_image_key = array_search( $this->key, $this->element['option_values'], true );
				if ( false === $_image_key ) {
					$_image_key = false;
				}
			} else {
				$_image_key = false;
			}

			$use_colors = ( 'color' === $this->element['replacement_mode'] ) ? ( 'center' === $this->element['swatch_position'] ? 'color' : $this->element['swatch_position'] ) : '';

			if ( $use_colors ) {
				$_color_key = array_search( $this->key, $this->element['option_values'], true );
				if ( false === $_color_key ) {
					$_color_key = false;
				}
			} else {
				$_color_key = false;
			}

			$ret = [
				'mode'                             => 'builder',
				'cssclass'                         => $this->element['class'],
				'include_tax_for_fee_price_type'   => $this->element['include_tax_for_fee_price_type'],
				'tax_class_for_fee_price_type'     => $this->element['tax_class_for_fee_price_type'],
				'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
				'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
				'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
				'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
				'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
				'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
				'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
				'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
				'element'                          => $this->order_saved_element,
				'name'                             => $this->element['label'],
				'value'                            => $this->element['options'][ esc_attr( $this->key ) ],
				'post_name'                        => $this->attribute,
				'price'                            => THEMECOMPLETE_EPO_CART()->calculate_fee_price( $_price, $this->product_id, $this->element ),
				'section'                          => $this->element['uniqid'],
				'section_label'                    => $this->element['label'],
				'percentcurrenttotal'              => 0,
				'fixedcurrenttotal'                => 0,
				'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
				'price_per_currency'               => $this->fill_currencies( $this->posted_attribute_quantity ),
				'quantity'                         => $this->posted_attribute_quantity,
				'quantity_selector'                => isset( $this->element['quantity'] ) ? $this->element['quantity'] : '',
				'cart_fees'                        => 'multiple',
				'key'                              => esc_attr( $this->key ),
				'use_images'                       => $use_images,
				'use_colors'                       => $use_colors,
				'color'                            => ( false !== $_color_key && isset( $this->element['color'][ $_color_key ] ) ) ? ( empty( $this->element['color'][ $_color_key ] ) ? 'transparent' : $this->element['color'][ $_color_key ] ) : '',
				'changes_product_image'            => ! empty( $this->element['changes_product_image'] ) ? $this->element['changes_product_image'] : '',
				'images'                           => ( false !== $_image_key && isset( $this->element['images'][ $_image_key ] ) ) ? $this->element['images'][ $_image_key ] : '',
				'imagesc'                          => ( false !== $_image_key && isset( $this->element['imagesc'][ $_image_key ] ) && ! empty( $this->element['imagesc'][ $_image_key ] ) ) ? $this->element['imagesc'][ $_image_key ] : '',
				'imagesp'                          => ( false !== $_image_key && isset( $this->element['imagesp'][ $_image_key ] ) ) ? $this->element['imagesp'][ $_image_key ] : '',
			];

			return apply_filters(
				'wc_epo_add_cart_item_data_cart_fees_multiple',
				$ret,
				$this
			);
		}

		return false;
	}
}
includes/fields/class-themecomplete-epo-fields-header.php000064400000001524150755142450017554 0ustar00<?php
/**
 * Heading Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Heading Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_header extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		return apply_filters( 'wc_epo_display_field_header', [], $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-radio.php000064400000062545150755142450017434 0ustar00<?php
/**
 * Radio Buttons Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Radio Buttons Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 */
class THEMECOMPLETE_EPO_FIELDS_radio extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * The number of columns
	 *
	 * @var float
	 */
	public $items_per_row;

	/**
	 * The number of columns for responisve devices
	 *
	 * @var float
	 */
	public $items_per_row_r;

	/**
	 * The number of columns
	 *
	 * @var float
	 */
	public $columns;

	/**
	 * The choice counter
	 *
	 * @var float
	 */
	public $default_value_counter;

	/**
	 * Pre display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function display_field_pre( $element = [], $args = [] ) {
		$this->items_per_row   = $element['items_per_row'];
		$this->items_per_row_r = isset( $element['items_per_row_r'] ) ? $element['items_per_row_r'] : [];
		$this->columns         = 0;
		$container_css_id      = 'element_';
		if ( isset( $element['container_css_id'] ) ) {
			$container_css_id = $element['container_css_id'];
		}
		if ( ! isset( $args['product_id'] ) ) {
			$args['product_id'] = '';
		}

		if ( ! empty( $this->items_per_row ) ) {
			if ( 'auto' === $this->items_per_row || ! is_numeric( $this->items_per_row ) || intval( $this->items_per_row ) === 0 ) {
				$this->items_per_row = 0;
			} else {
				$this->items_per_row = (float) $this->items_per_row;
				$calc                = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
				$flex_items          = '--items-per-row: ' . $this->items_per_row . ';';
				$css_string          = '.tm-product-id-' . $args['product_id'] . ' .' . $container_css_id . $args['element_counter'] . $args['form_prefix'] . ' li{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}';
				$css_string          = str_replace( [ "\r", "\n" ], '', $css_string );
				THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
			}
		} else {
			$this->items_per_row = 1;
		}

		foreach ( $this->items_per_row_r as $key => $value ) {
			$before = '';
			$after  = '}';
			if ( ! empty( $value ) ) {
				if ( 'desktop' !== $key ) {
					switch ( $key ) {
						case 'tablets_galaxy': // 800-1280
							$before = '@media only screen and (min-device-width : 800px) and (max-device-width : 1280px),only screen and (min-width : 800px) and (max-width : 1280px) {';
							break;
						case 'tablets': // 768-1024
							$before = '@media only screen and (min-device-width : 768px) and (max-device-width : 1024px),only screen and (min-width : 768px) and (max-width : 1024px) {';
							break;
						case 'tablets_small': // 481-767
							$before = '@media only screen and (min-device-width : 481px) and (max-device-width : 767px),only screen and (min-width : 481px) and (max-width : 767px) {';
							break;
						case 'iphone6_plus': // 414-736
							$before = '@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 414px) and (max--width: 736px) {';
							break;
						case 'iphone6': // 375-667
							$before = '@media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 375px) and (max-width: 667px) {';
							break;
						case 'galaxy': // 320-640
							$before = '@media only screen and (device-width: 320px) and (device-height: 640px) and (-webkit-min-device-pixel-ratio: 2),only screen and (width: 320px) and (height: 640px) {';
							break;
						case 'iphone5': // 320-568
							$before = '@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2), only screen and (min-width: 320px) and (max-width: 568px) {';
							break;
						case 'smartphones': // 320-480
							$before = '@media only screen and (min-device-width : 320px) and (max-device-width : 480px), only screen and (min-width : 320px) and (max-width : 480px), only screen and (max-width : 319px){';
							break;

						default:
							// code...
							break;
					}
					$thisitems_per_row = (float) $value;
					$this_percent      = (float) ( 100 / $thisitems_per_row );
					$calc              = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
					$flex_items        = '--items-per-row: ' . $thisitems_per_row . ';';
					$css_string        = $before . '.tm-product-id-' . $args['product_id'] . ' .' . $container_css_id . $args['element_counter'] . $args['form_prefix'] . ' li{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}' . $after;
					$css_string        = str_replace( [ "\r", "\n" ], '', $css_string );
					THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
				}
			}
		}

		$this->default_value_counter = 0;
	}

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {
		++$this->columns;
		$default_value = isset( $element['default_value'] ) ? ( ( '' !== $element['default_value'] ) ? ( (int) $element['default_value'] === (int) $this->default_value_counter ) : false ) : false;

		if ( (float) $this->columns > (float) $this->items_per_row && $this->items_per_row > 0 ) {
			$this->columns = 1;
		}

		if ( ! isset( $args['connector_value'] ) ) {
			$args['connector_value'] = $args['value'];
		}

		$hexclass         = '';
		$li_class         = '';
		$search_for_color = $args['label'];
		if ( isset( $element['color'] ) ) {
			if ( ! is_array( $element['color'] ) ) {
				$search_for_color = $element['color'];
			} elseif ( isset( $element['color'][ $this->default_value_counter ] ) ) {
				$search_for_color = $element['color'][ $this->default_value_counter ];
			}
			if ( empty( $search_for_color ) ) {
				$search_for_color = 'transparent';
			}
		}

		$unique_indentifier = $args['element_counter'] . '-' . $args['field_counter'] . '-' . $args['tabindex'] . $args['form_prefix'] . uniqid();

		if ( ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) && ( 'transparent' === $search_for_color || preg_match( '/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $search_for_color ) ) ) {
			$css_string   = '';
			$tmhexcolor   = 'tmhexcolor_' . $unique_indentifier;
			$litmhexcolor = 'tm-li-unique-' . $unique_indentifier;
			if ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) {
				$hexclass   = $tmhexcolor;
				$css_string = '.' . $tmhexcolor . ' .tmhexcolorimage .tc-image{background-color:' . $search_for_color . ' !important;}';
			}
			if ( ! empty( $element['item_width'] ) ) {
				if ( is_numeric( $element['item_width'] ) ) {
					$element['item_width'] .= 'px';
				}
				$css_string .= '.' . $tmhexcolor . ' img{display: inline-block !important;width:' . $element['item_width'] . ' !important;min-width:' . $element['item_width'] . ' !important;max-width:' . $element['item_width'] . ' !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $tmhexcolor . ' .tmhexcolorimage .tc-image{display: inline-block !important;width:' . $element['item_width'] . ' !important;min-width:' . $element['item_width'] . ' !important;max-width:' . $element['item_width'] . ' !important;}';
			}
			if ( ! empty( $element['item_height'] ) ) {
				if ( is_numeric( $element['item_height'] ) ) {
					$element['item_height'] .= 'px';
				}
				$css_string .= '.' . $tmhexcolor . ' img{display: inline-block !important;height:' . $element['item_height'] . ' !important;min-height:' . $element['item_height'] . ' !important;max-height:' . $element['item_height'] . ' !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $tmhexcolor . ' .tmhexcolorimage .tc-image{display: inline-block !important;height:' . $element['item_height'] . ' !important;min-height:' . $element['item_height'] . ' !important;max-height:' . $element['item_height'] . ' !important;    padding-top: 0 !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $litmhexcolor . '{min-width: 0 !important;}';
			}
			if ( ! empty( $element['item_width'] ) || ! empty( $element['item_height'] ) ) {
				$css_string .= '.tmhexcolorimage-li' . $litmhexcolor . '{display: inline-block;width:auto !important;overflow:hidden;}';
				$li_class   .= 'tmhexcolorimage-li ' . $litmhexcolor;
			} else {
				$li_class .= 'tmhexcolorimage-li-nowh';
			}
			if ( ! empty( $css_string ) ) {
				$css_string = str_replace( [ "\r", "\n" ], '', $css_string );
				THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
			}
		}
		$_css_class = '';
		if ( ! empty( $hexclass ) ) {
			$_css_class = ! empty( $element['class'] ) ? $element['class'] . ' ' . $hexclass : '' . $hexclass;
		}
		$css_class = apply_filters( 'wc_epo_multiple_options_css_class', '', $element, $this->default_value_counter );
		if ( '' !== $css_class ) {
			$css_class = ' ' . $css_class;
		}
		$css_class = $_css_class . $css_class;

		$use = '';

		if ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) {
			$use = ' use_images';
		}

		$image                 = isset( $element['images'][ $args['field_counter'] ] ) ? $element['images'][ $args['field_counter'] ] : '';
		$imagec                = isset( $element['imagesc'][ $args['field_counter'] ] ) ? $element['imagesc'][ $args['field_counter'] ] : '';
		$imagep                = isset( $element['imagesp'][ $args['field_counter'] ] ) ? $element['imagesp'][ $args['field_counter'] ] : '';
		$imagel                = isset( $element['imagesl'][ $args['field_counter'] ] ) ? $element['imagesl'][ $args['field_counter'] ] : '';
		$label                 = apply_filters( 'woocommerce_tm_epo_option_name', $args['label'], $element, $this->default_value_counter );
		$label_mode            = '';
		$changes_product_image = empty( $element['changes_product_image'] ) ? '' : $element['changes_product_image'];

		if ( 'relative' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_image_mode' ) ) {
			if ( str_contains( $image, get_site_url() ) ) {
				$image  = wp_make_link_relative( $image );
				$imagec = wp_make_link_relative( $imagec );
				$imagep = wp_make_link_relative( $imagep );
				$imagel = wp_make_link_relative( $imagel );
			}
		}

		$url = isset( $element['url'][ $args['field_counter'] ] ) ? $element['url'][ $args['field_counter'] ] : '';

		if ( empty( $image ) ) {
			$image = '';
		}
		if ( empty( $imagec ) ) {
			$imagec = '';
		}
		if ( empty( $imagep ) || empty( $changes_product_image ) ) {
			$imagep = '';
		}
		if ( ! empty( $changes_product_image ) && 'images' === $changes_product_image ) {
			$imagep = '';
		}
		if ( empty( $imagel ) ) {
			$imagel = '';
		}

		$selected_value = '';
		if ( isset( $args['posted_name'] ) ) {
			$name = $args['posted_name'];
			if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ $name ] ) ) {
				$selected_value = $this->post_data[ $name ];
			} elseif ( empty( $this->post_data ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
			} elseif ( ( empty( $this->post_data ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || ! isset( $this->post_data[ $name ] ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) || ( ! empty( $this->post_data ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$selected_value = -1;
			}
		}

		$selected_value = apply_filters( 'wc_epo_default_value', $selected_value, $element, esc_attr( $args['value'] ) );

		if ( is_array( $selected_value ) ) {

			if ( isset( $args['get_posted_key'] ) && isset( $selected_value[ $args['get_posted_key'] ] ) ) {
				$selected_value = $selected_value[ $args['get_posted_key'] ];
			} else {
				$selected_value = '';
			}
		}

		$checked = false;

		if ( -1 === $selected_value ) {
			if ( ( empty( $this->post_data ) || ( ! empty( $this->post_data ) && ( ! isset( $this->post_data['quantity'] ) || ( isset( $args['posted_name'] ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) ) ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( $default_value ) {
					$checked = true;
				}
			}
			if (
				( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] )
				|| 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' )
				) {
				if ( $default_value && ! THEMECOMPLETE_EPO()->is_edit_mode() ) {
					$checked = true;
				}
			}
		} elseif ( ! THEMECOMPLETE_EPO()->is_edit_mode() && ! empty( $default_value ) && ! empty( $element['default_value_override'] ) && isset( $element['default_value'] ) ) {
			$checked = true;
		} elseif ( esc_attr( stripcslashes( $selected_value ) ) === esc_attr( ( $args['connector_value'] ) ) ) {
			$checked = true;
		}

		$replacement_mode    = $element['replacement_mode'];
		$swatch_position     = $element['swatch_position'];
		$showtooltip         = empty( $element['show_tooltip'] ) || ( 'image' !== $replacement_mode && 'color' !== $replacement_mode ) ? '' : $element['show_tooltip'];
		$use_lightbox        = isset( $element['use_lightbox'] ) ? $element['use_lightbox'] : '';
		$choice_counter      = $this->default_value_counter;
		$show_label          = empty( $element['show_label'] ) ? '' : $element['show_label'];
		$tm_epo_no_lazy_load = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' );
		if ( isset( $element['color'] ) ) {
			$color = $element['color'];
		}
		if ( ! isset( $args['border_type'] ) ) {
			$border_type = '';
		} else {
			$border_type = $args['border_type'];
		}

		$swatch       = [];
		$swatch_class = '';
		$altsrc       = [];

		$label_to_display = $label;

		if ( 'text' === $replacement_mode ) {
			$label_mode = 'text';
		}

		if ( 'image' === $replacement_mode || 'color' === $replacement_mode ) {

			if ( 'swatch' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch' => 'on' ];
			} elseif ( 'swatch_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-desc' => 'on' ];
			} elseif ( 'swatch_lbl_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-lbl-desc' => 'on' ];
			} elseif ( 'swatch_img' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img' => 'on' ];
			} elseif ( 'swatch_img_lbl' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-lbl' => 'on' ];
			} elseif ( 'swatch_img_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-desc' => 'on' ];
			} elseif ( 'swatch_img_lbl_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-lbl-desc' => 'on' ];
			}

			if ( 'image' === $replacement_mode && ! empty( $image ) ) {
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_retrieve_image_sizes' ) ) {
					$attachment_id = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $image );
					$attachment_id = ( $attachment_id ) ? $attachment_id : 0;
					$image_info    = THEMECOMPLETE_EPO_HELPER()->get_attachment_sizes( $attachment_id, $image );
					$attachment_id = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $imagec );
					$attachment_id = ( $attachment_id ) ? $attachment_id : 0;
					$imagec_info   = THEMECOMPLETE_EPO_HELPER()->get_attachment_sizes( $attachment_id, $imagec );
				} else {
					$image_info  = [ '', '' ];
					$imagec_info = [ '', '' ];
				}

				if ( 'no' === $tm_epo_no_lazy_load ) {
					$altsrc = [
						'src'           => '',
						'data-original' => $image,
					];
					if ( $image_info ) {
						$altsrc['width']  = $image_info[0];
						$altsrc['height'] = $image_info[1];
					}
					if ( $checked && ! empty( $imagec ) ) {
						$altsrc['data-original'] = $imagec;
						if ( $imagec_info ) {
							$altsrc['width']  = $imagec_info[0];
							$altsrc['height'] = $imagec_info[1];
						}
					}
				} else {
					$altsrc = [ 'src' => $image ];
					if ( $image_info ) {
						$altsrc['width']  = $image_info[0];
						$altsrc['height'] = $image_info[1];
					}
					if ( $checked && ! empty( $imagec ) ) {
						$altsrc['src'] = $imagec;
						if ( $imagec_info ) {
							$altsrc['width']  = $imagec_info[0];
							$altsrc['height'] = $imagec_info[1];
						}
					}
				}
				if ( ! empty( $use_lightbox ) && 'lightbox' === $use_lightbox ) {
					$swatch_class .= ' tc-lightbox-image';
				}
				$label_mode = 'images';
			} else {

				if ( 'image' === $replacement_mode ) {
					$search_for_color = 'transparent';
					$color            = '';
				} else {
					// Check for hex color.
					$search_for_color = $label;
					if ( isset( $color ) ) {
						if ( ! is_array( $color ) ) {
							$search_for_color = $color;
						} elseif ( isset( $color[ $choice_counter ] ) ) {
							$search_for_color = $color[ $choice_counter ];
						}
						if ( empty( $search_for_color ) ) {
							$search_for_color = 'transparent';
						}
					}
				}
				if ( 'transparent' === $search_for_color || preg_match( '/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $search_for_color ) ) { // hex color is valid.

					if ( 'transparent' === $search_for_color ) {
						$swatch_class .= ' tm-transparent-swatch';
					}

					$label_mode       = 'color';
					$label_to_display = ( ! isset( $color ) ) ? $search_for_color : $label;
				}
			}

			// For variations.
			if ( ! empty( $show_label ) ) {
				switch ( $show_label ) {
					case 'hide':
						$swatch_class .= ' tm-hide-label';
						break;
					case 'bottom':
					case 'inside': // this is a deprecated value.
						$swatch_class .= ' tm-bottom-label';
						break;
					case 'tooltip':
						$swatch_class .= ' tm-tooltip';
						$swatch[]      = [ 'data-tm-tooltip-swatch' => 'on' ];
						break;
				}
			}

			if ( ! empty( $swatch ) ) {
				$swatch[] = [ 'data-tm-hide-label' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_swatch_hide_label' ) ];
			}

			switch ( $swatch_position ) {

				case 'start':
					if ( ! empty( $label_mode ) ) {
						$label_mode = 'start' . $label_mode;
					}
					break;

				case 'end':
					if ( ! empty( $label_mode ) ) {
						$label_mode = 'end' . $label_mode;
					}
					break;
			}
		}

		if ( ! empty( $li_class ) ) {
			$li_class = ' ' . $li_class;
		} else {
			$li_class = '';
		}

		if ( ! empty( $this->items_per_row ) ) {
			$li_class .= ' tm-per-row';
		} else {
			$li_class .= ' tm-auto-row';
		}

		if ( ! empty( $element['use_url'] ) && 'url' === $element['use_url'] ) {
			$url = themecomplete_do_shortcode( $url );
		} else {
			$url = '';
		}

		$image_variations = [];
		if ( ! empty( $changes_product_image ) ) {
			$image_link       = $image;
			$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'image' );

			$image_link       = $imagep;
			$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'imagep' );
		}

		$labelclass       = '';
		$labelclass_start = '';
		$labelclass_end   = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ) && ( 'none' === $replacement_mode || ( ( 'image' === $replacement_mode || 'color' === $replacement_mode ) && 'center' !== $swatch_position ) ) ) {
			$labelclass       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
			$labelclass_start = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' ) . ( empty( $hexclass ) ? '' : ' ' . $hexclass );
			$labelclass_end   = true;
		}

		$is_separator = '-1' === strstr( $args['value'], '_', true ) && '-1' !== $args['value'];
		if ( $is_separator ) {
			$li_class .= ' is-separator';
		}
		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}
		$display = [
			'is_separator'          => $is_separator,
			'hexclass'              => $hexclass,
			'label_mode'            => $label_mode,
			'label_to_display'      => $label_to_display,
			'swatch_class'          => $swatch_class,
			'swatch'                => $swatch,
			'altsrc'                => $altsrc,
			'use'                   => $use,
			'labelclass_start'      => $labelclass_start,
			'labelclass'            => $labelclass,
			'labelclass_end'        => $labelclass_end,
			'image_variations'      => wp_json_encode( $image_variations ),
			'checked'               => $checked,
			'li_class'              => $li_class,
			'class'                 => $css_class,
			'label'                 => $label,
			'value'                 => $args['connector_value'],
			'element_id'            => 'tmcp_choice_' . str_replace( '-', '_', $unique_indentifier ),
			'textbeforeprice'       => isset( $element['text_before_price'] ) ? $element['text_before_price'] : '',
			'textafterprice'        => isset( $element['text_after_price'] ) ? $element['text_after_price'] : '',
			'hide_amount'           => $this->get_value( $element, 'hide_amount', '' ),
			'replacement_mode'      => $replacement_mode,
			'swatch_position'       => $swatch_position,
			'use_lightbox'          => $use_lightbox,
			'use_url'               => $element['use_url'],
			'items_per_row'         => $this->items_per_row,
			'items_per_row_r'       => $this->items_per_row_r,
			'image'                 => $image,
			'imagec'                => $imagec,
			'imagep'                => $imagep,
			'imagel'                => $imagel,
			'url'                   => $url,
			'limit'                 => empty( $element['limit'] ) ? '' : $element['limit'],
			'exactlimit'            => empty( $element['exactlimit'] ) ? '' : $element['exactlimit'],
			'minimumlimit'          => empty( $element['minimumlimit'] ) ? '' : $element['minimumlimit'],
			'show_tooltip'          => $showtooltip,
			'clear_options'         => empty( $element['clear_options'] ) ? '' : $element['clear_options'],
			'show_label'            => $show_label,
			'tm_epo_no_lazy_load'   => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' ),
			'changes_product_image' => $changes_product_image,
			'default_value'         => $default_value,
			'quantity'              => isset( $element['quantity'] ) ? $element['quantity'] : '',
			'choice_counter'        => $this->default_value_counter,
			'class_label'           => $class_label,
		];

		if ( isset( $color ) ) {
			$display['color'] = $color;
		}

		$display['fieldtype'] = '';
		if ( isset( $args['fieldtype'] ) ) {
			$display['fieldtype'] = $args['fieldtype'];
		}
		if ( ! empty( $changes_product_image ) ) {
			$display['fieldtype'] .= ' tm-product-image';
		}

		if ( ! empty( $args['element_data_attr'] ) && is_array( $args['element_data_attr'] ) ) {
			$display['element_data_attr'] = $args['element_data_attr'];
		} else {
			$display['element_data_attr'] = [];
		}

		++$this->default_value_counter;

		return apply_filters( 'wc_epo_display_field_radio', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @since 1.0
	 * @return array<mixed>
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$min_quantity = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}

		foreach ( $this->tmcp_attributes as $k => $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed = false;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ], $min_quantity );
				break;
			}

			if ( $this->element['required'] ) {

				$is_cart_fee = $this->element['is_cart_fee'];
				if ( $is_cart_fee ) {
					if ( ! isset( $this->epo_post_fields[ $this->tmcp_attributes_fee[ $k ] ] ) ) {
						$passed    = false;
						$message[] = 'required';
						break;
					}
				} else {
					$is_alt = apply_filters( 'wc_epo_alt_validate_radiobutton', false, $this, $k );
					if ( $is_alt ) {
						$fail = apply_filters( 'wc_epo_validate_radiobutton', false, $this, $k );
						if ( $fail ) {
							$passed    = false;
							$message[] = 'required';
							break;
						}
					} elseif ( ! isset( $this->epo_post_fields[ $attribute ] ) ) {
						$passed    = false;
						$message[] = 'required';
						break;
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-checkbox.php000064400000070716150755142450020123 0ustar00<?php
/**
 * Checkbox Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Checkbox Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 */
class THEMECOMPLETE_EPO_FIELDS_checkbox extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * The number of columns
	 *
	 * @var float
	 */
	public $items_per_row;

	/**
	 * The number of columns for responisve devices
	 *
	 * @var float
	 */
	public $items_per_row_r;

	/**
	 * The number of columns
	 *
	 * @var float
	 */
	public $columns;

	/**
	 * The choice counter
	 *
	 * @var float
	 */
	public $default_value_counter;

	/**
	 * Pre display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @since 1.0
	 * @return void
	 */
	public function display_field_pre( $element = [], $args = [] ) {
		$this->items_per_row   = $element['items_per_row'];
		$this->items_per_row_r = isset( $element['items_per_row_r'] ) ? $element['items_per_row_r'] : [];
		$this->columns         = 0;
		$container_css_id      = 'element_';
		if ( isset( $element['container_css_id'] ) ) {
			$container_css_id = $element['container_css_id'];
		}
		if ( ! isset( $args['product_id'] ) ) {
			$args['product_id'] = '';
		}

		if ( ! empty( $this->items_per_row ) ) {
			if ( 'auto' === $this->items_per_row || ! is_numeric( $this->items_per_row ) || intval( $this->items_per_row ) === 0 ) {
				$this->items_per_row = 0;
			} else {
				$this->items_per_row = (float) $this->items_per_row;
				$calc                = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
				$flex_items          = '--items-per-row: ' . $this->items_per_row . ';';
				$css_string          = '.tm-product-id-' . $args['product_id'] . ' .' . $container_css_id . $args['element_counter'] . $args['form_prefix'] . ' li{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}';
				$css_string          = str_replace( [ "\r", "\n" ], '', $css_string );
				THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
			}
		} else {
			$this->items_per_row = 1;
		}

		foreach ( $this->items_per_row_r as $key => $value ) {
			$before = '';
			$after  = '}';
			if ( ! empty( $value ) ) {
				if ( 'desktop' !== $key ) {
					switch ( $key ) {
						case 'tablets_galaxy': // 800-1280
							$before = '@media only screen and (min-device-width : 800px) and (max-device-width : 1280px),only screen and (min-width : 800px) and (max-width : 1280px) {';
							break;
						case 'tablets': // 768-1024
							$before = '@media only screen and (min-device-width : 768px) and (max-device-width : 1024px),only screen and (min-width : 768px) and (max-width : 1024px) {';
							break;
						case 'tablets_small': // 481-767
							$before = '@media only screen and (min-device-width : 481px) and (max-device-width : 767px),only screen and (min-width : 481px) and (max-width : 767px) {';
							break;
						case 'iphone6_plus': // 414-736
							$before = '@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 414px) and (max--width: 736px) {';
							break;
						case 'iphone6': // 375-667
							$before = '@media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 375px) and (max-width: 667px) {';
							break;
						case 'galaxy': // 320-640
							$before = '@media only screen and (device-width: 320px) and (device-height: 640px) and (-webkit-min-device-pixel-ratio: 2),only screen and (width: 320px) and (height: 640px) {';
							break;
						case 'iphone5': // 320-568
							$before = '@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2), only screen and (min-width: 320px) and (max-width: 568px) {';
							break;
						case 'smartphones': // 320-480
							$before = '@media only screen and (min-device-width : 320px) and (max-device-width : 480px), only screen and (min-width : 320px) and (max-width : 480px), only screen and (max-width : 319px){';
							break;

						default:
							// code...
							break;
					}
					$thisitems_per_row = (float) $value;
					$this_percent      = (float) ( 100 / $thisitems_per_row );
					$calc              = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
					$flex_items        = '--items-per-row: ' . $thisitems_per_row . ';';
					$css_string        = $before . '.tm-product-id-' . $args['product_id'] . ' .' . $container_css_id . $args['element_counter'] . $args['form_prefix'] . ' li{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}' . $after;
					$css_string        = str_replace( [ "\r", "\n" ], '', $css_string );
					THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
				}
			}
		}

		$this->default_value_counter = 0;
	}

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @since 1.0
	 * @return array<mixed>
	 */
	public function display_field( $element = [], $args = [] ) {
		++$this->columns;
		$default_value = isset( $element['default_value'] )
			?
			( ( is_array( $element['default_value'] ) )
				? in_array( (string) $this->default_value_counter, $element['default_value'], true )
				: false )
			: false;

		if ( (float) $this->columns > (float) $this->items_per_row && $this->items_per_row > 0 ) {
			$this->columns = 1;
		}

		$hexclass         = '';
		$li_class         = '';
		$search_for_color = $args['label'];
		if ( isset( $element['color'] ) ) {
			if ( ! is_array( $element['color'] ) ) {
				$search_for_color = $element['color'];
			} elseif ( isset( $element['color'][ $this->default_value_counter ] ) ) {
				$search_for_color = $element['color'][ $this->default_value_counter ];
			}
			if ( empty( $search_for_color ) ) {
				$search_for_color = 'transparent';
			}
		}

		$unique_indentifier = $args['element_counter'] . '-' . $args['field_counter'] . '-' . $args['tabindex'] . $args['form_prefix'] . uniqid();

		if ( ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) && ( 'transparent' === $search_for_color || preg_match( '/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $search_for_color ) ) ) {
			$css_string   = '';
			$tmhexcolor   = 'tmhexcolor_' . $unique_indentifier;
			$litmhexcolor = 'tm-li-unique-' . $unique_indentifier;
			if ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) {
				$hexclass   = $tmhexcolor;
				$css_string = '.' . $tmhexcolor . ' .tmhexcolorimage .tc-image{background-color:' . $search_for_color . ' !important;}';
			}
			if ( ! empty( $element['item_width'] ) ) {
				if ( is_numeric( $element['item_width'] ) ) {
					$element['item_width'] .= 'px';
				}
				$css_string .= '.' . $tmhexcolor . ' img{display: inline-block !important;width:' . $element['item_width'] . ' !important;min-width:' . $element['item_width'] . ' !important;max-width:' . $element['item_width'] . ' !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $tmhexcolor . ' .tmhexcolorimage .tc-image{padding: 1px !important;display: inline-block !important;width:' . $element['item_width'] . ' !important;min-width:' . $element['item_width'] . ' !important;max-width:' . $element['item_width'] . ' !important;}';
			}
			if ( ! empty( $element['item_height'] ) ) {
				if ( is_numeric( $element['item_height'] ) ) {
					$element['item_height'] .= 'px';
				}
				$css_string .= '.' . $tmhexcolor . ' img{display: inline-block !important;height:' . $element['item_height'] . ' !important;min-height:' . $element['item_height'] . ' !important;max-height:' . $element['item_height'] . ' !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $tmhexcolor . ' .tmhexcolorimage .tc-image{padding: 1px !important;display: inline-block !important;height:' . $element['item_height'] . ' !important;min-height:' . $element['item_height'] . ' !important;max-height:' . $element['item_height'] . ' !important;    padding-top: 0 !important;}';
				$css_string .= '.tm-extra-product-options ul.tmcp-ul-wrap .' . $litmhexcolor . '{min-width: 0 !important;}';
			}
			if ( ! empty( $element['item_width'] ) || ! empty( $element['item_height'] ) ) {
				$css_string .= '.tmhexcolorimage-li' . $litmhexcolor . '{display: inline-block;width:auto !important;overflow:hidden;}';
				$li_class   .= 'tmhexcolorimage-li ' . $litmhexcolor;
			} else {
				$li_class .= 'tmhexcolorimage-li-nowh';
			}
			if ( ! empty( $css_string ) ) {
				$css_string = str_replace( [ "\r", "\n" ], '', $css_string );
				THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
			}
		}
		$_css_class = '';
		if ( ! empty( $hexclass ) ) {
			$_css_class = ! empty( $element['class'] ) ? $element['class'] . ' ' . $hexclass : '' . $hexclass;
		}
		$css_class = apply_filters( 'wc_epo_multiple_options_css_class', '', $element, $this->default_value_counter );
		if ( '' !== $css_class ) {
			$css_class = ' ' . $css_class;
		}
		$css_class = $_css_class . $css_class;

		$use = '';

		if ( 'image' === $element['replacement_mode'] || 'color' === $element['replacement_mode'] ) {
			$use = ' use_images';
		}

		$image                 = isset( $element['images'][ $args['field_counter'] ] ) ? $element['images'][ $args['field_counter'] ] : '';
		$imagec                = isset( $element['imagesc'][ $args['field_counter'] ] ) ? $element['imagesc'][ $args['field_counter'] ] : '';
		$imagep                = isset( $element['imagesp'][ $args['field_counter'] ] ) ? $element['imagesp'][ $args['field_counter'] ] : '';
		$imagel                = isset( $element['imagesl'][ $args['field_counter'] ] ) ? $element['imagesl'][ $args['field_counter'] ] : '';
		$label                 = apply_filters( 'woocommerce_tm_epo_option_name', $args['label'], $element, $this->default_value_counter );
		$label_mode            = '';
		$changes_product_image = empty( $element['changes_product_image'] ) ? '' : $element['changes_product_image'];
		$limit                 = empty( $element['limit'] ) ? '' : $element['limit'];
		$exactlimit            = empty( $element['exactlimit'] ) ? '' : $element['exactlimit'];
		$minimumlimit          = empty( $element['minimumlimit'] ) ? '' : $element['minimumlimit'];

		if ( 'relative' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_image_mode' ) ) {
			if ( str_contains( $image, get_site_url() ) ) {
				$image  = wp_make_link_relative( $image );
				$imagec = wp_make_link_relative( $imagec );
				$imagep = wp_make_link_relative( $imagep );
				$imagel = wp_make_link_relative( $imagel );
			}
		}

		if ( empty( $image ) ) {
			$image = '';
		}
		if ( empty( $imagec ) ) {
			$imagec = '';
		}
		if ( empty( $imagep ) || empty( $changes_product_image ) ) {
			$imagep = '';
		}
		if ( ! empty( $changes_product_image ) && 'images' === $changes_product_image ) {
			$imagep = '';
		}
		if ( empty( $imagel ) ) {
			$imagel = '';
		}

		$selected_value = '';
		if ( isset( $args['posted_name'] ) ) {
			$name = $args['posted_name'];
			if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ $name ] ) ) {
				$selected_value = $this->post_data[ $name ];
			} elseif ( empty( $this->post_data ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended

			} elseif ( ( ( THEMECOMPLETE_EPO()->is_quick_view() || ( empty( $this->post_data ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) ) && empty( THEMECOMPLETE_EPO()->cart_edit_key ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) || ( ! empty( $this->post_data ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$selected_value = -1;
			}
		}

		$selected_value = apply_filters( 'wc_epo_default_value', $selected_value, $element, esc_attr( $args['value'] ) );

		if ( is_array( $selected_value ) ) {

			if ( isset( $args['get_posted_key'] ) && isset( $selected_value[ $args['get_posted_key'] ] ) ) {
				$selected_value = $selected_value[ $args['get_posted_key'] ];
			} else {
				$selected_value = '';
			}
		}

		$checked = false;

		if ( -1 === $selected_value ) {
			if ( ( THEMECOMPLETE_EPO()->is_quick_view() || ( ( empty( $this->post_data ) || ( ! empty( $this->post_data ) && ( ! isset( $this->post_data['quantity'] ) || ( isset( $args['posted_name'] ) && ! isset( $_REQUEST[ $args['posted_name'] ] ) && ! isset( $this->post_data['tm-epo-counter'] ) ) ) ) ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( $default_value && ! THEMECOMPLETE_EPO()->is_edit_mode() ) {
					$checked = true;
				}
			}
		} elseif ( esc_attr( stripcslashes( $selected_value ) ) === esc_attr( ( $args['value'] ) ) ) {
			$checked = true;
		}
		if ( empty( $exactlimit ) ) {
			$exactlimit = '';
		}
		if ( empty( $minimumlimit ) ) {
			$minimumlimit = '';
		}

		if ( empty( $limit ) ) {
			$limit = '';
		}

		$replacement_mode    = $element['replacement_mode'];
		$swatch_position     = $element['swatch_position'];
		$showtooltip         = empty( $element['show_tooltip'] ) || ( 'image' !== $replacement_mode && 'color' !== $replacement_mode ) ? '' : $element['show_tooltip'];
		$use_lightbox        = isset( $element['use_lightbox'] ) ? $element['use_lightbox'] : '';
		$choice_counter      = $this->default_value_counter;
		$show_label          = empty( $element['show_label'] ) ? '' : $element['show_label'];
		$tm_epo_no_lazy_load = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' );
		if ( isset( $element['color'] ) ) {
			$color = $element['color'];
		}
		if ( ! isset( $args['border_type'] ) ) {
			$border_type = '';
		} else {
			$border_type = $args['border_type'];
		}

		$swatch       = [];
		$swatch_class = '';
		$altsrc       = [];

		$label_to_display = $label;

		if ( 'text' === $replacement_mode ) {
			$label_mode = 'text';
		}

		if ( 'image' === $replacement_mode || 'color' === $replacement_mode ) {

			if ( 'swatch' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch' => 'on' ];
			} elseif ( 'swatch_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-desc' => 'on' ];
			} elseif ( 'swatch_lbl_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-lbl-desc' => 'on' ];
			} elseif ( 'swatch_img' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img' => 'on' ];
			} elseif ( 'swatch_img_lbl' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-lbl' => 'on' ];
			} elseif ( 'swatch_img_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-desc' => 'on' ];
			} elseif ( 'swatch_img_lbl_desc' === $showtooltip ) {
				$swatch_class = ' tm-tooltip';
				$swatch[]     = [ 'data-tm-tooltip-swatch-img-lbl-desc' => 'on' ];
			}

			if ( 'image' === $replacement_mode && ! empty( $image ) ) {
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_retrieve_image_sizes' ) ) {
					$attachment_id = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $image );
					$attachment_id = ( $attachment_id ) ? $attachment_id : 0;
					$image_info    = THEMECOMPLETE_EPO_HELPER()->get_attachment_sizes( $attachment_id, $image );
					$attachment_id = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $imagec );
					$attachment_id = ( $attachment_id ) ? $attachment_id : 0;
					$imagec_info   = THEMECOMPLETE_EPO_HELPER()->get_attachment_sizes( $attachment_id, $imagec );
				} else {
					$image_info  = [ '', '' ];
					$imagec_info = [ '', '' ];
				}

				if ( 'no' === $tm_epo_no_lazy_load ) {
					$altsrc = [
						'src'           => '',
						'data-original' => $image,
					];
					if ( $image_info ) {
						$altsrc['width']  = $image_info[0];
						$altsrc['height'] = $image_info[1];
					}
					if ( $checked && ! empty( $imagec ) ) {
						$altsrc['data-original'] = $imagec;
						if ( $imagec_info ) {
							$altsrc['width']  = $imagec_info[0];
							$altsrc['height'] = $imagec_info[1];
						}
					}
				} else {
					$altsrc = [ 'src' => $image ];
					if ( $image_info ) {
						$altsrc['width']  = $image_info[0];
						$altsrc['height'] = $image_info[1];
					}
					if ( $checked && ! empty( $imagec ) ) {
						$altsrc['src'] = $imagec;
						if ( $imagec_info ) {
							$altsrc['width']  = $imagec_info[0];
							$altsrc['height'] = $imagec_info[1];
						}
					}
				}
				if ( ! empty( $use_lightbox ) && 'lightbox' === $use_lightbox ) {
					$swatch_class .= ' tc-lightbox-image';
				}
				$label_mode = 'images';
			} else {
				// Check for hex color.
				$search_for_color = $label;
				if ( isset( $color ) ) {
					if ( ! is_array( $color ) ) {
						$search_for_color = $color;
					} elseif ( isset( $color[ $choice_counter ] ) ) {
						$search_for_color = $color[ $choice_counter ];
					}
					if ( empty( $search_for_color ) ) {
						$search_for_color = 'transparent';
					}
				}
				if ( 'transparent' === $search_for_color || preg_match( '/#([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $search_for_color ) ) { // hex color is valid.

					if ( 'transparent' === $search_for_color ) {
						$swatch_class .= ' tm-transparent-swatch';
					}

					$label_mode       = 'color';
					$label_to_display = ( ! isset( $color ) ) ? $search_for_color : $label;
				}
			}

			if ( ! empty( $swatch ) ) {
				$swatch[] = [ 'data-tm-hide-label' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_swatch_hide_label' ) ];
			}

			switch ( $swatch_position ) {

				case 'start':
					if ( ! empty( $label_mode ) ) {
						$label_mode = 'start' . $label_mode;
					}
					break;

				case 'end':
					if ( ! empty( $label_mode ) ) {
						$label_mode = 'end' . $label_mode;
					}
					break;
			}
		}

		if ( ! empty( $li_class ) ) {
			$li_class = ' ' . $li_class;
		} else {
			$li_class = '';
		}

		if ( ! empty( $this->items_per_row ) ) {
			$li_class .= ' tm-per-row';
		} else {
			$li_class .= ' tm-auto-row';
		}

		$image_variations = [];
		if ( ! empty( $changes_product_image ) ) {
			$image_link       = $image;
			$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'image' );

			$image_link       = $imagep;
			$image_variations = THEMECOMPLETE_EPO_HELPER()->generate_image_array( $image_variations, $image_link, 'imagep' );
		}

		$labelclass       = '';
		$labelclass_start = '';
		$labelclass_end   = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ) && ( 'none' === $replacement_mode || ( ( 'image' === $replacement_mode || 'color' === $replacement_mode ) && 'center' !== $swatch_position ) ) ) {
			$labelclass       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
			$labelclass_start = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' ) . ( empty( $hexclass ) ? '' : ' ' . $hexclass );
			$labelclass_end   = true;
		}

		$is_separator = '-1' === strstr( $args['value'], '_', true ) && '-1' !== $args['value'];
		if ( $is_separator ) {
			$li_class .= ' is-separator';
		}
		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}
		$display = [
			'is_separator'          => $is_separator,
			'hexclass'              => $hexclass,
			'label_mode'            => $label_mode,
			'label_to_display'      => $label_to_display,
			'swatch_class'          => $swatch_class,
			'swatch'                => $swatch,
			'altsrc'                => $altsrc,
			'use'                   => $use,
			'labelclass_start'      => $labelclass_start,
			'labelclass'            => $labelclass,
			'labelclass_end'        => $labelclass_end,
			'image_variations'      => wp_json_encode( $image_variations ),
			'checked'               => $checked,
			'li_class'              => $li_class,
			'class'                 => $css_class,
			'label'                 => $label,
			'value'                 => $args['value'],
			'element_id'            => 'tmcp_choice_' . str_replace( '-', '_', $unique_indentifier ),
			'textbeforeprice'       => isset( $element['text_before_price'] ) ? $element['text_before_price'] : '',
			'textafterprice'        => isset( $element['text_after_price'] ) ? $element['text_after_price'] : '',
			'hide_amount'           => $this->get_value( $element, 'hide_amount', '' ),
			'replacement_mode'      => $replacement_mode,
			'swatch_position'       => $swatch_position,
			'use_lightbox'          => $use_lightbox,
			'use_url'               => $element['use_url'],
			'items_per_row'         => $this->items_per_row,
			'items_per_row_r'       => $this->items_per_row_r,
			'image'                 => $image,
			'imagec'                => $imagec,
			'imagep'                => $imagep,
			'imagel'                => $imagel,
			'url'                   => isset( $element['url'][ $args['field_counter'] ] ) ? $element['url'][ $args['field_counter'] ] : '',
			'limit'                 => $limit,
			'exactlimit'            => $exactlimit,
			'minimumlimit'          => $minimumlimit,
			'show_tooltip'          => $showtooltip,
			'tm_epo_no_lazy_load'   => $tm_epo_no_lazy_load,
			'changes_product_image' => $changes_product_image,
			'default_value'         => $default_value,
			'quantity'              => isset( $element['quantity'] ) ? $element['quantity'] : '',
			'choice_counter'        => $choice_counter,
			'class_label'           => $class_label,
		];

		if ( isset( $color ) ) {
			$display['color'] = $color;
		}

		$display['fieldtype'] = '';
		if ( isset( $args['fieldtype'] ) ) {
			$display['fieldtype'] = $args['fieldtype'];
		}
		if ( ! empty( $changes_product_image ) ) {
			$display['fieldtype'] .= ' tm-product-image';
		}

		if ( ! empty( $args['element_data_attr'] ) && is_array( $args['element_data_attr'] ) ) {
			$display['element_data_attr'] = $args['element_data_attr'];
		} else {
			$display['element_data_attr'] = [];
		}

		++$this->default_value_counter;

		return apply_filters( 'wc_epo_display_field_checkbox', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @since 1.0
	 * @return array<mixed>
	 */
	public function validate() {

		$passed       = true;
		$message      = [];
		$min_quantity = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}

		$limit        = isset( $this->element['limit'] ) && '' !== $this->element['limit'] ? (int) $this->element['limit'] : '';
		$exactlimit   = isset( $this->element['exactlimit'] ) && '' !== $this->element['exactlimit'] ? (int) $this->element['exactlimit'] : '';
		$minimumlimit = isset( $this->element['minimumlimit'] ) && '' !== $this->element['minimumlimit'] ? (int) $this->element['minimumlimit'] : '';

		$checked = 0;

		foreach ( $this->tmcp_attributes as $k => $attribute ) {

			if ( isset( $this->epo_post_fields[ $attribute ] ) ) {

				$quantity = 1;
				if ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) ) {
					$quantity = (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] );
				}

				$checked = $checked + $quantity;

				if ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) &&
					! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] ) >= $min_quantity )
				) {
					$passed = false;
					/* translators: %1 element name %2 quantity. */
					$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ], $min_quantity );
				} elseif ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) &&
					( 0 === (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] ) )
				) {
					$passed = false;
					/* translators: %s element name. */
					$message[] = sprintf( esc_html__( 'The quantity for "%s" must be greater than 0 to be added to the cart.', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ] );
				}
			}
		}

		foreach ( $this->tmcp_attributes_fee as $k => $attribute ) {

			if ( isset( $this->epo_post_fields[ $attribute ] ) ) {

				$quantity = 1;
				if ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) ) {
					$quantity = (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] );
				}

				$checked = $checked + $quantity;

				if ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) &&
					! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] ) >= $min_quantity )
				) {
					$passed = false;
					/* translators: %1 element label %2 quantity value. */
					$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ], $min_quantity );
				} elseif ( isset( $this->epo_post_fields[ $attribute . '_quantity' ] ) &&
					( 0 === (int) array_sum( (array) $this->epo_post_fields[ $attribute . '_quantity' ] ) )
				) {
					$passed = false;
					/* translators: %s element label */
					$message[] = sprintf( esc_html__( 'The quantity for "%s" must be greater than 0 to be added to the cart.', 'woocommerce-tm-extra-product-options' ), $this->element['options'][ $this->epo_post_fields[ $attribute ] ] );
				}
			}
		}

		if ( '' !== $limit ) {
			if ( $checked > $limit ) {
				$passed = false;
				if ( '1' === (string) $limit ) {
					/* translators: %1 number of choice (1 singlular) %2 element name. */
					$message[] = sprintf( esc_html__( 'You can only select up to %1$s choice for %2$s.', 'woocommerce-tm-extra-product-options' ), $limit, $this->element['label'] );
				} else {
					/* translators: %1 number of choices %2 element name. */
					$message[] = sprintf( esc_html__( 'You can only select up to %1$s choices for %2$s.', 'woocommerce-tm-extra-product-options' ), $limit, $this->element['label'] );
				}
			}
		}

		if ( '' !== $exactlimit ) {
			if ( $checked !== $exactlimit ) {
				$passed = false;
				if ( '1' === (string) $exactlimit ) {
					/* translators: %1 number of choice (1 singlular) %2 element name. */
					$message[] = sprintf( esc_html__( 'You must select exactly %1$s choice for %2$s.', 'woocommerce-tm-extra-product-options' ), $exactlimit, $this->element['label'] );
				} else {
					/* translators: %1 number of choices %2 element name. */
					$message[] = sprintf( esc_html__( 'You must select exactly %1$s choices for %2$s.', 'woocommerce-tm-extra-product-options' ), $exactlimit, $this->element['label'] );
				}
			}
		}

		if ( '' !== $minimumlimit ) {
			if ( $checked < $minimumlimit ) {
				$passed = false;
				if ( '1' === (string) $minimumlimit ) {
					/* translators: %1 number of choice (1 singlular) %2 element name. */
					$message[] = sprintf( esc_html__( 'You must select at least %1$s choice for %2$s.', 'woocommerce-tm-extra-product-options' ), $minimumlimit, $this->element['label'] );
				} else {
					/* translators: %1 number of choices %2 element name. */
					$message[] = sprintf( esc_html__( 'You must select at least %1$s choices for %2$s.', 'woocommerce-tm-extra-product-options' ), $minimumlimit, $this->element['label'] );
				}
			}
		}

		if ( $this->element['required'] ) {
			$check1 = array_intersect( $this->tmcp_attributes, array_keys( $this->epo_post_fields ) );
			$check2 = array_intersect( $this->tmcp_attributes_fee, array_keys( $this->epo_post_fields ) );

			$fail1 = empty( $check1 );
			$fail2 = empty( $check2 );

			$fail = apply_filters( 'wc_epo_validate_checkbox', $fail1 && $fail2, $this );

			if ( $fail ) {
				$passed    = false;
				$message[] = 'required';
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/index.php000064400000000126150755142450011447 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/fields/class-themecomplete-epo-fields-divider.php000064400000001526150755142450017754 0ustar00<?php
/**
 * Divider Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Divider Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_divider extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		return apply_filters( 'wc_epo_display_field_divider', [], $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-product.php000064400000110663150755142450020011 0ustar00<?php
/**
 * Product Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Product Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.4
 */
class THEMECOMPLETE_EPO_FIELDS_product extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Fetch product ids
	 *
	 * @param string       $layout The layout.
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 5.0
	 */
	public function add_thumbnail_css( $layout = '', $element = [], $args = [] ) {
		$this_items_per_row   = $element['items_per_row'];
		$this_items_per_row_r = isset( $element['items_per_row_r'] ) ? $element['items_per_row_r'] : [];
		$container_css_id     = 'element_';
		if ( isset( $element['container_css_id'] ) ) {
			$container_css_id = $element['container_css_id'];
		}
		if ( ! isset( $args['product_id'] ) ) {
			$args['product_id'] = '';
		}

		$li_selector = '.tm-product-id-' . $args['product_id'] . ' .cpf-type-product-' . $layout . ' ul.tmcp-ul-wrap.tm-element-ul-product.' . $container_css_id . $args['element_counter'] . $args['form_prefix'] . ' > li.tmcp-field-wrap';

		if ( ! empty( $this_items_per_row ) ) {
			if ( 'auto' === $this_items_per_row || ! is_numeric( $this_items_per_row ) || intval( $this_items_per_row ) === 0 ) {
				$this_items_per_row = 0;
				$css_string         = $li_selector . '{-ms-flex: 0 0 auto !important;flex: 0 0 auto !important;width:auto !important;}';
			} else {
				$this_items_per_row = (float) $this_items_per_row;
				$calc               = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
				$flex_items         = '--items-per-row: ' . $this_items_per_row . ';';
				$css_string         = $li_selector . '{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}';
			}

			$css_string = str_replace( [ "\r", "\n" ], '', $css_string );
			THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
		} else {
			$this_items_per_row = (float) $element['items_per_row'];
		}

		foreach ( $this_items_per_row_r as $key => $value ) {
			$before = '';
			$after  = '}';

			if ( ! empty( $value ) ) {

				if ( 'desktop' !== $key ) {

					switch ( $key ) {
						case 'tablets_galaxy': // 800-1280
							$before = '@media only screen and (min-device-width : 800px) and (max-device-width : 1280px),only screen and (min-width : 800px) and (max-width : 1280px) {';
							break;
						case 'tablets': // 768-1024
							$before = '@media only screen and (min-device-width : 768px) and (max-device-width : 1024px),only screen and (min-width : 768px) and (max-width : 1024px) {';
							break;
						case 'tablets_small': // 481-767
							$before = '@media only screen and (min-device-width : 481px) and (max-device-width : 767px),only screen and (min-width : 481px) and (max-width : 767px) {';
							break;
						case 'iphone6_plus': // 414-736
							$before = '@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 414px) and (max--width: 736px) {';
							break;
						case 'iphone6': // 375-667
							$before = '@media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-width: 375px) and (max-width: 667px) {';
							break;
						case 'galaxy': // 320-640
							$before = '@media only screen and (device-width: 320px) and (device-height: 640px) and (-webkit-min-device-pixel-ratio: 2),only screen and (width: 320px) and (height: 640px) {';
							break;
						case 'iphone5': // 320-568
							$before = '@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2), only screen and (min-width: 320px) and (max-width: 568px) {';
							break;
						case 'smartphones': // 320-480
							$before = '@media only screen and (min-device-width : 320px) and (max-device-width : 480px), only screen and (min-width : 320px) and (max-width : 480px), only screen and (max-width : 319px){';
							break;

						default:
							// code...
							break;
					}

					$this_items_per_row = (float) $value;
					$calc               = 'calc((100% / var(--items-per-row)) - (((var(--items-per-row) - 1) / var(--items-per-row)) * var(--tcgapcolumn)))';
					$flex_items         = '--items-per-row: ' . $this_items_per_row . ';';
					$css_string         = $before . $li_selector . '{-ms-flex: 0 0 ' . $calc . ' !important;flex: 0 0 ' . $calc . ' !important;max-width:' . $calc . ' !important;' . $flex_items . '}' . $after;

					$css_string = str_replace( [ "\r", "\n" ], '', $css_string );
					THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css_string );
				}
			}
		}
	}

	/**
	 * Fetch product ids
	 *
	 * @param array<mixed> $data Array of arguments.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function fetch_ids( $data = [], $args = [] ) {
		$args = wp_parse_args(
			$args,
			[
				// Fetch mode.
				'mode'     => 'products',
				// Sort retrieved posts by parameter.
				'orderby'  => false,
				// Number of post to show per page.
				'per_page' => false,
				// Number of page.
				'paged'    => 1,
				// Default selected product id.
				'default'  => '',
				// Enable query cache.
				'cache'    => false,
			]
		);

		if ( 'product' === $args['mode'] ) {
			$args['mode'] = 'products';
		}

		$data = apply_filters( 'wc_epo_product_element_data', $data );

		$is_empty          = false;
		$fetch_cache       = false;
		$id                = $data['id'];
		$transient_name    = 'tc_product_element_query_' . $id;
		$fetch_cache_array = $args['cache'] ? get_transient( $transient_name ) : false;
		$transient_version = WC_Cache_Helper::get_transient_version( 'product' );

		if ( is_array( $fetch_cache_array ) && ! isset( $fetch_cache_array['version'] ) ) {
			if ( isset( $fetch_cache_array[ $id ] ) && is_array( $fetch_cache_array[ $id ] ) ) {
				if ( isset( $fetch_cache_array[ $id ]['version'] ) && $fetch_cache_array[ $id ]['version'] === $transient_version ) {
					$fetch_cache = $fetch_cache_array[ $id ];
				}
			}
		}

		$fetch_cache = apply_filters( 'wc_epo_product_element_cache', $fetch_cache, $data, $args );

		if ( false === $fetch_cache ) {

			$query = [
				'post_status'         => [ 'publish', 'private' ],
				'ignore_sticky_posts' => 1,
				'nopaging'            => true,
				'order'               => 'asc',
				'fields'              => 'ids',
				'meta_query'          => [], // phpcs:ignore WordPress.DB.SlowDBQuery
			];

			if ( 'products' === $args['mode'] ) {

				if ( ! empty( $data['productids'] ) ) {
					$query['post_type'] = [ 'product', 'product_variation' ];
					$query['post__in']  = array_values( $data['productids'] );
				} else {
					$is_empty = true;
				}
			} elseif ( 'categories' === $args['mode'] ) {

				if ( ! empty( $data['categoryids'] ) ) {
					$query['post_type']   = 'product';
					$query['tax_query'][] = [
						'relation' => 'AND',
						[
							'taxonomy' => 'product_cat',
							'terms'    => ! empty( $data['categoryids'] ) ? array_values( $data['categoryids'] ) : [ '0' ],
							'operator' => 'IN',
						],
						[
							'taxonomy' => 'product_type',
							'field'    => 'name',
							'terms'    => apply_filters( 'wc_epo_search_product_types', [ 'simple', 'variable' ] ),
							'operator' => 'IN',
						],
					];
				} else {
					$is_empty = true;
				}
			}

			if ( ! $is_empty ) {

				// Sort retrieved posts.
				if ( false === $args['orderby'] ) {
					if ( 'products' === $args['mode'] ) {
						// Preserve post ID order given (WC>=3.5).
						$query['orderby'] = 'post__in';
					} elseif ( 'categories' === $args['mode'] ) {
						// Order by date and title.
						$query['orderby'] = 'date title';
					}

					// Stop the data retrieved from being added to the cache.
					if ( false === $args['per_page'] ) {
						// Disable Post term information cache.
						$query['update_post_term_cache'] = false;
						// Disable Post meta information cache.
						$query['update_post_meta_cache'] = false;
						// Disable Post information cache.
						$query['cache_results'] = false;
					}
				} elseif ( is_array( $args['orderby'] ) ) {
					if ( 'none' !== $args['orderby']['orderby'] ) {
						$query['orderby'] = $args['orderby']['orderby'];
						$query['order']   = $args['orderby']['order'];
						if ( isset( $args['orderby']['meta_key'] ) ) {
							$query['meta_key'] = $args['orderby']['meta_key']; // phpcs:ignore WordPress.DB.SlowDBQuery
						}
					} elseif ( 'products' === $args['mode'] ) {
						// Preserve post ID order given (WC>=3.5).
						$query['orderby'] = 'post__in';
					} elseif ( 'categories' === $args['mode'] ) {
						// Order by date and title.
						$query['orderby'] = 'date title';
					}
				} else {
					$query['orderby'] = $args['orderby'];
				}

				// Hide out of stock products.
				if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && function_exists( 'wc_get_product_visibility_term_ids' ) ) {
					// Get full list of product visibilty term ids.
					$product_visibility_term_ids = wc_get_product_visibility_term_ids();
					$query['tax_query'][]        = [
						'taxonomy' => 'product_visibility',
						'field'    => 'term_taxonomy_id',
						'terms'    => $product_visibility_term_ids['outofstock'],
						'operator' => 'NOT IN',
					];
				}

				// Pagination Parameters.
				if ( $args['per_page'] ) {
					if ( '' === $args['default'] ) {
						// Enable pagination.
						$query['nopaging'] = false;
						// Number of post to show per page.
						$query['posts_per_page'] = $args['per_page'];
						// Number of page.
						$query['paged'] = $args['paged'];
					}
				}

				// Exclude current product.
				$query['post__not_in'] = [ $args['product_id'] ];

				$query = apply_filters( 'wc_epo_product_element_query', $query, $data, $args );

				$query = new WP_Query( $query );
				$fetch = [
					'total_pages'  => $query->max_num_pages,
					'current_page' => $query->get( 'paged' ),
					'posts'        => $query->posts,
					'found_posts'  => $query->found_posts,
				];

			} else {
				$fetch = [
					'total_pages'  => 0,
					'current_page' => 0,
					'posts'        => [],
					'found_posts'  => 0,
				];
			}

			if ( $args['cache'] ) {
				if ( is_array( $fetch_cache_array ) && ! isset( $fetch_cache_array['version'] ) ) {
					$fetch_cache_array[ $id ] = array_merge( $fetch, [ 'version' => $transient_version ] );
				} else {
					$fetch_cache_array = [
						$id => array_merge(
							$fetch,
							[ 'version' => $transient_version ]
						),
					];
				}

				set_transient( $transient_name, $fetch_cache_array, DAY_IN_SECONDS * 7 );
			}
		} else {
			$fetch = $fetch_cache;
		}

		if ( '' !== $args['default'] && $args['per_page'] && $args['per_page'] < $fetch['found_posts'] ) {

			$fetch        = ! empty( $fetch['posts'] ) ? $fetch['posts'] : [];
			$index        = array_search( $args['default'], $fetch ) + 1; // phpcs:ignore WordPress.PHP.StrictInArray
			$default_page = ceil( $index / $args['per_page'] );

			if ( ! empty( $fetch ) ) {

				$query = new WP_Query(
					[
						'post_type'           => 'product',
						'post_status'         => [ 'publish', 'private' ],
						'ignore_sticky_posts' => 1,
						'nopaging'            => false,
						'posts_per_page'      => $args['per_page'],
						'paged'               => $default_page,
						'order'               => 'desc',
						'orderby'             => 'post__in',
						'post__in'            => $fetch,
						'fields'              => 'ids',
					]
				);

				$fetch = [
					'total_pages'  => $query->max_num_pages,
					'current_page' => $query->get( 'paged' ),
					'posts'        => $query->posts,
					'found_posts'  => $query->found_posts,
				];
			}
		}

		return $fetch;
	}

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {
		$categoryids             = array_map( 'absint', (array) wp_unslash( $this->get_value( $element, 'categoryids', [] ) ) );
		$productids              = array_map( 'absint', (array) wp_unslash( $this->get_value( $element, 'productids', [] ) ) );
		$layout_mode             = $this->get_value( $element, 'layout_mode', '' );
		$placeholder             = $this->get_value( $element, 'placeholder', '' );
		$quantity_min            = $this->get_value( $element, 'quantity_min', 1 );
		$quantity_max            = $this->get_value( $element, 'quantity_max', '' );
		$operation_mode          = $this->get_value( $element, 'mode', '' );
		$uniqid                  = $this->get_value( $element, 'uniqid', '' );
		$priced_individually     = $this->get_value( $element, 'priced_individually', '' );
		$order                   = $this->get_value( $element, 'order', '' );
		$orderby                 = $this->get_value( $element, 'orderby', '' );
		$discount                = $this->get_value( $element, 'discount', '' );
		$discount_type           = $this->get_value( $element, 'discount_type', '' );
		$discount_exclude_addons = $this->get_value( $element, 'discount_exclude_addons', '' );
		$this_items_per_row      = $element['items_per_row'];

		if ( 'product' === $operation_mode ) {
			$layout_mode = 'hidden';
		}

		// default value.
		$get_default_value = $this->get_default_value( $element, $args );

		// class label.
		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$product_list                      = [];
		$product_list_available_variations = [];

		// populate options.
		$options = [];

		$selected_value = '';

		$name = '';
		if ( isset( $args['posted_name'] ) ) {
			$name = $args['posted_name'];
		}

		$hide_amount = empty( $element['hide_amount'] ) ? '0' : '1';

		$_default_value_counter = 0;

		if ( 'dropdown' === $layout_mode ) {

			if ( '' !== $placeholder ) {
				$option    = [
					'value_to_show'          => '',
					'data_price'             => '',
					'data_rules'             => '',
					'data_rulestype'         => '',
					'text'                   => apply_filters( 'wc_epo_kses', $placeholder, $placeholder ),
					'_default_value_counter' => '',
				];
				$options[] = $option;
			}
		}

		$__min_value              = $quantity_min;
		$__max_value              = $quantity_max;
		$__step                   = 1;
		$__quantity_default_value = '';

		if ( isset( $_REQUEST[ $name . '_quantity' ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$__quantity_default_value = sanitize_text_field( wp_unslash( $_REQUEST[ $name . '_quantity' ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}

		if ( '' !== $__min_value ) {
			$__min_value = floatval( $__min_value );
		} else {
			$__min_value = 0;
		}
		if ( '' !== $__max_value ) {
			$__max_value = floatval( $__max_value );
		}

		if ( $__min_value < 0 ) {
			$__min_value = 0;
		}
		if ( $__max_value < 0 ) {
			$__max_value = 0;
		}

		if ( '' === $__quantity_default_value || ! is_numeric( $__quantity_default_value ) ) {
			$__quantity_default_value = $__min_value;
		}

		if ( is_numeric( $__min_value ) && is_numeric( $__max_value ) ) {
			if ( $__min_value > $__max_value & '' !== $quantity_max ) {
				$__max_value = $__min_value + $__step;
			}
			if ( $__quantity_default_value > $__max_value ) {
				$__quantity_default_value = $__max_value;
			}
			if ( $__quantity_default_value < $__min_value ) {
				$__quantity_default_value = $__min_value;
			}
		}

		if ( $__quantity_default_value < 0 ) {
			$__quantity_default_value = 0;
		}

		$data = [
			'id'          => $uniqid,
			'categoryids' => $categoryids,
			'productids'  => $productids,
		];

		$_orderby = false;
		if ( $order && $orderby ) {
			$_orderby = [
				'order'   => strtoupper( $order ),
				'orderby' => $orderby,
			];
			if ( 'baseprice' === $orderby ) {
				$_orderby['orderby']  = 'meta_value_num';
				$_orderby['meta_key'] = '_price'; // phpcs:ignore WordPress.DB.SlowDBQuery
			}
		}

		$product_id_array = $this->fetch_ids(
			$data,
			[
				'per_page'   => false,
				'mode'       => $operation_mode,
				'default'    => $get_default_value,
				'product_id' => $args['product_id'],
				'orderby'    => $_orderby,
			]
		);

		foreach ( $product_id_array['posts'] as $key => $product_id ) {

			$selected_value = '';
			if ( isset( $args['posted_name'] ) ) {
				$name = $args['posted_name'];
				if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ 'tmcp_' . $args['name_inc'] ] ) ) {
					if ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
						$selected_value = $this->post_data[ 'tmcp_' . $args['name_inc'] . '_' . $_default_value_counter ];
					} else {
						$selected_value = $this->post_data[ 'tmcp_' . $args['name_inc'] ];
					}
				} elseif ( empty( $this->post_data ) && ( isset( $_REQUEST[ $name ] ) || isset( $_REQUEST[ $name . '_' . $_default_value_counter ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					if ( isset( $_REQUEST[ $name . '_' . $_default_value_counter ] ) && ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
						$selected_value = wp_unslash( $_REQUEST[ $name . '_' . $_default_value_counter ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
					} elseif ( isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
						$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
					}
				} elseif ( THEMECOMPLETE_EPO()->is_quick_view() || ( empty( $this->post_data ) || ( isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action'] ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) {
					$selected_value = -1;
				}
			}

			$selected_value = apply_filters( 'wc_epo_default_value', $selected_value, $element );

			$is_default_value = isset( $element['default_value'] )
				?
				( ( '' !== $element['default_value'] )
					? ( (int) $element['default_value'] === (int) $product_id )
					: false )
				: false;

			$selected = false;

			if ( -1 === $selected_value ) {
				if ( (
						THEMECOMPLETE_EPO()->is_quick_view() ||
						(
							empty( $this->post_data ) ||
							(
								isset( $this->post_data['action'] ) && 'wc_epo_get_associated_product_html' === $this->post_data['action']
							)
						) ||
						'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' )
					) ) {
					if ( $is_default_value ) {
						$selected = true;
					}
				}
			} else {
				if ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
					if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $this->post_data[ 'tmcp_' . $args['name_inc'] . '_' . $_default_value_counter ] ) ) {
						$selected_value = $this->post_data[ 'tmcp_' . $args['name_inc'] . '_' . $_default_value_counter ];
					} elseif ( isset( $_REQUEST[ $name ] ) && isset( $_REQUEST[ $name . '_' . $_default_value_counter ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$selected_value = wp_unslash( $_REQUEST[ $name . '_' . $_default_value_counter ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					}
				}
				if ( $is_default_value && ! empty( $element['default_value_override'] ) && isset( $element['default_value'] ) ) {
					$selected = true;
				} elseif ( esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $product_id ) ) {
					$selected = true;
				}
			}

			if ( 'hidden' === $layout_mode && $__quantity_default_value > 0 && $__min_value === $__max_value ) {
				$selected = true;
			}

			$css_class = apply_filters( 'wc_epo_multiple_options_css_class', '', $element, $_default_value_counter );
			if ( '' !== $css_class ) {
				$css_class = ' ' . $css_class;
			}
			add_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );
			$product = wc_get_product( $product_id );
			remove_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );
			if ( ! empty( $product ) && is_object( $product ) ) {
				$tc_get_default_currency = apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) );

				$type                 = themecomplete_get_product_type( $product );
				$attributes           = [];
				$available_variations = [];

				$title = $product->get_name();
				if ( 'variation' === $type ) {
					$should_include_product_name = apply_filters( 'wc_epo_product_variation_title_include_product_name', true, $product );
					if ( ! $should_include_product_name && $product instanceof WC_Product_Variation ) {
						$title = wc_get_formatted_variation( $product, true, false );
					}
				}
				$title = apply_filters( 'wc_epo_associated_product_name', $title, $product, $product_id );

				if ( 'variable' === $type ) {
					if ( ( $selected || 'hidden' === $layout_mode ) && is_callable( [ $product, 'get_variation_attributes' ] ) ) {
						// workaround to get discounts shownn in the product for variable products.
						$isset_discount_type = false;
						if ( isset( $_REQUEST['discount_type'] ) && isset( $_REQUEST['discount'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							$isset_discount_type = wp_unslash( $_REQUEST['discount_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
							$isset_discount      = wp_unslash( $_REQUEST['discount'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
						}
						$_REQUEST['discount_type'] = $discount_type;
						$_REQUEST['discount']      = $discount;
						$attributes                = $product->get_variation_attributes();

						$get_variations = count( $product->get_children() ) <= apply_filters( 'woocommerce_ajax_variation_threshold', 30, $product );

						$available_variations = $get_variations ? $product->get_available_variations() : false; // @phpstan-ignore-line

						$product_list[ $product_id ] = $attributes;

						$variations_json = wp_json_encode( $available_variations );
						if ( false !== $variations_json ) {
							$variations_attr = function_exists( 'wc_esc_json' ) ? wc_esc_json( $variations_json ) : _wp_specialchars( $variations_json, ENT_QUOTES, 'UTF-8', true );

							$product_list_available_variations[ $product_id ] = $variations_attr;
						} else {
							$product_list_available_variations[ $product_id ] = '';
						}
						if ( $isset_discount_type && isset( $isset_discount ) ) {
							$_REQUEST['discount_type'] = $isset_discount_type;
							$_REQUEST['discount']      = $isset_discount;
						} else {
							unset( $_REQUEST['discount_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							unset( $_REQUEST['discount'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						}
					}
				} elseif ( $selected || 'hidden' === $layout_mode ) {
					$product_list[ $product_id ]                      = [];
					$product_list_available_variations[ $product_id ] = '';
				}

				$price         = '';
				$regular_price = '';
				$price_html    = '';
				if ( $priced_individually ) {
					if ( 'variable' === $type ) {
						$price         = $product->get_variation_price(); // @phpstan-ignore-line
						$regular_price = '';
					} else {
						$price         = $product->get_price();
						$regular_price = $product->get_regular_price();
					}
					if ( ! THEMECOMPLETE_EPO_WPML()->is_multi_currency() ) {
						$price         = apply_filters( 'wc_epo_convert_to_currency', $price, $tc_get_default_currency, themecomplete_get_woocommerce_currency() );
						$regular_price = apply_filters( 'wc_epo_convert_to_currency', $regular_price, $tc_get_default_currency, themecomplete_get_woocommerce_currency() );
					}
					$price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $price, $discount, $discount_type );
					if ( 'variable' === $type ) {
						$price = apply_filters( 'wc_epo_product_element_initial_variable_price', $price, $price, $product );
					}
					$price_html = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_associated_price_html( $product, $discount, $discount_type );
				}

				$li_class = ' tm-auto-row';
				if ( ! empty( $this_items_per_row ) ) {
					$li_class = ' tm-per-row';
				}

				$option = [
					'li_class'               => $li_class,
					'selected'               => $selected,
					'current'                => true,
					'value_to_show'          => $product_id,
					'css_class'              => $css_class,
					'data_price'             => $price,
					'data_price_html'        => $price_html,
					'tm_tooltip_html'        => '',
					'data_rules'             => wp_json_encode( [ $price ] ),
					'data_original_rules'    => wp_json_encode( [ $regular_price ] ),
					'data_rulestype'         => wp_json_encode( [ '' ] ),
					'data_text'              => $title,
					'data_type'              => $type,
					'data_hide_amount'       => $hide_amount,
					'text'                   => $title,
					'attributes'             => $attributes,
					'available_variations'   => $available_variations,
					'_default_value_counter' => '',
					'counter'                => $_default_value_counter,
					'tax_obj'                => wp_json_encode(
						( [
							'has_fee'   => $product->is_taxable(),
							'tax_class' => themecomplete_get_tax_class( $product ),
							'tax_rate'  => themecomplete_get_tax_rate( themecomplete_get_tax_class( $product ) ),
						] )
					),
				];

				if ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
					$option['_default_value_counter'] = $_default_value_counter;
				}

				$option    = apply_filters( 'wc_epo_product_option', $option, $key, $product_id, $element, $_default_value_counter );
				$options[] = $option;

				++$_default_value_counter;
			}
		}

		$cart_data = [];
		if ( THEMECOMPLETE_EPO()->is_edit_mode() && THEMECOMPLETE_EPO()->cart_edit_key ) {
			$cart_item_key = THEMECOMPLETE_EPO()->cart_edit_key;
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );

			if ( $cart_item ) {
				if ( isset( $cart_item['tmpost_data'] ) ) {
					$cart_data = $cart_item['tmpost_data'];
				}
			}
		}

		$labelclass       = '';
		$labelclass_start = '';
		$labelclass_end   = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ) ) {
			$labelclass       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
			$labelclass_start = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
			$labelclass_end   = true;
		}

		if ( 'thumbnail' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
			$this->add_thumbnail_css( $layout_mode, $element, $args );
		}

		$display = [
			'labelclass_start'                  => $labelclass_start,
			'labelclass'                        => $labelclass,
			'labelclass_end'                    => $labelclass_end,
			'show_title'                        => $this->get_value( $element, 'show_title', '1' ),
			'show_title_link'                   => $this->get_value( $element, 'show_title_link', '1' ),
			'show_price'                        => $this->get_value( $element, 'show_price', '1' ),
			'show_description'                  => $this->get_value( $element, 'show_description', '1' ),
			'show_meta'                         => $this->get_value( $element, 'show_meta', '1' ),
			'show_image'                        => $this->get_value( $element, 'show_image', '1' ),
			'required'                          => $this->get_value( $element, 'required', '' ),
			'hide_amount'                       => $this->get_value( $element, 'hide_amount', '' ),
			'operation_mode'                    => $operation_mode,
			'discount'                          => $discount,
			'discount_type'                     => $discount_type,
			'discount_exclude_addons'           => $discount_exclude_addons,
			'priced_individually'               => $priced_individually,
			'layout_mode'                       => $layout_mode,
			'categoryids'                       => $categoryids,
			'productids'                        => $productids,
			'get_default_value'                 => $get_default_value,
			'class_label'                       => $class_label,
			'placeholder'                       => $placeholder,
			'options'                           => $options,
			'quantity_min'                      => $__min_value,
			'quantity_max'                      => $__max_value,
			'quantity_default'                  => $__quantity_default_value,
			'cart_data'                         => $cart_data,
			'product_list'                      => $product_list,
			'product_list_available_variations' => $product_list_available_variations,
			'image_rel'                         => current_theme_supports( 'wc-product-gallery-lightbox' ) ? 'photoSwipe' : 'prettyPhoto',
			'variation_id'                      => isset( $args['element_id'] ) && isset( $_REQUEST[ $args['element_id'] . '_variation_id' ] ) ? absint( wp_unslash( $_REQUEST[ $args['element_id'] . '_variation_id' ] ) ) : '', // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		];

		return apply_filters( 'wc_epo_display_field_product', $display, $this, $element, $args );
	}

	/**
	 * Add field data to cart (single type fields)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_single() {
		if ( ! $this->is_setup() ) {
			return false;
		}

		if ( '' !== $this->key ) {
			$variation_id = isset( $this->post_data[ $this->attribute . '_variation_id' ] ) ? $this->post_data[ $this->attribute . '_variation_id' ] : '';
			$attributes   = [];
			if ( $variation_id ) {
				$product = wc_get_product( $this->key );
				if ( $product ) {
					$product_attributes = $product->get_attributes();

					foreach ( $product_attributes as $attribute ) {

						if ( ! $attribute instanceof WC_Product_Attribute || ! $attribute->get_variation() ) {
							continue;
						}

						$taxonomy = wc_variation_attribute_name( $attribute->get_name() );

						if ( isset( $this->post_data[ $this->attribute . '_attribute_' . $taxonomy ] ) && '' !== $this->post_data[ $this->attribute . '_attribute_' . $taxonomy ] ) {

							// Get value from post data.
							if ( $attribute->is_taxonomy() ) {
								$value = sanitize_title( wp_unslash( $this->post_data[ $this->attribute . '_attribute_' . $taxonomy ] ) );
							} else {
								$value = THEMECOMPLETE_EPO_HELPER()->entity_decode( wc_clean( wp_unslash( $this->post_data[ $this->attribute . '_attribute_' . $taxonomy ] ) ) );
							}

							$attributes[ $taxonomy ] = $value;
						}
					}
				}
			}

			$quantity_min = isset( $this->element['quantity_min'] ) ? $this->element['quantity_min'] : 1;
			$quantity_max = isset( $this->element['quantity_max'] ) ? $this->element['quantity_max'] : '';

			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				[
					'mode'                             => 'products',
					'required'                         => isset( $this->element['required'] ) ? $this->element['required'] : '',
					'priced_individually'              => isset( $this->element['priced_individually'] ) ? $this->element['priced_individually'] : '',
					'shipped_individually'             => isset( $this->element['shipped_individually'] ) ? $this->element['shipped_individually'] : '',
					'maintain_weight'                  => isset( $this->element['maintain_weight'] ) ? $this->element['maintain_weight'] : '',
					'discount'                         => isset( $this->element['discount'] ) ? $this->element['discount'] : '',
					'discount_type'                    => isset( $this->element['discount_type'] ) ? $this->element['discount_type'] : '',
					'discount_exclude_addons'          => isset( $this->element['discount_exclude_addons'] ) ? $this->element['discount_exclude_addons'] : '',
					'product_id'                       => $this->key,
					'variation_id'                     => $variation_id,
					'attributes'                       => $attributes,
					'cssclass'                         => $this->element['class'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $this->key,
					'post_name'                        => $this->attribute,
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( 1 ),
					'quantity'                         => isset( $this->post_data[ $this->attribute . '_quantity' ] ) ? $this->post_data[ $this->attribute . '_quantity' ] : 1,
					'quantity_selector'                => '',
					'initial_quantity'                 => isset( $this->post_data[ $this->attribute . '_quantity' ] ) ? $this->post_data[ $this->attribute . '_quantity' ] : 1,
					'no_change_quantity'               => $quantity_min === $quantity_max && $quantity_min && '' !== $quantity_max,
					'quantity_min'                     => $quantity_min,
					'quantity_max'                     => $quantity_max,
					'form_prefix'                      => ( isset( $this->post_data['tc_form_prefix_assoc'] ) && isset( $this->post_data['tc_form_prefix_assoc'][ $this->element['uniqid'] ] ) ) ? wp_unslash( $this->post_data['tc_form_prefix_assoc'][ $this->element['uniqid'] ] ) : '',
					'form_prefix_counter'              => isset( $this->post_data[ $this->attribute . '_counter' ] ) ? $this->post_data[ $this->attribute . '_counter' ] : '',
					'hiddenin'                         => $this->element['hiddenin'],
				],
				$this
			);

		}

		return false;
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;

		$tmcp_post_fields         = THEMECOMPLETE_EPO_HELPER()->array_filter_key( $this->post_data );
		$current_tmcp_post_fields = THEMECOMPLETE_EPO_HELPER()->array_intersect_key_wildcard( $tmcp_post_fields, array_flip( $this->field_names ) );

		foreach ( $current_tmcp_post_fields as $attribute => $value ) {
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				} else {
					$product = wc_get_product( $this->epo_post_fields[ $attribute ] );
					if ( $product ) {
						$type = themecomplete_get_product_type( $product );
						if ( 'variable' === $type ) {
							if ( ! isset( $this->epo_post_fields[ $attribute . '_variation_id' ] ) || '' === $this->epo_post_fields[ $attribute . '_variation_id' ] ) {
								$passed    = false;
								$message[] = 'required';
								break;
							}
						}
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-date.php000064400000060601150755142450017242 0ustar00<?php
/**
 * Date Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Date Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_date extends THEMECOMPLETE_EPO_FIELDS {
	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$name = $args['posted_name'];
		$id   = $args['element_id'];

		$tm_epo_global_datepicker_theme    = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_theme' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_theme' ) : ( isset( $element['theme'] ) ? $element['theme'] : 'epo' );
		$tm_epo_global_datepicker_size     = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_size' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_size' ) : ( isset( $element['theme_size'] ) ? $element['theme_size'] : 'medium' );
		$tm_epo_global_datepicker_position = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_position' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_position' ) : ( isset( $element['theme_position'] ) ? $element['theme_position'] : 'normal' );

		$translation_day   = ! empty( $element['translation_day'] ) ? $element['translation_day'] : '';
		$translation_month = ! empty( $element['translation_month'] ) ? $element['translation_month'] : '';
		$translation_year  = ! empty( $element['translation_year'] ) ? $element['translation_year'] : '';

		$style       = isset( $element['button_type'] ) ? $element['button_type'] : '';
		$defaultdate = isset( $element['default_value'] ) ? $element['default_value'] : '';
		$format      = ! empty( $element['format'] ) ? $element['format'] : 0;

		$end_year   = ! empty( $element['end_year'] ) ? $element['end_year'] : ( intval( gmdate( 'Y' ) ) + 10 );
		$start_year = ! empty( $element['start_year'] ) ? $element['start_year'] : 1900;
		$end_year   = absint( $end_year );
		$start_year = absint( $start_year );

		if ( $end_year < $start_year ) {
			$end_year = $start_year;
		}

		$data             = THEMECOMPLETE_EPO()->get_date_format( $format );
		$date_format      = $data['element_date_format'];
		$date_placeholder = $data['date_placeholder'];
		$date_mask        = $data['date_mask'];

		if ( apply_filters( 'wc_epo_display_rtl', is_rtl() ) ) {
			$date_format      = strrev( $date_format );
			$date_placeholder = strrev( $date_placeholder );
			$date_mask        = strrev( $date_mask );
		}

		$input_type = 'text';
		$showon     = 'both';
		if ( '' === $style ) {
			$input_type       = 'hidden';
			$showon           = 'focus';
			$date_mask        = '';
			$date_placeholder = '';
		}

		$picker_html = '';
		if ( 'picker' !== $style ) {
			if ( isset( $_REQUEST[ $name ] ) && empty( $this->post_data ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$value = map_deep( wp_unslash( $_REQUEST[ $name ] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( is_array( $value ) ) {
					if ( ! empty( $args['repeater'] ) && isset( $args['get_posted_key'] ) ) {
						$value = $value[ $args['get_posted_key'] ];
					} else {
						$value = $value[0];
					}
				}
				$value = str_replace( '/', '-', $value );
				$value = explode( '-', $value );
				if ( ! isset( $value[0] ) ) {
					$value[0] = '';
				}
				if ( ! isset( $value[1] ) ) {
					$value[1] = '';
				}
				if ( ! isset( $value[2] ) ) {
					$value[2] = '';
				}
				switch ( $format ) {
					case '0':
					case '2':
					case '4':
						$_REQUEST[ $name . '_day' ]   = $value[0];
						$_REQUEST[ $name . '_month' ] = $value[1];
						$_REQUEST[ $name . '_year' ]  = $value[2];
						break;
					case '1':
					case '3':
					case '5':
						$_REQUEST[ $name . '_day' ]   = $value[1];
						$_REQUEST[ $name . '_month' ] = $value[0];
						$_REQUEST[ $name . '_year' ]  = $value[2];
						break;
				}
			}

			$select_array     = [
				'label_class' => 'tc-col',
				'class'       => 'tmcp-date-select tmcp-date-day',
				'id'          => $id . '_day',
				'name'        => $name . '_day' . ( ! empty( $args['repeater'] ) ? '[' . $args['get_posted_key'] . ']' : '' ),
				'atts'        => [ 'data-tm-date' => $id ],
			];
			$select_options   = [];
			$translation_day  = ( ! empty( $translation_day ) ) ? $translation_day : esc_html__( 'Day', 'woocommerce-tm-extra-product-options' );
			$select_options[] = [
				'text'  => $translation_day,
				'value' => '',
			];
			for ( $i = 1; 31 + 1 !== $i; ++$i ) {
				$select_options[] = [
					'text'  => $i,
					'value' => $i,
				];
			}
			$selectedvalue = isset( $_REQUEST[ $name . '_day' ] ) ? map_deep( wp_unslash( $_REQUEST[ $name . '_day' ] ), 'sanitize_text_field' ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( is_array( $selectedvalue ) ) {
				if ( isset( $selectedvalue[ $args['get_posted_key'] ] ) ) {
					$selectedvalue = $selectedvalue[ $args['get_posted_key'] ];
				}
			}
			$day_html = THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, $selectedvalue, 1, 0 );
			if ( ! is_string( $day_html ) ) {
				$day_html = '';
			}

			$select_array      = [
				'label_class' => 'tc-col',
				'class'       => 'tmcp-date-select tmcp-date-month',
				'id'          => $id . '_month',
				'name'        => $name . '_month' . ( ! empty( $args['repeater'] ) ? '[' . $args['get_posted_key'] . ']' : '' ),
				'atts'        => [ 'data-tm-date' => $id ],
			];
			$select_options    = [];
			$translation_month = ( ! empty( $translation_month ) ) ? $translation_month : esc_html__( 'Month', 'woocommerce-tm-extra-product-options' );
			$select_options[]  = [
				'text'  => $translation_month,
				'value' => '',
			];

			global $wp_locale;
			for ( $i = 1; 12 + 1 !== $i; ++$i ) {
				$select_options[] = [
					'text'  => $wp_locale->get_month( $i ),
					'value' => $i,
				];
			}
			$selectedvalue = isset( $_REQUEST[ $name . '_month' ] ) ? map_deep( wp_unslash( $_REQUEST[ $name . '_month' ] ), 'sanitize_text_field' ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( is_array( $selectedvalue ) ) {
				if ( isset( $selectedvalue[ $args['get_posted_key'] ] ) ) {
					$selectedvalue = $selectedvalue[ $args['get_posted_key'] ];
				}
			}
			$month_html = THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, $selectedvalue, 1, 0 );
			if ( ! is_string( $month_html ) ) {
				$month_html = '';
			}

			$select_array     = [
				'label_class' => 'tc-col',
				'class'       => 'tmcp-date-select tmcp-date-year',
				'id'          => $id . '_year',
				'name'        => $name . '_year' . ( ! empty( $args['repeater'] ) ? '[' . $args['get_posted_key'] . ']' : '' ),
				'atts'        => [ 'data-tm-date' => $id ],
			];
			$select_options   = [];
			$translation_year = ( ! empty( $translation_year ) ) ? $translation_year : esc_html__( 'Year', 'woocommerce-tm-extra-product-options' );
			$select_options[] = [
				'text'  => $translation_year,
				'value' => '',
			];
			for ( $i = $end_year; $i !== $start_year - 1; --$i ) {
				$select_options[] = [
					'text'  => $i,
					'value' => $i,
				];
			}
			$selectedvalue = isset( $_REQUEST[ $name . '_year' ] ) ? map_deep( wp_unslash( $_REQUEST[ $name . '_year' ] ), 'sanitize_text_field' ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( is_array( $selectedvalue ) ) {
				if ( isset( $selectedvalue[ $args['get_posted_key'] ] ) ) {
					$selectedvalue = $selectedvalue[ $args['get_posted_key'] ];
				}
			}
			$year_html = THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, $selectedvalue, 1, 0 );
			if ( ! is_string( $year_html ) ) {
				$year_html = '';
			}

			switch ( $format ) {
				case '0':
				case '2':
				case '4':
					if ( apply_filters( 'wc_epo_display_rtl', is_rtl() ) ) {
						$picker_html = $year_html . $month_html . $day_html;
					} else {
						$picker_html = $day_html . $month_html . $year_html;
					}

					break;
				case '1':
				case '3':
				case '5':
					if ( apply_filters( 'wc_epo_display_rtl', is_rtl() ) ) {
						$picker_html = $year_html . $day_html . $month_html;
					} else {
						$picker_html = $month_html . $day_html . $year_html;
					}

					break;
			}
		}

		$get_default_value = '';

		if ( '' !== $defaultdate ) {
			$get_default_value = $defaultdate;
			if ( is_numeric( $defaultdate ) ) {
				$get_default_value = new DateTime( 'now' );
				if ( floatval( $defaultdate ) > 0 ) {
					$get_default_value->add( new DateInterval( 'P' . abs( floatval( $defaultdate ) ) . 'D' ) );
				} else {
					$get_default_value->sub( new DateInterval( 'P' . abs( floatval( $defaultdate ) ) . 'D' ) );
				}
				$get_default_value = $get_default_value->format( str_ireplace( 'dd', 'd', str_ireplace( 'mm', 'm', str_ireplace( 'yy', 'Y', $date_format ) ) ) );
				$date_errors       = DateTime::getLastErrors();
				if ( ! empty( $date_errors['error_count'] ) ) {
					$get_default_value = $defaultdate;
				}
			}
		}
		$get_default_value = $this->get_default_value( $element, $args, false, $get_default_value );

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		return apply_filters(
			'wc_epo_display_field_date',
			[
				'date_format'         => $date_format,
				'input_type'          => $input_type,
				'showon'              => $showon,
				'date_mask'           => $date_mask,
				'date_placeholder'    => $date_placeholder,
				'picker_html'         => $picker_html,
				'textbeforeprice'     => $this->get_value( $element, 'text_before_price', '' ),
				'textafterprice'      => $this->get_value( $element, 'text_after_price', '' ),
				'hide_amount'         => $this->get_value( $element, 'hide_amount', '' ),
				'style'               => $style,
				'format'              => $format,
				'start_year'          => $start_year,
				'end_year'            => $end_year,
				'min_date'            => isset( $element['min_date'] ) ? $element['min_date'] : '',
				'max_date'            => isset( $element['max_date'] ) ? $element['max_date'] : '',
				'disabled_dates'      => ! empty( $element['disabled_dates'] ) ? $element['disabled_dates'] : '',
				'enabled_only_dates'  => ! empty( $element['enabled_only_dates'] ) ? $element['enabled_only_dates'] : '',
				'exlude_disabled'     => isset( $element['exlude_disabled'] ) ? $element['exlude_disabled'] : '',
				'disabled_weekdays'   => isset( $element['disabled_weekdays'] ) ? $element['disabled_weekdays'] : '',
				'disabled_months'     => isset( $element['disabled_months'] ) ? $element['disabled_months'] : '',
				'translation_day'     => $translation_day,
				'translation_month'   => $translation_month,
				'translation_year'    => $translation_year,
				'quantity'            => $this->get_value( $element, 'quantity', '' ),
				'defaultdate'         => $defaultdate,
				'get_default_value'   => $get_default_value,
				'date_theme'          => $tm_epo_global_datepicker_theme,
				'date_theme_size'     => $tm_epo_global_datepicker_size,
				'date_theme_position' => $tm_epo_global_datepicker_position,
				'class_label'         => $class_label,
			],
			$this,
			$element,
			$args
		);
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$format      = $this->element['format'];
		$data        = THEMECOMPLETE_EPO()->get_date_format( $format );
		$date_format = $data['date_format'] . ' H:i:s';
		$sep         = $data['sep'];
		if ( empty( $sep ) ) {
			$sep = '/';
		}

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {

			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}

			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}

			if ( ! empty( $this->epo_post_fields[ $attribute ] ) && class_exists( 'DateTime' ) && ( version_compare( phpversion(), '5.3', '>=' ) ) ) {
				$posted_date_value = $this->epo_post_fields[ $attribute ];
				$posted_date_value = (array) $posted_date_value;

				foreach ( $posted_date_value as $posted_date_id => $posted_date ) {

					if ( '' === $posted_date ) {
						continue;
					}
					if ( apply_filters( 'wc_epo_display_rtl', is_rtl() ) ) {
						$posted_date_arr = explode( $sep, $posted_date );
						if ( 3 === count( $posted_date_arr ) ) {
							$posted_date = $posted_date_arr[2] . $sep . $posted_date_arr[1] . $sep . $posted_date_arr[0];
						}
					}
					if ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_date_timezone' ) ) ) {
						$date = DateTime::createFromFormat( $date_format, $posted_date . ' 00:00:00', new DateTimeZone( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_date_timezone' ) ) );
					} else {
						$date = DateTime::createFromFormat( $date_format, $posted_date . ' 00:00:00' );
					}

					$date_errors = DateTime::getLastErrors();

					if ( false === $date || ! empty( $date_errors['error_count'] ) ) {
						$passed    = false;
						$message[] = esc_html__( 'Invalid date entered!', 'woocommerce-tm-extra-product-options' );
						break 2;
					}

					$_year  = $date->format( 'Y' );
					$year   = $_year;
					$_month = $date->format( 'm' );
					$month  = $_month;
					$_day   = $date->format( 'd' );
					$day    = $_day;

					$posted_date_arr = explode( $sep, $posted_date );

					if ( 3 === count( $posted_date_arr ) ) {
						switch ( $format ) {
							case '0':
							case '2':
							case '4':
								$_year  = $posted_date_arr[2];
								$_month = $posted_date_arr[1];
								$_day   = $posted_date_arr[0];
								break;
							case '1':
							case '3':
							case '5':
								$_year  = $posted_date_arr[2];
								$_month = $posted_date_arr[0];
								$_day   = $posted_date_arr[1];
								break;
						}

						if ( $year !== $_year || $month !== $_month || $day !== $_day ) {
							$message[] = esc_html__( 'Invalid data submitted!', 'woocommerce-tm-extra-product-options' );
							$passed    = false;
							break 2;
						}
					}

					if ( checkdate( (int) $_month, (int) $_day, (int) $_year ) ) {
						// valid date.
						$start_year         = is_numeric( $this->element['start_year'] ) ? (int) $this->element['start_year'] : 1900;
						$end_year           = is_numeric( $this->element['end_year'] ) ? (int) $this->element['end_year'] : ( intval( gmdate( 'Y' ) ) + 10 );
						$min_date           = ( '' !== $this->element['min_date'] ) ? $this->element['min_date'] : false;
						$max_date           = ( '' !== $this->element['max_date'] ) ? $this->element['max_date'] : false;
						$exlude_disabled    = ( '' !== $this->element['exlude_disabled'] ) ? ( $this->element['exlude_disabled'] ) : false;
						$disabled_dates     = $this->element['disabled_dates'];
						$enabled_only_dates = $this->element['enabled_only_dates'];
						$disabled_weekdays  = $this->element['disabled_weekdays'];
						$disabled_months    = $this->element['disabled_months'];

						$now = new DateTime( '00:00:00' );
						if ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_date_timezone' ) ) ) {
							$now = new DateTime( '00:00:00', new DateTimeZone( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_date_timezone' ) ) );
						}
						$now_day   = $now->format( 'd' );
						$now_month = $now->format( 'm' );
						$now_year  = $now->format( 'Y' );

						if ( $enabled_only_dates ) {
							$enabled_only_dates = explode( ',', $enabled_only_dates );
							$_pass              = false;
							foreach ( $enabled_only_dates as $key => $value ) {
								$value = str_replace( '.', '-', $value );
								$value = str_replace( '/', '-', $value );
								$value = explode( '-', $value );
								if ( count( $value ) !== 3 ) {
									continue;
								}
								switch ( $format ) {
									case '0':
									case '2':
									case '4':
										$value = $value[2] . '-' . $value[1] . '-' . $value[0];
										break;
									case '1':
									case '3':
									case '5':
										$value = $value[2] . '-' . $value[0] . '-' . $value[1];
										break;
								}
								if ( is_array( $value ) ) {
									continue;
								}
								$value_to_date = date_create( $value );
								if ( ! $value_to_date ) {
									continue;
								}
								$value = date_format( $value_to_date, $date_format );
								$temp  = DateTime::createFromFormat( $date_format, $value );
								if ( false === $temp ) {
									$_pass = true;
									break;
								}
								$interval = $temp->diff( $date );
								$sign     = intval( $interval->format( '%d%m%Y' ) );
								if ( empty( $sign ) ) {
									$_pass = true;
									break;
								}
							}
							$passed = $_pass;
							if ( ! $_pass ) {
								$message[] = esc_html__( 'Invalid date entered!', 'woocommerce-tm-extra-product-options' );
								break 2;
							}
						} else {
							// validate start,end year.
							if ( $_year < $start_year || $_year > $end_year ) {
								$passed    = false;
								$message[] = esc_html__( 'Invalid year date entered!', 'woocommerce-tm-extra-product-options' );
								break 2;
							}

							// validate disabled dates.
							if ( $disabled_dates ) {
								$disabled_dates = explode( ',', $disabled_dates );
								foreach ( $disabled_dates as $key => $value ) {
									$value = str_replace( '.', '-', $value );
									$value = str_replace( '/', '-', $value );
									$value = explode( '-', $value );
									if ( count( $value ) !== 3 ) {
										continue;
									}
									switch ( $format ) {
										case '0':
										case '2':
										case '4':
											$value = $value[2] . '-' . $value[1] . '-' . $value[0];
											break;
										case '1':
										case '3':
										case '5':
											$value = $value[2] . '-' . $value[0] . '-' . $value[1];
											break;
									}
									if ( is_array( $value ) ) {
										continue;
									}
									$value_to_date = date_create( $value );
									if ( ! $value_to_date ) {
										continue;
									}
									$value = date_format( $value_to_date, $date_format );
									$temp  = DateTime::createFromFormat( $date_format, $value );
									if ( false !== $temp ) {
										$interval = $temp->diff( $date );
										$sign     = floatval( $interval->format( '%d%m%Y' ) );
									}
									if ( false === $temp || empty( $sign ) ) {
										$passed    = false;
										$message[] = esc_html__( 'You cannot select that date!', 'woocommerce-tm-extra-product-options' );
										break 2;
									}
								}
							}

							// validate minimum date.
							if ( false !== $min_date ) {

								if ( is_numeric( $min_date ) ) {
									if ( $exlude_disabled ) {
										$min_date = $this->correct_date( $min_date );
									}
									$temp = clone $now;
									if ( $min_date > 0 ) {
										$temp->add( new DateInterval( 'P' . abs( $min_date ) . 'D' ) );
									} elseif ( $min_date < 0 ) {
										$temp->sub( new DateInterval( 'P' . abs( $min_date ) . 'D' ) );
									}
								} else {
									$temp = str_replace( '.', '-', $min_date );
									$temp = str_replace( '/', '-', $temp );
									if ( is_string( $temp ) ) {
										$temp = explode( '-', $temp );
										if ( is_array( $temp ) && isset( $temp[0] ) && isset( $temp[1] ) && isset( $temp[2] ) ) {
											switch ( $format ) {
												case '0':
												case '2':
												case '4':
													$temp = $temp[2] . '-' . $temp[1] . '-' . $temp[0];
													break;
												case '1':
												case '3':
												case '5':
													$temp = $temp[2] . '-' . $temp[0] . '-' . $temp[1];
													break;
											}
											if ( is_string( $temp ) ) {
												$temp = date_create( $temp );
											} else {
												$temp = false;
											}
										} else {
											$temp = false;
										}
									} else {
										$temp = false;
									}
									if ( false === $temp ) {
										// failsafe.
										$temp = clone $now;
									} else {
										$temp = date_format( $temp, $date_format );
										$temp = DateTime::createFromFormat( $date_format, $temp );
									}
								}
								if ( false !== $temp ) {
									$interval = $temp->diff( $date );
									$sign     = $interval->format( '%r' );
								}

								if ( false === $temp || ! empty( $sign ) ) {
									$passed    = false;
									$message[] = esc_html__( 'You cannot select that date!', 'woocommerce-tm-extra-product-options' );
									break 2;
								}
							}

							// validate maximum date.
							if ( false !== $max_date ) {
								if ( is_numeric( $max_date ) ) {
									if ( $exlude_disabled ) {
										$max_date = $this->correct_date( $max_date );
									}
									$temp = clone $now;
									if ( $max_date > 0 ) {
										$temp->add( new DateInterval( 'P' . abs( $max_date ) . 'D' ) );
									} elseif ( $max_date < 0 ) {
										$temp->sub( new DateInterval( 'P' . abs( $max_date ) . 'D' ) );
									}
								} else {
									$temp = str_replace( '.', '-', $max_date );
									$temp = str_replace( '/', '-', $temp );
									if ( is_string( $temp ) ) {
										$temp = explode( '-', $temp );
										switch ( $format ) {
											case '0':
											case '2':
											case '4':
												$temp = $temp[2] . '-' . $temp[1] . '-' . $temp[0];
												break;
											case '1':
											case '3':
											case '5':
												$temp = $temp[2] . '-' . $temp[0] . '-' . $temp[1];
												break;
										}
										if ( is_array( $temp ) ) {
											$temp = clone $now;
										} else {
											$temp = date_create( $temp );
											if ( false === $temp ) {
												// failsafe todo:proper handling.
												$temp = clone $now;
											} else {
												$temp = date_format( $temp, $date_format );
												$temp = DateTime::createFromFormat( $date_format, $temp );
											}
										}
									} else {
										$temp = false;
									}
								}
								if ( false !== $temp ) {
									$interval = $date->diff( $temp );
									$sign     = $interval->format( '%r' );
								}
								if ( false === $temp || ! empty( $sign ) ) {
									$passed    = false;
									$message[] = esc_html__( 'You cannot select that date!', 'woocommerce-tm-extra-product-options' );
									break 2;
								}
							}
						}
					} else {
						// problem with dates ...
						$passed    = false;
						$message[] = esc_html__( 'Invalid date entered!', 'woocommerce-tm-extra-product-options' );
						break 2;
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}

	/**
	 * Correct days
	 *
	 * @param mixed $days The days to check.
	 * @return mixed
	 */
	public function correct_date( $days ) {
		if ( is_numeric( $days ) ) {
			$sign = 0 === $days ? $days : ( $days > 0 ? 1 : -1 );
			if ( 0 !== $sign ) {
				$now               = new DateTime( '00:00:00' );
				$test_date         = clone $now;
				$count             = 1;
				$added             = false;
				$no_of_days_to_add = abs( $days );
				while ( $count <= $no_of_days_to_add ) {
					if ( false === $added ) {
						$added = 0;
					}
					if ( $sign > 0 ) {
						$test_date->add( new DateInterval( 'P' . abs( $sign ) . 'D' ) );
					} else { // $sign < 0
						$test_date->sub( new DateInterval( 'P' . abs( $sign ) . 'D' ) );
					}
					++$added;
					$get_day = (int) $test_date->format( 'w' );
					if ( 0 !== $get_day && 6 !== $get_day ) {
						++$count;
					}
				}
				if ( false !== $added ) {
					$days = $added * $sign;
				}
			}
		}
		return $days;
	}
}
includes/fields/class-themecomplete-epo-fields-textfield.php000064400000013146150755142450020317 0ustar00<?php
/**
 * Textfield Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Textfield Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_textfield extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$validation1      = $this->get_value( $element, 'validation1', '' );
		$price_rules_type = $this->get_value( $element, 'price_rules_type', [] );

		$input_type = isset( $price_rules_type[0] ) && isset( $price_rules_type[0][0] )
		? (
			in_array( $price_rules_type[0][0], [ 'step', 'currentstep' ], true ) || ( 'number' === $validation1 || 'digits' === $validation1 )
			? ( 'digits' === $validation1 ? 'number' : 'decimal' )
			: 'text'
			)
		: 'text';

		$min_chars = $this->get_value( $element, 'min_chars', '' );
		$max_chars = $this->get_value( $element, 'max_chars', '' );

		$min_chars = '' !== $min_chars ? absint( $element['min_chars'] ) : '';
		$max_chars = '' !== $max_chars ? absint( $element['max_chars'] ) : '';

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}

		$step = $this->get_value( $element, 'step', '' );
		if ( empty( $step ) ) {
			$step = 'any';
		} else {
			THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( themecomplete_convert_local_numbers( $step ) ), true );
		}

		$display = [
			'default_value'     => $this->get_value( $element, 'default_value', '' ),
			'get_default_value' => $this->get_default_value( $element, $args ),
			'textbeforeprice'   => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'    => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'       => $this->get_value( $element, 'hide_amount', '' ),
			'placeholder'       => $this->get_value( $element, 'placeholder', '' ),
			'min'               => $this->get_value( $element, 'min', '' ),
			'max'               => $this->get_value( $element, 'max', '' ),
			'step'              => $step,
			'quantity'          => $this->get_value( $element, 'quantity', '' ),
			'freechars'         => $this->get_value( $element, 'freechars', '' ),
			'min_chars'         => $min_chars,
			'max_chars'         => $max_chars,
			'input_type'        => $input_type,
			'class_label'       => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_textfield', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? (int) $this->element['quantity_min'] : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( (int) array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}
			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
			if ( $this->element['min_chars'] ) {
				$val = false;
				if ( isset( $this->epo_post_fields[ $attribute ] ) ) {
					$val = $this->epo_post_fields[ $attribute ];
					$val = preg_replace( "/\r\n/", "\n", $val );
				}
				if ( ! is_array( $val ) ) {
					$val = [ $val ];
				}

				foreach ( $val as $val_value ) {
					if ( '' !== $val_value && ( false !== $val_value && strlen( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $val_value ) ) < (int) $this->element['min_chars'] ) ) {
						$passed = false;
						/* translators: %1 number of characters %2 element label. */
						$message[] = sprintf( esc_html__( 'You must enter at least %1$s characters for "%2$s".', 'woocommerce-tm-extra-product-options' ), (int) $this->element['min_chars'], $this->element['label'] );
						break;
					}
				}
			}
			if ( $this->element['max_chars'] ) {
				$val = false;
				if ( isset( $this->epo_post_fields[ $attribute ] ) ) {
					$val = $this->epo_post_fields[ $attribute ];
					$val = preg_replace( "/\r\n/", "\n", $val );
				}
				if ( ! is_array( $val ) ) {
					$val = [ $val ];
				}

				foreach ( $val as $val_value ) {
					if ( '' !== $val_value && ( false !== $val_value && strlen( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $val_value ) ) > (int) $this->element['max_chars'] ) ) {
						$passed = false;
						/* translators: %1 number of characters %2 element label. */
						$message[] = sprintf( esc_html__( 'You cannot enter more than %1$s characters for "%2$s".', 'woocommerce-tm-extra-product-options' ), (int) $this->element['max_chars'], $this->element['label'] );
						break;
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-upload.php000064400000033171150755142450017613 0ustar00<?php
/**
 * Upload Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Upload Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_upload extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$saved_value = '';
		if ( ! empty( THEMECOMPLETE_EPO_CART()->last_added_cart_key ) || ( THEMECOMPLETE_EPO()->is_edit_mode() && THEMECOMPLETE_EPO()->cart_edit_key ) ) {
			$cart_item_key = THEMECOMPLETE_EPO()->is_edit_mode() ? THEMECOMPLETE_EPO()->cart_edit_key : THEMECOMPLETE_EPO_CART()->last_added_cart_key;
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );

			if ( $cart_item ) {
				if ( isset( $cart_item['tmcartepo'] ) ) {
					$saved_epos = $cart_item['tmcartepo'];
					foreach ( $saved_epos as $key => $val ) {
						if ( $element['uniqid'] === $val['section'] ) {
							if ( isset( $val['repeater'] ) && isset( $args['get_posted_key'] ) ) {
								if ( (string) $val['key_id'] === (string) $args['get_posted_key'] ) {
									$saved_value = $val['value'];
									break;
								}
							} else {
								$saved_value = $val['value'];
								break;
							}
						}
					}
				}
				if ( empty( $saved_value ) && isset( $cart_item['tmcartfees'] ) ) {
					$saved_epos = $cart_item['tmcartfees'];
					foreach ( $saved_epos as $key => $val ) {
						if ( $element['uniqid'] === $val['section'] ) {
							$saved_value = $val['value'];
							break;
						}
					}
				}
			}
		}
		$style = $this->get_value( $element, 'button_type', '' );

		$upload_text = '';
		switch ( $style ) {
			case '':
				$style = ' cpf-upload-container-basic';
				break;
			case 'button':
				$style       = ' cpf-upload-container';
				$upload_text = ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_file_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_file_text' ) ) : esc_html__( 'Select file(s)', 'woocommerce-tm-extra-product-options' ) );
				break;
		}

		/* translators: %s file size */
		$max_file_size_text = sprintf( esc_html__( '(max file size %s)', 'woocommerce-tm-extra-product-options' ), size_format( wp_max_upload_size() ) );

		$class_label = '';
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) ) {
			$class_label = ' fullwidth';
		}
		$display = [
			'max_size'           => size_format( wp_max_upload_size() ),
			'style'              => $style,
			'textbeforeprice'    => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'     => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'        => $this->get_value( $element, 'hide_amount', '' ),
			'quantity'           => $this->get_value( $element, 'quantity', '' ),
			'saved_value'        => $saved_value,
			'upload_text'        => $upload_text,
			'max_file_size_text' => $max_file_size_text,
			'allowed_mimes'      => implode( ', ', THEMECOMPLETE_EPO()->get_allowed_mimes() ),
			'class_label'        => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_upload', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];
		$files   = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		foreach ( $this->field_names as $attribute ) {
			if ( isset( $files[ $attribute ] ) ) {
				$file          = $files[ $attribute ];
				$file_name     = '';
				$file_tmp_name = '';
				if ( ! empty( $file ) ) {
					$file_name     = $file['name'];
					$file_tmp_name = $file['tmp_name'];
				}
				if ( ! ( isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] ) ) {

					if ( $this->element['required'] && ( empty( $file ) || empty( $file_name ) ) ) {
						$passed    = false;
						$message[] = 'required';
						break;
					} elseif ( ! empty( $file_name ) ) {
						$name     = (array) $file_name;
						$tmp_name = (array) $file_tmp_name;
						foreach ( $name as $name_id => $name_value ) {
							$ext   = strtolower( pathinfo( $name_value, PATHINFO_EXTENSION ) );
							$check = true;
							if ( apply_filters( 'wc_epo_no_upload_to_png', true ) && in_array( $ext, [ 'jpg', 'png', 'gif' ], true ) ) {
								$check = THEMECOMPLETE_EPO_HELPER()->upload_to_png( $tmp_name[ $name_id ], $tmp_name[ $name_id ] );
							}
							if ( false === $check ) {
								$passed = false;
								/* translators: %s file name. */
								$message[] = sprintf( esc_html__( '%s is not a valid image file!', 'woocommerce-tm-extra-product-options' ), $name_value );
								break 2;
							}
						}
					}
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}

	/**
	 * Add field data to cart (single type fields)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_single() {
		$files = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		$can_be_added = false;
		$posted_check = false;
		if ( isset( $this->post_data[ $this->attribute ] ) && '' !== $this->post_data[ $this->attribute ] ) {
			if ( is_array( $this->post_data[ $this->attribute ] ) ) {
				if ( isset( $this->post_data[ $this->attribute ][ $this->key_id ] ) && '' !== $this->post_data[ $this->attribute ][ $this->key_id ] ) {
					$posted_check = true;
				}
			} else {
				$posted_check = true;
			}
		}
		if ( $posted_check ) {
			$value = $this->post_data[ $this->attribute ];
			if ( is_array( $value ) && isset( $value[ $this->key_id ] ) ) {
				$value = $value[ $this->key_id ];
				if ( is_array( $value ) && isset( $value[ $this->keyvalue_id ] ) ) {
					$value = $value[ $this->keyvalue_id ];
				}
			}
			$can_be_added = true;
		} elseif ( ! empty( $files[ $this->attribute ] ) && ! empty( $files[ $this->attribute ]['name'] ) ) {
			$upload = THEMECOMPLETE_EPO()->upload_file( $files[ $this->attribute ], $this->key_id, $this->keyvalue_id );
			if ( false !== $upload ) {
				if ( empty( $upload['error'] ) && ! empty( $upload['file'] ) ) {
					$value = wc_clean( $upload['url'] );
					if ( empty( $upload['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
						wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
					}
					$can_be_added = true;

				} else {
					wc_add_notice( $upload['error'], 'error' );
				}
			}
		}

		if ( $can_be_added ) {
			if ( isset( $value ) ) {
				$value = THEMECOMPLETE_EPO_HELPER()->to_ssl( $value );
			}
			if ( ! isset( $value ) ) {
				$value = '';
			}
			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, 1, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			if ( empty( $this->key ) ) {
				$_price = 0;
			}

			return apply_filters(
				'wc_epo_add_cart_item_data_single',
				[
					'mode'                             => 'builder',
					'cssclass'                         => $this->element['class'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $value,
					'post_name'                        => $this->attribute,
					'display'                          => THEMECOMPLETE_EPO_ORDER()->display_meta_value( $value, 1 ),
					'price'                            => $_price,
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( 1 ),
					'quantity'                         => 1,
					'quantity_selector'                => '',
					'file'                             => isset( $upload ) && isset( $upload['file'] ) ? $upload : '',
				],
				$this
			);
		}

		return false;
	}

	/**
	 * Add field data to cart (fees single)
	 *
	 * @return false|array<mixed>
	 * @since 1.0
	 */
	public function add_cart_item_data_cart_fees_single() {
		$files = $_FILES; // phpcs:ignore WordPress.Security.NonceVerification

		$can_be_added = false;
		$posted_check = false;
		if ( isset( $this->post_data[ $this->attribute ] ) && '' !== $this->post_data[ $this->attribute ] ) {
			if ( is_array( $this->post_data[ $this->attribute ] ) ) {
				if ( isset( $this->post_data[ $this->attribute ][ $this->key_id ] ) && '' !== $this->post_data[ $this->attribute ][ $this->key_id ] ) {
					$posted_check = true;
				}
			} else {
				$posted_check = true;
			}
		}
		if ( $posted_check ) {
			$value = $this->post_data[ $this->attribute ];
			if ( is_array( $value ) && isset( $value[ $this->key_id ] ) ) {
				$value = $value[ $this->key_id ];
				if ( is_array( $value ) && isset( $value[ $this->keyvalue_id ] ) ) {
					$value = $value[ $this->keyvalue_id ];
				}
			}
			$can_be_added = true;
		} elseif ( ! empty( $files[ $this->attribute ] ) && ! empty( $files[ $this->attribute ]['name'] ) ) {
			$upload = THEMECOMPLETE_EPO()->upload_file( $files[ $this->attribute ], $this->key_id, $this->keyvalue_id );
			if ( false !== $upload ) {
				if ( empty( $upload['error'] ) && ! empty( $upload['file'] ) ) {
					$value = wc_clean( $upload['url'] );
					if ( empty( $upload['tc'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_success_message' ) ) {
						wc_add_notice( esc_html__( 'Upload successful', 'woocommerce-tm-extra-product-options' ), 'success' );
					}
					$can_be_added = true;

				} else {
					wc_add_notice( $upload['error'], 'error' );
				}
			}
		}

		if ( $can_be_added ) {
			if ( isset( $value ) ) {
				$value = THEMECOMPLETE_EPO_HELPER()->to_ssl( $value );
			}
			if ( ! isset( $value ) ) {
				$value = '';
			}
			$_price = THEMECOMPLETE_EPO()->calculate_price( $this->post_data, $this->element, $this->key, $this->attribute, 1, $this->key_id, $this->keyvalue_id, $this->per_product_pricing, $this->cpf_product_price, $this->variation_id );
			if ( empty( $this->key ) ) {
				$_price = 0;
			}
			return apply_filters(
				'wc_epo_add_cart_item_data_cart_fees_single',
				[
					'mode'                             => 'builder',
					'cssclass'                         => $this->element['class'],
					'include_tax_for_fee_price_type'   => $this->element['include_tax_for_fee_price_type'],
					'tax_class_for_fee_price_type'     => $this->element['tax_class_for_fee_price_type'],
					'hidelabelincart'                  => $this->element['hide_element_label_in_cart'],
					'hidevalueincart'                  => $this->element['hide_element_value_in_cart'],
					'hidelabelinorder'                 => $this->element['hide_element_label_in_order'],
					'hidevalueinorder'                 => $this->element['hide_element_value_in_order'],
					'shippingmethodsenable'            => $this->element['shipping_methods_enable'],
					'shippingmethodsenablelogicrules'  => $this->element['shipping_methods_enable_logicrules'],
					'shippingmethodsdisable'           => $this->element['shipping_methods_disable'],
					'shippingmethodsdisablelogicrules' => $this->element['shipping_methods_disable_logicrules'],
					'element'                          => $this->order_saved_element,
					'name'                             => $this->element['label'],
					'value'                            => $value,
					'post_name'                        => $this->attribute,
					'display'                          => THEMECOMPLETE_EPO_ORDER()->display_meta_value( $value, 0 ),
					'price'                            => THEMECOMPLETE_EPO_CART()->calculate_fee_price( $_price, $this->product_id, $this->element ),
					'section'                          => $this->element['uniqid'],
					'section_label'                    => $this->element['label'],
					'percentcurrenttotal'              => isset( $this->post_data[ $this->attribute . '_hidden' ] ) ? 1 : 0,
					'fixedcurrenttotal'                => isset( $this->post_data[ $this->attribute . '_hiddenfixed' ] ) ? 1 : 0,
					'currencies'                       => isset( $this->element['currencies'] ) ? $this->element['currencies'] : [],
					'price_per_currency'               => $this->fill_currencies( 1 ),
					'quantity'                         => 1,
					'quantity_selector'                => '',
					'cart_fees'                        => 'single',
					'file'                             => isset( $upload ) && isset( $upload['file'] ) ? $upload : '',
				],
				$this
			);
		}

		return false;
	}
}
includes/fields/class-themecomplete-epo-fields-template.php000064400000003413150755142450020136 0ustar00<?php
/**
 * Template Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Template Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_template extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {

		$current_builder = $element['builder'];

		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			$id_for_meta              = $args['product_id'];
			$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $args['product_id'] );
			if ( ! $wpml_is_original_product ) {
				$id_for_meta = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $args['product_id'] ) );
			}

			$builder = themecomplete_get_post_meta( $id_for_meta, 'tm_meta', true );

			if ( ! $current_builder ) {

				if ( ! isset( $builder['tmfbuilder'] ) ) {
					$builder['tmfbuilder'] = [];
				}
				$current_builder = $builder['tmfbuilder'];

			}
		}

		$variations_disabled = is_array( $current_builder ) && isset( $current_builder['variations_disabled'] ) ? $current_builder['variations_disabled'] : '';
		$display             = [
			'builder'                    => $current_builder,
			'variation_section_disabled' => $variations_disabled,
		];

		return apply_filters( 'wc_epo_display_field_variations', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {
		return [
			'passed'  => true,
			'message' => false,
		];
	}
}
includes/fields/class-themecomplete-epo-fields-time.php000064400000012657150755142450017273 0ustar00<?php
/**
 * Time Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 * phpcs:disable PEAR.NamingConventions.ValidClassName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Time Field class
 *
 * @package Extra Product Options/Fields
 * @version 6.0
 */
class THEMECOMPLETE_EPO_FIELDS_time extends THEMECOMPLETE_EPO_FIELDS {

	/**
	 * Display field array
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function display_field( $element = [], $args = [] ) {
		$tm_epo_global_datepicker_theme    = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_theme' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_theme' ) : $this->get_value( $element, 'theme', 'epo' );
		$tm_epo_global_datepicker_size     = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_size' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_size' ) : $this->get_value( $element, 'theme_size', 'medium' );
		$tm_epo_global_datepicker_position = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_position' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_datepicker_position' ) : $this->get_value( $element, 'theme_position', 'normal' );

		$button_type = ! empty( $element['button_type'] ) ? $element['button_type'] : 'system';

		$custom_time_format = $this->get_value_no_empty( $element, 'custom_time_format', '' );
		$time_format        = $this->get_value_no_empty( $element, 'time_format', 'HH:mm' );
		if ( ! is_string( $time_format ) ) {
			$time_format = 'HH:mm';
		}
		$time_placeholder = $time_format;
		$time_mask        = $time_format;
		if ( '' !== $custom_time_format ) {
			$time_mask = $custom_time_format;
		}
		$time_mask = str_replace( 'H', '0', $time_mask );
		$time_mask = str_replace( 'h', '0', $time_mask );
		$time_mask = str_replace( 'm', '0', $time_mask );
		$time_mask = str_replace( 'M', '0', $time_mask );
		$time_mask = str_replace( 's', '0', $time_mask );
		$time_mask = str_replace( 'S', '0', $time_mask );
		$time_mask = str_replace( 't', 'S', $time_mask );
		$time_mask = str_replace( 'T', 'S', $time_mask );

		if ( ! is_string( $time_mask ) ) {
			$time_mask = '00:00';
		}

		if ( apply_filters( 'wc_epo_display_rtl', is_rtl() ) ) {
			$time_mask = strrev( $time_mask );
		}

		$input_type   = 'text';
		$button_style = ' tm-epo-timepicker';
		if ( 'system' === $button_type ) {
			$input_type   = 'time';
			$button_style = ' tm-epo-system-timepicker';
		}

		$class_label = '';
		if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' ) === 'yes' ) {
			$class_label = ' fullwidth';
		}

		$display = [
			'get_default_value'   => $this->get_default_value( $element, $args, false ),
			'textbeforeprice'     => $this->get_value( $element, 'text_before_price', '' ),
			'textafterprice'      => $this->get_value( $element, 'text_after_price', '' ),
			'hide_amount'         => $this->get_value( $element, 'hide_amount', '' ),
			'min_time'            => $this->get_value( $element, 'min_time', '' ),
			'max_time'            => $this->get_value( $element, 'max_time', '' ),
			'translation_hour'    => $this->get_value_no_empty( $element, 'translation_hour', '' ),
			'translation_minute'  => $this->get_value_no_empty( $element, 'translation_minute', '' ),
			'translation_second'  => $this->get_value_no_empty( $element, 'translation_second', '' ),
			'quantity'            => $this->get_value( $element, 'quantity', '' ),
			'time_format'         => $time_format,
			'custom_time_format'  => $custom_time_format,
			'time_theme'          => $tm_epo_global_datepicker_theme,
			'time_theme_size'     => $tm_epo_global_datepicker_size,
			'time_theme_position' => $tm_epo_global_datepicker_position,
			'time_placeholder'    => $time_placeholder,
			'time_mask'           => $time_mask,
			'input_type'          => $input_type,
			'button_style'        => $button_style,
			'class_label'         => $class_label,
		];

		return apply_filters( 'wc_epo_display_field_time', $display, $this, $element, $args );
	}

	/**
	 * Field validation
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function validate() {

		$passed  = true;
		$message = [];

		$quantity_once = false;
		$min_quantity  = isset( $this->element['quantity_min'] ) ? intval( $this->element['quantity_min'] ) : 0;
		if ( apply_filters( 'wc_epo_field_min_quantity_greater_than_zero', true ) && $min_quantity < 0 ) {
			$min_quantity = 0;
		}
		foreach ( $this->field_names as $attribute ) {
			$attribute_quantity = $attribute . '_quantity';
			if ( ! $quantity_once && isset( $this->epo_post_fields[ $attribute ] ) && '' !== $this->epo_post_fields[ $attribute ] && isset( $this->epo_post_fields[ $attribute_quantity ] ) && ! ( intval( array_sum( (array) $this->epo_post_fields[ $attribute_quantity ] ) ) >= $min_quantity ) ) {
				$passed        = false;
				$quantity_once = true;
				/* translators: %1 element label %2 quantity value. */
				$message[] = sprintf( esc_html__( 'The quantity for "%1$s" must be greater than %2$s', 'woocommerce-tm-extra-product-options' ), $this->element['label'], $min_quantity );
			}

			if ( $this->element['required'] ) {
				if ( ! isset( $this->epo_post_fields[ $attribute ] ) || '' === $this->epo_post_fields[ $attribute ] ) {
					$passed    = false;
					$message[] = 'required';
					break;
				}
			}
		}

		return [
			'passed'  => $passed,
			'message' => $message,
		];
	}
}
includes/functions/index.php000064400000000126150755142450012211 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/functions/epo-functions.php000064400000041524150755142450013702 0ustar00<?php
/**
 * Extra Product Options functions
 *
 * @package Extra Product Options/Functions
 * @version 6.4
 * phpcs:disable WordPress.NamingConventions.ValidFunctionName
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility.
 *
 * @return THEMECOMPLETE_EPO_COMPATIBILITY_Base
 */
function THEMECOMPLETE_EPO_COMPATIBILITY() {
	return THEMECOMPLETE_EPO_COMPATIBILITY_Base::instance();
}

/**
 * HTML functions.
 *
 * @return THEMECOMPLETE_EPO_HTML_Base
 */
function THEMECOMPLETE_EPO_HTML() {
	return THEMECOMPLETE_EPO_HTML_Base::instance();
}

/**
 * HELPER functions.
 *
 * @return THEMECOMPLETE_EPO_HELPER_Base
 */
function THEMECOMPLETE_EPO_HELPER() {
	return THEMECOMPLETE_EPO_HELPER_Base::instance();
}

/**
 * WPML functions.
 *
 * @return THEMECOMPLETE_EPO_WPML_Base
 */
function THEMECOMPLETE_EPO_WPML() {
	return THEMECOMPLETE_EPO_WPML_Base::instance();
}

/**
 * LICENSE functions.
 *
 * @return THEMECOMPLETE_EPO_UPDATE_Licenser
 */
function THEMECOMPLETE_EPO_LICENSE() {
	return THEMECOMPLETE_EPO_UPDATE_Licenser::instance();
}

/**
 * UPDATE functions.
 *
 * @return THEMECOMPLETE_EPO_UPDATE_Updater
 */
function THEMECOMPLETE_EPO_UPDATER() {
	return THEMECOMPLETE_EPO_UPDATE_Updater::instance();
}

/**
 * Plugin health check.
 *
 * @return THEMECOMPLETE_EPO_CHECK_Base
 */
function THEMECOMPLETE_EPO_CHECK() {
	return THEMECOMPLETE_EPO_CHECK_Base::instance();
}

/**
 * Field builder.
 *
 * @return THEMECOMPLETE_EPO_BUILDER_Base
 */
function THEMECOMPLETE_EPO_BUILDER() {
	return THEMECOMPLETE_EPO_BUILDER_Base::instance();
}

/**
 * Admin Field builder.
 *
 * @return THEMECOMPLETE_EPO_ADMIN_BUILDER_Base
 */
function THEMECOMPLETE_EPO_ADMIN_BUILDER() {
	return THEMECOMPLETE_EPO_ADMIN_BUILDER_Base::instance();
}

/**
 * Main plugin interface.
 *
 * @return THEMECOMPLETE_Extra_Product_Options
 */
function THEMECOMPLETE_EPO() {
	return THEMECOMPLETE_Extra_Product_Options::instance();
}

/**
 * Main Display.
 *
 * @return THEMECOMPLETE_EPO_Display
 */
function THEMECOMPLETE_EPO_DISPLAY() {
	return THEMECOMPLETE_EPO_Display::instance();
}

/**
 * Cart Functionality.
 *
 * @return THEMECOMPLETE_EPO_Cart
 */
function THEMECOMPLETE_EPO_CART() {
	return THEMECOMPLETE_EPO_Cart::instance();
}

/**
 * Order Functionality.
 *
 * @return THEMECOMPLETE_EPO_Order
 */
function THEMECOMPLETE_EPO_ORDER() {
	return THEMECOMPLETE_EPO_Order::instance();
}

/**
 * Associated products Functionality.
 *
 * @return THEMECOMPLETE_EPO_Associated_Products
 */
function THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS() {
	return THEMECOMPLETE_EPO_Associated_Products::instance();
}

/**
 * Main Scripts.
 *
 * @return THEMECOMPLETE_EPO_Scripts
 */
function THEMECOMPLETE_EPO_SCRIPTS() {
	return THEMECOMPLETE_EPO_Scripts::instance();
}

/**
 * Globals Admin Interface.
 *
 * @return THEMECOMPLETE_EPO_ADMIN_Global_Base
 */
function THEMECOMPLETE_EPO_ADMIN_GLOBAL() {
	return THEMECOMPLETE_EPO_ADMIN_Global_Base::instance();
}

/**
 * Admin Interface.
 *
 * @return THEMECOMPLETE_EPO_Admin_Base
 */
function THEMECOMPLETE_EPO_ADMIN() {
	return THEMECOMPLETE_EPO_Admin_Base::instance();
}

/**
 * Admin Lookup Table Interface.
 *
 * @return THEMECOMPLETE_EPO_Admin_LookupTable_Base
 */
function THEMECOMPLETE_EPO_ADMIN_LOOKUPTABLE() {
	return THEMECOMPLETE_EPO_Admin_LookupTable_Base::instance();
}

/**
 * Settings Interface.
 *
 * @return THEMECOMPLETE_EPO_SETTINGS_Base
 */
function THEMECOMPLETE_EPO_SETTINGS() {
	return THEMECOMPLETE_EPO_SETTINGS_Base::instance();
}

/**
 * API helper Interface.
 *
 * @return THEMECOMPLETE_EPO_API_Base
 */
function THEMECOMPLETE_EPO_API() {
	return THEMECOMPLETE_EPO_API_Base::instance();
}

/**
 * Conditional Logic Interface.
 *
 * @return THEMECOMPLETE_EPO_Conditional_Logic_Base
 */
function THEMECOMPLETE_EPO_CONDITIONAL_LOGIC() {
	return THEMECOMPLETE_EPO_Conditional_Logic_Base::instance();
}

/**
 * Actions Interface.
 *
 * @return THEMECOMPLETE_EPO_Actions_Base
 */
function THEMECOMPLETE_EPO_ACTIONS() {
	return THEMECOMPLETE_EPO_Actions_Base::instance();
}

/**
 * Data Store Interface.
 *
 * @return THEMECOMPLETE_EPO_Data_Store_Base
 */
function THEMECOMPLETE_EPO_DATA_STORE() {
	return THEMECOMPLETE_EPO_Data_Store_Base::instance();
}

if ( ! function_exists( 'themecomplete_convert_local_numbers' ) ) {
	/**
	 * Convert local decimal separator to PHP dot
	 *
	 * @param string|null $input Number.
	 *
	 * @return mixed|string
	 */
	function themecomplete_convert_local_numbers( $input = '' ) {
		if ( is_null( $input ) ) {
			$input = '';
		}

		$locale   = localeconv();
		$decimals = [ wc_get_price_decimal_separator(), $locale['decimal_point'], $locale['mon_decimal_point'] ];

		// Trim string.
		$input = trim( $input );

		// Remove locale from string.
		foreach ( $decimals as $decimal ) {
			if ( '.' !== $decimal && '' !== $decimal ) {
				if ( is_string( $input ) ) {
					$input = preg_replace_callback(
						'~if\(.*?\)(*SKIP)(*F)|lookuptable\(.*?\)(*SKIP)(*F)|min\(.*?\)(*SKIP)(*F)|max\(.*?\)(*SKIP)(*F)|{[^{}]*}(*SKIP)(*F)|(?<!\bif\s\()(?<!\d\.)(?<!\d)\d+\\' . $decimal . '\d+(?!\.)(?!\d*\.)(?![^\(]*?\))~',
						function ( $m ) use ( $decimal ) {
							return str_replace( $decimal, '.', $m[0] );
						},
						$input
					);
				}
			}
		}

		if ( is_string( $input ) ) {
			// Trim invalid start/end characters.
			$input = rtrim( ltrim( $input, "\t\n\r\0\x0B+*/" ), "\t\n\r\0\x0B+-*/" );
		}

		return $input;
	}
}

if ( ! function_exists( 'themecomplete_woocommerce_check' ) ) {
	/**
	 * Check if WooCommerce is active
	 *
	 * @return boolean
	 */
	function themecomplete_woocommerce_check() {
		return ! ( THEMECOMPLETE_EPO_CHECK()->tc_needs_wc_db_update() ) && THEMECOMPLETE_EPO_CHECK()->themecomplete_woocommerce_check_only();
	}
}

if ( ! function_exists( 'themecomplete_woocommerce_subscriptions_check' ) ) {
	/**
	 * Check if Subscriptions is active
	 *
	 * @return boolean
	 */
	function themecomplete_woocommerce_subscriptions_check() {
		$active_plugins = (array) get_option( 'active_plugins', [] );
		if ( is_multisite() ) {
			$active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', [] ) );
		}

		return apply_filters( 'wc_epo_is_subscriptions_active', in_array( 'woocommerce-subscriptions/woocommerce-subscriptions.php', $active_plugins, true ) || array_key_exists( 'woocommerce-subscriptions/woocommerce-subscriptions.php', $active_plugins ) );
	}
}

if ( ! function_exists( 'themecomplete_get_roles' ) ) {
	/**
	 * Get available roles
	 *
	 * @param array<string> $disable Disable roles from showing.
	 * @return array<string>
	 */
	function themecomplete_get_roles( $disable = [] ) {
		$result = [];
		if ( ! in_array( '@everyone', $disable, true ) ) {
			$result['@everyone'] = esc_html__( 'Everyone', 'woocommerce-tm-extra-product-options' );
		}
		if ( ! in_array( '@loggedin', $disable, true ) ) {
			$result['@loggedin'] = esc_html__( 'Logged in users', 'woocommerce-tm-extra-product-options' );
		}
		global $wp_roles;
		if ( empty( $wp_roles ) ) {
			$all_roles = new WP_Roles();
		} else {
			$all_roles = $wp_roles;
		}
		$roles = $all_roles->roles;
		if ( $roles ) {
			foreach ( $roles as $role => $details ) {
				if ( ! in_array( $role, $disable, true ) ) {
					$name            = translate_user_role( $details['name'] );
					$result[ $role ] = $name;
				}
			}
		}

		return $result;
	}
}

if ( ! function_exists( 'themecomplete_price' ) ) {
	/**
	 * Format the price with a currency symbol
	 *
	 * @param mixed        $price the price.
	 * @param array<mixed> $args (default: []).
	 *
	 * @return string
	 */
	function themecomplete_price( $price, $args = [] ) {
		$args = apply_filters(
			'tc_price_args',
			wp_parse_args(
				$args,
				[
					'ex_tax_label'       => false,
					'currency'           => '',
					'decimal_separator'  => wc_get_price_decimal_separator(),
					'thousand_separator' => wc_get_price_thousand_separator(),
					'decimals'           => apply_filters( 'wc_epo_price_decimals', wc_get_price_decimals() ),
					'price_format'       => get_woocommerce_price_format(),
				]
			)
		);

		$original_price = $price;

		// Convert to float to avoid issues on PHP 8.
		$price = (float) $price;

		$unformatted_price = $price;
		$negative          = $price < 0;

		/**
		 * Filter raw price.
		 *
		 * @param float        $raw_price      Raw price.
		 * @param float|string $original_price Original price as float, or empty string. Since 5.0.0.
		 */
		$price = apply_filters( 'tc_raw_woocommerce_price', $negative ? $price * - 1 : $price, $original_price );

		/**
		 * Filter formatted price.
		 *
		 * @param float|string $formatted_price    Formatted price.
		 * @param float        $price              Unformatted price.
		 * @param integer      $decimals           Number of decimals.
		 * @param string       $decimal_separator  Decimal separator.
		 * @param string       $thousand_separator Thousand separator.
		 * @param float|string $original_price     Original price as float, or empty string. Since 5.0.0.
		 */
		$price = (string) apply_filters( 'formatted_woocommerce_price', number_format( $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] ), $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'], $original_price );

		if ( apply_filters( 'woocommerce_price_trim_zeros', false ) && $args['decimals'] > 0 ) {
			$price = wc_trim_zeros( $price );
		}

		$formatted_price = ( $negative ? '-' : '' ) . sprintf( $args['price_format'], '<span class="woocommerce-Price-currencySymbol">' . get_woocommerce_currency_symbol( $args['currency'] ) . '</span>', $price );
		$return          = '<span class="woocommerce-Price-amount amount"><bdi>' . $formatted_price . '</bdi></span>';

		if ( $args['ex_tax_label'] && wc_tax_enabled() ) {
			$return .= ' <small class="woocommerce-Price-taxLabel tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
		}

		/**
		 * Filters the string of price markup.
		 *
		 * @param string       $return            Price HTML markup.
		 * @param string       $price             Formatted price.
		 * @param array        $args              Pass on the args.
		 * @param float        $unformatted_price Price as float to allow plugins custom formatting. Since 3.2.0.
		 * @param float|string $original_price    Original price as float, or empty string. Since 5.0.0.
		 */
		return apply_filters( 'tc_price', $return, $price, $args, $unformatted_price, $original_price );
	}
}

if ( ! function_exists( 'themecomplete_get_tax_rate' ) ) {
	/**
	 * Get the tax rate of the given tax classes
	 *
	 * @param string $classes Tax class.
	 *
	 * @return float|integer
	 */
	function themecomplete_get_tax_rate( $classes ) {
		$tax_rate = 0;

		if ( class_exists( 'WC_Tax' ) && version_compare( get_option( 'woocommerce_version' ), '2.4', '>=' ) ) {
			$tax_rates = WC_Tax::get_rates( $classes );
			foreach ( $tax_rates as $key => $value ) {
				$tax_rate = $tax_rate + floatval( $value['rate'] );
			}
		}

		return $tax_rate;
	}
}

if ( ! function_exists( 'themecomplete_do_shortcode' ) ) {
	/**
	 * Search content for shortcodes and filter shortcodes through their hooks.
	 *
	 * If there are no shortcode tags defined, then the content will be returned
	 * without any filtering. This might cause issues when plugins are disabled but
	 * the shortcode will still show up in the post or content.
	 *
	 * @since 6.2
	 *
	 * @global array $shortcode_tags List of shortcode tags and their callback hooks.
	 *
	 * @param string  $content     Content to search for shortcodes.
	 * @param boolean $ignore_html When true, shortcodes inside HTML elements will be skipped.
	 *                            Default false.
	 * @return string Content with shortcodes filtered out.
	 */
	function themecomplete_do_shortcode( $content, $ignore_html = false ) {
		global $wp_embed;

		// The < character when used in math formulas conflicts with the
		// shortcode functionality and several cases so we use the following
		// workaround to fix it.
		$content = str_replace( '<', '<>THEMECOMPLETEDIDREPLACE', $content );

		// Disable acf ajax filter in order to get correct prices.
		add_filter( 'acf/ajax/shortcode_capability', '__return_false' );
		// Enable acf outside block content.
		add_filter( 'acf/shortcode/allow_in_block_themes_outside_content', '__return_true' );
		if ( $wp_embed ) {
			$content = do_shortcode( $wp_embed->run_shortcode( $content ), $ignore_html );
		} else {
			$content = do_shortcode( $content, $ignore_html );
		}
		remove_filter( 'acf/ajax/shortcode_capability', '__return_false' );
		remove_filter( 'acf/shortcode/allow_in_block_themes_outside_content', '__return_true' );

		$content = str_replace( '<>THEMECOMPLETEDIDREPLACE', '<', $content );

		return $content;
	}
}

/**
 * Convert a number to locale independent string
 * without E notation and without loosing precision.
 *
 * @param integer|float|double $number The number to convert.
 * @param integer              $scale This optional parameter is used to set the number of digits after the decimal place in the result.
 * @return string The locale independent converted number.
 */
function themecomplete_bcconv( $number, $scale = -1 ) {
	$append   = '';
	$decimals = $scale;
	if ( -1 === $decimals ) {
		$decimals = ini_get( 'precision' ) - floor( log10( abs( $number ) ) );
	}
	$decimals = (int) $decimals;
	if ( 0 > $decimals ) {
		$number  *= pow( 10, $decimals );
		$append   = str_repeat( '0', -$decimals );
		$decimals = 0;
	}
	return number_format( $number, $decimals, '.', '' ) . $append;
}

/**
 * Computes the factoral (x!).
 *
 * @param mixed   $fact The number to convert.
 * @param integer $scale This optional parameter is used to set the number of digits after the decimal place in the result.
 * @return string The factoral (x!).
 */
function themecomplete_bcfact( $fact, $scale = 100 ) {
	$result = 1;
	for ( $i = 1; $i <= $fact; $i++ ) {
		$result *= $i;
	}
	return themecomplete_bcconv( $result, $scale );
}

/**
 * Computes e^x, where e is Euler's constant.
 *
 * @param mixed   $x The number to e is raised to.
 * @param integer $iters The number of itterations to use.
 * @param integer $scale This optional parameter is used to set the number of digits after the decimal place in the result.
 * @return string The e^x.
 */
function themecomplete_bcexp( $x, $iters = 50, $scale = 100 ) {
	$res = bcadd( '1.0', (string) $x, $scale );
	for ( $i = 0; $i < $iters; $i++ ) {
		$res += bcdiv( bcpow( (string) $x, strval( $i + 2 ), $scale ), themecomplete_bcfact( ( $i + 2 ), $scale ), $scale );
	}
	return (string) $res;
}

/**
 * Computes ln(x).
 *
 * @param mixed   $x The number to get the ln(x).
 * @param integer $iters The number of itterations to use.
 * @param integer $scale This optional parameter is used to set the number of digits after the decimal place in the result.
 * @return string The ln(x).
 */
function themecomplete_bcln( $x, $iters = 50, $scale = 100 ) {
	$result = '0.0';
	for ( $i = 0; $i < $iters; $i++ ) {
		$pow      = bcadd( '1.0', bcmul( (string) $i, '2.0', $scale ), $scale );
		$mul      = bcdiv( '1.0', (string) $pow, $scale );
		$fraction = bcmul( $mul, bcpow( bcdiv( bcsub( (string) $x, '1.0', $scale ), bcadd( (string) $x, '1.0', $scale ), $scale ), strval( intval( $pow ) ), $scale ), $scale );
		$result   = bcadd( $fraction, $result, $scale );
	}
	$res = bcmul( '2.0', $result, $scale );
	return $res;
}

/**
 * Computes a^b, where a and b can have decimal digits, be negative and/or very large.
 * Also works for 0^0. Only able to calculate up to 10 digits. Quite slow.
 *
 * @param string  $a The base, as a string.
 * @param string  $b The exponent, as a string.
 * @param integer $iters The number of itterations to use.
 * @param integer $scale This optional parameter is used to set the number of digits after the decimal place in the result.
 * @return string The ln(x).
 */
function themecomplete_bcpow( $a, $b, $iters = 50, $scale = 100 ) {
	if ( ctype_digit( $b ) ) { // Check if $b is integer.
		return bcpow( (string) $a, (string) $b );
	}
	$ln = themecomplete_bcln( $a, $iters, $scale );
	return themecomplete_bcexp( bcmul( $ln, $b, $scale ), $iters, $scale );
}

/**
 * Sanitizes a hex color.
 *
 * Returns either '', a 3 or 6 digit hex color (with #), or nothing.
 * For sanitizing values without a #, see sanitize_hex_color_no_hash().
 *
 * @since 6.4
 *
 * @param string $color The hex color.
 * @return string
 */
function themecomplete_sanitize_hex_color( $color ) {
	$color = sanitize_hex_color( $color );
	if ( ! is_string( $color ) ) {
		$color = '';
	}
	return $color;
}

/**
 * Sanitizes a hex color without a hash. Use sanitize_hex_color() when possible.
 *
 * Saving hex colors without a hash puts the burden of adding the hash on the
 * UI, which makes it difficult to use or upgrade to other color types such as
 * rgba, hsl, rgb, and HTML color names.
 *
 * Returns either '', a 3 or 6 digit hex color (without a #), or null.
 *
 * @since 6.4
 *
 * @param string $color The hex color without a hash.
 * @return string
 */
function themecomplete_sanitize_hex_color_no_hash( $color ) {
	$color = sanitize_hex_color_no_hash( $color );
	if ( ! is_string( $color ) ) {
		$color = '';
	}
	return $color;
}
includes/functions/compatibility-functions.php000064400000051500150755142450015763 0ustar00<?php
/**
 * Compatibility functions
 *
 * These functions provide an interface in order to
 * get correct results for functions that are missing
 * or work differently accross various WooCommerce version.
 *
 * @package Extra Product Options/Functions
 * @version 6.4.1
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'mb_basename' ) ) {
	/**
	 * Creates mb_basename functionality if missing.
	 *
	 * @param string $path The path to check.
	 * @return string
	 */
	function mb_basename( $path = '' ) {
		if ( preg_match( '@^.*[\\\\/]([^\\\\/]+)$@s', $path, $matches ) ) {
			return $matches[1];
		} elseif ( preg_match( '@^([^\\\\/]+)$@s', $path, $matches ) ) {
			return $matches[1];
		}
		return '';
	}
}

if ( ! function_exists( 'mb_strpos' ) ) {
	/**
	 * Find position of first occurrence of string in a string
	 *
	 * @param string  $haystack The string being checked.
	 * @param string  $needle The string to find in haystack.
	 * @param int     $offset The search offset. If it is not specified, 0 is used. A negative offset counts from the end of the string.
	 * @param ?string $encoding The encoding parameter is the character encoding. If it is omitted or null, the internal character encoding value will be used.
	 * @return int|false
	 */
	function mb_strpos( $haystack, $needle, $offset = 0, $encoding = null ) {
		if ( null === $encoding ) {
			$encoding = 'UTF-8';
		}

		$encoding = strtoupper( $encoding );

		if ( '8BIT' === $encoding || 'BINARY' === $encoding ) {
			$encoding = 'CP850';
		}

		if ( 'UTF8' === $encoding ) {
			$encoding = 'UTF-8';
		}

		if ( 'CP850' === $encoding || 'ASCII' === $encoding ) {
			return strpos( $haystack, $needle, $offset );
		}

		$needle = (string) $needle;
		if ( '' === $needle ) {
			if ( 80000 > \PHP_VERSION_ID ) {
				return false;
			}

			return 0;
		}

		return iconv_strpos( $haystack, $needle, $offset, $encoding );
	}
}

if ( ! function_exists( 'str_starts_with' ) ) {
	/**
	 * Checks if a string starts with a given substring
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle The substring to search for in the haystack.
	 * @return bool
	 */
	function str_starts_with( string $haystack, string $needle ) {
		return 0 === strlen( $needle ) || 0 === strpos( $haystack, $needle );
	}
}

if ( ! function_exists( 'str_ends_with' ) ) {
	/**
	 * Checks if a string ends with a given substring
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle The substring to search for in the haystack.
	 * @return bool
	 */
	function str_ends_with( string $haystack, string $needle ) {
		return 0 === strlen( $needle ) || substr( $haystack, -strlen( $needle ) ) === $needle;
	}
}

if ( ! function_exists( 'str_contains' ) ) {
	/**
	 * Determine if a string contains a given substring
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle The substring to search for in the haystack.
	 * @return bool
	 */
	function str_contains( $haystack, $needle ) {
		return 0 === strlen( $needle ) || false !== mb_strpos( $haystack, $needle );
	}
}

if ( ! function_exists( 'themecomplete_get_product_att' ) ) {

	/**
	 * Get product get_$att method
	 *
	 * @param WC_Product $product Product object.
	 * @param string     $att The product attribute.
	 * @return mixed
	 */
	function themecomplete_get_product_att( $product, $att = '' ) {
		if ( is_callable( [ $product, 'get_' . $att ] ) ) {
			return $product->{'get_' . $att}();
		} else {
			return $product->$att;
		}
	}
}

if ( ! function_exists( 'themecomplete_get_price_excluding_tax' ) ) {

	/**
	 * Get product price excluding tax
	 * For a given product, and optionally price/qty, work out the price with tax excluded, based on store settings.
	 *
	 * @param  WC_Product   $product WC_Product object.
	 * @param  array<mixed> $args    Optional arguments to pass product quantity and price.
	 *
	 * @return float|string
	 */
	function themecomplete_get_price_excluding_tax( $product, $args = [] ) {
		if ( function_exists( 'wc_get_price_excluding_tax' ) ) {
			if ( empty( $args['price'] ) ) {
				$args = wp_parse_args(
					$args,
					[
						'qty'   => '',
						'price' => '',
					]
				);
				$qty  = intval( $args['qty'] ) ? $args['qty'] : 1;

				return apply_filters( 'woocommerce_get_price_excluding_tax', 0, $qty, $product );
			}
			if ( (float) $args['price'] < 0 ) {
				$args['price'] = - $args['price'];

				return - floatval( wc_get_price_excluding_tax( $product, $args ) );
			}

			return wc_get_price_excluding_tax( $product, $args );
		}
		$args  = wp_parse_args(
			$args,
			[
				'qty'   => '',
				'price' => '',
			]
		);
		$price = $args['price'] ? $args['price'] : 0;
		$qty   = $args['qty'] ? $args['qty'] : 1;

		return $product->get_price_excluding_tax( $qty, $price );
	}
}

if ( ! function_exists( 'themecomplete_get_price_including_tax' ) ) {

	/**
	 * Get product price including tax
	 * For a given product, and optionally price/qty, work out the price with tax included, based on store settings.
	 *
	 * @param  WC_Product   $product WC_Product object.
	 * @param  array<mixed> $args    Optional arguments to pass product quantity and price.
	 *
	 * @return float|string
	 */
	function themecomplete_get_price_including_tax( $product, $args = [] ) {
		if ( function_exists( 'wc_get_price_including_tax' ) ) {
			if ( empty( $args['price'] ) ) {
				$args = wp_parse_args(
					$args,
					[
						'qty'   => '',
						'price' => '',
					]
				);
				$qty  = intval( $args['qty'] ) ? $args['qty'] : 1;

				return apply_filters( 'woocommerce_get_price_including_tax', 0, $qty, $product );
			}
			if ( (float) $args['price'] < 0 ) {
				$args['price'] = - $args['price'];

				return - floatval( wc_get_price_including_tax( $product, $args ) );
			}

			return wc_get_price_including_tax( $product, $args );
		}
		$args  = wp_parse_args(
			$args,
			[
				'qty'   => '',
				'price' => '',
			]
		);
		$price = $args['price'] ? $args['price'] : 0;
		$qty   = $args['qty'] ? $args['qty'] : 1;

		return $product->get_price_including_tax( $qty, $price );
	}
}

if ( ! function_exists( 'themecomplete_get_product_type' ) ) {

	/**
	 * Get product type
	 *
	 * @param mixed $product Product object.
	 * @return mixed
	 */
	function themecomplete_get_product_type( $product = null ) {
		if ( is_object( $product ) ) {
			if ( is_callable( [ $product, 'get_type' ] ) ) {
				return $product->get_type();
			} elseif ( property_exists( $product, 'product_type' ) ) {
				return $product->product_type;
			}
		}

		return false;
	}
}

if ( ! function_exists( 'themecomplete_get_id' ) ) {

	/**
	 * Get product ID
	 *
	 * @param mixed $product Product object.
	 * @return integer
	 */
	function themecomplete_get_id( $product ) {
		if ( $product instanceof WC_Product && is_callable( [ $product, 'get_id' ] ) && is_callable( [ $product, 'get_parent_id' ] ) ) {
			if ( 'variation' === themecomplete_get_product_type( $product ) ) {
				$id = $product->get_parent_id();
				if ( ! $id ) {
					$id = 0;
				}
				return $id;
			}
			$id = $product->get_id();
			if ( ! $id ) {
				$id = 0;
			}
			return $product->get_id();
		}
		if ( is_object( $product ) && property_exists( $product, 'id' ) ) {
			$id = $product->id;
			if ( ! $id ) {
				$id = 0;
			}
			return $product->id;
		}

		return 0;
	}
}

if ( ! function_exists( 'themecomplete_get_variation_id' ) ) {

	/**
	 * Get variation ID
	 *
	 * @param mixed $product Product object.
	 * @return integer
	 */
	function themecomplete_get_variation_id( $product ) {
		if ( $product instanceof WC_Product && is_callable( [ $product, 'get_id' ] ) ) {
			return $product->get_id();
		}

		return $product->variation_id;
	}
}

if ( ! function_exists( 'themecomplete_get_tax_class' ) ) {

	/**
	 * Get product tax class
	 *
	 * @param mixed $product Product object.
	 * @param mixed $context view, edit, or unfiltered.
	 * @return string
	 */
	function themecomplete_get_tax_class( $product, $context = false ) {
		if ( $product instanceof WC_Product && is_callable( [ $product, 'get_tax_class' ] ) ) {
			if ( false !== $context ) {
				return $product->get_tax_class( $context );
			} else {
				return $product->get_tax_class();
			}
		}

		return $product->tax_class;
	}
}

if ( ! function_exists( 'themecomplete_get_woocommerce_currency' ) ) {

	/**
	 * Get WooCommerce currency
	 *
	 * @return string
	 */
	function themecomplete_get_woocommerce_currency() {
		$currency = get_woocommerce_currency();
		if ( class_exists( 'WooCommerce_All_in_One_Currency_Converter_Main' ) ) {
			global $woocommerce_all_in_one_currency_converter;
			$currency = $woocommerce_all_in_one_currency_converter->settings->session_currency;
		}

		return $currency;
	}
}

if ( ! function_exists( 'themecomplete_maybe_unserialize' ) ) {
	/**
	 * UnSerialize String Fixer
	 * https://stackoverflow.com/questions/3148712/regex-code-to-fix-corrupt-serialized-php-data
	 *
	 * @param mixed $serialized_string The string to unserialize.
	 *
	 * @return mixed
	 */
	function themecomplete_maybe_unserialize( $serialized_string = '' ) {
		// at first, check if "fixing" is really needed at all. After that, security checkup.
		$unserialized_string = maybe_unserialize( $serialized_string );
		if ( false === $unserialized_string && preg_match( '/^[aOs]:/', $serialized_string ) ) {
			$serialized_string = preg_replace_callback(
				'/s\:(\d+)\:\"(.*?)\";/s',
				function ( $matches ) {
					return 's:' . strlen( $matches[2] ) . ':"' . $matches[2] . '";';
				},
				$serialized_string
			);

			$unserialized_string = maybe_unserialize( $serialized_string );
		}
		return $unserialized_string;
	}
}

if ( ! function_exists( 'themecomplete_get_post_meta' ) ) {

	/**
	 * Get post meta
	 *
	 * @param mixed   $post_id The id of the post to search.
	 * @param string  $meta_key The meta key to retrieve.
	 * @param boolean $single Whether to return a single value.
	 *
	 * @return mixed
	 */
	function themecomplete_get_post_meta( $post_id, $meta_key = '', $single = false ) {
		$meta = false;

		if ( $post_id instanceof WC_Product && ! str_starts_with( $meta_key, '_' ) ) {
			return $post_id->get_meta( $meta_key, $single );
		} elseif ( $post_id instanceof WP_Post || ( is_object( $post_id ) && isset( $post_id->ID ) && isset( $post_id->post_type ) && 'product' !== $post_id->post_type ) ) {
			$meta = get_post_meta( $post_id->ID, $meta_key, $single );

			if ( false === $meta ) {
				$meta = get_post_meta( $post_id->ID );
				if ( is_array( $meta ) && isset( $meta[ $meta_key ] ) ) {
					$meta = $meta[ $meta_key ];
					if ( $single && isset( $meta[0] ) ) {
						$meta = $meta[0];
					}
				} else {
					$meta = false;
				}
			}
		} elseif ( did_action( 'woocommerce_init' ) && function_exists( 'wc_get_product' ) && is_numeric( $post_id ) ) {
			$post_id = absint( $post_id );
			$product = wc_get_product( $post_id );
			if ( is_object( $product ) && ! str_starts_with( $meta_key, '_' ) ) {
				$meta = $product->get_meta( $meta_key, $single );
			} else {
				$meta = get_post_meta( $post_id, $meta_key, $single );
			}
			if ( false === $meta ) {
				$meta = get_post_meta( $post_id );
				if ( is_array( $meta ) && isset( $meta[ $meta_key ] ) ) {
					$meta = $meta[ $meta_key ];
					if ( $single && isset( $meta[0] ) ) {
						$meta = $meta[0];
					}
				} else {
					$meta = false;
				}
			}
		} else {
			$meta = get_post_meta( $post_id, $meta_key, $single );
		}
		// needed in some rare occassions where WordPress doesn't unserialize the data.
		if ( $single ) {
			$meta = themecomplete_maybe_unserialize( $meta );
		}

		return $meta;
	}
}

if ( ! function_exists( 'themecomplete_update_post_meta' ) ) {

	/**
	 * Updates a post meta field based on the given post ID.
	 *
	 * @param mixed  $post_id    Post ID.
	 * @param string $meta_key   Metadata key.
	 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.
	 * @param mixed  $prev_value Optional. Previous value to check before updating.
	 *                            If specified, only update existing metadata entries with
	 *                            this value. Otherwise, update all entries. Default empty.
	 * @return integer|boolean Meta ID if the key didn't exist, true on successful update,
	 *                  false on failure or if the value passed to the function
	 *                  is the same as the one that is already in the database.
	 */
	function themecomplete_update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) {
		if ( is_numeric( $post_id ) ) {
			$post_id = absint( $post_id );
			$product = wc_get_product( $post_id );
			if ( is_object( $product ) ) {
				$product->update_meta_data( $meta_key, $meta_value );
				$product->save_meta_data();

				return true;
			} else {
				return update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );
			}
		}

		return false;
	}
}

if ( ! function_exists( 'themecomplete_delete_post_meta' ) ) {

	/**
	 * Deletes a post meta field for the given post ID.
	 *
	 * @param mixed  $post_id    Post ID.
	 * @param string $meta_key   Metadata name.
	 * @param mixed  $meta_value Optional. Metadata value. If provided,
	 *                            rows will only be removed that match the value.
	 *                            Must be serializable if non-scalar. Default empty.
	 * @return boolean True on success, false on failure.
	 */
	function themecomplete_delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {
		if ( is_numeric( $post_id ) ) {
			$post_id = absint( $post_id );
			$product = wc_get_product( $post_id );
			if ( is_object( $product ) ) {
				$product->delete_meta_data( $meta_key );
				$product->save_meta_data();

				return true;
			} else {
				return delete_post_meta( $post_id, $meta_key, $meta_value );
			}
		}

		return false;
	}
}

if ( ! function_exists( 'themecomplete_add_post_meta' ) ) {

	/**
	 * Adds a meta field to the given post.
	 *
	 * @param mixed   $post_id    Post ID.
	 * @param string  $meta_key   Metadata name.
	 * @param mixed   $meta_value Metadata value. Must be serializable if non-scalar.
	 * @param boolean $unique     Optional. Whether the same key should not be added.
	 *                            Default false.
	 * @return integer|boolean Meta ID or true on success, false on failure.
	 */
	function themecomplete_add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ) {
		if ( is_numeric( $post_id ) ) {
			$post_id = absint( $post_id );
			$product = wc_get_product( $post_id );
			if ( is_object( $product ) ) {
				$product->add_meta_data( $meta_key, $meta_value, $unique );
				$product->save_meta_data();

				return true;
			} else {
				return add_post_meta( $post_id, $meta_key, $meta_value, $unique );
			}
		}

		return false;
	}
}

if ( ! function_exists( 'themecomplete_save_post_meta' ) ) {

	/**
	 * Save meta data
	 *
	 * @param integer $post_id The post id.
	 * @param mixed   $new_data The new meta data.
	 * @param mixed   $old_data The old meta data.
	 * @param string  $meta_name The meta name.
	 * @since 6.1
	 *
	 * @return integer|boolean Meta ID if the key didn't exist, true on successful update,
	 *                  false on failure or if the value passed to the function
	 *                  is the same as the one that is already in the database.
	 */
	function themecomplete_save_post_meta( $post_id = 0, $new_data = false, $old_data = false, $meta_name = '' ) {
		$save = false;
		if ( empty( $old_data ) && '' === $old_data ) {
			$save = themecomplete_add_post_meta( $post_id, $meta_name, $new_data, true );
			if ( ! $save ) {
				$save = themecomplete_update_post_meta( $post_id, $meta_name, $new_data, $old_data );
			}
		} elseif ( false === $new_data || ( is_array( $new_data ) && ! $new_data ) ) {
			$save = themecomplete_delete_post_meta( $post_id, $meta_name );
		} elseif ( $new_data !== $old_data ) {
			$save = themecomplete_update_post_meta( $post_id, $meta_name, $new_data, $old_data );
		}

		return $save;
	}
}

if ( ! function_exists( 'themecomplete_get_attributes' ) ) {

	/**
	 * Get product attributes
	 *
	 * @param mixed $post_id Post ID.
	 * @return mixed
	 */
	function themecomplete_get_attributes( $post_id ) {
		$product = false;
		if ( is_numeric( $post_id ) ) {
			$product = wc_get_product( $post_id );
		} elseif ( is_object( $post_id ) ) {
			$product = $post_id;
		}

		if ( is_object( $product ) && is_callable( [ $product, 'get_attributes' ] ) ) {
			$attributes = $product->get_attributes();
		} else {
			$attributes = themecomplete_maybe_unserialize( themecomplete_get_post_meta( $post_id, '_product_attributes', true ) );
		}

		return $attributes;
	}
}

if ( ! function_exists( 'themecomplete_order_get_att' ) ) {

	/**
	 * Get order get_$att method
	 *
	 * @param WC_Order $order Order object.
	 * @param string   $att Method name.
	 *
	 * @return mixed
	 */
	function themecomplete_order_get_att( $order, $att ) {
		$ret        = null;
		$att_method = 'get_' . $att;

		if ( is_object( $order ) && is_callable( [ $order, $att_method ] ) ) {
			$ret = $order->$att_method();
		} else {
			$ret = $order->$att;
		}

		return $ret;
	}
}

if ( ! function_exists( 'themecomplete_get_product_from_item' ) ) {

	/**
	 * Get product from item
	 *
	 * @param mixed $item Order Item.
	 * @param mixed $order Order object.
	 *
	 * @return WC_Product|false
	 */
	function themecomplete_get_product_from_item( $item, $order = false ) {
		$product = false;
		if ( is_object( $item ) && is_callable( [ $item, 'get_product' ] ) ) {
			$product = $item->get_product();
		} elseif ( $order && is_object( $order ) && is_callable( [ $order, 'get_product_from_item' ] ) ) {
			$product = $order->get_product_from_item( $item );
		}

		return $product;
	}
}

if ( ! function_exists( 'themecomplete_order_get_price_excluding_tax' ) ) {

	/**
	 * Get product price in order with tax excluded
	 *
	 * @param WC_Order     $order Order object.
	 * @param integer      $item_id Item ID.
	 * @param array<mixed> $args Array of args to pass.
	 * @return float
	 */
	function themecomplete_order_get_price_excluding_tax( $order, $item_id, $args = [] ) {
		$args = wp_parse_args(
			$args,
			[
				'qty'   => '',
				'price' => '',
			]
		);

		$price = (float) $args['price'];
		$qty   = (float) $args['qty'];

		$prices_include_tax = themecomplete_order_get_att( $order, 'prices_include_tax' );
		$order_items        = $order->get_items();
		$order_taxes        = $order->get_taxes();

		if ( ! isset( $order_items[ $item_id ] ) ) {
			return $price;
		}

		$product = themecomplete_get_product_from_item( $order_items[ $item_id ], $order );

		if ( ! $product ) {
			return $price;
		}

		$tax_data  = wc_tax_enabled() ? themecomplete_maybe_unserialize( isset( $order_items[ $item_id ]['line_tax_data'] ) ? $order_items[ $item_id ]['line_tax_data'] : '' ) : false;
		$tax_price = 0;
		if ( ! empty( $tax_data ) && $prices_include_tax ) {
			$tax_based_on = get_option( 'woocommerce_tax_based_on' );

			$default  = '';
			$country  = '';
			$state    = '';
			$postcode = '';
			$city     = '';
			if ( 'billing' === $tax_based_on ) {
				$country  = $order->get_billing_country();
				$state    = $order->get_billing_state();
				$postcode = $order->get_billing_postcode();
				$city     = $order->get_billing_city();
			} elseif ( 'shipping' === $tax_based_on ) {
				$country  = $order->get_shipping_country();
				$state    = $order->get_shipping_state();
				$postcode = $order->get_shipping_postcode();
				$city     = $order->get_shipping_city();
			}
			// Default to base.
			if ( 'base' === $tax_based_on || empty( $country ) ) {
				$default  = wc_get_base_location();
				$country  = $default['country'];
				$state    = $default['state'];
				$postcode = '';
				$city     = '';
			}
			$tax_class      = $order_items[ $item_id ]['tax_class'];
			$tax_rates      = WC_Tax::find_rates(
				[
					'country'   => $country,
					'state'     => $state,
					'postcode'  => $postcode,
					'city'      => $city,
					'tax_class' => $tax_class,
				]
			);
			$epo_line_taxes = WC_Tax::calc_tax( $price, $tax_rates, $prices_include_tax );

			foreach ( $order_taxes as $tax_item ) {
				$tax_item_id = $tax_item['rate_id'];
				if ( $tax_item instanceof WC_Order_Item_Tax ) {
					$tax_item_id = $tax_item->get_rate_id();
				}
				if ( isset( $epo_line_taxes[ $tax_item_id ] ) ) {
					$tax_price = $tax_price + $epo_line_taxes[ $tax_item_id ];
				}
			}
		}

		if ( $product->is_taxable() && $prices_include_tax ) {
			$price = ( $price - $tax_price ) * $qty;
		} else {
			$price = $price * $qty;
		}

		return apply_filters( 'wc_epo_order_get_price_excluding_tax', $price, $order, $item_id, $args );
	}
}

if ( ! function_exists( 'themecomplete_get_order_item_meta' ) ) {

	/**
	 * WooCommerce Order Item Meta API - Get term meta.
	 *
	 * @param integer $item_id Item ID.
	 * @param string  $key     Meta key.
	 * @param boolean $single  Whether to return a single value. (default: true).
	 *
	 * @throws Exception      When `WC_Data_Store::load` validation fails.
	 * @return mixed
	 */
	function themecomplete_get_order_item_meta( $item_id, $key, $single = true ) {
		if ( function_exists( 'wc_get_order_item_meta' ) ) {
			return wc_get_order_item_meta( $item_id, $key, $single );
		}

		return [];
	}
}
includes/index.php000064400000000126150755142450010201 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/classes/class-themecomplete-epo-conditional-logic-base.php000064400000151146150755142450021563 0ustar00<?php
/**
 * Extra Product Options Conditional Logic class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Conditional Logic class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_Conditional_Logic_Base {

	/**
	 * Cache for the option fields
	 *
	 * @var array<mixed>
	 */
	private $fields = [];

	/**
	 * Visible elements cache
	 *
	 * @var array<mixed>
	 */
	private $visible_elements = [];

	/**
	 * Current element that is being checked if it is visible
	 *
	 * @var array<mixed>
	 */
	private $current_element_to_check = [];

	/**
	 * Current field that is being checked if it is visible
	 *
	 * @var array<mixed>
	 */
	private $current_field_to_check = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Conditional_Logic_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Conditional_Logic_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
	}

	/**
	 * Converts the conditional logic rule to the new format.
	 *
	 * @param array<mixed> $rules The rules array.
	 * @return array<mixed>
	 * @since 6.4
	 */
	public function convert_rules( $rules = [] ) {
		$json_encode_rules = wp_json_encode( $rules );
		if ( false !== $json_encode_rules ) {
			$rules = json_decode( $json_encode_rules, true );
			if ( isset( $rules['what'] ) ) {
				if ( 'all' === $rules['what'] ) {
					$rules['rules'] = [ $rules['rules'] ];
				} elseif ( 'any' === $rules['what'] ) {
					$rules['rules'] = array_reduce(
						$rules['rules'],
						function ( $accumulator, $elrule ) {
							$accumulator[] = [ $elrule ];
							return $accumulator;
						},
						[]
					);
				}
				unset( $rules['what'] );
			}
		}
		return $rules;
	}

	/**
	 * Converts the conditional logic rule to the new format.
	 *
	 * @param array<mixed>   $rules The rules array.
	 * @param array<mixed>   $section_ids The sections array.
	 * @param string|boolean $variation_section_id The id of the variation section if it exists.
	 * @return array<mixed>
	 *
	 * @since 6.4
	 */
	public function transform_rules( $rules = [], $section_ids = [], $variation_section_id = false ) {

		unset( $rules['element'] );
		if ( isset( $rules['rules'] ) && is_array( $rules['rules'] ) ) {
			foreach ( $rules['rules'] as $jkey => $jrules ) {
				if ( $jrules ) {
					if ( ! is_array( $jrules ) ) {
						$jrules = [ $jrules ];
					}
					foreach ( $jrules as $jjkey => $jjrules ) {
						if ( isset( $jjrules['section'] ) && isset( $jjrules['element'] ) ) {
							if ( $variation_section_id === $jjrules['section'] && '0' === (string) $jjrules['element'] ) {
								$rules['rules'][ $jkey ][ $jjkey ] = [
									'element'  => $variation_section_id,
									'operator' => $jjrules['operator'],
									'value'    => $jjrules['value'],
								];
							} elseif ( isset( $section_ids[ $jjrules['section'] ][ $jjrules['element'] ] ) ) {
								$rules['rules'][ $jkey ][ $jjkey ] = [
									'element'  => $section_ids[ $jjrules['section'] ][ $jjrules['element'] ],
									'operator' => $jjrules['operator'],
									'value'    => $jjrules['value'],
								];
							}
						} else {
							unset( $rules['rules'][ $jkey ][ $jjkey ] );
						}
					}
				}
			}
		}

		return $rules;
	}

	/**
	 * Check if the logic is valid
	 *
	 * @param array<mixed> $logicrules The logic data.
	 * @return boolean
	 * @since 6.4
	 */
	public function is_valid_logic( $logicrules = [] ) {

		if ( isset( $logicrules['toggle'] ) && ( isset( $logicrules['element'] ) || isset( $logicrules['section'] ) ) && ! empty( $logicrules['rules'] ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Generate the option fields from a product ID
	 *
	 * @param integer $product_id The product id.
	 *
	 * @return array<mixed>|false
	 */
	public function generate_fields( $product_id = 0 ) {
		$post_id = get_the_ID();

		if ( $product_id && $product_id !== $post_id ) {
			$post_id = $product_id;
		}

		$post_id = absint( $post_id );

		if ( ! empty( $this->fields[ $post_id ] ) ) {
			return $this->fields[ $post_id ];
		}

		$fields = false;

		$epos = THEMECOMPLETE_EPO()->get_product_tm_epos( $post_id, '', false, true );

		if ( is_array( $epos ) && ( ! empty( $epos['global'] ) || ! empty( $epos['local'] ) ) && ! empty( $epos['price'] ) ) {
			$input = $epos['price'];

			$variation_section_id = $epos['variation_section_id'];

			$fields = [
				'init'                            => false,
				'section_ids'                     => [],
				'variation_section_id'            => false,
				'required'                        => [],
				'required_no_logic'               => [],
				'required_with_logic'             => [],
				'required_with_section_logic'     => [],
				'not_required'                    => [],
				'not_required_no_logic'           => [],
				'not_required_with_logic'         => [],
				'not_required_with_section_logic' => [],
			];

			$section_ids = array_reduce(
				$input,
				function ( $carry, $value ) {
					if ( ! isset( $carry[ $value['section_uniqueid'] ] ) ) {
						$carry[ $value['section_uniqueid'] ] = [];
					}
					$carry[ $value['section_uniqueid'] ][ $value['element'] ] = $value['uniqueid'];
					return $carry;
				},
				[]
			);

			foreach ( $input as $key => $data ) {
				$has_logic         = json_decode( $data['logic'] );
				$has_section_logic = json_decode( $data['section_logic'] );

				$logicrules = '';
				if ( $has_logic ) {
					$logicrules = $this->convert_rules( (array) json_decode( $data['logicrules'] ) );
					$has_logic  = $this->is_valid_logic( $logicrules );
				}
				$data['logicrules'] = $logicrules;

				$section_logicrules = '';
				if ( $has_section_logic ) {
					$section_logicrules = $this->convert_rules( (array) json_decode( $data['section_logicrules'] ) );
					$has_section_logic  = $this->is_valid_logic( $section_logicrules );
				}
				$data['section_logicrules'] = $section_logicrules;

				$price_mapping = array_map(
					function ( $number ) {
						return floatval( $number[0] );
					},
					$data['prices']
				);
				// Check is the $price_mapping is an associative array and if not convert it to one.
				$price_mapping = ! empty( $price_mapping ) ? ( ( count( array_filter( array_keys( $price_mapping ), 'is_string' ) ) > 0 ) ? $price_mapping : array_combine( [ '' ], $price_mapping ) ) : null;

				$price_type = array_map(
					function ( $number ) {
						return $number[0];
					},
					$data['price_type']
				);

				$value = [
					'logicrules'         => $has_logic && is_array( $data['logicrules'] ) ? $this->transform_rules( $data['logicrules'], $section_ids, $variation_section_id ) : null,
					'section_logicrules' => $has_section_logic && is_array( $data['section_logicrules'] ) ? $this->transform_rules( $data['section_logicrules'], $section_ids, $variation_section_id ) : null,
					'price_mapping'      => $price_mapping,
					'options'            => ! empty( $data['options'] ) ? $data['options'] : null,
					'price_type'         => $price_type,
					'type'               => $data['type'],
				];

				if ( '1' === (string) $data['required'] ) {
					$fields['required'][ $data['uniqueid'] ] = $value;
					if ( ! $has_logic && ! $has_section_logic ) {
						$fields['required_no_logic'][ $data['uniqueid'] ] = $value;
					}
					if ( $has_logic ) {
						$fields['required_with_logic'][ $data['uniqueid'] ] = $value;
					}
					if ( $has_section_logic ) {
						$fields['required_with_section_logic'][ $data['uniqueid'] ] = $value;
					}
				} else {
					$fields['not_required'][ $data['uniqueid'] ] = $value;
					if ( ! $has_logic && ! $has_section_logic ) {
						$fields['not_required_no_logic'][ $data['uniqueid'] ] = $value;
					}
					if ( $has_logic ) {
						$fields['not_required_with_logic'][ $data['uniqueid'] ] = $value;
					}
					if ( $has_section_logic ) {
						$fields['not_required_with_section_logic'][ $data['uniqueid'] ] = $value;
					}
				}
			}

			$fields['variation_section_id'] = $variation_section_id;
			$fields['section_ids']          = $section_ids;
			$fields['init']                 = true;

			$this->fields[ $post_id ] = $fields;
		}

		return $fields;
	}

	/**
	 * Check if the logic is visible in the given combination
	 *
	 * @param string             $logic_type The logic type to check (logicrules or section_logicrules).
	 * @param string             $field_name The field name.
	 * @param array<mixed>       $combination The current fields combination.
	 * @param array<mixed>       $fields The fields array.
	 * @param array<mixed>|false $consider_visible A special array to fetch the current value so that the field would be visible.
	 * @param string|boolean     $variation_section_id The id of the variation section if it exists.
	 * @param integer|boolean    $current_variation The current variation id.
	 *
	 * @return array<mixed>|boolean
	 */
	public function is_logic_visible( $logic_type = 'logicrules', $field_name = '', $combination = [], $fields = [], $consider_visible = false, $variation_section_id = false, $current_variation = false ) {
		// This should only happen if the field_name is the variation id.
		if ( ! isset( $fields[ $field_name ] ) ) {
			return false;
		}

		$field_data        = $fields[ $field_name ];
		$visible_condition = $field_data[ $logic_type ];

		if ( null === $visible_condition ) {
			return true; // Field is always visible.
		}

		$toggle_action    = $visible_condition['toggle'];
		$condition_groups = $visible_condition['rules'];

		$group_visible = false;
		foreach ( $condition_groups as $conditions_key => $conditions ) {
			$conditions_met = false;

			foreach ( $conditions as $condition_key => $condition ) {
				$element  = $condition['element'];
				$operator = $condition['operator'];
				$value    = $condition['value'];

				if ( $element === $field_name ) {
					$conditions_met = false;
					break; // Stop checking conditions for this group.
				}

				if ( $element === $variation_section_id ) {
					$element_value = [ intval( $current_variation ) ];
				} else {
					// Check if dependent element is visible.
					if ( ! $this->is_field_visible( $element, $combination, $fields, false, $variation_section_id, $current_variation ) ) {
						$conditions_met = false;
						break; // Stop checking conditions for this group.
					}

					// This should only happen if the field_name is the variation id.
					if ( ! isset( $combination[ $element ] ) ) {
						$conditions_met = false;
						break; // Stop checking conditions for this group.
					}

					if ( is_array( $combination[ $element ] ) ) {
						$element_value = $combination[ $element ];
					} else {
						$element_value = [ $combination[ $element ] ];
					}
				}

				foreach ( $element_value as $single_value_key => $single_element_value ) {
					if ( $element === $variation_section_id ) {
						$single_value = $single_element_value;
					} elseif ( null !== $fields[ $element ]['options'] ) {
						$single_value = $fields[ $element ]['options'][ $single_element_value ];
					} else {
						$single_value = '';
					}
					if ( false !== $consider_visible ) {
						if ( isset( $fields[ $element ]['type'] ) && in_array( $fields[ $element ]['type'], [ 'textfield', 'textarea', 'color', 'date', 'time', 'range' ], true ) ) {
							$single_value = $consider_visible[ $conditions_key ][ $condition_key ];
						}
					}
					$single_value   = (string) $single_value;
					$value          = (string) $value;
					$conditions_met = $this->tm_check_match( $single_value, $value, $operator );
					if ( $conditions_met ) {
						break;
					}
				}
			}
			if ( $conditions_met ) {
				$group_visible = true;
				break;
			}
		}

		return ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible );
	}

	/**
	 * Check if the field is visible in the given combination
	 *
	 * @param string             $field_name The field name.
	 * @param array<mixed>       $combination The current fields combination.
	 * @param array<mixed>       $fields The fields array.
	 * @param array<mixed>|false $consider_visible A special array to fetch the current value so that the field would be visible.
	 * @param string|boolean     $variation_section_id The id of the variation section if it exists.
	 * @param integer|boolean    $current_variation The current variation id.
	 *
	 * @return array<mixed>|boolean
	 */
	public function is_field_visible( $field_name = '', $combination = [], $fields = [], $consider_visible = false, $variation_section_id = false, $current_variation = false ) {
		if ( in_array( $field_name, $this->current_field_to_check, true ) ) {
			return false;
		}

		$id = uniqid();

		$this->current_field_to_check[ $id ] = $field_name;

		// This should only happen if the field_name is the variation id.
		if ( ! isset( $fields[ $field_name ] ) ) {
			unset( $this->current_field_to_check[ $id ] );
			return false;
		}

		$field_data = $fields[ $field_name ];

		$visible_condition_element = $field_data['logicrules'];
		$visible_condition_section = $field_data['section_logicrules'];

		if ( null === $visible_condition_element && null === $visible_condition_section ) {
			unset( $this->current_field_to_check[ $id ] );
			return true; // Field is always visible.
		}

		$logicrules         = $this->is_logic_visible( 'logicrules', $field_name, $combination, $fields, $consider_visible, $variation_section_id, $current_variation );
		$section_logicrules = $this->is_logic_visible( 'section_logicrules', $field_name, $combination, $fields, $consider_visible, $variation_section_id, $current_variation );
		unset( $this->current_field_to_check[ $id ] );
		return $logicrules && $section_logicrules;
	}

	/**
	 * Calculate all combinations
	 *
	 * @param array<mixed> $fields The fields array.
	 *
	 * @return array<mixed>
	 */
	public function max_calculate_all_combinations( $fields = [] ) {
		$field_names         = array_keys( $fields );
		$total_fields        = count( $field_names );
		$combinations        = [ [] ];
		$pre_combinations    = [ [] ];
		$result_combinations = [];
		$max_combinations    = intval( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_max_combinations' ) );
		$max_combinations    = $max_combinations > 0 ? $max_combinations : 1;

		for ( $index = 0; $index < $total_fields; $index++ ) {
			$field_name       = $field_names[ $index ];
			$field_data       = $fields[ $field_name ];
			$choices          = null === $field_data['price_mapping'] ? [ '' ] : array_keys( $field_data['price_mapping'] );
			$is_mutilple      = isset( $field_data['type'] ) && ( 'checkbox' === $field_data['type'] || 'selectmultiple' === $field_data['type'] );
			$new_combinations = [];
			if ( ! $is_mutilple && 1 < count( $choices ) ) {
				$combinations_count = count( $combinations );
				if ( $max_combinations > $combinations_count ) {
					$comb_count = 0;
					foreach ( $combinations as $combination ) {
						foreach ( $choices as $choice ) {
							if ( $max_combinations <= $comb_count ) {
								break 2;
							}
							$new_combination    = $combination + [ $field_name => $choice ];
							$new_combinations[] = $new_combination;
							++$comb_count;
						}
					}
					$combinations = $new_combinations;
				}
			} else {
				foreach ( $pre_combinations as $combination ) {
					if ( $is_mutilple ) {
						// Generate combinations for checkbox fields.
						$new_combination = $combination;
						foreach ( $choices as $choice ) {
							if ( is_array( $new_combination ) && isset( $new_combination[ $field_name ] ) ) {
								$new_combination[ $field_name ][] = $choice;
							}
						}
						$new_combinations[] = $new_combination;
					} elseif ( 1 === count( $choices ) ) { // Generate combinations for non-checkbox fields.
						$new_combination    = $combination + [ $field_name => $choices[0] ];
						$new_combinations[] = $new_combination;
					}
				}
				$pre_combinations = $new_combinations;
			}
		}

		$combinations_count = isset( $combinations[0] ) ? count( $combinations[0] ) : 0;
		foreach ( $pre_combinations as $combination ) {
			$result_combination = $combination;
			for ( $index = count( $combination ) + $combinations_count; $index < $total_fields; $index++ ) {
				$field_name  = $field_names[ $index ];
				$is_mutilple = isset( $fields[ $field_name ]['type'] ) && ( 'checkbox' === $fields[ $field_name ]['type'] || 'selectmultiple' === $fields[ $field_name ]['type'] );
				if ( $is_mutilple ) {
					$result_combination[ $field_name ] = [];
				} else {
					$result_combination[ $field_name ] = null;
				}
			}
			$result_combinations[] = $result_combination;
		}

		$combinations = array_slice( $combinations, 0, $max_combinations );

		$result_combinations = [
			'base' => $pre_combinations[0],
			'var'  => $combinations,
		];
		return $result_combinations;
	}

	/**
	 * Generates all combinations for a given combination
	 * based on the field values
	 *
	 * @param array<mixed> $combination The current fields combination.
	 *
	 * @return array<mixed>
	 */
	public function generate_combinations( $combination = [] ) {

		// Convert values to arrays if they are not already.
		$combination = array_map(
			function ( $value ) {
				return is_array( $value ) ? $value : [ $value ];
			},
			$combination
		);

		// Prepare the data for combination generation.
		$combination_values = array_values( $combination );

		$combinations = [ [] ];
		foreach ( $combination_values as $array ) {
			$temp = [];
			foreach ( $combinations as $result_item ) {
				foreach ( $array as $array_item ) {
					$temp[] = array_merge( $result_item, [ $array_item ] );
				}
			}
			$combinations = $temp;
		}

		// Combine keys and combinations to get the desired format.
		$result = [];
		foreach ( $combinations as $combo ) {
			$result[] = array_combine( array_keys( $combination ), $combo );
			if ( count( $result ) > 100 ) {
				break;
			}
		}

		return $result;
	}

	/**
	 * Calculate the minimum price of the given combination
	 *
	 * @param array<mixed>   $fields The fields array.
	 * @param array<mixed>   $combination The current fields combination.
	 * @param array<mixed>   $variation_ids The variations ids.
	 * @param string|boolean $variation_section_id The id of the variation section if it exists.
	 *
	 * @return float|array<mixed>
	 */
	public function calculate_minimum_price_for_combination( $fields = [], $combination = [], $variation_ids = [], $variation_section_id = false ) {

		$prices = [];
		if ( false === $variation_section_id || empty( $variation_ids ) ) {
			$variation_ids = [ 0 ];
		}

		foreach ( $variation_ids as $current_variation ) {
			$visible_combination = $combination;
			foreach ( $fields as $field_name => $field_data ) {
				if ( ! $this->is_field_visible( $field_name, $visible_combination, $fields, false, $variation_section_id, $current_variation ) ) {
					unset( $visible_combination[ $field_name ] );
				}
			}

			$combinations = $this->generate_combinations( $visible_combination );
			$total_price  = PHP_INT_MAX;

			foreach ( $combinations as $comb ) {
				$min_price = 0;
				foreach ( $comb as $field_name => $selected_choice ) {
					$price_mapping = $fields[ $field_name ]['price_mapping'];
					if ( isset( $price_mapping[ $selected_choice ] ) && $this->is_field_visible( $field_name, $comb, $fields, false, $variation_section_id, $current_variation ) ) {
						$min_price += floatval( $price_mapping[ $selected_choice ] );
					}
				}

				$min_price   = floatval( $min_price );
				$total_price = min( $min_price, $total_price );
			}

			if ( PHP_INT_MAX === $total_price ) {
				$total_price = 0;
			}

			$prices[ $current_variation ] = $total_price;
		}

		$total_price = $prices;
		if ( 1 === count( $prices ) && 0 === key( $prices ) ) {
			$total_price = $prices[0];
		}

		return is_array( $total_price ) ? $total_price : floatval( $total_price );
	}

	/**
	 * Calculate the minimum price for the given fields
	 *
	 * @param array<mixed>    $fields The fields array from generate_fields.
	 * @param boolean|integer $product_id The product id if variation prices are included.
	 * @param string          $minkey The key 'min' or 'minall'. The minall does not include the field required status.
	 *
	 * @return float|array<mixed>
	 */
	public function calculate_minimum_price( $fields = [], $product_id = false, $minkey = 'min' ) {
		$input = $fields['required'];
		if ( 'minall' === $minkey ) {
			$input = array_merge( $fields['required'], $fields['not_required'] );
		}

		$variation_section_id = $fields['variation_section_id'];
		if ( ! $variation_section_id ) {
			$product_id = false;
		}

		$all_combinations = $this->max_calculate_all_combinations( $input );

		$variation_ids = [];
		$product       = wc_get_product( $product_id );
		if ( false !== $product ) {
			$product_type = themecomplete_get_product_type( $product );
			if ( false !== $product_id && 'variable' === $product_type ) {
				$variation_ids = $product->get_variation_prices( false ); // @phpstan-ignore-line
				$variation_ids = array_keys( $variation_ids['price'] );
			}
		}

		$min_price = PHP_INT_MAX;

		$base_combination = $all_combinations['base'];
		$var_combinations = $all_combinations['var'];
		foreach ( $var_combinations as $var_combination ) {
			$combination   = $base_combination + $var_combination;
			$current_price = $this->calculate_minimum_price_for_combination( $input, $combination, $variation_ids, $variation_section_id );
			if ( is_array( $current_price ) ) {
				if ( ! is_array( $min_price ) ) {
					$min_price = $current_price;
				} else {
					foreach ( $current_price as $key => $value ) {
						if ( isset( $min_price[ $key ] ) ) {
							$min_price[ $key ] = min( $value, $min_price[ $key ] );
						}
					}
				}
			} else {
				$min_price = min( $min_price, $current_price );
			}
		}
		if ( PHP_INT_MAX === $min_price ) {
			$min_price = 0;
		}

		return is_array( $min_price ) ? $min_price : floatval( $min_price );
	}

	/**
	 * Calculate the maximum price of the given combination
	 *
	 * @param array<mixed>   $fields The fields array.
	 * @param array<mixed>   $combination The current fields combination.
	 * @param array<mixed>   $variation_ids The variations ids.
	 * @param string|boolean $variation_section_id The id of the variation section if it exists.
	 *
	 * @return array<mixed>|float
	 */
	public function calculate_maximum_price_for_combination( $fields = [], $combination = [], $variation_ids = [], $variation_section_id = false ) {

		$prices = [];
		if ( false === $variation_section_id || empty( $variation_ids ) ) {
			$variation_ids = [ 0 ];
		}

		foreach ( $variation_ids as $current_variation ) {
			$textfield_dependent_fields = [];

			foreach ( $combination as $combination_field_name => $combination_value ) {
				$field_data        = $fields[ $combination_field_name ];
				$visible_condition = $field_data['logicrules'];
				if ( null !== $visible_condition ) {
					foreach ( $visible_condition['rules'] as $conditions_key => $conditions ) {
						foreach ( $conditions as $condition_key => $condition ) {
							$element = $condition['element'];
							if ( isset( $fields[ $element ] ) && isset( $fields[ $element ]['type'] ) && in_array( $fields[ $element ]['type'], [ 'textfield', 'textarea', 'color', 'date', 'time', 'range' ], true ) ) {
								$textfield_dependent_fields[ $combination_field_name ][ $conditions_key ][ $condition_key ] = $condition;
							}
						}
					}
				}
			}

			$dependent_fields = [];
			foreach ( $textfield_dependent_fields as $field_name => $rules ) {
				foreach ( $rules as $conditions_key => $conditions ) {
					foreach ( $conditions as $condition_key => $condition ) {
						switch ( $condition['operator'] ) {
							case 'is':
								$dependent_fields[ $field_name ][ $conditions_key ][ $condition_key ] = $condition['value'];
								break;
							case 'isnot':
								$dependent_fields[ $field_name ][ $conditions_key ][ $condition_key ] = strrev( $condition['value'] );
								break;
							case 'isempty':
								$dependent_fields[ $field_name ][ $conditions_key ][ $condition_key ] = '';
								break;
							case 'isnotempty':
								$dependent_fields[ $field_name ][ $conditions_key ][ $condition_key ] = uniqid( '10' );
								break;
						}
					}
				}
			}

			$visible_combination = $combination;
			foreach ( $fields as $field_name => $field_data ) {
				$consider_visible = isset( $dependent_fields[ $field_name ] ) ? $dependent_fields[ $field_name ] : false;
				if ( ! $this->is_field_visible( $field_name, $visible_combination, $fields, $consider_visible, $variation_section_id, $current_variation ) ) {
					unset( $visible_combination[ $field_name ] );
				}
			}

			$combinations = $this->generate_combinations( $visible_combination );
			$total_price  = 0;

			$prevented_choices = [];
			foreach ( $combinations as $comb_id => $comb ) {
				foreach ( $comb as $field_name => $selected_choice ) {
					$consider_visible = isset( $dependent_fields[ $field_name ] ) ? $dependent_fields[ $field_name ] : false;
					if ( ! $this->is_field_visible( $field_name, $comb, $fields, $consider_visible, $variation_section_id, $current_variation ) ) {
						$visible_conditions = [
							null !== $fields[ $field_name ]['logicrules'] ? $fields[ $field_name ]['logicrules'] : [],
							null !== $fields[ $field_name ]['section_logicrules'] ? $fields[ $field_name ]['section_logicrules'] : [],
						];
						foreach ( $visible_conditions as $visible_condition ) {
							if ( ! empty( $visible_condition ) ) {
								$toggle           = $visible_condition['toggle'];
								$condition_groups = $visible_condition['rules'];
								foreach ( $condition_groups as $conditions_key => $conditions ) {
									foreach ( $conditions as $condition_key => $condition ) {
										$element  = $condition['element'];
										$operator = $condition['operator'];
										$value    = rawurldecode( $condition['value'] );

										if ( ( 'show' === $toggle && 'isnot' === $operator ) || ( 'hide' === $toggle && 'is' === $operator ) ) {
											if ( isset( $comb[ $element ] ) ) {
												$prevented_choices[ $element ][ $value ] = $value;
											}
										}
									}
								}
							}
						}
					}
				}
			}

			foreach ( $combinations as $comb_id => $comb ) {
				$dependent_price = [];
				$max_price       = 0;
				foreach ( $comb as $field_name => $selected_choice ) {
					$consider_visible = isset( $dependent_fields[ $field_name ] ) ? $dependent_fields[ $field_name ] : false;
					if ( $this->is_field_visible( $field_name, $comb, $fields, $consider_visible, $variation_section_id, $current_variation ) ) {
						$price_mapping    = $fields[ $field_name ]['price_mapping'];
						$selected_choices = (array) $combination[ $field_name ];
						foreach ( $selected_choices as $selected_choice ) {
							$choice = isset( $fields[ $field_name ]['options'][ $selected_choice ] ) ? $fields[ $field_name ]['options'][ $selected_choice ] : '';
							if ( ! isset( $prevented_choices[ $field_name ][ $choice ] ) ) {
								if ( isset( $price_mapping[ $selected_choice ] ) ) {
									if ( false !== $consider_visible ) {
										foreach ( $consider_visible as $gkey => $group ) {
											foreach ( $group as $ckey => $condition ) {
												if ( isset( $price_mapping[ $selected_choice ] ) && null !== $fields[ $field_name ]['logicrules'] && isset( $fields[ $field_name ]['logicrules']['rules'] ) && isset( $fields[ $field_name ]['logicrules']['rules'][ $gkey ] ) && isset( $fields[ $field_name ]['logicrules']['rules'][ $gkey ][ $ckey ] ) ) {
													$dependent_price[ $fields[ $field_name ]['logicrules']['rules'][ $gkey ][ $ckey ]['element'] ][ $fields[ $field_name ]['logicrules']['rules'][ $gkey ][ $ckey ]['value'] ][ $field_name ][] = $price_mapping[ $selected_choice ];
												}
											}
										}
									} elseif ( isset( $price_mapping[ $selected_choice ] ) ) {
										$max_price += floatval( $price_mapping[ $selected_choice ] );
									}
								}
							}
						}
					}
				}

				$max_price = floatval( $max_price );
				foreach ( $dependent_price as $dependent_element => $dependent_element_data ) {
					foreach ( $dependent_element_data as $dependent_element_key => $dependent_element_value ) {
						if ( is_array( $dependent_price[ $dependent_element ][ $dependent_element_key ] ) && ! empty( $dependent_price[ $dependent_element ][ $dependent_element_key ] ) ) {
							$dependent_price[ $dependent_element ][ $dependent_element_key ] = array_reduce(
								$dependent_price[ $dependent_element ][ $dependent_element_key ],
								function ( $carry, $item ) {
									return $carry + array_sum( $item );
								},
								0
							);
						}
					}
				}

				$dependent_price = array_map(
					function ( $value ) {
						return max( $value );
					},
					$dependent_price
				);

				$max_price  += array_sum( $dependent_price );
				$total_price = max( $max_price, $total_price );
			}

			$prices[ $current_variation ] = $total_price;
		}

		$total_price = $prices;
		if ( 1 === count( $prices ) && 0 === key( $prices ) ) {
			$total_price = $prices[0];
		}

		return is_array( $total_price ) ? $total_price : floatval( $total_price );
	}

	/**
	 * Calculate the maximum price for the given fields
	 *
	 * @param array<mixed> $fields The fields array from generate_fields.
	 *
	 * @return float
	 */
	public function calculate_maximum_price( $fields ) {
		$input = array_merge( $fields['required'], $fields['not_required'] );

		$max_price = 0;

		foreach ( $input as $field ) {
			if ( isset( $field['price_mapping'] ) && is_array( $field['price_mapping'] ) ) {
				foreach ( $field['price_mapping'] as $price ) {
					$max_price += floatval( $price );
				}
			}
		}

		return floatval( $max_price );
	}

	/**
	 * Calculate the maximum price for the given fields
	 *
	 * @param array<mixed>    $fields The fields array from generate_fields.
	 * @param boolean|integer $product_id The product id if variation prices are included.
	 *
	 * @return float|array<mixed>
	 */
	public function calculate_real_maximum_price( $fields, $product_id = false ) {
		$input = array_merge( $fields['required'], $fields['not_required'] );

		$variation_section_id = $fields['variation_section_id'];
		if ( ! $variation_section_id ) {
			$product_id = false;
		}

		$all_combinations = $this->max_calculate_all_combinations( $input );

		$variation_ids = [];
		$product       = wc_get_product( $product_id );
		if ( false !== $product ) {
			$product_type = themecomplete_get_product_type( $product );
			if ( false !== $product_id && 'variable' === $product_type ) {
				$variation_ids = $product->get_variation_prices( false ); // @phpstan-ignore-line
				$variation_ids = array_keys( $variation_ids['price'] );
			}
		}

		$max_price = 0;

		$base_combination = $all_combinations['base'];
		$var_combinations = $all_combinations['var'];

		foreach ( $var_combinations as $var_combination ) {
			$combination   = $base_combination + $var_combination;
			$current_price = $this->calculate_maximum_price_for_combination( $input, $combination, $variation_ids, $variation_section_id );
			if ( is_array( $current_price ) ) {
				if ( ! is_array( $max_price ) ) {
					$max_price = $current_price;
				} else {
					foreach ( $current_price as $key => $value ) {
						if ( isset( $max_price[ $key ] ) ) {
							$max_price[ $key ] = max( $value, $max_price[ $key ] );
						}
					}
				}
			} else {
				$max_price = max( $max_price, $current_price );
			}
		}

		return is_array( $max_price ) ? $max_price : floatval( $max_price );
	}

	/**
	 * Conditional logic (checks if an element is visible)
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $section The section array.
	 * @param array<mixed> $sections The sections array.
	 * @param string       $form_prefix The form prefix.
	 * @return boolean
	 * @since 1.0
	 */
	public function is_visible( $element = [], $section = [], $sections = [], $form_prefix = '' ) {
		$id                                    = uniqid();
		$this->current_element_to_check[ $id ] = [];

		return $this->is_visible_do( $id, $element, $section, $sections, $form_prefix );
	}

	/**
	 * Conditional logic (checks if an element is visible)
	 *
	 * @param string       $id The index of the current element to check in the $this->current_element_to_check array.
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $section The section array.
	 * @param array<mixed> $sections The sections array.
	 * @param string       $form_prefix The form prefix.
	 * @return boolean
	 * @since 1.0
	 */
	private function is_visible_do( $id = '0', $element = [], $section = [], $sections = [], $form_prefix = '' ) {

		$is_element = false;
		$is_section = false;

		$array_prefix = $form_prefix;
		if ( '' === $form_prefix ) {
			$array_prefix = '_';
		}

		$uniqid = isset( $element['uniqid'] ) ? $element['uniqid'] : false;

		if ( ! $uniqid ) {
			$uniqid     = isset( $element['sections_uniqid'] ) ? $element['sections_uniqid'] : false;
			$is_section = true;
		} else {
			$is_element = true;
		}

		if ( ! $uniqid ) {
			return false;
		}
		if ( isset( $this->visible_elements[ $array_prefix ][ $uniqid ] ) ) {
			return $this->visible_elements[ $array_prefix ][ $uniqid ];
		}

		$logic = false;

		if ( $is_element ) {

			// Element.
			if ( ! $this->is_visible_do( $id, $section, [], $sections, $form_prefix ) ) {
				$this->visible_elements[ $array_prefix ][ $uniqid ] = false;
				return false;
			}
			if ( ! isset( $element['logic'] ) || empty( $element['logic'] ) ) {
				$this->visible_elements[ $array_prefix ][ $uniqid ] = true;
				return true;
			}
			$logic = (array) json_decode( $element['logicrules'] );
		} elseif ( $is_section ) { // @phpstan-ignore-line
			// Section.
			if ( ! isset( $element['sections_logic'] ) || empty( $element['sections_logic'] ) ) {
				$this->visible_elements[ $array_prefix ][ $uniqid ] = true;
				return true;
			}
			$logic = (array) json_decode( $element['sections_logicrules'] );
		} else {
			$this->visible_elements[ $array_prefix ][ $uniqid ] = true;
			return true;
		}

		$logic = $this->convert_rules( $logic );

		if ( $logic ) {

			$rule_toggle = $logic['toggle'];
			$matches     = [];
			$checked     = [];
			$show        = true;

			switch ( $rule_toggle ) {
				case 'show':
					$show = false;
					break;
				case 'hide':
					$show = true;
					break;
			}

			if ( ! isset( $this->current_element_to_check[ $id ] ) ) {
				$this->current_element_to_check[ $id ] = [];
			}

			if ( in_array( $uniqid, $this->current_element_to_check[ $id ], true ) ) {
				return true;
			}

			$this->current_element_to_check[ $id ][] = $uniqid;

			foreach ( $logic['rules'] as $key => $krules ) {
				$matches[ $key ] = 0;
				$checked[ $key ] = 0;
				if ( is_array( $krules ) ) {
					foreach ( $krules as $rule ) {
						$matches[ $key ] = $matches[ $key ] + 1;
						if ( $this->tm_check_field_match( $id, $rule, $sections, $form_prefix ) ) {
							$checked[ $key ] = $checked[ $key ] + 1;
						}
					}
				}
			}
			$this->current_element_to_check[ $id ] = [];

			foreach ( $matches as $im => $match ) {
				$checkim = intval( $checked [ $im ] );
				$match   = intval( $match );
				if ( $checkim > 0 && $match === $checkim ) {
					$show = ! $show;
					break;
				}
			}

			$this->visible_elements[ $array_prefix ][ $uniqid ] = $show;

			return $show;

		}

		$this->visible_elements[ $array_prefix ][ $uniqid ] = false;

		return false;
	}

	/**
	 * Conditional logic (checks element conditions)
	 *
	 * @param string       $id The index of the current element to check in the $this->current_element_to_check array.
	 * @param array<mixed> $rule The rule array.
	 * @param array<mixed> $sections The sections array.
	 * @param string       $form_prefix The form prefix.
	 * @return boolean
	 * @since 1.0
	 */
	public function tm_check_field_match( $id = '0', $rule = [], $sections = [], $form_prefix = '' ) {
		if ( empty( $rule ) || empty( $sections ) ) {
			return false;
		}

		$array_prefix = $form_prefix;
		if ( '' === $form_prefix ) {
			$array_prefix = '_';
		}

		$section_id = $rule['section'];
		$element_id = $rule['element'];
		$operator   = $rule['operator'];
		$value      = isset( $rule['value'] ) ? $rule['value'] : null;

		if ( (string) $section_id === (string) $element_id ) {
			return $this->tm_check_section_match( $element_id, $operator, $sections, $form_prefix );
		}
		if ( ! isset( $sections[ $section_id ] )
			|| ! isset( $sections[ $section_id ]['elements'] )
			|| ! isset( $sections[ $section_id ]['elements'][ $element_id ] )
			|| ! isset( $sections[ $section_id ]['elements'][ $element_id ]['type'] )
		) {
			return false;
		}

		// variations logic.
		if ( 'variations' === $sections[ $section_id ]['elements'][ $element_id ]['type'] ) {
			return $this->tm_variation_check_match( $form_prefix, $value, $operator );
		}

		if ( ! isset( $sections[ $section_id ]['elements'][ $element_id ]['name_inc'] ) ) {
			return false;
		}

		$element_array    = $sections[ $section_id ]['elements'][ $element_id ];
		$element_uniqueid = $element_array['uniqid'];

		if ( isset( $this->visible_elements[ $array_prefix ][ $element_uniqueid ] ) ) {
			if ( ! $this->visible_elements[ $array_prefix ][ $element_uniqueid ] ) {
				return false;
			}
		} elseif ( in_array( $element_uniqueid, $this->current_element_to_check[ $id ], true ) ) { // phpcs:ignore
			// Getting here means that two elements depend on each other
			// This is a logical error when creating the conditional logic in the builder.
		} elseif ( ! $this->is_visible_do( $id, $element_array, $sections[ $section_id ], $sections, $form_prefix ) ) {
			return false;
		}

		$element_to_check = $element_array['name_inc'];

		$element_type = $element_array['type'];
		$posted_value = null;

		if ( 'product' === $element_type ) {
			$element_type = 'select';
		}

		switch ( $element_type ) {
			case 'radio':
				$radio_checked_length = 0;
				$element_to_check     = array_unique( $element_to_check );

				// Element array contains the form_prefix so we don't append it again.
				$element_to_check = $element_to_check[0];

				if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$posted_value = wp_unslash( $_REQUEST[ $element_to_check ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					$posted_value = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $posted_value );
					if ( ! empty( $element_array['connector'] ) ) {
						if ( in_array( $posted_value, $element_array['options'], true ) ) {
							++$radio_checked_length;
						}
					} else {
						++$radio_checked_length;
					}
					$posted_value = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $posted_value, '_' );
				}
				if ( 'is' === $operator || 'isnot' === $operator ) {
					if ( 0 === (int) $radio_checked_length ) {
						return false;
					}
				} elseif ( 'isnotempty' === $operator ) {
					return $radio_checked_length > 0;
				} elseif ( 'isempty' === $operator ) {
					return 0 === (int) $radio_checked_length;
				}
				break;
			case 'checkbox':
				$checkbox_checked_length = 0;
				$ret                     = false;
				$element_to_check        = array_unique( $element_to_check );
				foreach ( $element_to_check as $key => $name_value ) {
					// Element array contains the form_prefix so we don't append it again.
					$element_to_check[ $key ] = $name_value;
					$posted_value             = null;
					if ( isset( $_REQUEST[ $element_to_check[ $key ] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						++$checkbox_checked_length;
						$posted_value = wp_unslash( $_REQUEST[ $element_to_check[ $key ] ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
						$posted_value = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $posted_value );
						$posted_value = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $posted_value, '_' );

						if ( $this->tm_check_match( $posted_value, $value, $operator ) ) {
							$ret = true;
						} elseif ( 'isnot' === $operator ) {
							$ret = false;
							break;
						}
					}
				}
				if ( 'is' === $operator || 'isnot' === $operator ) {
					if ( 0 === (int) $checkbox_checked_length ) {
						return false;
					}

					return $ret;
				} elseif ( 'isnotempty' === $operator ) {
					return $checkbox_checked_length > 0;
				} elseif ( 'isempty' === $operator ) {
					return 0 === (int) $checkbox_checked_length;
				}
				break;
			case 'selectmultiple':
				// Element array contains the form_prefix so we don't append it again.
				if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$posted_value = map_deep( wp_unslash( $_REQUEST[ $element_to_check ] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$val          = [];
					if ( is_array( $posted_value ) ) {
						foreach ( $posted_value as $copy ) {
							foreach ( $copy as $i => $option ) {
								$option    = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $option );
								$option    = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $option, '_' );
								$val[ $i ] = $option;
							}
						}
					}
					$posted_value = $val;
				}
				break;
			case 'select':
			case 'textarea':
			case 'textfield':
			case 'color':
			case 'range':
				// Element array contains the form_prefix so we don't append it again.
				if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$posted_value = wp_unslash( $_REQUEST[ $element_to_check ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					if ( 'select' === $element_type ) {
						$posted_value = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $posted_value );
						$posted_value = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $posted_value, '_' );
					}
				}
				break;
		}

		return $this->tm_check_match( $posted_value, $value, $operator );
	}

	/**
	 * Conditional logic (checks section conditions)
	 *
	 * @param string       $element_id The element id.
	 * @param string       $operator The logic operator.
	 * @param array<mixed> $sections The sections array.
	 * @param string       $form_prefix The form prefix.
	 * @return boolean
	 * @since 1.0
	 */
	public function tm_check_section_match( $element_id, $operator, $sections = [], $form_prefix = '' ) {
		$array_prefix = $form_prefix;
		if ( '' === $form_prefix ) {
			$array_prefix = '_';
		}

		if ( isset( $this->visible_elements[ $array_prefix ] ) && isset( $this->visible_elements[ $array_prefix ][ $element_id ] ) ) {

			if ( false === $this->visible_elements[ $array_prefix ][ $element_id ] ) {
				if ( 'isnotempty' === $operator ) {
					return false;
				} elseif ( 'isempty' === $operator ) {
					return true;
				}
			}
		}

		$all_checked = true;
		$section_id  = $element_id;
		if ( is_array( $sections ) && isset( $sections[ $section_id ] ) && isset( $sections[ $section_id ]['elements'] ) ) {
			foreach ( $sections[ $section_id ]['elements'] as $id => $element ) {
				if ( $this->is_visible_do( $id, $element, $sections[ $section_id ], $sections, $form_prefix ) ) {
					if ( ! isset( $sections[ $section_id ]['elements'][ $id ]['name_inc'] ) ) {
						continue;
					}
					$element_to_check = $sections[ $section_id ]['elements'][ $id ]['name_inc'];
					$element_type     = $sections[ $section_id ]['elements'][ $id ]['type'];

					/**
					 * The posted value
					 *
					 * @var mixed $posted_value
					 */
					$posted_value = null;

					if ( 'product' === $element_type ) {
						$element_type = 'select';
					}
					switch ( $element_type ) {
						case 'radio':
							$radio_checked_length = 0;
							$element_to_check     = array_unique( $element_to_check );

							// Element array contains the form_prefix so we don't append it again.
							$element_to_check = $element_to_check[0];

							if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								$_posted_value = wp_unslash( $_REQUEST[ $element_to_check ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
								$_posted_value = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $posted_value );

								$element_array = [];
								if ( isset( $sections[ $section_id ]['elements'][ $element_id ] ) ) {
									$element_array = $sections[ $section_id ]['elements'][ $element_id ];
								}
								if ( ! empty( $element_array['connector'] ) ) {
									if ( in_array( $posted_value, $element_array['options'], true ) ) {
										++$radio_checked_length;
									}
								} else {
									++$radio_checked_length;
								}
							}
							if ( 'isnotempty' === $operator ) {
								$all_checked = $all_checked && $radio_checked_length > 0;
								if ( $radio_checked_length > 0 ) {
									$posted_value = $radio_checked_length;
								}
							} elseif ( 'isempty' === $operator ) {
								$all_checked = $all_checked && 0 === (int) $radio_checked_length;
							}
							break;
						case 'checkbox':
							$checkbox_checked_length = 0;

							$element_to_check = array_unique( $element_to_check );
							foreach ( $element_to_check as $key => $name_value ) {
								$element_to_check[ $key ] = $name_value . $form_prefix;
								if ( isset( $_REQUEST[ $element_to_check[ $key ] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
									++$checkbox_checked_length;
								}
							}
							if ( 'isnotempty' === $operator ) {
								$all_checked = $all_checked && $checkbox_checked_length > 0;
								if ( $checkbox_checked_length > 0 ) {
									$posted_value = $checkbox_checked_length;
								}
							} elseif ( 'isempty' === $operator ) {
								$all_checked = $all_checked && 0 === (int) $checkbox_checked_length;
							}
							break;

						case 'selectmultiple':
							$element_to_check .= $form_prefix;
							if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								$posted_value = map_deep( wp_unslash( $_REQUEST[ $element_to_check ] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								$val          = [];
								if ( is_array( $posted_value ) ) {
									foreach ( $posted_value as $copy ) {
										foreach ( $copy as $i => $option ) {
											$option    = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $option );
											$option    = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $option, '_' );
											$val[ $i ] = $option;
										}
									}
								}
								$posted_value = $val;
							}
							break;
						default:
							$element_to_check .= $form_prefix;
							if ( isset( $_REQUEST[ $element_to_check ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								$posted_value = wp_unslash( $_REQUEST[ $element_to_check ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
								if ( 'select' === $element_type ) {
									$posted_value = THEMECOMPLETE_EPO_HELPER()->encode_uri_component( $posted_value );
									$posted_value = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $posted_value, '_' );
								}
							}
							break;
					}
					if ( is_array( $posted_value ) ) {
						$all_checked = $all_checked && THEMECOMPLETE_EPO_HELPER()->array_some(
							$posted_value,
							function ( $item ) use ( $operator ) {
								return $this->tm_check_match( $item, '', $operator );
							}
						);
					} else {
						$all_checked = $all_checked && $this->tm_check_match( $posted_value, '', $operator );
					}
				}
			}
		}

		return $all_checked;
	}

	/**
	 * Conditional logic (checks variation conditions)
	 *
	 * @param string $form_prefix The form prefix.
	 * @param string $value The value to check against.
	 * @param string $operator The logic operator.
	 * @return boolean
	 * @since 1.0
	 */
	public function tm_variation_check_match( $form_prefix, $value, $operator ) {
		$posted_value = $this->get_posted_variation_id( $form_prefix );
		return $this->tm_check_match( $posted_value, $value, $operator, true );
	}

	/**
	 * Conditional logic (checks conditions)
	 *
	 * @param mixed       $posted_value The posted value.
	 * @param string|null $value The value to check against.
	 * @param string      $operator The logic operator.
	 * @param boolean     $include_zero If zero value counts as empty.
	 * @return boolean
	 * @since 1.0
	 */
	public function tm_check_match( $posted_value, $value, $operator, $include_zero = false ) {
		if ( is_null( $posted_value ) ) {
			$posted_value = '';
		}
		if ( is_null( $value ) ) {
			$value = '';
		}
		if ( is_array( $posted_value ) ) {
			foreach ( $posted_value as $key => $value ) {
				$posted_value[ $key ] = rawurlencode( apply_filters( 'tm_translate', rawurldecode( $value ) ) );
			}
		} else {
			$posted_value = rawurlencode( apply_filters( 'tm_translate', rawurldecode( $posted_value ) ) );
		}

		$value = rawurlencode( apply_filters( 'tm_translate', rawurldecode( $value ) ) );

		switch ( $operator ) {
			case 'is':
				if ( is_array( $posted_value ) ) {
					return in_array( $value, $posted_value, true );
				}
				return ( null !== $posted_value && $value === $posted_value );
			case 'isnot':
				if ( is_array( $posted_value ) ) {
					return ! in_array( $value, $posted_value, true );
				}
				return ( null !== $posted_value && $value !== $posted_value );
			case 'isempty':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( $include_zero ) {
							if ( null !== $element && '' !== $element && '0' !== $element && 0 !== $element ) {
								return false;
							}
						}
						if ( null !== $element && '' !== $element ) {
							return false;
						}
					}
					return true;
				}
				if ( $include_zero ) {
					return ( ! ( ( null !== $posted_value && '' !== $posted_value && '0' !== $posted_value && 0 !== $posted_value ) ) );
				}
				return ( ! ( ( null !== $posted_value && '' !== $posted_value ) ) );
			case 'isnotempty':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( $include_zero ) {
							if ( ! ( null !== $element && '' !== $element && '0' !== $element && 0 !== $element ) ) {
								return false;
							}
						}
						if ( ! ( null !== $element && '' !== $element ) ) {
							return false;
						}
					}
					return true;
				}
				if ( $include_zero ) {
					return ( ( null !== $posted_value && '' !== $posted_value && '0' !== $posted_value && 0 !== $posted_value ) );
				}
				return ( ( null !== $posted_value && '' !== $posted_value ) );
			case 'startswith':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( str_starts_with( $element, $value ) ) {
							return true;
						}
					}
					return false;
				}
				return str_starts_with( $posted_value, $value );
			case 'endswith':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( str_ends_with( $element, $value ) ) {
							return true;
						}
					}
					return false;
				}
				return str_ends_with( $posted_value, $value );
			case 'greaterthan':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( ! ( floatval( $element ) > floatval( $value ) ) ) {
							return false;
						}
					}
					return true;
				}
				return floatval( $posted_value ) > floatval( $value );
			case 'lessthan':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( ! ( floatval( $element ) < floatval( $value ) ) ) {
							return false;
						}
					}
					return true;
				}
				return floatval( $posted_value ) < floatval( $value );
			case 'greaterthanequal':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( ! ( floatval( $element ) >= floatval( $value ) ) ) {
							return false;
						}
					}
					return true;
				}
				return floatval( $posted_value ) >= floatval( $value );
			case 'lessthanequal':
				if ( is_array( $posted_value ) ) {
					foreach ( $posted_value as $element ) {
						if ( ! ( floatval( $element ) <= floatval( $value ) ) ) {
							return false;
						}
					}
					return true;
				}
				return floatval( $posted_value ) <= floatval( $value );
		}

		return false;
	}

	/**
	 * Get posted variations id
	 *
	 * @param string $form_prefix The form prefix.
	 *
	 * @return mixed
	 */
	public function get_posted_variation_id( $form_prefix = '' ) {
		$variation_id = null;
		if ( isset( $_REQUEST[ 'variation_id' . $form_prefix ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$variation_id = wp_unslash( $_REQUEST[ 'variation_id' . $form_prefix ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		}

		return $variation_id;
	}
}
includes/classes/class-themecomplete-epo-check-base.php000064400000042304150755142450017235 0ustar00<?php
/**
 * Extra Product Options Check class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Check class
 *
 * Checks if the plugin can be run according to
 * its requirements.
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_CHECK_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CHECK_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @since 1.0
	 * @return THEMECOMPLETE_EPO_CHECK_Base
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'admin_init', [ $this, 'check_version' ] );

		if ( ! self::compatible_version() ) {
			return;
		}

		add_action( 'plugins_loaded', [ $this, 'eco_check' ], 0 );
		add_action( 'plugins_loaded', [ $this, 'multiple_file_upload_check' ], 0 );
		add_action( 'plugins_loaded', [ $this, 'weight_plugin_check' ], 0 );
	}

	/**
	 * Stop the plugin if requirements are not met
	 *
	 * @since 1.0
	 * @return boolean
	 * @static
	 */
	public function stop_plugin() {
		/**
		 * Disable plugin for Themify - WooCommerce Product Filter ajax
		 * https://wordpress.org/plugins/themify-wc-product-filter/
		 */
		if ( isset( $_REQUEST['wpf_ajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return true;
		}

		/**
		 * Disable plugin for Product X builder
		 * https://www.wpxpo.com/productx/
		 */
		if ( isset( $_REQUEST['post_type'] ) && 'wopb_builder' === $_REQUEST['post_type'] ) { // phpcs:ignore WordPress.Security.NonceVerification
			return true;
		}

		if ( apply_filters( 'wc_epo_stop_plugin', false ) ) {
			return true;
		}

		if ( ! self::themecomplete_woocommerce_check() ) {
			return true;
		}

		if ( ! self::compatible_version() ) {
			return true;
		}

		if ( self::old_version() ) {
			return true;
		}

		if ( ! self::woocommerce_check() ) {
			return true;
		}

		$this->php_check();

		return false;
	}

	/**
	 * Check for compatible WordPress version
	 *
	 * @since 1.0
	 * @return void
	 * @static
	 */
	public static function activation_check() {
		if ( ! self::compatible_version() ) {
			deactivate_plugins( plugin_basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) );
			/* translators: %s WordPress version number */
			wp_die( sprintf( esc_html__( 'Extra Product Options & Add-Ons for WooCommerce requires WordPress %s or later.', 'woocommerce-tm-extra-product-options' ), esc_html( THEMECOMPLETE_EPO_WP_VERSION ) ) );
		}
	}

	/**
	 * Check for compatible Extra Checkout Options version
	 *
	 * @since 4.8.5
	 * @return void
	 * @static
	 */
	public function eco_check() {
		if ( defined( 'THEMECOMPLETE_ECO_VERSION' ) && defined( 'THEMECOMPLETE_ECO_PLUGIN_PATH' ) && function_exists( 'themecomplete_eco_plugin_init_admin' ) && function_exists( 'themecomplete_eco_plugin_init' ) ) {
			if ( version_compare( THEMECOMPLETE_ECO_VERSION, THEMECOMPLETE_SUPPORTED_ECO_VERSION, '<' ) ) {
				include_once ABSPATH . 'wp-admin/includes/plugin.php';
				add_action( 'admin_notices', [ $this, 'themecomplete_addons_check_eco' ] );
				add_action( 'admin_notices', [ $this, 'eco_notice' ] );
				remove_action( 'plugins_loaded', 'themecomplete_eco_plugin_init_admin' );
				remove_action( 'plugins_loaded', 'themecomplete_eco_plugin_init' );
				if ( is_plugin_active( plugin_basename( THEMECOMPLETE_ECO_PLUGIN_PATH . '/tm-woo-extra-checkout-options.php' ) ) ) {
					deactivate_plugins( plugin_basename( THEMECOMPLETE_ECO_PLUGIN_PATH . '/tm-woo-extra-checkout-options.php' ) );
					add_action( 'admin_notices', [ $this, 'eco_notice_deactivate' ] );
				}
			}
		}

		if ( defined( 'TM_ECO_VERSION' ) && defined( 'TM_ECO_PLUGIN_PATH' ) && function_exists( 'tc_eco_plugin_init_admin' ) && function_exists( 'tc_eco_plugin_init' ) ) {

			if ( version_compare( TM_ECO_VERSION, THEMECOMPLETE_SUPPORTED_ECO_VERSION, '<' ) ) {
				add_action( 'admin_notices', [ $this, 'themecomplete_addons_check_eco' ] );
				add_action( 'admin_notices', [ $this, 'eco_notice' ] );
				remove_action( 'plugins_loaded', 'tc_eco_plugin_init_admin' );
				remove_action( 'plugins_loaded', 'tc_eco_plugin_init' );
				if ( is_plugin_active( plugin_basename( TM_ECO_PLUGIN_PATH . '/tm-woo-extra-checkout-options.php' ) ) ) {
					deactivate_plugins( plugin_basename( TM_ECO_PLUGIN_PATH . '/tm-woo-extra-checkout-options.php' ) );
					add_action( 'admin_notices', [ $this, 'eco_notice_deactivate' ] );
				}
			}
		}
	}

	/**
	 * Disable multiple file upload addon
	 * (allready included in 6.4.2 +)
	 *
	 * @since 6.4.2
	 * @return void
	 * @static
	 */
	public function multiple_file_upload_check() {
		if ( class_exists( 'THEMECOMPLETE_Extension_Class_multiple_file_upload' ) ) {
			include_once ABSPATH . 'wp-admin/includes/plugin.php';
			if ( is_plugin_active( 'woocommerce-tm-extra-product-options-multiple-file-upload/woocommerce-tm-extra-product-options-multiple-file-upload.php' ) ) {
				deactivate_plugins( 'woocommerce-tm-extra-product-options-multiple-file-upload/woocommerce-tm-extra-product-options-multiple-file-upload.php' );
				add_action( 'admin_notices', [ $this, 'multiple_file_upload_notice_deactivate' ] );
			}
		}
	}

	/**
	 * Disable weight addon
	 * (allready included in 6.4.4 +)
	 *
	 * @since 6.4.4
	 * @return void
	 * @static
	 */
	public function weight_plugin_check() {
		if ( function_exists( 'tc_add_custom_weight' ) ) {
			include_once ABSPATH . 'wp-admin/includes/plugin.php';
			if ( is_plugin_active( 'woocommerce-tm-weight-addon/tm-woo-extra-weight.php' ) ) {
				deactivate_plugins( 'woocommerce-tm-weight-addon/tm-woo-extra-weight.php' );
				add_action( 'admin_notices', [ $this, 'weight_plugin_notice_deactivate' ] );
			}
		}
	}

	/**
	 * Deprecation notice for Extra Checkout Options
	 *
	 * @return void
	 * @since 4.9.4
	 */
	public function themecomplete_addons_check_eco() {
		$all_plugins = get_plugins();
		echo '<div class="error fade"><p>';
		/* translators: %s WooCommerce Extra Checkout Options version number */
		printf( esc_html__( 'Extra Product Options & Add-Ons for WooCommerce requires WooCommerce Extra Checkout Options %s or later!.', 'woocommerce-tm-extra-product-options' ), esc_html( THEMECOMPLETE_SUPPORTED_ECO_VERSION ) );

		if ( defined( 'THEMECOMPLETE_ECO_VERSION' ) && isset( $all_plugins['woocommerce-tm-extra-checkout-options-addon/tm-woo-extra-checkout-options.php'] ) ) {
			echo ' ' . esc_html__( 'The installed version is', 'woocommerce-tm-extra-product-options' ) . ' ' . esc_html( THEMECOMPLETE_ECO_VERSION );
		} elseif ( defined( 'TM_ECO_VERSION' ) && isset( $all_plugins['woocommerce-tm-extra-checkout-options-addon/tm-woo-extra-checkout-options.php'] ) ) {
			echo ' ' . esc_html__( 'The installed version is', 'woocommerce-tm-extra-product-options' ) . ' ' . esc_html( TM_ECO_VERSION );
		}

		echo '</p></div>' . "\n";
	}

	/**
	 * Prints a notice
	 *
	 * @return void
	 */
	public function eco_notice() {
		echo '<div class="error fade"><h4>' . esc_html__( 'Extra Product Options & Add-Ons for WooCommerce', 'woocommerce-tm-extra-product-options' ) . '</h4><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag */
			esc_html__( '%1$sImportant:%2$s Your version of WooCommerce Extra Checkout Options is not supported. Please update to the latest version.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>'
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Prints a notice
	 *
	 * @return void
	 */
	public function eco_notice_deactivate() {
		echo '<div class="error fade"><h4>' . esc_html__( 'Extra Product Options & Add-Ons for WooCommerce', 'woocommerce-tm-extra-product-options' ) . '</h4><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag */
			esc_html__( '%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce has been deactivated because it is not compatible with the current version of Extra Checkout Options.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>'
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Prints a notice
	 *
	 * @return void
	 */
	public function multiple_file_upload_notice_deactivate() {
		echo '<div class="error fade"><h4>' . esc_html__( 'Extra Product Options & Add-Ons for WooCommerce', 'woocommerce-tm-extra-product-options' ) . '</h4><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag */
			esc_html__( '%1$sImportant:%2$s WooCommerce TM Extra Product Options Multiple File Upload has been deactivated because its functionality is included in the main plugin.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>'
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Prints a notice
	 *
	 * @return void
	 */
	public function weight_plugin_notice_deactivate() {
		echo '<div class="error fade"><h4>' . esc_html__( 'Extra Product Options & Add-Ons for WooCommerce', 'woocommerce-tm-extra-product-options' ) . '</h4><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag */
			esc_html__( '%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce - Weight addon has been deactivated because its functionality is included in the main plugin.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>'
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Check for compatible WordPress and WooCommerce version
	 *
	 * The function also checks if there is a previous old version of the
	 * plugin install  that could potentially conflict.
	 *
	 * @return void
	 * @since 1.0
	 */
	public function check_version() {
		if ( ! self::compatible_version() ) {
			if ( is_plugin_active( plugin_basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) ) ) {
				deactivate_plugins( plugin_basename( THEMECOMPLETE_EPO_PLUGIN_FILE ) );
				add_action( 'admin_notices', [ $this, 'disabled_notice' ] );
				if ( isset( $_GET['activate'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					unset( $_GET['activate'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}
			}
		}

		if ( self::old_version() ) {
			deactivate_plugins( 'woocommerce-tm-custom-price-fields/tm-woo-custom-prices.php' );
			add_action( 'admin_notices', [ $this, 'deprecated_notice' ] );
		}

		if ( ! self::woocommerce_check() ) {
			add_action( 'admin_notices', [ $this, 'disabled_notice_woocommerce_check' ] );
		}
	}

	/**
	 * Add notice for WooCommerce version
	 *
	 * @return void
	 * @since 1.0
	 */
	public function disabled_notice_woocommerce_check() {
		echo '<div class="woocommerce-message error fade"><p>';
		if ( self::themecomplete_woocommerce_check_only() ) {
			printf(
				/* translators: %1 open strong html tag %2 close strong html tag */
				esc_html__(
					'%1$sImportant:%2$s Please run WooCommerce updater before using Extra Product Options & Add-Ons for WooCommerce.',
					'woocommerce-tm-extra-product-options'
				),
				'<strong>',
				'</strong>'
			);
		} else {
			printf(
				/* translators: %1 open strong html tag %2 close strong html tag %3 open a html tag %4 close a html tag */
				esc_html__( '%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires %3$sWooCommerce%4$s %5$s or later.', 'woocommerce-tm-extra-product-options' ),
				'<strong>',
				'</strong>',
				'<a href="http://wordpress.org/extend/plugins/woocommerce/">',
				'</a>',
				esc_html( THEMECOMPLETE_EPO_WC_VERSION )
			);
		}
		echo '</p>';

		if ( self::themecomplete_woocommerce_check_only() && get_option( 'woocommerce_db_version' ) ) {

			$update_url = wp_nonce_url(
				add_query_arg( 'do_update_woocommerce', 'true', admin_url( 'admin.php?page=wc-settings' ) ),
				'wc_db_update',
				'wc_db_update_nonce'
			);

			echo '<p class="submit"><a href="' . esc_url( $update_url ) . '" class="wc-update-now button-primary">' . esc_attr__( 'Run the updater', 'woocommerce' ) . '</a></p>';
		}

		echo '</div>';
	}

	/**
	 * Add deprecations notices
	 *
	 * @return void
	 * @since 1.0
	 */
	public function deprecated_notice() {
		$active_plugins = apply_filters( 'active_plugins', get_option( 'active_plugins' ) );

		if ( in_array( 'woocommerce-tm-custom-price-fields/tm-woo-custom-prices.php', $active_plugins, true ) ) {
			$deactivate_url = 'plugins.php?action=deactivate&plugin=' . rawurlencode( 'woocommerce-tm-custom-price-fields/tm-woo-custom-prices.php' ) . '&plugin_status=all&paged=1&s&_wpnonce=' . rawurlencode( wp_create_nonce( 'deactivate-plugin_woocommerce-tm-custom-price-fields/tm-woo-custom-prices.php' ) );
			echo '<div class="error fade"><p>';
			echo '<strong>Important:</strong> It is highly recommended that you <a href="' . esc_url( admin_url( $deactivate_url ) ) . '"> deactivate the old Custom Price Fields</a> plugin.';
			echo '</p></div>' . "\n";
		} else {
			$delete_url = 'plugins.php?action=delete-selected&checked%5B0%5D=' . rawurlencode( 'woocommerce-tm-custom-price-fields/tm-woo-custom-prices.php' ) . '&plugin_status=all&paged=1&s&_wpnonce=' . rawurlencode( wp_create_nonce( 'bulk-plugins' ) );
			echo '<div class="error fade"><p>';
			echo '<strong>Important:</strong> It is highly recommended that you <a href="' . esc_url( admin_url( $delete_url ) ) . '"> delete the old Custom Price Fields</a> plugin.';
			echo '</p></div>' . "\n";
		}
	}

	/**
	 * Add notice for WordPress version
	 *
	 * @return void
	 * @since 1.0
	 */
	public function disabled_notice() {
		echo '<div class="error fade"><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag %3 WordPress version */
			esc_html__( '%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires WordPress %3$s or later.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>',
			esc_html( THEMECOMPLETE_EPO_WP_VERSION )
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Add notice for WordPress version
	 *
	 * @return void
	 * @since 6.0.5
	 */
	public function php_check_notice() {
		echo '<div class="error fade"><p>';
		printf(
			/* translators: %1 open strong html tag %2 close strong html tag %3 WordPress version */
			esc_html__( '%1$sImportant:%2$s Extra Product Options & Add-Ons for WooCommerce requires PHP version %3$s or later.', 'woocommerce-tm-extra-product-options' ),
			'<strong>',
			'</strong>',
			esc_html( THEMECOMPLETE_EPO_PHP_VERSION )
		);
		echo '</p></div>' . "\n";
	}

	/**
	 * Check for comaptible WordPress version
	 *
	 * @return boolean
	 * @since 6.0.5
	 */
	public function php_check() {
		if ( function_exists( 'phpversion' ) ) {
			if ( version_compare( phpversion(), THEMECOMPLETE_EPO_PHP_VERSION, '<' ) ) {
				add_action( 'admin_notices', [ $this, 'php_check_notice' ] );
				return false;
			}
		}
		return true;
	}
	/**
	 * Check for comaptible WordPress version
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function compatible_version() {
		if ( version_compare( $GLOBALS['wp_version'], THEMECOMPLETE_EPO_WP_VERSION, '<' ) ) {
			return false;
		}
		return true;
	}

	/**
	 * Check for an older plugin version
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function old_version() {
		if ( class_exists( 'TM_Custom_Prices' ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Check if WooCommerce database needs update
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function tc_needs_wc_db_update() {
		$_tm_current_woo_version = get_option( 'woocommerce_db_version' );
		$_tc_needs_wc_db_update  = false;
		if ( get_option( 'woocommerce_db_version' ) !== false ) {
			if ( version_compare( get_option( 'woocommerce_db_version' ), '2.3', '<' ) && version_compare( get_option( 'woocommerce_version' ), '2.4', '<' ) ) {
				$_tm_notice_check       = '_wc_needs_update';
				$_tc_needs_wc_db_update = get_option( $_tm_notice_check );
				// no check after 2.6 update.
			} elseif ( version_compare( get_option( 'woocommerce_db_version' ), '2.5', '>=' ) ) {
				$_tc_needs_wc_db_update = false;
			} else {
				$_tm_notice_check       = 'woocommerce_admin_notices';
				$_tc_needs_wc_db_update = in_array( 'update', get_option( $_tm_notice_check, [] ), true );
			}
		}

		return $_tc_needs_wc_db_update;
	}

	/**
	 * Check if WooCommerce is active
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function themecomplete_woocommerce_check() {
		return ! self::tc_needs_wc_db_update() && self::themecomplete_woocommerce_check_only();
	}

	/**
	 * Check if WooCommerce is active
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function themecomplete_woocommerce_check_only() {
		$active_plugins = (array) get_option( 'active_plugins', [] );
		if ( is_multisite() ) {
			$active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', [] ) );
		}

		return in_array( 'woocommerce/woocommerce.php', $active_plugins, true ) || array_key_exists( 'woocommerce/woocommerce.php', $active_plugins );
	}

	/**
	 * Check for comaptible WooCommerce version
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public static function woocommerce_check() {
		if ( get_option( 'woocommerce_db_version' ) === false && class_exists( 'WC_Install' ) ) {
			WC_Install::update_db_version();
		}

		if ( self::themecomplete_woocommerce_check() && ! version_compare( get_option( 'woocommerce_db_version' ), THEMECOMPLETE_EPO_WC_VERSION, '<' ) ) {
			return true;
		}

		return false;
	}
}
includes/classes/class-themecomplete-epo-post-types.php000064400000023563150755142450017405 0ustar00<?php
/**
 * Extra Product Options Post Types
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Post Types
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_POST_TYPES {

	/**
	 * The global post type
	 *
	 * @var WP_Post_Type|null
	 */
	public static $global_type;

	/**
	 * The template post type
	 *
	 * @var WP_Post_Type|null
	 */
	public static $template_type;

	/**
	 * The lookup table post type
	 *
	 * @var WP_Post_Type|null
	 */
	public static $lookuptable_type;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_POST_TYPES|null
	 * @since 6.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_POST_TYPES
	 * @since 6.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Register local post type
	 * (This is used in Normal mode)
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function register_local_post_type() {
		register_post_type(
			THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
			[
				'labels'              => [
					'name' => esc_html_x( 'TM Extra Product Options', 'post type general name', 'woocommerce-tm-extra-product-options' ),
				],
				'publicly_queryable'  => false,
				'exclude_from_search' => true,
				'rewrite'             => false,
				'show_in_nav_menus'   => false,
				'public'              => false,
				'hierarchical'        => false,
				'supports'            => [],
				'_edit_link'          => 'post.php?post=%d', // WordPress 4.4 fix.
			]
		);
	}

	/**
	 * Register global post type
	 * (This is used in Global builder forms mode)
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function register_global_post_type() {
		register_post_type(
			THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
			[
				'labels'              => [
					'name'               => esc_html__( 'Global Forms', 'woocommerce-tm-extra-product-options' ),
					'singular_name'      => esc_html__( 'Global Form', 'woocommerce-tm-extra-product-options' ),
					'menu_name'          => esc_html_x( 'Global Forms', 'post type general name', 'woocommerce-tm-extra-product-options' ),
					'add_new'            => esc_html__( 'Add Global Form', 'woocommerce-tm-extra-product-options' ),
					'add_new_item'       => esc_html__( 'Add New Global Form', 'woocommerce-tm-extra-product-options' ),
					'edit'               => esc_html__( 'Edit', 'woocommerce-tm-extra-product-options' ),
					'edit_item'          => esc_html__( 'Edit Global Form', 'woocommerce-tm-extra-product-options' ),
					'new_item'           => esc_html__( 'New Global Form', 'woocommerce-tm-extra-product-options' ),
					'view'               => esc_html__( 'View Global Form', 'woocommerce-tm-extra-product-options' ),
					'view_item'          => esc_html__( 'View Global Form', 'woocommerce-tm-extra-product-options' ),
					'search_items'       => esc_html__( 'Search Global Form', 'woocommerce-tm-extra-product-options' ),
					'not_found'          => esc_html__( 'No Global Form found', 'woocommerce-tm-extra-product-options' ),
					'not_found_in_trash' => esc_html__( 'No Global Form found in trash', 'woocommerce-tm-extra-product-options' ),
					'parent'             => esc_html__( 'Parent Global Form', 'woocommerce-tm-extra-product-options' ),
				],
				'description'         => esc_attr__( 'This is where you can add new global options to your store.', 'woocommerce' ),
				'public'              => false,
				'show_ui'             => false,
				'capability_type'     => 'product',
				'map_meta_cap'        => true,
				'publicly_queryable'  => false,
				'exclude_from_search' => true,
				'hierarchical'        => false,
				'rewrite'             => false,
				'query_var'           => false,
				'supports'            => [ 'title', 'excerpt' ],
				'has_archive'         => false,
				'show_in_nav_menus'   => false,
				'_edit_link'          => 'post.php?post=%d', // WordPress 4.4 fix.
			]
		);

		$custom_product_taxonomies = get_object_taxonomies( 'product' );
		if ( is_array( $custom_product_taxonomies ) && count( $custom_product_taxonomies ) > 0 ) {
			foreach ( $custom_product_taxonomies as $tax ) {
				if ( 'translation_priority' === $tax ) {
					continue;
				}
				register_taxonomy_for_object_type( $tax, THEMECOMPLETE_EPO_GLOBAL_POST_TYPE );
			}
		}
	}

	/**
	 * Register template post type
	 * (This is for the Option Templates)
	 *
	 * @return void
	 * @since 6.0
	 */
	public static function register_template_post_type() {
		register_post_type(
			THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE,
			[
				'labels'               => [
					'name'               => esc_html__( 'Option Templates', 'woocommerce-tm-extra-product-options' ),
					'singular_name'      => esc_html__( 'Option Template', 'woocommerce-tm-extra-product-options' ),
					'menu_name'          => esc_html_x( 'Option Templates', 'post type general name', 'woocommerce-tm-extra-product-options' ),
					'add_new'            => esc_html__( 'Add Template', 'woocommerce-tm-extra-product-options' ),
					'add_new_item'       => esc_html__( 'Add New Template', 'woocommerce-tm-extra-product-options' ),
					'edit'               => esc_html__( 'Edit', 'woocommerce-tm-extra-product-options' ),
					'edit_item'          => esc_html__( 'Edit Template', 'woocommerce-tm-extra-product-options' ),
					'new_item'           => esc_html__( 'New Template', 'woocommerce-tm-extra-product-options' ),
					'view'               => esc_html__( 'View Template', 'woocommerce-tm-extra-product-options' ),
					'view_item'          => esc_html__( 'View Template', 'woocommerce-tm-extra-product-options' ),
					'search_items'       => esc_html__( 'Search Template', 'woocommerce-tm-extra-product-options' ),
					'not_found'          => esc_html__( 'No Template found', 'woocommerce-tm-extra-product-options' ),
					'not_found_in_trash' => esc_html__( 'No Template found in trash', 'woocommerce-tm-extra-product-options' ),
					'parent'             => esc_html__( 'Parent Template', 'woocommerce-tm-extra-product-options' ),
				],
				'description'          => esc_attr__( 'This is where you can add new global template options.', 'woocommerce' ),
				'public'               => false,
				'show_ui'              => true,
				'show_in_menu'         => 'tcepo',
				'capability_type'      => 'product',
				'map_meta_cap'         => true,
				'publicly_queryable'   => false,
				'exclude_from_search'  => true,
				'hierarchical'         => false,
				'rewrite'              => false,
				'query_var'            => false,
				'supports'             => [ 'title' ],
				'has_archive'          => false,
				'show_in_nav_menus'    => false,
				'register_meta_box_cb' => [ THEMECOMPLETE_EPO_ADMIN_GLOBAL(), 'preload_template_settings' ],
				'_edit_link'           => 'post.php?post=%d', // WordPress 4.4 fix.
			]
		);
	}

	/**
	 * Register lookup table post type
	 *
	 * @return void
	 * @since 6.1
	 */
	public static function register_lookuptable_post_type() {
		register_post_type(
			THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE,
			[
				'labels'               => [
					'name'               => esc_html__( 'Lookup tables', 'woocommerce-tm-extra-product-options' ),
					'singular_name'      => esc_html__( 'Lookup table', 'woocommerce-tm-extra-product-options' ),
					'menu_name'          => esc_html_x( 'Lookup tables', 'post type general name', 'woocommerce-tm-extra-product-options' ),
					'add_new'            => esc_html__( 'Add Lookup table', 'woocommerce-tm-extra-product-options' ),
					'add_new_item'       => esc_html__( 'Add New Lookup table', 'woocommerce-tm-extra-product-options' ),
					'edit'               => esc_html__( 'Edit', 'woocommerce-tm-extra-product-options' ),
					'edit_item'          => esc_html__( 'Edit Lookup table', 'woocommerce-tm-extra-product-options' ),
					'new_item'           => esc_html__( 'New Lookup table', 'woocommerce-tm-extra-product-options' ),
					'view'               => esc_html__( 'View Lookup table', 'woocommerce-tm-extra-product-options' ),
					'view_item'          => esc_html__( 'View Lookup table', 'woocommerce-tm-extra-product-options' ),
					'search_items'       => esc_html__( 'Search Lookup table', 'woocommerce-tm-extra-product-options' ),
					'not_found'          => esc_html__( 'No Lookup table found', 'woocommerce-tm-extra-product-options' ),
					'not_found_in_trash' => esc_html__( 'No Lookup table found in trash', 'woocommerce-tm-extra-product-options' ),
					'parent'             => esc_html__( 'Parent Lookup table', 'woocommerce-tm-extra-product-options' ),
				],
				'description'          => esc_attr__( 'This is where you can add new lookup tables.', 'woocommerce' ),
				'public'               => false,
				'show_ui'              => true,
				'show_in_menu'         => 'tcepo',
				'capability_type'      => 'product',
				'map_meta_cap'         => true,
				'publicly_queryable'   => false,
				'exclude_from_search'  => true,
				'hierarchical'         => false,
				'rewrite'              => false,
				'query_var'            => false,
				'supports'             => [ 'title' ],
				'has_archive'          => false,
				'show_in_nav_menus'    => false,
				'register_meta_box_cb' => [ THEMECOMPLETE_EPO_ADMIN_LOOKUPTABLE(), 'preload_lookuptable_settings' ],
				'_edit_link'           => 'post.php?post=%d', // WordPress 4.4 fix.
			]
		);
	}

	/**
	 * Register post types
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function register() {
		self::register_local_post_type();
		self::register_global_post_type();
		self::register_template_post_type();
		self::register_lookuptable_post_type();

		self::$global_type      = get_post_type_object( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE );
		self::$template_type    = get_post_type_object( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE );
		self::$lookuptable_type = get_post_type_object( THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE );
	}
}
includes/classes/class-themecomplete-epo-update-updater.php000064400000027067150755142450020205 0ustar00<?php
/**
 * Extra Product Options Update
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 * phpcs:disable Generic.Files.OneObjectStructurePerFile
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Updater class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_UPDATE_Updater {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_UPDATE_Updater|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * The plugin title
	 *
	 * @var string
	 */
	public $title = 'Extra Product Options & Add-Ons for WooCommerce';

	/**
	 * The api URL
	 *
	 * @var string
	 */
	public $version_url = 'https://themecomplete.com/api/?';

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_UPDATE_Updater
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		$this->title = esc_attr( $this->title );
		$this->setup();
		add_filter( 'upgrader_pre_download', [ $this, 'upgrade_filter_from_envato' ], 10, 4 );
		add_action( 'upgrader_process_complete', [ $this, 'remove_temporary_dir' ] );
	}

	/**
	 * Setup the manager class
	 *
	 * @return void
	 * @since 1.0
	 * @static
	 */
	public function setup() {
		$instance = new THEMECOMPLETE_EPO_UPDATE_Manager( THEMECOMPLETE_EPO_VERSION, $this->get_url(), THEMECOMPLETE_EPO_PLUGIN_SLUG, $this );
	}

	/**
	 * Get url with timestamp
	 *
	 * @return string
	 * @since 1.0
	 * @static
	 */
	public function get_url() {
		return $this->version_url . time();
	}

	/**
	 * Pre-download functions
	 *
	 * @param boolean     $reply Whether to bail without returning the package. Default false.
	 * @param string      $package The package file name.
	 * @param WP_Upgrader $updater The WP_Upgrader instance.
	 * @return mixed
	 * @since 1.0
	 * @static
	 */
	public function upgrade_filter_from_envato( $reply, $package, $updater ) {
		global $wp_filesystem;
		if ( ( isset( $updater->skin->plugin ) && THEMECOMPLETE_EPO_PLUGIN_SLUG === $updater->skin->plugin ) ||
			( isset( $updater->skin->plugin_info ) && isset( $updater->skin->plugin_info['Name'] ) && $updater->skin->plugin_info['Name'] === $this->title )
		) {
			$updater->strings['download_envato'] = esc_html__( 'Downloading package from Envato market...', 'woocommerce-tm-extra-product-options' );
			$updater->skin->feedback( 'download_envato' );
			$package_filename = 'woocommerce-tm-extra-product-options.zip';
			$res              = $updater->fs_connect( [ WP_CONTENT_DIR ] );
			if ( ! $res ) {
				return new WP_Error( 'no_credentials', esc_html__( "Error! Can't connect to filesystem", 'woocommerce-tm-extra-product-options' ) );
			}
			$envato_token  = get_option( 'tm_epo_envato_apikey' );
			$purchase_code = get_option( 'tm_epo_envato_purchasecode' );

			if ( ! THEMECOMPLETE_EPO_LICENSE()->check_license() ) {
				return new WP_Error( 'no_credentials', esc_html__( 'To receive automatic updates license activation is required.', 'woocommerce-tm-extra-product-options' ) . sprintf( '<a href="' . esc_url( admin_url( 'admin.php?page=wc-settings&tab=' . THEMECOMPLETE_EPO_ADMIN_SETTINGS_ID ) ) . '">%s</a>', esc_html__( 'Please activate Extra Product Options.', 'woocommerce-tm-extra-product-options' ) ) );
			}

			$result = $this->envato_download_purchase_url( $envato_token, $purchase_code );

			$wordpress_plugin = isset( $result->wordpress_plugin );
			$download_url     = isset( $result->download_url );

			if ( ! $wordpress_plugin ) {
				if ( ! $download_url ) {
					return new WP_Error( 'no_credentials', esc_html__( 'Error! Envato API error', 'woocommerce-tm-extra-product-options' ) . ( isset( $result->error ) && isset( $result->description ) ? ': ' . $result->description : '.' ) );
				}
			}

			if ( $wordpress_plugin && property_exists( $result, 'wordpress_plugin' ) ) {
				$download_file = download_url( $result->wordpress_plugin );
			} elseif ( property_exists( $result, 'download_url' ) ) {
				$download_file = download_url( $result->download_url );
			}

			if ( isset( $download_file ) ) {
				if ( is_wp_error( $download_file ) ) {
					return $download_file;
				}

				if ( $wordpress_plugin ) {
					$plugin_directory_name = 'woocommerce-tm-extra-product-options';
					if ( basename( $download_file, '.zip' ) !== $plugin_directory_name ) {
						$new_archive_name = dirname( $download_file ) . '/' . $plugin_directory_name . time() . '.zip';
						// The third parameter is to overwrite if the destination file already exists.
						if ( $wp_filesystem->move( $download_file, $new_archive_name, true ) ) {
							$download_file = $new_archive_name;
						}
					}

					return $download_file;
				} else {
					$upgrade_folder = $wp_filesystem->wp_content_dir() . 'uploads/woocommerce-tm-extra-product-options-envato-package';
					if ( is_dir( $upgrade_folder ) ) {
						$wp_filesystem->delete( $upgrade_folder );
					}
					$result = unzip_file( $download_file, $upgrade_folder );
					if ( true === $result && is_file( $upgrade_folder . '/' . $package_filename ) ) {
						return $upgrade_folder . '/' . $package_filename;
					}
				}
			}

			return new WP_Error( 'no_credentials', esc_html__( 'Error on unzipping package', 'woocommerce-tm-extra-product-options' ) );
		}

		return $reply;
	}

	/**
	 * Get download url
	 *
	 * @param string $envato_token The Envato token.
	 * @param string $purchase_code The purchase code.
	 * @return object
	 * @since 1.0
	 * @static
	 */
	protected function envato_download_purchase_url( $envato_token, $purchase_code ) {

		$download_url = '';

		$request = wp_remote_post(
			$this->get_url(),
			[
				'body' =>
					[
						'api_key'       => $envato_token,
						'purchase_code' => $purchase_code,
						'type'          => 'download',
						'id'            => THEMECOMPLETE_EPO_PLUGIN_ID,
						'action'        => 'download',
					],
			]
		);

		if ( ! is_wp_error( $request ) || wp_remote_retrieve_response_code( $request ) === 200 ) {
			if ( isset( $request['body'] ) ) {
				$data = themecomplete_maybe_unserialize( $request['body'] );
				if ( false === $data ) {
					$data = $request['body'];
				}
				$download_url = json_decode( $data );
			}
		}

		return $download_url;
	}

	/**
	 * Remove temp directory
	 *
	 * @return void
	 * @since 1.0
	 * @static
	 */
	public function remove_temporary_dir() {
		global $wp_filesystem;
		if ( is_dir( $wp_filesystem->wp_content_dir() . 'uploads/woocommerce-tm-extra-product-options-envato-package' ) ) {
			$wp_filesystem->delete( $wp_filesystem->wp_content_dir() . 'uploads/woocommerce-tm-extra-product-options-envato-package', true );
		}
	}
}

/**
 * Extra Product Options Update manager class
 *
 * @package Extra Product Options/Classes
 * @version 4.8
 */
final class THEMECOMPLETE_EPO_UPDATE_Manager {

	/**
	 * Plugin version
	 *
	 * @var mixed
	 */
	public $current_version;

	/**
	 * The API url
	 *
	 * @var mixed
	 */
	public $update_path;

	/**
	 * The plugin slug
	 *
	 * @var string
	 */
	public $plugin_slug;

	/**
	 * The main plugin file name without the extension
	 *
	 * @var string
	 */
	public $slug;

	/**
	 * The THEMECOMPLETE_EPO_UPDATE_Updater instance
	 *
	 * @var THEMECOMPLETE_EPO_UPDATE_Updater
	 */
	public $updater_instance;

	/**
	 * Plugin id
	 *
	 * @var mixed
	 */
	public $plugin_envato_id;

	/**
	 * Plugin link
	 *
	 * @var string
	 */
	protected $url = 'https://1.envato.market/3eOy';

	/**
	 * Class Constructor
	 *
	 * @param string                           $current_version Plugin current version.
	 * @param string                           $update_path The API url.
	 * @param string                           $plugin_slug The plugin slug.
	 * @param THEMECOMPLETE_EPO_UPDATE_Updater $instance The THEMECOMPLETE_EPO_UPDATE_Updater instance.
	 * @return void
	 * @since 1.0
	 */
	public function __construct( $current_version, $update_path, $plugin_slug, $instance ) {
		$this->updater_instance = $instance;
		$this->plugin_envato_id = THEMECOMPLETE_EPO_PLUGIN_ID;
		$this->current_version  = $current_version;
		$this->plugin_slug      = $plugin_slug;
		$this->update_path      = $update_path;
		$parts                  = explode( '/', $plugin_slug );
		$this->slug             = str_replace( '.php', '', $parts[1] );

		add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'tm_update_plugins' ] );
		add_filter( 'plugins_api', [ $this, 'tm_plugins_api' ], 10, 3 );
		add_action( 'in_plugin_update_message-' . $this->plugin_slug, [ $this, 'tm_update_message' ] );
	}

	/**
	 * Fill plugin update details when WordPress runs its update checker
	 *
	 * @param object $transient The update_plugins transient object.
	 * @since 1.0
	 * @return object The same or a modified version of the transient.
	 */
	public function tm_update_plugins( $transient = null ) {
		if ( $transient && is_object( $transient ) && property_exists( $transient, 'response' ) ) {
			if ( isset( $transient->response[ $this->plugin_slug ] ) ) {
				return $transient;
			}

			$remote_version = $this->remote_api_call( 'new_version', true );

			if ( $remote_version && version_compare( $this->current_version, $remote_version->new_version, '<' ) ) {
				$obj       = $remote_version;
				$obj->slug = $this->slug;

				if ( THEMECOMPLETE_EPO_LICENSE()->check_license() ) {
					$obj->url     = $this->update_path;
					$obj->package = $this->update_path;
				} else {
					$obj->url     = '';
					$obj->package = '';
				}

				$obj->name                                 = $this->updater_instance->title;
				$transient->response[ $this->plugin_slug ] = $obj;
			}
		}

		return $transient;
	}

	/**
	 * Perform a remote api call
	 *
	 * @param string  $action Type of action to perform.
	 * @param boolean $is_serialized If the response is serialized.
	 * @return mixed
	 * @since 1.0
	 */
	public function remote_api_call( $action = '', $is_serialized = false ) {
		$request = wp_remote_post(
			$this->update_path,
			[
				'body' =>
						[
							'action' => $action,
							'id'     => $this->plugin_envato_id,
							'type'   => 'plugin',
						],
			]
		);

		if ( ! is_wp_error( $request ) || wp_remote_retrieve_response_code( $request ) === 200 ) {
			if ( isset( $request['body'] ) ) {
				return ( $is_serialized ) ? themecomplete_maybe_unserialize( ( $request['body'] ) ) : $request['body'];
			}
		}

		return false;
	}

	/**
	 * Get plugin data for update
	 *
	 * @param false|object|array<mixed> $result The result object or array. Default false.
	 * @param string                    $action The type of information being requested from the Plugin Installation API.
	 * @param object                    $args Plugin API arguments.
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_plugins_api( $result, $action, $args ) {
		if ( isset( $args->slug ) && $args->slug === $this->slug ) {
			$info = $this->remote_api_call( 'info', true );
			if ( $info ) {
				$info->name = $this->updater_instance->title;
				$info->slug = $this->slug;

				if ( THEMECOMPLETE_EPO_LICENSE()->check_license() ) {
					$info->download_link = $this->update_path;
				}
			}

			return $info;
		}

		return $result;
	}

	/**
	 * Print update message
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_update_message() {
		$plugins = get_plugins();
		if ( ! THEMECOMPLETE_EPO_LICENSE()->check_license() ) {
			echo '<br /><a href="' . esc_url( $this->url ) . '">' . esc_html__( 'Download new version from CodeCanyon', 'woocommerce-tm-extra-product-options' ) . '</a> ' . esc_html__( 'or register the plugin to receive automatic updates.', 'woocommerce-tm-extra-product-options' );
		}
	}
}
includes/classes/class-themecomplete-epo-math.php000064400000143017150755142450016204 0ustar00<?php
/**
 * Extra Product Options Math class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 * phpcs:disable Generic.Files.OneObjectStructurePerFile
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Math class
 *
 * Based on MathExecutor by Alexander Kiryukhin
 * https://github.com/neonxp/MathExecutor
 * Copyright (c) Alexander Kiryukhin
 *
 * 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.
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH {

	/**
	 * Available variables
	 *
	 * @var array<string, float|string>
	 */
	public $variables = [];

	/**
	 * Variable not found handler.
	 *
	 * @var callable|null
	 */
	public $on_var_not_found = null;

	/**
	 * Validation method that will be invoked when a variable is set using set_var.
	 *
	 * @var callable|null
	 */
	public $on_var_validation = null;

	/**
	 * Operators array (default and custom)
	 * Operators + - * / %
	 * Logical operators ==, !=, <, <, >=, <=, &&, ||
	 *
	 * @var THEMECOMPLETE_EPO_MATH_Operator[]
	 */
	public $operators = [];

	/**
	 * Array of custom functions.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_CustomFunction>
	 */
	public $functions = [];

	/**
	 * Token cache.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_Token[]>
	 */
	protected $cache = [];

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->add_defaults();
	}

	/**
	 * When the object is cloned, set default operands and functions.
	 */
	public function __clone() {
		$this->add_defaults();
	}

	/**
	 * Add an operator.
	 *
	 * @param THEMECOMPLETE_EPO_MATH_Operator $operator Operator to add.
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function add_operator( THEMECOMPLETE_EPO_MATH_Operator $operator ): self {
		$this->operators[ $operator->operator ] = $operator;

		return $this;
	}

	/**
	 * Evaluate an expression.
	 *
	 * @param string  $expression The expression to execute.
	 * @param boolean $cache IF the result should be cached.
	 *
	 * @return integer|float|string|null
	 */
	public static function evaluate( string $expression, bool $cache = true ) {
		$self = new self();
		$self->use_bcmath( 100 );
		$self->set_division_by_zero_to_zero();
		$result = $self->execute( $expression, $cache );
		unset( $self );
		return $result;
	}

	/**
	 * Execute the expression.
	 *
	 * @param string  $expression The expression to execute.
	 * @param boolean $cache IF the result should be cached.
	 *
	 * @return integer|float|string|null
	 */
	public function execute( string $expression, bool $cache = true ) {
		$cache_key = $expression;

		if ( ! array_key_exists( $cache_key, $this->cache ) ) {
			$tokens = ( new THEMECOMPLETE_EPO_MATH_Tokenizer( $expression, $this->operators ) )->tokenize()->build_reverse_polish_notation();

			if ( $cache ) {
				$this->cache[ $cache_key ] = $tokens;
			}
		} else {
			$tokens = $this->cache[ $cache_key ];
		}

		$calculator = new THEMECOMPLETE_EPO_MATH_Calculator( $this->functions, $this->operators );

		$result = $calculator->calculate( $tokens, $this->variables, $this->on_var_not_found, $this );

		if ( ! is_numeric( $result ) ) {
			$result = 0;
		}

		return $result;
	}

	/**
	 * Add a custom function.
	 *
	 * @param string  $name Name of function.
	 * @param Closure $func The Function to add.
	 *
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function add_function( string $name, Closure $func ): self {
		$this->functions[ $name ] = new THEMECOMPLETE_EPO_MATH_CustomFunction( $name, $func );

		return $this;
	}

	/**
	 * Get all variables.
	 *
	 * @return array<string, float|string>
	 */
	public function get_vars(): array {
		return $this->variables;
	}

	/**
	 * Get a specific var
	 *
	 * @param string $variable The variable to get.
	 * @return mixed
	 */
	public function get_var( string $variable ) {
		if ( ! array_key_exists( $variable, $this->variables ) ) {
			if ( $this->on_var_not_found ) {
				return call_user_func( $this->on_var_not_found, $variable );
			}

			return THEMECOMPLETE_EPO_MATH_Error::trigger( "Variable ({$variable}) not set", 'UnknownVariableError', 0 );
		}

		return $this->variables[ $variable ];
	}

	/**
	 * Add a custom variable. To set a custom validator use set_var_validation_handler.
	 *
	 * @param string $variable The variable to set the value for.
	 * @param mixed  $value The value to set the variable to.
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function set_var( string $variable, $value ): self {
		if ( $this->on_var_validation ) {
			$value = call_user_func( $this->on_var_validation, $variable, $value );
		}

		$this->variables[ $variable ] = $value;

		return $this;
	}

	/**
	 * Test to see if a variable exists
	 *
	 * @param string $variable The variable to test if it exists.
	 */
	public function var_exists( string $variable ): bool {
		return array_key_exists( $variable, $this->variables );
	}

	/**
	 * Add custom variables.
	 *
	 * @param  array<string, float|integer|string> $variables The array variables to add.
	 * @param  boolean                             $clear If we should clear previous variables.
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function set_vars( array $variables, bool $clear = true ): self {
		if ( $clear ) {
			$this->remove_vars();
		}

		foreach ( $variables as $name => $value ) {
			$this->set_var( $name, $value );
		}

		return $this;
	}

	/**
	 * Define a method that will be invoked when a variable is not found.
	 * The first parameter will be the variable name, and the returned value will be used as the variable value.
	 *
	 * @param callable $handler The handler to set.
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function set_var_not_found_handler( callable $handler ): self {
		$this->on_var_not_found = $handler;

		return $this;
	}

	/**
	 * Define a validation method that will be invoked when a variable is set using set_var.
	 * The first parameter will be the variable name, and the second will be the variable value.
	 * Set to null to disable validation.
	 *
	 * @param ?callable $handler The validation handler to set.
	 *
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function set_var_validation_handler( ?callable $handler ): self {
		$this->on_var_validation = $handler;

		return $this;
	}

	/**
	 * Remove a custom variable.
	 *
	 * @param string $variable The variable to remove.
	 *
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function remove_var( string $variable ): self {
		unset( $this->variables[ $variable ] );

		return $this;
	}

	/**
	 * Remove all variables and the variable not found handler
	 *
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function remove_vars(): self {
		$this->variables        = [];
		$this->on_var_not_found = null;

		return $this;
	}

	/**
	 * Get all registered operators.
	 *
	 * @return array<THEMECOMPLETE_EPO_MATH_Operator> of operator class names
	 */
	public function get_operators(): array {
		return $this->operators;
	}

	/**
	 * Get all registered functions
	 *
	 * @return array<string, THEMECOMPLETE_EPO_MATH_CustomFunction> containing callback and places indexed by function name.
	 */
	public function get_functions(): array {
		return $this->functions;
	}

	/**
	 * Remove a specific operator
	 *
	 * @param string $operator The operator to remove.
	 * @return THEMECOMPLETE_EPO_MATH
	 */
	public function remove_operator( string $operator ): self {
		unset( $this->operators[ $operator ] );

		return $this;
	}

	/**
	 * Set division by zero returns zero instead of throwing an error
	 */
	public function set_division_by_zero_to_zero(): self {
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'/',
				false,
				180,
				static function ( $a, $b ) {
					return 0 == $b ? 0 : (float) $a / (float) $b; // phpcs:ignore
				}
			)
		);

		return $this;
	}

	/**
	 * Get cache array with tokens
	 *
	 * @return array<string, THEMECOMPLETE_EPO_MATH_Token[]>
	 */
	public function get_cache(): array {
		return $this->cache;
	}

	/**
	 * Clear token's cache
	 */
	public function clear_cache(): self {
		$this->cache = [];

		return $this;
	}

	/**
	 * Use BCMAth fixed precision.
	 *
	 * @param integer $scale The precision to use.
	 * @return self
	 */
	public function use_bcmath( int $scale = 2 ): self {
		if ( ! function_exists( 'bcscale' ) ) {
			return $this;
		}
		bcscale( $scale );
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'+',
				false,
				170,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcadd( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'-',
				false,
				170,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcsub( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'uNeg',
				false,
				200,
				static function ( $a ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					return bcsub( '0.0', "{$a}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'*',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcmul( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'/',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					if ( 0 == $b ) { // phpcs:ignore
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Division By Zero', 'DivisionByZeroError', 0 );
					}
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );

					return bcdiv( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'^',
				true,
				220,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return themecomplete_bcpow( "{$a}", "{$b}", 50, $scale );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'%',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcmod( "{$a}", "{$b}" );
				}
			)
		);

		return $this;
	}

	/**
	 * Set default operands and functions
	 */
	protected function add_defaults(): self {
		foreach ( $this->default_operators() as $name => $operator ) {
			[$callable, $priority, $is_right_assoc] = $operator;
			$this->add_operator( new THEMECOMPLETE_EPO_MATH_Operator( $name, $is_right_assoc, $priority, $callable ) );
		}

		foreach ( $this->default_functions() as $name => $callable ) {
			$this->add_function( $name, $callable );
		}

		$this->on_var_validation = [ $this, 'default_var_validation' ];
		$this->variables         = $this->default_vars();

		return $this;
	}

	/**
	 * Get the default operators
	 *
	 * @return array<string, array{Closure, int, bool}>
	 */
	protected function default_operators(): array {
		return [
			'+'    => [
				static function ( $a, $b ) {
					return $a + $b;
				},
				170,
				false,
			],
			'-'    => [
				static function ( $a, $b ) {
					return $a - $b;
				},
				170,
				false,
			],
			// unary positive token.
			'uPos' => [
				static function ( $a ) {
					return $a;
				},
				200,
				false,
			],
			// unary minus token.
			'uNeg' => [
				static function ( $a ) {
					return 0 - $a;
				},
				200,
				false,
			],
			'*'    => [
				static function ( $a, $b ) {
					return $a * $b;
				},
				180,
				false,
			],
			'/'    => [
				static function ( $a, $b ) {
					if ( 0 == $b ) { // phpcs:ignore
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Division By Zero', 'DivisionByZeroError', 0 );
					}

					return $a / $b;
				},
				180,
				false,
			],
			'^'    => [
				static function ( $a, $b ) {
					return pow( $a, $b );
				},
				220,
				true,
			],
			'%'    => [
				static function ( $a, $b ) {
					return $a % $b;
				},
				180,
				false,
			],
			'&&'   => [
				static function ( $a, $b ) {
					return $a && $b;
				},
				100,
				false,
			],
			'||'   => [
				static function ( $a, $b ) {
					return $a || $b;
				},
				90,
				false,
			],
			'=='   => [
				static function ( $a, $b ) {
					return ( is_numeric( $a ) && is_numeric( $b ) ) ? THEMECOMPLETE_EPO_HELPER()->convert_to_number( $a, true ) === THEMECOMPLETE_EPO_HELPER()->convert_to_number( $b, true ) : ( is_string( $a ) || is_string( $b ) ? 0 == strcmp( $a, $b ) : $a == $b ); // phpcs:ignore
				},
				140,
				false,
			],
			'!='   => [
				static function ( $a, $b ) {
					return ( is_numeric( $a ) && is_numeric( $b ) ) ? THEMECOMPLETE_EPO_HELPER()->convert_to_number( $a, true ) !== THEMECOMPLETE_EPO_HELPER()->convert_to_number( $b, true ) : ( is_string( $a ) || is_string( $b ) ? 0 != strcmp( $a, $b ) : $a != $b ); // phpcs:ignore
				},
				140,
				false,
			],
			'>='   => [
				static function ( $a, $b ) {
					return $a >= $b;
				},
				150,
				false,
			],
			'>'    => [
				static function ( $a, $b ) {
					return $a > $b;
				},
				150,
				false,
			],
			'<='   => [
				static function ( $a, $b ) {
					return $a <= $b;
				},
				150,
				false,
			],
			'<'    => [
				static function ( $a, $b ) {
					return $a < $b;
				},
				150,
				false,
			],
		];
	}

	/**
	 * Gets the default functions as an array.  Key is function name
	 * and value is the function as a closure.
	 *
	 * @return array<Closure>
	 */
	protected function default_functions(): array {
		return [
			'abs'         => static function ( $arg ) {
				return abs( $arg );
			},
			'acos'        => static function ( $arg ) {
				return acos( $arg );
			},
			'acosh'       => static function ( $arg ) {
				return acosh( $arg );
			},
			'arcsin'      => static function ( $arg ) {
				return asin( $arg );
			},
			'arcctg'      => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arccot'      => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arccotan'    => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arcsec'      => static function ( $arg ) {
				return acos( 1 / $arg );
			},
			'arccosec'    => static function ( $arg ) {
				return asin( 1 / $arg );
			},
			'arccsc'      => static function ( $arg ) {
				return asin( 1 / $arg );
			},
			'arccos'      => static function ( $arg ) {
				return acos( $arg );
			},
			'arctan'      => static function ( $arg ) {
				return atan( $arg );
			},
			'arctg'       => static function ( $arg ) {
				return atan( $arg );
			},
			'array'       => static function ( ...$args ) {
				return $args;
			},
			'asin'        => static function ( $arg ) {
				return asin( $arg );
			},
			'atan'        => static function ( $arg ) {
				return atan( $arg );
			},
			'atan2'       => static function ( $arg1, $arg2 ) {
				return atan2( $arg1, $arg2 );
			},
			'atanh'       => static function ( $arg ) {
				return atanh( $arg );
			},
			'atn'         => static function ( $arg ) {
				return atan( $arg );
			},
			'avg'         => static function ( $arg1, ...$args ) {
				if ( is_array( $arg1 ) ) {
					if ( 0 === count( $arg1 ) ) {
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
					}

					return array_sum( $arg1 ) / count( $arg1 );
				}

				$args = [ $arg1, ...$args ];

				return array_sum( $args ) / count( $args );
			},
			'bindec'      => static function ( $arg ) {
				return bindec( $arg );
			},
			'ceil'        => static function ( $arg ) {
				return ceil( $arg );
			},
			'cos'         => static function ( $arg ) {
				return cos( $arg );
			},
			'cosec'       => static function ( $arg ) {
				return 1 / sin( $arg );
			},
			'csc'         => static function ( $arg ) {
				return 1 / sin( $arg );
			},
			'cosh'        => static function ( $arg ) {
				return cosh( $arg );
			},
			'ctg'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'cot'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );},
			'cotan'       => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'cotg'        => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'ctn'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );},
			'decbin'      => static function ( $arg ) {
				return decbin( $arg );
			},
			'dechex'      => static function ( $arg ) {
				return dechex( $arg );
			},
			'decoct'      => static function ( $arg ) {
				return decoct( $arg );
			},
			'deg2rad'     => static function ( $arg ) {
				return deg2rad( $arg );
			},
			'exp'         => static function ( $arg ) {
				return exp( $arg );
			},
			'expm1'       => static function ( $arg ) {
				return expm1( $arg );
			},
			'floor'       => static function ( $arg ) {
				return floor( $arg );
			},
			'int'         => static function ( $arg ) {
				return floor( $arg );
			},
			'fmod'        => static function ( $arg1, $arg2 ) {
				return fmod( $arg1, $arg2 );
			},
			'hexdec'      => static function ( $arg ) {
				return hexdec( $arg );
			},
			'hypot'       => static function ( $arg1, $arg2 ) {
				return hypot( $arg1, $arg2 );
			},
			'if'          => function ( $expr, $trueval, $falseval ) {
				if ( true === $expr || false === $expr ) {
					$exres = $expr;
				} else {
					$exres = $this->execute( $expr );
				}

				if ( $exres ) {
					return $this->execute( $trueval );
				}

				return $this->execute( $falseval );
			},
			'intdiv'      => static function ( $arg1, $arg2 ) {
				return intdiv( $arg1, $arg2 );
			},
			'ln'          => static function ( $num, $base = M_E ) {
				return log( $num, $base );
			},
			'lg'          => static function ( $arg ) {
				return log10( $arg );
			},
			'log'         => static function ( $num, $base = M_E ) {
				return log( $num, $base );
			},
			'log10'       => static function ( $arg ) {
				return log10( $arg );
			},
			'log1p'       => static function ( $arg ) {
				return log1p( $arg );
			},
			'max'         => static function ( $arg1, ...$args ) {
				if ( is_array( $arg1 ) && 0 === count( $arg1 ) ) {
					return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
				}
				$array = is_array( $arg1 ) ? $arg1 : [ $arg1, ...$args ];
				$array = array_map( 'floatval', $array );

				return max( $array );
			},
			'min'         => static function ( $arg1, ...$args ) {
				if ( is_array( $arg1 ) && 0 === count( $arg1 ) ) {
					return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
				}
				$array = is_array( $arg1 ) ? $arg1 : [ $arg1, ...$args ];
				$array = array_map( 'floatval', $array );

				return min( $array );
			},
			'median'      => static function ( $arg1, ...$args ) {
				if ( is_array( $arg1 ) ) {
					if ( 0 === count( $arg1 ) ) {
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
					}

					$final_args = $arg1;
				} else {
					$final_args = [ $arg1, ...$args ];
				}

				$count = count( $final_args );
				sort( $final_args );
				$index = floor( $count / 2 );

				return ( $count & 1 ) ? $final_args[ $index ] : ( $final_args[ $index - 1 ] + $final_args[ $index ] ) / 2;
			},
			'octdec'      => static function ( $arg ) {
				return octdec( $arg );
			},
			'pi'          => static function () {
				return M_PI;
			},
			'pow'         => static function ( $arg1, $arg2 ) {
				return $arg1 ** $arg2;
			},
			'rad2deg'     => static function ( $arg ) {
				return rad2deg( $arg );
			},
			'round'       => static function ( $num, int $precision = 0 ) {
				return round( $num, $precision );
			},
			'sin'         => static function ( $arg ) {
				return sin( $arg );
			},
			'sinh'        => static function ( $arg ) {
				return sinh( $arg );
			},
			'sec'         => static function ( $arg ) {
				return 1 / cos( $arg );
			},
			'sqrt'        => static function ( $arg ) {
				return sqrt( $arg );
			},
			'tan'         => static function ( $arg ) {
				return tan( $arg );
			},
			'tanh'        => static function ( $arg ) {
				return tanh( $arg );
			},
			'tn'          => static function ( $arg ) {
				return tan( $arg );
			},
			'tg'          => static function ( $arg ) {
				return tan( $arg );
			},
			'lookuptable' => function ( $field, $lookup_table_id ) {
				$lookup_tables = THEMECOMPLETE_EPO()->fetch_lookuptables();
				$price         = 0;
				if ( $lookup_tables ) {
					$table_num = 0;
					if ( is_array( $lookup_table_id ) ) {
						$table_num       = isset( $lookup_table_id[1] ) ? (int) $lookup_table_id[1] : 0;
						$lookup_table_id = $lookup_table_id[0];
					}
					if ( ! $lookup_table_id ) {
						return 0;
					}
					if ( ! $table_num ) {
						$table_num = 0;
					}
					if ( is_array( $field ) ) {
						$x = $field[0];
						$y = isset( $field[1] ) ? $field[1] : '';
					} else {
						$x = $field;
						$y = '';
					}
					$table = $lookup_tables[ $lookup_table_id ];
					if ( $table ) {
						$table = $table[ $table_num ];
						if ( $table ) {
							$table = $table['data'];
							if ( is_numeric( $x ) && floatval( $x ) == $x ) { // phpcs:ignore
								$x = (float) $x;
							} else {
								$x = (string) $x;
							}
							if ( is_numeric( $y ) && floatval( $y ) == $y ) { // phpcs:ignore
								$y = (float) $y;
							} else {
								$y = (string) $y;
							}
							$x_row = false;
							if ( ! array_key_exists( strval( $x ), $table ) ) {
								if ( is_numeric( $x ) && ( (int) 0 === (int) $x ) ) {
									$x_row = $table[ array_keys( $table )[0] ];
								} elseif ( $x ) {
									$x = $this->find_lookup_table_index( $x, $table );
									if ( $x && isset( $table[ $x ] ) ) {
										$x_row = $table[ $x ];
									}
								}
							} else {
								$x_row = $table[ $x ];
							}
							if ( $x_row && is_array( $x_row ) ) {
								if ( $y ) {
									$y = $this->find_lookup_table_index( $y, $x_row );
								} else {
									$y = array_keys( $x_row );
									$y = $y[0];
								}

								if ( 'max' === $y ) {
									$price = (float) $x_row[ array_keys( $x_row )[ count( array_keys( $x_row ) ) - 1 ] ];
								} elseif ( isset( $x_row[ $y ] ) ) {
									$price = (float) $x_row[ $y ];
								}
							}
						}
					}
				}
				return $price;
			},
			'concat'      => static function ( $arg1, ...$args ) {
				if ( is_array( $arg1 ) && 0 === count( $arg1 ) ) {
					return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Array must contain at least one element!', 'InvalidArgumentError', 0 );
				}
				$array = is_array( $arg1 ) ? $arg1 : [ $arg1, ...$args ];

				return join( '', $array );
			},
		];
	}

	/**
	 * Check if the array has numeric values or max
	 *
	 * @param array<mixed> $arr The array to check.
	 * @return boolean
	 */
	private function has_numeric_values_or_max_last( $arr ) {
		$last_element = $arr[ count( $arr ) - 1 ];

		$are_all_numeric_values = array_reduce(
			$arr,
			function ( $carry, $val ) {
				return $carry && is_numeric( $val );
			},
			true
		);
		return $are_all_numeric_values || 'max' === $last_element;
	}

	/**
	 * Find the closest index on the provided $table
	 *
	 * @param mixed        $value The value to check.
	 * @param array<mixed> $table The table check the value against.
	 * @return string|false
	 */
	protected function find_lookup_table_index( $value, $table ) {

		$keys = array_keys( $table );

		if ( $this->has_numeric_values_or_max_last( $keys ) ) {
			$value = (float) $value;
			$table = array_map(
				function ( $n ) {
					return 'max' === $n ? $n : (float) $n;
				},
				$keys
			);

			$ret = array_reduce(
				$table,
				function ( $a, $b ) use ( $value ) {
					if ( 'max' === $b && $value > $a ) {
						return $b;
					}
					if ( 'max' === $a && $value > $b ) {
						return $a;
					}
					if ( $a < $b ) {
						if ( $value > $a && $value <= $b ) {
							return $b;
						}
					} else {
						if ( ( $value > $b && $value <= $a ) || ( $value > $a || 'max' === $b ) ) {
							return $a;
						}
						return $b;
					}
					if ( $value > $b ) {
						return $b;
					}
					return $a;
				}
			);

			$keys = [ ...$keys ];
			if ( $value > max( $keys ) || $value < min( $keys ) ) {
				return false;
			}
		} else {
			$ret = $value;
		}
		return (string) $ret;
	}

	/**
	 * Returns the default variables names as key/value pairs
	 *
	 * @return array<string, float>
	 */
	protected function default_vars(): array {
		return [
			'pi' => 3.141592653589793,
			'e'  => 2.718281828459045,
		];
	}

	/**
	 * Default variable validation, ensures that the value is a scalar or array.
	 *
	 * @param string $variable The variable to validate.
	 * @param mixed  $value The value to validate.
	 * @return mixed
	 */
	protected function default_var_validation( string $variable, $value ) {
		if ( ! is_scalar( $value ) && ! is_array( $value ) && null !== $value ) {
			$type = gettype( $value );

			return THEMECOMPLETE_EPO_MATH_Error::trigger( "Variable ({$variable}) type ({$type}) is not scalar or array!", 0 );
		}
		return $value;
	}
}

/**
 * Math Tokenizer class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_Tokenizer {

	/**
	 * Array of tokens.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Token>
	 */
	public $tokens = [];

	/**
	 * The input expression.
	 *
	 * @var string
	 */
	private $input = '';

	/**
	 * The number buffer.
	 *
	 * @var string
	 */
	private $number_buffer = '';

	/**
	 * The string buffer.
	 *
	 * @var string
	 */
	private $string_buffer = '';

	/**
	 * If negative number is allowed.
	 *
	 * @var boolean
	 */
	private $allow_negative = true;

	/**
	 * Array of operators.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Operator>
	 */
	private $operators = [];

	/**
	 * If the string has single quotes.
	 *
	 * @var boolean
	 */
	private $in_single_quoted_string = false;

	/**
	 * If the string has double quotes.
	 *
	 * @var boolean
	 */
	private $in_double_quoted_string = false;

	/**
	 * Tokenizer constructor.
	 *
	 * @param string       $input Input expression.
	 * @param array<mixed> $operators Operator array.
	 * @return void
	 */
	public function __construct( string $input, array $operators ) {
		$this->input     = $input;
		$this->operators = $operators;
	}

	/**
	 * Tokenize the expression.
	 *
	 * @return self
	 */
	public function tokenize(): self {
		$is_last_char_escape = false;

		foreach ( str_split( $this->input ) as $ch ) {
			switch ( true ) {
				case $this->in_single_quoted_string:
					if ( '\\' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '\\';
							$is_last_char_escape  = false;
						} else {
							$is_last_char_escape = true;
						}

						continue 2;
					} elseif ( "'" === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= "'";
							$is_last_char_escape  = false;
						} else {
							$this->tokens[]                = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::STRING, $this->string_buffer );
							$this->in_single_quoted_string = false;
							$this->string_buffer           = '';
						}

						continue 2;
					}

					if ( $is_last_char_escape ) {
						$this->string_buffer .= '\\';
						$is_last_char_escape  = false;
					}
					$this->string_buffer .= $ch;

					continue 2;

				case $this->in_double_quoted_string:
					if ( '\\' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '\\';
							$is_last_char_escape  = false;
						} else {
							$is_last_char_escape = true;
						}

						continue 2;
					} elseif ( '"' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '"';
							$is_last_char_escape  = false;
						} else {
							$this->tokens[]                = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::STRING, $this->string_buffer );
							$this->in_double_quoted_string = false;
							$this->string_buffer           = '';
						}

						continue 2;
					}

					if ( $is_last_char_escape ) {
						$this->string_buffer .= '\\';
						$is_last_char_escape  = false;
					}
					$this->string_buffer .= $ch;

					continue 2;

				case '[' === $ch:
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::FUNCTION, 'array' );
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS, '' );

					continue 2;

				case ' ' === $ch || "\n" === $ch || "\r" === $ch || "\t" === $ch:
					/**
					 * In case those tokens must not be ingored use the following
					 * $this->empty_number_buffer_as_literal();
					 * $this->empty_str_buffer_as_variable();
					 * $this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::SPACE, '' );
					 */
					continue 2;

				case $this->is_number( $ch ):
					if ( '' !== $this->string_buffer ) {
						$this->string_buffer .= $ch;

						continue 2;
					}
					$this->number_buffer .= $ch;
					$this->allow_negative = false;

					break;

				case 'e' === strtolower( $ch ):
					if ( strlen( $this->number_buffer ) && str_contains( $this->number_buffer, '.' ) ) {
						$this->number_buffer .= 'e';
						$this->allow_negative = false;

						break;
					}
					// no break
					// Intentionally fall through.
				case $this->is_alpha( $ch ):
					if ( strlen( $this->number_buffer ) ) {
						$this->empty_number_buffer_as_literal();
						$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '*' );
					}
					$this->allow_negative = false;
					$this->string_buffer .= $ch;

					break;

				case '"' === $ch:
					$this->in_double_quoted_string = true;

					continue 2;

				case "'" === $ch:
					$this->in_single_quoted_string = true;

					continue 2;

				case $this->is_dot( $ch ):
					$this->number_buffer .= $ch;
					$this->allow_negative = false;

					break;

				case $this->is_lp( $ch ):
					if ( '' !== $this->string_buffer ) {
						$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::FUNCTION, $this->string_buffer );
						$this->string_buffer = '';
					} elseif ( strlen( $this->number_buffer ) ) {
						$this->empty_number_buffer_as_literal();
						$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '*' );
					}
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS, '' );

					break;

				case $this->is_rp( $ch ) || ']' === $ch:
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();
					$this->allow_negative = false;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS, '' );

					break;

				case $this->is_comma( $ch ):
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::PARAMSEPARATOR, '' );

					break;

				default:
					// special case for unary operations.
					if ( '-' === $ch || '+' === $ch ) {
						if ( $this->allow_negative ) {
							$this->allow_negative = false;
							$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '-' === $ch ? 'uNeg' : 'uPos' );

							continue 2;
						}
						// could be in exponent, in which case negative should be added to the number_buffer.
						if ( $this->number_buffer && 'e' === $this->number_buffer[ strlen( $this->number_buffer ) - 1 ] ) {
							$this->number_buffer .= $ch;

							continue 2;
						}
					}
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();

					if ( '$' !== $ch ) {
						if ( count( $this->tokens ) > 0 ) {
							if ( THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $this->tokens[ count( $this->tokens ) - 1 ]->type ) {
								$this->tokens[ count( $this->tokens ) - 1 ]->value .= $ch;
							} else {
								$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, $ch );
							}
						} else {
							$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, $ch );
						}
					}
					$this->allow_negative = true;
			}
		}
		$this->empty_number_buffer_as_literal();
		$this->empty_str_buffer_as_variable();

		$token_test = [];
		foreach ( $this->tokens as $key => $token ) {
			$token_test[ $key ] = $token->type;
		}
		foreach ( $token_test as $key => $type ) {
			if ( $key > 0 && THEMECOMPLETE_EPO_MATH_Token::SPACE === $type && THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token_test[ $key + 1 ] && THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token_test[ $key - 1 ] ) {
				unset( $this->tokens[ $key - 1 ] );
				unset( $this->tokens[ $key + 1 ] );
				$this->tokens[ $key ] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 );
			}
		}
		return $this;
	}

	/**
	 * Create Reverse Polish Notation.
	 *
	 * @return THEMECOMPLETE_EPO_MATH_Token[] Array of tokens in reverse polish notation
	 */
	public function build_reverse_polish_notation(): array {
		$tokens        = [];
		$stack         = new SplStack();
		$param_counter = new SplStack();

		foreach ( $this->tokens as $token ) {
			try {
				switch ( $token->type ) {
					case THEMECOMPLETE_EPO_MATH_Token::LITERAL:
					case THEMECOMPLETE_EPO_MATH_Token::VARIABLE:
					case THEMECOMPLETE_EPO_MATH_Token::STRING:
						$tokens[] = $token;

						if ( $param_counter->count() > 0 && 0 === $param_counter->top() ) {
							$param_counter->push( $param_counter->pop() + 1 );
						}

						break;

					case THEMECOMPLETE_EPO_MATH_Token::FUNCTION:
						if ( $param_counter->count() > 0 && 0 === $param_counter->top() ) {
							$param_counter->push( $param_counter->pop() + 1 );
						}
						$stack->push( $token );
						$param_counter->push( 0 );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS:
						$stack->push( $token );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::PARAMSEPARATOR:
						while ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS !== $stack->top()->type ) {
							if ( 0 === $stack->count() ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
							}
							$tokens[] = $stack->pop();
						}
						$param_counter->push( $param_counter->pop() + 1 );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::OPERATOR:
						if ( ! array_key_exists( $token->value, $this->operators ) ) {
							return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownOperatorError', $tokens );
						}
						$op1 = $this->operators[ $token->value ];

						while ( $stack->count() > 0 && THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $stack->top()->type ) {
							if ( ! array_key_exists( $stack->top()->value, $this->operators ) ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( $stack->top()->value, 'UnknownOperatorError', $tokens );
							}
							$op2 = $this->operators[ $stack->top()->value ];

							if ( $op2->priority >= $op1->priority ) {
								$tokens[] = $stack->pop();

								continue;
							}

							break;
						}
						$stack->push( $token );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS:
						while ( true ) {
							try {
								$ctoken = $stack->pop();

								if ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS === $ctoken->type ) {
									break;
								}
								$tokens[] = $ctoken;
							} catch ( RuntimeException $e ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
							}
						}

						if ( $stack->count() > 0 && THEMECOMPLETE_EPO_MATH_Token::FUNCTION == $stack->top()->type ) { // phpcs:ignore
							$f              = $stack->pop();
							$f->param_count = $param_counter->pop();
							$tokens[]       = $f;
						}

						break;

					case THEMECOMPLETE_EPO_MATH_Token::SPACE:
						// do nothing.
				}
			} catch ( Exception $e ) {
				$tokens = [];
				return $tokens;
			}
		}

		while ( 0 !== $stack->count() ) {
			if ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS === $stack->top()->type || THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS === $stack->top()->type ) {
				return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
			}

			if ( THEMECOMPLETE_EPO_MATH_Token::SPACE === $stack->top()->type ) {
				$stack->pop();

				continue;
			}
			$tokens[] = $stack->pop();
		}

		return $tokens;
	}

	/**
	 * Check if the current character is a number.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_number( string $ch ): bool {
		return $ch >= '0' && $ch <= '9';
	}

	/**
	 * Check if the current character is an alpha character.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_alpha( string $ch ): bool {
		return $ch >= 'a' && $ch <= 'z' || $ch >= 'A' && $ch <= 'Z' || '_' === $ch;
	}

	/**
	 * Empty tye number buffer.
	 */
	private function empty_number_buffer_as_literal(): void {
		if ( strlen( $this->number_buffer ) ) {
			$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $this->number_buffer );
			$this->number_buffer = '';
		}
	}

	/**
	 * Check if the current character is a dot.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_dot( string $ch ): bool {
		return '.' === $ch;
	}

	/**
	 * Check if the current character is a left parenthesis.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_lp( string $ch ): bool {
		return '(' === $ch;
	}

	/**
	 * Check if the current character is a right parenthesis.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_rp( string $ch ): bool {
		return ')' === $ch;
	}

	/**
	 * Empty the string buffer.
	 */
	private function empty_str_buffer_as_variable(): void {
		if ( '' !== $this->string_buffer ) {
			$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::VARIABLE, $this->string_buffer );
			$this->string_buffer = '';
		}
	}

	/**
	 * Check if the current character is a comma.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_comma( string $ch ): bool {
		return ',' === $ch;
	}
}

/**
 * Math Token class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_Token {

	public const LITERAL          = 'literal';
	public const VARIABLE         = 'variable';
	public const OPERATOR         = 'operator';
	public const LEFTPARENTHESIS  = 'LP';
	public const RIGHTPARENTHESIS = 'RP';
	public const FUNCTION         = 'function';
	public const PARAMSEPARATOR   = 'separator';
	public const STRING           = 'string';
	public const SPACE            = 'space';

	/**
	 * Token type.
	 *
	 * @var string
	 */
	public $type = self::LITERAL;

	/**
	 * Token value.
	 *
	 * @var mixed
	 */
	public $value;

	/**
	 * Token name.
	 *
	 * @var string|null
	 */
	public $name;

	/**
	 * Store function parameter count in stack.
	 *
	 * @var integer|null
	 */
	public $param_count = null;

	/**
	 * Token constructor.
	 *
	 * @param string      $type Token type.
	 * @param mixed       $value Token value.
	 * @param string|null $name Token name.
	 */
	public function __construct( string $type, $value, ?string $name = null ) {
		$this->type  = $type;
		$this->value = $value;
		$this->name  = $name;
	}
}

/**
 * Math Operator class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_Operator {

	/**
	 * The custom operator.
	 *
	 * @var string
	 */
	public $operator = '';

	/**
	 * If it is a right associative operator.
	 *
	 * @var boolean
	 */
	public $is_right_assoc = false;

	/**
	 * Operator priority
	 *
	 * @var integer
	 */
	public $priority = 0;

	/**
	 * The callable function.
	 *
	 * @var callable(SplStack)
	 */
	public $function;

	/**
	 * The number of parameters for the operator.
	 *
	 * @var integer
	 */
	public $places = 0;

	/**
	 * Operator constructor.
	 *
	 * @param string  $operator The operator.
	 * @param boolean $is_right_assoc If it is a right associative operator.
	 * @param integer $priority Operator priority.
	 * @param Closure $func Operator Function.
	 */
	public function __construct( string $operator, bool $is_right_assoc, int $priority, Closure $func ) {
		$this->operator       = $operator;
		$this->is_right_assoc = $is_right_assoc;
		$this->priority       = $priority;
		$this->function       = $func;
		$reflection           = new ReflectionFunction( $func );
		$this->places         = $reflection->getNumberOfParameters();
	}

	/**
	 * Execute expression.
	 *
	 * @param array<mixed> $stack The array of tokens.
	 * @return THEMECOMPLETE_EPO_MATH_Token
	 */
	public function execute( array &$stack ): THEMECOMPLETE_EPO_MATH_Token {

		if ( count( $stack ) < $this->places ) {
			$stack = [];
			return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Expression', 'IncorrectExpressionError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 ) );
		}
		$args = [];

		for ( $i = 0; $i < $this->places; $i++ ) {
			array_unshift( $args, array_pop( $stack )->value );
		}

		$result = call_user_func_array( $this->function, $args );

		return new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $result );
	}
}

/**
 * Math Custom Function class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_CustomFunction {

	/**
	 * The function name.
	 *
	 * @var string
	 */
	public $name = '';

	/**
	 * The callable function.
	 *
	 * @var callable $function
	 */
	public $function;

	/**
	 * The required parameters of the function.
	 *
	 * @var integer
	 */
	private $required_param_count;

	/**
	 * CustomFunction constructor.
	 *
	 * @param string  $name The function name.
	 * @param Closure $func The callable function.
	 */
	public function __construct( string $name, Closure $func ) {
		$this->name                 = $name;
		$this->function             = $func;
		$this->required_param_count = ( new ReflectionFunction( $func ) )->getNumberOfRequiredParameters();
	}

	/**
	 * Execute expression.
	 *
	 * @param array<mixed> $stack The array of tokens.
	 * @param integer      $param_count_in_stack The function paramter count.
	 * @return THEMECOMPLETE_EPO_MATH_Token
	 */
	public function execute( array &$stack, int $param_count_in_stack ): THEMECOMPLETE_EPO_MATH_Token {

		if ( $param_count_in_stack < $this->required_param_count ) {
			$param_count_in_stack = $this->required_param_count;
		}

		// We skip this section.
		if ( $param_count_in_stack < $this->required_param_count ) {
			$stack = [];
			return THEMECOMPLETE_EPO_MATH_Error::trigger( $this->name, 'IncorrectNumberOfFunctionParametersError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 ) );
		}

		$args = [];
		if ( $param_count_in_stack > 0 ) {
			for ( $i = 0; $i < $param_count_in_stack; $i++ ) {
				$object = array_pop( $stack );
				if ( is_object( $object ) && property_exists( $object, 'value' ) ) {
					$argument = $object->value;
				} else {
					$argument = null;
				}
				if ( null === $argument ) {
					$argument = '0';
					array_push( $args, $argument );
				} else {
					array_unshift( $args, $argument );
				}
			}
		}

		$result = call_user_func_array( $this->function, $args );

		return new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $result );
	}
}

/**
 * Math Calculator class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_Calculator {

	/**
	 * Array of custom functions.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_CustomFunction>
	 */
	private $functions = [];

	/**
	 * Array of operators.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Operator>
	 */
	private $operators = [];

	/**
	 * Class Constructor
	 *
	 * @param array<string, THEMECOMPLETE_EPO_MATH_CustomFunction> $functions Array of custom functions.
	 * @param array<THEMECOMPLETE_EPO_MATH_Operator>               $operators Array of operators.
	 */
	public function __construct( array $functions, array $operators ) {
		$this->functions = $functions;
		$this->operators = $operators;
	}

	/**
	 * Calculate array of tokens in reverse polish notation
	 *
	 * @param array<THEMECOMPLETE_EPO_MATH_Token> $tokens Array of tokens.
	 * @param array<string, float|string>         $variables Array of variables.
	 * @param callable|null                       $on_var_not_found Variable not found handler.
	 * @param mixed                               $math_object The math class.
	 *
	 * @return integer|float|string|null
	 */
	public function calculate( array $tokens, array $variables, ?callable $on_var_not_found = null, $math_object = false ) {

		if ( empty( $tokens ) ) {
			return 0;
		}

		/** Array of THEMECOMPLETE_EPO_MATH_Token */
		$stack = [];

		foreach ( $tokens as $token ) {
			if ( THEMECOMPLETE_EPO_MATH_Token::LITERAL === $token->type || THEMECOMPLETE_EPO_MATH_Token::STRING === $token->type ) {
				$stack[] = $token;
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token->type ) {
				$variable = $token->value;

				$value = null;

				if ( array_key_exists( $variable, $variables ) ) {
					$value = $variables[ $variable ];
				} elseif ( $on_var_not_found ) {
					$value = call_user_func( $on_var_not_found, $variable );
				} else {
					$value                               = $variable;
					$math_object->variables[ $variable ] = $value;
					$variables[ $variable ]              = $value;
				}
				$stack[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $value, $variable );
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::FUNCTION === $token->type ) {
				if ( ! array_key_exists( $token->value, $this->functions ) ) {
					$math_object->add_function(
						$token->value,
						function () {
							return 0;
						}
					);
					$this->functions = $math_object->functions;
					if ( ! array_key_exists( $token->value, $this->functions ) ) {
						return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownFunctionError', 0 );
					} else {
						THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownFunctionError', 0 );
					}
				}
				$stack[] = $this->functions[ $token->value ]->execute( $stack, $token->param_count );
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $token->type ) {
				if ( ! array_key_exists( $token->value, $this->operators ) ) {
					return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownOperatorError', 0 );
				}
				$stack[] = $this->operators[ $token->value ]->execute( $stack );
			}
		}
		$result = array_pop( $stack );

		if ( null === $result || ! empty( $stack ) ) {
			return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Stack must be empty', 'IncorrectExpressionError', 0 );
		}

		if ( false === $result->value ) {
			$result->value = 0;
		}

		if ( true === $result->value ) {
			$result->value = 1;
		}

		if ( is_numeric( $result->value ) ) {
			$result->value = (float) $result->value;
		}

		return $result->value;
	}
}

/**
 * Math Error class
 *
 * Error handling for THEMECOMPLETE_EPO_MATH.
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_Error {

	/**
	 * Trigger an error, in a nice way.
	 *
	 * @param string $msg The message to output.
	 * @param mixed  $code The error code.
	 * @param mixed  $ret The value to return.
	 *
	 * @return mixed
	 */
	public static function trigger( $msg, $code = '', $ret = false ) {
		if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
			echo "\nError found in:";
			self::debug_print_calling_function();
			echo '<br>';
			echo esc_html( $code );
			echo '<br>';
			echo esc_html( $msg );
			echo '<br>';
			trigger_error( esc_html( $msg ), E_USER_WARNING ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
		}

		return $ret;
	}

	/**
	 * Prints the file name, function name, and
	 * line number which called your function
	 * (not this function, the one that called it to begin with)
	 *
	 * @return void
	 */
	private static function debug_print_calling_function() {
		$file        = 'n/a';
		$func        = 'n/a';
		$line        = 'n/a';
		$debug_trace = debug_backtrace(); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
		if ( isset( $debug_trace[1] ) ) {
			$file = isset( $debug_trace[1]['file'] ) ? $debug_trace[1]['file'] : 'n/a';
			$line = isset( $debug_trace[1]['line'] ) ? $debug_trace[1]['line'] : 'n/a';
		}
		if ( isset( $debug_trace[2] ) ) {
			$func = $debug_trace[2]['function'] ? $debug_trace[2]['function'] : 'n/a';
		}
		echo wp_kses_post( "\n$file, $func, $line\n" );
	}
}
includes/classes/class-themecomplete-epo-widgets.php000064400000001062150755142450016712 0ustar00<?php
/**
 * Extra Product Options Widgets
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Widgets
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
class THEMECOMPLETE_EPO_Widgets {

	/**
	 * Register all of the plugin widgets
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function register() {
		require_once THEMECOMPLETE_EPO_INCLUDES_PATH . 'widgets/class-themecomplete-epo-widget-action.php';
		register_widget( 'THEMECOMPLETE_EPO_Widget_Action' );
	}
}
includes/classes/class-themecomplete-epo-wpml-base.php000064400000131230150755142450017134 0ustar00<?php
/**
 * Extra Product Options WPML class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options WPML class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_WPML_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_WPML_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * If WPML is active
	 *
	 * @var boolean
	 */
	private $is_wpml = false;

	/**
	 * The $sitepress object from WPML
	 *
	 * @var mixed
	 */
	private $sitepress = false;

	/**
	 * The post type for our language meta box
	 *
	 * @var string|boolean
	 */
	private $basetype = false;

	/**
	 * The post type hook for our language meta box
	 *
	 * @var string|false
	 */
	private $basetypehook = false;

	/**
	 * Flag to indicate the removal of sql filters
	 *
	 * @var integer
	 */
	public $remove_sql_filters_done = 0;

	/**
	 * Flag to indicate the removal of term filters
	 *
	 * @var integer
	 */
	public $remove_term_filters_done = 0;

	/**
	 * Flag to indicate the removal of the get_terms_args filter
	 *
	 * @var integer
	 */
	public $remove_get_terms_args_done = 0;

	/**
	 * Flag to indicate the removal of the get_term filter
	 *
	 * @var integer
	 */
	public $remove_get_term_done = 0;

	/**
	 * Flag to indicate the removal of the terms_clauses filter
	 *
	 * @var integer
	 */
	public $remove_terms_clauses_done = 0;

	/**
	 * The post ID to use in the taxonomy terms checklist arguments
	 * to mark category IDs to mark as checked
	 *
	 * @var integer
	 */
	public $tmparentpostid_for_filter = 0;

	/**
	 * Flag to indicate the removal of the posts_where filter
	 *
	 * @var integer
	 */
	public $removed_posts_filter = 0;

	/**
	 * Cache for is_original_product function
	 *
	 * @var array<mixed>
	 */
	public $is_original_cache = [];

	/**
	 * Flag to indicate the removal of the get_terms filter
	 *
	 * @var integer
	 */
	public $remove_get_terms_done = 0;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_WPML_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		if ( class_exists( 'SitePress' ) ) {
			$this->is_wpml = true;
			global $sitepress;
			$this->sitepress = $sitepress;
		}
	}

	/**
	 * Check is WPML is active
	 *
	 * @return boolean
	 */
	public function is_active() {
		return $this->is_wpml;
	}

	/**
	 * Check is WPML Multi Currency is active
	 *
	 * @return boolean
	 */
	public function is_multi_currency() {
		global $woocommerce_wpml;
		$is_wpml_multi_currency_old  = $woocommerce_wpml && property_exists( $woocommerce_wpml, 'multi_currency' ) && $woocommerce_wpml->multi_currency;
		$is_wpml_multi_currency      = $woocommerce_wpml && property_exists( $woocommerce_wpml, 'settings' ) && defined( 'WCML_MULTI_CURRENCIES_INDEPENDENT' ) && WCML_MULTI_CURRENCIES_INDEPENDENT === $woocommerce_wpml->settings['enable_multi_currency'];
		$this_is_wpml_multi_currency = $is_wpml_multi_currency_old || $is_wpml_multi_currency;

		return $this_is_wpml_multi_currency;
	}

	/**
	 * Returns WPML instance
	 *
	 * @return mixed
	 */
	public function sitepress_instance() {
		return $this->sitepress;
	}

	/**
	 * Gets a flag image tag
	 *
	 * @param string  $lang The language code.
	 * @param integer $output If to return or print the result.
	 *
	 * @return mixed
	 */
	public function get_flag( $lang = 'all', $output = 0 ) {
		ob_start();

		if ( $this->is_wpml ) {
			$url = $this->get_flag_url( $lang );
			echo '<img class="tc-wmpl-flag" src="' . esc_url( $url ) . '"/>';
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}

	/**
	 * Returns the url of a flag image
	 *
	 * @param string $lang The language code.
	 * @return string
	 * @since 1.0
	 */
	public function get_flag_url( $lang = 'all' ) {
		$url = '';
		if ( $this->is_wpml && defined( 'ICL_PLUGIN_URL' ) ) {
			if ( empty( $lang ) ) {
				$url = $this->sitepress->get_flag_url( $this->get_default_lang() );
			} elseif ( 'all' === $lang ) {
				$url = ICL_PLUGIN_URL . '/res/img/icon.png';
			} else {
				$url = $this->sitepress->get_flag_url( $lang );
			}
			if ( empty( $url ) ) {
				$url = ICL_PLUGIN_URL . '/res/img/icon.png';
			}
		}

		return $url;
	}

	/**
	 * Get original post id
	 *
	 * @param mixed          $id The product id.
	 * @param string         $post_type The post type.
	 * @param string|boolean $basetype The post type to check against for the given $id.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_original_id( $id = 0, $post_type = 'product', $basetype = false ) {

		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
			if ( defined( 'THEMECOMPLETE_ECO_GLOBAL_POST_TYPE' ) && THEMECOMPLETE_ECO_GLOBAL_POST_TYPE === $post_type ) {
				$basetype = THEMECOMPLETE_ECO_GLOBAL_POST_TYPE;
			}
		}
		if ( $this->is_wpml && function_exists( 'icl_object_id' ) ) {
			$check_post = get_post( $id );
			if ( $check_post && property_exists( $check_post, 'ID' ) && property_exists( $check_post, 'post_type' ) ) {
				if ( ( 'auto-draft' === $check_post->post_status && 'AUTO-DRAFT' === $check_post->post_title ) || ! ( 'product' === $check_post->post_type || $check_post->post_type === $basetype ) ) {
					return $id;
				}
			}
			if ( 'product' === $post_type ) {
				$trid = 0;
				if ( $id ) {
					global $wpdb;
					$res = $this->sitepress->get_element_language_details( $id, 'post_' . $post_type );
					if ( isset( $res->trid ) ) {
						$trid = (int) $res->trid;
					}
					if ( $trid ) {
						$element_lang_code = $res->language_code;
					} else {
						$translation_id    = $this->sitepress->set_element_language_details( $id, 'post_' . $post_type, null, $this->get_lang() );
						$trid              = $wpdb->get_var( $wpdb->prepare( "SELECT trid FROM {$wpdb->prefix}icl_translations WHERE translation_id = %d", [ $translation_id ] ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
						$element_lang_code = $this->get_lang();
					}
				} else {
					$trid              = isset( $_GET['trid'] ) ? (int) $_GET['trid'] : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$element_lang_code = isset( $_GET['lang'] ) ? wp_strip_all_tags( wp_unslash( $_GET['lang'] ) ) : $this->get_lang(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}

				$translations = [];
				if ( $trid ) {
					$translations = $this->sitepress->get_element_translations( $trid, 'post_' . $post_type );
				}
				foreach ( $translations as $key => $value ) {
					if ( null === $value->source_language_code ) {
						return absint( $value->element_id );
					}
				}

				return absint( icl_object_id( $id, 'any', true, $this->get_default_lang() ) );
			} elseif ( $post_type === $basetype ) {
				if ( ! empty( $_GET['tmparentpostid'] ) && ! empty( $_GET['tmaddlang'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					&& ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				) {
					return absint( $_GET['tmparentpostid'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				} else {
					$tm_meta_parent_post_id = themecomplete_get_post_meta( $id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true );
					if ( $tm_meta_parent_post_id && (float) $tm_meta_parent_post_id !== (float) $id ) {
						return absint( $tm_meta_parent_post_id );
					}

					return $id;
				}
			}
		}
		return $id;
	}

	/**
	 * Get product post id of current lang or $lang
	 *
	 * @param integer      $id The product id.
	 * @param string       $post_type The post type.
	 * @param string       $lang The language code.
	 * @param string|false $basetype The post type to check against for the given $id.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_current_id( $id = 0, $post_type = 'product', $lang = null, $basetype = false ) {
		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
			if ( defined( 'THEMECOMPLETE_ECO_GLOBAL_POST_TYPE' ) && THEMECOMPLETE_ECO_GLOBAL_POST_TYPE === $post_type ) {
				$basetype = THEMECOMPLETE_ECO_GLOBAL_POST_TYPE;
			}
		}
		if ( $this->is_wpml && function_exists( 'icl_object_id' ) ) {
			if ( null === $lang ) {
				$lang = $this->get_lang();
			}
			$check_post = get_post( $id );
			if ( $check_post && property_exists( $check_post, 'ID' ) && property_exists( $check_post, 'post_type' ) ) {
				if ( ! ( 'product' === $check_post->post_type || $check_post->post_type === $basetype ) ) {
					return $id;
				}
			}
			if ( 'product' === $post_type ) {

				if ( $id ) {
					global $wpdb;
					$trid = 0;
					$res  = $this->sitepress->get_element_language_details( $id, 'post_' . $post_type );
					if ( $res && property_exists( $res, 'trid' ) ) {
						$trid = (int) $res->trid;
					}
					if ( $trid ) {
						$element_lang_code = $res->language_code;
					} else {
						$translation_id    = $this->sitepress->set_element_language_details( $id, 'post_' . $post_type, null, $lang );
						$trid              = $wpdb->get_var( $wpdb->prepare( "SELECT trid FROM {$wpdb->prefix}icl_translations WHERE translation_id = %d", [ $translation_id ] ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
						$element_lang_code = $lang;
					}
				} else {
					$trid              = isset( $_GET['trid'] ) ? (int) $_GET['trid'] : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$element_lang_code = isset( $_GET['lang'] ) ? wp_strip_all_tags( wp_unslash( $_GET['lang'] ) ) : $lang; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}

				$translations = [];
				if ( $trid ) {
					$translations = $this->sitepress->get_element_translations( $trid, 'post_' . $post_type );
				}
				if ( isset( $translations[ $lang ] ) ) {
					return absint( $translations[ $lang ]->element_id );
				}

				return absint( icl_object_id( $id, 'any', false, $lang ) );
			}
		}
		return $id;
	}

	/**
	 * Check if original product
	 *
	 * @param mixed          $product_id The product id.
	 * @param string         $post_type The post type.
	 * @param string|boolean $basetype The post type to check against for the given $id.
	 * @return boolean
	 * @since 1.0
	 */
	public function is_original_product( $product_id, $post_type = 'product', $basetype = false ) {
		$product_id = absint( $product_id );
		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
			if ( defined( 'THEMECOMPLETE_ECO_GLOBAL_POST_TYPE' ) && THEMECOMPLETE_ECO_GLOBAL_POST_TYPE === $post_type ) {
				$basetype = THEMECOMPLETE_ECO_GLOBAL_POST_TYPE;
			}
		}

		if ( ! isset( $this->is_original_cache[ $product_id ] ) ) {
			$this->is_original_cache[ $product_id ] = 0;
		}

		if ( 0 !== $this->is_original_cache[ $product_id ] ) {
			return $this->is_original_cache[ $product_id ];
		}

		if ( $this->is_wpml ) {
			global $wpdb;
			if ( 'product' === $post_type ) {
				$is_original = (bool) $wpdb->get_var( $wpdb->prepare( "SELECT source_language_code IS NULL FROM {$wpdb->prefix}icl_translations WHERE element_id=%d AND element_type='post_product'", $product_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
			} elseif ( $post_type === $basetype ) {
				if ( ! empty( $_GET['tmparentpostid'] ) && ! empty( $_GET['tmaddlang'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					&& ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				) {
					$is_original = false;
				} else {
					$tm_meta_parent_post_id = absint( themecomplete_get_post_meta( $product_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true ) );
					if ( $tm_meta_parent_post_id && $tm_meta_parent_post_id !== $product_id ) {
						$is_original = false;
					} else {
						$is_original = true;
					}
				}
			}
			if ( ! isset( $is_original ) ) {
				$is_original = true;
			}

			$this->is_original_cache[ $product_id ] = $is_original;

			return $is_original;
		} else {
			$this->is_original_cache[ $product_id ] = true;
			return true;
		}
	}

	/**
	 * Remove sql filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function remove_sql_filter() {
		if ( $this->is_wpml ) {
			remove_action( 'parse_query', [ $this->sitepress, 'parse_query' ] );
			$this->remove_sql_filters_done = 1;
		}
	}

	/**
	 * Restore sql filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function restore_sql_filter() {
		if ( $this->is_wpml ) {
			// restore WPML term filters.
			add_action( 'parse_query', [ $this->sitepress, 'parse_query' ] ); // @phpstan-ignore-line
			$this->remove_sql_filters_done = 0;
		}
	}

	/**
	 * Removes WPML term filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function remove_term_filters() {
		if ( $this->is_wpml ) {
			// remove WPML term filters.
			if ( false !== has_filter( 'get_terms_args', [ $this->sitepress, 'get_terms_args_filter' ] ) ) {
				remove_filter( 'get_terms_args', [ $this->sitepress, 'get_terms_args_filter' ] );
				$this->remove_get_terms_args_done = 1;
			}
			if ( false !== has_filter( 'get_term', [ $this->sitepress, 'get_term_adjust_id' ] ) ) {
				remove_filter( 'get_term', [ $this->sitepress, 'get_term_adjust_id' ], 1 );
				$this->remove_get_terms_done = 1;
			}
			if ( false !== has_filter( 'terms_clauses', [ $this->sitepress, 'terms_clauses' ] ) ) {
				remove_filter( 'terms_clauses', [ $this->sitepress, 'terms_clauses' ] );
				$this->remove_terms_clauses_done = 1;
			}
			$this->remove_term_filters_done = 1;
		}
	}

	/**
	 * Restores WPML term filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function restore_term_filters() {
		if ( $this->is_wpml ) {
			// restore WPML term filters.
			if ( 1 === $this->remove_get_terms_args_done ) {
				add_filter( 'terms_clauses', [ $this->sitepress, 'terms_clauses' ], 10, 4 ); // @phpstan-ignore-line
				$this->remove_get_terms_args_done = 0;
			}
			if ( 1 === $this->remove_get_terms_done ) {
				add_filter( 'get_term', [ $this->sitepress, 'get_term_adjust_id' ], 1, 1 ); // @phpstan-ignore-line
				$this->remove_get_terms_done = 0;
			}
			if ( 1 === $this->remove_terms_clauses_done ) {
				add_filter( 'get_terms_args', [ $this->sitepress, 'get_terms_args_filter' ], 10, 2 ); // @phpstan-ignore-line
				$this->remove_terms_clauses_done = 0;
			}
			$this->remove_term_filters_done = 0;
		}
	}

	/**
	 * Applies the 'wp_terms_checklist_args' filter
	 *
	 * @param integer $post_id The post id.
	 * @return void
	 * @since 1.0
	 */
	public function apply_wp_terms_checklist_args_filter( $post_id ) {
		if ( $this->is_wpml ) {
			$this->tmparentpostid_for_filter = $post_id;
			add_filter( 'wp_terms_checklist_args', [ $this, 'wp_terms_checklist_args_filter' ], 10, 1 );
		}
	}

	/**
	 * Wp_terms_checklist_args filter
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wp_terms_checklist_args_filter( $args ) {
		if ( $this->is_wpml ) {
			$args['selected_cats'] = wp_get_object_terms( $this->tmparentpostid_for_filter, 'product_cat', array_merge( $args, [ 'fields' => 'ids' ] ) );
			if ( is_array( $args['selected_cats'] ) ) {
				foreach ( $args['selected_cats'] as $key => $term ) {
					$args['selected_cats'][ $key ] = apply_filters( 'translate_object_id', $term, 'product_cat', false );
				}
			}
		}

		return $args;
	}

	/**
	 * Applies the 'request' filter
	 *
	 * @return void
	 * @since 1.0
	 */
	public function apply_query_filter() {
		if ( $this->is_wpml && 'all' !== $this->get_lang() ) {
			add_filter( 'request', [ $this, 'request_filter' ] );
			global $wpml_query_filter;
			if ( has_filter( 'posts_where', [ $wpml_query_filter, 'posts_where_filter' ] ) ) {
				remove_filter( 'posts_where', [ $wpml_query_filter, 'posts_where_filter' ], 10 );
				$this->removed_posts_filter = 1;
			}
		}
	}

	/**
	 * Removes the 'request' filter
	 *
	 * @return void
	 * @since 1.0
	 */
	public function remove_query_filter() {
		if ( $this->is_wpml && 'all' !== $this->get_lang() ) {
			remove_filter( 'request', [ $this, 'request_filter' ] );
			if ( $this->removed_posts_filter ) {
				global $wpml_query_filter;
				add_filter( 'posts_where', [ $wpml_query_filter, 'posts_where_filter' ], 10, 2 ); // @phpstan-ignore-line
			}
		}
	}

	/**
	 * 'request' filter: adds meta args to query_vars
	 *
	 * @param array<mixed> $query_vars Array of request query variables.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function request_filter( $query_vars ) {
		if ( $this->is_wpml && 'all' !== $this->get_lang() ) {
			if ( $this->get_lang() !== $this->get_default_lang() ) {
				$query_vars['meta_query'] = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $this->get_lang(), '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
			} else {
				$query_vars['meta_query'] = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'OR', THEMECOMPLETE_EPO_WPML_LANG_META, $this->get_lang(), '=', 'NOT EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
			}
		}

		return $query_vars;
	}

	/**
	 * Order terms
	 *
	 * @param array<mixed> $t1 Current terms.
	 * @param array<mixed> $t2 Default terms.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function order_terms( $t1, $t2 ) {
		if ( ! $this->is_wpml ) {
			return $t1;
		}
		$d      = [];
		$o      = [];
		$new_t1 = [];
		foreach ( $t1 as $key => $value ) {
			$o[ $value->term_id ] = $value;
		}
		foreach ( $t2 as $key => $value ) {
			$d[ $value->term_id ] = $value;
		}

		foreach ( $d as $key => $value ) {
			if ( isset( $o[ $key ] ) ) {
				$new_t1[] = $o[ $key ];
			}
		}

		return $new_t1;
	}

	/**
	 * Merge terms
	 *
	 * @param array<mixed> $t1 Current terms.
	 * @param array<mixed> $t2 Default terms.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function merge_terms( $t1, $t2 ) {
		if ( ! $this->is_wpml ) {
			return $t1;
		}
		$d = [];
		$o = [];
		foreach ( $t1 as $key => $value ) {
			$o[ $value->trid ] = $value;
		}
		foreach ( $t2 as $key => $value ) {
			$d[ $value->trid ] = $value;
		}

		foreach ( $d as $key => $value ) {
			if ( isset( $o[ $key ] ) ) {
				$d[ $key ] = $o[ $key ];
			}
		}

		return $d;
	}

	/**
	 * Merge term slugs
	 *
	 * @param array<mixed> $t1 Current terms.
	 * @param array<mixed> $t2 Default terms.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function merge_terms_slugs( $t1, $t2 ) {
		$t2_slug = [];
		$o       = [];
		if ( ! $this->is_wpml ) {
			foreach ( $t1 as $key => $value ) {
				$o[ $value->trid ] = $value;
			}
			foreach ( $o as $trid => $term ) {
				$t2_slug[ $term->slug ] = $term->slug;
			}

			return $t2_slug;
		}
		$d       = [];
		$t1_slug = [];

		foreach ( $t1 as $key => $value ) {
			$o[ $value->trid ] = $value;
		}
		foreach ( $t2 as $key => $value ) {
			$d[ $value->trid ] = $value;
		}

		foreach ( $o as $trid => $term ) {
			$t1_slug[ $trid ] = $term->slug;
		}

		foreach ( $d as $trid => $term ) {
			if ( isset( $t1_slug[ $trid ] ) ) {
				$t2_slug[ $t1_slug[ $trid ] ] = $term->slug;
			} else {
				$t2_slug[ $term->slug ] = $term->slug;
			}
		}

		return $t2_slug;
	}

	/**
	 * Get taxonomy terms without WPML filters if lang is null (use to get all terms for all languages)
	 *
	 * @param string|null  $lang The language code.
	 * @param string       $taxonomy The taxonomy.
	 * @param array<mixed> $args Array of arguments.
	 * @param integer      $post_id The post id.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_terms( $lang = null, $taxonomy = '', $args = [], $post_id = 0 ) {
		$term_args = array_merge( $args, [ 'taxonomy' => $taxonomy ] );
		if ( ! $this->is_wpml ) {
			if ( ! empty( $post_id ) ) {
				$terms     = [];
				$all_terms = get_terms( $term_args );
				if ( is_array( $all_terms ) ) {
					foreach ( $all_terms as $term ) {
						if ( $term instanceof WP_Term && has_term( absint( $term->term_id ), $taxonomy, $post_id ) ) {
							$terms[] = $term;
						}
					}
				}

				return $terms;
			} else {
				$terms = get_terms( $term_args );
				if ( ! is_array( $terms ) ) {
					$terms = [];
				}
				return $terms;
			}
		}
		$terms = [];
		if ( null === $lang ) {
			$this->remove_term_filters();

			$all_terms = get_terms( $term_args );
			if ( ! empty( $post_id ) ) {
				$terms = [];
				if ( is_array( $all_terms ) ) {
					foreach ( $all_terms as $term ) {
						if ( $term instanceof WP_Term && has_term( absint( $term->term_id ), $taxonomy, $post_id ) ) {
							$terms[] = $term;
						}
					}
				}
			} else {
				$terms = $all_terms;
				if ( ! is_array( $terms ) ) {
					$terms = [];
				}
			}
			$this->restore_term_filters();
		} elseif ( class_exists( 'WPML_Taxonomy_Translation_Screen_Data' ) ) {
			$terms      = [];
			$terms_data = new WPML_Taxonomy_Translation_Screen_Data( $this->sitepress, $taxonomy );
			$terms_data = $terms_data->terms();
			if ( isset( $terms_data['terms'] ) ) {
				$terms_data = $terms_data['terms'];
			}

			foreach ( $terms_data as $key => $value ) {
				if ( isset( $value[ $lang ] ) ) {
					if ( ! empty( $post_id ) ) {
						if ( has_term( absint( $value[ $lang ]->term_id ), $taxonomy, $post_id ) ) {
							$terms[] = $value[ $lang ];
						}
					} else {
						$terms[] = $value[ $lang ];
					}
				}
			}
		}

		return $terms;
	}

	/**
	 * Sets WPML active language
	 *
	 * @param string $lang The language code.
	 * @return void
	 * @since 1.0
	 */
	public function set_lang( $lang = '' ) {
		if ( $lang && $this->is_wpml ) {
			$this->sitepress->switch_lang( $lang );
		}
	}

	/**
	 * Gets WPML current displayed language
	 *
	 * @return string
	 * @since 1.0
	 */
	public function get_lang() {
		if ( $this->is_wpml ) {
			return $this->sitepress->get_current_language();
		}

		return 'all';
	}

	/**
	 * Gets WPML default language
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function get_default_lang() {

		if ( $this->is_wpml ) {
			return $this->sitepress->get_default_language();
		}

		return false;
	}

	/**
	 * Returns all WPML languages
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function get_active_languages() {
		if ( $this->is_wpml ) {
			return $this->sitepress->get_active_languages();
		}

		return false;
	}

	/**
	 * Sets WPML current language depending on displayed global epo
	 *
	 * @param string|false $basetype The post type for our language meta box.
	 * @return void
	 * @since 1.0
	 */
	public function set_post_lang( $basetype = false ) {
		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
		}
		if ( $this->is_wpml ) {
			remove_action( 'admin_footer', [ $this->sitepress, 'language_filter' ] );
			remove_action( 'admin_enqueue_scripts', [ $this->sitepress, 'language_filter' ] );

			$post_id = false;
			if (
				( isset( $_REQUEST['action'] ) && 'edit' === $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				&&
				( isset( $_REQUEST['post'] ) || isset( $_POST['post_ID'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification
			) {

				if ( isset( $_GET['post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$post_id = (int) $_GET['post']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				} elseif ( isset( $_POST['post_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
					$post_id = (int) $_POST['post_ID']; // phpcs:ignore WordPress.Security.NonceVerification
				}

				if ( ! empty( $post_id ) ) {

					$meta_lang              = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
					$tm_meta_parent_post_id = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true );

					if ( (
							( empty( $tm_meta_parent_post_id ) && empty( $meta_lang ) )
							||
							( ! empty( $tm_meta_parent_post_id ) && ! empty( $meta_lang ) )
						)
						&& ! empty( $_GET['lang'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					) {

						if ( $_GET['lang'] !== $meta_lang ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended

							$url = isset( $_SERVER['REQUEST_URI'] ) ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : home_url();
							$url = remove_query_arg( [ 'post', 'lang' ], $url );

							$args                 = [
								'post_type'   => $basetype,
								'post_status' => [ 'publish' ], // get only enabled global extra options.
								'numberposts' => -1,
								'orderby'     => 'date',
								'order'       => 'asc',
								'meta_query'  => THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, sanitize_text_field( wp_unslash( $_GET['lang'] ) ), '=', 'EXISTS' ), // phpcs:ignore WordPress.DB.SlowDBQuery, WordPress.Security.NonceVerification.Recommended
							];
							$args['meta_query'][] = [
								'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
								'value'   => $tm_meta_parent_post_id,
								'compare' => '=',
							];
							$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
							if ( ! empty( $other_translations ) && isset( $other_translations[0] ) && is_object( $other_translations[0] ) && property_exists( $other_translations[0], 'ID' ) ) {// has $key code translation.
								$tm_meta_parent_post_id = $other_translations[0]->ID;
								$url                    = add_query_arg( 'post', $tm_meta_parent_post_id, $url );
							} else {
								$url = remove_query_arg( [ 'action', 'tmparentpostid', 'tmaddlang' ], $url );
								if ( empty( $tm_meta_parent_post_id ) ) {
									$tm_meta_parent_post_id = $post_id;
								}
								$url = add_query_arg(
									[
										'action'         => 'add',
										'tmparentpostid' => $tm_meta_parent_post_id,
										'tmaddlang'      => sanitize_text_field( wp_unslash( $_GET['lang'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
									],
									$url
								);
							}
							$url = esc_url_raw( $url );
							wp_safe_redirect( $url );
							exit;
						}
					}
					if ( empty( $meta_lang ) ) {
						$this->set_lang( $this->get_default_lang() );
					} else {
						$this->set_lang( $meta_lang );
					}
				}
			} elseif ( ! empty( $_GET['tmparentpostid'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					&& ! empty( $_GET['tmaddlang'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					&& ( isset( $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					&& 'add' === $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			) {

				$args = [
					'post_type'   => $basetype,
					'post_status' => [ 'publish' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'date',
					'order'       => 'asc',
				];

				if ( ! empty( $_GET['lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$url = esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) );
					$url = remove_query_arg( [ 'tmaddlang', 'lang' ], $url );
					$url = add_query_arg(
						[
							'tmaddlang' => sanitize_text_field( wp_unslash( $_GET['lang'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						],
						$url
					);

					$args['meta_query']   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, sanitize_text_field( wp_unslash( $_GET['lang'] ) ), '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery, WordPress.Security.NonceVerification.Recommended
					$args['meta_query'][] = [
						'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
						'value'   => sanitize_text_field( wp_unslash( $_GET['tmparentpostid'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						'compare' => '=',
					];
					$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
					if ( ! empty( $other_translations ) ) {
						$url = remove_query_arg( [ 'action', 'tmaddlang', 'tmparentpostid' ], $url );
						$url = add_query_arg(
							[
								'action' => 'edit',
								'post'   => $other_translations[0]->ID,
								'lang'   => sanitize_text_field( wp_unslash( $_GET['lang'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							],
							$url
						);
					}
					$url = esc_url_raw( $url );
					wp_safe_redirect( $url );
					exit;
				}

				$args['meta_query']   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, sanitize_text_field( wp_unslash( $_GET['tmaddlang'] ) ), '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery, WordPress.Security.NonceVerification.Recommended
				$args['meta_query'][] = [
					'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
					'value'   => sanitize_text_field( wp_unslash( $_GET['tmparentpostid'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					'compare' => '=',
				];
				$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
				if ( ! empty( $other_translations ) ) {
					$url = esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) );
					$url = remove_query_arg( [ 'action', 'tmaddlang', 'tmparentpostid' ], $url );
					$url = add_query_arg(
						[
							'action' => 'edit',
							'post'   => $other_translations[0]->ID,
							'lang'   => sanitize_text_field( wp_unslash( $_GET['tmaddlang'] ) ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						],
						$url
					);
					$url = esc_url_raw( $url );
					wp_safe_redirect( $url );
					exit;
				}

				$this->set_lang( sanitize_text_field( wp_unslash( $_GET['tmaddlang'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended

			} elseif ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( ! empty( $_GET['lang'] ) && 'all' === $_GET['lang'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$url = esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) );
					$url = remove_query_arg( [ 'lang' ], $url );
					$url = add_query_arg(
						[
							'lang' => $this->get_default_lang(),
						],
						$url
					);
					$url = esc_url_raw( $url );
					wp_safe_redirect( $url );
					exit;
				}
			}
		}
	}

	/**
	 * Returns add global epo link
	 *
	 * @param integer      $post_id The current post id.
	 * @param string       $lang The language code.
	 * @param array<mixed> $v Language data array from WPML.
	 * @param string|false $basetypehook The post type hook for our language meta box.
	 * @param integer      $output If the result should be returned or printed.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function add_lang_link( $post_id, $lang, $v, $basetypehook = false, $output = 0 ) {
		ob_start();
		if ( false === $basetypehook ) {
			$basetypehook = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		}

		$post_new_file = apply_filters( 'wc_epo_add_lang_link', 'edit.php?post_type=product&page=' . $basetypehook . '&action=add', $basetypehook );

		$post_new_file = admin_url( $post_new_file );

		if ( $this->is_wpml ) {
			/* translators: %s Language */
			$alt           = sprintf( esc_html__( 'Add translation to %s', 'sitepress' ), $v['display_name'] );
			$post_new_file = add_query_arg(
				[
					'tmparentpostid' => $post_id,
					'tmaddlang'      => $lang,
				],
				$post_new_file
			);
			echo '<a title="' . esc_attr( $alt ) . '" alt="' . esc_attr( wp_strip_all_tags( $alt ) ) . '" class="tmwpmllink" href="' . esc_url( $post_new_file ) . '"><i class="tcfa tcfa-plus"></i></a>';
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}

		return $post_new_file;
	}

	/**
	 * Returns edit global epo link
	 *
	 * @param integer      $post_id The current post id.
	 * @param string       $lang The language code.
	 * @param array<mixed> $v Language data array from WPML.
	 * @param integer      $main_post_id The main post id..
	 * @param boolean      $noadd Add the url link arguments or not.
	 * @param string|false $basetypehook The post type hook for our language meta box.
	 * @param integer      $output If the result should be returned or printed.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function edit_lang_link( $post_id, $lang, $v, $main_post_id, $noadd = false, $basetypehook = false, $output = 0 ) {
		ob_start();

		if ( false === $basetypehook ) {
			$basetypehook = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		}

		$post_new_file = apply_filters( 'wc_epo_edit_lang_link', 'edit.php?post_type=product&page=' . $basetypehook . '&action=edit&post=' . $post_id );

		if ( defined( 'THEMECOMPLETE_ECO_GLOBAL_POST_TYPE_PAGE_HOOK' ) && THEMECOMPLETE_ECO_GLOBAL_POST_TYPE_PAGE_HOOK === $basetypehook ) {
			$post_new_file = 'admin.php?bpost_type=product&page=' . $basetypehook . '&action=edit&post=' . $post_id;
		}

		$post_new_file = admin_url( $post_new_file );
		if ( $this->is_wpml ) {
			/* translators: %s Language */
			$alt = sprintf( esc_html__( 'Edit the %s translation', 'sitepress' ), $v['display_name'] );
			if ( empty( $noadd ) ) {
				$post_new_file = add_query_arg(
					[
						'tmparentpostid' => $main_post_id,
						'tmaddlang'      => $lang,
					],
					$post_new_file
				);
			}
			echo '<a title="' . esc_attr( $alt ) . '" alt="' . esc_attr( wp_strip_all_tags( $alt ) ) . '" class="tmwpmllink" href="' . esc_url( $post_new_file ) . '"><i class="tcfa tcfa-edit"></i></a>';
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}

	/**
	 * Adds WPML meta box
	 *
	 * @param string|false $basetype The post type for our language meta box.
	 * @param string|false $basetypehook The post type hook for our language meta box.
	 * @return void
	 * @since 1.0
	 */
	public function add_meta_box( $basetype = false, $basetypehook = false ) {
		if ( false === $basetype ) {
			$basetype = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE;
		}
		if ( false === $basetypehook ) {
			$basetypehook = THEMECOMPLETE_EPO_GLOBAL_POST_TYPE_PAGE_HOOK;
		}
		$this->basetype     = $basetype;
		$this->basetypehook = $basetypehook;
		if ( $this->is_wpml ) {
			add_meta_box( 'icl_div', esc_html__( 'Language', 'woocommerce-tm-extra-product-options' ), [ $this, 'meta_box' ], null, 'side', 'high' );
		}
	}

	/**
	 * Displayes WPML meta box
	 *
	 * @param WP_Post $post The post object.
	 * @return void
	 * @since 1.0
	 */
	public function meta_box( $post ) {
		$basetype     = $this->basetype;
		$basetypehook = $this->basetypehook;
		if ( $this->is_wpml ) {

			global $wp_post_types;
			$post_type_label        = ( '' !== $wp_post_types[ $basetype ]->labels->singular_name ? $wp_post_types[ $basetype ]->labels->singular_name : $wp_post_types[ $basetype ]->labels->name );
			$tmparentpostid         = 0;
			$tmaddlang              = '';
			$post_id                = absint( $post->ID );
			$tm_meta_lang           = themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
			$tm_meta_parent_post_id = absint( themecomplete_get_post_meta( $post_id, THEMECOMPLETE_EPO_WPML_PARENT_POSTID, true ) );
			$is_original            = false;
			$is_added_translation   = false;
			$is_original_lang       = '';
			$active_languages       = $this->get_active_languages();
			$is_new                 = false;
			$is_add                 = false;

			// existing global epo before WPML || new global epo after WPML.
			if ( ( ! empty( $post_id ) && empty( $tm_meta_lang ) && empty( $tm_meta_parent_post_id ) )
				|| ( ! empty( $post_id ) && 0 === $tm_meta_parent_post_id && ! empty( $tm_meta_lang ) )
				|| ( ! empty( $post_id ) && $tm_meta_parent_post_id === $post_id )
			) {
				$is_original = true;
			}

			if ( ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( ! empty( $_GET['tmparentpostid'] ) && ! empty( $_GET['tmaddlang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$tmparentpostid       = (int) $_GET['tmparentpostid']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$tmaddlang            = sanitize_text_field( wp_unslash( $_GET['tmaddlang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$is_added_translation = true;
					$is_original_lang     = themecomplete_get_post_meta( $tmparentpostid, THEMECOMPLETE_EPO_WPML_LANG_META, true );
					if ( empty( $is_original_lang ) ) {
						$is_original_lang = $this->get_default_lang();
					}
					if ( $is_original_lang !== $tmaddlang ) {
						$is_original = false;
					}
					$is_add = true;
				} elseif ( empty( $_GET['tmparentpostid'] ) || empty( $_GET['tmaddlang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$is_original      = true;
					$is_original_lang = $this->get_lang();
					$tm_meta_lang     = $is_original_lang;
					$tmaddlang        = $is_original_lang;
					$is_new           = true;
				}
			}

			if ( $is_original && empty( $tm_meta_lang ) ) {
				$is_original_lang = $this->get_default_lang();
				$tm_meta_lang     = $is_original_lang;
				$tmaddlang        = $is_original_lang;
			}

			if ( $is_original && empty( $tmparentpostid ) ) {
				$tmparentpostid = $post_id;
			}

			if ( ! $is_original && empty( $is_original_lang ) && ! empty( $tm_meta_parent_post_id ) ) {
				$is_original_lang = themecomplete_get_post_meta( $tm_meta_parent_post_id, THEMECOMPLETE_EPO_WPML_LANG_META, true );
				if ( empty( $is_original_lang ) ) {
					$is_original_lang = $this->get_default_lang();
				}
				if ( empty( $tmparentpostid ) ) {
					$tmparentpostid = $tm_meta_parent_post_id;
				}
			}

			if ( ! $is_original && empty( $tmaddlang ) ) {
				$tmaddlang = $tm_meta_lang;
			}

			THEMECOMPLETE_EPO_HTML()->create_field(
				[
					'nodiv'   => 1,
					'id'      => 'tmparentpostid',
					'default' => $tmparentpostid,
					'type'    => 'hidden',
					'tags'    => [
						'id'   => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
						'name' => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
					],
				],
				1
			);
			THEMECOMPLETE_EPO_HTML()->create_field(
				[
					'nodiv'   => 1,
					'id'      => 'tmaddlang',
					'default' => $tmaddlang,
					'type'    => 'hidden',
					'tags'    => [
						'id'   => THEMECOMPLETE_EPO_WPML_LANG_META,
						'name' => THEMECOMPLETE_EPO_WPML_LANG_META,
					],
				],
				1
			);

			echo '<div class="tm-meta-wpml-lang">';
			/* translators: %s post type label */
			echo '<strong>' . sprintf( esc_html__( 'Language of this %s', 'sitepress' ), esc_html( $post_type_label ) ) . '</strong>: ';
			if ( ! empty( $_GET['tmparentpostid'] ) && ! empty( $_GET['tmaddlang'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				&& ( isset( $_REQUEST['action'] ) && 'add' === $_REQUEST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			) {
				$this->get_flag( sanitize_text_field( wp_unslash( $_GET['tmaddlang'] ) ), 1 ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			} else {
				$this->get_flag( $tm_meta_lang, 1 );
			}
			echo '</div>';

			if ( ! $is_original && '' !== $is_original_lang ) {
				echo '<div class="tm-meta-wpml-translation">';
				echo esc_html__( 'This is a translation of', 'sitepress' );
				echo ': <div class="tm-title added">';
				$this->get_flag( $is_original_lang, 1 );
				echo ' ' . esc_html( get_the_title( $tmparentpostid ) );
				$this->edit_lang_link(
					$tmparentpostid,
					$is_original_lang,
					$active_languages[ $is_original_lang ],
					$tmparentpostid,
					true,
					$basetypehook,
					1
				);
				echo '</div>';
				echo '</div>';

				$args = [
					'post_type'   => $basetype,
					'post_status' => [ 'publish' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'date',
					'order'       => 'asc',
				];

				if ( ! $is_add ) {
					foreach ( $active_languages as $key => $value ) {
						if ( $key !== $tm_meta_lang && $key !== $is_original_lang ) {
							$class              = 'tm-title';
							$args['meta_query'] = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $key, '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
							$other_translations = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
							$is_edit            = false;
							if ( ! empty( $other_translations ) && isset( $other_translations[0] ) && is_object( $other_translations[0] ) && property_exists( $other_translations[0], 'ID' ) ) {// has $key code translation.
								$class   = 'tm-title added';
								$is_edit = true;
							}

							echo '<div class="' . esc_attr( $class ) . '">';
							$this->get_flag( $key, 1 );
							echo ' ' . esc_html( $value['display_name'] );
							if ( $is_edit ) {
								$this->edit_lang_link( $other_translations[0]->ID, $key, $active_languages[ $key ], $tmparentpostid, true, $basetypehook, 1 );
							} else { // no translation.
								$this->add_lang_link( $tmparentpostid, $key, $active_languages[ $key ], $basetypehook, 1 );
							}
							echo '</div>';
						}
					}
				}
			} elseif ( $is_original && ! $is_new ) {

				echo '<div class="tm-meta-wpml-translation">';
				esc_html_e( 'Translations', 'sitepress' );
				$args = [
					'post_type'   => $basetype,
					'post_status' => [ 'publish', 'draft' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'date',
					'order'       => 'asc',
				];
				foreach ( $active_languages as $key => $value ) {
					if ( $key !== $tm_meta_lang ) {
						$class                = 'tm-title';
						$args['meta_query']   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $key, '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
						$args['meta_query'][] = [
							'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
							'value'   => $tmparentpostid,
							'compare' => '=',
						];
						$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
						$is_edit              = false;
						if ( ! empty( $other_translations ) && isset( $other_translations[0] ) && is_object( $other_translations[0] ) && property_exists( $other_translations[0], 'ID' ) ) {// has $key code translation.
							$class   = 'tm-title added';
							$is_edit = true;
						}

						echo '<div class="' . esc_attr( $class ) . '">';
						$this->get_flag( $key, 1 );
						echo ' ' . esc_html( $value['display_name'] );
						if ( $is_edit ) {
							$this->edit_lang_link( $other_translations[0]->ID, $key, $active_languages[ $key ], $tmparentpostid, true, $basetypehook, 1 );
						} else { // no translation.
							$this->add_lang_link( $tmparentpostid, $key, $active_languages[ $key ], $basetypehook, 1 );
						}
						echo '</div>';
					}
				}
				echo '</div>';
			}
		}
	}

	/**
	 * Returns translated options values
	 * If options are changed after the order this will return wrong results.
	 *
	 * @param integer $current_product_id The product id.
	 * @param boolean $override If the check should be overriden.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_wpml_translation_by_id( $current_product_id = 0, $override = false ) {
		$wpml_translation_by_id = [];
		if ( $this->is_wpml && ( $override || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_wpml_order_translate' ) ) ) {
			$this_land_epos = THEMECOMPLETE_EPO()->get_product_tm_epos( $current_product_id );
			if ( isset( $this_land_epos['global'] ) && is_array( $this_land_epos['global'] ) ) {
				foreach ( $this_land_epos['global'] as $priority => $priorities ) {
					if ( is_array( $priorities ) ) {
						foreach ( $priorities as $pid => $field ) {
							if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {
								foreach ( $field['sections'] as $section_id => $section ) {
									if ( isset( $section['elements'] ) && is_array( $section['elements'] ) ) {
										foreach ( $section['elements'] as $element ) {
											$wpml_translation_by_id[ $element['uniqid'] ]              = $element['label'];
											$wpml_translation_by_id[ 'options_' . $element['uniqid'] ] = $element['options_all'];
										}
									}
								}
							}
						}
					}
				}
			}
		}

		return $wpml_translation_by_id;
	}

	/**
	 * Return $price converted to the active $currency
	 *
	 * @param float  $price The price to convert.
	 * @param string $currency The currency to convert the price to.
	 * @return float
	 */
	public function get_price_in_currency( $price = 0, $currency = '' ) {
		global $woocommerce_wpml;
		if ( $this->is_multi_currency() && is_object( $woocommerce_wpml ) && property_exists( $woocommerce_wpml, 'multi_currency' ) && is_object( $woocommerce_wpml->multi_currency ) ) {
			if ( is_callable( [ $woocommerce_wpml->multi_currency, 'convert_price_amount' ] ) ) {
				$price = $woocommerce_wpml->multi_currency->convert_price_amount( $price, $currency );
			} elseif ( property_exists( $woocommerce_wpml->multi_currency, 'prices' ) && is_object( $woocommerce_wpml->multi_currency->prices ) && is_callable( [ $woocommerce_wpml->multi_currency->prices, 'convert_price_amount' ] ) ) {
				$price = $woocommerce_wpml->multi_currency->prices->convert_price_amount( $price, $currency );
			}
		}
		return (float) $price;
	}
}
includes/classes/class-themecomplete-epo-data-store-base.php000064400000022025150755142450020221 0ustar00<?php
/**
 * Extra Product Options Data Store class
 *
 * @package Extra Product Options/Classes
 * @version 6.4.1
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Data Store class
 *
 * @package Extra Product Options/Classes
 * @version 6.4.1
 */
final class THEMECOMPLETE_EPO_Data_Store_Base {

	/**
	 * Custom data
	 * Settings data store
	 *
	 * @var array<mixed>
	 */
	public $data_store = [];

	/**
	 * Holds all of the plugin settings
	 *
	 * @var array<mixed>
	 */
	public $plugin_settings = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Data_Store_Base|null
	 * @since 6.4.1
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @since 6.4.1
	 * @return THEMECOMPLETE_EPO_Data_Store_Base
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.4.1
	 */
	public function __construct() {
		$this->plugin_settings = THEMECOMPLETE_EPO_SETTINGS()->plugin_settings();
	}

	/**
	 * Initialize Data Store.
	 *
	 * @since 6.4.1
	 * @return void
	 */
	public function init() {
		$this->data_store = [];
		foreach ( apply_filters( 'wc_epo_get_settings', [] ) as $key => $value ) {
			$this->set_setting( $key, $value );
		}

		foreach ( $this->plugin_settings as $key => $value ) {
			if ( isset( $this->data_store[ $key ] ) ) {
				continue;
			}
			$this->set_setting( $key, $value );
		}

		THEMECOMPLETE_EPO()->upload_dir = $this->data_store['tm_epo_upload_folder'];
		THEMECOMPLETE_EPO()->upload_dir = str_replace( '/', '', THEMECOMPLETE_EPO()->upload_dir );
		THEMECOMPLETE_EPO()->upload_dir = sanitize_file_name( THEMECOMPLETE_EPO()->upload_dir );
		THEMECOMPLETE_EPO()->upload_dir = '/' . THEMECOMPLETE_EPO()->upload_dir . '/';

		if ( 'custom' === $this->data_store['tm_epo_options_placement'] ) {
			$this->data_store['tm_epo_options_placement'] = $this->data_store['tm_epo_options_placement_custom_hook'];
		}

		if ( 'custom' === $this->data_store['tm_epo_totals_box_placement'] ) {
			$this->data_store['tm_epo_totals_box_placement'] = $this->data_store['tm_epo_totals_box_placement_custom_hook'];
		}

		if ( THEMECOMPLETE_EPO()->is_quick_view() ) {
			$this->data_store['tm_epo_options_placement_hook_priority']    = 50;
			$this->data_store['tm_epo_totals_box_placement_hook_priority'] = 50;
			$this->data_store['tm_epo_options_placement']                  = 'woocommerce_before_add_to_cart_button';
			$this->data_store['tm_epo_totals_box_placement']               = 'woocommerce_before_add_to_cart_button';
		}

		// Backwards compatibility.
		$this->data_store['tm_epo_change_original_price'] = THEMECOMPLETE_EPO_SETTINGS()->get_compatibility_value( 'tm_epo_change_original_price', $this->data_store['tm_epo_change_original_price'] );
		$this->data_store['tm_epo_final_total_box']       = THEMECOMPLETE_EPO_SETTINGS()->get_compatibility_value( 'tm_epo_final_total_box', $this->data_store['tm_epo_final_total_box'] );

		if ( 'display' === $this->data_store['tm_epo_force_select_options'] ) {
			$this->data_store['tm_epo_force_select_options'] = 'yes';
		}
		if ( 'normal' === $this->data_store['tm_epo_force_select_options'] ) {
			$this->data_store['tm_epo_force_select_options'] = 'no';
		}

		if ( 'show' === $this->data_store['tm_epo_clear_cart_button'] ) {
			$this->data_store['tm_epo_clear_cart_button'] = 'yes';
		}
		if ( 'normal' === $this->data_store['tm_epo_clear_cart_button'] ) {
			$this->data_store['tm_epo_clear_cart_button'] = 'no';
		}

		if ( 'hide' === $this->data_store['tm_epo_hide_options_in_cart'] ) {
			$this->data_store['tm_epo_hide_options_in_cart'] = 'yes';
		}
		if ( 'normal' === $this->data_store['tm_epo_hide_options_in_cart'] ) {
			$this->data_store['tm_epo_hide_options_in_cart'] = 'no';
		}

		if ( 'hide' === $this->data_store['tm_epo_hide_options_prices_in_cart'] ) {
			$this->data_store['tm_epo_hide_options_prices_in_cart'] = 'yes';
		}
		if ( 'normal' === $this->data_store['tm_epo_hide_options_prices_in_cart'] ) {
			$this->data_store['tm_epo_hide_options_prices_in_cart'] = 'no';
		}

		if ( 'on' === $this->data_store['tm_epo_css_styles'] ) {
			$this->data_store['tm_epo_css_styles'] = 'yes';
		}
		if ( '' === $this->data_store['tm_epo_css_styles'] ) {
			$this->data_store['tm_epo_css_styles '] = 'no';
		}

		if ( '' !== $this->data_store['tm_epo_global_image_max_width'] || '' !== $this->data_store['tm_epo_global_image_max_height'] ) {
			$image_css = '.woocommerce #content table.cart img.epo-option-image, .woocommerce table.cart img.epo-option-image, .woocommerce-page #content table.cart img.epo-option-image, .woocommerce-page table.cart img.epo-option-image, .woocommerce-mini-cart .cpf-img-on-cart .epo-option-image, .woocommerce-checkout-review-order .cpf-img-on-cart .epo-option-image, .woocommerce-order-details .cpf-img-on-cart .epo-option-image, .epo-option-image, .cpf-img-on-order > * {';
			if ( '' !== $this->data_store['tm_epo_global_image_max_width'] ) {
				$image_css .= 'max-width: calc(' . $this->data_store['tm_epo_global_image_max_width'] . ' - var(--tcgapcolumn))  !important;';
			}
			if ( '' !== $this->data_store['tm_epo_global_image_max_height'] ) {
				$image_css .= 'max-height: ' . $this->data_store['tm_epo_global_image_max_height'] . ' !important;';
			}
			$image_css .= '}';
			THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $image_css );
		}

		$swatch_css = '';

		if ( '' !== $this->data_store['tm_epo_swatch_border_color'] ) {
			$swatch_css .= '--swatch-border-color:';
			$swatch_css .= $this->data_store['tm_epo_swatch_border_color'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_text_swatch_border_color'] ) {
			$swatch_css .= '--text-swatch-border-color:';
			$swatch_css .= $this->data_store['tm_epo_text_swatch_border_color'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_swatch_active_border_color'] ) {
			$swatch_css .= '--swatch-active-border-color:';
			$swatch_css .= $this->data_store['tm_epo_swatch_active_border_color'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_swatch_border_width'] ) {
			$swatch_css .= '--swatch-border-width:';
			$swatch_css .= $this->data_store['tm_epo_swatch_border_width'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_swatch_active_border_width'] ) {
			$swatch_css .= '--swatch-active-border-width:';
			$swatch_css .= $this->data_store['tm_epo_swatch_active_border_width'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_text_swatch_border_width'] ) {
			$swatch_css .= '--text-swatch-border-width:';
			$swatch_css .= $this->data_store['tm_epo_text_swatch_border_width'] . ';';
		}

		if ( '' !== $this->data_store['tm_epo_text_swatch_active_border_width'] ) {
			$swatch_css .= '--text-w:';
			$swatch_css .= $this->data_store['tm_epo_text_swatch_active_border_width'] . ';';
		}

		if ( '' !== $swatch_css ) {
			$swatch_css = 'body {' . $swatch_css . '}';
			THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $swatch_css );
		}

		// Ensure that option are visible for ajax mini cart.
		if ( THEMECOMPLETE_EPO()->wc_vars['is_ajax'] ) {
			$this->data_store['tm_epo_cart_field_display'] = 'normal';
		}

		if ( isset( $_REQUEST['tc-fullwidth'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->data_store['tm_epo_select_fullwidth'] = sanitize_text_field( wp_unslash( $_REQUEST['tc-fullwidth'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}
	}

	/**
	 * Stores a setting key/value pair
	 *
	 * @param string $key The setting name.
	 * @param mixed  $value The setting value.
	 * @since 6.4.1
	 * @return void
	 */
	private function set_setting( $key, $value ) {
		if ( is_array( $value ) && 3 === count( $value ) ) {
			$method    = $value[2];
			$classname = $value[1];
			if ( is_object( $classname ) && call_user_func( [ $classname, $method ] ) ) { // @phpstan-ignore-line
				$this->data_store[ $key ] = get_option( $key );
				if ( false === $this->data_store[ $key ] ) {
					$this->data_store[ $key ] = $value[0];
				}
			} else {
				$this->data_store[ $key ] = get_option( $key );
				if ( false === $this->data_store[ $key ] ) {
					$this->data_store[ $key ] = $value;
				}
			}
		} else {
			$this->data_store[ $key ] = get_option( $key );
			if ( false === $this->data_store[ $key ] ) {
				$this->data_store[ $key ] = $value;
			}
		}
		$this->data_store[ $key ] = wp_unslash( $this->data_store[ $key ] );
	}

	/**
	 * Get the value of a setting
	 *
	 * @param string $key The setting name.
	 * @param mixed  $default_value The default value is the setting is not found.
	 * @since 6.4.1
	 * @return mixed
	 */
	public function get( $key = '', $default_value = '' ) {
		$value = $default_value;
		if ( '' !== $key && isset( $this->data_store[ $key ] ) ) {
			$value = $this->data_store[ $key ];
		}

		return $value;
	}

	/**
	 * Set the value of a setting
	 *
	 * @param string $key The setting name.
	 * @param mixed  $value The setting value.
	 * @since 6.4.1
	 * @return void
	 */
	public function set( $key = '', $value = '' ) {
		if ( '' !== $key ) {
			$this->data_store[ $key ] = $value;
		}
	}
}
includes/classes/class-themecomplete-epo-associated-products.php000064400000234464150755142450021242 0ustar00<?php
/**
 * Extra Product Options Associated Products Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Associated Products Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_Associated_Products {

	/**
	 * The product discount
	 *
	 * @var string
	 */
	private $discount = '';

	/**
	 * The product discount type
	 *
	 * @var string
	 */
	private $discount_type = '';

	/**
	 * If the discount is applied to the addons
	 *
	 * @var string
	 */
	private $discount_exclude_addons = '';

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Associated_Products|null
	 * @since 5.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Associated_Products
	 * @since 5.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 5.0
	 */
	public function __construct() {
		// Modify cart.
		add_filter( 'woocommerce_add_cart_item', [ $this, 'woocommerce_add_cart_item' ], 11, 1 );
		// Modifies the cart item.
		add_filter( 'woocommerce_before_calculate_totals', [ $this, 'woocommerce_before_calculate_totals' ], 10, 1 );
		// Modify option prices for discounts.
		add_filter( 'associated_tmcp_static_prices', [ $this, 'associated_tmcp_static_prices' ], 10, 2 );
		// Load cart data on every page load.
		add_filter( 'woocommerce_get_cart_item_from_session', [ $this, 'woocommerce_get_cart_item_from_session' ], 9998, 2 );
		// Add associated products (from elements) to the cart.
		add_action( 'woocommerce_add_to_cart', [ $this, 'associated_woocommerce_add_to_cart' ], 8, 6 );
		// Remove associated products when the parent gets removed.
		add_action( 'woocommerce_remove_cart_item', [ $this, 'associated_woocommerce_remove_cart_item' ], 10, 2 );
		// Restore associated products when the parent gets restored.
		add_action( 'woocommerce_restore_cart_item', [ $this, 'associated_woocommerce_restore_cart_item' ], 10, 2 );
		// Clear notices.
		add_action( 'init', [ $this, 'associated_clear_removed_notice' ] );
		// Validate quantity update in cart.
		add_filter( 'woocommerce_update_cart_validation', [ $this, 'woocommerce_update_cart_validation' ], 10, 4 );
		// Sync associated products quantity input.
		add_filter( 'woocommerce_cart_item_quantity', [ $this, 'associated_woocommerce_cart_item_quantity' ], 10, 2 );
		// Sync associated products quantity with main product.
		add_action( 'woocommerce_after_cart_item_quantity_update', [ $this, 'woocommerce_after_cart_item_quantity_update' ], 1, 2 );
		// Make sure products marked as associated have a parent.
		add_action( 'woocommerce_cart_loaded_from_session', [ $this, 'associated_woocommerce_cart_loaded_from_session' ], 99999 );

		// Associated product cart remove link.
		add_filter( 'woocommerce_cart_item_remove_link', [ $this, 'associated_woocommerce_cart_item_remove_link' ], 10, 2 );
		// Associated product table item classes.
		add_filter( 'woocommerce_cart_item_class', [ $this, 'associated_woocommerce_cart_item_class' ], 10, 2 );
		// Wrap associated products name in cart.
		add_action( 'woocommerce_after_cart_item_name', [ $this, 'woocommerce_after_cart_item_name' ], 99999, 1 );
		// Wrap associated products price in cart.
		add_filter( 'woocommerce_cart_item_price', [ $this, 'associated_woocommerce_cart_item_price' ], 99999, 2 );
		// Wrap associated products subtotal in cart.
		add_filter( 'woocommerce_cart_item_subtotal', [ $this, 'associated_woocommerce_cart_item_price' ], 99999, 2 );
		// Wrap associated products subtotal in checkout.
		add_filter( 'woocommerce_checkout_item_subtotal', [ $this, 'associated_woocommerce_cart_item_price' ], 99999, 2 );
		// Associated product table item classes in mini cart.
		add_filter( 'woocommerce_mini_cart_item_class', [ $this, 'associated_woocommerce_cart_item_class' ], 99999, 2 );
		// Wrap associated products price in mini cart.
		add_filter( 'woocommerce_widget_cart_item_quantity', [ $this, 'associated_woocommerce_widget_cart_item_quantity' ], 99999, 2 );
		// Make cart item count not count associated products.
		add_filter( 'woocommerce_cart_contents_count', [ $this, 'associated_woocommerce_cart_contents_count' ] );

		// Edit cart functionality.
		add_action( 'woocommerce_add_to_cart', [ $this, 'woocommerce_add_to_cart' ], 10, 3 );

		// Add meta to order.
		add_action( 'woocommerce_checkout_create_order_line_item', [ $this, 'woocommerce_checkout_create_order_line_item' ], 50, 3 );

		// Wrap associated products subtotal in order.
		add_filter( 'woocommerce_order_formatted_line_subtotal', [ $this, 'associated_woocommerce_order_formatted_line_subtotal' ], 10, 2 );
		// Add table item classes.
		add_filter( 'woocommerce_order_item_class', [ $this, 'woocommerce_order_item_class' ], 10, 2 );
		// Add the label name to associated products at the order-details template.
		add_filter( 'woocommerce_order_item_name', [ $this, 'woocommerce_order_item_name' ], 10, 2 );
		// Delete associated product quantity from order-details template.
		add_filter( 'woocommerce_order_item_quantity_html', [ $this, 'woocommerce_order_item_quantity_html' ], 10, 2 );
		// Filter order item count removing associated products.
		add_filter( 'woocommerce_get_item_count', [ $this, 'woocommerce_get_item_count' ], 10, 3 );

		// Hook for displaying extra options.
		add_action( 'wc_epo_associated_product_display', [ $this, 'wc_epo_associated_product_display' ], 10, 9 );
		// Hook for displaying extra options.
		add_action( 'wp_ajax_nopriv_wc_epo_get_associated_product_html', [ $this, 'wc_epo_get_associated_product_html' ] );
		add_action( 'wp_ajax_wc_epo_get_associated_product_html', [ $this, 'wc_epo_get_associated_product_html' ] );

		// Fix internal associated data.
		add_action( 'woocommerce_update_cart_action_cart_updated', [ $this, 'woocommerce_update_cart_action_cart_updated' ], 9999, 1 );

		// Hide associated products in the cart.
		add_action( 'woocommerce_cart_item_visible', [ $this, 'woocommerce_cart_item_visible' ], 10, 2 );
		add_action( 'woocommerce_widget_cart_item_visible', [ $this, 'woocommerce_cart_item_visible' ], 10, 2 );

		// Hide associated products in the checkout.
		add_action( 'woocommerce_checkout_cart_item_visible', [ $this, 'woocommerce_checkout_cart_item_visible' ], 10, 2 );
	}

	/**
	 * Returns the price in html format of the associated product.
	 * This is used for the initial prices of the product elements.
	 *
	 * @param object  $product The product object.
	 * @param string  $discount The product discount.
	 * @param string  $discount_type The product discount type.
	 * @param boolean $discount_applied If the discount is already applied.
	 * @return string
	 * @since 6.2
	 */
	public function get_associated_price_html( $product, $discount, $discount_type, $discount_applied = false ) {
		$price_html = '';
		if ( $product instanceof WC_Product ) {
			$price_html = $product->get_price_html();
			$type       = themecomplete_get_product_type( $product );
			$free_text  = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_free_price_label' ) ) ? ( '' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) : '' ) : esc_attr__( 'Free!', 'woocommerce' );
			$use_from   = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) );

			if ( $product instanceof WC_Product_Variable && 'variable' === $type ) {
				$price = $product->get_variation_price(); // Min active price.
				if ( ! wc_prices_include_tax() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) ) {
					$price = themecomplete_get_price_including_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $price,
						]
					);
				} elseif ( wc_prices_include_tax() && 'excl' === get_option( 'woocommerce_tax_display_shop' ) ) {
					$price = themecomplete_get_price_excluding_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $price,
						]
					);
				}

				$price             = (float) $price;
				$price             = (float) wc_format_decimal( (float) $price, wc_get_price_decimals() );
				$min_regular_price = $price;

				$original_price = $price;
				// $discount_applied cannot be applied on variable products.
				$price     = $this->get_discounted_price( $price, $discount, $discount_type );
				$price     = (float) apply_filters( 'wc_epo_product_element_initial_variable_price', $price, $price, $product );
				$min_price = (float) $price;
				$max_price = (float) $product->get_variation_price( 'max' ); // Max active price.
				// $discount_applied cannot be applied on variable products.
				$max_price         = (float) $this->get_discounted_price( $max_price, $discount, $discount_type );
				$max_regular_price = (float) $product->get_variation_regular_price( 'max' );

				$is_free = (float) 0 === (float) $min_price && (float) 0 === (float) $max_price;
				if ( $product->is_on_sale() || $price !== $original_price ) {
					$displayed_price = $min_price !== $max_price
					? ( function_exists( 'wc_get_price_to_display' )
						? wc_format_sale_price( (string) $max_price, (string) $min_price )
						: '<del>' . wc_price( $max_price ) . '</del> <ins>' . wc_price( $min_price ) . '</ins>'
					)
					: themecomplete_price( $min_price );

					$price_html = $min_price !== $max_price
						? ( ! $use_from
							/* translators: %1 %2: from price to price  */
							? sprintf( esc_html_x( '%1$s&ndash;%2$s', 'Price range: from-to', 'woocommerce' ), themecomplete_price( $min_price ), themecomplete_price( $max_price ) )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . $displayed_price )
						: $displayed_price;

					$regular_price = $min_regular_price !== $max_regular_price
						? ( ! $use_from
							? themecomplete_price( $max_regular_price )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( $min_regular_price ) )
						: themecomplete_price( $min_regular_price );

					$regular_price = '<del>' . $regular_price . '</del>';
					if ( $min_price === $max_price && $min_regular_price === $max_regular_price ) {
						$price_html = themecomplete_price( $max_price );
					}
					$price_html = ( ! $use_from ? ( $regular_price . ' <ins>' . $price_html . '</ins>' ) : $price_html ) . $product->get_price_suffix();

				} elseif ( $is_free ) {
					$price_html = apply_filters( 'woocommerce_variable_free_price_html', $free_text, $product );
				} else {
					$price_html = $min_price !== $max_price
						? ( ! $use_from
							/* translators: %1 %2: from price to price  */
							? sprintf( esc_html_x( '%1$s &ndash; %2$s', 'Price range: from-to', 'woocommerce' ), themecomplete_price( $min_price ), themecomplete_price( $max_price ) )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( $min_price ) )
						: themecomplete_price( $min_price );
					$price_html = $price_html . $product->get_price_suffix();
				}
			} else {
				$price             = (float) $product->get_price();
				$min_regular_price = $product->get_regular_price();
				$product_data      = $product->get_data();

				if ( ! wc_prices_include_tax() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) ) {
					$price = themecomplete_get_price_including_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $price,
						]
					);

					$min_regular_price = themecomplete_get_price_including_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $min_regular_price,
						]
					);
				} elseif ( wc_prices_include_tax() && 'excl' === get_option( 'woocommerce_tax_display_shop' ) ) {
					$price = themecomplete_get_price_excluding_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $price,
						]
					);

					$min_regular_price = themecomplete_get_price_excluding_tax(
						$product,
						[
							'qty'   => 1,
							'price' => $min_regular_price,
						]
					);
				}

				$price             = (float) $price;
				$price             = (float) wc_format_decimal( (float) $price, wc_get_price_decimals() );
				$min_regular_price = (float) wc_format_decimal( (float) $min_regular_price, wc_get_price_decimals() );

				$original_price = $price;
				if ( ! $discount_applied ) {
					$price = $this->get_discounted_price( $price, $discount, $discount_type );
				}
				$min_price = $price;
				$max_price = $price;
				if ( ! $discount_applied ) {
					$max_price = $this->get_discounted_price( $max_price, $discount, $discount_type );
				}
				$max_regular_price     = $min_regular_price;
				$display_price         = $min_price;
				$display_regular_price = $min_regular_price;

				$price_html = '';
				if ( THEMECOMPLETE_EPO()->tc_get_price( $product ) > 0 ) {

					if ( ( $product->is_on_sale() || $price !== $original_price ) && THEMECOMPLETE_EPO()->tc_get_regular_price( $product ) ) {
						if ( $use_from && ( $max_price > 0 || $max_price > $min_price ) ) {

							$displayed_price = ( function_exists( 'wc_get_price_to_display' )
								? wc_format_sale_price( (string) $display_regular_price, $display_price )
								: '<del>' . wc_price( $display_regular_price ) . '</ins>'
							);
							$price_html     .= ( function_exists( 'wc_get_price_html_from_text' )
									? wc_get_price_html_from_text()
									: $product->get_price_html_from_text() )
												. $displayed_price;
							$price_html     .= $product->get_price_suffix();
						} else {
							$price_html .= wc_format_sale_price( (string) $display_regular_price, $display_price );
						}
					} else {
						if ( $use_from && ( $max_price > 0 || $max_price > $min_price ) ) {
							$price_html .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() );
						}
						$price_html .= themecomplete_price( $display_price ) . $product->get_price_suffix();
					}
				} elseif ( THEMECOMPLETE_EPO()->tc_get_price( $product ) === '' ) {

					$price_html = apply_filters( 'woocommerce_empty_price_html', '', $product );

				} elseif ( (float) THEMECOMPLETE_EPO()->tc_get_price( $product ) === (float) 0 ) {
					if ( $product->is_on_sale() && THEMECOMPLETE_EPO()->tc_get_regular_price( $product ) ) {
						if ( $use_from && ( $max_price > 0 || $max_price > $min_price ) ) {
							$price_html .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( ( $min_price > 0 ) ? $min_price : 0 );
						} else {

							$price_html .= $product->get_price_html();

							$price_html = apply_filters( 'woocommerce_free_sale_price_html', $price_html, $product );
						}
					} elseif ( ! $product->is_on_sale() ) {
						if ( $use_from && ( $max_price > 0 || $max_price > $min_price ) ) {
							$price_html .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( ( $min_price > 0 ) ? $min_price : 0 );
						} else {

							$price_html = '<span class="amount">' . $free_text . '</span>';

							$price_html = apply_filters( 'woocommerce_free_price_html', $price_html, $product );
						}
					}
				}
			}
		}

		return $price_html;
	}

	/**
	 * Hide associated products in the cart
	 *
	 * @param boolean      $visible If the product should be visible.
	 * @param array<mixed> $cart_item The cart item.
	 * @return boolean
	 * @since 6.2
	 */
	public function woocommerce_cart_item_visible( $visible, $cart_item ) {
		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) && isset( $cart_item['hiddenin'] ) && is_array( $cart_item['hiddenin'] ) && in_array( 'cart', $cart_item['hiddenin'], true ) ) {
			$visible = false;
		}

		return $visible;
	}

	/**
	 * Hide associated products in the checkout
	 *
	 * @param boolean      $visible If the product should be visible.
	 * @param array<mixed> $cart_item The cart item.
	 * @return boolean
	 * @since 6.2
	 */
	public function woocommerce_checkout_cart_item_visible( $visible, $cart_item ) {
		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) && isset( $cart_item['hiddenin'] ) && is_array( $cart_item['hiddenin'] ) && in_array( 'checkout', $cart_item['hiddenin'], true ) ) {
			$visible = false;
		}

		return $visible;
	}

	/**
	 * Include variation attributes
	 *
	 * @return boolean
	 * @since 6.0
	 */
	public function woocommerce_product_variation_title_include_attributes() {
		return true;
	}

	/**
	 * Hook for displaying extra options
	 *
	 * @return void
	 * @since 5.0
	 */
	public function wc_epo_get_associated_product_html() {
		global $tm_is_ajax;

		$tm_is_ajax  = true;
		$json_result = [
			'result' => 0,
			'html'   => '',
		];

		if ( isset( $_REQUEST['layout_mode'] ) && isset( $_REQUEST['product_id'] ) && isset( $_REQUEST['name'] ) && isset( $_REQUEST['uniqid'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended

			$name                              = sanitize_text_field( wp_unslash( $_REQUEST['name'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$uniqid                            = sanitize_text_field( wp_unslash( $_REQUEST['uniqid'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$quantity_min                      = isset( $_REQUEST['quantity_min'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['quantity_min'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$quantity_max                      = isset( $_REQUEST['quantity_max'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['quantity_max'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$priced_individually               = isset( $_REQUEST['priced_individually'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['priced_individually'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$discount                          = isset( $_REQUEST['discount'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['discount'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$discount_type                     = isset( $_REQUEST['discount_type'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['discount_type'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$discount_exclude_addons           = isset( $_REQUEST['discount_exclude_addons'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['discount_exclude_addons'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$operation_mode                    = isset( $_REQUEST['mode'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['mode'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$layout_mode                       = sanitize_text_field( wp_unslash( $_REQUEST['layout_mode'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$product_id                        = absint( wp_unslash( $_REQUEST['product_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$parent_id                         = isset( $_REQUEST['parent_id'] ) ? absint( wp_unslash( $_REQUEST['parent_id'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$product                           = wc_get_product( $product_id );
			$product_list                      = [];
			$product_list_available_variations = [];

			$show_image       = isset( $_REQUEST['show_image'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_image'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$show_title       = isset( $_REQUEST['show_title'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_title'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$show_title_link  = isset( $_REQUEST['show_title_link'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_title_link'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$show_price       = isset( $_REQUEST['show_price'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_price'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$show_description = isset( $_REQUEST['show_description'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_description'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$show_meta        = isset( $_REQUEST['show_meta'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['show_meta'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$counter          = isset( $_REQUEST['counter'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['counter'] ) ) : '0'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$disable_epo      = isset( $_REQUEST['disable_epo'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['disable_epo'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

			if ( ! empty( $product ) && is_object( $product ) ) {

				$type                 = themecomplete_get_product_type( $product );
				$attributes           = [];
				$available_variations = [];

				if ( 'variable' === $type ) {
					if ( is_callable( [ $product, 'get_variation_attributes' ] ) ) {
						// workaround to get discounts shownn in the product for variable products.
						$isset_discount_type           = false;
						$isset_discount                = false;
						$isset_discount_exclude_addons = false;
						if ( isset( $_REQUEST['discount_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							$isset_discount_type = sanitize_text_field( wp_unslash( $_REQUEST['discount_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						}
						if ( isset( $_REQUEST['isset_discount'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							$isset_discount = sanitize_text_field( wp_unslash( $_REQUEST['discount'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						}
						if ( isset( $_REQUEST['isset_discount_exclude_addons'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							$isset_discount_exclude_addons = sanitize_text_field( wp_unslash( $_REQUEST['discount_exclude_addons'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						}
						$_REQUEST['discount_type']           = $discount_type;
						$_REQUEST['discount']                = $discount;
						$_REQUEST['discount_exclude_addons'] = $discount_exclude_addons;
						$attributes                          = $product->get_variation_attributes();
						$get_variations                      = count( $product->get_children() ) <= apply_filters( 'woocommerce_ajax_variation_threshold', 30, $product );
						$available_variations                = $get_variations ? $product->get_available_variations() : false; // @phpstan-ignore-line

						$product_list[ $product_id ] = $attributes;

						$variations_json = wp_json_encode( $available_variations );
						if ( false !== $variations_json ) {
							$variations_attr = function_exists( 'wc_esc_json' ) ? wc_esc_json( $variations_json ) : _wp_specialchars( $variations_json, ENT_QUOTES, 'UTF-8', true );

							$product_list_available_variations[ $product_id ] = $variations_attr;
						} else {
							$product_list_available_variations[ $product_id ] = '';
						}
						if ( $isset_discount_type ) {
							$_REQUEST['discount_type'] = $isset_discount_type;
							if ( $isset_discount ) {
								$_REQUEST['discount'] = $isset_discount;
							}
							if ( $isset_discount_exclude_addons ) {
								$_REQUEST['discount_exclude_addons'] = $isset_discount_exclude_addons;
							}
						} else {
							unset( $_REQUEST['discount_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							unset( $_REQUEST['discount'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							unset( $_REQUEST['discount_exclude_addons'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						}
					}
				} else {
					$product_list[ $product_id ]                      = [];
					$product_list_available_variations[ $product_id ] = '';
				}

				$__min_value = $quantity_min;
				$__max_value = $quantity_max;

				if ( '' !== $__min_value ) {
					$__min_value = floatval( $__min_value );
				} else {
					$__min_value = 0;
				}
				if ( '' !== $__max_value ) {
					$__max_value = floatval( $__max_value );
				}

				if ( is_numeric( $__min_value ) && is_numeric( $__max_value ) ) {
					if ( $__min_value > $__max_value ) {
						$__max_value = $__min_value + 1;
					}
				}

				$template = 'template-item';

				$args = [
					'tm_element_settings'               => [
						'uniqid'      => $uniqid,
						'disable_epo' => $disable_epo,
					],
					'option'                            => [
						'_default_value_counter' => $counter,
						'counter'                => $counter,
					],
					'operation_mode'                    => $operation_mode,
					'template'                          => $template,
					'quantity_min'                      => $__min_value,
					'quantity_max'                      => $__max_value,
					'priced_individually'               => $priced_individually,
					'discount'                          => $discount,
					'discount_type'                     => $discount_type,
					'discount_exclude_addons'           => $discount_exclude_addons,
					'name'                              => $name,
					'product_id'                        => $product_id,
					'parent_id'                         => $parent_id,
					'product_list'                      => $product_list,
					'product_list_available_variations' => $product_list_available_variations,
					'show_image'                        => $show_image,
					'show_title'                        => $show_title,
					'show_title_link'                   => $show_title_link,
					'show_price'                        => $show_price,
					'show_description'                  => $show_description,
					'show_meta'                         => $show_meta,
				];
				ob_start();
				wc_get_template(
					'products/template-container-ajax.php',
					$args,
					THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
					THEMECOMPLETE_EPO_DISPLAY()->get_default_path()
				);
				$json_result['html']   = ob_get_clean();
				$json_result['result'] = 200;

			}
		}

		wp_send_json( $json_result );
	}

	/**
	 * Modify option prices for discounts
	 *
	 * @param mixed        $tmcp_static_prices The option static prices.
	 * @param array<mixed> $cart_item The cart item.
	 * @return mixed
	 * @since 5.0.12.4
	 */
	public function associated_tmcp_static_prices( $tmcp_static_prices = '', $cart_item = [] ) {
		if ( empty( $cart_item['associated_discount_exclude_addons'] ) && ! empty( $cart_item['associated_discount'] ) && isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {
			$tmcp_static_prices = $this->get_discounted_price( $tmcp_static_prices, $cart_item['associated_discount'], $cart_item['associated_discount_type'] );
		}

		return $tmcp_static_prices;
	}

	/**
	 * Apply discount to the option price
	 *
	 * @param mixed $price The current product price.
	 * @return mixed
	 * @since 5.0.8
	 */
	public function wc_epo_apply_discount( $price = '' ) {
		if ( empty( $this->discount_exclude_addons ) ) {
			if ( ! is_array( $price ) ) {
				return $this->get_discounted_price( $price, $this->discount, $this->discount_type );
			} else {
				foreach ( $price as $key => $value ) {
					$price[ $key ] = $this->get_discounted_price( $value, $this->discount, $this->discount_type );
				}
				return $price;
			}
		}

		return $price;
	}

	/**
	 * Hook for displaying extra options
	 *
	 * @param mixed   $product The product object.
	 * @param string  $uniqid The id to use for the epo container.
	 * @param boolean $disable_epo If the addons are disabled, true or false.
	 * @param boolean $per_product_pricing If the product has pricing, true or false.
	 * @param string  $discount The product discount.
	 * @param string  $discount_type The product discount type.
	 * @param string  $discount_exclude_addons If the addons should be excluded fro mthe discount.
	 * @param mixed   $counter The option counter.
	 * @param string  $element_uniqid The product element unique id.
	 * @return void
	 * @since 5.0
	 */
	public function wc_epo_associated_product_display( $product, $uniqid, $disable_epo = false, $per_product_pricing = false, $discount = '', $discount_type = '', $discount_exclude_addons = '', $counter = '', $element_uniqid = '' ) {

		if ( $product ) {
			global $associated_product;
			$associated_product = $product;
			$product_id         = themecomplete_get_id( $product );
			if ( ! $per_product_pricing ) {
				$per_product_pricing = 0;
			} else {
				$per_product_pricing = 1;
			}

			$uniqid = $uniqid . '.' . $counter;
			$uniqid = str_replace( [ '.', ' ', '[' ], '', $uniqid );
			$uniqid = THEMECOMPLETE_EPO_HELPER()->normalize_data( $uniqid );
			$epo_id = $uniqid;
			?>
			<div class="tc-extra-product-options-inline" data-epo-id="<?php echo esc_attr( (string) $epo_id ); ?>" data-product-id="<?php echo esc_attr( (string) $product_id ); ?>">
			<?php
			if ( empty( $discount_exclude_addons ) && $discount ) {
				$this->discount                = $discount;
				$this->discount_type           = $discount_type;
				$this->discount_exclude_addons = $discount_exclude_addons;
				add_filter( 'wc_epo_apply_discount', [ $this, 'wc_epo_apply_discount' ], 10, 1 );
			}

			$not_isset_global_post = false;
			$isset_global_post     = false;
			if ( ! isset( $GLOBALS['post'] ) ) {
				$not_isset_global_post = true;
				$GLOBALS['post']       = $product_id; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			} elseif ( isset( $GLOBALS['post'] ) ) {
				$isset_global_post = $GLOBALS['post'];
				$GLOBALS['post']   = $product_id; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			}

			THEMECOMPLETE_EPO()->associated_type                = $product->get_type();
			THEMECOMPLETE_EPO()->is_associated                  = true;
			THEMECOMPLETE_EPO()->associated_per_product_pricing = $per_product_pricing;
			THEMECOMPLETE_EPO()->associated_element_uniqid      = $element_uniqid;
			THEMECOMPLETE_EPO()->associated_product_counter     = $counter;
			THEMECOMPLETE_EPO()->set_inline_epo( true );
			THEMECOMPLETE_EPO_DISPLAY()->set_discount( $discount, $discount_type, $discount_exclude_addons );
			THEMECOMPLETE_EPO_DISPLAY()->set_epo_internal_counter( $epo_id );
			if ( ! $disable_epo ) {
				THEMECOMPLETE_EPO_DISPLAY()->tm_epo_fields( $product, $uniqid );
			}
			THEMECOMPLETE_EPO_DISPLAY()->tm_epo_totals( $product, $uniqid );
			THEMECOMPLETE_EPO_DISPLAY()->tm_add_inline_style();
			THEMECOMPLETE_EPO()->set_inline_epo( false );
			THEMECOMPLETE_EPO_DISPLAY()->set_discount( '', '' );
			THEMECOMPLETE_EPO_DISPLAY()->restore_epo_internal_counter();
			THEMECOMPLETE_EPO()->is_associated                  = false;
			THEMECOMPLETE_EPO()->associated_per_product_pricing = null;
			THEMECOMPLETE_EPO()->associated_type                = false;
			THEMECOMPLETE_EPO()->associated_element_uniqid      = false;
			THEMECOMPLETE_EPO()->associated_product_counter     = false;
			if ( empty( $discount_exclude_addons ) && $discount ) {
				$this->discount                = '';
				$this->discount_type           = '';
				$this->discount_exclude_addons = '';
				remove_filter( 'wc_epo_apply_discount', [ $this, 'wc_epo_apply_discount' ], 10 );
			}

			if ( $not_isset_global_post ) {
				unset( $GLOBALS['post'] );
			}
			if ( $isset_global_post ) {
				$GLOBALS['post'] = $isset_global_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			}

			?>
			</div>
			<?php
		}
	}

	/**
	 * Validates in-cart component quantity changes.
	 *
	 * @param boolean      $passed The current passed status.
	 * @param string       $cart_item_key The cart item key.
	 * @param array<mixed> $cart_item The cart item.
	 * @param integer      $quantity The product quantity.
	 * @return boolean
	 * @since 5.0
	 */
	public function woocommerce_update_cart_validation( $passed, $cart_item_key, $cart_item, $quantity ) {

		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) && isset( WC()->cart->cart_contents[ $cart_item['associated_parent'] ] ) ) {

			$parent = WC()->cart->cart_contents[ $cart_item['associated_parent'] ];

			$associated_id = array_search( $cart_item_key, $parent['associated_products'], true );

			if ( false === $associated_id ) {
				return false;
			}

			if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'] ) ) {
				$quantity = WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'];
			}

			$parent_key      = $cart_item['associated_parent'];
			$parent_quantity = 1;
			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_quantity_sync' ) ) {
				$parent_quantity = floatval( $parent['quantity'] );
			}
			$min_quantity = floatval( $cart_item['tmproducts'][ $associated_id ]['quantity_min'] );
			$max_quantity = $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ? floatval( $parent_quantity * $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ) : '';

			if ( $quantity < $min_quantity ) {
				/* translators: %1 Product title %2 Minimum quantity. */
				wc_add_notice( sprintf( __( 'The quantity of &quot;%1$s&quot; cannot be lower than %2$d.', 'woocommerce-tm-extra-product-options' ), $cart_item['data']->get_title(), $min_quantity ), 'error' );

				return false;

			} elseif ( $max_quantity && $quantity > $max_quantity ) {
				/* translators: %1 Product title %2 Maximum  quantity. */
				wc_add_notice( sprintf( __( 'The quantity of &quot;%1$s&quot; cannot be higher than %2$d.', 'woocommerce-tm-extra-product-options' ), $cart_item['data']->get_title(), $max_quantity ), 'error' );

				return false;

			} elseif ( 0 != $quantity % $parent_quantity ) { // phpcs:ignore
				/* translators: %1 Product title %2 Parent product quantity. */
				wc_add_notice( sprintf( __( 'The quantity of &quot;%1$s&quot; must be entered in multiples of %2$d.', 'woocommerce-tm-extra-product-options' ), $cart_item['data']->get_title(), $parent_quantity ), 'error' );

				return false;

			} else {

				WC()->cart->cart_contents[ $parent_key ]['tmproducts'][ $associated_id ]['quantity'] = $quantity / $parent_quantity;

				$associated_cart_keys = $this->get_associated_cart_keys( $parent, WC()->cart->cart_contents );
				foreach ( $associated_cart_keys as $associated_key_id => $associated_key ) {
					WC()->cart->cart_contents[ $associated_key ]['tmproducts'][ $associated_key_id ]['quantity'] = $quantity / $parent_quantity;
				}
			}
		}

		return $passed;
	}

	/**
	 * Filter order item count removing associated products
	 *
	 * @param integer  $count The count or order items that are of $type.
	 * @param string   $type The item type.
	 * @param WC_Order $order The order object.
	 * @return integer
	 * @since 5.0
	 */
	public function woocommerce_get_item_count( $count, $type, $order ) {

		$remove = 0;

		if ( function_exists( 'is_account_page' ) && is_account_page() ) {
			foreach ( $order->get_items() as $item ) {
				if ( isset( $item['_associated_key'] ) && '' !== $item['_associated_key'][0] ) {
					$remove += $item->get_quantity();
				}
			}
		}

		return (int) $count - (int) $remove;
	}

	/**
	 * Delete associated product quantity from order-details template
	 *
	 * Quantity is inserted into the product name by 'woocommerce_order_item_name'.
	 *
	 * @param string       $content The content html.
	 * @param array<mixed> $item The order item.
	 * @return string
	 * @since 5.0
	 */
	public function woocommerce_order_item_quantity_html( $content, $item ) {

		if ( isset( $item['_associated_key'] ) && '' !== $item['_associated_key'][0] ) {
			$content = '';
		}

		return $content;
	}

	/**
	 * Add the label name to associated products at the order-details template.
	 *
	 * @param string       $class_name The item class.
	 * @param array<mixed> $item The order item.
	 * @return string
	 * @since 5.0
	 */
	public function woocommerce_order_item_class( $class_name, $item ) {
		if ( isset( $item['_associated_key'] ) && '' !== $item['_associated_key'][0] ) {
			$class_name .= ' tc-associated-table-product';
		} elseif ( isset( $item['_tmproducts'] ) && '' !== $item['_tmproducts'][0] ) {
			$class_name .= ' tc-container-table-product';
		}

		return $class_name;
	}

	/**
	 * Add the label name to associated products at the order-details template.
	 *
	 * @param string       $content The content html.
	 * @param array<mixed> $item The order item.
	 * @return string
	 * @since 5.0
	 */
	public function woocommerce_order_item_name( $content, $item ) {
		if ( isset( $item['_associated_key'] ) && '' !== $item['_associated_key'][0] ) {

			$qty = '';

			if ( did_action( 'woocommerce_view_order' ) ||
				did_action( 'woocommerce_thankyou' ) ||
				did_action( 'before_woocommerce_pay' ) ||
				did_action( 'woocommerce_account_view-subscription_endpoint' ) ) {

				$qty = '<strong class="associated-product-quantity"> &times; '
					. $item['qty']
					. '</strong>';

			}

			if ( isset( $item['_associated_name'] ) && '' !== $item['_associated_name'][0] ) {
				$content = '<div class="tc-associated-table-product-name">' . $item['_associated_name'][0] . '</div>' . $content;
			}

			$content = '<div class="tc-associated-table-product-indent">' . $content . $qty . '</div>';
		}

		return $content;
	}

	/**
	 * Adds meta data to the order - WC >= 2.7 (crud)
	 *
	 * @param WC_Order_Item_Product $item The order item object.
	 * @param string                $cart_item_key The cart item key.
	 * @param array<mixed>          $values Cart item values.
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_checkout_create_order_line_item( $item, $cart_item_key, $values ) {
		if ( isset( $values['associated_parent'] ) && ! empty( $values['associated_parent'] ) ) {

			$item->add_meta_data( '_associated_name', [ $values['tmproducts'][ $values['associated_key'] ]['name'] ] );
			$item->add_meta_data( '_associated_key', [ $values['associated_key'] ] );
			$item->add_meta_data( '_priced_individually', [ $values['associated_priced_individually'] ] );
			$item->add_meta_data( '_required', [ $values['associated_required'] ] );

			if ( isset( $values['hiddenin'] ) && is_array( $values['hiddenin'] ) && in_array( 'order', $values['hiddenin'], true ) ) {
				$item->add_meta_data( '_associated_hidden', [ '1' ] );
			}
		}

		if ( ! empty( $values['associated_products'] ) ) {
			if ( is_array( $values['tmproducts'] ) ) {
				$item->add_meta_data(
					'_tmproducts',
					[
						array_map(
							function ( $v ) {
								return $v['product_id'];
							},
							$values['tmproducts']
						),
					]
				);
			}
		}
	}

	/**
	 * Wrap associated products in cart
	 *
	 * @param string                     $subtotal The subtotal html.
	 * @param array<mixed>|WC_Order_Item $item The order item.
	 * @return string
	 * @since 5.0
	 */
	public function associated_woocommerce_order_formatted_line_subtotal( $subtotal, $item ) {
		if ( isset( $item['_associated_key'] ) && '' !== $item['_associated_key'][0] ) {
			$priced_individually = isset( $item['_priced_individually'] ) ? $item['_priced_individually'][0] : '';

			if ( empty( $priced_individually ) && is_object( $item ) && method_exists( $item, 'get_subtotal' ) && empty( $item->get_subtotal( 'edit' ) ) ) {
				$subtotal = '';
			} elseif ( $subtotal ) {
				$subtotal = '<span class="tc-associated-table-product-price">' . $subtotal . '</span>';
			}
		}

		return $subtotal;
	}

	/**
	 * Modifies the cart item
	 * Add associated product weights to the main product
	 *
	 * @param WC_Cart $cart_object The cart object.
	 * @return void
	 *
	 * @since 6.1
	 */
	public function woocommerce_before_calculate_totals( $cart_object ) {
		if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
			return;
		}
		if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
			return;
		}

		if ( method_exists( $cart_object, 'get_cart' ) ) {
			$cart_contents = $cart_object->get_cart();
		} else {
			$cart_contents = $cart_object->cart_contents;
		}

		foreach ( $cart_contents as $cart_key => $cart_item ) {
			if ( ! isset( $cart_item['associated_parent'] ) && isset( $cart_item['associated_products'] ) ) {
				$associated_weight = 0.0;
				foreach ( $cart_item['associated_products'] as $associated_cart_key ) {
					if ( is_array( WC()->cart->cart_contents ) && isset( WC()->cart->cart_contents[ $associated_cart_key ] ) ) {
						$associated_product_weight = isset( WC()->cart->cart_contents[ $associated_cart_key ]['associated_weight'] ) ? WC()->cart->cart_contents[ $associated_cart_key ]['associated_weight'] : 0.0;
						if ( $associated_product_weight ) {
							$associated_product_qty = WC()->cart->cart_contents[ $associated_cart_key ]['quantity'];
							$associated_weight     += (float) $associated_product_weight * (float) $associated_product_qty;
						}
						if ( $associated_weight > 0 ) {
							$main_product_weight = $cart_item['data']->get_weight();
							$main_product_qty    = $cart_item['quantity'];
							$assoc_weight        = (float) $main_product_weight + $associated_weight / $main_product_qty;
							$cart_item['data']->set_weight( $assoc_weight );
							WC()->cart->cart_contents[ $cart_key ]['data']->set_weight( $assoc_weight, 'edit' );
						}
					}
				}
			}
			$cart_contents[ $cart_key ] = $cart_item;
		}

		if ( method_exists( $cart_object, 'set_cart_contents' ) ) {
			$cart_object->set_cart_contents( $cart_contents );
		} else {
			$cart_object->cart_contents = $cart_contents;
		}
	}

	/**
	 * Make sure products marked as associated have a parent
	 *
	 * @param WC_Cart $cart The cart object.
	 * @return void
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_loaded_from_session( $cart ) {
		$cart_contents = $cart->cart_contents;

		if ( ! empty( $cart_contents ) ) {

			foreach ( $cart_contents as $key => $value ) {

				if ( isset( $value['associated_parent'] ) && ! empty( $value['associated_parent'] ) ) {

					$parent = [];
					if ( isset( $cart_contents[ $value['associated_parent'] ] ) ) {
						$parent = $cart_contents[ $value['associated_parent'] ];
					}

					if ( ! $parent ||
						! isset( $parent['associated_products'] ) ||
						! is_array( $parent['associated_products'] ) ||
						! in_array( $key, $parent['associated_products'], true ) ) {
						unset( WC()->cart->cart_contents[ $key ] );
					}
				}
			}
		}
	}

	/**
	 * Make cart item count not count associated products
	 *
	 * @param integer $count Number of items in the cart.
	 * @return integer
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_contents_count( $count ) {
		$cart                      = WC()->cart->get_cart();
		$associated_products_count = 0;

		foreach ( $cart as $key => $value ) {

			if ( isset( $value['associated_parent'] ) && ! empty( $value['associated_parent'] ) ) {
				$associated_products_count += $value['quantity'];
			}
		}

		return absint( $count ) - absint( $associated_products_count );
	}

	/**
	 * Wrap associated products in mini cart
	 *
	 * @param string       $html The string HTML.
	 * @param array<mixed> $cart_item The cart item.
	 * @return string
	 * @since 5.0
	 */
	public function associated_woocommerce_widget_cart_item_quantity( $html, $cart_item ) {
		remove_filter( 'woocommerce_cart_item_price', [ $this, 'associated_woocommerce_cart_item_price' ], 99999 );

		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {
			if ( empty( $cart_item['associated_priced_individually'] ) && empty( $cart_item['line_subtotal'] ) ) {
				$html = '';
			} elseif ( $html ) {
				$html = '<span class="tc-associated-table-product-price">' . $html . '</span>';
			}
		}

		return $html;
	}

	/**
	 * Wrap associated products in cart
	 *
	 * @param string       $price The price HTML.
	 * @param array<mixed> $cart_item The cart item.
	 * @return string
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_item_price( $price, $cart_item ) {
		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {

			if ( empty( $cart_item['associated_priced_individually'] ) && empty( $cart_item['line_subtotal'] ) ) {
				$price = '';
			} elseif ( $price ) {
				$price = '<span class="tc-associated-table-product-price">' . $price . '</span>';
			}
		}

		return $price;
	}

	/**
	 * Wrap associated products in cart
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_after_cart_item_name( $cart_item = [] ) {
		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {
			if ( isset( $cart_item['associated_label'] ) && '' !== $cart_item['associated_label'] ) {
				echo wp_kses_post( '<div class="tc-associated-table-product-name">' . $cart_item['associated_label'] . '</div>' );
			}
		}
	}

	/**
	 * Associated product cart remove link
	 *
	 * @param string $link The link HTML.
	 * @param string $cart_item_key The cart item key.
	 * @return string
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_item_remove_link( $link, $cart_item_key ) {

		if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['associated_parent'] ) && ! empty( WC()->cart->cart_contents[ $cart_item_key ]['associated_parent'] ) && isset( WC()->cart->cart_contents[ $cart_item_key ]['associated_required'] ) && ! empty( WC()->cart->cart_contents[ $cart_item_key ]['associated_required'] ) ) {

			$parent_key = WC()->cart->cart_contents[ $cart_item_key ]['associated_parent'];

			if ( isset( WC()->cart->cart_contents[ $parent_key ] ) ) {
				return '';
			}
		}

		return $link;
	}

	/**
	 * Fix internal associated data
	 *
	 * @param boolean $cart_updated The current cart_updated status.
	 * @return boolean
	 * @since 5.1
	 */
	public function woocommerce_update_cart_action_cart_updated( $cart_updated = false ) {
		if ( apply_filters( 'wc_epo_update_cart_action_cart_updated', false, $cart_updated ) ) {
			return $cart_updated;
		}

		$cart_contents = WC()->cart->cart_contents;
		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				unset( WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'] );
			}
		}

		return $cart_updated;
	}

	/**
	 * Sync associated products quantity with main product
	 *
	 * @param string  $cart_item_key The cart item key.
	 * @param integer $quantity The product quantity.
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_after_cart_item_quantity_update( $cart_item_key, $quantity = 0 ) {
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_quantity_sync' ) ) {
			return;
		}

		$cart_item = WC()->cart->cart_contents[ $cart_item_key ];

		if ( ! empty( $cart_item ) ) {

			$associated_cart_keys = $this->get_associated_cart_keys( $cart_item, WC()->cart->cart_contents );

			if ( ! empty( $associated_cart_keys ) && is_array( $associated_cart_keys ) ) {

				if ( (float) 0 === (float) $quantity || $quantity < 0 ) {
					$quantity = 0;
				} else {
					$quantity = floatval( $cart_item['quantity'] );
				}

				foreach ( $associated_cart_keys as $associated_key_id => $associated_key ) {

					$associated_data = WC()->cart->cart_contents[ $associated_key ];

					if ( ! isset( $associated_data['data'] ) || ! $associated_data['data'] ) {
						continue;
					}
					if ( $associated_data['data']->is_sold_individually() && $quantity > 0 ) {

						WC()->cart->cart_contents[ $associated_key ]['quantity']         = 1;
						WC()->cart->cart_contents[ $associated_key ]['did_set_quantity'] = 1;

					} else {

						$associated_quantity = floatval( $associated_data['tmproducts'][ $associated_key_id ]['quantity'] );
						$no_change_quantity  = floatval( $associated_data['tmproducts'][ $associated_key_id ]['no_change_quantity'] );
						$initial_quantity    = floatval( $associated_data['tmproducts'][ $associated_key_id ]['initial_quantity'] );

						if ( $no_change_quantity ) {
							$associated_quantity = $initial_quantity;
						}
						WC()->cart->cart_contents[ $associated_key ]['quantity']         = $associated_quantity * $quantity;
						WC()->cart->cart_contents[ $associated_key ]['did_set_quantity'] = $associated_quantity * $quantity;

					}
				}
			} elseif ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {
				if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'] ) ) {
					WC()->cart->cart_contents[ $cart_item_key ]['quantity'] = WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'];
					unset( WC()->cart->cart_contents[ $cart_item_key ]['did_set_quantity'] );
					WC()->cart->calculate_totals();
				}
			}
		}
	}

	/**
	 * Sync associated products quantity input
	 *
	 * @param integer $quantity The product quantity.
	 * @param string  $cart_item_key The cart item key.
	 * @return integer
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_item_quantity( $quantity, $cart_item_key ) {

		$cart_item = WC()->cart->cart_contents[ $cart_item_key ];

		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {

			$parent        = WC()->cart->cart_contents[ $cart_item['associated_parent'] ];
			$associated_id = array_search( $cart_item_key, $parent['associated_products'], true );

			if ( false === $associated_id ) {
				return $quantity;
			}

			if ( $cart_item['tmproducts'][ $associated_id ]['quantity_min'] === $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ) {

				$quantity = $cart_item['quantity'];

			} else {

				$parent_quantity = 1;
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_quantity_sync' ) ) {
					$parent_quantity = $parent['quantity'];
				}
				$max_stock = $cart_item['data']->managing_stock() && ! $cart_item['data']->backorders_allowed() ? $cart_item['data']->get_stock_quantity() : '';
				$max_stock = null === $max_stock ? '' : $max_stock;

				if ( '' !== $max_stock ) {
					$max_qty = '' !== $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ? min( $max_stock, $parent_quantity * $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ) : $max_stock;
				} else {
					$max_qty = '' !== $cart_item['tmproducts'][ $associated_id ]['quantity_max'] ? $parent_quantity * $cart_item['tmproducts'][ $associated_id ]['quantity_max'] : '';
				}

				$min_qty = floatval( $parent_quantity ) * floatval( $cart_item['tmproducts'][ $associated_id ]['quantity_min'] );

				if ( ( $max_qty > $min_qty || '' === $max_qty ) && ! $cart_item['data']->is_sold_individually() ) {

					$quantity = woocommerce_quantity_input(
						[
							'input_name'  => 'cart[' . $cart_item_key . '][qty]',
							'input_value' => $cart_item['quantity'],
							'min_value'   => $min_qty,
							'max_value'   => $max_qty,
							'step'        => $parent_quantity,
						],
						$cart_item['data'],
						false
					);

				} else {
					$quantity = $cart_item['quantity'];
				}
			}
		}

		return $quantity;
	}

	/**
	 * Associated product table item classes
	 *
	 * @param string       $class_name The item class.
	 * @param array<mixed> $cart_item The cart item.
	 * @return string
	 * @since 5.0
	 */
	public function associated_woocommerce_cart_item_class( $class_name, $cart_item ) {

		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {
			$class_name .= ' tc-associated-table-product';
		} elseif ( isset( $cart_item['associated_products'] ) && ! empty( $cart_item['associated_products'] ) ) {
			$class_name .= ' tc-container-table-product';
		}

		return $class_name;
	}

	/**
	 * Clear notices
	 *
	 * @return void
	 * @since 5.0
	 */
	public function associated_clear_removed_notice() {
		if ( is_admin() || ! function_exists( 'WC' ) ) {
			return;
		}

		$notices = ! empty( WC()->session ) ? WC()->session->get( 'wc_notices', [] ) : []; // @phpstan-ignore-line

		if ( isset( $notices['EPO_REMOVED_REQUIRED_ASSOCIATED_PRODUCT'] ) ) {
			if ( isset( $notices['success'] ) && is_array( $notices['success'] ) ) {
				$last = $notices['success'][ count( $notices['success'] ) - 1 ];
				if ( is_array( $last ) && isset( $last['notice'] ) ) {
					$last['notice'] = $notices['EPO_REMOVED_REQUIRED_ASSOCIATED_PRODUCT'][0]['notice'];
					$notices['success'][ count( $notices['success'] ) - 1 ] = $last;

				}
			}

			unset( $notices['EPO_REMOVED_REQUIRED_ASSOCIATED_PRODUCT'] );

			WC()->session->set( 'wc_notices', $notices );
		}
	}

	/**
	 * Fetch associated product cart keys
	 *
	 * @param array<mixed>       $cart_item The cart item.
	 * @param array<mixed>|false $cart_contents The cart contents.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function get_associated_cart_keys( $cart_item, $cart_contents = false ) {
		if ( ! $cart_contents ) {
			$cart_contents = WC()->cart->cart_contents;
		}

		$associated_cart_keys = [];

		if ( isset( $cart_item['associated_products'] ) && isset( $cart_item['tmproducts'] ) && ! empty( $cart_item['tmproducts'] ) && is_array( $cart_item['tmproducts'] ) ) {

			$associated_products = $cart_item['associated_products'];

			if ( ! empty( $cart_contents ) && ! empty( $associated_products ) && is_array( $associated_products ) ) {

				foreach ( $associated_products as $key ) {
					if ( isset( $cart_contents[ $key ] ) ) {
						$associated_cart_keys[ $key ] = $cart_contents[ $key ];
					}
				}
			}
		}

		return array_keys( $associated_cart_keys );
	}

	/**
	 * Remove associated products when the parent gets removed.
	 *
	 * @param string  $cart_item_key The cart item key.
	 * @param WC_Cart $cart The cart object.
	 * @return void
	 * @since 5.0
	 */
	public function associated_woocommerce_remove_cart_item( $cart_item_key, $cart ) {

		// This is an associated product.
		if ( isset( $cart->cart_contents[ $cart_item_key ]['associated_parent'] ) ) {

			// If it is required remove all other associated products and the parent product.
			if ( isset( $cart->cart_contents[ $cart_item_key ]['associated_required'] ) && ! empty( $cart->cart_contents[ $cart_item_key ]['associated_required'] ) ) {

				$associated_parent_key = $cart->cart_contents[ $cart_item_key ]['associated_parent'];

				// Remove all other associated products.
				if ( isset( $cart->cart_contents[ $associated_parent_key ] ) ) {
					$cart_keys = $this->get_associated_cart_keys( $cart->cart_contents[ $associated_parent_key ], $cart->cart_contents );

					foreach ( $cart_keys as $associated_cart_key ) {
						if ( ! isset( $cart->cart_contents[ $associated_cart_key ] ) ) {
							continue;
						}

						unset( WC()->cart->cart_contents[ $associated_cart_key ] );
					}
				}

				// Remove parent product.
				if ( isset( $cart->cart_contents[ $associated_parent_key ] ) ) {

					$product = wc_get_product( $cart->cart_contents[ $associated_parent_key ]['product_id'] );

					/* translators: %s: Item name. */
					$item_removed_title = $product ? $product->get_name() : '';

					/* Translators: %s Product title. */
					$removed_notice = sprintf( __( '%s removed along with all of its associated products!', 'woocommerce-tm-extra-product-options' ), $item_removed_title );

					wc_add_notice( $removed_notice, 'EPO_REMOVED_REQUIRED_ASSOCIATED_PRODUCT' );

					unset( WC()->cart->cart_contents[ $associated_parent_key ] );
				}

				unset( WC()->cart->removed_cart_contents[ $cart_item_key ] );

			}

			// This is a parent product.
		} elseif ( isset( $cart->removed_cart_contents[ $cart_item_key ]['associated_products'] ) && ! empty( $cart->removed_cart_contents[ $cart_item_key ]['associated_products'] ) && is_array( $cart->removed_cart_contents[ $cart_item_key ]['associated_products'] ) ) {
			/**
			 * Cart form data
			 *
			 * @var array<mixed> $cart_totals
			 */
			$cart_totals = isset( $_POST['cart'] ) ? wp_unslash( $_POST['cart'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
			$quantity    = -1;
			if ( $cart_totals && isset( $cart_totals[ $cart_item_key ] ) && isset( $cart_totals[ $cart_item_key ]['qty'] ) ) {
				$quantity = apply_filters( 'woocommerce_stock_amount_cart_item', wc_stock_amount( (int) preg_replace( '/[^0-9\.]/', '', $cart_totals[ $cart_item_key ]['qty'] ) ), $cart_item_key );
			}

			$associated_cart_keys = $this->get_associated_cart_keys( $cart->removed_cart_contents[ $cart_item_key ], $cart->cart_contents );

			// Remove all other associated products.
			foreach ( $associated_cart_keys as $associated_cart_key ) {
				if ( ! isset( $cart->cart_contents[ $associated_cart_key ] ) ) {
					continue;
				}
				$remove = $cart->cart_contents[ $associated_cart_key ];
				WC()->cart->removed_cart_contents[ $associated_cart_key ] = $remove;

				// Required to check if parent product was set to zero from cart.
				if ( '' !== $quantity && (float) 0 !== (float) $quantity ) {
					unset( WC()->cart->cart_contents[ $associated_cart_key ] );
				}
			}
		}
	}

	/**
	 * Restore associated products when the parent gets restored.
	 *
	 * @param string  $cart_item_key The cart item key.
	 * @param WC_Cart $cart The cart object.
	 * @return void
	 * @since 5.0
	 */
	public function associated_woocommerce_restore_cart_item( $cart_item_key, $cart ) {

		if ( isset( $cart->cart_contents[ $cart_item_key ]['associated_parent'] ) && ! empty( $cart->cart_contents[ $cart_item_key ]['associated_parent'] ) ) {

			$cart_item_data = $cart->cart_contents[ $cart_item_key ];

			$position       = array_search( $cart_item_data['associated_parent'], array_keys( $cart->cart_contents ), true );
			$position       = (int) $position + (int) $cart_item_data['associated_key'] + 1;
			$array          = $cart->cart_contents;
			$previous_items = array_slice( $array, 0, $position, true );
			$next_items     = array_slice( $array, $position, null, true );

			$item = [ $cart_item_key => $cart_item_data ];

			WC()->cart->cart_contents = $previous_items + $item + $next_items;

		} elseif ( isset( $cart->cart_contents[ $cart_item_key ]['associated_products'] ) && ! empty( $cart->cart_contents[ $cart_item_key ]['associated_products'] ) && is_array( $cart->cart_contents[ $cart_item_key ]['associated_products'] ) ) {

			$cart_keys = $this->get_associated_cart_keys( $cart->cart_contents[ $cart_item_key ], $cart->removed_cart_contents );

			foreach ( $cart_keys as $associated_cart_key ) {

				$remove                                      = $cart->removed_cart_contents[ $associated_cart_key ];
				$cart->cart_contents[ $associated_cart_key ] = $remove;

				do_action( 'woocommerce_restore_cart_item', $associated_cart_key, $cart );

				unset( WC()->cart->removed_cart_contents[ $associated_cart_key ] );
			}
		}
	}

	/**
	 * Add associated products (from elements) to the cart.
	 *
	 * @param string       $parent_cart_key The parent cart key.
	 * @param integer      $parent_id The parent product id.
	 * @param integer      $parent_quantity Contains the quantity of the parent product to add.
	 * @param integer      $variation_id ID of the parent variation being added to the cart.
	 * @param array<mixed> $variation Attribute values.
	 * @param array<mixed> $cart_item_data Extra cart item data we want to pass into the item.
	 * @return void
	 * @since 5.0
	 */
	public function associated_woocommerce_add_to_cart( $parent_cart_key, $parent_id, $parent_quantity, $variation_id, $variation, $cart_item_data ) {
		if ( ! did_action( 'woocommerce_cart_loaded_from_session' ) ) {
			return;
		}

		if ( ! defined( 'TM_ASSOC_WC_ADD_TO_CART' ) ) {
			define( 'TM_ASSOC_WC_ADD_TO_CART', true );
		}

		// Check to see if there are associated product to add.
		if ( isset( $cart_item_data['tmproducts'] ) && ! empty( $cart_item_data['tmproducts'] ) && is_array( $cart_item_data['tmproducts'] ) ) {

			// Prevent adding the same associated product for the same parent product.
			foreach ( WC()->cart->cart_contents as $cart_key => $cart_value ) {
				if ( isset( $cart_value['tmproducts'] ) && isset( $cart_value['associated_parent'] ) && $cart_value['associated_parent'] === $parent_cart_key ) {
					return;
				}
			}

			// Required to allow a different version of the same product to be added to the cart.
			$associated_cart_data = [
				'associated_parent' => $parent_cart_key,
				'tmproducts'        => $cart_item_data['tmproducts'],
			];

			foreach ( $cart_item_data['tmproducts'] as $key => $associated_data ) {

				$associated_item_cart_data = $associated_cart_data;

				$associated_data_form_prefix = isset( $associated_data['form_prefix'] ) ? $associated_data['form_prefix'] : '';

				if ( is_array( $associated_data_form_prefix ) ) {

					$form_prefix_counter = $key; // failsafe.
					if ( isset( $associated_data['form_prefix_counter'] ) ) {
						$form_prefix_counter = $associated_data['form_prefix_counter'];
					}

					if ( '' !== $form_prefix_counter ) {
						if ( isset( $associated_data_form_prefix[ $form_prefix_counter ] ) ) {
							$associated_data_form_prefix = $associated_data_form_prefix[ $form_prefix_counter ];
						}
					} else {
						$associated_data_form_prefix = array_values( $associated_data_form_prefix );
						$associated_data_form_prefix = $associated_data_form_prefix[0];
					}
				}

				if ( is_array( $associated_data_form_prefix ) ) {
					continue; // something went wrong.
				}

				$associated_item_cart_data['associated_key']                     = $key;
				$associated_item_cart_data['associated_required']                = isset( $associated_data['required'] ) ? $associated_data['required'] : '';
				$associated_item_cart_data['associated_shipped_individually']    = isset( $associated_data['shipped_individually'] ) ? $associated_data['shipped_individually'] : '';
				$associated_item_cart_data['associated_priced_individually']     = isset( $associated_data['priced_individually'] ) ? $associated_data['priced_individually'] : '';
				$associated_item_cart_data['associated_maintain_weight']         = isset( $associated_data['maintain_weight'] ) ? $associated_data['maintain_weight'] : '';
				$associated_item_cart_data['associated_uniqid']                  = isset( $associated_data['section'] ) ? $associated_data['section'] : '';
				$associated_item_cart_data['associated_label']                   = isset( $associated_data['section_label'] ) ? $associated_data['section_label'] : '';
				$associated_item_cart_data['associated_discount']                = isset( $associated_data['discount'] ) ? $associated_data['discount'] : '';
				$associated_item_cart_data['associated_discount_type']           = isset( $associated_data['discount_type'] ) ? $associated_data['discount_type'] : '';
				$associated_item_cart_data['associated_discount_exclude_addons'] = isset( $associated_data['discount_exclude_addons'] ) ? $associated_data['discount_exclude_addons'] : '';
				$associated_item_cart_data['associated_element_name']            = $associated_data['element_name'];
				$associated_item_cart_data['associated_formprefix']              = str_replace( [ '.', ' ', '[' ], '', $associated_data_form_prefix );
				$associated_item_cart_data['hiddenin']                           = $associated_data['hiddenin'];
				$associated_product_id = $associated_data['product_id'];
				$variation_id          = 0;
				$variations            = [];

				if ( '' === $associated_product_id ) {
					continue;
				}

				$associated_product = wc_get_product( $associated_product_id );

				if ( ! $associated_product ) {
					continue;
				}

				// Only allow simple or variable products.
				if ( apply_filters( 'wc_epo_associated_add_to_cart', false, $associated_product, $associated_item_cart_data ) && ( ! ( $associated_product->is_type( 'simple' ) || $associated_product->is_type( 'variable' ) || $associated_product->is_type( 'variation' ) ) ) ) {
					continue;
				}

				$item_quantity = $associated_data['quantity'];

				if ( $associated_product->is_sold_individually() ) {
					$quantity = 1;
				} else {
					$quantity = $item_quantity;
					if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_quantity_sync' ) ) {
						$quantity = floatval( $quantity ) * floatval( $parent_quantity );
					}
				}

				if ( (float) 0 === (float) $quantity ) {
					continue;
				}

				if ( $associated_product->is_type( 'variable' ) || $associated_product->is_type( 'variation' ) ) {

					if ( $associated_product->is_type( 'variation' ) ) {
						$variation_id = (int) $associated_data['product_id'];
						$associated_item_cart_data['associated_variation_id'] = $variation_id;
						$variations           = [];
						$parent_data          = wc_get_product( $associated_product->get_parent_id() );
						$variation_attributes = $associated_product->get_variation_attributes(); // @phpstan-ignore-line
						// Filter out 'any' variations, which are empty, as they need to be explicitly specified while adding to cart.
						$variation_attributes = array_filter( $variation_attributes );
					} else {
						$variation_id = (int) $associated_data['variation_id'];
						$associated_item_cart_data['associated_variation_id'] = $variation_id;
						$variations           = $associated_data['attributes'];
						$parent_data          = $associated_product;
						$variation_attributes = [];
					}

					if ( $variation_id ) {
						$variation_data = wc_get_product_variation_attributes( $variation_id );
						if ( $parent_data instanceof WC_Product ) {
							foreach ( $parent_data->get_attributes() as $attribute ) {
								if ( ! $attribute['is_variation'] ) {
									continue;
								}

								// Get valid value from variation data.
								$attribute_key = 'attribute_' . sanitize_title( $attribute['name'] );
								$valid_value   = isset( $variation_data[ $attribute_key ] ) ? $variation_data[ $attribute_key ] : '';
								$value         = false;
								/**
								 * If the attribute value was posted, check if it's valid.
								 *
								 * If no attribute was posted, only error if the variation has an 'any' attribute which requires a value.
								 */
								if ( $associated_product->is_type( 'variation' ) ) {
									if ( isset( $variation_attributes[ $attribute_key ] ) ) {
										$value = $variation_attributes[ $attribute_key ];
									}
								} elseif ( isset( $cart_item_data['tmpost_data'][ $associated_data['element_name'] . '_' . $attribute_key ] ) ) {
									$value = $cart_item_data['tmpost_data'][ $associated_data['element_name'] . '_' . $attribute_key ];
								}
								if ( false === $value ) {
									continue;
								}
								// Allow if valid or show error.
								if ( $valid_value === $value ) {
									$variations[ $attribute_key ] = $value;
								} elseif ( '' === $valid_value && in_array( $value, $attribute->get_slugs(), true ) ) {
									// If valid values are empty, this is an 'any' variation so get all possible values.
									$variations[ $attribute_key ] = $value;
								}
							}
						}
					} else {
						continue;
					}
				}

				THEMECOMPLETE_EPO()->associated_element_uniqid     = $associated_item_cart_data['associated_uniqid'];
				THEMECOMPLETE_EPO()->associated_product_counter    = $key;
				THEMECOMPLETE_EPO()->associated_product_formprefix = $associated_item_cart_data['associated_formprefix'];
				$associated_item_cart_key                          = $this->add_associated_to_cart( $parent_id, $associated_product, $quantity, $variation_id, $variations, $associated_item_cart_data );
				THEMECOMPLETE_EPO()->associated_element_uniqid     = false;
				THEMECOMPLETE_EPO()->associated_product_counter    = false;
				THEMECOMPLETE_EPO()->associated_product_formprefix = false;

				if ( ! isset( WC()->cart->cart_contents[ $parent_cart_key ]['associated_products'] ) ) {
					WC()->cart->cart_contents[ $parent_cart_key ]['associated_products'] = [];
				}
				if ( $associated_item_cart_key && ! in_array( $associated_item_cart_key, WC()->cart->cart_contents[ $parent_cart_key ]['associated_products'], true ) ) {
					WC()->cart->cart_contents[ $parent_cart_key ]['associated_products'][] = $associated_item_cart_key;
				}
			}
		}
	}

	/**
	 * Add an associated product to the cart.
	 *
	 * @param integer      $parend_id The parent product id.
	 * @param object       $product The associated product object.
	 * @param integer      $quantity Contains the quantity of the associated product to add.
	 * @param integer      $variation_id ID of the associated variation being added to the cart.
	 * @param array<mixed> $variations Attribute values.
	 * @param array<mixed> $cart_item_data Extra cart item data we want to pass into the item.
	 * @return string|false
	 * @since 5.0
	 */
	private function add_associated_to_cart( $parend_id, $product, $quantity = 1, $variation_id = 0, $variations = [], $cart_item_data = [] ) {

		if ( $quantity <= 0 ) {
			return false;
		}

		// Get the product / ID.
		if ( is_a( $product, 'WC_Product' ) ) {

			$product_id   = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id();
			$variation_id = $product->is_type( 'variation' ) ? $product->get_id() : $variation_id;
			$product_data = $product->is_type( 'variation' ) ? $product : wc_get_product( $variation_id ? $variation_id : $product_id );

		} else {

			$product_id   = absint( $product );
			$product_data = wc_get_product( $product_id );

			if ( $product_data instanceof WC_Product ) {
				if ( $product_data->is_type( 'variation' ) ) {
					$product_id   = $product_data->get_parent_id();
					$variation_id = $product_data->get_id();
				} else {
					$product_data = wc_get_product( $variation_id ? $variation_id : $product_id );
				}
			}
		}

		if ( ! $product_data ) {
			return false;
		}

		if ( ! $product_data->is_in_stock() ) {
			return false;
		}

		// Load cart item data when adding to cart (WC core filter).
		$cart_item_data = (array) apply_filters( 'woocommerce_add_cart_item_data', $cart_item_data, $product_id, $variation_id, $quantity );

		// Generate a ID based on product ID, variation ID, variation data, and other cart item data.
		$cart_id = WC()->cart->generate_cart_id( $product_id, $variation_id, $variations, $cart_item_data );

		// See if this product and its options is already in the cart.
		$cart_item_key = WC()->cart->find_product_in_cart( $cart_id );

		// If cart_item_key is set, the item is already in the cart and its quantity will be handled by update_quantity_in_cart.
		if ( ! $cart_item_key ) {

			$cart_item_key = $cart_id;

			$array    = WC()->cart->cart_contents;
			$position = array_search( $cart_item_data['associated_parent'], array_keys( $array ), true );
			$position = (int) $position + (int) $cart_item_data['associated_key'] + 1;

			$previous_items = array_slice( $array, 0, $position, true );
			$next_items     = array_slice( $array, $position, null, true );

			$item = [
				$cart_item_key => apply_filters(
					'woocommerce_add_cart_item',
					array_merge(
						$cart_item_data,
						[
							'key'          => $cart_item_key,
							'product_id'   => absint( $product_id ),
							'variation_id' => absint( $variation_id ),
							'variation'    => $variations,
							'quantity'     => $quantity,
							'data'         => $product_data,
						]
					),
					$cart_item_key
				),
			];

			WC()->cart->cart_contents = $previous_items + $item + $next_items;

		}

		return $cart_item_key;
	}

	/**
	 * Get discounted price
	 *
	 * @param mixed  $current_price The current product price.
	 * @param string $discount The product discount.
	 * @param string $discount_type The product discount type.
	 * @return mixed
	 * @since 5.0.8
	 */
	public function get_discounted_price( $current_price = 0, $discount = '', $discount_type = '' ) {
		$discount = wc_format_decimal( (float) $discount, wc_get_price_decimals() );

		if ( $current_price && $discount && $discount_type ) {
			if ( is_numeric( $current_price ) ) {
				$price    = floatval( wc_format_decimal( (float) $current_price, wc_get_price_decimals() ) );
				$discount = floatval( $discount );
				if ( 'fixed' === $discount_type ) {
					$current_price = max( $price - $discount, 0 );
				} elseif ( 'percent' === $discount_type ) {
					$current_price = max( $price * ( ( 100 - $discount ) / 100 ), 0 );
				}
			} else { // math formula.
				$price = '(' . $current_price . ')';
				if ( 'fixed' === $discount_type ) {
					$current_price = $price . ' - ' . $discount;
				} elseif ( 'percent' === $discount_type ) {
					$current_price = $price . ' * ( ( 100 - ' . $discount . ' ) / 100 )';
				}
			}
		}

		return $current_price;
	}

	/**
	 * Modify cart item
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function modify_cart_item( $cart_item = [] ) {
		if ( isset( $cart_item['associated_parent'] ) && ! empty( $cart_item['associated_parent'] ) ) {

			if ( empty( $cart_item['associated_priced_individually'] ) ) {
				$cart_item['data']->set_regular_price( 0 );
				$cart_item['data']->set_sale_price( '' );
				$cart_item['data']->set_price( 0 );
			}

			if ( $cart_item['associated_discount'] ) {

				$discounted_price = $this->get_discounted_price( $cart_item['data']->get_price( 'edit' ), $cart_item['associated_discount'], $cart_item['associated_discount_type'] );

				$cart_item['data']->set_price( $discounted_price );
				$cart_item['data']->set_sale_price( $discounted_price );

			}

			if ( $cart_item['data']->needs_shipping() ) {

				if ( empty( $cart_item['associated_shipped_individually'] ) ) {

					if ( '1' === $cart_item['associated_maintain_weight'] ) {

						$cart_item_weight = $cart_item['data']->get_weight( 'edit' );

						if ( $cart_item['data']->is_type( 'variation' ) && '' === $cart_item_weight ) {
							$parent_data      = $cart_item['data']->get_parent_data();
							$cart_item_weight = $parent_data['weight'];
						}

						$cart_item['associated_weight'] = $cart_item_weight;

					}

					$cart_item['data']->set_virtual( 'yes' );
					$cart_item['data']->set_weight( '' );

				}
			}
		}

		return $cart_item;
	}

	/**
	 * Modify cart
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function woocommerce_add_cart_item( $cart_item = [] ) {
		$cart_item = $this->modify_cart_item( $cart_item );
		return $cart_item;
	}

	/**
	 * Gets the cart from session.
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @param array<mixed> $values Cart item values.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function woocommerce_get_cart_item_from_session( $cart_item = [], $values = [] ) {
		if ( isset( $values['tmproducts'] ) ) {
			$cart_item['tmproducts'] = $values['tmproducts'];
		}
		if ( isset( $values['associated_products'] ) ) {
			$cart_item['associated_products'] = $values['associated_products'];
		}
		if ( isset( $values['associated_parent'] ) ) {
			$cart_item['associated_parent'] = $values['associated_parent'];
		}
		if ( isset( $values['associated_key'] ) ) {
			$cart_item['associated_key'] = $values['associated_key'];
		}
		if ( isset( $values['associated_required'] ) ) {
			$cart_item['associated_required'] = $values['associated_required'];
		}
		if ( isset( $values['associated_shipped_individually'] ) ) {
			$cart_item['associated_shipped_individually'] = $values['associated_shipped_individually'];
		}
		if ( isset( $values['associated_priced_individually'] ) ) {
			$cart_item['associated_priced_individually'] = $values['associated_priced_individually'];
		}
		if ( isset( $values['associated_maintain_weight'] ) ) {
			$cart_item['associated_maintain_weight'] = $values['associated_maintain_weight'];
		}
		if ( isset( $values['associated_uniqid'] ) ) {
			$cart_item['associated_uniqid'] = $values['associated_uniqid'];
		}
		if ( isset( $values['associated_label'] ) ) {
			$cart_item['associated_label'] = $values['associated_label'];
		}
		if ( isset( $values['associated_discount'] ) ) {
			$cart_item['associated_discount'] = $values['associated_discount'];
		}
		if ( isset( $values['associated_discount_type'] ) ) {
			$cart_item['associated_discount_type'] = $values['associated_discount_type'];
		}
		if ( isset( $values['associated_discount_exclude_addons'] ) ) {
			$cart_item['associated_discount_exclude_addons'] = $values['associated_discount_exclude_addons'];
		}
		$cart_item = $this->modify_cart_item( $cart_item );

		return $cart_item;
	}


	/**
	 * Edit cart functionality
	 * This serves as edit cart regardless if the product has associated products.
	 *
	 * @param string  $cart_item_key The cart item key.
	 * @param integer $product_id Contains the id of the product to add to the cart.
	 * @param integer $quantity Contains the quantity of the item to add.
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_add_to_cart( $cart_item_key = '', $product_id = 0, $quantity = 1 ) {
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {

			$original_key = THEMECOMPLETE_EPO()->cart_edit_key;

			// Check if there isn't any data change.
			if ( $original_key === $cart_item_key ) {
				WC()->cart->cart_contents[ $cart_item_key ]['quantity'] = $quantity;
				$this->woocommerce_after_cart_item_quantity_update( $cart_item_key, $quantity );
				return;
			}

			// Remove old associated products.
			if ( isset( WC()->cart->cart_contents[ $original_key ]['associated_products'] ) && is_array( WC()->cart->cart_contents[ $original_key ]['associated_products'] ) ) {
				foreach ( WC()->cart->cart_contents[ $original_key ]['associated_products'] as $key ) {
					unset( WC()->cart->cart_contents[ $key ] );
				}
			}

			// Replace original key entry with the new key entry.
			if ( $original_key !== $cart_item_key ) {
				$array   = WC()->cart->cart_contents;
				$old_key = $original_key;
				$new_key = $cart_item_key;

				if ( array_key_exists( $old_key, $array ) ) {
					$keys = array_keys( $array );
					$keys[ array_search( $old_key, $keys, true ) ] = $new_key;
					$array                    = array_combine( $keys, $array );
					WC()->cart->cart_contents = $array;
				}
			}

			// Reposition new associated product to be below the edited product.
			if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['associated_products'] ) && is_array( WC()->cart->cart_contents[ $cart_item_key ]['associated_products'] ) ) {

				$associated_products = [];
				foreach ( WC()->cart->cart_contents[ $cart_item_key ]['associated_products'] as $key ) {
					if ( isset( WC()->cart->cart_contents[ $key ] ) ) {
						$associated_products[ $key ] = WC()->cart->cart_contents[ $key ];
					}
				}

				$start_position = array_search( $cart_item_key, array_keys( WC()->cart->cart_contents ), true );
				foreach ( $associated_products as $key => $item ) {
					$position       = (int) $start_position + (int) $item['associated_key'] + 1;
					$array          = WC()->cart->cart_contents;
					$previous_items = array_slice( $array, 0, $position, true );
					$next_items     = array_slice( $array, $position, null, true );

					$item = [ $key => $item ];

					WC()->cart->cart_contents = $previous_items + $item + $next_items;

				}
			}
		}
	}
}
includes/classes/class-themecomplete-epo-cart.php000064400000537320150755142450016210 0ustar00<?php
/**
 * Extra Product Options Cart Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Cart Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_Cart {

	/**
	 * Edit option in cart helper
	 *
	 * @var string|boolean
	 */
	public $new_add_to_cart_key = false;

	/**
	 * The current product quantity
	 *
	 * @var mixed
	 */
	private $saved_product_quantity = false;

	/**
	 * Helper flag to determin if we should
	 * add theedit link on product title
	 *
	 * @var boolean
	 */
	private $added_woocommerce_checkout_cart_item_quantity = false;

	/**
	 * The element id array
	 *
	 * @var array<mixed>
	 */
	public $element_id_array = [];

	/**
	 * The global prices array
	 *
	 * @var array<mixed>
	 */
	public $global_prices = [];

	/**
	 * The global sections array
	 *
	 * @var array<mixed>
	 */
	public $global_sections = [];

	/**
	 * The current options array
	 *
	 * @var array<mixed>
	 */
	public $global_price_array = [];

	/**
	 * The current normal options array
	 *
	 * @var array<mixed>
	 */
	public $local_price_array = [];

	/**
	 * The current from prefix
	 *
	 * @var string
	 */
	public $form_prefix = '';

	/**
	 * If the element ids have been populated
	 *
	 * @var boolean
	 */
	public $populate_arrays_set = false;

	/**
	 * The current cart item meta
	 *
	 * @var array<mixed>
	 */
	public $cart_item_meta = [];

	/**
	 * The last cart key that was added to the cart
	 *
	 * @var string
	 */
	public $last_added_cart_key = '';

	/**
	 * Flag to check if we are in mini cart
	 *
	 * @var boolean
	 */
	public $in_mini_cart = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Cart|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Cart
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Alter the cart id upon adding the product to the cart.
		add_filter( 'woocommerce_cart_id', [ $this, 'woocommerce_cart_id' ], 10, 5 );
		// Modifies the cart item.
		add_action( 'woocommerce_add_to_cart', [ $this, 'woocommerce_add_to_cart' ], 12, 1 );
		add_filter( 'woocommerce_before_calculate_totals', [ $this, 'woocommerce_before_calculate_totals' ], 9999, 1 );
		// Load cart data on every page load.
		add_filter( 'woocommerce_get_cart_item_from_session', [ $this, 'woocommerce_get_cart_item_from_session' ], 9999, 3 );
		// Gets cart item to display in the frontend.
		add_filter( 'woocommerce_get_item_data', [ $this, 'woocommerce_get_item_data' ], 50, 2 );
		// Add item data to the cart.
		add_filter( 'woocommerce_add_cart_item_data', [ $this, 'woocommerce_add_cart_item_data' ], 50, 2 );
		// Validate upon adding to cart.
		add_filter( 'woocommerce_add_to_cart_validation', [ $this, 'woocommerce_add_to_cart_validation' ], 50, 6 );
		// Alter the product thumbnail in cart.
		add_filter( 'woocommerce_cart_item_thumbnail', [ $this, 'woocommerce_cart_item_thumbnail' ], 50, 2 );
		// Ensures correct price is shown on minicart.
		add_action( 'woocommerce_before_mini_cart_contents', [ $this, 'woocommerce_before_mini_cart_contents' ] );
		// Remove mini cart flag.
		add_action( 'woocommerce_mini_cart_contents', [ $this, 'woocommerce_mini_cart_contents' ] );
		// Cart edit key.
		add_action( 'woocommerce_cart_loaded_from_session', [ $this, 'woocommerce_cart_loaded_from_session' ], 0 );
		// Calculate totals on remove from cart/update.
		add_action( 'woocommerce_update_cart_action_cart_updated', [ $this, 'woocommerce_update_cart_action_cart_updated' ], 9999, 1 );
		// Support for fee price types.
		add_action( 'woocommerce_cart_calculate_fees', [ $this, 'woocommerce_cart_calculate_fees' ] );

		// Empty cart button.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_clear_cart_button' ) ) {
			add_action( 'woocommerce_cart_actions', [ $this, 'add_empty_cart_button' ] );
			// check for empty-cart get param to clear the cart.
			add_action( 'init', [ $this, 'clear_cart' ] );
		}

		// Override templates.
		if ( apply_filters( 'tm_get_template', true ) ) {
			add_filter( 'wc_get_template', [ $this, 'tm_wc_get_template' ], 10, 2 );
		}

		// Custom actions running for advanced template system.
		add_filter( 'woocommerce_cart_item_subtotal', [ $this, 'woocommerce_cart_item_subtotal' ], 99999, 3 );
		add_filter( 'woocommerce_cart_item_quantity', [ $this, 'woocommerce_cart_item_quantity' ], 10, 3 );
		add_filter( 'woocommerce_cart_item_price', [ $this, 'woocommerce_cart_item_price' ], 10, 3 );
		add_filter( 'woocommerce_cart_item_class', [ $this, 'woocommerce_cart_item_class' ], 10, 2 );
		add_filter( 'wc_tm_epo_ac_product_price', [ $this, 'wc_tm_epo_ac_product_price' ], 10, 5 );
		add_filter( 'wc_tm_epo_ac_subtotal_price', [ $this, 'wc_tm_epo_ac_product_price' ], 10, 5 );

		// Edit cart item.
		// Adds edit link on product title in cart.
		add_action( 'woocommerce_after_cart_item_name', [ $this, 'woocommerce_after_cart_item_name' ], 50, 2 );
		add_filter( 'woocommerce_cart_item_name', [ $this, 'woocommerce_cart_item_name' ], 50, 3 );
		// Alters add to cart text when editing a product.
		add_action( 'woocommerce_before_add_to_cart_button', [ $this, 'woocommerce_before_add_to_cart_button' ] );
		// Alters the cart item key when editing a product.
		add_action( 'woocommerce_add_to_cart', [ $this, 'edit_woocommerce_add_to_cart' ], 10, 6 );
		// Redirect to cart when updating information for a cart item.
		add_filter( 'woocommerce_add_to_cart_redirect', [ $this, 'woocommerce_add_to_cart_redirect' ], 9999, 1 );
		// Remove product from cart when editing a product.
		add_filter( 'woocommerce_add_to_cart_validation', [ $this, 'remove_previous_product_from_cart' ], 99999, 1 );
		// Alter add to cart message.
		add_filter( 'wc_add_to_cart_message_html', [ $this, 'wc_add_to_cart_message_html' ], 10, 2 );
		// Change quantity value when editing a cart item.
		add_action( 'woocommerce_before_add_to_cart_form', [ $this, 'tm_woocommerce_before_add_to_cart_form' ], 1 );
		add_action( 'woocommerce_after_add_to_cart_form', [ $this, 'tm_woocommerce_after_add_to_cart_form' ], 9999 );

		// Disables persistent cart.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_turn_off_persi_cart' ) ) {
			add_filter( 'get_user_metadata', [ $this, 'turn_off_persi_cart' ], 10, 3 );
			add_filter( 'update_user_metadata', [ $this, 'turn_off_persi_cart' ], 10, 3 );
			add_filter( 'add_user_metadata', [ $this, 'turn_off_persi_cart' ], 10, 3 );
		}

		// Add option specific styles to the cart page.
		add_action( 'woocommerce_after_cart', [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_add_inline_style' ], 99999 );

		// Delete saved user files upon removing a product from the cart.
		add_action( 'wp_loaded', [ $this, 'update_cart_action' ], 11 );
	}

	/**
	 * Delete saved user files upon removing a product from the cart.
	 *
	 * @return void
	 */
	public function update_cart_action() {

		$nonce_value = wc_get_var( $_REQUEST['woocommerce-cart-nonce'], wc_get_var( $_REQUEST['_wpnonce'], '' ) ); // @codingStandardsIgnoreLine.

		if ( isset( $_REQUEST['remove_item'] ) && ! empty( $_GET['remove_item'] ) && wp_verify_nonce( $nonce_value, 'woocommerce-cart' ) ) {
			$cart_item_key = sanitize_text_field( wp_unslash( $_GET['remove_item'] ) );
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );
			if ( $cart_item && isset( $cart_item['tmcartepo'] ) ) {
				foreach ( $cart_item['tmcartepo'] as $epo ) {
					if ( is_array( $epo ) && isset( $epo['element'] ) && isset( $epo['element']['type'] ) && in_array( $epo['element']['type'], [ 'upload', 'multiple_file_upload' ], true ) && isset( $epo['file'] ) && is_array( $epo['file'] ) ) {
						$epo['file'] = [ $epo['file'] ];
						foreach ( $epo['file'] as $file ) {
							if ( isset( $file['file'] ) ) {
								wp_delete_file( $file['file'] );
							}
						}
					}
				}
			}
		}
	}

	/**
	 * Returns correct formated price for the cart table
	 *
	 * @param mixed        $price The element price.
	 * @param array<mixed> $cart_item The cart item.
	 * @param mixed        $symbol The plus or minus symbol.
	 * @param mixed        $quantity The element quantity.
	 * @param mixed        $price_type The element price type.
	 * @return string
	 * @since 1.0
	 */
	public function get_price_for_cart( $price = 0, $cart_item = [], $symbol = false, $quantity = 0, $price_type = '' ) {
		global $woocommerce;
		$product          = $cart_item['data'];
		$cart             = $woocommerce->cart;
		$taxable          = $product->is_taxable();
		$tax_display_cart = get_option( 'woocommerce_tax_display_cart' );
		$tax_string       = '';

		if ( false === $price ) {
			$price = $product->get_price();
		}
		if ( is_array( $price_type ) ) {
			$price_type = array_values( $price_type );
			$price_type = $price_type[0];
		}
		$price = apply_filters( 'wc_epo_price_on_cart', $price, $cart_item );

		// Taxable.
		if ( $taxable ) {

			if ( 'excl' === $tax_display_cart ) {

				if ( $cart->tax_total > 0 && wc_prices_include_tax() ) {
					$tax_string = ' <small>' . apply_filters( 'wc_epo_ex_tax_or_vat_string', WC()->countries->ex_tax_or_vat() ) . '</small>';
				}
				if ( (float) 0 !== floatval( $price ) ) {
					$price = (float) themecomplete_get_price_excluding_tax(
						$product,
						[
							'qty'   => 10000,
							'price' => $price,
						]
					) / 10000;
				}
			} else {

				if ( $cart->tax_total > 0 && ! wc_prices_include_tax() ) {
					$tax_string = ' <small>' . apply_filters( 'inc_tax_or_vat', WC()->countries->inc_tax_or_vat() ) . '</small>';
				}
				if ( (float) 0 !== floatval( $price ) ) {
					$price = (float) themecomplete_get_price_including_tax(
						$product,
						[
							'qty'   => 10000,
							'price' => $price,
						]
					) / 10000;
				}
			}
		}

		if ( false === $symbol ) {
			if ( '' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_price_sign' ) && 'advanced' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
				$symbol = apply_filters( 'wc_epo_get_price_for_cart_plus_sign', "<span class='tc-plus-sign'>+</span>" );
			}
			if ( floatval( $price ) < 0 ) {
				$symbol = apply_filters( 'wc_epo_get_price_for_cart_minus_sign', "<span class='tc-minus-sign'>-</span>" );
			}
		}

		if ( ! empty( $quantity ) ) {
			$price = floatval( $price ) * floatval( $quantity );
		}

		if ( (float) 0 === floatval( $price ) ) {
			$symbol = apply_filters( 'wc_epo_get_price_for_cart_price_empty', '', $price, $tax_string, $cart_item, $symbol, $quantity, $price_type );
		} else {
			$price  = apply_filters( 'wc_epo_get_price_for_cart_price', ' <span class="tc-price-amount-in-cart">' . ( themecomplete_price( abs( $price ) ) ) . '</span>', $price = 0, $cart_item, $symbol, $quantity, $price_type );
			$symbol = apply_filters( 'wc_epo_get_price_for_cart_symbol', " $symbol" . $price . $tax_string, $symbol, $price, $tax_string, $cart_item, $symbol, $quantity, $price_type );

			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_strip_html_from_emails' ) && ( ( function_exists( 'is_wc_endpoint_url' ) && is_wc_endpoint_url( 'email' ) ) || ! function_exists( 'is_wc_endpoint_url' ) ) ) {
				$symbol = wp_strip_all_tags( $symbol );
			}
		}

		return apply_filters( 'wc_epo_get_price_for_cart', $symbol, $price, $cart_item, $symbol, $quantity, $price_type );
	}

	/**
	 * Helper function to remove the form prefix
	 *
	 * @param array<mixed> $tmpost_data The posted data.
	 * @param string       $form_prefix The form prefix.
	 * @return array<mixed>
	 */
	public function woocommerce_cart_id_map( $tmpost_data, $form_prefix ) {
		if ( '' !== $form_prefix ) {
			$tmpost_data = str_replace( $form_prefix, '', $tmpost_data );
		}
		return $tmpost_data;
	}

	/**
	 * Alter the cart id upon adding the product to the cart
	 *
	 * @param string       $cart_id A unique ID for the cart item being added.
	 * @param integer      $product_id The id of the product the key is being generated for.
	 * @param integer      $variation_id The variation id of the product the key is being generated for.
	 * @param array<mixed> $variation The variation data for the cart item.
	 * @param array<mixed> $cart_item_data The Cart item meta data.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_id( $cart_id, $product_id, $variation_id = 0, $variation = [], $cart_item_data = [] ) {
		if ( is_array( $cart_item_data ) && ! empty( $cart_item_data ) && isset( $cart_item_data['tmpost_data'] ) ) {
			if ( is_array( $cart_item_data['tmpost_data'] ) && ! empty( $cart_item_data['tmpost_data'] ) ) {
				foreach ( $cart_item_data['tmpost_data'] as $key => $value ) {
					if ( mb_strpos( $key, 'tmcp_' ) !== 0 ) {
						unset( $cart_item_data['tmpost_data'][ $key ] );
					}
				}
			}

			if ( isset( $cart_item_data['tmdata'] ) && isset( $cart_item_data['tmdata']['tmcp_post_fields'] ) ) {
				foreach ( $cart_item_data['tmdata']['tmcp_post_fields'] as $key => $value ) {
					if ( ! isset( $cart_item_data['tmpost_data'][ $key ] ) ) {
						$cart_item_data['tmpost_data'][ $key ] = $value;
					}
				}
			}

			$form_prefix                   = $cart_item_data['tmdata']['form_prefix'];
			$cart_item_data['tmpost_data'] = THEMECOMPLETE_EPO_HELPER()->array_map_key( [ $this, 'woocommerce_cart_id_map' ], $cart_item_data['tmpost_data'], [ $form_prefix ] );

			unset( $cart_item_data['tmdata'] );
			unset( $cart_item_data['tmcartepo'] );
			unset( $cart_item_data['tmcartfee'] );

			$id_parts = [ $product_id ];

			if ( $variation_id && 0 !== $variation_id ) {
				$id_parts[] = $variation_id;
			}

			if ( is_array( $variation ) && ! empty( $variation ) ) {
				$variation_key = '';
				foreach ( $variation as $key => $value ) {
					$variation_key .= trim( $key ) . trim( $value );
				}
				$id_parts[] = $variation_key;
			}

			$cart_item_data_key = '';
			foreach ( $cart_item_data as $key => $value ) {
				if ( is_array( $value ) || is_object( $value ) ) {
					$value = http_build_query( $value );
				}
				$cart_item_data_key .= trim( $key ) . trim( $value );
			}
			$id_parts[] = $cart_item_data_key;

			$cart_id = md5( implode( '_', $id_parts ) );
		}

		// Required in order to not have errors with stock when editing products.
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['quantity'] = 0;
		}

		return $cart_id;
	}

	/**
	 * Repopulate the cart meta
	 *
	 * @param array<mixed>      $cart_item_meta Cart item meta.
	 * @param integer           $product_id Product id.
	 * @param array<mixed>|null $post_data Post data.
	 * @param boolean           $novarprices If we should not calculate variable prices.
	 * @param string            $form_prefix Form prefix.
	 * @param string            $epo_type What type of date to repopulate.
	 *
	 * @return mixed
	 */
	public function repopulatecart( $cart_item_meta, $product_id, $post_data = null, $novarprices = false, $form_prefix = '', $epo_type = 'tmcartepo' ) {
		if ( is_array( $post_data ) && isset( $post_data['tc_form_prefix'] ) ) {
			$form_prefix = $post_data['tc_form_prefix'];
		}
		if ( ! $this->populate_arrays( $product_id, $post_data, $cart_item_meta ) ) {
			return $cart_item_meta;
		}
		global $woocommerce_wpml;

		$cpf_product_price = 0;

		if ( isset( $cart_item_meta['composite_item'] ) ) {
			global $woocommerce;
			$cart_contents = $woocommerce->cart->get_cart();

			$bundled_item_id = $cart_item_meta['composite_item'];
			if ( isset( $post_data['bto_variation_id'][ $bundled_item_id ] ) ) {
				$variation_id = $post_data['bto_variation_id'][ $bundled_item_id ];
			} elseif ( isset( $post_data['wccp_variation_id'][ $bundled_item_id ] ) ) {
				$variation_id = $post_data['wccp_variation_id'][ $bundled_item_id ];
			}

			if ( isset( $post_data['cpf_bto_price'] ) ) {
				if ( is_array( $post_data['cpf_bto_price'] ) ) {
					if ( isset( $post_data['cpf_bto_price'][ $bundled_item_id ] ) ) {
						$cpf_product_price = $post_data['cpf_bto_price'][ $bundled_item_id ];
					}
				} else {
					$cpf_product_price = $post_data['cpf_bto_price'];
				}
			}
		} elseif ( isset( $cart_item_meta['associated_uniqid'] ) ) {
			$associated_formprefix = $cart_item_meta['associated_formprefix'];

			if ( isset( $post_data[ 'cpf_product_price' . $associated_formprefix ] ) ) {
				$cpf_product_price = $post_data[ 'cpf_product_price' . $associated_formprefix ];
			}
		} else {
			$cpf_product_price = $post_data['cpf_product_price'];
		}

		if ( isset( $cart_item_meta['associated_priced_individually'] ) && ! $cart_item_meta['associated_priced_individually'] ) {
			$cpf_product_price = 0;
		}

		$global_prices = $this->global_prices;

		$element_object = [];
		$pl             = [ 'before', 'after' ];
		foreach ( $pl as $where ) {
			foreach ( $global_prices[ $where ] as $priorities ) {
				foreach ( $priorities as $field ) {
					foreach ( $field['sections'] as $section_id => $section ) {
						if ( isset( $section['elements'] ) ) {
							foreach ( $section['elements'] as $element ) {
								$element_object[ $element['uniqid'] ] = $element;
							}
						}
					}
				}
			}
		}

		if ( ! isset( $cart_item_meta['associated_products_price'] ) || ! empty( $cart_item_meta['tc_recalculate'] ) ) {
			$associated_products_price = 0;

			if ( isset( $cart_item_meta['associated_products'] ) ) {
				foreach ( $cart_item_meta['associated_products'] as $associated_cart_key ) {
					if ( isset( WC()->cart->cart_contents[ $associated_cart_key ] ) ) {
						$associated_products_price = $associated_products_price + floatval( WC()->cart->cart_contents[ $associated_cart_key ]['data']->get_price() );
					}
				}
			}

			$cart_item_meta['associated_products_price'] = $associated_products_price;
		}

		if ( $cart_item_meta['associated_products_price'] > 0 ) {
			$cart_item_meta['tc_recalculate'] = true;
		}

		if ( isset( $cart_item_meta[ $epo_type ] ) ) {
			$current_currency = themecomplete_get_woocommerce_currency();

			$tc_added_in_currency = isset( $cart_item_meta['tmdata']['tc_added_in_currency'] ) ? $cart_item_meta['tmdata']['tc_added_in_currency'] : false;
			$tc_default_currency  = isset( $cart_item_meta['tmdata']['tc_default_currency'] ) ? $cart_item_meta['tmdata']['tc_default_currency'] : false;
			$percentcurrenttotal  = [];

			$math_current_total_special    = [];
			$math_current_total_cumulative = [];

			foreach ( $cart_item_meta[ $epo_type ] as $key => $value ) {
				if ( ! isset( $element_object[ $value['section'] ] ) ) {
					continue;
				}
				if ( 'builder' === $value['mode'] ) {
					$new_key                = false;
					$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $product_id, true );
					if ( ! empty( $value['multiple'] ) && ! empty( $value['key'] ) ) {
						$pos = strrpos( $value['key'], '_' );
						if ( false !== $pos && isset( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) ) {
							$av = array_values( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							$ak = array_keys( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							if ( isset( $av[ (int) substr( $value['key'], $pos + 1 ) ] ) ) {
								$new_key = $ak[ (int) substr( $value['key'], $pos + 1 ) ];
							}
						}
					}

					$thiskey = ( false !== $new_key ) ? $new_key : $cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['key'];

					$price_per_currencies = isset( $element_object[ $value['section'] ]['price_per_currencies'] ) ? $element_object[ $value['section'] ]['price_per_currencies'] : [];
					$price_per_currency   = [];
					$_price_type          = THEMECOMPLETE_EPO()->get_saved_element_price_type( $value );

					$internal_price = THEMECOMPLETE_EPO()->get_element_price( 0, $_price_type, $element_object[ $value['section'] ], $thiskey, $cart_item_meta['tmdata']['per_product_pricing'], $cart_item_meta['tmdata']['variation_id'], $price_per_currencies, $current_currency );
					if ( is_array( $internal_price ) ) {
						$internal_price = $internal_price['price'];
					}

					if ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'cumulative' ) ) {
						$math_current_total_cumulative[] = $key;
					} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'special' ) ) {
						$math_current_total_special[] = $key;
					} elseif ( ! $novarprices && ( 'percentcurrenttotal' === $_price_type || 'fixedcurrenttotal' === $_price_type ) ) {
						$percentcurrenttotal[] = $key;
					} elseif ( $novarprices ) {
						$_price = THEMECOMPLETE_EPO()->calculate_price(
							$post_data,
							$element_object[ $value['section'] ],
							$thiskey,
							$cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['attribute'],
							$value['quantity'],
							isset( $value['key_id'] ) ? $value['key_id'] : 0,
							isset( $value['keyvalue_id'] ) ? $value['keyvalue_id'] : 0,
							$cart_item_meta['tmdata']['per_product_pricing'],
							apply_filters( 'wc_epo_convert_to_currency', $cpf_product_price, $tc_added_in_currency, $current_currency, true ),
							$cart_item_meta['tmdata']['variation_id'],
							0,
							themecomplete_get_woocommerce_currency(),
							themecomplete_get_woocommerce_currency(),
							$price_per_currencies,
							$cart_item_meta[ $epo_type ][ $key ],
							$cart_item_meta[ $epo_type ],
							$cart_item_meta['tmdata']
						);

						$cart_item_meta[ $epo_type ][ $key ]['price'] = $_price;

						if ( 'percent' === $_price_type && ! isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) ) {
							$cart_item_meta['tm_epo_options_static_prices'] = floatval( $cart_item_meta['tm_epo_options_static_prices'] ) + floatval( $_price );
						} elseif ( isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) && 'change_product_weight' === $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) {
							$cart_item_meta[ $epo_type ][ $key ]['weight'] = $_price;
						}
					}
				}
			}
			$post_data['tm_epo_options_static_prices'] = floatval( isset( $post_data['tm_epo_options_static_prices'] ) ? $post_data['tm_epo_options_static_prices'] : 0 ) + floatval( $cart_item_meta['associated_products_price'] );

			$cumulative_total = $post_data['tm_epo_options_static_prices'];
			$options_total    = $post_data['tm_epo_options_static_prices'];

			foreach ( $percentcurrenttotal as $key ) {
				$value = $cart_item_meta[ $epo_type ][ $key ];

				if ( ! isset( $element_object[ $value['section'] ] ) ) {
					continue;
				}

				if ( 'builder' === $value['mode'] ) {
					$new_key                = false;
					$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $product_id, true );
					if ( ! empty( $value['multiple'] ) && ! empty( $value['key'] ) ) {
						$pos = strrpos( $value['key'], '_' );
						if ( false !== $pos && isset( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) ) {
							$av = array_values( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							$ak = array_keys( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							if ( isset( $av[ (int) substr( $value['key'], $pos + 1 ) ] ) ) {
								$new_key = $ak[ (int) substr( $value['key'], $pos + 1 ) ];
							}
						}
					}

					$thiskey = ( false !== $new_key ) ? $new_key : $cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['key'];

					$price_per_currencies = isset( $element_object[ $value['section'] ]['price_per_currencies'] ) ? $element_object[ $value['section'] ]['price_per_currencies'] : [];
					$_price_type          = THEMECOMPLETE_EPO()->get_saved_element_price_type( $value );

					$_price = THEMECOMPLETE_EPO()->calculate_price(
						$post_data,
						$element_object[ $value['section'] ],
						$thiskey,
						$cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['attribute'],
						$value['quantity'],
						isset( $value['key_id'] ) ? $value['key_id'] : 0,
						isset( $value['keyvalue_id'] ) ? $value['keyvalue_id'] : 0,
						$cart_item_meta['tmdata']['per_product_pricing'],
						apply_filters( 'wc_epo_convert_to_currency', $cpf_product_price, $tc_added_in_currency, $current_currency, true ),
						$cart_item_meta['tmdata']['variation_id'],
						0,
						themecomplete_get_woocommerce_currency(),
						themecomplete_get_woocommerce_currency(),
						$price_per_currencies,
						$cart_item_meta[ $epo_type ][ $key ],
						$cart_item_meta[ $epo_type ],
						$cart_item_meta['tmdata']
					);

					$cart_item_meta[ $epo_type ][ $key ]['price'] = $_price;
					if ( ! isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) ) {
						$cumulative_total = $cumulative_total + floatval( $_price );
					}
				}
			}

			foreach ( $math_current_total_special as $key ) {
				$value = $cart_item_meta[ $epo_type ][ $key ];

				if ( ! isset( $element_object[ $value['section'] ] ) ) {
					continue;
				}

				if ( 'builder' === $value['mode'] ) {
					$new_key                = false;
					$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $product_id, true );
					if ( ! empty( $value['multiple'] ) && ! empty( $value['key'] ) ) {
						$pos = strrpos( $value['key'], '_' );
						if ( false !== $pos && isset( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) ) {
							$av = array_values( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							$ak = array_keys( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							if ( isset( $av[ (int) substr( $value['key'], $pos + 1 ) ] ) ) {
								$new_key = $ak[ (int) substr( $value['key'], $pos + 1 ) ];
							}
						}
					}

					$thiskey = ( false !== $new_key ) ? $new_key : $cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['key'];

					$price_per_currencies = isset( $element_object[ $value['section'] ]['price_per_currencies'] ) ? $element_object[ $value['section'] ]['price_per_currencies'] : [];
					$_price_type          = THEMECOMPLETE_EPO()->get_saved_element_price_type( $value );

					$_price = THEMECOMPLETE_EPO()->calculate_price(
						$post_data,
						$element_object[ $value['section'] ],
						$thiskey,
						$cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['attribute'],
						$value['quantity'],
						isset( $value['key_id'] ) ? $value['key_id'] : 0,
						isset( $value['keyvalue_id'] ) ? $value['keyvalue_id'] : 0,
						$cart_item_meta['tmdata']['per_product_pricing'],
						apply_filters( 'wc_epo_convert_to_currency', $cpf_product_price, $tc_added_in_currency, $current_currency, true ),
						$cart_item_meta['tmdata']['variation_id'],
						0,
						themecomplete_get_woocommerce_currency(),
						themecomplete_get_woocommerce_currency(),
						$price_per_currencies,
						$cart_item_meta[ $epo_type ][ $key ],
						$cart_item_meta[ $epo_type ],
						$cart_item_meta['tmdata'],
						$post_data['tm_epo_options_static_prices']
					);

					$cart_item_meta[ $epo_type ][ $key ]['price'] = $_price;
					if ( ! isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) ) {
						$cumulative_total = $cumulative_total + floatval( $_price );
					} elseif ( isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) && 'change_product_weight' === $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) {
						$cart_item_meta[ $epo_type ][ $key ]['weight'] = $_price;
					}
				}
			}

			$options_total = $cumulative_total;

			$cart_item_meta['tm_epo_options_total_for_cumulative'] = $options_total;

			foreach ( $math_current_total_cumulative as $key ) {
				$value = $cart_item_meta[ $epo_type ][ $key ];

				if ( ! isset( $element_object[ $value['section'] ] ) ) {
					continue;
				}

				if ( 'builder' === $value['mode'] ) {
					$new_key                = false;
					$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $product_id, true );
					if ( ! empty( $value['multiple'] ) && ! empty( $value['key'] ) ) {
						$pos = strrpos( $value['key'], '_' );
						if ( false !== $pos && isset( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $value['section'] ] ) ) {
							$av = array_values( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							$ak = array_keys( $wpml_translation_by_id[ 'options_' . $value['section'] ] );
							if ( isset( $av[ (int) substr( $value['key'], $pos + 1 ) ] ) ) {
								$new_key = $ak[ (int) substr( $value['key'], $pos + 1 ) ];
							}
						}
					}

					$thiskey = ( false !== $new_key ) ? $new_key : $cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['key'];

					$price_per_currencies = isset( $element_object[ $value['section'] ]['price_per_currencies'] ) ? $element_object[ $value['section'] ]['price_per_currencies'] : [];
					$_price_type          = THEMECOMPLETE_EPO()->get_saved_element_price_type( $value );

					$_price = THEMECOMPLETE_EPO()->calculate_price(
						$post_data,
						$element_object[ $value['section'] ],
						$thiskey,
						$cart_item_meta['tmdata'][ $epo_type . '_data' ][ $key ]['attribute'],
						$value['quantity'],
						isset( $value['key_id'] ) ? $value['key_id'] : 0,
						isset( $value['keyvalue_id'] ) ? $value['keyvalue_id'] : 0,
						$cart_item_meta['tmdata']['per_product_pricing'],
						apply_filters( 'wc_epo_convert_to_currency', $cpf_product_price, $tc_added_in_currency, $current_currency, true ),
						$cart_item_meta['tmdata']['variation_id'],
						0,
						themecomplete_get_woocommerce_currency(),
						themecomplete_get_woocommerce_currency(),
						$price_per_currencies,
						$cart_item_meta[ $epo_type ][ $key ],
						$cart_item_meta[ $epo_type ],
						$cart_item_meta['tmdata'],
						$options_total,
						$cumulative_total
					);

					$cart_item_meta[ $epo_type ][ $key ]['price'] = $_price;
					if ( ! isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) ) {
						$cumulative_total = $cumulative_total + floatval( $_price );
					} elseif ( isset( $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) && 'change_product_weight' === $cart_item_meta[ $epo_type ][ $key ]['dynamic'] ) {
						$cart_item_meta[ $epo_type ][ $key ]['weight'] = $_price;
					}
				}
			}
		}

		return $cart_item_meta;
	}

	/**
	 * Helper function to remove string part
	 *
	 * @param string $input The string to convert.
	 * @return string
	 * @since 4.9.8
	 */
	private function remove_underscore_part( $input = '' ) {
		return substr( $input, 0, intval( strrpos( $input, '_' ) ) );
	}


	/**
	 * Alters the cart item key when editing a product
	 *
	 * @param string $cart_item_key The cart item key.
	 * @return void
	 */
	public function woocommerce_add_to_cart( $cart_item_key = '' ) {
		if ( isset( WC()->cart->cart_contents[ $cart_item_key ] ) ) {
			$this->last_added_cart_key                  = $cart_item_key;
			WC()->cart->cart_contents[ $cart_item_key ] = $this->add_cart_item( WC()->cart->cart_contents[ $cart_item_key ], $cart_item_key );
		}
	}

	/**
	 * Modifies the cart item
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @param string       $cart_item_key The cart item key.
	 * @param boolean      $from_session If we are in the woocommerce_get_cart_item_from_session hook.
	 * @return array<mixed>
	 * @since 1.0
	 * @throws Exception If we detect negactive or zero priced products.
	 */
	public function add_cart_item( $cart_item = [], $cart_item_key = '', $from_session = false ) {
		if ( apply_filters( 'wc_epo_no_add_cart_item', false, $cart_item, $cart_item_key, $from_session ) ) {
			return $cart_item;
		}

		if ( ! isset( $cart_item['data'] ) || ! $cart_item['data'] ) {
			return $cart_item;
		}

		if ( isset( $cart_item['associated_uniqid'] ) ) {
			THEMECOMPLETE_EPO()->associated_element_uniqid = $cart_item['associated_uniqid'];
		}

		if ( isset( $cart_item['associated_key'] ) ) {
			THEMECOMPLETE_EPO()->associated_product_counter = $cart_item['associated_key'];
		}

		if ( isset( $cart_item['associated_formprefix'] ) ) {
			THEMECOMPLETE_EPO()->associated_product_formprefix = $cart_item['associated_formprefix'];
		}

		$cart_item = apply_filters( 'wc_epo_adjust_cart_item_before', $cart_item );

		/*
		* The following logic ensures that the correct price is being calculated
		* when currency or product price is being changed from various
		* 3rd part plugins.
		*/
		$cart_item['tm_epo_product_original_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $cart_item['data']->get_price( 'edit' ), $cart_item );

		$cart_item['tm_epo_options_prices']             = 0;
		$cart_item['tm_epo_product_price_with_options'] = $cart_item['tm_epo_product_original_price'];

		$this->cart_item_meta = $cart_item;

		$product_epos         = [];
		$product_epos_choices = [];

		if ( ! empty( $cart_item['tmcartepo'] ) ) {

			$tmcp_prices                   = 0;
			$tmcp_static_prices            = 0;
			$tmcp_variable_prices          = 0; // percentcurrenttotal.
			$tmcp_variable_prices2         = 0; // percent.
			$tmcp_variable_prices3         = 0; // fixedcurrenttotal.
			$math_current_total_cumulative = 0; // cumulative total.
			$math_current_total_special    = 0; // options total.

			$dynamic_product_price  = false;
			$dynamic_override_price = false;

			$cart_item['tm_epo_options_static_prices'] = 0;

			$to_currency = themecomplete_get_woocommerce_currency();

			$product_id = $cart_item['product_id'];
			if ( ! isset( $cart_item['tmdata'] ) ) {
				$cart_item['tmdata']['form_prefix'] = '';
			}
			$product_epos         = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id, $cart_item['tmdata']['form_prefix'], true, true );
			$product_epos_choices = $product_epos['product_epos_choices'];
			if ( is_array( $product_epos_choices ) ) {
				foreach ( $product_epos_choices as $key => $product_epos_choice ) {
					if ( is_array( $product_epos_choice ) ) {
						$product_epos_choices[ $key ] = array_map( [ $this, 'remove_underscore_part' ], $product_epos_choice );
					}
				}
			}

			// disable check for WPML.
			$tcremoved = apply_filters( 'wc_epo_remove_cart_item', THEMECOMPLETE_EPO_WPML()->is_active() ? false : true, $cart_item, $cart_item_key, $from_session );

			if ( is_array( $cart_item['tmcartepo'] ) ) {
				if ( themecomplete_get_product_type( $cart_item['data'] ) !== 'composite' ) {
					$post_data = [];
					if ( ! empty( $cart_item['tmpost_data'] ) ) {
						/**
						 * Post data
						 *
						 * @var array<mixed> $post_data
						 */
						$post_data = wp_unslash( $cart_item['tmpost_data'] );
						if ( ! isset( $post_data['cpf_product_price'] ) ) {
							$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
						}
					} else {
						$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
					}
					if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
						$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
					}
					// todo:check for a better alternative.
					$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
					$post_data['quantity']          = $cart_item['quantity'];

					$cart_item = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data, true );
					if ( false === $cart_item ) {
						THEMECOMPLETE_EPO()->associated_element_uniqid     = false;
						THEMECOMPLETE_EPO()->associated_product_counter    = false;
						THEMECOMPLETE_EPO()->associated_product_formprefix = false;
						return [];
					}
					$cart_item = apply_filters( 'tm_cart_contents', $cart_item );
				}

				$keys_to_delete = [];
				foreach ( $cart_item['tmcartepo'] as $cart_item_key => $tmcp ) {
					if ( ! THEMECOMPLETE_EPO_WPML()->is_active() && isset( $tmcp['key'] ) && isset( $tmcp['element'] ) && isset( $tmcp['element']['rules_type'] ) ) {

						$key = $this->remove_underscore_part( $tmcp['key'] );
						if ( isset( $product_epos_choices[ $tmcp['section'] ] ) && ! in_array( $key, $product_epos_choices[ $tmcp['section'] ], true ) ) {
							$keys_to_delete[] = $cart_item_key;
							continue;
						}
					}

					if ( ! isset( $product_epos['epos_uniqids'] ) || ! is_array( $product_epos['epos_uniqids'] ) || ! in_array( $tmcp['section'], $product_epos['epos_uniqids'], true ) ) {
						$keys_to_delete[] = $cart_item_key;
						continue;
					}

					$tcremoved = false;

					if ( apply_filters( 'wc_epo_add_cart_item_loop', false, $tmcp ) ) {
						continue;
					}

					if ( isset( $tmcp['price_formula'] ) ) {
						$cart_item['tc_recalculate'] = true;
					}

					$_price_type    = THEMECOMPLETE_EPO()->get_saved_element_price_type( $tmcp );
					$tmcp['price']  = (float) wc_format_decimal( $tmcp['price'], false, true );
					$internal_price = THEMECOMPLETE_EPO()->get_saved_element_price( $tmcp );

					if ( isset( $tmcp['dynamic'] ) ) {
						if ( 'dynamic_product_price' === $tmcp['dynamic'] ) {
							if ( false === $dynamic_product_price ) {
								$dynamic_product_price = 0;
							}
							$dynamic_product_price += $tmcp['price'];
						} elseif ( 'override_product_price' === $tmcp['dynamic'] ) {
							if ( false === $dynamic_override_price ) {
								$dynamic_override_price = 0;
							}
							$dynamic_override_price += $tmcp['price'];
						}
					} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'cumulative' ) ) {
						$math_current_total_cumulative += $tmcp['price'];
					} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'special' ) ) {
						$math_current_total_special += $tmcp['price'];
					} elseif ( 'fixedcurrenttotal' === $_price_type ) {
						$tmcp_variable_prices3 += $tmcp['price'];
					} elseif ( 'percentcurrenttotal' === $_price_type ) {
						$tmcp_variable_prices += $tmcp['price'];
					} elseif ( 'percent' === $_price_type ) {
						$tmcp_variable_prices2 += $tmcp['price'];
					} else {
						$tmcp_static_prices += apply_filters( 'woocommerce_tm_epo_price_add_on_cart', $tmcp['price'], $_price_type );
					}
				}

				foreach ( $keys_to_delete as $key_to_delete ) {
					$item_name  = $cart_item['tmcartepo'][ $key_to_delete ]['name'];
					$item_value = $cart_item['tmcartepo'][ $key_to_delete ]['value'];
					if ( is_array( $item_name ) ) {
						$item_name = array_values( $item_name );
						$item_name = reset( $item_name );
					}
					if ( is_array( $item_value ) ) {
						$item_value = array_values( $item_value );
						$item_value = reset( $item_value );
					}
					$message = $item_name . THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_separator_cart_text' ) . $item_value;
					wc_add_notice(
						sprintf(
							/* translators: %s: Addon name and value that was removed. */
							esc_html__( 'The item %s was removed from the cart because it had changed since it was added.', 'woocommerce-tm-extra-product-options' ),
							$message,
							'error'
						)
					);
					unset( $cart_item['tmcartepo'][ $key_to_delete ] );
				}
			}

			$tmcp_static_prices = apply_filters( 'associated_tmcp_static_prices', $tmcp_static_prices, $cart_item );

			if ( $tcremoved ) {
				$cart_item['tcremoved'] = true;
				if ( isset( $cart_item['associated_uniqid'] ) ) {
					THEMECOMPLETE_EPO()->associated_element_uniqid = false;
				}
				if ( isset( $cart_item['associated_key'] ) ) {
					THEMECOMPLETE_EPO()->associated_product_counter = false;
				}
				if ( isset( $cart_item['associated_formprefix'] ) ) {
					THEMECOMPLETE_EPO()->associated_product_formprefix = false;
				}
				return apply_filters( 'wc_epo_adjust_cart_item', $cart_item );
			}

			$cart_item['tm_epo_options_static_prices']       = (float) $cart_item['tm_epo_options_static_prices'] + (float) $tmcp_static_prices;
			$cart_item['tm_epo_options_static_prices_first'] = $cart_item['tm_epo_options_static_prices'];

			if ( ! empty( $cart_item['tmpost_data'] ) && themecomplete_get_product_type( $cart_item['data'] ) !== 'composite' ) {
				/**
				 * Post data
				 *
				 * @var array<mixed> $post_data
				 */
				$post_data = wp_unslash( $cart_item['tmpost_data'] );
				if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
					$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
				}
				// todo:check for a better alternative.
				if ( ! isset( $post_data['cpf_product_price'] ) ) {
					$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
				}
				$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
				$post_data['quantity']          = $cart_item['quantity'];

				$cart_item = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data );
				if ( false === $cart_item ) {
					THEMECOMPLETE_EPO()->associated_element_uniqid     = false;
					THEMECOMPLETE_EPO()->associated_product_counter    = false;
					THEMECOMPLETE_EPO()->associated_product_formprefix = false;
					return [];
				}
				$cart_item = apply_filters( 'tm_cart_contents', $cart_item );
			}

			if ( is_array( $cart_item['tmcartepo'] ) ) {
				$tmcp_variable_prices          = 0;
				$tmcp_variable_prices2         = 0;
				$tmcp_variable_prices3         = 0;
				$math_current_total_cumulative = 0;
				$math_current_total_special    = 0;

				$dynamic_product_price  = false;
				$dynamic_override_price = false;

				foreach ( $cart_item['tmcartepo'] as $tmcp ) {
					if ( ! THEMECOMPLETE_EPO_WPML()->is_active() && isset( $tmcp['key'] ) && isset( $tmcp['element'] ) && isset( $tmcp['element']['rules_type'] ) ) {

						$key = $this->remove_underscore_part( $tmcp['key'] );
						if ( isset( $product_epos_choices[ $tmcp['section'] ] ) && ! in_array( $key, $product_epos_choices[ $tmcp['section'] ], true ) ) {
							continue;
						}
					}
					if ( ! in_array( $tmcp['section'], $product_epos['epos_uniqids'], true ) || apply_filters( 'wc_epo_add_cart_item_loop', false, $tmcp ) ) {
						continue;
					}
					$_price_type    = THEMECOMPLETE_EPO()->get_saved_element_price_type( $tmcp );
					$tmcp['price']  = (float) wc_format_decimal( $tmcp['price'], false, true );
					$internal_price = THEMECOMPLETE_EPO()->get_saved_element_price( $tmcp );

					if ( isset( $tmcp['dynamic'] ) ) {
						if ( 'dynamic_product_price' === $tmcp['dynamic'] ) {
							if ( false === $dynamic_product_price ) {
								$dynamic_product_price = 0;
							}
							$dynamic_product_price += $tmcp['price'];
						} elseif ( 'override_product_price' === $tmcp['dynamic'] ) {
							if ( false === $dynamic_override_price ) {
								$dynamic_override_price = 0;
							}
							$dynamic_override_price += $tmcp['price'];
						}
					} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'cumulative' ) ) {
						$math_current_total_cumulative += $tmcp['price'];
					} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'special' ) ) {
						$math_current_total_special += $tmcp['price'];
					} elseif ( 'fixedcurrenttotal' === $_price_type ) {
						$tmcp_variable_prices3 += $tmcp['price'];
					} elseif ( 'percentcurrenttotal' === $_price_type ) {
						$tmcp_variable_prices += $tmcp['price'];
					} elseif ( 'percent' === $_price_type ) {
						$tmcp_variable_prices2 += $tmcp['price'];
					}
				}
			}

			if ( false !== $dynamic_product_price ) {
				$cart_item['tm_epo_product_original_price'] = $dynamic_product_price;
			}

			$tmcp_prices = apply_filters( 'wc_epo_cart_options_prices_before', $tmcp_static_prices + $tmcp_variable_prices + $tmcp_variable_prices2 + $tmcp_variable_prices3 + $math_current_total_cumulative + $math_current_total_special, $cart_item );

			if ( false !== $dynamic_override_price ) {
				$cart_item['tm_epo_product_original_price'] = $dynamic_override_price;
				$tmcp_prices                                = 0;
			}

			$cart_item['tm_epo_options_prices'] = $tmcp_prices;

			$price1 = (float) wc_format_decimal( apply_filters( 'wc_epo_option_price_correction', $tmcp_prices, $cart_item ) );

			$price2 = (float) wc_format_decimal(
				apply_filters( 'wc_epo_product_price_correction', wc_format_decimal( $cart_item['tm_epo_product_original_price'] ), $cart_item )
			) + (float) $price1;

			$price1 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price1', $price1, $cart_item ) );

			$price2 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price2', $price2, $cart_item ) );

			$price2 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price3', $price2, $price1, $cart_item ) );

			do_action( 'wc_epo_currency_actions', $price1, $price2, $cart_item );

			if ( apply_filters( 'wc_epo_adjust_price', true, $cart_item ) ) {
				if ( false !== $dynamic_override_price ) {
					$cart_item['data']->set_price( $price2 );
					$cart_item['tm_epo_set_product_price_with_options'] = $price2;
					$cart_item = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price2 );
				} elseif ( ! empty( $cart_item['epo_price_override'] ) && $tmcp_prices > 0 ) {
					$cart_item['data']->set_price( $price1 );
					$cart_item['tm_epo_set_product_price_with_options'] = $price1;
					$cart_item = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price1 );
				} else {
					if ( ! empty( $price1 ) || false !== $dynamic_product_price ) {
						$cart_item['data']->set_price( $price2 );
						$cart_item['tm_epo_set_product_price_with_options'] = $price2;
					}
					$cart_item = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price2 );
				}
			}
			$cart_item['tm_epo_product_price_with_options'] = $cart_item['data']->get_price();

		} elseif ( ! empty( $cart_item['tmpost_data'] ) && themecomplete_get_product_type( $cart_item['data'] ) !== 'composite' ) {
			/**
			 * Post data
			 *
			 * @var array<mixed> $post_data
			 */
			$post_data = wp_unslash( $cart_item['tmpost_data'] );
			if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
				$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
			}
			// todo:check for a better alternative.
			if ( ! isset( $post_data['cpf_product_price'] ) ) {
				$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
			}
			$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
			$post_data['quantity']          = $cart_item['quantity'];

			$cart_item = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data );
		}

		$associated_products_price = 0;
		if ( isset( $cart_item['associated_products_price'] ) ) {
			$associated_products_price = floatval( $cart_item['associated_products_price'] );
		}

		if ( floatval( apply_filters( 'tm_epo_cart_options_prices', floatval( $cart_item['tm_epo_product_price_with_options'] ) + $associated_products_price, $cart_item ) ) < 0 ) {
			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_negative_priced_products' ) ) {
				$message = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_negative_priced_products_text' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_negative_priced_products_text' ) : esc_html__( 'You cannot add negative priced products to the cart.', 'woocommerce-tm-extra-product-options' );
				if ( $from_session ) {
					$cart_item['delete_negative']         = true;
					$cart_item['delete_negative_message'] = $message;
				} else {
					throw new Exception( wp_kses_post( $message ) );
				}
			}
		}

		if ( (float) 0 === floatval( apply_filters( 'tm_epo_no_zero_priced_products', floatval( $cart_item['tm_epo_product_price_with_options'] ) + $associated_products_price, $cart_item ) ) ) {
			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_zero_priced_products' ) ) {
				$message = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_zero_priced_products_text' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_zero_priced_products_text' ) : esc_html__( 'You cannot add zero priced products to the cart.', 'woocommerce-tm-extra-product-options' );
				if ( $from_session ) {
					$cart_item['delete_zero']         = true;
					$cart_item['delete_zero_message'] = $message;
				} else {
					throw new Exception( wp_kses_post( $message ) );
				}
			}
		}

		// variation slug-to-name-for order again.
		if ( isset( $cart_item['variation'] ) && is_array( $cart_item['variation'] ) ) {
			$_variation_name_fix = [];
			$_temp               = [];
			foreach ( $cart_item['variation'] as $meta_name => $meta_value ) {
				if ( mb_strpos( $meta_name, 'attribute_' ) !== 0 ) {
					$_variation_name_fix[ 'attribute_' . $meta_name ] = $meta_value;
					$_temp[ $meta_name ]                              = $meta_value;
				}
			}
			$cart_item['variation'] = array_diff_key( $cart_item['variation'], $_temp );
			$cart_item['variation'] = array_merge( $cart_item['variation'], $_variation_name_fix );
		}

		if ( isset( $cart_item['associated_uniqid'] ) ) {
			THEMECOMPLETE_EPO()->associated_element_uniqid = false;
		}
		if ( isset( $cart_item['associated_key'] ) ) {
			THEMECOMPLETE_EPO()->associated_product_counter = false;
		}
		if ( isset( $cart_item['associated_formprefix'] ) ) {
			THEMECOMPLETE_EPO()->associated_product_formprefix = false;
		}

		return apply_filters( 'wc_epo_adjust_cart_item', $cart_item );
	}

	/**
	 * Modifies the cart item
	 *
	 * @param WC_Cart $cart_object The cart object.
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_before_calculate_totals( $cart_object ) {
		if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
			return;
		}
		if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
			return;
		}

		if ( method_exists( $cart_object, 'get_cart' ) ) {
			$cart_contents = $cart_object->get_cart();
		} else {
			$cart_contents = $cart_object->cart_contents;
		}

		foreach ( $cart_contents as $cart_key => $cart_item ) {

			if ( apply_filters( 'wc_epo_no_add_cart_item', false ) ) {
				continue;
			}

			if ( isset( $cart_item['associated_uniqid'] ) ) {
				THEMECOMPLETE_EPO()->associated_element_uniqid = $cart_item['associated_uniqid'];
			}
			if ( isset( $cart_item['associated_key'] ) ) {
				THEMECOMPLETE_EPO()->associated_product_counter = $cart_item['associated_key'];
			}
			if ( isset( $cart_item['associated_formprefix'] ) ) {
				THEMECOMPLETE_EPO()->associated_product_formprefix = $cart_item['associated_formprefix'];
			}

			$product_epos         = [];
			$product_epos_choices = [];

			if ( ! empty( $cart_item['tmcartepo'] ) && ! empty( $cart_item['tc_recalculate'] ) ) {

				unset( $cart_item['tc_recalculate'] );

				$tmcp_prices                   = 0;
				$tmcp_static_prices            = 0;
				$tmcp_variable_prices          = 0; // percentcurrenttotal.
				$tmcp_variable_prices2         = 0; // percent.
				$tmcp_variable_prices3         = 0; // fixedcurrenttotal.
				$math_current_total_cumulative = 0;
				$math_current_total_special    = 0;

				$dynamic_product_price  = false;
				$dynamic_override_price = false;

				$to_currency = themecomplete_get_woocommerce_currency();

				$product_id           = $cart_item['product_id'];
				$product_epos         = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id, $cart_item['tmdata']['form_prefix'], true, true );
				$product_epos_choices = $product_epos['product_epos_choices'];
				if ( is_array( $product_epos_choices ) ) {
					foreach ( $product_epos_choices as $key => $product_epos_choice ) {
						$product_epos_choices[ $key ] = array_map( [ $this, 'remove_underscore_part' ], $product_epos_choice );
					}
				}

				$cart_item['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices_first'];

				if ( ! empty( $cart_item['tmpost_data'] ) && themecomplete_get_product_type( $cart_item['data'] ) !== 'composite' ) {
					/**
					 * Post data
					 *
					 * @var array<mixed> $post_data
					 */
					$post_data = wp_unslash( $cart_item['tmpost_data'] );
					if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
						$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
					}
					// todo:check for a better alternative.
					if ( ! isset( $post_data['cpf_product_price'] ) ) {
						$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
					}
					$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
					$post_data['quantity']          = $cart_item['quantity'];

					$cart_item = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data );
					if ( false === $cart_item ) {
						continue;
					}
					$cart_item = apply_filters( 'tm_cart_contents', $cart_item );
				}

				if ( is_array( $cart_item['tmcartepo'] ) ) {
					foreach ( $cart_item['tmcartepo'] as $tmcp ) {
						if ( ! THEMECOMPLETE_EPO_WPML()->is_active() && isset( $tmcp['key'] ) && isset( $tmcp['element'] ) && isset( $tmcp['element']['rules_type'] ) ) {
							$key = $this->remove_underscore_part( $tmcp['key'] );
							if ( isset( $product_epos_choices[ $tmcp['section'] ] ) && ! in_array( $key, $product_epos_choices[ $tmcp['section'] ], true ) ) {
								continue;
							}
						}
						if ( ! in_array( $tmcp['section'], $product_epos['epos_uniqids'], true ) || apply_filters( 'wc_epo_add_cart_item_loop', false, $tmcp ) ) {
							continue;
						}
						$_price_type    = THEMECOMPLETE_EPO()->get_saved_element_price_type( $tmcp );
						$tmcp['price']  = (float) wc_format_decimal( $tmcp['price'], false, true );
						$internal_price = THEMECOMPLETE_EPO()->get_saved_element_price( $tmcp );

						if ( isset( $tmcp['dynamic'] ) ) {
							if ( 'dynamic_product_price' === $tmcp['dynamic'] ) {
								if ( false === $dynamic_product_price ) {
									$dynamic_product_price = 0;
								}
								$dynamic_product_price += $tmcp['price'];
							} elseif ( 'override_product_price' === $tmcp['dynamic'] ) {
								if ( false === $dynamic_override_price ) {
									$dynamic_override_price = 0;
								}
								$dynamic_override_price += $tmcp['price'];
							}
						} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'cumulative' ) ) {
							$math_current_total_cumulative += $tmcp['price'];
						} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $internal_price, 'special' ) ) {
							$math_current_total_special += $tmcp['price'];
						} elseif ( 'fixedcurrenttotal' === $_price_type ) {
							$tmcp_variable_prices3 += $tmcp['price'];
						} elseif ( 'percentcurrenttotal' === $_price_type ) {
							$tmcp_variable_prices += $tmcp['price'];
						} elseif ( 'percent' === $_price_type ) {
							$tmcp_variable_prices2 += $tmcp['price'];
						} else {
							$tmcp_static_prices += apply_filters( 'woocommerce_tm_epo_price_add_on_cart', $tmcp['price'], $_price_type );
						}
					}
				}

				if ( false !== $dynamic_product_price ) {
					$cart_item['tm_epo_product_original_price'] = $dynamic_product_price;
				}

				$tmcp_prices = apply_filters( 'wc_epo_cart_options_prices_before', $tmcp_static_prices + $tmcp_variable_prices + $tmcp_variable_prices2 + $tmcp_variable_prices3 + $math_current_total_cumulative + $math_current_total_special, $cart_item );

				if ( false !== $dynamic_override_price ) {
					$cart_item['tm_epo_product_original_price'] = $dynamic_override_price;
					$tmcp_prices                                = 0;
				}

				$cart_item['tm_epo_options_prices'] = $tmcp_prices;

				$price1 = (float) wc_format_decimal( apply_filters( 'wc_epo_option_price_correction', $tmcp_prices, $cart_item ) );

				$price2 = (float) wc_format_decimal(
					apply_filters(
						'wc_epo_product_price_correction',
						wc_format_decimal( $cart_item['tm_epo_product_original_price'] ),
						$cart_item
					)
				) + (float) $price1;

				$price1 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price1', $price1, $cart_item ) );

				$price2 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price2', $price2, $cart_item ) );

				$price2 = wc_format_decimal( apply_filters( 'wc_epo_add_cart_item_calculated_price3', $price2, $price1, $cart_item ) );

				do_action( 'wc_epo_currency_actions', $price1, $price2, $cart_item );

				if ( apply_filters( 'wc_epo_adjust_price', true, $cart_item ) ) {
					if ( false !== $dynamic_override_price ) {
						$cart_item['data']->set_price( $price2 );
						$cart_item['tm_epo_set_product_price_with_options'] = $price2;
						$cart_item = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price2 );
					} elseif ( ! empty( $cart_item['epo_price_override'] ) && $tmcp_prices > 0 ) {
						if ( apply_filters( 'wc_epo_adjust_price_before_calculate_totals', true, $cart_item ) ) {
							$cart_item['data']->set_price( $price1 );
						}
						$cart_item['tm_epo_product_price_with_options'] = $price1;
						$cart_item                                      = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price1 );
					} else {
						if ( ! empty( $price1 ) || false !== $dynamic_product_price ) {
							$cart_item['tm_epo_product_price_with_options'] = $price2;
							if ( apply_filters( 'wc_epo_adjust_price_before_calculate_totals', true, $cart_item ) ) {
								$cart_item['data']->set_price( $price2 );
							}
						}
						$cart_item = apply_filters( 'wc_epo_cart_set_price', $cart_item, $price2 );
					}
				}
			}

			$cart_item = apply_filters( 'wc_epo_adjust_cart_item', $cart_item );

			$cart_contents[ $cart_key ] = $cart_item;

			if ( isset( $cart_item['associated_uniqid'] ) ) {
				THEMECOMPLETE_EPO()->associated_element_uniqid = false;
			}
			if ( isset( $cart_item['associated_key'] ) ) {
				THEMECOMPLETE_EPO()->associated_product_counter = false;
			}
			if ( isset( $cart_item['associated_formprefix'] ) ) {
				THEMECOMPLETE_EPO()->associated_product_formprefix = false;
			}
		}

		if ( method_exists( $cart_object, 'set_cart_contents' ) ) {
			$cart_object->set_cart_contents( $cart_contents );
		} else {
			$cart_object->cart_contents = $cart_contents;
		}
	}

	/**
	 * Gets the cart from session.
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @param array<mixed> $values Cart item values.
	 * @param string       $cart_item_key The cart item key.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_get_cart_item_from_session( $cart_item = [], $values = [], $cart_item_key = '' ) {
		if ( ! empty( $values['tmcartepo'] ) ) {
			$cart_item['tmcartepo'] = $values['tmcartepo'];
			$cart_item              = $this->add_cart_item( $cart_item, $cart_item_key, true );
			if ( ! empty( $cart_item['delete_zero'] ) ) {
				wc_add_notice( $cart_item['delete_zero_message'], 'error' );
				$cart_item['quantity'] = 0;
				return $cart_item;
			}
			if ( ! empty( $cart_item['delete_negative'] ) ) {
				wc_add_notice( $cart_item['delete_negative_message'], 'error' );
				return [ 'data' => false ];
			}

			// Insert our custom entry for product addons to provide compatibility with various plugins.
			if ( empty( $cart_item['addons'] ) && ! empty( $cart_item['tm_epo_options_prices'] ) ) {
				$cart_item['addons'] = [
					[
						'epo'        => true,
						'price'      => 0,
						'name'       => '',
						'value'      => '',
						'price_type' => '',
						'display'    => '@epo@',
					],
				];
			}
		}
		if ( ! empty( $values['tmcartepo_bto'] ) ) {
			$cart_item['tmcartepo_bto'] = $values['tmcartepo_bto'];
		}

		if ( ! empty( $values['tmcartfee'] ) ) {
			$cart_item['tmcartfee'] = $values['tmcartfee'];
		}

		if ( ! empty( $values['tmpost_data'] ) ) {
			$cart_item['tmpost_data'] = $values['tmpost_data'];
		}

		if ( ! empty( $values['tmproducts'] ) ) {
			$cart_item['tmproducts'] = $values['tmproducts'];
		}

		if ( ! empty( $values['associated_products'] ) ) {
			$cart_item['associated_products'] = $values['associated_products'];
		}

		$cart_item = apply_filters( 'tm_cart_contents', $cart_item );

		return apply_filters( 'wc_epo_get_cart_item_from_session', $cart_item, $values );
	}

	/**
	 * Gets cart item to display in the frontend
	 *
	 * @param array<mixed> $item_data The item data.
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_get_item_data( $item_data = [], $cart_item = [] ) {
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) && 'advanced' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) && ! empty( $cart_item['tmcartepo'] ) ) {
			$item_data = $this->get_item_data_array( $item_data, $cart_item );
		}

		// Filter out our entry for product addons as from version 6.5x it creates errors when it is active.
		$item_data = array_filter(
			$item_data,
			function ( $entry ) {
				return ! isset( $entry['display'] ) || ( isset( $entry['display'] ) && '@epo@' !== $entry['display'] );
			}
		);

		return $item_data;
	}

	/**
	 * Helper function for filtered_get_item_data
	 *
	 * @param array<mixed> $tmcp Saved element data.
	 * @return array<mixed>
	 * @since 1.0
	 */
	private function filtered_get_item_data_get_array_data( $tmcp = [] ) {
		$sep = isset( $tmcp['prices'] ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ) : '';
		if ( isset( $tmcp['display'] ) ) {
			$tmcp['display'] = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $tmcp['display'], $sep );
		}
		if ( isset( $tmcp['value'] ) ) {
			$tmcp['value'] = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $tmcp['value'], $sep );
		}
		return [
			'label'               => $tmcp['section_label'],
			'type'                => isset( $tmcp['element'] ) && isset( $tmcp['element']['type'] ) ? $tmcp['element']['type'] : '',
			'other_data'          => [
				[
					'name'                    => $tmcp['name'],
					'value'                   => $tmcp['value'],
					'price_type'              => isset( $tmcp['element'] ) ? ( isset( $tmcp['key'] ) ? $tmcp['element']['rules_type'][ $tmcp['key'] ][0] : $tmcp['element']['rules_type'][0] ) : '',
					'unit_price'              => $tmcp['price'],
					'unit_price_per_currency' => ( isset( $tmcp['price_per_currency'] ) ) ? $tmcp['price_per_currency'] : [],
					'display'                 => isset( $tmcp['display'] ) ? $tmcp['display'] : '',
					'images'                  => isset( $tmcp['images'] ) ? $tmcp['images'] : '',
					'imagesc'                 => isset( $tmcp['imagesc'] ) ? $tmcp['imagesc'] : '',
					'color'                   => isset( $tmcp['color'] ) ? $tmcp['color'] : '',
					'quantity'                => isset( $tmcp['quantity'] ) ? $tmcp['quantity'] : 1,
				],
			],
			'price'               => $tmcp['price'],
			'currencies'          => isset( $tmcp['currencies'] ) ? $tmcp['currencies'] : [],
			'price_per_currency'  => isset( $tmcp['price_per_currency'] ) ? $tmcp['price_per_currency'] : [],
			'quantity'            => isset( $tmcp['quantity'] ) ? $tmcp['quantity'] : 1,
			'percentcurrenttotal' => isset( $tmcp['percentcurrenttotal'] ) ? $tmcp['percentcurrenttotal'] : 0,
			'fixedcurrenttotal'   => isset( $tmcp['fixedcurrenttotal'] ) ? $tmcp['fixedcurrenttotal'] : 0,
			'items'               => 1,
			'multiple_values'     => isset( $tmcp['multiple_values'] ) ? $tmcp['multiple_values'] : '',
			'hidelabelincart'     => isset( $tmcp['hidelabelincart'] ) ? $tmcp['hidelabelincart'] : '',
			'hidevalueincart'     => isset( $tmcp['hidevalueincart'] ) ? $tmcp['hidevalueincart'] : '',
			'uniqid'              => $tmcp['section'],
			'quantity_selector'   => isset( $tmcp['quantity_selector'] ) ? $tmcp['quantity_selector'] : '',
		];
	}

	/**
	 * Filters our cart items
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	private function filtered_get_item_data( $cart_item = [] ) {
		$to_currency    = themecomplete_get_woocommerce_currency();
		$filtered_array = [];
		if ( ! isset( $cart_item['product_id'] ) ) {
			return $filtered_array;
		}
		$product_id = $cart_item['product_id'];

		if ( isset( $cart_item['tmcartepo'] ) && is_array( $cart_item['tmcartepo'] ) ) {
			$cart_item    = apply_filters( 'tm_cart_contents', $cart_item );
			$product_epos = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id, $cart_item['tmdata']['form_prefix'], true, true );

			// This check is required to avoid php errors
			// for cart plugins that use a different domain for the checkout.
			if ( is_array( $product_epos ) && isset( $product_epos['product_epos_choices'] ) ) {
				$product_epos_choices = $product_epos['product_epos_choices'];
				if ( is_array( $product_epos_choices ) ) {
					foreach ( $product_epos_choices as $key => $product_epos_choice ) {
						if ( is_array( $product_epos_choice ) ) {
							$product_epos_choices[ $key ] = array_map( [ $this, 'remove_underscore_part' ], $product_epos_choice );
						}
					}
				}

				foreach ( $cart_item['tmcartepo'] as $tmcp ) {

					if ( ! THEMECOMPLETE_EPO_WPML()->is_active() && isset( $tmcp['key'] ) && isset( $tmcp['element'] ) && isset( $tmcp['element']['rules_type'] ) ) {
						$key = $this->remove_underscore_part( $tmcp['key'] );

						if ( isset( $product_epos_choices[ $tmcp['section'] ] ) && ! in_array( $key, $product_epos_choices[ $tmcp['section'] ], true ) ) {
							continue;
						}
					}

					if ( $tmcp && in_array( $tmcp['section'], $product_epos['epos_uniqids'], true ) ) {

						$tmcp['price']        = (float) wc_format_decimal( $tmcp['price'], false, true );
						$pp                   = false;
						$tc_added_in_currency = false;
						if ( isset( $cart_item['tmpost_data'] ) && isset( $cart_item['tmpost_data']['cpf_product_price'] ) && isset( $cart_item['tmdata']['tc_added_in_currency'] ) ) {
							$pp                   = $cart_item['tmpost_data']['cpf_product_price'];
							$tc_added_in_currency = $cart_item['tmdata']['tc_added_in_currency'];
						}

						if ( empty( $cart_item['associated_discount_exclude_addons'] ) && isset( $cart_item['associated_discount'] ) && isset( $cart_item['associated_discount_type'] ) ) {
							$tmcp['price'] = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $tmcp['price'], $cart_item['associated_discount'], $cart_item['associated_discount_type'] );
						}

						$id = $tmcp['section'];
						if ( isset( $tmcp['repeater'] ) ) {
							$id .= '-' . $tmcp['repeater'] . '-' . $tmcp['key_id'] . '-' . $tmcp['keyvalue_id'];

							$tmcp['section_label'] = intval( intval( $tmcp['key_id'] ) + 1 ) . '. ' . $tmcp['section_label'];
						}

						if ( ! isset( $filtered_array[ $id ] ) ) {
							$filtered_array[ $id ] = $this->filtered_get_item_data_get_array_data( $tmcp );
						} elseif ( 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) || 'link' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
							$filtered_array[ $id . '_' . THEMECOMPLETE_EPO_HELPER()->tm_uniqid() ] = $this->filtered_get_item_data_get_array_data( $tmcp );
						} else {
							$filtered_array[ $id ]['items'] += 1;
							$filtered_array[ $id ]['price'] += $tmcp['price'];

							if ( isset( $tmcp['price_per_currency'] ) ) {
								$filtered_array[ $id ]['price_per_currency'] = THEMECOMPLETE_EPO_HELPER()->add_array_values( $filtered_array[ $id ]['price_per_currency'], $tmcp['price_per_currency'] );
							}

							$filtered_array[ $id ]['quantity']    += isset( $tmcp['quantity'] ) ? $tmcp['quantity'] : 1;
							$filtered_array[ $id ]['other_data'][] = [
								'name'                    => $tmcp['name'],
								'value'                   => $tmcp['value'],
								'price_type'              => isset( $tmcp['element'] ) ? ( isset( $tmcp['key'] ) ? $tmcp['element']['rules_type'][ $tmcp['key'] ][0] : $tmcp['element']['rules_type'][0] ) : '',
								'unit_price'              => $tmcp['price'],
								'unit_price_per_currency' => ( isset( $tmcp['price_per_currency'] ) ) ? $tmcp['price_per_currency'] : [],
								'display'                 => isset( $tmcp['display'] ) ? $tmcp['display'] : '',
								'images'                  => isset( $tmcp['images'] ) ? $tmcp['images'] : '',
								'imagesc'                 => isset( $tmcp['imagesc'] ) ? $tmcp['imagesc'] : '',
								'color'                   => isset( $tmcp['color'] ) ? $tmcp['color'] : '',
								'quantity'                => isset( $tmcp['quantity'] ) ? $tmcp['quantity'] : 1,
							];

							$filtered_array[ $id ]['uniqid'] = $tmcp['section'];
						}
					}
				}
			}
		}

		return $filtered_array;
	}

	/**
	 * Return formatted cart items
	 *
	 * @param array<mixed> $item_data The item data.
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 */
	public function get_item_data_array( $item_data = [], $cart_item = [] ) {
		$filtered_array = $this->filtered_get_item_data( $cart_item );
		$price          = 0;
		$link_data      = [];
		if ( ! isset( $cart_item['quantity'] ) ) {
			return $item_data;
		}
		$quantity = $cart_item['quantity'];

		if ( is_array( $filtered_array ) ) {
			foreach ( $filtered_array as $section ) {
				$value                   = [];
				$value_only              = [];
				$value_original          = [];
				$value_unique            = [];
				$quantity_string_shown   = false;
				$format_price_shown      = false;
				$do_unique_values        = false;
				$prev_unit_price         = false;
				$prev_unit_quantity      = false;
				$dont_show_mass_quantity = false;
				$format_price            = '';
				if ( isset( $section['other_data'] ) && is_array( $section['other_data'] ) ) {
					foreach ( $section['other_data'] as $key => $data ) {
						if ( empty( $data['quantity'] ) ) {
							continue;
						}
						$display_value            = ! empty( $data['display'] ) ? $data['display'] : $data['value'];
						$display_value_only       = $display_value;
						$display_other_value_only = '';
						$displayed_image          = false;

						if ( 'checkbox' === $section['type'] && 'normal' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
							if ( 'noprice' === $section['hidevalueincart'] || 'hidden' === $section['hidevalueincart'] ) {
								$format_price = '';
							} elseif ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
								$original_price = $data['unit_price'] / $data['quantity'];
								$new_price      = apply_filters( 'wc_epo_discounted_price', $data['unit_price'], $cart_item['data'], isset( $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ? $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] : '' );
								$after_price    = $new_price / $data['quantity'];
								$format_price   = $this->get_price_for_cart( $after_price, $cart_item, false, 0, $data['price_type'] );

								if ( (string) $original_price !== (string) $after_price ) {
									$original_price = $this->get_price_for_cart( $original_price, $cart_item, false, 0, $data['price_type'] );
									$format_price   = '<span class="tc-epo-cart-price"><del>' . $original_price . '</del> <ins>' . $format_price . '</ins></span>';
								}
								$format_price_shown = true;
							} else {
								$format_price = '';
							}
							$quantity_string = ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $section['quantity_selector'] ) ) || $data['quantity'] > 1 ) ? ' &times; ' . $data['quantity'] : '';
							if ( 'price' === $section['hidevalueincart'] ) {
								$display_value = '';
							}
							$display_value_only = $display_value;
							if ( '' !== $format_price ) {
								$display_value = $display_value . ' <span class="tc-price-in-cart">' . $format_price . '</span>';
							}
							if ( '' !== $quantity_string ) {
								$display_value = $display_value . ' <span class="tc-quantity-in-cart">' . $quantity_string . '</span>';
							}
							$quantity_string_shown = true;
						}

						if ( ( ! empty( $data['images'] ) || ( isset( $data['imagesc'] ) && ! empty( $data['imagesc'] ) ) ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_image_replacement' ) ) {
							if ( ! $format_price_shown && 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
								$original_price = $data['unit_price'] / $data['quantity'];
								$new_price      = apply_filters( 'wc_epo_discounted_price', $data['unit_price'], $cart_item['data'], isset( $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ? $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] : '' );
								$after_price    = $new_price / $data['quantity'];
								$format_price   = $this->get_price_for_cart( $after_price, $cart_item, false, 0, $data['price_type'] );

								if ( (string) $original_price !== (string) $after_price ) {
									$original_price = $this->get_price_for_cart( $original_price, $cart_item, false, 0, $data['price_type'] );
									$format_price   = '<span class="tc-epo-cart-price"><del>' . $original_price . '</del> <ins>' . $format_price . '</ins></span>';
								}
								$format_price_shown = true;
							} else {
								$format_price = '';
							}
							$quantity_string          = ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $section['quantity_selector'] ) ) || $data['quantity'] > 1 ) ? ' &times; ' . $data['quantity'] : '';
							$image_src                = ( isset( $data['imagesc'] ) && ! empty( $data['imagesc'] ) ) ? $data['imagesc'] : $data['images'];
							$display_other_value_only = '<span class="cpf-img-on-cart"><img alt="' . esc_attr( wp_strip_all_tags( $section['label'] ) ) . '" class="attachment-shop_thumbnail wp-post-image epo-option-image" src="' . apply_filters( 'tm_image_url', $image_src ) . '" />';
							$display_value            = $display_other_value_only . $display_value;
							$display_value_only       = $display_value . '</span>';
							$display_other_value_only = $display_other_value_only . '</span>';
							$display_value            = $display_value . '<span class="tc-price-in-cart">' . $format_price . '</span></span>';
							if ( ! $quantity_string_shown ) {
								$display_value = $display_value . ' <span class="tc-quantity-in-cart">' . $quantity_string . '</span>';
							}
							$quantity_string_shown = true;
							$displayed_image       = true;
						} elseif ( ! empty( $data['color'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_image_replacement' ) ) {
							if ( ! $format_price_shown && 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
								$original_price = $data['unit_price'] / $data['quantity'];
								$new_price      = apply_filters( 'wc_epo_discounted_price', $data['unit_price'], $cart_item['data'], isset( $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ? $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] : '' );
								$after_price    = $new_price / $data['quantity'];
								$format_price   = $this->get_price_for_cart( $after_price, $cart_item, false, 0, $data['price_type'] );

								if ( (string) $original_price !== (string) $after_price ) {
									$original_price = $this->get_price_for_cart( $original_price, $cart_item, false, 0, $data['price_type'] );
									$format_price   = '<span class="tc-epo-cart-price"><del>' . $original_price . '</del> <ins>' . $format_price . '</ins></span>';
								}
								$format_price_shown = true;
							} else {
								$format_price = '';
							}
							$color_hex     = $data['color'];
							$color_no_hash = $data['color'];
							if ( 'transparent' !== $color_hex ) {
								$color_hex     = themecomplete_sanitize_hex_color( $color_hex );
								$color_no_hash = themecomplete_sanitize_hex_color_no_hash( $color_no_hash );
							}
							$quantity_string          = ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $section['quantity_selector'] ) ) || $data['quantity'] > 1 ) ? ' &times; ' . $data['quantity'] : '';
							$display_other_value_only = '<span class="cpf-colors-on-cart"><span class="cpf-color-on-cart backgroundcolor' . esc_attr( $color_no_hash ) . '"></span> ';
							$display_value            = $display_other_value_only . $display_value;
							$display_value_only       = $display_value . '</span>';
							$display_other_value_only = $display_other_value_only . '</span>';
							if ( '' !== $format_price ) {
								$display_value = $display_value . '<span class="tc-price-in-cart">' . $format_price . '</span>';
							}
							$display_value = $display_value . '</span>';
							if ( ! $quantity_string_shown ) {
								$display_value = $display_value . ' <span class="tc-quantity-in-cart">' . $quantity_string . '</span>';
							}

							$display_other_value_only = '';

							$quantity_string_shown = true;
							THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( '.backgroundcolor' . esc_attr( $color_no_hash ) . '{background-color:' . esc_attr( (string) $color_hex ) . ';}' );
						} else {
							if ( false === $prev_unit_quantity ) {
								$prev_unit_quantity = $data['quantity'];
							}
							if ( false === $prev_unit_price ) {
								$prev_unit_price = $data['unit_price'];
							} elseif ( $prev_unit_price !== $data['unit_price'] || $prev_unit_quantity !== $data['quantity'] || $data['quantity'] > 1 ) {

								if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
									$dont_show_mass_quantity = true;
								}
							}
							$prev_unit_price    = $data['unit_price'];
							$prev_unit_quantity = $data['quantity'];
						}

						if ( 'upload' === $section['type'] || 'multiple_file_upload' === $section['type'] ) {
							if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_cart' ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_upload_image_replacement' ) ) {
								$check = wp_check_filetype( $data['value'] );
								if ( ! empty( $check['ext'] ) ) {
									$image_exts = THEMECOMPLETE_EPO_API()->get_image_extensions();
									if ( in_array( $check['ext'], $image_exts, true ) ) {
										$display_other_value_only = '<span class="cpf-img-on-cart">';

										$files = explode( '|', $data['value'] );
										foreach ( $files as $file ) {
											$display_other_value_only .= '<img alt="' . esc_attr( wp_strip_all_tags( $section['label'] ) ) . '" class="attachment-shop_thumbnail wp-post-image epo-option-image epo-upload-image" src="' . apply_filters( 'tm_image_url', $file ) . '">';
										}

										$display_other_value_only .= '</span>';
										$display_value             = $display_other_value_only;
										$display_value_only        = $display_value;

										$displayed_image = true;
									}
								}
							} elseif ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_cart' ) ) {
								$files = explode( '|', $data['value'] );

								$display_other_value_only = [];
								foreach ( $files as $file ) {
									$display_other_value_only[] = THEMECOMPLETE_EPO_ORDER()->display_meta_value( apply_filters( 'tm_image_url', $file ), 0, 'cart' );
								}
								$glue = '';
								if ( 'multiple_file_upload' === $section['type'] && ! empty( $section['multiple_values'] ) ) {
									$glue = $section['multiple_values'];
								}
								$display_other_value_only = implode( $glue, $display_other_value_only );

								$display_value      = $display_other_value_only;
								$display_value_only = $display_value;

								$display_other_value_only = '';
							} elseif ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_cart' ) ) {
								$files = explode( '|', $data['value'] );

								$display_other_value_only = [];
								foreach ( $files as $file ) {
									$display_other_value_only[] = THEMECOMPLETE_EPO_ORDER()->display_meta_value( apply_filters( 'tm_image_url', $file ), 2, 'cart' );
								}
								$glue = '';
								if ( 'multiple_file_upload' === $section['type'] && ! empty( $section['multiple_values'] ) ) {
									$glue = $section['multiple_values'];
								}
								$display_other_value_only = implode( $glue, $display_other_value_only );

								$display_value      = $display_other_value_only;
								$display_value_only = $display_value;

								$display_other_value_only = '';
							}
						}
						$value_only[] = $display_value_only;

						// Unique values.
						if ( 'price' === $section['hidevalueincart'] ) {
							$display_value = '';
						}
						$original_price = $data['unit_price'] / $data['quantity'];
						$new_price      = apply_filters( 'wc_epo_discounted_price', $data['unit_price'], $cart_item['data'], isset( $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ? $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] : [] );
						$after_price    = $new_price / $data['quantity'];
						$format_price   = $this->get_price_for_cart( $after_price, $cart_item, false, 0, $data['price_type'] );

						if ( (string) $original_price !== (string) $after_price ) {
							$original_price = $this->get_price_for_cart( $original_price, $cart_item, false, 0, $data['price_type'] );
							$format_price   = '<span class="tc-epo-cart-price"><del>' . $original_price . '</del> <ins>' . $format_price . '</ins></span>';
						}
						$quantity_string = ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $section['quantity_selector'] ) ) || $data['quantity'] > 1 ) ? ' &times; ' . $data['quantity'] : '';
						if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) || 'noprice' === $section['hidevalueincart'] || 'hidden' === $section['hidevalueincart'] ) {
							$format_price = '';
						}
						$value_display_value = $display_value;
						if ( false === $displayed_image ) {
							if ( ! empty( $section['multiple_values'] ) ) {
								$display_value_array = explode( $section['multiple_values'], $display_value );
								$display_value       = '';
								foreach ( $display_value_array as $d => $dv ) {
									$display_value .= '<span class="cpf-data-on-cart"><span class="cpf-data-value">' . $dv . '</span></span>';
								}
								$display_value .= $display_other_value_only;
							} else {
								$display_value = $display_other_value_only . $display_value;
							}
							if ( ! $format_price_shown ) {
								$display_value .= ' <span class="tc-price-in-cart">' . $format_price . '</span>';

								$format_price_shown = true;
							}
							if ( ! $quantity_string_shown ) {
								$display_value .= ' <span class="tc-quantity-in-cart">' . $quantity_string . '</span>';

								$quantity_string_shown = true;
							}
							if ( empty( $section['multiple_values'] ) ) {
								$value_display_value = $display_value;
							}
						} else {
							if ( ! $format_price_shown ) {
								$display_value .= ' <span class="tc-price-in-cart">' . $format_price . '</span>';

								$format_price_shown = true;
							}
							if ( ! $quantity_string_shown && ! empty( $quantity_string ) ) {
								$display_value .= ' <span class="tc-quantity-in-cart">' . $quantity_string . '</span>';

								$quantity_string_shown = true;
							}
							if ( empty( $section['multiple_values'] ) ) {
								$value_display_value = $display_value;
							}
						}
						$value[] = $value_display_value;
						if ( empty( $section['multiple_values'] ) ) {
							$display_value = '<span class="cpf-data-on-cart"><span class="cpf-data-value">' . $display_value . '</span></span>';
						}
						$value_unique[] = $display_value;
					}

					$value_original = $value;

					if ( ! empty( $section['multiple_values'] ) ) {
						$do_unique_values = true;
					}

					if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_always_unique_values' ) && 'checkbox' === $section['type'] ) {
						$do_unique_values = true;
					}

					if ( $do_unique_values ) {
						$quantity_string_shown = true;
						$format_price_shown    = true;
						$value                 = $value_unique;
					}
				}

				if ( ! empty( $value_original ) ) {
					if ( $quantity_string_shown ) {
						if ( is_array( $value_original[0] ) ) {
							$temp = '';
							foreach ( $value_original as $k => $v ) {
								$temp .= implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $v );
							}
							$value_original = $temp;
						} else {
							$value_original = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_original );
						}
					} elseif ( is_array( $value_original[0] ) ) {
						$temp = '';
						foreach ( $value_original as $k => $v ) {
							$temp .= implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $v );
						}
						$value_original = $temp;
					} elseif ( ! empty( $section['multiple_values'] ) ) {
						$value_original = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_original );
					} else {
						$value_original = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_original );
					}
				} else {
					$value_original = '';
				}

				if ( ! empty( $value ) ) {
					$glue = $do_unique_values ? '' : THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' );
					if ( $quantity_string_shown ) {
						if ( is_array( $value[0] ) ) {
							$temp = '';
							foreach ( $value as $k => $v ) {
								$temp .= implode( $glue, $v );
							}
							$value = $temp;
						} else {
							$value = implode( $glue, $value );
						}
					} elseif ( is_array( $value[0] ) ) {
						$temp = '';
						foreach ( $value as $k => $v ) {
							$temp .= implode( $glue, $v );
						}
						$value = $temp;
					} elseif ( ! empty( $section['multiple_values'] ) ) {
						$value = implode( $glue, $value );
					} else {
						$value = implode( $glue, $value );
					}
				} else {
					$value = '';
				}

				if ( ! empty( $value_only ) ) {
					if ( $quantity_string_shown ) {
						if ( is_array( $value_only[0] ) ) {
							$temp = '';
							foreach ( $value_only as $k => $v ) {
								$temp .= implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $v );
							}
							$value_only = $temp;
						} else {
							$value_only = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_only );
						}
					} elseif ( is_array( $value_only[0] ) ) {
						$temp = '';
						foreach ( $value_only as $k => $v ) {
							$temp .= implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $v );
						}
						$value_only = $temp;
					} elseif ( ! empty( $section['multiple_values'] ) ) {
						$value_only = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_only );
					} else {
						$value_only = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value_only );
					}
				} else {
					$value_only = '';
				}

				if ( empty( $section['quantity'] ) ) {
					$section['quantity'] = 1;
				}

				// WooCommerce Dynamic Pricing & Discounts.
				$original_price   = $section['price'] / $section['quantity'];
				$original_price_q = $original_price * $quantity * $section['quantity'];

				$section['price'] = apply_filters( 'wc_epo_discounted_price', $section['price'], $cart_item['data'], isset( $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ? $cart_item[ THEMECOMPLETE_EPO()->cart_edit_key_var ] : '' );
				$after_price      = $section['price'] / $section['quantity'];

				$price                 = $price + (float) $section['price'];
				$section['price_type'] = '';
				if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
					$format_price        = $this->get_price_for_cart( $after_price, $cart_item, false, 0, $section['price_type'] );
					$format_price_total  = $this->get_price_for_cart( $section['price'], $cart_item, false, $quantity, $section['price_type'] );
					$format_price_total2 = $this->get_price_for_cart( $section['price'], $cart_item, false, 0, $section['price_type'] );

					if ( (string) $original_price !== (string) $after_price ) {
						$original_price       = $this->get_price_for_cart( $original_price, $cart_item, false, 0, $section['price_type'] );
						$original_price_total = $this->get_price_for_cart( $original_price_q, $cart_item, false, 0, $section['price_type'] );
						$format_price         = '<span class="tc-epo-cart-price"><del>' . $original_price . '</del> <ins>' . $format_price . '</ins></span>';
					}
				} else {
					$format_price        = '';
					$format_price_total  = '';
					$format_price_total2 = '';
				}
				$single_price    = $this->get_price_for_cart( (float) $section['price'] / $section['quantity'], $cart_item, false, 0, $section['price_type'] );
				$quantity_string = ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $section['quantity_selector'] ) ) || $section['quantity'] > 1 ) ? ' &times; ' . $section['quantity'] : '';

				if ( $quantity_string_shown || $dont_show_mass_quantity ) {
					$quantity_string = '';
				}

				$is_checkbox = false;
				if ( 'checkbox' === $section['type'] ) {
					$quantity_string = '';
					$is_checkbox     = true;
				}

				if ( 'link' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
					if ( empty( $section['hidelabelincart'] ) || 'noprice' === $section['hidevalueincart'] || empty( $section['hidevalueincart'] ) ) {
						$value_to_show =
						(
							empty( $section['hidevalueincart'] ) ||
							'noprice' === $section['hidevalueincart'] ||
							'price' === $section['hidevalueincart']
						)
							? apply_filters( 'wc_epo_label_in_cart', THEMECOMPLETE_EPO_HELPER()->entity_decode( $value ), $section )
							: '';

						$item_data[] = [
							'name'            => empty( $section['hidelabelincart'] ) ? $section['label'] : '',
							'value'           => ( empty( $section['hidevalueincart'] ) || 'noprice' === $section['hidevalueincart'] || 'price' === $section['hidevalueincart'] )
								?
								( 'checkbox' !== $section['type'] && 'price' === $section['hidevalueincart'] ? '' : $value_to_show ) .
								(
									'noprice' !== $section['hidevalueincart'] ?
									( ( ! $format_price_shown && $format_price )
										? ' <span class="tc-price-in-cart">' . $format_price . '</span> <span class="tc-quantity-in-cart">' . $quantity_string . '</span>'
										: ( ( $format_price && $is_checkbox )
											? ( ( $do_unique_values )
												? ( ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_cart_average_price' ) ) ? '<span class="tc-average-price">' . $format_price . '</span>' : '' )
												: ( ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_cart_average_price' ) ) ? '<span class="tc-av-price">' . $format_price . '</span>' : '' )
											)
											: ( ( $quantity_string ) ? '<span class="tc-quantity-in-cart">' . $quantity_string . '</span>' : '' )
										)
									)
									: ''
								)
								: '',
							'tm_label'        => $section['label'],
							'tm_value'        => apply_filters( 'wc_epo_label_in_cart', THEMECOMPLETE_EPO_HELPER()->entity_decode( $value ), $section ),
							'tc_simple_value' => apply_filters( 'wc_epo_label_in_cart', THEMECOMPLETE_EPO_HELPER()->entity_decode( $value_original ), $section ),
							'tm_price'        => $format_price,
							'tm_total_price'  => $format_price_total,
							'tm_quantity'     => $section['quantity'],
							'tm_image'        => $section['other_data'][0]['images'],
						];
					}
				}
				if ( empty( $section['hidelabelincart'] ) || empty( $section['hidevalueincart'] ) ) {
					$link_data[] = [
						'name'            => empty( $section['hidelabelincart'] ) ? $section['label'] : '',
						'value'           => ( empty( $section['hidevalueincart'] ) || 'noprice' === $section['hidevalueincart'] ) ? $value_only : '',
						'price'           => $format_price,
						'tm_price'        => $single_price,
						'tm_total_price'  => $format_price_total,
						'tm_quantity'     => $section['quantity'],
						'tm_total_price2' => $format_price_total2,
						'section'         => $section,
					];
				}
			}
		}

		if ( 'link' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
			if ( empty( $price ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) ) {
				$price = '';
			} else {
				$price = $this->get_price_for_cart( $price, $cart_item, false, 0 );
			}
			$uni   = uniqid( '' );
			$data  = '<div class="tm-extra-product-options">';
			$data .= '<div class="tc-row tm-cart-row tm-cart-row-header">'
					. '<div class="tc-cell tcwidth tcwidth-30 cpf-name">&nbsp;</div>'
					. '<div class="tc-cell tcwidth tcwidth-30 cpf-value">&nbsp;</div>'
					. '<div class="tc-cell tcwidth tcwidth-20 cpf-price">' . esc_html__( 'Price', 'woocommerce' ) . '</div>'
					. '<div class="tc-cell tcwidth tcwidth-10 cpf-quantity">' . esc_html__( 'Quantity', 'woocommerce' ) . '</div>'
					. '<div class="tc-cell tcwidth tcwidth-10 cpf-total-price">' . esc_html__( 'Total', 'woocommerce' ) . '</div>'
					. '</div>';
			foreach ( $link_data as $link ) {
				$data .= '<div class="tc-row tm-cart-row">'
						. '<div class="tc-cell tcwidth tcwidth-30 cpf-name">' . $link['name'] . '</div>'
						. '<div class="tc-cell tcwidth tcwidth-30 cpf-value">' . apply_filters( 'wc_epo_label_in_cart', THEMECOMPLETE_EPO_HELPER()->entity_decode( $link['value'] ), $link['section'] ) . '</div>'
						. '<div class="tc-cell tcwidth tcwidth-20 cpf-price">' . $link['tm_price'] . '</div>'
						. '<div class="tc-cell tcwidth tcwidth-10 cpf-quantity">' . ( ( '' === $link['tm_price'] ) ? '' : $link['tm_quantity'] ) . '</div>'
						. '<div class="tc-cell tcwidth tcwidth-10 cpf-total-price">' . $link['tm_total_price2'] . '</div>'
						. '</div>';

			}
			$data .= '</div>';

			/*
			 * using esc_url on $uni gives a wrong result for our JS code
			 * so we use esc_attr since it is basically a hash and not an actual URL
			 */
			$item_data[] = [
				'name'      => '<a href="#tm-cart-link-data-' . esc_attr( $uni ) . '" class="tm-cart-link">' . ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_additional_options_text' ) ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_additional_options_text' ) : esc_html__( 'Additional options', 'woocommerce-tm-extra-product-options' ) ) . '</a>',
				'value'     => $price . '<div id="tm-cart-link-data-' . esc_attr( $uni ) . '" class="tm-cart-link-data tm-hidden">' . $data . '</div>',
				'popuplink' => true,
			];
		}

		return $item_data;
	}

	/**
	 * Populate element id array
	 * and global price array
	 *
	 * @param integer      $product_id The product id.
	 * @param mixed        $post_data The posted data.
	 * @param mixed        $cart_item_meta The Cart item meta data.
	 * @param string|false $form_prefix The form prefix.
	 * @return mixed
	 *
	 * @since 5.0
	 */
	public function populate_arrays( $product_id = 0, $post_data = [], $cart_item_meta = [], $form_prefix = false ) {
		if ( false === $form_prefix ) {
			$form_prefix = '';

			if ( is_array( $cart_item_meta ) && isset( $cart_item_meta['composite_item'] ) ) {
				$form_prefix = '_' . $cart_item_meta['composite_item'];
			} elseif ( is_array( $cart_item_meta ) && isset( $cart_item_meta['associated_uniqid'] ) && isset( $cart_item_meta['associated_formprefix'] ) ) {
				$form_prefix = str_replace( [ '.', ' ', '[' ], '', $cart_item_meta['associated_formprefix'] );
				$form_prefix = '_' . $form_prefix;
			} elseif ( ! empty( $post_data['tc_form_prefix'] ) ) {
				$form_prefix = $post_data['tc_form_prefix'];
				$form_prefix = str_replace( '_', '', $form_prefix );
				$form_prefix = '_' . $form_prefix;
			}

			$this->form_prefix = $form_prefix;
		} elseif ( '' !== $form_prefix ) {
			$form_prefix = str_replace( '_', '', $form_prefix );
			$form_prefix = '_' . $form_prefix;
		}

		$cpf_price_array = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id, $form_prefix, true, true );

		if ( empty( $cpf_price_array ) ) {
			return false;
		}
		$global_price_array = $cpf_price_array['global'];
		$local_price_array  = $cpf_price_array['local'];

		if ( empty( $global_price_array ) && empty( $local_price_array ) ) {
			return false;
		}

		$element_id_array = [];

		$global_prices   = [
			'before' => [],
			'after'  => [],
		];
		$global_sections = [];
		foreach ( $global_price_array as $priority => $priorities ) {
			foreach ( $priorities as $pid => $field ) {
				if ( isset( $field['sections'] ) ) {
					foreach ( $field['sections'] as $section_id => $section ) {
						if ( isset( $section['sections_placement'] ) ) {
							$global_prices[ $section['sections_placement'] ][ $priority ][ $pid ]['sections'][ $section_id ] = $section;
							$global_sections[ $section['sections_uniqid'] ] = $section;
							if ( isset( $section['elements'] ) ) {
								foreach ( $section['elements'] as $element_key => $element ) {
									if ( isset( $element['uniqid'] ) && isset( $element['name_inc'] ) ) {
										$element_id_array[ $element['uniqid'] . $form_prefix ] = [
											'name_inc'    => $element['name_inc'],
											'priority'    => $priority,
											'pid'         => $pid,
											'section_id'  => $section_id,
											'element_key' => $element_key,
										];
									}
								}
							}
						}
					}
				}
			}
		}

		if ( false === $cart_item_meta ) {
			return [
				'element_id_array'   => $element_id_array,
				'global_price_array' => $global_price_array,
				'local_price_array'  => $local_price_array,
				'global_prices'      => $global_prices,
				'global_sections'    => $global_sections,
			];
		}

		$this->element_id_array    = $element_id_array;
		$this->global_price_array  = $global_price_array;
		$this->local_price_array   = $local_price_array;
		$this->global_prices       = $global_prices;
		$this->global_sections     = $global_sections;
		$this->populate_arrays_set = true;

		return true;
	}

	/**
	 * Add item data to the cart
	 *
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @param integer      $product_id The product id.
	 *
	 * @return mixed
	 */
	public function woocommerce_add_cart_item_data( $cart_item_meta, $product_id ) {
		$this->populate_arrays_set = false;

		return $this->add_cart_item_data_helper( $cart_item_meta, $product_id, $_POST ); // phpcs:ignore WordPress.Security.NonceVerification
	}

	/**
	 * Adds data to the cart
	 *
	 * @param array<mixed>      $cart_item_meta Cart item meta data.
	 * @param integer           $product_id The product id.
	 * @param array<mixed>|null $post_data The posted data.
	 *
	 * @return mixed
	 */
	public function tm_add_cart_item_data( $cart_item_meta, $product_id, $post_data = null ) {
		$this->populate_arrays_set = false;

		return $this->add_cart_item_data_helper( $cart_item_meta, $product_id, $post_data );
	}


	/**
	 * Helper for adding data to the cart
	 *
	 * @param array<mixed>      $cart_item_meta Cart item meta data.
	 * @param integer           $product_id The product id.
	 * @param array<mixed>|null $post_data The posted data.
	 *
	 * @return mixed
	 */
	public function add_cart_item_data_helper( $cart_item_meta, $product_id, $post_data = null ) {
		if ( ! is_array( $cart_item_meta ) ) {
			$cart_item_meta = apply_filters( 'wc_epo_add_cart_item_data_no_array', [], $cart_item_meta );
		}
		// @phpstan-ignore-next-line
		if ( is_null( $post_data ) && isset( $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post_data = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification
		}
		if ( empty( $post_data ) && isset( $_REQUEST['tcajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$post_data = wp_unslash( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}

		// Normalize posted strings.
		$post_data = THEMECOMPLETE_EPO_HELPER()->normalize_data( $post_data, true, false );

		$terms        = get_the_terms( $product_id, 'product_type' );
		$product_type = ! empty( $terms ) && isset( current( $terms )->name ) ? sanitize_title( current( $terms )->name ) : 'simple';

		// Workaround to get unique items in cart for bto.
		if ( empty( $cart_item_meta['tmcartepo_bto'] ) ) {
			if ( ( 'bto' === $product_type || 'composite' === $product_type ) &&
				( isset( $post_data['add-product-to-cart'] ) && is_array( $post_data['add-product-to-cart'] ) ) ||
				( isset( $post_data['wccp_component_selection'] ) && is_array( $post_data['wccp_component_selection'] ) ) ||
				( isset( $_GET['wccp_component_selection'] ) && is_array( $_GET['wccp_component_selection'] ) ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			) {
				$copy = [];
				$enum = [];
				if ( isset( $post_data['add-product-to-cart'] ) ) {
					$enum = $post_data['add-product-to-cart'];
				} elseif ( isset( $post_data['wccp_component_selection'] ) && is_array( $post_data['wccp_component_selection'] ) ) {
					$enum = $post_data['wccp_component_selection'];
				} elseif ( isset( $_GET['wccp_component_selection'] ) && is_array( $_GET['wccp_component_selection'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$enum = map_deep( wp_unslash( $_GET['wccp_component_selection'] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}
				foreach ( $enum as $bundled_item_id => $bundled_product_id ) {
					$copy = array_merge( $copy, THEMECOMPLETE_EPO_HELPER()->array_filter_key( $post_data, $bundled_item_id, 'end' ) );
				}
				$copy                            = THEMECOMPLETE_EPO_HELPER()->array_filter_key( $copy );
				$cart_item_meta['tmcartepo_bto'] = $copy;
			}
		}

		$variation_id        = false;
		$cpf_product_price   = false;
		$per_product_pricing = true;

		if ( isset( $cart_item_meta['composite_item'] ) ) {
			global $woocommerce;
			$cart_contents = $woocommerce->cart->get_cart();

			if ( isset( $cart_item_meta['composite_parent'] ) && ! empty( $cart_item_meta['composite_parent'] ) ) {
				$parent_cart_key = $cart_item_meta['composite_parent'];
				if ( $cart_contents[ $parent_cart_key ]['data'] instanceof WC_Product ) {
					if ( is_callable( [ $cart_contents[ $parent_cart_key ]['data'], 'contains' ] ) ) {
						$per_product_pricing = $cart_contents[ $parent_cart_key ]['data']->contains( 'priced_individually' );
					} elseif ( property_exists( $cart_contents[ $parent_cart_key ]['data'], 'per_product_pricing' ) ) {
						$per_product_pricing = $cart_contents[ $parent_cart_key ]['data']->per_product_pricing;
					}
				}

				if ( 'no' === $per_product_pricing ) {
					$per_product_pricing = false;
				}
			}

			$bundled_item_id = $cart_item_meta['composite_item'];
			if ( isset( $post_data['bto_variation_id'][ $bundled_item_id ] ) ) {
				$variation_id = $post_data['bto_variation_id'][ $bundled_item_id ];
			} elseif ( isset( $post_data['wccp_variation_id'][ $bundled_item_id ] ) ) {
				$variation_id = $post_data['wccp_variation_id'][ $bundled_item_id ];
			}
			if ( isset( $post_data['cpf_bto_price'][ $bundled_item_id ] ) ) {
				$cpf_product_price = $post_data['cpf_bto_price'][ $bundled_item_id ];
			}
		} elseif ( isset( $cart_item_meta['associated_uniqid'] ) ) {
			if ( isset( $cart_item_meta['associated_variation_id'] ) ) {
				$variation_id = $cart_item_meta['associated_variation_id'];
			}
			$associated_formprefix = $cart_item_meta['associated_formprefix'];

			if ( isset( $cart_item_meta['associated_element_name'] ) && isset( $post_data[ $cart_item_meta['associated_element_name'] . '_counter' ] ) ) {
				$associated_formprefix = $cart_item_meta['associated_formprefix'] . $post_data[ $cart_item_meta['associated_element_name'] . '_counter' ];
			}

			if ( isset( $post_data[ 'cpf_product_price' . $associated_formprefix ] ) ) {
				$cpf_product_price = $post_data[ 'cpf_product_price' . $associated_formprefix ];
			}
		} else {
			if ( isset( $post_data['variation_id'] ) ) {
				$variation_id = $post_data['variation_id'];
			}
			if ( isset( $post_data['cpf_product_price'] ) ) {
				$cpf_product_price = $post_data['cpf_product_price'];
			}
		}
		if ( isset( $cart_item_meta['associated_priced_individually'] ) ) {
			if ( ! $cart_item_meta['associated_priced_individually'] ) {
				$per_product_pricing = false;
				$cpf_product_price   = 0;
			}
		}

		if ( ! $this->populate_arrays( $product_id, $post_data, $cart_item_meta ) ) {
			return $cart_item_meta;
		}

		// If the following key doesn't exist the edit cart link is not being displayed.
		if ( in_array( $product_type, apply_filters( 'wc_epo_can_be_edited_product_type', [ 'simple', 'variable' ] ), true ) ) {
			$cart_item_meta['tmhasepo'] = 1;
		}

		$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $product_id, 'product' ) );
		$tm_meta_cpf         = themecomplete_get_post_meta( $original_product_id, 'tm_meta_cpf', true );
		if ( ! is_array( $tm_meta_cpf ) ) {
			$tm_meta_cpf = [];
		}
		foreach ( THEMECOMPLETE_EPO()->meta_fields as $key => $value ) {
			$tm_meta_cpf[ $key ] = isset( $tm_meta_cpf[ $key ] ) ? $tm_meta_cpf[ $key ] : $value;
		}

		$price_override = ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
			? 0
			: ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
				? 1
				: ( ! empty( $tm_meta_cpf['price_override'] ) ? 1 : 0 ) );

		if ( ! empty( $price_override ) ) {
			$cart_item_meta['epo_price_override'] = 1;
		}

		$files = [];
		foreach ( $_FILES as $k => $file ) { // phpcs:ignore WordPress.Security.NonceVerification
			if ( ! empty( $file['name'] ) ) {
				$files[ $k ] = $file['name'];
			}
		}

		$tmcp_post_fields = array_merge( THEMECOMPLETE_EPO_HELPER()->array_filter_key( $post_data ), THEMECOMPLETE_EPO_HELPER()->array_filter_key( $files ) );

		if ( is_array( $tmcp_post_fields ) ) {
			$tmcp_post_fields = array_map( 'wp_unslash', $tmcp_post_fields );
		}

		if ( empty( $cart_item_meta['tmcartepo'] ) ) {
			$cart_item_meta['tmcartepo'] = [];
		}

		if ( empty( $cart_item_meta['tmcartfee'] ) ) {
			$cart_item_meta['tmcartfee'] = [];
		}
		if ( empty( $cart_item_meta['tmpost_data'] ) ) {
			$cart_item_meta['tmpost_data'] = $post_data;
		}

		$cart_item_meta = apply_filters( 'wc_epo_add_cart_item_data_helper', $cart_item_meta );

		if ( empty( $cart_item_meta['tmdata'] ) ) {
			$cart_item_meta['tmdata'] = [
				'tmcp_post_fields'     => $tmcp_post_fields,
				'product_id'           => $product_id,
				'per_product_pricing'  => $per_product_pricing,
				'cpf_product_price'    => $cpf_product_price,
				'variation_id'         => $variation_id,
				'form_prefix'          => $this->form_prefix,
				'tc_added_in_currency' => themecomplete_get_woocommerce_currency(),
				'tc_default_currency'  => apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) ),
			];
		}

		$loop              = 0;
		$field_loop        = 0;
		$connectors        = [];
		$connector_counter = 0;

		$_return           = $this->add_cart_item_data_loop( $this->global_prices, 'before', $cart_item_meta, $tmcp_post_fields, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $field_loop, $loop, $connectors, $connector_counter, $this->form_prefix, $post_data );
		$loop              = $_return['loop'];
		$field_loop        = $_return['field_loop'];
		$connectors        = $_return['connectors'];
		$connector_counter = $_return['connector_counter'];
		$cart_item_meta    = $_return['cart_item_meta'];
		$tmcp_post_fields  = $_return['tmcp_post_fields'];

		// NORMAL FIELDS (deprecated).
		$_return        = $this->add_cart_item_data_loop_local( $this->local_price_array, $cart_item_meta, $tmcp_post_fields, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $field_loop, $loop, $this->form_prefix, $post_data );
		$loop           = $_return['loop'];
		$field_loop     = $_return['field_loop'];
		$cart_item_meta = $_return['cart_item_meta'];

		$_return           = $this->add_cart_item_data_loop( $this->global_prices, 'after', $cart_item_meta, $tmcp_post_fields, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $field_loop, $loop, $connectors, $connector_counter, $this->form_prefix, $post_data );
		$loop              = $_return['loop'];
		$field_loop        = $_return['field_loop'];
		$connectors        = $_return['connectors'];
		$connector_counter = $_return['connector_counter'];
		$cart_item_meta    = $_return['cart_item_meta'];
		$tmcp_post_fields  = $_return['tmcp_post_fields'];

		return apply_filters( 'wc_epo_add_cart_item_data', $cart_item_meta );
	}

	/**
	 * Add item data to the cart
	 * NORMAL FIELDS (to be deprecated)
	 *
	 * @param mixed        $local_price_array The normal options array.
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @param array<mixed> $tmcp_post_fields Array of posted fields.
	 * @param integer      $product_id The product id.
	 * @param boolean      $per_product_pricing If the product has pricing, true or false.
	 * @param float        $cpf_product_price The product price.
	 * @param integer      $variation_id The variation id.
	 * @param integer      $field_loop The field loop index.
	 * @param integer      $loop The loop index.
	 * @param string       $form_prefix The form prefix.
	 * @param array<mixed> $post_data The posted data.
	 *
	 * @return array<mixed>
	 */
	public function add_cart_item_data_loop_local( $local_price_array, $cart_item_meta, $tmcp_post_fields, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $field_loop, $loop, $form_prefix, $post_data ) {
		if ( ! empty( $local_price_array ) && is_array( $local_price_array ) ) {

			if ( is_array( $tmcp_post_fields ) ) {

				$getproduct = wc_get_product( $product_id );
				if ( $getproduct instanceof WC_Product ) {
					foreach ( $local_price_array as $tmcp ) {
						if ( empty( $tmcp['type'] ) ) {
							continue;
						}

						$current_tmcp_post_fields = array_intersect_key( $tmcp_post_fields, array_flip( THEMECOMPLETE_EPO()->get_post_names( $tmcp['attributes'], $tmcp['type'], $field_loop, $form_prefix ) ) );

						foreach ( $current_tmcp_post_fields as $attribute => $key ) {

							switch ( $tmcp['type'] ) {

								case 'checkbox':
								case 'radio':
								case 'select':
									$_price = THEMECOMPLETE_EPO()->calculate_price( $_REQUEST, $tmcp, $key, $attribute, 1, 0, 0, $per_product_pricing, $cpf_product_price, $variation_id ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended

									$cart_item_meta['tmcartepo'][]                = [
										'mode'          => 'local',
										'key'           => $key,
										'is_taxonomy'   => $tmcp['is_taxonomy'],
										'name'          => $tmcp['name'],
										'value'         => wc_attribute_label( $tmcp['attributes_wpml'][ $key ], $getproduct ),
										'price'         => $_price,
										'section'       => $tmcp['name'],
										'section_label' => wc_attribute_label( urldecode( $tmcp['label'] ), $getproduct ),
										'percentcurrenttotal' => isset( $post_data[ $attribute . '_hidden' ] ) ? 1 : 0,
										'fixedcurrenttotal' => 0,
										'quantity'      => 1,
									];
									$cart_item_meta['tmdata']['tmcartepo_data'][] = [
										'key'       => $key,
										'attribute' => $attribute,
									];
									break;

							}
						}
						if ( in_array( $tmcp['type'], THEMECOMPLETE_EPO()->element_post_types, true ) ) {
							++$field_loop;
						}
						++$loop;

					}
				}
			}
		}

		return [
			'loop'           => $loop,
			'field_loop'     => $field_loop,
			'cart_item_meta' => $cart_item_meta,
		];
	}
	/**
	 * Add item data to the cart
	 * BUILDER FIELDS
	 *
	 * @param array<mixed> $global_prices The global option array.
	 * @param string       $where The global option array placement (before or after).
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @param array<mixed> $tmcp_post_fields Array of posted fields.
	 * @param integer      $product_id The product id.
	 * @param boolean      $per_product_pricing If the product has pricing, true or false.
	 * @param float        $cpf_product_price The product price.
	 * @param integer      $variation_id The variation id.
	 * @param integer      $field_loop The field loop index.
	 * @param integer      $loop The loop index.
	 * @param array<mixed> $connectors The connectors array.
	 * @param integer      $connector_counter The connector counter used for choosing the correct element.
	 * @param string       $form_prefix The form prefix.
	 * @param array<mixed> $post_data The posted data.
	 *
	 * @return array<mixed>
	 */
	public function add_cart_item_data_loop( $global_prices, $where, $cart_item_meta, $tmcp_post_fields, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $field_loop, $loop, $connectors, $connector_counter, $form_prefix, $post_data ) {
		$found_post_att = [];
		foreach ( $global_prices[ $where ] as $priorities ) {
			foreach ( $priorities as $field ) {
				foreach ( $field['sections'] as $section_id => $section ) {
					if ( isset( $section['elements'] ) ) {
						foreach ( $section['elements'] as $element ) {
							$c_field_loop = $field_loop;
							if ( isset( $element['connector'] ) && isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
								$c_field_loop = $connectors[ 'c-' . sanitize_key( $element['connector'] ) ];
							}

							$init_class = 'THEMECOMPLETE_EPO_FIELDS_' . $element['type'];
							if ( ! class_exists( $init_class ) && ! empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_addon ) ) {
								$init_class = 'THEMECOMPLETE_EPO_FIELDS';
							}
							if ( class_exists( $init_class ) ) {
								/**
								 * Init class
								 *
								 * @var THEMECOMPLETE_EPO_FIELDS $field_obj
								 */
								$field_obj = new $init_class( $product_id, $element, $per_product_pricing, $cpf_product_price, $variation_id, $post_data );

								// Cart fees.
								$current_tmcp_post_fields = THEMECOMPLETE_EPO_HELPER()->array_intersect_key_wildcard( $tmcp_post_fields, array_flip( THEMECOMPLETE_EPO()->get_post_names( $element['options'], $element['type'], $c_field_loop, $form_prefix, THEMECOMPLETE_EPO()->cart_fee_name, $element ) ) );
								foreach ( $current_tmcp_post_fields as $attribute => $key ) {
									if ( ! empty( $field_obj->holder_cart_fees ) ) {
										$original_key = $key;
										// We convert all $key to an array
										// in order to support repeaters.
										if ( 'multiple_file_upload' === $element['type'] ) {
											$key = 'temp';
										}
										if ( ! is_array( $key ) ) {
											$key = [ $key ];
										}
										foreach ( $key as $key_id => $key_value ) {
											if ( ! is_array( $key_value ) ) {
												$key_value = [ $key_value ];
											}
											if ( 'multiple_file_upload' === $element['type'] ) {
												$key_value = [ $original_key ];
											}
											foreach ( $key_value as $keyvalue_id => $keyvalue_value ) {
												if ( isset( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
													if ( is_array( $tmcp_post_fields[ $attribute . '_quantity' ] ) && isset( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
														if ( is_array( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
															if ( empty( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ][ $keyvalue_id ] ) ) {
																continue;
															}
														} elseif ( empty( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
															continue;
														}
													} elseif ( empty( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
														continue;
													}
												}

												if ( count( $key ) > 1 || $key_id > 0 ) {
													$field_obj->repeater = $key_id;
												}
												if ( count( $key_value ) > 1 ) {
													if ( false !== $field_obj->repeater ) {
														$field_obj->repeater = $field_obj->repeater . ' ' . $keyvalue_id;
													} else {
														$field_obj->repeater = $keyvalue_id;
													}
												}

												$meta = $field_obj->add_cart_item_data_cart_fees( $attribute, $keyvalue_value, $key_id, $keyvalue_id );

												if ( is_array( $meta ) ) {
													$found_post_att[] = $attribute;
													if ( isset( $meta[0] ) && is_array( $meta[0] ) ) {
														foreach ( $meta as $k => $value ) {
															if ( isset( $value['mode'] ) && 'products' !== $value['mode'] ) {
																$cart_item_meta['tmcartfee'][]                = $value;
																$cart_item_meta['tmdata']['tmcartfee_data'][] = [
																	'key'       => $keyvalue_value,
																	'attribute' => $attribute,
																];
															} else {
																$value['element_name']          = $attribute;
																$cart_item_meta['tmproducts'][] = $value;
															}
														}
													} elseif ( isset( $meta['mode'] ) && 'products' !== $meta['mode'] ) {
														$cart_item_meta['tmcartfee'][]                = $meta;
														$cart_item_meta['tmdata']['tmcartfee_data'][] = [
															'key' => $keyvalue_value,
															'attribute' => $attribute,
														];
													} else {
														$meta['element_name']           = $attribute;
														$cart_item_meta['tmproducts'][] = $meta;
													}
												}
											}
										}
									}
								}

								// Normal fields.
								$current_tmcp_post_fields = THEMECOMPLETE_EPO_HELPER()->array_intersect_key_wildcard( $tmcp_post_fields, array_flip( THEMECOMPLETE_EPO()->get_post_names( $element['options'], $element['type'], $c_field_loop, $form_prefix, '', $element ) ) );
								foreach ( $current_tmcp_post_fields as $attribute => $key ) {
									$original_key = $key;
									if ( ! empty( $field_obj->holder ) ) {
										// We convert all $key to an array
										// in order to support repeaters.
										if ( 'multiple_file_upload' === $element['type'] ) {
											$key = 'temp';
										}
										if ( ! is_array( $key ) ) {
											// Getting here means the current element is not a repeater.
											// This is sufficient for the next check in order to get correct labels for radio button connectors.
											if ( isset( $element['connector'] ) && '' !== $element['connector'] ) {
												$pattern = '/_(\d+)(?:-(\d+))?$/';
												if ( isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
													if ( preg_match( $pattern, $key, $matches ) ) {
														if ( isset( $matches[2] ) && strval( $matches[2] ) === strval( $connector_counter ) ) {
															$connector_counter = 0;
														} else {
															++$connector_counter;
															break;
														}
													}
												} elseif ( preg_match( $pattern, $key, $matches ) ) {
													if ( isset( $matches[2] ) ) {
														break;
													}
												}
											}

											$key = [ $key ];
										}
										foreach ( $key as $key_id => $key_value ) {
											if ( ! is_array( $key_value ) ) {
												$key_value = [ $key_value ];
											}
											if ( 'multiple_file_upload' === $element['type'] ) {
												$key_value = [ $original_key ];
											}
											if ( 'singlemultiple' === $field_obj->holder ) {
												$key_value = [ $key_value ];
											}
											foreach ( $key_value as $keyvalue_id => $keyvalue_value ) {
												if ( isset( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
													if ( is_array( $tmcp_post_fields[ $attribute . '_quantity' ] ) && isset( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
														if ( is_array( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
															if ( empty( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ][ $keyvalue_id ] ) ) {
																continue;
															}
														} elseif ( empty( $tmcp_post_fields[ $attribute . '_quantity' ][ $key_id ] ) ) {
															continue;
														}
													} elseif ( empty( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
														continue;
													}
												}

												if ( count( $key ) > 1 || $key_id > 0 ) {
													$field_obj->repeater = $key_id;
												}
												if ( count( $key_value ) > 1 ) {
													if ( false !== $field_obj->repeater ) {
														$field_obj->repeater = $field_obj->repeater . ' ' . $keyvalue_id;
													} else {
														$field_obj->repeater = $keyvalue_id;
													}
												}

												$meta = $field_obj->add_cart_item_data( $attribute, $keyvalue_value, $key_id, $keyvalue_id );
												if ( is_array( $meta ) ) {
													$found_post_att[] = $attribute;
													if ( isset( $meta[0] ) && is_array( $meta[0] ) ) {
														foreach ( $meta as $k => $value ) {
															if ( isset( $value['mode'] ) && 'products' !== $value['mode'] ) {
																$cart_item_meta['tmcartepo'][]                = $value;
																$cart_item_meta['tmdata']['tmcartepo_data'][] = [
																	'key'       => $keyvalue_value,
																	'attribute' => $attribute,
																];
															} else {
																$value['element_name']          = $attribute;
																$cart_item_meta['tmproducts'][] = $value;
															}
														}
													} elseif ( isset( $meta['mode'] ) && 'products' !== $meta['mode'] ) {
														$cart_item_meta['tmcartepo'][]                = $meta;
														$cart_item_meta['tmdata']['tmcartepo_data'][] = [
															'key' => $keyvalue_value,
															'attribute' => $attribute,
														];
													} else {
														$meta['element_name']           = $attribute;
														$cart_item_meta['tmproducts'][] = $meta;
													}
												}
											}
										}
									}
								}

								$cart_item_meta = apply_filters( 'wc_epo_add_cart_item_data_loop', $cart_item_meta, $field_obj, $tmcp_post_fields, $element, $c_field_loop, $form_prefix, $product_id, $per_product_pricing, $cpf_product_price, $variation_id, $post_data );
								unset( $field_obj ); // clear memory.
							}

							if ( in_array( $element['type'], THEMECOMPLETE_EPO()->element_post_types, true ) ) {
								if ( isset( $element['connector'] ) && '' !== $element['connector'] ) {
									if ( ! isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
										++$field_loop;
									}
									$connectors[ 'c-' . sanitize_key( $element['connector'] ) ] = $c_field_loop;
								} else {
									++$field_loop;
								}
							}
							++$loop;

							$found_post_att = array_unique( $found_post_att );
							// Use array_diff_key to get the keys that are not present in $found_post_att.
							$tmcp_post_fields = array_diff_key( $tmcp_post_fields, array_flip( $found_post_att ) );
						}
					}
				}
			}
		}

		return [
			'loop'              => $loop,
			'field_loop'        => $field_loop,
			'cart_item_meta'    => $cart_item_meta,
			'connectors'        => $connectors,
			'connector_counter' => $connector_counter,
			'tmcp_post_fields'  => $tmcp_post_fields,
		];
	}

	/**
	 * Validates the cart data
	 *
	 * @param boolean      $passed The current passed status.
	 * @param integer      $product_id The product id.
	 * @param integer      $qty The product quantity.
	 * @param integer      $variation_id The variation id.
	 * @param array<mixed> $variations The variation attributes array.
	 * @param array<mixed> $cart_item_data Cart item meta data.
	 * @return boolean
	 * @since 1.0
	 */
	public function woocommerce_add_to_cart_validation( $passed, $product_id, $qty = 0, $variation_id = 0, $variations = [], $cart_item_data = [] ) {
		// disables add_to_cart_button class on shop page.
		if ( wp_doing_ajax() && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_options' ) && ! isset( $_REQUEST['tcaddtocart'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended

			$has_epo = THEMECOMPLETE_EPO_API()->has_options( $product_id );
			if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
				return false;
			}
		}

		$is_validate = true;

		// Get product type.
		$terms        = get_the_terms( $product_id, 'product_type' );
		$product_type = ! empty( $terms ) && isset( current( $terms )->name ) ? sanitize_title( current( $terms )->name ) : 'simple';
		if ( 'bto' === $product_type || 'composite' === $product_type ) {

			$bto_data  = themecomplete_maybe_unserialize( themecomplete_get_post_meta( $product_id, '_bto_data', true ) );
			$valid_ids = [];
			if ( is_array( $bto_data ) ) {
				$valid_ids = array_keys( $bto_data );
			}
			foreach ( $valid_ids as $bundled_item_id ) {

				if ( isset( $_REQUEST['add-product-to-cart'][ $bundled_item_id ] ) && '' !== $_REQUEST['add-product-to-cart'][ $bundled_item_id ] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$bundled_product_id = absint( wp_unslash( $_REQUEST['add-product-to-cart'][ $bundled_item_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				} elseif ( isset( $cart_item_data['composite_data'][ $bundled_item_id ]['product_id'] ) && isset( $_GET['order_again'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$bundled_product_id = $cart_item_data['composite_data'][ $bundled_item_id ]['product_id'];
				} elseif ( isset( $_REQUEST['wccp_component_selection'] ) && isset( $_REQUEST['wccp_component_selection'][ $bundled_item_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$bundled_product_id = absint( wp_unslash( $_REQUEST['wccp_component_selection'][ $bundled_item_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}

				if ( isset( $bundled_product_id ) && ! empty( $bundled_product_id ) ) {

					$_passed = true;

					if ( isset( $_REQUEST['item_quantity'][ $bundled_item_id ] ) && is_numeric( $_REQUEST['item_quantity'][ $bundled_item_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$item_quantity = absint( wp_unslash( $_REQUEST['item_quantity'][ $bundled_item_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					} elseif ( isset( $cart_item_data['composite_data'][ $bundled_item_id ]['quantity'] ) && isset( $_GET['order_again'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$item_quantity = $cart_item_data['composite_data'][ $bundled_item_id ]['quantity'];
					} elseif ( isset( $_REQUEST['wccp_component_quantity'][ $bundled_item_id ] ) && is_numeric( $_REQUEST['wccp_component_quantity'][ $bundled_item_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$item_quantity = absint( wp_unslash( $_REQUEST['wccp_component_quantity'][ $bundled_item_id ] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					}
					if ( ! empty( $item_quantity ) ) {
						$item_quantity = absint( $item_quantity );
						$_passed       = $this->validate_product_id( $bundled_product_id, $bundled_item_id );
					}

					if ( ! $_passed ) {
						$is_validate = false;
					}
				}
			}
		}

		$tc_form_prefix = '';
		if ( isset( $_REQUEST['tc_form_prefix'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$tc_form_prefix = sanitize_text_field( wp_unslash( $_REQUEST['tc_form_prefix'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}
		if ( ! $this->validate_product_id( $product_id, $tc_form_prefix ) ) {
			$passed = false;
		}

		// Try to validate uploads before they happen.
		foreach ( $_FILES as $k => $file ) { // phpcs:ignore WordPress.Security.NonceVerification
			if ( ! empty( $file['name'] ) && 'undefined' !== $file['name'] ) {
				$file_name = $file['name'];
				if ( ! empty( $file['error'] ) ) {
					$file_error = $file['error'];

					// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
					$upload_error_strings = [
						false,
						esc_html__( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'The uploaded file was only partially uploaded.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'No file was uploaded.', 'woocommerce-tm-extra-product-options' ),
						'',
						esc_html__( 'Missing a temporary folder.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'Failed to write file to disk.', 'woocommerce-tm-extra-product-options' ),
						esc_html__( 'File upload stopped by extension.', 'woocommerce-tm-extra-product-options' ),
					];

					if ( is_array( $file_error ) ) {
						foreach ( $file_error as $key => $value ) {
							if ( is_array( $value ) ) {
								foreach ( $value as $value_id => $value_value ) {
									if ( ! empty( $value_value ) && ! empty( $file_name[ $key ][ $value_id ] ) ) {
										$passed = false;
										if ( isset( $upload_error_strings[ $value_value ] ) && is_string( $upload_error_strings[ $value_value ] ) ) {
											wc_add_notice( $upload_error_strings[ $value_value ], 'error' );
										}
									}
								}
							} elseif ( ! empty( $value ) && ! empty( $file_name[ $key ] ) ) {
								$passed = false;
								if ( isset( $upload_error_strings[ $value ] ) && is_string( $upload_error_strings[ $value ] ) ) {
									wc_add_notice( $upload_error_strings[ $value ], 'error' );
								}
							}
						}
					} else {
						$passed = false;
						if ( isset( $upload_error_strings[ $file_error ] ) && is_string( $upload_error_strings[ $file_error ] ) ) {
							wc_add_notice( $upload_error_strings[ $file_error ], 'error' );
						}
					}
				}
				add_filter( 'upload_mimes', [ THEMECOMPLETE_EPO(), 'upload_mimes_trick' ] );
				if ( is_array( $file_name ) ) {
					foreach ( $file_name as $key => $value ) {
						if ( is_array( $value ) ) {
							foreach ( $value as $value_id => $value_value ) {
								if ( ! empty( $value_value ) ) {
									$check_filetype = wp_check_filetype( $value_value );
									$check_filetype = $check_filetype['ext'];
									if ( ! $check_filetype && ! empty( $file_name[ $key ][ $value_id ] ) ) {
										$passed = false;
										wc_add_notice( esc_html__( 'Sorry, this file type is not permitted for security reasons.', 'woocommerce-tm-extra-product-options' ) . ' (' . pathinfo( $value_value, PATHINFO_EXTENSION ) . ')', 'error' );
									}
								}
							}
						} elseif ( ! empty( $value ) ) {
							$check_filetype = wp_check_filetype( $value );
							$check_filetype = $check_filetype['ext'];
							if ( ! $check_filetype && ! empty( $file['name'] ) ) {
								$passed = false;
								wc_add_notice( esc_html__( 'Sorry, this file type is not permitted for security reasons.', 'woocommerce-tm-extra-product-options' ) . ' (' . pathinfo( $value, PATHINFO_EXTENSION ) . ')', 'error' );
							}
						}
					}
				} else {
					$check_filetype = wp_check_filetype( $file['name'] );
					$check_filetype = $check_filetype['ext'];

					if ( ! $check_filetype && ! empty( $file['name'] ) ) {
						$passed = false;
						wc_add_notice( esc_html__( 'Sorry, this file type is not permitted for security reasons.', 'woocommerce-tm-extra-product-options' ) . ' (' . pathinfo( $file['name'], PATHINFO_EXTENSION ) . ')', 'error' );
					}
				}
				remove_filter( 'upload_mimes', [ THEMECOMPLETE_EPO(), 'upload_mimes_trick' ] );

			}
		}

		if ( ! $is_validate ) {
			$passed = false;
		}

		return apply_filters( 'tm_add_to_cart_validation', $passed );
	}

	/**
	 * Validates builder options
	 *
	 * @param array<mixed> $global_sections The global sections array.
	 * @param array<mixed> $global_prices The global option array.
	 * @param string       $where The global option array placement (before or after).
	 * @param array<mixed> $tmcp_post_fields Array of posted fields.
	 * @param boolean      $passed The current passed status.
	 * @param integer      $loop The loop index.
	 * @param string       $form_prefix The form prefix.
	 *
	 * @return array<mixed>
	 */
	public function validate_product_id_loop( $global_sections, $global_prices, $where, $tmcp_post_fields, $passed, $loop, $form_prefix ) {
		// Initialize the connectors.
		$connectors = [];
		foreach ( $global_prices[ $where ] as $priorities ) {
			foreach ( $priorities as $field ) {
				foreach ( $field['sections'] as $section_id => $section ) {
					if ( isset( $section['elements'] ) ) {
						foreach ( $section['elements'] as $element ) {

							if ( in_array( $element['type'], THEMECOMPLETE_EPO()->element_post_types, true ) ) {
								if ( empty( $element['connector'] ) || ! in_array( $element['connector'], $connectors, true ) ) {
									if ( ! empty( $element['connector'] ) ) {
										$connectors[] = $element['connector'];
									}
									// $loop is incremented only if connector is empty or is not in the connectors array.
									++$loop;
								}
							}

							if ( isset( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ] )
								&& 'post' === THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_post
								&& THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->is_visible( $element, $section, $global_sections, $form_prefix )
							) {

								$_passed  = true;
								$_message = false;

								$init_class = 'THEMECOMPLETE_EPO_FIELDS_' . $element['type'];
								if ( ! class_exists( $init_class ) && ! empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_addon ) ) {
									$init_class = 'THEMECOMPLETE_EPO_FIELDS';
								}
								if ( class_exists( $init_class ) ) {
									$field_obj = new $init_class();
									if ( method_exists( $field_obj, 'validate_field' ) ) {
										$_passed  = $field_obj->validate_field( $tmcp_post_fields, $element, $loop, $form_prefix );
										$_message = isset( $_passed['message'] ) ? $_passed['message'] : false;
										$_passed  = isset( $_passed['passed'] ) ? $_passed['passed'] : false;
										unset( $field_obj ); // clear memory.
									}
								}

								if ( ! $_passed ) {

									$passed = false;
									if ( false !== $_message && is_array( $_message ) ) {
										foreach ( $_message as $key => $value ) {
											if ( 'required' === $value ) {
												/* translators: %s Field name */
												wc_add_notice( sprintf( esc_html__( '"%s" is a required field.', 'woocommerce-tm-extra-product-options' ), $element['label'] ), 'error' );
											} else {
												wc_add_notice( $value, 'error' );
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}

		return [
			'loop'   => $loop,
			'passed' => $passed,
		];
	}

	/**
	 * Validates a product
	 *
	 * @param integer $product_id The product id.
	 * @param string  $form_prefix The form prefix.
	 *
	 * @return boolean
	 */
	public function validate_product_id( $product_id, $form_prefix = '' ) {
		$passed = true;

		if ( $form_prefix ) {
			$form_prefix = '_' . $form_prefix;
		}

		$populate_arrays = $this->populate_arrays( $product_id, false, false, $form_prefix );
		if ( ! $populate_arrays ) {
			return $passed;
		}

		$global_prices      = $populate_arrays['global_prices'];
		$global_sections    = $populate_arrays['global_sections'];
		$global_price_array = $populate_arrays['global_price_array'];
		$local_price_array  = $populate_arrays['local_price_array'];

		if ( ( ! empty( $global_price_array ) && is_array( $global_price_array ) ) || ( ! empty( $local_price_array ) && is_array( $local_price_array ) ) ) {
			$tmcp_post_fields = THEMECOMPLETE_EPO_HELPER()->array_filter_key( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( is_array( $tmcp_post_fields ) && ! empty( $tmcp_post_fields ) ) {
				$tmcp_post_fields = array_map( 'wp_unslash', $tmcp_post_fields );
			}

			$loop = -1;

			$_return = $this->validate_product_id_loop( $global_sections, $global_prices, 'before', $tmcp_post_fields, $passed, $loop, $form_prefix );
			$loop    = $_return['loop'];
			$passed  = $_return['passed'];

			if ( ! empty( $local_price_array ) && is_array( $local_price_array ) ) {

				foreach ( $local_price_array as $tmcp ) {
					if ( empty( $tmcp['type'] ) || empty( $tmcp['required'] ) ) {
						continue;
					}
					if ( in_array( $tmcp['type'], THEMECOMPLETE_EPO()->element_post_types, true ) ) {
						++$loop;
					}

					$tmcp_attributes = THEMECOMPLETE_EPO()->get_post_names( $tmcp['attributes'], $tmcp['type'], $loop, $form_prefix );
					$_passed         = true;

					switch ( $tmcp['type'] ) {

						case 'checkbox':
							$_check = array_intersect( $tmcp_attributes, array_keys( $tmcp_post_fields ) );
							if ( empty( $_check ) ) {
								$_passed = false;
							}
							break;

						case 'radio':
							foreach ( $tmcp_attributes as $attribute ) {
								if ( ! isset( $tmcp_post_fields[ $attribute ] ) ) {
									$_passed = false;
								}
							}
							break;

						case 'select':
							foreach ( $tmcp_attributes as $attribute ) {
								if ( ! isset( $tmcp_post_fields[ $attribute ] ) || '' === $tmcp_post_fields[ $attribute ] ) {
									$_passed = false;
								}
							}
							break;

					}

					if ( ! $_passed ) {
						$passed = false;
						/* translators: %s Field name */
						wc_add_notice( sprintf( esc_html__( '"%s" is a required field.', 'woocommerce-tm-extra-product-options' ), $tmcp['label'] ), 'error' );
					}
				}
			}

			$_return = $this->validate_product_id_loop( $global_sections, $global_prices, 'after', $tmcp_post_fields, $passed, $loop, $form_prefix );
			$loop    = $_return['loop'];
			$passed  = $_return['passed'];

		}

		return $passed;
	}

	/**
	 * Alter the product thumbnail in cart
	 *
	 * @param string       $image The image html.
	 * @param array<mixed> $cart_item The item data.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_thumbnail( $image = '', $cart_item = [] ) {
		$_image = [];
		$_alt   = [];
		if ( isset( $cart_item['tmcartepo'] ) && is_array( $cart_item['tmcartepo'] ) ) {
			foreach ( $cart_item['tmcartepo'] as $key => $value ) {
				if ( ! empty( $value['changes_product_image'] ) ) {
					if ( 'images' === $value['changes_product_image'] ) {
						if ( isset( $value['use_images'] ) && 'images' === $value['use_images'] && isset( $value['images'] ) ) {
							$_image[] = $value['images'];
							$_alt[]   = $value['value'];
						}
					} elseif ( 'custom' === $value['changes_product_image'] ) {
						if ( isset( $value['imagesp'] ) ) {
							$_image[] = $value['imagesp'];
							$_alt[]   = $value['value'];
						}
					}
				}
			}
		}
		if ( count( $_image ) === 0 ) {
			if ( isset( $cart_item['tmcartfee'] ) && is_array( $cart_item['tmcartfee'] ) ) {
				foreach ( $cart_item['tmcartfee'] as $key => $value ) {
					if ( ! empty( $value['changes_product_image'] ) ) {
						if ( 'images' === $value['changes_product_image'] ) {
							if ( isset( $value['use_images'] ) && 'images' === $value['use_images'] && isset( $value['images'] ) ) {
								$_image[] = $value['images'];
								$_alt[]   = $value['value'];
							}
						} elseif ( 'custom' === $value['changes_product_image'] ) {
							if ( isset( $value['imagesp'] ) ) {
								$_image[] = $value['imagesp'];
								$_alt[]   = $value['value'];
							}
						}
					}
				}
			}
		}
		if ( count( $_image ) > 0 ) {
			$current      = 0;
			$_image_count = count( $_image );
			for ( $i = 0; $i <= $_image_count; $i++ ) {
				if ( ! empty( $_image[ $i ] ) ) {
					$current = $i;
				}
			}
			if ( ! empty( $_image[ $current ] ) ) {
				$size       = 'shop_thumbnail';
				$dimensions = wc_get_image_size( $size );
				$image      = apply_filters(
					'tm_woocommerce_img',
					'<img src="' . apply_filters( 'tm_woocommerce_img_src', $_image[ $current ] )
					. '" alt="'
					. esc_attr( wp_strip_all_tags( $_alt[ $current ] ) )
					. '" width="' . esc_attr( $dimensions['width'] )
					. '" class="tc-thumbnail woocommerce-placeholder wp-post-image" height="'
					. esc_attr( $dimensions['height'] )
					. '" />',
					$size,
					$dimensions
				);
			}
		}

		return $image;
	}

	/**
	 * Ensures correct price is shown on minicart
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_before_mini_cart_contents() {
		WC()->cart->calculate_totals();
		$this->in_mini_cart = true;
	}

	/**
	 * Remove mini cart flag
	 *
	 * @return void
	 * @since 6.4
	 */
	public function woocommerce_mini_cart_contents() {
		$this->in_mini_cart = false;
	}


	/**
	 * Cart edit key
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_cart_loaded_from_session() {
		$cart_contents = WC()->cart->cart_contents;

		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {

				do_action( 'wc_epo_cart_loaded_from_session_before_cart_item', $cart_item );

				// for displaying eg the colors for color replacements.
				$other_data = $this->get_item_data_array( [], $cart_item );

				if ( isset( $cart_item['tcremoved'] ) && ! empty( $cart_item['tcremoved'] ) ) {
					$product = $cart_item['data'];
					unset( WC()->cart->cart_contents[ $cart_item_key ] );
					/* translators: %1 Product name %2 here link */
					wc_add_notice( sprintf( esc_html__( '%1$s has been removed from your cart because it has since been modified. You can add it back to your cart %2$s.', 'woocommerce-tm-extra-product-options' ), $product->get_name(), '<a href="' . $product->get_permalink() . '">' . esc_html__( 'here', 'woocommerce-tm-extra-product-options' ) . '</a>' ), 'notice' );
				} else {
					WC()->cart->cart_contents[ $cart_item_key ][ THEMECOMPLETE_EPO()->cart_edit_key_var ] = $cart_item_key;
				}

				do_action( 'wc_epo_cart_loaded_from_session_after_cart_item', $cart_item );

			}
		}
	}

	/**
	 * Calculate totals on remove from cart/update
	 *
	 * @param boolean $cart_updated The current cart_updated status.
	 * @return boolean
	 * @since 1.0
	 */
	public function woocommerce_update_cart_action_cart_updated( $cart_updated = false ) {
		if ( apply_filters( 'wc_epo_update_cart_action_cart_updated', false, $cart_updated ) ) {
			return $cart_updated;
		}

		$cart_contents = WC()->cart->cart_contents;
		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				if ( isset( $cart_item['tm_epo_options_prices'] ) ) {
					$cart_updated = true;
				}
				if ( ! empty( $cart_item['tmpost_data'] ) && themecomplete_get_product_type( $cart_item['data'] ) !== 'composite' ) {
					/**
					 * Post data
					 *
					 * @var array<mixed> $post_data
					 */
					$post_data = wp_unslash( $cart_item['tmpost_data'] );
					if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
						$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
					}
					// todo:check for a better alternative.
					if ( ! isset( $post_data['cpf_product_price'] ) && isset( $cart_item['tm_epo_product_original_price'] ) ) {
						$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
					} else {
						$post_data['cpf_product_price'] = 0;
					}
					$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
					$post_data['quantity']          = $cart_item['quantity'];
					$new_cart_item                  = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data );
					if ( false === $new_cart_item ) {
						continue;
					}

					$cart_item = apply_filters( 'tm_cart_contents', $new_cart_item );

					WC()->cart->cart_contents[ $cart_item_key ] = $cart_item;
				}
			}
		}

		return $cart_updated;
	}

	/**
	 * Support for fee price types
	 *
	 * @param WC_Cart $cart_object The cart object.
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_cart_calculate_fees( $cart_object ) {
		if ( is_array( $cart_object->cart_contents ) ) {

			$to_currency = themecomplete_get_woocommerce_currency();

			foreach ( $cart_object->cart_contents as $key => $cart_item ) {
				$tax_class      = themecomplete_get_tax_class( $cart_item['data'] );
				$get_tax_status = is_object( $cart_item['data'] ) && is_callable( [ $cart_item['data'], 'get_tax_status' ] ) ? $cart_item['data']->get_tax_status() : $cart_item['data']->tax_status;
				if ( 'yes' === get_option( 'woocommerce_calc_taxes' ) && 'taxable' === $get_tax_status ) {
					$tax = true;
				} else {
					$tax = false;
				}

				$tmcartfee = isset( $cart_item['tmcartfee'] ) ? $cart_item['tmcartfee'] : [];
				foreach ( $tmcartfee as $cartfee ) {
					$_price_type = THEMECOMPLETE_EPO()->get_saved_element_price_type( $cartfee );
					if ( 'math' === $_price_type ) {
						if ( ! empty( $cart_item['tmpost_data'] ) ) {
							/**
							 * Post data
							 *
							 * @var array<mixed> $post_data
							 */
							$post_data = wp_unslash( $cart_item['tmpost_data'] );
							if ( isset( $cart_item['tm_epo_options_static_prices'] ) ) {
								$post_data['tm_epo_options_static_prices'] = $cart_item['tm_epo_options_static_prices'];
							}
							// todo:check for a better alternative.
							if ( ! isset( $post_data['cpf_product_price'] ) ) {
								$post_data['cpf_product_price'] = $cart_item['tm_epo_product_original_price'];
							}
							$post_data['cpf_product_price'] = apply_filters( 'wc_epo_add_cart_item_original_price', $post_data['cpf_product_price'], $cart_item );
							$post_data['quantity']          = $cart_item['quantity'];
							$_cart_item                     = $this->repopulatecart( $cart_item, $cart_item['product_id'], $post_data, false, '', 'tmcartfee' );
							if ( false !== $_cart_item ) {
								$cart_item = apply_filters( 'tm_cart_contents', $_cart_item );
							}
							break;
						}
					}
				}

				$tmcartfee = isset( $cart_item['tmcartfee'] ) ? $cart_item['tmcartfee'] : false;

				if ( $tmcartfee && is_array( $tmcartfee ) ) {
					foreach ( $tmcartfee as $cartfee ) {
						$tc_added_in_currency = isset( $cart_item['tmdata'] ) && isset( $cart_item['tmdata']['tc_added_in_currency'] ) ? $cart_item['tmdata']['tc_added_in_currency'] : false;
						$tc_default_currency  = isset( $cart_item['tmdata'] ) && isset( $cart_item['tmdata']['tc_default_currency'] ) ? $cart_item['tmdata']['tc_added_in_currency'] : false;
						$_price_type          = THEMECOMPLETE_EPO()->get_saved_element_price_type( $cartfee );
						$new_price            = $cartfee['price'];
						$new_price            = apply_filters( 'wc_epo_maybe_get_current_currency_price', apply_filters( 'wc_epo_price_on_cart', $new_price, $cart_item ), $_price_type, null, false, false, $tc_added_in_currency, $tc_default_currency );

						$hidelabelincart  = isset( $cartfee['hidelabelincart'] ) ? $cartfee['hidelabelincart'] : '';
						$hidevalueincart  = isset( $cartfee['hidevalueincart'] ) ? $cartfee['hidevalueincart'] : '';
						$hidelabelinorder = isset( $cartfee['hidelabelinorder'] ) ? $cartfee['hidelabelinorder'] : '';
						$hidevalueinorder = isset( $cartfee['hidevalueinorder'] ) ? $cartfee['hidevalueinorder'] : '';

						$new_name = '';

						if ( ! $hidelabelincart && ! $hidelabelinorder ) {
							$new_name = $cartfee['name'];
							if ( empty( $new_name ) ) {
								$new_name = esc_html__( 'Extra fee', 'woocommerce-tm-extra-product-options' );
							}
						}

						if ( ! $hidevalueincart && ! $hidevalueinorder ) {
							$fee_value = '';
							if ( isset( $cartfee['display'] ) ) {
								$fee_value = $cartfee['display'];
							} else {
								$fee_value = $cartfee['value'];
							}

							if ( '' !== $fee_value && '' !== $new_name ) {
								$new_name .= apply_filters( 'wc_epo_fee_quantity_separator', ' - ' ) . $fee_value;
							}
						}

						// Fee names cannot be empty.
						if ( '' === $new_name ) {
							$new_name = esc_html__( 'Extra fee', 'woocommerce-tm-extra-product-options' );
						}

						if ( floatval( $cartfee['quantity'] ) > 1 ) {
							$new_name .= apply_filters( 'wc_epo_fee_quantity_times', ' &times; ' ) . $cartfee['quantity'];
						}
						$canbadded = true;

						$fees = $cart_object->get_fees();
						if ( is_array( $fees ) ) {
							foreach ( $fees as $fee ) {
								if ( (string) sanitize_title( $new_name ) === (string) $fee->id ) {
									if ( apply_filters( 'wc_epo_add_same_fee', true, $new_price, $fee->amount ) ) {
										$fee->amount = $fee->amount + (float) $new_price;
									}
									$canbadded = false;
									break;
								}
							}
						}
						if ( $canbadded ) {

							$current_tax       = $tax;
							$current_tax_class = $tax_class;
							if ( isset( $cartfee['include_tax_for_fee_price_type'] ) && '' !== $cartfee['include_tax_for_fee_price_type'] ) {
								if ( 'yes' === $cartfee['include_tax_for_fee_price_type'] ) {
									$current_tax = true;
								} elseif ( 'no' === $cartfee['include_tax_for_fee_price_type'] ) {
									$current_tax = false;
								}
							}
							if ( isset( $cartfee['tax_class_for_fee_price_type'] ) && '' !== $cartfee['tax_class_for_fee_price_type'] ) {
								$current_tax_class = $cartfee['tax_class_for_fee_price_type'];
								if ( '@' === $cartfee['tax_class_for_fee_price_type'] ) {
									$current_tax_class = '';
								}
							}
							$cart_object->add_fee( $new_name, $new_price, $current_tax, $current_tax_class );
						}
					}
				}
			}
		}
	}

	/**
	 * Calculates the fee price
	 *
	 * @param float        $price The element price.
	 * @param mixed        $product_id The product id.
	 * @param array<mixed> $element The element array.
	 * @return float
	 * @since 1.0
	 */
	public function calculate_fee_price( $price = 0, $product_id = 0, $element = [] ) {
		global $woocommerce;
		$product = wc_get_product( $product_id );
		if ( ! $product ) {
			return $price;
		}

		$taxable   = $product->is_taxable();
		$tax_class = themecomplete_get_tax_class( $product );

		if ( $element ) {
			if ( isset( $element['include_tax_for_fee_price_type'] ) ) {
				if ( 'no' === $element['include_tax_for_fee_price_type'] ) {
					$taxable = false;
				}
				if ( 'yes' === $element['include_tax_for_fee_price_type'] ) {
					$taxable = true;
				}
			}
			if ( isset( $element['tax_class_for_fee_price_type'] ) ) {
				$tax_class = $element['tax_class_for_fee_price_type'];
			}
		}

		// Taxable.
		if ( $taxable ) {

			if ( get_option( 'woocommerce_prices_include_tax' ) === 'yes' ) {
				$tax_rates = WC_Tax::get_base_tax_rates( $tax_class );
				$taxes     = WC_Tax::calc_tax( $price, $tax_rates, true );
				$price     = WC_Tax::round( $price - array_sum( $taxes ) );
			}

			return (float) $price;

		}

		return $price;
	}

	/**
	 * Adds the Empty cart button
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_empty_cart_button() {
		$text = ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_empty_cart_text' ) ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_empty_cart_text' ) : esc_html__( 'Empty cart', 'woocommerce-tm-extra-product-options' );
		echo '<button type="submit" class="tm-clear-cart-button button" name="tm_empty_cart" value="' . esc_attr( $text ) . '">' . esc_attr( $text ) . '</button>';
	}

	/**
	 * Empties the cart
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_empty_cart() {
		if ( ! isset( WC()->cart ) || '' === WC()->cart ) { // @phpstan-ignore-line
			WC()->cart = new WC_Cart();
		}
		WC()->cart->empty_cart( true );
	}

	/**
	 * Empties the cart from the clear cart button
	 *
	 * @return void
	 * @since 1.0
	 */
	public function clear_cart() {
		if ( isset( $_REQUEST['tm_empty_cart'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->tm_empty_cart();
		}
	}

	/**
	 * Override templates for Cart advanced template system
	 *
	 * @param string $located The file to locate.
	 * @param string $template_name The template name.
	 * @return string
	 * @since 1.0
	 */
	public function tm_wc_get_template( $located = '', $template_name = '' ) {
		$templates = [ 'cart/cart-item-data.php' ];

		if ( in_array( $template_name, $templates, true ) ) {
			$_located = wc_locate_template( $template_name, THEMECOMPLETE_EPO_DISPLAY()->get_template_path(), THEMECOMPLETE_EPO_DISPLAY()->get_default_path() );
			if ( file_exists( $_located ) ) {
				$located = $_located;
			}
		}

		return $located;
	}

	/**
	 * Advanced template system - Alter item subtoal
	 *
	 * @param string       $subtotal The subtotal string.
	 * @param array<mixed> $cart_item The cart item object.
	 * @param string       $cart_item_key The cart item key.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_subtotal( $subtotal = '', $cart_item = [], $cart_item_key = '' ) {
		// is_cart() is used to filter out the review order screen.
		if ( 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
			$_product   = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
			$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

			if ( is_cart() ) {

				$original_subtotal = $subtotal;

				$subtotal = '';

				if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) ) {
					if ( isset( $cart_item['tm_epo_product_after_adjustment'] ) && '' !== $cart_item['tm_epo_product_after_adjustment'] && ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_enable' ) ) ) {
						$price = $cart_item['tm_epo_product_after_adjustment'];
					} else {
						$price = isset( $cart_item['tm_epo_product_original_price'] ) ? $cart_item['tm_epo_product_original_price'] : $_product->get_price();
						$price = apply_filters( 'wc_epo_discounted_price', $price, wc_get_product( $cart_item['product_id'] ), $cart_item_key, true );
					}
					$price     = floatval( $price ) * floatval( $cart_item['quantity'] );
					$subtotal .= apply_filters( 'wc_tm_epo_ac_subtotal_price', $this->get_price_for_cart( $price, $cart_item, '' ), $cart_item_key, $cart_item, $_product, $product_id );
				} else {
					$subtotal .= apply_filters( 'wc_tm_epo_ac_subtotal_price', $subtotal, $cart_item_key, $cart_item, $_product, $product_id );
				}

				$subtotal .= $this->cart_add_option_rows( $original_subtotal, $cart_item_key, $cart_item, $_product, $product_id );

			} elseif ( defined( 'WOOCOMMERCE_CHECKOUT' ) || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) {

				if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) ) {
					if ( isset( $cart_item['tm_epo_product_after_adjustment'] ) && '' !== $cart_item['tm_epo_product_after_adjustment'] && ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_enable' ) ) ) {
						$price = $cart_item['tm_epo_product_after_adjustment'];
					} else {
						$price = isset( $cart_item['tm_epo_product_original_price'] ) ? $cart_item['tm_epo_product_original_price'] : $_product->get_price();
						$price = apply_filters( 'wc_epo_discounted_price', $price, wc_get_product( $cart_item['product_id'] ), $cart_item_key );
					}
					$price = floatval( $price ) * floatval( $cart_item['quantity'] );

					$subtotal = apply_filters( 'wc_tm_epo_ac_subtotal_prices', $this->get_price_for_cart( $price, $cart_item, '' ), $cart_item, $cart_item_key );

					$subtotal .= $this->checkout_add_option_rows( $cart_item_key, $cart_item, $_product, $product_id );

				}
			}
		}

		return $subtotal;
	}

	/**
	 * Advanced template system - Alter product quantity
	 *
	 * @param string       $product_quantity The product quantity.
	 * @param string       $cart_item_key The cart item key.
	 * @param array<mixed> $cart_item The cart item object.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_quantity( $product_quantity = '', $cart_item_key = '', $cart_item = [] ) {
		$this->saved_product_quantity = $product_quantity;

		$no_epo = apply_filters( 'wc_epo_no_epo_in_cart', empty( $cart_item['tmcartepo'] ), $cart_item );

		if ( 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) && ! $no_epo ) {

			$_product   = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
			$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

			if ( $_product->is_sold_individually() ) {
				$product_quantity = apply_filters( 'wc_tm_epo_ac_product_qty', '1', $cart_item_key, $cart_item, $_product, $product_id );
			} else {
				$product_quantity = apply_filters( 'wc_tm_epo_ac_product_qty', $cart_item['quantity'], $cart_item_key, $cart_item, $_product, $product_id );
			}
		}

		return $product_quantity;
	}

	/**
	 * Advanced template system - Alter product price
	 *
	 * @param string       $price The product price.
	 * @param array<mixed> $cart_item The cart item object.
	 * @param string       $cart_item_key The cart item key.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_price( $price = '', $cart_item = [], $cart_item_key = '' ) {
		// is_cart() is used to filter out the mini cart hook.
		if ( is_cart() && 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {

			$_product   = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
			$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

			if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) ) {
				$variation_id = $cart_item['variation_id'];
				if ( empty( $variation_id ) ) {
					$variation_id = $product_id;
				}
				$original_product = wc_get_product( $variation_id );

				$price = isset( $cart_item['tm_epo_product_original_price'] ) ? $cart_item['tm_epo_product_original_price'] : $cart_item['data']->get_price();
				$price = apply_filters( 'wc_tm_epo_ac_product_price', $this->get_price_for_cart( $price, $cart_item, '' ), $cart_item_key, $cart_item, $original_product, $product_id );
			} else {
				$price = apply_filters( 'wc_tm_epo_ac_product_price', $price, $cart_item_key, $cart_item, $_product, $product_id );
			}
		}

		return $price;
	}

	/**
	 * Advanced template system - Add custom class name
	 *
	 * @param string       $class_name The cart item class.
	 * @param array<mixed> $cart_item The cart item object.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_class( $class_name = '', $cart_item = [] ) {
		$no_epo = apply_filters( 'wc_epo_no_epo_in_cart', empty( $cart_item['tmcartepo'] ), $cart_item );

		// is_cart() is used to filter out the review order screen.
		if ( is_cart() && 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) && ! $no_epo ) {
			$class_name .= ' tm-epo-cart-row-product';
		}

		return $class_name;
	}

	/**
	 * Custom actions running for advanced template system
	 *
	 * @param string       $cart_item_key The cart item key.
	 * @param array<mixed> $cart_item The cart item object.
	 * @param mixed        $_product The product object.
	 * @param integer      $product_id The product id.
	 * @return string
	 * @since 1.0
	 */
	public function checkout_add_option_rows( $cart_item_key = '', $cart_item = [], $_product = '', $product_id = 0 ) {
		$out        = [];
		$other_data = [];
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) ) {
			$other_data = $this->get_item_data_array( [], $cart_item );
		}
		$odd = 1;
		foreach ( $other_data as $key => $value ) {
			$zebra_class = 'odd ';
			if ( ! $odd ) {
				$zebra_class = 'even ';
				$odd         = 2;
			}
			$out[] = '</td></tr>';
			$out[] = '<tr class="tm-epo-checkout-row '
					. $zebra_class
					. esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) )
					. '">';

			$epo_name  = '';
			$epo_value = '';
			if ( ! empty( $value['name'] ) ) {
				$epo_name = $value['tc_simple_value'];
			}
			if ( ! empty( $value['value'] ) ) {
				$epo_value = $value['tc_simple_value'];
			}

			$qty = ' <strong class="tm-epo-checkout-quantity">' . apply_filters( 'wc_tm_epo_ac_qty', sprintf( '&times; %s', $value['tm_quantity'] * $cart_item['quantity'] ), $cart_item_key, $cart_item, $value, $_product, $product_id ) . '</strong>';

			$name = '';
			if ( ! empty( $value['value'] ) && empty( $value['name'] ) ) {
				$name = '<div class="tc-epo-checkout-option-value tc-epo-checkout-no-label">' . $value['tc_simple_value'] . $qty . '</div>';
			} elseif ( empty( $value['value'] ) && ! empty( $value['name'] ) ) {
				$name = '<div class="tm-epo-checkout-option-label tc-epo-checkout-no-value">' . $value['tm_label'] . $qty . '</div>';
			} elseif ( ! empty( $value['value'] ) && ! empty( $value['name'] ) ) {
				$name = '<div class="tm-epo-checkout-option-label">' . $value['tm_label'] . $qty . '</div><div class="tm-epo-checkout-option-value">' . $value['tc_simple_value'] . '</div>';
			}

			$out[] = '<td class="tm-epo-checkout-name">' . $name . '</td>';
			$out[] = '<td class="tm-epo-checkout-subtotal">' . $value['tm_total_price'];

			--$odd;
		}

		return implode( '', $out );
	}

	/**
	 * Custom actions running for advanced template system
	 *
	 * @param string       $subtotal The row subtotal.
	 * @param string       $cart_item_key The cart item key.
	 * @param array<mixed> $cart_item The cart item object.
	 * @param mixed        $_product The product object.
	 * @param integer      $product_id The product id.
	 * @return string
	 * @since 1.0
	 */
	public function cart_add_option_rows( $subtotal = '', $cart_item_key = '', $cart_item = [], $_product = '', $product_id = 0 ) {
		$out        = [];
		$other_data = [];
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_in_cart' ) ) {
			$other_data = $this->get_item_data_array( [], $cart_item );
		}
		$odd = 1;
		foreach ( $other_data as $key => $value ) {
			$zebra_class = 'odd ';
			if ( ! $odd ) {
				$zebra_class = 'even ';
				$odd         = 2;
			}

			$out[]     = '</td></tr>';
			$out[]     = '<tr class="tm-epo-cart-row ' . $zebra_class . esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ) . '">';
			$out[]     = '<td class="product-remove">&nbsp;</td>';
			$thumbnail = '&nbsp;';

			$out[]     = '<td class="product-thumbnail">' . $thumbnail . '</td>';
			$epo_name  = '';
			$epo_value = '';
			if ( ! empty( $value['name'] ) ) {
				$epo_name = $value['tc_simple_value'];
			}
			if ( ! empty( $value['value'] ) ) {
				$epo_value = $value['tc_simple_value'];
			}

			$name = '';
			if ( ! empty( $value['value'] ) && empty( $value['name'] ) ) {
				$name = '<div class="tm-epo-cart-option-value tc-epo-cart-no-label">' . $value['tc_simple_value'] . '</div>';
			} elseif ( empty( $value['value'] ) && ! empty( $value['name'] ) ) {
				$name = '<div class="tm-epo-cart-option-label tc-epo-cart-no-value">' . $value['tm_label'] . '</div><div class="tc-epo-cart-option-value">' . $value['tc_simple_value'] . '</div>';
			} elseif ( ! empty( $value['value'] ) && ! empty( $value['name'] ) ) {
				$name = '<div class="tm-epo-cart-option-label">' . $value['tm_label'] . '</div><div class="tc-epo-cart-option-value">' . $value['tc_simple_value'] . '</div>';
			}
			$item_quantity = apply_filters( 'wc_tm_epo_ac_qty', $value['tm_quantity'] * $cart_item['quantity'], $cart_item_key, $cart_item, $value, $_product, $product_id );
			$item_subtotal = $value['tm_total_price'];

			$name .= '<div class="tm-epo-cart-option-mobile">';
			$name .= '<div class="mobile-product-price">' . $value['tm_price'];
			if ( $item_quantity > 1 ) {
				$name .= '<span class="mobile-product-quantity"><small> &times; ' . $item_quantity . '</small></span>';
			}
			$name .= '</div>';
			if ( $item_quantity > 1 ) {
				$name .= '<div class="mobile-product-subtotal">' . $item_subtotal . '</div>';
			}
			$name .= '</div>';
			$out[] = '<td class="product-name">' . $name . '</td>';
			$out[] = '<td class="product-price">' . $value['tm_price'] . '</td>';
			$out[] = '<td class="product-quantity">' . $item_quantity . '</td>';
			$out[] = '<td class="product-subtotal">' . $item_subtotal;

			--$odd;
		}
		if ( is_array( $other_data ) && count( $other_data ) > 0 ) {
			$out[] = '<tr class="tm-epo-cart-row tc-epo-cart-row-total ' . esc_attr( apply_filters( 'woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ) . '">';
			$out[] = '<td class="product-remove">&nbsp;</td>';
			$out[] = '<td class="product-thumbnail">&nbsp;</td>';
			$out[] = '<td class="product-name">&nbsp;</td>';
			$out[] = '<td class="product-price">&nbsp;</td>';

			$out[] = '<td class="product-quantity">' . ( null !== $this->saved_product_quantity ? $this->saved_product_quantity : '' ) . '</td>';
			$out[] = '<td class="product-subtotal">' . $subtotal;
		}

		return implode( '', $out );
	}

	/**
	 * Adds edit link after the product title in cart
	 *
	 * @param array<mixed> $cart_item The item data.
	 * @param string       $cart_item_key The cart item key.
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_after_cart_item_name( $cart_item = [], $cart_item_key = '' ) {
		if ( ! THEMECOMPLETE_EPO()->wc_vars['is_cart'] ) {
			return;
		}

		if ( ( defined( 'WOOCOMMERCE_CHECKOUT' ) || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) && false === $this->added_woocommerce_checkout_cart_item_quantity ) {
			add_filter( 'woocommerce_checkout_cart_item_quantity', [ $this, 'woocommerce_cart_item_name' ], 10, 3 );
			$this->added_woocommerce_checkout_cart_item_quantity = true;
			return;
		}

		$this->added_woocommerce_checkout_cart_item_quantity = false;

		if ( apply_filters( 'wc_epo_no_edit_options', false, $cart_item, $cart_item_key ) ) {
			return;
		}
		if ( ! isset( $cart_item['data'] ) || ! isset( $cart_item['tmhasepo'] ) || isset( $cart_item['associated_key'] ) ) {
			return;
		}
		if ( apply_filters( 'wc_epo_override_edit_options', true, $cart_item, $cart_item_key ) ) {
			if ( ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) && THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) || isset( $cart_item['composite_item'] ) || isset( $cart_item['composite_data'] ) ) {
				return;
			}
			// Chained products cannot be edited.
			if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['chained_item_of'] ) ) {
				return;
			}
			// Cannot function with TLS eDocBuidler.
			if ( isset( $cart_item['eDocBuilderID'] ) ) {
				return;
			}
		}
		$product = $cart_item['data'];

		$link = apply_filters( 'wc_epo_edit_options_get_permalink', $product->get_permalink( $cart_item ), $product, $cart_item, $cart_item_key );
		$link = add_query_arg(
			[
				THEMECOMPLETE_EPO()->cart_edit_key_var => $cart_item_key,
				'cart_item_key'                        => $cart_item_key,
			],
			$link
		);
		if ( defined( 'WOOCOMMERCE_CHECKOUT' ) || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) {
			$link = add_query_arg(
				[
					'from_checkout' => 1,
				],
				$link
			);
		}
		// wp_nonce_url escapes the url.
		$link  = wp_nonce_url( $link, 'tm-edit' );
		$title = '<a href="' . esc_url( $link ) . '" class="tm-cart-edit-options">' . ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_edit_options_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_edit_options_text' ) ) : esc_html__( 'Edit options', 'woocommerce-tm-extra-product-options' ) ) . '</a>';

		echo wp_kses_post( apply_filters( 'wc_epo_edit_options_link', $title, $cart_item, $cart_item_key ) );
	}

	/**
	 * Adds edit link on product title in mini cart and checkout.
	 *
	 * @param string       $title The title html.
	 * @param array<mixed> $cart_item The item data.
	 * @param string       $cart_item_key The cart item key.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_item_name( $title = '', $cart_item = [], $cart_item_key = '' ) {
		if ( THEMECOMPLETE_EPO()->wc_vars['is_cart'] && ! $this->in_mini_cart ) {
			return $title;
		}

		if ( ! THEMECOMPLETE_EPO()->wc_vars['is_cart'] && ( defined( 'WOOCOMMERCE_CHECKOUT' ) || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) && false === $this->added_woocommerce_checkout_cart_item_quantity ) {
			add_filter( 'woocommerce_checkout_cart_item_quantity', [ $this, 'woocommerce_cart_item_name' ], 10, 3 );
			$this->added_woocommerce_checkout_cart_item_quantity = true;
			return $title;
		}

		$this->added_woocommerce_checkout_cart_item_quantity = false;

		if ( apply_filters( 'wc_epo_no_edit_options', false, $title, $cart_item, $cart_item_key ) ) {
			return $title;
		}
		if ( ! isset( $cart_item['data'] ) || ! isset( $cart_item['tmhasepo'] ) || isset( $cart_item['associated_key'] ) ) {
			return $title;
		}
		if ( apply_filters( 'wc_epo_override_edit_options', true, $title, $cart_item, $cart_item_key ) ) {
			if ( ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) && ! ( THEMECOMPLETE_EPO()->wc_vars['is_cart'] || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) ) || isset( $cart_item['composite_item'] ) || isset( $cart_item['composite_data'] ) ) {
				return $title;
			}
			// Chained products cannot be edited.
			if ( isset( WC()->cart->cart_contents[ $cart_item_key ]['chained_item_of'] ) ) {
				return $title;
			}
			// Cannot function with TLS eDocBuidler.
			if ( isset( $cart_item['eDocBuilderID'] ) ) {
				return $title;
			}
		}
		$product = $cart_item['data'];

		$link = apply_filters( 'wc_epo_edit_options_get_permalink', $product->get_permalink( $cart_item ), $product, $title, $cart_item, $cart_item_key );
		$link = add_query_arg(
			[
				THEMECOMPLETE_EPO()->cart_edit_key_var => $cart_item_key,
				'cart_item_key'                        => $cart_item_key,
			],
			$link
		);
		if ( defined( 'WOOCOMMERCE_CHECKOUT' ) || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] ) {
			$link = add_query_arg(
				[
					'from_checkout' => 1,
				],
				$link
			);
		}
		// wp_nonce_url escapes the url.
		$link   = wp_nonce_url( $link, 'tm-edit' );
		$title .= '<a href="' . esc_url( $link ) . '" class="tm-cart-edit-options">' . ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_edit_options_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_edit_options_text' ) ) : esc_html__( 'Edit options', 'woocommerce-tm-extra-product-options' ) ) . '</a>';

		return apply_filters( 'wc_epo_edit_options_link', $title, $cart_item, $cart_item_key );
	}

	/**
	 * Alters add to cart text when editing a product
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_before_add_to_cart_button() {
		if ( THEMECOMPLETE_EPO()->is_edit_mode() ) {
			add_filter( 'woocommerce_product_single_add_to_cart_text', [ $this, 'woocommerce_product_single_add_to_cart_text' ], 9999 );
			echo '<input type="hidden" name="' . esc_attr( (string) THEMECOMPLETE_EPO()->cart_edit_key_var_alt ) . '" value="' . esc_attr( (string) THEMECOMPLETE_EPO()->cart_edit_key ) . '">';
			if ( isset( $_REQUEST['from_checkout'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				echo '<input type="hidden" name="from_checkout" value="' . esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['from_checkout'] ) ) ) . '">'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}
		}
	}

	/**
	 * Alter add to cart button text when in edit mode
	 *
	 * @return string|void
	 */
	public function woocommerce_product_single_add_to_cart_text() {
		return ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_update_cart_text' ) ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_update_cart_text' ) : esc_attr__( 'Update cart', 'woocommerce' );
	}

	/**
	 * Alters the cart item key when editing a product
	 *
	 * @param string       $cart_item_key The cart item key.
	 * @param integer      $product_id The product id.
	 * @param integer      $quantity The product quantity.
	 * @param integer      $variation_id The variation id.
	 * @param array<mixed> $variation Attribute values.
	 * @param array<mixed> $cart_item_data The cart item meta data.
	 * @return string|void
	 */
	public function edit_woocommerce_add_to_cart( $cart_item_key = '', $product_id = 0, $quantity = 0, $variation_id = 0, $variation = [], $cart_item_data = [] ) {
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			$this->new_add_to_cart_key = $cart_item_key;
		} elseif ( is_array( $cart_item_data ) && isset( $cart_item_data['tmhasepo'] ) ) {
			$cart_contents = WC()->cart->cart_contents;
			if (
				is_array( $cart_contents ) &&
				isset( $cart_contents[ $cart_item_key ] ) &&
				! empty( $cart_contents[ $cart_item_key ] ) &&
				! isset( $cart_contents[ $cart_item_key ][ THEMECOMPLETE_EPO()->cart_edit_key_var ] ) ) {
				WC()->cart->cart_contents[ $cart_item_key ][ THEMECOMPLETE_EPO()->cart_edit_key_var ] = $cart_item_key;
			}
		}
	}

	/**
	 * Redirect to cart when updating information for a cart item
	 *
	 * @param string $url The url to redirect to.
	 * @return string|void
	 */
	public function woocommerce_add_to_cart_redirect( $url = '' ) {
		if ( empty( $_REQUEST['add-to-cart'] ) || ! is_numeric( $_REQUEST['add-to-cart'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return $url;
		}
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			if ( ! THEMECOMPLETE_EPO_HELPER()->is_ajax_request() ) {
				remove_filter( 'woocommerce_add_to_cart_redirect', [ $this, 'woocommerce_add_to_cart_redirect' ], 9999 );
				if ( ! empty( $_REQUEST['from_checkout'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$url = function_exists( 'wc_get_checkout_url' ) ? wc_get_checkout_url() : get_permalink( get_option( 'woocommerce_checkout_page_id' ) );
				} else {
					$url = function_exists( 'wc_get_cart_url' ) ? wc_get_cart_url() : WC()->cart->get_cart_url();
				}
				$url = apply_filters( 'woocommerce_add_to_cart_redirect', $url, null );
			}
		}

		return $url;
	}

	/**
	 * Remove product from cart when editing a product
	 *
	 * @param boolean $passed The current passed status.
	 * @return boolean
	 */
	public function remove_previous_product_from_cart( $passed ) {
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			$cart_item_key = THEMECOMPLETE_EPO()->cart_edit_key;
			if ( false !== $this->new_add_to_cart_key ) {
				if ( $this->new_add_to_cart_key === $cart_item_key && isset( $_REQUEST['quantity'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					WC()->cart->set_quantity( $this->new_add_to_cart_key, intval( wp_unslash( $_REQUEST['quantity'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				}
			}
		}

		return $passed;
	}

	/**
	 * Alter add to cart message
	 *
	 * @param string       $message The message to return.
	 * @param array<mixed> $products Product ID list or single product ID.
	 * @return string|void
	 */
	public function wc_add_to_cart_message_html( $message = '', $products = [] ) {
		if ( THEMECOMPLETE_EPO()->cart_edit_key && false !== $this->new_add_to_cart_key ) {
			$titles = [];
			$count  = 0;
			foreach ( $products as $product_id => $qty ) {
				/* translators: %s: product name */
				$titles[] = ( $qty > 1 ? absint( $qty ) . ' &times; ' : '' ) . sprintf( esc_html_x( '&ldquo;%s&rdquo;', 'Item name in quotes', 'woocommerce' ), wp_strip_all_tags( get_the_title( $product_id ) ) );
				$count   += $qty;
			}
			$titles = array_filter( $titles );
			/* translators: %s: product name */
			$added_text = sprintf( esc_html( _n( '%s has been updated.', '%s have been updated.', $count, 'woocommerce-tm-extra-product-options' ) ), wc_format_list_of_items( $titles ) );

			$message = sprintf(
				'<a href="%s" class="button wc-forward">%s</a> %s',
				esc_url( wc_get_page_permalink( 'cart' ) ),
				esc_html__( 'View cart', 'woocommerce' ),
				esc_html( $added_text )
			);
		}

		return $message;
	}

	/**
	 * Change quantity value when editing a cart item
	 *
	 * @return void
	 */
	public function tm_woocommerce_before_add_to_cart_form() {
		add_filter( 'woocommerce_quantity_input_args', [ $this, 'tm_woocommerce_quantity_input_args' ], 9999, 1 );
	}

	/**
	 * Remove filter for change quantity value when editing a cart item
	 *
	 * @return void
	 */
	public function tm_woocommerce_after_add_to_cart_form() {
		remove_filter( 'woocommerce_quantity_input_args', [ $this, 'tm_woocommerce_quantity_input_args' ], 9999 );
	}

	/**
	 * Change quantity value when editing a cart item
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 */
	public function tm_woocommerce_quantity_input_args( $args = [] ) {
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			$cart_item_key = THEMECOMPLETE_EPO()->cart_edit_key;
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );

			if ( isset( $cart_item['quantity'] ) ) {
				$args['input_value'] = $cart_item['quantity'];
			}
		}

		return $args;
	}

	/**
	 * Advanced template product price fix for override price
	 *
	 * @param float   $price The product price.
	 * @param string  $cart_item_key Cart item key.
	 * @param object  $cart_item The cart item object.
	 * @param object  $_product The product object.
	 * @param integer $product_id The product id.
	 * @return float|string
	 */
	public function wc_tm_epo_ac_product_price( $price, $cart_item_key, $cart_item, $_product, $product_id ) {
		$flag = false;
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) ) {
			$flag = true;
		} elseif ( '' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) ) {
			$tm_meta_cpf = themecomplete_get_post_meta( $product_id, 'tm_meta_cpf', true );
			if ( ! is_array( $tm_meta_cpf ) ) {
				$tm_meta_cpf = [];
			}

			if ( ! empty( $tm_meta_cpf['price_override'] ) ) {
				$flag = true;
			}
		}

		if ( isset( $cart_item['tm_epo_options_prices'] ) && floatval( $cart_item['tm_epo_options_prices'] ) > 0 ) {
			$display_price = $price;

			if ( $flag ) {
				$display_price = '';
			}

			return apply_filters( 'wc_epo_ac_override_price', $display_price, $price, $cart_item_key, $cart_item, $_product, $product_id );
		}

		return $price;
	}

	/**
	 * Disables persistent cart
	 *
	 * @param mixed   $value The value to return.
	 * @param integer $id ID of the object metadata is for.
	 * @param string  $key Metadata key.
	 *
	 * @return boolean
	 */
	public function turn_off_persi_cart( $value, $id, $key ) {
		if ( '_woocommerce_persistent_cart' === $key ) {
			return false;
		}

		return $value;
	}
}
includes/classes/class-themecomplete-epo-builder-base.php000064400000023447150755142450017615 0ustar00<?php
/**
 * Extra Product Options Builder class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Builder class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_BUILDER_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_BUILDER_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Internal element names
	 *
	 * @var array<mixed>
	 */
	public $internal_element_names = [];

	/**
	 * All elements
	 *
	 * @var array<mixed>
	 */
	public $all_elements = [];

	/**
	 * Extra settings for all addons
	 *
	 * @var array<mixed>
	 */
	public $extra_addon_properties = [];

	/**
	 * Extra settings for multiple type addons
	 *
	 * @var array<mixed>
	 */
	public $extra_multiple_options = [];

	/**
	 * Addon option attributes
	 *
	 * @var array<mixed>
	 */
	public $addons_attributes = [];

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_BUILDER_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Set internal element names.
		$this->set_internal_element_names();

		// Set internal element custom properties.
		$this->set_internal_element_custom_properties();

		// Extra settings for all addons.
		$this->extra_addon_properties = apply_filters( 'wc_epo_extra_addon_properties', $this->extra_addon_properties );

		$this->extra_addon_properties = $this->parse_extra_addon_properties();

		// Extra settings for multiple type addons.
		$this->extra_multiple_options = apply_filters( 'wc_epo_extra_multiple_choices', $this->extra_multiple_options );

		// Init internal elements.
		$this->init_internal_elements();

		if ( is_admin() ) {
			THEMECOMPLETE_EPO_ADMIN_BUILDER();
		}
	}

	/**
	 * Parse extra addon properties
	 *
	 * @since 6.4.3
	 * @return array<mixed>
	 */
	public function parse_extra_addon_properties() {
		$data = [
			'settings'   => [],
			'extra_tabs' => [],
		];

		$extra_addon_properties = $this->extra_addon_properties;
		foreach ( $extra_addon_properties as $key => $value ) {
			if ( isset( $value['id'] ) ) {
				if ( isset( $value['tab_data'] ) && isset( $value['header_data'] ) ) {
					$data['extra_tabs'][ $value['id'] ] = [
						'type'        => $value['type'],
						'tab_data'    => $value['tab_data'],
						'header_data' => $value['header_data'],
					];
				} elseif ( isset( $value['field'] ) ) {
					$data['settings'][] = $value;
				}
			}
		}

		return $data;
	}

	/**
	 * Set internal element names
	 *
	 * @return void
	 * @since 6.0
	 */
	public function set_internal_element_names() {
		global $pagenow;

		$this->internal_element_names = [
			'header',
			'divider',
			'date',
			'time',
			'range',
			'color',
			'textarea',
			'textfield',
			'upload',
			'multiple_file_upload',
			'selectbox',
			'selectboxmultiple',
			'radiobuttons',
			'checkboxes',
			'variations',
			'product',
			'template',
			'dynamic',
		];

		if ( ( 'post.php' === $pagenow && isset( $_GET['post'] ) ) || ( 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$post_type = isset( $_GET['post_type'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type'] ) ) : get_post_type( absint( wp_unslash( $_GET['post'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post_type ) {
				$key = array_search( 'template', $this->internal_element_names, true );
				if ( false !== $key ) {
					unset( $this->internal_element_names[ $key ] );
				}
			}
		}

		$this->internal_element_names = apply_filters( 'wc_epo_internal_element_names', $this->internal_element_names );
	}

	/**
	 * Set internal element custom properties
	 *
	 * @return void
	 * @since 6.4.4
	 */
	public function set_internal_element_custom_properties() {
		// Extra settings for all addons.
		$this->extra_addon_properties[] = [
			'id'    => 'weight',
			'index' => 0,
			'type'  => [
				'date',
				'time',
				'range',
				'color',
				'textarea',
				'textfield',
				'upload',
				'multiple_file_upload',
				'selectbox',
				'selectboxmultiple',
				'radiobuttons',
				'checkboxes',
			],
			'tab'   => 'woocommerce_settings',
			'field' => [
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'number',
				'tags'        => [
					'value' => '',
				],
				'label'       => esc_html__( 'Weight', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the weight to add to the product if this addon is selected.', 'woocommerce-tm-extra-product-options' ),
			],
		];

		// Extra settings for multiple type addons.
		$this->extra_multiple_options[] = [
			'name'        => 'weight',
			'label'       => __( 'Weight', 'woocommerce-tm-weight-addon' ),
			'admin_class' => 'tm_cell_display',
			'type'        => [ 'selectbox', 'radiobuttons', 'checkboxes' ],
			'field'       => [
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'number',
				'tags'        => [
					'class' => 't tm_option_display',
					'value' => '',
				],
				'label'       => __( 'Weight', 'woocommerce-tm-weight-addon' ),
			],
		];
	}

	/**
	 * Holds all the elements types.
	 *
	 * @return void
	 * @since 6.0
	 * @access private
	 */
	private function init_internal_elements() {
		foreach ( $this->internal_element_names as $class_name ) {
			$class                             = 'THEMECOMPLETE_EPO_BUILDER_ELEMENT_' . strtoupper( $class_name );
			$this->all_elements[ $class_name ] = new $class( $class_name );
		}

		$this->all_elements = apply_filters( 'wc_epo_builder_element_settings', $this->all_elements );

		do_action( 'wc_epo_builder_after_element_settings', $this->all_elements );
	}

	/**
	 * Get all elements
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function get_elements() {
		return $this->all_elements;
	}

	/**
	 * Get custom properties
	 *
	 * @param array<mixed> $builder Element builder array.
	 * @param string       $_prefix Element prefix.
	 * @param array<mixed> $_counter Counter array.
	 * @param array<mixed> $_elements The saved element types array.
	 * @param integer      $k0 Current section counter.
	 * @param array<mixed> $current_builder The current element builder array.
	 * @param integer      $current_counter The current element counter.
	 * @param string       $current_element The current element.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_custom_properties( $builder, $_prefix, $_counter, $_elements, $k0, $current_builder, $current_counter, $current_element ) {
		$p = [];
		foreach ( $this->addons_attributes as $key => $value ) {
			$p[ $value ] = THEMECOMPLETE_EPO()->get_builder_element( $_prefix . $value, $builder, $current_builder, $current_counter, '', $current_element );
		}

		return $p;
	}

	/**
	 * Remove prefix
	 *
	 * @param string $str The string to remove the prefix from.
	 * @param string $prefix The prefix to remove from the string.
	 * @since 6.0
	 * @return string
	 */
	public function remove_prefix( $str = '', $prefix = '' ) {
		if ( substr( $str, 0, strlen( $prefix ) ) === $prefix ) {
			$str = substr( $str, strlen( $prefix ) );
		}

		return $str;
	}

	/**
	 * Register addons
	 * This function is only used by external addon plugins.
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function register_addon( $args = [] ) {
		if ( isset( $args['namespace'] )
			&& isset( $args['name'] )
			&& isset( $args['options'] )
			&& isset( $args['settings'] )
			&& is_array( $args['settings'] ) ) {

			$this->set_elements( $args );

		}
	}

	/**
	 * Set elements
	 * Extends the internal $all_elements variable.
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	private function set_elements( $args = [] ) {
		$name    = $args['name'];
		$options = apply_filters( 'wc_epo_set_elements_options', $args['options'], $args );

		if ( ! empty( $name ) && is_array( $options ) ) {
			$is_addon           = true;
			$addon              = new THEMECOMPLETE_EPO_BUILDER_ELEMENT_ADDON( $options, $args );
			$this->all_elements = array_merge( [ $name => $addon ], $this->all_elements );
			$settings           = $args['settings'];
			foreach ( $settings as $key => $value ) {
				if ( is_array( $value ) && count( $value ) > 2 ) {
					if ( isset( $value['id'] ) ) {
						$this->addons_attributes[] = $this->remove_prefix( $value['id'], $name . '_' );
					}
				} elseif ( is_array( $value ) && 1 === count( $value ) && isset( $value['_multiple_values'] ) ) {
					foreach ( $value['_multiple_values'] as $mkey => $mvalue ) {
						$this->addons_attributes[] = $this->remove_prefix( $mvalue['id'], $name . '_' );
					}
				} else {
					if ( is_array( $value ) && 2 === count( $value ) ) {
						$args  = $value[1];
						$value = $value[0];
					}

					$method = apply_filters( 'wc_epo_add_element_method', 'add_setting_' . $value, $key, $value, $name, $settings, $is_addon );

					$class_to_use = apply_filters( 'wc_epo_add_element_class', THEMECOMPLETE_EPO_ADMIN_BUILDER(), $key, $value, $name, $settings, $is_addon );

					if ( is_callable( [ $class_to_use, $method ] ) ) {
						if ( $args ) {
							$_value = $class_to_use->$method( $name, $args );
						} else {
							$_value = $class_to_use->$method( $name );
						}

						if ( isset( $_value['_multiple_values'] ) ) {
							foreach ( $_value['_multiple_values'] as $mkey => $mvalue ) {
								$this->addons_attributes[] = $this->remove_prefix( $mvalue['id'], $name . '_' );
							}
						} else {
							$this->addons_attributes[] = $this->remove_prefix( $_value['id'], $name . '_' );
						}
					}
				}
			}
		}
	}
}
includes/classes/class-themecomplete-epo-display.php000064400000376731150755142450016733 0ustar00<?php
/**
 * Extra Product Options Frontend Display
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Frontend Display
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_Display {

	/**
	 * If both the options and the totals box have been displayed or not
	 *
	 * Prevents option duplication for bad coded themes.
	 *
	 * @var boolean
	 */
	public $tm_options_have_been_displayed = false;

	/**
	 * If the options has been displayed or not
	 *
	 * @var boolean
	 */
	public $tm_options_single_have_been_displayed = false;

	/**
	 * If the totals box has been displayed or not
	 *
	 * @var boolean
	 */
	public $tm_options_totals_have_been_displayed = false;

	/**
	 * The id of the current set of options
	 *
	 * @var integer
	 */
	private $epo_id = 0;

	/**
	 * The current id of the set of options displayed
	 *
	 * This is different from $epo_id as it supports
	 * the product element.
	 *
	 * @var integer
	 */
	private $epo_internal_counter = 0;

	/**
	 * Array of the $epo_internal_counter
	 *
	 * @var array<mixed>
	 */
	private $epo_internal_counter_check = [];

	/**
	 * The original $epo_internal_counter
	 *
	 * Used when printing options for the product element.
	 *
	 * @var integer
	 */
	private $original_epo_internal_counter = 0;

	/**
	 * The id of the product the options belong to.
	 *
	 * @var integer
	 */
	private $current_product_id_to_be_displayed = 0;

	/**
	 * Array of the $current_product_id_to_be_displayed
	 *
	 * @var array<mixed>
	 */
	private $current_product_id_to_be_displayed_check = [];

	/**
	 * Inline styles printed at totals box
	 *
	 * @var string
	 */
	public $inline_styles;

	/**
	 * Inline styles printed at html head
	 *
	 * @var string
	 */
	public $inline_styles_head;

	/**
	 * Unique form prefix
	 *
	 * @var string
	 */
	public $unique_form_prefix = '';

	/**
	 * Associated product discount
	 *
	 * @var string
	 */
	private $discount = '';

	/**
	 * Associated product discount type
	 *
	 * @var string
	 */
	private $discount_type = '';

	/**
	 * If the associated product discount is applied to the addons
	 *
	 * @var string
	 */
	public $discount_exclude_addons = '';

	/**
	 * Flag to blocking option display
	 *
	 * @var boolean
	 */
	public $block_epo = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Display|null
	 * @since 1.0
	 */
	protected static $instance = null;


	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Display
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		$this->inline_styles      = '';
		$this->inline_styles_head = '';

		// Display in frontend.
		add_action( 'woocommerce_tm_epo', [ $this, 'frontend_display' ], 10, 3 );
		add_action( 'woocommerce_tm_epo_fields', [ $this, 'tm_epo_fields' ], 10, 4 );
		add_action( 'woocommerce_tm_epo_totals', [ $this, 'tm_epo_totals' ], 10, 3 );

		// Display in frontend (Compatibility for older plugin versions).
		add_action( 'woocommerce_tm_custom_price_fields', [ $this, 'frontend_display' ] );
		add_action( 'woocommerce_tm_custom_price_fields_only', [ $this, 'tm_epo_fields' ] );
		add_action( 'woocommerce_tm_custom_price_fields_totals', [ $this, 'tm_epo_totals' ] );

		// Ensures the correct display order of options when multiple products are displayed.
		add_action( 'woocommerce_before_single_product', [ $this, 'woocommerce_before_single_product' ], 1 );
		add_action( 'woocommerce_after_single_product', [ $this, 'woocommerce_after_single_product' ], 9999 );

		// Internal variables.
		add_action( 'woocommerce_before_add_to_cart_button', [ $this, 'woocommerce_before_add_to_cart_button' ] );

		// Add custom inline css.
		add_action( 'template_redirect', [ $this, 'tm_variation_css_check' ], 9999 );

		// Alter the array of data for a variation. Used in the add to cart form.
		add_filter( 'woocommerce_available_variation', [ $this, 'woocommerce_available_variation' ], 10, 3 );

		// Add support for WooCommerce shortcodes on custom pages.
		add_filter( 'woocommerce_loop_add_to_cart_args', [ $this, 'woocommerce_loop_add_to_cart_args' ], 10, 1 );
	}

	/**
	 * Add support for WooCommerce shortcodes on custom pages
	 *
	 * @param array<mixed> $args Array of arguements.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function woocommerce_loop_add_to_cart_args( $args = [] ) {
		if ( $this->epo_id > 0 ) {
			$args['attributes']['data-epo-id'] = $this->epo_id;
		}
		return $args;
	}

	/**
	 * Apply asoociated product discount
	 *
	 * @param string $discount Associated product discount.
	 * @param string $discount_type Associated product discount type.
	 * @param string $discount_exclude_addons If the associated product discount is applied to the addons.
	 * @return void
	 * @since 5.0.8
	 */
	public function set_discount( $discount = '', $discount_type = '', $discount_exclude_addons = '' ) {
		$this->discount                = $discount;
		$this->discount_type           = $discount_type;
		$this->discount_exclude_addons = $discount_exclude_addons;
	}

	/**
	 * Change internal epo counter
	 * Currently used for associated products
	 *
	 * @param integer $counter The value to set for the internal epo counter.
	 * @return void
	 * @since 5.0.8
	 */
	public function set_epo_internal_counter( $counter = 0 ) {
		$this->original_epo_internal_counter = $this->epo_internal_counter;
		$this->epo_internal_counter          = $counter;
	}

	/**
	 * Restore internal epo counter
	 * Currently used for associated products
	 *
	 * @return void
	 * @since 5.0.8
	 */
	public function restore_epo_internal_counter() {
		$this->epo_internal_counter = $this->original_epo_internal_counter;
	}

	/**
	 * Returns the path for overriding the templates
	 *
	 * @return string
	 * @since 6.0
	 */
	public function get_template_path() {
		return apply_filters( 'wc_epo_template_override_path', THEMECOMPLETE_EPO_NAMESPACE . '/' );
	}

	/**
	 * Returns the default path for the templates
	 *
	 * @return string
	 * @since 6.0
	 */
	public function get_default_path() {
		return apply_filters( 'wc_epo_default_template_path', THEMECOMPLETE_EPO_TEMPLATE_PATH );
	}


	/**
	 * Get the tax rate of the given tax classes
	 *
	 * @param string $classes Tax class.
	 *
	 * @return float|integer
	 */
	public function get_tax_rate( $classes ) {
		return themecomplete_get_tax_rate( $classes );
	}

	/**
	 * Add validation rules
	 *
	 * @param array<mixed> $element The element array.
	 * @return array<mixed>
	 */
	public function get_tm_validation_rules( $element ) {
		$rules = [];
		if ( $element['required'] ) {
			$rules['required'] = true;
		}
		if ( isset( $element['min_chars'] ) && '' !== $element['min_chars'] && false !== $element['min_chars'] ) {
			$rules['minlength'] = absint( $element['min_chars'] );
		}
		if ( isset( $element['max_chars'] ) && '' !== $element['max_chars'] && false !== $element['max_chars'] ) {
			$rules['maxlength'] = absint( $element['max_chars'] );
		}
		if ( isset( $element['min'] ) && '' !== $element['min'] && ( 'number' === $element['validation1'] || 'digits' === $element['validation1'] ) ) {
			$rules['min'] = floatval( $element['min'] );
		}
		if ( isset( $element['max'] ) && '' !== $element['max'] && ( 'number' === $element['validation1'] || 'digits' === $element['validation1'] ) ) {
			$rules['max'] = floatval( $element['max'] );
		}
		if ( ! empty( $element['validation1'] ) ) {
			$rules[ $element['validation1'] ] = true;
		}
		if ( ! empty( $element['repeater'] ) && ! empty( $element['repeater_min_rows'] ) ) {
			$rules['repeaterminrows'] = $element['repeater_min_rows'];
		}
		if ( ! empty( $element['repeater'] ) && ! empty( $element['repeater_max_rows'] ) ) {
			$rules['repeatermaxrows'] = $element['repeater_max_rows'];
		}

		return $rules;
	}

	/**
	 * Alter the array of data for a variation.
	 * Used in the add to cart form.
	 *
	 * @param array<mixed>        $args Array of variation arguments.
	 * @param WC_Product_Variable $class_obj The WC_Product_Variable class.
	 * @param WC_Product          $variation Variation product object or ID.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_available_variation( $args, $class_obj, $variation ) {
		if ( apply_filters( 'wc_epo_woocommerce_available_variation_check', true ) && ! ( THEMECOMPLETE_EPO()->can_load_scripts() || wp_doing_ajax() ) && ! ( isset( $_REQUEST['wc-ajax'] ) && 'get_variation' === $_REQUEST['wc-ajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return $args;
		}

		if ( is_array( $args ) ) {

			$tax_rate = $this->get_tax_rate( themecomplete_get_tax_class( $variation ) );

			$taxes_of_one        = 0;
			$base_taxes_of_one   = 0;
			$modded_taxes_of_one = 0;

			$non_base_location_prices = -1;
			$base_tax_rate            = $tax_rate;

			if ( class_exists( 'WC_Tax' ) && version_compare( get_option( 'woocommerce_version' ), '2.4', '>=' ) ) {
				$tax_rates      = WC_Tax::get_rates( themecomplete_get_tax_class( $variation ) );
				$base_tax_rates = WC_Tax::get_base_tax_rates( themecomplete_get_tax_class( $variation ) );
				$base_tax_rate  = 0;
				foreach ( $base_tax_rates as $key => $value ) {
					$base_tax_rate = $base_tax_rate + floatval( $value['rate'] );
				}

				$non_base_location_prices = true === ( $tax_rates !== $base_tax_rates && apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) ? '1' : '0';

				$precision    = wc_get_rounding_precision();
				$price_of_one = 1 * ( pow( 10, $precision ) );

				if ( $non_base_location_prices ) {
					$prices_include_tax = true;
				} else {
					$prices_include_tax = wc_prices_include_tax();
				}

				$taxes_of_one        = array_sum( WC_Tax::calc_tax( $price_of_one, $tax_rates, wc_prices_include_tax() ) );
				$base_taxes_of_one   = array_sum( WC_Tax::calc_tax( $price_of_one, $base_tax_rates, true ) );
				$modded_taxes_of_one = array_sum( WC_Tax::calc_tax( $price_of_one - $base_taxes_of_one, $tax_rates, false ) );

				$taxes_of_one        = $taxes_of_one / ( pow( 10, $precision ) );
				$base_taxes_of_one   = $base_taxes_of_one / ( pow( 10, $precision ) );
				$modded_taxes_of_one = $modded_taxes_of_one / ( pow( 10, $precision ) );
			}

			$args['tc_tax_rate']                 = $tax_rate;
			$args['tc_is_taxable']               = $variation->is_taxable();
			$args['tc_base_tax_rate']            = $base_tax_rate;
			$args['tc_base_taxes_of_one']        = $base_taxes_of_one;
			$args['tc_taxes_of_one']             = $taxes_of_one;
			$args['tc_modded_taxes_of_one']      = $modded_taxes_of_one;
			$args['tc_non_base_location_prices'] = $non_base_location_prices;
			$args['tc_is_on_sale']               = $variation->is_on_sale();
			if ( isset( $_REQUEST['discount_type'] ) && isset( $_REQUEST['discount'] ) && ! empty( $_REQUEST['discount'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$current_price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $variation->get_price(), sanitize_text_field( wp_unslash( $_REQUEST['discount'] ) ), sanitize_text_field( wp_unslash( $_REQUEST['discount_type'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$variation->set_sale_price( $current_price );
				$variation->set_price( $current_price );

				// See if prices should be shown for each variation after selection.
				$show_variation_price = apply_filters( 'woocommerce_show_variation_price', $variation->get_price() === '' || $class_obj->get_variation_sale_price( 'min' ) !== $class_obj->get_variation_sale_price( 'max' ) || $class_obj->get_variation_regular_price( 'min' ) !== $class_obj->get_variation_regular_price( 'max' ), $class_obj, $variation );

				$args['display_price'] = wc_get_price_to_display( $variation );
				$args['price_html']    = $show_variation_price ? '<span class="price">' . $variation->get_price_html() . '</span>' : '';
			}
		}

		return $args;
	}

	/**
	 * This loads only on quick view modules
	 * and on the ajax request of composite bundles
	 * and it is required in order to show custom styles
	 *
	 * @return void
	 * @since 4.8
	 */
	public function tm_add_inline_style_qv() {
		if ( ! empty( $this->inline_styles ) ) {
			global $wp_scripts;
			$wp_scripts = new WP_Scripts(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			$this->tm_add_inline_style_reg();
			wp_print_footer_scripts();
		}
	}

	/**
	 * Register inline styles
	 *
	 * @return void
	 * @since 4.8
	 */
	public function tm_add_inline_style_reg() {
		if ( ! empty( $this->inline_styles ) ) {
			wp_register_style( 'themecomplete-styles-footer', false, [], THEMECOMPLETE_EPO_VERSION );
			wp_add_inline_style( 'themecomplete-styles-footer', $this->inline_styles );
			wp_enqueue_style( 'themecomplete-styles-footer' );
			$this->inline_styles = '';
		}
	}

	/**
	 * Handles any extra styling associated with the fields
	 *
	 * @return void
	 * @since 4.8
	 */
	public function tm_add_inline_style() {
		if ( ! empty( $this->inline_styles ) ) {
			if ( THEMECOMPLETE_EPO()->is_quick_view() || ( wp_doing_ajax() && ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) ) {
				$this->tm_add_inline_style_qv();
			} else {
				$this->tm_add_inline_style_reg();
			}
		}
	}

	/**
	 * Handles any extra styling associated with the fields
	 *
	 * @return void
	 * @param string $css_string CSS code to add.
	 * @since 4.8.5
	 */
	public function add_inline_style( $css_string = '' ) {
		$this->inline_styles = $this->inline_styles . $css_string;
	}

	/**
	 * Add custom inline css
	 * Used to hide the native variations
	 *
	 * @param integer $output If the result should be displayed or retuned.
	 * @param integer $product_id The product id.
	 * @return void
	 * @since 1.0
	 */
	public function tm_variation_css_check( $output = 0, $product_id = 0 ) {
		if ( ! is_product() ) {
			return;
		}

		$post_id = get_the_ID();

		if ( $product_id && $product_id !== $post_id ) {
			$post_id = $product_id;
		}

		$post_id = floatval( $post_id );

		$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id, 'product' ) );

		if ( $original_product_id !== $post_id ) {
			$post_id = $original_product_id;
		}

		$has_epo = THEMECOMPLETE_EPO_API()->has_options( $post_id );

		if ( false !== $has_epo && is_array( $has_epo ) ) {
			$row_gap          = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_row_gap' );
			$column_gap       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_column_gap' );
			$inner_row_gap    = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_row_inner_gap' );
			$inner_column_gap = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_column_inner_gap' );

			$css_string = ':root {';

			if ( '' !== $row_gap ) {
				$row_gap     = '15px';
				$css_string .= '--tcgaprow: ' . $row_gap . ';';
			}

			if ( '' !== $column_gap ) {
				$column_gap  = '15px';
				$css_string .= '--tcgapcolumn: ' . $column_gap . ';';
			}

			if ( '' !== $inner_row_gap ) {
				$inner_row_gap = 'calc(var(--tcgaprow) / 2)';
				$css_string   .= '--tcinnergaprow: ' . $inner_row_gap . ';';
			}

			if ( '' !== $inner_column_gap ) {
				$inner_column_gap = 'calc(var(--tcgapcolumn) / 2)';
				$css_string      .= '--tcinnergapcolumn: ' . $inner_column_gap . ';';
			}

			$css_string .= '}';

			// $tcgap      = $row_gap . ' ' . $column_gap;
			// $tcinnergap = $inner_row_gap . ' ' . $inner_column_gap;

			// $css_string .= ':root {--tcgap: ' . $tcgap . ';--tcinnergap: ' . $tcinnergap . ';}';

			$this->inline_styles_head = $this->inline_styles_head . $css_string;
			if ( isset( $has_epo['variations'] ) && true === $has_epo['variations'] && empty( $has_epo['variations_disabled'] ) ) {
				if ( $product_id ) {
					$css_string = '#product-' . $product_id . ' form .variations,.post-' . $product_id . ' form .variations {display:none;}';
				} else {
					$css_string = 'form .variations{display:none;}';
				}

				$this->inline_styles_head = $this->inline_styles_head . $css_string;
			}
			if ( $output ) {
				$this->tm_variation_css_check_do();
			} else {
				add_action( 'wp_enqueue_scripts', [ $this, 'tm_variation_css_check_do' ], 6 );
			}
		}
	}

	/**
	 * Print inline css
	 *
	 * @return void
	 * @see tm_variation_css_check
	 * @since 1.0
	 */
	public function tm_variation_css_check_do() {
		if ( ! empty( $this->inline_styles_head ) ) {
			wp_register_style( 'themecomplete-styles-header', false, [], THEMECOMPLETE_EPO_VERSION );
			wp_add_inline_style( 'themecomplete-styles-header', $this->inline_styles_head );
			wp_enqueue_style( 'themecomplete-styles-header' );
		}
	}

	/**
	 * Internal variables
	 *
	 * @param integer|false $product_id The product id.
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_before_add_to_cart_button( $product_id = false ) {
		if ( $product_id ) {
			$pid = $product_id;
		} else {
			global $product;
			$pid = themecomplete_get_id( $product );
		}

		$print_inputs = false;
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' ) ) {
			$print_inputs = true;
		} else {
			$has_epo = THEMECOMPLETE_EPO_API()->has_options( $pid );
			if ( false !== $has_epo && is_array( $has_epo ) ) {
				$print_inputs = true;
			}
		}

		if ( $print_inputs ) {
			++$this->epo_id;
			echo '<input type="hidden" class="tm-epo-counter" name="tm-epo-counter" value="' . esc_attr( (string) $this->epo_id ) . '">';
			if ( ! empty( $pid ) ) {
				echo '<input type="hidden" data-epo-id="' . esc_attr( (string) $this->epo_id ) . '" class="tc-add-to-cart" name="tcaddtocart" value="' . esc_attr( (string) $pid ) . '">';
			}
		}
	}

	/**
	 * Ensures the correct display order of options when multiple products are displayed
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_before_single_product() {
		global $woocommerce;
		if ( ! property_exists( $woocommerce, 'product_factory' ) || null === $woocommerce->product_factory ) {
			return;// bad function call.
		}
		global $product;
		if ( $product ) {
			if ( ! is_product() ) {
				$this->tm_variation_css_check( 1, themecomplete_get_id( $product ) );
			}
			$this->current_product_id_to_be_displayed = themecomplete_get_id( $product );
			$this->current_product_id_to_be_displayed_check[ 'tc-' . count( $this->current_product_id_to_be_displayed_check ) . '-' . $this->current_product_id_to_be_displayed ] = $this->current_product_id_to_be_displayed;
		}
	}

	/**
	 * Ensures the correct display order of options when multiple products are displayed
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_after_single_product() {
		$this->current_product_id_to_be_displayed = 0;
		$this->unique_form_prefix                 = '';
	}

	/**
	 * Handles the display of all the extra options on the product page.
	 *
	 * IMPORTANT:
	 * We do not support plugins that pollute the global $woocommerce.
	 *
	 * @param integer $product_id The product id.
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $dummy_prefix If we should use the form prefix.
	 * @return void
	 */
	public function frontend_display( $product_id = 0, $form_prefix = '', $dummy_prefix = false ) {
		if ( $this->block_epo ) {
			return;
		}

		global $product, $woocommerce;
		if ( ! property_exists( $woocommerce, 'product_factory' )
			|| null === $woocommerce->product_factory
			|| ( $this->tm_options_have_been_displayed && ( ! ( THEMECOMPLETE_EPO()->is_bto || ( THEMECOMPLETE_EPO()->is_enabled_shortcodes() && ! is_product() ) || ( ( is_shop() || is_product_category() || is_product_tag() ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) ) ) ) )
		) {
			return;// bad function call.
		}

		$this->tm_epo_fields( $product_id, $form_prefix, false, $dummy_prefix );
		$this->tm_add_inline_style();
		$this->tm_epo_totals( $product_id, $form_prefix );
		if ( ! THEMECOMPLETE_EPO()->is_bto ) {
			$this->tm_options_have_been_displayed = true;
		}
	}

	/**
	 * Batch add plugin options
	 *
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $dummy_prefix If we should use the form prefix.
	 * @return void
	 */
	private function tm_epo_fields_batch( $form_prefix = '', $dummy_prefix = false ) {
		foreach ( $this->current_product_id_to_be_displayed_check as $key => $product_id ) {
			if ( ! empty( $product_id ) ) {
				$this->inline_styles      = '';
				$this->inline_styles_head = '';

				$this->tm_variation_css_check( 1, $product_id );

				$this->tm_epo_fields( $product_id, $form_prefix, false, $dummy_prefix );
				$this->tm_add_inline_style();

				if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ) === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ) ) {
					$this->tm_epo_totals( $product_id, $form_prefix );
				} elseif ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
					unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );
				}
			}
		}
		if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
			if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ) !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ) ) {
				$this->epo_internal_counter       = 0;
				$this->epo_internal_counter_check = [];
			}
		}
	}

	/**
	 * Display the options in the frontend
	 *
	 * @param mixed   $product_id The product id.
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $is_from_shortcode If we are in a shortcode.
	 * @param boolean $dummy_prefix If we should use the form prefix.
	 * @return void
	 */
	public function tm_epo_fields( $product_id = 0, $form_prefix = '', $is_from_shortcode = false, $dummy_prefix = false ) {
		if ( $this->block_epo ) {
			return;
		}

		global $woocommerce;

		if ( ! empty( $GLOBALS['THEMECOMPLETE_IS_FROM_SHORTCODE'] ) ) {
			$is_from_shortcode = true;
		}

		if ( ! property_exists( $woocommerce, 'product_factory' )
			|| null === $woocommerce->product_factory
			|| ( $this->tm_options_have_been_displayed && ( ! ( THEMECOMPLETE_EPO()->is_bto || ( ( THEMECOMPLETE_EPO()->is_enabled_shortcodes() && ! $is_from_shortcode ) && ! is_product() ) || ( ( is_shop() || is_product_category() || is_product_tag() ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) ) ) ) )
		) {
			return;// bad function call.
		}

		if ( $product_id instanceof WC_Product ) {
			$product    = $product_id;
			$product_id = themecomplete_get_id( $product );
		} elseif ( ! $product_id ) {
			global $product;
			if ( $product ) {
				$product_id = themecomplete_get_id( $product );
			}
		} else {
			$product = wc_get_product( $product_id );
		}

		if ( ! $product_id || empty( $product ) ) {
			if ( ! empty( $this->current_product_id_to_be_displayed ) ) {
				$product_id = $this->current_product_id_to_be_displayed;
				$product    = wc_get_product( $product_id );
			} else {
				$this->tm_epo_fields_batch( $form_prefix, $dummy_prefix );

				return;
			}
		}

		if ( ! $product_id || empty( $product ) ) {
			return;
		}

		$type = themecomplete_get_product_type( $product );

		if ( 'grouped' === $type ) {
			return;
		}

		// Always dispay composite hidden fields if product is composite.
		if ( $form_prefix ) {
			$_bto_id     = $form_prefix;
			$form_prefix = '_' . $form_prefix;
			if ( THEMECOMPLETE_EPO()->is_bto ) {
				echo '<input type="hidden" class="cpf-bto-id" name="cpf_bto_id[]" value="' . esc_attr( $form_prefix ) . '">';
				echo '<input type="hidden" value="" name="cpf_bto_price[' . esc_attr( $_bto_id ) . ']" class="cpf-bto-price">';
				echo '<input type="hidden" value="0" name="cpf_bto_optionsprice[]" class="cpf-bto-optionsprice">';
			}
		}

		if ( ! $form_prefix ) {
			if ( THEMECOMPLETE_EPO()->is_quick_view() ) {
				if ( ! $this->unique_form_prefix ) {
					$this->unique_form_prefix = uniqid( '' );
				}
				$form_prefix = '_tcform' . $this->unique_form_prefix;
			} elseif ( THEMECOMPLETE_EPO()->wc_vars['is_page'] ) {
				// Workaroung to cover options in pages.
				if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
					$temp_this_epo_internal_counter = $this->epo_internal_counter;
					if ( empty( $temp_this_epo_internal_counter ) || ! isset( $this->epo_internal_counter_check[ 'tc' . $temp_this_epo_internal_counter ] ) ) {
						// First time displaying the fields and totals haven't been displayed.
						++$temp_this_epo_internal_counter;
					}
					$temp_epo_internal_counter = $temp_this_epo_internal_counter;
				} else {
					$temp_epo_internal_counter = 0;
				}

				$form_prefix = '_tcform' . $temp_epo_internal_counter;
			}
		}

		$post_id = $product_id;

		$cpf_price_array = THEMECOMPLETE_EPO()->get_product_tm_epos( $post_id, $form_prefix );

		if ( ! $cpf_price_array ) {
			return;
		}
		$global_price_array = $cpf_price_array['global'];
		$local_price_array  = $cpf_price_array['local'];

		if ( empty( $global_price_array ) && empty( $local_price_array ) ) {
			if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
				if ( empty( $this->epo_internal_counter ) || ! isset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] ) ) {
					// First time displaying the fields and totals haven't been displayed.
					++$this->epo_internal_counter;
					$this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] = $this->epo_internal_counter;
				} else {
					// Totals have already been displayed.
					unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );

					$this->current_product_id_to_be_displayed = 0;
					$this->unique_form_prefix                 = '';
				}
				$_epo_internal_counter = $this->epo_internal_counter;
			} else {
				$_epo_internal_counter = 0;
			}

			return;
		}

		$global_prices = [
			'before' => [],
			'after'  => [],
		];
		foreach ( $global_price_array as $priority => $priorities ) {
			foreach ( $priorities as $pid => $field ) {
				if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {
					foreach ( $field['sections'] as $section_id => $section ) {
						if ( isset( $section['sections_placement'] ) ) {
							$global_prices[ $section['sections_placement'] ][ $priority ][ $pid ]['sections'][ $section_id ] = $section;
						}
					}
				}
			}
		}

		$tabindex          = 0;
		$_currency         = get_woocommerce_currency_symbol();
		$unit_counter      = 0;
		$field_counter     = 0;
		$element_counter   = 0;
		$d_element_counter = 0;
		$connectors        = [];

		if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
			if ( empty( $this->epo_internal_counter ) || ! isset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] ) ) {
				// First time displaying the fields and totals haven't been displayed.
				++$this->epo_internal_counter;
				$this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] = $this->epo_internal_counter;
			} else {
				// Totals have already been displayed.
				unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );

				$this->current_product_id_to_be_displayed = 0;
				$this->unique_form_prefix                 = '';
			}
			$_epo_internal_counter = $this->epo_internal_counter;
		} elseif ( THEMECOMPLETE_EPO()->is_inline_epo && $this->epo_internal_counter ) {
			$_epo_internal_counter = $this->epo_internal_counter;
		} else {
			$_epo_internal_counter = 0;
		}

		$forcart   = 'main';
		$classcart = 'tm-cart-main';
		if ( ! empty( $form_prefix ) ) {
			$forcart   = $form_prefix;
			$classcart = 'tm-cart-' . str_replace( '_', '', $form_prefix );
		}
		$isfromshortcode = '';
		if ( ! empty( $is_from_shortcode ) ) {
			$isfromshortcode = ' tc-shortcode';
		}

		global $wp_filter;
		$saved_filter = false;
		if ( isset( $wp_filter['image_downsize'] ) ) {
			$saved_filter = $wp_filter['image_downsize'];
			unset( $wp_filter['image_downsize'] );
		}

		wc_get_template(
			'tm-start.php',
			[
				'isfromshortcode'      => $isfromshortcode,
				'classcart'            => $classcart,
				'forcart'              => $forcart,
				'form_prefix'          => str_replace( '_', '', $form_prefix ),
				'product_id'           => $product_id,
				'epo_internal_counter' => $_epo_internal_counter,
				'is_from_shortcode'    => $is_from_shortcode,
			],
			$this->get_template_path(),
			$this->get_default_path()
		);

		if ( ( ! empty( THEMECOMPLETE_EPO()->cart_edit_key ) && isset( $_GET['_wpnonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'tm-edit' ) ) || ( ! empty( THEMECOMPLETE_EPO()->cart_edit_key ) && isset( $_REQUEST['update-composite'] ) ) ) {
			if ( isset( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ] ) ) {
				if ( ! empty( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmdata'] ) ) {
					if ( ! empty( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmdata']['tmcp_post_fields'] ) && is_array( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmdata']['tmcp_post_fields'] ) ) {
						$tmcp_post_fields  = WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmdata']['tmcp_post_fields'];
						$saved_form_prefix = WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmdata']['form_prefix'];
						foreach ( $tmcp_post_fields as $posted_name => $posted_value ) {
							if ( '' !== $saved_form_prefix ) {
								$posted_name = str_replace( $saved_form_prefix, '', $posted_name );
							}
							$_REQUEST[ $posted_name ] = $posted_value;
						}
					}
				}
			}
		}

		// global options before local.
		foreach ( $global_prices['before'] as $prio => $priorities ) {
			foreach ( $priorities as $gid => $field ) {
				$args    = [
					'tabindex'          => $tabindex,
					'unit_counter'      => $unit_counter,
					'field_counter'     => $field_counter,
					'element_counter'   => $element_counter,
					'd_element_counter' => $d_element_counter,
					'_currency'         => $_currency,
					'product_id'        => $product_id,
					'connectors'        => $connectors,
					'gid'               => $gid,
				];
				$_return = $this->get_builder_display( $post_id, $field, 'before', $args, $form_prefix, $dummy_prefix );

				$tabindex          = $_return['tabindex'];
				$unit_counter      = $_return['unit_counter'];
				$field_counter     = $_return['field_counter'];
				$element_counter   = $_return['element_counter'];
				$d_element_counter = $_return['d_element_counter'];
				$_currency         = $_return['_currency'];
				$connectors        = $_return['connectors'];
			}
		}

		$args    = [
			'tabindex'          => $tabindex,
			'unit_counter'      => $unit_counter,
			'field_counter'     => $field_counter,
			'element_counter'   => $element_counter,
			'd_element_counter' => $d_element_counter,
			'_currency'         => $_currency,
			'product_id'        => $product_id,
		];
		$_return = $this->get_normal_display( $local_price_array, $args, $form_prefix, $dummy_prefix );

		$tabindex        = $_return['tabindex'];
		$unit_counter    = $_return['unit_counter'];
		$field_counter   = $_return['field_counter'];
		$element_counter = $_return['element_counter'];
		$_currency       = $_return['_currency'];

		// global options after local.
		foreach ( $global_prices['after'] as $priorities ) {
			foreach ( $priorities as $gid => $field ) {
				$args    = [
					'tabindex'          => $tabindex,
					'unit_counter'      => $unit_counter,
					'field_counter'     => $field_counter,
					'element_counter'   => $element_counter,
					'd_element_counter' => $d_element_counter,
					'_currency'         => $_currency,
					'product_id'        => $product_id,
					'connectors'        => $connectors,
					'gid'               => $gid,
				];
				$_return = $this->get_builder_display( $post_id, $field, 'after', $args, $form_prefix, $dummy_prefix );

				$tabindex          = $_return['tabindex'];
				$unit_counter      = $_return['unit_counter'];
				$field_counter     = $_return['field_counter'];
				$element_counter   = $_return['element_counter'];
				$d_element_counter = $_return['d_element_counter'];
				$_currency         = $_return['_currency'];
				$connectors        = $_return['connectors'];
			}
		}

		wc_get_template(
			'tm-end.php',
			[],
			$this->get_template_path(),
			$this->get_default_path()
		);

		if ( $saved_filter ) {
			$wp_filter['image_downsize'] = $saved_filter; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
		}

		$this->tm_options_single_have_been_displayed = true;
	}

	/**
	 * Displays the option created from the builder mode
	 *
	 * @param integer      $post_id The post id.
	 * @param array<mixed> $field The field options array.
	 * @param string       $where The field placement 'before' or 'after'.
	 * @param array<mixed> $vars The variable arguemnts.
	 * @param string       $form_prefix The form prefix.
	 * @param boolean      $dummy_prefix If we should use the form prefix.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_builder_display( $post_id, $field, $where, $vars, $form_prefix = '', $dummy_prefix = false ) {
		if ( ! $post_id ) {
			$post_id = 0;
		}
		$columns = [];
		for ( $x = 1; $x <= 100; $x++ ) {
			$columns[ 'w' . $x ] = [ 'tcwidth tcwidth-' . $x, $x ];
		}
		$columns['w12-5'] = [ 'tcwidth tcwidth-12-5', 12.5 ];
		$columns['w37-5'] = [ 'tcwidth tcwidth-37-5', 37.5 ];
		$columns['w62-5'] = [ 'tcwidth tcwidth-62-5', 62.5 ];
		$columns['w87-5'] = [ 'tcwidth tcwidth-87-5', 87.5 ];

		$tabindex          = $vars['tabindex'];
		$unit_counter      = $vars['unit_counter'];
		$field_counter     = $vars['field_counter'];
		$element_counter   = $vars['element_counter'];
		$d_element_counter = $vars['d_element_counter'];
		$_currency         = $vars['_currency'];
		$product_id        = $vars['product_id'];
		$connectors        = $vars['connectors'];
		$gid               = isset( $vars['gid'] ) ? $vars['gid'] : '0';

		$element_type_counter = [];

		if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {

			$vars = [
				'field_id' => 'tc-epo-form-' . $gid . '-' . $unit_counter,
			];
			wc_get_template(
				'tm-builder-start.php',
				$vars,
				$this->get_template_path(),
				$this->get_default_path()
			);

			$_section_totals = 0;

			foreach ( $field['sections'] as $section ) {
				if ( ! isset( $section['sections_placement'] ) || $section['sections_placement'] !== $where ) {
					continue;
				}
				if ( isset( $section['sections_size'] ) && isset( $columns[ $section['sections_size'] ] ) ) {
					$size = $columns[ $section['sections_size'] ][0];
				} else {
					$size = 'tcwidth tcwidth-100';
				}

				$_section_totals = $_section_totals + $columns[ $section['sections_size'] ][1];
				if ( $_section_totals > 100 ) {
					$_section_totals = $columns[ $section['sections_size'] ][1];
				}

				$divider = isset( $section['divider_type'] ) ? $section['divider_type'] : '';

				$label_size = 'h3';
				if ( ! empty( $section['label_size'] ) ) {
					switch ( $section['label_size'] ) {
						case '1':
							$label_size = 'h1';
							break;
						case '2':
							$label_size = 'h2';
							break;
						case '3':
							$label_size = 'h3';
							break;
						case '4':
							$label_size = 'h4';
							break;
						case '5':
							$label_size = 'h5';
							break;
						case '6':
							$label_size = 'h6';
							break;
						case '7':
							$label_size = 'p';
							break;
						case '8':
							$label_size = 'div';
							break;
						case '9':
							$label_size = 'span';
							break;
					}
				}

				$section_args = [
					'column'                       => $size,
					'style'                        => $section['sections_style'],
					'uniqid'                       => $section['sections_uniqid'],
					'logic'                        => wp_json_encode( (array) json_decode( wp_unslash( $section['sections_logicrules'] ) ) ),
					'haslogic'                     => $section['sections_logic'],
					'sections_class'               => $section['sections_class'],
					'sections_type'                => $section['sections_type'],
					'sections_popupbutton'         => $section['sections_popupbutton'],
					'sections_popupbuttontext'     => $section['sections_popupbuttontext'],
					'sections_background_color'    => $section['sections_background_color'],
					'label_background_color'       => $section['label_background_color'],
					'description_background_color' => $section['description_background_color'],
					'label_size'                   => $label_size,
					'label'                        => ! empty( $section['label'] ) ? $section['label'] : '',
					'label_color'                  => ! empty( $section['label_color'] ) ? $section['label_color'] : '',
					'label_position'               => ! empty( $section['label_position'] ) ? $section['label_position'] : '',
					'description'                  => ! empty( $section['description'] ) ? $section['description'] : '',
					'description_color'            => ! empty( $section['description_color'] ) ? $section['description_color'] : '',
					'description_position'         => ! empty( $section['description_position'] ) ? $section['description_position'] : '',
					'divider'                      => $divider,
				];

				$css                 = '';
				$labelbgclass        = '';
				$descriptionclass    = '';
				$sectionbgcolorclass = '';
				if ( ! empty( $section_args['label_color'] ) ) {
					$css .= '.tc-epo-label.color-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['label_color'] ) ) . '{color:' . esc_attr( themecomplete_sanitize_hex_color( $section_args['label_color'] ) ) . ';}';
				}
				if ( '' !== $section_args['style'] && ! empty( $section_args['label_background_color'] ) ) {
					$css          .= '.tc-epo-label.bgcolor-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['label_background_color'] ) ) . '{background:' . esc_attr( themecomplete_sanitize_hex_color( $section_args['label_background_color'] ) ) . ';}';
					$labelbgclass .= ' bgcolor-' . themecomplete_sanitize_hex_color_no_hash( $section_args['label_background_color'] );
				}
				if ( ! empty( $section_args['description_color'] ) ) {
					$css              .= '.tm-section-description.color-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['description_color'] ) ) . '{color:' . esc_attr( themecomplete_sanitize_hex_color( $section_args['description_color'] ) ) . ';}';
					$descriptionclass .= ' color-' . themecomplete_sanitize_hex_color_no_hash( $section_args['description_color'] );
				}
				if ( '' !== $section_args['style'] && ! empty( $section_args['description_background_color'] ) ) {
					$css              .= '.tm-section-description.bgcolor-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['description_background_color'] ) ) . '{background:' . esc_attr( themecomplete_sanitize_hex_color( $section_args['description_background_color'] ) ) . ';}';
					$descriptionclass .= ' bgcolor-' . themecomplete_sanitize_hex_color_no_hash( $section_args['description_background_color'] );
				}
				if ( '' !== $section_args['style'] && ! empty( $section_args['sections_background_color'] ) ) {
					$css                .= '.tm-collapse.bgcolor-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['sections_background_color'] ) ) . ',.tm-box.bgcolor-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $section_args['sections_background_color'] ) ) . '{background:' . esc_attr( themecomplete_sanitize_hex_color( $section_args['sections_background_color'] ) ) . ';}';
					$sectionbgcolorclass = 'bgcolor-' . themecomplete_sanitize_hex_color_no_hash( $section_args['sections_background_color'] );
				}
				$this->add_inline_style( $css );
				$section_args['labelbgclass']        = $labelbgclass;
				$section_args['descriptionclass']    = $descriptionclass;
				$section_args['sectionbgcolorclass'] = $sectionbgcolorclass;

				// Custom variations check.
				if (
					isset( $section['elements'] )
					&& is_array( $section['elements'] )
					&& isset( $section['elements'][0] )
					&& is_array( $section['elements'][0] )
					&& isset( $section['elements'][0]['type'] )
					&& 'variations' === $section['elements'][0]['type']
				) {
					if ( 'variation' === THEMECOMPLETE_EPO()->associated_type ) {
						continue;
					}
					$section_args['sections_class'] = $section_args['sections_class'] . ' tm-epo-variation-section tc-clearfix';

					if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
						$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $post_id, 'product' );
					}
					if ( ( isset( $wpml_is_original_product ) && empty( $wpml_is_original_product ) ) ) {
						if (
							isset( $section['elements'][0]['original_builder'] ) &&
							isset( $section['elements'][0]['original_builder']['variations_disabled'] ) &&
							(int) 1 === (int) $section['elements'][0]['original_builder']['variations_disabled']
						) {
							$section_args['sections_class'] .= ' tm-hidden';
						}
					} elseif (
						isset( $section['elements'][0]['builder'] ) &&
						isset( $section['elements'][0]['builder']['variations_disabled'] ) &&
						(int) 1 === (int) $section['elements'][0]['builder']['variations_disabled']
					) {
						$section_args['sections_class'] .= ' tm-hidden';
					}
				}
				if ( '' !== $section_args['style'] ) {
					$section_args['label_position'] = '';
				}
				wc_get_template(
					'tm-builder-section-start.php',
					$section_args,
					$this->get_template_path(),
					$this->get_default_path()
				);

				if ( isset( $section['elements'] ) && is_array( $section['elements'] ) ) {
					$totals = 0;

					$slide_counter = 0;
					$use_slides    = false;
					$doing_slides  = false;
					if ( '' !== $section['sections_slides'] && ( 'slider' === $section['sections_type'] || 'tabs' === $section['sections_type'] ) ) {
						$sections_slides = explode( ',', $section['sections_slides'] );
						$use_slides      = true;

						if ( 'tabs' === $section['sections_type'] ) {
							$sections_tabs_labels = isset( $section['sections_tabs_labels'] ) ? $section['sections_tabs_labels'] : '';
							$sections_tabs_labels = json_decode( $sections_tabs_labels );

							if ( ! is_array( $sections_tabs_labels ) ) {
								$sections_slides = '';
								$use_slides      = false;
							} else {
								echo '<div class="tc-tabs"><div class="tc-tabs-wrap tcwidth tcwidth-100">';
								echo '<div class="tc-tab-headers tcwidth tcwidth-100">';
								foreach ( $sections_tabs_labels as $tab_index => $tab_label ) {
									echo '<div class="tc-tab-header tma-tab-label"><div tabindex="0" data-id="tc-tab-slide' . esc_attr( $tab_index ) . '" data-tab="tab' . esc_attr( $tab_index ) . '" class="tab-header' . ( 0 === $tab_index ? ' open' : '' ) . '"><span class="tab-header-label">';
									echo apply_filters( 'wc_epo_kses', wp_kses_post( $tab_label ), $tab_label, false ); // phpcs:ignore WordPress.Security.EscapeOutput
									echo '</span></div></div>';
								}
								echo '</div>';
								echo '<div class="tc-tab-content tcwidth tcwidth-100">';
							}
						} elseif ( 'slider' === $section['sections_type'] ) {
							echo '<div class="tc-slider-content">';
						}
					}

					foreach ( $section['elements'] as $element ) {

						$element = apply_filters( 'wc_epo_get_element_for_display', $element );

						$empty_rules = '';
						if ( isset( $element['rules_filtered'] ) ) {
							$empty_rules = wp_json_encode( ( $element['rules_filtered'] ) );
						}
						$empty_original_rules = '';
						if ( isset( $element['original_rules_filtered'] ) ) {
							$empty_original_rules = wp_json_encode( ( $element['original_rules_filtered'] ) );
						}
						if ( empty( $empty_original_rules ) ) {
							$empty_original_rules = '';
						}
						$empty_rules_type = '';
						if ( isset( $element['rules_type'] ) ) {
							$empty_rules_type = wp_json_encode( ( $element['rules_type'] ) );
						}
						if ( isset( $element['size'] ) && isset( $columns[ $element['size'] ] ) ) {
							$size = $columns[ $element['size'] ][0];
						} else {
							$size = 'tcwidth tcwidth-100';
						}
						$test_for_first_slide = false;
						if ( $use_slides && isset( $sections_slides[ $slide_counter ] ) ) {
							$sections_slides[ $slide_counter ] = (int) $sections_slides[ $slide_counter ];

							if ( $sections_slides[ $slide_counter ] > 0 && ! $doing_slides ) {
								echo '<div class="tc-tab-slide tc-tab-slide' . esc_attr( (string) $slide_counter ) . ' tc-row">';
								$doing_slides         = true;
								$test_for_first_slide = true;
							}
						}

						$cart_fee_name = THEMECOMPLETE_EPO()->cart_fee_name;
						$totals        = $totals + $columns[ $element['size'] ][1];
						if ( $totals > 100 && ! $test_for_first_slide ) {
							$totals = $columns[ $element['size'] ][1];
						}

						$repeater              = isset( $element['repeater'] ) ? $element['repeater'] : '';
						$repeater_quantity     = isset( $element['repeater_quantity'] ) ? $element['repeater_quantity'] : '';
						$repeater_min_rows     = isset( $element['repeater_min_rows'] ) ? $element['repeater_min_rows'] : '';
						$repeater_max_rows     = isset( $element['repeater_max_rows'] ) ? $element['repeater_max_rows'] : '';
						$repeater_button_label = isset( $element['repeater_button_label'] ) ? $element['repeater_button_label'] : '';

						$divider       = isset( $element['divider_type'] ) ? $element['divider_type'] : '';
						$divider_class = '';
						if ( isset( $element['divider_type'] ) ) {
							$divider_class = '';
							if ( 'divider' === $element['type'] && ! empty( $element['class'] ) ) {
								$divider_class = ' ' . $element['class'];
							}
						}
						$label_size = 'h3';
						if ( ! empty( $element['label_size'] ) ) {
							switch ( $element['label_size'] ) {
								case '1':
									$label_size = 'h1';
									break;
								case '2':
									$label_size = 'h2';
									break;
								case '3':
									$label_size = 'h3';
									break;
								case '4':
									$label_size = 'h4';
									break;
								case '5':
									$label_size = 'h5';
									break;
								case '6':
									$label_size = 'h6';
									break;
								case '7':
									$label_size = 'p';
									break;
								case '8':
									$label_size = 'div';
									break;
								case '9':
									$label_size = 'span';
									break;
								case '10':
									$label_size = 'label';
									break;
							}
						}

						$variations_builder_element_start_args = [];
						$tm_validation                         = $this->get_tm_validation_rules( $element );
						$args                                  = apply_filters(
							'wc_epo_builder_element_start_args',
							[
								'tm_element_settings'  => $element,
								'column'               => $size,
								'class'                => ! empty( $element['class'] ) ? $element['class'] : '',
								'container_id'         => ! empty( $element['container_id'] ) ? $element['container_id'] : '',
								'label_size'           => $label_size,
								'label'                => ! empty( $element['label'] ) ? $element['label'] : '',
								'label_position'       => ! empty( $element['label_position'] ) ? $element['label_position'] : '',
								'label_mode'           => ! empty( $element['label_mode'] ) ? $element['label_mode'] : '',
								'label_color'          => ! empty( $element['label_color'] ) ? $element['label_color'] : '',
								'description'          => ! empty( $element['description'] ) ? $element['description'] : '',
								'description_color'    => ! empty( $element['description_color'] ) ? $element['description_color'] : '',
								'description_position' => ! empty( $element['description_position'] ) ? $element['description_position'] : '',
								'divider'              => $divider,
								'divider_class'        => $divider_class,
								'required'             => $element['required'],
								'replacement_mode'     => $element['replacement_mode'],
								'swatch_position'      => $element['swatch_position'],
								'use_url'              => $element['use_url'],
								'enabled'              => $element['enabled'],
								'rules'                => $empty_rules,
								'original_rules'       => $empty_original_rules,
								'rules_type'           => $empty_rules_type,
								'element_type'         => $element['type'],
								'class_id'             => 'tm-element-ul-' . $element['type'] . ' element_' . $element_counter . $form_prefix, // this goes on ul.
								'uniqid'               => $element['uniqid'],
								'logic'                => wp_json_encode( (array) json_decode( wp_unslash( $element['logicrules'] ) ) ),
								'haslogic'             => $element['logic'],
								'clear_options'        => empty( $element['clear_options'] ) ? '' : $element['clear_options'],
								'limit'                => empty( $element['limit'] ) ? '' : 'tm-limit',
								'exactlimit'           => empty( $element['exactlimit'] ) ? '' : 'tm-exactlimit',
								'minimumlimit'         => empty( $element['minimumlimit'] ) ? '' : 'tm-minimumlimit',
								'tm_validation'        => wp_json_encode( ( $tm_validation ) ),
								'extra_class'          => '',
								'repeater'             => $repeater,
								'repeater_quantity'    => $repeater_quantity,
								'repeater_min_rows'    => $repeater_min_rows,
								'repeater_max_rows'    => $repeater_max_rows,
								'hide'                 => isset( $element['hide'] ) ? $element['hide'] : '',
								'operation_mode'       => isset( $element['mode'] ) ? $element['mode'] : '',
							],
							$element,
							$element_counter,
							$form_prefix
						);

						$fullwidth_mode = 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' );
						if ( 'auto' === $args['label_mode'] ) {
							$fullwidth_mode = false;
						} elseif ( 'fullwidth' === $args['label_mode'] ) {
							$fullwidth_mode = true;
						}
						if ( $fullwidth_mode ) {
							$args['class'] = ( empty( $args['class'] ) ? '' : $args['class'] . ' ' ) . 'fullwidth';
						}

						if ( 'product' === $element['type'] ) {
							$layout_mode = isset( $element['layout_mode'] ) ? $element['layout_mode'] : '';
							if ( 'product' === $element['mode'] ) {
								$layout_mode = 'single';
							}
							$disable_epo         = isset( $element['disable_epo'] ) ? $element['disable_epo'] : '';
							$args['extra_class'] = 'cpf-type-product-' . $layout_mode . ' cpf-type-product-mode-' . $element['mode'];
							if ( ! empty( $disable_epo ) ) {
								$args['extra_class'] .= ' no-epo';
							}
							$args['element_data_attr'] = [
								'data-mode'                => isset( $element['mode'] ) ? $element['mode'] : '',
								'data-product-layout-mode' => $layout_mode,
								'data-quantity-min'        => isset( $element['quantity_min'] ) ? $element['quantity_min'] : '',
								'data-quantity-max'        => isset( $element['quantity_max'] ) ? $element['quantity_max'] : '',
								'data-priced-individually' => isset( $element['priced_individually'] ) ? $element['priced_individually'] : '',
								'data-discount'            => isset( $element['discount'] ) ? $element['discount'] : '',
								'data-discount-type'       => isset( $element['discount_type'] ) ? $element['discount_type'] : '',
								'data-discount-exclude-addons' => isset( $element['discount_exclude_addons'] ) ? $element['discount_exclude_addons'] : '',
								'data-show-image'          => isset( $element['show_image'] ) ? $element['show_image'] : '1',
								'data-show-title'          => isset( $element['show_title'] ) ? $element['show_title'] : '1',
								'data-show-title-link'     => isset( $element['show_title_link'] ) ? $element['show_title_link'] : '1',
								'data-show-price'          => isset( $element['show_price'] ) ? $element['show_price'] : '1',
								'data-show-description'    => isset( $element['show_description'] ) ? $element['show_description'] : '1',
								'data-show-meta'           => isset( $element['show_meta'] ) ? $element['show_meta'] : '1',
								'data-disable-epo'         => $disable_epo,
							];
							if ( 'product' !== $element['mode'] ) {
								if ( 'radio' === $layout_mode || 'thumbnail' === $layout_mode ) {
									$args['clear_options'] = '1';
								}
							}
						}

						if ( 'variations' === $element['type'] ) {
							$variations_builder_element_start_args = $args;
						}

						if ( ( 'variations' !== $element['type'] && $element['enabled'] ) || 'variations' === $element['type'] ) {

							$field_counter = 0;

							$init_class = 'THEMECOMPLETE_EPO_FIELDS_' . $element['type'];
							if ( ! class_exists( $init_class ) && isset( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ] ) && ! empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_addon ) ) {
								$init_class = 'THEMECOMPLETE_EPO_FIELDS';
							}

							if ( isset( THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ] )
								&& ( 'post' === THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_post || 'dynamic' === THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_post || 'display' === THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ]->is_post )
								&& class_exists( $init_class ) && method_exists( $init_class, 'display_field' )
							) {
								$element_object = THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ];

								if ( 'post' === $element_object->is_post ) {
									$c_element_counter = $d_element_counter;
									if ( isset( $element['connector'] ) && isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
										$c_element_counter = $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['element_counter'];
									}

									if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

										$name_inc    = $element['raw_name_inc'] . ( $dummy_prefix ? '' : $element['raw_name_inc_prefix'] );
										$is_cart_fee = ! empty( $element['is_cart_fee'] );

										if ( ! isset( $element_type_counter[ $element['type'] ] ) ) {
											$element_type_counter[ $element['type'] ] = 0;
										}

										$posted_name = 'tmcp_' . $name_inc;

										$get_posted_name = [ '' ];
										if ( isset( $_REQUEST[ $posted_name ] ) ) {
											$get_posted_name = map_deep( wp_unslash( $_REQUEST[ $posted_name ] ), 'sanitize_text_field' );
											if ( ! is_array( $get_posted_name ) ) {
												$get_posted_name = [ $get_posted_name ];
											}
										}

										if ( count( $get_posted_name ) > 1 && 'multipleallsingle' === $element_object->type ) {
											$get_posted_name = [ $get_posted_name[0] ];
										}

										do_action( 'wc_epo_get_builder_display_single', $element, $name_inc, null );

										$fieldtype = 'tmcp-field';
										if ( $is_cart_fee ) {
											$fieldtype = THEMECOMPLETE_EPO()->cart_fee_class;
										}
										if ( ! empty( $element['class'] ) ) {
											$fieldtype .= ' ' . $element['class'];
										}

										if ( THEMECOMPLETE_EPO()->get_element_price_type( '', $element, '0', true, 0 ) === 'math' ) {
											$fieldtype .= ' tc-is-math';
										}

										$uniqid_suffix = uniqid();

										$args['get_posted_key_count'] = count( $get_posted_name );

										foreach ( $get_posted_name as $get_posted_key => $get_posted_value ) {
											$html_name          = $posted_name . ( ! empty( $repeater ) ? '[' . $get_posted_key . ']' : '' );
											$html_quantity_name = $posted_name . '_quantity' . ( ! empty( $repeater ) ? '[' . $get_posted_key . ']' : '' );
											if ( 'singlemultiple' === $element_object->type ) {
												if ( empty( $repeater ) ) {
													$html_name          = $posted_name . '[0][]';
													$html_quantity_name = $posted_name . '_quantity[0]';
												} else {
													$html_name .= '[]';
												}
											}
											$args['get_posted_key'] = $get_posted_key;
											++$tabindex;
											$field_obj = new $init_class();
											$display   = $field_obj->display_field(
												$element,
												[
													'element_id' => 'tmcp_' . $element_object->post_name_prefix . '_' . $tabindex . $form_prefix . $uniqid_suffix,
													'get_posted_key' => $get_posted_key,
													'repeater' => $repeater,
													'name' => $html_name,
													'name_inc' => $name_inc,
													'posted_name' => $posted_name,
													'c_element_counter' => $c_element_counter,
													'element_counter' => $element_counter,
													'tabindex' => $tabindex,
													'form_prefix' => $form_prefix,
													'fieldtype' => $fieldtype,
													'field_counter' => $field_counter,
													'product_id' => isset( $product_id ) ? $product_id : 0,
												]
											);

											if ( is_array( $display ) ) {

												$original_amount = '';
												if ( isset( $element['original_rules_filtered'][0] ) && isset( $element['original_rules_filtered'][0][0] ) ) {
													$original_amount = $element['original_rules_filtered'][0][0];
												} else {
													if ( isset( $element['default_value'] ) && ! is_array( $element['default_value'] ) && '' !== $element['default_value'] ) {
														$selected_index = array_keys( $element['options'] );
														if ( isset( $selected_index[ $element['default_value'] ] ) ) {
															$selected_index = $selected_index[ $element['default_value'] ];
														} else {
															$selected_index = current( $selected_index );
														}
													} else {
														$selected_index = array_keys( $element['options'] );
														$selected_index = $selected_index[0];
													}
													$original_amount = $element['original_rules_filtered'][ esc_attr( (string) $selected_index ) ];
													if ( isset( $original_amount[0] ) ) {
														$original_amount = $original_amount[0];
													} else {
														$original_amount = '';
													}
												}
												if ( isset( $display['default_value_counter'] ) && false !== $display['default_value_counter'] ) {
													$original_amount = $element['original_rules_filtered'][ $display['default_value_counter'] ][0];
												}

												$amount = '';
												if ( isset( $element['rules_filtered'][0] ) && isset( $element['rules_filtered'][0][0] ) ) {
													$amount = $element['rules_filtered'][0][0];
												} else {
													if ( isset( $element['default_value'] ) && ! is_array( $element['default_value'] ) && '' !== $element['default_value'] ) {
														$selected_index = array_keys( $element['options'] );
														if ( isset( $selected_index[ $element['default_value'] ] ) ) {
															$selected_index = $selected_index[ $element['default_value'] ];
														} else {
															$selected_index = current( $selected_index );
														}
													} else {
														$selected_index = array_keys( $element['options'] );
														$selected_index = $selected_index[0];
													}
													$amount = $element['rules_filtered'][ esc_attr( (string) $selected_index ) ];
													if ( isset( $amount[0] ) ) {
														$amount = $amount[0];
													} else {
														$amount = '';
													}
												}
												if ( isset( $display['default_value_counter'] ) && false !== $display['default_value_counter'] ) {
													$amount = $element['rules_filtered'][ $display['default_value_counter'] ][0];
												}

												$original_rules = isset( $element['original_rules_filtered'] ) ? wp_json_encode( ( $element['original_rules_filtered'] ) ) : '';
												if ( empty( $original_rules ) ) {
													$original_rules = '';
												}

												$element_args = [
													'element_id' => 'tmcp_' . $element_object->post_name_prefix . '_' . $tabindex . $form_prefix . $uniqid_suffix,
													'name' => $html_name,
													'get_posted_key' => $get_posted_key,
													'posted_name' => $posted_name,
													'quantity_name' => $html_quantity_name,
													'amount' => '',
													'original_amount' => '',
													'required' => $element['required'],
													'tabindex' => $tabindex,
													'fieldtype' => $fieldtype,
													'rules' => isset( $element['rules_filtered'] ) ? wp_json_encode( ( $element['rules_filtered'] ) ) : '',
													'original_rules' => $original_rules,
													'rules_type' => isset( $element['rules_type'] ) ? wp_json_encode( ( $element['rules_type'] ) ) : '',
													'tm_element_settings' => $element,
													'class' => ! empty( $element['class'] ) ? $element['class'] : '',
													'field_counter' => $field_counter,
													'tax_obj' => ! $is_cart_fee ? false : wp_json_encode(
														( [
															'is_fee'    => $is_cart_fee,
															'has_fee'   => isset( $element['include_tax_for_fee_price_type'] ) ? $element['include_tax_for_fee_price_type'] : '',
															'tax_class' => isset( $element['tax_class_for_fee_price_type'] ) ? $element['tax_class_for_fee_price_type'] : '',
															'tax_rate'  => $this->get_tax_rate( isset( $element['tax_class_for_fee_price_type'] ) ? $element['tax_class_for_fee_price_type'] : '' ),
														] )
													),
												];

												if ( THEMECOMPLETE_EPO()->has_math_special_variable( $element_args['rules'], 'cumulative' ) ) {
													$element_args['fieldtype'] .= ' tc-is-math-cumulative';
												} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $element_args['rules'], 'special' ) ) {
													$element_args['fieldtype'] .= ' tc-is-math-special';
												}

												$element_args         = apply_filters( 'wc_epo_display_template_args', array_merge( $element_args, $display ), $element, false, false, $element_type_counter[ $element['type'] ] );
												$element_args['args'] = $element_args;

												if ( 'variations' !== $element['type'] ) {
													if ( $element['enabled'] ) {
														wc_get_template(
															'tm-builder-element-start.php',
															$args,
															$this->get_template_path(),
															$this->get_default_path()
														);
													}
												}
												if ( $element_object->is_addon ) {
													do_action(
														'tm_epo_display_addons',
														$element,
														$element_args,
														[
															'name_inc'        => $name_inc,
															'c_element_counter' => $c_element_counter,
															'element_counter' => $element_counter,
															'tabindex'        => $tabindex,
															'form_prefix'     => $form_prefix,
															'field_counter'   => $field_counter,
														],
														$element_object->namespace
													);
												} elseif ( is_readable( apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_TEMPLATE_PATH, $element['type'], $element ) . apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ) ) ) {
													wc_get_template(
														apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ),
														$element_args,
														$this->get_template_path(),
														apply_filters( 'wc_epo_template_path_element', $this->get_default_path(), $element['type'], $element )
													);
												}
												if ( 'variations' !== $element['type'] ) {
													if ( $element['enabled'] ) {
														wc_get_template(
															'tm-builder-element-end.php',
															[
																'repeater' => $repeater,
																'repeater_quantity' => $repeater_quantity,
																'repeater_min_rows'    => $repeater_min_rows,
																'repeater_max_rows'    => $repeater_max_rows,
																'repeater_button_label' => $repeater_button_label,
																'get_posted_key' => $get_posted_key,
																'get_posted_key_count' => $args['get_posted_key_count'],
																'tm_element_settings' => $element,
																'element_type' => $element['type'],
																'enabled'     => $element['enabled'],
																'description' => ! empty( $element['description'] ) ? $element['description'] : '',
																'description_color' => ! empty( $element['description_color'] ) ? $element['description_color'] : '',
																'description_position' => ! empty( $element['description_position'] ) ? $element['description_position'] : '',
															],
															$this->get_template_path(),
															$this->get_default_path()
														);
													}
												}
											}
											unset( $field_obj );
										}

										++$element_type_counter[ $element['type'] ];

									} elseif ( 'multipleall' === $element_object->type || 'multiple' === $element_object->type ) {

										if ( ! isset( $element_type_counter[ $element['type'] ] ) ) {
											$element_type_counter[ $element['type'] ] = 0;
										}

										$get_posted_name = [];

										if ( 'multipleall' === $element_object->type ) {
											$_field_counter = 0;
											foreach ( $element['options'] as $value => $label ) {
												$name_inc    = $element['raw_name_inc'][ $_field_counter ] . ( $dummy_prefix ? '' : $element['raw_name_inc_prefix'][ $_field_counter ] );
												$is_cart_fee = ! empty( $element['is_cart_fee_multiple'][ $_field_counter ] );
												$posted_name = 'tmcp_' . $name_inc;
												if ( isset( $_REQUEST[ $posted_name ] ) && is_array( $_REQUEST[ $posted_name ] ) ) {
													$get_posted_name = array_replace( $get_posted_name, wp_unslash( $_REQUEST[ $posted_name ] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
													if ( ! is_array( $get_posted_name ) ) {
														$get_posted_name = [ $get_posted_name ];
													}
													end( $get_posted_name );
													$get_posted_max = key( $get_posted_name );
													if ( $get_posted_max >= count( $get_posted_name ) ) {
														$get_posted_name = $get_posted_name + array_diff_key( array_fill( 0, $get_posted_max, false ), $get_posted_name );
														ksort( $get_posted_name );
													}
												}
												++$_field_counter;
											}
										} else {
											$name_inc        = '';
											$posted_name     = '';
											$get_posted_name = [];
											if ( isset( $element['raw_name_inc'] ) ) {
												$name_inc    = $element['raw_name_inc'][0] . ( $dummy_prefix ? '' : $element['raw_name_inc_prefix'][0] );
												$is_cart_fee = ! empty( $element['is_cart_fee_multiple'][0] );
												$posted_name = 'tmcp_' . $name_inc;
												if ( isset( $_REQUEST[ $posted_name ] ) && is_array( $_REQUEST[ $posted_name ] ) ) {
													$get_posted_name = wp_unslash( $_REQUEST[ $posted_name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
													if ( ! is_array( $get_posted_name ) ) {
														$get_posted_name = [ $get_posted_name ];
													}
													end( $get_posted_name );
													$get_posted_max = key( $get_posted_name );
													if ( $get_posted_max >= count( $get_posted_name ) ) {
														$get_posted_name = $get_posted_name + array_diff_key( array_fill( 0, $get_posted_max, false ), $get_posted_name );
														ksort( $get_posted_name );
													}
												}
											}
										}

										if ( empty( $get_posted_name ) ) {
											$get_posted_name = [ '' ];
										}

										$args['get_posted_key_count'] = count( $get_posted_name );

										foreach ( $get_posted_name as $get_posted_key => $get_posted_value ) {
											$field_counter          = 0;
											$args['get_posted_key'] = $get_posted_key;

											$field_obj = new $init_class();
											if ( method_exists( $field_obj, 'display_field_pre' ) ) {
												$field_obj->display_field_pre(
													$element,
													[
														'c_element_counter' => $c_element_counter,
														'element_counter' => $element_counter,
														'tabindex' => $tabindex,
														'form_prefix' => $form_prefix,
														'field_counter' => $field_counter,
														'product_id' => isset( $product_id ) ? $product_id : 0,
													]
												);
											}

											$args['field_obj'] = $field_obj;

											if ( 'variations' !== $element['type'] ) {
												if ( $element['enabled'] ) {
													wc_get_template(
														'tm-builder-element-start.php',
														$args,
														$this->get_template_path(),
														$this->get_default_path()
													);
												}
											}

											$choice_counter = 0;

											foreach ( $element['options'] as $value => $label ) {
												$connector_value = $value;
												if ( isset( $element['connector'] ) && isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
													$c_element_counter = $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['element_counter'];

													$underscore_position = strrpos( $value, '_' );
													if ( false !== $underscore_position ) {
														$first_part  = substr( $value, 0, $underscore_position );
														$second_part = absint( substr( $value, $underscore_position + 1 ) );
														$second_part = $second_part + absint( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['choice_counter'] );
														$second_part = absint( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['choice_counter'] );

														$connector_value = $value . '-' . $second_part;
													}
												}

												++$tabindex;

												$name_inc = $element['raw_name_inc'][ $field_counter ] . ( $dummy_prefix ? '' : $element['raw_name_inc_prefix'][ $field_counter ] );

												$is_cart_fee = ! empty( $element['is_cart_fee_multiple'][ $field_counter ] );

												$posted_name = 'tmcp_' . $name_inc;
												do_action( 'wc_epo_get_builder_display_single', $element, $name_inc, $value );

												$html_name          = $posted_name . ( ! empty( $repeater ) ? '[' . $get_posted_key . ']' : '' );
												$html_quantity_name = $posted_name . '_quantity' . ( ! empty( $repeater ) ? '[' . $get_posted_key . ']' : '' );

												if ( ! empty( THEMECOMPLETE_EPO()->cart_edit_key ) && isset( $_GET['_wpnonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'tm-edit' ) ) {
													if ( isset( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ] ) ) {
														if ( ! empty( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmcartepo'] ) ) {
															$saved_epos = WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmcartepo'];
															foreach ( $saved_epos as $key => $val ) {
																if ( $element['uniqid'] === $val['section'] && (string) $value === (string) $val['key'] ) {
																	if ( isset( $val['quantity'] ) ) {
																		if ( ! empty( $repeater ) ) {
																			$_REQUEST[ $posted_name . '_quantity' ][ $get_posted_key ] = $val['quantity'];
																		} else {
																			$_REQUEST[ $posted_name . '_quantity' ] = $val['quantity'];
																		}
																	}
																}
															}
														}
														if ( ! empty( WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmcartfee'] ) ) {
															$saved_fees = WC()->cart->cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key ]['tmcartfee'];
															foreach ( $saved_fees as $key => $val ) {
																if ( $element['uniqid'] === $val['section'] && (string) $value === (string) $val['key'] ) {
																	if ( isset( $val['quantity'] ) ) {
																		if ( isset( $val['quantity'] ) ) {
																			if ( ! empty( $repeater ) ) {
																				$_REQUEST[ $posted_name . '_quantity' ][ $get_posted_key ] = $val['quantity'];
																			} else {
																				$_REQUEST[ $posted_name . '_quantity' ] = $val['quantity'];
																			}
																		}
																	}
																}
															}
														}
													}
												}

												$fieldtype = 'tmcp-field';
												if ( $is_cart_fee ) {
													$fieldtype = THEMECOMPLETE_EPO()->cart_fee_class;
												}
												if ( ! empty( $element['class'] ) ) {
													$fieldtype .= ' ' . $element['class'];
												}

												if ( THEMECOMPLETE_EPO()->get_element_price_type( '', $element, $value, true, 0 ) === 'math' ) {
													$fieldtype .= ' tc-is-math';
												}

												$uniqid_suffix = uniqid();

												$display = $field_obj->display_field(
													$element,
													[
														'element_id' => 'tmcp_' . $element_object->post_name_prefix . '_' . $c_element_counter . '_' . $field_counter . '_' . $tabindex . $form_prefix . $uniqid_suffix,
														'get_posted_key' => $get_posted_key,
														'repeater' => $repeater,
														'name' => $html_name,
														'name_inc' => $name_inc,
														'posted_name' => $posted_name,
														'value' => $value,
														'connector_value' => $connector_value,
														'label' => $label,
														'c_element_counter' => $c_element_counter,
														'element_counter' => $element_counter,
														'tabindex' => $tabindex,
														'form_prefix' => $form_prefix,
														'fieldtype' => $fieldtype,
														'border_type' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_selected_border' ),
														'field_counter' => $field_counter,
														'product_id' => isset( $product_id ) ? $product_id : 0,
													]
												);

												if ( is_array( $display ) ) {

													$original_amount = $element['original_rules_filtered'][ $value ][0];

													$amount = $element['rules_filtered'][ $value ][0];

													$original_rules = isset( $element['original_rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['original_rules_filtered'][ $value ] ) ) : '';
													if ( empty( $original_rules ) ) {
														$original_rules = '';
													}

													$element_args = [
														'element_id' => 'tmcp_' . $element_object->post_name_prefix . '_' . $c_element_counter . '_' . $field_counter . '_' . $tabindex . $form_prefix . $uniqid_suffix,
														'name' => $html_name,
														'get_posted_key' => $get_posted_key,
														'posted_name' => $posted_name,
														'quantity_name' => $html_quantity_name,
														'amount' => '',
														'original_amount' => '',
														'required' => $element['required'],
														'tabindex' => $tabindex,
														'fieldtype' => $fieldtype,
														'rules' => isset( $element['rules_filtered'][ $value ] ) ? wp_json_encode( ( $element['rules_filtered'][ $value ] ) ) : '',
														'original_rules' => $original_rules,
														'rules_type' => isset( $element['rules_type'][ $value ] ) ? wp_json_encode( ( $element['rules_type'][ $value ] ) ) : '',
														'border_type' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_selected_border' ),
														'tm_element_settings' => $element,
														'class' => ! empty( $element['class'] ) ? $element['class'] : '',
														'field_counter' => $field_counter,
														'tax_obj' => ! $is_cart_fee ? false : wp_json_encode(
															( [
																'is_fee'    => $is_cart_fee,
																'has_fee'   => isset( $element['include_tax_for_fee_price_type'] ) ? $element['include_tax_for_fee_price_type'] : '',
																'tax_class' => isset( $element['tax_class_for_fee_price_type'] ) ? $element['tax_class_for_fee_price_type'] : '',
																'tax_rate'  => $this->get_tax_rate( isset( $element['tax_class_for_fee_price_type'] ) ? $element['tax_class_for_fee_price_type'] : '' ),
															] )
														),
													];

													$element_args         = apply_filters( 'wc_epo_display_template_args', array_merge( $element_args, $display ), $element, $value, $choice_counter, $element_type_counter[ $element['type'] ] );
													$element_args['args'] = $element_args;
													if ( THEMECOMPLETE_EPO()->has_math_special_variable( $element_args['rules'], 'cumulative' ) ) {
														$element_args['fieldtype'] .= ' tc-is-math-cumulative';
													} elseif ( THEMECOMPLETE_EPO()->has_math_special_variable( $element_args['rules'], 'special' ) ) {
														$element_args['fieldtype'] .= ' tc-is-math-special';
													}
													if ( $element_object->is_addon ) {
														do_action(
															'tm_epo_display_addons',
															$element,
															$element_args,
															[
																'name_inc'        => $name_inc,
																'element_counter' => $c_element_counter,
																'tabindex'        => $tabindex,
																'form_prefix'     => $form_prefix,
																'field_counter'   => $field_counter,
																'border_type'     => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_selected_border' ),
															],
															$element_object->namespace
														);
													} elseif ( is_readable( apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_TEMPLATE_PATH, $element['type'], $element ) . apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ) ) ) {
														wc_get_template(
															apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ),
															$element_args,
															$this->get_template_path(),
															apply_filters( 'wc_epo_template_path_element', $this->get_default_path(), $element['type'], $element )
														);
													}
												}

												++$choice_counter;

												++$field_counter;

											}

											if ( 'variations' !== $element['type'] ) {
												if ( $element['enabled'] ) {
													wc_get_template(
														'tm-builder-element-end.php',
														[
															'repeater' => $repeater,
															'repeater_quantity' => $repeater_quantity,
															'repeater_min_rows'    => $repeater_min_rows,
															'repeater_max_rows'    => $repeater_max_rows,
															'repeater_button_label' => $repeater_button_label,
															'get_posted_key' => $get_posted_key,
															'get_posted_key_count' => $args['get_posted_key_count'],
															'tm_element_settings' => $element,
															'element_type' => $element['type'],
															'enabled'     => $element['enabled'],
															'description' => ! empty( $element['description'] ) ? $element['description'] : '',
															'description_color' => ! empty( $element['description_color'] ) ? $element['description_color'] : '',
															'description_position' => ! empty( $element['description_position'] ) ? $element['description_position'] : '',
														],
														$this->get_template_path(),
														$this->get_default_path()
													);
												}
											}

											unset( $args['field_obj'] );
											unset( $field_obj );

										}

										++$element_type_counter[ $element['type'] ];
									}

									if ( isset( $element['connector'] ) && '' !== $element['connector'] ) {
										if ( ! isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
											++$d_element_counter;
										}
										$connectors_choice_counter = 0;
										if ( isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['choice_counter'] ) ) {
											$connectors_choice_counter = 1 + absint( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ]['choice_counter'] );
										}
										$connectors[ 'c-' . sanitize_key( $element['connector'] ) ] = [
											'element_counter' => $c_element_counter,
											'choice_counter'  => $connectors_choice_counter,
										];
									} else {
										++$d_element_counter;
									}
									++$element_counter;
								} elseif ( 'dynamic' === $element_object->is_post || 'display' === $element_object->is_post ) {
									$field_obj = new $init_class();
									$display   = $field_obj->display_field(
										$element,
										[
											'element_counter' => $element_counter,
											'tabindex'    => $tabindex,
											'form_prefix' => $form_prefix,
											'field_counter' => $field_counter,
											'args'        => $args,
											'product_id'  => isset( $product_id ) ? $product_id : 0,
										]
									);

									if ( is_array( $display ) ) {
										$element_args = [
											'tm_element_settings' => $element,
											'class'       => ! empty( $element['class'] ) ? $element['class'] : '',
											'form_prefix' => $form_prefix,
											'field_counter' => $field_counter,
											'tm_element'  => $element,
											'epo_template_path' => $this->get_template_path(),
											'epo_default_path' => $this->get_default_path(),
											'tm_product_id' => $product_id,
										];

										if ( 'variations' === $element['type'] ) {
											$element_args['variations_builder_element_start_args'] = $variations_builder_element_start_args;
											$element_args['variations_builder_element_end_args']   = [
												'repeater' => '',
												'repeater_quantity' => '',
												'repeater_min_rows' => '',
												'repeater_max_rows' => '',
												'repeater_button_label' => '',
												'get_posted_key' => '',
												'get_posted_key_count' => '',
												'tm_element_settings' => $element,
												'element_type' => $element['type'],
												'description' => ! empty( $element['description'] ) ? $element['description'] : '',
												'description_color' => ! empty( $element['description_color'] ) ? $element['description_color'] : '',
												'description_position' => ! empty( $element['description_position'] ) ? $element['description_position'] : '',
											];
										}

										$element_args = array_merge( $element_args, $display );
										if ( 'variations' !== $element['type'] ) {
											if ( $element['enabled'] ) {
												wc_get_template(
													'tm-builder-element-start.php',
													$args,
													$this->get_template_path(),
													$this->get_default_path()
												);
											}
										}
										if ( $element_object->is_addon ) {
											do_action(
												'tm_epo_display_addons',
												$element,
												$element_args,
												[
													'name_inc' => '',
													'element_counter' => $element_counter,
													'tabindex' => $tabindex,
													'form_prefix' => $form_prefix,
													'field_counter' => $field_counter,
												],
												$element_object->namespace
											);
										} elseif ( is_readable( apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_TEMPLATE_PATH, $element['type'], $element ) . apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ) ) ) {
											wc_get_template(
												apply_filters( 'wc_epo_template_element', 'tm-' . str_replace( '_', '-', $element['type'] ) . '.php', $element['type'], $element ),
												$element_args,
												$this->get_template_path(),
												apply_filters( 'wc_epo_template_path_element', $this->get_default_path(), $element['type'], $element )
											);
										}
										if ( 'variations' !== $element['type'] ) {
											if ( $element['enabled'] ) {
												wc_get_template(
													'tm-builder-element-end.php',
													[
														'repeater' => $repeater,
														'repeater_quantity' => $repeater_quantity,
														'repeater_min_rows'    => $repeater_min_rows,
														'repeater_max_rows'    => $repeater_max_rows,
														'repeater_button_label' => $repeater_button_label,
														'get_posted_key' => isset( $get_posted_key ) ? $get_posted_key : 0,
														'get_posted_key_count' => isset( $args['get_posted_key_count'] ) ? $args['get_posted_key_count'] : 0,
														'tm_element_settings' => $element,
														'element_type' => $element['type'],
														'enabled'     => $element['enabled'],
														'description' => ! empty( $element['description'] ) ? $element['description'] : '',
														'description_color' => ! empty( $element['description_color'] ) ? $element['description_color'] : '',
														'description_position' => ! empty( $element['description_position'] ) ? $element['description_position'] : '',
													],
													$this->get_template_path(),
													$this->get_default_path()
												);
											}
										}
									}

									unset( $field_obj );
								}
							}
						}

						if ( $use_slides && isset( $sections_slides[ $slide_counter ] ) ) {
							$sections_slides[ $slide_counter ] = $sections_slides[ $slide_counter ] - 1;

							if ( $sections_slides[ $slide_counter ] <= 0 ) {
								echo '</div>';
								++$slide_counter;
								$doing_slides = false;
							}
						}
					}

					if ( '' !== $section['sections_slides'] && ( 'slider' === $section['sections_type'] || 'tabs' === $section['sections_type'] ) ) {
						if ( 'tabs' === $section['sections_type'] ) {
							if ( isset( $sections_tabs_labels ) && is_array( $sections_tabs_labels ) ) {
								echo '</div>';
								echo '</div></div>';
							}
						} elseif ( 'slider' === $section['sections_type'] ) {
							echo '</div>';
						}
					}
				}

				wc_get_template(
					'tm-builder-section-end.php',
					$section_args,
					$this->get_template_path(),
					$this->get_default_path()
				);

			}

			wc_get_template(
				'tm-builder-end.php',
				[],
				$this->get_template_path(),
				$this->get_default_path()
			);

			++$unit_counter;

		}

		return [
			'tabindex'          => $tabindex,
			'unit_counter'      => $unit_counter,
			'field_counter'     => $field_counter,
			'element_counter'   => $element_counter,
			'd_element_counter' => $d_element_counter,
			'_currency'         => $_currency,
			'connectors'        => $connectors,
		];
	}

	/**
	 * Displays the option created from the normal (local) mode
	 *
	 * @param array<mixed> $local_price_array The normal options array.
	 * @param array<mixed> $args The variable arguemnts..
	 * @param string       $form_prefix The form prefix.
	 * @param boolean      $dummy_prefix If we should use the form prefix.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function get_normal_display( $local_price_array = [], $args = [], $form_prefix = null, $dummy_prefix = null ) {
		$tabindex        = $args['tabindex'];
		$unit_counter    = $args['unit_counter'];
		$field_counter   = $args['field_counter'];
		$element_counter = $args['element_counter'];
		$_currency       = $args['_currency'];
		$product_id      = $args['product_id'];

		$form_prefix_onform = '' !== $form_prefix ? '_' . str_replace( '_', '', $form_prefix ) : '';

		// Normal (local) options.
		if ( is_array( $local_price_array ) && count( $local_price_array ) > 0 ) {

			$attributes      = themecomplete_get_attributes( absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $product_id ) ) );
			$wpml_attributes = themecomplete_get_attributes( $product_id );

			$fieldtype = 'tmcp-field';

			if ( is_array( $attributes ) && count( $attributes ) > 0 ) {
				foreach ( $local_price_array as $field ) {
					if ( isset( $field['name'] ) && isset( $attributes[ $field['name'] ] ) && is_array( $attributes[ $field['name'] ] ) && ! $attributes[ $field['name'] ]['is_variation'] ) {

						$attribute      = $attributes[ $field['name'] ];
						$wpml_attribute = isset( $wpml_attributes[ $field['name'] ] ) ? $wpml_attributes[ $field['name'] ] : [];

						$empty_rules = '';
						if ( isset( $field['rules_filtered'][0] ) ) {
							$empty_rules = wp_json_encode( ( $field['rules_filtered'][0] ) );
						}
						if ( empty( $empty_rules ) ) {
							$empty_rules = '';
						}
						$empty_rules_type = '';
						if ( isset( $field['rules_type'][0] ) ) {
							$empty_rules_type = wp_json_encode( ( $field['rules_type'][0] ) );
						}

						$args = [
							'label'          => ( ! $attribute['is_taxonomy'] && isset( $attributes[ $field['name'] ]['name'] ) )
								? wc_attribute_label( $attributes[ $field['name'] ]['name'] )
								: wc_attribute_label( $field['name'] ),
							'required'       => wc_attribute_label( $field['required'] ),
							'field_id'       => 'tc-epo-field-' . $unit_counter,
							'field_type'     => $field['type'],
							'rules'          => $empty_rules,
							'original_rules' => $empty_rules,
							'rules_type'     => $empty_rules_type,
							'li_class'       => 'tc-normal-mode',
						];
						wc_get_template(
							'tm-field-start.php',
							$args,
							$this->get_template_path(),
							$this->get_default_path()
						);

						$name_inc      = '';
						$field_counter = 0;

						if ( $attribute['is_taxonomy'] ) {

							$orderby    = wc_attribute_orderby( $attribute['name'] );
							$order_args = 'orderby=name&hide_empty=0';
							$order_args = [
								'taxonomy'   => $attribute['name'],
								'hide_empty' => false,
							];
							switch ( $orderby ) {
								case 'name':
									$order_args['orderby']    = 'name';
									$order_args['menu_order'] = false;
									break;
								case 'id':
									$order_args['orderby']    = 'id';
									$order_args['order']      = 'ASC';
									$order_args['menu_order'] = false;
									break;
								case 'menu_order':
									$order_args['menu_order'] = 'ASC';
									break;
							}

							// Terms in current lang.
							$_current_terms  = THEMECOMPLETE_EPO_WPML()->get_terms( THEMECOMPLETE_EPO_WPML()->get_lang(), $attribute['name'], $order_args );
							$_current_terms2 = get_terms( $order_args );
							if ( ! is_array( $_current_terms2 ) ) {
								$_current_terms2 = [];
							}
							$_current_terms = THEMECOMPLETE_EPO_WPML()->order_terms( $_current_terms, $_current_terms2 );

							$current_language = apply_filters( 'wpml_current_language', false );
							$default_language = apply_filters( 'wpml_default_language', false );
							do_action( 'wpml_switch_language', $default_language );

							// Terms in default WPML lang.
							$_default_terms  = THEMECOMPLETE_EPO_WPML()->get_terms( THEMECOMPLETE_EPO_WPML()->get_lang(), $attribute['name'], $order_args );
							$_default_terms2 = get_terms( $order_args );
							if ( ! is_array( $_default_terms2 ) ) {
								$_default_terms2 = [];
							}
							$_default_terms = THEMECOMPLETE_EPO_WPML()->order_terms( $_default_terms, $_default_terms2 );

							do_action( 'wpml_switch_language', $current_language );

							$_tems_to_use = THEMECOMPLETE_EPO_WPML()->merge_terms( $_current_terms, $_default_terms );

							$slugs = THEMECOMPLETE_EPO_WPML()->merge_terms_slugs( $_current_terms, $_default_terms );

							switch ( $field['type'] ) {

								case 'select':
									$name_inc = 'select_' . $element_counter;
									++$tabindex;

									$args = [
										'element_id'      => 'tmcp_select_' . $tabindex . $form_prefix,
										'name'            => 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform ),
										'amount'          => '',
										'original_amount' => '',
										'tabindex'        => $tabindex,
										'fieldtype'       => $fieldtype,
										'rules'           => '',
										'original_rules'  => '',
										'rules_type'      => '',
										'textafterprice'  => '',
										'textbeforeprice' => '',
										'class'           => '',
										'class_label'     => '',
										'element_data_attr_html' => '',
										'hide_amount'     => ! empty( $field['hide_price'] ) ? ' hidden' : '',
										'tax_obj'         => false,

										'options'         => [],
										'placeholder'     => '',
									];
									if ( $_tems_to_use && is_array( $_tems_to_use ) ) {
										foreach ( $_tems_to_use as $trid => $term ) {
											if ( ! isset( $slugs[ $term->slug ] ) ) {
												$slugs[ $term->slug ] = $term->slug;
											}
											$has_term = has_term( (int) $term->term_id, $attribute['name'], absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $product_id ) ) ) ? 1 : 0;

											if ( $has_term ) {
												$wpml_term_id = THEMECOMPLETE_EPO_WPML()->is_active() && function_exists( 'icl_object_id' ) ? icl_object_id( $term->term_id, $attribute['name'], false ) : false;
												if ( $wpml_term_id ) {
													$wpml_term = get_term( $wpml_term_id, $attribute['name'] );
												} else {
													$wpml_term = $term;
												}

												$option = [
													'value_to_show' => sanitize_title( $term->slug ),
													'data_price' => '',
													'data_rules' => ( isset( $field['rules_filtered'][ $slugs[ $term->slug ] ] )
														? wp_json_encode( ( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) )
														: ( isset( $field['rules_filtered'][ $term->slug ] )
															? wp_json_encode( $field['rules_filtered'][ $term->slug ] )
															: '' ) ),
													'data_original_rules' => ( isset( $field['rules_filtered'][ $slugs[ $term->slug ] ] )
														? wp_json_encode( ( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) )
														: ( isset( $field['rules_filtered'][ $term->slug ] )
															? wp_json_encode( $field['rules_filtered'][ $term->slug ] )
															: '' ) ),
													'data_rulestype' => ( isset( $field['rules_type'][ $slugs[ $term->slug ] ] )
														? wp_json_encode( ( $field['rules_type'][ $slugs[ $term->slug ] ] ) )
														: ( isset( $field['rules_type'][ $term->slug ] )
															? wp_json_encode( $field['rules_type'][ $term->slug ] )
															: '' ) ),
													'text' => $wpml_term->name,
												];

												if ( isset( $_POST[ 'tmcp_' . $name_inc . $form_prefix_onform ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$option['selected'] = wp_unslash( $_POST[ 'tmcp_' . $name_inc . $form_prefix_onform ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
													$option['current']  = esc_attr( $option['value_to_show'] );
												}

												$args['options'][] = $option;

											}
										}
									}

									wc_get_template(
										'tm-' . $field['type'] . '.php',
										$args,
										$this->get_template_path(),
										$this->get_default_path()
									);
									++$element_counter;
									break;

								case 'radio':
								case 'checkbox':
									if ( $_tems_to_use && is_array( $_tems_to_use ) ) {
										$labelclass       = '';
										$labelclass_start = '';
										$labelclass_end   = '';
										if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ) ) {
											$labelclass       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
											$labelclass_start = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
											$labelclass_end   = true;
										}

										foreach ( $_tems_to_use as $trid => $term ) {
											if ( ! isset( $slugs[ $term->slug ] ) ) {
												$slugs[ $term->slug ] = $term->slug;
											}

											$has_term = has_term( (int) $term->term_id, $attribute['name'], absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $product_id ) ) ) ? 1 : 0;

											if ( $has_term ) {

												$wpml_term_id = THEMECOMPLETE_EPO_WPML()->is_active() && function_exists( 'icl_object_id' ) ? icl_object_id( $term->term_id, $attribute['name'], false ) : false;

												if ( $wpml_term_id ) {
													$wpml_term = get_term( $wpml_term_id, $attribute['name'] );
												} else {
													$wpml_term = $term;
												}

												++$tabindex;

												if ( 'radio' === $field['type'] ) {
													$name_inc = 'radio_' . $element_counter;
												}
												if ( 'checkbox' === $field['type'] ) {
													$name_inc = 'checkbox_' . $element_counter . '_' . $field_counter;
												}

												$original_rules = ( isset( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) ? wp_json_encode( ( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) ) : ( isset( $field['rules_filtered'][ $term->slug ] ) ? wp_json_encode( $field['rules_filtered'][ $term->slug ] ) : '' ) );
												if ( empty( $original_rules ) ) {
													$original_rules = '';
												}

												$checked = false;
												$value   = sanitize_title( $term->slug );
												switch ( $field['type'] ) {
													case 'radio':
														$selected_value = '';
														$name           = 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform );

														if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $_POST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
															$selected_value = wp_unslash( $_POST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
														} elseif ( empty( $_POST ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification
															$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
														} elseif ( empty( $_POST ) || ! isset( $_POST[ $name ] ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) { // phpcs:ignore WordPress.Security.NonceVerification
															$selected_value = -1;
														}

														$checked = -1 !== $selected_value && esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $value );
														break;

													case 'checkbox':
														$selected_value = '';
														$name           = 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform );
														if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $_POST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
															$selected_value = wp_unslash( $_POST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
														} elseif ( empty( $_POST ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification
															$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
														} elseif ( ( ( THEMECOMPLETE_EPO()->is_quick_view() || empty( $_POST ) ) && empty( THEMECOMPLETE_EPO()->cart_edit_key ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) { // phpcs:ignore WordPress.Security.NonceVerification
															$selected_value = -1;
														}

														$checked = -1 !== $selected_value && esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $value );
														break;
												}
												$args = [
													'element_id' => 'tmcp_choice_' . $element_counter . '_' . $field_counter . '_' . $tabindex . $form_prefix,
													'name' => isset( $name ) ? $name : '',
													'amount' => '',
													'original_amount' => '',
													'tabindex' => $tabindex,
													'fieldtype' => $fieldtype,
													'rules' => ( isset( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) ? wp_json_encode( ( $field['rules_filtered'][ $slugs[ $term->slug ] ] ) ) : ( isset( $field['rules_filtered'][ $term->slug ] ) ? wp_json_encode( $field['rules_filtered'][ $term->slug ] ) : '' ) ),
													'original_rules' => $original_rules,
													'rules_type' => ( isset( $field['rules_type'][ $slugs[ $term->slug ] ] ) ? wp_json_encode( ( $field['rules_type'][ $slugs[ $term->slug ] ] ) ) : ( isset( $field['rules_type'][ $term->slug ] ) ? wp_json_encode( $field['rules_type'][ $term->slug ] ) : '' ) ),
													'label_mode' => '',
													'label_to_display' => $wpml_term->name,
													'swatch_class' => '',
													'swatch' => [],
													'altsrc' => [],
													'textafterprice' => '',
													'textbeforeprice' => '',
													'class' => '',
													'element_data_attr_html' => '',
													'li_class' => '',
													'exactlimit' => '',
													'minimumlimit' => '',
													'url'  => '',
													'image' => '',
													'imagec' => '',
													'imagep' => '',
													'imagel' => '',
													'image_variations' => '',
													'checked' => $checked,
													'use'  => '',
													'labelclass_start' => $labelclass_start,
													'labelclass' => $labelclass,
													'labelclass_end' => $labelclass_end,
													'hide_amount' => ! empty( $field['hide_price'] ) ? ' hidden' : '',
													'tax_obj' => false,
													'border_type' => '',
													'label' => $wpml_term->name,
													'value' => $value,
													'replacement_mode' => 'none',
													'swatch_position' => 'center',
													'limit' => empty( $field['limit'] ) ? '' : $field['limit'],

												];
												wc_get_template(
													'tm-' . $field['type'] . '.php',
													$args,
													$this->get_template_path(),
													$this->get_default_path()
												);

												++$field_counter;
											}
										}
									}

									++$element_counter;
									break;

							}
						} else {

							$options      = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) );
							$wpml_options = isset( $wpml_attribute['value'] ) ? array_map( 'trim', explode( WC_DELIMITER, $wpml_attribute['value'] ) ) : $options;

							switch ( $field['type'] ) {

								case 'select':
									$name_inc = 'select_' . $element_counter;
									++$tabindex;

									$args = [
										'element_id'      => 'tmcp_select_' . $tabindex . $form_prefix,
										'name'            => 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform ),
										'amount'          => '',
										'original_amount' => '',
										'tabindex'        => $tabindex,
										'fieldtype'       => $fieldtype,
										'rules'           => '',
										'original_rules'  => '',
										'rules_type'      => '',
										'textafterprice'  => '',
										'textbeforeprice' => '',
										'class'           => '',
										'class_label'     => '',
										'element_data_attr_html' => '',
										'hide_amount'     => ! empty( $field['hide_price'] ) ? ' hidden' : '',
										'tax_obj'         => false,
										'border_type'     => '',
										'options'         => [],
										'placeholder'     => '',

									];
									foreach ( $options as $k => $option ) {

										$option = [
											'value_to_show' => sanitize_title( $option ),
											'data_price' => '',
											'data_rules' => ( isset( $field['rules_filtered'][ esc_attr( sanitize_title( $option ) ) ] ) ? wp_json_encode( ( $field['rules_filtered'][ esc_attr( sanitize_title( $option ) ) ] ) ) : '' ),
											'data_original_rules' => ( isset( $field['rules_filtered'][ esc_attr( sanitize_title( $option ) ) ] ) ? wp_json_encode( ( $field['rules_filtered'][ esc_attr( sanitize_title( $option ) ) ] ) ) : '' ),
											'data_rulestype' => ( isset( $field['rules_type'][ esc_attr( sanitize_title( $option ) ) ] ) ? wp_json_encode( ( $field['rules_type'][ esc_attr( sanitize_title( $option ) ) ] ) ) : '' ),
											'text'       => apply_filters( 'woocommerce_tm_epo_option_name', isset( $wpml_options[ $k ] ) ? $wpml_options[ $k ] : $option, null, null ),
										];

										if ( isset( $_POST[ 'tmcp_' . $name_inc . $form_prefix_onform ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
											$option['selected'] = wp_unslash( $_POST[ 'tmcp_' . $name_inc . $form_prefix_onform ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
											$option['current']  = esc_attr( $option['value_to_show'] );
										}

										$args['options'][] = $option;

									}
									wc_get_template(
										'tm-' . $field['type'] . '.php',
										$args,
										$this->get_template_path(),
										$this->get_default_path()
									);
									++$element_counter;
									break;

								case 'radio':
								case 'checkbox':
									$labelclass       = '';
									$labelclass_start = '';
									$labelclass_end   = '';
									if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ) ) {
										$labelclass       = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
										$labelclass_start = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' );
										$labelclass_end   = true;
									}

									foreach ( $options as $k => $option ) {
										++$tabindex;

										if ( 'radio' === $field['type'] ) {
											$name_inc = 'radio_' . $element_counter;
										}
										if ( 'checkbox' === $field['type'] ) {
											$name_inc = 'checkbox_' . $element_counter . '_' . $field_counter;
										}

										$original_rules = isset( $field['rules_filtered'][ sanitize_title( $option ) ] ) ? wp_json_encode( ( $field['rules_filtered'][ sanitize_title( $option ) ] ) ) : '';
										if ( empty( $original_rules ) ) {
											$original_rules = '';
										}

										$checked = false;
										$value   = sanitize_title( $option );
										switch ( $field['type'] ) {

											case 'radio':
												$selected_value = '';
												$name           = 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform );

												if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $_POST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = wp_unslash( $_POST[ $name ] );// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
												} elseif ( empty( $_POST ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
												} elseif ( empty( $_POST ) || ! isset( $_POST[ $name ] ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = -1;
												}

												$checked = -1 !== $selected_value && esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $value );
												break;

											case 'checkbox':
												$selected_value = '';
												$name           = 'tmcp_' . $name_inc . ( $dummy_prefix ? '' : $form_prefix_onform );
												if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) && isset( $_POST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = wp_unslash( $_POST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
												} elseif ( empty( $_POST ) && isset( $_REQUEST[ $name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = wp_unslash( $_REQUEST[ $name ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
												} elseif ( ( ( THEMECOMPLETE_EPO()->is_quick_view() || empty( $_POST ) ) && empty( THEMECOMPLETE_EPO()->cart_edit_key ) ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) { // phpcs:ignore WordPress.Security.NonceVerification
													$selected_value = -1;
												}

												$checked = -1 !== $selected_value && esc_attr( stripcslashes( $selected_value ) ) === esc_attr( $value );
												break;
										}

										$label = apply_filters( 'woocommerce_tm_epo_option_name', isset( $wpml_options[ $k ] ) ? $wpml_options[ $k ] : $option, null, null );

										$args = [
											'element_id'   => 'tmcp_choice_' . $element_counter . '_' . $field_counter . '_' . $tabindex . $form_prefix,
											'name'         => isset( $name ) ? $name : '',
											'amount'       => '',
											'original_amount' => '',
											'tabindex'     => $tabindex,
											'fieldtype'    => $fieldtype,
											'rules'        => isset( $field['rules_filtered'][ sanitize_title( $option ) ] ) ? wp_json_encode( ( $field['rules_filtered'][ sanitize_title( $option ) ] ) ) : '',
											'original_rules' => $original_rules,
											'rules_type'   => isset( $field['rules_type'][ sanitize_title( $option ) ] ) ? wp_json_encode( ( $field['rules_type'][ sanitize_title( $option ) ] ) ) : '',
											'label_mode'   => '',
											'label_to_display' => $label,
											'swatch_class' => '',
											'swatch'       => [],
											'altsrc'       => [],
											'textafterprice' => '',
											'textbeforeprice' => '',
											'class'        => '',
											'element_data_attr_html' => '',
											'li_class'     => '',
											'exactlimit'   => '',
											'minimumlimit' => '',
											'url'          => '',
											'image'        => '',
											'imagec'       => '',
											'imagep'       => '',
											'imagel'       => '',
											'image_variations' => '',
											'checked'      => $checked,
											'use'          => '',
											'labelclass_start' => $labelclass_start,
											'labelclass'   => $labelclass,
											'labelclass_end' => $labelclass_end,
											'hide_amount'  => ! empty( $field['hide_price'] ) ? ' hidden' : '',
											'tax_obj'      => false,
											'border_type'  => '',
											'label'        => $label,
											'value'        => $value,
											'replacement_mode' => 'none',
											'swatch_position' => 'center',
											'limit'        => empty( $field['limit'] ) ? '' : $field['limit'],
										];
										wc_get_template(
											'tm-' . $field['type'] . '.php',
											$args,
											$this->get_template_path(),
											$this->get_default_path()
										);
										++$field_counter;
									}
									++$element_counter;
									break;

							}
						}

						wc_get_template(
							'tm-field-end.php',
							[],
							$this->get_template_path(),
							$this->get_default_path()
						);

						++$unit_counter;
					}
				}
			}
		}

		return [
			'tabindex'        => $tabindex,
			'unit_counter'    => $unit_counter,
			'field_counter'   => $field_counter,
			'element_counter' => $element_counter,
			'_currency'       => $_currency,
		];
	}

	/**
	 * Display totals box
	 *
	 * @param mixed   $product_id The product id.
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $is_from_shortcode If we are in a shortcode.
	 * @return void
	 */
	public function tm_epo_totals( $product_id = 0, $form_prefix = '', $is_from_shortcode = false ) {
		if ( $this->block_epo ) {
			return;
		}

		global $product, $woocommerce;

		if ( ! property_exists( $woocommerce, 'product_factory' )
			|| null === $woocommerce->product_factory
			|| ( $this->tm_options_have_been_displayed && ( ! ( THEMECOMPLETE_EPO()->is_bto || ( ( THEMECOMPLETE_EPO()->is_enabled_shortcodes() && ! $is_from_shortcode ) && ! is_product() ) || ( ( is_shop() || is_product_category() || is_product_tag() ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) ) ) ) )
		) {
			return;// bad function call.
		}

		$this->print_price_fields( $product_id, $form_prefix, $is_from_shortcode );
		if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) && ! $is_from_shortcode ) {
			$this->tm_options_totals_have_been_displayed = true;
		}
	}

	/**
	 * Batch displayh totals box
	 *
	 * @param string $form_prefix The form prefix.
	 * @return void
	 */
	private function tm_epo_totals_batch( $form_prefix = '' ) {
		foreach ( $this->current_product_id_to_be_displayed_check as $key => $product_id ) {
			if ( ! empty( $product_id ) ) {
				$this->print_price_fields( $product_id, $form_prefix );
				if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ) !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ) ) {
					if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
						unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );
					}
				}
			}
		}
		if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
			if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ) !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ) ) {
				$this->epo_internal_counter       = 0;
				$this->epo_internal_counter_check = [];
			}
		}
	}

	/**
	 * Display totals box
	 *
	 * @param mixed   $product_id The product id.
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $is_from_shortcode If we are in a shortcode.
	 * @return void
	 */
	private function print_price_fields( $product_id = 0, $form_prefix = '', $is_from_shortcode = false ) {
		if ( $product_id instanceof WC_Product ) {
			$product    = $product_id;
			$product_id = themecomplete_get_id( $product );
		} elseif ( ! is_null( $product_id ) ) {
			$product_id = floatval( trim( $product_id ) );
			if ( ! $product_id ) {
				global $product;
				if ( $product ) {
					$product_id = themecomplete_get_id( $product );
				}
			} else {
				$product = wc_get_product( $product_id );
			}
		}

		if ( ! $product_id || empty( $product ) ) {
			if ( ! empty( $this->current_product_id_to_be_displayed ) ) {
				$product_id = $this->current_product_id_to_be_displayed;
				$product    = wc_get_product( $product_id );
			} else {
				$this->tm_epo_totals_batch( $form_prefix );

				return;
			}
		}
		if ( ! $product_id || ! $product instanceof WC_Product ) {
			return;
		}

		$product_id = absint( $product_id );

		$type = themecomplete_get_product_type( $product );

		if ( 'grouped' === $type ) {
			return;
		}

		$cpf_price_array = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id, $form_prefix, false, true );
		if ( ! $cpf_price_array ) {
			return;
		}

		if ( THEMECOMPLETE_EPO()->is_associated === false && 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' ) ) {
			$global_price_array = $cpf_price_array['global'];
			$local_price_array  = $cpf_price_array['local'];
			if ( empty( $global_price_array ) && empty( $local_price_array ) ) {
				if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
					if ( empty( $this->epo_internal_counter ) || ! isset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] ) ) {
						// First time displaying totals and fields haven't been displayed.
						++$this->epo_internal_counter;
						$this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] = $this->epo_internal_counter;
					} else {
						// Fields have already been displayed.
						unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );
						$this->current_product_id_to_be_displayed = 0;
						$this->unique_form_prefix                 = '';
					}
					$_epo_internal_counter = $this->epo_internal_counter;
				} else {
					$_epo_internal_counter = 0;
				}

				return;
			}
		}

		THEMECOMPLETE_EPO()->set_tm_meta( $product_id );

		$force_quantity = 0;
		if ( THEMECOMPLETE_EPO()->cart_edit_key ) {
			$cart_item_key = THEMECOMPLETE_EPO()->cart_edit_key;
			$cart_item     = WC()->cart->get_cart_item( $cart_item_key );

			if ( isset( $cart_item['quantity'] ) ) {
				$force_quantity = $cart_item['quantity'];
			}
		}

		if ( ! $form_prefix && THEMECOMPLETE_EPO()->is_quick_view() ) {
			if ( ! $this->unique_form_prefix ) {
				$this->unique_form_prefix = uniqid( '' );
			}
			$form_prefix = '_tcform' . $this->unique_form_prefix;
		}

		if ( ! ( THEMECOMPLETE_EPO()->is_bto || THEMECOMPLETE_EPO()->is_inline_epo ) ) {
			if ( empty( $this->epo_internal_counter ) || ! isset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] ) ) {
				// First time displaying totals and fields haven't been displayed.
				++$this->epo_internal_counter;
				$this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] = $this->epo_internal_counter;
			} else {
				// Fields have already been displayed.
				unset( $this->epo_internal_counter_check[ 'tc' . $this->epo_internal_counter ] );
				$this->current_product_id_to_be_displayed = 0;
				$this->unique_form_prefix                 = '';
			}
			$_epo_internal_counter = $this->epo_internal_counter;
		} elseif ( THEMECOMPLETE_EPO()->is_inline_epo && $this->epo_internal_counter ) {
			$_epo_internal_counter = $this->epo_internal_counter;
		} else {
			$_epo_internal_counter = 0;
		}

		if ( ! $form_prefix && THEMECOMPLETE_EPO()->wc_vars['is_page'] ) {
			$form_prefix = 'tcform' . $_epo_internal_counter;
		}

		if ( $form_prefix ) {
			$form_prefix = '_' . $form_prefix;
		}

		$minmax = [];

		$minmax['min_price']         = $product->get_price();
		$minmax['min_regular_price'] = $product->get_regular_price();

		if ( function_exists( 'WC_CP' ) && version_compare( WC_CP()->version, '3.8', '<' ) && 'composite' === themecomplete_get_product_type( $product ) && is_callable( [ $product, 'get_base_price' ] ) ) {
			$_price = apply_filters( 'woocommerce_tm_epo_price_compatibility', $product->get_base_price(), $product );
		} else {
			$_price = apply_filters( 'woocommerce_tm_epo_price_compatibility', $minmax['min_price'], $product );
		}

		$price            = [];
		$price['product'] = []; // product price rules.
		$price['price']   = apply_filters( 'wc_epo_product_price', $_price ); // product price.

		$price = apply_filters( 'wc_epo_product_price_rules', $price, $product );

		$regular_price            = [];
		$regular_price['product'] = []; // product price rules.
		$regular_price['price']   = apply_filters( 'wc_epo_product_price', $minmax['min_regular_price'] ); // product price.

		$regular_price = apply_filters( 'wc_epo_product_regular_price_rules', $regular_price, $product );

		// Woothemes Dynamic Pricing (not yet fully compatible).
		if ( class_exists( 'WC_Dynamic_Pricing' ) ) {
			$id = isset( $product->variation_id ) ? $product->variation_id : themecomplete_get_id( $product );
			$dp = WC_Dynamic_Pricing::instance();
			if ( $dp &&
				is_object( $dp ) && property_exists( $dp, 'discounted_products' )
				&& isset( $dp->discounted_products[ $id ] )
			) {
				$_price = $dp->discounted_products[ $id ];
			} else {
				$_price = $product->get_price();
			}
			$price['price'] = apply_filters( 'wc_epo_product_price', $_price ); // product price.
		}

		$variations = [];

		if ( in_array( themecomplete_get_product_type( $product ), apply_filters( 'wc_epo_variable_product_type', [ 'variable' ], $product ), true ) && 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_variation_prices_array' ) ) {
			if ( method_exists( $product, 'get_available_variations' ) ) {
				foreach ( $product->get_available_variations() as $variation ) {

					$child_id          = $variation['variation_id'];
					$product_variation = wc_get_product( $child_id );

					if ( ! $product_variation instanceof WC_Product ) {
						continue;
					}

					if ( $this->discount ) {
						$current_price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $product_variation->get_price(), $this->discount, $this->discount_type );
						$product_variation->set_sale_price( $current_price );
						$product_variation->set_price( $current_price );
					}

					// Make sure we always have untaxed price here.
					if ( ! wc_prices_include_tax() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) ) {
						$variation_price = themecomplete_get_price_excluding_tax(
							$product_variation,
							[
								'qty'   => 1,
								'price' => $product_variation->get_price(),
							]
						);
					} else {
						$variation_price = $product_variation->get_price();
					}

					if ( isset( $variation['attributes'] ) && is_array( $variation['attributes'] ) ) {
						$atts = 0;
						foreach ( $variation['attributes'] as $att => $value_att ) {
							if ( isset( $_REQUEST[ $att ] ) && (string) $_REQUEST[ $att ] === (string) $value_att ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								++$atts;
							}
						}
						if ( count( $variation['attributes'] ) === $atts ) {
							$price['price'] = apply_filters( 'wc_epo_product_price', $variation_price ); // product price.
						}
					}

					do_action( 'wc_epo_print_price_fields_in_variation_loop', $product_variation, $child_id );

					$variations[ $child_id ] = apply_filters( 'woocommerce_tm_epo_price_compatibility', apply_filters( 'wc_epo_product_price', $variation_price, '', false ), $product_variation, $child_id );

				}
			}
		}

		global $woocommerce;
		$cart = $woocommerce->cart;

		$tax_rate = $this->get_tax_rate( themecomplete_get_tax_class( $product ) );

		$taxable          = $product->is_taxable();
		$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );
		$tax_string       = '';
		if ( $taxable && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_tax_string_suffix' ) ) {
			if ( 'excl' === $tax_display_mode ) {

				$tax_string = ' <small>' . apply_filters( 'wc_epo_ex_tax_or_vat_string', WC()->countries->ex_tax_or_vat() ) . '</small>';

			} else {

				$tax_string = ' <small>' . apply_filters( 'wc_epo_inc_tax_or_vat_string', WC()->countries->inc_tax_or_vat() ) . '</small>';

			}
		}
		if ( $taxable && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_wc_price_suffix' ) ) {
			$tax_string .= ' <small>' . get_option( 'woocommerce_price_display_suffix' ) . '</small>';
		}

		$taxes_of_one        = 0;
		$base_taxes_of_one   = 0;
		$modded_taxes_of_one = 0;

		$is_vat_exempt            = -1;
		$non_base_location_prices = -1;
		$base_tax_rate            = $tax_rate;
		if ( class_exists( 'WC_Tax' ) && version_compare( get_option( 'woocommerce_version' ), '2.4', '>=' ) ) {
			$tax_rates      = WC_Tax::get_rates( themecomplete_get_tax_class( $product ) );
			$base_tax_rates = WC_Tax::get_base_tax_rates( themecomplete_get_tax_class( $product, 'unfiltered' ) );
			$base_tax_rate  = 0;
			foreach ( $base_tax_rates as $key => $value ) {
				$base_tax_rate = $base_tax_rate + floatval( $value['rate'] );
			}
			$tax_rate = 0;
			foreach ( $tax_rates as $key => $value ) {
				$tax_rate = $tax_rate + floatval( $value['rate'] );
			}
			$is_vat_exempt            = true === ( WC()->customer instanceof WC_Customer && WC()->customer->is_vat_exempt() ) ? 1 : 0;
			$non_base_location_prices = ( $tax_rates !== $base_tax_rates && true === apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) ? 1 : 0;

			$precision    = wc_get_rounding_precision();
			$price_of_one = 1 * ( pow( 10, $precision ) );

			$taxes_of_one = array_sum( WC_Tax::calc_tax( $price_of_one, $tax_rates, wc_prices_include_tax() ) );
			if ( $non_base_location_prices ) {
				$prices_include_tax = true;
			} else {
				$prices_include_tax = wc_prices_include_tax();
			}
			$base_taxes_of_one   = array_sum( WC_Tax::calc_tax( $price_of_one, $base_tax_rates, $prices_include_tax ) );
			$modded_taxes_of_one = array_sum( WC_Tax::calc_tax( $price_of_one - $base_taxes_of_one, $tax_rates, false ) );

			$taxes_of_one        = $taxes_of_one / ( pow( 10, $precision ) );
			$base_taxes_of_one   = $base_taxes_of_one / ( pow( 10, $precision ) );
			$modded_taxes_of_one = $modded_taxes_of_one / ( pow( 10, $precision ) );

		}

		$forcart        = 'main';
		$classcart      = 'tm-cart-main';
		$classtotalform = 'tm-totals-form-main';
		$form_prefix_id = str_replace( '_', '', $form_prefix );
		if ( ! empty( $form_prefix ) ) {
			$forcart        = $form_prefix_id;
			$classcart      = 'tm-cart-' . $form_prefix_id;
			$classtotalform = 'tm-totals-form-' . $form_prefix_id;
		}

		if ( THEMECOMPLETE_EPO()->is_associated ) {
			$classtotalform .= ' tm-totals-form-inline';
			$classcart      .= ' tm-cart-inline';
		}

		do_action(
			'wc_epo_before_totals_box',
			[
				'product_id'        => $product_id,
				'form_prefix'       => $form_prefix,
				'is_from_shortcode' => $is_from_shortcode,
			]
		);
		if ( $is_from_shortcode ) {
			add_action( 'wc_epo_totals_form', [ $this, 'woocommerce_before_add_to_cart_button' ], 10, 1 );
		}

		$tm_epo_final_total_box = ( empty( THEMECOMPLETE_EPO()->tm_meta_cpf['override_final_total_box'] ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_box' ) : THEMECOMPLETE_EPO()->tm_meta_cpf['override_final_total_box'];
		if ( THEMECOMPLETE_EPO()->is_associated === true && ! THEMECOMPLETE_EPO_API()->has_options( $product_id ) ) {
			$tm_epo_final_total_box = 'disable';
		}
		$tm_epo_final_total_box = THEMECOMPLETE_EPO_SETTINGS()->get_compatibility_value( 'tm_epo_final_total_box', $tm_epo_final_total_box );

		$tm_epo_show_options_total = ( empty( THEMECOMPLETE_EPO()->tm_meta_cpf['override_show_options_total'] ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_options_total' ) : THEMECOMPLETE_EPO()->tm_meta_cpf['override_final_total_box'];
		$tm_epo_show_final_total   = ( empty( THEMECOMPLETE_EPO()->tm_meta_cpf['override_show_final_total'] ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_final_total' ) : THEMECOMPLETE_EPO()->tm_meta_cpf['override_show_final_total'];

		$tc_form_prefix_name = 'tc_form_prefix';
		if ( THEMECOMPLETE_EPO()->is_associated ) {
			$tc_form_prefix_name = 'tc_form_prefix_assoc[' . THEMECOMPLETE_EPO()->associated_element_uniqid . ']';
			if ( false !== THEMECOMPLETE_EPO()->associated_product_counter ) {
				$tc_form_prefix_name = $tc_form_prefix_name . '[' . THEMECOMPLETE_EPO()->associated_product_counter . ']';
			}
		}

		wc_get_template(
			'tm-totals.php',
			apply_filters(
				'wc_epo_template_args_tm_totals',
				[

					'classcart'                 => $classcart,
					'forcart'                   => $forcart,
					'classtotalform'            => $classtotalform,
					'is_on_sale'                => $product->is_on_sale(),

					'variations'                => wp_json_encode( (array) $variations ),

					'is_sold_individually'      => $product->is_sold_individually(),
					'hidden'                    => 'disable' === THEMECOMPLETE_EPO()->tm_meta_cpf['override_final_total_box'] ? ' hidden' : '',
					'price_override'            => ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
						? 0
						: ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
							? 1
							: ( ! empty( THEMECOMPLETE_EPO()->tm_meta_cpf['price_override'] ) ? 1 : 0 ) ),
					'form_prefix'               => $form_prefix_id,
					'tc_form_prefix_name'       => $tc_form_prefix_name,
					'tc_form_prefix_class'      => ( THEMECOMPLETE_EPO()->is_associated ) ? 'tc_form_prefix_assoc' : 'tc_form_prefix',
					'product_type'              => themecomplete_get_product_type( $product ),
					'price'                     => apply_filters( 'woocommerce_tm_final_price', $price['price'], $product ),
					'regular_price'             => apply_filters( 'woocommerce_tm_final_price', $regular_price['price'], $product ),
					'is_vat_exempt'             => $is_vat_exempt,
					'non_base_location_prices'  => $non_base_location_prices,
					'taxable'                   => $taxable,
					'tax_display_mode'          => $tax_display_mode,
					'prices_include_tax'        => wc_prices_include_tax(),
					'tax_rate'                  => $tax_rate,
					'base_tax_rate'             => $base_tax_rate,
					'base_taxes_of_one'         => $base_taxes_of_one,
					'taxes_of_one'              => $taxes_of_one,
					'modded_taxes_of_one'       => $modded_taxes_of_one,
					'tax_string'                => $tax_string,
					'product_price_rules'       => wp_json_encode( (array) $price['product'] ),
					'fields_price_rules'        => 0,
					'force_quantity'            => $force_quantity,
					'product_id'                => $product_id,
					'epo_internal_counter'      => $_epo_internal_counter,
					'is_from_shortcode'         => $is_from_shortcode,
					'tm_epo_final_total_box'    => $tm_epo_final_total_box,
					'tm_epo_show_final_total'   => $tm_epo_show_final_total,
					'tm_epo_show_options_total' => $tm_epo_show_options_total,

				],
				$product
			),
			$this->get_template_path(),
			$this->get_default_path()
		);

		do_action(
			'wc_epo_after_totals_box',
			[
				'product_id'        => $product_id,
				'form_prefix'       => $form_prefix,
				'is_from_shortcode' => $is_from_shortcode,
			]
		);
	}
}
includes/classes/index.php000064400000000126150755142450011636 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/classes/class-themecomplete-epo-html-base.php000064400000043122150755142450017123 0ustar00<?php
/**
 * Extra Product Options HTML creation class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options HTML creation class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_HTML_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_HTML_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_HTML_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
	}

	/**
	 * Ouputs a fontawesome icon
	 *
	 * @param string          $id The icon identifier.
	 * @param integer|boolean $output If we should echo the result or not.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function create_icon( $id = '', $output = 1 ) {
		ob_start();

		echo wp_kses(
			apply_filters( 'wc_epo_create_icon', "<i class='tcfa tcfa-" . esc_attr( $id ) . "'></i>" ),
			[
				'i' => [ 'class' => true ],
			]
		);

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}

	/**
	 * Displays attributes list from an array
	 *
	 * @param array<mixed> $element_data_attr Element data attributes.
	 * @return void
	 * @since 1.0
	 */
	public function create_attribute_list( $element_data_attr = [] ) {
		if ( is_array( $element_data_attr ) ) {
			foreach ( $element_data_attr as $k => $v ) {
				if ( 'required' === $k ) {
					echo 'required="required" ';
				} elseif ( 'disabled' === $k ) {
					echo 'disabled="disabled" ';
				} else {
					echo esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '" ';
				}
			}
		}
	}

	/**
	 * Creates a button
	 *
	 * @param array<mixed>    $args Array of arguments.
	 * @param integer|boolean $output If the result should be displayed or retuned.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function create_button( $args = [], $output = 0 ) {
		if ( empty( $args ) || ! is_array( $args ) ) {
			return;
		}

		if ( ! is_array( $args['tags'] ) ) {
			$args['tags'] = [];
		}

		if ( ! isset( $args['tags']['type'] ) ) {
			$args['tags']['type'] = 'button';
		}

		ob_start();

		if ( 'a' === $args['tags']['type'] ) {
			echo '<a';
		} else {
			echo '<button';
		}

		$this->create_field_attributes( $args['tags'] );

		echo '>';
		if ( isset( $args['icon'] ) ) {
			$this->create_icon( $args['icon'], 1 );
		}
		echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['text'] ), $args['text'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
		if ( 'a' === $args['tags']['type'] ) {
			echo '</a>';
		} else {
			echo '</button>';
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}

	/**
	 * Creates field attributes
	 *
	 * @param array<mixed> $atts Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function create_field_attributes( $atts = [] ) {
		if ( is_array( $atts ) ) {
			foreach ( $atts as $k => $v ) {
				if ( 'required' === $k ) {
					echo ' required="required"';
				} elseif ( 'disabled' === $k ) {
					echo ' disabled="disabled"';
				} else {
					echo ' ' . esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '"';
				}
			}
		}
	}

	/**
	 * Creates a select box
	 *
	 * @param array<mixed>        $select_array Array of arguments.
	 * @param array<mixed>        $option_array Array of choices.
	 * @param string|array<mixed> $selected_value The selecte value.
	 * @param integer|boolean     $label If the label should be displayed.
	 * @param integer|boolean     $output If the result should be displayed or retuned.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function create_dropdown( $select_array, $option_array, $selected_value = '/n', $label = 1, $output = 1 ) {
		if ( ! is_array( $select_array ) ) {
			return '';
		}
		if ( ! is_array( $option_array ) ) {
			return '';
		}

		ob_start();

		if ( ! empty( $select_array['id'] ) && ! empty( $label ) ) {
			echo '<label for="' . esc_attr( $select_array['id'] ) . '"';
			if ( ! empty( $select_array['label_class'] ) ) {
				echo ' class="' . esc_attr( $select_array['label_class'] ) . '"';
			}
			echo '>';
		}

		echo '<select';

		if ( ! empty( $select_array['class'] ) ) {
			echo ' class="' . esc_attr( $select_array['class'] ) . '"';
		}
		if ( ! empty( $select_array['id'] ) ) {
			echo ' id="' . esc_attr( $select_array['id'] ) . '"';
		}
		if ( ! empty( $select_array['name'] ) ) {
			echo ' name="' . esc_attr( $select_array['name'] ) . '"';
		}
		if ( isset( $select_array['size'] ) ) {
			echo ' size="' . esc_attr( $select_array['size'] ) . '"';
		}
		if ( isset( $select_array['multiple'] ) ) {
			echo ' multiple="multiple"';
		}
		if ( ! empty( $select_array['disabled'] ) ) {
			echo ' disabled="disabled"';
		}
		if ( ! empty( $select_array['required'] ) ) {
			echo ' required="required"';
		}
		if ( isset( $select_array['atts'] ) && is_array( $select_array['atts'] ) ) {
			unset( $select_array['atts']['class'] );
			unset( $select_array['atts']['id'] );
			unset( $select_array['atts']['name'] );
			unset( $select_array['atts']['size'] );
			unset( $select_array['atts']['multiple'] );
			unset( $select_array['atts']['disabled'] );
			$this->create_field_attributes( $select_array['atts'] );
		}

		echo '>';

		$count_option_array = count( $option_array );
		for ( $i = 0; $i < $count_option_array; $i++ ) {
			if ( isset( $option_array[ $i ]['optgroupstart'] ) ) {
				echo '<optgroup label="' . esc_attr( $option_array[ $i ]['optgroupstart'] ) . '">';
			} elseif ( isset( $option_array[ $i ]['optgroupend'] ) ) {
				echo '</optgroup>';
			} else {
				$sel = false;
				if ( isset( $option_array[ $i ]['selected'] ) && true === $option_array[ $i ]['selected'] ) {
					$sel = true;
				} elseif ( '/n' !== $selected_value && ! is_array( $selected_value ) ) {
					if ( (string) $selected_value === (string) $option_array[ $i ]['value'] ) {
						$sel = true;
					}
				} elseif ( is_array( $selected_value ) && in_array( $option_array[ $i ]['value'], $selected_value ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
					$sel = true;
				}

				echo '<option';

				if ( isset( $option_array[ $i ]['title'] ) ) {
					echo ' title="' . esc_attr( $option_array[ $i ]['title'] ) . '"';
				}
				if ( isset( $option_array[ $i ]['id'] ) ) {
					echo ' id="' . esc_attr( $option_array[ $i ]['id'] ) . '"';
				}
				if ( isset( $option_array[ $i ]['class'] ) ) {
					echo ' class="' . esc_attr( $option_array[ $i ]['class'] ) . '"';
				}
				if ( $sel ) {
					echo ' selected="selected"';
				}

				if ( isset( $option_array[ $i ]['atts'] ) && is_array( $option_array[ $i ]['atts'] ) ) {
					$this->create_field_attributes( $option_array[ $i ]['atts'] );
				}

				echo ' value="' . esc_attr( $option_array[ $i ]['value'] ) . '">';
				echo esc_html( $option_array[ $i ]['text'] );
				echo '</option>';
			}
		}

		echo '</select>';

		if ( ! empty( $select_array['id'] ) && ! empty( $label ) ) {
			echo '</label>';
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}

	/**
	 * Creates a form field
	 *
	 * @param array<mixed>    $args Array of arguments.
	 * @param integer|boolean $output If the result should be displayed or retuned.
	 * @return string|void|false
	 * @since 1.0
	 */
	public function create_field( $args, $output = 0 ) {

		if ( ! is_array( $args ) ) {
			return;
		}
		if ( isset( $args['noecho'] ) ) {
			return;
		}

		ob_start();

		$tags = [];
		if ( isset( $args['tags'] ) && is_array( $args['tags'] ) ) {
			if ( isset( $args['type'] ) && ( 'range' === $args['type'] || 'input' === $args['type'] || 'text' === $args['type'] || 'number' === $args['type'] || 'hidden' === $args['type'] ) ) {
				if ( ! isset( $args['default'] ) ) {
					$args['default'] = '';
				}
				$args['tags']['value'] = $args['default'];
				if ( 'number' === $args['type'] ) {
					if ( ! isset( $args['tags']['step'] ) ) {
						$args['tags']['step'] = 'any';
					}
				}
			}
			if ( isset( $args['type'] ) && 'range' === $args['type'] && ! isset( $args['tags']['class'] ) ) {
				$args['tags']['class'] = 'range';
			} elseif ( isset( $args['type'] ) && 'range' === $args['type'] && isset( $args['tags']['class'] ) ) {
				$args['tags']['class'] = 'range ' . $args['tags']['class'];
			}

			$args['tags_original'] = $args['tags'];
			$tags                  = $args['tags'];
		}

		$disabled = false;
		if ( ! empty( $args['disabled'] ) ) {
			$disabled = true;
			if ( isset( $args['message0x0_class'] ) ) {
				$args['message0x0_class'] .= ' tm-setting-row-disabled';
			} else {
				$args['message0x0_class'] = 'tm-setting-row-disabled';
			}
			if ( isset( $args['tags'] ) && is_array( $args['tags'] ) ) {
				if ( isset( $args['tags']['class'] ) ) {
					$args['tags']['class'] .= ' tm-wmpl-disabled';
				} else {
					$args['tags']['class'] = 'tm-wmpl-disabled';
				}
			}
		}

		if ( empty( $args['nodiv'] ) ) {
			if ( empty( $args['nostart'] ) ) {
				if ( empty( $args['nowrap_start'] ) ) {
					echo '<div';
					if ( isset( $args['divid'] ) ) {
						echo ' id="' . esc_attr( $args['divid'] ) . '"';
					}
					if ( isset( $args['required'] ) ) {
						echo ' data-required="' . esc_attr( (string) wp_json_encode( $args['required'] ) ) . '"';
					}
					echo ' class="message0x0 tc-clearfix';
					if ( isset( $args['message0x0_class'] ) ) {
						echo ' ' . esc_attr( $args['message0x0_class'] );
					}
					echo '">';
				}
				if ( ! empty( $args['nowrap_start'] ) && ! empty( $args['noclear'] ) ) {
					echo '<div class="clear">&nbsp;</div>';
				}
				if ( isset( $args['wrap_div'] ) && is_array( $args['wrap_div'] ) ) {
					echo '<div ';
					foreach ( $args['wrap_div'] as $k => $v ) {
						echo ' ' . esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '"';
					}
					echo '>';
				}
				if ( empty( $args['nolabel'] ) && ! empty( $args['label'] ) ) {
					echo '<div class="message2x1';
					if ( ! empty( $args['leftclass'] ) ) {
						echo ' ' . esc_attr( $args['leftclass'] );
					}
					echo '">';
					if ( isset( $args['tags'] ) && isset( $args['tags']['id'] ) ) {
						echo '<label for="' . esc_attr( $args['tags']['id'] ) . ( 'radio' === $args['type'] ? '0' : '' ) . '">';
					}
					echo '<span>' . wp_kses_post( $args['label'] ) . '</span>';
					if ( isset( $args['tags'] ) && isset( $args['tags']['id'] ) ) {
						echo '</label>';
					}
					if ( ! empty( $args['desc'] ) ) {
						echo "<div class='messagexdesc'>";
						echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['desc'] ), $args['desc'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
						echo '</div>';
					}
					echo '</div>';
				}
			} elseif ( isset( $args['tags'] ) && isset( $args['tags']['id'] ) && isset( $args['label'] ) ) {
				echo '<label for="' . esc_attr( $args['tags']['id'] ) . '"><span>' . esc_html( $args['label'] ) . '</span></label>';
			}
		}

		if ( empty( $args['nodiv'] ) && empty( $args['nostart'] ) ) {
			echo '<div class="message2x2';
			if ( ! empty( $args['rightclass'] ) ) {
				echo ' ' . esc_attr( $args['rightclass'] );
			}
			echo '">';
		}
		if ( isset( $args['prepend_element_html'] ) ) {
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['prepend_element_html'] ), $args['prepend_element_html'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
		}
		if ( ! empty( $args['html_before_field'] ) ) {
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['html_before_field'] ), $args['html_before_field'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
		}
		if ( isset( $args['type'] ) ) {
			switch ( $args['type'] ) {
				case 'div':
					echo '<div';
					$this->create_field_attributes( $tags );
					echo '>';
					if ( isset( $args['html'] ) ) {
						echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['html'] ), $args['html'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
					}
					echo '</div>';
					break;
				case 'custom':
				case 'custom_multiple':
					if ( isset( $args['html'] ) ) {
						if ( is_array( $args['html'] ) ) {
							$method     = $args['html'][0];
							$methodargs = $args['html'][1];
							call_user_func_array( $method, $methodargs );
						} else {
							echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['html'] ), $args['html'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
						}
					}
					break;
				case 'hidden':
				case 'text':
				case 'number':
				case 'file':
					echo '<input';
					disabled( $disabled, true );
					echo ' type="' . esc_attr( $args['type'] ) . '"';
					$this->create_field_attributes( $tags );
					echo '>';
					break;
				case 'input':
					if ( isset( $args['input_type'] ) ) {
						echo '<input';
						disabled( $disabled, true );
						echo ' type="' . esc_attr( $args['input_type'] ) . '"';
						$this->create_field_attributes( $tags );
						echo '>';
					}
					break;
				case 'range':
					echo '<div class="rangewrapper">';
					echo '<input';
					disabled( $disabled, true );
					echo ' type="text"';
					$this->create_field_attributes( $tags );
					echo '>';
					echo '</div>';
					break;
				case 'textarea':
					echo '<textarea';
					disabled( $disabled, true );
					$this->create_field_attributes( $tags );
					echo '>' . esc_textarea( $args['default'] ) . '</textarea>';
					break;
				case 'checkbox':
					echo '<input';
					disabled( $disabled, true );
					echo ' type="checkbox"';
					$this->create_field_attributes( $tags );
					checked( ( (string) $args['default'] === (string) $args['tags']['value'] ), true );
					echo '>';
					break;
				case 'radio':
					$tags_original = $tags;
					foreach ( $args['options'] as $tx => $vl ) {
						echo '<input';
						disabled( $disabled, true );
						checked( ( (string) $args['default'] === (string) $vl['value'] ), true );
						$tags          = $tags_original;
						$tags['id']    = $tags_original['id'] . $tx;
						$tags['value'] = $vl['value'];
						if ( ! empty( $vl['class'] ) ) {
							if ( ! empty( $vl['class'] ) ) {
								$tags['class'] .= ' ' . $vl['class'];
							} else {
								$tags['class'] = $vl['class'];
							}
						}
						$this->create_field_attributes( $tags );
						echo ' type="radio">';
						echo '<label for="' . esc_attr( $args['tags']['id'] ) . esc_attr( $tx ) . '"';
						if ( ! empty( $vl['label_class'] ) ) {
							$this->create_field_attributes( [ 'class' => $vl['label_class'] ] );
						}
						echo '>';
						echo '<span class="tc-radio-text">' . esc_html( $vl['text'] ) . '</span></label>';
					}
					break;
				case 'select':
					$select_array = [
						'class'    => isset( $args['tags']['class'] ) ? $args['tags']['class'] : '',
						'id'       => $args['tags']['id'],
						'name'     => $args['tags']['name'],
						'disabled' => ! empty( $disabled ),
						'atts'     => $args['tags'],
					];
					if ( isset( $args['multiple'] ) ) {
						$select_array['multiple'] = $args['multiple'];
					}
					if ( isset( $args['size'] ) ) {
						$select_array['size'] = $args['size'];
					}
					$this->create_dropdown( $select_array, $args['options'], $args['default'], 0, 1 );
					break;
				case 'select2':
					$select_array = [
						'class'    => $args['tags']['class'],
						'id'       => $args['tags']['id'],
						'name'     => $args['tags']['name'],
						'disabled' => ! empty( $disabled ),
						'atts'     => $args['tags'],
					];

					if ( isset( $args['multiple'] ) ) {
						$select_array['multiple'] = $args['multiple'];
					}
					if ( isset( $args['size'] ) ) {
						$select_array['size'] = $args['size'];
					}
					$this->create_dropdown( $select_array, $args['options'], $args['default'], 1, 1 );
					break;
				case 'select3':
					$select_array = [
						'class'    => isset( $args['tags']['class'] ) ? $args['tags']['class'] : '',
						'id'       => $args['tags']['id'],
						'name'     => $args['tags']['name'],
						'disabled' => ! empty( $disabled ),
						'atts'     => $args['tags'],
					];
					if ( isset( $args['multiple'] ) ) {
						$select_array['multiple'] = $args['multiple'];
					}
					if ( isset( $args['size'] ) ) {
						$select_array['size'] = $args['size'];
					}
					echo '<span class="select_wrap' . ( isset( $args['multiple'] ) ? ' multiple' : '' ) . '"><span class="select_style">';
					$this->create_dropdown( $select_array, $args['options'], $args['default'], 0, 1 );
					echo '<span class="select_value"></span><span class="select_icon"></span></span></span>';
					break;
			}
		}
		if ( ! empty( $args['html_after_field'] ) ) {
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['html_after_field'] ), $args['html_after_field'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
		}
		if ( isset( $args['extra'] ) ) {
			if ( is_array( $args['extra'] ) ) {
				$method     = $args['extra'][0];
				$methodargs = $args['extra'][1];
				call_user_func_array( $method, $methodargs );
			} else {
				echo apply_filters( 'wc_epo_kses', wp_kses_post( $args['extra'] ), $args['extra'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
			}
		}
		if ( empty( $args['nodiv'] ) && empty( $args['noend'] ) ) {
			echo '</div>';
			if ( isset( $args['extra_fields'] ) && is_array( $args['extra_fields'] ) ) {
				foreach ( $args['extra_fields'] as $k => $extra_field ) {
					echo '<div class="message2x' . esc_attr( strval( $k + 3 ) ) . '">';
					$this->create_field( $extra_field, true );
					echo '</div>';
				}
			}
			if ( isset( $args['wrap_div'] ) && is_array( $args['wrap_div'] ) ) {
				echo '</div>';
			}
			if ( empty( $args['nowrap_end'] ) ) {
				echo '</div>';
			}
		}

		if ( $output ) {
			ob_end_flush();
		} else {
			return ob_get_clean();
		}
	}
}
includes/classes/class-themecomplete-epo-api-base.php000064400000062500150755142450016731 0ustar00<?php
/**
 * Extra Product Options API class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options API class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_API_Base {

	/**
	 * Cache for the has_options method
	 *
	 * @var array<mixed>
	 */
	private $cpf = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_API_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @since 1.0
	 * @return THEMECOMPLETE_EPO_API_Base
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
	}

	/**
	 * Returns a list of image extensions
	 *
	 * @return array<string>
	 */
	public function get_image_extensions() {
		return [ 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'webp', 'tiff', 'tif', 'svg' ];
	}

	/**
	 * Checks if the product with id=$product_id has options
	 *
	 * @param mixed $product_id The product id.
	 *
	 * @return array<mixed>|boolean
	 */
	public function has_options( $product_id = 0 ) {
		if ( $product_id && 0 !== $product_id && is_numeric( $product_id ) ) {
			$post_id = $product_id;
		} else {
			$post_id = get_the_ID();
		}

		$post_id = absint( $post_id );

		if ( ! empty( $this->cpf[ $post_id ] ) ) {
			return $this->cpf[ $post_id ];
		}

		$has_epo         = false;
		$cpf_price_array = THEMECOMPLETE_EPO()->get_product_tm_epos( $post_id, '', false, true );

		if ( $cpf_price_array ) {
			$global_price_array = $cpf_price_array['global'];
			$local_price_array  = $cpf_price_array['local'];
			if ( empty( $global_price_array ) && empty( $local_price_array ) ) {
				return false;
			}

			$has_epo = [];
			if ( ! empty( $global_price_array ) ) {
				if ( isset( $cpf_price_array['raw_epos'] ) && is_array( $cpf_price_array['raw_epos'] ) ) {
					if ( 1 === count( $cpf_price_array['raw_epos'] ) && 'variations' === join( '', $cpf_price_array['raw_epos'] ) ) {
						$has_epo['variations'] = true;
					} else {
						if ( in_array( 'variations', $cpf_price_array['raw_epos'], true ) ) {
							$has_epo['variations'] = true;
						}
						$has_epo['global'] = true;
					}
				}
			}
			if ( ! empty( $local_price_array ) ) {
				$has_epo['local'] = true;
			}

			$has_epo['variations_disabled'] = $cpf_price_array['variations_disabled'];

		}

		$this->cpf[ $post_id ] = $has_epo;

		return $has_epo;
	}

	/**
	 * Checks if the array for has_options has options
	 *
	 * @param mixed $epos Options array.
	 *
	 * @return boolean
	 */
	public function is_valid_options( $epos = false ) {
		if ( false !== $epos && is_array( $epos ) && ( isset( $epos['global'] ) || isset( $epos['local'] ) ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Checks if the array for has_options has options or visible styled variations
	 *
	 * @param mixed $epos Options array.
	 *
	 * @return boolean
	 */
	public function is_valid_options_or_variations( $epos = false ) {
		if ( false !== $epos && is_array( $epos ) && ( isset( $epos['global'] ) || isset( $epos['local'] ) || ( ! empty( $epos['variations'] ) && empty( $epos['variations_disabled'] ) ) ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Returns all saved options (this must be used after the 'woocommerce_init' hook) *
	 *
	 * @param integer|WC_Order|WC_Order_Item $obj The Order id or Order object or Order item object.
	 * @param string                         $option_id The option unique id or 'all'.
	 * @param string                         $return_type The type of data to return.
	 * @return array|boolean|mixed
	 */
	public function get_saved_addons_from_order( $obj, $option_id = '', $return_type = 'array' ) {
		// Check if 'woocommerce_init' hook has been executed.
		if ( 0 >= did_action( 'woocommerce_init' ) ) {
			return false;
		}

		$order_id = false;
		$order    = false;

		if ( $obj && 0 !== $obj && is_numeric( $obj ) ) {
			$order_id = $obj;
		} elseif ( $obj instanceof WC_Order ) {
			$order_id = $obj->get_id();
		} elseif ( $obj instanceof WC_Order_Item ) {
			$order    = $obj->get_order();
			$order_id = $order->get_id();
		}

		if ( is_bool( $order ) ) {
			$order = wc_get_order( $order_id );
			if ( is_bool( $order ) ) {
				return false;
			}
		}

		$order_currency = $order->get_currency();
		$mt_prefix      = $order_currency;

		/**
		 * Line items
		 *
		 * @var WC_Order_Item_Product[] $line_items
		 */
		$line_items = apply_filters( 'wc_epo_order_line_items', $order->get_items( apply_filters( 'woocommerce_admin_order_item_types', 'line_item' ) ), $order );
		$all_epos   = [];

		foreach ( $line_items as $item_id => $item ) {
			$_product    = themecomplete_get_product_from_item( $item, $order );
			$item_meta   = themecomplete_get_order_item_meta( $item_id, '', false );
			$order_taxes = $order->get_taxes();

			$check_box_html = ( version_compare( WC()->version, '2.6', '>=' ) ) ? '' : '<td class="check-column">&nbsp;</td>';

			$has_epo = is_array( $item_meta )
					&& isset( $item_meta['_tmcartepo_data'] )
					&& isset( $item_meta['_tmcartepo_data'][0] )
					&& isset( $item_meta['_tm_epo'] );

			$has_fee = is_array( $item_meta )
					&& isset( $item_meta['_tmcartfee_data'] )
					&& isset( $item_meta['_tmcartfee_data'][0] );

			$wpml_translation_by_id = [];
			if ( $has_epo || $has_fee ) {
				$current_product_id  = $item->get_product_id();
				$original_product_id = intval( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );
				if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && $original_product_id !== $current_product_id ) {
					$current_product_id = $original_product_id;
				}
				$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );
			}

			if ( $has_epo ) {
				$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );

				$all_epos[ $item_id ] = $this->get_epo_data_from_order(
					$epos,
					$option_id,
					[
						'mt_prefix'              => $mt_prefix,
						'wpml_translation_by_id' => $wpml_translation_by_id,
						'item'                   => $item,
						'item_meta'              => $item_meta,
						'product'                => $_product,
					],
				);
			}

			if ( $has_fee ) {
				$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartfee_data'][0] );
				if ( isset( $epos[0] ) ) {
					$epos = $epos[0];
				} else {
					$epos = false;
				}

				$all_epos[ $item_id ] = $this->get_epo_data_from_order(
					$epos,
					$option_id,
					[
						'mt_prefix'              => $mt_prefix,
						'wpml_translation_by_id' => $wpml_translation_by_id,
						'item'                   => $item,
						'item_meta'              => $item_meta,
						'product'                => $_product,
					],
				);
			}
		}

		if ( 'json' === $return_type ) {
			$all_epos = wp_json_encode( $all_epos );
		} elseif ( 'array_multi' === $return_type ) {
			$all_epos = array_map(
				function ( $entry ) {
					return ( $entry[ key( $entry ) ] );
				},
				$all_epos
			);
		}

		return $all_epos;
	}

	/**
	 * Parse epo item data in order
	 *
	 * @param array<mixed> $epo The epo item.
	 * @param array<mixed> $args Array of arguments.
	 * @param boolean      $restrictions If true, restricts output based on the
	 *                     control panel settings.
	 * @return array<mixed>
	 * @since 6.4.3
	 */
	public function parse_epo_order_data( $epo = [], $args = [], $restrictions = true ) {
		// Don't display dynamic calculation elements.
		if ( isset( $epo['dynamic'] ) ) {
			return [];
		}

		$wpml_translation_by_id = [];
		if ( isset( $args['wpml_translation_by_id'] ) ) {
			$wpml_translation_by_id = $args['wpml_translation_by_id'];
		}

		$item = false;
		if ( isset( $args['item'] ) ) {
			$item = $args['item'];
		}

		$item_id = false;
		if ( isset( $args['item_id'] ) ) {
			$item_id = $args['item_id'];
		} elseif ( false !== $item ) {
			$item_id = $item->get_id();
		}

		$item_meta = [];
		if ( isset( $args['item_meta'] ) ) {
			$item_meta = $args['item_meta'];
		} elseif ( false !== $item_id ) {
			$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );
		}

		$product_id = false;
		if ( isset( $args['product_id'] ) ) {
			$product_id = $args['product_id'];
		} elseif ( false !== $item ) {
			$product_id = $item->get_product_id();
		}

		$order = false;
		if ( isset( $args['order'] ) ) {
			$order = $args['order'];
		} elseif ( false !== $item ) {
			$order = $item->get_order();
		}

		$order_currency = false;
		if ( isset( $args['order_currency'] ) ) {
			$order_currency = $args['order_currency'];
		} elseif ( false !== $order ) {
			$order_currency = $order->get_currency();
		}

		$currency_arg = [];
		if ( isset( $args['currency'] ) ) {
			$currency_arg = $args['currency'];
		} elseif ( false !== $order_currency ) {
			$currency_arg = [ 'currency' => $order_currency ];
		}

		$mt_prefix = '';
		if ( isset( $args['mt_prefix'] ) ) {
			$mt_prefix = $args['mt_prefix'];
		} elseif ( false !== $order_currency ) {
			$mt_prefix = $order_currency;
		}

		$product = false;
		if ( isset( $args['product'] ) ) {
			$product = $args['product'];
		}

		if ( $epo && is_array( $epo ) && isset( $epo['section'] ) ) {
			// Quantity check.
			if ( ! isset( $epo['quantity'] ) ) {
				$epo['quantity'] = 1;
			}
			if ( $epo['quantity'] < 1 ) {
				$epo['quantity'] = 1;
			}
			$epo['quantity'] = floatval( $epo['quantity'] );

			// Price check.
			// Price should already be in the converted currency.
			// The below code is for refference only!
			/*$new_currency = false;
			if ( isset( $epo['price_per_currency'] ) && isset( $mt_prefix ) ) {
				$_current_currency_prices = $epo['price_per_currency'];
				if ( '' !== $mt_prefix
					&& '' !== $_current_currency_prices
					&& is_array( $_current_currency_prices )
					&& isset( $_current_currency_prices[ $mt_prefix ] )
					&& '' !== $_current_currency_prices[ $mt_prefix ]
				) {
					$new_currency = true;
					$epo['price'] = $_current_currency_prices[ $mt_prefix ];
				}
			}
			if ( ! $new_currency ) {
				$type = THEMECOMPLETE_EPO()->get_saved_element_price_type( $epo );

				$epo['price'] = apply_filters( 'wc_epo_get_current_currency_price', $epo['price'], $type, null, $order_currency );
			}*/
			$epo['price'] = floatval( $epo['price'] );

			// Name (label) check.
			if ( isset( $wpml_translation_by_id[ $epo['section'] ] ) ) {
				$epo['name'] = $wpml_translation_by_id[ $epo['section'] ];
			}
			if ( isset( $epo['repeater'] ) && isset( $epo['key_id'] ) ) {
				$epo['name'] = (int) ( $epo['key_id'] + 1 ) . '. ' . $epo['name'];
			}
			// Normal (local) mode.
			if ( ! isset( $epo['price_per_currency'] ) && taxonomy_exists( $epo['name'] ) ) {
				$epo['name'] = wc_attribute_label( $epo['name'] );
			}
			$epo['name'] = apply_filters( 'tm_translate', $epo['name'] );

			// Value check.
			$epo['edit_value'] = $epo['value'];
			if ( isset( $wpml_translation_by_id[ 'options_' . $epo['section'] ] )
				&& is_array( $wpml_translation_by_id[ 'options_' . $epo['section'] ] )
				&& ! empty( $epo['multiple'] )
				&& ! empty( $epo['key'] )
			) {
				$pos = strrpos( $epo['key'], '_' );
				if ( false !== $pos ) {
					$av = array_values( $wpml_translation_by_id[ 'options_' . $epo['section'] ] );
					if ( isset( $av[ (int) substr( $epo['key'], $pos + 1 ) ] ) ) {
						$epo['value'] = $av[ (int) substr( $epo['key'], $pos + 1 ) ];
					}
				}
			}
			$original_value = $epo['value'];
			$epo['value']   = apply_filters( 'tm_translate', $epo['value'] );

			$override = isset( $epo['element'] ) && isset( $epo['element']['type'] ) && ( 'upload' === $epo['element']['type'] || 'multiple_file_upload' === $epo['element']['type'] );
			if ( $restrictions && empty( $args['backend_order'] ) ) {
				$epo['value'] = THEMECOMPLETE_EPO_ORDER()->display_meta_value( $epo['value'], $override, 'order' );
			}
			$epo['value'] = apply_filters( 'wc_epo_enable_shortocde', $epo['value'], $epo['value'], false );

			if ( ! empty( $epo['multiple_values'] ) ) {
				$display_value_array = explode( $epo['multiple_values'], $epo['value'] );
				$display_value       = '';
				foreach ( $display_value_array as $d => $dv ) {
					$display_value .= '<span class="cpf-data-on-cart"><span class="cpf-data-value">' . $dv . '</span></span>';
				}
				$epo['value'] = $display_value;
			}

			if ( isset( $epo['element'] ) && isset( $epo['element']['type'] ) && ( 'upload' === $epo['element']['type'] || 'multiple_file_upload' === $epo['element']['type'] ) ) {
				if ( ! $restrictions || ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_order' ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_upload_image_replacement_order' ) ) ) {
					add_filter( 'upload_mimes', [ THEMECOMPLETE_EPO(), 'upload_mimes_trick' ] );
					$check = wp_check_filetype( $original_value );
					remove_filter( 'upload_mimes', [ THEMECOMPLETE_EPO(), 'upload_mimes_trick' ] );
					if ( ! empty( $check['ext'] ) ) {
						$image_exts = THEMECOMPLETE_EPO_API()->get_image_extensions();
						if ( in_array( $check['ext'], $image_exts, true ) ) {
							$display_other_value_only = '<span class="cpf-img-on-order">';
							// The | character is used to implode files on \includes\fields\class-themecomplete-epo-fields-multiple-file-upload.php .
							$files = explode( '|', $original_value );
							foreach ( $files as $file ) {
								$display_other_value_only .= '<a download href="' . esc_url( $file ) . '"><img alt="' . esc_attr( wp_strip_all_tags( $epo['name'] ) ) . '" class="attachment-shop_thumbnail wp-post-image epo-option-image epo-upload-image" src="' . apply_filters( 'tm_image_url', $file ) . '"></a>';
							}
							$display_other_value_only .= '</span>';

							$display_value = $display_other_value_only;

							$epo['value'] = $display_value;
						}
					}
				} elseif ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_order' ) ) {
					$files = explode( '|', $original_value );

					$display_other_value_only = [];
					foreach ( $files as $file ) {
						$file_value = THEMECOMPLETE_EPO_ORDER()->display_meta_value( apply_filters( 'tm_image_url', $file ), 0, 'order' );
						if ( 1 < count( $files ) ) {
							$display_other_value_only[] = '<span class="cpf-data-on-cart"><span class="cpf-data-value">' . $file_value . '</span></span>';
						} else {
							$display_other_value_only[] = $file_value;
						}
					}
					$display_other_value_only = implode( '', $display_other_value_only );

					$display_value = $display_other_value_only;

					$epo['value'] = $display_value;
				} elseif ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_order' ) ) {
					$files = explode( '|', $original_value );

					$display_other_value_only = [];
					foreach ( $files as $file ) {
						$file_value = THEMECOMPLETE_EPO_ORDER()->display_meta_value( apply_filters( 'tm_image_url', $file ), 2, 'order' );
						if ( 1 < count( $files ) ) {
							$display_other_value_only[] = '<span class="cpf-data-on-cart"><span class="cpf-data-value">' . $file_value . '</span></span>';
						} else {
							$display_other_value_only[] = $file_value;
						}
					}
					$display_other_value_only = implode( '', $display_other_value_only );

					$display_value = $display_other_value_only;

					$epo['value'] = $display_value;
				}
			}

			if ( empty( $args['backend_order'] ) ) {
				$epovalue = '';
				if ( isset( $product_id ) && ( ! $restrictions || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_options_prices_in_cart' ) && ! empty( $epo['price'] ) ) ) {
					$_product   = wc_get_product( $product_id );
					$price      = $epo['price'] / $epo['quantity'];
					$tax_string = '';

					// This check is need in case the product is deleted.
					if ( $_product ) {
						$taxable = $_product->is_taxable();
						// Taxable.
						if ( $taxable ) {
							$tax_display_cart = get_option( 'woocommerce_tax_display_cart' );

							if ( 'excl' === $tax_display_cart ) {
								if ( $order && themecomplete_order_get_att( $order, 'cart_tax' ) > 0 && wc_prices_include_tax() ) {
									$tax_string = ' <small>' . apply_filters( 'wc_epo_ex_tax_or_vat_string', WC()->countries->ex_tax_or_vat() ) . '</small>';
								}
								if ( (float) 0 !== floatval( $price ) ) {
									$price = (float) themecomplete_get_price_excluding_tax(
										$_product,
										[
											'qty'   => 10000,
											'price' => $price,
										]
									) / 10000;
								}
							} else {
								if ( $order && themecomplete_order_get_att( $order, 'cart_tax' ) > 0 && ! wc_prices_include_tax() ) {
									$tax_string = ' <small>' . apply_filters( 'inc_tax_or_vat', WC()->countries->inc_tax_or_vat() ) . '</small>';
								}
								if ( (float) 0 !== floatval( $price ) ) {
									$price = (float) themecomplete_get_price_including_tax(
										$_product,
										[
											'qty'   => 10000,
											'price' => $price,
										]
									) / 10000;
								}
							}
						}
					}
					$epovalue .= ' ' . ( ( apply_filters( 'epo_can_show_order_price', true, $item_meta ) ) ? ( wc_price( $price, $currency_arg ) . $tax_string ) : '' );
				}
				if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $epo['quantity_selector'] ) ) || $epo['quantity'] > 1 ) {
					$epovalue .= ' &times; ' . $epo['quantity'];
				}

				$epovalue = apply_filters( 'wc_epo_price_qty_in_order', $epovalue, $epo['price'], $epo, $item, $item_id, $order );

				if ( '' !== $epovalue && ! is_array( $epo['value'] ) && ( ( ! empty( $epo['hidevalueinorder'] ) && 'price' === $epo['hidevalueinorder'] ) || empty( $epo['hidevalueinorder'] ) ) ) {
					$epo['value'] .= ' <small>' . $epovalue . '</small>';
				}
			}

			$epo['value'] = THEMECOMPLETE_EPO_HELPER()->entity_decode( $epo['value'] );
			$epo['value'] = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $epo['value'], THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ) );

			if ( $restrictions && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_strip_html_from_emails' ) ) {
				$epo['value'] = wp_strip_all_tags( $epo['value'] );
			} elseif ( ! $restrictions || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_strip_html_from_emails' ) ) {
				if ( ! empty( $epo['use_images'] ) && ! empty( $epo['images'] ) && ( ! $restrictions || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_image_replacement' ) ) ) {
					$display_value = '<span class="cpf-img-on-order"><img alt="'
									. esc_attr( wp_strip_all_tags( $epo['name'] ) ) . '" class="attachment-shop_thumbnail wp-post-image epo-option-image" src="'
									. apply_filters( 'tm_image_url', $epo['images'] )
									. '" /></span>';
					$epo['value']  = $display_value . $epo['value'];
				} elseif ( ! empty( $epo['use_colors'] ) && ! empty( $epo['color'] ) && ( ! $restrictions || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_image_replacement' ) ) ) {
					$color_hex     = $epo['color'];
					$color_no_hash = $epo['color'];
					if ( 'transparent' !== $color_hex ) {
						$color_hex     = themecomplete_sanitize_hex_color( $color_hex );
						$color_no_hash = themecomplete_sanitize_hex_color_no_hash( $color_no_hash );
					}
					$display_value = '<span class="cpf-colors-on-cart"><span class="cpf-color-on-cart backgroundcolor'
									. esc_attr( (string) $color_no_hash ) . '"></span> '
									. '</span>';
					$epo['value']  = $display_value . $epo['value'];
					THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( '.backgroundcolor' . esc_attr( (string) $color_no_hash ) . '{background-color:' . esc_attr( (string) $color_hex ) . ';}' );
				}
			}

			if ( isset( $epo['element'] ) && 'textarea' === $epo['element']['type'] ) {
				$epo_value = trim( $epo['value'] );
				$epo_value = str_replace( [ "\r\n", "\r" ], "\n", $epo_value );
				$epo_value = preg_replace( "/\n\n+/", "\n\n", $epo_value );
				$epo_value = array_map( 'wc_clean', explode( "\n", $epo_value ) );
				$epo_value = array_map(
					function ( $value ) {
						if ( is_array( $value ) ) {
							$value = $value[0];
						}
						return strval( $value );
					},
					$epo_value
				);
				$epo_value = implode( "\r\n", $epo_value );

				$epo['value'] = $epo_value;
			}

			if ( false !== $item && ! empty( $item_meta ) ) {
				$epo_quantity         = sprintf( '%s <small>(%s &times; %s)</small>', $epo['quantity'] * (float) $item_meta['_qty'][0], $epo['quantity'], (float) $item_meta['_qty'][0] );
				$epo_quantity         = apply_filters( 'wc_epo_html_tm_epo_order_item_epo_quantity', $epo_quantity, $epo['quantity'], $item, $product );
				$epo['quantity_html'] = $epo_quantity;
			}
		}

		return $epo;
	}

	/**
	 * Return all epo data that is saved on the order
	 *
	 * @param array<mixed> $epos The saved epo data taken from an order.
	 * @param string       $option_id  The option unique id or 'all'.
	 * @param array<mixed> $args Array of extra arguments.
	 * @return array<mixed>
	 */
	public function get_epo_data_from_order( $epos = [], $option_id = 'all', $args = [] ) {
		$all_epos = [];
		if ( $epos && is_array( $epos ) ) {
			if ( isset( $args['item'] ) ) {
				$item = $args['item'];
			}
			if ( isset( $args['item_meta'] ) ) {
				$item_meta = $args['item_meta'];
			}
			if ( isset( $args['product'] ) ) {
				$_product = $args['product'];
			}
			foreach ( $epos as $key => $epo ) {
				if ( $epo && is_array( $epo ) ) {
					if ( $epo['section'] !== $option_id && 'all' !== $option_id ) {
						continue;
					}
					$epo = $this->parse_epo_order_data(
						$epo,
						$args,
					);

					$all_epos[ $key ] = $epo;
				}
			}
		}

		return $all_epos;
	}

	/**
	 * This is mainly used for the WP all Export plugin as a custom function
	 *
	 * @param array<mixed> $epos The saved epo data taken from an order.
	 * @param string       $option_id  The option unique id or 'all'.
	 * @param string       $output_format How the data should be returned.
	 * @param string       $mt_prefix The order currency.
	 * @param integer      $product_id The product if associated with the saved $epos if known.
	 * @return array<mixed>|string|false
	 */
	public function get_epos( $epos = [], $option_id = 'all', $output_format = 'array', $mt_prefix = '', $product_id = 0 ) {
		$epos = themecomplete_maybe_unserialize( $epos );

		$wpml_translation_by_id = [];

		if ( ! empty( $product_id ) ) {
			$current_product_id  = $product_id;
			$original_product_id = intval( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );
			if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && $original_product_id !== $current_product_id ) {
				$current_product_id = $original_product_id;
			}
			$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );
		}

		$all_epos = $this->get_epo_data_from_order(
			$epos,
			$option_id,
			[
				'mt_prefix'              => $mt_prefix,
				'wpml_translation_by_id' => $wpml_translation_by_id,
			],
		);

		if ( 'json' === $output_format ) {
			$all_epos = wp_json_encode( $all_epos );
		} elseif ( 'implode' === $output_format ) {
			$all_epos = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $all_epos, ', ', ':' );
		} elseif ( 'implode_space' === $output_format ) {
			$all_epos = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $all_epos, ' ', ':' );
		}

		return $all_epos;
	}

	/**
	 * Returns all saved options (this must be used after the 'woocommerce_init' hook) *
	 *
	 * @param integer $order_id The Order id.
	 *
	 * @return array|boolean|mixed
	 * @deprecated 6.4.3 Keep for backward compatibility. Use get_saved_addons_from_order() instead.
	 */
	public function get_all_options( $order_id ) {
		return $this->get_saved_addons_from_order( $order_id );
	}

	/**
	 * Undocumented function
	 *
	 * @param mixed        $item The order item.
	 * @param array<mixed> $item_meta The item meta.
	 * @param string       $option_id  The option unique id or 'all'.
	 * @param mixed        $_product The product object.
	 * @param string       $mt_prefix The order currency.
	 * @param array<mixed> $wpml_translation_by_id The translated options values.
	 * @return array<mixed>
	 * @deprecated 6.4.2 Keep for backward compatibility. Use get_epo_data_from_order() instead.
	 */
	public function get_epos_data( $item = [], $item_meta = [], $option_id = 'all', $_product = false, $mt_prefix = '', $wpml_translation_by_id = [] ) {
		$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
		$args = [
			'item'      => $item,
			'item_meta' => $item_meta,
			'product'   => $_product,
		];
		return $this->get_epo_data_from_order(
			$epos,
			$option_id,
			[
				'mt_prefix'              => $mt_prefix,
				'wpml_translation_by_id' => $wpml_translation_by_id,
				'item'                   => $item,
				'item_meta'              => $item_meta,
				'product'                => $_product,
			],
		);
	}

	/**
	 * Returns a saved option
	 * (this must be used after the 'woocommerce_init' hook)
	 *
	 * @param integer $order_id The Order id.
	 * @param string  $option_id The option unique id or 'all'.
	 * @param string  $return_type The type of data to return.
	 * @return array|boolean|mixed
	 * @deprecated 6.4.3 Keep for backward compatibility. Use get_saved_addons_from_order() instead.
	 */
	public function get_option( $order_id, $option_id = '', $return_type = 'array' ) {
		return $this->get_saved_addons_from_order( $order_id, $option_id, $return_type );
	}
}
includes/classes/class-themecomplete-epo-update-licenser.php000064400000023350150755142450020334 0ustar00<?php
/**
 * Extra Product Options License class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options License class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_UPDATE_Licenser {


	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_UPDATE_Licenser|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_UPDATE_Licenser
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wp_ajax_tm_activate_license', [ $this, 'activate' ] );
		add_action( 'wp_ajax_tm_deactivate_license', [ $this, 'deactivate' ] );
	}

	/**
	 * Get api url
	 *
	 * @param array<mixed> $data The array with the api filename.
	 * @return string
	 * @since 1.0
	 */
	public static function api_url( $data ) {
		$array1 = [
			'https://themecomplete.com/api/activation/',
		];

		return implode( '', array_merge( $array1, $data ) );
	}

	/**
	 * Get posted variable
	 *
	 * @param string      $param The name of the variable to fetch.
	 * @param string|null $default_value The default value to return.
	 * @return mixed
	 * @since 1.0
	 */
	private function get_ajax_var( $param, $default_value = null ) {
		return isset( $_POST[ $param ] ) ? map_deep( wp_unslash( $_POST[ $param ] ), 'sanitize_text_field' ) : $default_value; // phpcs:ignore WordPress.Security.NonceVerification
	}

	/**
	 * Get saved license
	 *
	 * @return string
	 * @since 1.0
	 */
	public function get_license() {
		return get_option( 'tm_license_activation_key' );
	}

	/**
	 * Check license
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function check_license() {
		$a1 = $this->get_license();
		$a2 = get_option( 'tm_epo_envato_username' );
		$a3 = get_option( 'tm_epo_envato_apikey' );
		$a4 = get_option( 'tm_epo_envato_purchasecode' );

		return (
			! empty( $a1 ) &&
			! empty( $a2 ) &&
			! empty( $a3 ) &&
			! empty( $a4 )
		);
	}

	/**
	 * Activate license
	 *
	 * @return void
	 * @since 1.0
	 */
	public function activate() {
		$this->request( 'activation' );
	}

	/**
	 * Deactivate license
	 *
	 * @return void
	 * @since 1.0
	 */
	public function deactivate() {
		$this->request( 'deactivation' );
	}

	/**
	 * Perform a request
	 *
	 * @param string $action The type of action to perform.
	 * @return void
	 * @since 1.0
	 */
	public function request( $action = '' ) {
		check_ajax_referer( 'settings-nonce', 'security' );
		$params             = [];
		$params['username'] = $this->get_ajax_var( 'username' );
		$params['key']      = $this->get_ajax_var( 'key' );
		$params['api_key']  = $this->get_ajax_var( 'api_key' );
		$params['url']      = get_site_url();
		$params['plugin']   = THEMECOMPLETE_EPO_PLUGIN_ID;
		$params['license']  = $this->get_license();
		$params['action']   = $action;
		$string             = 'activation.php?';
		$message_wrap       = '<div class="%s"><p>%s</p></div>';

		$request_url = self::api_url( [ $string, http_build_query( $params, '', '&' ) ] );
		$response    = wp_remote_get( $request_url, [ 'timeout' => 300 ] );

		if ( is_wp_error( $response ) ) {
			wp_send_json(
				[
					'result'  => 'wp_error',
					'message' => sprintf(
						$message_wrap,
						'error',
						esc_html__( 'Error connecting to server!', 'woocommerce-tm-extra-product-options' )
					),
				]
			);
		}

		$result = json_decode( $response['body'] );

		if ( ! is_object( $result ) ) {
			wp_send_json(
				[
					'result'  => 'server_error',
					'message' => sprintf(
						$message_wrap,
						'error',
						esc_html__( 'Error getting data from the server!', 'woocommerce-tm-extra-product-options' )
					),
				]
			);
		}

		if ( property_exists( $result, 'result' ) && property_exists( $result, 'key' ) && property_exists( $result, 'code' ) ) {
			if ( true === (bool) $result->result && $result->key && $result->code && '200' === (string) $result->code ) {
				$license = $result->key;
				if ( 'activation' === $action ) {
					update_option( 'tm_epo_envato_username', $params['username'] );
					update_option( 'tm_epo_envato_apikey', $params['api_key'] );
					update_option( 'tm_epo_envato_purchasecode', $params['key'] );

					update_option( 'tm_license_activation_key', $license );

					delete_site_transient( 'update_plugins' );

					wp_send_json(
						[
							'result'  => '4',
							'message' => sprintf(
								$message_wrap,
								'activated',
								esc_html__( 'License activated!', 'woocommerce-tm-extra-product-options' )
							),
						]
					);
				} elseif ( 'deactivation' === $action ) {
					delete_option( 'tm_license_activation_key' );
					delete_site_transient( 'update_plugins' );
					wp_send_json(
						[
							'result'  => '4',
							'message' => sprintf(
								$message_wrap,
								'deactivated',
								esc_html__( 'License deactivated!', 'woocommerce-tm-extra-product-options' )
							),
						]
					);
				}
				die();
			}

			if ( false === (bool) $result->result ) {
				if ( 'deactivation' === $action && 14 === $result->code ) {
					delete_option( 'tm_license_activation_key' );
					delete_site_transient( 'update_plugins' );
					wp_send_json(
						[
							'result'  => '4',
							'message' => sprintf(
								$message_wrap,
								'deactivated',
								esc_html__( 'License deactivated!', 'woocommerce-tm-extra-product-options' )
							),
						]
					);
				}
				$message = esc_html__( 'Invalid data!', 'woocommerce-tm-extra-product-options' );
				$status  = 'error';
				$rs      = $result->code;
				if ( ! empty( $rs ) ) {
					switch ( $result->code ) {
						case '1':
							$message = esc_html__( 'Invalid action.', 'woocommerce-tm-extra-product-options' );
							break;
						case '2':
							$message = esc_html__( 'Please fill all fields before trying to activate.', 'woocommerce-tm-extra-product-options' );
							break;
						case '3':
							$message = esc_html__( 'Trying to activate from outside the plugin interface is not allowed!', 'woocommerce-tm-extra-product-options' );
							break;
						case '4':
							$message = esc_html__( 'Error connecting to Envato API. Please try again later.', 'woocommerce-tm-extra-product-options' );
							break;
						case '5':
							$message = esc_html__( 'Trying to activate with an invalid purchase code for your token!', 'woocommerce-tm-extra-product-options' );
							break;
						case '50':
							$message = esc_html__( 'Envato rate limit exceeded! Please try again later.', 'woocommerce-tm-extra-product-options' );
							if ( property_exists( $result, 'description' ) ) {
								$message = $result->description . ' ' . $message;
							}
							break;
						case '6':
							$message = esc_html__( 'That username is not valid for this item purchase code. Please make sure you entered the correct username (case sensitive).', 'woocommerce-tm-extra-product-options' );
							break;
						case '7':
							$message = esc_html__( 'Trying to activate from an invalid domain!', 'woocommerce-tm-extra-product-options' );
							break;
						case '8':
							$message = esc_html__( 'Trying to activate from an invalid IP address!', 'woocommerce-tm-extra-product-options' );
							break;
						case '9':
							$message = esc_html__( 'The purchase code is already activated!', 'woocommerce-tm-extra-product-options' );// by another username.
							break;
						case '10':
							$message = esc_html__( 'The purchase code is already activated on another domain!', 'woocommerce-tm-extra-product-options' );
							break;
						case '11':
							$message = esc_html__( 'You have already activated that purchase code on another domain!', 'woocommerce-tm-extra-product-options' );
							break;
						case '12':
							$message = esc_html__( 'The purchase code is already activated! Please buy a valid license!', 'woocommerce-tm-extra-product-options' );
							break;
						case '13':
							$status  = 'updated';
							$message = esc_html__( 'You have already activated your purchase code!', 'woocommerce-tm-extra-product-options' );
							break;
						case '14':
							$message = esc_html__( 'Deactivated, but the purchase code was not activated for some reason!', 'woocommerce-tm-extra-product-options' );
							delete_option( 'tm_license_activation_key' );
							delete_site_transient( 'update_plugins' );
							wp_send_json(
								[
									'result'  => '4',
									'message' => sprintf(
										$message_wrap,
										'updated',
										esc_html__( 'License deactivated!', 'woocommerce-tm-extra-product-options' )
									),
								]
							);
							exit; // @phpstan-ignore-line
						case '15':
							$status  = 'updated';
							$message = esc_html__( 'Cannot deactivate. Purchase code is not valid for your saved license key!', 'woocommerce-tm-extra-product-options' );
							break;
					}
				}
				wp_send_json(
					[
						'result'  => '-2',
						'code'    => $result->code,
						'message' => sprintf(
							$message_wrap,
							$status,
							$message
						),
					]
				);
			}
		}
		if ( property_exists( $result, 'code' ) && 'deactivation' === $action && 14 === $result->code ) {
			delete_option( 'tm_license_activation_key' );
			delete_site_transient( 'update_plugins' );
			wp_send_json(
				[
					'result'  => '4',
					'message' => sprintf(
						$message_wrap,
						'deactivated',
						esc_html__( 'License deactivated!', 'woocommerce-tm-extra-product-options' )
					),
				]
			);
		}
		wp_send_json(
			[
				'result'  => '-3',
				'message' => sprintf(
					$message_wrap,
					'error',
					esc_html__( 'Could not complete request!', 'woocommerce-tm-extra-product-options' )
				),
			]
		);
	}
}
includes/classes/class-themecomplete-epo-order.php000064400000115710150755142450016365 0ustar00<?php
/**
 * Extra Product Options Order Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Order Functionality
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_Order {

	/**
	 * If we are in the WooCommerce admin order page
	 *
	 * @var boolean
	 */
	private $is_in_woocommerce_admin_order_page = false;

	/**
	 * If WooCommerce is about to send an email
	 *
	 * @var boolean
	 */
	private $is_about_to_sent_email = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Order|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Order
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Gets the stored cart data for the order again functionality.
		add_filter( 'woocommerce_order_again_cart_item_data', [ $this, 'woocommerce_order_again_cart_item_data' ], 50, 2 );

		// Alter the product thumbnail in order.
		add_filter( 'woocommerce_order_item_thumbnail', [ $this, 'woocommerce_order_item_thumbnail' ], 50, 2 );

		// Alter the product thumbnail in order.
		add_filter( 'woocommerce_admin_order_item_thumbnail', [ $this, 'woocommerce_admin_order_item_thumbnail' ], 50, 3 );

		// Adds options to the array of items/products of an order.
		add_filter( 'woocommerce_order_item_get_formatted_meta_data', [ $this, 'woocommerce_order_item_get_formatted_meta_data' ], 10, 2 );
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_legacy_meta_data' ) ) {
			// Adds options to the array of items/products of an order.
			add_filter( 'woocommerce_order_get_items', [ $this, 'woocommerce_order_get_items' ], 10, 2 );
		} else {
			add_action( 'woocommerce_order_item_meta_start', [ $this, 'woocommerce_order_item_meta_start' ] );
		}

		// Add meta to order.
		add_action( 'woocommerce_checkout_create_order_line_item', [ $this, 'woocommerce_checkout_create_order_line_item' ], 50, 3 );

		// WC 2.7x only Flag admin order page.
		add_filter( 'woocommerce_admin_order_item_types', [ $this, 'woocommerce_admin_order_item_types' ], 10, 2 );
		add_action( 'woocommerce_admin_order_data_after_order_details', [ $this, 'woocommerce_admin_order_data_after_order_details' ], 2 );

		// Helper to include options in the order items - used for payment gateways.
		add_action( 'woocommerce_checkout_order_processed', [ $this, 'woocommerce_checkout_order_processed' ] );

		// Hides uploaded file path in order.
		add_filter( 'woocommerce_order_item_display_meta_value', [ $this, 'woocommerce_order_item_display_meta_value' ], 10, 1 );

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_disable_options_on_order_status' ) ) {
			$email_actions = apply_filters(
				'woocommerce_email_actions',
				[
					'woocommerce_order_status_pending_to_processing',
					'woocommerce_order_status_pending_to_completed',
					'woocommerce_order_status_processing_to_cancelled',
					'woocommerce_order_status_pending_to_failed',
					'woocommerce_order_status_pending_to_on-hold',
					'woocommerce_order_status_failed_to_processing',
					'woocommerce_order_status_failed_to_completed',
					'woocommerce_order_status_failed_to_on-hold',
					'woocommerce_order_status_on-hold_to_processing',
					'woocommerce_order_status_on-hold_to_cancelled',
					'woocommerce_order_status_on-hold_to_failed',
					'woocommerce_order_status_completed',
					'woocommerce_order_fully_refunded',
					'woocommerce_order_partially_refunded',
				]
			);

			foreach ( $email_actions as $action ) {
				add_action( $action, [ $this, 'change_is_about_to_sent_email' ] );
			}
		}

		// Attach upload files to emails.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_attach_uploaded_to_emails' ) ) {
			add_filter( 'woocommerce_email_attachments', [ $this, 'woocommerce_email_attachments' ], 10, 3 );
		}

		add_action( 'woocommerce_checkout_order_review', [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_add_inline_style' ], 99999 );
		add_action( 'woocommerce_order_details_after_order_table', [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_add_inline_style' ], 99999 );
	}

	/**
	 * Gets the stored cart data for the order again functionality
	 *
	 * @param array<mixed> $cart_item_meta The cart item meta.
	 * @param mixed        $item The order item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_order_again_cart_item_data( $cart_item_meta, $item ) {
		global $woocommerce;

		// Disable validation.
		remove_filter( 'woocommerce_add_to_cart_validation', [ THEMECOMPLETE_EPO_CART(), 'woocommerce_add_to_cart_validation' ], 50 );

		if ( apply_filters( 'wc_epo_no_order_again_cart_item_data', false ) ) {
			return $cart_item_meta;
		}

		$_backup_cart = isset( $item['item_meta']['tmcartepo_data'] ) ? $item['item_meta']['tmcartepo_data'] : false;
		if ( ! $_backup_cart ) {
			$_backup_cart = isset( $item['item_meta']['_tmcartepo_data'] ) ? $item['item_meta']['_tmcartepo_data'] : false;
		}
		if ( $_backup_cart && is_array( $_backup_cart ) && isset( $_backup_cart[0] ) ) {
			if ( is_string( $_backup_cart[0] ) ) {
				$_backup_cart = themecomplete_maybe_unserialize( $_backup_cart[0] );
			}
			$cart_item_meta['tmcartepo'] = $_backup_cart;
		}

		$_backup_cart = isset( $item['item_meta']['tmcartfee_data'] ) ? $item['item_meta']['tmcartfee_data'] : false;
		if ( ! $_backup_cart ) {
			$_backup_cart = isset( $item['item_meta']['_tmcartfee_data'] ) ? $item['item_meta']['_tmcartfee_data'] : false;
		}
		if ( $_backup_cart && is_array( $_backup_cart ) && isset( $_backup_cart[0] ) ) {
			if ( is_string( $_backup_cart[0] ) ) {
				$_backup_cart = themecomplete_maybe_unserialize( $_backup_cart[0] );
			}
			$cart_item_meta['tmcartfee'] = $_backup_cart[0];
		}

		$_backup_cart = isset( $item['item_meta']['tmdata'] ) ? $item['item_meta']['tmdata'] : false;
		if ( ! $_backup_cart ) {
			$_backup_cart = isset( $item['item_meta']['_tmdata'] ) ? $item['item_meta']['_tmdata'] : false;
		}
		if ( $_backup_cart && is_array( $_backup_cart ) && isset( $_backup_cart[0] ) ) {
			if ( is_string( $_backup_cart[0] ) ) {
				$_backup_cart = themecomplete_maybe_unserialize( $_backup_cart[0] );
			}
			$cart_item_meta['tmdata'] = $_backup_cart[0];
		}

		$_backup_cart = isset( $item['item_meta']['tmpost_data'] ) ? $item['item_meta']['tmpost_data'] : false;
		if ( ! $_backup_cart ) {
			$_backup_cart = isset( $item['item_meta']['_tmpost_data'] ) ? $item['item_meta']['_tmpost_data'] : false;
		}
		if ( $_backup_cart && is_array( $_backup_cart ) && isset( $_backup_cart[0] ) ) {
			if ( is_string( $_backup_cart[0] ) ) {
				$_backup_cart = themecomplete_maybe_unserialize( $_backup_cart[0] );
			}
			$cart_item_meta['tmpost_data'] = $_backup_cart[0];
		}

		if ( ! isset( $cart_item_meta['tmpost_data'] ) && isset( $cart_item_meta['tmdata']['tmcp_post_fields'] ) ) {
			$cart_item_meta['tmpost_data'] = $cart_item_meta['tmdata']['tmcp_post_fields'];
		}

		$cart_item_meta = apply_filters( 'wc_epo_woocommerce_order_again_cart_item_data', $cart_item_meta, $item );

		if ( apply_filters( 'wc_epo_woocommerce_order_again_cart_item_data_has_epo', isset( $cart_item_meta['tmcartepo'] ) || isset( $cart_item_meta['tmcartfee'] ), $cart_item_meta ) ) {

			$product_id = $item->get_product_id();

			$terms        = get_the_terms( $product_id, 'product_type' );
			$product_type = ! empty( $terms ) && isset( current( $terms )->name ) ? sanitize_title( current( $terms )->name ) : 'simple';

			if ( in_array( $product_type, apply_filters( 'wc_epo_can_be_edited_product_type', [ 'simple', 'variable' ] ), true ) ) {
				$cart_item_meta['tmhasepo'] = 1;
			}

			$tm_meta_cpf = themecomplete_get_post_meta( $product_id, 'tm_meta_cpf', true );

			$price_override = ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
				? 0
				: ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
					? 1
					: ( ! empty( $tm_meta_cpf['price_override'] ) ? 1 : 0 ) );

			if ( ! empty( $price_override ) ) {
				$cart_item_meta['epo_price_override'] = 1;
			}
		}

		return $cart_item_meta;
	}

	/**
	 * Return image thumbnail
	 *
	 * @param string       $image The image url.
	 * @param array<mixed> $item_meta The order item meta data.
	 * @return string
	 * @since 6.0
	 */
	private function get_order_item_thumbnail( $image = '', $item_meta = [] ) {
		$_image = [];
		$_alt   = [];

		$has_epo     = is_array( $item_meta ) && isset( $item_meta['_tmcartepo_data'] ) && isset( $item_meta['_tmcartepo_data'][0] );
		$has_epo_fee = isset( $item_meta['_tmcartfee_data'] ) && isset( $item_meta['_tmcartfee_data'][0] );

		if ( $has_epo ) {
			$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
			if ( ! is_array( $epos ) ) {
				return $image;
			}

			if ( $epos ) {
				foreach ( $epos as $key => $value ) {
					if ( ! empty( $value['changes_product_image'] ) ) {
						if ( 'images' === $value['changes_product_image'] ) {
							if ( isset( $value['use_images'] ) && 'images' === $value['use_images'] && isset( $value['images'] ) ) {
								$_image[] = $value['images'];
								$_alt[]   = $value['value'];
							}
						} elseif ( 'custom' === $value['changes_product_image'] ) {
							if ( isset( $value['imagesp'] ) ) {
								$_image[] = $value['imagesp'];
								$_alt[]   = $value['value'];
							}
						}
					}
				}
			}
		}

		if ( 0 === count( $_image ) ) {
			if ( $has_epo_fee ) {
				$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartfee_data'][0] );
				if ( ! is_array( $epos ) ) {
					return $image;
				}

				if ( $epos ) {
					foreach ( $epos as $key => $value ) {
						if ( ! empty( $value['changes_product_image'] ) ) {
							if ( 'images' === $value['changes_product_image'] ) {
								if ( isset( $value['use_images'] ) && 'images' === $value['use_images'] && isset( $value['images'] ) ) {
									$_image[] = $value['images'];
									$_alt[]   = $value['value'];
								}
							} elseif ( 'custom' === $value['changes_product_image'] ) {
								if ( isset( $value['imagesp'] ) ) {
									$_image[] = $value['imagesp'];
									$_alt[]   = $value['value'];
								}
							}
						}
					}
				}
			}
		}

		if ( count( $_image ) > 0 && count( $_alt ) > 0 ) {
			$current = 0;
			for ( $i = count( $_image ); $i > 0; $i-- ) {
				if ( ! empty( $_image[ $i ] ) ) {
					$current = $i;
				}
			}
			$size       = 'shop_thumbnail';
			$dimensions = wc_get_image_size( $size );
			$image      = apply_filters(
				'tm_woocommerce_img',
				'<img src="' . apply_filters( 'tm_woocommerce_img_src', $_image[ $current ] )
				. '" alt="'
				. esc_attr( wp_strip_all_tags( $_alt[ $current ] ) )
				. '" width="' . esc_attr( $dimensions['width'] )
				. '" class="woocommerce-placeholder wp-post-image" height="'
				. esc_attr( $dimensions['height'] )
				. '" />',
				$size,
				$dimensions
			);
		}

		return $image;
	}

	/**
	 * Alter the product thumbnail in order email
	 *
	 * @param string $image The image url.
	 * @param mixed  $item The order item object.
	 * @return string
	 * @since 6.0
	 */
	public function woocommerce_order_item_thumbnail( $image = '', $item = false ) {
		if ( $item ) {
			$order     = THEMECOMPLETE_EPO_HELPER()->tm_get_order_object();
			$item_id   = $item->get_id();
			$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

			$image = $this->get_order_item_thumbnail( $image, $item_meta );
		}

		return $image;
	}

	/**
	 * Alter the product thumbnail in order
	 *
	 * @param string  $image The image url.
	 * @param integer $item_id The item id.
	 * @param mixed   $item The order item object.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_admin_order_item_thumbnail( $image = '', $item_id = 0, $item = false ) {
		if ( $item ) {
			$order     = THEMECOMPLETE_EPO_HELPER()->tm_get_order_object();
			$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

			$image = $this->get_order_item_thumbnail( $image, $item_meta );
		}

		return $image;
	}

	/**
	 * Adds meta data to the order - WC >= 2.7 (crud)
	 *
	 * @param WC_Order_Item $item The order item object.
	 * @param string        $cart_item_key The cart item key.
	 * @param array<mixed>  $values Array of values.
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_checkout_create_order_line_item( $item, $cart_item_key, $values ) {
		do_action( 'wc_epo_order_item_meta_before', $item, $cart_item_key, $values );
		if ( ! empty( $values['tmcartepo'] ) ) {
			$item->add_meta_data( '_tmcartepo_data', $values['tmcartepo'] );
			$item->add_meta_data( '_tm_epo_product_original_price', [ $values['tm_epo_product_original_price'] ] );
			$item->add_meta_data( '_tm_epo_options_prices', [ $values['tm_epo_options_prices'] ] );
			$item->add_meta_data( '_tm_epo', [ 1 ] );
		}
		if ( ! empty( $values['tmcartfee'] ) ) {
			$item->add_meta_data( '_tmcartfee_data', [ $values['tmcartfee'] ] );
		}
		if ( ! empty( $values['tmdata'] ) ) {
			$item->add_meta_data( '_tmdata', [ $values['tmdata'] ] );
		}
		if ( ! empty( $values['tmpost_data'] ) ) {
			$item->add_meta_data( '_tmpost_data', [ $values['tmpost_data'] ] );
		}
		do_action( 'wc_epo_order_item_meta', $item, $cart_item_key, $values );
	}

	/**
	 * Check if an attribute is included in the attributes area of a variation name
	 *
	 * @return false
	 * @since 1.0
	 */
	public function woocommerce_is_attribute_in_product_name() {
		return false;
	}

	/**
	 * Disable custom woocommerce_is_attribute_in_product_name filter
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_order_items_table() {
		remove_filter( 'woocommerce_is_attribute_in_product_name', [ $this, 'woocommerce_is_attribute_in_product_name' ], 10 );
	}

	/**
	 * Adds options to the array of items/products of an order
	 *
	 * @return void
	 * @since 5.0.12.11
	 */
	public function woocommerce_order_item_meta_start() {
		add_filter( 'wc_epo_admin_in_shop_order', '__return_false' );
	}

	/**
	 * Adds options to the array of items/products of an order
	 *
	 * @param array<mixed> $formatted_meta The formatted meta data.
	 * @param mixed        $item The order item object.
	 * @return array<mixed>
	 * @since 4.9.12
	 */
	public function woocommerce_order_item_get_formatted_meta_data( $formatted_meta = [], $item = false ) {
		if ( apply_filters( 'wc_epo_no_order_get_items', false ) ||
			false === $item ||
			( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_disable_sending_options_in_order' ) && defined( 'WOOCOMMERCE_CHECKOUT' ) && ! $this->is_about_to_sent_email && ! defined( 'TM_CHECKOUT_ORDER_PROCESSED' ) ) ||
			( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_prevent_options_from_emails' ) ) ||
			( isset( $_POST['action'] ) && 'woocommerce_load_order_items' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_calc_line_taxes' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_order_item' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_coupon_discount' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_save_order_items' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_order_fee' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_remove_order_item' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_remove_order_coupon' === $_POST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification
		) {
			return $formatted_meta;
		}

		global $woocommerce;

		$item_id = $item->get_id();
		$order   = $item->get_order();
		if ( ! $order || THEMECOMPLETE_EPO_ADMIN()->in_shop_order() ) {
			return $formatted_meta;
		}

		$order_currency = $order->get_currency();
		$currency_arg   = [ 'currency' => $order_currency ];
		$mt_prefix      = $order_currency;

		$return_items = [];

		$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

		$has_epo = is_array( $item_meta ) && isset( $item_meta['_tmcartepo_data'] ) && isset( $item_meta['_tmcartepo_data'][0] );

		if ( $has_epo ) {
			$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
			if ( ! is_array( $epos ) ) {
				return $formatted_meta;
			}
			$item_product_id     = $item->get_product_id();
			$current_product_id  = $item_product_id;
			$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );
			if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && absint( $original_product_id ) !== absint( $current_product_id ) ) {
				$current_product_id = $original_product_id;
			}
			$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );
			$_unique_elements_added = [];
			$_items_to_add          = [];
			foreach ( $epos as $key => $epo ) {
				if ( $epo && is_array( $epo ) && isset( $epo['section'] ) ) {
					$epo = THEMECOMPLETE_EPO_API()->parse_epo_order_data(
						$epo,
						[
							'item'                   => $item,
							'product_id'             => $item_product_id,
							'item_id'                => $item_id,
							'item_meta'              => $item_meta,
							'order'                  => $order,
							'order_currency'         => $order_currency,
							'currency'               => $currency_arg,
							'wpml_translation_by_id' => $wpml_translation_by_id,
							'mt_prefix'              => $mt_prefix,
						],
					);

					if ( empty( $epo ) ) {
						continue;
					}

					if ( empty( $epo['hidelabelinorder'] ) || 'noprice' === $epo['hidevalueinorder'] || empty( $epo['hidevalueinorder'] ) ) {
						$_label = empty( $epo['hidelabelinorder'] ) ? $epo['name'] : '';

						$_value = $epo['value'];

						if ( isset( $epo['hidevalueinorder'] ) ) {
							switch ( $epo['hidevalueinorder'] ) {
								case 'price':
									$_value = ( ( apply_filters( 'epo_can_show_order_price', true, $item_meta ) ) ? ( wc_price( (float) $epo['price'] / (float) $epo['quantity'], $currency_arg ) ) : '' );

									if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $epo['quantity_selector'] ) ) || $epo['quantity'] > 1 ) {
										$_value .= ' &times; ' . $epo['quantity'];
									}
									break;
								case 'hidden':
									$_value = '';
									break;
								case 'noprice':
									$_value = $epo['value'];
									if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $epo['quantity_selector'] ) ) || $epo['quantity'] > 1 ) {
										$_value .= ' &times; ' . $epo['quantity'];
									}
									break;
								default:
									$_value = $epo['value'];
									break;
							}
						}
						if ( isset( $_unique_elements_added[ $epo['section'] ] ) && isset( $_items_to_add[ $epo['section'] ] ) ) {
							$_ta                              = $_items_to_add[ $epo['section'] ];
							$_ta[ $_label ][]                 = $_value;
							$_items_to_add[ $epo['section'] ] = $_ta;
						} else {
							$_ta                              = [];
							$_ta[ $_label ]                   = [ $_value ];
							$_items_to_add[ $epo['section'] ] = $_ta;
						}
						$_unique_elements_added[ $epo['section'] ] = $epo['section'];
					}
				}
			}

			$current_meta_key = 99999;
			$added            = false;

			foreach ( $_items_to_add as $uniquid => $element ) {
				foreach ( $element as $key => $value ) {
					if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_unique_meta_values' ) && is_array( $value ) ) {
						$value = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value );
					}
					if ( '' === $value ) {
						$value = ' ';
					}
					$added = true;

					if ( is_array( $value ) ) {
						if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_always_unique_values' ) ) {
							foreach ( $value as $currentvalue ) {
								++$current_meta_key;
								if ( ! isset( $formatted_meta[ $current_meta_key ] ) ) {
									$formatted_meta[ $current_meta_key ] = (object) [
										'key'           => $current_meta_key,
										'value'         => $currentvalue,
										'display_key'   => $key,
										'display_value' => make_clickable( $currentvalue ),
									];
								}
							}
						} else {
							++$current_meta_key;
							if ( ! isset( $formatted_meta[ $current_meta_key ] ) ) {
								$value                               = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value );
								$formatted_meta[ $current_meta_key ] = (object) [
									'key'           => $key,
									'value'         => $value,
									'display_key'   => $key,
									'display_value' => make_clickable( $value ),
								];
							}
						}
					} else {
						++$current_meta_key;
						if ( ! isset( $formatted_meta[ $current_meta_key ] ) ) {
							$formatted_meta[ $current_meta_key ] = (object) [
								'key'           => $key,
								'value'         => $value,
								'display_key'   => $key,
								'display_value' => make_clickable( $value ),
							];
						}
					}
				}
			}
		}

		return $formatted_meta;
	}

	/**
	 * Adds options to the array of items/products of an order
	 *
	 * @param array<mixed> $items The order items array.
	 * @param mixed        $order The order object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_order_get_items( $items = [], $order = false ) {
		if ( apply_filters( 'wc_epo_no_order_get_items', false ) ||
			! is_array( $items ) ||
			false === $order ||
			! $order instanceof WC_Order ||
			( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_disable_sending_options_in_order' ) && defined( 'WOOCOMMERCE_CHECKOUT' ) && ! $this->is_about_to_sent_email && ! defined( 'TM_CHECKOUT_ORDER_PROCESSED' ) ) ||
			( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_prevent_options_from_emails' ) ) ||
			( isset( $_POST['action'] ) && 'woocommerce_calc_line_taxes' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_order_item' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_coupon_discount' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_save_order_items' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_add_order_fee' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_remove_order_item' === $_POST['action'] ) || // phpcs:ignore WordPress.Security.NonceVerification
			( isset( $_POST['action'] ) && 'woocommerce_remove_order_coupon' === $_POST['action'] ) // phpcs:ignore WordPress.Security.NonceVerification
		) {
			return $items;
		}

		add_filter( 'woocommerce_is_attribute_in_product_name', [ $this, 'woocommerce_is_attribute_in_product_name' ], 10 );

		add_action( 'woocommerce_order_details_after_order_table_items', [ $this, 'woocommerce_order_items_table' ], 10 );

		$order_currency = $order->get_currency();
		$currency_arg   = [ 'currency' => $order_currency ];
		$mt_prefix      = $order_currency;

		$return_items = [];
		$cached_items = [];

		global $woocommerce;

		foreach ( $items as $item_id => $item ) {

			$type = '';
			if ( is_array( $item ) ) {
				$type = $item['type'];
			} elseif ( is_object( $item ) && is_callable( [ $item, 'get_type' ] ) ) {
				$type = $item->get_type();
			}

			if ( ! in_array( $type, [ 'line_item', 'fee' ], true ) ) {
				continue;
			}

			if ( ! empty( $cached_items[ $item_id ] ) ) {
				$return_items[ $item_id ] = $item;
				continue;
			}

			$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

			$has_epo = is_array( $item_meta ) && isset( $item_meta['_tmcartepo_data'] ) && isset( $item_meta['_tmcartepo_data'][0] );

			if ( $has_epo ) {
				$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
				if ( ! is_array( $epos ) ) {
					return $items;
				}
				$item_product_id     = $item->get_product_id();
				$current_product_id  = $item->get_product_id();
				$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $current_product_id, 'product' ) );
				if ( THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() && absint( $original_product_id ) !== absint( $current_product_id ) ) {
					$current_product_id = $original_product_id;
				}
				$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );
				$_unique_elements_added = [];
				$_items_to_add          = [];
				foreach ( $epos as $key => $epo ) {
					if ( $epo && is_array( $epo ) && isset( $epo['section'] ) ) {
						$epo = THEMECOMPLETE_EPO_API()->parse_epo_order_data(
							$epo,
							[
								'item'                   => $item,
								'product_id'             => $item_product_id,
								'item_id'                => $item_id,
								'item_meta'              => $item_meta,
								'order'                  => $order,
								'order_currency'         => $order_currency,
								'currency'               => $currency_arg,
								'wpml_translation_by_id' => $wpml_translation_by_id,
								'mt_prefix'              => $mt_prefix,
							],
						);
						if ( empty( $epo ) ) {
							continue;
						}
						if ( empty( $epo['hidelabelinorder'] ) || 'noprice' === $epo['hidevalueinorder'] || empty( $epo['hidevalueinorder'] ) ) {
							$_label = empty( $epo['hidelabelinorder'] ) ? $epo['name'] : '';

							$_value = $epo['value'];

							if ( isset( $epo['hidevalueinorder'] ) ) {
								switch ( $epo['hidevalueinorder'] ) {
									case 'price':
										$_value = ( ( apply_filters( 'epo_can_show_order_price', true, $item_meta ) ) ? ( wc_price( (float) $epo['price'] / (float) $epo['quantity'], $currency_arg ) ) : '' );

										if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $epo['quantity_selector'] ) ) || $epo['quantity'] > 1 ) {
											$_value .= ' &times; ' . $epo['quantity'];
										}
										break;
									case 'hidden':
										$_value = '';
										break;
									case 'noprice':
										$_value = $epo['value'];
										if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_quantity_one' ) && ! empty( $epo['quantity_selector'] ) ) || $epo['quantity'] > 1 ) {
											$_value .= ' &times; ' . $epo['quantity'];
										}
										break;
									default:
										$_value = $epo['value'];
										break;
								}
							}
							if ( isset( $_unique_elements_added[ $epo['section'] ] ) && isset( $_items_to_add[ $epo['section'] ] ) ) {
								$_ta                              = $_items_to_add[ $epo['section'] ];
								$_ta[ $_label ][]                 = $_value;
								$_items_to_add[ $epo['section'] ] = $_ta;
							} else {
								$_ta                              = [];
								$_ta[ $_label ]                   = [ $_value ];
								$_items_to_add[ $epo['section'] ] = $_ta;
							}
							$_unique_elements_added[ $epo['section'] ] = $epo['section'];
						}
					}
				}

				$current_meta_key = 0;
				$added            = false;
				$current_meta     = [];
				if ( false === $this->is_in_woocommerce_admin_order_page && is_object( $item ) ) {
					$current_meta_key = 99999;

					$current_product = wc_get_product( $current_product_id );

					if ( themecomplete_get_product_type( $current_product ) !== 'variable' ) {
						if ( method_exists( $item, 'get_meta_data' ) && method_exists( $item, 'delete_meta_data' ) && method_exists( $item, 'set_meta_data' ) ) {
							foreach ( $item->get_meta_data() as $item_meta ) {
								if ( isset( $item_meta->key, $item_meta->value, $item_meta->id ) ) {
									$current_meta[] = [
										'key'   => $item_meta->key,
										'value' => $item_meta->value,
										'id'    => $item_meta->id,
									];
								}
							}

							$cloned_item           = clone $item;
							$cloned_item_meta_data = $cloned_item->get_meta_data();
							foreach ( $cloned_item_meta_data as $cloned_item_meta ) {
								$cloned_item->delete_meta_data( $cloned_item_meta->key );
							}
							$cloned_item->set_meta_data( $current_meta );
							$item = $cloned_item;
						}
					}
				}

				foreach ( $_items_to_add as $uniquid => $element ) {
					foreach ( $element as $key => $value ) {

						if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_unique_meta_values' ) && is_array( $value ) ) {
							$value = implode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ), $value );
						}
						if ( '' === $value ) {
							$value = ' ';
						}
						if ( is_array( $items[ $item_id ] ) ) {
							if ( is_array( $value ) ) {
								foreach ( $value as $currentvalue ) {
									$item['item_meta'][ $key ][]                                  = $currentvalue;
									$item['item_meta_array'][ count( $item['item_meta_array'] ) ] = (object) [
										'key'   => $key,
										'value' => $currentvalue,
									];
								}
							} else {
								$item['item_meta'][ $key ][]                                  = $value;
								$item['item_meta_array'][ count( $item['item_meta_array'] ) ] = (object) [
									'key'   => $key,
									'value' => $value,
								];
							}
						} elseif ( $current_meta_key > 0 && is_object( $items[ $item_id ] ) ) {

							$added = true;

							if ( is_array( $value ) ) {
								foreach ( $value as $currentvalue ) {
									++$current_meta_key;
									if ( ! isset( $current_meta[ $current_meta_key ] ) ) {
										$current_meta[] = (object) [
											'id'          => $current_meta_key,
											'key'         => $key,
											'display_key' => $key,
											'value'       => $currentvalue,
										];
									}
								}
							} else {
								++$current_meta_key;
								if ( ! isset( $current_meta[ $current_meta_key ] ) ) {
									$current_meta[] = (object) [
										'id'    => $current_meta_key,
										'key'   => $key,
										'value' => $value,
									];
								}
							}
						}
					}
				}

				if ( $current_meta_key > 0 && $added ) {
					$item->set_meta_data( $current_meta );
					$cached_items[ $item_id ] = true;
				}
			}
			$return_items[ $item_id ] = $item;
		}

		if ( empty( $return_items ) ) {
			$return_items = $items;
		}

		return $return_items;
	}

	/**
	 * Flag WooCommerce admin order page
	 *
	 * @param string $type The type of line item.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_admin_order_item_types( $type ) {
		$this->is_in_woocommerce_admin_order_page = true;
		return $type;
	}

	/**
	 * Flag WooCommerce admin order page
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_admin_order_data_after_order_details() {
		$this->is_in_woocommerce_admin_order_page = true;
	}

	/**
	 * Flag WooCommerce orde checkout
	 *
	 * @return void
	 * @since 1.0
	 */
	public function woocommerce_checkout_order_processed() {
		define( 'TM_CHECKOUT_ORDER_PROCESSED', 1 );
	}

	/**
	 * For hiding uploaded file path
	 *
	 * @param string $value The meta value to display.
	 * @return mixed
	 * @since 1.0
	 */
	public function woocommerce_order_item_display_meta_value( $value = '' ) {
		return $this->display_meta_value( $value, 0, 'order' );
	}

	/**
	 * Display meta value
	 * Mainly used for hiding uploaded file path
	 *
	 * @param mixed  $value The meta value to display.
	 * @param mixed  $override Override default behavior.
	 * @param string $check The placement where the meta value is displayed.
	 * @return mixed
	 * @since 1.0
	 */
	public function display_meta_value( $value = '', $override = 0, $check = 'cart' ) {
		$original_value = $value;

		$canbeallowed = true;
		if ( 'cart' === $check ) {
			$canbeallowed = 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_cart' );
		}
		if ( 'order' === $check ) {
			$canbeallowed = 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_hide_uploaded_file_url_order' );
		}
		if ( 'always' === $check ) {
			$canbeallowed = true;
		}

		if ( is_array( $value ) ) {
			$new_value = [];
			foreach ( $value as $k => $v ) {
				if ( is_array( $v ) ) {
					foreach ( $v as $k2 => $v2 ) {
						if ( is_array( $v2 ) ) {
							// There maybe cases where $v2 is an array.
							foreach ( $v2 as $k3 => $v3 ) {
								$original_value = $v3;
								$found          = str_contains( $v3, THEMECOMPLETE_EPO()->upload_dir );
								if ( ( $found && empty( $override ) ) || ! empty( $override ) ) {
									if ( ( 2 === $override || ! $canbeallowed ) && filter_var( filter_var( THEMECOMPLETE_EPO_HELPER()->filter_sanitize_string( $v3 ), FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_HIGH ), FILTER_VALIDATE_URL ) ) {
										$v3 = mb_basename( $v3 );
									}
								}
								if ( ! empty( $override ) && $canbeallowed ) {
									$v3 = '<a href="' . esc_url( $original_value ) . '">' . $v3 . '</a>';
								}
								$v[ $k2 ][ $k3 ] = $v3;
							}
						} else {
							$original_value = $v2;
							$found          = str_contains( $v2, THEMECOMPLETE_EPO()->upload_dir );
							if ( ( $found && empty( $override ) ) || ! empty( $override ) ) {
								if ( ( 2 === $override || ! $canbeallowed ) && filter_var( filter_var( THEMECOMPLETE_EPO_HELPER()->filter_sanitize_string( $v2 ), FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_HIGH ), FILTER_VALIDATE_URL ) ) {
									$v2 = mb_basename( $v2 );
								}
							}
							if ( ! empty( $override ) && $canbeallowed ) {
								$v2 = '<a href="' . esc_url( $original_value ) . '">' . $v2 . '</a>';
							}
							$v[ $k2 ] = $v2;
						}
					}
				} else {
					$original_value = $v;
					$found          = str_contains( $v, THEMECOMPLETE_EPO()->upload_dir );
					if ( ( $found && empty( $override ) ) || ! empty( $override ) ) {
						if ( ( 2 === $override || ! $canbeallowed ) && filter_var( filter_var( THEMECOMPLETE_EPO_HELPER()->filter_sanitize_string( $v ), FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_HIGH ), FILTER_VALIDATE_URL ) ) {
							$v = mb_basename( $v );
						}
					}
					if ( ! empty( $override ) && $canbeallowed ) {
						$v = '<a href="' . esc_url( $original_value ) . '">' . $v . '</a>';
					}
				}
				$new_value[ $k ] = $v;
			}
			$value = $new_value;
		} else {
			$found = str_contains( $value, THEMECOMPLETE_EPO()->upload_dir );
			if ( ( $found && empty( $override ) ) || ! empty( $override ) ) {
				if ( ( 2 === $override || ! $canbeallowed ) && filter_var( filter_var( THEMECOMPLETE_EPO_HELPER()->filter_sanitize_string( $value ), FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_HIGH ), FILTER_VALIDATE_URL ) ) {
					$value = mb_basename( $value );
				}
			}
			if ( ! empty( $override ) && $canbeallowed ) {
				$value = '<a href="' . esc_url( $original_value ) . '">' . $value . '</a>';
			}
		}
		if ( is_array( $value ) ) {
			$value = THEMECOMPLETE_EPO_HELPER()->recursive_implode( $value, THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiple_separator_cart_text' ) );
		}

		return $value;
	}

	/**
	 * Helper to determine when the email is about to be sent
	 *
	 * @return void
	 * @since 1.0
	 */
	public function change_is_about_to_sent_email() {
		$this->is_about_to_sent_email = true;
	}

	/**
	 * Attach upload files to emails
	 *
	 * @param array<mixed> $attachments The email attachments.
	 * @param string       $emailmethodid The Email method ID.
	 * @param mixed        $order The order object.
	 *
	 * @return array<mixed>
	 */
	public function woocommerce_email_attachments( $attachments, $emailmethodid, $order ) {
		if ( $order instanceof WC_Order && is_callable( [ $order, 'get_items' ] ) ) {

			$items = $order->get_items();
			if ( ! is_array( $items ) ) {
				return $attachments;
			}

			$upload_dir = get_option( 'tm_epo_upload_folder' );
			$upload_dir = str_replace( '/', '', $upload_dir );
			$upload_dir = sanitize_file_name( $upload_dir );
			$upload_dir = '/' . $upload_dir . '/';
			$main_path  = $upload_dir;
			$todir      = '';
			$subdir     = $main_path . $todir;
			$param      = wp_upload_dir();
			if ( empty( $param['subdir'] ) ) {
				$base_url        = $param['url'] . $main_path;
				$param['path']   = $param['path'] . $subdir;
				$param['url']    = $param['url'] . $subdir;
				$param['subdir'] = $subdir;
			} else {
				$param['path']   = str_replace( $param['subdir'], $subdir, $param['path'] );
				$param['url']    = str_replace( $param['subdir'], $subdir, $param['url'] );
				$param['subdir'] = str_replace( $param['subdir'], $subdir, $param['subdir'] );
				$base_url        = str_replace( $param['subdir'], $main_path, $param['url'] );

			}
			$base_url = THEMECOMPLETE_EPO_HELPER()->to_ssl( $base_url );
			foreach ( $items as $item_id => $item ) {

				$item_meta = themecomplete_get_order_item_meta( $item_id, '', false );

				$has_epo = is_array( $item_meta ) && isset( $item_meta['_tmcartepo_data'] ) && isset( $item_meta['_tmcartepo_data'][0] );

				if ( $has_epo ) {
					$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartepo_data'][0] );
					if ( is_array( $epos ) ) {
						foreach ( $epos as $key => $epo ) {
							if ( $epo && is_array( $epo ) && isset( $epo['section'] ) ) {

								if ( isset( $epo['element'] ) && isset( $epo['element']['type'] ) && in_array( $epo['element']['type'], apply_filters( 'wc_epo_upload_file_type_array', [ 'upload', 'multiple_file_upload' ] ), true ) ) {
									if ( str_contains( $epo['value'], '|' ) ) {
										$links = explode( '|', $epo['value'] );
										foreach ( $links as $link ) {
											$attachments[] = $param['path'] . str_replace( $base_url, '', $link );
										}
									} else {
										$attachments[] = $param['path'] . str_replace( $base_url, '', $epo['value'] );
									}
								}
							}
						}
					}
				}

				$has_fee = is_array( $item_meta ) && isset( $item_meta['_tmcartfee_data'] ) && isset( $item_meta['_tmcartfee_data'][0] );

				if ( $has_fee ) {
					$epos = themecomplete_maybe_unserialize( $item_meta['_tmcartfee_data'][0] );
					if ( is_array( $epos ) && isset( $epos[0] ) && is_array( $epos[0] ) ) {
						$epos = $epos[0];
						foreach ( $epos as $key => $epo ) {
							if ( $epo && is_array( $epo ) && isset( $epo['section'] ) ) {

								if ( isset( $epo['element'] ) && isset( $epo['element']['type'] ) && in_array( $epo['element']['type'], apply_filters( 'wc_epo_upload_file_type_array', [ 'upload', 'multiple_file_upload' ] ), true ) ) {
									if ( str_contains( $epo['value'], '|' ) ) {
										$links = explode( '|', $epo['value'] );
										foreach ( $links as $link ) {
											$attachments[] = $param['path'] . str_replace( $base_url, '', $link );
										}
									} else {
										$attachments[] = $param['path'] . str_replace( $base_url, '', $epo['value'] );
									}
								}
							}
						}
					}
				}
			}
		}
		return $attachments;
	}
}
includes/classes/class-themecomplete-epo-helper-base.php000064400000157571150755142450017454 0ustar00<?php
/**
 * Extra Product Options Helper class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Helper class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_HELPER_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_HELPER_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Cache for sum_array_values
	 *
	 * @var array<mixed>
	 * @since 6.4
	 */
	private $sum_array_values_cache = [];

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_HELPER_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
	}

	/**
	 * Serialize an array
	 *
	 * @param mixed $a Input array.
	 * @return mixed
	 * @since 1.0
	 */
	public function array_serialize( $a ) {
		if ( is_array( $a ) ) {
			$r = [];
			foreach ( $a as $key => $value ) {
				if ( is_array( $value ) ) {
					$r[] = serialize( $value ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions
				} else {
					if ( str_contains( $value, '|' ) ) {
						$value = '<![CDATA[' . str_replace( '|', '%7C', $value ) . ']]>';
					}
					$r[] = $value;
				}
			}
			$r = implode( '|', $r );

			return $r;
		}

		return $a;
	}

	/**
	 * Unserialize an array
	 * Used in export csv
	 *
	 * @param mixed $a Input array.
	 * @return mixed
	 * @since 1.0
	 */
	public function array_unserialize( $a ) {
		$a = explode( '|', $a );
		$r = [];
		foreach ( $a as $key => $value ) {
			if ( preg_match( '/<!\[CDATA\[(.*?)\]\]>/s', $value, $matches ) ) {
				$value = str_replace( '%7C', '|', $matches[1] );
			}
			$r[] = themecomplete_maybe_unserialize( $value );
		}

		return $r;
	}

	/**
	 * Gets image size from attachment id and url
	 *
	 * @param integer $attachment_id Attachment post ID.
	 * @param string  $attachment_url Attachment URL.
	 * @return mixed
	 * @since 5.1
	 */
	public function get_attachment_sizes( $attachment_id = 0, $attachment_url = '' ) {
		$meta = wp_get_attachment_metadata( $attachment_id );
		if ( $meta && isset( $meta['sizes'] ) && is_array( $meta['sizes'] ) ) { // @phpstan-ignore-line
			foreach ( $meta['sizes'] as $key => $value ) {
				if ( str_contains( $attachment_url, $value['file'] ) ) {
					return [ $value['width'], $value['height'] ];
				}
			}
			return [ $meta['width'], $meta['height'] ];
		}
		return false;
	}

	/**
	 * Gets attachement id from attachement url
	 *
	 * @param string $attachment_url Attachment URL.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_attachment_id( $attachment_url = '' ) {

		$attachment_id = false;

		if ( '' === $attachment_url ) {
			return $attachment_id;
		}

		$original_attachment_url = $attachment_url;

		$attachment_id = get_transient( 'get_attachment_id_' . $original_attachment_url );
		if ( false !== $attachment_id ) {
			return $attachment_id;
		}

		$domain = $this->get_site_domain();

		if ( ! str_contains( $attachment_url, $domain ) ) {
			$attachment_url = $domain . $attachment_url;
		}

		if ( function_exists( 'attachment_url_to_postid' ) ) {

			$attachment_id = attachment_url_to_postid( $attachment_url );

			if ( ! $attachment_id ) {

				// Get the upload directory paths.
				$upload_dir_paths = wp_upload_dir();
				$upload_url       = $upload_dir_paths['baseurl'];
				if ( is_ssl() ) {
					$upload_url = set_url_scheme( $upload_url, 'https' );
				}

				if ( str_contains( $attachment_url, $upload_url ) ) {

					// If this is the URL of an auto-generated thumbnail, get the URL of the original image.
					$url = preg_replace( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $attachment_url );

					$attachment_id = attachment_url_to_postid( $url );

				}

				if ( ! $attachment_id ) {

					$path = $attachment_url;
					if ( 0 === mb_strpos( $path, $upload_dir_paths['baseurl'] . '/' ) ) {
						$path = substr( $path, strlen( $upload_dir_paths['baseurl'] . '/' ) );
					}

					if ( preg_match( '/^(.*)(\-\d*x\d*)(\.\w{1,})/i', $path, $matches ) ) {
						$url           = $upload_dir_paths['baseurl'] . '/' . $matches[1] . $matches[3];
						$attachment_id = attachment_url_to_postid( $url );
					}
				}
			}
		}

		set_transient( 'get_attachment_id_' . $original_attachment_url, $attachment_id, DAY_IN_SECONDS );

		return $attachment_id;
	}

	/**
	 * Generate image array
	 *
	 * @param array<mixed> $image_variations The image array.
	 * @param string       $image_link The image link.
	 * @param string       $image_type the image type of the array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function generate_image_array( $image_variations = [], $image_link = '', $image_type = '' ) {
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_retrieve_image_sizes' ) ) {
			$attachment_id     = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $image_link );
			$attachment_id     = ( $attachment_id ) ? $attachment_id : 0;
			$attachment_object = get_post( $attachment_id );
			if ( ! $attachment_object && get_transient( 'get_attachment_id_' . $image_link ) ) {
				delete_transient( 'get_attachment_id_' . $image_link );
				$attachment_id     = THEMECOMPLETE_EPO_HELPER()->get_attachment_id( $image_link );
				$attachment_id     = ( $attachment_id ) ? $attachment_id : 0;
				$attachment_object = get_post( $attachment_id );
			}
			$full_src      = wp_get_attachment_image_src( $attachment_id, 'large' );
			$image_title   = get_the_title( $attachment_id );
			$image_alt     = wp_strip_all_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) );
			$image_srcset  = function_exists( 'wp_get_attachment_image_srcset' ) ? wp_get_attachment_image_srcset( $attachment_id, 'shop_single' ) : false;
			$image_sizes   = function_exists( 'wp_get_attachment_image_sizes' ) ? wp_get_attachment_image_sizes( $attachment_id, 'shop_single' ) : false;
			$image_caption = ( $attachment_object ) ? $attachment_object->post_excerpt : '';

			if ( false === $full_src || ! is_array( $full_src ) ) {
				$full_src = [ '', '', '' ];
			}
		} else {
			$image_title   = '';
			$image_alt     = '';
			$image_srcset  = '';
			$image_sizes   = '';
			$image_caption = '';
			$attachment_id = '';
			$full_src      = [ '', '', '' ];
		}

		$image_variations[ $image_type ] = [
			'image_link'    => $image_link,
			'image_title'   => $image_title,
			'image_alt'     => $image_alt,
			'image_srcset'  => $image_srcset,
			'image_sizes'   => $image_sizes,
			'image_caption' => $image_caption,
			'image_id'      => $attachment_id,
			'full_src'      => $full_src[0],
			'full_src_w'    => $full_src[1],
			'full_src_h'    => $full_src[2],
		];

		return $image_variations;
	}

	/**
	 * Convert an array to a key/pair value array
	 *
	 * This is used for the select box creation
	 *
	 * @param mixed $a Input array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function convert_to_select_options( $a = [] ) {
		$r = [];
		foreach ( $a as $key => $value ) {
			$r[] = [
				'text'  => $value,
				'value' => $key,
			];
		}

		return $r;
	}


	/**
	 * Generates a new set of IDs for use in recreate_element_ids
	 *
	 * @param mixed $meta Meta data.
	 * @return mixed
	 * @since 4.8.5
	 */
	public function generate_recreate_element_ids( $meta = [] ) {
		$meta          = themecomplete_maybe_unserialize( $meta );
		$builder       = $meta;
		$original_meta = false;
		$parsed_meta   = false;
		$invalid       = false;
		if ( isset( $meta['tmfbuilder'] ) ) {
			$original_meta = true;
			$builder       = $meta['tmfbuilder'];
		} elseif ( isset( $meta['element_type'] ) ) {
			$parsed_meta = true;
		} else {
			$invalid = true;
		}

		if ( $invalid ) {
			return $meta;
		}

		if ( isset( $builder ) ) {
			$ids = $this->array_contains_key( $builder, '_uniqid' );

			$new_ids = [];
			foreach ( $ids as $idx => $idelement ) {
				foreach ( $idelement as $idy => $id ) {
					$new_ids[ $id ] = THEMECOMPLETE_EPO_HELPER()->tm_uniqid();
				}
			}

			return $new_ids;

		}

		return false;
	}

	/**
	 * Recreate the element IDs of the options meta data
	 *
	 * @param mixed              $meta Meta data.
	 * @param array<mixed>|false $new_ids Array with new ids.
	 * @return mixed
	 * @since 1.0
	 */
	public function recreate_element_ids( $meta = [], $new_ids = false ) {
		$meta          = themecomplete_maybe_unserialize( $meta );
		$builder       = $meta;
		$original_meta = false;
		$parsed_meta   = false;
		$invalid       = false;
		if ( isset( $meta['tmfbuilder'] ) ) {
			$original_meta = true;
			$builder       = $meta['tmfbuilder'];
		} elseif ( isset( $meta['element_type'] ) ) {
			$parsed_meta = true;
		} else {
			$invalid = true;
		}

		if ( $invalid ) {
			return $meta;
		}

		if ( isset( $builder ) ) {
			$ids             = $this->array_contains_key( $builder, '_uniqid' );
			$logics          = $this->array_contains_key( $builder, '_clogic' );
			$logicrules      = $this->array_contains_key( $builder, '_logicrules' );
			$math_price      = [];
			$math_sale_price = [];
			$lookuptable_x   = $this->array_contains_key( $builder, '_lookuptable_x' );
			$lookuptable_y   = $this->array_contains_key( $builder, '_lookuptable_y' );

			foreach ( $this->get_currencies() as $currency ) {
				$mt_prefix         = $this->get_currency_price_prefix( $currency );
				$math_price[]      = $this->array_keys_end_with( $builder, '_price' . $mt_prefix, [ '_before_price', '_after_price', '_sale_price' ] );
				$math_sale_price[] = $this->array_keys_end_with( $builder, '_sale_price' . $mt_prefix, [ '_before_price', '_after_price' ] );
			}

			if ( false === $new_ids ) {
				$new_ids = [];
				foreach ( $ids as $idx => $idelement ) {
					foreach ( $idelement as $idy => $id ) {
						$new_ids[ $id ] = THEMECOMPLETE_EPO_HELPER()->tm_uniqid();
					}
				}
			}
			foreach ( $ids as $idx => $idelement ) {
				foreach ( $idelement as $idy => $id ) {
					$ids[ $idx ][ $idy ] = $new_ids[ $id ];
				}
			}

			foreach ( $logics as $lx => $logicelement ) {
				foreach ( $logicelement as $ly => $logic ) {
					if ( 'string' !== gettype( $logic ) ) {
						$logic = wp_json_encode( $logic );
					}
					if ( false !== $logic ) {
						$logic                = str_replace( array_keys( $new_ids ), array_values( $new_ids ), $logic );
						$logics[ $lx ][ $ly ] = $logic;
					}
				}
			}

			foreach ( $logicrules as $lx => $logicelement ) {
				foreach ( $logicelement as $ly => $logic ) {
					if ( 'string' !== gettype( $logic ) ) {
						$logic = wp_json_encode( $logic );
					}
					if ( false !== $logic ) {
						$logic                    = str_replace( array_keys( $new_ids ), array_values( $new_ids ), $logic );
						$logicrules[ $lx ][ $ly ] = $logic;
					}
				}
			}

			foreach ( $lookuptable_x as $lxidx => $lxidelement ) {
				foreach ( $lxidelement as $lxidy => $lxid ) {
					if ( isset( $new_ids[ $lxid ] ) ) {
						$lookuptable_x[ $lxidx ][ $lxidy ] = $new_ids[ $lxid ];
					}
				}
			}
			foreach ( $lookuptable_y as $lyidx => $lyidelement ) {
				foreach ( $lyidelement as $lyidy => $lyid ) {
					if ( isset( $new_ids[ $lyid ] ) ) {
						$lookuptable_y[ $lyidx ][ $lyidy ] = $new_ids[ $lyid ];
					}
				}
			}

			foreach ( $math_price as $mx => $mathprice ) {
				foreach ( $mathprice as $lx => $priceelement ) {
					foreach ( $priceelement as $ly => $price ) {
						$dojson = false;
						if ( 'string' !== gettype( $price ) ) {
							$dojson = true;
							$price  = wp_json_encode( $price );
						}
						if ( false !== $price ) {
							$price = str_replace( array_keys( $new_ids ), array_values( $new_ids ), $price );
							if ( $dojson ) {
								$price = json_decode( $price );
							}
							$math_price[ $mx ][ $lx ][ $ly ] = $price;
						}
					}
				}
			}

			foreach ( $math_sale_price as $mx => $mathsaleprice ) {
				foreach ( $mathsaleprice as $lx => $priceelement ) {
					foreach ( $priceelement as $ly => $price ) {
						$dojson = false;
						if ( 'string' !== gettype( $price ) ) {
							$dojson = true;
							$price  = wp_json_encode( $price );
						}
						if ( false !== $price ) {
							$price = str_replace( array_keys( $new_ids ), array_values( $new_ids ), $price );
							if ( $dojson ) {
								$price = json_decode( $price );
							}
							$math_sale_price[ $mx ][ $lx ][ $ly ] = $price;
						}
					}
				}
			}

			$builder = array_merge( $builder, $ids );
			$builder = array_merge( $builder, $logics );
			$builder = array_merge( $builder, $logicrules );
			$builder = array_merge( $builder, $lookuptable_x );
			$builder = array_merge( $builder, $lookuptable_y );

			foreach ( $math_price as $mx => $mathprice ) {
				$builder = array_merge( $builder, $mathprice );
			}

			foreach ( $math_sale_price as $mx => $mathsaleprice ) {
				$builder = array_merge( $builder, $mathsaleprice );
			}

			if ( $original_meta ) {
				$meta['tmfbuilder'] = $builder;
			} else {
				$meta = $builder;
			}
		}

		return $meta;
	}

	/**
	 * Check if current request is made via AJAX
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_ajax_request() {
		if ( ! empty( $_SERVER['HTTP_X_REQUESTED_WITH'] ) ) {
			$http_x_requested_width = $this->filter_sanitize_string( sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_REQUESTED_WITH'] ) ) );
			if ( false !== $http_x_requested_width && 'xmlhttprequest' === strtolower( $http_x_requested_width ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Create min/max values for the provided options
	 *
	 * @param integer $product_id The product id.
	 * @param boolean $include_variation_prices If variation prices are included.
	 * @param string  $minkey The key 'min' or 'minall'. The minall does not include the field required status.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function sum_array_values( $product_id = 0, $include_variation_prices = false, $minkey = 'min' ) {

		if ( isset( $this->sum_array_values_cache[ $product_id ] ) ) {
			return $this->sum_array_values_cache[ $product_id ];
		}
		$sum = [];

		$fields = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->generate_fields( $product_id );

		if ( false === $fields ) {
			return $sum;
		}

		$is_real_max = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_max_real' );

		$sum[ $minkey ] = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->calculate_minimum_price( $fields, $include_variation_prices ? $product_id : false, $minkey );
		if ( 'yes' === $is_real_max ) {
			$sum['max'] = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->calculate_real_maximum_price( $fields, $include_variation_prices ? $product_id : false );
		} else {
			$sum['max'] = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->calculate_maximum_price( $fields );
		}

		$this->sum_array_values_cache[ $product_id ] = $sum;

		return $sum;
	}

	/**
	 * Walker for adding values
	 *
	 * @param array<mixed> $value Input array.
	 * @param array<mixed> $key Array key.
	 * @param array<mixed> $num Value to add.
	 * @return void
	 * @since 1.0
	 */
	public function add_values_walker( $value, $key, $num ) {
		$value = floatval( $value ) + floatval( $num );
	}

	/**
	 * Add array values
	 *
	 * @param mixed $input Input array.
	 * @param mixed $add Input array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function add_array_values( $input = [], $add = [] ) {
		$r = [];

		if ( is_array( $input ) && is_array( $add ) ) {
			foreach ( $input as $key => $value ) {
				$a = 0;
				if ( isset( $add[ $key ] ) ) {
					$a = floatval( $add[ $key ] );
				}

				$r[ $key ] = floatval( $value ) + $a;
			}
		}

		return $r;
	}

	/**
	 * Merge array values
	 *
	 * @param mixed $a Input array.
	 * @param mixed $b Input array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function merge_price_array( $a = [], $b = [] ) {
		if ( ! is_array( $a ) || ! is_array( $b ) ) {
			return $a;
		}

		$r = [];

		foreach ( $b as $key => $value ) {
			if ( '' === $value && isset( $a[ $key ] ) ) {
				$r[ $key ] = $a[ $key ];
			} else {
				$r[ $key ] = $value;
			}
		}

		return $r;
	}

	/**
	 * Builds an array
	 *
	 * Uses array $b as base and $a for value override.
	 *
	 * @param mixed $a Override array.
	 * @param mixed $b Base Input array.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function build_array( $a = [], $b = [] ) {
		if ( ! is_array( $a ) || ! is_array( $b ) ) {
			return $a;
		}

		$result = [];

		foreach ( $b as $key => $value ) {
			if ( is_array( $value ) ) {
				$result[ $key ] = isset( $a[ $key ] ) ? $value : $this->build_array( $a[ $key ], $value );
			} else {
				$result[ $key ] = isset( $a[ $key ] ) ? $a[ $key ] : $value;
			}
		}

		return $result;
	}

	/**
	 * Filters an $input array by key.
	 *
	 * @param mixed  $input Input array.
	 * @param string $what String to search.
	 * @param string $where Placement where to search 'start' or 'end'.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function array_filter_key( $input, $what = 'tmcp_', $where = 'start' ) {
		if ( ! is_array( $input ) || empty( $input ) ) {
			return [];
		}

		$filtered_result = [];

		if ( 'end' === $where ) {
			$what = strrev( $what );
		}

		foreach ( $input as $key => $value ) {
			$k = $key;
			if ( 'end' === $where ) {
				$k = strrev( $key );
			}
			if ( mb_strpos( $k, $what ) === 0 ) {
				$filtered_result[ $key ] = $value;
			}
		}

		return $filtered_result;
	}

	/**
	 * Array_map_deep functionality
	 *
	 * @param mixed    $input_array Input array.
	 * @param mixed    $array2 Input array.
	 * @param callable $callback Callback function.
	 * @return mixed
	 * @since 1.0
	 */
	public function array_map_deep( $input_array, $array2, $callback ) {
		$new = [];
		if ( is_array( $input_array ) && is_array( $array2 ) ) {
			foreach ( $input_array as $key => $val ) {
				if ( is_array( $val ) && is_array( $array2[ $key ] ) ) {
					$new[ $key ] = $this->array_map_deep( $val, $array2[ $key ], $callback );
				} else {
					$new[ $key ] = call_user_func( $callback, $val, $array2[ $key ] );
				}
			}
		} else {
			$new = call_user_func( $callback, $input_array, $array2 );
		}

		return $new;
	}

	/**
	 * Applies the callback to the elements of the given arrays, recursively
	 *
	 * @param  callable $callback Callback function to run for each element in each array.
	 * @param  mixed    $input_array    An array to run through the callback function.
	 * @return mixed Applies the callback to the elements of the given array.
	 */
	public function array_map_recursive( $callback, $input_array ) {
		if ( is_array( $input_array ) ) {
			return array_map(
				function ( $input_array ) use ( $callback ) {
					return $this->array_map_recursive( $callback, $input_array );
				},
				$input_array
			);
		}
		return $callback( $input_array );
	}

	/**
	 * Gets the site domain
	 *
	 * @return string
	 * @since 5.1
	 */
	public function get_site_domain() {
		$return   = site_url();
		$urlparts = wp_parse_url( $return );
		if ( $urlparts ) {
			$scheme = $urlparts['scheme'];
			$port   = isset( $urlparts['port'] ) ? $urlparts['port'] : '';
			$host   = $urlparts['host'];
			$port   = '80' === (string) $port ? '' : (string) $port;
			$port   = 'https' === $scheme && '443' === (string) $port ? '' : $port;
			$s_port = ! empty( $port ) ? ":$port" : '';
			$return = $scheme . '://' . $host . $s_port;
		}

		return $return;
	}

	/**
	 * Get ID from URL
	 *
	 * @param string $url Permalink to check.
	 * @return integer
	 * @since 1.0
	 */
	public function get_url_to_postid( $url ) {
		if ( function_exists( 'url_to_postid' ) ) {
			return url_to_postid( $url );
		}

		return 0;
	}

	/**
	 * Count number of words
	 *
	 * @param string $str Input string.
	 * @return integer
	 * @since 6.0
	 */
	public function count_words( $str ) {
		$words = preg_match_all( '/[\pL\d!@#$%^\&*()_+=\{[\}\]|\\"\':;?\/>.<,-]+/u', $str );
		return false !== $words ? $words : 0;
	}

	/**
	 * Build custom meta query
	 *
	 * @param string  $relation The query relation.
	 * @param string  $meta_key The meta key.
	 * @param mixed   $meta_value The meta value.
	 * @param string  $compare Compare operator.
	 * @param string  $exists Exists operator.
	 * @param boolean $use_double_check Check the value with quotes and without quotes.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function build_meta_query( $relation = 'OR', $meta_key = '', $meta_value = '', $compare = '!=', $exists = 'NOT EXISTS', $use_double_check = false ) {
		$meta_array = [
			'relation' => $relation,
		];
		if ( $use_double_check ) {
			$meta_array[] = [
				'relation' => 'AND',
				[
					'key'     => $meta_key, // get only enabled global extra options.
					'value'   => ':' . $meta_value . ';',
					'compare' => $compare,
				],
				[
					'key'     => $meta_key, // get only enabled global extra options.
					'value'   => ':"' . $meta_value . '";',
					'compare' => $compare,
				],
			];
		} else {
			$meta_array[] = [
				'key'     => $meta_key, // get only enabled global extra options.
				'value'   => $meta_value,
				'compare' => $compare,
			];
		}
		$meta_array[] = [
			'key'     => $meta_key, // backwards compatibility.
			'compare' => $exists,
		];

		return $meta_array;
	}

	/**
	 * Create a uniqe ID
	 *
	 * @param string $prefix Specifies a prefix to the unique ID.
	 * @return string
	 * @since 1.0
	 */
	public function tm_uniqid( $prefix = '' ) {
		return uniqid( $prefix, true );
	}

	/**
	 * Create uniqe IDs for provided array length
	 *
	 * @param integer $s Array length.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_temp_uniqid( $s ) {
		$a = [];
		for ( $m = 0; $m < $s; $m++ ) {
			$a[] = $this->tm_uniqid();
		}

		return $a;
	}

	/**
	 * EncodeURIComponent functioanlity
	 *
	 * @param string|null|array<mixed> $str Input string.
	 * @return string|array<mixed>
	 * @since 1.0
	 */
	public function encode_uri_component( $str = '' ) {
		// If $str is an array, apply the function to each element.
		if ( is_array( $str ) ) {
			return array_map( [ $this, 'encode_uri_component' ], $str );
		}

		$revert = [
			'%21' => '!',
			'%2A' => '*',
			'%27' => "'",
			'%28' => '(',
			'%29' => ')',
		];

		if ( is_null( $str ) ) {
			$str = '';
		}

		return strtr( rawurlencode( $str ), $revert );
	}

	/**
	 * Return everything up to last instance of needle
	 *
	 * Use $trail to include needle chars including and past last needle
	 * http://php.net/manual/en/function.strrchr.php#64157
	 *
	 * @param string|array<mixed> $haystack The string to search in.
	 * @param string              $needle The needle.
	 * @param integer             $trail Trailing character to include.
	 * @return ($haystack is string ? string : array<mixed>)
	 * @since 1.0
	 */
	public function reverse_strrchr( $haystack, $needle, $trail = 0 ) {
		// If $haystack is an array, apply the function to each element.
		if ( is_array( $haystack ) ) {
			return array_map(
				function ( $str ) use ( $needle, $trail ) {
					return $this->reverse_strrchr( $str, $needle, $trail );
				},
				$haystack
			);
		}
		return strrpos( $haystack, $needle ) !== false ? substr( $haystack, 0, strrpos( $haystack, $needle ) + $trail ) : '';
	}

	/**
	 * Return the cache key for global forms based on the passed arguments
	 * Used in wp_count_posts below
	 *
	 * @param string $type Post type to retrieve count. Default 'post'.
	 * @param string $perm 'readable' or empty. Default empty.
	 * @return string
	 * @since 1.0
	 */
	private function count_posts_cache_key( $type = 'post', $perm = '' ) {
		$cache_key = 'tm-posts-' . $type;
		if ( 'readable' === $perm && is_user_logged_in() ) {
			$post_type_object = get_post_type_object( $type );
			if ( $post_type_object && ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
				$cache_key .= '_' . $perm . '_' . get_current_user_id();
			}
		}

		return $cache_key;
	}

	/**
	 * Find the amount of post's type
	 * Used in class-tm-epo-admin-global-list-table.php
	 *
	 * @param string $type Post type to retrieve count. Default 'post'.
	 * @param string $perm 'readable' or empty. Default empty.
	 * @return mixed
	 * @since 1.0
	 */
	public function wp_count_posts( $type = 'post', $perm = '' ) {
		global $wpdb;

		if ( ! post_type_exists( $type ) ) {
			return new stdClass();
		}

		$cache_key = $this->count_posts_cache_key( $type, $perm );
		$counts    = wp_cache_get( $cache_key, 'counts' );
		if ( false !== $counts ) {
			return apply_filters( 'wc_epo_wp_count_posts', $counts, $type, $perm );
		}

		// WPML.
		$_lang = THEMECOMPLETE_EPO_WPML()->get_lang();

		$args = [
			'posts_per_page' => -1,
			'no_found_rows'  => true,
			'post_type'      => $type,
			'post_status'    => get_post_stati(),
		];

		if ( THEMECOMPLETE_EPO_WPML()->is_active() && 'all' !== THEMECOMPLETE_EPO_WPML()->get_lang() ) {
			$args['meta_query'] = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $_lang, '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
		}

		$posts_query = new WP_Query( $args );
		$the_count   = $posts_query->post_count;

		$counts = array_fill_keys( get_post_stati(), 0 );
		$counts = array_merge( $counts, array_count_values( wp_list_pluck( $posts_query->posts, 'post_status' ) ) );

		$counts = (object) $counts;

		wp_cache_set( $cache_key, $counts, 'counts' );

		return apply_filters( 'wc_epo_wp_count_posts', $counts, $type, $perm );
	}

	/**
	 * Get base currecny
	 *
	 * @return string
	 * @since 1.0
	 */
	public function wc_base_currency() {
		$from_currency = get_option( 'woocommerce_currency' );
		return $from_currency;
	}

	/**
	 * Get enabled currencies
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function get_currencies() {
		return apply_filters( 'wc_epo_enabled_currencies', [ $this->wc_base_currency() ] );
	}

	/**
	 * Get additional currencies
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function get_additional_currencies() {
		$enabled_currencies = $this->get_currencies();
		$from_currency      = $this->wc_base_currency();
		foreach ( $enabled_currencies as $key => $value ) {
			if ( $value === $from_currency ) {
				unset( $enabled_currencies[ $key ] );
				break;
			}
		}

		return $enabled_currencies;
	}

	/**
	 * Get additional currencies count
	 *
	 * @return integer
	 * @since 1.0
	 */
	public function wc_num_enabled_currencies() {
		$enabled_currencies = $this->get_additional_currencies();
		if ( is_array( $enabled_currencies ) ) {
			return count( $enabled_currencies );
		}

		return 0;
	}

	/**
	 * Get currency prefix
	 *
	 * @param mixed  $currency Input currency.
	 * @param string $prefix The prefix to add.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_currency_price_prefix( $currency = null, $prefix = '_' ) {
		if ( true === $currency || null === $currency ) {
			if ( true === $currency || $this->wc_num_enabled_currencies() > 0 ) {
				$to_currency = themecomplete_get_woocommerce_currency();

				return $prefix . $to_currency;
			} else {
				return '';
			}
		} else {
			return ( empty( $currency ) || $currency === $this->wc_base_currency() ) ? '' : $prefix . $currency;
		}
	}

	/**
	 * Format bytes
	 *
	 * @param mixed   $bytes The number of bytes.
	 * @param integer $precision The format precision.
	 * @return string
	 * @since 1.0
	 */
	public function format_bytes( $bytes, $precision = 2 ) {
		$units = [ 'B', 'KB', 'MB', 'GB', 'TB' ];

		$bytes = max( $bytes, 0 );
		$pow   = floor( ( $bytes ? log( $bytes ) : 0 ) / log( 1024 ) );
		$pow   = min( $pow, count( $units ) - 1 );

		$bytes /= pow( 1024, $pow );

		return round( $bytes, $precision ) . ' ' . $units[ $pow ];
	}

	/**
	 * Add a right icon to label
	 *
	 * @param string $label The label.
	 * @param string $icon The icon id.
	 * @return string
	 * @since 1.0
	 */
	private function convert_to_right_icon( $label = '', $icon = 'tcfa-angle-right' ) {
		$label  = str_replace( '/', '', $label );
		$label .= '<i class="tm-icon tmfa tcfa ' . $icon . '"></i>';

		return $label;
	}

	/**
	 * Convert a url to an html link
	 *
	 * @param string $url The url.
	 * @param string $main_path The main path.
	 * @param string $main_path_label The main path label.
	 * @return string
	 * @since 1.0
	 */
	public function url_to_links( $url = '', $main_path = '', $main_path_label = '' ) {

		$param = str_replace( $main_path, '', $url );
		$param = explode( '/', $param );

		$html = '';

		$a     = '<a class="tm-mn-movetodir" data-tm-dir="" href="' . esc_url( $main_path ) . '">' . $this->convert_to_right_icon( esc_html( $main_path_label ) ) . '</a>';
		$html .= $a;
		$todir = '';
		foreach ( $param as $key => $value ) {
			if ( (int) ( count( $param ) - 1 ) === (int) $key ) {
				$a = '<span class="tm-mn-currentdir">' . esc_html( $value ) . '</span>';
			} else {
				$data_tm_dir = ( empty( $todir ) ) ? $value : $todir . '/' . $value;
				$a           = '<a class="tm-mn-movetodir" data-tm-dir="' . esc_attr( $data_tm_dir ) . '" href="' . esc_url( $main_path . $data_tm_dir ) . '">' . $this->convert_to_right_icon( esc_html( $value . '/' ) ) . '</a>';
				$todir       = $data_tm_dir;
			}
			$html .= $a;
		}

		return $html;
	}

	/**
	 * Inits WordPress filesystem
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function init_filesystem() {
		if ( function_exists( 'get_filesystem_method' ) ) {
			$access_type = get_filesystem_method();
			if ( 'direct' === $access_type ) {
				// you can safely run request_filesystem_credentials() without any issues and don't need to worry about passing in a URL.
				$creds = request_filesystem_credentials( site_url() . '/wp-admin/', '', false, '', [] );
				if ( true !== $creds ) {
					// initialize the API.
					if ( ! WP_Filesystem( $creds ) ) {
						// any problems and we exit.
						return false;
					}
				}

				return true;
			}
		}

		return false;
	}

	/**
	 * Remove directory
	 *
	 * @param string $file The file path.
	 * @return boolean
	 * @since 1.0
	 */
	public function file_rmdir( $file = '' ) {
		if ( $this->init_filesystem() ) {
			global $wp_filesystem;
			$mn = $wp_filesystem->rmdir( $file, true );
			clearstatcache();

			return $mn;
		}

		return false;
	}

	/**
	 * Delete a file
	 *
	 * @param string $file The file path.
	 * @return boolean
	 * @since 1.0
	 */
	public function file_delete( $file = '' ) {
		if ( $this->init_filesystem() ) {
			global $wp_filesystem;
			$mn = $wp_filesystem->delete( $file );
			clearstatcache();

			return $mn;
		}

		return false;
	}

	/**
	 * File managet display
	 *
	 * @param string $main_path The main path.
	 * @param string $todir The directory.
	 * @return string
	 * @since 1.0
	 */
	public function file_manager( $main_path = '', $todir = '' ) {

		$html = '';

		if ( is_admin() && '//' !== $main_path && $this->init_filesystem() ) {

			global $wp_filesystem;

			$subdir = $main_path . $todir;
			$param  = wp_upload_dir();
			if ( empty( $param['subdir'] ) ) {
				$base_url        = $param['url'] . $main_path;
				$param['path']   = $param['path'] . $subdir;
				$param['url']    = $param['url'] . $subdir;
				$param['subdir'] = $subdir;
			} else {
				$param['path']   = str_replace( $param['subdir'], $subdir, $param['path'] );
				$param['url']    = str_replace( $param['subdir'], $subdir, $param['url'] );
				$param['subdir'] = str_replace( $param['subdir'], $subdir, $param['subdir'] );
				$base_url        = str_replace( $param['subdir'], $main_path, $param['url'] );
			}

			clearstatcache();
			$mn = $wp_filesystem->dirlist( $param['path'], true, false );

			$files       = [];
			$directories = [];
			if ( $mn ) {
				foreach ( $mn as $key => $value ) {
					if ( isset( $value['type'] ) && isset( $value['name'] ) && isset( $value['size'] ) ) {
						switch ( strtolower( $value['type'] ) ) {
							case 'd':
								$directories[] = [
									'name' => $value['name'],
									'size' => 0,
								];
								break;

							case 'f':
								$files[] = [
									'name' => $value['name'],
									'size' => $value['size'],
								];
								break;
						}
					}
				}
			}

			$html .= '<div class="tm-mn-header"><div class="tm-mn-path">' . $this->url_to_links( $param['url'], $base_url, $main_path ) . '</div></div>';
			$html .= '<div class="tm-mn-wrap-heading tc-row nopadding nomargin">';
			$html .= '<div class="tm-mn-name tc-cell tc-col-6">' . esc_html__( 'Filename', 'woocommerce-tm-extra-product-options' ) . '</div>';
			$html .= '<div class="tm-mn-size tc-cell tc-col-3">' . esc_html__( 'Size', 'woocommerce-tm-extra-product-options' ) . '</div>';
			$html .= '<div class="tm-mn-op tc-cell tc-col-3">&nbsp;</div>';
			$html .= '</div>';
			foreach ( $directories as $key => $value ) {
				$filetype    = wp_check_filetype( $value['name'] );
				$img         = '<img class="tm-mime" src="' . esc_attr( (string) wp_mime_type_icon( (string) $filetype['type'] ) ) . '" /> ';
				$html       .= '<div class="tm-mn-wrap-dir tc-row nopadding nomargin">';
				$data_tm_dir = ( empty( $todir ) ) ? $value['name'] : $todir . '/' . $value['name'];
				$html       .= '<div class="tm-mn-name tc-cell tc-col-6">' . $img . '<a class="tm-mn-movetodir" data-tm-dir="' . esc_attr( $data_tm_dir ) . '" href="' . esc_url( $param['url'] . $value['name'] ) . '">' . esc_html( $value['name'] ) . '</a></div>';
				$html       .= '<div class="tm-mn-size tc-cell tc-col-3">&nbsp;</div>';
				$html       .= '<div class="tm-mn-op tc-cell tc-col-3">'
								. '<a title="' . esc_html__( 'Delete', 'woocommerce-tm-extra-product-options' ) . '" href="#" data-tm-dir="' . esc_attr( $todir ) . '" data-tm-deldir="' . esc_attr( $data_tm_dir ) . '" class="tm-mn-deldir"><i class="tm-icon tmfa tcfa tcfa-times"></i></a>'
								. '</div>';
				$html       .= '</div>';
			}
			foreach ( $files as $key => $value ) {
				$filetype = wp_check_filetype( $value['name'] );
				$img      = '<img class="tm-mime" src="' . esc_attr( (string) wp_mime_type_icon( (string) $filetype['type'] ) ) . '" /> ';

				$html       .= '<div class="tm-mn-wrap-file tc-row nopadding nomargin">';
				$data_tm_dir = $todir;
				$html       .= '<div class="tm-mn-name tc-cell tc-col-6">' . $img . '<a class="tm-download-file" download href="' . esc_url( $base_url . $todir . '/' . $value['name'] ) . '">' . esc_html( $value['name'] ) . '</a></div>';
				$html       .= '<div class="tm-mn-size tc-cell tc-col-3">' . $this->format_bytes( $value['size'], 2 ) . '</div>';
				$html       .= '<div class="tm-mn-op tc-cell tc-col-3">'
								. '<a title="' . esc_html__( 'Delete', 'woocommerce-tm-extra-product-options' ) . '" href="#" data-tm-dir="' . esc_attr( $todir ) . '" data-tm-deldir="' . esc_attr( $data_tm_dir ) . '" data-tm-delfile="' . esc_attr( $value['name'] ) . '" class="tm-mn-delfile"><i class="tm-icon tmfa tcfa tcfa-times"></i></a>'
								. '</div>';
				$html       .= '</div>';
			}
		}

		return $html;
	}

	/**
	 * Get saved unique ids for elements in the order
	 *
	 * @param integer $product_id The product id.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_saved_order_multiple_keys( $product_id = 0 ) {
		$this_land_epos            = THEMECOMPLETE_EPO()->get_product_tm_epos( $product_id );
		$saved_order_multiple_keys = [];
		if ( isset( $this_land_epos['global'] ) && is_array( $this_land_epos['global'] ) ) {
			foreach ( $this_land_epos['global'] as $priority => $priorities ) {
				if ( is_array( $priorities ) ) {
					foreach ( $priorities as $pid => $field ) {
						if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {
							foreach ( $field['sections'] as $section_id => $section ) {
								if ( isset( $section['elements'] ) && is_array( $section['elements'] ) ) {
									foreach ( $section['elements'] as $element ) {
										$saved_order_multiple_keys[ $element['uniqid'] ]              = $element['label'];
										$saved_order_multiple_keys[ 'options_' . $element['uniqid'] ] = $element['options'];
									}
								}
							}
						}
					}
				}
			}
		}

		return $saved_order_multiple_keys;
	}

	/**
	 * Get the WooCommerce order object
	 *
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_get_order_object() {
		global $thepostid, $theorder;

		if ( ! is_object( $theorder ) ) {
			$theorder = wc_get_order( $thepostid );
		}
		if ( ! $theorder && isset( $_REQUEST['order_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$order_id = absint( $_REQUEST['order_id'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$order    = wc_get_order( $order_id );

			return $order;
		} elseif ( ! $theorder && isset( $_REQUEST['post_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$order_id = absint( $_REQUEST['post_ID'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$order    = wc_get_order( $order_id );

			return $order;
		}
		if ( ! $theorder ) {
			global $post;
			if ( $post ) {
				$theorder = wc_get_order( $post->ID );
			}
		}

		return $theorder;
	}

	/**
	 * Convert the uploaded image to png
	 *
	 * @param string $source The source file name.
	 * @param string $target The target file name.
	 * @return boolean
	 * @since 1.0
	 */
	public function upload_to_png( $source, $target ) {

		if ( function_exists( 'exif_imagetype' ) && exif_imagetype( $source ) === false ) {
			return false; // Invalid image.
		}

		if ( ! function_exists( 'imagecreatefromstring' ) ) {
			return false; // GD library not installed.
		}

		include_once ABSPATH . 'wp-admin/includes/file.php';
		global $wp_filesystem;
		WP_Filesystem();

		$source_img = imagecreatefromstring( $wp_filesystem->get_contents( $source ) );

		if ( false === $source_img ) {
			return false; // Invalid image.
		}

		$width      = imagesx( $source_img );
		$height     = imagesy( $source_img );
		$target_img = imagecreatetruecolor( $width, $height );
		if ( false === $target_img ) {
			return false; // Invalid image.
		}
		$imagecolorallocatealpha = imagecolorallocatealpha( $target_img, 0, 0, 0, 127 );
		if ( false === $imagecolorallocatealpha ) {
			return false; // Invalid image.
		}
		imagecolortransparent( $target_img, $imagecolorallocatealpha );
		imagealphablending( $target_img, false );

		imagesavealpha( $target_img, true );

		imagecopy( $target_img, $source_img, 0, 0, 0, 0, $width, $height );

		imagedestroy( $source_img );
		imagepng( $target_img, $target );
		imagedestroy( $target_img );

		return true;
	}

	/**
	 * Search through an array for a matching key.
	 *
	 * See https://gist.github.com/steve-todorov/3671626
	 *
	 * @param array<mixed> $input_array The input array.
	 * @param string       $search_value The value to search.
	 * @param boolean      $case_sensitive if search is case sensitive.
	 *
	 * @return array<mixed>
	 */
	public function array_contains_key( $input_array, $search_value, $case_sensitive = true ) {
		if ( $case_sensitive ) {
			$preg_match = '/' . $search_value . '/';
		} else {
			$preg_match = '/' . $search_value . '/i';
		}
		$return_array = [];
		$keys         = array_keys( $input_array );
		foreach ( $keys as $k ) {
			if ( preg_match( $preg_match, $k ) ) {
				$return_array[ $k ] = $input_array[ $k ];
			}
		}

		return $return_array;
	}

	/**
	 * Search through an array for a matching key that ends with a string.
	 *
	 * @param array<mixed> $input_array The input array.
	 * @param string       $search_value The value to search.
	 * @param array<mixed> $excludes The values to exclude.
	 *
	 * @return array<mixed>
	 */
	public function array_keys_end_with( $input_array = [], $search_value = '', $excludes = [] ) {
		$return_array = [];
		$keys         = array_keys( $input_array );
		foreach ( $keys as $k ) {
			if ( str_ends_with( $k, $search_value ) ) {
				$canbeadded = true;
				foreach ( $excludes as $exclude ) {
					if ( str_ends_with( $k, $exclude ) ) {
						$canbeadded = false;
					}
				}
				if ( $canbeadded ) {
					$return_array[ $k ] = $input_array[ $k ];
				}
			}
		}

		return $return_array;
	}

	/**
	 * Sanitize array key
	 *
	 * @param string $source The input string.
	 * @return string
	 * @since 1.0
	 */
	public function sanitize_key( $source ) {
		return str_replace( [ '[', ']' ], '', $source );
	}

	/**
	 * Recursively implodes an array with optional key inclusion
	 *
	 * Adapted from https://gist.github.com/jimmygle/2564610
	 *
	 * @access public
	 *
	 * @param array<mixed>   $input_array    multi-dimensional array to recursively implode.
	 * @param string         $glue     value that glues elements together.
	 * @param string|boolean $key_glue include keys before their values.
	 * @param boolean        $trim_all trim ALL whitespace from string.
	 *
	 * @return string imploded array
	 */
	public function recursive_implode( $input_array = [], $glue = ',', $key_glue = false, $trim_all = false ) {
		if ( ! is_array( $input_array ) ) {
			return $input_array;
		}

		if ( true === $key_glue ) {
			$key_glue = $glue;
		}

		$glued_string = '';
		// Recursively iterates array and adds key/value to glued string.
		array_walk_recursive(
			$input_array,
			function ( $value, $key ) use ( $glue, $key_glue, &$glued_string ) {
				if ( false !== $key_glue ) {
					$glued_string .= $key . $key_glue;
				}
				$glued_string .= $value . $glue;
			}
		);
		// Removes last $glue from string.
		if ( strlen( $glue ) > 0 ) {
			$glued_string = substr( $glued_string, 0, - strlen( $glue ) );
		}
		// Trim ALL whitespace.
		if ( $trim_all ) {
			$glued_string = preg_replace( '/(\s)/ixsm', '', $glued_string );
		}

		return (string) $glued_string;
	}

	/**
	 * Computes the intersection of arrays using keys for comparison
	 * with wildcart support
	 *
	 * @param array<mixed> $arr The array with master keys to check.
	 * @param array<mixed> $arr2 Array to compare keys against.
	 * @return array<mixed>
	 */
	public function array_intersect_key_wildcard( $arr, $arr2 ) {
		$ret = [];

		foreach ( $arr2 as $key => $value ) {
			$nee = str_replace( '\\*', '[0-9]+?', preg_quote( $key, '/' ) );
			$nee = preg_grep( '/^' . $nee . '$/i', array_keys( $arr ) );
			if ( ! is_array( $nee ) ) {
				$nee = [];
			}
			$ret[] = array_intersect_key( $arr, array_flip( $nee ) );
		}
		$array = [];
		foreach ( $ret as $key => $value ) {
			$array = array_merge( $array, $value );
		}

		// keep the original order or $arr.
		$ordered_array = [];
		foreach ( $arr as $key => $value ) {
			if ( array_key_exists( $key, $array ) ) {
				$ordered_array[ $key ] = $array[ $key ];
			}
		}

		return $ordered_array;
	}

	/**
	 * Normalize variable
	 *
	 * @param mixed   $data The data to normalize.
	 * @param boolean $normalize_key If the array keys should be normalized.
	 * @param boolean $implode_value If the array values should be joined.
	 * @return mixed
	 * @since 6.0
	 */
	public function normalize_data( $data = [], $normalize_key = false, $implode_value = true ) {
		if ( class_exists( 'Normalizer' ) ) {
			if ( is_array( $data ) ) {
				foreach ( $data as $post_data_key => $post_data_value ) {
					if ( is_array( $post_data_key ) ) { // @phpstan-ignore-line
						$post_data_key = $this->recursive_implode( $post_data_key, '' );
					}
					if ( is_array( $post_data_value ) ) {
						if ( $implode_value ) {
							$post_data_value = $this->recursive_implode( $post_data_value, '' );
							$post_data_value = Normalizer::normalize( (string) $post_data_value );
						} else {
							foreach ( $post_data_value as $key => $value ) {
								if ( is_array( $value ) || is_object( $value ) ) {
									$post_data_value[ $key ] = $value;
								} else {
									$post_data_value[ $key ] = Normalizer::normalize( (string) $value );
								}
							}
						}
					} else {
						$post_data_value = Normalizer::normalize( (string) $post_data_value );
					}
					if ( $normalize_key ) {
						$post_data_key = Normalizer::normalize( (string) $post_data_key );
					}
					$data[ Normalizer::normalize( (string) $post_data_key ) ] = $post_data_value;
				}
			} elseif ( is_object( $data ) || is_bool( $data ) ) {
				return $data;
			} else {
				$data = Normalizer::normalize( (string) $data );
			}
		}
		return $data;
	}

	/**
	 * Array map for keys
	 *
	 * @param callable     $callback The function callback.
	 * @param array<mixed> $input_array The input array.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 6.0
	 */
	public function array_map_key( $callback, $input_array, $args = [] ) {
		$out = [];

		foreach ( $input_array as $key => $value ) {
			$mapkey         = call_user_func_array( $callback, array_merge( [ $key ], $args ) );
			$out[ $mapkey ] = $value;
		}

		return $out;
	}

	/**
	 * Safe html_entity_decode
	 *
	 * @param string $str The value to decode.
	 * @return string
	 * @since 1.0
	 */
	public function html_entity_decode( $str = '' ) {
		return html_entity_decode( $str, version_compare( phpversion(), '5.4', '<' ) ? ENT_COMPAT : ( ENT_COMPAT | ENT_HTML401 ), 'UTF-8' );
	}

	/**
	 * Array map with html_entity_decode
	 *
	 * @param mixed $value The value to decode.
	 * @return mixed
	 * @since 6.0
	 */
	public function entity_decode( $value ) {
		if ( is_array( $value ) ) {
			$value = array_map( [ $this, 'html_entity_decode' ], $value );
		} else {
			$value = $this->html_entity_decode( $value );
		}

		return $value;
	}

	/**
	 * Gets cached posts for a query. Results are stored against a hash of the
	 * parameter array. If there's nothing in the cache, a fresh query is made.
	 * https://wordpress.stackexchange.com/questions/162703/cache-get-posts
	 *
	 * @param array<mixed> $args The parameters to pass to get_posts().
	 *
	 * @return array<mixed> List of posts matching $args.
	 */
	public static function get_cached_posts( $args = [] ) {
		$post_list_name = 'tm_get_posts' . md5( strval( wp_json_encode( $args ) ) );

		$post_list = wp_cache_get( $post_list_name );

		if ( false === $post_list ) {
			$post_list = get_posts( $args );

			wp_cache_set( $post_list_name, $post_list );
		}

		return $post_list;
	}

	/**
	 * Gets a cached post for a query. Results are stored against a hash of the
	 * parameter array. If there's nothing in the cache, a fresh query is made.
	 * https://wordpress.stackexchange.com/questions/162703/cache-get-posts
	 *
	 * @param integer $post_id The post id to pass to get_post().
	 *
	 * @return WP_Post|null The returned post or null.
	 */
	public static function get_cached_post( $post_id = 0 ) {
		$post_list_name = 'tm_get_post' . md5( strval( wp_json_encode( $post_id ) ) );

		$post_list = wp_cache_get( $post_list_name );

		if ( false === $post_list ) {
			$post_list = get_post( $post_id );

			wp_cache_set( $post_list_name, $post_list );
		}

		return $post_list;
	}

	/**
	 * Takes a string/array of strings, removes all formatting/cruft
	 * and returns the raw float value.
	 *
	 * @param mixed $value the value to unformat.
	 * @param mixed $decimal the decimal point.
	 *
	 * @return mixed Unformatted value or 0.
	 */
	public function unformat( $value = '', $decimal = false ) {
		$unformatted = '';

		// Recursively unformat arrays.
		if ( is_array( $value ) ) {
			return array_map(
				function ( $item ) use ( $decimal ) {
					return $this->unformat( $item, $decimal );
				},
				$value
			);
		}

		// Return the value as-is if it's already a number.
		if ( 'integer' === gettype( $value ) || 'double' === gettype( $value ) ) {
			return $value;
		}

		if ( 'string' !== gettype( $value ) ) {
			return 0;
		}

		// Get local decimal point.
		if ( false === $decimal ) {
			$tm_epo_global_input_decimal_separator = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_input_decimal_separator' );
			if ( '' === $tm_epo_global_input_decimal_separator ) {
				// currency_format_decimal_sep.
				$decimal = wp_unslash( get_option( 'woocommerce_price_decimal_sep' ) );
			} elseif ( class_exists( 'NumberFormatter' ) ) {
				$locale = get_locale();
				if ( isset( $_SERVER ) && isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) { // @phpstan-ignore-line
					$locale = explode( ',', wp_unslash( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					$locale = $locale[0];
					$locale = str_replace( '-', '_', $locale );
				}
				$fmt = new NumberFormatter( $locale, NumberFormatter::DECIMAL );
				$n   = $fmt->format( 1.1 );
				if ( ! is_string( $n ) ) {
					$n = '';
				}
				$matches = [];
				preg_match( '/^1(.+)1$/', $n, $matches );
				if ( isset( $matches[1] ) ) {
					$decimal = $matches[1];
				}
			}
		}
		if ( false === $decimal || true === $decimal ) {
			$decimal = '.';
		}

		// Strip out everything except digits, decimal point and minus sign and the dot.
		// The dot is added in case the system posts a number while not using dot as a
		// decimal point like in the case of number fields.
		$unformatted = preg_replace( '/[^0-9-.' . $decimal . ']/', '', $value );
		// Make sure decimal point is standard.
		$unformatted = str_replace( $decimal, '.', $unformatted );

		$unformatted = (float) $unformatted;

		return $unformatted;
	}

	/**
	 * Convert url to ssl
	 *
	 * @param mixed $url The url.
	 * @return ($url is array<mixed> ? array<mixed> : string)
	 * @since 6.1
	 */
	public function to_ssl( $url = '' ) {

		if ( is_ssl() ) {
			if ( is_array( $url ) ) {
				foreach ( $url as $url_key => $url_value ) {
					if ( ! is_array( $url_value ) ) {
						$url[ $url_key ] = $this->to_ssl( $url_value );
					}
				}
			} else {
				$url = preg_replace( '/^http:/i', 'https:', $url );
			}
		}

		return $url;
	}

	/**
	 * Array some functionality
	 *
	 * @param array<mixed> $input_array The array.
	 * @param mixed        $func The callable function.
	 * @return boolean
	 * @since 6.1
	 */
	public function array_some( $input_array, $func ) {
		if ( is_array( $input_array ) && $func ) {
			foreach ( $input_array as $value ) {
				if ( $func( $value ) ) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * Convert user input to number
	 *
	 * @param mixed   $val The value to convert.
	 * @param boolean $noformat If a number should be returned for PHP calculations.
	 * @return mixed
	 * @since 6.3
	 */
	public function convert_to_number( $val = '', $noformat = false ) {
		if ( ! is_numeric( $val ) ) {
			return 0.0;
		}
		if ( function_exists( 'numfmt_create' ) ) {
			$val = $val + 0; // Auto convert to float or int.

			$locale = get_locale();
			if ( isset( $_SERVER ) && isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) { // @phpstan-ignore-line
				$locale = explode( ',', wp_unslash( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				$locale = $locale[0];
				$locale = str_replace( '-', '_', $locale );
			}
			$fmt = numfmt_create( $locale, NumberFormatter::DECIMAL );
			// Set the maximum number of decimal places.
			$fmt->setAttribute( NumberFormatter::MAX_FRACTION_DIGITS, 50 );
			$val = numfmt_format( $fmt, $val );

			if ( $noformat && is_string( $val ) ) {
				$thousand_separator_symbol = numfmt_get_symbol( $fmt, NumberFormatter::GROUPING_SEPARATOR_SYMBOL );
				$decimal_separator_symbol  = numfmt_get_symbol( $fmt, NumberFormatter::DECIMAL_SEPARATOR_SYMBOL );
				if ( is_string( $thousand_separator_symbol ) && is_string( $decimal_separator_symbol ) ) {
					// format Arabic numbers to English numbers.
					$arabic_numbers = [
						'٠' => '0',
						'١' => '1',
						'٢' => '2',
						'٣' => '3',
						'٤' => '4',
						'٥' => '5',
						'٦' => '6',
						'٧' => '7',
						'٨' => '8',
						'٩' => '9',
					];

					$val = str_replace( array_keys( $arabic_numbers ), array_values( $arabic_numbers ), $val );

					// format Persian numbers to English numbers.
					$persian = [
						'۰' => '0',
						'۱' => '1',
						'۲' => '2',
						'۳' => '3',
						'۴' => '4',
						'۵' => '5',
						'۶' => '6',
						'۷' => '7',
						'۸' => '8',
						'۹' => '9',
					];

					$val = str_replace( array_keys( $persian ), array_values( $persian ), $val );

					// format Chinese numbers to English numbers.
					$chinese_numbers = [
						'零' => '0',
						'一' => '1',
						'二' => '2',
						'三' => '3',
						'四' => '4',
						'五' => '5',
						'六' => '6',
						'七' => '7',
						'八' => '8',
						'九' => '9',
					];

					$val = str_replace( array_keys( $chinese_numbers ), array_values( $chinese_numbers ), $val );

					// format Japanese numbers to English numbers.
					$japanese_numbers = [
						'零' => '0',
						'一' => '1',
						'二' => '2',
						'三' => '3',
						'四' => '4',
						'五' => '5',
						'六' => '6',
						'七' => '7',
						'八' => '8',
						'九' => '9',
					];

					$val = str_replace( array_keys( $japanese_numbers ), array_values( $japanese_numbers ), $val );

					// format Korean numbers to English numbers.
					$korean_numbers = [
						'영' => '0',
						'일' => '1',
						'이' => '2',
						'삼' => '3',
						'사' => '4',
						'오' => '5',
						'육' => '6',
						'칠' => '7',
						'팔' => '8',
						'구' => '9',
					];

					$val = str_replace( array_keys( $korean_numbers ), array_values( $korean_numbers ), $val );

					// format Hindi numbers to English numbers.
					$hindi_numbers = [
						'०' => '0',
						'१' => '1',
						'२' => '2',
						'३' => '3',
						'४' => '4',
						'५' => '5',
						'६' => '6',
						'७' => '7',
						'८' => '8',
						'९' => '9',
					];

					$val = str_replace( array_keys( $hindi_numbers ), array_values( $hindi_numbers ), $val );

					// format Thai numbers to English numbers.
					$thai_numbers = [
						'๐' => '0',
						'๑' => '1',
						'๒' => '2',
						'๓' => '3',
						'๔' => '4',
						'๕' => '5',
						'๖' => '6',
						'๗' => '7',
						'๘' => '8',
						'๙' => '9',
					];

					$val = str_replace( array_keys( $thai_numbers ), array_values( $thai_numbers ), $val );

					// format Mayan numbers to English numbers.
					$mayan_numbers = [
						'๐' => '0',
						'๑' => '1',
						'๒' => '2',
						'๓' => '3',
						'๔' => '4',
						'๕' => '5',
						'๖' => '6',
						'๗' => '7',
						'๘' => '8',
						'๙' => '9',
					];

					$val = str_replace( array_keys( $mayan_numbers ), array_values( $mayan_numbers ), $val );

					// format Babylonian numbers to English numbers.
					$babylonian_numbers = [
						'٠' => '0',
						'١' => '1',
						'٢' => '2',
						'٣' => '3',
						'٤' => '4',
						'٥' => '5',
						'٦' => '6',
						'٧' => '7',
						'٨' => '8',
						'٩' => '9',
					];

					$val = str_replace( array_keys( $babylonian_numbers ), array_values( $babylonian_numbers ), $val );

					// format Greek numbers to English numbers.
					$greek_numbers = [
						'⁰' => '0',
						'¹' => '1',
						'²' => '2',
						'³' => '3',
						'⁴' => '4',
						'⁵' => '5',
						'⁶' => '6',
						'⁷' => '7',
						'⁸' => '8',
						'⁹' => '9',
					];

					$val = str_replace( array_keys( $greek_numbers ), array_values( $greek_numbers ), $val );

					$val = str_replace( $thousand_separator_symbol, '', $val );
					$val = str_replace( $decimal_separator_symbol, '.', $val );
				}
			}
		}
		return $val;
	}

	/**
	 * Converts a string from UTF-8 to ISO-8859-1, replacing invalid or unrepresentable characters
	 *
	 * @param mixed $str A UTF-8 encoded string.
	 * @return string
	 * @since 6.4
	 */
	public function utf8_decode( $str = '' ) {
		if ( is_array( $str ) || is_object( $str ) ) {
			return '';
		}
		if ( ! is_string( $str ) ) {
			$str = strval( $str );
		}
		if ( function_exists( 'mb_convert_encoding' ) && function_exists( 'mb_detect_encoding' ) ) {
			$source_encoding = mb_detect_encoding( $str, 'UTF-8, ISO-8859-1, ISO-8859-15, Windows-1252' );
			if ( $source_encoding ) {
				// Convert to ISO-8859-1 (Latin-1).
				return mb_convert_encoding( $str, 'ISO-8859-1', $source_encoding );
			}
		}

		return $str;
	}

	/**
	 * Converts a string from ISO-8859-1 to UTF-8
	 *
	 * @param string $str An ISO-8859-1 string.
	 * @return string
	 * @since 6.4
	 */
	public function utf8_encode( $str = '' ) {
		if ( function_exists( 'mb_convert_encoding' ) && function_exists( 'mb_list_encodings' ) ) {
			return mb_convert_encoding( $str, 'UTF-8', mb_list_encodings() );
		}

		return $str;
	}

	/**
	 * Constant FILTER_SANITIZE_STRING polyfill for PHP > 8.1
	 *
	 * @param string $str The string to filter.
	 *
	 * @return false|string
	 */
	public function filter_sanitize_string( $str = '' ) {
		return _wp_specialchars( wp_strip_all_tags( $str ), ENT_QUOTES, 'UTF-8', true );
	}

	/**
	 * Get the cleared key value
	 * Required for connected radio button elements.
	 *
	 * @param string|array<mixed> $key The key to clear.
	 *
	 * @return ($key is string ? string : array<mixed>)
	 */
	public function clear_key( $key = '' ) {
		if ( ! is_array( $key ) ) {
			$pattern = '/^(.+?_\d+)-\d+$/';

			if ( preg_match( $pattern, $key, $matches ) ) {
				$key = $matches[1];
			}
		}

		return $key;
	}
}
includes/classes/class-themecomplete-epo-actions-base.php000064400000034234150755142450017623 0ustar00<?php
/**
 * Extra Product Options Actions class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Actions class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_Actions_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Actions_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @since 1.0
	 * @return THEMECOMPLETE_EPO_Actions_Base
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'woocommerce_checkout_update_order_review', [ $this, 'woocommerce_checkout_update_order_review' ], 10 );
		add_action( 'woocommerce_load_shipping_methods', [ $this, 'woocommerce_load_shipping_methods' ], 10, 1 );
		add_filter( 'woocommerce_package_rates', [ $this, 'woocommerce_package_rates' ], 10, 1 );
	}

	/**
	 * Refresh shipping methods on AJAX update order review on checkout
	 *
	 * @return void
	 * @since 6.4
	 */
	public function woocommerce_checkout_update_order_review() {
		$packages = WC()->cart->get_shipping_packages();

		// Remove rates stored in the WC session data.
		foreach ( $packages as $package_key => $package ) {
			WC()->session->set( 'shipping_for_package_' . $package_key, false );
		}
	}

	/**
	 * Get rate and key
	 *
	 * @param string $rate Rate string.
	 * @return string|array<mixed>
	 * @since 6.4
	 */
	public function get_rate_and_key( $rate = '' ) {
		$match = preg_match( '/(?P<rate>[\p{L}_]+)(:|-)(?P<key>\d+)/u', $rate, $matches );
		if ( $match ) {
			return [
				'rate' => $matches['rate'],
				'key'  => $matches['key'],
			];
		}
		return $rate;
	}

	/**
	 * Alter shipping methods
	 *
	 * @param array<mixed> $package Package information.
	 * @return void
	 * @since 6.4
	 */
	public function woocommerce_load_shipping_methods( $package = [] ) {
		if ( ! empty( $package ) ) {
			$enable_ids  = [];
			$disable_ids = [];
			foreach ( $package['contents'] as $ckey => $citem ) {
				if ( isset( $citem['tmcartepo'] ) && is_array( $citem['tmcartepo'] ) ) {
					foreach ( $citem['tmcartepo'] as $epo ) {
						$shippingmethodsenable            = isset( $epo['shippingmethodsenable'] ) ? $epo['shippingmethodsenable'] : '';
						$shippingmethodsenablelogicrules  = isset( $epo['shippingmethodsenablelogicrules'] ) ? $epo['shippingmethodsenablelogicrules'] : '';
						$shippingmethodsdisable           = isset( $epo['shippingmethodsdisable'] ) ? $epo['shippingmethodsdisable'] : '';
						$shippingmethodsdisablelogicrules = isset( $epo['shippingmethodsdisablelogicrules'] ) ? $epo['shippingmethodsdisablelogicrules'] : '';
						$posted_value                     = $epo['value'];
						if ( $shippingmethodsenable && is_array( $shippingmethodsenable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsenablelogicrules && is_array( $shippingmethodsenablelogicrules ) && isset( $shippingmethodsenablelogicrules['rules'] ) && is_array( $shippingmethodsenablelogicrules['rules'] ) && ! empty( $shippingmethodsenablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsenablelogicrules['toggle'];
								$condition_groups = $shippingmethodsenablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$enable_ids = array_merge( $enable_ids, $shippingmethodsenable );
								$enable_ids = array_unique( $enable_ids );
							}
						}
						if ( $shippingmethodsdisable && is_array( $shippingmethodsdisable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsdisablelogicrules && is_array( $shippingmethodsdisablelogicrules ) && isset( $shippingmethodsdisablelogicrules['rules'] ) && is_array( $shippingmethodsdisablelogicrules['rules'] ) && ! empty( $shippingmethodsdisablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsdisablelogicrules['toggle'];
								$condition_groups = $shippingmethodsdisablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$disable_ids = array_merge( $disable_ids, $shippingmethodsdisable );
								$disable_ids = array_unique( $disable_ids );
							}
						}
					}
				}
				if ( isset( $citem['tmcartfee'] ) && is_array( $citem['tmcartfee'] ) ) {
					foreach ( $citem['tmcartfee'] as $epo ) {
						$shippingmethodsenable            = isset( $epo['shippingmethodsenable'] ) ? $epo['shippingmethodsenable'] : '';
						$shippingmethodsenablelogicrules  = isset( $epo['shippingmethodsenablelogicrules'] ) ? $epo['shippingmethodsenablelogicrules'] : '';
						$shippingmethodsdisable           = isset( $epo['shippingmethodsdisable'] ) ? $epo['shippingmethodsdisable'] : '';
						$shippingmethodsdisablelogicrules = isset( $epo['shippingmethodsdisablelogicrules'] ) ? $epo['shippingmethodsdisablelogicrules'] : '';
						$posted_value                     = $epo['value'];
						if ( $shippingmethodsenable && is_array( $shippingmethodsenable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsenablelogicrules && is_array( $shippingmethodsenablelogicrules ) && isset( $shippingmethodsenablelogicrules['rules'] ) && is_array( $shippingmethodsenablelogicrules['rules'] ) && ! empty( $shippingmethodsenablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsenablelogicrules['toggle'];
								$condition_groups = $shippingmethodsenablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$enable_ids = array_merge( $enable_ids, $shippingmethodsenable );
								$enable_ids = array_unique( $enable_ids );
							}
						}
						if ( $shippingmethodsdisable && is_array( $shippingmethodsdisable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsdisablelogicrules && is_array( $shippingmethodsdisablelogicrules ) && isset( $shippingmethodsdisablelogicrules['rules'] ) && is_array( $shippingmethodsdisablelogicrules['rules'] ) && ! empty( $shippingmethodsdisablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsdisablelogicrules['toggle'];
								$condition_groups = $shippingmethodsdisablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$disable_ids = array_merge( $disable_ids, $shippingmethodsdisable );
								$disable_ids = array_unique( $disable_ids );
							}
						}
					}
				}
				if ( isset( $citem['tmsubscriptionfee'] ) && is_array( $citem['tmsubscriptionfee'] ) ) {
					foreach ( $citem['tmsubscriptionfee'] as $epo ) {
						$shippingmethodsenable            = isset( $epo['shippingmethodsenable'] ) ? $epo['shippingmethodsenable'] : '';
						$shippingmethodsenablelogicrules  = isset( $epo['shippingmethodsenablelogicrules'] ) ? $epo['shippingmethodsenablelogicrules'] : '';
						$shippingmethodsdisable           = isset( $epo['shippingmethodsdisable'] ) ? $epo['shippingmethodsdisable'] : '';
						$shippingmethodsdisablelogicrules = isset( $epo['shippingmethodsdisablelogicrules'] ) ? $epo['shippingmethodsdisablelogicrules'] : '';
						$posted_value                     = $epo['value'];
						if ( $shippingmethodsenable && is_array( $shippingmethodsenable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsenablelogicrules && is_array( $shippingmethodsenablelogicrules ) && isset( $shippingmethodsenablelogicrules['rules'] ) && is_array( $shippingmethodsenablelogicrules['rules'] ) && ! empty( $shippingmethodsenablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsenablelogicrules['toggle'];
								$condition_groups = $shippingmethodsenablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$enable_ids = array_merge( $enable_ids, $shippingmethodsenable );
								$enable_ids = array_unique( $enable_ids );
							}
						}
						if ( $shippingmethodsdisable && is_array( $shippingmethodsdisable ) ) {
							$toggle_action = 'show';
							$group_visible = true;
							if ( $shippingmethodsdisablelogicrules && is_array( $shippingmethodsdisablelogicrules ) && isset( $shippingmethodsdisablelogicrules['rules'] ) && is_array( $shippingmethodsdisablelogicrules['rules'] ) && ! empty( $shippingmethodsdisablelogicrules['rules'] ) ) {
								$group_visible    = false;
								$toggle_action    = $shippingmethodsdisablelogicrules['toggle'];
								$condition_groups = $shippingmethodsdisablelogicrules['rules'];
								foreach ( $condition_groups as $conditions ) {
									$conditions_met = false;
									foreach ( $conditions as $condition ) {
										$operator       = $condition['operator'];
										$value          = $condition['value'];
										$conditions_met = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->tm_check_match( $posted_value, $value, $operator );
									}
									if ( $conditions_met ) {
										$group_visible = true;
										break;
									}
								}
							}

							if ( ( 'show' === $toggle_action && $group_visible ) || ( 'hide' === $toggle_action && ! $group_visible ) ) {
								$disable_ids = array_merge( $disable_ids, $shippingmethodsdisable );
								$disable_ids = array_unique( $disable_ids );
							}
						}
					}
				}
			}

			$shipping             = WC_Shipping::instance();
			$shipping_zone        = WC_Shipping_Zones::get_zone_matching_package( $package );
			$free_shipping        = false;
			$free_shipping_key    = false;
			$all_shipping_methods = $shipping_zone->get_shipping_methods( false );
			foreach ( $all_shipping_methods as $shipping_key => $shipping_method ) {
				$id      = $shipping_method->id;
				$method  = $shipping_method;
				$enable  = false;
				$disable = false;

				foreach ( $disable_ids as $disable_id ) {
					$rk = $this->get_rate_and_key( $disable_id );
					if ( is_array( $rk ) ) {
						if ( (string) $rk['key'] === (string) $shipping_key && (string) $rk['rate'] === (string) $id ) {
							$disable = true;
							break;
						}
					} elseif ( (string) $id === (string) $rk ) {
						$disable = true;
						break;
					}
				}

				if ( $disable ) {
					if ( isset( $shipping->shipping_methods[ $shipping_key ] ) ) {
						$method->enabled                             = 'no';
						$shipping->shipping_methods[ $shipping_key ] = $method;
					}
				} else {
					foreach ( $enable_ids as $enable_id ) {
						$rk = $this->get_rate_and_key( $enable_id );
						if ( is_array( $rk ) ) {
							if ( (string) $rk['key'] === (string) $shipping_key && (string) $rk['rate'] === (string) $id ) {
								$enable = true;
								break;
							}
						} elseif ( (string) $id === (string) $rk ) {
							$enable = true;
							break;
						}
					}

					if ( $enable ) {
						$method->requires                            = '';
						$method->enabled                             = 'yes';
						$shipping->shipping_methods[ $shipping_key ] = $method;
					}
				}
			}

			foreach ( $shipping->shipping_methods as $shipping_key => $method ) {
				if ( 'no' === $method->enabled ) {
					unset( $shipping->shipping_methods[ $shipping_key ] );
				}
			}
		}
	}

	/**
	 * Get rate and key
	 *
	 * @param array<mixed> $rates Package rates.
	 * @return array<mixed>
	 * @since 6.4
	 */
	public function woocommerce_package_rates( $rates ) {
		return $rates;
	}
}
includes/classes/class-themecomplete-epo-scripts.php000064400000123003150755142450016733 0ustar00<?php
/**
 * Extra Product Options Frontend Scripts
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Frontend Scripts
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_Scripts {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_Scripts|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Contains files to be defered
	 *
	 * @var array<mixed>
	 */
	public $defered_files = [];

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_Scripts
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		// Load js,css files.
		add_action( 'wp_enqueue_scripts', [ $this, 'frontend_scripts' ], 5 );
		add_action( 'wp_head', [ $this, 'frontend_templates' ], 9999 );
		add_action( 'woocommerce_tm_custom_price_fields_enqueue_scripts', [ $this, 'custom_frontend_scripts' ] );
		add_action( 'woocommerce_tm_epo_enqueue_scripts', [ $this, 'custom_frontend_scripts' ] );

		// Custom optional dequeue_scripts.
		add_action( 'wp_enqueue_scripts', [ $this, 'dequeue_scripts' ], 9999 );

		// Custom CSS/JS support.
		add_action( 'wp_enqueue_scripts', [ $this, 'print_extra_css_js' ], 99999 );
	}

	/**
	 * Custom CSS/JS support
	 *
	 * @return void
	 * @since 1.0
	 */
	public function print_extra_css_js() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			if ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_code' ) ) ) {
				wp_register_style( 'themecomplete-extra-css', false, [], THEMECOMPLETE_EPO_VERSION );
				wp_add_inline_style( 'themecomplete-extra-css', THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_code' ) );
				wp_enqueue_style( 'themecomplete-extra-css' );
			}
			if ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_js_code' ) ) ) {
				wp_register_script( 'themecomplete-extra-js', false, [], THEMECOMPLETE_EPO_VERSION, false );
				wp_add_inline_script( 'themecomplete-extra-js', THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_js_code' ) );
				wp_enqueue_script( 'themecomplete-extra-js' );
			}
		}
	}

	/**
	 * Load js,css files
	 *
	 * @return void
	 * @since 1.0
	 */
	public function frontend_scripts() {
		global $product;

		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {

			do_action( 'wc_epo_enqueue_scripts_before' );

			$this->custom_frontend_scripts();

			do_action( 'wc_epo_enqueue_scripts_after' );

		}
	}

	/**
	 * Load template files
	 *
	 * @return void
	 * @since 1.0
	 */
	public function frontend_templates() {
		if ( ! THEMECOMPLETE_EPO()->can_load_scripts() ) {
			return;
		}

		$product = wc_get_product();

		add_filter( 'woocommerce_price_trim_zeros', [ $this, 'woocommerce_price_trim_zeros' ], 999999999 );

		// remove filters.
		global $wp_filter;
		$saved_filter = false;
		if ( isset( $wp_filter['raw_woocommerce_price'] ) ) {
			$saved_filter = $wp_filter['raw_woocommerce_price'];
			unset( $wp_filter['raw_woocommerce_price'] );
		}
		$saved_filter_formatted_woocommerce_price = false;
		if ( isset( $wp_filter['formatted_woocommerce_price'] ) ) {
			$saved_filter_formatted_woocommerce_price = $wp_filter['formatted_woocommerce_price'];
			unset( $wp_filter['formatted_woocommerce_price'] );
		}
		$saved_filter_woocommerce_price_trim_zeros = false;
		if ( isset( $wp_filter['woocommerce_price_trim_zeros'] ) ) {
			$saved_filter_woocommerce_price_trim_zeros = $wp_filter['woocommerce_price_trim_zeros'];
			unset( $wp_filter['woocommerce_price_trim_zeros'] );
		}
		$saved_filter_wc_price_args = false;
		if ( isset( $wp_filter['wc_price_args'] ) ) {
			$saved_filter_wc_price_args = $wp_filter['wc_price_args'];
			unset( $wp_filter['wc_price_args'] );
		}

		$price1 = wc_price(
			1234567890,
			[
				'currency'           => get_woocommerce_currency(),
				'decimal_separator'  => '.',
				'thousand_separator' => ',',
				'decimals'           => 0,
			]
		);

		$price2 = wc_price(
			987654321,
			[
				'currency'           => get_woocommerce_currency(),
				'decimal_separator'  => '.',
				'thousand_separator' => ',',
				'decimals'           => 0,
			]
		);

		$formatted_price      = $price1;
		$formatted_sale_price = ( function_exists( 'wc_get_price_to_display' )
			? wc_format_sale_price( $price1, $price2 )
			: '<del>' . $price1 . '</del> <ins>' . $price2 . '</ins>'
		);

		// restore filters.
		if ( $saved_filter ) {
			$wp_filter['raw_woocommerce_price'] = $saved_filter; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
		}
		if ( $saved_filter_formatted_woocommerce_price ) {
			$wp_filter['formatted_woocommerce_price'] = $saved_filter_formatted_woocommerce_price; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
		}
		if ( $saved_filter_woocommerce_price_trim_zeros ) {
			$wp_filter['woocommerce_price_trim_zeros'] = $saved_filter_woocommerce_price_trim_zeros; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
		}
		if ( $saved_filter_wc_price_args ) {
			$wp_filter['wc_price_args'] = $saved_filter_wc_price_args; // phpcs:ignore WordPress.WP.GlobalVariablesOverride
		}

		remove_filter( 'woocommerce_price_trim_zeros', [ $this, 'woocommerce_price_trim_zeros' ], 999999999 );

		$formatted_sale_price = str_replace( '1,234,567,890', '{{{ data.price }}}', $formatted_sale_price );
		$formatted_sale_price = str_replace( '987,654,321', '{{{ data.sale_price }}}', $formatted_sale_price );

		$formatted_price = str_replace( '1,234,567,890', '{{{ data.price }}}', $formatted_price );

		$suffix = '';
		if ( $product ) {
			$taxable          = $product->is_taxable();
			$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );
			$suffix           = '';
			if ( $taxable && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_tax_string_suffix' ) ) {
				if ( 'excl' === $tax_display_mode ) {

					$suffix = ' <small>' . apply_filters( 'wc_epo_ex_tax_or_vat_string', WC()->countries->ex_tax_or_vat() ) . '</small>';

				} else {

					$suffix = ' <small>' . apply_filters( 'wc_epo_inc_tax_or_vat_string', WC()->countries->inc_tax_or_vat() ) . '</small>';

				}
			}
			if ( $taxable && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_wc_price_suffix' ) ) {
				$suffix .= ' <small>' . get_option( 'woocommerce_price_display_suffix' ) . '</small>';
			}
			$formatted_price      .= $suffix;
			$formatted_sale_price .= $suffix;
		}
		wc_get_template(
			'tc-js-templates.php',
			[
				'formatted_price'      => $formatted_price,
				'formatted_sale_price' => $formatted_sale_price,
			],
			THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
			THEMECOMPLETE_EPO_DISPLAY()->get_default_path()
		);
	}

	/**
	 * Custom optional dequeue_scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function dequeue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			do_action( 'wc_epo_dequeue_scripts' );
		}
	}

	/**
	 * Returns an array of the css scripts used
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function css_array() {
		$ext = '.min';
		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}
		if ( 'multiple' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) || 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$css_array = [
				// The version of the fontawesome is customized.
				'themecomplete-fontawesome' => [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/fontawesome' . $ext . '.css',
					'deps'    => false,
					'version' => '5.12',
					'media'   => 'screen',
				],
				'themecomplete-animate'     => [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/animate' . $ext . '.css',
					'deps'    => false,
					'version' => THEMECOMPLETE_EPO_VERSION,
					'media'   => 'all',
				],
				'themecomplete-epo'         => [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/tm-epo' . $ext . '.css',
					'deps'    => false,
					'version' => THEMECOMPLETE_EPO_VERSION,
					'media'   => 'all',
				],
			];

			$product      = wc_get_product();
			$product_type = themecomplete_get_product_type( $product );
			$is_composite = 'composite' === $product_type;

			if ( $is_composite || ! is_product() || in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) || in_array( 'color', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$css_array['spectrum'] = [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/spectrum' . $ext . '.css',
					'deps'    => false,
					'version' => '2.0',
					'media'   => 'screen',
				];
			}

			if ( $is_composite || ! is_product() || in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) || in_array( 'range', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$css_array['nouislider'] = [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/nouislider' . $ext . '.css',
					'deps'    => false,
					'version' => '13.1.1',
					'media'   => 'screen',
				];
			}

			if ( $is_composite || ! is_product() || in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) || in_array( 'sectionslider', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$css_array['owl-carousel2']       = [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/owl.carousel' . $ext . '.css',
					'deps'    => false,
					'version' => '2.2',
					'media'   => 'all',
				];
				$css_array['owl-carousel2-theme'] = [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/owl.theme.default' . $ext . '.css',
					'deps'    => false,
					'version' => '2.2',
					'media'   => 'all',
				];
			}
		} else {
			$css_array = [
				'themecomplete-epo' => [
					'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/epo.min.css',
					'deps'    => false,
					'version' => THEMECOMPLETE_EPO_VERSION,
					'media'   => 'all',
				],
			];
		}

		$css_array['themecomplete-epo-smallscreen'] = [
			'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/tm-epo-smallscreen' . $ext . '.css',
			'deps'    => false,
			'version' => THEMECOMPLETE_EPO_VERSION,
			'media'   => 'only screen and (max-width: ' . apply_filters( 'woocommerce_style_smallscreen_breakpoint', '768px' ) . ')',
		];

		if ( is_rtl() ) {
			$css_array['themecomplete-epo-rtl'] = [
				'src'     => THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/css/tm-epo-rtl' . $ext . '.css',
				'deps'    => false,
				'version' => THEMECOMPLETE_EPO_VERSION,
				'media'   => 'all',
			];
		}

		return $css_array;
	}

	/**
	 * Trims zero from the WooCommerce price
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function woocommerce_price_trim_zeros() {
		return true;
	}

	/**
	 * Format array for the datepicker
	 *
	 * WordPress stores the locale information in an array with a alphanumeric index, and
	 * the datepicker wants a numerical index. This function replaces the index with a number.
	 *
	 * @param array<mixed> $array_to_strip The array to strip indices from.
	 * @return array<mixed>
	 */
	private function strip_array_indices( $array_to_strip = [] ) {
		$new_array = [];
		foreach ( $array_to_strip as $array_item ) {
			$new_array[] = $array_item;
		}

		return $new_array;
	}

	/**
	 * Load js,css files
	 *
	 * @return void
	 * @since 1.0
	 */
	public function custom_frontend_scripts() {
		$this->defered_files = [];
		$ext                 = '.min';
		if ( 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {
			$ext = '';
		}
		do_action( 'tm_epo_register_addons_scripts' );
		if ( apply_filters( 'wc_epo_register_addons_scripts', false ) ) {
			return;
		}
		$product = wc_get_product();

		$enqueue_styles = apply_filters( 'tm_epo_enqueue_styles', $this->css_array() );
		if ( $enqueue_styles && is_array( $enqueue_styles ) ) {
			foreach ( $enqueue_styles as $handle => $args ) {
				wp_enqueue_style( $handle, $args['src'], $args['deps'], $args['version'], $args['media'] );
			}
		}
		global $post, $product;

		$dependencies   = [];
		$dependencies[] = 'jquery-ui-slider';
		$dependencies[] = 'wp-util';
		$dependencies[] = 'jquery';

		$product_type = themecomplete_get_product_type( $product );
		$is_composite = 'composite' === $product_type;

		if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'sectionslider', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
			wp_register_script( 'wc-jquery-ui-touchpunch', WC()->plugin_url() . '/assets/js/jquery-ui-touch-punch/jquery-ui-touch-punch' . $ext . '.js', [ 'jquery-ui-slider' ], '0.2.3', true );
			$dependencies[] = 'wc-jquery-ui-touchpunch';
		}

		if ( 'multiple' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) || 'dev' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_js_css_mode' ) ) {

			$dependencies[] = 'themecomplete-api';
			wp_register_script( 'themecomplete-api', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-api' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

			$dependencies[] = 'jquery-tcfloatbox';
			wp_register_script( 'jquery-tcfloatbox', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tcfloatbox' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

			$dependencies[] = 'jquery-tctooltip';
			wp_register_script( 'jquery-tctooltip', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctooltip' . $ext . '.js', [], THEMECOMPLETE_EPO_VERSION, true );

			if ( $is_composite || ! is_product() || ( in_array( 'validation', THEMECOMPLETE_EPO()->current_option_features, true ) ) ) {
				// This is a customized version of the jQuery Validation Plugin.
				$dependencies[] = 'themecomplete-jquery-validate';
				wp_register_script( 'themecomplete-jquery-validate', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.validate' . $ext . '.js', [], '1.19.0', true );
			}

			if ( $is_composite || ! is_product() || in_array( 'lazyload', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$dependencies[]        = 'lazyloadxt-extra';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.lazyloadxt.extra' . $ext . '.js';
				wp_register_script( 'lazyloadxt-extra', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.lazyloadxt.extra' . $ext . '.js', [ 'jquery' ], '1.1', true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'range', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$dependencies[]        = 'nouislider';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/nouislider' . $ext . '.js';
				wp_register_script( 'nouislider', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/nouislider' . $ext . '.js', [ 'jquery' ], '13.1.1', true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || ( in_array( 'date', THEMECOMPLETE_EPO()->current_option_features, true ) || in_array( 'time', THEMECOMPLETE_EPO()->current_option_features, true ) ) ) {
				// This is a customized version of the jQuery Datepicker Plugin.
				$dependencies[] = 'jquery-ui-core';
				$dependencies[] = 'themecomplete-datepicker';
				$dependencies[] = 'jquery-resizestop';

				wp_register_script( 'jquery-resizestop', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.resizestop' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );

				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-datepicker' . $ext . '.js';
				wp_register_script( 'themecomplete-datepicker', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-datepicker' . $ext . '.js', [ 'jquery', 'jquery-ui-core', 'jquery-resizestop' ], THEMECOMPLETE_EPO_VERSION, true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'time', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				// This is a customized version of the jQuery Timepicker Plugin.
				$dependencies[]        = 'jquery-ui-core';
				$dependencies[]        = 'themecomplete-datepicker';
				$dependencies[]        = 'themecomplete-timepicker';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-timepicker' . $ext . '.js';
				wp_register_script( 'themecomplete-timepicker', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-timepicker' . $ext . '.js', [ 'jquery', 'jquery-ui-core', 'themecomplete-datepicker' ], THEMECOMPLETE_EPO_VERSION, true );
			}
			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'sectionslider', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$dependencies[]        = 'owl-carousel2';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/owl.carousel' . $ext . '.js';
				wp_register_script( 'owl-carousel2', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/owl.carousel' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'sectiontabs', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$dependencies[]        = 'themecomplete-tabs';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctabs' . $ext . '.js';
				wp_register_script( 'themecomplete-tabs', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.tctabs' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || in_array( 'color', THEMECOMPLETE_EPO()->current_option_features, true ) ) {
				$dependencies[]        = 'spectrum';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/spectrum' . $ext . '.js';
				wp_register_script( 'spectrum', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/spectrum' . $ext . '.js', [ 'jquery' ], '2.0', true );
			}

			if ( $is_composite || ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) || ( in_array( 'date', THEMECOMPLETE_EPO()->current_option_features, true ) || in_array( 'time', THEMECOMPLETE_EPO()->current_option_features, true ) ) ) {
				$dependencies[]        = 'jquery-mask';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.mask' . $ext . '.js';
				wp_register_script( 'jquery-mask', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/jquery.mask' . $ext . '.js', [ 'jquery' ], '1.14.15', true );
			}

			// Not supported for composite products.
			// The is_cart check is need because the delete cart button is not working on some themes when this is enabled.
			if ( ! THEMECOMPLETE_EPO()->wc_vars['is_checkout'] && ! THEMECOMPLETE_EPO()->wc_vars['is_cart'] && ( ! is_product() || ( in_array( 'product', THEMECOMPLETE_EPO()->current_option_features, true ) ) ) ) {
				$dependencies[]        = 'themecomplete-epo-product';
				$dependencies[]        = 'wc-add-to-cart-variation';
				$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-epo-product' . $ext . '.js';
				wp_register_script( 'themecomplete-epo-product', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-epo-product' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			}

			$dependencies[]        = 'themecomplete-tm-math';
			$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-math' . $ext . '.js';
			wp_register_script( 'themecomplete-tm-math', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-math' . $ext . '.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );

			$dependencies          = array_unique( $dependencies );
			$dependencies          = apply_filters( 'wc_epo_script_dependencies', $dependencies );
			$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-epo' . $ext . '.js';
			wp_register_script( 'themecomplete-epo', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/tm-epo' . $ext . '.js', $dependencies, THEMECOMPLETE_EPO_VERSION, true );
			wp_enqueue_script( 'themecomplete-epo' );

		} else {
			$dependencies[] = 'jquery-ui-core';
			$dependencies[] = 'wc-add-to-cart-variation';

			$this->defered_files[] = THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/epo.min.js';
			wp_register_script( 'themecomplete-epo', THEMECOMPLETE_EPO_PLUGIN_URL . '/assets/js/epo.min.js', $dependencies, THEMECOMPLETE_EPO_VERSION, true );
			wp_enqueue_script( 'themecomplete-epo' );
		}

		// constants.
		$constants = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_math' );

		$extra_fee = 0;
		global $wp_locale;
		$args = [
			'product_id'                                  => sprintf( '%d', themecomplete_get_id( $product ) ),
			'ajax_url'                                    => admin_url( 'admin-ajax' ) . '.php', // WPML 3.3.3 fix.
			'extraFee'                                    => apply_filters( 'woocommerce_tm_final_price_extra_fee', $extra_fee, $product ),
			'i18n_extra_fee'                              => esc_html__( 'Extra fee', 'woocommerce-tm-extra-product-options' ),
			'i18n_unit_price'                             => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_unit_price_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_unit_price_text' ) ) : esc_html__( 'Unit price', 'woocommerce-tm-extra-product-options' ),
			'i18n_options_total'                          => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_total_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_total_text' ) ) : esc_html__( 'Options amount', 'woocommerce-tm-extra-product-options' ),
			'i18n_vat_options_total'                      => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_vat_options_total_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_vat_options_total_text' ) ) : esc_html__( 'Options VAT amount', 'woocommerce-tm-extra-product-options' ),
			'i18n_fees_total'                             => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_fees_total_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_fees_total_text' ) ) : esc_html__( 'Fees amount', 'woocommerce-tm-extra-product-options' ),
			'i18n_final_total'                            => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_text' ) ) : esc_html__( 'Final total', 'woocommerce-tm-extra-product-options' ),
			'i18n_prev_text'                              => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_slider_prev_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_slider_prev_text' ) ) : esc_html__( 'Prev', 'woocommerce-tm-extra-product-options' ),
			'i18n_next_text'                              => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_slider_next_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_slider_next_text' ) ) : esc_html__( 'Next', 'woocommerce-tm-extra-product-options' ),
			'i18n_cancel'                                 => esc_html__( 'Cancel', 'woocommerce-tm-extra-product-options' ),
			'i18n_close'                                  => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_close_button_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_close_button_text' ) ) : esc_html__( 'Close', 'woocommerce-tm-extra-product-options' ),
			'i18n_addition_options'                       => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_additional_options_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_additional_options_text' ) ) : esc_html__( 'Additional options', 'woocommerce-tm-extra-product-options' ),
			'i18n_characters_remaining'                   => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_characters_remaining_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_characters_remaining_text' ) ) : esc_html__( 'characters remaining', 'woocommerce-tm-extra-product-options' ),

			'i18n_option_label'                           => esc_html__( 'Label', 'woocommerce-tm-extra-product-options' ),
			'i18n_option_value'                           => esc_html__( 'Value', 'woocommerce-tm-extra-product-options' ),
			'i18n_option_qty'                             => esc_html__( 'Qty', 'woocommerce-tm-extra-product-options' ),
			'i18n_option_price'                           => esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ),

			'i18n_uploading_files'                        => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_files_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_files_text' ) ) : esc_html__( 'Uploading files', 'woocommerce-tm-extra-product-options' ),
			'i18n_uploading_message'                      => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_message_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_message_text' ) ) : esc_html__( 'Your files are being uploaded', 'woocommerce-tm-extra-product-options' ),

			'i18n_file'                                   => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_message_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_num_file' ) ) : esc_html__( 'file', 'woocommerce-tm-extra-product-options' ),
			'i18n_files'                                  => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_message_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_uploading_num_files' ) ) : esc_html__( 'files', 'woocommerce-tm-extra-product-options' ),

			'currency_format_num_decimals'                => apply_filters( 'wc_epo_price_decimals', esc_attr( (string) wc_get_price_decimals() ) ),
			'currency_format_symbol'                      => esc_attr( get_woocommerce_currency_symbol() ),
			'currency_format_decimal_sep'                 => esc_attr( wp_unslash( get_option( 'woocommerce_price_decimal_sep' ) ) ),
			'currency_format_thousand_sep'                => esc_attr( wp_unslash( get_option( 'woocommerce_price_thousand_sep' ) ) ),
			'currency_format'                             => esc_attr( str_replace( [ '%1$s', '%2$s' ], [ '%s', '%v' ], get_woocommerce_price_format() ) ),
			'css_styles'                                  => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles' ),
			'css_styles_style'                            => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_styles_style' ),
			'tm_epo_options_placement'                    => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ),
			'tm_epo_totals_box_placement'                 => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ),
			'tm_epo_no_lazy_load'                         => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' ),
			'tm_epo_preload_lightbox_image'               => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_preload_lightbox_image' ),
			'tm_epo_show_only_active_quantities'          => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_only_active_quantities' ),
			'tm_epo_hide_add_cart_button'                 => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_add_cart_button' ),
			'tm_epo_hide_all_add_cart_button'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_all_add_cart_button' ),
			'tm_epo_hide_required_add_cart_button'        => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_required_add_cart_button' ),
			'tm_epo_auto_hide_price_if_zero'              => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_auto_hide_price_if_zero' ),
			'tm_epo_no_hide_price_if_original_not_zero'   => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_hide_price_if_original_not_zero' ),
			'tm_epo_show_price_inside_option'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_price_inside_option' ),
			'tm_epo_show_price_inside_option_hidden_even' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_price_inside_option_hidden_even' ),
			'tm_epo_multiply_price_inside_option'         => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiply_price_inside_option' ),
			'tm_epo_global_enable_validation'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_enable_validation' ),
			'tm_epo_global_input_decimal_separator'       => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_input_decimal_separator' ),
			'tm_epo_global_displayed_decimal_separator'   => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_displayed_decimal_separator' ),
			'tm_epo_remove_free_price_label'              => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_free_price_label' ),
			'tm_epo_global_product_image_selector'        => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_image_selector' ),
			'tm_epo_global_image_recalculate'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_image_recalculate' ),
			'tm_epo_upload_inline_image_preview'          => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_inline_image_preview' ),
			'tm_epo_global_product_element_scroll_offset' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_scroll_offset' ),
			'tm_epo_global_product_element_scroll'        => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_scroll' ),
			'tm_epo_global_product_image_mode'            => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_image_mode' ),
			'tm_epo_global_move_out_of_stock'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_move_out_of_stock' ),
			'tm_epo_progressive_display'                  => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_progressive_display' ),
			'tm_epo_animation_delay'                      => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_animation_delay' ),
			'tm_epo_start_animation_delay'                => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_start_animation_delay' ),
			'tm_epo_global_error_label_placement'         => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_error_label_placement' ),
			'tm_epo_global_tooltip_max_width'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_tooltip_max_width' ),
			'tm_epo_global_product_element_quantity_sync' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_product_element_quantity_sync' ),

			'tm_epo_global_validator_messages'            => [
				'required'                 => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_this_field_is_required_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_this_field_is_required_text' ) ) : esc_html__( 'This field is required.', 'woocommerce-tm-extra-product-options' ),
				'email'                    => esc_html__( 'Please enter a valid email address.', 'woocommerce-tm-extra-product-options' ),
				'url'                      => esc_html__( 'Please enter a valid URL.', 'woocommerce-tm-extra-product-options' ),
				'number'                   => esc_html__( 'Please enter a valid number.', 'woocommerce-tm-extra-product-options' ),
				'digits'                   => esc_html__( 'Please enter only digits.', 'woocommerce-tm-extra-product-options' ),
				'max'                      => esc_html__( 'Please enter a value less than or equal to {0}.', 'woocommerce-tm-extra-product-options' ),
				'min'                      => esc_html__( 'Please enter a value greater than or equal to {0}.', 'woocommerce-tm-extra-product-options' ),
				'maxlengthsingle'          => esc_html__( 'Please enter no more than {0} character.', 'woocommerce-tm-extra-product-options' ),
				'maxlength'                => esc_html__( 'Please enter no more than {0} characters.', 'woocommerce-tm-extra-product-options' ),
				'minlengthsingle'          => esc_html__( 'Please enter at least {0} character.', 'woocommerce-tm-extra-product-options' ),
				'minlength'                => esc_html__( 'Please enter at least {0} characters.', 'woocommerce-tm-extra-product-options' ),
				'epolimitsingle'           => esc_html__( 'Please select up to {0} choice.', 'woocommerce-tm-extra-product-options' ),
				'epolimit'                 => esc_html__( 'Please select up to {0} choices.', 'woocommerce-tm-extra-product-options' ),
				'epoexactsingle'           => esc_html__( 'Please select exactly {0} choice.', 'woocommerce-tm-extra-product-options' ),
				'epoexact'                 => esc_html__( 'Please select exactly {0} choices.', 'woocommerce-tm-extra-product-options' ),
				'epominsingle'             => esc_html__( 'Please select at least {0} choice.', 'woocommerce-tm-extra-product-options' ),
				'epomin'                   => esc_html__( 'Please select at least {0} choices.', 'woocommerce-tm-extra-product-options' ),
				'step'                     => esc_html__( 'Please enter a multiple of {0}.', 'woocommerce-tm-extra-product-options' ),
				'lettersonly'              => esc_html__( 'Please enter only letters.', 'woocommerce-tm-extra-product-options' ),
				'lettersspaceonly'         => esc_html__( 'Please enter only letters or spaces.', 'woocommerce-tm-extra-product-options' ),
				'alphanumeric'             => esc_html__( 'Please enter only letters, numbers or hyphens.', 'woocommerce-tm-extra-product-options' ),
				'alphanumericunicode'      => esc_html__( 'Please enter only unicode letters and numbers.', 'woocommerce-tm-extra-product-options' ),
				'alphanumericunicodespace' => esc_html__( 'Please enter only unicode letters, numbers or spaces.', 'woocommerce-tm-extra-product-options' ),
				'repeaterminrows'          => esc_html__( 'Minimum number of rows is {0}', 'woocommerce-tm-extra-product-options' ),
				'repeatermaxrows'          => esc_html__( 'Maximum number of rows is {0}', 'woocommerce-tm-extra-product-options' ),
			],

			'first_day'                                   => intval( get_option( 'start_of_week' ) ),
			'monthNames'                                  => $this->strip_array_indices( $wp_locale->month ),
			'monthNamesShort'                             => $this->strip_array_indices( $wp_locale->month_abbrev ),
			'dayNames'                                    => $this->strip_array_indices( $wp_locale->weekday ),
			'dayNamesShort'                               => $this->strip_array_indices( $wp_locale->weekday_abbrev ),
			'dayNamesMin'                                 => $this->strip_array_indices( $wp_locale->weekday_initial ),
			'isRTL'                                       => 'rtl' === $wp_locale->text_direction,
			'text_direction'                              => $wp_locale->text_direction,
			'is_rtl'                                      => is_rtl(),
			'closeText'                                   => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_closetext' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_closetext' ) ) : esc_html__( 'Done', 'woocommerce-tm-extra-product-options' ),
			'currentText'                                 => ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_currenttext' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_currenttext' ) ) : esc_html__( 'Today', 'woocommerce-tm-extra-product-options' ),

			'hourText'                                    => esc_html__( 'Hour', 'woocommerce-tm-extra-product-options' ),
			'minuteText'                                  => esc_html__( 'Minute', 'woocommerce-tm-extra-product-options' ),
			'secondText'                                  => esc_html__( 'Second', 'woocommerce-tm-extra-product-options' ),

			'floating_totals_box'                         => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_floating_totals_box' ),
			'floating_totals_box_visibility'              => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_floating_totals_box_visibility' ),
			'floating_totals_box_add_button'              => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_floating_totals_box_add_button' ),
			'floating_totals_box_pixels'                  => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_floating_totals_box_pixels' ),
			'floating_totals_box_html_before'             => apply_filters( 'floating_totals_box_html_before', '' ),
			'floating_totals_box_html_after'              => apply_filters( 'floating_totals_box_html_after', '' ),
			'tm_epo_show_unit_price'                      => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_unit_price' ),
			'tm_epo_fees_on_unit_price'                   => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_fees_on_unit_price' ),
			'tm_epo_total_price_as_unit_price'            => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_total_price_as_unit_price' ),
			'tm_epo_hide_totals_until_any'                => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_totals_until_any' ),
			'tm_epo_hide_totals_until_all_required'       => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_totals_until_all_required' ),
			'tm_epo_hide_totals_until_all'                => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_totals_until_all' ),
			'tm_epo_enable_final_total_box_all'           => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' ),
			'tm_epo_enable_original_final_total'          => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_original_final_total' ),
			'tm_epo_enable_vat_options_total'             => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_vat_options_total' ),
			'tm_epo_change_original_price'                => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_change_original_price' ),
			'tm_epo_change_variation_price'               => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_change_variation_price' ),
			'tm_epo_enable_in_shop'                       => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ),
			'tm_epo_disable_error_scroll'                 => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_disable_error_scroll' ),
			'tm_epo_global_options_price_sign'            => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_options_price_sign' ),
			'tm_epo_trim_zeros'                           => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_trim_zeros' ),
			'tm_epo_math'                                 => $constants,

			'minus_sign'                                  => apply_filters( 'wc_epo_get_price_for_cart_minus_sign', "<span class='tc-minus-sign'>-</span>" ),
			'plus_sign'                                   => apply_filters( 'wc_epo_get_price_for_cart_plus_sign', "<span class='tc-minus-sign'>+</span>" ),

			'option_plus_sign'                            => '' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_options_price_sign' ) ? apply_filters( 'wc_epo_price_in_dropdown_plus_sign', '+' ) : '',
			'option_minus_sign'                           => apply_filters( 'wc_epo_price_in_dropdown_minus_sign', '-' ),

			'tm_epo_upload_popup'                         => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_upload_popup' ),

			'current_free_text'                           => esc_html( THEMECOMPLETE_EPO()->current_free_text ),
			'assoc_current_free_text'                     => esc_html( THEMECOMPLETE_EPO()->assoc_current_free_text ),

			'cart_total'                                  => ( function_exists( 'WC' ) && ! empty( WC()->cart ) ) ? floatval( WC()->cart->get_cart_contents_total() ) : 0, // @phpstan-ignore-line

			'quickview_container'                         => esc_html( (string) wp_json_encode( apply_filters( 'wc_epo_js_quickview_container', [] ) ) ),
			'quickview_array'                             => esc_html( (string) wp_json_encode( apply_filters( 'wc_epo_get_quickview_containers', [] ) ) ),
			'tax_display_mode'                            => get_option( 'woocommerce_tax_display_shop' ),
			'prices_include_tax'                          => wc_prices_include_tax(),

			'variation_price_before_price_text'           => apply_filters( 'wc_epo_variation_price_before_price_text', '' ),
			'variation_price_after_price_text'            => apply_filters( 'wc_epo_variation_price_after_price_text', '' ),
			'product_price_before_price_text'             => apply_filters( 'wc_epo_product_price_before_price_text', '' ),
			'product_price_after_price_text'              => apply_filters( 'wc_epo_product_price_after_price_text', '' ),
			'totals_box_before_unit_price'                => apply_filters( 'wc_epo_totals_box_before_unit_price', '' ),
			'totals_box_after_unit_price'                 => apply_filters( 'wc_epo_totals_box_after_unit_price', '' ),
			'totals_box_before_vat_options_totals_price'  => apply_filters( 'wc_epo_totals_box_before_vat_options_totals_price', '' ),
			'totals_box_after_vat_options_totals_price'   => apply_filters( 'wc_epo_totals_box_after_vat_options_totals_price', '' ),
			'totals_box_before_options_totals_price'      => apply_filters( 'wc_epo_totals_box_before_options_totals_price', '' ),
			'totals_box_after_options_totals_price'       => apply_filters( 'wc_epo_totals_box_after_options_totals_price', '' ),
			'totals_box_before_fee_totals_price'          => apply_filters( 'wc_epo_totals_box_before_fee_totals_price', '' ),
			'totals_box_after_fee_totals_price'           => apply_filters( 'wc_epo_totals_box_after_fee_totals_price', '' ),
			'totals_box_before_extra_fee_price'           => apply_filters( 'wc_epo_totals_box_before_extra_fee_price', '' ),
			'totals_box_after_extra_fee_price'            => apply_filters( 'wc_epo_totals_box_after_extra_fee_price', '' ),
			'totals_box_before_final_totals_price'        => apply_filters( 'wc_epo_totals_box_before_final_totals_price', '' ),
			'totals_box_after_final_totals_price'         => apply_filters( 'wc_epo_totals_box_after_final_totals_price', '' ),

			'lookupTables'                                => in_array( 'lookuptable', THEMECOMPLETE_EPO()->current_option_features, true ) ? wp_json_encode( THEMECOMPLETE_EPO()->fetch_lookuptables() ) : '',
			'WP_DEBUG'                                    => defined( 'WP_DEBUG' ) && WP_DEBUG,
			'theme_name'                                  => THEMECOMPLETE_EPO()->get_theme( 'Name' ),
		];

		$args = apply_filters( 'wc_epo_script_args', $args, $this );

		wp_localize_script( 'themecomplete-epo', 'TMEPOJS', $args );
	}
}
includes/classes/class-themecomplete-epo-shortcodes.php000064400000010342150755142450017422 0ustar00<?php
/**
 * Extra Product Options Shortcodes
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Shortcodes
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
class THEMECOMPLETE_EPO_Shortcodes {

	/**
	 * Register local post type
	 * (This is used in Normal mode)
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function register_local_post_type() {
	}

	/**
	 * Shortcode tc_epo_show
	 * (Used for echoing a custom action)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @param mixed        $content Shortcode content.
	 * @return mixed
	 * @since 4.8
	 */
	public static function tc_epo_show( $atts, $content = null ) {
		$vars = shortcode_atts(
			[
				'action' => '',
			],
			$atts
		);
		ob_start();
		do_action( $vars['action'] );
		$content = ob_get_contents();
		ob_end_clean();

		return $content;
	}

	/**
	 * Shortcode tc_epo_action
	 * (Used for echoing a custom action)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @return string
	 * @since 4.8
	 */
	public static function tc_epo_action( $atts ) {
		$vars = shortcode_atts(
			[
				'action' => '',
			],
			$atts
		);

		$GLOBALS['THEMECOMPLETE_IS_FROM_SHORTCODE'] = true;
		do_action( $vars['action'] );
		unset( $GLOBALS['THEMECOMPLETE_IS_FROM_SHORTCODE'] );

		return '';
	}

	/**
	 * Shortcode tc_epo
	 * (Used for echoing options)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @param mixed        $content Shortcode content.
	 * @return mixed
	 * @since 4.8
	 */
	public static function tc_epo( $atts, $content = null ) {
		$vars = shortcode_atts(
			[
				'id'     => '',
				'prefix' => '',
			],
			$atts
		);

		ob_start();

		if ( $vars['id'] ) {
			THEMECOMPLETE_EPO_DISPLAY()->tm_epo_fields( $vars['id'], $vars['prefix'], true );
			THEMECOMPLETE_EPO_DISPLAY()->tm_add_inline_style();
		}

		$content = ob_get_contents();
		ob_end_clean();

		return $content;
	}

	/**
	 * Shortcode tc_current_epo
	 * (Used for echoing options)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @param mixed        $content Shortcode content.
	 * @return mixed
	 * @since 4.8
	 */
	public static function tc_current_epo( $atts, $content = null ) {
		$vars = shortcode_atts(
			[
				'prefix' => '',
			],
			$atts
		);

		ob_start();

		global $product;
		$id = themecomplete_get_id( $product );
		if ( $id ) {
			THEMECOMPLETE_EPO_DISPLAY()->tm_epo_fields( $id, $vars['prefix'], true );
			THEMECOMPLETE_EPO_DISPLAY()->tm_add_inline_style();
		}

		$content = ob_get_contents();
		ob_end_clean();

		return $content;
	}

	/**
	 * Shortcode tc_current_epo_totals
	 * (Used for echoing options totals)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @param mixed        $content Shortcode content.
	 * @return mixed
	 * @since 4.8
	 */
	public static function tc_current_epo_totals( $atts, $content = null ) {
		$vars = shortcode_atts(
			[
				'prefix' => '',
			],
			$atts
		);

		ob_start();
		global $product;
		$id = themecomplete_get_id( $product );

		if ( $id ) {
			THEMECOMPLETE_EPO_DISPLAY()->tm_epo_totals( $id, $vars['prefix'], true );
		}

		$content = ob_get_contents();
		ob_end_clean();

		return $content;
	}

	/**
	 * Shortcode tc_epo_totals
	 * (Used for echoing options totals)
	 *
	 * @param array<mixed> $atts Shortcode settings.
	 * @param mixed        $content Shortcode content.
	 * @return mixed
	 * @since 4.8
	 */
	public static function tc_epo_totals( $atts, $content = null ) {
		$vars = shortcode_atts(
			[
				'id'     => '',
				'prefix' => '',
			],
			$atts
		);

		ob_start();

		if ( $vars['id'] ) {
			THEMECOMPLETE_EPO_DISPLAY()->tm_epo_totals( $vars['id'], $vars['prefix'], true );
		}

		$content = ob_get_contents();
		ob_end_clean();

		return $content;
	}


	/**
	 * Add shortcodes
	 *
	 * @return void
	 * @since 4.8
	 */
	public static function add() {
		add_shortcode( 'tc_epo_show', __CLASS__ . '::tc_epo_show' );
		add_shortcode( 'tc_epo_action', __CLASS__ . '::tc_epo_action' );
		add_shortcode( 'tc_epo', __CLASS__ . '::tc_epo' );
		add_shortcode( 'tc_current_epo', __CLASS__ . '::tc_current_epo' );
		add_shortcode( 'tc_current_epo_totals', __CLASS__ . '::tc_current_epo_totals' );
		add_shortcode( 'tc_epo_totals', __CLASS__ . '::tc_epo_totals' );
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-time.php000064400000023014150755142450022704 0ustar00<?php
/**
 * Time Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Time Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_TIME extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Time', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfar tcfa-clock';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'time';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type6',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_button_type(
					'time',
					[
						'message0x0_class' => 'tm-epo-switch-wrapper',
						'type'             => 'radio',
						'tags'             => [
							'class' => 'time-button-type',
							'id'    => 'builder_time_button_type',
							'name'  => 'tm_meta[tmfbuilder][time_button_type][]',
						],
						'default'          => 'custom',
						'options'          => [
							[
								'text'  => esc_html__( 'System style', 'woocommerce-tm-extra-product-options' ),
								'value' => 'system',
							],
							[
								'text'  => esc_html__( 'Custom style', 'woocommerce-tm-extra-product-options' ),
								'value' => 'custom',
							],
						],
						'label'            => esc_html__( 'Time picker style', 'woocommerce-tm-extra-product-options' ),
					]
				),
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_time_format(
					'time',
					[
						'required' => [
							'.time-button-type' => [
								'operator' => 'is',
								'value'    => 'custom',
							],
						],
					]
				),
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_custom_time_format(
					'time',
					[
						'required' => [
							'.time-button-type' => [
								'operator' => 'is',
								'value'    => 'custom',
							],
						],
					]
				),
				[
					'id'          => 'time_min_time',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 't',
						'id'    => 'builder_time_min_time',
						'name'  => 'tm_meta[tmfbuilder][time_min_time][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Minimum selectable time', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Enter the time the following format: 8:00 am', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'          => 'time_max_time',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 't',
						'id'    => 'builder_time_max_time',
						'name'  => 'tm_meta[tmfbuilder][time_max_time][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Maximum selectable time', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Enter the time the following format: 8:00 am', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'          => 'time_theme',
					'wpmldisable' => 1,
					'default'     => 'epo',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_time_theme',
						'name' => 'tm_meta[tmfbuilder][time_theme][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Epo White', 'woocommerce-tm-extra-product-options' ),
							'value' => 'epo',
						],
						[
							'text'  => esc_html__( 'Epo Black', 'woocommerce-tm-extra-product-options' ),
							'value' => 'epo-black',
						],
					],
					'label'       => esc_html__( 'Theme', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the theme for the timepicker.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'          => 'time_theme_size',
					'wpmldisable' => 1,
					'default'     => 'medium',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_time_theme_size',
						'name' => 'tm_meta[tmfbuilder][time_theme_size][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Small', 'woocommerce-tm-extra-product-options' ),
							'value' => 'small',
						],
						[
							'text'  => esc_html__( 'Medium', 'woocommerce-tm-extra-product-options' ),
							'value' => 'medium',
						],
						[
							'text'  => esc_html__( 'Large', 'woocommerce-tm-extra-product-options' ),
							'value' => 'large',
						],
					],
					'label'       => esc_html__( 'Size', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the size of the timepicker.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'          => 'time_theme_position',
					'wpmldisable' => 1,
					'default'     => 'normal',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_time_theme_position',
						'name' => 'tm_meta[tmfbuilder][time_theme_position][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Normal', 'woocommerce-tm-extra-product-options' ),
							'value' => 'normal',
						],
						[
							'text'  => esc_html__( 'Top of screen', 'woocommerce-tm-extra-product-options' ),
							'value' => 'top',
						],
						[
							'text'  => esc_html__( 'Bottom of screen', 'woocommerce-tm-extra-product-options' ),
							'value' => 'bottom',
						],
					],
					'label'       => esc_html__( 'Position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the position of the timepicker.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'               => 'time_tranlation_custom',
					'type'             => 'custom',
					'label'            => esc_html__( 'Translations', 'woocommerce-tm-extra-product-options' ),
					'desc'             => '',
					'nowrap_end'       => 1,
					'noclear'          => 1,
					'message0x0_class' => 'justify-content-flex-end',
					'required'         => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'                   => 'time_tranlation_hour',
					'default'              => '',
					'type'                 => 'text',
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_time_tranlation_hour',
						'name'  => 'tm_meta[tmfbuilder][time_tranlation_hour][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Hour', 'woocommerce-tm-extra-product-options' ) . '</span> ',
					'nowrap_start'         => 1,
					'nowrap_end'           => 1,
					'required'             => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'                   => 'time_tranlation_minute',
					'default'              => '',
					'type'                 => 'text',
					'nowrap_start'         => 1,
					'nowrap_end'           => 1,
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_time_tranlation_minute',
						'name'  => 'tm_meta[tmfbuilder][time_tranlation_minute][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Minute', 'woocommerce-tm-extra-product-options' ) . '</span> ',
					'required'             => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
				[
					'id'                   => 'time_tranlation_second',
					'default'              => '',
					'type'                 => 'text',
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_time_tranlation_second',
						'name'  => 'tm_meta[tmfbuilder][time_tranlation_second][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Second', 'woocommerce-tm-extra-product-options' ) . '</span> ',
					'nowrap_start'         => 1,
					'required'             => [
						'.time-button-type' => [
							'operator' => 'is',
							'value'    => 'custom',
						],
					],
				],
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-selectboxmultiple.php000064400000002702150755142450025513 0ustar00<?php
/**
 * Multi-Select Field Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Multi-Select Field Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_SELECTBOXMULTIPLE extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Multi-Select Field', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-caret-square-down';
		$this->is_post          = 'post';
		$this->type             = 'singlemultiple';
		$this->post_name_prefix = 'selectmultiple';
		$this->fee_type         = 'multiple';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'options',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-section.php000064400000036436150755142450023426 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Section
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_SECTION extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Section', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-layer-group';
		$this->is_post          = 'display';
		$this->type             = false;
		$this->post_name_prefix = false;
		$this->fee_type         = false;
		$this->tags             = false;
		$this->show_on_backend  = false;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = array_merge(
			$this->prepend_div( '', 'tm-tabs' ),
			$this->prepend_div( 'section', 'tm-tab-headers' ),
			$this->prepend_tab(
				'section0',
				[
					'tcfa tcfa-heading',
					esc_html__( 'Title options' ),
					'woocommerce-tm-extra-product-options',
				],
				'',
				'tma-tab-title'
			),
			$this->prepend_tab(
				'section1',
				[
					'tcfa tcfa-cog',
					esc_html__( 'General Options', 'woocommerce-tm-extra-product-options' ),
				],
				'open',
				'tma-tab-general'
			),
			$this->prepend_tab(
				'section2',
				[
					'tcfa tcfa-lightbulb',
					esc_html__( 'Conditional Logic', 'woocommerce-tm-extra-product-options' ),
				],
				'',
				'tma-tab-logic'
			),
			$this->append_div( 'section' ),
			$this->prepend_div( 'section0' ),
			$this->get_header_array( 'section_header', 'section' ),
			$this->get_divider_array( 'section_divider', 0 ),
			$this->append_div( 'section0' ),
			$this->prepend_div( 'section1' ),
			apply_filters(
				'tc_builder_section_settings',
				[
					'sectionnum'                     => [
						'id'          => 'sections',
						'wpmldisable' => 1,
						'default'     => 0,
						'nodiv'       => 1,
						'type'        => 'hidden',
						'tags'        => [
							'class' => 'tm_builder_sections',
							'name'  => 'tm_meta[tmfbuilder][sections][]',
							'value' => 0,
						],
						'label'       => '',
						'desc'        => '',
					],
					'sections_slides'                => [
						'id'          => 'sections_slides',
						'wpmldisable' => 1,
						'default'     => '',
						'nodiv'       => 1,
						'type'        => 'hidden',
						'tags'        => [
							'class' => 'tm_builder_section_slides',
							'name'  => 'tm_meta[tmfbuilder][sections_slides][]',
							'value' => 0,
						],
						'label'       => '',
						'desc'        => '',
					],
					'sections_tabs_labels'           => [
						'id'      => 'sections_tabs_labels',
						'default' => '',
						'nodiv'   => 1,
						'type'    => 'hidden',
						'tags'    => [
							'class' => 'tm_builder_sections_tabs_labels',
							'name'  => 'tm_meta[tmfbuilder][sections_tabs_labels][]',
							'value' => 0,
						],
						'label'   => '',
						'desc'    => '',
					],
					'sectionsize'                    => [
						'id'          => 'sections_size',
						'wpmldisable' => 1,
						'default'     => 'w100',
						'nodiv'       => 1,
						'type'        => 'hidden',
						'tags'        => [
							'class' => 'tm_builder_sections_size',
							'name'  => 'tm_meta[tmfbuilder][sections_size][]',
							'value' => 'w100',
						],
						'label'       => '',
						'desc'        => '',
					],
					'sectionuniqid'                  => [
						'id'      => 'sections_uniqid',
						'default' => '',
						'nodiv'   => 1,
						'type'    => 'hidden',
						'tags'    => [
							'class' => 'tm-builder-sections-uniqid',
							'name'  => 'tm_meta[tmfbuilder][sections_uniqid][]',
							'value' => '',
						],
						'label'   => '',
						'desc'    => '',
					],
					'sectionstyle'                   => [
						'id'          => 'sections_style',
						'wpmldisable' => 1,
						'default'     => '',
						'type'        => 'select',
						'tags'        => [
							'class' => 'sections_style',
							'id'    => 'tm_sections_style',
							'name'  => 'tm_meta[tmfbuilder][sections_style][]',
						],
						'options'     => [
							[
								'text'  => esc_html__( 'Normal (clear)', 'woocommerce-tm-extra-product-options' ),
								'value' => '',
							],
							[
								'text'  => esc_html__( 'Box', 'woocommerce-tm-extra-product-options' ),
								'value' => 'box',
							],
							[
								'text'  => esc_html__( 'Expand and Collapse (start opened)', 'woocommerce-tm-extra-product-options' ),
								'value' => 'collapse',
								'class' => 'builder_hide_for_variation-reset',
							],
							[
								'text'  => esc_html__( 'Expand and Collapse (start closed)', 'woocommerce-tm-extra-product-options' ),
								'value' => 'collapseclosed',
								'class' => 'builder_hide_for_variation-reset',
							],
							[
								'text'  => esc_html__( 'Accordion', 'woocommerce-tm-extra-product-options' ),
								'value' => 'accordion',
								'class' => 'builder_hide_for_variation-reset',
							],
						],
						'label'       => esc_html__( 'Section style', 'woocommerce-tm-extra-product-options' ),
						'desc'        => esc_html__( "Select this section's display style.", 'woocommerce-tm-extra-product-options' ),
					],
					'sectionbackgroundcolor'         => [
						'id'       => 'sections_background_color',
						'default'  => '',
						'type'     => 'text',
						'tags'     => [
							'data-show-input'            => 'true',
							'data-show-initial'          => 'true',
							'data-allow-empty'           => 'true',
							'data-show-alpha'            => 'false',
							'data-show-palette'          => 'false',
							'data-clickout-fires-change' => 'true',
							'data-show-buttons'          => 'false',
							'data-preferred-format'      => 'hex',
							'class'                      => 'tm-color-picker',
							'id'                         => 'sections_background_color',
							'name'                       => 'tm_meta[tmfbuilder][sections_background_color][]',
							'value'                      => '',
						],
						'label'    => esc_html__( 'Section background color', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.sections_style' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					],
					'sectionlabelbackgroundcolor'    => [
						'id'       => 'sections_label_background_color',
						'default'  => '',
						'type'     => 'text',
						'tags'     => [
							'data-show-input'            => 'true',
							'data-show-initial'          => 'true',
							'data-allow-empty'           => 'true',
							'data-show-alpha'            => 'false',
							'data-show-palette'          => 'false',
							'data-clickout-fires-change' => 'true',
							'data-show-buttons'          => 'false',
							'data-preferred-format'      => 'hex',
							'class'                      => 'tm-color-picker',
							'id'                         => 'sections_label_background_color',
							'name'                       => 'tm_meta[tmfbuilder][sections_label_background_color][]',
							'value'                      => '',
						],
						'label'    => esc_html__( 'Section label background color', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.sections_style' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					],
					'sectionsubtitlebackgroundcolor' => [
						'id'       => 'sections_subtitle_background_color',
						'default'  => '',
						'type'     => 'text',
						'tags'     => [
							'data-show-input'            => 'true',
							'data-show-initial'          => 'true',
							'data-allow-empty'           => 'true',
							'data-show-alpha'            => 'false',
							'data-show-palette'          => 'false',
							'data-clickout-fires-change' => 'true',
							'data-show-buttons'          => 'false',
							'data-preferred-format'      => 'hex',
							'class'                      => 'tm-color-picker',
							'id'                         => 'sections_subtitle_background_color',
							'name'                       => 'tm_meta[tmfbuilder][sections_subtitle_background_color][]',
							'value'                      => '',
						],
						'label'    => esc_html__( 'Section subtitle background color', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.sections_style' => [
								'operator' => 'isnot',
								'value'    => '',
							],
						],
					],
					'sectionplacement'               => [
						'id'               => 'sections_placement',
						'message0x0_class' => 'builder_hide_for_variation',
						'wpmldisable'      => 1,
						'default'          => 'before',
						'type'             => 'select',
						'tags'             => [
							'id'   => 'sections_placement',
							'name' => 'tm_meta[tmfbuilder][sections_placement][]',
						],
						'options'          => [
							[
								'text'  => esc_html__( 'Before Local Options', 'woocommerce-tm-extra-product-options' ),
								'value' => 'before',
							],
							[
								'text'  => esc_html__( 'After Local Options', 'woocommerce-tm-extra-product-options' ),
								'value' => 'after',
							],
						],
						'label'            => esc_html__( 'Section placement', 'woocommerce-tm-extra-product-options' ),
						'desc'             => esc_html__( 'Select where this section will appear compared to local Options.', 'woocommerce-tm-extra-product-options' ),
					],
					'sectiontype'                    => [
						'id'               => 'sections_type',
						'wpmldisable'      => 1,
						'default'          => '',
						'type'             => 'radio',
						'message0x0_class' => 'tm-epo-switch-wrapper',
						'tags'             => [
							'class' => 'sections_type',
							'id'    => 'sections_type',
							'name'  => 'tm_meta[tmfbuilder][sections_type][]',
						],
						'options'          => [
							[
								'text'  => esc_html__( 'Normal', 'woocommerce-tm-extra-product-options' ),
								'value' => '',
							],
							[
								'text'  => esc_html__( 'Pop up', 'woocommerce-tm-extra-product-options' ),
								'value' => 'popup',
							],
							[
								'text'        => esc_html__( 'Slider (wizard)', 'woocommerce-tm-extra-product-options' ),
								'value'       => 'slider',
								'class'       => 'builder-remove-for-variations',
								'label_class' => 'builder-remove-for-variations',
							],
							[
								'text'        => esc_html__( 'Tabs', 'woocommerce-tm-extra-product-options' ),
								'value'       => 'tabs',
								'class'       => 'builder-remove-for-variations',
								'label_class' => 'builder-remove-for-variations',
							],
						],
						'label'            => esc_html__( 'Section type', 'woocommerce-tm-extra-product-options' ),
						'desc'             => esc_html__( "Select this section's display type.", 'woocommerce-tm-extra-product-options' ),
					],
					'sectionpopupbutton'             => [
						'id'          => 'sections_popupbutton',
						'wpmldisable' => 1,
						'default'     => '',
						'type'        => 'select',
						'tags'        => [
							'class' => 'sections_popupbutton',
							'id'    => 'sections_popupbutton',
							'name'  => 'tm_meta[tmfbuilder][sections_popupbutton][]',
						],
						'options'     => [
							[
								'text'  => esc_html__( 'Text link', 'woocommerce-tm-extra-product-options' ),
								'value' => '',
							],
							[
								'text'  => esc_html__( 'Button', 'woocommerce-tm-extra-product-options' ),
								'value' => 'button',
							],
							[
								'text'  => esc_html__( 'Button Alt', 'woocommerce-tm-extra-product-options' ),
								'value' => 'buttonalt',
							],
						],
						'label'       => esc_html__( 'Section pop up button style', 'woocommerce-tm-extra-product-options' ),
						'desc'        => esc_html__( "Select this section's pop up button style.", 'woocommerce-tm-extra-product-options' ),
						'required'    => [
							'.sections_type' => [
								'operator' => 'is',
								'value'    => 'popup',
							],
						],
					],
					'sectionpopupbuttontext'         => [
						'id'       => 'sections_popupbuttontext',
						'default'  => '',
						'type'     => 'text',
						'tags'     => [
							'class' => 't',
							'id'    => 'sections_popupbuttontext',
							'name'  => 'tm_meta[tmfbuilder][sections_popupbuttontext][]',
							'value' => '',
						],
						'label'    => esc_html__( 'Section pop up button text', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Enter a text to replace the default pop up button text. This will override the global value.', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.sections_type' => [
								'operator' => 'is',
								'value'    => 'popup',
							],
						],
					],

					'sectionsclass'                  => [
						'id'      => 'sections_class',
						'default' => '',
						'type'    => 'text',
						'tags'    => [
							'class' => 't',
							'id'    => 'sections_class',
							'name'  => 'tm_meta[tmfbuilder][sections_class][]',
							'value' => '',
						],
						'label'   => esc_html__( 'Section class name', 'woocommerce-tm-extra-product-options' ),
						'desc'    => esc_html__( 'Enter an extra class name to add to this section', 'woocommerce-tm-extra-product-options' ),
					],
				]
			),
			$this->append_div( 'section1' ),
			$this->prepend_div( 'section2' ),
			[
				'sectionclogic'     => [
					'id'      => 'sections_clogic',
					'clogic'  => true,
					'default' => '',
					'nodiv'   => 1,
					'type'    => 'hidden',
					'tags'    => [
						'class' => 'tm-builder-clogic',
						'name'  => 'tm_meta[tmfbuilder][sections_clogic][]',
						'value' => '',
					],
					'label'   => '',
					'desc'    => '',
				],
				'sectionlogicrules' => [
					'id'         => 'sections_logicrules',
					'logicrules' => true,
					'default'    => '',
					'nodiv'      => 1,
					'type'       => 'hidden',
					'tags'       => [
						'class' => 'tm-builder-logicrules',
						'name'  => 'tm_meta[tmfbuilder][sections_logicrules][]',
						'value' => '',
					],
					'label'      => '',
					'desc'       => '',
				],
				'sectionlogic'      => [
					'id'        => 'sections_logic',
					'default'   => '',
					'leftclass' => 'align-self-start',
					'type'      => 'checkbox',
					'tags'      => [
						'class' => 'activate-sections-logic',
						'id'    => 'sections_logic',
						'name'  => 'tm_meta[tmfbuilder][sections_logic][]',
						'value' => '1',
					],
					'extra'     => [ [ $this, 'builder_showlogic' ], [] ],
					'label'     => esc_html__( 'Section Conditional Logic', 'woocommerce-tm-extra-product-options' ),
					'desc'      => esc_html__( 'Enable conditional logic for showing or hiding this section.', 'woocommerce-tm-extra-product-options' ),
				],
			],
			$this->append_div( 'section2' ),
			$this->append_div( '' )
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-textarea.php000064400000003072150755142450023565 0ustar00<?php
/**
 * Textarea Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Textarea Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_TEXTAREA extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Text Area', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-file tcfa-rotate-90';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'textarea';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type',
				'lookuptable',
				'freechars',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'placeholder',
				'min_chars',
				'max_chars',
				'default_value_multiple',
				'validation1',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-product.php000064400000053361150755142450023436 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Product Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_PRODUCT extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Product', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-cube';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'product';
		$this->fee_type         = '';
		$this->tags             = 'price content product';
		$this->show_on_backend  = true;
	}

	/**
	 * Fetch product categories
	 * for use in a select box
	 *
	 * @since 5.0
	 * @return array<mixed>
	 */
	public function fetch_product_categories_array() {
		$list               = [];
		$product_categories = (array) get_terms(
			[
				'taxonomy' => 'product_cat',
				'get'      => 'all',
			]
		);

		foreach ( $product_categories as $product_category ) {
			if ( $product_category instanceof WP_Term ) {
				$list[] = [
					'text'  => $product_category->name,
					'value' => $product_category->term_id,
				];
			}
		}

		return $list;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'hide_amount',
				[
					'id'               => 'product_mode',
					'wpmldisable'      => 1,
					'default'          => 'products',
					'message0x0_class' => 'tm-epo-switch-wrapper',
					'type'             => 'radio',
					'tags'             => [
						'class' => 'product-mode',
						'id'    => 'builder_product_mode',
						'name'  => 'tm_meta[tmfbuilder][product_mode][]',
					],
					'options'          => [
						[
							'text'  => esc_html__( 'Products', 'woocommerce-tm-extra-product-options' ),
							'value' => 'products',
						],
						[
							'text'  => esc_html__( 'Single Product', 'woocommerce-tm-extra-product-options' ),
							'value' => 'product',
						],
						[
							'text'  => esc_html__( 'Categories', 'woocommerce-tm-extra-product-options' ),
							'value' => 'categories',
						],
					],
					'label'            => esc_html__( 'Select mode', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Whether to include specific products or categories.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'product_categoryids',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'multiple'    => 'multiple',
					'fill'        => 'category',
					'tags'        => [
						'data-placeholder' => esc_attr__( 'Search for a category ...', 'woocommerce-tm-extra-product-options' ),
						'data-action'      => 'woocommerce_json_search_categories',
						'class'            => 'wc-category-search product-categories-selector',
						'id'               => 'builder_product_categoryids',
						'name'             => 'tm_meta[tmfbuilder][product_categoryids][]',
					],
					'options'     => $this->fetch_product_categories_array(),
					'label'       => esc_html__( 'Select categories', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Add categories to include all their associated products.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.product-mode' => [
							'operator' => 'is',
							'value'    => 'categories',
						],
					],
				],
				[
					'id'          => 'product_productids',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'multiple'    => 'multiple',
					'fill'        => 'product',
					'tags'        => [
						'data-placeholder' => esc_attr__( 'Search for a product ...', 'woocommerce-tm-extra-product-options' ),
						'data-action'      => 'woocommerce_json_search_products_and_variations',
						'data-sortable'    => 'true',
						'class'            => 'wc-product-search product-products-selector',
						'id'               => 'builder_product_productids',
						'name'             => 'tm_meta[tmfbuilder][product_productids][]',
					],
					'options'     => [],
					'label'       => esc_html__( 'Select products', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Add the products individually.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.product-mode' => [
							'operator' => 'is',
							'value'    => [ 'products', 'product' ],
						],
					],
				],
				[
					'id'          => 'product_orderby',
					'wpmldisable' => 1,
					'default'     => 'ID',
					'type'        => 'select',
					'tags'        => [
						'data-placeholder' => esc_attr__( 'Choose a value', 'woocommerce-tm-extra-product-options' ),
						'class'            => 'fullwidth',
						'id'               => 'builder_product_orderby',
						'name'             => 'tm_meta[tmfbuilder][product_orderby][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ),
							'value' => 'none',
						],
						[
							'text'  => esc_html__( 'Base price', 'woocommerce-tm-extra-product-options' ),
							'value' => 'baseprice',
						],
						[
							'text'  => esc_html__( 'ID', 'woocommerce-tm-extra-product-options' ),
							'value' => 'ID',
						],
						[
							'text'  => esc_html__( 'Title', 'woocommerce-tm-extra-product-options' ),
							'value' => 'title',
						],
						[
							'text'  => esc_html__( 'Date', 'woocommerce-tm-extra-product-options' ),
							'value' => 'date',
						],
						[
							'text'  => esc_html__( 'Name', 'woocommerce-tm-extra-product-options' ),
							'value' => 'name',
						],
						[
							'text'  => esc_html__( 'Menu Order', 'woocommerce-tm-extra-product-options' ),
							'value' => 'menu_order',
						],
						[
							'text'  => esc_html__( 'Random', 'woocommerce-tm-extra-product-options' ),
							'value' => 'rand',
						],
					],
					'label'       => esc_html__( 'Order by', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the parameter which the products will be sorted by.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.product-mode' => [
							'operator' => 'isnot',
							'value'    => 'product',
						],
					],
				],
				[
					'id'               => 'product_order',
					'wpmldisable'      => 1,
					'default'          => 'asc',
					'message0x0_class' => 'tm-epo-switch-wrapper',
					'type'             => 'radio',
					'tags'             => [
						'class' => 'product-order',
						'id'    => 'builder_product_order',
						'name'  => 'tm_meta[tmfbuilder][product_order][]',
					],
					'options'          => [
						[
							'text'  => esc_html__( 'Ascending', 'woocommerce-tm-extra-product-options' ),
							'value' => 'asc',
						],
						[
							'text'  => esc_html__( 'Descending', 'woocommerce-tm-extra-product-options' ),
							'value' => 'desc',
						],
					],
					'label'            => esc_html__( 'Order', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Select the sorting order of the products.', 'woocommerce-tm-extra-product-options' ),
					'required'         => [
						'.product-mode'    => [
							'operator' => 'isnot',
							'value'    => 'product',
						],
						'.product-orderby' => [
							'operator' => 'isnot',
							'value'    => 'none',
						],
					],
				],
				[
					'id'          => 'product_default_value',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'data-placeholder' => esc_attr__( 'Select a product', 'woocommerce-tm-extra-product-options' ),
						'class'            => 'wc-product-search product-default-value-search',
						'id'               => 'builder_product_default_value',
						'name'             => 'tm_meta[tmfbuilder][product_default_value][]',
					],
					'options'     => [],
					'label'       => esc_html__( 'Default product', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the product that will be pre-selected.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'               => 'product_layout_mode',
					'wpmldisable'      => 1,
					'default'          => 'dropdown',
					'message0x0_class' => 'tm-epo-switch-wrapper',
					'type'             => 'radio',
					'tags'             => [
						'class' => 'product-layout-mode',
						'id'    => 'builder_product_layout_mode',
						'name'  => 'tm_meta[tmfbuilder][product_layout_mode][]',
					],
					'options'          => [
						[
							'text'  => esc_html__( 'Dropdown', 'woocommerce-tm-extra-product-options' ),
							'value' => 'dropdown',
						],
						[
							'text'  => esc_html__( 'Radio buttons', 'woocommerce-tm-extra-product-options' ),
							'value' => 'radio',
						],
						[
							'text'  => esc_html__( 'Thumbnails', 'woocommerce-tm-extra-product-options' ),
							'value' => 'thumbnail',
						],
						[
							'text'  => esc_html__( 'Checkboxes', 'woocommerce-tm-extra-product-options' ),
							'value' => 'checkbox',
						],
						[
							'text'  => esc_html__( 'Thumbnails multiple', 'woocommerce-tm-extra-product-options' ),
							'value' => 'thumbnailmultiple',
						],
					],
					'label'            => esc_html__( 'Layout mode', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Select how the products will be presented.', 'woocommerce-tm-extra-product-options' ),
					'required'         => [
						'.product-mode' => [
							'operator' => 'isnot',
							'value'    => 'product',
						],
					],
				],
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_items_per_row(
					'product',
					[],
					[
						'.product-layout-mode' => [
							'operator' => 'is',
							'value'    => [ 'thumbnail', 'thumbnailmultiple' ],
						],
						'.product-mode'        => [
							'operator' => 'is',
							'value'    => [ 'products', 'categories' ],
						],
					]
				),
				[
					'placeholder',
					[
						'label'    => esc_html__( 'Dropdown Placeholder', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Enter the placeholder for the dropdown.', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.product-mode'        => [
								'operator' => 'is',
								'value'    => [ 'products', 'categories' ],
							],
							'.product-layout-mode' => [
								'operator' => 'is',
								'value'    => 'dropdown',
							],
						],
					],
				],
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_min(
					'product_quantity',
					[
						'extra_tags' => [ 'min' => 0 ],
						'default'    => '1',
						'label'      => esc_html__( 'Minimum quantity', 'woocommerce-tm-extra-product-options' ),
					],
					false
				),
				THEMECOMPLETE_EPO_ADMIN_BUILDER()->add_setting_max(
					'product_quantity',
					[
						'extra_tags' => [ 'min' => 0 ],
						'default'    => '',
						'label'      => esc_html__( 'Maximum quantity', 'woocommerce-tm-extra-product-options' ),
					],
					false
				),
				[
					'id'          => 'product_shipped_individually',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_product_shipped_individually',
						'name'  => 'tm_meta[tmfbuilder][product_shipped_individually][]',
					],
					'label'       => esc_html__( 'Shipped individually', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'If this is enabled the included product is not shipped with the main product.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'product_maintain_weight',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_product_maintain_weight',
						'name'  => 'tm_meta[tmfbuilder][product_maintain_weight][]',
					],
					'label'       => esc_html__( 'Maintain weight', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'If this is enabled the included product will add its weight to the main product.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'#builder_product_shipped_individually' => [
							'operator' => 'isnot',
							'value'    => '1',
						],
					],
				],
				[
					'id'          => 'product_priced_individually',
					'wpmldisable' => 1,
					'default'     => '1',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_product_priced_individually',
						'name'  => 'tm_meta[tmfbuilder][product_priced_individually][]',
					],
					'label'       => esc_html__( 'Priced individually', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'If this is enabled the included product will maintain its own price.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'               => 'product_discount_type',
					'wpmldisable'      => 1,
					'default'          => '',
					'message0x0_class' => 'tm-epo-switch-wrapper',
					'type'             => 'radio',
					'tags'             => [
						'id'    => 'builder_product_discount_type',
						'name'  => 'tm_meta[tmfbuilder][product_discount_type][]',
						'class' => 'product_discount_type',
					],
					'options'          => [
						[
							'text'  => esc_html__( 'None', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => esc_html__( 'Percentage', 'woocommerce-tm-extra-product-options' ),
							'value' => 'percent',
						],
						[
							'text'  => esc_html__( 'Fixed amount', 'woocommerce-tm-extra-product-options' ),
							'value' => 'fixed',
						],
					],
					'label'            => esc_html__( 'Discount type', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Select the discount type. The discount applies to the final product price. If the product has extra options then the discount applies to the amount after the options have been added to the product price.', 'woocommerce-tm-extra-product-options' ),
					'required'         => [
						'#builder_product_priced_individually' => [
							'operator' => 'is',
							'value'    => '1',
						],
					],
				],
				[
					'id'          => 'product_discount',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 't',
						'id'    => 'builder_product_discount',
						'name'  => 'tm_meta[tmfbuilder][product_discount][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Discount', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Enter the discount amount.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'#builder_product_priced_individually' => [
							'operator' => 'is',
							'value'    => '1',
						],
						'.product_discount_type' => [
							'operator' => 'isnot',
							'value'    => '',
						],
					],
				],
				[
					'id'          => 'product_disable_epo',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_product_disable_epo',
						'name'  => 'tm_meta[tmfbuilder][product_disable_epo][]',
					],
					'label'       => esc_html__( 'Disable Addons', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'If this is enabled the included addons the associated product has will not be displayed.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'product_discount_exclude_addons',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_product_discount_exclude_addons',
						'name'  => 'tm_meta[tmfbuilder][product_discount_exclude_addons][]',
					],
					'label'       => esc_html__( 'Exlude Addon prices from the discount', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'If this is enabled the discount will not be applied to the product addons.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'#builder_product_priced_individually' => [
							'operator' => 'is',
							'value'    => '1',
						],
						'#builder_product_disable_epo' => [
							'operator' => 'isnot',
							'value'    => '1',
						],
						'.product_discount_type'       => [
							'operator' => 'isnot',
							'value'    => '',
						],
					],
				],
				[
					'id'          => 'product_hiddenin',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'multiple'    => 'multiple',
					'tags'        => [
						'class' => 'product-hiddenin-selector',
						'id'    => 'builder_product_hiddenin',
						'name'  => 'tm_meta[tmfbuilder][product_hiddenin][]',
					],
					'options'     => [
						[
							'text'  => esc_attr__( 'Cart', 'woocommerce-tm-extra-product-options' ),
							'value' => 'cart',
						],
						[
							'text'  => esc_attr__( 'Checkout', 'woocommerce-tm-extra-product-options' ),
							'value' => 'checkout',
						],
						[
							'text'  => esc_attr__( 'Order and Emails', 'woocommerce-tm-extra-product-options' ),
							'value' => 'order',
						],
					],
					'label'       => esc_html__( 'Hide product in', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select where to hide the product', 'woocommerce-tm-extra-product-options' ),
				],
			],
			false,
			[
				'label_options'        => 1,
				'general_options'      => 1,
				'advanced_options'     => 1,
				'conditional_logic'    => 1,
				'css_settings'         => 0,
				'woocommerce_settings' => 0,
				'repeater_settings'    => 0,
				'action_settings'      => 0,
			],
			[
				'advanced_options' => [
					'tab_data'    => [
						[
							'id'          => 'product_show_image',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_image',
								'name'  => 'tm_meta[tmfbuilder][product_show_image][]',
							],
							'label'       => esc_html__( 'Show image', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to show the image of the associated product.', 'woocommerce-tm-extra-product-options' ),
						],
						[
							'id'          => 'product_show_title',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_title',
								'name'  => 'tm_meta[tmfbuilder][product_show_title][]',
								'class' => 'show-title',
							],
							'label'       => esc_html__( 'Show title', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to show the title of the associated product.', 'woocommerce-tm-extra-product-options' ),
						],
						[
							'id'          => 'product_show_title_link',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_title_link',
								'name'  => 'tm_meta[tmfbuilder][product_show_title_link][]',
							],
							'label'       => esc_html__( 'Show title link', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to have the title link to the associated product.', 'woocommerce-tm-extra-product-options' ),
							'required'    => [
								'.show-title' => [
									'operator' => 'is',
									'value'    => '1',
								],
							],
						],
						[
							'id'          => 'product_show_price',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_price',
								'name'  => 'tm_meta[tmfbuilder][product_show_price][]',
							],
							'label'       => esc_html__( 'Show price', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to show the price of the associated product.', 'woocommerce-tm-extra-product-options' ),
						],
						[
							'id'          => 'product_show_description',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_description',
								'name'  => 'tm_meta[tmfbuilder][product_show_description][]',
							],
							'label'       => esc_html__( 'Show description', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to show the description of the associated product.', 'woocommerce-tm-extra-product-options' ),
						],
						[
							'id'          => 'product_show_meta',
							'wpmldisable' => 1,
							'default'     => '1',
							'type'        => 'checkbox',
							'tags'        => [
								'value' => '1',
								'id'    => 'builder_product_show_meta',
								'name'  => 'tm_meta[tmfbuilder][product_show_meta][]',
							],
							'label'       => esc_html__( 'Show meta', 'woocommerce-tm-extra-product-options' ),
							'desc'        => esc_html__( 'Enable to show the meta of the associated product.', 'woocommerce-tm-extra-product-options' ),
						],
					],
					'header_data' => [
						'name' => esc_html__( 'Advanced options', 'woocommerce-tm-extra-product-options' ),
						'icon' => 'tcfa tcfa-cog',
						'slug' => 'tma-tab-advanced',
					],
				],
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-selectbox.php000064400000003163150755142450023741 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Select box Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_SELECTBOX extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Select Box', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-caret-square-down';
		$this->is_post          = 'post';
		$this->type             = 'multiplesingle';
		$this->post_name_prefix = 'select';
		$this->fee_type         = 'multiple';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'use_url',
				'changes_product_image',
				[
					'placeholder',
					[ 'desc' => esc_html__( 'This will count as an empty value in case the element is required.', 'woocommerce-tm-extra-product-options' ) ],
				],
				'options',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-range.php000064400000003070150755142450023042 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Range picker Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_RANGE extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Range picker', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-arrows-alt-h';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'range';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type7',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'rangemin',
				'rangemax',
				'rangestep',
				'show_picker_value',
				'pips',
				'noofpips',
				'default_value',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-date.php000064400000034370150755142450022672 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Date picker Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_DATE extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Date', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-calendar-alt';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'date';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Get weekdays
	 *
	 * @since 6.0
	 * @access public
	 * @return void
	 */
	public function get_weekdays() {
		echo '<div class="tm-weekdays-picker-wrap">';
		// load wp translations.
		if ( function_exists( 'wp_load_translations_early' ) ) {
			wp_load_translations_early();
			global $wp_locale;
			for ( $day_index = 0; $day_index <= 6; $day_index++ ) {
				echo '<span class="tm-weekdays-picker"><label><input class="tm-weekday-picker" type="checkbox" value="' . esc_attr( (string) $day_index ) . '"><span>' . esc_html( $wp_locale->get_weekday( $day_index ) ) . '</span></label></span>';
			}
			// in case something goes wrong.
		} else {
			$weekday[0] = /* translators: weekday Sunday */
				esc_html__( 'Sunday', 'default' );
			$weekday[1] = /* translators: weekday Monday */
				esc_html__( 'Monday', 'default' );
			$weekday[2] = /* translators: weekday Tuesday */
				esc_html__( 'Tuesday', 'default' );
			$weekday[3] = /* translators: weekday Wednesday */
				esc_html__( 'Wednesday', 'default' );
			$weekday[4] = /* translators: weekday Thursday */
				esc_html__( 'Thursday', 'default' );
			$weekday[5] = /* translators: weekday Friday */
				esc_html__( 'Friday', 'default' );
			$weekday[6] = /* translators: weekday Saturday */
				esc_html__( 'Saturday', 'default' );
			for ( $day_index = 0; $day_index <= 6; $day_index++ ) {
				echo '<span class="tm-weekdays-picker"><label><input class="tm-weekday-picker" type="checkbox" value="' . esc_attr( (string) $day_index ) . '"><span>' . esc_html( $weekday[ $day_index ] ) . '</span></label></span>';
			}
		}
		echo '</div>';
	}

	/**
	 * Get weekdays
	 *
	 * @since 6.0
	 * @access public
	 * @return void
	 */
	public function get_months() {
		echo '<div class="tm-months-picker-wrap">';
		// load wp translations.
		if ( function_exists( 'wp_load_translations_early' ) ) {
			wp_load_translations_early();
			global $wp_locale;
			for ( $month_index = 1; $month_index <= 12; $month_index++ ) {
				echo '<span class="tm-months-picker"><label><input class="tm-month-picker" type="checkbox" value="' . esc_attr( (string) $month_index ) . '"><span>' . esc_html( $wp_locale->get_month( $month_index ) ) . '</span></label></span>';
			}
			// in case something goes wrong.
		} else {
			$month[0]  = /* translators: month January */
				esc_html__( 'January ', 'default' );
			$month[1]  = /* translators: month February */
				esc_html__( 'February', 'default' );
			$month[2]  = /* translators: month March */
				esc_html__( 'March', 'default' );
			$month[3]  = /* translators: month April */
				esc_html__( 'April', 'default' );
			$month[4]  = /* translators: month May */
				esc_html__( 'May', 'default' );
			$month[5]  = /* translators: month June */
				esc_html__( 'June', 'default' );
			$month[6]  = /* translators: month July */
				esc_html__( 'July', 'default' );
			$month[7]  = /* translators: month August */
				esc_html__( 'August', 'default' );
			$month[8]  = /* translators: month September */
				esc_html__( 'September', 'default' );
			$month[9]  = /* translators: month October */
				esc_html__( 'October', 'default' );
			$month[10] = /* translators: month November */
				esc_html__( 'November', 'default' );
			$month[11] = /* translators: month December */
				esc_html__( 'December', 'default' );
			for ( $month_index = 1; $month_index <= 12; $month_index++ ) {
				echo '<span class="tm-months-picker"><label><input class="tm-month-picker" type="checkbox" value="' . esc_attr( (string) $month_index ) . '"><span>' . esc_html( $month[ $month_index ] ) . '</span></label></span>';
			}
		}
		echo '</div>';
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type6',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'button_type2',
				'date_format',
				'start_year',
				'end_year',
				[
					'id'      => 'date_default_value',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't',
						'id'    => 'builder_date_default_value',
						'name'  => 'tm_meta[tmfbuilder][date_default_value][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Default value', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Enter a value to be applied to the field automatically according to your selected date format. (Two digits for day, two digits for month and four digits for year).', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_min_date',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 't',
						'id'    => 'builder_date_min_date',
						'name'  => 'tm_meta[tmfbuilder][date_min_date][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Minimum selectable date', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'A number of days from today.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_max_date',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 't',
						'id'    => 'builder_date_max_date',
						'name'  => 'tm_meta[tmfbuilder][date_max_date][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Maximum selectable date', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'A number of days from today.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'      => 'date_disabled_dates',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't',
						'id'    => 'builder_date_disabled_dates',
						'name'  => 'tm_meta[tmfbuilder][date_disabled_dates][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Disabled dates', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year)', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'      => 'date_enabled_only_dates',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't',
						'id'    => 'builder_date_enabled_only_dates',
						'name'  => 'tm_meta[tmfbuilder][date_enabled_only_dates][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Enabled dates', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Comma separated dates according to your selected date format. (Two digits for day, two digits for month and four digits for year). Please note that this will override any other setting!', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_theme',
					'wpmldisable' => 1,
					'default'     => 'epo',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_date_theme',
						'name' => 'tm_meta[tmfbuilder][date_theme][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Epo White', 'woocommerce-tm-extra-product-options' ),
							'value' => 'epo',
						],
						[
							'text'  => esc_html__( 'Epo Black', 'woocommerce-tm-extra-product-options' ),
							'value' => 'epo-black',
						],
					],
					'label'       => esc_html__( 'Theme', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the theme for the datepicker.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_theme_size',
					'wpmldisable' => 1,
					'default'     => 'medium',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_date_theme_size',
						'name' => 'tm_meta[tmfbuilder][date_theme_size][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Small', 'woocommerce-tm-extra-product-options' ),
							'value' => 'small',
						],
						[
							'text'  => esc_html__( 'Medium', 'woocommerce-tm-extra-product-options' ),
							'value' => 'medium',
						],
						[
							'text'  => esc_html__( 'Large', 'woocommerce-tm-extra-product-options' ),
							'value' => 'large',
						],
					],
					'label'       => esc_html__( 'Size', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the size of the datepicker.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_theme_position',
					'wpmldisable' => 1,
					'default'     => 'normal',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_date_theme_position',
						'name' => 'tm_meta[tmfbuilder][date_theme_position][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Normal', 'woocommerce-tm-extra-product-options' ),
							'value' => 'normal',
						],
						[
							'text'  => esc_html__( 'Top of screen', 'woocommerce-tm-extra-product-options' ),
							'value' => 'top',
						],
						[
							'text'  => esc_html__( 'Bottom of screen', 'woocommerce-tm-extra-product-options' ),
							'value' => 'bottom',
						],
					],
					'label'       => esc_html__( 'Position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Select the position of the datepicker.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_exlude_disabled',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'id'    => 'builder_date_exlude_disabled',
						'name'  => 'tm_meta[tmfbuilder][date_exlude_disabled][]',
					],
					'label'       => esc_html__( 'Exclude disabled', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Enabling this will make it so that the Minimum and Maximum selectable date will not count the selected disabled weekdays.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'date_disabled_weekdays',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'hidden',
					'tags'        => [
						'class' => 'tm-weekdays',
						'id'    => 'builder_date_disabled_weekdays',
						'name'  => 'tm_meta[tmfbuilder][date_disabled_weekdays][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Disable weekdays', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'This allows you to disable all selected weekdays.', 'woocommerce-tm-extra-product-options' ),
					'extra'       => [ [ $this, 'get_weekdays' ], [] ],
				],
				[
					'id'          => 'date_disabled_months',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'hidden',
					'tags'        => [
						'class' => 'tm-months',
						'id'    => 'builder_date_disabled_months',
						'name'  => 'tm_meta[tmfbuilder][date_disabled_months][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Disable months', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'This allows you to disable all selected months.', 'woocommerce-tm-extra-product-options' ),
					'extra'       => [ [ $this, 'get_months' ], [] ],
				],
				[
					'id'               => 'date_tranlation_custom',
					'type'             => 'custom',
					'label'            => esc_html__( 'Translations', 'woocommerce-tm-extra-product-options' ),
					'desc'             => '',
					'nowrap_end'       => 1,
					'noclear'          => 1,
					'message0x0_class' => 'justify-content-flex-end',
				],
				[
					'id'                   => 'date_tranlation_day',
					'default'              => '',
					'type'                 => 'text',
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_date_tranlation_day',
						'name'  => 'tm_meta[tmfbuilder][date_tranlation_day][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Day', 'woocommerce-tm-extra-product-options' ) . '</span> ',
					'nowrap_start'         => 1,
					'nowrap_end'           => 1,
				],
				[
					'id'                   => 'date_tranlation_month',
					'default'              => '',
					'type'                 => 'text',
					'nowrap_start'         => 1,
					'nowrap_end'           => 1,
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_date_tranlation_month',
						'name'  => 'tm_meta[tmfbuilder][date_tranlation_month][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Month', 'woocommerce-tm-extra-product-options' ) . '</span> ',
				],
				[
					'id'                   => 'date_tranlation_year',
					'default'              => '',
					'type'                 => 'text',
					'tags'                 => [
						'class' => 't',
						'id'    => 'builder_date_tranlation_year',
						'name'  => 'tm_meta[tmfbuilder][date_tranlation_year][]',
						'value' => '',
					],
					'label'                => '',
					'desc'                 => '',
					'prepend_element_html' => '<span class="prepend_span">' . esc_html__( 'Year', 'woocommerce-tm-extra-product-options' ) . '</span> ',
					'nowrap_start'         => 1,
				],
			]
		);
	}
}
includes/classes/builder/index.php000064400000000126150755142450013264 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/classes/builder/class-themecomplete-epo-builder-element-divider.php000064400000004662150755142450023404 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Divider Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_DIVIDER extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Divider', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-divide';
		$this->is_post          = 'display';
		$this->type             = '';
		$this->post_name_prefix = 'divider';
		$this->fee_type         = '';
		$this->tags             = 'content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = array_merge(
			$this->prepend_div( '', 'tm-tabs' ),
			$this->prepend_div( 'divider', 'tm-tab-headers' ),
			$this->prepend_tab( 'divider2', esc_html__( 'General Options', 'woocommerce-tm-extra-product-options' ), 'open' ),
			$this->prepend_tab( 'divider3', esc_html__( 'Conditional Logic', 'woocommerce-tm-extra-product-options' ) ),
			$this->prepend_tab( 'divider4', esc_html__( 'CSS Settings', 'woocommerce-tm-extra-product-options' ) ),
			$this->append_div( 'divider' ),
			$this->prepend_div( 'divider2' ),
			$this->get_divider_array(),
			$this->append_div( 'divider2' ),
			$this->prepend_div( 'divider3' ),
			$this->prepend_logic( 'divider' ),
			$this->append_div( 'divider3' ),
			$this->prepend_div( 'divider4' ),
			[
				[
					'id'      => 'divider_class',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't',
						'id'    => 'builder_divider_class',
						'name'  => 'tm_meta[tmfbuilder][divider_class][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Element class name', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Enter an extra class name to add to this element', 'woocommerce-tm-extra-product-options' ),
				],
			],
			$this->append_div( 'divider4' ),
			$this->append_div( '' )
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-addon.php000064400000004406150755142450023037 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Date picker Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.0
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_ADDON extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Addon element arguments
	 *
	 * @var array<mixed>
	 */
	private $args;

	/**
	 * Class Constructor
	 *
	 * @param array<mixed> $options Addon element name.
	 * @param array<mixed> $args Addon element attributes.
	 * @since 6.0
	 */
	public function __construct( $options = [], $args = [] ) {
		$this->element_name  = $args['name'];
		$this->args          = $args;
		$options['is_addon'] = true;

		if ( ! isset( $args['namespace'] ) || $args['namespace'] === $this->elements_namespace ) {
			$options['namespace'] = $this->elements_namespace . ' addon ' . $this->element_name;
		} else {
			$options['namespace'] = $args['namespace'];
		}

		if ( ! isset( $options['name'] ) ) {
			$options['name'] = '';
		}
		if ( ! isset( $options['description'] ) ) {
			$options['description'] = '';
		}
		if ( ! isset( $options['type'] ) ) {
			$options['type'] = '';
		}
		if ( ! isset( $options['width'] ) ) {
			$options['width'] = '';
		}
		if ( ! isset( $options['width_display'] ) ) {
			$options['width_display'] = '';
		}
		if ( ! isset( $options['icon'] ) ) {
			$options['icon'] = '';
		}
		if ( ! isset( $options['is_post'] ) ) {
			$options['is_post'] = '';
		}
		if ( ! isset( $options['post_name_prefix'] ) ) {
			$options['post_name_prefix'] = '';
		}
		if ( ! isset( $options['fee_type'] ) ) {
			$options['fee_type'] = '';
		}
		if ( ! isset( $options['show_on_backend'] ) ) {
			$options['show_on_backend'] = true;
		}
		if ( ! isset( $options['tags'] ) ) {
			$options['tags'] = $options['name'];
		}

		foreach ( $options as $property => $value ) {
			$this->{$property} = $value;
		}
	}

	/**
	 * Initialize element properties
	 *
	 * @return void
	 * @since 6.0
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			$this->args['settings'],
			true,
			isset( $this->args['tabs_override'] ) ? $this->args['tabs_override'] : [],
			isset( $this->args['extra_tabs'] ) ? $this->args['extra_tabs'] : []
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-radiobuttons.php000064400000003105150755142450024462 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Radio buttons Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_RADIOBUTTONS extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Radio buttons', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-dot-circle tcfar';
		$this->is_post          = 'post';
		$this->type             = 'multiple';
		$this->post_name_prefix = 'radio';
		$this->fee_type         = 'multiple';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'use_url',
				'replacement_mode',
				'swatch_position',
				'items_per_row',
				'use_lightbox',
				'show_tooltip',
				'changes_product_image',
				'clear_options',
				'options',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-checkboxes.php000064400000003133150755142450024064 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Checkboxes Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_CHECKBOXES extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Checkboxes', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-check-square';
		$this->is_post          = 'post';
		$this->type             = 'multipleall';
		$this->post_name_prefix = 'checkbox';
		$this->fee_type         = 'multiple';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'limit_choices',
				'exactlimit_choices',
				'minimumlimit_choices',
				'replacement_mode',
				'swatch_position',
				'items_per_row',
				'use_lightbox',
				'show_tooltip',
				'changes_product_image',
				'options',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element.php000064400000207017150755142450021757 0ustar00<?php
/**
 * Extra Product Options Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
abstract class THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * The element namespace
	 *
	 * @var string
	 */
	public $elements_namespace = THEMECOMPLETE_EPO_ELEMENTS_NAMESPACE;

	/**
	 * The name of the element for the internal array
	 *
	 * @var string
	 */
	public $element_name;

	/**
	 * If this is an addon element or not
	 *
	 * @var boolean
	 */
	public $is_addon;

	/**
	 * The element namespace
	 *
	 * @var string
	 */
	public $namespace;

	/**
	 * The element name in the builder
	 *
	 * @var string
	 */
	public $name;

	/**
	 * The element description in the builder
	 *
	 * @var string
	 */
	public $description;

	/**
	 * The builder initial width class
	 *
	 * @var string
	 */
	public $width;

	/**
	 * The builder inital width in percent
	 *
	 * @var string
	 */
	public $width_display;

	/**
	 * The icon class name for the icon in the builder
	 *
	 * @var string
	 */
	public $icon;

	/**
	 * If the element can be posted
	 * Can either be 'display' or 'post'
	 *
	 * @var string
	 */
	public $is_post;

	/**
	 * The type of this element
	 * Can either be '', 'single', 'variations', 'multipleall'or 'multiple'
	 *
	 * @var string|boolean
	 */
	public $type;

	/**
	 * The name prefix for this element
	 *
	 * @var string|boolean
	 */
	public $post_name_prefix;

	/**
	 * The type of fee this element can take
	 * Can be '', 'single' or 'multiple'
	 *
	 * @var string|boolean
	 */
	public $fee_type;

	/**
	 * Tags for registring the element to the popup
	 *
	 * @var string|boolean
	 */
	public $tags;

	/**
	 * If the element can be shown on the builder as a selectable element
	 *
	 * @var boolean
	 */
	public $show_on_backend;

	/**
	 * If the field should only be one time in the builder
	 *
	 * @var boolean
	 */
	public $one_time_field = false;

	/**
	 * If the element cannot be selected in the builder
	 *
	 * @var boolean
	 */
	public $no_selection = false;

	/**
	 * If the element should not be displayed in the frontend
	 *
	 * @var boolean
	 */
	public $no_frontend_display = false;

	/**
	 * Holder for the element properties
	 *
	 * @var array<mixed>
	 */
	public $properties = [];

	/**
	 * Holder for the element attributes
	 * Used for magic methods
	 *
	 * @var array<mixed>
	 */
	private $attributes = [];

	/**
	 * Sets an attribute
	 *
	 * @param string $name The attribute name.
	 * @param string $value The attribute value.
	 */
	public function __set( $name, $value ) {
		$this->attributes[ $name ] = $value;
	}

	/**
	 * Gets an attribute if it exists
	 *
	 * @param string $name The attribute name.
	 * @return mixed
	 */
	public function __get( $name ) {
		if ( array_key_exists( $name, $this->attributes ) ) {
			return $this->attributes[ $name ];
		}
	}

	/**
	 * Sets the element attributes
	 *
	 * @param array<mixed> $attributes The attributes array.
	 * @return void
	 */
	public function set_attributes( $attributes ) {
		$this->attributes = $attributes;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
	}

	/**
	 * Add tab callback
	 *
	 * @param string $id The element name.
	 * @param mixed  $label The element label.
	 * @param string $closed The closed class.
	 * @param string $boxclass The box class.
	 * @since 6.0
	 * @return void
	 */
	public function prepend_tab_callback( $id = '', $label = '', $closed = 'closed', $boxclass = '' ) {

		$datatab = $label;
		if ( is_array( $label ) ) {
			$datatab = $label[1];
		}
		echo "<div class='tm-box" . esc_attr( $boxclass ) . "'>"
			. "<h4 tabindex='0' data-id='" . esc_attr( $id ) . "-tab' data-tab='" . esc_attr( sanitize_key( $datatab ) ) . "-tab' class='tab-header" . esc_attr( $closed ) . "'>";
		if ( is_array( $label ) ) {
			echo '<i class="tab-header-icon ' . esc_attr( $label[0] ) . '"></i>' . "<span class='tab-header-label'>" . esc_html( $label[1] ) . '</span>';
		} else {
			echo "<span class='tab-header-label'>" . esc_html( $label ) . '</span>';
		}
		echo "<span class='tcfa tcfa-angle-down tm-arrow'></span></h4></div>";
	}

	/**
	 * Add tab
	 *
	 * @param string $id The element name.
	 * @param mixed  $label The element label.
	 * @param string $closed The closed class.
	 * @param string $boxclass The box class.
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function prepend_tab( $id = '', $label = '', $closed = 'closed', $boxclass = '' ) {
		if ( ! empty( $closed ) ) {
			$closed = ' ' . $closed;
		}
		if ( ! empty( $boxclass ) ) {
			$boxclass = ' ' . $boxclass;
		}

		return [
			[
				'id'      => $id . '_custom_tabstart',
				'default' => '',
				'type'    => 'custom',
				'nodiv'   => 1,
				'html'    => [ [ $this, 'prepend_tab_callback' ], [ $id, $label, $closed, $boxclass ] ],
				'label'   => '',
				'desc'    => '',
			],
		];
	}

	/**
	 * Add div callback
	 *
	 * @param string $id The element name.
	 * @param string $tmtab The tab class.
	 * @since 6.0
	 * @return void
	 */
	public function prepend_div_callback( $id = '', $tmtab = 'tm-tab' ) {
		// Remove empty values.
		$classes = array_filter( [ 'transition', $tmtab, $id ] );
		$classes = implode( ' ', $classes );
		echo '<div class="' . esc_attr( $classes ) . '">';
	}

	/**
	 * Start div
	 *
	 * @param string $id The element name.
	 * @param string $tmtab The tab class.
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function prepend_div( $id = '', $tmtab = 'tm-tab' ) {
		if ( ! empty( $id ) ) {
			$id .= '-tab';
		}

		return [
			[
				'id'      => $id . '_custom_divstart',
				'default' => '',
				'type'    => 'custom',
				'nodiv'   => 1,
				'html'    => [ [ $this, 'prepend_div_callback' ], [ $id, $tmtab ] ],
				'label'   => '',
				'desc'    => '',
			],
		];
	}

	/**
	 * End div callback
	 *
	 * @since 6.0
	 * @return void
	 */
	public function append_div_callback() {
		echo '</div>';
	}

	/**
	 * End div
	 *
	 * @param string $id The element name.
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function append_div( $id = '' ) {
		return [
			[
				'id'      => $id . '_custom_divend',
				'default' => '',
				'type'    => 'custom',
				'nodiv'   => 1,
				'html'    => [ [ $this, 'append_div_callback' ], [] ],
				'label'   => '',
				'desc'    => '',
			],
		];
	}

	/**
	 * Prepend logic elements
	 *
	 * @param string $id The element name.
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function prepend_logic( $id = '' ) {
		return apply_filters(
			'wc_epo_admin_element_conditional_logic',
			[
				[
					'id'      => $id . '_uniqid',
					'default' => '',
					'nodiv'   => 1,
					'type'    => 'hidden',
					'tags'    => [
						'class' => 'tm-builder-element-uniqid',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_uniqid][]',
						'value' => '',
					],
					'label'   => '',
					'desc'    => '',
				],
				[
					'id'      => $id . '_clogic',
					'clogic'  => true,
					'default' => '',
					'nodiv'   => 1,
					'type'    => 'hidden',
					'tags'    => [
						'class' => 'tm-builder-clogic',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_clogic][]',
						'value' => '',
					],
					'label'   => '',
					'desc'    => '',
				],
				[
					'id'         => $id . '_logicrules',
					'logicrules' => true,
					'default'    => '',
					'nodiv'      => 1,
					'type'       => 'hidden',
					'tags'       => [
						'class' => 'tm-builder-logicrules',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_logicrules][]',
						'value' => '',
					],
					'label'      => '',
					'desc'       => '',
				],
				[
					'id'        => $id . '_logic',
					'default'   => '',
					'leftclass' => 'align-self-start',
					'type'      => 'checkbox',
					'tags'      => [
						'class' => 'c activate-element-logic',
						'id'    => 'builder_' . $id . '_logic',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_logic][]',
						'value' => '1',
					],
					'extra'     => [ [ $this, 'builder_showlogic' ], [] ],
					'label'     => esc_html__( 'Element Conditional Logic', 'woocommerce-tm-extra-product-options' ),
					'desc'      => esc_html__( 'Enable conditional logic for showing or hiding this element.', 'woocommerce-tm-extra-product-options' ),
				],
			]
		);
	}

	/**
	 * Common element options.
	 *
	 * @param string $id element internal id (key from THEMECOMPLETE_EPO_BUILDER()->all_elements).
	 * @param string $type element or section.
	 * @param string $name element type.
	 *
	 * @since 6.0
	 * @return array<mixed> List of common element options adjusted by element internal id.
	 */
	public function get_header_array( $id = 'header', $type = '', $name = '' ) {
		$default_fullwidth_setting = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_select_fullwidth' );

		$full_width = esc_html__( 'Full width', 'woocommerce-tm-extra-product-options' );
		$auto       = esc_html__( 'Auto', 'woocommerce-tm-extra-product-options' );
		$default    = $auto;
		if ( 'yes' === $default_fullwidth_setting ) {
			$default = $full_width;
		}
		$default = esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ) . ' (' . $default . ')';
		return apply_filters(
			'wc_epo_admin_element_label_options',
			[
				[
					'id'          => $id . '_size',
					'wpmldisable' => 1,
					'default'     => ( 'section_header' === $id ) ? '2' : '3',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_' . $id . '_size',
						'name' => 'tm_meta[tmfbuilder][' . $id . '_size][]',
					],
					'options'     =>
						( 'section_header' !== $id ) ?
							[
								[
									'text'  => esc_html__( 'H1', 'woocommerce-tm-extra-product-options' ),
									'value' => '1',
								],
								[
									'text'  => esc_html__( 'H2', 'woocommerce-tm-extra-product-options' ),
									'value' => '2',
								],
								[
									'text'  => esc_html__( 'H3', 'woocommerce-tm-extra-product-options' ),
									'value' => '3',
								],
								[
									'text'  => esc_html__( 'H4', 'woocommerce-tm-extra-product-options' ),
									'value' => '4',
								],
								[
									'text'  => esc_html__( 'H5', 'woocommerce-tm-extra-product-options' ),
									'value' => '5',
								],
								[
									'text'  => esc_html__( 'H6', 'woocommerce-tm-extra-product-options' ),
									'value' => '6',
								],
								[
									'text'  => esc_html__( 'p', 'woocommerce-tm-extra-product-options' ),
									'value' => '7',
								],
								[
									'text'  => esc_html__( 'div', 'woocommerce-tm-extra-product-options' ),
									'value' => '8',
								],
								[
									'text'  => esc_html__( 'span', 'woocommerce-tm-extra-product-options' ),
									'value' => '9',
								],
								[
									'text'  => esc_html__( 'label', 'woocommerce-tm-extra-product-options' ),
									'value' => '10',
								],
							] :
							[
								[
									'text'  => esc_html__( 'H1', 'woocommerce-tm-extra-product-options' ),
									'value' => '1',
								],
								[
									'text'  => esc_html__( 'H2', 'woocommerce-tm-extra-product-options' ),
									'value' => '2',
								],
								[
									'text'  => esc_html__( 'H3', 'woocommerce-tm-extra-product-options' ),
									'value' => '3',
								],
								[
									'text'  => esc_html__( 'H4', 'woocommerce-tm-extra-product-options' ),
									'value' => '4',
								],
								[
									'text'  => esc_html__( 'H5', 'woocommerce-tm-extra-product-options' ),
									'value' => '5',
								],
								[
									'text'  => esc_html__( 'H6', 'woocommerce-tm-extra-product-options' ),
									'value' => '6',
								],
								[
									'text'  => esc_html__( 'p', 'woocommerce-tm-extra-product-options' ),
									'value' => '7',
								],
								[
									'text'  => esc_html__( 'div', 'woocommerce-tm-extra-product-options' ),
									'value' => '8',
								],
								[
									'text'  => esc_html__( 'span', 'woocommerce-tm-extra-product-options' ),
									'value' => '9',
								],
							],
					'label'       => esc_html__( 'Label type', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
				],
				[
					'id'               => $id . '_title',
					'default'          => '',
					'type'             => 'text',
					'message0x0_class' => ( 'element' === $type && 'variations' === $name ) ? 'builder_hide_for_variation' : '',
					'tags'             => [
						'class' => 't tm-header-title',
						'id'    => 'builder_' . $id . '_title',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_title][]',
						'value' => '',
					],
					'label'            => esc_html__( 'Label', 'woocommerce-tm-extra-product-options' ),
					'desc'             => '',
				],
				[
					'id'               => $id . '_title_mode',
					'message0x0_class' => 'tm-title-mode tm-epo-switch-wrapper',
					'wpmldisable'      => 1,
					'default'          => '',
					'type'             => 'radio',
					'tags'             => [
						'class' => 'title-mode',
						'id'    => 'builder_' . $id . '_title_mode',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_title_mode][]',
					],
					'options'          => [
						[
							'text'  => $default,
							'value' => '',
						],
						[
							'text'  => $full_width,
							'value' => 'fullwidth',
						],
						[
							'text'  => $auto,
							'value' => 'auto',
						],
					],
					'label'            => esc_html__( 'Label view mode', 'woocommerce-tm-extra-product-options' ),
					'desc'             => esc_html__( 'Select if the label should full be width or auto.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => $id . '_title_position',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'class' => 'tc-label-position',
						'id'    => 'builder_' . $id . '_title_position',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_title_position][]',
					],
					'options'     => [
						[
							'text'  => ( 'section' === $type ) ? esc_html__( 'Above the fields', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Above field', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => ( 'section' === $type ) ? esc_html__( 'Left of the fields', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Left of the field', 'woocommerce-tm-extra-product-options' ),
							'value' => 'left',
						],
						[
							'text'  => ( 'section' === $type ) ? esc_html__( 'Right of the fields', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Right of the field', 'woocommerce-tm-extra-product-options' ),
							'value' => 'right',
						],
						[
							'text'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
							'value' => 'disable',
						],
					],
					'label'       => esc_html__( 'Label position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
					'required'    => ( 'section' === $type ) ? [
						'.sections_style' => [
							'operator' => 'is',
							'value'    => '',
						],
					] : [],
				],
				[
					'id'          => $id . '_title_color',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'data-show-input'            => 'true',
						'data-show-initial'          => 'true',
						'data-allow-empty'           => 'true',
						'data-show-alpha'            => 'false',
						'data-show-palette'          => 'false',
						'data-clickout-fires-change' => 'true',
						'data-show-buttons'          => 'false',
						'data-preferred-format'      => 'hex',
						'class'                      => 'tm-color-picker',
						'id'                         => 'builder_' . $id . '_title_color',
						'name'                       => 'tm_meta[tmfbuilder][' . $id . '_title_color][]',
						'value'                      => '',
					],
					'label'       => esc_html__( 'Label color', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'      => $id . '_subtitle',
					'default' => '',
					'type'    => 'textarea',
					'tags'    => [
						'id'   => 'builder_' . $id . '_subtitle',
						'name' => 'tm_meta[tmfbuilder][' . $id . '_subtitle][]',
					],
					'label'   => esc_html__( 'Subtitle', 'woocommerce-tm-extra-product-options' ),
					'desc'    => '',
				],
				[
					'id'          => $id . '_subtitle_position',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_' . $id . '_subtitle_position',
						'name' => 'tm_meta[tmfbuilder][' . $id . '_subtitle_position][]',
					],
					'options'     => [
						[
							'text'  => ( 'section' === $type ) ? esc_html__( 'Above the fields', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Above field', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => ( 'section' === $type ) ? esc_html__( 'Below the fields', 'woocommerce-tm-extra-product-options' ) : esc_html__( 'Below field', 'woocommerce-tm-extra-product-options' ),
							'value' => 'below',
						],
						[
							'text'  => esc_html__( 'Tooltip', 'woocommerce-tm-extra-product-options' ),
							'value' => 'tooltip',
						],
						[
							'text'  => esc_html__( 'Icon tooltip left', 'woocommerce-tm-extra-product-options' ),
							'value' => 'icontooltipleft',
						],
						[
							'text'  => esc_html__( 'Icon tooltip right', 'woocommerce-tm-extra-product-options' ),
							'value' => 'icontooltipright',
						],
					],
					'label'       => esc_html__( 'Subtitle position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
				],
				[
					'id'          => $id . '_subtitle_color',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 'tm-color-picker',
						'id'    => 'builder_' . $id . '_subtitle_color',
						'name'  => 'tm_meta[tmfbuilder][' . $id . '_subtitle_color][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Subtitle color', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
				],
			]
		);
	}

	/**
	 * Sets element divider option.
	 *
	 * @param string  $id element internal id (key from THEMECOMPLETE_EPO_BUILDER()->all_elements).
	 * @param integer $noempty If the empty choice should be printed.
	 *
	 * @since 6.0
	 * @return array<mixed> Element divider options adjusted by element internal id.
	 */
	public function get_divider_array( $id = 'divider', $noempty = 1 ) {
		$_divider = [
			[
				'id'               => $id . '_type',
				'wpmldisable'      => 1,
				'message0x0_class' => 'builder_hide_for_variation',
				'default'          => 'hr',
				'type'             => 'select',
				'tags'             => [
					'id'   => 'builder_' . $id . '_type',
					'name' => 'tm_meta[tmfbuilder][' . $id . '_type][]',
				],
				'options'          => [
					[
						'text'  => esc_html__( 'Horizontal rule', 'woocommerce-tm-extra-product-options' ),
						'value' => 'hr',
					],
					[
						'text'  => esc_html__( 'Divider', 'woocommerce-tm-extra-product-options' ),
						'value' => 'divider',
					],
					[
						'text'  => esc_html__( 'Padding', 'woocommerce-tm-extra-product-options' ),
						'value' => 'padding',
					],
				],
				'label'            => esc_html__( 'Divider type', 'woocommerce-tm-extra-product-options' ),
				'desc'             => '',
				'required'         => [
					'.tc-label-position' => [
						'operator' => 'is',
						'value'    => [ '', 'disable' ],
					],
				],
			],
		];
		if ( empty( $noempty ) ) {
			$_divider[0]['default'] = 'none';
			array_push(
				$_divider[0]['options'],
				[
					'text'  => esc_html__( 'None', 'woocommerce-tm-extra-product-options' ),
					'value' => 'none',
				]
			);
		}

		return $_divider;
	}

	/**
	 * Generate each tab status
	 *
	 * @param array<mixed> $epo_tabs_ids The tab array ids.
	 * @param string       $name The element name.
	 * @param array<mixed> $settings_array Array of settings.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @param array<mixed> $extra_tabs Extra tabs data.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function get_element_tabs( $epo_tabs_ids = [], $name = '', $settings_array = [], $tabs_override = [], $extra_tabs = [] ) {
		$epo_tabs = array_combine( $epo_tabs_ids, array_fill( 0, count( $epo_tabs_ids ), 0 ) );

		$settings_tabs_array = [ 'general_options' => $settings_array ];

		$header_names = [];

		if ( ! empty( $extra_tabs ) && is_array( $extra_tabs ) ) {
			foreach ( $extra_tabs as $tab => $data ) {
				if ( isset( $data['tab_data'] ) ) {
					$settings_tabs_array[ $tab ] = $data['tab_data'];
				}
				if ( isset( $data['header_data'] ) ) {
					$header_names[ $tab ] = $data['header_data'];
				}
			}
		}

		$tabs     = array_keys( $settings_tabs_array );
		$epo_tabs = array_merge( $epo_tabs, array_fill_keys( $tabs, 0 ) );

		if ( ! empty( $tabs_override ) ) {
			// Get the missing keys in epo_tabs.
			$missing_keys = array_diff( array_keys( $epo_tabs ), array_keys( $tabs_override ) );
			// Create a new array with the missing keys set to 0.
			$new_keys = array_fill_keys( $missing_keys, 0 );
			// Merge the new array with tabs_override.
			$tabs_override = array_merge( $tabs_override, $new_keys );
		} else {
			// Set all tabs to 1.
			$tabs_override = array_fill_keys( array_keys( $epo_tabs ), 1 );
		}

		// Disable repeater tab for multiple upload element.
		if ( 'multiple_file_upload' === $name ) {
			$tabs_override['repeater_settings'] = 0;
		}

		// Disable conditional logic tab for Option Templates.

		// @phpstan-ignore-next-line
		$post = isset( $_GET ) && isset( $_GET['post'] ) ? absint( wp_unslash( $_GET['post'] ) ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		$post_type = '';
		if ( $post ) {
			$post = get_post( $post );
			if ( $post instanceof WP_Post ) {
				$post_type = $post->post_type;
			}
		}

		if ( '' === $post_type && isset( $_REQUEST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post_type = sanitize_text_field( wp_unslash( $_REQUEST['post_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
		}

		if ( THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE === $post_type ) {
			$tabs_override['conditional_logic'] = 0;
		}

		return [
			'tabs_override'       => $tabs_override,
			'settings_tabs_array' => $settings_tabs_array,
			'header_names'        => $header_names,
		];
	}

	/**
	 * Generate label_options tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_label_options( $name = '', $counter = 1, $tabs_override = [] ) {
		// We override the counter to have the Label Options as the first tab.
		$counter = 1;

		$label_options_data = [];
		if ( ! empty( $tabs_override['label_options'] ) ) {
			$label_options_data = array_merge(
				$label_options_data,
				$this->prepend_div( $name . $counter ),
				$this->get_header_array( $name . '_header', 'element', $name ),
				$this->get_divider_array( $name . '_divider', 0 ),
				$this->append_div( $name . $counter )
			);
		}
		$label_options_data = apply_filters( 'wc_epo_admin_add_element_label_options_data', $label_options_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['label_options'] ) ? $this->prepend_tab(
			$name . $counter,
			[
				'tcfa tcfa-tag',
				esc_html__( 'Label Options', 'woocommerce-tm-extra-product-options' ),
			],
			'open',
			'tma-tab-label'
		) : [];

		return [
			'tab_data'    => $label_options_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Generate conditional_logic tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_conditional_logic( $name = '', $counter = 1, $tabs_override = [] ) {

		$conditional_logic_data = [];
		if ( 'variations' !== $name ) {
			if ( ! empty( $tabs_override['conditional_logic'] ) ) {
				$conditional_logic_data = array_merge(
					$conditional_logic_data,
					$this->prepend_div( $name . ( $counter + 1 ) ),
					$this->prepend_logic( $name ),
					$this->append_div( $name . ( $counter + 1 ) )
				);
			}
		}
		$conditional_logic_data = apply_filters( 'wc_epo_admin_add_element_conditional_logic_data', $conditional_logic_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['conditional_logic'] ) ? $this->prepend_tab(
			$name . ( $counter + 1 ),
			[
				'tcfa tcfa-lightbulb',
				esc_html__( 'Conditional Logic', 'woocommerce-tm-extra-product-options' ),
			],
			'closed',
			'tma-tab-logic'
		) : [];

		return [
			'tab_data'    => $conditional_logic_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Generate css_settings tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_css_settings( $name = '', $counter = 1, $tabs_override = [] ) {

		$css_settings_data = [];
		if ( 'variations' !== $name ) {
			if ( ! empty( $tabs_override['css_settings'] ) ) {
				$css_settings_data = array_merge(
					$css_settings_data,
					$this->prepend_div( $name . ( $counter + 2 ) ),
					apply_filters(
						'wc_epo_admin_element_css_settings',
						[
							[
								'id'      => $name . '_class',
								'default' => '',
								'type'    => 'text',
								'tags'    => [
									'class' => 't',
									'id'    => 'builder_' . $name . '_class',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_class][]',
									'value' => '',
								],
								'label'   => esc_html__( 'Element class name', 'woocommerce-tm-extra-product-options' ),
								'desc'    => esc_html__( 'Enter an extra class name to add to this element', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'      => $name . '_container_id',
								'default' => '',
								'type'    => 'text',
								'tags'    => [
									'class' => 't',
									'id'    => 'builder_' . $name . '_container_id',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_container_id][]',
									'value' => '',
								],
								'label'   => esc_html__( 'Element container id', 'woocommerce-tm-extra-product-options' ),
								'desc'    => esc_html__( 'Enter an id for the container of the element.', 'woocommerce-tm-extra-product-options' ),
							],
						]
					),
					$this->append_div( $name . ( $counter + 2 ) )
				);
			}
		}
		$css_settings_data = apply_filters( 'wc_epo_admin_add_element_css_settings_data', $css_settings_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['css_settings'] ) ? $this->prepend_tab(
			$name . ( $counter + 2 ),
			[
				'tcfa tcfa-file-alt',
				esc_html__( 'CSS Settings', 'woocommerce-tm-extra-product-options' ),
			],
			'closed',
			'tma-tab-css'
		) : [];

		return [
			'tab_data'    => $css_settings_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Generate woocommerce_settings tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_woocommerce_settings( $name = '', $counter = 1, $tabs_override = [] ) {

		$woocommerce_settings_data = [];
		if ( 'variations' !== $name ) {
			if ( ! empty( $tabs_override['woocommerce_settings'] ) ) {
				$woocommerce_settings_data = array_merge(
					$woocommerce_settings_data,
					$this->prepend_div( $name . ( $counter + 3 ) ),
					apply_filters(
						'wc_epo_admin_element_woocommerce_settings',
						[
							[
								'id'          => $name . '_include_tax_for_fee_price_type',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_include_tax_for_fee_price_type',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_include_tax_for_fee_price_type][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'Inherit product setting', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'yes',
									],
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => 'no',
									],
								],
								'label'       => esc_html__( 'Include tax for Fee price type', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to include tax for Fee price type on this element.', 'woocommerce-tm-extra-product-options' ),
								'required'    => [
									'.tc-element-setting-fee' => [
										'operator' => 'is',
										'value'    => '1',
									],
								],
							],
							[
								'id'          => $name . '_tax_class_for_fee_price_type',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_tax_class_for_fee_price_type',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_tax_class_for_fee_price_type][]',
								],
								'options'     => $this->get_tax_classes(),
								'label'       => esc_html__( 'Tax class for Fee price type', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose the tax class for Fee price type on this element.', 'woocommerce-tm-extra-product-options' ),
								'required'    => [
									'.tc-element-setting-fee' => [
										'operator' => 'is',
										'value'    => '1',
									],
								],
							],
							[
								'id'          => $name . '_hide_element_label_in_cart',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_label_in_cart',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_label_in_cart][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
								],
								'label'       => esc_html__( 'Hide element label in cart', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element label in the cart or not.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'          => $name . '_hide_element_value_in_cart',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_value_in_cart',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_value_in_cart][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'No, but hide price', 'woocommerce-tm-extra-product-options' ),
										'value' => 'noprice',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
									[
										'text'  => esc_html__( 'Yes, but show price', 'woocommerce-tm-extra-product-options' ),
										'value' => 'price',
									],
								],
								'label'       => esc_html__( 'Hide element value in cart', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element value in the cart or not.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'          => $name . '_hide_element_label_in_order',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_label_in_order',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_label_in_order][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
								],
								'label'       => esc_html__( 'Hide element label in order', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element label in the order or not.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'          => $name . '_hide_element_value_in_order',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_value_in_order',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_value_in_order][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'No, but hide price', 'woocommerce-tm-extra-product-options' ),
										'value' => 'noprice',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
									[
										'text'  => esc_html__( 'Yes, but show price', 'woocommerce-tm-extra-product-options' ),
										'value' => 'price',
									],
								],
								'label'       => esc_html__( 'Hide element value in order', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element value in the order or not.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'          => $name . '_hide_element_label_in_floatbox',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_label_in_floatbox',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_label_in_floatbox][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
								],
								'label'       => esc_html__( 'Hide element label in floating totals box', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element label in the floating totals box or not.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'          => $name . '_hide_element_value_in_floatbox',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'select',
								'tags'        => [
									'id'   => 'builder_' . $name . '_hide_element_value_in_floatbox',
									'name' => 'tm_meta[tmfbuilder][' . $name . '_hide_element_value_in_floatbox][]',
								],
								'options'     => [
									[
										'text'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
										'value' => '',
									],
									[
										'text'  => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
										'value' => 'hidden',
									],
								],
								'label'       => esc_html__( 'Hide element value in floating totals box', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Choose whether to hide the element value in the floating totals box or not.', 'woocommerce-tm-extra-product-options' ),
							],
						]
					),
					$this->append_div( $name . ( $counter + 3 ) )
				);
			}
		}
		$woocommerce_settings_data = apply_filters( 'wc_epo_admin_add_element_woocommerce_settings_data', $woocommerce_settings_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['woocommerce_settings'] ) ? $this->prepend_tab(
			$name . ( $counter + 3 ),
			[
				'tcfa tcfa-shopping-bag',
				esc_html__( 'WooCommerce Settings', 'woocommerce-tm-extra-product-options' ),
			],
			'closed',
			'tma-tab-woocommerce'
		) : [];

		return [
			'tab_data'    => $woocommerce_settings_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Generate repeater_settings tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_repeater_settings( $name = '', $counter = 1, $tabs_override = [] ) {

		$repeater_settings_data = [];
		if ( 'variations' !== $name ) {
			if ( ! empty( $tabs_override['repeater_settings'] ) ) {
				$repeater_settings_data = array_merge(
					$repeater_settings_data,
					$this->prepend_div( $name . ( $counter + 4 ) ),
					apply_filters(
						'wc_epo_admin_element_repeater_settings',
						[
							[
								'id'       => $name . '_repeater',
								'default'  => '',
								'type'     => 'checkbox',
								'tags'     => [
									'class' => 'c activate-element-repeater',
									'id'    => 'builder_' . $name . '_repeater',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_repeater][]',
									'value' => '1',
								],
								'label'    => esc_html__( 'Enable repeater', 'woocommerce-tm-extra-product-options' ),
								'desc'     => esc_html__( 'This will make this element repeatable.', 'woocommerce-tm-extra-product-options' ),
								'required' => [
									'.element-connector' => [
										'operator' => 'is',
										'value'    => '',
									],
								],
							],
							[
								'id'       => $name . '_repeater_quantity',
								'default'  => '',
								'type'     => 'checkbox',
								'tags'     => [
									'class' => 'c activate-element-repeater-quantity',
									'id'    => 'builder_' . $name . '_repeater_quantity',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_repeater_quantity][]',
									'value' => '1',
								],
								'label'    => esc_html__( 'Bind repeater with product quantity', 'woocommerce-tm-extra-product-options' ),
								'desc'     => esc_html__( 'This will make this element repeatable based on the product quantity.', 'woocommerce-tm-extra-product-options' ),
								'required' => [
									'.activate-element-repeater' => [
										'operator' => 'isnot',
										'value'    => '',
									],
									'.element-connector' => [
										'operator' => 'is',
										'value'    => '',
									],
								],
							],
							[
								'id'          => $name . '_repeater_min_rows',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'number',
								'tags'        => [
									'class' => 'n',
									'id'    => 'builder_' . $name . '_repeater_min_rows',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_repeater_min_rows][]',
									'value' => '',
									'min'   => 1,
								],
								'label'       => esc_html__( 'Repeater minimum limit', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Set the minimum number of rows a user can add for the repeater field.', 'woocommerce-tm-extra-product-options' ),
								'required'    => [
									'.activate-element-repeater' => [
										'operator' => 'isnot',
										'value'    => '',
									],
									'.element-connector' => [
										'operator' => 'is',
										'value'    => '',
									],
								],
							],
							[
								'id'          => $name . '_repeater_max_rows',
								'wpmldisable' => 1,
								'default'     => '',
								'type'        => 'number',
								'tags'        => [
									'class' => 'n',
									'id'    => 'builder_' . $name . '_repeater_max_rows',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_repeater_max_rows][]',
									'value' => '',
									'min'   => 1,
								],
								'label'       => esc_html__( 'Repeater maximum limit', 'woocommerce-tm-extra-product-options' ),
								'desc'        => esc_html__( 'Set the maximum number of rows a user can add for the repeater field.', 'woocommerce-tm-extra-product-options' ),
								'required'    => [
									'.activate-element-repeater' => [
										'operator' => 'isnot',
										'value'    => '',
									],
									'.element-connector' => [
										'operator' => 'is',
										'value'    => '',
									],
								],
							],
							[
								'id'       => $name . '_repeater_button_label',
								'default'  => '',
								'type'     => 'text',
								'tags'     => [
									'class' => 't',
									'id'    => 'builder_' . $name . '_repeater_button_label',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_repeater_button_label][]',
									'value' => '',
								],
								'label'    => esc_html__( 'Repeater Button Label', 'woocommerce-tm-extra-product-options' ),
								'desc'     => esc_html__( 'Leave this blank for the default label.', 'woocommerce-tm-extra-product-options' ),
								'required' => [
									'.activate-element-repeater' => [
										'operator' => 'isnot',
										'value'    => '',
									],
									'.element-connector' => [
										'operator' => 'is',
										'value'    => '',
									],
								],
							],
						]
					)
				);
				// Radio buttons connector setting.
				if ( 'radiobuttons' === $name ) {
					$repeater_settings_data = array_merge(
						$repeater_settings_data,
						apply_filters(
							'wc_epo_admin_element_connector_settings',
							[
								[
									'id'       => $name . '_connector',
									'default'  => '',
									'type'     => 'text',
									'tags'     => [
										'class' => 't element-connector',
										'id'    => 'builder_' . $name . '_connector',
										'name'  => 'tm_meta[tmfbuilder][' . $name . '_connector][]',
										'value' => '',
									],
									'label'    => esc_html__( 'Radio Button Connector ID', 'woocommerce-tm-extra-product-options' ),
									'desc'     => esc_html__( 'Enter a custom id to connect different radio button elements.', 'woocommerce-tm-extra-product-options' ),
									'required' => [
										'.activate-element-repeater' => [
											'operator' => 'is',
											'value'    => '',
										],
									],
								],
							]
						)
					);
				}
				$repeater_settings_data = array_merge(
					$repeater_settings_data,
					$this->append_div( $name . ( $counter + 4 ) )
				);
			}
		}
		$repeater_settings_data = apply_filters( 'wc_epo_admin_add_element_repeater_settings_data', $repeater_settings_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['repeater_settings'] ) ? $this->prepend_tab(
			$name . ( $counter + 4 ),
			[
				'tcfa tcfa-redo',
				esc_html__( 'Repeater Settings', 'woocommerce-tm-extra-product-options' ),
			],
			'closed',
			'tma-tab-repeater'
		) : [];

		return [
			'tab_data'    => $repeater_settings_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Fetch shipping methods
	 * for use in a select box
	 *
	 * @param array<mixed> $selected_methods The selected shipping methods.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function fetch_shipping_methods_array( $selected_methods = [] ) {
		$cache_list = wp_cache_get( 'wc_epo_fetch_shipping_methods_array' );
		if ( false !== $cache_list ) {
			return $cache_list;
		}

		$list = [];

		/**
		 * Shipping methods
		 *
		 * @var array<WC_Shipping_Method|object|false> $shipping_methods
		 */
		$shipping_methods = apply_filters( 'wc_epo_fetch_shipping_methods_array', WC()->shipping()->load_shipping_methods() );

		$zones = WC_Shipping_Zones::get_zones();

		if ( ! isset( $zones[0] ) ) {
			$rest_of_world = WC_Shipping_Zones::get_zone_by();
			if ( $rest_of_world instanceof WC_Shipping_Zone ) {
				$zones[0]                     = $rest_of_world->get_data();
				$zones[0]['shipping_methods'] = $rest_of_world->get_shipping_methods();
			}
		}

		foreach ( $shipping_methods as $method_id => $method ) {
			if ( ! $method instanceof WC_Shipping_Method ) {
				continue;
			}
			if ( method_exists( $method, 'supports' ) && $method->supports( 'shipping-zones' ) ) {
				$list[] = [
					'optgroupstart' => $method->get_method_title(),
				];
				$list[] = [
					/* translators: %s Shipping method title */
					'text'     => sprintf( esc_html__( 'All &quot;%s&quot; Method Instances', 'woocommerce-tm-extra-product-options' ), esc_html( $method->get_method_title() ) ),
					'value'    => $method_id,
					'selected' => in_array( $method_id, $selected_methods ), // phpcs:ignore WordPress.PHP.StrictInArray
				];

				foreach ( $zones as $zone ) {

					if ( ! empty( $zone['shipping_methods'] ) ) {

						$zone_name = $zone['zone_name'];

						foreach ( $zone['shipping_methods'] as $instance_id => $method_instance ) {

							if ( $method_instance->id !== $method->id ) {
								continue;
							}

							$option_id = $method_instance->get_rate_id();
							/* translators: %s%1$s Shipping method title %2$s Method id */
							$method_title = sprintf( __( '&quot;%1$s&quot; (Instance ID: %2$s)', 'woocommerce-tm-extra-product-options' ), $method_instance->get_title(), $instance_id );
							/* translators: %s%1$s Shipping zone name %2$s Method title */
							$option_name = sprintf( __( '%1$s &ndash; %2$s', 'woocommerce-tm-extra-product-options' ), $zone_name, $method_title );

							$list[] = [
								'text'     => $option_name,
								'value'    => $option_id,
								'selected' => in_array( $option_id, $selected_methods ), // phpcs:ignore WordPress.PHP.StrictInArray
							];
						}
					}
				}
				$list[] = [
					'optgroupend' => true,
				];
			} elseif ( 'legacy_flat_rate' === $method_id ) {
				$list[] = [
					'optgroupstart' => esc_html__( 'Flat Rates (Legacy)', 'woocommerce-tm-extra-product-options' ),
				];
				$list[] = [
					'text'     => $method->get_title() . ' ' . esc_html__( '(Legacy)', 'woocommerce-tm-extra-product-options' ),
					'value'    => $method_id,
					'selected' => in_array( $method_id, $selected_methods ), // phpcs:ignore WordPress.PHP.StrictInArray
				];
				// Additional legacy flat rate options.
				$additional_flat_rate_options = (array) explode( "\n", $method->get_option( 'options' ) );

				foreach ( $additional_flat_rate_options as $option ) {

					$this_option = array_map( 'trim', explode( WC_DELIMITER, $option ) );

					if ( count( $this_option ) !== 3 ) {
						continue;
					}

					$option_id = 'legacy_flat_rate:' . urldecode( sanitize_title( $this_option[0] ) );

					$list[] = [
						'text'     => $this_option[0] . ' ' . esc_html__( '(Legacy)', 'woocommerce-tm-extra-product-options' ),
						'value'    => $option_id,
						'selected' => in_array( $option_id, $selected_methods ), // phpcs:ignore WordPress.PHP.StrictInArray
					];
				}
				$list[] = [
					'optgroupend' => true,
				];
			} else {
				$is_legacy = ( 0 === mb_strpos( $method_id, 'legacy_' ) );
				$list[]    = [
					'text'     => $method->get_title() . ( $is_legacy ? ' ' . esc_html__( '(Legacy)', 'woocommerce-tm-extra-product-options' ) : '' ),
					'value'    => $method_id,
					'selected' => in_array( $method_id, $selected_methods ), // phpcs:ignore WordPress.PHP.StrictInArray
				];
			}
		}

		wp_cache_set( 'wc_epo_fetch_shipping_methods_array', $list );

		return $list;
	}

	/**
	 * Generate action_settings tab
	 *
	 * @param string       $name The element name.
	 * @param integer      $counter The current counter.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @since 6.4
	 * @return array<mixed>
	 */
	public function generate_action_settings( $name = '', $counter = 1, $tabs_override = [] ) {
		$action_settings_data = [];
		if ( 'variations' !== $name ) {
			if ( ! empty( $tabs_override['action_settings'] ) ) {
				$action_settings_data = array_merge(
					$action_settings_data,
					$this->prepend_div( $name . ( $counter + 5 ) ),
					apply_filters(
						'wc_epo_admin_element_action_settings',
						[
							[
								'id'               => $name . '_shipping_methods_enable',
								'wpmldisable'      => 1,
								'default'          => '',
								'type'             => 'select',
								'multiple'         => 'multiple',
								'fill'             => 'shipping',
								'message0x0_class' => 'noborder',
								'tags'             => [
									'data-placeholder' => esc_attr__( 'Select shipping methods ...', 'woocommerce-tm-extra-product-options' ),
									'class'            => 'wc-shipping-methods-search shipping-methods-selector shipping-methods-enable',
									'id'               => 'builder_' . $name . '_shipping_methods_enable',
									'name'             => 'tm_meta[tmfbuilder][' . $name . '_shipping_methods_enable][]',
								],
								'options'          => $this->fetch_shipping_methods_array(),
								'label'            => esc_html__( 'Enable Shipping Methods', 'woocommerce-tm-extra-product-options' ),
								'desc'             => esc_html__( 'Select the shipping methods to enable.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'        => $name . '_shipping_methods_enable_logicrules',
								'default'   => '',
								'type'      => 'hidden',
								'leftclass' => 'align-self-start',
								'tags'      => [
									'class' => 'tm-shipping-enable-logicrules',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_shipping_methods_enable_logicrules][]',
									'value' => '',
								],
								'extra'     => [ [ $this, 'shipping_showlogic' ], [] ],
								'label'     => esc_html__( 'Enable Shipping Methods Condition', 'woocommerce-tm-extra-product-options' ),
								'desc'      => esc_html__( 'Specify the conditions for enabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will be available for customers to choose during checkout.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'               => $name . '_shipping_methods_disable',
								'wpmldisable'      => 1,
								'default'          => '',
								'type'             => 'select',
								'multiple'         => 'multiple',
								'fill'             => 'shipping',
								'message0x0_class' => 'noborder',
								'tags'             => [
									'data-placeholder' => esc_attr__( 'Select shipping methods ...', 'woocommerce-tm-extra-product-options' ),
									'class'            => 'wc-shipping-methods-search shipping-methods-selector shipping-methods-disable',
									'id'               => 'builder_' . $name . '_shipping_methods_disable',
									'name'             => 'tm_meta[tmfbuilder][' . $name . '_shipping_methods_disable][]',
								],
								'options'          => $this->fetch_shipping_methods_array(),
								'label'            => esc_html__( 'Disable Shipping Methods', 'woocommerce-tm-extra-product-options' ),
								'desc'             => esc_html__( 'Select the shipping methods to disable.', 'woocommerce-tm-extra-product-options' ),
							],
							[
								'id'        => $name . '_shipping_methods_disable_logicrules',
								'default'   => '',
								'type'      => 'hidden',
								'leftclass' => 'align-self-start',
								'tags'      => [
									'class' => 'tm-shipping-disable-logicrules',
									'name'  => 'tm_meta[tmfbuilder][' . $name . '_shipping_methods_disable_logicrules][]',
									'value' => '',
								],
								'extra'     => [ [ $this, 'shipping_showlogic' ], [] ],
								'label'     => esc_html__( 'Disable Shipping Methods Condition', 'woocommerce-tm-extra-product-options' ),
								'desc'      => esc_html__( 'Specify the conditions for disabling shipping methods based on the value of the current field. If the conditions are met, the selected shipping methods will not be available for customers to choose during checkout.', 'woocommerce-tm-extra-product-options' ),
							],
						]
					),
					$this->append_div( $name . ( $counter + 5 ) )
				);
			}
		}
		$action_settings_data = apply_filters( 'wc_epo_admin_add_element_action_settings_data', $action_settings_data, $name, $tabs_override, $counter );

		$header_data = ! empty( $tabs_override['action_settings'] ) ? $this->prepend_tab(
			$name . ( $counter + 5 ),
			[
				'tcfa tcfa-bolt',
				esc_html__( 'Actions', 'woocommerce-tm-extra-product-options' ),
			],
			'closed',
			'tma-tab-woocommerce'
		) : [];

		return [
			'tab_data'    => $action_settings_data,
			'header_data' => $header_data,
		];
	}

	/**
	 * Add element
	 *
	 * @param string       $name The element name.
	 * @param array<mixed> $settings_array Array of settings.
	 * @param boolean      $is_addon If this is an addon element.
	 * @param array<mixed> $tabs_override Tabs array overrides.
	 * @param array<mixed> $extra_tabs Extra tabs data.
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function add_element( $name = '', $settings_array = [], $is_addon = false, $tabs_override = [], $extra_tabs = [] ) {
		$extra_settings_array   = [];
		$extra_addon_properties = THEMECOMPLETE_EPO_BUILDER()->extra_addon_properties;

		foreach ( $extra_addon_properties['extra_tabs'] as $extra_setting_key => $extra_setting ) {
			$type = isset( $extra_setting['type'] ) ? $extra_setting['type'] : '';

			if ( empty( $type ) || $name === $type || ( is_array( $type ) && in_array( $name, $type, true ) ) ) {
				foreach ( $extra_setting['tab_data'] as $tab_key => $tab_field ) {
					$id = isset( $tab_field['id'] ) && '' !== $tab_field['id'] ? $tab_field['id'] : false;
					if ( false !== $id ) {
						$extra_setting['tab_data'][ $tab_key ]['id']           = $name . '_' . $id;
						$extra_setting['tab_data'][ $tab_key ]['tags']['id']   = 'builder_' . $extra_setting['tab_data'][ $tab_key ]['id'];
						$extra_setting['tab_data'][ $tab_key ]['tags']['name'] = 'tm_meta[tmfbuilder][' . $extra_setting['tab_data'][ $tab_key ]['id'] . '][]';
					}
				}
				$extra_addon_properties['extra_tabs'][ $extra_setting_key ] = $extra_setting;
			}
		}

		$extra_tabs = array_merge( $extra_tabs, $extra_addon_properties['extra_tabs'] );

		foreach ( $extra_addon_properties['settings'] as $extra_setting_key => $extra_setting ) {
			$id   = isset( $extra_setting['id'] ) && '' !== $extra_setting['id'] ? $extra_setting['id'] : false;
			$type = isset( $extra_setting['type'] ) ? $extra_setting['type'] : '';

			if ( false !== $id && isset( $extra_setting['field'] ) ) {
				if ( empty( $type ) || $name === $type || ( is_array( $type ) && in_array( $name, $type, true ) ) ) {
					$extra_setting['field']['id']           = $name . '_' . $id;
					$extra_setting['field']['tags']['id']   = 'builder_' . $extra_setting['field']['id'];
					$extra_setting['field']['tags']['name'] = 'tm_meta[tmfbuilder][' . $extra_setting['field']['id'] . '][]';

					if ( isset( $extra_setting['tab'] ) && '' !== $extra_setting['tab'] ) {
						if ( is_array( $extra_setting['tab'] ) ) {
							$extra_setting['tab'] = $extra_setting['tab'][0];
						}
						if ( ! isset( $extra_settings_array[ $extra_setting['tab'] ] ) ) {
							$extra_settings_array[ $extra_setting['tab'] ] = [];
						}
						$extra_settings_array[ $extra_setting['tab'] ] = $extra_setting;
						continue;
					}

					if ( isset( $extra_setting['index'] ) ) {
						array_splice( $settings_array, $extra_setting['index'], 0, [ $extra_setting['field'] ] );
					} else {
						$settings_array[] = $extra_setting['field'];
					}
				}
			}
		}

		$settings_array = apply_filters( 'tc_element_settings_override', $settings_array, $name, $is_addon );
		$tabs_override  = apply_filters( 'tc_element_tabs_override', $tabs_override, $name, $settings_array, $is_addon );
		$extra_tabs     = apply_filters( 'wc_epo_admin_add_element_extra_tabs', $extra_tabs, $name, $settings_array, $is_addon );
		$options        = [];

		$epo_tabs_ids = [
			'label_options',
			'conditional_logic',
			'css_settings',
			'woocommerce_settings',
			'repeater_settings',
			'action_settings',
		];

		$epo_tabs            = $this->get_element_tabs( $epo_tabs_ids, $name, $settings_array, $tabs_override, $extra_tabs );
		$tabs_override       = $epo_tabs['tabs_override'];
		$settings_tabs_array = $epo_tabs['settings_tabs_array'];
		$header_names        = $epo_tabs['header_names'];

		foreach ( $settings_tabs_array as $tab => $settings ) {
			foreach ( $settings as $key => $value ) {
				if ( is_array( $value ) && count( $value ) > 2 ) {
					if ( isset( $value['id'] ) ) {
						if ( $is_addon ) {
							$value['id'] = THEMECOMPLETE_EPO_BUILDER()->remove_prefix( $value['id'], $name . '_' );

							THEMECOMPLETE_EPO_BUILDER()->addons_attributes[] = $value['id'];

							$value['id'] = $name . '_' . $value['id'];

							if ( ! isset( $value['tags'] ) ) {
								$value['tags'] = [];
							}
							$value['tags'] = array_merge(
								[
									'id'    => 'builder_' . $value['id'],
									'name'  => 'tm_meta[tmfbuilder][' . $value['id'] . '][]',
									'value' => '',
								],
								$value['tags'],
							);
						}
					}
					$options[ $tab ][] = $value;
				} else {
					$args                  = false;
					$additional_currencies = THEMECOMPLETE_EPO_HELPER()->get_additional_currencies();

					if ( is_array( $value ) && 1 === count( $value ) && isset( $value['_multiple_values'] ) ) {

						foreach ( $value['_multiple_values'] as $mkey => $mvalue ) {
							$r = $this->add_element_helper( $name, $value, $mvalue, $additional_currencies, $is_addon );
							foreach ( $r as $rkey => $rvalue ) {
								$options[ $tab ][] = $rvalue;
							}
						}
					} else {

						if ( is_array( $value ) && 2 === count( $value ) ) {
							$args  = $value[1];
							$value = $value[0];
						}

						$method = apply_filters( 'wc_epo_add_element_method', 'add_setting_' . $value, $key, $value, $name, $settings, $is_addon );

						$class_to_use = apply_filters( 'wc_epo_add_element_class', THEMECOMPLETE_EPO_ADMIN_BUILDER(), $key, $value, $name, $settings, $is_addon );

						if ( is_callable( [ $class_to_use, $method ] ) ) {
							if ( $args ) {
								$_value = $class_to_use->$method( $name, $args );
							} else {
								$_value = $class_to_use->$method( $name );
							}

							if ( isset( $_value['_multiple_values'] ) ) {
								foreach ( $_value['_multiple_values'] as $mkey => $mvalue ) {
									$r = $this->add_element_helper( $name, $value, $mvalue, $additional_currencies, $is_addon );
									foreach ( $r as $rkey => $rvalue ) {
										$options[ $tab ][] = $rvalue;
									}
								}
							} else {
								$r = $this->add_element_helper( $name, $value, $_value, $additional_currencies, $is_addon );
								foreach ( $r as $rkey => $rvalue ) {
									$options[ $tab ][] = $rvalue;
								}
							}
						}
					}
				}
			}
		}

		$counter               = 1;
		$options_array         = [];
		$header_settings_array = [];
		foreach ( $options as $tab => $option ) {
			if ( ! empty( $tabs_override[ $tab ] ) ) {
				++$counter;
				$options_array = array_merge(
					$options_array,
					// add $tab options.
					$this->prepend_div( $name . $counter ),
					apply_filters( 'wc_epo_admin_element_general_options', $option ),
					$this->append_div( $name . $counter )
				);
				if ( 'general_options' === $tab ) {
					$header_name = esc_html__( 'General Options', 'woocommerce-tm-extra-product-options' );
					$header_icon = 'tcfa tcfa-cog';
					$header_slug = 'tma-tab-general';
				} elseif ( isset( $header_names[ $tab ] ) ) {
					$header_name = isset( $header_names[ $tab ]['name'] ) ? $header_names[ $tab ]['name'] : esc_html__( 'General Settings', 'woocommerce-tm-extra-product-options' );
					$header_icon = isset( $header_names[ $tab ]['icon'] ) ? $header_names[ $tab ]['icon'] : 'tcfa tcfa-cog';
					$header_slug = isset( $header_names[ $tab ]['slug'] ) ? $header_names[ $tab ]['slug'] . ' tma-tab-extra' : 'tma-tab-general tma-tab-extra';
				} else {
					$header_name = esc_html__( 'General Settings', 'woocommerce-tm-extra-product-options' );
					$header_icon = 'tcfa tcfa-cog';
					$header_slug = 'tma-tab-general tma-tab-extra';
				}
				$header_settings_array = array_merge(
					$header_settings_array,
					// add $tab options.
					$this->prepend_tab(
						$name . $counter,
						[ $header_icon, $header_name ],
						'closed',
						$header_slug
					)
				);
			}
		}

		$header_data = [];

		$tab_data_array = array_reduce(
			$epo_tabs_ids,
			function ( $carry, $tab ) use ( $name, $counter, $tabs_override ) {
				$function_name = 'generate_' . $tab;
				if ( is_callable( [ $this, $function_name ] ) ) {
					$result                       = $this->$function_name( $name, $counter, $tabs_override );
					$carry['tab_data'][ $tab ]    = $result['tab_data'];
					$carry['header_data'][ $tab ] = $result['header_data'];
				}
				return $carry;
			},
			[
				'tab_data'    => [],
				'header_data' => [],
			]
		);

		$tab_data_array['tab_data'] = array_merge(
			array_slice( $tab_data_array['tab_data'], 0, 1, true ),
			[ 'options' => $options_array ],
			array_slice( $tab_data_array['tab_data'], 1, null, true )
		);

		foreach ( $extra_settings_array as $tab => $extra_setting ) {
			if ( isset( $tab_data_array['tab_data'][ $tab ] ) ) {
				if ( isset( $extra_setting['index'] ) ) {
					array_splice( $tab_data_array['tab_data'][ $tab ], intval( $extra_setting['index'] ) + 1, 0, [ $extra_setting['field'] ] );
				} else {
					array_splice( $tab_data_array['tab_data'][ $tab ], count( $tab_data_array['tab_data'][ $tab ] ) - 1, 0, [ $extra_setting['field'] ] );
				}
			}
		}

		$tab_data = array_reduce(
			$tab_data_array['tab_data'],
			function ( $carry, $sub_array ) {
				return array_merge( $carry, $sub_array );
			},
			[]
		);

		$header_data = $tab_data_array['header_data'];
		$header_data = array_merge(
			array_slice( $header_data, 0, 1, true ),
			[ 'header_settings_array' => $header_settings_array ],
			array_slice( $header_data, 1, null, true )
		);

		$header_data = apply_filters( 'wc_epo_admin_add_element_header_data', $header_data, $name, $tabs_override, $counter );

		$element_data = array_merge(
			$this->prepend_div( '', 'tm-tabs' ),
			// add headers.
			$this->prepend_div( $name, 'tm-tab-headers' ),
			array_reduce(
				$header_data,
				function ( $carry, $sub_array ) {
					return array_merge( $carry, $sub_array );
				},
				[]
			),
			$this->append_div( $name ),
			$tab_data,
			$this->append_div( '' )
		);
		$element_data = apply_filters( 'wc_epo_admin_add_element_element_data', $element_data, $name, $tabs_override, $counter );

		return $element_data;
	}

	/**
	 * Get tax classes
	 *
	 * @since 6.0
	 * @return array<mixed>
	 */
	public function get_tax_classes() {
		// Get tax class options.
		$tax_classes = array_filter( array_map( 'trim', explode( "\n", get_option( 'woocommerce_tax_classes' ) ) ) );
		if ( empty( $tax_classes ) && class_exists( 'WC_Tax' ) ) {
			$tax_classes = WC_Tax::get_tax_classes();
		}
		$classes_options      = [];
		$classes_options['']  = esc_html__( 'Inherit product tax class', 'woocommerce-tm-extra-product-options' );
		$classes_options['@'] = esc_html__( 'Standard', 'woocommerce-tm-extra-product-options' );
		if ( $tax_classes ) {
			foreach ( $tax_classes as $class ) {
				$classes_options[ sanitize_title( $class ) ] = esc_html( $class );
			}
		}
		$classes = [];

		foreach ( $classes_options as $value => $label ) {
			$classes[] = [
				'text'  => esc_html( $label ),
				'value' => esc_attr( $value ),
			];
		}

		return $classes;
	}

	/**
	 * Add element helper
	 *
	 * @param string                $name The element type.
	 * @param mixed                 $value The setting value.
	 * @param array<mixed>          $_value Array of element settings.
	 * @param array<string>|boolean $additional_currencies Additional currencies for the price.
	 * @param boolean               $is_addon If this is an addon element.
	 * @since 6.0
	 * @return array<mixed>
	 */
	private function add_element_helper( $name = '', $value = '', $_value = [], $additional_currencies = false, $is_addon = false ) {

		$return = [];

		if ( 'price' === $value ) {

			if ( ! empty( $additional_currencies ) && is_array( $additional_currencies ) ) {
				$_copy_value      = $_value;
				$_value['label'] .= ' <span class="tm-choice-currency">' . THEMECOMPLETE_EPO_HELPER()->wc_base_currency() . '</span>';
				$return[]         = $_value;
				foreach ( $additional_currencies as $ckey => $currency ) {
					$copy_value           = $_copy_value;
					$copy_value['id']    .= '_' . $currency;
					$copy_value['label'] .= ' <span class="tm-choice-currency">' . $currency . '</span>';
					/* translators: %s the base currency */
					$copy_value['desc']         = sprintf( esc_html__( 'Leave it blank to calculate it automatically from the %s price', 'woocommerce-tm-extra-product-options' ), THEMECOMPLETE_EPO_HELPER()->wc_base_currency() );
					$copy_value['tags']['id']   = 'builder_' . $name . '_price_' . $currency;
					$copy_value['tags']['name'] = 'tm_meta[tmfbuilder][' . $name . '_price_' . $currency . '][]';
					$return[]                   = $copy_value;
				}
			} else {
				$return[] = $_value;
			}
		} elseif ( 'sale_price' === $value ) {

			if ( ! empty( $additional_currencies ) && is_array( $additional_currencies ) ) {
				$_copy_value      = $_value;
				$_value['label'] .= ' <span class="tm-choice-currency">' . THEMECOMPLETE_EPO_HELPER()->wc_base_currency() . '</span>';
				$return[]         = $_value;
				foreach ( $additional_currencies as $ckey => $currency ) {
					$copy_value           = $_copy_value;
					$copy_value['id']    .= '_' . $currency;
					$copy_value['label'] .= ' <span class="tm-choice-currency">' . $currency . '</span>';
					/* translators: %s the base currency */
					$copy_value['desc']         = sprintf( esc_html__( 'Leave it blank to calculate it automatically from the %s sale price', 'woocommerce-tm-extra-product-options' ), THEMECOMPLETE_EPO_HELPER()->wc_base_currency() );
					$copy_value['tags']['id']   = 'builder_' . $name . '_sale_price_' . $currency;
					$copy_value['tags']['name'] = 'tm_meta[tmfbuilder][' . $name . '_sale_price_' . $currency . '][]';
					$return[]                   = $copy_value;
				}
			} else {
				$return[] = $_value;
			}
		} else {
			$return[] = $_value;
		}

		if ( isset( $_value['id'] ) ) {
			if ( $is_addon ) {
				THEMECOMPLETE_EPO_BUILDER()->addons_attributes[] = THEMECOMPLETE_EPO_BUILDER()->remove_prefix( $_value['id'], $name . '_' );
			}
		}

		return $return;
	}

	/**
	 * Show logic select box
	 *
	 * @since 6.0
	 * @return void
	 */
	public function builder_showlogic() {
		?>
		<div class="builder-logic-div">
			<div class="builder-logic-div-what">
				<div class="tc-row nopadding">
					<select class="epo-rule-toggle">
						<option value="show"><?php esc_html_e( 'Show', 'woocommerce-tm-extra-product-options' ); ?></option>
						<option value="hide"><?php esc_html_e( 'Hide', 'woocommerce-tm-extra-product-options' ); ?></option>
					</select>
					<span>
					<?php
					if ( 'section' === $this->element_name ) {
						esc_html_e( 'this section if the following conditions are met.', 'woocommerce-tm-extra-product-options' );
					} else {
						esc_html_e( 'this field if the following conditions are met.', 'woocommerce-tm-extra-product-options' );
					}
					?>
					</span>
				</div>
			</div>
			<div class="tm-logic-wrapper"></div>
			<button type="button" class="tc tc-button alt tm-logic-add-rule-set"><span class="tmicon tcfa tcfa-plus"></span> <?php esc_html_e( 'Add new condition group', 'woocommerce-tm-extra-product-options' ); ?></button>
		</div>
		<?php
	}

	/**
	 * Show logic select box
	 *
	 * @since 6.0
	 * @return void
	 */
	public function shipping_showlogic() {
		?>
		<div class="shipping-logic-div">
			<div class="tm-logic-wrapper"></div>
			<button type="button" class="tc tc-button alt tm-logic-add-rule-set"><span class="tmicon tcfa tcfa-plus"></span> <?php esc_html_e( 'Add new condition group', 'woocommerce-tm-extra-product-options' ); ?></button>
		</div>
		<?php
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-color.php000064400000002715150755142450023071 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Color picker Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_COLOR extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Color picker', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-palette';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'color';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type6',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'default_value',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-header.php000064400000017223150755142450023203 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Heading Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.0
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_HEADER extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.4
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Heading', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-heading';
		$this->is_post          = 'display';
		$this->type             = '';
		$this->post_name_prefix = 'header';
		$this->fee_type         = '';
		$this->tags             = 'content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = array_merge(
			$this->prepend_div( '', 'tm-tabs' ),
			$this->prepend_div( 'header', 'tm-tab-headers' ),
			$this->prepend_tab( 'header2', esc_html__( 'General Options', 'woocommerce-tm-extra-product-options' ), 'open' ),
			$this->prepend_tab( 'header3', esc_html__( 'Conditional Logic', 'woocommerce-tm-extra-product-options' ) ),
			$this->prepend_tab( 'header4', esc_html__( 'CSS Settings', 'woocommerce-tm-extra-product-options' ) ),
			$this->append_div( 'header' ),
			$this->prepend_div( 'header2' ),
			[
				[
					'id'          => 'header_size',
					'wpmldisable' => 1,
					'default'     => '3',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_header_size',
						'name' => 'tm_meta[tmfbuilder][header_size][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'H1', 'woocommerce-tm-extra-product-options' ),
							'value' => '1',
						],
						[
							'text'  => esc_html__( 'H2', 'woocommerce-tm-extra-product-options' ),
							'value' => '2',
						],
						[
							'text'  => esc_html__( 'H3', 'woocommerce-tm-extra-product-options' ),
							'value' => '3',
						],
						[
							'text'  => esc_html__( 'H4', 'woocommerce-tm-extra-product-options' ),
							'value' => '4',
						],
						[
							'text'  => esc_html__( 'H5', 'woocommerce-tm-extra-product-options' ),
							'value' => '5',
						],
						[
							'text'  => esc_html__( 'H6', 'woocommerce-tm-extra-product-options' ),
							'value' => '6',
						],
						[
							'text'  => esc_html__( 'p', 'woocommerce-tm-extra-product-options' ),
							'value' => '7',
						],
						[
							'text'  => esc_html__( 'div', 'woocommerce-tm-extra-product-options' ),
							'value' => '8',
						],
						[
							'text'  => esc_html__( 'span', 'woocommerce-tm-extra-product-options' ),
							'value' => '9',
						],
					],
					'label'       => esc_html__( 'Header type', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
				],
				[
					'id'      => 'header_title',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't tm-header-title',
						'id'    => 'builder_header_title',
						'name'  => 'tm_meta[tmfbuilder][header_title][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Header title', 'woocommerce-tm-extra-product-options' ),
					'desc'    => '',
				],
				[
					'id'          => 'header_title_position',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_header_title_position',
						'name' => 'tm_meta[tmfbuilder][header_title_position][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => esc_html__( 'Left of the Content', 'woocommerce-tm-extra-product-options' ),
							'value' => 'left',
						],
						[
							'text'  => esc_html__( 'Right of the Content', 'woocommerce-tm-extra-product-options' ),
							'value' => 'right',
						],
						[
							'text'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
							'value' => 'disable',
						],
					],
					'label'       => esc_html__( 'Header position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
				],
				[
					'id'          => 'header_title_color',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 'tm-color-picker',
						'id'    => 'builder_header_title_color',
						'name'  => 'tm_meta[tmfbuilder][header_title_color][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Header color', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'      => 'header_subtitle',
					'default' => '',
					'type'    => 'textarea',
					'tags'    => [
						'id'   => 'builder_header_subtitle',
						'name' => 'tm_meta[tmfbuilder][header_subtitle][]',
					],
					'label'   => esc_html__( 'Content', 'woocommerce-tm-extra-product-options' ),
					'desc'    => '',
				],
				[
					'id'          => 'header_subtitle_color',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'text',
					'tags'        => [
						'class' => 'tm-color-picker',
						'id'    => 'builder_header_subtitle_color',
						'name'  => 'tm_meta[tmfbuilder][header_subtitle_color][]',
						'value' => '',
					],
					'label'       => esc_html__( 'Content color', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Leave empty for default value', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'header_subtitle_position',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'id'   => 'builder_header_subtitle_position',
						'name' => 'tm_meta[tmfbuilder][header_subtitle_position][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ),
							'value' => '',
						],
						[
							'text'  => esc_html__( 'Above Header', 'woocommerce-tm-extra-product-options' ),
							'value' => 'above',
						],
						[
							'text'  => esc_html__( 'Tooltip', 'woocommerce-tm-extra-product-options' ),
							'value' => 'tooltip',
						],
						[
							'text'  => esc_html__( 'Icon tooltip left', 'woocommerce-tm-extra-product-options' ),
							'value' => 'icontooltipleft',
						],
						[
							'text'  => esc_html__( 'Icon tooltip right', 'woocommerce-tm-extra-product-options' ),
							'value' => 'icontooltipright',
						],
					],
					'label'       => esc_html__( 'Content position', 'woocommerce-tm-extra-product-options' ),
					'desc'        => '',
				],
			],
			$this->append_div( 'header2' ),
			$this->prepend_div( 'header3' ),
			$this->prepend_logic( 'header' ),
			$this->append_div( 'header3' ),
			$this->prepend_div( 'header4' ),
			[
				[
					'id'      => 'header_class',
					'default' => '',
					'type'    => 'text',
					'tags'    => [
						'class' => 't',
						'id'    => 'builder_header_class',
						'name'  => 'tm_meta[tmfbuilder][header_class][]',
						'value' => '',
					],
					'label'   => esc_html__( 'Element class name', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Enter an extra class name to add to this element', 'woocommerce-tm-extra-product-options' ),
				],
			],
			$this->append_div( 'header4' ),
			$this->append_div( '' )
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-variations.php000064400000002561150755142450024131 0ustar00<?php
/**
 * Builder Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Variations Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_VARIATIONS extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Variations', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-layer-group';
		$this->is_post          = 'display';
		$this->type             = 'multiplesingle';
		$this->post_name_prefix = 'variations';
		$this->fee_type         = '';
		$this->one_time_field   = true;
		$this->no_selection     = true;
		$this->tags             = '';
		$this->show_on_backend  = false;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'variations_disabled',
				'variations_options',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-multiple-file-upload.php000064400000002773150755142450026011 0ustar00<?php
/**
 * Multiple Upload Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4.2
 */

defined( 'ABSPATH' ) || exit;

/**
 * Multiple Upload Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4.2
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_MULTIPLE_FILE_UPLOAD extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.4.2
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Multiple Upload', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-upload';
		$this->is_post          = 'post';
		$this->type             = 'multipleallsingle';
		$this->post_name_prefix = 'multiple_file_upload';
		$this->fee_type         = 'multiple';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.4.2
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type5',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'button_type',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-textfield.php000064400000003517150755142450023744 0ustar00<?php
/**
 * Textfield Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Textfield Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_TEXTFIELD extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Text Field', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-i-cursor';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'textfield';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type2',
				'lookuptable',
				'freechars',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'quantity',
				'placeholder',
				'min_chars',
				'max_chars',
				'default_value',
				'min',
				'max',
				[
					'rangestep',
					[
						'desc'     => esc_html__( 'Enter the step.', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.tc-validateas' => [
								'operator' => 'is',
								'value'    => 'number',
							],
						],
					],
				],
				'validation1',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-upload.php000064400000002657150755142450023244 0ustar00<?php
/**
 * Upload Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Upload Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_UPLOAD extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Upload', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-upload';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'upload';
		$this->fee_type         = 'single';
		$this->tags             = 'price content';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				'required',
				'price_type5',
				'lookuptable',
				'price',
				'sale_price',
				'fee',
				'hide_amount',
				'text_before_price',
				'text_after_price',
				'button_type',
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-template.php000064400000006133150755142450023564 0ustar00<?php
/**
 * Template Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Template Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_TEMPLATE extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.0
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Template', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-shapes';
		$this->is_post          = 'display';
		$this->type             = 'template';
		$this->post_name_prefix = 'template';
		$this->fee_type         = '';
		$this->tags             = 'content';
		$this->show_on_backend  = true;
	}

	/**
	 * Fetch templates
	 * for use in a select box
	 *
	 * @since 5.0
	 * @return array<mixed>
	 */
	public function fetch_template_array() {
		$list = [];
		// for default value to be empty.
		$list[] = [
			'text'  => '',
			'value' => '',
		];

		$args = [
			'post_type'   => THEMECOMPLETE_EPO_TEMPLATE_POST_TYPE,
			'post_status' => [ 'publish' ], // get only enabled global extra options.
			'numberposts' => -1,
			'orderby'     => 'date',
			'order'       => 'asc',
		];

		THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
		THEMECOMPLETE_EPO_WPML()->remove_term_filters();
		$templates = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
		THEMECOMPLETE_EPO_WPML()->restore_term_filters();
		THEMECOMPLETE_EPO_WPML()->restore_sql_filter();

		foreach ( $templates as $template ) {
			$list[] = [
				'text'  => $template->post_title,
				'value' => $template->ID,
			];
		}

		return $list;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.0
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',

				[
					'id'          => 'template_templateids',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'select',
					'tags'        => [
						'data-placeholder' => esc_attr__( 'Select a template ...', 'woocommerce-tm-extra-product-options' ),
						'class'            => 'wc-template-search template-templates-selector',
						'id'               => 'builder_template_templateids',
						'name'             => 'tm_meta[tmfbuilder][template_templateids][]',
					],
					'options'     => $this->fetch_template_array(),
					'label'       => esc_html__( 'Select template', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Add the template you want to display.', 'woocommerce-tm-extra-product-options' ),
				],
			],
			false,
			[
				'label_options'        => 0,
				'general_options'      => 1,
				'advanced_options'     => 0,
				'conditional_logic'    => 1,
				'css_settings'         => 0,
				'woocommerce_settings' => 0,
			]
		);
	}
}
includes/classes/builder/class-themecomplete-epo-builder-element-dynamic.php000064400000014531150755142450023376 0ustar00<?php
/**
 * Dynamic Calculations Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4.3
 */

defined( 'ABSPATH' ) || exit;

/**
 * Dynamic Calculations Element
 *
 * @package Extra Product Options/Classes/Builder
 * @version 6.4.3
 */
class THEMECOMPLETE_EPO_BUILDER_ELEMENT_DYNAMIC extends THEMECOMPLETE_EPO_BUILDER_ELEMENT {

	/**
	 * Class Constructor
	 *
	 * @param string $name The element name.
	 * @since 6.4.3
	 */
	public function __construct( $name = '' ) {
		$this->element_name     = $name;
		$this->is_addon         = false;
		$this->namespace        = $this->elements_namespace;
		$this->name             = esc_html__( 'Dynamic Calculations', 'woocommerce-tm-extra-product-options' );
		$this->description      = '';
		$this->width            = 'w100';
		$this->width_display    = '100%';
		$this->icon             = 'tcfa-calculator';
		$this->is_post          = 'post';
		$this->type             = 'single';
		$this->post_name_prefix = 'dynamic';
		$this->fee_type         = 'single';
		$this->tags             = 'price content dynamic';
		$this->show_on_backend  = true;
	}

	/**
	 * Initialize element properties
	 *
	 * @since 6.4.3
	 * @return void
	 */
	public function set_properties() {
		$this->properties = $this->add_element(
			$this->element_name,
			[
				'enabled',
				[
					'id'          => 'dynamic_mode',
					'wpmldisable' => 1,
					'default'     => 'calculation',
					'type'        => 'select',
					'tags'        => [
						'class' => 'dynamic-mode',
						'id'    => 'builder_dynamic_mode',
						'name'  => 'tm_meta[tmfbuilder][dynamic_mode][]',
					],
					'options'     => [
						[
							'text'  => esc_html__( 'Calculation result', 'woocommerce-tm-extra-product-options' ),
							'value' => 'calculation',
						],
						[
							'text'  => esc_html__( 'Override product price', 'woocommerce-tm-extra-product-options' ),
							'value' => 'override_product_price',
						],
						[
							'text'  => esc_html__( 'Set native product price', 'woocommerce-tm-extra-product-options' ),
							'value' => 'dynamic_product_price',
						],
						[
							'text'  => esc_html__( 'Change product weight', 'woocommerce-tm-extra-product-options' ),
							'value' => 'change_product_weight',
						],
					],
					'label'       => esc_html__( 'Action mode', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'Choose the desired action mode for this element.', 'woocommerce-tm-extra-product-options' ),
				],
				[
					'id'          => 'dynamic_hide',
					'wpmldisable' => 1,
					'default'     => '1',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'class' => 'dynamic-hide',
						'id'    => 'builder_dynamic_hide',
						'name'  => 'tm_meta[tmfbuilder][dynamic_hide][]',
					],
					'label'       => esc_html__( 'Hide calculation result', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'When activated, the plugin hides the outcome of the calculation.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.dynamic-mode' => [
							'operator' => 'isnot',
							'value'    => 'dynamic_product_price',
						],
					],
				],
				[
					'id'          => 'dynamic_result_as_price',
					'wpmldisable' => 1,
					'default'     => '',
					'type'        => 'checkbox',
					'tags'        => [
						'value' => '1',
						'class' => 'dynamic-result-as-price',
						'id'    => 'builder_dynamic_result_as_price',
						'name'  => 'tm_meta[tmfbuilder][dynamic_result_as_price][]',
					],
					'label'       => esc_html__( 'Display calculation result as price', 'woocommerce-tm-extra-product-options' ),
					'desc'        => esc_html__( 'When activated, the the outcome of the calculation is displayed as a price.', 'woocommerce-tm-extra-product-options' ),
					'required'    => [
						'.dynamic-mode' => [
							'operator' => 'is',
							'value'    => 'calculation',
						],
						'.dynamic-hide' => [
							'operator' => 'isnot',
							'value'    => '1',
						],
					],
				],
				'price_type_dynamic',
				'lookuptable',
				[
					'price',
					[
						'label' => esc_html__( 'Formula', 'woocommerce-tm-extra-product-options' ),
						'desc'  => esc_html__( 'Enter the formula for the calculation.', 'woocommerce-tm-extra-product-options' ),
					],
				],
				[
					'id'       => 'dynamic_result_label',
					'default'  => '',
					'type'     => 'text',
					'tags'     => [
						'class' => 't',
						'id'    => 'builder_dynamic_result_label',
						'name'  => 'tm_meta[tmfbuilder][dynamic_result_label][]',
						'value' => '',
					],
					'label'    => esc_html__( 'Result Display Label', 'woocommerce-tm-extra-product-options' ),
					'desc'     => esc_html__( 'Enter the text to show next to the calculation result on the page.', 'woocommerce-tm-extra-product-options' ),
					'required' => [
						'.dynamic-hide' => [
							'operator' => 'isnot',
							'value'    => '1',
						],
						'.dynamic-mode' => [
							'operator' => 'isnot',
							'value'    => 'dynamic_product_price',
						],
					],
				],
				[
					'text_before_price',
					[
						'label'    => esc_html__( 'Text before result', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Enter a text to display before the calculation result or leave it blank for no text.', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.dynamic-hide' => [
								'operator' => 'isnot',
								'value'    => '1',
							],
							'.dynamic-mode' => [
								'operator' => 'isnot',
								'value'    => 'dynamic_product_price',
							],
						],
					],
				],
				[
					'text_after_price',
					[
						'label'    => esc_html__( 'Text after result', 'woocommerce-tm-extra-product-options' ),
						'desc'     => esc_html__( 'Enter a text to display after the calculation result or leave it blank for no text.', 'woocommerce-tm-extra-product-options' ),
						'required' => [
							'.dynamic-hide' => [
								'operator' => 'isnot',
								'value'    => '1',
							],
							'.dynamic-mode' => [
								'operator' => 'isnot',
								'value'    => 'dynamic_product_price',
							],
						],
					],
				],
			],
			false,
			[
				'label_options'        => 1,
				'general_options'      => 1,
				'conditional_logic'    => 1,
				'css_settings'         => 0,
				'woocommerce_settings' => 0,
				'repeater_settings'    => 0,
				'action_settings'      => 1,
			],
		);
	}
}
includes/classes/class-themecomplete-epo-settings-base.php000064400000337413150755142450020030 0ustar00<?php
/**
 * Extra Product Options Settings class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Settings class
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_SETTINGS_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_SETTINGS_Base|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_SETTINGS_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
	}

	/**
	 * Get settings array
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function create_setting( $setting, $label ) {
		$method = 'get_setting_' . $setting;
		if ( is_callable( [ $this, $method ] ) ) {
			// This may return undefined function wp_get_current_user() when it is used without @ on some configurations.
			$settings = $this->$method( $setting, $label );
			if ( ! is_array( $settings ) ) {
				$settings = [];
			}
			foreach ( $settings as $key => $setting_array ) {
				if ( isset( $setting_array['desc'] ) && '' !== $setting_array['desc'] ) {
					$settings[ $key ]['desc'] = '<span class="description">' . $setting_array['desc'] . '</span>';
				}
			}
			$settings = apply_filters( 'tm_epo_settings_' . $setting, $settings );

			return $settings;
		}

		return [];
	}

	/**
	 * Set settings categories
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function settings_options() {
		$settings_options = [
			'general'  => [ 'tcfa tcfa-cog', esc_html__( 'General', 'woocommerce-tm-extra-product-options' ) ],
			'display'  => [ 'tcfa tcfa-tv', esc_html__( 'Display', 'woocommerce-tm-extra-product-options' ) ],
			'cart'     => [ 'tcfa tcfa-shopping-cart', esc_html__( 'Cart', 'woocommerce-tm-extra-product-options' ) ],
			'order'    => [ 'tcfa tcfa-truck-pickup', esc_html__( 'Order', 'woocommerce-tm-extra-product-options' ) ],
			'string'   => [ 'tcfa tcfa-font', esc_html__( 'Strings', 'woocommerce-tm-extra-product-options' ) ],
			'style'    => [ 'tcfa tcfa-border-style', esc_html__( 'Style', 'woocommerce-tm-extra-product-options' ) ],
			'global'   => [ 'tcfa tcfa-globe', esc_html__( 'Global', 'woocommerce-tm-extra-product-options' ) ],
			'elements' => [ 'tcfa tcfa-shapes', esc_html__( 'Elements', 'woocommerce-tm-extra-product-options' ) ],
			'upload'   => [ 'tcfa tcfa-cloud-upload-alt', esc_html__( 'Upload manager', 'woocommerce-tm-extra-product-options' ) ],
			'code'     => [ 'tcfa tcfa-code', esc_html__( 'Custom code', 'woocommerce-tm-extra-product-options' ) ],
			'math'     => [ 'tcfa tcfa-square-root-alt', esc_html__( 'Math Formula Constants', 'woocommerce-tm-extra-product-options' ) ],
			'other'    => 'other',
			'license'  => [ 'tcfa tcfa-id-badge', esc_html__( 'License', 'woocommerce-tm-extra-product-options' ) ],
		];

		return $settings_options;
	}

	/**
	 * Get plugin settings
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function plugin_settings() {
		$settings = [];
		$o        = $this->settings_options();
		$ids      = [];
		foreach ( $o as $key => $value ) {
			$settings[ $key ] = $this->create_setting( $key, $value );
		}

		foreach ( $settings as $key => $value ) {
			foreach ( $value as $key2 => $value2 ) {
				if ( isset( $value2['id'] ) && isset( $value2['default'] ) && 'epo_page_options' !== $value2['id'] ) {
					$ids[ $value2['id'] ] = $value2['default'];
				}
			}
		}

		return $ids;
	}

	/**
	 * Get "other" settings header
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_other_settings_headers() {
		$headers = [];

		return apply_filters( 'tm_epo_settings_headers', $headers );
	}

	/**
	 * Get "other" settings
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_other_settings() {
		$settings = [];

		return apply_filters( 'tm_epo_settings_settings', $settings );
	}

	/**
	 * Populate order post types setting
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	private function get_order_post_types() {
		$tm_epo_order_post_types_default = [
			'shop_order_placehold' => esc_html__( 'Shop order (HPOS)', 'woocommerce-tm-extra-product-options' ),
			'shop_order'           => esc_html__( 'Shop order', 'woocommerce-tm-extra-product-options' ),
		];
		$tm_epo_order_post_types         = get_option( 'tm_epo_order_post_types' );
		if ( ! is_array( $tm_epo_order_post_types ) ) {
			$tm_epo_order_post_types = $tm_epo_order_post_types_default;
		} else {
			$tm_epo_order_post_types = array_combine( $tm_epo_order_post_types, $tm_epo_order_post_types );
		}

		$tm_epo_order_post_types = apply_filters( 'tm_epo_order_post_types', $tm_epo_order_post_types );

		$tm_epo_order_post_types = array_unique( array_merge( $tm_epo_order_post_types, $tm_epo_order_post_types_default ) );
		return $tm_epo_order_post_types;
	}

	/**
	 * Get a compatibley default value
	 *
	 * @param string $setting The name of the setting.
	 * @param mixed  $default_value The default value of the setting.
	 * @return mixed
	 * @since 6.4
	 */
	public function get_compatibility_value( $setting, $default_value ) {
		switch ( $setting ) {
			case 'tm_epo_change_original_price':
				$tm_epo_final_total_box = get_option( 'tm_epo_final_total_box' );
				if ( 'disable_change' === $tm_epo_final_total_box ) {
					$default_value = 'yes';
				}
				break;
			case 'override_final_total_box':
				if ( in_array( $default_value, [ 'disable', 'disable_change', 'hide' ], true ) ) {
					$default_value = 'disable';
				} elseif ( in_array( $default_value, [ 'normal', 'options', 'optionsiftotalnotzero', 'final', 'hideoptionsifzero', 'pxq' ], true ) ) {
					$default_value = 'enable';
				}
				break;
			case 'tm_epo_final_total_box':
				$tm_epo_final_total_box = get_option( 'tm_epo_final_total_box' );
				if ( in_array( $tm_epo_final_total_box, [ 'disable', 'disable_change', 'hide' ], true ) ) {
					$default_value = 'disable';
				} elseif ( in_array( $tm_epo_final_total_box, [ 'normal', 'options', 'optionsiftotalnotzero', 'final', 'hideoptionsifzero', 'pxq' ], true ) ) {
					$default_value = 'enable';
				}
				break;
			case 'tm_epo_show_final_total':
				$tm_epo_final_total_box = get_option( 'tm_epo_final_total_box' );
				if ( in_array( $tm_epo_final_total_box, [ 'disable', 'disable_change', 'optionsiftotalnotzero', 'options', 'hide' ], true ) ) {
					$default_value = 'hide';
				} elseif ( in_array( $tm_epo_final_total_box, [ 'hideiftotaliszero', 'hideifoptionsiszero', 'pxq', 'final', 'hideoptionsifzero', 'normal', 'hideifoptionsiszero', 'hideiftotaliszero' ], true ) ) {
					$default_value = 'show';
				}
				break;
			case 'tm_epo_show_options_total':
				$tm_epo_final_total_box = get_option( 'tm_epo_final_total_box' );
				if ( in_array( $tm_epo_final_total_box, [ 'hideoptionsifzero', 'optionsiftotalnotzero' ], true ) ) {
					$default_value = 'showtgz';
				} elseif ( in_array( $tm_epo_final_total_box, [ 'options', 'normal', 'hideifoptionsiszero', 'hideiftotaliszero' ], true ) ) {
					$default_value = 'show';
				} elseif ( in_array( $tm_epo_final_total_box, [ 'disable', 'disable_change', 'pxq', 'final', 'hide' ], true ) ) {
					$default_value = 'hide';
				}
				break;

		}
		return $default_value;
	}

	/**
	 * General settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_general( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'desc'  => '<span tabindex="0" data-menu="tcinit" class="tm-section-menu-item">' . esc_html__( 'Initialization', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcftb" class="tm-section-menu-item">' . esc_html__( 'Final total box', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcvarious" class="tm-section-menu-item">' . esc_html__( 'Various', 'woocommerce-tm-extra-product-options' ) . '</span>',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Enable Frontend Access for Selected Roles', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the roles that will have access to the extra options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_roles_enabled',
				'class'   => 'tcinit chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '@everyone',
				'type'    => 'multiselect',
				'options' => themecomplete_get_roles(),
			],
			[
				'title'   => esc_html__( 'Disable Frontend Access for Selected Roles', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the roles that will not have access to the extra options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_roles_disabled',
				'class'   => 'tcinit chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'multiselect',
				'options' => themecomplete_get_roles(),
			],
			[
				'title'   => esc_html__( 'Enable translations', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will enable the default plugin translation using the pot files.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_translations',
				'class'   => 'tcinit',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'       => esc_html__( 'Post type hook priority', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Do not change this unless you know how it will affect your site! This is the priority which the post types are loaded by the plugin.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_post_type_hook_priority',
				'placeholder' => esc_html__( 'Default value is 100', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcinit',
				'type'        => 'text',
			],
			[
				'title'   => esc_html__( 'Plugin Loading Areas', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Specify the areas where the plugin will be activated.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_loading_areas',
				'class'   => 'tcinit chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'woocommerce',
				'type'    => 'multiselect',
				'options' => [
					'everywhere'          => esc_html__( 'Everywhere', 'woocommerce-tm-extra-product-options' ),
					'shop'                => esc_html__( 'Shop', 'woocommerce-tm-extra-product-options' ),
					'product_category'    => esc_html__( 'Product Categories', 'woocommerce-tm-extra-product-options' ),
					'product_taxonomy'    => esc_html__( 'Product Taxonomies', 'woocommerce-tm-extra-product-options' ),
					'product_tag'         => esc_html__( 'Product Tags', 'woocommerce-tm-extra-product-options' ),
					'product'             => esc_html__( 'Product', 'woocommerce-tm-extra-product-options' ),
					'cart'                => esc_html__( 'Cart', 'woocommerce-tm-extra-product-options' ),
					'checkout'            => esc_html__( 'Checkout', 'woocommerce-tm-extra-product-options' ),
					'order_received_page' => esc_html__( 'Order Received Page', 'woocommerce-tm-extra-product-options' ),
					'account_page'        => esc_html__( 'My Account Page', 'woocommerce-tm-extra-product-options' ),
					'woocommerce'         => esc_html__( 'WooCommerce Pages', 'woocommerce-tm-extra-product-options' ),
					'quickview'           => esc_html__( 'Supported Quickview Solutions', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Final Total Box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this setting to display a Final Total Box on the product page, allowing customers to view the total cost of their order, or disable it for a simplified product page.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_final_total_box',
				'class'   => 'tcftb chosen_select',
				'css'     => 'min-width:300px;',
				'default' => $this->get_compatibility_value( 'tm_epo_show_final_total', 'enable' ),
				'type'    => 'select',
				'options' => [
					'enable'              => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
					'disable'             => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'hideifoptionsiszero' => esc_html__( 'Disable if Options total is zero', 'woocommerce-tm-extra-product-options' ),
					'hideiftotaliszero'   => esc_html__( 'Disable if total is zero', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Show Options Total', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable to display the total specifically for selected product options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_options_total',
				'class'   => 'tcftb chosen_select',
				'css'     => 'min-width:300px;',
				'default' => $this->get_compatibility_value( 'tm_epo_show_options_total', 'show' ),
				'type'    => 'select',
				'options' => [
					'show'    => esc_html__( 'Show', 'woocommerce-tm-extra-product-options' ),
					'hide'    => esc_html__( 'Hide', 'woocommerce-tm-extra-product-options' ),
					'showtgz' => esc_html__( 'Show when the total is greater than zero', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Show Final Total', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable to display the comprehensive product total, providing customers with a clear overview of the overall cost.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_final_total',
				'class'   => 'tcftb chosen_select',
				'css'     => 'min-width:300px;',
				'default' => $this->get_compatibility_value( 'tm_epo_show_final_total', 'show' ),
				'type'    => 'select',
				'options' => [
					'show' => esc_html__( 'Show', 'woocommerce-tm-extra-product-options' ),
					'hide' => esc_html__( 'Hide', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Enable Final total box for all products', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Show the Final total box even when the product has no extra options', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_final_total_box_all',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Enable original final total display', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the display of the undiscounted final total', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_original_final_total',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			( 'yes' === get_option( 'woocommerce_calc_taxes' ) ) ?
			[
				'title'   => esc_html__( 'Enable options VAT display', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to display the options VAT amount above the options total', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_vat_options_total',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			] : [],
			[
				'title'   => esc_html__( 'Show Unit price on totals box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to display the unit price when the totals box is visible', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_unit_price',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Include Fees on unit price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to add any Fees to the unit price', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_fees_on_unit_price',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Total price as Unit Price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Make the total price not being multiplied by the product quantity', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_total_price_as_unit_price',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide Final total box until an element is chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the Final total box only when at least one option is filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_totals_until_any',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide Final total box until all required elements are chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the Final total box only when all required visible options are filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_totals_until_all_required',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide Final total box until all elements are chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the Final total box only when all visible options are filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_totals_until_all',
				'class'   => 'tcftb',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Disable lazy load images', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to disable lazy loading images.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_no_lazy_load',
				'default' => 'yes',
				'class'   => 'tcvarious',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Preload lightbox images', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to preload the image when using the lightbox feature.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_preload_lightbox_image',
				'default' => 'no',
				'class'   => 'tcvarious',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Enable plugin for WooCommerce shortcodes', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will load the plugin files to all WordPress pages. Use with caution.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_shortcodes',
				'default' => 'no',
				'class'   => 'tcvarious',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Enable shortcodes in options strings', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will allow the use of shortcodes and HTML code in the options label and description text.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_data_shortcodes',
				'default' => 'yes',
				'class'   => 'tcvarious',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];
	}

	/**
	 * Display settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_display( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'desc'  => '<span tabindex="0" data-menu="tcdisplay" class="tm-section-menu-item">' . esc_html__( 'Display', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcplacement" class="tm-section-menu-item">' . esc_html__( 'Placement', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcprice" class="tm-section-menu-item">' . esc_html__( 'Price', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcftbox" class="tm-section-menu-item">' . esc_html__( 'Floating Totals box', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcaddtocartbutton" class="tm-section-menu-item">' . esc_html__( 'Add to cart button', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcanimation" class="tm-section-menu-item">' . esc_html__( 'Animation', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcvarious2" class="tm-section-menu-item">' . esc_html__( 'Various', 'woocommerce-tm-extra-product-options' ) . '</span>',

				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Display', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This controls how your fields are displayed on the front-end. If you choose "Show using action hooks" you have to manually write the code to your theme or plugin to display the fields and the placement settings below will not work. If you use the Composite Products extension you must leave this setting to "Normal" otherwise the extra options cannot be displayed on the composite product bundles. See more at the documentation.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_display',
				'class'   => 'tcdisplay chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'normal',
				'type'    => 'select',
				'options' => [
					'normal' => esc_html__( 'Normal', 'woocommerce-tm-extra-product-options' ),
					'action' => esc_html__( 'Show using action hooks', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Extra Options placement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select where you want the extra options to appear.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_options_placement',
				'class'   => 'tcplacement chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'woocommerce_before_add_to_cart_button',
				'type'    => 'select',
				'options' => [
					'woocommerce_before_add_to_cart_button' => esc_html__( 'Before add to cart button', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_add_to_cart_button' => esc_html__( 'After add to cart button', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_add_to_cart_form'  => esc_html__( 'Before cart form', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_add_to_cart_form'   => esc_html__( 'After cart form', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_single_product'    => esc_html__( 'Before product', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_single_product'     => esc_html__( 'After product', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_single_product_summary' => esc_html__( 'Before product summary', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_single_product_summary' => esc_html__( 'After product summary', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_product_thumbnails'       => esc_html__( 'After product image', 'woocommerce-tm-extra-product-options' ),

					'custom'                               => esc_html__( 'Custom hook', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Extra Options placement custom hook', 'woocommerce-tm-extra-product-options' ),
				'desc'    => '',
				'class'   => 'tcplacement',
				'id'      => 'tm_epo_options_placement_custom_hook',
				'default' => '',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Extra Options placement hook priority', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the Extra Options placement hook priority', 'woocommerce-tm-extra-product-options' ),
				'class'   => 'tcplacement',
				'id'      => 'tm_epo_options_placement_hook_priority',
				'default' => '50',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Totals box placement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select where you want the Totals box to appear.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_totals_box_placement',
				'class'   => 'tcplacement chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'woocommerce_before_add_to_cart_button',
				'type'    => 'select',
				'options' => [
					'woocommerce_before_add_to_cart_button' => esc_html__( 'Before add to cart button', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_add_to_cart_button' => esc_html__( 'After add to cart button', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_add_to_cart_form'  => esc_html__( 'Before cart form', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_add_to_cart_form'   => esc_html__( 'After cart form', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_single_product'    => esc_html__( 'Before product', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_single_product'     => esc_html__( 'After product', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_before_single_product_summary' => esc_html__( 'Before product summary', 'woocommerce-tm-extra-product-options' ),
					'woocommerce_after_single_product_summary' => esc_html__( 'After product summary', 'woocommerce-tm-extra-product-options' ),

					'woocommerce_product_thumbnails'       => esc_html__( 'After product image', 'woocommerce-tm-extra-product-options' ),

					'custom'                               => esc_html__( 'Custom hook', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Totals box placement custom hook', 'woocommerce-tm-extra-product-options' ),
				'desc'    => '',
				'class'   => 'tcplacement',
				'id'      => 'tm_epo_totals_box_placement_custom_hook',
				'default' => '',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Totals box placement hook priority', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the Totals box placement hook priority', 'woocommerce-tm-extra-product-options' ),
				'class'   => 'tcplacement',
				'id'      => 'tm_epo_totals_box_placement_hook_priority',
				'default' => '50',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Floating Totals box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will enable a floating box to display your totals box.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_floating_totals_box',
				'class'   => 'tcftbox chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'disable',
				'type'    => 'select',
				'options' => [
					'disable'      => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'bottom right' => esc_html__( 'Bottom right', 'woocommerce-tm-extra-product-options' ),
					'bottom left'  => esc_html__( 'Bottom left', 'woocommerce-tm-extra-product-options' ),
					'top right'    => esc_html__( 'Top right', 'woocommerce-tm-extra-product-options' ),
					'top left'     => esc_html__( 'Top left', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Floating Totals box visibility', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This determines the floating totals box visibility.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_floating_totals_box_visibility',
				'class'   => 'tcftbox chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'always',
				'type'    => 'select',
				'options' => [
					'always'          => esc_html__( 'Always visible', 'woocommerce-tm-extra-product-options' ),
					'afterscroll'     => esc_html__( 'Visble after scrolling the page', 'woocommerce-tm-extra-product-options' ),
					'hideafterscroll' => esc_html__( 'Hide after scrolling the page', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Pixels amount needed to scroll', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the number of pixels the page needs to scroll for the floating totals to become visible.', 'woocommerce-tm-extra-product-options' ),
				'class'   => 'tcftbox',
				'id'      => 'tm_epo_floating_totals_box_pixels',
				'default' => '100',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Add to cart button on floating totals box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Display the add to cart button on floating box.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_floating_totals_box_add_button',
				'default' => 'no',
				'class'   => 'tcftbox',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Change original product price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to overwrite the original product price when the price is changing.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_change_original_price',
				'default' => $this->get_compatibility_value( 'tm_epo_change_original_price', 'no' ),
				'class'   => 'tcprice',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Change variation price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to overwrite the variation price when the price is changing.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_change_variation_price',
				'default' => 'no',
				'class'   => 'tcprice',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Force Select Options', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This changes the add to cart button on shop and archive pages to display select options when the product has extra product options. Enabling this will remove the ajax functionality.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_force_select_options',
				'class'   => 'tcdisplay',
				'css'     => 'min-width:300px;',
				'default' => 'no',
				'type'    => 'checkbox',
				'value'   => ( get_option( 'tm_epo_force_select_options' ) === 'display' ? 'yes' : get_option( 'tm_epo_force_select_options' ) ),
			],
			[
				'title'   => esc_html__( 'Enable extra options in shop and category view', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the display of extra options on the shop page and category view. This setting is theme dependent and some aspects may not work as expected.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_enable_in_shop',
				'default' => 'no',
				'class'   => 'tcdisplay',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Remove Free price label', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to remove Free price label when product has extra options', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_remove_free_price_label',
				'class'   => 'tcprice',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Use progressive display on options', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will hide the options on the product page until JavaScript is initialized. This is a fail-safe setting and we recommend to be active.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_progressive_display',
				'class'   => 'tcanimation',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Animation delay', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'How long the animation will take in milliseconds', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_animation_delay',
				'class'   => 'tcanimation',
				'default' => '100',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Start Animation delay', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'The delay until the animation starts in milliseconds', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_start_animation_delay',
				'class'   => 'tcanimation',
				'default' => '0',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Show quantity selector only for elements with a value', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check show quantity selector only for elements with a value.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_only_active_quantities',
				'class'   => 'tcdisplay',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide add-to-cart button until an element is chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the add to cart button only when at least one option is filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_add_cart_button',
				'class'   => 'tcaddtocartbutton',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide add-to-cart button until all required elements are chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the add to cart button only when all required visible options are filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_required_add_cart_button',
				'class'   => 'tcaddtocartbutton',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide add-to-cart button until all elements are chosen', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the add to cart button only when all visible options are filled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_all_add_cart_button',
				'class'   => 'tcaddtocartbutton',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show full width label for elements.', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to force elements to be full width instead of auto.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_select_fullwidth',
				'class'   => 'tcdisplay',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show choice description inline.', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to disable showing description as a tooltip and show it inline instead.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_description_inline',
				'class'   => 'tcdisplay',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide choice label when using the Show tooltip setting for radio buttons and checkboxes', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to hide the choice label when using the Show tooltip setting for radio buttons and checkboxes.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_swatch_hide_label',
				'class'   => 'tcdisplay',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Auto hide price if zero', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to globally hide the price display if it is zero.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_auto_hide_price_if_zero',
				'class'   => 'tcprice',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Do not auto hide price if the original price is not zero', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the price display if the original price is not zero.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_no_hide_price_if_original_not_zero',
				'class'   => 'tcprice',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Trim zeros in prices', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to globally trim zero in prices. This will be applied to native WooCommerce prices as well.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_trim_zeros',
				'class'   => 'tcprice',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide element price html when hide price setting is enabled', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this if you use Google Merchant Center. It will hide the price html of the element when you enable its hide price setting.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_price_html',
				'class'   => 'tcprice',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			( THEMECOMPLETE_EPO_WPML()->is_active() )
				?
				[
					'title'   => esc_html__( 'Use translated values when possible on admin Order', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Please note that if the options on the Order change or get deleted you will get wrong results by enabling this!', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_wpml_order_translate',
					'class'   => 'tcdisplay',
					'default' => 'no',
					'type'    => 'checkbox',

				]
				: [],
			[
				'title'   => esc_html__( 'Include option pricing in product price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to include the pricing of the options to the product price.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_include_possible_option_pricing',
				'class'   => 'tcprice',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Check for empty product price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to have the plugin set to zero the product price when it is empty.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_add_product_price_check',
				'class'   => 'tcprice',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Use the "From" string on displayed product prices', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to alter the price display of a product when it has extra options with prices.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_use_from_on_price',
				'class'   => 'tcvarious2',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Alter generated product structured data', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Alters the generated product structured data. This may produce wrong results if the options use conditional logic!', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_alter_structured_data',
				'class'   => 'tcvarious2',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Responsive options structure', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this if you want the options to have responsive display.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_responsive_display',
				'class'   => 'tcvarious2',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];
	}

	/**
	 * Cart settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_cart( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Turn off persistent cart', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this if the product has a lot of options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_turn_off_persi_cart',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Clear cart button', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enables or disables the clear cart button', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_clear_cart_button',
				'default' => 'no',
				'type'    => 'checkbox',
				'value'   => ( get_option( 'tm_epo_clear_cart_button' ) === 'show' ? 'yes' : get_option( 'tm_epo_clear_cart_button' ) ),
			],
			[
				'title'   => esc_html__( 'Cart Field Display', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select how to display your fields in the cart', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_cart_field_display',
				'class'   => 'chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'normal',
				'type'    => 'select',
				'options' => [
					'normal'   => esc_html__( 'Normal display', 'woocommerce-tm-extra-product-options' ),
					'link'     => esc_html__( 'Display a pop-up link', 'woocommerce-tm-extra-product-options' ),
					'advanced' => esc_html__( 'Advanced display', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Hide extra options in cart', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enables or disables the display of options in the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_options_in_cart',
				'default' => 'no',
				'type'    => 'checkbox',
				'value'   => ( get_option( 'tm_epo_hide_options_in_cart' ) === 'hide' ? 'yes' : get_option( 'tm_epo_hide_options_in_cart' ) ),
			],
			[
				'title'   => esc_html__( 'Hide extra addon prices in cart and checkout', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enables or disables the display of addon prices in the cart and checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_options_prices_in_cart',
				'default' => 'no',
				'type'    => 'checkbox',
				'value'   => ( get_option( 'tm_epo_hide_options_prices_in_cart' ) === 'hide' ? 'yes' : get_option( 'tm_epo_hide_options_prices_in_cart' ) ),
			],
			version_compare( get_option( 'woocommerce_db_version' ), '2.3', '<' ) ?
				[] :
				[
					'title'   => esc_html__( 'Prevent negative priced products', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Prevent adding to the cart negative priced products.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_no_negative_priced_products',
					'default' => 'no',
					'type'    => 'checkbox',
				],
			[
				'title'   => esc_html__( 'Prevent zero priced products', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Prevent adding to the cart zero priced products.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_no_zero_priced_products',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide checkbox element average price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will hide the average price display on the cart for checkboxes.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_hide_cart_average_price',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show image replacement in cart and checkout', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will show the images of elements that have an image replacement.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_image_replacement',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide upload file URL in cart and checkout', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will hide the URL of any uploaded file while in cart and checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_hide_uploaded_file_url_cart',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show uploaded image in cart and checkout', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will show the uploaded images in cart and checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_upload_image_replacement',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Maximum image width', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Set the maximum width of the images that appear on cart.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_image_max_width',
				'default' => '70%',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Maximum image height', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Set the maximum height of the images that appear on cart.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_image_max_height',
				'default' => 'none',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Always use unique values on cart for elements', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will separate comma separated values for elements. This is mainly used for multiple checkbox choices.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_always_unique_values',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];
	}

	/**
	 * Order settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function get_setting_order( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'             => esc_html__( 'Post types to show the saved options', 'woocommerce-tm-extra-product-options' ),
				'desc'              => esc_html__( 'Select the post types where the plugin will modify the edit order screen to show the saved options. You can type in your custom post type.', 'woocommerce-tm-extra-product-options' ),
				'id'                => 'tm_epo_order_post_types',
				'class'             => 'chosen_select',
				'css'               => 'min-width:300px;',
				'default'           => [ 'shop_order_placehold', 'shop_order' ],
				'type'              => 'multiselect',
				'custom_attributes' => [ 'data-tags' => true ],
				'options'           => $this->get_order_post_types(),
			],
			[
				'title'   => esc_html__( 'Strip html from emails', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to strip the html tags from emails', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_strip_html_from_emails',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Legacy meta data', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable legacy meta data functionality.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_legacy_meta_data',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Unique meta values', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to split items with multiple values to unique lines.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_unique_meta_values',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Prevent options from being sent to emails', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to disable options from being sent to emails.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_prevent_options_from_emails',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Disable sending the options upon saving the order', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this if you are getting a 500 error when trying to complete the order in the checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_disable_sending_options_in_order',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Attach upload files to emails', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to Attach upload files to emails.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_attach_uploaded_to_emails',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Disable Options on Order status change', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this only if you are getting server errors on checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_disable_options_on_order_status',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide upload file URL in order', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will hide the URL of any uploaded file while in order.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_hide_uploaded_file_url_order',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show uploaded image in order', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will show the uploaded images in order.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_upload_image_replacement_order',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];
	}

	/**
	 * String settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_string( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'desc'  => '<span tabindex="0" data-menu="tcsgeneral" class="tm-section-menu-item">' . esc_html__( 'General', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcscart" class="tm-section-menu-item">' . esc_html__( 'Cart', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcsfinaltotalbox" class="tm-section-menu-item">' . esc_html__( 'Final total box', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcselements" class="tm-section-menu-item">' . esc_html__( 'Elements', 'woocommerce-tm-extra-product-options' ) . '</span>',

				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Field Label/value separator', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter the character that will be used to separate field labels from field values in the cart and order.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_separator_cart_text',
				'default' => ':',
				'class'   => 'tcsgeneral',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Multiple field values separator', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter the string that will be used to separate multiple values for a field that allows multiple selections in the cart and order.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_multiple_separator_cart_text',
				'default' => ', ',
				'class'   => 'tcsgeneral',
				'type'    => 'text',
			],
			[
				'title'       => esc_html__( 'Update cart text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Update cart text when you edit a product.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_update_cart_text',
				'placeholder' => esc_html__( 'Update cart', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcscart',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Edit Options text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Edit options text on the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_edit_options_text',
				'placeholder' => esc_html__( 'Edit options', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcscart',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Additional Options text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Additional options text when using the pop up setting on the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_additional_options_text',
				'placeholder' => esc_html__( 'Additional options', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcscart',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Close button text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Close button text when using the pop up setting on the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_close_button_text',
				'placeholder' => esc_html__( 'Close', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcscart',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Empty cart text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the empty cart button text.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_empty_cart_text',
				'placeholder' => esc_html__( 'Empty cart', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcscart',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Final total text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Final total text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_final_total_text',
				'placeholder' => esc_html__( 'Final total', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsfinaltotalbox',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Unit price text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Unit price text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_options_unit_price_text',
				'placeholder' => esc_html__( 'Unit price', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsfinaltotalbox',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Options total text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Options total text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_options_total_text',
				'placeholder' => esc_html__( 'Options amount', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsfinaltotalbox',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Options VAT total text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Options VAT total text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_vat_options_total_text',
				'placeholder' => esc_html__( 'Options VAT amount', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsfinaltotalbox',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Fees total text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter the Fees total text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_fees_total_text',
				'placeholder' => esc_html__( 'Fees amount', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsfinaltotalbox',
				'type'        => 'text',
			],

			[
				'title'   => esc_html__( 'Free Price text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a text to replace the Free price label when product has extra options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_replacement_free_price_text',
				'default' => '',
				'class'   => 'tcsgeneral',
				'type'    => 'text',
			],
			[
				'title'       => esc_html__( 'Force Select options text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the add to cart button text when using the Force select option.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_force_select_text',
				'placeholder' => esc_html__( 'Select options', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsgeneral',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'No zero priced products text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the message when trying to add a zero priced product to the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_no_zero_priced_products_text',
				'placeholder' => esc_html__( 'You cannot add zero priced products to the cart.', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsgeneral',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'No negative priced products text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the message when trying to add a negative priced product to the cart.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_no_negative_priced_products_text',
				'placeholder' => esc_html__( 'You cannot add negative priced products to the cart.', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcsgeneral',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Popup section button text replacement', 'woocommerce-tm-extra-product-options' ),
				/* translators: %s code text */
				'desc'        => sprintf( esc_html__( 'Enter a text to replace the topup section button text. Setting this to %s will make it so that the button text has the section title.', 'woocommerce-tm-extra-product-options' ), '<code>%auto%</code>' ),
				'id'          => 'tm_epo_popup_section_button_text',
				'placeholder' => esc_html__( 'Open', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Reset Options text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Reset options text when using custom variations.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_reset_variation_text',
				'placeholder' => esc_html__( 'Reset options', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Calendar close button text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Close button text on the calendar.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_closetext',
				'placeholder' => esc_html__( 'Done', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Calendar today button text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Today button text on the calendar.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_currenttext',
				'placeholder' => esc_html__( 'Today', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Slider previous text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the previous button text for slider.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_slider_prev_text',
				'placeholder' => esc_html__( 'Prev', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Slider next text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the next button text for slider.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_slider_next_text',
				'placeholder' => esc_html__( 'Next', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'This field is required text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to indicate that a field is required.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_this_field_is_required_text',
				'placeholder' => esc_html__( 'This field is required.', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Characters remaining text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Characters remaining text when using maximum characters on a text field or a textarea.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_characters_remaining_text',
				'placeholder' => esc_html__( 'characters remaining', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Uploading files text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Uploading files text used in the pop-up after clicking the add to cart button  when there are upload fields.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_uploading_files_text',
				'placeholder' => esc_html__( 'Uploading files', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Uploading message text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a message to be used in the pop-up after clicking the add to cart button when there are upload fields.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_uploading_message_text',
				'placeholder' => esc_html__( 'Your files are being uploaded', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Select file text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the Select file text used in the styled upload button.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_select_file_text',
				'placeholder' => esc_html__( 'Select file', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Single file text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the file text used in the styled upload button.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_uploading_num_file',
				'placeholder' => esc_html__( 'file', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Multiple files text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the files text used in the styled upload button.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_uploading_num_files',
				'placeholder' => esc_html__( 'files', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Add button text on associated products', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the add button text on associated products.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_add_button_text_associated_products',
				'placeholder' => esc_html__( 'Add', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Remove button text on associated products', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the remove button text on associated products.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_remove_button_text_associated_products',
				'placeholder' => esc_html__( 'Remove', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Repeater add text', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Enter a text to replace the add text button for repeater fields.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_add_button_text_repeater',
				'placeholder' => esc_html__( 'Add', 'woocommerce-tm-extra-product-options' ),
				'default'     => '',
				'class'       => 'tcselements',
				'type'        => 'text',
			],

			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];
	}

	/**
	 * Style settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_style( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],

			[
				'title'   => esc_html__( 'Enable checkbox and radio styles', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enables or disables extra styling for checkboxes and radio buttons.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_css_styles',
				'default' => 'no',
				'type'    => 'checkbox',
				'value'   => ( get_option( 'tm_epo_css_styles' ) === 'on' ? 'yes' : get_option( 'tm_epo_css_styles' ) ),
			],
			[
				'title'   => esc_html__( 'Style', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select a style for the checkboxes and radio buttons', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_css_styles_style',
				'class'   => 'chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'circle',
				'type'    => 'select',
				'options' => [
					'circle'  => esc_html__( 'Circle', 'woocommerce-tm-extra-product-options' ),
					'circle2' => esc_html__( 'Circle 2', 'woocommerce-tm-extra-product-options' ),
					'round'   => esc_html__( 'Round', 'woocommerce-tm-extra-product-options' ),
					'round2'  => esc_html__( 'Round 2', 'woocommerce-tm-extra-product-options' ),
					'square'  => esc_html__( 'Square', 'woocommerce-tm-extra-product-options' ),
					'square2' => esc_html__( 'Square 2', 'woocommerce-tm-extra-product-options' ),

				],
			],
			[
				'title'   => esc_html__( 'Swatch border type', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select a style for the selected border when using image replacements or swatches.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_css_selected_border',
				'class'   => 'chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''         => esc_html__( 'Default', 'woocommerce-tm-extra-product-options' ),
					'square'   => esc_html__( 'Square', 'woocommerce-tm-extra-product-options' ),
					'circle'   => esc_html__( 'Circle', 'woocommerce-tm-extra-product-options' ),
					'round'    => esc_html__( 'Round', 'woocommerce-tm-extra-product-options' ),
					'shadow'   => esc_html__( 'Shadow', 'woocommerce-tm-extra-product-options' ),
					'thinline' => esc_html__( 'Thin line', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Swatch Border Color', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose the border color for image or color swatches. If left blank it defaults to transparent.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_swatch_border_color',
				'class'   => 'tm-color-picker',
				'default' => '',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Text Swatch Border Color', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose the border color for text swatches. If left blank it is set to inherit the current color.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_text_swatch_border_color',
				'class'   => 'tm-color-picker',
				'default' => '',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Swatch Active Border Color', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose the color that should appear as the active border when you have selected an image, color or text swatch. If left blank it is set to inherit the current color.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_swatch_active_border_color',
				'class'   => 'tm-color-picker',
				'default' => '',
				'type'    => 'text',
			],
			[
				'title'       => esc_html__( 'Swatch Border Width', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Choose the border width for image or color swatches.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_swatch_border_width',
				'default'     => '',
				'placeholder' => '2px',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Swatch Active Border Width', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Select the border width for the active border when you have chosen an image or color swatch.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_swatch_active_border_width',
				'default'     => '',
				'placeholder' => '2px',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Text Swatch Border Width', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Choose the border width for text swatches.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_text_swatch_border_width',
				'default'     => '',
				'placeholder' => '1px',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Text Swatch Active Border Width', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'Select the border width for the active border when you have chosen a text swatch.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_text_swatch_active_border_width',
				'default'     => '',
				'placeholder' => '1px',
				'type'        => 'text',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];
	}

	/**
	 * Global settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_global( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'desc'  => '<span tabindex="0" data-menu="tcglobal1" class="tm-section-menu-item">' . esc_html__( 'General', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal2" class="tm-section-menu-item">' . esc_html__( 'Visual', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal3" class="tm-section-menu-item">' . esc_html__( 'Product page', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal5" class="tm-section-menu-item">' . esc_html__( 'Locale', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal6" class="tm-section-menu-item">' . esc_html__( 'Pricing', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal7" class="tm-section-menu-item">' . esc_html__( 'Strings', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal9" class="tm-section-menu-item">' . esc_html__( 'CDN', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcglobal8" class="tm-section-menu-item">' . esc_html__( 'Various', 'woocommerce-tm-extra-product-options' ) . '</span>',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Enable validation', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable validation feature for builder elements', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_enable_validation',
				'default' => 'yes',
				'class'   => 'tcglobal1',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Disable error scrolling', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to disable scrolling to the element with an error', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_disable_error_scroll',
				'default' => 'no',
				'class'   => 'tcglobal1',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Error label placement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Set the placement for the validation error notification label', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_error_label_placement',
				'class'   => 'tcglobal1 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''       => esc_html__( 'After the element', 'woocommerce-tm-extra-product-options' ),
					'before' => esc_html__( 'Before the element', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Use options cache', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Use options caching for boosting performance. Disable if you have options that share the same unique ID.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_options_cache',
				'default' => 'no',
				'class'   => 'tcglobal1',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Javascript and CSS inclusion mode', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select how to include JS and CSS files', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_js_css_mode',
				'class'   => 'tcglobal1 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'dev',
				'type'    => 'select',
				'options' => [
					''         => esc_html__( 'Single minified file', 'woocommerce-tm-extra-product-options' ),
					'multiple' => esc_html__( 'Multiple minified files', 'woocommerce-tm-extra-product-options' ),
					'dev'      => esc_html__( 'DEV - multiple files', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Disable PNG convert security', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to disable the conversion to png for image uploads.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_no_upload_to_png',
				'default' => 'no',
				'class'   => 'tcglobal8',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Override product price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will globally override the product price with the price from the options if the total options price is greater then zero.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_override_product_price',
				'class'   => 'tcglobal6 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''    => esc_html__( 'Use setting on each product', 'woocommerce-tm-extra-product-options' ),
					'no'  => esc_html__( 'No', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Yes', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Options price mode', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the price mode for the options.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_options_price_mode',
				'class'   => 'tcglobal6 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'sale',
				'type'    => 'select',
				'options' => [
					'sale'    => esc_html__( 'Use sale price', 'woocommerce-tm-extra-product-options' ),
					'regular' => esc_html__( 'Use regular price', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'       => esc_html__( 'Maximum number of combinations for price calcualtions', 'woocommerce-tm-extra-product-options' ),
				'desc'        => esc_html__( 'This setting controls the maximum number of combinations that the plugin will use to calculate minimum and maximum prices. A higher number of combinations will result in more accurate prices, but it will also take longer to calculate them. For products that can have many choice combinations, it is recommended to set a lower number of combinations to improve performance.', 'woocommerce-tm-extra-product-options' ),
				'id'          => 'tm_epo_global_max_combinations',
				'default'     => '10',
				'placeholder' => esc_html__( 'Default value is 10', 'woocommerce-tm-extra-product-options' ),
				'class'       => 'tcglobal6',
				'type'        => 'text',
			],
			[
				'title'   => esc_html__( 'Calculate the Precise Maximum Price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This setting influences how the plugin calculates the maximum price of a product. Enabling this setting will provide a more precise result at the cost of processing speed.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_max_real',
				'default' => 'no',
				'class'   => 'tcglobal6',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Reset option values after the product is added to the cart', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will revert the option values to the default ones after adding the product to the cart', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_reset_options_after_add',
				'default' => 'no',
				'class'   => 'tcglobal3',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Use plus and minus signs on prices in cart and checkout', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose how you want the sign of options prices to be displayed in cart and checkout.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_price_sign',
				'class'   => 'tcglobal8 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''      => esc_html__( 'Display both signs', 'woocommerce-tm-extra-product-options' ),
					'minus' => esc_html__( 'Display only minus sign', 'woocommerce-tm-extra-product-options' ),

				],
			],
			[
				'title'   => esc_html__( 'Use plus and minus signs on option prices', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose how you want the sign of options prices to be displayed at the product page.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_options_price_sign',
				'class'   => 'tcglobal8 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'minus',
				'type'    => 'select',
				'options' => [
					''      => esc_html__( 'Display both signs', 'woocommerce-tm-extra-product-options' ),
					'minus' => esc_html__( 'Display only minus sign', 'woocommerce-tm-extra-product-options' ),

				],
			],
			[
				'title'   => esc_html__( 'Input decimal separator', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose how to determine the decimal separator for user inputs', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_input_decimal_separator',
				'class'   => 'tcglobal5 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'browser',
				'type'    => 'select',
				'options' => [
					''        => esc_html__( 'Use WooCommerce value', 'woocommerce-tm-extra-product-options' ),
					'browser' => esc_html__( 'Determine by browser local', 'woocommerce-tm-extra-product-options' ),

				],
			],
			[
				'title'   => esc_html__( 'Displayed decimal separator', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Choose which decimal separator to display on currency prices', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_displayed_decimal_separator',
				'class'   => 'tcglobal5 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''        => esc_html__( 'Use WooCommerce value', 'woocommerce-tm-extra-product-options' ),
					'browser' => esc_html__( 'Determine by browser local', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Timezone override for Date element', 'woocommerce-tm-extra-product-options' ),
				/* translators: %s "timezone" */
				'desc'    => sprintf( esc_html__( 'Choose which %s the date element will use on the backend calculations or leave blank for server timezone.', 'woocommerce-tm-extra-product-options' ), '<a href="' . esc_url( 'https://www.php.net/manual/en/timezones.php' ) . '" target="_blank">' . esc_html__( 'timezone', 'woocommerce-tm-extra-product-options' ) . '</a>' ),
				'id'      => 'tm_epo_global_date_timezone',
				'default' => '',
				'class'   => 'tcglobal5',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Required state indicator', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a string to indicate the required state of a field.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_required_indicator',
				'default' => '*',
				'class'   => 'tcglobal7',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Required state indicator position', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the placement of the Required state indicator', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_required_indicator_position',
				'class'   => 'tcglobal7 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'right',
				'type'    => 'select',
				'options' => [
					'left'  => esc_html__( 'Left of the label', 'woocommerce-tm-extra-product-options' ),
					'right' => esc_html__( 'Right of the label', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Include tax string suffix on totals box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to add the WooCommerce tax suffix on the totals box', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_tax_string_suffix',
				'default' => 'no',
				'class'   => 'tcglobal3',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Include the WooCommerce Price display suffix on totals box', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to add the WooCommerce Price display suffix on the totals box.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_wc_price_suffix',
				'default' => 'no',
				'class'   => 'tcglobal3',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'jQuery selector for main product image', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This is used to change the product image.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_product_image_selector',
				'default' => '',
				'class'   => 'tcglobal3',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Product image replacement mode', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Self mode replaces the actual image and Inline appends new image elements.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_product_image_mode',
				'class'   => 'tcglobal3 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'self',
				'type'    => 'select',
				'options' => [
					'self'   => esc_html__( 'Self mode', 'woocommerce-tm-extra-product-options' ),
					'inline' => esc_html__( 'Inline mode', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Move out of stock message', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This moves the out of stock message when styled variations are used just below them.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_move_out_of_stock',
				'default' => 'no',
				'class'   => 'tcglobal3',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Use internal variation price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this if your variable products have a lot of options to improve performance. Note that this may cause issues with discount or currency plugins.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_no_variation_prices_array',
				'default' => 'no',
				'class'   => 'tcglobal3',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Enable plugin backend interface', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the roles that will have access to the plugin settings and the plugin interface while on the edit product page. The Admininstrator role always has access.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_hide_product_enabled',
				'class'   => 'tcglobal2 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'multiselect',
				'options' => themecomplete_get_roles( [ 'administrator', '@everyone', '@loggedin' ] ),
			],
			[
				'title'   => esc_html__( 'Hide override settings on products', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to hide the settings tab on the product edit screen', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_hide_product_settings',
				'default' => 'no',
				'class'   => 'tcglobal2',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide Builder mode on products', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to hide the builder tab on the product edit screen', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_hide_product_builder_mode',
				'default' => 'no',
				'class'   => 'tcglobal2',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Hide Normal mode on products', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this to hide the normal tab on the product edit screen', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_hide_product_normal_mode',
				'default' => 'no',
				'class'   => 'tcglobal2',
				'type'    => 'checkbox',
			],

			[
				'title'   => esc_html__( 'Enable WP Rocket CDN', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the use of WP Rocket cdn for the plugin images if it is active.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_cdn_rocket',
				'default' => 'yes',
				'class'   => 'tcglobal9',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Enable Jetpack CDN', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the use of Jetpack cdn for the plugin images if it is active.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_cdn_jetpack',
				'default' => 'no',
				'class'   => 'tcglobal9',
				'type'    => 'checkbox',
			],

			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];
	}

	/**
	 * Elements settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_elements( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'desc'  => '<span tabindex="0" data-menu="tcelements1" class="tm-section-menu-item">' . esc_html__( 'General', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements8" class="tm-section-menu-item">' . esc_html__( 'Grid', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements2" class="tm-section-menu-item">' . esc_html__( 'Radio buttons', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements7" class="tm-section-menu-item">' . esc_html__( 'Select box', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements3" class="tm-section-menu-item">' . esc_html__( 'Datepicker', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements4" class="tm-section-menu-item">' . esc_html__( 'Text', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements5" class="tm-section-menu-item">' . esc_html__( 'Upload', 'woocommerce-tm-extra-product-options' ) . '</span>' .
						'<span tabindex="0" data-menu="tcelements6" class="tm-section-menu-item">' . esc_html__( 'Product', 'woocommerce-tm-extra-product-options' ) . '</span>',
				'title' => $label,
			],
			[
				'title'       => esc_html__( 'Main Row gap', 'woocommerce-tm-extra-product-options' ),
				/* translators: %1$s <br> %2$s code text */
				'desc'        => sprintf( esc_html__( 'Set the row gap between sections and fields. %1$s This will be the %2$s css variable.', 'woocommerce-tm-extra-product-options' ), '<br>', '<code>--tcgaprow</code>' ),
				'id'          => 'tm_epo_global_row_gap',
				'class'       => 'tcelements8',
				'default'     => '15px',
				'placeholder' => '15px',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Main Column gap', 'woocommerce-tm-extra-product-options' ),
				/* translators: %1$s <br> %2$s code text */
				'desc'        => sprintf( esc_html__( 'Set the column gap between sections and fields. %1$s This will be the %2$s css variable.', 'woocommerce-tm-extra-product-options' ), '<br>', '<code>--tcgapcolumn</code>' ),
				'id'          => 'tm_epo_global_column_gap',
				'class'       => 'tcelements8',
				'default'     => '15px',
				'placeholder' => '15px',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Inner Row gap', 'woocommerce-tm-extra-product-options' ),
				/* translators: %1$s <br> %2$s code text */
				'desc'        => sprintf( esc_html__( 'Set the inner row gap between field elements. %1$s This will be the %2$s css variable.', 'woocommerce-tm-extra-product-options' ), '<br>', '<code>--tcinnergaprow</code>' ),
				'id'          => 'tm_epo_global_row_inner_gap',
				'class'       => 'tcelements8',
				'default'     => '',
				'placeholder' => 'calc(var(--tcgaprow) / 2)',
				'type'        => 'text',
			],
			[
				'title'       => esc_html__( 'Inner Column gap', 'woocommerce-tm-extra-product-options' ),
				/* translators: %1$s <br> %2$s code text */
				'desc'        => sprintf( esc_html__( 'Set the inner column gap between field elements. %1$s This will be the %2$s css variable.', 'woocommerce-tm-extra-product-options' ), '<br>', '<code>--tcinnergapcolumn</code>' ),
				'id'          => 'tm_epo_global_column_inner_gap',
				'class'       => 'tcelements8',
				'default'     => '',
				'placeholder' => 'calc(var(--tcgapcolumn) / 2)',
				'type'        => 'text',
			],
			[
				'title'   => esc_html__( 'Tooltip max width', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Set the max width of the tooltip that appears on the elements.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_tooltip_max_width',
				'class'   => 'tcelements1',
				'default' => '340px',
				'type'    => 'text',
			],
			[
				'title'   => esc_html__( 'Image mode', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Set the image mode that will be used for various image related functionality.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_image_mode',
				'class'   => 'tcelements1 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => 'relative',
				'type'    => 'select',
				'options' => [
					''         => esc_html__( 'Absolute URL', 'woocommerce-tm-extra-product-options' ),
					'relative' => esc_html__( 'Relative URL', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Recalculate image on changes', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This is required on several gallery solutions that change the image html dynamically or if you want to control the image dynamically.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_image_recalculate',
				'class'   => 'tcelements1',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Retrieve image sizes for image replacements', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Disable this for slow servers or large amounts of images.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_retrieve_image_sizes',
				'default' => 'no',
				'class'   => 'tcelements1',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show quantity 1', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable to show the quantity string even when the quantity is 1 and when the quantity selector is enabled.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_quantity_one',
				'default' => 'no',
				'class'   => 'tcelements1',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show prices inside select box choices', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the price of the select box options if the price type is fixed.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_price_inside_option',
				'class'   => 'tcelements7',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Show prices inside select box choices even if the prices are hidden', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to show the price of the select box options if the price type is fixed and even if the element hides the price.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_show_price_inside_option_hidden_even',
				'class'   => 'tcelements7',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Multiply prices inside select box choices with its quantity selector', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check this to multiply the prices of the select box options with its quantity selector if any.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_multiply_price_inside_option',
				'class'   => 'tcelements7',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Radio button undo button', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Globally override the undo button for radio buttons', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_radio_undo_button',
				'class'   => 'tcelements2 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''        => esc_html__( 'Use field value', 'woocommerce-tm-extra-product-options' ),
					'enable'  => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
					'disable' => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),

				],
			],
			[
				'title'   => esc_html__( 'Datepicker theme', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the theme for the datepicker.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_datepicker_theme',
				'class'   => 'tcelements3 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''          => esc_html__( 'Use field value', 'woocommerce-tm-extra-product-options' ),
					'epo'       => esc_html__( 'Epo White', 'woocommerce-tm-extra-product-options' ),
					'epo-black' => esc_html__( 'Epo Black', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Datepicker size', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the size of the datepicker.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_datepicker_size',
				'class'   => 'tcglobtcelements3al4 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''       => esc_html__( 'Use field value', 'woocommerce-tm-extra-product-options' ),
					'small'  => esc_html__( 'Small', 'woocommerce-tm-extra-product-options' ),
					'medium' => esc_html__( 'Medium', 'woocommerce-tm-extra-product-options' ),
					'large'  => esc_html__( 'Large', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Datepicker position', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Select the position of the datepicker.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_datepicker_position',
				'class'   => 'tcelements3 chosen_select',
				'css'     => 'min-width:300px;',
				'default' => '',
				'type'    => 'select',
				'options' => [
					''       => esc_html__( 'Use field value', 'woocommerce-tm-extra-product-options' ),
					'normal' => esc_html__( 'Normal', 'woocommerce-tm-extra-product-options' ),
					'top'    => esc_html__( 'Top of screen', 'woocommerce-tm-extra-product-options' ),
					'bottom' => esc_html__( 'Bottom of screen', 'woocommerce-tm-extra-product-options' ),
				],
			],
			[
				'title'   => esc_html__( 'Minimum characters for text-field and text-areas', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a value for the minimum characters the user must enter.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_min_chars',
				'default' => '',
				'class'   => 'tcelements4',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Maximum characters for text-field and text-areas', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a value for the minimum characters the user must enter.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_max_chars',
				'default' => '',
				'class'   => 'tcelements4',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Upload element inline Image preview', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable inline preview of the image that will be uploaded.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_upload_inline_image_preview',
				'default' => 'no',
				'class'   => 'tcelements5',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Scroll to the product element upon selection', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable to scroll the viewport to the product element.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_product_element_scroll',
				'default' => 'no',
				'class'   => 'tcelements6',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Product element scroll offset', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a value for the scroll offset when selecting a choice for the product element.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_product_element_scroll_offset',
				'default' => '-100',
				'class'   => 'tcelements6',
				'type'    => 'number',
			],
			[
				'title'   => esc_html__( 'Sync associated product quantity with main product quantity', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable to have the quantities of the associated products to be a multiple of the main product quantity.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_global_product_element_quantity_sync',
				'default' => 'yes',
				'class'   => 'tcelements6',
				'type'    => 'checkbox',
			],

			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];
	}

	/**
	 * Other settings
	 *
	 * @param string $setting The name of the setting.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_other( $setting ) {
		$settings = [];
		$other    = $this->get_other_settings();
		foreach ( $other as $key => $setting ) {
			$settings = array_merge( $settings, $setting );
		}

		return $settings;
	}

	/**
	 * Envato token url
	 *
	 * @return string
	 * @since 1.0
	 */
	private function get_generate_token_url() {
		return 'https://build.envato.com/create-token/?' . implode(
			'&',
			array_map(
				function ( $val ) {
					return $val . '=t';
				},
				array_keys(
					apply_filters(
						'envato_market_required_permissions',
						[
							'default'           => 'View and search Envato sites',
							'purchase:download' => 'Download your purchased items',
							'purchase:list'     => 'List purchases you\'ve made',
						]
					)
				)
			)
		);
	}

	/**
	 * License settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_license( $setting, $label ) {
		$is_active         = THEMECOMPLETE_EPO_ADMIN()->in_settings_page() ? THEMECOMPLETE_EPO_LICENSE()->get_license() : false;
		$is_hidden         = defined( 'TC_CLIENT_MODE' );
		$_license_settings = ( ! defined( 'TM_DISABLE_LICENSE' ) ) ?
			[
				[
					'type'  => 'tm_title',
					'id'    => 'epo_page_options',
					'title' => $label,
				],
				[
					'title'   => esc_html__( 'Username', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Your Envato username.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_envato_username',
					'default' => '',
					'class'   => ( $is_hidden ? 'hidden' : '' ),
					'type'    => ( $is_hidden ? 'password' : 'text' ),
				],
				[
					'title'   => esc_html__( 'Envato Personal Token', 'woocommerce-tm-extra-product-options' ),
					/* translators: %s "clicking this link" */
					'desc'    => '<p>' . sprintf( esc_html__( 'You can generate an Envato Personal Token by %s', 'woocommerce-tm-extra-product-options' ), '<a href="' . esc_url( $this->get_generate_token_url() ) . '" target="_blank">' . esc_html__( 'clicking this link', 'woocommerce-tm-extra-product-options' ) . '</a>' ) . '</p>',
					'id'      => 'tm_epo_envato_apikey',
					'default' => '',
					'class'   => ( $is_hidden ? 'hidden' : '' ),
					'type'    => ( $is_hidden ? 'password' : 'text' ),
				],
				[
					'title'   => esc_html__( 'Purchase code', 'woocommerce-tm-extra-product-options' ),
					/* translators: %s "click this link" */
					'desc'    => '<p>' . sprintf( esc_html__( 'To find out how to access your purchase code you can %s', 'woocommerce-tm-extra-product-options' ), '<a href="' . esc_url( 'https://help.market.envato.com/hc/en-us/articles/202822600-Where-Is-My-Purchase-Code-' ) . '" target="_blank">' . esc_html__( 'click this link', 'woocommerce-tm-extra-product-options' ) . '</a>' ) . '</p>'
								. '<span class="tm-license-button">'

								. '<button type="button" class="' . ( $is_active ? '' : 'tm-hidden ' ) . 'tc tc-button tm-deactivate-license" id="tm_deactivate_license">' . esc_html__( 'Deactivate License', 'woocommerce-tm-extra-product-options' ) . '</button>'
								. '<button type="button" class="' . ( $is_active ? 'tm-hidden ' : '' ) . 'tc tc-button tm-activate-license" id="tm_activate_license">' . esc_html__( 'Activate License', 'woocommerce-tm-extra-product-options' ) . '</button>'

								. '</span>'
								. '<span class="tm-license-result">'
								. ( $is_active ?
							"<div class='activated'><p>" . esc_html__( 'License activated.', 'woocommerce-tm-extra-product-options' ) . '</p></div>'
							: ''
								)
								. '</span>',
					'id'      => 'tm_epo_envato_purchasecode',
					'default' => '',
					'class'   => ( $is_hidden ? 'hidden' : '' ),
					'type'    => ( $is_hidden ? 'password' : 'text' ),
				],
				[
					'title'   => esc_html__( 'Consent', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'I agree that the license data will be transmitted to the license server.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_consent_for_transmit',
					'class'   => ( $is_hidden ? 'hidden' : '' ),
					'default' => 'no',
					'type'    => 'checkbox',
				],
				[
					'type' => 'tm_sectionend',
					'id'   => 'epo_page_options',
				],
			] : [];

		return $_license_settings;
	}

	/**
	 * Get allowed file types
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_allowed_types() {
		$types            = [];
		$wp_get_ext_types = wp_get_ext_types();
		$types['@']       = esc_html__( 'Use allowed file types from WordPress', 'woocommerce-tm-extra-product-options' );
		foreach ( $wp_get_ext_types as $key => $value ) {
			$types[ '@' . $key ] = $key . ' ' . esc_html__( 'files', 'woocommerce-tm-extra-product-options' );
			foreach ( $value as $key2 => $value2 ) {
				$types[ $value2 ] = $value2;
			}
		}

		return $types;
	}

	/**
	 * Upload settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_upload( $setting, $label ) {

		$html = '<div class="tm-mn-header"><div class="tm-mn-path">'
				. '<a class="tm-mn-movetodir tc tc-button" data-tm-dir="" href="#">' . esc_html__( 'Enable File manager', 'woocommerce-tm-extra-product-options' ) . '</a>'
				. '</div></div>';

		$_upload_settings =
			[
				[
					'type'  => 'tm_title',
					'id'    => 'epo_page_options',
					'title' => $label,
				],
				[
					'title'   => esc_html__( 'Upload folder', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Changing this will only affect future uploads.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_upload_folder',
					'default' => 'extra_product_options',
					'type'    => 'text',
				],
				[
					'title'   => esc_html__( 'Enable pop-up message on uploads', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Enables a pop-up when uploads are made.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_upload_popup',
					'default' => 'no',
					'type'    => 'checkbox',
				],
				[
					'title'   => esc_html__( 'Enable upload success message', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Indicates if the upload was successful with a message.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_upload_success_message',
					'default' => 'yes',
					'type'    => 'checkbox',
				],
				[
					'title'             => esc_html__( 'Allowed file types', 'woocommerce-tm-extra-product-options' ),
					'desc'              => esc_html__( 'Select which file types the user will be allowed to upload.', 'woocommerce-tm-extra-product-options' ),
					'id'                => 'tm_epo_allowed_file_types',
					'type'              => 'multiselect',
					'class'             => 'wc-enhanced-select',
					'css'               => 'width: 450px;',
					'default'           => '@',
					'options'           => $this->get_allowed_types(),
					'custom_attributes' => [
						'data-placeholder' => esc_html__( 'Select file types', 'woocommerce-tm-extra-product-options' ),
					],
				],
				[
					'title'   => esc_html__( 'Custom types', 'woocommerce-tm-extra-product-options' ),
					'desc'    => esc_html__( 'Select custom file types the user will be allowed to upload separated by commas.', 'woocommerce-tm-extra-product-options' ),
					'id'      => 'tm_epo_custom_file_types',
					'default' => '',
					'type'    => 'text',
				],
				[
					'type'  => 'tm_html',
					'id'    => 'epo_page_options_html',
					'title' => esc_html__( 'File manager', 'woocommerce-tm-extra-product-options' ),
					'html'  => $html,
				],
				[
					'type' => 'tm_sectionend',
					'id'   => 'epo_page_options',
				],
			];

		return $_upload_settings;
	}

	/**
	 * Code settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_setting_code( $setting, $label ) {
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'CSS code', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Only enter pure CSS code without and style tags', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_css_code',
				'default' => '',
				'type'    => 'textarea',
				'class'   => 'tc-admin-textarea',
			],
			[
				'title'   => esc_html__( 'JavaScript code', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Only enter pure JavaScript code without and script tags', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_js_code',
				'default' => '',
				'type'    => 'textarea',
				'class'   => 'tc-admin-textarea',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];
	}

	/**
	 * Math Formula Constants settings
	 *
	 * @param string $setting The name of the setting.
	 * @param string $label The label for the section.
	 * @return array<mixed>
	 * @since 6.0
	 */
	public function get_setting_math( $setting, $label ) {
		$html = '<div class="tm-mn-header"><div class="tm-mn-path">'
				. '<button type="button" class="tc-add-constant tc tc-button">' . esc_html__( 'Add Constant', 'woocommerce-tm-extra-product-options' ) . '</button>'
				. '</div></div>';
		return [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'id'      => 'tm_epo_math',
				'default' => '',
				'type'    => 'textarea',
				'class'   => 'tc-epo-math tc-admin-textarea tm-hidden',
			],
			[
				'type'  => 'tm_html',
				'id'    => 'epo_page_options_math_html',
				'title' => esc_html__( 'Math Formula Constants', 'woocommerce-tm-extra-product-options' ),
				'html'  => $html,
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];
	}
}
includes/classes/class-themecomplete-epo-math-deprecated.php000064400000137236150755142450020310 0ustar00<?php
/**
 * Extra Product Options Math class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 * phpcs:disable Generic.Files.OneObjectStructurePerFile
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Math class
 *
 * Based on MathExecutor by Alexander Kiryukhin
 * https://github.com/neonxp/MathExecutor
 * Copyright (c) Alexander Kiryukhin
 *
 * 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.
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */
class THEMECOMPLETE_EPO_MATH_DEPRECATED {

	/**
	 * Available variables
	 *
	 * @var array<string, float|string>
	 */
	public $variables = [];

	/**
	 * Variable not found handler.
	 *
	 * @var callable|null
	 */
	public $on_var_not_found = null;

	/**
	 * Validation method that will be invoked when a variable is set using set_var.
	 *
	 * @var callable|null
	 */
	public $on_var_validation = null;

	/**
	 * Operators array (default and custom)
	 * Operators + - * / %
	 * Logical operators ==, !=, <, <, >=, <=, &&, ||
	 *
	 * @var THEMECOMPLETE_EPO_MATH_Operator[]
	 */
	public $operators = [];

	/**
	 * Array of custom functions.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_CustomFunction>
	 */
	public $functions = [];

	/**
	 * Token cache.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_Token[]>
	 */
	protected $cache = [];

	/**
	 * Class constructor.
	 */
	public function __construct() {
		$this->add_defaults();
	}

	/**
	 * When the object is cloned, set default operands and functions.
	 */
	public function __clone() {
		$this->add_defaults();
	}

	/**
	 * Add an operator.
	 *
	 * @param THEMECOMPLETE_EPO_MATH_Operator $operator Operator to add.
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function add_operator( THEMECOMPLETE_EPO_MATH_Operator $operator ): self {
		$this->operators[ $operator->operator ] = $operator;

		return $this;
	}

	/**
	 * Evaluate an expression.
	 *
	 * @param string  $expression The expression to execute.
	 * @param boolean $cache IF the result should be cached.
	 *
	 * @return integer|float|string|null
	 */
	public static function evaluate( string $expression, bool $cache = true ) {
		$self = new self();
		$self->use_bcmath( 100 );
		$self->set_division_by_zero_to_zero();
		$result = $self->execute( $expression, $cache );
		unset( $self );
		return $result;
	}

	/**
	 * Execute the expression.
	 *
	 * @param string  $expression The expression to execute.
	 * @param boolean $cache IF the result should be cached.
	 *
	 * @return integer|float|string|null
	 */
	public function execute( string $expression, bool $cache = true ) {
		$cache_key = $expression;

		if ( ! array_key_exists( $cache_key, $this->cache ) ) {
			$tokens = ( new THEMECOMPLETE_EPO_MATH_Tokenizer( $expression, $this->operators ) )->tokenize()->build_reverse_polish_notation();

			if ( $cache ) {
				$this->cache[ $cache_key ] = $tokens;
			}
		} else {
			$tokens = $this->cache[ $cache_key ];
		}

		$calculator = new THEMECOMPLETE_EPO_MATH_Calculator( $this->functions, $this->operators );

		$result = $calculator->calculate( $tokens, $this->variables, $this->on_var_not_found, $this );

		if ( ! is_numeric( $result ) ) {
			$result = 0;
		}

		return $result;
	}

	/**
	 * Add a custom function.
	 *
	 * @param string  $name Name of function.
	 * @param Closure $func The Function to add.
	 *
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function add_function( string $name, Closure $func = null ): self {
		$this->functions[ $name ] = new THEMECOMPLETE_EPO_MATH_CustomFunction( $name, $func );

		return $this;
	}

	/**
	 * Get all variables.
	 *
	 * @return array<string, float|string>
	 */
	public function get_vars(): array {
		return $this->variables;
	}

	/**
	 * Get a specific var
	 *
	 * @param string $variable The variable to get.
	 * @return mixed
	 */
	public function get_var( string $variable ) {
		if ( ! array_key_exists( $variable, $this->variables ) ) {
			if ( $this->on_var_not_found ) {
				return call_user_func( $this->on_var_not_found, $variable );
			}

			return THEMECOMPLETE_EPO_MATH_Error::trigger( "Variable ({$variable}) not set", 'UnknownVariableError', 0 );
		}

		return $this->variables[ $variable ];
	}

	/**
	 * Add a custom variable. To set a custom validator use set_var_validation_handler.
	 *
	 * @param string $variable The variable to set the value for.
	 * @param mixed  $value The value to set the variable to.
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function set_var( string $variable, $value ): self {
		if ( $this->on_var_validation ) {
			$value = call_user_func( $this->on_var_validation, $variable, $value );
		}

		$this->variables[ $variable ] = $value;

		return $this;
	}

	/**
	 * Test to see if a variable exists
	 *
	 * @param string $variable The variable to test if it exists.
	 */
	public function var_exists( string $variable ): bool {
		return array_key_exists( $variable, $this->variables );
	}

	/**
	 * Add custom variables.
	 *
	 * @param  array<string, float|integer|string> $variables The array variables to add.
	 * @param  boolean                             $clear If we should clear previous variables.
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function set_vars( array $variables, bool $clear = true ): self {
		if ( $clear ) {
			$this->remove_vars();
		}

		foreach ( $variables as $name => $value ) {
			$this->set_var( $name, $value );
		}

		return $this;
	}

	/**
	 * Define a method that will be invoked when a variable is not found.
	 * The first parameter will be the variable name, and the returned value will be used as the variable value.
	 *
	 * @param callable $handler The handler to set.
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function set_var_not_found_handler( callable $handler ): self {
		$this->on_var_not_found = $handler;

		return $this;
	}

	/**
	 * Define a validation method that will be invoked when a variable is set using set_var.
	 * The first parameter will be the variable name, and the second will be the variable value.
	 * Set to null to disable validation.
	 *
	 * @param ?callable $handler The validation handler to set.
	 *
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function set_var_validation_handler( ?callable $handler ): self {
		$this->on_var_validation = $handler;

		return $this;
	}

	/**
	 * Remove a custom variable.
	 *
	 * @param string $variable The variable to remove.
	 *
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function remove_var( string $variable ): self {
		unset( $this->variables[ $variable ] );

		return $this;
	}

	/**
	 * Remove all variables and the variable not found handler
	 *
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function remove_vars(): self {
		$this->variables        = [];
		$this->on_var_not_found = null;

		return $this;
	}

	/**
	 * Get all registered operators.
	 *
	 * @return array<THEMECOMPLETE_EPO_MATH_Operator> of operator class names
	 */
	public function get_operators(): array {
		return $this->operators;
	}

	/**
	 * Get all registered functions
	 *
	 * @return array<string, THEMECOMPLETE_EPO_MATH_CustomFunction> containing callback and places indexed by function name.
	 */
	public function get_functions(): array {
		return $this->functions;
	}

	/**
	 * Remove a specific operator
	 *
	 * @param string $operator The operator to remove.
	 * @return THEMECOMPLETE_EPO_MATH_DEPRECATED
	 */
	public function remove_operator( string $operator ): self {
		unset( $this->operators[ $operator ] );

		return $this;
	}

	/**
	 * Set division by zero returns zero instead of throwing an error
	 */
	public function set_division_by_zero_to_zero(): self {
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'/',
				false,
				180,
				static function ( $a, $b ) {
					return 0 == $b ? 0 : (float) $a / (float) $b; // phpcs:ignore
				}
			)
		);

		return $this;
	}

	/**
	 * Get cache array with tokens
	 *
	 * @return array<string, THEMECOMPLETE_EPO_MATH_Token[]>
	 */
	public function get_cache(): array {
		return $this->cache;
	}

	/**
	 * Clear token's cache
	 */
	public function clear_cache(): self {
		$this->cache = [];

		return $this;
	}

	/**
	 * Use BCMAth fixed precision.
	 *
	 * @param integer $scale The precision to use.
	 * @return self
	 */
	public function use_bcmath( int $scale = 2 ): self {
		if ( ! function_exists( 'bcscale' ) ) {
			return $this;
		}
		bcscale( $scale );
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'+',
				false,
				170,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcadd( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'-',
				false,
				170,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcsub( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'uNeg',
				false,
				200,
				static function ( $a ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					return bcsub( '0.0', "{$a}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'*',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcmul( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'/',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					if ( 0 == $b ) { // phpcs:ignore
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Division By Zero', 'DivisionByZeroError', 0 );
					}
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );

					return bcdiv( "{$a}", "{$b}" );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'^',
				true,
				220,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return themecomplete_bcpow( "{$a}", "{$b}", 50, $scale );
				}
			)
		);
		$this->add_operator(
			new THEMECOMPLETE_EPO_MATH_Operator(
				'%',
				false,
				180,
				static function ( $a, $b ) use ( $scale ) {
					$a = themecomplete_bcconv( (float) $a, $scale );
					$b = themecomplete_bcconv( (float) $b, $scale );
					return bcmod( "{$a}", "{$b}" );
				}
			)
		);

		return $this;
	}

	/**
	 * Set default operands and functions
	 */
	protected function add_defaults(): self {
		foreach ( $this->default_operators() as $name => $operator ) {
			[$callable, $priority, $is_right_assoc] = $operator;
			$this->add_operator( new THEMECOMPLETE_EPO_MATH_Operator( $name, $is_right_assoc, $priority, $callable ) );
		}

		foreach ( $this->default_functions() as $name => $callable ) {
			$this->add_function( $name, $callable );
		}

		$this->on_var_validation = [ $this, 'default_var_validation' ];
		$this->variables         = $this->default_vars();

		return $this;
	}

	/**
	 * Get the default operators
	 *
	 * @return array<string, array{Closure, int, bool}>
	 */
	protected function default_operators(): array {
		return [
			'+'    => [
				static function ( $a, $b ) {
					return $a + $b;
				},
				170,
				false,
			],
			'-'    => [
				static function ( $a, $b ) {
					return $a - $b;
				},
				170,
				false,
			],
			// unary positive token.
			'uPos' => [
				static function ( $a ) {
					return $a;
				},
				200,
				false,
			],
			// unary minus token.
			'uNeg' => [
				static function ( $a ) {
					return 0 - $a;
				},
				200,
				false,
			],
			'*'    => [
				static function ( $a, $b ) {
					return $a * $b;
				},
				180,
				false,
			],
			'/'    => [
				static function ( $a, $b ) {
					if ( 0 == $b ) { // phpcs:ignore
						return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Division By Zero', 'DivisionByZeroError', 0 );
					}

					return $a / $b;
				},
				180,
				false,
			],
			'^'    => [
				static function ( $a, $b ) {
					return pow( $a, $b );
				},
				220,
				true,
			],
			'%'    => [
				static function ( $a, $b ) {
					return $a % $b;
				},
				180,
				false,
			],
			'&&'   => [
				static function ( $a, $b ) {
					return $a && $b;
				},
				100,
				false,
			],
			'||'   => [
				static function ( $a, $b ) {
					return $a || $b;
				},
				90,
				false,
			],
			'=='   => [
				static function ( $a, $b ) {
					return ( is_numeric( $a ) && is_numeric( $b ) ) ? THEMECOMPLETE_EPO_HELPER()->convert_to_number( $a, true ) === THEMECOMPLETE_EPO_HELPER()->convert_to_number( $b, true ) : ( is_string( $a ) || is_string( $b ) ? 0 == strcmp( $a, $b ) : $a == $b ); // phpcs:ignore
				},
				140,
				false,
			],
			'!='   => [
				static function ( $a, $b ) {
					return ( is_numeric( $a ) && is_numeric( $b ) ) ? THEMECOMPLETE_EPO_HELPER()->convert_to_number( $a, true ) !== THEMECOMPLETE_EPO_HELPER()->convert_to_number( $b, true ) : ( is_string( $a ) || is_string( $b ) ? 0 != strcmp( $a, $b ) : $a != $b ); // phpcs:ignore
				},
				140,
				false,
			],
			'>='   => [
				static function ( $a, $b ) {
					return $a >= $b;
				},
				150,
				false,
			],
			'>'    => [
				static function ( $a, $b ) {
					return $a > $b;
				},
				150,
				false,
			],
			'<='   => [
				static function ( $a, $b ) {
					return $a <= $b;
				},
				150,
				false,
			],
			'<'    => [
				static function ( $a, $b ) {
					return $a < $b;
				},
				150,
				false,
			],
			'!'    => [
				static function ( $a ) {
					return ! $a;
				},
				190,
				false,
			],
		];
	}

	/**
	 * Gets the default functions as an array.  Key is function name
	 * and value is the function as a closure.
	 *
	 * @return array<Closure>
	 */
	protected function default_functions(): array {
		return [
			'abs'         => static function ( $arg ) {
				return abs( $arg );
			},
			'acos'        => static function ( $arg ) {
				return acos( $arg );
			},
			'acosh'       => static function ( $arg ) {
				return acosh( $arg );
			},
			'arcsin'      => static function ( $arg ) {
				return asin( $arg );
			},
			'arcctg'      => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arccot'      => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arccotan'    => static function ( $arg ) {
				return M_PI / 2 - atan( $arg );
			},
			'arcsec'      => static function ( $arg ) {
				return acos( 1 / $arg );
			},
			'arccosec'    => static function ( $arg ) {
				return asin( 1 / $arg );
			},
			'arccsc'      => static function ( $arg ) {
				return asin( 1 / $arg );
			},
			'arccos'      => static function ( $arg ) {
				return acos( $arg );
			},
			'arctan'      => static function ( $arg ) {
				return atan( $arg );
			},
			'arctg'       => static function ( $arg ) {
				return atan( $arg );
			},
			'asin'        => static function ( $arg ) {
				return asin( $arg );
			},
			'atan'        => static function ( $arg ) {
				return atan( $arg );
			},
			'atan2'       => static function ( $arg1, $arg2 ) {
				return atan2( $arg1, $arg2 );
			},
			'atanh'       => static function ( $arg ) {
				return atanh( $arg );
			},
			'atn'         => static function ( $arg ) {
				return atan( $arg );
			},
			'bindec'      => static function ( $arg ) {
				return bindec( $arg );
			},
			'ceil'        => static function ( $arg ) {
				return ceil( $arg );
			},
			'cos'         => static function ( $arg ) {
				return cos( $arg );
			},
			'cosec'       => static function ( $arg ) {
				return 1 / sin( $arg );
			},
			'csc'         => static function ( $arg ) {
				return 1 / sin( $arg );
			},
			'cosh'        => static function ( $arg ) {
				return cosh( $arg );
			},
			'ctg'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'cot'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );},
			'cotan'       => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'cotg'        => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );
			},
			'ctn'         => static function ( $arg ) {
				return cos( $arg ) / sin( $arg );},
			'decbin'      => static function ( $arg ) {
				return decbin( $arg );
			},
			'dechex'      => static function ( $arg ) {
				return dechex( $arg );
			},
			'decoct'      => static function ( $arg ) {
				return decoct( $arg );
			},
			'deg2rad'     => static function ( $arg ) {
				return deg2rad( $arg );
			},
			'exp'         => static function ( $arg ) {
				return exp( $arg );
			},
			'expm1'       => static function ( $arg ) {
				return expm1( $arg );
			},
			'floor'       => static function ( $arg ) {
				return floor( $arg );
			},
			'int'         => static function ( $arg ) {
				return floor( $arg );
			},
			'fmod'        => static function ( $arg1, $arg2 ) {
				return fmod( $arg1, $arg2 );
			},
			'hexdec'      => static function ( $arg ) {
				return hexdec( $arg );
			},
			'hypot'       => static function ( $arg1, $arg2 ) {
				return hypot( $arg1, $arg2 );
			},
			'if'          => function ( $expr, $trueval, $falseval ) {
				if ( true === $expr || false === $expr ) {
					$exres = $expr;
				} else {
					$exres = $this->execute( $expr );
				}

				if ( $exres ) {
					return $this->execute( $trueval );
				}

				return $this->execute( $falseval );
			},
			'intdiv'      => static function ( $arg1, $arg2 ) {
				return intdiv( $arg1, $arg2 );
			},
			'ln'          => static function ( $num, $base = M_E ) {
				return log( $num, $base );
			},
			'lg'          => static function ( $arg ) {
				return log10( $arg );
			},
			'log'         => static function ( $num, $base = M_E ) {
				return log( $num, $base );
			},
			'log10'       => static function ( $arg ) {
				return log10( $arg );
			},
			'log1p'       => static function ( $arg ) {
				return log1p( $arg );
			},
			'octdec'      => static function ( $arg ) {
				return octdec( $arg );
			},
			'pi'          => static function () {
				return M_PI;
			},
			'pow'         => static function ( $arg1, $arg2 ) {
				return $arg1 ** $arg2;
			},
			'rad2deg'     => static function ( $arg ) {
				return rad2deg( $arg );
			},
			'round'       => static function ( $num, int $precision = 0 ) {
				return round( $num, $precision );
			},
			'sin'         => static function ( $arg ) {
				return sin( $arg );
			},
			'sinh'        => static function ( $arg ) {
				return sinh( $arg );
			},
			'sec'         => static function ( $arg ) {
				return 1 / cos( $arg );
			},
			'sqrt'        => static function ( $arg ) {
				return sqrt( $arg );
			},
			'tan'         => static function ( $arg ) {
				return tan( $arg );
			},
			'tanh'        => static function ( $arg ) {
				return tanh( $arg );
			},
			'tn'          => static function ( $arg ) {
				return tan( $arg );
			},
			'tg'          => static function ( $arg ) {
				return tan( $arg );
			},
			'lookuptable' => function ( $field, $lookup_table_id ) {
				$lookup_tables = THEMECOMPLETE_EPO()->fetch_lookuptables();
				$price         = 0;
				$table_num     = 0;
				if ( $lookup_tables ) {
					if ( is_array( $lookup_table_id ) ) {
						$table_num       = isset( $lookup_table_id[1] ) ? (int) $lookup_table_id[1] : 0;
						$lookup_table_id = $lookup_table_id[0];
					}
					if ( ! $lookup_table_id ) {
						return 0;
					}
					if ( ! $table_num ) {
						$table_num = 0;
					}
					if ( is_array( $field ) ) {
						$x = $field[0];
						$y = isset( $field[1] ) ? $field[1] : '';
					} else {
						$x = $field;
						$y = '';
					}
					$table = $lookup_tables[ $lookup_table_id ];
					if ( $table ) {
						$table = $table[ $table_num ];
						if ( $table ) {
							$table = $table['data'];
							if ( is_numeric( $x ) && floatval( $x ) == $x ) { // phpcs:ignore
								$x = (float) $x;
							} else {
								$x = (string) $x;
							}
							if ( is_numeric( $y ) && floatval( $y ) == $y ) { // phpcs:ignore
								$y = (float) $y;
							} else {
								$y = (string) $y;
							}
							$x_row = false;
							if ( ! array_key_exists( strval( $x ), $table ) ) {
								if ( is_numeric( $x ) && ( (int) 0 === (int) $x ) ) {
									$x_row = $table[ array_keys( $table )[0] ];
								} elseif ( $x ) {
									$x = $this->find_lookup_table_index( $x, $table );
									if ( $x && isset( $table[ $x ] ) ) {
										$x_row = $table[ $x ];
									}
								}
							} else {
								$x_row = $table[ $x ];
							}
							if ( $x_row && is_array( $x_row ) ) {
								if ( $y ) {
									$y = $this->find_lookup_table_index( $y, $x_row );
								} else {
									$y = array_keys( $x_row );
									$y = $y[0];
								}

								if ( 'max' === $y ) {
									$price = (float) $x_row[ array_keys( $x_row )[ count( array_keys( $x_row ) ) - 1 ] ];
								} elseif ( isset( $x_row[ $y ] ) ) {
									$price = (float) $x_row[ $y ];
								}
							}
						}
					}
				}
				return $price;
			},
		];
	}

	/**
	 * Check if the array has numeric values or max
	 *
	 * @param array<mixed> $arr The array to check.
	 * @return boolean
	 */
	private function has_numeric_values_or_max_last( $arr ) {
		$last_element = $arr[ count( $arr ) - 1 ];

		$are_all_numeric_values = array_reduce(
			$arr,
			function ( $carry, $val ) {
				return $carry && is_numeric( $val );
			},
			true
		);
		return $are_all_numeric_values || 'max' === $last_element;
	}

	/**
	 * Find the closest index on the provided $table
	 *
	 * @param mixed        $value The value to check.
	 * @param array<mixed> $table The table check the value against.
	 * @return string|false
	 */
	protected function find_lookup_table_index( $value, $table ) {

		$keys = array_keys( $table );

		if ( $this->has_numeric_values_or_max_last( $keys ) ) {
			$value = (float) $value;
			$table = array_map(
				function ( $n ) {
					return 'max' === $n ? $n : (float) $n;
				},
				$keys
			);

			$ret = array_reduce(
				$table,
				function ( $a, $b ) use ( $value ) {
					if ( 'max' === $b && $value > $a ) {
						return $b;
					}
					if ( 'max' === $a && $value > $b ) {
						return $a;
					}
					if ( $a < $b ) {
						if ( $value > $a && $value <= $b ) {
							return $b;
						}
					} else {
						if ( ( $value > $b && $value <= $a ) || ( $value > $a || 'max' === $b ) ) {
							return $a;
						}
						return $b;
					}
					if ( $value > $b ) {
						return $b;
					}
					return $a;
				}
			);
			if ( $value > call_user_func_array( 'max', $keys ) || $value < call_user_func_array( 'min', $keys ) ) {
				return false;
			}
		} else {
			$ret = $value;
		}
		return (string) $ret;
	}

	/**
	 * Returns the default variables names as key/value pairs
	 *
	 * @return array<string, float>
	 */
	protected function default_vars(): array {
		return [
			'pi' => 3.141592653589793,
			'e'  => 2.718281828459045,
		];
	}

	/**
	 * Default variable validation, ensures that the value is a scalar or array.
	 *
	 * @param string $variable The variable to validate.
	 * @param mixed  $value The value to validate.
	 * @return mixed
	 */
	protected function default_var_validation( string $variable, $value ) {
		if ( ! is_scalar( $value ) && ! is_array( $value ) && null !== $value ) {
			$type = gettype( $value );

			return THEMECOMPLETE_EPO_MATH_Error::trigger( "Variable ({$variable}) type ({$type}) is not scalar or array!", 0 );
		}
		return $value;
	}
}

/**
 * Math Tokenizer class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_Tokenizer {

	/**
	 * Array of tokens.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Token>
	 */
	public $tokens = [];

	/**
	 * The input expression.
	 *
	 * @var string
	 */
	private $input = '';

	/**
	 * The number buffer.
	 *
	 * @var string
	 */
	private $number_buffer = '';

	/**
	 * The string buffer.
	 *
	 * @var string
	 */
	private $string_buffer = '';

	/**
	 * If negative number is allowed.
	 *
	 * @var boolean
	 */
	private $allow_negative = true;

	/**
	 * Array of operators.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Operator>
	 */
	private $operators = [];

	/**
	 * If the string has single quotes.
	 *
	 * @var boolean
	 */
	private $in_single_quoted_string = false;

	/**
	 * If the string has double quotes.
	 *
	 * @var boolean
	 */
	private $in_double_quoted_string = false;

	/**
	 * Tokenizer constructor.
	 *
	 * @param string       $input Input expression.
	 * @param array<mixed> $operators Operator array.
	 * @return void
	 */
	public function __construct( string $input, array $operators ) {
		$this->input     = $input;
		$this->operators = $operators;
	}

	/**
	 * Tokenize the expression.
	 *
	 * @return self
	 */
	public function tokenize(): self {
		$is_last_char_escape = false;

		foreach ( str_split( $this->input ) as $ch ) {
			switch ( true ) {
				case $this->in_single_quoted_string:
					if ( '\\' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '\\';
							$is_last_char_escape  = false;
						} else {
							$is_last_char_escape = true;
						}

						continue 2;
					} elseif ( "'" === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= "'";
							$is_last_char_escape  = false;
						} else {
							$this->tokens[]                = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::STRING, $this->string_buffer );
							$this->in_single_quoted_string = false;
							$this->string_buffer           = '';
						}

						continue 2;
					}

					if ( $is_last_char_escape ) {
						$this->string_buffer .= '\\';
						$is_last_char_escape  = false;
					}
					$this->string_buffer .= $ch;

					continue 2;

				case $this->in_double_quoted_string:
					if ( '\\' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '\\';
							$is_last_char_escape  = false;
						} else {
							$is_last_char_escape = true;
						}

						continue 2;
					} elseif ( '"' === $ch ) {
						if ( $is_last_char_escape ) {
							$this->string_buffer .= '"';
							$is_last_char_escape  = false;
						} else {
							$this->tokens[]                = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::STRING, $this->string_buffer );
							$this->in_double_quoted_string = false;
							$this->string_buffer           = '';
						}

						continue 2;
					}

					if ( $is_last_char_escape ) {
						$this->string_buffer .= '\\';
						$is_last_char_escape  = false;
					}
					$this->string_buffer .= $ch;

					continue 2;

				case '[' === $ch:
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::FUNCTION, 'array' );
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS, '' );

					continue 2;

				case ' ' === $ch || "\n" === $ch || "\r" === $ch || "\t" === $ch:
					/**
					 * In case those tokens must not be ingored use the following
					 * $this->empty_number_buffer_as_literal();
					 * $this->empty_str_buffer_as_variable();
					 * $this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::SPACE, '' );
					 */
					continue 2;

				case $this->is_number( $ch ):
					if ( '' !== $this->string_buffer ) {
						$this->string_buffer .= $ch;

						continue 2;
					}
					$this->number_buffer .= $ch;
					$this->allow_negative = false;

					break;

				case 'e' === strtolower( $ch ):
					if ( strlen( $this->number_buffer ) && str_contains( $this->number_buffer, '.' ) ) {
						$this->number_buffer .= 'e';
						$this->allow_negative = false;

						break;
					}
					// no break
					// Intentionally fall through.
				case $this->is_alpha( $ch ):
					if ( strlen( $this->number_buffer ) ) {
						$this->empty_number_buffer_as_literal();
						$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '*' );
					}
					$this->allow_negative = false;
					$this->string_buffer .= $ch;

					break;

				case '"' === $ch:
					$this->in_double_quoted_string = true;

					continue 2;

				case "'" === $ch:
					$this->in_single_quoted_string = true;

					continue 2;

				case $this->is_dot( $ch ):
					$this->number_buffer .= $ch;
					$this->allow_negative = false;

					break;

				case $this->is_lp( $ch ):
					if ( '' !== $this->string_buffer ) {
						$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::FUNCTION, $this->string_buffer );
						$this->string_buffer = '';
					} elseif ( strlen( $this->number_buffer ) ) {
						$this->empty_number_buffer_as_literal();
						$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '*' );
					}
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS, '' );

					break;

				case $this->is_rp( $ch ) || ']' === $ch:
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();
					$this->allow_negative = false;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS, '' );

					break;

				case $this->is_comma( $ch ):
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();
					$this->allow_negative = true;
					$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::PARAMSEPARATOR, '' );

					break;

				default:
					// special case for unary operations.
					if ( '-' === $ch || '+' === $ch ) {
						if ( $this->allow_negative ) {
							$this->allow_negative = false;
							$this->tokens[]       = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, '-' === $ch ? 'uNeg' : 'uPos' );

							continue 2;
						}
						// could be in exponent, in which case negative should be added to the number_buffer.
						if ( $this->number_buffer && 'e' === $this->number_buffer[ strlen( $this->number_buffer ) - 1 ] ) {
							$this->number_buffer .= $ch;

							continue 2;
						}
					}
					$this->empty_number_buffer_as_literal();
					$this->empty_str_buffer_as_variable();

					if ( '$' !== $ch ) {
						if ( count( $this->tokens ) > 0 ) {
							if ( THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $this->tokens[ count( $this->tokens ) - 1 ]->type ) {
								$this->tokens[ count( $this->tokens ) - 1 ]->value .= $ch;
							} else {
								$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, $ch );
							}
						} else {
							$this->tokens[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::OPERATOR, $ch );
						}
					}
					$this->allow_negative = true;
			}
		}
		$this->empty_number_buffer_as_literal();
		$this->empty_str_buffer_as_variable();

		$token_test = [];
		foreach ( $this->tokens as $key => $token ) {
			$token_test[ $key ] = $token->type;
		}
		foreach ( $token_test as $key => $type ) {
			if ( $key > 0 && THEMECOMPLETE_EPO_MATH_Token::SPACE === $type && THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token_test[ $key + 1 ] && THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token_test[ $key - 1 ] ) {
				unset( $this->tokens[ $key - 1 ] );
				unset( $this->tokens[ $key + 1 ] );
				$this->tokens[ $key ] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 );
			}
		}
		return $this;
	}

	/**
	 * Create Reverse Polish Notation.
	 *
	 * @return THEMECOMPLETE_EPO_MATH_Token[] Array of tokens in reverse polish notation
	 */
	public function build_reverse_polish_notation(): array {
		$tokens        = [];
		$stack         = new SplStack();
		$param_counter = new SplStack();

		foreach ( $this->tokens as $token ) {
			try {
				switch ( $token->type ) {
					case THEMECOMPLETE_EPO_MATH_Token::LITERAL:
					case THEMECOMPLETE_EPO_MATH_Token::VARIABLE:
					case THEMECOMPLETE_EPO_MATH_Token::STRING:
						$tokens[] = $token;

						if ( $param_counter->count() > 0 && 0 === $param_counter->top() ) {
							$param_counter->push( $param_counter->pop() + 1 );
						}

						break;

					case THEMECOMPLETE_EPO_MATH_Token::FUNCTION:
						if ( $param_counter->count() > 0 && 0 === $param_counter->top() ) {
							$param_counter->push( $param_counter->pop() + 1 );
						}
						$stack->push( $token );
						$param_counter->push( 0 );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS:
						$stack->push( $token );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::PARAMSEPARATOR:
						while ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS !== $stack->top()->type ) {
							if ( 0 === $stack->count() ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
							}
							$tokens[] = $stack->pop();
						}
						$param_counter->push( $param_counter->pop() + 1 );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::OPERATOR:
						if ( ! array_key_exists( $token->value, $this->operators ) ) {
							return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownOperatorError', $tokens );
						}
						$op1 = $this->operators[ $token->value ];

						while ( $stack->count() > 0 && THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $stack->top()->type ) {
							if ( ! array_key_exists( $stack->top()->value, $this->operators ) ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( $stack->top()->value, 'UnknownOperatorError', $tokens );
							}
							$op2 = $this->operators[ $stack->top()->value ];

							if ( $op2->priority >= $op1->priority ) {
								$tokens[] = $stack->pop();

								continue;
							}

							break;
						}
						$stack->push( $token );

						break;

					case THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS:
						while ( true ) {
							try {
								$ctoken = $stack->pop();

								if ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS === $ctoken->type ) {
									break;
								}
								$tokens[] = $ctoken;
							} catch ( RuntimeException $e ) {
								return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
							}
						}

						if ( $stack->count() > 0 && THEMECOMPLETE_EPO_MATH_Token::FUNCTION == $stack->top()->type ) { // phpcs:ignore
							$f              = $stack->pop();
							$f->param_count = $param_counter->pop();
							$tokens[]       = $f;
						}

						break;

					case THEMECOMPLETE_EPO_MATH_Token::SPACE:
						// do nothing.
				}
			} catch ( Exception $e ) {
				$tokens = [];
				return $tokens;
			}
		}

		while ( 0 !== $stack->count() ) {
			if ( THEMECOMPLETE_EPO_MATH_Token::LEFTPARENTHESIS === $stack->top()->type || THEMECOMPLETE_EPO_MATH_Token::RIGHTPARENTHESIS === $stack->top()->type ) {
				return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Brackets', 'IncorrectBracketsError', $tokens );
			}

			if ( THEMECOMPLETE_EPO_MATH_Token::SPACE === $stack->top()->type ) {
				$stack->pop();

				continue;
			}
			$tokens[] = $stack->pop();
		}

		return $tokens;
	}

	/**
	 * Check if the current character is a number.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_number( string $ch ): bool {
		return $ch >= '0' && $ch <= '9';
	}

	/**
	 * Check if the current character is an alpha character.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_alpha( string $ch ): bool {
		return $ch >= 'a' && $ch <= 'z' || $ch >= 'A' && $ch <= 'Z' || '_' === $ch;
	}

	/**
	 * Empty tye number buffer.
	 */
	private function empty_number_buffer_as_literal(): void {
		if ( strlen( $this->number_buffer ) ) {
			$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $this->number_buffer );
			$this->number_buffer = '';
		}
	}

	/**
	 * Check if the current character is a dot.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_dot( string $ch ): bool {
		return '.' === $ch;
	}

	/**
	 * Check if the current character is a left parenthesis.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_lp( string $ch ): bool {
		return '(' === $ch;
	}

	/**
	 * Check if the current character is a right parenthesis.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_rp( string $ch ): bool {
		return ')' === $ch;
	}

	/**
	 * Empty the string buffer.
	 */
	private function empty_str_buffer_as_variable(): void {
		if ( '' !== $this->string_buffer ) {
			$this->tokens[]      = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::VARIABLE, $this->string_buffer );
			$this->string_buffer = '';
		}
	}

	/**
	 * Check if the current character is a comma.
	 *
	 * @param string $ch Current character.
	 * @return boolean
	 */
	private function is_comma( string $ch ): bool {
		return ',' === $ch;
	}
}

/**
 * Math Token class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_Token {

	public const LITERAL          = 'literal';
	public const VARIABLE         = 'variable';
	public const OPERATOR         = 'operator';
	public const LEFTPARENTHESIS  = 'LP';
	public const RIGHTPARENTHESIS = 'RP';
	public const FUNCTION         = 'function';
	public const PARAMSEPARATOR   = 'separator';
	public const STRING           = 'string';
	public const SPACE            = 'space';

	/**
	 * Token type.
	 *
	 * @var string
	 */
	public $type = self::LITERAL;

	/**
	 * Token value.
	 *
	 * @var mixed
	 */
	public $value;

	/**
	 * Token name.
	 *
	 * @var string|null
	 */
	public $name;

	/**
	 * Store function parameter count in stack.
	 *
	 * @var integer|null
	 */
	public $param_count = null;

	/**
	 * Token constructor.
	 *
	 * @param string      $type Token type.
	 * @param mixed       $value Token value.
	 * @param string|null $name Token name.
	 */
	public function __construct( string $type, $value, ?string $name = null ) {
		$this->type  = $type;
		$this->value = $value;
		$this->name  = $name;
	}
}

/**
 * Math Operator class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_Operator {

	/**
	 * The custom operator.
	 *
	 * @var string
	 */
	public $operator = '';

	/**
	 * If it is a right associative operator.
	 *
	 * @var boolean
	 */
	public $is_right_assoc = false;

	/**
	 * Operator priority
	 *
	 * @var integer
	 */
	public $priority = 0;

	/**
	 * The callable function.
	 *
	 * @var callable(SplStack)
	 */
	public $function;

	/**
	 * The number of parameters for the operator.
	 *
	 * @var integer
	 */
	public $places = 0;

	/**
	 * Operator constructor.
	 *
	 * @param string  $operator The operator.
	 * @param boolean $is_right_assoc If it is a right associative operator.
	 * @param integer $priority Operator priority.
	 * @param Closure $func Operator Function.
	 */
	public function __construct( string $operator, bool $is_right_assoc, int $priority, Closure $func ) {
		$this->operator       = $operator;
		$this->is_right_assoc = $is_right_assoc;
		$this->priority       = $priority;
		$this->function       = $func;
		$reflection           = new ReflectionFunction( $func );
		$this->places         = $reflection->getNumberOfParameters();
	}

	/**
	 * Execute expression.
	 *
	 * @param array<mixed> $stack The array of tokens.
	 * @return THEMECOMPLETE_EPO_MATH_Token
	 */
	public function execute( array &$stack ): THEMECOMPLETE_EPO_MATH_Token {

		if ( count( $stack ) < $this->places ) {
			$stack = [];
			return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Incorrect Expression', 'IncorrectExpressionError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 ) );
		}
		$args = [];

		for ( $i = 0; $i < $this->places; $i++ ) {
			array_unshift( $args, array_pop( $stack )->value );
		}

		$result = call_user_func_array( $this->function, $args );

		return new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $result );
	}
}

/**
 * Math Custom Function class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_CustomFunction {

	/**
	 * The function name.
	 *
	 * @var string
	 */
	public $name = '';

	/**
	 * The callable function.
	 *
	 * @var callable $function
	 */
	public $function;

	/**
	 * The required parameters of the function.
	 *
	 * @var integer
	 */
	private $required_param_count;

	/**
	 * CustomFunction constructor.
	 *
	 * @param string  $name The function name.
	 * @param Closure $func The callable function.
	 */
	public function __construct( string $name, Closure $func ) {
		$this->name                 = $name;
		$this->function             = $func;
		$this->required_param_count = ( new ReflectionFunction( $func ) )->getNumberOfRequiredParameters();
	}

	/**
	 * Execute expression.
	 *
	 * @param array<mixed> $stack The array of tokens.
	 * @param integer      $param_count_in_stack The function paramter count.
	 * @return THEMECOMPLETE_EPO_MATH_Token
	 */
	public function execute( array &$stack, int $param_count_in_stack ): THEMECOMPLETE_EPO_MATH_Token {

		if ( $param_count_in_stack < $this->required_param_count ) {
			$param_count_in_stack = $this->required_param_count;
		}

		// We skip this section.
		if ( $param_count_in_stack < $this->required_param_count ) {
			$stack = [];
			return THEMECOMPLETE_EPO_MATH_Error::trigger( $this->name, 'IncorrectNumberOfFunctionParametersError', new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, 0 ) );
		}

		$args = [];
		if ( $param_count_in_stack > 0 ) {
			for ( $i = 0; $i < $param_count_in_stack; $i++ ) {
				$object = array_pop( $stack );
				if ( is_object( $object ) && property_exists( $object, 'value' ) ) {
					$argument = $object->value;
				} else {
					$argument = null;
				}
				if ( null === $argument ) {
					$argument = '0';
					array_push( $args, $argument );
				} else {
					array_unshift( $args, $argument );
				}
			}
		}

		$result = call_user_func_array( $this->function, $args );

		return new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $result );
	}
}

/**
 * Math Calculator class
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_Calculator {

	/**
	 * Array of custom functions.
	 *
	 * @var array<string, THEMECOMPLETE_EPO_MATH_CustomFunction>
	 */
	private $functions = [];

	/**
	 * Array of operators.
	 *
	 * @var array<THEMECOMPLETE_EPO_MATH_Operator>
	 */
	private $operators = [];

	/**
	 * Class Constructor
	 *
	 * @param array<string, THEMECOMPLETE_EPO_MATH_CustomFunction> $functions Array of custom functions.
	 * @param array<THEMECOMPLETE_EPO_MATH_Operator>               $operators Array of operators.
	 */
	public function __construct( array $functions, array $operators ) {
		$this->functions = $functions;
		$this->operators = $operators;
	}

	/**
	 * Calculate array of tokens in reverse polish notation
	 *
	 * @param array<THEMECOMPLETE_EPO_MATH_Token> $tokens Array of tokens.
	 * @param array<string, float|string>         $variables Array of variables.
	 * @param callable|null                       $on_var_not_found Variable not found handler.
	 * @param mixed                               $math_object The math class.
	 *
	 * @return integer|float|string|null
	 */
	public function calculate( array $tokens, array $variables, ?callable $on_var_not_found = null, $math_object = false ) {

		if ( empty( $tokens ) ) {
			return 0;
		}

		/** Array of THEMECOMPLETE_EPO_MATH_Token */
		$stack = [];

		foreach ( $tokens as $token ) {
			if ( THEMECOMPLETE_EPO_MATH_Token::LITERAL === $token->type || THEMECOMPLETE_EPO_MATH_Token::STRING === $token->type ) {
				$stack[] = $token;
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::VARIABLE === $token->type ) {
				$variable = $token->value;

				$value = null;

				if ( array_key_exists( $variable, $variables ) ) {
					$value = $variables[ $variable ];
				} elseif ( $on_var_not_found ) {
					$value = call_user_func( $on_var_not_found, $variable );
				} else {
					$value                               = $variable;
					$math_object->variables[ $variable ] = $value;
					$variables[ $variable ]              = $value;
				}
				$stack[] = new THEMECOMPLETE_EPO_MATH_Token( THEMECOMPLETE_EPO_MATH_Token::LITERAL, $value, $variable );
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::FUNCTION === $token->type ) {
				if ( ! array_key_exists( $token->value, $this->functions ) ) {
					$math_object->add_function(
						$token->value,
						function () {
							return 0;
						}
					);
					$this->functions = $math_object->functions;
					if ( ! array_key_exists( $token->value, $this->functions ) ) {
						return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownFunctionError', 0 );
					} else {
						THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownFunctionError', 0 );
					}
				}
				$stack[] = $this->functions[ $token->value ]->execute( $stack, $token->param_count );
			} elseif ( THEMECOMPLETE_EPO_MATH_Token::OPERATOR === $token->type ) {
				if ( ! array_key_exists( $token->value, $this->operators ) ) {
					return THEMECOMPLETE_EPO_MATH_Error::trigger( $token->value, 'UnknownOperatorError', 0 );
				}
				$stack[] = $this->operators[ $token->value ]->execute( $stack );
			}
		}
		$result = array_pop( $stack );

		if ( null === $result || ! empty( $stack ) ) {
			return THEMECOMPLETE_EPO_MATH_Error::trigger( 'Stack must be empty', 'IncorrectExpressionError', 0 );
		}

		if ( false === $result->value ) {
			$result->value = 0;
		}

		if ( true === $result->value ) {
			$result->value = 1;
		}

		if ( is_numeric( $result->value ) ) {
			$result->value = (float) $result->value;
		}

		return $result->value;
	}
}

/**
 * Math Error class
 *
 * Error handling for THEMECOMPLETE_EPO_MATH.
 *
 * @package Extra Product Options/Classes/THEMECOMPLETE_EPO_MATH
 * @version 6.0
 */
class THEMECOMPLETE_EPO_MATH_Error {

	/**
	 * Trigger an error, in a nice way.
	 *
	 * @param string $msg The message to output.
	 * @param mixed  $code The error code.
	 * @param mixed  $ret The value to return.
	 *
	 * @return mixed
	 */
	public static function trigger( $msg, $code = '', $ret = false ) {
		if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
			echo "\nError found in:";
			self::debug_print_calling_function();
			echo '<br>';
			echo esc_html( $code );
			echo '<br>';
			echo esc_html( $msg );
			echo '<br>';
			trigger_error( esc_html( $msg ), E_USER_WARNING ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
		}

		return $ret;
	}

	/**
	 * Prints the file name, function name, and
	 * line number which called your function
	 * (not this function, the one that called it to begin with)
	 *
	 * @return void
	 */
	private static function debug_print_calling_function() {
		$file        = 'n/a';
		$func        = 'n/a';
		$line        = 'n/a';
		$debug_trace = debug_backtrace(); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
		if ( isset( $debug_trace[1] ) ) {
			$file = isset( $debug_trace[1]['file'] ) ? $debug_trace[1]['file'] : 'n/a';
			$line = isset( $debug_trace[1]['line'] ) ? $debug_trace[1]['line'] : 'n/a';
		}
		if ( isset( $debug_trace[2] ) ) {
			$func = $debug_trace[2]['function'] ? $debug_trace[2]['function'] : 'n/a';
		}
		echo wp_kses_post( "\n$file, $func, $line\n" );
	}
}
includes/class-themecomplete-epo-autoloader.php000064400000005671150755142450015760 0ustar00<?php
/**
 * Extra Product Options Autoloader
 *
 * @package Extra Product Options/Classes
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options Autoloader
 *
 * Autoload classes on demand.
 *
 * @package Extra Product Options/Classes
 * @author  ThemeComplete
 * @version 6.0
 */
class THEMECOMPLETE_EPO_Autoloader {

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		spl_autoload_register( [ $this, 'autoload' ] );
	}

	/**
	 * Take a class name and turn it into a file name
	 *
	 * @param string  $class_name Class name.
	 * @param boolean $no_prepend Flag to indicate not to prepend the class name.
	 * @param boolean $no_replace Flag to indicate not to replace the class name.
	 *
	 * @return string
	 */
	private function get_file_name_from_class( $class_name, $no_prepend = false, $no_replace = false ) {

		if ( $no_prepend ) {
			$prepend = '';
		} else {
			$prepend = 'class-';
		}

		if ( $no_replace ) {
			$replace = $class_name;
		} else {
			$replace = str_replace( '_', '-', $class_name );
		}
		return $prepend . str_replace( '_', '-', $class_name ) . '.php';
	}

	/**
	 * Include a class file
	 *
	 * @param  string $path File path.
	 *
	 * @return boolean Successful or not.
	 */
	private function load_file( $path ) {
		if ( $path && is_readable( $path ) ) {
			include_once $path;

			return true;
		}

		return false;
	}

	/**
	 * Auto-load WC classes on demand to reduce memory consumption
	 *
	 * @param string $class_name Class name.
	 * @return void
	 */
	public function autoload( $class_name ) {
		$path           = null;
		$original_class = $class_name;
		$class_name     = strtolower( $class_name );
		$file           = $this->get_file_name_from_class( $class_name );

		if ( 0 === mb_strpos( $class_name, 'themecomplete_epo_fields' ) ) {
			$path = THEMECOMPLETE_EPO_INCLUDES_PATH . 'fields/';
		} elseif ( 0 === mb_strpos( $class_name, 'themecomplete_epo_admin_' ) ) {
			$path = THEMECOMPLETE_EPO_ADMIN_PATH;
		} elseif ( 0 === mb_strpos( $class_name, 'themecomplete_extra_' ) ) {
			$path = THEMECOMPLETE_EPO_INCLUDES_PATH;
		} elseif ( 0 === mb_strpos( $class_name, 'themecomplete_epo_' ) ) {
			if ( 0 === mb_strpos( $class_name, 'themecomplete_epo_compatibility_base' ) ) {
				$path = THEMECOMPLETE_EPO_COMPATIBILITY_PATH;
			} elseif ( 0 === mb_strpos( $class_name, 'themecomplete_epo_cp' ) ) {
				$path = THEMECOMPLETE_EPO_COMPATIBILITY_PATH . 'classes/';
			} elseif ( 0 === mb_strpos( $class_name, 'themecomplete_epo_builder_element' ) ) {
				$path = THEMECOMPLETE_EPO_INCLUDES_PATH . 'classes/builder/';
			} else {
				$path = THEMECOMPLETE_EPO_INCLUDES_PATH . 'classes/';
			}
		}

		$path = apply_filters( 'wc_epo_autoload_path', $path, $original_class );
		$file = apply_filters( 'wc_epo_autoload_file', $file, $original_class );

		if ( $path ) {
			$this->load_file( $path . $file );
		}
	}
}

new THEMECOMPLETE_EPO_Autoloader();

define( 'THEMECOMPLETE_EPO_AUTOLOADER_LOADER', true );
includes/compatibility/assets/js/cp-bap.js000064400000002513150755142450014652 0ustar00( function( window, document, $ ) {
	'use strict';

	var tcAPI;

	function getQtyElement( currentCart ) {
		var qty = currentCart.find( tcAPI.qtySelector ).last();
		if ( qty.length === 0 ) {
			qty = currentCart.find( tcAPI.associateQtySelector ).last();
		}
		return qty;
	}

	// document ready
	$( function() {
		tcAPI = $.tcAPI ? $.tcAPI() : null;
		if ( ! tcAPI ) {
			return;
		}

		$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
			var currentCart;
			var totalsHolderContainer;
			var totalsHolder;
			var qtyElement;
			var qty;

			if ( event && dataObject && dataObject.epo ) {
				currentCart = dataObject.currentCart;
				totalsHolderContainer = dataObject.totalsHolderContainer;
				totalsHolder = dataObject.totalsHolder;
				qtyElement = getQtyElement( currentCart );

				// We are forced to use the following trigger as the plugin doesn't offer its own
				currentCart.on( 'woocommerce-product-addons-update', function() {
					var v = $( this ).find( '#bkap_price_charged' ).val();
					qty = qtyElement.val();
					if ( qty > 0 ) {
						v = v / qty;
					}

					totalsHolderContainer.find( '.cpf-product-price' ).val( v );
					totalsHolder.data( 'price', v );
					currentCart.trigger( {
						type: 'tm-epo-update',
						norules: 2
					} );
				} );
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-fop.js000064400000000642150755142450014675 0ustar00( function( window, document, $ ) {
	'use strict';

	// document ready
	$( function() {
		if ( ! $.tcAPIGet ) {
			return;
		}
		$( document ).on( 'show.bs.aromodal', '.product-aromodal', function( event ) {
			var epo = $( event.currentTarget ).find( $.tcAPIGet( 'epoSelector' ) );
			$( window ).trigger( 'tc_manual_init', { container: epo, reactivate: true } );
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/index.php000064400000000126150755142450014770 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/compatibility/assets/js/cp-dpd.js000064400000055115150755142450014665 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;
	var tcAPI;

	function tc_round( value, precision, mode ) {
		return $.epoAPI.math.round( value, precision, mode );
	}

	function multFloats( a, b ) {
		var atens = Math.pow( 10, String( a ).length - String( a ).indexOf( '.' ) - 1 );
		var btens = Math.pow( 10, String( b ).length - String( b ).indexOf( '.' ) - 1 );

		return ( a * atens * ( b * btens ) ) / ( atens * btens );
	}

	function getChosenAttributes( form ) {
		var attributeFields = form.find( '.variations select' );
		var data = {};
		var count = 0;
		var chosen = 0;

		attributeFields.each( function() {
			var field = $( this );
			var attribute_name = field.data( 'attribute_name' ) || field.attr( 'name' );
			var value = field.val() || '';

			if ( value.length > 0 ) {
				chosen = chosen + 1;
			}

			count = count + 1;
			data[ attribute_name ] = value;
		} );

		return {
			count: count,
			chosenCount: chosen,
			data: data
		};
	}

	function getDiscountObj( totalsHolder, rules, current_variation, cv, qty, force ) {
		var discount = [ false, false ];

		$( rules[ current_variation ] ).each( function( id, rule ) {
			var min = parseFloat( rule.min );
			var max = parseFloat( rule.max );
			var type = rule.type;
			var value = parseFloat( rule.value );
			var found = true;

			if ( id !== undefined && rule.conditions ) {
				$( rule.conditions ).each( function( cid, condition ) {
					var att_ids;
					var chosen_atts;
					var c;
					var product_attributes;

					if ( cid !== undefined && condition.type === 'product__attributes' ) {
						att_ids = totalsHolder.data( 'tm-epo-dpd-attributes-to-id' );
						chosen_atts = getChosenAttributes( totalsHolder.data( 'tm_for_cart' ) );
						c = [];
						product_attributes = condition.product_attributes;

						Object.keys( chosen_atts.data ).forEach( function( item ) {
							if ( item && att_ids[ item ] ) {
								c[ c.length ] = att_ids[ item ][ chosen_atts.data[ item ] ].toString();
							}
						} );

						product_attributes = product_attributes.map( function( item ) {
							return item.toString();
						} );
						c = c.map( function( item ) {
							return item.toString();
						} );

						if ( condition.method_option === 'at_least_one' ) {
							found = product_attributes.some( function( item ) {
								return $.inArray( item.toString(), c ) !== -1;
							} );
						} else if ( condition.method_option === 'all' ) {
							found = product_attributes.every( function( item ) {
								return $.inArray( item.toString(), c ) !== -1;
							} );
						} else if ( condition.method_option === 'only' ) {
							found = product_attributes.every( function( item ) {
								return $.inArray( item.toString(), c ) !== -1;
							} ) && c.every( function( item ) {
								return $.inArray( item.toString(), product_attributes ) !== -1;
							} );
						} else if ( condition.method_option === 'none' ) {
							found = ! product_attributes.some( function( item ) {
								return $.inArray( item.toString(), c ) !== -1;
							} );
						}
					}

					if ( condition.type === 'product__variation' ) {
						if ( condition.method_option === 'in_list' ) {
							if ( $.inArray( cv.toString(), condition.product_variations ) !== -1 ) {
								found = true;
							} else {
								found = false;
							}
						} else if ( $.inArray( cv.toString(), condition.product_variations ) === -1 ) {
							found = true;
						} else {
							found = false;
						}
					}
				} );
			}

			if ( ! found ) {
				return true;
			}

			if ( force || ( ! Number.isFinite( max ) && min <= qty ) || ( Number.isFinite( max ) && min <= qty && qty <= max ) ) {
				if ( ( totalsHolder.attr( 'data-tm-epo-dpd-change-display-prices' ) === 'change_simple' || totalsHolder.attr( 'data-tm-epo-dpd-change-display-prices' ) === 'change_all' ) && min === 1 && totalsHolder.data( 'priceIsWithDiscount' ) ) {
					discount = [ value, type, true ];
				} else {
					discount = [ value, type ];
				}

				/**
				 * we disable the next line to take into account the "All
				 * applicable rules" functionality note: find a better way to
				 * do this as it produces more loops
				 * return false;
				 */
			}
		} );

		return discount;
	}

	// Calculate the product price
	function calculateProductPrice( price, totalsHolder ) {
		var rules = totalsHolder.data( 'product-price-rules' );
		var mainCart = totalsHolder.data( 'tm_for_cart' );
		var qty_element;
		var qty;
		var variation_id_selector;
		var current_variation;
		var cv;
		var discount;
		var value;
		var type;
		var _dc;
		var mainQty;

		if ( ! ( ! rules || ! mainCart || $.isEmptyObject( rules ) || $.isEmptyObject( mainCart ) ) ) {
			price = parseFloat( price ) || 0;
			qty_element = totalsHolder.data( 'qty_element' );
			qty = parseFloat( qty_element.val() );
			variation_id_selector = totalsHolder.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( ! totalsHolder.is( '.tm-cart-inline' ) && variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				return false;
			}
			if ( ! current_variation ) {
				current_variation = 0;
			}
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			if ( ! Number.isFinite( qty ) ) {
				if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
					qty = 1;
				}
			}

			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && mainCart.is( tcAPI.associatedEpoCart ) ) {
				mainQty = parseFloat( $( '.tc-epo-totals[data-epo-id=' + mainCart.closest( tcAPI.epoSelector ).data( 'epoId' ) + ']' ).data( 'qty_element' ).val() );
				if ( ! Number.isFinite( mainQty ) ) {
					mainQty = 1;
				}
				qty = qty * mainQty;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}

				discount = getDiscountObj( totalsHolder, rules, current_variation, cv, qty, false );
				type = discount[ 1 ];
				if ( ! discount[ 2 ] || ( type === 'fixed' || type === 'fixed__price' ) ) {
					value = discount[ 0 ];
					_dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );

					if ( current_variation ) {
						price = totalsHolder.data( 'variations' );
						price = parseFloat( price[ current_variation ] ) || 0;
					} else {
						price = price = parseFloat( totalsHolder.attr( 'data-price' ) ) || 0;
					}

					switch ( type ) {
						case 'percentage':
						case 'discount__percentage':

							price = price - ( Math.ceil( ( multFloats( price, ( value / 100 ) ) * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc ) );
							price = tc_round( price, _dc );
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'price':
						case 'discount__amount':
							price = price - value;
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'fixed':
						case 'fixed__price':
							price = value;
							if ( price < 0 ) {
								price = 0;
							}
							break;
					}
				}
			}
		}

		totalsHolder.closest( '.tc-totals-form' ).find( '.cpf-product-price' ).val( price );

		return price;
	}

	function maybe_alter_pricing_table( o ) {
		var totals = o.totals_holder;
		var object = o.epo;
		var epo_object = o.data.epo_object;
		var pt = epo_object.main_product.find( '.rp_wcdpd_pricing_table' ).find( 'td > .amount' );
		var vpt = epo_object.main_product.find( '.rp_wcdpd_pricing_table_variation_container' );
		var enable_pricing_table = totals.attr( 'data-tm-epo-dpd-enable-pricing-table' );
		var local_decimal_separator;
		var local_thousand_separator;
		var rules;
		var $cart;
		var apply_dpd;
		var product_price;
		var ot;
		var variation_id_selector;
		var current_variation;
		var cv;

		if ( vpt.length > 0 ) {
			pt = vpt.find( '.rp_wcdpd_pricing_table_variation:visible' ).find( '.rp_wcdpd_pricing_table' ).find( 'td > .amount' );
		}
		if ( enable_pricing_table !== 'yes' || ! pt.length ) {
			return;
		}

		local_decimal_separator = TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ? TMEPOJS.currency_format_decimal_sep : $.epoAPI.locale.getSystemDecimalSeparator();
		local_thousand_separator = TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ? TMEPOJS.currency_format_thousand_sep : $.epoAPI.locale.getSystemDecimalSeparator() === ',' ? '.' : ',';

		rules = totals.data( 'product-price-rules' );
		$cart = totals.data( 'tm_for_cart' );
		apply_dpd = totals.data( 'fields-price-rules' );
		product_price = parseFloat( totals.data( 'price' ) );
		ot = $.epoAPI.math.unformat( object.options_price_per_unit, TMEPOJS.currency_format_decimal_sep );

		product_price = $.epoAPI.math.unformat( o.data.tm_set_price( product_price, totals, false ), TMEPOJS.currency_format_decimal_sep );

		if ( rules && $cart ) {
			variation_id_selector = totals.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				current_variation = 0;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}

				$( rules[ current_variation ] ).each( function( id, rule ) {
					var discount = getDiscountObj( totals, rules, current_variation, cv, object.qty );
					var dprice = ot;
					var value = discount[ 0 ];
					var type = discount[ 1 ];
					var _dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );
					var price = dprice;
					var ruletype = rule.type;
					var rulevalue = parseFloat( rule.value );
					var new_product_price = product_price;
					var table_price;

					switch ( type ) {
						case 'percentage':
						case 'discount__percentage':
							price = price / ( 1 - ( value / 100 ) );
							price = ( Math.ceil( price * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc );
							price = tc_round( price, _dc );
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'price':
						case 'discount__amount':
							price = price + ( value * object.qty );
							price = Math.ceil( ( price * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc );
							price = tc_round( price, _dc );
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'fixed':
						case 'fixed__price':
							// not supported
							break;
					}

					switch ( ruletype ) {
						case 'percentage':
						case 'discount__percentage':
							if ( apply_dpd ) {
								price = price * ( 1 - ( rulevalue / 100 ) );
							}
							new_product_price = new_product_price * ( 1 - ( rulevalue / 100 ) );
							break;

						case 'price':
						case 'discount__amount':
							if ( apply_dpd ) {
								price = price - rulevalue;
							}
							new_product_price = new_product_price - rulevalue;
							break;

						case 'fixed':
						case 'fixed__price':
							if ( apply_dpd ) {
								price = rulevalue;
							}
							new_product_price = rulevalue;
							break;
					}

					table_price = $.epoAPI.math.format( new_product_price + price, {
						symbol: TMEPOJS.currency_format_symbol,
						decimal: local_decimal_separator,
						thousand: local_thousand_separator,
						precision: TMEPOJS.currency_format_num_decimals,
						format: TMEPOJS.currency_format
					} );
					$( pt[ id ] ).html( table_price );
				} );
			}
		}
	}

	function tm_get_dpd( totals, epo_object, apply ) {
		var price;
		var rules;
		var $cart;
		var variation_id_selector;
		var current_variation;
		var cv;
		var qty_element;
		var qty;

		if ( apply !== 1 ) {
			return false;
		}

		price = [ false, false ];
		rules = totals.data( 'product-price-rules' );
		$cart = totals.data( 'tm_for_cart' );

		if ( ! rules || ! $cart ) {
			return false;
		}
		variation_id_selector = totals.data( 'variationIdElement' );
		current_variation = parseFloat( variation_id_selector.val() );
		cv = current_variation;
		qty_element = totals.data( 'qty_element' );
		qty = parseFloat( qty_element.val() );

		if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
			current_variation = 0;
		}

		if ( ! current_variation ) {
			current_variation = 0;
		}
		if ( ! Number.isFinite( qty ) ) {
			if ( totals.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
				qty = 1;
			}
		}
		if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			price = getDiscountObj( totals, rules, current_variation, cv, qty );
		}

		return price;
	}

	function tc_apply_dpd( price, totalsHolder, apply, force ) {
		var rules;
		var $cart;
		var variation_id_selector;
		var current_variation;
		var cv;
		var qty_element;
		var qty;
		var discount;
		var value;
		var type;

		if ( typeof price === 'object' ) {
			price = price[ 0 ];
			if ( ! Number.isFinite( parseFloat( price ) ) ) {
				price = 0;
			}
		}
		if ( apply !== 1 ) {
			return price;
		}

		rules = totalsHolder.data( 'product-price-rules' );
		$cart = totalsHolder.data( 'tm_for_cart' );

		if ( ! rules || ! $cart ) {
			return price;
		}
		variation_id_selector = totalsHolder.data( 'variationIdElement' );
		current_variation = parseFloat( variation_id_selector.val() );
		cv = current_variation;
		qty_element = totalsHolder.data( 'qty_element' );
		qty = parseFloat( qty_element.val() );

		if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
			current_variation = 0;
		}

		if ( ! current_variation ) {
			current_variation = 0;
		}
		if ( ! Number.isFinite( qty ) ) {
			if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
				qty = 1;
			}
		}
		if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			discount = getDiscountObj( totalsHolder, rules, current_variation, cv, qty, force );
			value = discount[ 0 ];
			type = discount[ 1 ];
			if ( price === undefined ) {
				price = 0;
			}
			switch ( type ) {
				case 'percentage':
				case 'discount__percentage':
					price = price * ( 1 - ( value / 100 ) );
					break;
				case 'price':
				case 'discount__amount':
					price = price - value;
					break;
				case 'fixed':
				case 'fixed__price':
					price = value;
					break;
			}
		}

		return price;
	}

	function alterProductPrice( product_price, element, cart, epoTotalsContainer ) {
		var mode = epoTotalsContainer.attr( 'data-tm-epo-dpd-original-price-base' );
		var type;
		var undiscountedProductPrice;
		var variation_id_selector;
		var current_variation;

		if ( mode === 'undiscounted' ) {
			type = epoTotalsContainer.attr( 'data-type' );
			if ( type === 'variable' || type === 'variable-subscription' ) {
				variation_id_selector = epoTotalsContainer.data( 'variationIdElement' );
				current_variation = parseFloat( variation_id_selector.val() );
				if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
					current_variation = 0;
				}
				if ( ! current_variation ) {
					current_variation = 0;
				}
				undiscountedProductPrice = epoTotalsContainer.data( 'variations' )[ current_variation ];
			} else {
				undiscountedProductPrice = epoTotalsContainer.attr( 'data-price' );
			}
			if ( undiscountedProductPrice !== undefined ) {
				return undiscountedProductPrice;
			}
		}

		return product_price;
	}

	function useUndiscountedPrice( use, element, cart, epoTotalsContainer ) {
		var mode = epoTotalsContainer.attr( 'data-tm-epo-dpd-original-price-base' );
		var undiscountedProductPrice = epoTotalsContainer.attr( 'data-price' );

		if ( mode === 'undiscounted' && undiscountedProductPrice !== undefined ) {
			return true;
		}

		return use;
	}

	function tc_adjust_product_total_price( product_total_price, product_total_price_without_options, total_plus_fee, extraFee, total, cart_fee_options_total, totalsHolder ) {
		var rules = totalsHolder.data( 'product-price-rules' );
		var mainCart = totalsHolder.data( 'tm_for_cart' );
		var qty_element;
		var qty;
		var variation_id_selector;
		var current_variation;
		var cv;
		var discount;
		var type;
		var mainQty;
		var dpdEnabled = totalsHolder.data( 'tm-epo-dpd-enable' ) === 'yes';

		if ( dpdEnabled && ( ! ( ! rules || ! mainCart || $.isEmptyObject( rules ) || $.isEmptyObject( mainCart ) ) ) ) {
			qty_element = totalsHolder.data( 'qty_element' );
			qty = parseFloat( qty_element.val() );
			variation_id_selector = totalsHolder.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				return product_total_price;
			}
			if ( ! current_variation ) {
				current_variation = 0;
			}
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			if ( ! Number.isFinite( qty ) ) {
				if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
					qty = 1;
				}
			}

			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && mainCart.is( tcAPI.associatedEpoCart ) ) {
				mainQty = parseFloat( $( '.tc-epo-totals[data-epo-id=' + mainCart.closest( tcAPI.epoSelector ).data( 'epoId' ) + ']' ).data( 'qty_element' ).val() );
				if ( ! Number.isFinite( mainQty ) ) {
					mainQty = 1;
				}
				qty = qty * mainQty;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}

				discount = getDiscountObj( totalsHolder, rules, current_variation, cv, qty );
				type = discount[ 1 ];
				if ( type === 'fixed' || type === 'fixed__price' ) {
					return product_total_price_without_options;
				}
			}
		}

		return product_total_price;
	}

	$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
		var epoObject = dataObject.epoObject;
		var currentCart = dataObject.currentCart;
		var totalsHolder = dataObject.totalsHolder;
		var variation_id_selector = dataObject.variation_id_selector;
		var qtyElement = dataObject.qtyElement;

		// DPD update displayed values when rules change
		currentCart.off( 'tm-epo-check-dpd' ).on( 'tm-epo-check-dpd', function() {
			var rules = totalsHolder.data( 'product-price-rules' );
			var qty;
			var qty_prev;
			var current_variation;
			var min;
			var max;

			if ( rules && currentCart ) {
				qty = parseFloat( qtyElement.val() );
				qty_prev = parseFloat( qtyElement.data( 'tm-prev-value' ) );
				current_variation = currentCart.find( variation_id_selector ).val();

				if ( ! current_variation ) {
					current_variation = 0;
				}
				if ( ! Number.isFinite( qty ) ) {
					if ( totalsHolder.attr( 'data-is-sold-individually' ) || qtyElement.length === 0 ) {
						qty = 1;
					}
				}

				if ( ( rules[ current_variation ] && $.epoAPI.math.toFloat( current_variation ) !== 0 ) || rules[ 0 ] ) {
					if ( ! rules[ current_variation ] ) {
						current_variation = 0;
					}
					$( rules[ $.epoAPI.math.toFloat( current_variation ) ] ).each( function( id, rule ) {
						min = parseFloat( rule.min );
						max = parseFloat( rule.max );

						if ( ( ! Number.isFinite( max ) && min <= qty ) || ( Number.isFinite( max ) && min <= qty && qty <= max ) ) {
							if ( ! ( min <= qty_prev && qty_prev <= max ) ) {
								$( window ).trigger( 'epoCalculateRules', {
									epoObject: epoObject,
									currentCart: currentCart
								} );
							}
						} else if ( min > qty ) {
							$( window ).trigger( 'epoCalculateRules', {
								epoObject: epoObject,
								currentCart: currentCart
							} );
						}
					} );
				}
			}
		} );
	} );

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;
		tcAPI = $.tcAPI ? $.tcAPI() : null;

		if ( ! TMEPOJS || ! tcAPI ) {
			return;
		}

		$.epoAPI.addFilter( 'tc_calculate_product_price', calculateProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tc_apply_dpd', tc_apply_dpd, 10, 4 );
		$.epoAPI.addFilter( 'tc_alter_product_price', alterProductPrice, 10, 4 );
		$.epoAPI.addFilter( 'tc_use_undiscounted_price', useUndiscountedPrice, 10, 4 );
		$.epoAPI.addFilter( 'tc_adjust_product_total_price', tc_adjust_product_total_price, 10, 7 );

		$.fn.getDiscountObj = getDiscountObj;

		// Enable alteration of pricing table
		$( window ).on( 'tc-epo-after-update', function( e, o ) {
			if ( o && o.data && o.epo && o.totals_holder ) {
				maybe_alter_pricing_table( o );
			}
		} );

		// Prefix label and Suffix label
		$( window ).on( 'tc-totals-container', function( e, o ) {
			var totalsHolder;
			var epo_object;
			var tm_set_price;
			var qty;
			var apply_dpd;
			var dpd_prefix;
			var dpd_suffix;
			var dpd_discount;
			var dpd_string;
			var dpd_discount_type;
			var dpd_discount_string;
			var dpd_css_selector;
			var dpd_string_placement;

			if ( o && o.data && o.totals_holder ) {
				totalsHolder = o.totals_holder;
				epo_object = o.data.epo_object;
				tm_set_price = o.data.tm_set_price;
				qty = o.data.qty;

				// set to totalsHolder.data("fields-price-rules") if you want the current setting
				apply_dpd = 1;
				dpd_prefix = totalsHolder.data( 'tm-epo-dpd-prefix' );
				dpd_suffix = totalsHolder.data( 'tm-epo-dpd-suffix' );

				if ( apply_dpd === 1 ) {
					dpd_discount = tm_get_dpd( totalsHolder, epo_object, apply_dpd );
					dpd_string = '';
					if ( dpd_discount[ 0 ] && dpd_discount[ 1 ] && ( dpd_prefix || dpd_suffix ) ) {
						dpd_discount_type = dpd_discount[ 1 ];
						dpd_discount_string = '';
						switch ( dpd_discount_type ) {
							case 'percentage':
							case 'discount__percentage':
								dpd_discount_string = dpd_discount[ 0 ] + '%';
								break;
							case 'price':
							case 'discount__amount':
								dpd_discount_string = tm_set_price( dpd_discount[ 0 ] * qty, totalsHolder, false, false );
								break;
							case 'fixed':
							case 'fixed__price':
								dpd_discount_string = tm_set_price( ( parseFloat( totalsHolder.data( 'price' ) ) - dpd_discount[ 0 ] ) * qty, totalsHolder, false, false );
								break;
						}
						dpd_string = dpd_prefix + ' ' + dpd_discount_string + ' ' + dpd_suffix;
					}
					if ( dpd_string ) {
						dpd_css_selector = totalsHolder.data( 'tm-epo-dpd-label-css-selector' );
						dpd_string_placement = totalsHolder.data( 'tm-epo-dpd-string-placement' );
						if ( dpd_css_selector === '' ) {
							dpd_css_selector = '.tm-final-totals .amount.final';
						}
						if ( dpd_string_placement === 'after' ) {
							totalsHolder.find( dpd_css_selector ).after( '<span class="tm-dpd-label">' + dpd_string + '</span>' );
						} else {
							totalsHolder.find( dpd_css_selector ).before( '<span class="tm-dpd-label">' + dpd_string + '</span>' );
						}
					}
				}
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-subscriptions.js000064400000021325150755142450017021 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;

	function tm_set_subscription_period( epoObject ) {
		var cart_id;
		var $cart;
		var subscription_period;
		var variations_subscription_period;
		var base;
		var is_subscription;
		var is_hidden;
		var variation_id_selector;
		var current_variation;
		var $_cart;
		var this_epo_totals_container = epoObject.this_epo_totals_container;
		var main_product = epoObject.main_product;
		var subscription_sign_up_fee;
		var formatted_final_total;
		var nativeProductPriceSelector;
		var tcAPI = $.tcAPI ? $.tcAPI() : null;
		var tc_totals_ob;
		var args;

		this_epo_totals_container.each( function() {
			var $this = $( this );
			tc_totals_ob = $this.data( 'tc_totals_ob' );
			cart_id = $this.attr( 'data-cart-id' );
			$cart = main_product.find( '.tm-extra-product-options.tm-cart-' + cart_id );
			subscription_period = $this.data( 'subscription-period' );
			variations_subscription_period = $this.data( 'variations-subscription-period' );
			base = $cart.find( '.tmcp-field' ).closest( '.tmcp-field-wrap' );
			is_subscription = $this.data( 'is-subscription' );

			if ( is_subscription ) {
				base.find( '.tmperiod' ).remove();

				is_hidden = base.find( '.amount' ).is( '.hidden' );
				if ( is_hidden ) {
					is_hidden = ' hidden';
				} else {
					is_hidden = '';
				}

				variation_id_selector = "input[name^='variation_id']";
				$_cart = $this.data( 'tm_for_cart' );

				if ( $_cart ) {
					if ( $_cart.find( 'input.variation_id' ).length > 0 ) {
						variation_id_selector = 'input.variation_id';
					}
					current_variation = $_cart.find( variation_id_selector ).val();
					if ( ! current_variation ) {
						current_variation = 0;
					}
					if ( variations_subscription_period[ $.epoAPI.math.toFloat( current_variation ) ] ) {
						subscription_period = variations_subscription_period[ $.epoAPI.math.toFloat( current_variation ) ];
					}
				}

				base.find( '.amount' ).not( '.amount .amount' ).after( '&nbsp;<span class="tmperiod' + is_hidden + '">' + subscription_period + '</span>' );

				$this.find( '.tmperiod' ).remove();
				$this
					.find( '.amount.options' )
					.after( '<span class="tmperiod">' + '&nbsp;' + subscription_period + '</span>' );
				$this
					.find( '.amount.final' )
					.after( '<span class="tmperiod">' + '&nbsp;' + subscription_period + '</span>' );

				if ( tcAPI ) {
					if ( tc_totals_ob ) {
						subscription_sign_up_fee = tc_totals_ob.subscription_sign_up_fee;
						args = {
							symbol: '',
							format: '',
							decimal: tcAPI.localDecimalSeparator,
							thousand: tcAPI.localThousandSeparator,
							precision: TMEPOJS.currency_format_num_decimals
						};
						formatted_final_total = $.epoAPI.applyFilter( 'tc_formatPrice', $.epoAPI.math.format( tc_totals_ob.product_total_price, args ), args );
						subscription_sign_up_fee = $.epoAPI.applyFilter( 'tc_formatPrice', $.epoAPI.math.format( subscription_sign_up_fee, args ), args );
					}
					if ( epoObject.is_associated ) {
						nativeProductPriceSelector = epoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector );
					} else {
						nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector );
					}

					if ( subscription_sign_up_fee && formatted_final_total ) {
						nativeProductPriceSelector
							.html(
								$.epoAPI.util.decodeHTML(
									$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
										price: formatted_final_total
									} )
								) + ' ' +
									subscription_period +
									' ' + TMEPOJS.i18n_and_a + ' ' +
									$.epoAPI.util.decodeHTML(
										$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
											price: subscription_sign_up_fee
										} )
									) + ' ' +
									TMEPOJS.i18n_sign_up_fee
							)
							.show();
					} else if ( formatted_final_total !== undefined ) {
						nativeProductPriceSelector
							.html(
								$.epoAPI.util.decodeHTML(
									$.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, {
										price: formatted_final_total
									} )
								) + ' ' +
									subscription_period
							)
							.show();
					}
				}
			}
		} );
	}

	function tc_adjust_tc_totals_ob( tc_totals_ob, data ) {
		var subscription_options_total = 0;
		var formatted_subscription_fee_total = '';
		var subscription_sign_up_fee;
		var subscription_total;
		var show_sign_up_fee = false;
		var showTotal = data.showTotal;
		var epoHolder = data.epoHolder;
		var totalsHolder = data.totalsHolder;
		var tm_set_price_totals = data.tm_set_price_totals;
		var product_and_subscription_total = 0;
		var formatted_product_and_subscription_total = '';

		epoHolder
			.find( '.tmcp-sub-fee-field' )
			.filter( '.tcenabled' )
			.toArray()
			.forEach( function( field ) {
				var option_price = 0;
				var options;

				field = $( field );

				if ( field.is( ':checkbox, :radio, :input' ) ) {
					if ( field.is( '.tmcp-checkbox, .tmcp-radio' ) ) {
						if ( field.is( ':checked' ) ) {
							option_price = field.data( 'raw_price' );
							showTotal = true;
							field.data( 'isset', 1 );
						} else {
							field.data( 'isset', 0 );
						}
					} else if ( field.is( '.tmcp-select' ) ) {
						option_price = field.find( 'option:selected' ).data( 'raw_price' );
						options = field.children( 'option:selected' );
						if ( ! ( options.val() === '' && options.attr( 'data-rulestype' ) === '' ) ) {
							showTotal = true;
						}
						field.find( 'option' ).data( 'isset', 0 );
						field.find( 'option:selected' ).data( 'isset', 1 );
					} else if ( field.val() ) {
						option_price = field.data( 'raw_price' );
						showTotal = true;
						field.data( 'isset', 1 );
					} else {
						field.data( 'isset', 0 );
					}
					if ( ! option_price ) {
						option_price = 0;
					}

					if ( field.is( '.tmcp-sub-fee-field' ) ) {
						subscription_options_total = parseFloat( subscription_options_total ) + parseFloat( option_price );
					}
				}
			} );

		if ( totalsHolder.data( 'is-subscription' ) ) {
			subscription_sign_up_fee = parseFloat( totalsHolder.data( 'subscription-sign-up-fee' ) );
			if ( ! Number.isFinite( subscription_sign_up_fee ) ) {
				subscription_sign_up_fee = 0;
			}
			subscription_total = subscription_sign_up_fee + parseFloat( subscription_options_total );
			if ( ! Number.isFinite( subscription_total ) ) {
				subscription_total = 0;
			}
			if ( subscription_total ) {
				show_sign_up_fee = true;
			}
			formatted_subscription_fee_total = tm_set_price_totals( subscription_total, totalsHolder, false, true );

			product_and_subscription_total = parseFloat( data.product_total_price ) + parseFloat( subscription_total );
			if ( ! Number.isFinite( product_and_subscription_total ) ) {
				product_and_subscription_total = 0;
			}
			formatted_product_and_subscription_total = tm_set_price_totals( product_and_subscription_total, totalsHolder, false, true );
		}

		tc_totals_ob.formatted_subscription_fee_total = formatted_subscription_fee_total;
		tc_totals_ob.subscription_sign_up_fee = subscription_total;
		tc_totals_ob.show_sign_up_fee = show_sign_up_fee;
		tc_totals_ob.product_and_subscription_total = product_and_subscription_total;
		tc_totals_ob.formatted_product_and_subscription_total = formatted_product_and_subscription_total;
		tc_totals_ob.sign_up_fee = TMEPOJS.i18n_subscription_sign_up_fee;
		tc_totals_ob.showTotal = showTotal;

		return tc_totals_ob;
	}

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;

		if ( ! TMEPOJS ) {
			return;
		}

		$( window ).on( 'tm-epo-init-end', function( event, eventData ) {
			if ( event && eventData && eventData.epo ) {
				tm_set_subscription_period( eventData.epo );
			}
		} );

		$( window ).on( 'tc-epo-after-update', function( event, eventData ) {
			if ( event && eventData && eventData.data && eventData.data.epo_object ) {
				tm_set_subscription_period( eventData.data.epo_object );
			}
		} );

		$( window ).on( 'tm-epo-found-variation', function( event, eventData ) {
			var totalsHolder;
			var variation;
			var variations;

			if ( event && eventData && eventData.epo ) {
				totalsHolder = eventData.totalsHolder;
				variation = eventData.variation;
				variations = totalsHolder.data( 'variations' );

				if ( variations && variation && variation.variation_id ) {
					if ( variation.tc_subscription_sign_up_fee !== undefined ) {
						totalsHolder.data( 'subscription-sign-up-fee', variation.tc_subscription_sign_up_fee );
					} else {
						totalsHolder.data( 'subscription-sign-up-fee', 0 );
					}

					if ( variation.tc_subscription_period !== undefined ) {
						totalsHolder.data( 'subscription-period', variation.tc_subscription_period );
					}
				}
			}
		} );

		$.epoAPI.addFilter( 'tc_adjust_tc_totals_ob', tc_adjust_tc_totals_ob, 10, 2 );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-apd.js000064400000053537150755142450014670 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;
	var tcAPI;

	function tc_round( value, precision, mode ) {
		return $.epoAPI.math.round( value, precision, mode );
	}

	function multFloats( a, b ) {
		var atens = Math.pow( 10, String( a ).length - String( a ).indexOf( '.' ) - 1 );
		var btens = Math.pow( 10, String( b ).length - String( b ).indexOf( '.' ) - 1 );

		return ( a * atens * ( b * btens ) ) / ( atens * btens );
	}

	function getDiscountObj( totalsHolder, rules, current_variation, cv, qty, force ) {
		var discount = [ false, false ];

		$( rules[ current_variation ] ).each( function( id, rule ) {
			var min = parseFloat( rule.min );
			var max = parseFloat( rule.max );
			var type = rule.type;
			var value = parseFloat( rule.value );

			if ( force || ( ! Number.isFinite( max ) && min <= qty ) || ( Number.isFinite( max ) && min <= qty && qty <= max ) ) {
				if ( ( totalsHolder.attr( 'data-tm-epo-apd-change-display-prices' ) === 'change_simple' || totalsHolder.attr( 'data-tm-epo-apd-change-display-prices' ) === 'change_all' ) && min === 1 && totalsHolder.data( 'priceIsWithDiscount' ) ) {
					discount = [ value, type, true ];
				} else {
					discount = [ value, type ];
				}

				/**
				 * we disable the next line to take into account the "All
				 * applicable rules" functionality note: find a better way to
				 * do this as it produces more loops
				 * return false;
				 */
			}
		} );

		return discount;
	}

	// Calculate the product price
	function calculateProductPrice( price, totalsHolder ) {
		var rules = totalsHolder.data( 'product-price-rules' );
		var mainCart = totalsHolder.data( 'tm_for_cart' );
		var qty_element;
		var qty;
		var variation_id_selector;
		var current_variation;
		var cv;
		var discount;
		var value;
		var type;
		var _dc;
		var mainQty;
		var discounted_price = false;

		if ( ! ( ! rules || ! mainCart || $.isEmptyObject( rules ) || $.isEmptyObject( mainCart ) ) ) {
			price = parseFloat( price ) || 0;
			qty_element = totalsHolder.data( 'qty_element' );
			qty = parseFloat( qty_element.val() );
			variation_id_selector = totalsHolder.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( ! totalsHolder.is( '.tm-cart-inline' ) && variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				return false;
			}
			if ( ! current_variation ) {
				current_variation = 0;
			}
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			if ( ! Number.isFinite( qty ) ) {
				if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
					qty = 1;
				}
			}

			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && mainCart.is( tcAPI.associatedEpoCart ) ) {
				mainQty = parseFloat( $( '.tc-epo-totals[data-epo-id=' + mainCart.closest( tcAPI.epoSelector ).data( 'epoId' ) + ']' ).data( 'qty_element' ).val() );
				if ( ! Number.isFinite( mainQty ) ) {
					mainQty = 1;
				}
				qty = qty * mainQty;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}
				_dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );
				rules[ current_variation ].forEach( function( _rule ) {
					var _rules = [];
					_rules[ current_variation ] = _rule;

					discount = getDiscountObj( totalsHolder, _rules, current_variation, cv, qty, false );
					type = discount[ 1 ];
					if ( ! discount[ 2 ] || ( type === 'fixed_amount' ) ) {
						value = discount[ 0 ];
						if ( discounted_price === false ) {
							if ( current_variation ) {
								discounted_price = totalsHolder.data( 'variations' );
								discounted_price = parseFloat( discounted_price[ current_variation ] ) || 0;
							} else {
								discounted_price = price = parseFloat( totalsHolder.attr( 'data-price' ) ) || 0;
							}
						}

						switch ( type ) {
							case 'percentage':
								discounted_price = discounted_price - ( Math.ceil( ( multFloats( discounted_price, ( value / 100 ) ) * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc ) );
								discounted_price = tc_round( discounted_price, _dc );
								if ( discounted_price < 0 ) {
									discounted_price = 0;
								}
								break;

							case 'fixed_value':
								discounted_price = discounted_price - value;
								if ( discounted_price < 0 ) {
									discounted_price = 0;
								}
								break;

							case 'fixed_amount':
								discounted_price = value;
								if ( discounted_price < 0 ) {
									discounted_price = 0;
								}
								break;
						}
					}
				} );
				if ( discounted_price !== false ) {
					price = discounted_price;
				}
			}
		}

		totalsHolder.closest( '.tc-totals-form' ).find( '.cpf-product-price' ).val( price );

		return price;
	}

	function maybe_alter_pricing_table( o ) {
		var totals = o.totals_holder;
		var object = o.epo;
		var epo_object = o.data.epo_object;
		var pt = epo_object.main_product.find( '.wdp_pricing_table' ).find( 'td > .amount' );
		var vpt = epo_object.main_product.find( '.rp_wcdpd_pricing_table_variation_container' );
		var enable_pricing_table = totals.attr( 'data-tm-epo-apd-enable-pricing-table' );
		var local_decimal_separator;
		var local_thousand_separator;
		var rules;
		var $cart;
		var apply_dpd;
		var product_price;
		var ot;
		var variation_id_selector;
		var current_variation;
		var cv;

		if ( vpt.length > 0 ) {
			pt = vpt.find( '.rp_wcdpd_pricing_table_variation:visible' ).find( '.rp_wcdpd_pricing_table' ).find( 'td > .amount' );
		}
		if ( enable_pricing_table !== 'yes' || ! pt.length ) {
			return;
		}

		local_decimal_separator = TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ? TMEPOJS.currency_format_decimal_sep : $.epoAPI.locale.getSystemDecimalSeparator();
		local_thousand_separator = TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ? TMEPOJS.currency_format_thousand_sep : $.epoAPI.locale.getSystemDecimalSeparator() === ',' ? '.' : ',';

		rules = totals.data( 'product-price-rules' );
		$cart = totals.data( 'tm_for_cart' );
		apply_dpd = totals.data( 'fields-price-rules' );
		product_price = parseFloat( totals.data( 'price' ) );
		ot = $.epoAPI.math.unformat( object.options_price_per_unit, TMEPOJS.currency_format_decimal_sep );

		product_price = $.epoAPI.math.unformat( o.data.tm_set_price( product_price, totals, false ), TMEPOJS.currency_format_decimal_sep );

		if ( rules && $cart ) {
			variation_id_selector = totals.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				current_variation = 0;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}

				$( rules[ current_variation ] ).each( function( id, rule ) {
					var discount = getDiscountObj( totals, rules, current_variation, cv, object.qty );
					var dprice = ot;
					var value = discount[ 0 ];
					var type = discount[ 1 ];
					var _dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );
					var price = dprice;
					var ruletype = rule.type;
					var rulevalue = parseFloat( rule.value );
					var new_product_price = product_price;
					var table_price;

					switch ( type ) {
						case 'percentage':
							price = price / ( 1 - ( value / 100 ) );
							price = ( Math.ceil( price * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc );
							price = tc_round( price, _dc );
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'fixed_value':
							price = price + ( value * object.qty );
							price = Math.ceil( ( price * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc );
							price = tc_round( price, _dc );
							if ( price < 0 ) {
								price = 0;
							}
							break;

						case 'fixed_amount':
							// not supported
							break;
					}

					switch ( ruletype ) {
						case 'percentage':
							if ( apply_dpd ) {
								price = price * ( 1 - ( rulevalue / 100 ) );
							}
							new_product_price = new_product_price * ( 1 - ( rulevalue / 100 ) );
							break;

						case 'fixed_value':
							if ( apply_dpd ) {
								price = price - rulevalue;
							}
							new_product_price = new_product_price - rulevalue;
							break;

						case 'fixed_amount':
							if ( apply_dpd ) {
								price = rulevalue;
							}
							new_product_price = rulevalue;
							break;
					}

					table_price = $.epoAPI.math.format( new_product_price + price, {
						symbol: TMEPOJS.currency_format_symbol,
						decimal: local_decimal_separator,
						thousand: local_thousand_separator,
						precision: TMEPOJS.currency_format_num_decimals,
						format: TMEPOJS.currency_format
					} );
					$( pt[ id ] ).html( table_price );
				} );
			}
		}
	}

	function tm_get_dpd( totals, epo_object, apply ) {
		var price;
		var rules;
		var $cart;
		var variation_id_selector;
		var current_variation;
		var cv;
		var qty_element;
		var qty;
		var current_discount_type;
		var _dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );

		if ( apply !== 1 ) {
			return false;
		}

		price = [ false, false ];
		rules = totals.data( 'product-price-rules' );
		$cart = totals.data( 'tm_for_cart' );

		if ( ! rules || ! $cart ) {
			return false;
		}
		variation_id_selector = totals.data( 'variationIdElement' );
		current_variation = parseFloat( variation_id_selector.val() );
		cv = current_variation;
		qty_element = totals.data( 'qty_element' );
		qty = parseFloat( qty_element.val() );

		if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
			current_variation = 0;
		}

		if ( ! current_variation ) {
			current_variation = 0;
		}
		if ( ! Number.isFinite( qty ) ) {
			if ( totals.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
				qty = 1;
			}
		}
		if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			current_discount_type = '';
			$( rules[ current_variation ] ).each( function( id, _rule ) {
				var _rules = [];
				var type;
				var value;
				var discountObj;
				_rules[ current_variation ] = _rule;
				discountObj = getDiscountObj( totals, _rules, current_variation, cv, qty );
				type = discountObj[ 1 ];
				if ( current_discount_type === '' ) {
					current_discount_type = type;
				} else if ( current_discount_type !== type ) {
					return false;
				}
				if ( ! discountObj[ 2 ] ) {
					value = discountObj[ 0 ];
				}

				switch ( type ) {
					case 'percentage':
						if ( price[ 0 ] ) {
							value = 100 * ( 1 - ( ( ( 100 - $.epoAPI.math.toFloat( price[ 0 ] ) ) / 100 ) * ( ( 100 - $.epoAPI.math.toFloat( value ) ) / 100 ) ) );
						}
						break;
					case 'fixed_value':
						if ( price[ 0 ] ) {
							value = $.epoAPI.math.toFloat( price[ 0 ] ) + $.epoAPI.math.toFloat( value );
						}
						break;
					case 'fixed_amount':
						break;
				}
				value = tc_round( value, _dc );

				price = [ value, type ];
			} );
		}

		return price;
	}

	function tc_apply_dpd( price, totalsHolder, apply, force ) {
		var rules;
		var $cart;
		var variation_id_selector;
		var current_variation;
		var cv;
		var qty_element;
		var qty;
		var discount;
		var value;
		var type;
		var _dc;
		var discounted_price;

		if ( typeof price === 'object' ) {
			price = price[ 0 ];
			if ( ! Number.isFinite( parseFloat( price ) ) ) {
				price = 0;
			}
		}
		if ( apply !== 1 ) {
			return price;
		}

		rules = totalsHolder.data( 'product-price-rules' );
		$cart = totalsHolder.data( 'tm_for_cart' );

		if ( ! rules || ! $cart ) {
			return price;
		}
		variation_id_selector = totalsHolder.data( 'variationIdElement' );
		current_variation = parseFloat( variation_id_selector.val() );
		cv = current_variation;
		qty_element = totalsHolder.data( 'qty_element' );
		qty = parseFloat( qty_element.val() );

		if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
			current_variation = 0;
		}

		if ( ! current_variation ) {
			current_variation = 0;
		}
		if ( ! Number.isFinite( qty ) ) {
			if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
				qty = 1;
			}
		}
		if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}

			if ( price === undefined ) {
				price = 0;
			}

			discounted_price = false;
			_dc = parseInt( TMEPOJS.currency_format_num_decimals, 10 );
			$( rules[ current_variation ] ).each( function( id, _rule ) {
				var _rules = [];
				_rules[ current_variation ] = _rule;
				discount = getDiscountObj( totalsHolder, _rules, current_variation, cv, qty, force );
				value = discount[ 0 ];
				type = discount[ 1 ];

				if ( discounted_price === false ) {
					discounted_price = price;
				}

				switch ( type ) {
					case 'percentage':
						discounted_price = discounted_price - ( Math.ceil( ( multFloats( discounted_price, ( value / 100 ) ) * Math.pow( 10, _dc ) ) - 0.5 ) * Math.pow( 10, -_dc ) );
						discounted_price = tc_round( discounted_price, _dc );
						if ( discounted_price < 0 ) {
							discounted_price = 0;
						}
						break;

					case 'fixed_value':
						discounted_price = discounted_price - value;
						if ( discounted_price < 0 ) {
							discounted_price = 0;
						}
						break;

					case 'fixed_amount':
						discounted_price = value;
						if ( discounted_price < 0 ) {
							discounted_price = 0;
						}
						break;
				}
			} );

			if ( discounted_price !== false ) {
				price = discounted_price;
			}
		}

		return price;
	}

	function alterProductPrice( product_price, element, cart, epoTotalsContainer ) {
		var mode = epoTotalsContainer.attr( 'data-tm-epo-apd-original-price-base' );
		var type;
		var undiscountedProductPrice;
		var variation_id_selector;
		var current_variation;

		if ( mode === 'undiscounted' ) {
			type = epoTotalsContainer.attr( 'data-type' );
			if ( type === 'variable' || type === 'variable-subscription' ) {
				variation_id_selector = epoTotalsContainer.data( 'variationIdElement' );
				current_variation = parseFloat( variation_id_selector.val() );
				if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
					current_variation = 0;
				}
				if ( ! current_variation ) {
					current_variation = 0;
				}
				undiscountedProductPrice = epoTotalsContainer.data( 'variations' )[ current_variation ];
			} else {
				undiscountedProductPrice = epoTotalsContainer.attr( 'data-price' );
			}
			if ( undiscountedProductPrice !== undefined ) {
				return undiscountedProductPrice;
			}
		}

		return product_price;
	}

	function useUndiscountedPrice( use, element, cart, epoTotalsContainer ) {
		var mode = epoTotalsContainer.attr( 'data-tm-epo-apd-original-price-base' );
		var undiscountedProductPrice = epoTotalsContainer.attr( 'data-price' );

		if ( mode === 'undiscounted' && undiscountedProductPrice !== undefined ) {
			return true;
		}

		return use;
	}

	function tc_adjust_product_total_price( product_total_price, product_total_price_without_options, total_plus_fee, extraFee, total, cart_fee_options_total, totalsHolder ) {
		var rules = totalsHolder.data( 'product-price-rules' );
		var mainCart = totalsHolder.data( 'tm_for_cart' );
		var qty_element;
		var qty;
		var variation_id_selector;
		var current_variation;
		var cv;
		var discount;
		var type;
		var mainQty;
		var dpdEnabled = totalsHolder.data( 'tm-epo-apd-enable' ) === 'yes';

		if ( dpdEnabled && ( ! ( ! rules || ! mainCart || $.isEmptyObject( rules ) || $.isEmptyObject( mainCart ) ) ) ) {
			qty_element = totalsHolder.data( 'qty_element' );
			qty = parseFloat( qty_element.val() );
			variation_id_selector = totalsHolder.data( 'variationIdElement' );
			current_variation = parseFloat( variation_id_selector.val() );
			cv = current_variation;

			if ( variation_id_selector.length > 0 && ( ! current_variation || current_variation === 0 ) ) {
				return product_total_price;
			}
			if ( ! current_variation ) {
				current_variation = 0;
			}
			if ( ! rules[ current_variation ] ) {
				current_variation = 0;
			}
			if ( ! Number.isFinite( qty ) ) {
				if ( totalsHolder.attr( 'data-is-sold-individually' ) || qty_element.length === 0 ) {
					qty = 1;
				}
			}

			if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && mainCart.is( tcAPI.associatedEpoCart ) ) {
				mainQty = parseFloat( $( '.tc-epo-totals[data-epo-id=' + mainCart.closest( tcAPI.epoSelector ).data( 'epoId' ) + ']' ).data( 'qty_element' ).val() );
				if ( ! Number.isFinite( mainQty ) ) {
					mainQty = 1;
				}
				qty = qty * mainQty;
			}

			if ( ( rules[ current_variation ] && current_variation !== 0 ) || rules[ 0 ] ) {
				if ( ! rules[ current_variation ] ) {
					current_variation = 0;
				}

				discount = getDiscountObj( totalsHolder, rules, current_variation, cv, qty );
				type = discount[ 1 ];
				if ( type === 'fixed_amount' ) {
					return product_total_price_without_options;
				}
			}
		}

		return product_total_price;
	}

	$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
		var epoObject = dataObject.epoObject;
		var currentCart = dataObject.currentCart;
		var totalsHolder = dataObject.totalsHolder;
		var variation_id_selector = dataObject.variation_id_selector;
		var qtyElement = dataObject.qtyElement;

		// DPD update displayed values when rules change
		currentCart.off( 'tm-epo-check-dpd' ).on( 'tm-epo-check-dpd', function() {
			var rules = totalsHolder.data( 'product-price-rules' );
			var qty;
			var qty_prev;
			var current_variation;
			var min;
			var max;

			if ( rules && currentCart ) {
				qty = parseFloat( qtyElement.val() );
				qty_prev = parseFloat( qtyElement.data( 'tm-prev-value' ) );
				current_variation = currentCart.find( variation_id_selector ).val();

				if ( ! current_variation ) {
					current_variation = 0;
				}
				if ( ! Number.isFinite( qty ) ) {
					if ( totalsHolder.attr( 'data-is-sold-individually' ) || qtyElement.length === 0 ) {
						qty = 1;
					}
				}

				if ( ( rules[ current_variation ] && $.epoAPI.math.toFloat( current_variation ) !== 0 ) || rules[ 0 ] ) {
					if ( ! rules[ current_variation ] ) {
						current_variation = 0;
					}
					$( rules[ $.epoAPI.math.toFloat( current_variation ) ] ).each( function( id, rule ) {
						min = parseFloat( rule.min );
						max = parseFloat( rule.max );

						if ( ( ! Number.isFinite( max ) && min <= qty ) || ( Number.isFinite( max ) && min <= qty && qty <= max ) ) {
							if ( ! ( min <= qty_prev && qty_prev <= max ) ) {
								$( window ).trigger( 'epoCalculateRules', {
									epoObject: epoObject,
									currentCart: currentCart
								} );
							}
						} else if ( min > qty ) {
							$( window ).trigger( 'epoCalculateRules', {
								epoObject: epoObject,
								currentCart: currentCart
							} );
						}
					} );
				}
			}
		} );
	} );

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;
		tcAPI = $.tcAPI ? $.tcAPI() : null;

		if ( ! TMEPOJS || ! tcAPI ) {
			return;
		}

		$.epoAPI.addFilter( 'tc_calculate_product_price', calculateProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tc_apply_dpd', tc_apply_dpd, 10, 4 );
		$.epoAPI.addFilter( 'tc_alter_product_price', alterProductPrice, 10, 4 );
		$.epoAPI.addFilter( 'tc_use_undiscounted_price', useUndiscountedPrice, 10, 4 );
		$.epoAPI.addFilter( 'tc_adjust_product_total_price', tc_adjust_product_total_price, 10, 7 );

		$.fn.getDiscountObj = getDiscountObj;

		// Enable alteration of pricing table
		$( window ).on( 'tc-epo-after-update', function( e, o ) {
			if ( o && o.data && o.epo && o.totals_holder ) {
				maybe_alter_pricing_table( o );
			}
		} );

		// Prefix label and Suffix label
		$( window ).on( 'tc-totals-container', function( e, o ) {
			var totalsHolder;
			var epo_object;
			var tm_set_price;
			var qty;
			var apply_dpd;
			var dpd_prefix;
			var dpd_suffix;
			var dpd_discount;
			var dpd_string;
			var dpd_discount_type;
			var dpd_discount_string;
			var dpd_css_selector;
			var dpd_string_placement;

			if ( o && o.data && o.totals_holder ) {
				totalsHolder = o.totals_holder;
				epo_object = o.data.epo_object;
				tm_set_price = o.data.tm_set_price;
				qty = o.data.qty;

				// set to totalsHolder.data("fields-price-rules") if you want the current setting
				apply_dpd = 1;
				dpd_prefix = totalsHolder.data( 'tm-epo-apd-prefix' );
				dpd_suffix = totalsHolder.data( 'tm-epo-apd-suffix' );

				if ( apply_dpd === 1 ) {
					dpd_discount = tm_get_dpd( totalsHolder, epo_object, apply_dpd );
					dpd_string = '';
					if ( dpd_discount[ 0 ] && dpd_discount[ 1 ] && ( dpd_prefix || dpd_suffix ) ) {
						dpd_discount_type = dpd_discount[ 1 ];
						dpd_discount_string = '';
						switch ( dpd_discount_type ) {
							case 'percentage':
								dpd_discount_string = dpd_discount[ 0 ] + '%';
								break;
							case 'fixed_value':
								dpd_discount_string = tm_set_price( dpd_discount[ 0 ] * qty, totalsHolder, false, false );
								break;
							case 'fixed_amount':
								dpd_discount_string = tm_set_price( ( parseFloat( totalsHolder.data( 'price' ) ) - dpd_discount[ 0 ] ) * qty, totalsHolder, false, false );
								break;
						}
						dpd_string = dpd_prefix + ' ' + dpd_discount_string + ' ' + dpd_suffix;
					}
					if ( dpd_string ) {
						dpd_css_selector = totalsHolder.data( 'tm-epo-apd-label-css-selector' );
						dpd_string_placement = totalsHolder.data( 'tm-epo-apd-string-placement' );
						if ( dpd_css_selector === '' ) {
							dpd_css_selector = '.tm-final-totals .amount.final';
						}
						if ( dpd_string_placement === 'after' ) {
							totalsHolder.find( dpd_css_selector ).after( '<span class="tm-dpd-label">' + dpd_string + '</span>' );
						} else {
							totalsHolder.find( dpd_css_selector ).before( '<span class="tm-dpd-label">' + dpd_string + '</span>' );
						}
					}
				}
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-yith-wc-min-max-qty.js000064400000000316150755142450017652 0ustar00( function( window, document, $ ) {
	'use strict';

	$( document ).on( 'ywmmq_additional_operations', function() {
		$( window ).trigger( 'tm-do-epo-update' );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-qtranslatex.js000064400000005374150755142450016466 0ustar00( function( $ ) {
	'use strict';

	var TMEPOQTRANSLATEXJS = window.TMEPOQTRANSLATEXJS || null;

	if ( ! TMEPOQTRANSLATEXJS ) {
		return;
	}

	// Duplicated from q-translate-x
	Object.defineProperty( String.prototype, 'tm_xsplit', {
		value: function( _regEx ) {
			var start = 0;
			var arr = [];
			var result;

			// Most browsers can do this properly, so let them work, they'll do it faster
			if ( 'a~b'.split( /(~)/ ).length === 3 ) {
				return this.split( _regEx );
			}

			if ( ! _regEx.global ) {
				_regEx = new RegExp( _regEx.source, 'g' + ( _regEx.ignoreCase ? 'i' : '' ) );
			}

			// IE (and any other browser that can't capture the delimiter)
			// will, unfortunately, have to be slowed down
			while ( ( result = _regEx.exec( this ) ) !== null ) {
				arr.push( this.slice( start, result.index ) );
				if ( result.length > 1 ) {
					arr.push( result[ 1 ] );
				}
				start = _regEx.lastIndex;
			}
			if ( start < this.length ) {
				arr.push( this.slice( start ) );
			}
			if ( start === this.length ) {
				arr.push( '' );
			}

			return arr;
		}
	} );

	function qtranxj_get_split_blocks( text ) {
		var split_regex = /(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\]|\[:\])/gi;
		return text.tm_xsplit( split_regex );
	}

	function qtranxj_split_blocks( blocks ) {
		var result = {};
		var i;
		var lang;
		var clang_regex = /<!--:([a-z]{2})-->/gi;
		var blang_regex = /\[:([a-z]{2})\]/gi;
		var matches;
		var b;
		var j;

		for ( i = 0; i < TMEPOQTRANSLATEXJS.enabled_languages.length; i += 1 ) {
			lang = TMEPOQTRANSLATEXJS.enabled_languages[ i ];
			result[ lang ] = '';
		}

		if ( ! blocks || ! blocks.length ) {
			return result;
		}

		// No language separator found, enter it to all languages
		if ( blocks.length === 1 ) {
			b = blocks[ 0 ];
			for ( j = 0; j < TMEPOQTRANSLATEXJS.enabled_languages.length; j += 1 ) {
				lang = TMEPOQTRANSLATEXJS.enabled_languages[ j ];
				result[ lang ] += b;
			}
			return result;
		}

		lang = false;

		Object.keys( blocks ).forEach( function( ii ) {
			b = blocks[ ii ];

			if ( ! b.length ) {
				return;
			}
			matches = clang_regex.exec( b );
			clang_regex.lastIndex = 0;
			if ( matches !== null ) {
				lang = matches[ 1 ];
				return;
			}
			matches = blang_regex.exec( b );
			blang_regex.lastIndex = 0;
			if ( matches !== null ) {
				lang = matches[ 1 ];
				return;
			}
			if ( b === '<!--:-->' || b === '[:]' ) {
				lang = false;
				return;
			}
			if ( lang ) {
				result[ lang ] += b;
				lang = false;
			} else {
				// Keep neutral text
				Object.keys( result ).forEach( function( key ) {
					result[ key ] += b;
				} );
			}
		} );

		return result;
	}

	$.qtranxj_split = function( text ) {
		var blocks = qtranxj_get_split_blocks( text );
		return qtranxj_split_blocks( blocks );
	};
}( window.jQuery ) );
includes/compatibility/assets/js/cp-woodmart.js000064400000001301150755142450015736 0ustar00( function( window, document, $ ) {
	'use strict';

	// document ready
	$( function() {
		$( window ).on( 'tcEpoMaybeChangePriceHtml', function( event, dataObject ) {
			var tcAPI = $.tcAPI ? $.tcAPI() : null;
			if ( event && dataObject && dataObject.epo ) {
				$( '.woodmart-sticky-btn-cart .price' )
					.html( $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: dataObject.nativePrice } ) ) )
					.show();
			}
		} );

		$( '.woodmart-sticky-btn-cart .input-text.qty' )
			.off( 'change' )
			.on( 'change', function() {
				$( '.summary-inner .qty' ).val( $( this ).val() ).trigger( 'change' );
			} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-easy-bookings.js000064400000006615150755142450016671 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOEASYBOOKINGSJS;
	var wceb;

	// document ready
	$( function() {
		TMEPOEASYBOOKINGSJS = window.TMEPOEASYBOOKINGSJS || null;
		wceb = window.wceb || null;

		if ( ! TMEPOEASYBOOKINGSJS || ! wceb ) {
			return;
		}

		$( window ).on( 'tm-epo-init-events', function( evt, tc ) {
			var epo_selector = '.tc-extra-product-options';
			var epo = tc.epo;
			var tm_epo_final_total_box = epo.totals_holder.attr( 'data-tm-epo-final-total-box' );
			var current_duration = 1;
			var formatted_total;

			if ( tm_epo_final_total_box === 'disable' ) {
				epo.epo_holder.find( '.tm-epo-field' ).on( 'change.eb', function() {
					if ( wceb.dateFormat === 'two' && wceb.checkIf.datesAreSet() ) {
						wceb.setPrice();
					} else if ( wceb.dateFormat === 'one' && wceb.checkIf.dateIsSet( 'start' ) ) {
						wceb.picker.set();
					} else {
						formatted_total = wceb.formatPrice( wceb.get.basePrice() );
						$( '.booking_price' ).find( '.price .amount' ).html( formatted_total );
					}
				} );
			}
			$( 'body' ).on( 'update_price', function( e, data, response ) {
				var fragments = response.fragments;
				var errors = response.errors;
				var v;

				if ( fragments && ! errors && fragments.epo_base_price ) {
					v = parseFloat( fragments.epo_base_price );

					if ( fragments.epo_duration > 0 ) {
						current_duration = fragments.epo_duration;
					}

					epo.totals_holder.parent().find( '.cpf-product-price' ).val( v );
					epo.totals_holder.data( 'price', v );
					epo.currentCart.trigger( {
						type: 'tm-epo-update',
						norules: 2
					} );
				}
			} );

			function adjustTotal( total ) {
				var options_multiplier = 0;
				var found = false;

				if ( ( ( wceb.dateFormat === 'two' && wceb.checkIf.datesAreSet() ) || ( wceb.dateFormat === 'one' && wceb.checkIf.dateIsSet( 'start' ) ) ) && parseInt( TMEPOEASYBOOKINGSJS.wc_booking_block_qty_multiplier, 10 ) !== 0 ) {
					options_multiplier = options_multiplier + current_duration;
					found = true;
				}

				if ( found ) {
					total = total * options_multiplier;
				}

				return total;
			}

			$.epoAPI.addFilter( 'tcAdjustTotal', adjustTotal, 10, 1 );
			$.epoAPI.addFilter( 'tcAdjustOriginalTotal', adjustTotal, 10, 1 );

			// inject options data to easy bookings ajax
			$.ajaxPrefilter( function( options, originalOptions ) {
				var epos;
				var epos_hidden;
				var form;
				var isURL = false;

				if ( options.type.toLowerCase() !== 'post' ) {
					return;
				}
				if ( originalOptions.url ) {
					isURL = $.epoAPI.util.parseParams( originalOptions.url );
					if ( isURL[ 'wceb-ajax' ] && isURL[ 'wceb-ajax' ] === 'add_new_price' ) {
						isURL = true;
					} else {
						isURL = false;
					}
				}

				if ( isURL || ( originalOptions.data && originalOptions.data.action && originalOptions.data.action === 'add_new_price' && originalOptions.data.additional_cost ) ) {
					epos = $( epo_selector + '.tm-cart-main.tm-product-id-' + epo.product_id + '[data-epo-id="' + epo.epo_id + '"]' );
					epos_hidden = $( '.tm-totals-form-main[data-product-id="' + epo.product_id + '"]' );
					if ( epos.length === 1 ) {
						form = $.extend( epos.tcSerializeObject(), epos_hidden.tcSerializeObject() );
						originalOptions.data.epo_data = $.param( form, false );
						options.data = $.param( $.extend( originalOptions.data, {} ), false );
					}
				}
			} );
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-wootours.js000064400000007143150755142450016015 0ustar00( function( $ ) {
	'use strict';

	function tc_adjust_product_total_price( product_total_price, product_total_price_without_options, total_plus_fee, extraFee ) {
		var adult;
		var child;
		var infant;
		var ct1;
		var ct2;
		var price_adult;
		var price_child;
		var price_infant;
		var price_ct1;
		var price_ct2;
		var woo_product_total_price;

		if ( $( '[name=wt_number_adult]' ).length ) {
			adult = parseFloat( $( '[name=wt_number_adult]' ).val() );
			child = parseFloat( $( '[name=wt_number_child]' ).length ? $( '[name=wt_number_child]' ).val() : 0 );
			infant = parseFloat( $( '[name=wt_number_infant]' ).length ? $( '[name=wt_number_infant]' ).val() : 0 );
			ct1 = parseFloat( $( '[name=wt_number_ct1]' ).length ? $( '[name=wt_number_ct1]' ).val() : 0 );
			ct2 = parseFloat( $( '[name=wt_number_ct1]' ).length ? $( '[name=wt_number_ct1]' ).val() : 0 );
			if ( $( '.product-type-variable' ).length ) {
				price_adult = $( '.woocommerce---price .p-price .amount' ).text().replace( /^\D+/g, '' );
				price_child = $( '.woocommerce-variation-wt-child-price .amount' ).text().replace( /^\D+/g, '' );
				price_infant = $( '.woocommerce-variation-wt-infant-price .amount' ).text().replace( /^\D+/g, '' );
				price_ct1 = $( '.woocommerce-variation-wt-ct1-price .amount' ).text().replace( /^\D+/g, '' );
				price_ct2 = $( '.woocommerce-variation-wt-ct2-price .amount' ).text().replace( /^\D+/g, '' );
			} else {
				price_adult = $( '._adult_select .p-price .amount' ).text().replace( /^\D+/g, '' );
				price_child = $( '._child_select .p-price .amount' ).text().replace( /^\D+/g, '' );
				price_infant = $( '._infant_select .p-price .amount' ).text().replace( /^\D+/g, '' );
				price_ct1 = $( '._ct1_select .p-price .amount' ).text().replace( /^\D+/g, '' );
				price_ct2 = $( '._ct2_select .p-price .amount' ).text().replace( /^\D+/g, '' );
			}
			if ( isNaN( parseFloat( price_adult ) ) ) {
				price_adult = 0;
			}
			if ( isNaN( parseFloat( price_child ) ) ) {
				price_child = 0;
			}
			if ( isNaN( parseFloat( price_infant ) ) ) {
				price_infant = 0;
			}
			if ( isNaN( parseFloat( price_ct1 ) ) ) {
				price_ct1 = 0;
			}
			if ( isNaN( parseFloat( price_ct2 ) ) ) {
				price_ct2 = 0;
			}
			price_adult = $.epoAPI.util.unformat( price_adult );
			price_child = $.epoAPI.util.unformat( price_child );
			price_infant = $.epoAPI.util.unformat( price_infant );
			price_ct1 = $.epoAPI.util.unformat( price_ct1 );
			price_ct2 = $.epoAPI.util.unformat( price_ct2 );
			woo_product_total_price = parseFloat( parseFloat( price_adult ) * adult ) + parseFloat( total_plus_fee + extraFee ) + parseFloat( parseFloat( price_child ) * child ) + parseFloat( parseFloat( price_infant ) * infant ) + parseFloat( parseFloat( price_ct1 ) * ct1 ) + parseFloat( parseFloat( price_ct2 ) * ct2 );

			if ( ! isNaN( woo_product_total_price ) ) {
				product_total_price = woo_product_total_price;
			}
		}

		return product_total_price;
	}

	// document ready
	$( function() {
		$.epoAPI.addFilter( 'tc_adjust_product_total_price', tc_adjust_product_total_price, 10, 4 );
		$.epoAPI.addFilter( 'tc_adjust_product_total_original_price', tc_adjust_product_total_price, 10, 4 );

		$( document ).on( 'change.tc', '.wt-qf, [name="wt_number_adult"], [name="wt_number_child"], [name="wt_number_infant"], [name="wt_number_ct1"], [name="wt_number_adult"], [name="wt_number_ct2"]', function() {
			$( this ).closest( 'form' ).trigger( {
				type: 'tm-epo-update'
			} );
		} );
		$( document ).on( 'click.tc', '.wt-quantity .minus, .wt-quantity .plus', function() {
			$( this ).closest( '.wt-quantity' ).find( '.wt-qf' ).trigger( 'change' );
		} );
	} );
}( window.jQuery ) );
includes/compatibility/assets/js/cp-composite.js000064400000063213150755142450016116 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;
	var tcAPI;

	function get_composite_item_id( item ) {
		return item.attr( 'data-item-id' ) || item.attr( 'data-item_id' );
	}

	function get_composite_price_data( container_id, main_product ) {
		return main_product.find( '.bto_form_' + container_id + ',#composite_form_' + container_id + ',#composite_data_' + container_id ).data( 'price_data' );
	}

	function get_review_selector( item_id ) {
		return ' .review .price_' + item_id + ', .summary_element_' + item_id + ' .summary_element_price';
	}

	function get_composite_container_id( bto ) {
		var container_id = bto.attr( 'data-container-id' );
		var $composite_form;

		if ( ! container_id ) {
			$composite_form = $( bto ).closest( '.composite_form' );
			container_id = $composite_form.find( '.composite_data' ).data( 'container_id' );
		}
		return container_id;
	}

	function is_per_product_pricing( price_data, item_id ) {
		var p;
		if ( price_data.per_product_pricing !== undefined ) {
			p = price_data.per_product_pricing;
		} else if ( price_data.is_priced_individually !== undefined ) {
			if ( item_id ) {
				p = price_data.is_priced_individually[ item_id ] === 'yes';
			} else {
				p = Object.keys( price_data.is_priced_individually ).some( function( x ) {
					if ( Object.prototype.hasOwnProperty.call( price_data.is_priced_individually, x ) ) {
						p = price_data.is_priced_individually[ x ];
						return p === 'yes';
					}
					return null;
				} );
			}
		}
		if ( p === true ) {
			return true;
		}
		return false;
	}

	function check_bto( id, epoObject ) {
		var this_epo_totals_container = epoObject.this_epo_totals_container;
		var main_product = epoObject.main_product;
		var main_cart = epoObject.main_cart;
		var show = true;
		var item;
		var item_id;
		var form_data;
		var product_input;
		var quantity_input;
		var variation_input;
		var product_type;

		main_product
			.find( '.bto_form_' + id + ',#composite_form_' + id + ',#composite_data_' + id )
			.parent()
			.find( tcAPI.compositeSelector )
			.each( function() {
				item = $( this );
				item_id = get_composite_item_id( item );
				form_data = main_product.find( '.bto_form_' + id + ' .bundle_wrap .bundle_button .form_data_' + item_id + ',#composite_form_' + id + ' .bundle_wrap .bundle_button .form_data_' + item_id + ',#composite_data_' + id + ' .composite_wrap .composite_button .form_data_' + item_id );
				product_input = form_data.find( 'input.product_input' ).val();
				quantity_input = form_data.find( 'input.quantity_input' ).val();
				variation_input = form_data.find( 'input.variation_input' ).val();
				product_type = item.find( '.bto_item_data,.component_data' ).data( 'product_type' );

				if ( product_type === undefined || product_type === '' || product_input === '' ) {
					show = false;
				} else if ( product_type !== 'none' && quantity_input === '' ) {
					show = false;
				} else if ( product_type === 'variable' && variation_input === undefined ) {
					show = false;
				}
			} );

		if ( show ) {
			this_epo_totals_container.data( 'btois', 'show' );
		} else {
			this_epo_totals_container.data( 'btois', 'none' );
		}
		main_cart.trigger( {
			type: 'tm-epo-update',
			norules: 1
		} );
	}

	function bto_support( epoObject ) {
		var this_epo_totals_container = epoObject.this_epo_totals_container;
		var main_product = epoObject.main_product;
		var main_cart = epoObject.main_cart;
		var manualInitEPO = epoObject.manualInitEPO;
		var composite_add_to_cart_button;
		var collection;

		if ( main_product.data( 'tm-composite-setup' ) ) {
			return;
		}

		this_epo_totals_container.addClass( 'cpf-bto-totals' );
		main_product.data( 'tm-composite-setup', 1 );

		main_cart.on( 'tm-epo-after-update', function( event, eventData ) {
			var container_id = get_composite_container_id( eventData.container );
			if ( container_id ) {
				main_product.find( '.bto_form_' + container_id + ',#composite_form_' + container_id + ',#composite_data_' + container_id ).trigger( 'cpf_bto_review' );
			}
		} );

		// support for listen to after post success event for purchasable products (2.4)
		$( tcAPI.compositeSelector ).find( '.cart' ).append( '<input type="hidden" class="tm-post-support addon">' );
		main_product.find( '.tm-post-support.addon' ).on( 'change', function() {
			$( this ).closest( tcAPI.compositeSelector ).trigger( 'wc-composite-item-updated.cpf' );
		} );

		$( tcAPI.compositeSelector )
			.off( 'found_variation.cpf' )
			.on( 'found_variation.cpf', function( event, variation ) {
				var item = $( this );
				var container_id = get_composite_container_id( item );
				var price_data = get_composite_price_data( container_id, main_product );
				var product_price;
				var item_id = get_composite_item_id( item );
				var reviewObject = main_product.find( '.bto_form,#composite_form_' + container_id + ',#composite_data_' + container_id ).find( get_review_selector( item_id ) );
				var btoPriceObject = item.find( '.cpf-bto-price' );

				if ( ! price_data ) {
					return;
				}
				reviewObject.removeData( 'cpf_review_price' );
				reviewObject.find( '.amount' ).empty();

				if ( is_per_product_pricing( price_data, item_id ) === true ) {
					product_price = parseFloat( variation.price );
				}
				item.find( '.cart' ).data( 'per_product_pricing', is_per_product_pricing( price_data, item_id ) );
				btoPriceObject.data( 'per_product_pricing', is_per_product_pricing( price_data, item_id ) );
				btoPriceObject.val( product_price );
				main_cart.data( 'per_product_pricing', true );

				item.find( '.cart' ).trigger( {
					type: 'tm-epo-update',
					norules: 1
				} );
				setTimeout( function() {
					main_cart.trigger( {
						type: 'tm-epo-update',
						norules: 1
					} );
				}, 100 );

				this_epo_totals_container.data( 'btois', 'none' );
			} )
			.off( 'wc-composite-component-loaded.cpf' )
			.on( 'wc-composite-component-loaded.cpf', function() {
				$( this ).trigger( 'wc-composite-item-updated.cpf' );
			} )
			.off( 'wc-composite-item-updated.cpf' )
			.on( 'wc-composite-item-updated.cpf', function() {
				var item = $( this );
				var item_tm_extra_product_options = item.find( '.tm-extra-product-options' );
				var container_id = get_composite_container_id( item );
				var price_data = get_composite_price_data( container_id, main_product );
				var product_price;
				var item_id = get_composite_item_id( item );
				var reviewObject = main_product.find( '.bto_form,#composite_form_' + container_id + ',#composite_data_' + container_id ).find( get_review_selector( item_id ) );
				var btoPriceObject = item.find( '.cpf-bto-price' );
				var itemCart = item.find( '.cart' );
				var epoObjectCopy = $.extend( true, {}, epoObject );

				reviewObject.removeData( 'cpf_review_price' );
				reviewObject.find( '.amount' ).empty();

				if ( ! price_data ) {
					return;
				}

				if ( is_per_product_pricing( price_data, item_id ) === true ) {
					product_price = item.find( '.bto_item_data,.component_data' ).data( 'price' );
					if ( product_price === undefined ) {
						product_price = $( '#composite_data_' + container_id ).data( 'price_data' );
						if ( product_price && product_price.prices && item_id in product_price.prices ) {
							product_price = product_price.prices[ item_id ];
						}
					}
					product_price = parseFloat( product_price );
				}
				item.find( '.cart' ).data( 'per_product_pricing', is_per_product_pricing( price_data, item_id ) );
				btoPriceObject.data( 'per_product_pricing', is_per_product_pricing( price_data, item_id ) );
				btoPriceObject.val( product_price );
				main_cart.data( 'per_product_pricing', true );

				manualInitEPO( epoObjectCopy, item, itemCart, item_tm_extra_product_options, main_product );
			} )

			.off( 'change.cpfbto', '.bto_item_options select,.component_options_select' )
			.on( 'change.cpfbto', '.bto_item_options select,.component_options_select', function() {
				var item = $( this );
				var container_id = get_composite_container_id( item );
				var item_id = get_composite_item_id( item );
				var reviewObject = main_product.find( '.bto_form,#composite_form_' + container_id + ',#composite_data_' + container_id ).find( get_review_selector( item_id ) );

				reviewObject.removeData( 'cpf_review_price' );
				reviewObject.find( '.amount' ).empty();
				if ( item.val() === '' ) {
					this_epo_totals_container.data( 'passed', false );
					this_epo_totals_container.data( 'btois', 'none' );
				} else {
					main_cart.trigger( {
						type: 'tm-epo-update',
						norules: 1
					} );
				}
			} )
			.off( 'woocommerce_variation_select_change.cpf' )
			.on( 'woocommerce_variation_select_change.cpf', function() {
				var item = $( this );
				var container_id = get_composite_container_id( item );
				var item_id = get_composite_item_id( item );
				var reviewObject = main_product.find( '.bto_form,#composite_form_' + container_id + ',#composite_data_' + container_id ).find( get_review_selector( item_id ) );

				reviewObject.removeData( 'cpf_review_price' );
				reviewObject.find( '.amount' ).empty();
				if ( item.find( '.variations .attribute-options select' ).val() === '' ) {
					this_epo_totals_container.data( 'passed', false );
					this_epo_totals_container.data( 'btois', 'none' );
				}
			} );

		main_product
			.find( '.bundle_wrap' )
			.off( 'show_bundle.cpf,wc-composite-show-add-to-cart.cpf' )
			.on( 'show_bundle.cpf,wc-composite-show-add-to-cart.cpf', function() {
				check_bto( $( this ).closest( '.cart' ).attr( 'data-container-id' ), epoObject );
			} );

		main_product
			.find( '.composite_data .composite_wrap' )
			.off( 'wc-composite-show-add-to-cart.cpf' )
			.on( 'wc-composite-show-add-to-cart.cpf', function() {
				var id = $( this ).closest( '.composite_form' ).find( '.composite_data' ).data( 'container_id' );

				check_bto( id, epoObject );
				main_product.find( '#composite_data_' + id ).trigger( 'cpf_bto_review' );
			} );

		main_product
			.find( '.bto_form,.composite_form' )
			.off( 'woocommerce-product-addons-update.cpf cpf_bto_review' )
			.on( 'woocommerce-product-addons-update.cpf cpf_bto_review', function() {
				var bto_form = $( this );
				var item;
				var item_id;
				var html;
				var widget;
				var value;
				var options;
				var composite_totals_holder;

				bto_form
					.parent()
					.find( tcAPI.compositeSelector )
					.each( function() {
						item = $( this );
						item_id = get_composite_item_id( item );
						html = bto_form.find( get_review_selector( item_id ) );
						widget = $( '.widget_composite_summary_elements' ).find( '.summary_element.summary_element_' + item_id );
						options = item.find( '.cpf-bto-optionsprice' ).val();
						composite_totals_holder = bto_form.find( '.tc-epo-totals.tm-cart-' + item_id );

						if ( ! html.length ) {
							return;
						}
						if ( html.data( 'cpf_review_price' ) ) {
							value = $.epoAPI.math.unformat( html.data( 'cpf_review_price' ), tcAPI.localDecimalSeparator );
						} else if ( html.find( '.amount' ).length ) {
							value = $.epoAPI.math.unformat( html.find( '.amount' ).html(), TMEPOJS.currency_format_decimal_sep );
							html.data( 'cpf_review_price', value );
						}

						if ( options && composite_totals_holder.data( 'tc_totals_ob' ) ) {
							html.find( '.amount' ).html( composite_totals_holder.data( 'tc_totals_ob' ).formatted_final_total );
							widget.find( '.amount' ).html( composite_totals_holder.data( 'tc_totals_ob' ).formatted_final_total );
						}
					} );
			} );

		$( tcAPI.compositeSelector ).trigger( 'wc-composite-component-loaded.cpf' );

		/* The next code is required in order to accomodate conditioanl logic
		 * otherwise hidden items are posted.
		 *
		 * The relative composite function that affects this is this.Composite_Add_To_Cart_Button_View
		 */
		composite_add_to_cart_button = $( '.composite_add_to_cart_button' );
		collection = composite_add_to_cart_button;
		collection.each( function() {
			var currentEl = $( this ) ? $( this ) : $( document );
			var events = $._data( $( this )[ 0 ], 'events' );
			var isItself = $( this )[ 0 ] === composite_add_to_cart_button[ 0 ];
			if ( ! events ) {
				return;
			}
			$.each( events, function( i, event ) {
				if ( ! event || i !== 'click' ) {
					return;
				}
				$.each( event, function( j, h ) {
					var found = false;

					if ( h ) {
						if ( h.selector && h.selector.length > 0 ) {
							currentEl.find( h.selector ).each( function() {
								if ( $( this )[ 0 ] === composite_add_to_cart_button[ 0 ] ) {
									found = true;
								}
							} );
						} else if ( ! h.selector && isItself ) {
							found = true;
						}
					}

					if ( found ) {
						// event: i
						// selector: h.selector
						// handler: h.handler
						if ( h.handler.toString().indexOf( "$( this ).prop( 'disabled', false );" ) !== -1 || h.handler.toString().indexOf( '(this).prop("disabled",!1)' ) !== -1 || h.handler.toString().indexOf( "(this).prop('disabled',!1)" ) !== -1 ) {
							composite_add_to_cart_button.off( i, h.handler );
							composite_add_to_cart_button.on( i, function() {
								$( '.tm-epo-field' ).each( function() {
									var $this = $( this );
									$this.data( 'disabledstate', $this.prop( 'disabled' ) );
								} );
							} );
							composite_add_to_cart_button.on( i, h.handler );
							composite_add_to_cart_button.on( i, function() {
								$( '.tm-epo-field' ).each( function() {
									var $this = $( this );
									$this.prop( 'disabled', $this.data( 'disabledstate' ) );
								} );
							} );
						}
					}
				} );
			} );
		} );
	}

	function composite_support( epoObject ) {
		var main_product = epoObject.main_product;

		$( '.composite_data' ).on( 'wc-composite-initializing', function( event, composite ) {
			composite.actions.add_action(
				'component_summary_content_updated',
				function( component ) {
					var bto_form = main_product.find( '.bto_form,.composite_form' );
					var html = main_product.find( '#composite_summary_' + bto_form.data( 'product_id' ) ).find( '.summary_element.summary_element_' + component.step_id );
					var widget = $( '.widget_composite_summary_elements' ).find( '.summary_element.summary_element_' + component.step_id );
					var composite_totals_holder = bto_form.find( '.tc-epo-totals.tm-cart-' + component.step_id );

					if ( composite_totals_holder.data( 'tc_totals_ob' ) ) {
						html.find( '.amount' ).html( composite_totals_holder.data( 'tc_totals_ob' ).formatted_final_total );
						widget.find( '.amount' ).html( composite_totals_holder.data( 'tc_totals_ob' ).formatted_final_total );
					}
				},
				100,
				this
			);
		} );
	}

	function finalTotalsBoxVisibility( showTotal, dataObject ) {
		if ( dataObject.totalsHolder.attr( 'data-type' ) === 'bto' || dataObject.totalsHolder.attr( 'data-type' ) === 'composite' ) {
			if ( dataObject.this_epo_totals_container.data( 'btois' ) === 'show' ) {
				showTotal = true;
			}
		}

		if ( ! dataObject.alternativeCart && dataObject.main_product.find( '.cpf-bto-price' ).length > 0 ) {
			showTotal = true;
		}

		return showTotal;
	}

	function calculateFinalProductPrice( object, dataObject ) {
		var alternativeCart = dataObject.alternativeCart;
		var product_price = dataObject.product_price;
		var product_total_price = dataObject.product_total_price;
		var v_product_price = dataObject.v_product_price;
		var line;
		var cartQty = dataObject.cartQty;
		var main_product = dataObject.main_product;
		var product_price_bto = main_product.data( 'product_price_bto' );
		var cpf_bto_price_all = main_product.find( '.cpf-bto-price' );

		if ( ! alternativeCart && cpf_bto_price_all.length > 0 ) {
			// Fix for products that are sold individually
			if ( product_price_bto ) {
				product_price = v_product_price;
				product_total_price = parseFloat( product_price * cartQty );
				product_price_bto.forEach( function( item ) {
					line = 0;
					if ( item[ 3 ] ) {
						line = parseFloat( item[ 0 ] ) + parseFloat( item[ 1 ] );
						product_price = product_price + line;
						product_total_price = product_total_price + parseFloat( line );
					} else {
						line = ( parseFloat( item[ 0 ] ) * parseFloat( item[ 2 ] ) ) + parseFloat( item[ 1 ] );
						product_price = product_price + line;
						product_total_price = product_total_price + parseFloat( line * cartQty );
					}
				} );

				object = {
					productPrice: product_price,
					productTotalPrice: product_total_price
				};
			}
		}

		return object;
	}

	function calculateCurrentProductPrice( product_price, dataObject ) {
		var alternativeCart = dataObject.alternativeCart;
		var cart = dataObject.cart;
		var main_product = dataObject.main_product;
		var priceOverrideMode;
		var cpf_bto_price = cart.find( '.cpf-bto-price' );
		var cpf_bto_price_all = main_product.find( '.cpf-bto-price' );
		var field;
		var fieldValue;
		var qty;
		var isi;
		var optionsprice;
		var product_price_bto = [];
		var item;
		var container_id;
		var item_id;
		var wc_cp_composite_scripts = window.wc_cp_composite_scripts;

		if ( product_price === false ) {
			return product_price;
		}

		if ( alternativeCart && cpf_bto_price.length > 0 ) {
			product_price = parseFloat( $.epoAPI.math.toFloat( cpf_bto_price.val(), 0 ) );
		} else if ( ! alternativeCart && cpf_bto_price_all.length > 0 ) {
			item = main_product.find( tcAPI.compositeSelector );
			container_id = get_composite_container_id( item );
			cpf_bto_price_all.each( function() {
				field = $( this );
				item_id = get_composite_item_id( field.closest( '.composite_component' ) );
				if ( ! item_id ) {
					return;
				}
				priceOverrideMode = field.closest( '.component_data' ).find( '.tc-epo-totals' ).attr( 'data-price-override' );

				// skip hidden fields from scenarios
				if ( container_id && wc_cp_composite_scripts && wc_cp_composite_scripts[ container_id ].scenarios.is_component_hidden( item_id ) ) {
					return;
				}
				fieldValue = field.val();
				if ( Number.isFinite( parseFloat( fieldValue ) ) ) {
					qty = field.closest( '.cart' ).find( tcAPI.qtySelector );
					if ( qty.length > 0 ) {
						qty = parseFloat( qty.val() );
					} else {
						qty = 1;
					}
					isi = field.parent().find( '.cpf-bto-totals' ).attr( 'data-is-sold-individually' );
					optionsprice = field.parent().find( '.cpf-bto-optionsprice' ).val();
					if ( Number.isFinite( parseFloat( optionsprice ) ) ) {
						optionsprice = parseFloat( optionsprice );
					} else {
						optionsprice = 0;
					}
					if ( priceOverrideMode === '1' && optionsprice > 0 ) {
						fieldValue = 0;
					}
					product_price = parseFloat( product_price ) + parseFloat( fieldValue * qty );
					product_price_bto.push( [ fieldValue, optionsprice, qty, isi ] );
				}
			} );

			main_product.data( 'product_price_bto', product_price_bto );

			main_product.find( '.cpf-bto-optionsprice' ).each( function() {
				fieldValue = $( this ).val();
				if ( Number.isFinite( parseFloat( fieldValue ) ) ) {
					product_price = parseFloat( product_price ) + parseFloat( fieldValue );
				}
			} );
		}

		return product_price;
	}

	function calculatePerProductPricing( per_product_pricing, dataObject ) {
		var alternativeCart = dataObject.alternativeCart;
		var cart = dataObject.cart;
		var cpf_bto_price = cart.find( '.cpf-bto-price' );

		if ( alternativeCart && cpf_bto_price.length > 0 ) {
			per_product_pricing = cpf_bto_price.data( 'per_product_pricing' );
		}

		return per_product_pricing;
	}

	function getCurrentProductPrice( price, currentCart, totalsHolder ) {
		var cpf_bto_price;

		if ( ! totalsHolder.length ) {
			cpf_bto_price = currentCart.find( '.cpf-bto-price' );
			if ( cpf_bto_price.length > 0 ) {
				if ( Number.isFinite( parseFloat( cpf_bto_price.val() ) ) ) {
					price = parseFloat( cpf_bto_price.val() );
				}
			}
		}

		return price;
	}

	function getNativePricesBlockSelector( selector ) {
		selector = selector + ',.bundle_price .single_variation .price,.bto_item_wrap .single_variation .price,.component_wrap .single_variation .price,.composite_wrap .single_variation .price';
		return selector;
	}

	function getItemId( id, container ) {
		return get_composite_item_id( container ) || id;
	}

	function getTotalsContainer( container, element, main_product, bundleid ) {
		if ( element.closest( tcAPI.compositeSelector ).length > 0 ) {
			container = main_product.find( '.tm-epo-totals.tm-cart-' + bundleid );
		}

		return container;
	}

	function getEpoContainer( container, element, main_product, bundleid ) {
		if ( element.closest( tcAPI.compositeSelector ).length > 0 ) {
			container = main_product.find( '.tm-extra-product-options.tm-cart-' + bundleid );
		}

		return container;
	}

	function getBundleId( bundleid, cart, epoObject ) {
		if ( ! bundleid && epoObject ) {
			bundleid = epoObject.this_epo_totals_container.closest( '.component_content' ).attr( 'data-product_id' );
			if ( ! bundleid ) {
				bundleid = 0;
			}
		}

		return bundleid;
	}

	function alterProductPrice( product_price, element ) {
		var cpf_bto_price;

		if ( element.closest( tcAPI.compositeSelector ).length > 0 ) {
			cpf_bto_price = element.closest( '.component_wrap' ).find( '.cpf-bto-price' );
			if ( cpf_bto_price.length > 0 ) {
				if ( cpf_bto_price.data( 'per_product_pricing' ) ) {
					product_price = cpf_bto_price.val();
				} else {
					product_price = false;
				}
				cpf_bto_price.val( product_price );
			}
		}

		return product_price;
	}

	function getPerProductPricing( per_product_pricing, element ) {
		var item = element.closest( tcAPI.compositeSelector );
		var priceData;
		var item_id = get_composite_item_id( item );

		if ( item.length > 0 ) {
			priceData = get_composite_price_data( get_composite_container_id( item ), element );
			if ( priceData ) {
				per_product_pricing = is_per_product_pricing( priceData, item_id );
			}
		}

		return per_product_pricing;
	}

	function tmVariationCheckMatchVariationsForm( variationsForm, epoId, productId, $element ) {
		var component_data = $element.closest( '.component_data' );

		if ( component_data.find( '.variations' ).length ) {
			variationsForm = $element.closest( component_data );
		}

		return variationsForm;
	}

	$( window ).on( 'epo-after-init-in-timeout', function( event, epoObject ) {
		if ( event && epoObject && epoObject.epo ) {
			bto_support( epoObject.epo );
		}
	} );

	$( window ).on( 'epo-after-init', function( event, epoObject ) {
		if ( event && epoObject && epoObject.epo ) {
			composite_support( epoObject.epo );
		}
	} );

	$( window ).on( 'tcEpoBeforeOptionPriceCalculation', function( event, dataObject ) {
		if ( event && dataObject && dataObject.epo ) {
			if ( dataObject.alternativeCart ) {
				if ( ( dataObject.this_product_type === 'variable' || dataObject.this_product_type === 'variable-subscription' ) && ! dataObject.totalsHolder.data( 'moved_inside' ) ) {
					dataObject.totalsHolder.data( 'moved_inside', 1 );
				}
			}

			// Move total box of main cart if is composite
			if ( dataObject.epo.main_epo_inside_form && TMEPOJS.tm_epo_totals_box_placement === 'woocommerce_before_add_to_cart_button' ) {
				if ( ( dataObject.this_product_type === 'bto' || dataObject.this_product_type === 'composite' ) && ! dataObject.totalsHolder.data( 'moved_inside' ) ) {
					dataObject.cart.find( '.bundle_price,.composite_price' ).after( dataObject.totalsHolder );
					dataObject.totalsHolder.data( 'moved_inside', 1 );
				}
			}
		}
	} );

	$( window ).on( 'tcEpoMaybeChangePriceHtml', function( event, dataObject ) {
		if ( event && dataObject && dataObject.epo ) {
			if ( dataObject.bundleid && dataObject.alternativeCart && dataObject.cart.find( '.cpf-bto-price' ).length > 0 && dataObject.totalsObject.total_plus_fee >= 0 ) {
				$( '#component_' + dataObject.bundleid )
					.find( tcAPI.compositeComponentPriceSelector )
					.html( $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: dataObject.nativePrice } ) ) )
					.show();
			} else if ( ! dataObject.alternativeCart && dataObject.main_product.find( '.cpf-bto-price' ).length > 0 && dataObject.totalsObject.total_plus_fee >= 0 ) {
				dataObject.cart
					.find( tcAPI.compositePriceSelector )
					.html( $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: dataObject.nativePrice } ) ) )
					.show();
			}
		}
	} );

	$( window ).on( 'tcEpoAfterCalculateTotals', function( event, dataObject ) {
		if ( event && dataObject && dataObject.epo ) {
			if ( dataObject.alternativeCart ) {
				if ( dataObject.per_product_pricing ) {
					dataObject.cart.find( '.cpf-bto-optionsprice' ).val( parseFloat( dataObject.totalsObject.raw_options_total_price ) );
				}
			}
		}
	} );

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;
		tcAPI = $.tcAPI ? $.tcAPI() : null;

		if ( ! TMEPOJS || ! tcAPI ) {
			return;
		}

		tcAPI.compositePriceSelector = '.composite_data .composite_wrap .price .amount';
		tcAPI.compositeComponentPriceSelector = '.component_wrap > .price';

		$.epoAPI.addFilter( 'tcFinalTotalsBoxVisibility', finalTotalsBoxVisibility, 10, 2 );
		$.epoAPI.addFilter( 'tcCalculateFinalProductPrice', calculateFinalProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tcCalculateCurrentProductPrice', calculateCurrentProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tcCalculatePerProductPricing', calculatePerProductPricing, 10, 2 );

		$.epoAPI.addFilter( 'tcGetCurrentProductPrice', getCurrentProductPrice, 10, 3 );
		$.epoAPI.addFilter( 'tcGetNativePricesBlockSelector', getNativePricesBlockSelector, 10, 1 );
		$.epoAPI.addFilter( 'tc_get_item_id', getItemId, 10, 2 );
		$.epoAPI.addFilter( 'tc_get_totals_container', getTotalsContainer, 10, 4 );
		$.epoAPI.addFilter( 'tc_get_epo_container', getEpoContainer, 10, 4 );
		$.epoAPI.addFilter( 'tc_get_bundleid', getBundleId, 10, 3 );
		$.epoAPI.addFilter( 'tc_alter_product_price', alterProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tc_get_per_product_pricing', getPerProductPricing, 10, 2 );

		$.epoAPI.addFilter( 'tm_variation_check_match_variationsForm', tmVariationCheckMatchVariationsForm, 10, 4 );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-measurement.js000064400000011016150755142450016433 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;
	var tcAPI;
	var TMEPOMEASUREMENTJS;

	function alterElementQty( elementQty, dataObject ) {
		if ( TMEPOMEASUREMENTJS.wc_measurement_divide !== '1' && TMEPOMEASUREMENTJS.wc_measurement_qty_multiplier === '1' && dataObject.currentCart.find( '#_measurement_needed' ).length > 0 ) {
			elementQty = dataObject.currentCart.find( '#_measurement_needed' ).val();
		}

		return elementQty;
	}

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;
		TMEPOMEASUREMENTJS = window.TMEPOMEASUREMENTJS || null;
		tcAPI = $.tcAPI ? $.tcAPI() : null;

		if ( ! TMEPOJS || ! tcAPI || ! TMEPOMEASUREMENTJS ) {
			return;
		}

		$.epoAPI.addFilter( 'tcAlterElementQty', alterElementQty, 10, 2 );

		$( window ).on( 'tm-epo-init-end', function( event, eventData ) {
			if ( event && eventData && eventData.variationForm ) {
				eventData.variationForm.trigger( 'wc-measurement-price-calculator-update' );
			}
		} );

		$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
			var get_price_excluding_tax = dataObject.get_price_excluding_tax;
			var get_price_including_tax = dataObject.get_price_including_tax;
			var cartContainer = dataObject.cartContainer;
			var currentCart = dataObject.currentCart;
			var totalsHolder = dataObject.totalsHolder;
			var totalsHolderContainer = dataObject.totalsHolderContainer;

			if ( event && dataObject && dataObject.epo ) {
				// measurement price calculator compatibility
				cartContainer
					.find( '.total_price' )
					.off( 'wc-measurement-price-calculator-total-price-change.cpf' )
					.on( 'wc-measurement-price-calculator-total-price-change.cpf', function( e, d, v ) {
						var force = totalsHolder.attr( 'data-taxable' ) && totalsHolder.attr( 'data-prices-include-tax' ) !== '1' && totalsHolder.attr( 'data-tax-display-mode' ) === 'incl';
						var force2 = totalsHolder.attr( 'data-taxable' ) && totalsHolder.attr( 'data-prices-include-tax' ) === '1' && totalsHolder.attr( 'data-tax-display-mode' ) !== 'incl';

						if ( force && ! force2 ) {
							v = get_price_excluding_tax( v, totalsHolder, null, force );
						} else if ( ! force && force2 ) {
							v = get_price_including_tax( v, totalsHolder, null, force2 );
						}
						if ( TMEPOMEASUREMENTJS.wc_measurement_divide === '1' && totalsHolder.data( 'tm_for_cart' ).find( '#_measurement_needed' ).length > 0 ) {
							v = v / totalsHolder.data( 'tm_for_cart' ).find( '#_measurement_needed' ).val();
						}
						totalsHolderContainer.find( '.cpf-product-price' ).val( v );
						totalsHolder.data( 'price', v );
						totalsHolder.data( 'regular-price', v );
						currentCart.trigger( {
							type: 'tm-epo-update'
						} );
					} );

				cartContainer
					.find( '.product_price' )
					.off( 'wc-measurement-price-calculator-product-price-change.cpf dwc-measurement-price-calculator-update.cpf' )
					.on( 'wc-measurement-price-calculator-product-price-change.cpf dwc-measurement-price-calculator-update.cpf', function( e, d, v ) {
						var force = totalsHolder.attr( 'data-taxable' ) && totalsHolder.attr( 'data-prices-include-tax' ) !== '1' && totalsHolder.attr( 'data-tax-display-mode' ) === 'incl';
						var force2 = totalsHolder.attr( 'data-taxable' ) && totalsHolder.attr( 'data-prices-include-tax' ) === '1' && totalsHolder.attr( 'data-tax-display-mode' ) !== 'incl';

						if ( force && ! force2 ) {
							v = get_price_excluding_tax( v, totalsHolder, null, force );
						} else if ( ! force && force2 ) {
							v = get_price_including_tax( v, totalsHolder, null, force2 );
						} else {
							v = parseFloat( v );
						}
						if ( TMEPOMEASUREMENTJS.wc_measurement_divide === '1' && totalsHolder.data( 'tm_for_cart' ).find( '#_measurement_needed' ).length > 0 ) {
							v = v / totalsHolder.data( 'tm_for_cart' ).find( '#_measurement_needed' ).val();
						}
						totalsHolderContainer.find( '.cpf-product-price' ).val( v );
						totalsHolder.data( 'price', v );
						totalsHolder.data( 'regular-price', v );
						currentCart.trigger( {
							type: 'tm-epo-update'
						} );
					} );

				cartContainer.on( 'found_variation', function() {
					$( 'form.cart' )
						.trigger( 'wc-measurement-price-calculator-update' )
						.trigger( 'wc-measurement-price-calculator-product-price-change' );
				} );

				if ( $( '.product_price, .total_price' ).length > 0 ) {
					$( 'form.cart' )
						.trigger( 'wc-measurement-price-calculator-update' )
						.trigger( 'wc-measurement-price-calculator-product-price-change' );
				}
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-bookings.js000064400000010333150755142450015722 0ustar00( function( document, $ ) {
	'use strict';

	var TMEPOBOOKINGSJS;

	function calculateProductPrice( price, totalsHolder ) {
		var bookingPrice;
		var form = totalsHolder.data( 'tm_for_cart' );
		var cost;
		if ( form ) {
			cost = form.find( '.wc-bookings-booking-cost' );
			if ( cost.length ) {
				bookingPrice = parseFloat( cost.attr( 'data-raw-price' ) );
				if ( ! isNaN( bookingPrice ) && ! bookingPrice.isNaN ) {
					price = bookingPrice;
				} else {
					price = false;
				}
			}
		}

		return price;
	}

	// document ready
	$( function() {
		if ( ! $.epoAPI ) {
			return;
		}

		TMEPOBOOKINGSJS = window.TMEPOBOOKINGSJS || null;

		if ( ! TMEPOBOOKINGSJS ) {
			return;
		}

		if ( TMEPOBOOKINGSJS.wc_bookings_add_options_display_cost === 'yes' ) {
			$( '.tm-epo-field' )
				.on( 'change.tcbookings', function() {
					$( '.wc-bookings-booking-form' ).find( 'input, select:not("#wc-bookings-form-start-time, #wc-bookings-form-end-time")' ).first().trigger( 'change' );
				} );
		}
		$( document ).ajaxSuccess( function( event, request, settings ) {
			var parsedUrl = $.epoAPI.util.parseParams( settings.data );
			var n;
			if ( parsedUrl.action === 'wc_bookings_calculate_costs' ) {
				n = $.epoAPI.util.parseJSON( request.responseText );
				$( 'form.cart' ).find( '.wc-bookings-booking-cost' ).attr( 'data-raw-price', n.raw_price );
				$( 'form.cart' ).trigger( {
					type: 'tm-epo-update',
					norules: 1
				} );
			}
		} );
		$( document.body ).on( 'wc_booking_form_changed', function() {
			$( 'form.cart' ).trigger( {
				type: 'tm-epo-update',
				norules: 1
			} );
		} );

		function adjustTotal( total ) {
			var options_multiplier = 0;
			var found = false;
			var duration;
			var hasPersons;

			if ( TMEPOBOOKINGSJS.wc_booking_block_qty_multiplier === '1' ) {
				duration = parseInt( $( 'input#wc_bookings_field_duration, input.wc_bookings_field_duration' ).first().val(), 10 );
				if ( ! isNaN( duration ) && duration !== 0 ) {
					options_multiplier = options_multiplier + duration;
					found = true;
				}
			}

			if ( TMEPOBOOKINGSJS.wc_booking_person_qty_multiplier === '1' ) {
				found = false;
				hasPersons = $( '[id^=wc_bookings_field_persons]' );
				if ( hasPersons.length ) {
					options_multiplier = options_multiplier + hasPersons.toArray().reduce(
						function( sum, element ) {
							if ( isNaN( sum ) ) {
								sum = 0;
							}
							return sum + Number( element.value );
						}, 0
					);
					found = true;
				}
			}
			if ( found ) {
				total = total * options_multiplier;
			}

			return total;
		}

		function qtyElementForRepeaterQuantity( qty ) {
			var hasPersons = $( '[id^=wc_bookings_field_persons]' );
			if ( hasPersons.length ) {
				qty = hasPersons;
			}
			return qty;
		}

		function qtyElementForRepeaterQuantityPrevValue( val ) {
			var hasPersons = $( '[id^=wc_bookings_field_persons]' );
			if ( hasPersons.length ) {
				val = hasPersons.toArray().reduce(
					function( sum, element ) {
						if ( isNaN( sum ) ) {
							sum = 0;
						}
						return sum + Number( element.value );
					}, 0
				);
			}
			hasPersons.data( 'tm-prev-value', val );
			return val;
		}

		function qtyElementForRepeaterQuantityValue( val ) {
			var hasPersons = $( '[id^=wc_bookings_field_persons]' );
			if ( hasPersons.length ) {
				val = hasPersons.toArray().reduce(
					function( sum, element ) {
						if ( isNaN( sum ) ) {
							sum = 0;
						}
						return sum + Number( element.value );
					}, 0
				);
			}
			return val;
		}

		function getCurrentQty( qty ) {
			qty = 1;
			return qty;
		}

		$.epoAPI.addFilter( 'tc_getCurrentQty', getCurrentQty, 10, 1 );
		$.epoAPI.addFilter( 'tcAdjustTotal', adjustTotal, 10, 1 );
		$.epoAPI.addFilter( 'tcAdjustOriginalTotal', adjustTotal, 10, 1 );
		$.epoAPI.addFilter( 'tc_calculate_product_price', calculateProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'tc_calculate_product_regular_price', calculateProductPrice, 10, 2 );
		$.epoAPI.addFilter( 'qtyElementForRepeaterQuantity', qtyElementForRepeaterQuantity, 10, 1 );
		$.epoAPI.addFilter( 'qtyElementForRepeaterQuantity_tm-prev-value', qtyElementForRepeaterQuantityPrevValue, 10, 1 );
		$.epoAPI.addFilter( 'qtyElementForRepeaterQuantityValue', qtyElementForRepeaterQuantityValue, 10, 1 );
	} );
}( document, window.jQuery ) );
includes/compatibility/assets/js/cp-quickview.js000064400000006255150755142450016126 0ustar00( function( window, document, $ ) {
	'use strict';

	var TMEPOJS;
	var tcAPI;

	// document ready
	$( function() {
		TMEPOJS = window.TMEPOJS || null;
		tcAPI = $.tcAPI ? $.tcAPI() : null;

		if ( ! TMEPOJS || ! tcAPI ) {
			return;
		}

		// Sober theme quickview fix
		$( 'body' ).on( 'sober_quickview_opened', function() {
			var product_id;
			var epo_id;
			var tmLazyloadContainer;

			tmLazyloadContainer = $( '#quick-view-modal' );
			$.tcepo.tmLazyloadContainer( tmLazyloadContainer );

			product_id = tmLazyloadContainer.find( tcAPI.epoSelector ).attr( 'data-product-id' );
			epo_id = tmLazyloadContainer.find( tcAPI.epoSelector ).attr( 'data-epo-id' );

			$.tcepo.tm_init_epo( tmLazyloadContainer, true, product_id, epo_id );
			$( window ).trigger( 'tmlazy' );
			$( window ).trigger( 'tm_epo_loaded_quickview' );
			if ( $.jMaskGlobals ) {
				tmLazyloadContainer.find( $.jMaskGlobals.maskElements ).each( function() {
					var t = $( this );

					if ( t.attr( 'data-mask' ) ) {
						t.mask( t.attr( 'data-mask' ) );
					}
				} );
			}
		} );
		if ( window.ctEvents ) {
			window.ctEvents.on( 'blocksy:frontend:init', function() {
				// quickview plugins
				var qv_container = TMEPOJS.quickview_array || 'null';
				var fromaddons = TMEPOJS.quickview_container || 'null';
				var added = {};
				var selectors;
				var container;
				var product_id;
				var epo_id;
				var noProductCheck;
				var time = 1;
				var key = 'blocsky_get_woo_quick_view';
				var tmLazyloadContainer;

				$( '.tm-formepo-normal' ).remove();
				$( '.tm-formepo' ).remove();

				qv_container = $.epoAPI.util.parseJSON( qv_container );

				fromaddons = $.epoAPI.util.parseJSON( fromaddons );

				for ( selectors in fromaddons ) {
					if ( Object.prototype.hasOwnProperty.call( fromaddons, selectors ) ) {
						added[ fromaddons[ selectors ][ 0 ] ] = $( fromaddons[ selectors ][ 1 ] );
					}
				}

				$.extend( qv_container, added );

				noProductCheck = false;
				container = $( qv_container[ key ] );

				if ( container.find( '.product' ).length === 0 && container.is( '.product' ) ) {
					noProductCheck = true;
				}

				if ( container.length && ( container.find( '.product' ).length > 0 || noProductCheck ) ) {
					container.removeClass( 'tc-init' );

					tmLazyloadContainer = container;
					$.tcepo.tmLazyloadContainer( tmLazyloadContainer );

					setTimeout( function() {
						product_id = tmLazyloadContainer.find( tcAPI.epoSelector ).attr( 'data-product-id' );
						epo_id = tmLazyloadContainer.find( tcAPI.epoSelector ).attr( 'data-epo-id' );
						if ( key === 'woodmart_quick_shop' ) {
							container.addClass( 'has-options' );
						}

						// Reset element cache
						tcAPI.getElementFromFieldCache = [];
						$.tcepo.tm_init_epo( tmLazyloadContainer, true, product_id, epo_id );
						$( window ).trigger( 'tmlazy' );
						$( window ).trigger( 'tm_epo_loaded_quickview' );
						if ( $.jMaskGlobals ) {
							tmLazyloadContainer.find( $.jMaskGlobals.maskElements ).each( function() {
								var t = $( this );

								if ( t.attr( 'data-mask' ) ) {
									t.mask( t.attr( 'data-mask' ) );
								}
							} );
						}
					}, time );
				}
			} );
		}
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-nyp.js000064400000002216150755142450014716 0ustar00( function( window, document, $ ) {
	'use strict';

	// document ready
	$( function() {
		$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
			var currentCart = dataObject.currentCart;
			var totalsHolderContainer = dataObject.totalsHolderContainer;
			var totalsHolder = dataObject.totalsHolder;

			if ( event && dataObject && dataObject.epo ) {
				// Name your price compatibility
				currentCart.off( 'woocommerce-nyp-update.cpf' ).on( 'woocommerce-nyp-update.cpf', function() {
					var nyp = currentCart.find( '.nyp' );
					var new_product_price = nyp.data( 'price' );

					if ( nyp.length > 0 ) {
						totalsHolderContainer.find( '.cpf-product-price' ).val( new_product_price );
						totalsHolder.data( 'price', new_product_price );
						currentCart.trigger( {
							type: 'tm-epo-update',
							norules: 2
						} );
					}
				} );

				$( 'body' )
					.off( 'woocommerce-nyp-updated.cpf' )
					.on( 'woocommerce-nyp-updated.cpf', function() {
						currentCart.trigger( 'woocommerce-nyp-update.cpf' );
					} );

				currentCart.trigger( 'woocommerce-nyp-update.cpf' );
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/js/cp-fpd.js000064400000002653150755142450014666 0ustar00( function( window, document, $ ) {
	'use strict';

	// document ready
	$( function() {
		$( window ).on( 'epoEventHandlers', function( event, dataObject ) {
			var currentCart;
			var totalsHolder;

			if ( event && dataObject && dataObject.epo ) {
				currentCart = dataObject.currentCart;
				totalsHolder = dataObject.totalsHolder;

				$( '#fancy-product-designer-' + totalsHolder.parent().attr( 'data-product-id' ) )
					.off( 'priceChange.cpf' )
					.on( 'priceChange.cpf', function( evt, sp, tp ) {
						var v = tp;

						if ( undefined === v && undefined !== window.fancyProductDesigner ) {
							v = window.fancyProductDesigner.currentPrice;
						}

						if ( totalsHolder.data( 'fpdprice' ) === undefined ) {
							totalsHolder.data( 'fpdprice', parseFloat( v ) );
						} else {
							totalsHolder.data( 'fpdprice', parseFloat( v ) );
						}

						if ( totalsHolder.data( 'tcprice' ) === undefined ) {
							totalsHolder.data( 'tcprice', parseFloat( totalsHolder.data( 'price' ) ) );
						} else {
							totalsHolder.data( 'price', parseFloat( totalsHolder.data( 'tcprice' ) ) );
						}

						v = parseFloat( totalsHolder.data( 'price' ) ) + parseFloat( v );
						totalsHolder.parent().find( '.cpf-product-price' ).val( v );

						totalsHolder.data( 'price', v );

						currentCart.trigger( {
							type: 'tm-epo-update',
							norules: 2
						} );
					} );
			}
		} );
	} );
}( window, document, window.jQuery ) );
includes/compatibility/assets/index.php000064400000000126150755142450014354 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/compatibility/classes/class-themecomplete-epo-cp-composite.php000064400000020145150755142450022522 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce Composite Products
 * https://woocommerce.com/products/composite-products/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Composite {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Composite|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Composite
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'WC_Composite_Products' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 11 );
		add_action( 'woocommerce_composited_product_add_to_cart', [ $this, 'tm_composited_display_support' ], 11, 2 );
		add_filter( 'woocommerce_composite_button_behaviour', [ $this, 'tm_woocommerce_composite_button_behaviour' ], 50, 1 );
		add_action( 'woocommerce_composite_products_remove_product_filters', [ $this, 'tm_woocommerce_composite_products_remove_product_filters' ], 99999 );
		add_filter( 'woocommerce_composite_cart_permalink_args', [ $this, 'woocommerce_composite_cart_permalink_args' ], 99, 2 );
		add_filter( 'wc_epo_tm_post_class_no_options', [ $this, 'wc_epo_tm_post_class_no_options' ], 10, 2 );
		add_filter( 'wc_epo_options_min_price', [ $this, 'wc_epo_options_min_price' ], 10, 2 );
		add_filter( 'wc_epo_options_max_price', [ $this, 'wc_epo_options_max_price' ], 10, 2 );
		add_filter( 'wc_epo_woocommerce_available_variation_check', [ $this, 'wc_epo_woocommerce_available_variation_check' ], 10, 1 );
	}

	/**
	 * Override woocommerce_available_variation check
	 *
	 * @param boolean $ret To run the check or not.
	 * @return boolean
	 * @since 6.1
	 */
	public function wc_epo_woocommerce_available_variation_check( $ret = true ) {
		if ( isset( $_REQUEST['wc-ajax'] ) && 'woocommerce_show_composited_product' === $_REQUEST['wc-ajax'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$ret = false;
		}

		return $ret;
	}

	/**
	 * Alter catalog price
	 *
	 * @param string|float $price The price to alter.
	 * @param object       $product The product object.
	 * @return float
	 * @since 5.0.12.11
	 */
	public function wc_epo_options_min_price( $price, $product ) {
		if ( is_object( $product ) && is_callable( [ $product, 'get_composite_regular_price' ] ) ) {
			$regular_price_min = $product->get_composite_regular_price( 'min', true );

			$price = floatval( $price ) + floatval( $regular_price_min );
		}

		return (float) $price;
	}

	/**
	 * Alter catalog price
	 *
	 * @param string|float $price The price to alter.
	 * @param object       $product The product object.
	 * @return float
	 * @since 5.0.12.11
	 */
	public function wc_epo_options_max_price( $price, $product ) {
		if ( is_object( $product ) && is_callable( [ $product, 'get_composite_regular_price' ] ) ) {
			$regular_price_max = $product->get_composite_regular_price( 'max', true );

			$price = floatval( $price ) + floatval( $regular_price_max );
		}
		return (float) $price;
	}

	/**
	 * Search composite products for extra options
	 *
	 * @param array<mixed> $classes Array of classes.
	 * @param integer|null $post_id The post id.
	 * @return array<mixed>
	 * @since 5.0.12.9
	 */
	public function wc_epo_tm_post_class_no_options( $classes = [], $post_id = null ) {

		$terms        = get_the_terms( $post_id, 'product_type' );
		$product_type = ! empty( $terms ) && isset( current( $terms )->name ) ? sanitize_title( current( $terms )->name ) : 'simple';
		$has_epo      = THEMECOMPLETE_EPO_API()->has_options( $post_id );
		if ( ( 'bto' === $product_type || 'composite' === $product_type )
			&& ! THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo )
			&& 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' )
		) {

			// search components for options.
			$product = wc_get_product( $post_id );
			if ( is_callable( [ $product, 'get_composite_data' ] ) ) {
				$composite_data = $product->get_composite_data();

				foreach ( $composite_data as $component_id => $component_data ) {

					$component_options = [];

					if ( class_exists( 'WC_CP_Component' ) && method_exists( 'WC_CP_Component', 'query_component_options' ) ) { // @phpstan-ignore-line
						$component_options = WC_CP_Component::query_component_options( $component_data );
					} elseif ( function_exists( 'WC_CP' ) ) {
						$component_options = WC_CP()->api->get_component_options( $component_data );
					} else {
						global $woocommerce_composite_products;
						if ( is_object( $woocommerce_composite_products ) && function_exists( 'WC_CP' ) ) { // @phpstan-ignore-line
							$component_options = WC_CP()->api->get_component_options( $component_data );
						} elseif ( isset( $component_data['assigned_ids'] ) && is_array( $component_data['assigned_ids'] ) ) {
							$component_options = $component_data['assigned_ids'];
						}
					}

					foreach ( $component_options as $key => $pid ) {
						$has_options = THEMECOMPLETE_EPO_API()->has_options( $pid );
						if ( THEMECOMPLETE_EPO_API()->is_valid_options_or_variations( $has_options ) ) {
							$classes[] = 'tm-no-options-composite';

							return $classes;
						}
					}
				}
			}
		}

		return $classes;
	}
	/**
	 * Enable options when editing cart for composite products
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function woocommerce_composite_cart_permalink_args( $args, $cart_item ) {
		if ( isset( $cart_item['tmcartepo_bto'] ) && count( $cart_item['tmcartepo_bto'] ) ) {
			$args = array_merge( $args, $cart_item['tmcartepo_bto'] );
		}

		return $args;
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-composite-products', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-composite.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}

	/**
	 * Set bto flag
	 *
	 * @return void
	 */
	public function tm_woocommerce_composite_products_remove_product_filters() {
		THEMECOMPLETE_EPO()->is_bto = false;
	}

	/**
	 * Hide or disable the add-to-cart button if the composite has any components pending user input.
	 *
	 * @param string $type new or old.
	 * @return string
	 */
	public function tm_woocommerce_composite_button_behaviour( $type = '' ) {
		if ( isset( $_REQUEST['cpf_bto_price'] ) && ( isset( $_REQUEST['add-product-to-cart'] ) || isset( $_REQUEST['wccp_component_selection'] ) ) && isset( $_REQUEST['item_quantity'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$type = 'old';
		}

		return $type;
	}

	/**
	 * Include options in the composite product
	 *
	 * @param object|boolean $product The product.
	 * @param string         $component_id The component id.
	 * @return void
	 * @since 1.0
	 */
	public function tm_composited_display_support( $product = false, $component_id = '' ) {
		if ( $product ) {
			THEMECOMPLETE_EPO()->set_tm_meta( themecomplete_get_id( $product ) );
			THEMECOMPLETE_EPO()->is_bto = true;
			if ( ( 'normal' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_display' ) || 'normal' === THEMECOMPLETE_EPO()->tm_meta_cpf['override_display'] ) && 'action' !== THEMECOMPLETE_EPO()->tm_meta_cpf['override_display'] ) {
				THEMECOMPLETE_EPO_DISPLAY()->frontend_display( themecomplete_get_id( $product ), $component_id );
			}
			return;
		}
		// something went wrong. wrong product id??
		// if you get here the plugin will not work.
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-dpd.php000064400000146211150755142450021272 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce Dynamic Pricing & Discounts
 * https://codecanyon.net/item/woocommerce-dynamic-pricing-discounts/7119279
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_DPD {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_DPD|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Flag the order if it has discounts
	 *
	 * @var string
	 * @since 1.0
	 */
	private $order_flag = 'tm_has_dpd';

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_DPD
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'init', [ $this, 'add_compatibility' ] );
		add_filter( 'plugins_loaded', [ $this, 'add_compatibility_settings' ], 2, 1 );
		add_filter( 'wc_epo_autoload_path', [ $this, 'wc_epo_autoload_path' ], 10, 2 );
		add_filter( 'wc_epo_autoload_file', [ $this, 'wc_epo_autoload_file' ], 10, 2 );
	}

	/**
	 * Add compatibility settings
	 *
	 * @return void
	 */
	public function add_compatibility_settings() {
		add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
	}

	/**
	 * Enqueue Scripts
	 *
	 * @return void
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-dpd', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-dpd.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( class_exists( 'RP_WCDPD' ) ) {
			$settings['tm_epo_dpd_enable']                      = [ 'no', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_prefix']                      = [ '', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_suffix']                      = [ '', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_enable_pricing_table']        = [ 'no', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_show_option_prices_in_order'] = [ 'no', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_string_placement']            = [ '', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_label_css_selector']          = [ '', $this, 'is_dpd_enabled' ];
			$settings['tm_epo_dpd_original_price_base']         = [ '', $this, 'is_dpd_enabled' ];
		}

		return $settings;
	}

	/**
	 * Check if WooCommerce Dynamic Pricing & Discounts is enabled
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_dpd_enabled() {
		return class_exists( 'RP_WCDPD' );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'RP_WCDPD' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );

		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) ) {
			add_action( 'woocommerce_cart_loaded_from_session', [ $this, 'cart_loaded_from_session_2' ], 2 );
			if ( defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '2.3.4', '>=' ) ) {
				add_filter( 'woocommerce_product_get_price', [ $this, 'woocommerce_product_get_price_99999' ], 99999, 2 );
				add_filter( 'woocommerce_product_variation_get_price', [ $this, 'woocommerce_product_get_price_99999' ], 99999, 2 );
				// Using woocommerce_before_mini_cart_contents instead of woocommerce_before_mini_cart
				// and  woocommerce_mini_cart_contents instead of woocommerce_after_mini_cart
				// to support Elementor cart widget.
				add_action( 'woocommerce_before_mini_cart_contents', [ $this, 'woocommerce_before_mini_cart' ] );
				add_action( 'woocommerce_mini_cart_contents', [ $this, 'woocommerce_after_mini_cart' ] );
			} else {
				add_action( 'woocommerce_cart_loaded_from_session', [ $this, 'cart_loaded_from_session_99999' ], 99999 );
				add_filter( 'rightpress_product_price_late_hook_priority', [ $this, 'rightpress_product_price_late_hook_priority' ], 10 );
			}
		}
		// This is needed in order for our hooks like woocommerce_cart_item_price to work correctly.
		add_filter( 'rightpress_late_hook_priority', [ $this, 'rightpress_product_price_late_hook_priority' ], 10 );

		add_filter( 'wc_epo_adjust_price_before_calculate_totals', [ $this, 'wc_epo_adjust_price_before_calculate_totals' ] );
		add_filter( 'woocommerce_cart_item_price', [ $this, 'cart_item_price' ], 99999, 3 );
		add_action( 'wc_epo_order_item_meta', [ $this, 'wc_epo_order_item_meta' ], 10, 3 );

		add_filter( 'wc_epo_discounted_price', [ $this, 'get_rp_wcdpd' ], 10, 4 );

		add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
		add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );

		add_filter( 'wc_epo_product_price_rules', [ $this, 'wc_epo_product_price_rules' ], 10, 2 );
		add_filter( 'wc_epo_template_args_tm_totals', [ $this, 'wc_epo_template_args_tm_totals' ], 10, 2 );
		add_action( 'wc_epo_template_tm_totals', [ $this, 'wc_epo_template_tm_totals' ], 10, 1 );

		add_action( 'woocommerce_tm_epo_price_compatibility', [ $this, 'woocommerce_tm_epo_price_compatibility' ], 10, 2 );

		add_filter( 'epo_can_show_order_price', [ $this, 'epo_can_show_order_price' ], 10, 2 );

		add_filter( 'wc_epo_original_price_type_mode', [ $this, 'wc_epo_original_price_type_mode' ], 1, 4 );
	}

	/**
	 * Select correct original price type mode
	 *
	 * @return false
	 * @since 5.0.12.9
	 */
	public function wc_epo_adjust_price_before_calculate_totals() {
		return false;
	}

	/**
	 * Select correct original price type mode
	 *
	 * @param float|string $price The price to convert.
	 * @param array<mixed> $post_data The posted data.
	 * @return mixed
	 * @since 5.0.6
	 */
	public function wc_epo_original_price_type_mode( $price = '', $post_data = [] ) {
		if ( 'undiscounted' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_original_price_base' ) && isset( $post_data['tcaddtocart'] ) ) {
			if ( class_exists( 'RightPress_Product_Price' ) ) {
				RightPress_Product_Price::get_instance()->start_running_custom_calculations();
			}
			$product = wc_get_product( $post_data['tcaddtocart'] );
			if ( $product instanceof WC_Product ) {
				$type = themecomplete_get_product_type( $product );
				if ( 'variable' === $type || 'variable-subscription' === $type ) {
					remove_filter( 'wc_epo_original_price_type_mode', [ $this, 'wc_epo_original_price_type_mode' ], 1 );
					$product = wc_get_product( $post_data['variation_id'] );
					add_filter( 'wc_epo_original_price_type_mode', [ $this, 'wc_epo_original_price_type_mode' ], 1, 4 );
				}
				if ( $product instanceof WC_Product ) {
					$price = $product->get_price();
				}
				if ( class_exists( 'RightPress_Product_Price' ) ) {
					RightPress_Product_Price::get_instance()->stop_running_custom_calculations();
				}
			}
		}

		return $price;
	}

	/**
	 * Change price in mini cart
	 *
	 * @access public
	 *
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_before_mini_cart() {
		$cart_contents = WC()->cart->cart_contents;
		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				if ( ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_options_prices'] ) && ! empty( $cart_item['tm_epo_doing_adjustment'] ) && empty( $cart_item['epo_price_override'] ) ) {
					WC()->cart->cart_contents[ $cart_item_key ]['data']->tc_in_mini_cart = 1;
				}
			}
		}
		WC()->cart->calculate_totals();
	}

	/**
	 * Change price in mini cart
	 *
	 * @access public
	 *
	 * @return void
	 * @since 5.0
	 */
	public function woocommerce_after_mini_cart() {
		$cart_contents = WC()->cart->cart_contents;
		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				if ( ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_options_prices'] ) && ! empty( $cart_item['tm_epo_doing_adjustment'] ) && empty( $cart_item['epo_price_override'] ) ) {
					unset( WC()->cart->cart_contents[ $cart_item_key ]['data']->tc_in_mini_cart );
				}
			}
		}
	}

	/**
	 * Change price in cart
	 *
	 * @param integer $price The price to convert.
	 * @param object  $product The product object.
	 * @return mixed
	 *
	 * @since 4.9.12
	 */
	public function woocommerce_product_get_price_99999( $price, $product ) {
		if ( is_cart() || is_checkout() || ! empty( $product->tc_in_mini_cart ) ) {
			if ( ! empty( $product->rightpress_in_cart ) ) {
				$cart_item_key = $product->rightpress_in_cart;
				if ( isset( WC()->cart->cart_contents[ $cart_item_key ] ) ) {
					$cart_item = WC()->cart->cart_contents[ $cart_item_key ];
					if ( ! isset( $cart_item['tc_recalculate'] ) && ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_options_prices'] ) && empty( $cart_item['epo_price_override'] ) ) {
						WC()->cart->cart_contents[ $cart_item_key ]['tm_epo_product_after_adjustment'] = $price;
						$price = floatval( $price ) + floatval( $cart_item['tm_epo_options_prices'] );
						unset( WC()->cart->cart_contents[ $cart_item_key ]['tm_epo_doing_adjustment'] );
					}
				}
			}
		}

		return $price;
	}

	/**
	 * Change late hook priority
	 *
	 * @return integer
	 *
	 * @since 4.9.6
	 */
	public function rightpress_product_price_late_hook_priority() {
		return 99990;
	}

	/**
	 * Check if we can show option prices in the order
	 *
	 * @param boolean      $can true or false.
	 * @param array<mixed> $item_meta The item meta.
	 * @return boolean
	 * @since 4.8.4
	 */
	public function epo_can_show_order_price( $can = true, $item_meta = [] ) {
		$order_flag = isset( $item_meta[ $this->order_flag ] ) ? $item_meta[ $this->order_flag ] : ( isset( $item_meta[ '_' . $this->order_flag ] ) ? $item_meta[ '_' . $this->order_flag ] : [] );
		if ( is_array( $order_flag ) && count( $order_flag ) > 0 ) {
			$order_flag = $order_flag[0];
		}
		$order_flag = themecomplete_maybe_unserialize( $order_flag );
		if ( is_array( $order_flag ) && count( $order_flag ) > 0 ) {
			$order_flag = $order_flag[0];
		}
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_show_option_prices_in_order' ) && ! empty( $order_flag ) ) {
			$can = false;
		}

		return $can;
	}

	/**
	 * Get missing quantity range
	 *
	 * @access public
	 *
	 * @param mixed $from The from range.
	 * @param mixed $to The to range.
	 *
	 * @return array<mixed>
	 */
	public static function get_missing_range( $from, $to ) {
		return [
			'from'             => $from,
			'to'               => $to,
			'pricing_method'   => 'discount__amount',
			'pricing_value'    => 0,
			'is_missing_range' => true,
		];
	}

	/**
	 * Add missing quantity ranges (gaps in continuity)
	 *
	 * @access public
	 *
	 * @param array<mixed> $quantity_ranges Array of ranges.
	 * @param object       $product The product object.
	 *
	 * @return array<mixed>
	 */
	public static function add_missing_ranges( $quantity_ranges, $product ) {
		$fixed = [];

		if ( class_exists( 'RP_WCDPD_Settings' ) && class_exists( 'RightPress_Help' ) ) {
			// Check if product uses decimal quantities.
			$decimal_quantities = RP_WCDPD_Settings::get( 'decimal_quantities' ) && RightPress_Help::wc_product_uses_decimal_quantities( $product );

			// Get quantity step.
			$quantity_step = $decimal_quantities ? RightPress_Help::get_wc_product_quantity_step( $product ) : 1;

			$last_from = null;
			$last_to   = null;

			$count = count( $quantity_ranges );
			$i     = 1;

			foreach ( $quantity_ranges as $quantity_range ) {

				// Get from and to.
				$from = $quantity_range['from'];
				$to   = $quantity_range['to'];

				// Maybe add first range.
				if ( null === $last_from && $from > $quantity_step ) {
					$fixed[] = self::get_missing_range( $quantity_step, ( $from - $quantity_step ) );
				}

				// Gap between last to and current from.
				if ( null !== $last_to && ( $from - $last_to ) > $quantity_step ) {
					$fixed[] = self::get_missing_range( ( $last_to + $quantity_step ), ( $from - $quantity_step ) );
				}

				// Add current range.
				$fixed[] = $quantity_range;

				// Set last from and to.
				$last_from = $from;
				$last_to   = $to;

				++$i;
			}

			// Add closing range.
			if ( null !== $last_to ) {
				$fixed[] = self::get_missing_range( ( $last_to + $quantity_step ), null );
			}
		}

		return $fixed;
	}

	/**
	 * Alter product price
	 *
	 * @param mixed  $price The price to convert.
	 * @param object $product The product object.
	 * @return mixed
	 * @since 1.0
	 */
	public function woocommerce_tm_epo_price_compatibility( $price, $product ) {
		if ( $product instanceof WC_Product && class_exists( 'RP_WCDPD_Settings' ) && defined( 'RP_WCDPD_VERSION' ) ) {
			if ( class_exists( 'RP_WCDPD_Promotion_Display_Price_Override' ) && RP_WCDPD_Settings::get( 'promo_display_price_override' ) ) {
				if ( function_exists( 'WC_CP' ) && version_compare( WC_CP()->version, '3.8', '<' ) && 'composite' === themecomplete_get_product_type( $product ) && is_callable( [ $product, 'get_base_price' ] ) ) {
					RP_WCDPD_Promotion_Display_Price_Override::get_instance()->remove_all_price_hooks();
					$price = $product->get_base_price();
					RP_WCDPD_Promotion_Display_Price_Override::get_instance()->add_all_price_hooks();
				} elseif ( RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) {
					RP_WCDPD_Promotion_Display_Price_Override::get_instance()->remove_all_price_hooks();
					$price = $product->get_price();
					RP_WCDPD_Promotion_Display_Price_Override::get_instance()->add_all_price_hooks();
				}
			} elseif ( version_compare( RP_WCDPD_VERSION, '2.3', '>=' ) && class_exists( 'RightPress_Product_Price_Shop' ) ) {
				if ( function_exists( 'WC_CP' ) && version_compare( WC_CP()->version, '3.8', '<' ) && 'composite' === themecomplete_get_product_type( $product ) && is_callable( [ $product, 'get_base_price' ] ) ) {
					RightPress_Product_Price_Shop::start_observation();
					$price = $product->get_base_price();
					RightPress_Product_Price_Shop::get_observed();
				} elseif ( RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) {
					RightPress_Product_Price_Shop::start_observation();
					$price = $product->get_price();
					RightPress_Product_Price_Shop::get_observed();
				}
			} elseif ( version_compare( RP_WCDPD_VERSION, '2.2', '>=' ) && class_exists( 'RP_WCDPD_Product_Price_Override' ) ) {
				if ( function_exists( 'WC_CP' ) && version_compare( WC_CP()->version, '3.8', '<' ) && 'composite' === themecomplete_get_product_type( $product ) && is_callable( [ $product, 'get_base_price' ] ) ) {
					RP_WCDPD_Product_Price_Override::get_instance()->remove_all_price_hooks();
					$price = $product->get_base_price();
					RP_WCDPD_Product_Price_Override::get_instance()->add_all_price_hooks();
				} elseif ( RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) {
					RP_WCDPD_Product_Price_Override::get_instance()->remove_all_price_hooks();
					$price = $product->get_price();
					RP_WCDPD_Product_Price_Override::get_instance()->add_all_price_hooks();
				}
			}
		}

		return $price;
	}

	/**
	 * Add extra html data attributes
	 *
	 * @param array<mixed> $args Array or arguments.
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_template_tm_totals( $args ) {
		$tm_epo_dpd_prefix               = $args['tm_epo_dpd_prefix'];
		$tm_epo_dpd_suffix               = $args['tm_epo_dpd_suffix'];
		$tm_epo_dpd_enable_pricing_table = $args['tm_epo_dpd_enable_pricing_table'];
		$tm_epo_dpd_enable               = $args['tm_epo_dpd_enable'];
		$tm_epo_dpd_string_placement     = $args['tm_epo_dpd_string_placement'];
		$tm_epo_dpd_label_css_selector   = $args['tm_epo_dpd_label_css_selector'];
		$tm_epo_dpd_original_price_base  = $args['tm_epo_dpd_original_price_base'];

		echo 'data-tm-epo-dpd-enable-pricing-table="' . esc_attr( $tm_epo_dpd_enable_pricing_table ) . '" data-tm-epo-dpd-prefix="' . esc_attr( $tm_epo_dpd_prefix ) . '" data-tm-epo-dpd-suffix="' . esc_attr( $tm_epo_dpd_suffix ) . '" ';

		echo 'data-tm-epo-dpd-string-placement="' . esc_attr( $tm_epo_dpd_string_placement ) . '" ';
		echo 'data-tm-epo-dpd-label-css-selector="' . esc_attr( $tm_epo_dpd_label_css_selector ) . '" ';
		echo 'data-tm-epo-dpd-original-price-base="' . esc_attr( $tm_epo_dpd_original_price_base ) . '" ';

		if ( class_exists( 'RP_WCDPD_Settings' ) && class_exists( 'RP_WCDPD_Promotion_Display_Price_Override' ) && RP_WCDPD_Settings::get( 'promo_display_price_override' ) ) {
			echo 'data-tm-epo-dpd-price-override="1" ';
		}

		if ( defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '2.2', '>=' ) ) {
			echo 'data-tm-epo-dpd-product-price-discounted="1" ';
		}

		echo 'data-tm-epo-dpd-attributes-to-id="' . esc_attr( $args['attributes_to_id'] ) . '" ';
		echo 'data-tm-epo-dpd-enable="' . esc_attr( $tm_epo_dpd_enable ) . '" ';
		if ( class_exists( 'RP_WCDPD_Settings' ) && RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) {
			echo 'data-tm-epo-dpd-change-display-prices="' . esc_attr( RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) . '" ';
		}
	}

	/**
	 * Add extra arguments to the totals template
	 *
	 * @param array<mixed> $args Array or arguments.
	 * @param object       $product The product object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_template_args_tm_totals( $args, $product ) {
		$args['tm_epo_dpd_suffix']               = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_suffix' );
		$args['tm_epo_dpd_prefix']               = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_prefix' );
		$args['tm_epo_dpd_enable_pricing_table'] = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable_pricing_table' );
		$args['tm_epo_dpd_enable']               = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' );
		$args['tm_epo_dpd_string_placement']     = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_string_placement' );
		$args['tm_epo_dpd_label_css_selector']   = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_label_css_selector' );
		$args['tm_epo_dpd_original_price_base']  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_original_price_base' );

		$args['fields_price_rules'] = ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) ) ? $args['fields_price_rules'] : 1;

		if ( '1' === $args['price_override'] ) {
			$args['fields_price_rules'] = 1;
		}

		$attributes_to_id = [];
		if ( $product instanceof WC_Product && 'variable' === themecomplete_get_product_type( $product ) ) {

			$attributes_ids = $product->get_attributes();

			$pid = themecomplete_get_id( $product );

			foreach ( $attributes_ids as $attkey => $attvalue ) {

				$terms = wp_get_post_terms( $pid, $attkey, [ 'fields' => 'all' ] );
				if ( ! is_wp_error( $terms ) ) {
					foreach ( $terms as $term ) {
						$attributes_to_id[ 'attribute_' . $attkey ][ $term->slug ] = $term->term_id;
					}
				}
			}
		}

		$args['attributes_to_id'] = esc_html( (string) wp_json_encode( (array) $attributes_to_id ) );

		return $args;
	}

	/**
	 * Get product price rules
	 *
	 * @param array<mixed> $price Price array.
	 * @param object|null  $product The product object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_product_price_rules( $price = [], $product = null ) {
		if ( class_exists( 'RP_WCDPD' ) && $product instanceof WC_Product ) {
			$check_price = apply_filters( 'wc_epo_discounted_price', null, $product, null );
			if ( $check_price ) {
				$price['product'] = [];
				if ( $check_price['is_multiprice'] ) {
					foreach ( $check_price['rules'] as $variation_id => $variation_rule ) {
						foreach ( $variation_rule as $rulekey => $pricerule ) {
							$price['product'][ $variation_id ][] = [
								'min'        => $pricerule['min'],
								'max'        => $pricerule['max'],
								'value'      => ( 'percentage' !== $pricerule['type'] ) ? apply_filters( 'wc_epo_product_price', $pricerule['value'] ) : $pricerule['value'],
								'type'       => $pricerule['type'],
								'conditions' => isset( $pricerule['conditions'] ) ? $pricerule['conditions'] : [],
							];
						}
					}
				} else {
					foreach ( $check_price['rules'] as $rulekey => $pricerule ) {
						$price['product'][0][] = [
							'min'        => $pricerule['min'],
							'max'        => $pricerule['max'],
							'value'      => ( 'percentage' !== $pricerule['type'] ) ? apply_filters( 'wc_epo_product_price', $pricerule['value'] ) : $pricerule['value'],
							'type'       => $pricerule['type'],
							'conditions' => isset( $pricerule['conditions'] ) ? $pricerule['conditions'] : [],
						];
					}
				}
			}
			$price['price'] = apply_filters( 'woocommerce_tm_epo_price_compatibility', apply_filters( 'wc_epo_product_price', $product->get_price() ), $product );
		}

		return $price;
	}

	/**
	 * Add order item meta
	 *
	 * @param WC_Order_Item $item The order item object.
	 * @param string        $cart_item_key The cart item key.
	 * @param array<mixed>  $values Array of value.
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_order_item_meta( $item, $cart_item_key, $values ) {
		if ( ! empty( $values['tmcartepo'] ) ) {
			$item->add_meta_data( '_' . $this->order_flag, [ 1 ] );
		}
	}

	/**
	 * Alter autoloader path
	 *
	 * @param string $path The filat path.
	 * @param string $original_class The class name.
	 * @return string
	 * @since 1.0
	 */
	public function wc_epo_autoload_path( $path, $original_class ) {
		// Composite products sometimes do not load the Discount and Pricing classes.
		if ( defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '1.0.13', '<' ) && 'RP_WCDPD_Pricing' === $original_class && defined( 'THEMECOMPLETE_EPO_INCLUDED' ) && defined( 'RP_WCDPD_PLUGIN_PATH' ) ) {
			$path = RP_WCDPD_PLUGIN_PATH . 'includes/classes/';
		}

		return $path;
	}

	/**
	 * Alter autoloader file
	 *
	 * @param string $file The file name.
	 * @param string $original_class The class name.
	 * @return string
	 * @since 1.0
	 */
	public function wc_epo_autoload_file( $file, $original_class ) {
		// Composite products sometimes do not load the Discount and Pricing classes.
		if ( defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '1.0.13', '<' ) && 'RP_WCDPD_Pricing' === $original_class && defined( 'THEMECOMPLETE_EPO_INCLUDED' ) && defined( 'RP_WCDPD_PLUGIN_PATH' ) ) {
			$file = 'Pricing.php';
		}

		return $file;
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['dpd'] = [ 'tcfa tcfa-percentage', esc_html__( 'Dynamic Pricing & Discounts', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label = esc_html__( 'Dynamic Pricing & Discounts', 'woocommerce-tm-extra-product-options' );

		$settings['dpd'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'    => esc_html__( 'Enable discounts on extra options', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enabling this will apply the product discounts to the extra options as well.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_enable',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'no',
				'type'     => 'select',
				'options'  => [
					'no'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Base original price type according to', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Set to what price types will base their original price on.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_original_price_base',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => '',
				'type'     => 'select',
				'options'  => [
					''             => esc_html__( 'No change', 'woocommerce-tm-extra-product-options' ),
					'undiscounted' => esc_html__( 'Undiscounted product price', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'   => esc_html__( 'Enable alteration of pricing table', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the inclusion of option prices to the pricing table.', 'woocommerce-tm-extra-product-options' ) . '</span>',
				'id'      => 'tm_epo_dpd_enable_pricing_table',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'    => esc_html__( 'Prefix label', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Display a prefix label on product page.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_prefix',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Suffix label', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Display a suffix label on product page.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_suffix',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Label CSS selector', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enter a CSS selector to override the default label where the discount string will be displayed.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_label_css_selector',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Discount string placement', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Select the placement of the discounted string compared to the label.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_dpd_string_placement',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'no',
				'type'     => 'select',
				'options'  => [
					'after'  => esc_html__( 'After', 'woocommerce-tm-extra-product-options' ),
					'before' => esc_html__( 'Before', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'   => esc_html__( 'Enable showing option prices in the Order', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this at your own risk since it is not possible to calculate option discounts on the Order page.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_dpd_show_option_prices_in_order',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];

		return $settings;
	}

	/**
	 * Alter cart contents
	 *
	 * @return void
	 * @since 1.0
	 */
	public function cart_loaded_from_session_2() {
		$cart_contents = WC()->cart->cart_contents;

		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				if ( ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_product_original_price'] ) && empty( $cart_item['epo_price_override'] ) ) {
					WC()->cart->cart_contents[ $cart_item_key ]['data']->set_price( $cart_item['tm_epo_product_original_price'] );
					WC()->cart->cart_contents[ $cart_item_key ]['tm_epo_doing_adjustment'] = true;
				}
			}
		}
	}

	/**
	 * Alter cart contents
	 *
	 * @return void
	 * @since 1.0
	 */
	public function cart_loaded_from_session_99999() {
		$cart_contents = WC()->cart->cart_contents;
		if ( is_array( $cart_contents ) ) {
			foreach ( $cart_contents as $cart_item_key => $cart_item ) {
				$current_product_price = WC()->cart->cart_contents[ $cart_item_key ]['data']->get_price();

				if ( ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_options_prices'] ) && ! empty( $cart_item['tm_epo_doing_adjustment'] ) && empty( $cart_item['epo_price_override'] ) ) {
					WC()->cart->cart_contents[ $cart_item_key ]['tm_epo_product_after_adjustment'] = $current_product_price;
					WC()->cart->cart_contents[ $cart_item_key ]['data']->set_price( WC()->cart->cart_contents[ $cart_item_key ]['data']->get_price() + $cart_item['tm_epo_options_prices'] );
					unset( WC()->cart->cart_contents[ $cart_item_key ]['tm_epo_doing_adjustment'] );
				}
			}
		}
	}

	/**
	 * Replace cart html prices for WooCommerce Dynamic Pricing & Discounts
	 *
	 * @access public
	 *
	 * @param string       $item_price The item price.
	 * @param array<mixed> $cart_item The cart item.
	 * @param string       $cart_item_key The cart item key.
	 *
	 * @return string
	 */
	public function cart_item_price( $item_price = '', $cart_item = [], $cart_item_key = '' ) {
		if ( ! isset( $cart_item['tmcartepo'] ) ) {
			return $item_price;
		}
		if ( ! isset( $cart_item['rp_wcdpd'] ) ) {
			if ( ! isset( $cart_item['rp_wcdpd_data'] ) ) {
				if ( ! isset( $cart_item['data']->rightpress_in_cart ) ) {
					return $item_price;
				}
			}
		}

		// Get price to display.
		$price = THEMECOMPLETE_EPO_CART()->get_price_for_cart( false, $cart_item, '', 1 );

		// Format price to display.
		$price_to_display = $price;

		$product = $cart_item['data'];

		$float_price_to_display = floatval( $product->get_price() );

		if ( 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
			$original_price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $cart_item['tm_epo_product_original_price'], $cart_item, '', 1 );
			$float_original_price_to_display = floatval( $cart_item['tm_epo_product_original_price'] );
			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) ) {
				$price                  = $this->get_rp_wcdpd( $cart_item['tm_epo_product_original_price'], wc_get_product( themecomplete_get_id( $cart_item['data'] ) ), $cart_item_key );
				$price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $price, $cart_item, '', 1 );
				$float_price_to_display = floatval( $price );
			} else {
				$price                  = $cart_item['data']->get_price( 'edit' );
				$price                  = $price - $cart_item['tm_epo_options_prices'];
				$price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $price, $cart_item, '', 1 );
				$float_price_to_display = floatval( $price );
			}
		} else {
			if ( ! isset( $cart_item['tm_epo_product_price_with_options'] ) ) {
				return $item_price;
			}
			$original_price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $cart_item['tm_epo_product_price_with_options'], $cart_item, '', 1 );
			$float_original_price_to_display = floatval( $cart_item['tm_epo_product_price_with_options'] );
		}

		if ( (string) $float_price_to_display === (string) $float_original_price_to_display ) {
			return $item_price;
		}

		$item_price = '<span class="tc-epo-cart-price"><del>' . themecomplete_price( $float_original_price_to_display ) . '</del> <ins>' . themecomplete_price( $float_price_to_display ) . '</ins></span>';

		return $item_price;
	}

	/**
	 * Get WooCommerce Dynamic Pricing & Discounts price for options
	 * modified from get version from Pricing class
	 *
	 * @param float   $field_price The field price.
	 * @param string  $cart_item_key The cart item key.
	 * @param mixed   $pricing The pricing object.
	 * @param boolean $force true or false.
	 * @return mixed
	 * @since 1.0
	 */
	private function get_rp_wcdpd_single( $field_price, $cart_item_key, $pricing = null, $force = false ) {

		if ( empty( $cart_item_key ) || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_dpd_enable' ) && ! $force ) {
			return $field_price;
		}

		$price          = $field_price;
		$original_price = $price;

		if ( ! $pricing && class_exists( 'RP_WCDPD_Settings' ) ) {
			// This runs on versions >=2.
			$product_pricing = RP_WCDPD_Settings::get( 'product_pricing' );
			$cart_item       = WC()->cart->cart_contents[ $cart_item_key ];

			if ( ! isset( $cart_item['rp_wcdpd_data'] ) ) {
				if ( class_exists( 'RightPress_Product_Price_Cart' ) && method_exists( 'RightPress_Product_Price_Cart', 'get_cart_item_price_changes' ) ) { // @phpstan-ignore-line
					$price_changes = RightPress_Product_Price_Cart::get_cart_item_price_changes( $cart_item_key );
					if ( ! isset( $price_changes['original_price'] ) ) {
						return $field_price;
					}
					$initial_product_price = $price_changes['original_price'];
				} else {
					return $field_price;
				}
			} else {
				$initial_product_price = $cart_item['rp_wcdpd_data']['initial_price'];
			}

			if ( (float) $initial_product_price > 0 ) {

				$product_price = $initial_product_price;
				if ( class_exists( 'RP_WCDPD_WC_Cart' ) && method_exists( 'RP_WCDPD_WC_Cart', 'get_cart_item_price_for_display' ) ) { // @phpstan-ignore-line
					$product_price = RP_WCDPD_WC_Cart::get_cart_item_price_for_display( $cart_item );
				} elseif ( class_exists( 'RightPress_Product_Price_Display' ) && method_exists( 'RightPress_Product_Price_Display', 'prepare_product_price_for_display' ) ) { // @phpstan-ignore-line
					$product_price = (float) RightPress_Product_Price_Display::prepare_product_price_for_display( $cart_item['data'], null, true );
				}

				// $product price is already being displayed with appropriate tax status
				// while $initial_product_price is not

				if ( $cart_item['data']->is_taxable() ) {

					$tax_display_cart = get_option( 'woocommerce_tax_display_cart' );

					if ( 'excl' === $tax_display_cart ) {
						if ( (float) 0 !== floatval( $initial_product_price ) ) {
							$initial_product_price = (float) themecomplete_get_price_excluding_tax(
								$cart_item['data'],
								[
									'qty'   => 10000,
									'price' => $initial_product_price,
								]
							) / 10000;
						}
					} elseif ( 'incl' === $tax_display_cart ) {
						if ( (float) 0 !== floatval( $initial_product_price ) ) {
							$initial_product_price = (float) themecomplete_get_price_including_tax(
								$cart_item['data'],
								[
									'qty'   => 10000,
									'price' => $initial_product_price,
								]
							) / 10000;
						}
					}
				}

				$price = ( $product_price / $initial_product_price ) * $price;
			}
		} else {
			if ( ! isset( $pricing->items[ $cart_item_key ] ) ) {
				return $field_price;
			}
			if ( method_exists( $pricing, 'apply_rule_to_item' ) && isset( $pricing->applied ) && isset( $pricing->apply ) && isset( $pricing->pricing_settings ) ) {
				if ( in_array( $pricing->pricing_settings['apply_multiple'], [ 'all', 'first' ] ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
					foreach ( $pricing->apply['global'] as $rule_key => $apply ) {
						$deduction = $pricing->apply_rule_to_item( $rule_key, $apply, $cart_item_key, $pricing->items[ $cart_item_key ], false, $price );
						if ( $deduction ) {

							if ( 'other' === $apply['if_matched'] && isset( $pricing->applied['global'] ) ) {
								if ( count( $pricing->applied['global'] ) > 1 || ! isset( $pricing->applied['global'][ $rule_key ] ) ) {
									continue;
								}
							}

							$pricing->applied['global'][ $rule_key ] = 1;
							$price                                   = $price - $deduction;
						}
					}
				} elseif ( 'biggest' === $pricing->pricing_settings['apply_multiple'] ) {

					$price_deductions = [];

					foreach ( $pricing->apply['global'] as $rule_key => $apply ) {

						if ( 'other' === $apply['if_matched'] && isset( $pricing->applied ) && isset( $pricing->applied['global'] ) ) {
							if ( count( $pricing->applied['global'] ) > 1 || ! isset( $pricing->applied['global'][ $rule_key ] ) ) {
								continue;
							}
						}

						$deduction = $pricing->apply_rule_to_item( $rule_key, $apply, $cart_item_key, $pricing->items[ $cart_item_key ], false );
						if ( $deduction ) {
							$price_deductions[ $rule_key ] = $deduction;
						}
					}

					if ( ! empty( $price_deductions ) ) {
						$max_deduction                           = max( $price_deductions );
						$rule_key                                = array_search( $max_deduction, $price_deductions ); // phpcs:ignore WordPress.PHP.StrictInArray
						$pricing->applied['global'][ $rule_key ] = 1;
						$price                                   = $price - $max_deduction;
					}
				}
			}
		}

		if ( $price !== $original_price ) {
			return $price;
		} else {
			return $field_price;
		}
	}

	/**
	 * Get WooCommerce Dynamic Pricing & Discounts price rules
	 *
	 * @param float|null  $field_price The field price.
	 * @param mixed       $product The product object.
	 * @param string|null $cart_item_key The cart item key.
	 * @param boolean     $force true or false.
	 * @return mixed
	 */
	public function get_rp_wcdpd( $field_price = null, $product = null, $cart_item_key = null, $force = false ) {
		$price = null;

		if ( class_exists( 'RP_WCDPD' ) && class_exists( 'RP_WCDPD_Pricing' ) ) {

			$tm_rp_wcdpd = RP_WCDPD::get_instance();

			$selected_rule = null;

			$dpd_version_compare  = defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '1.0.13', '<' );
			$dpd_version_compare2 = defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '2.0', '>=' );

			if ( null !== $field_price && null !== $cart_item_key ) {
				if ( $dpd_version_compare2 ) {
					return $this->get_rp_wcdpd_single( $field_price, $cart_item_key, null, $force );
				} else {
					return $this->get_rp_wcdpd_single( $field_price, $cart_item_key, $tm_rp_wcdpd->pricing, $force );
				}
			}

			// Iterate over pricing rules and use the first one that has this product in conditions (or does not have if condition "not in list").
			if ( ! $dpd_version_compare2 && isset( $tm_rp_wcdpd->opt['pricing']['sets'] )
				&& count( $tm_rp_wcdpd->opt['pricing']['sets'] )
			) {
				foreach ( $tm_rp_wcdpd->opt['pricing']['sets'] as $rule_key => $rule ) {
					$validated_rule = RP_WCDPD_Pricing::validate_rule( $rule );
					if ( 'quantity' === $rule['method'] && $validated_rule && method_exists( $tm_rp_wcdpd, 'user_matches_rule' ) && method_exists( $tm_rp_wcdpd, 'get_product_categories' ) ) {
						if ( $dpd_version_compare ) {
							if ( 'all' === $validated_rule['selection_method'] && $tm_rp_wcdpd->user_matches_rule( $validated_rule['user_method'], $validated_rule['roles'] ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'categories_include' === $validated_rule['selection_method'] && count( array_intersect( $tm_rp_wcdpd->get_product_categories( themecomplete_get_id( $product ) ), $validated_rule['categories'] ) ) > 0 && $tm_rp_wcdpd->user_matches_rule( $validated_rule['user_method'], $validated_rule['roles'] ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'categories_exclude' === $validated_rule['selection_method'] && 0 === count( array_intersect( $tm_rp_wcdpd->get_product_categories( themecomplete_get_id( $product ) ), $validated_rule['categories'] ) ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule['user_method'], $validated_rule['roles'] ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'products_include' === $validated_rule['selection_method'] && in_array( themecomplete_get_id( $product ), $validated_rule['products'] ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule['user_method'], $validated_rule['roles'] ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'products_exclude' === $validated_rule['selection_method'] && ! in_array( themecomplete_get_id( $product ), $validated_rule['products'] ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule['user_method'], $validated_rule['roles'] ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
								$selected_rule = $validated_rule;
								break;
							}
						} else {
							if ( 'all' === $validated_rule['selection_method'] && $tm_rp_wcdpd->user_matches_rule( $validated_rule ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'categories_include' === $validated_rule['selection_method'] && count( array_intersect( $tm_rp_wcdpd->get_product_categories( themecomplete_get_id( $product ) ), $validated_rule['categories'] ) ) > 0 && $tm_rp_wcdpd->user_matches_rule( $validated_rule ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'categories_exclude' === $validated_rule['selection_method'] && 0 === count( array_intersect( $tm_rp_wcdpd->get_product_categories( themecomplete_get_id( $product ) ), $validated_rule['categories'] ) ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule ) ) {
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'products_include' === $validated_rule['selection_method'] && in_array( themecomplete_get_id( $product ), $validated_rule['products'] ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
								$selected_rule = $validated_rule;
								break;
							}
							if ( 'products_exclude' === $validated_rule['selection_method'] && ! in_array( themecomplete_get_id( $product ), $validated_rule['products'] ) && $tm_rp_wcdpd->user_matches_rule( $validated_rule ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
								$selected_rule = $validated_rule;
								break;
							}
						}
					}
				}
			}

			if ( $dpd_version_compare2 ) {
				$price = [];

				$all_rules  = [];
				$table_data = [];
				if ( class_exists( 'RP_WCDPD_Product_Pricing' ) && class_exists( 'RP_WCDPD_Settings' ) ) {
					if ( ! $product->is_type( 'variable' ) && ! $product->is_type( 'variation' ) ) {

						$price['is_multiprice'] = false;

						$product_rules = RP_WCDPD_Product_Pricing::get_applicable_rules_for_product( $product, [ 'simple', 'bulk', 'tiered' ], true, [ 'RP_WCDPD_Promotion_Volume_Pricing_Table', 'get_reference_amount_for_table' ] );

						if ( ! $product_rules ) {
							$product_rules = [];
						}
						$all_rules = [];
						foreach ( $product_rules as $k => $rule ) {
							$apply_this_rule = true;
							if ( isset( $rule['group_products'] ) && is_array( $rule['group_products'] ) && isset( $rule['method'] ) && ( 'group_repeat' === $rule['method'] || 'group' === $rule['method'] ) ) {
								$this_product_id = themecomplete_get_id( $product );
								foreach ( $rule['group_products'] as $grouprule ) {
									if ( 'product__product' === $grouprule['type'] ) {
										$method_option = $grouprule['method_option'];
										$products      = $grouprule['products'];

										if ( 'in_list' === $method_option ) {
											if ( ! in_array( $this_product_id, $products ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
												$apply_this_rule = false;
												break;
											}
										}
									} else {
										$apply_this_rule = false;
									}
								}
							}
							if ( $apply_this_rule ) {
								$all_rules[] = [
									'product' => $product,
									'rule'    => $rule,
								];
							}
						}
					} else {

						if ( $product->is_type( 'variation' ) ) {
							$product = wc_get_product( $product->get_parent_id() );
						}

						$variation_rules = [];
						foreach ( $product->get_available_variations() as $variation_data ) {
							$variation = wc_get_product( $variation_data['variation_id'] );

							$product_rules = RP_WCDPD_Product_Pricing::get_applicable_rules_for_product( $variation, [ 'simple', 'bulk', 'tiered' ], true, [ 'RP_WCDPD_Promotion_Volume_Pricing_Table', 'get_reference_amount_for_table' ] );
							if ( ! $product_rules ) {
								$product_rules = [];
							}
							foreach ( $product_rules as $k => $rule ) {
								$variation_rules[ $variation_data['variation_id'] ][] = [
									'product' => $variation,
									'rule'    => $rule,
								];
							}
						}

						$all_rules              = $variation_rules;
						$price['is_multiprice'] = true;
					}

					if ( ! $price['is_multiprice'] ) {
						foreach ( $all_rules as $single ) {
							$_product = $single['product'];
							$_rule    = $single['rule'];
							if ( ! $_rule ) {
								continue;
							}

							$original_price = $_product->get_price();
							if ( isset( $_rule['quantity_ranges'] ) ) {
								$quantity_ranges = $_rule['quantity_ranges'];
								if ( RP_WCDPD_Settings::get( 'promo_volume_pricing_table_missing_ranges' ) === 'display' ) {
									$quantity_ranges = $this->add_missing_ranges( $quantity_ranges, $_product );
								}
								foreach ( $quantity_ranges as $quantity_range ) {
									switch ( $quantity_range['pricing_method'] ) {
										case 'discount__percentage':
											$quantity_range['pricing_method'] = 'percentage';
											break;
										case 'discount__amount':
											$quantity_range['pricing_method'] = 'price';
											break;
										case 'fixed__price':
											$quantity_range['pricing_method'] = 'fixed';
											break;

										default:
											// code...
											break;
									}
									$table_data[] = [
										'min'        => $quantity_range['from'],
										'max'        => $quantity_range['to'],
										'type'       => $quantity_range['pricing_method'],
										'value'      => $quantity_range['pricing_value'],
										'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
									];
								}
							} elseif ( isset( $_rule['pricing_method'] ) && isset( $_rule['pricing_value'] ) ) {
								$table_data[] = [
									'min'        => 1,
									'max'        => '',
									'type'       => $_rule['pricing_method'],
									'value'      => $_rule['pricing_value'],
									'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
								];
							} elseif ( isset( $_rule['group_pricing_method'] ) && isset( $_rule['group_pricing_value'] ) ) {
								$table_data[] = [
									'min'        => 1,
									'max'        => '',
									'type'       => $_rule['group_pricing_method'],
									'value'      => $_rule['group_pricing_value'],
									'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
								];
							}
						}
					} else {
						foreach ( $all_rules as $vid => $vidsingle ) {

							foreach ( $vidsingle as $single ) {

								$_product = $single['product'];
								$_rule    = $single['rule'];
								if ( ! $_rule ) {
									continue;
								}

								$original_price = $_product->get_price();
								if ( isset( $_rule['quantity_ranges'] ) ) {
									$quantity_ranges = $_rule['quantity_ranges'];
									if ( RP_WCDPD_Settings::get( 'promo_volume_pricing_table_missing_ranges' ) === 'display' ) {
										$quantity_ranges = $this->add_missing_ranges( $quantity_ranges, $_product );
									}
									foreach ( $quantity_ranges as $quantity_range ) {
										switch ( $quantity_range['pricing_method'] ) {
											case 'discount__percentage':
												$quantity_range['pricing_method'] = 'percentage';
												break;
											case 'discount__amount':
												$quantity_range['pricing_method'] = 'price';
												break;
											case 'fixed__price':
												$quantity_range['pricing_method'] = 'fixed';
												break;

											default:
												// code...
												break;
										}
										$table_data[ $vid ][] = [
											'min'        => $quantity_range['from'],
											'max'        => $quantity_range['to'],
											'type'       => $quantity_range['pricing_method'],
											'value'      => $quantity_range['pricing_value'],
											'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
										];

									}
								} elseif ( isset( $_rule['pricing_method'] ) && isset( $_rule['pricing_value'] ) ) {
									$table_data[ $vid ][] = [
										'min'        => 1,
										'max'        => '',
										'type'       => $_rule['pricing_method'],
										'value'      => $_rule['pricing_value'],
										'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
									];
								} elseif ( isset( $_rule['group_pricing_method'] ) && isset( $_rule['group_pricing_value'] ) ) {
									$table_data[ $vid ][] = [
										'min'        => 1,
										'max'        => '',
										'type'       => $_rule['group_pricing_method'],
										'value'      => $_rule['group_pricing_value'],
										'conditions' => isset( $_rule['conditions'] ) ? $_rule['conditions'] : [],
									];
								}
							}
						}
					}
				}

				$price['rules'] = $table_data;
			} elseif ( is_array( $selected_rule ) ) {
				// Quantity.
				if ( 'quantity' === $selected_rule['method'] && isset( $selected_rule['pricing'] ) && in_array( $selected_rule['quantities_based_on'], [ 'exclusive_product', 'exclusive_variation', 'exclusive_configuration' ], true ) ) {

					if ( 'variable' === themecomplete_get_product_type( $product ) || 'variable-subscription' === themecomplete_get_product_type( $product ) ) {
						$product_variations = $product->get_available_variations();
					}

					// For variable products only - check if prices differ for different variations.
					$multiprice_variable_product = false;

					if ( ( 'variable' === themecomplete_get_product_type( $product ) || 'variable-subscription' === themecomplete_get_product_type( $product ) ) && ! empty( $product_variations ) ) {
						$last_product_variation        = array_slice( $product_variations, - 1 );
						$last_product_variation_object = wc_get_product( $last_product_variation[0]['variation_id'] );
						if ( $last_product_variation_object instanceof WC_Product ) {
							$last_product_variation_price = $last_product_variation_object->get_price();
							foreach ( $product_variations as $variation ) {
								$variation_object = wc_get_product( $variation['variation_id'] );
								if ( $variation_object instanceof WC_Product && $variation_object->get_price() !== $last_product_variation_price ) {
									$multiprice_variable_product = true;
									break;
								}
							}
						}
					}

					if ( $multiprice_variable_product && ! empty( $product_variations ) ) {
						$variation_table_data = [];

						foreach ( $product_variations as $variation ) {
							$variation_product = wc_get_product( $variation['variation_id'] );
							if ( $variation_product instanceof WC_Product ) {
								$variation_table_data[ $variation['variation_id'] ] = $tm_rp_wcdpd->pricing_table_calculate_adjusted_prices( $selected_rule['pricing'], $variation_product->get_price() );
							}
						}
						$price                  = [];
						$price['is_multiprice'] = true;
						$price['rules']         = $variation_table_data;
					} else {
						$table_data = [];
						if ( 'variable' === themecomplete_get_product_type( $product ) && ! empty( $last_product_variation ) ) {
							$variation_product = wc_get_product( $last_product_variation[0]['variation_id'] );
							if ( $variation_product instanceof WC_Product ) {
								$table_data = $tm_rp_wcdpd->pricing_table_calculate_adjusted_prices( $selected_rule['pricing'], $variation_product->get_price() );
							}
						} else {
							$table_data = $tm_rp_wcdpd->pricing_table_calculate_adjusted_prices( $selected_rule['pricing'], $product->get_price() );
						}
						$price                  = [];
						$price['is_multiprice'] = false;
						$price['rules']         = $table_data;
					}
				}
			}
		}
		if ( null !== $field_price ) {
			$price = $field_price;
		}

		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-account-funds.php000064400000003327150755142450023274 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Account Funds
 * https://woocommerce.com/products/account-funds/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_CP_Account_Funds {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Account_Funds|null
	 * @since 5.0.12.9
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Account_Funds
	 * @since 5.0.12.9
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 5.0.12.9
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 5.0.12.9
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'WC_Account_Funds' ) ) {
			return;
		}

		add_filter( 'wc_epo_update_cart_action_cart_updated', [ $this, 'wc_epo_update_cart_action_cart_updated' ], 10, 1 );
	}

	/**
	 * Skip altering cart update action
	 *
	 * @param boolean $ret If cart was updated.
	 * @return boolean
	 * @since 5.0.12.9
	 */
	public function wc_epo_update_cart_action_cart_updated( $ret ) {
		if ( ! empty( $_POST['wc_account_funds_apply'] ) || ! empty( $_GET['remove_account_funds'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			return true;
		}

		return $ret;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-aelia-currency-switcher.php000064400000022645150755142450025260 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Aelia Currency Switcher
 * https://aelia.co/shop/currency-switcher-woocommerce/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Aelia_Currency_Switcher {

	/**
	 * Flag to check in Aelia Currency Switcher is enabled
	 *
	 * @var integer|null|boolean
	 */
	public $is_aelia_currency_switcher = false;
	/**
	 * Cache for the default currency
	 *
	 * @var string|false
	 */
	public $default_to_currency = false;
	/**
	 * Cache for the default from currency
	 *
	 * @var string|false
	 */
	public $default_from_currency = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Aelia_Currency_Switcher|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Aelia_Currency_Switcher
	 * @since 6.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 6.0
	 */
	public function add_compatibility() {
		if ( ! $this->is_aelia_currency_switcher ) {
			return;
		}

		add_filter( 'wc_epo_enabled_currencies', [ $this, 'wc_epo_enabled_currencies' ], 10, 1 );
		add_filter( 'wc_epo_convert_to_currency', [ $this, 'wc_epo_convert_to_currency' ], 10, 3 );
		add_filter( 'wc_epo_get_current_currency_price', [ $this, 'wc_epo_get_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_remove_current_currency_price', [ $this, 'wc_epo_remove_current_currency_price' ], 10, 7 );
		add_filter( 'wc_epo_get_currency_price', [ $this, 'tm_wc_epo_get_currency_price' ], 10, 6 );
	}

	/**
	 * Setup initial variables
	 *
	 * @return void
	 * @since 6.0
	 */
	public function plugins_loaded() {
		$this->is_aelia_currency_switcher = class_exists( 'WC_Aelia_CurrencySwitcher' );
		$this->add_compatibility();
	}

	/**
	 * Alter enabled currencies
	 *
	 * @param array<mixed> $currencies Array of currencies.
	 * @return array<mixed>
	 *
	 * @since 6.0
	 */
	public function wc_epo_enabled_currencies( $currencies = [] ) {
		$enabled_currencies = apply_filters( 'wc_aelia_cs_enabled_currencies', $currencies );
		return $enabled_currencies;
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param mixed             $type The option price type.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|false      $currency The currency to get the price.
	 * @param mixed             $product_price The product price (for percent price type).
	 * @param string|false      $tc_added_in_currency The current currency the product was added in.
	 * @return float
	 *
	 * @since 6.0
	 */
	public function wc_epo_get_current_currency_price( $price = '', $type = '', $currencies = null, $currency = false, $product_price = false, $tc_added_in_currency = false ) {
		if ( $currency === $tc_added_in_currency ) {
			return (float) $price;
		}
		if ( is_array( $type ) ) {
			$type = '';
		}
		// Check if the price should be processed only once.
		if ( 'math' === $type ) {
			// Replaces any number between curly braces with the current currency.
			$price = preg_replace_callback(
				'/\{(\d+)\}/',
				function ( $matches ) use( $currency ) {
					return apply_filters( 'wc_epo_get_currency_price', $matches[1], $currency, '' );
				},
				$price
			);
		} elseif ( in_array( (string) $type, [ '', 'fixedcurrenttotal', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) ) {

			$price = $this->get_price_in_currency( $price, $currency, false, $currencies, $type );

		} elseif ( false !== $product_price && false !== $tc_added_in_currency && 'percent' === (string) $type ) {

			$product_price = $this->get_price_in_currency( $product_price, $tc_added_in_currency, false, $currencies, '' );
			$price         = floatval( $product_price ) * ( floatval( $price ) / 100 );

		}

		return (float) $price;
	}

	/**
	 * Get current currency price
	 *
	 * @param mixed             $price The price to convert.
	 * @param string|false      $currency The currency to get the price.
	 * @param string            $price_type The option price type.
	 * @param string|false      $current_currency The current currency.
	 * @param array<mixed>|null $price_per_currencies Array of price per currency.
	 * @param string|null       $key The option key.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function tm_wc_epo_get_currency_price( $price = '', $currency = false, $price_type = '', $current_currency = false, $price_per_currencies = null, $key = null ) {
		if ( ! $currency ) {
			return $this->wc_epo_get_current_currency_price( $price, $price_type );
		}
		$tc_get_default_currency = apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) );

		if ( $current_currency && $current_currency === $currency && $current_currency === $tc_get_default_currency ) {
			return $price;
		}

		$price = $this->get_price_in_currency( $price, $currency, false, $price_per_currencies, $price_type, $key );

		return $price;
	}

	/**
	 * Remove current currency price
	 *
	 * @param mixed             $price The price to convert.
	 * @param string            $type The option price type.
	 * @param string            $to_currency The currency to convert to.
	 * @param string            $from_currency The currency to convert from.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|null       $key The option key.
	 * @return mixed
	 * @since 6.0
	 */
	public function wc_epo_remove_current_currency_price( $price = '', $type = '', $to_currency = null, $from_currency = null, $currencies = null, $key = null ) {
		$price = $this->get_price_in_currency( $price, $to_currency, $from_currency, $currencies, $type, $key );

		return $price;
	}

	/**
	 * Convert to currency
	 *
	 * @param string       $price The price to convert.
	 * @param string|false $from_currency The currency to convert from.
	 * @param string|false $to_currency The currency to convert to.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_convert_to_currency( $price = '', $from_currency = false, $to_currency = false ) {
		if ( ! $from_currency || ! $to_currency || $from_currency === $to_currency ) {
			return $price;
		}

		// todo: if needed extend this as the whole method is only used for fixed conversions.
		$price = $this->get_price_in_currency( $price, $to_currency, $from_currency );

		return $price;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_from_currency() {
		if ( false === $this->default_from_currency ) {
			$this->default_from_currency = get_option( 'woocommerce_currency' );
		}

		return $this->default_from_currency;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_to_currency() {
		if ( false === $this->default_to_currency ) {
			$this->default_to_currency = themecomplete_get_woocommerce_currency();
		}

		return $this->default_to_currency;
	}


	/**
	 * Basic integration with WooCommerce Currency Switcher, developed by Aelia
	 * (http://aelia.co). This method can be used by any 3rd party plugin to
	 * return prices converted to the active currency.
	 *
	 * @param mixed        $price The source price.
	 * @param string|false $to_currency The target currency. If empty, the active currency
	 *                     will be taken.
	 * @param string|false $from_currency The source currency. If empty, WooCommerce base
	 *                     currency will be taken.
	 * @param array<mixed> $currencies Array of currencies.
	 * @param string       $type The price type.
	 * @param string       $key The option key.
	 *
	 * @return mixed The price converted from source to destination currency.
	 * @author Aelia <support@aelia.co>
	 * @link   http://aelia.co
	 */
	protected function get_price_in_currency( $price, $to_currency = false, $from_currency = false, $currencies = null, $type = null, $key = null ) {

		if ( empty( $from_currency ) ) {
			$from_currency = $this->get_default_from_currency();
		}
		if ( empty( $to_currency ) ) {
			$to_currency = $this->get_default_to_currency();
		}
		if ( $from_currency === $to_currency ) {
			return $price;
		}
		if ( null !== $type && in_array( (string) $type, [ '', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) && is_array( $currencies ) && isset( $currencies[ $to_currency ] ) ) {
			$v = $currencies[ $to_currency ];
			if ( null !== $key && isset( $v[ $key ] ) ) {
				$v = $v[ $key ];
			}
			if ( is_array( $v ) ) {
				$v = array_values( $v );
				$v = $v[0];
				if ( is_array( $v ) ) {
					$v = array_values( $v );
					$v = $v[0];
				}
			}

			if ( '' !== $v ) {
				return $v;
			}
		}

		return apply_filters( 'wc_epo_cs_convert', apply_filters( 'wc_aelia_cs_convert', $price, $from_currency, $to_currency, 10 ), $from_currency, $to_currency );
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-watcafvp.php000064400000002550150755142450022333 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Woocommerce Add to cart Ajax for variable products
 * http://www.rcreators.com/woocommerce-ajax-add-to-cart-variable-products
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_WATCAFVP {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_WATCAFVP|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_WATCAFVP
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {

		add_action( 'init', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( THEMECOMPLETE_EPO()->cart_edit_key && function_exists( 'woocommerce_add_to_cart_variable_rc_callback' ) ) {
			remove_action( 'wp_enqueue_scripts', 'ajax_add_to_cart_script', 99 );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-booster.php000064400000005561150755142450022202 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Booster Prices and Currencies by Country Module Options
 * https://booster.io/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Booster {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Booster|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded
	 *
	 * @return THEMECOMPLETE_EPO_CP_Booster
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'WCJ_Price_by_Country_Core' ) || ! function_exists( 'wcj_is_module_enabled' ) ) {
			return;
		}

		if ( wcj_is_module_enabled( 'price_by_country' ) ) {
			// Add to cart.
			add_filter( 'wc_epo_add_cart_item_original_price', [ $this, 'wc_epo_add_cart_item_original_price' ], PHP_INT_MAX, 2 );
			add_filter( 'woocommerce_get_cart_item_from_session', [ $this, 'get_cart_item_addons_price_from_session' ], PHP_INT_MAX, 1 );
			// Prices.
			if ( defined( 'WCJ_PRODUCT_GET_PRICE_FILTER' ) ) {
				add_filter( WCJ_PRODUCT_GET_PRICE_FILTER, [ $this, 'change_price' ], PHP_INT_MAX, 2 );
			}
			add_filter( 'woocommerce_product_variation_get_price', [ $this, 'change_price' ], PHP_INT_MAX, 2 );
		}
	}

	/**
	 * Change the product price
	 *
	 * @param float        $price The product price.
	 * @param array<mixed> $cart_item The cart item.
	 * @return mixed
	 */
	public function wc_epo_add_cart_item_original_price( $price, $cart_item ) {
		return $cart_item['data']->get_price();
	}

	/**
	 * Undocumented function
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 */
	public function get_cart_item_addons_price_from_session( $cart_item ) {
		if ( array_key_exists( 'tm_epo_set_product_price_with_options', $cart_item ) ) {
			$cart_item['data']->add_meta_data( 'epo_price', $cart_item['tm_epo_set_product_price_with_options'] );
		}

		return $cart_item;
	}

	/**
	 * Alter the product price
	 *
	 * @param mixed  $price The product price.
	 * @param object $product The product object.
	 * @return mixed
	 */
	public function change_price( $price, $product ) {
		if ( $product instanceof WC_Product && $product->get_meta( 'epo_price', true ) !== '' ) {
			$price = $product->get_meta( 'epo_price' );
		}
		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-store-exporter.php000064400000003456150755142450023530 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Store Exporter Deluxe for WooCommerce
 * https://www.visser.com.au/solutions/woocommerce-export/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Store_Exporter {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Store_Exporter|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Store_Exporter
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wc_epo_add_compatibility', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		add_filter( 'woo_ce_order_item', [ $this, 'tm_woo_ce_extend_order_item' ], 9999, 1 );
	}

	/**
	 * Change order item.
	 *
	 * @param array<mixed> $order_item The order item.
	 * @return array<mixed>
	 */
	public function tm_woo_ce_extend_order_item( $order_item = [] ) {

		if ( function_exists( 'woo_ce_get_extra_product_option_fields' ) ) {
			$tm_fields = woo_ce_get_extra_product_option_fields();
			if ( $tm_fields ) {
				foreach ( $tm_fields as $tm_field ) {
					$order_item[ sprintf( 'tm_%s', sanitize_key( $tm_field['name'] ) ) ] = $tm_field['value'];
				}
			}

			unset( $tm_fields, $tm_field );
		}

		return $order_item;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-fpd.php000064400000003770150755142450021276 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Fancy Product Designer
 * https://codecanyon.net/item/fancy-product-designer-woocommercewordpress/6318393
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_FPD {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_FPD|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_FPD
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'Fancy_Product_Designer' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
		add_filter( 'woocommerce_add_cart_item_data', [ $this, 'woocommerce_add_cart_item_data' ], 10, 1 );
	}

	/**
	 * Edit cart functionality
	 *
	 * @param array<mixed> $cart_item_meta The cart item meta.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function woocommerce_add_cart_item_data( $cart_item_meta ) {
		unset( $cart_item_meta['fpd_data']['fpd_remove_cart_item'] );
		return $cart_item_meta;
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-fpd', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-fpd.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-currency-3rd-party.php000064400000024212150755142450024174 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * 3rd party currency switcher plugins.
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Currency_3rd_Party {

	/**
	 * Flag to check if to enable the compatibility
	 *
	 * @var integer|null|boolean
	 */
	public $is_enabled = false;

	/**
	 * Cache for the default currency
	 *
	 * @var string|false
	 */
	public $default_to_currency = false;

	/**
	 * Cache for the default from currency
	 *
	 * @var string|false
	 */
	public $default_from_currency = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Currency_3rd_Party|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Currency_3rd_Party
	 * @since 6.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1 );
		add_filter( 'wc_epo_enable_currency_compatibility', [ $this, 'wc_epo_enable_currency_compatibility' ], 10, 1 );
	}

	/**
	 * Add compatibility with CURCY - Multi Currency for WooCommerce
	 *
	 * @param boolean $enabled If the compatibility should be active.
	 * @return boolean
	 * @since 1.0
	 */
	public function wc_epo_enable_currency_compatibility( $enabled = false ) {
		if ( class_exists( 'WOOMULTI_CURRENCY_F_Plugin_Change_Price_3rd_Plugin' ) ) {
			$enabled = true;
		}

		return $enabled;
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! $this->is_enabled ) {
			return;
		}

		add_filter( 'wc_epo_enabled_currencies', [ $this, 'wc_epo_enabled_currencies' ], 10, 1 );
		add_filter( 'wc_epo_convert_to_currency', [ $this, 'wc_epo_convert_to_currency' ], 10, 3 );
		add_filter( 'wc_epo_option_price_correction', [ $this, 'wc_epo_option_price_correction' ], 10, 2 );
		add_filter( 'wc_epo_get_current_currency_price', [ $this, 'wc_epo_get_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_remove_current_currency_price', [ $this, 'wc_epo_remove_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_get_currency_price', [ $this, 'tm_wc_epo_get_currency_price' ], 10, 6 );
	}

	/**
	 * Setup initial variables
	 *
	 * @return void
	 * @since 6.0
	 */
	public function plugins_loaded() {
		$this->is_enabled = apply_filters( 'wc_epo_enable_currency_compatibility', false );
		$this->add_compatibility();
	}

	/**
	 * Alter enabled currencies
	 *
	 * @param array<mixed> $currencies Array of currencies.
	 * @return array<mixed>
	 *
	 * @since 6.0
	 */
	public function wc_epo_enabled_currencies( $currencies = [] ) {
		$enabled_currencies = apply_filters( 'wc_epo_get_enabled_currencies', $currencies );

		return $enabled_currencies;
	}

	/**
	 * Get product price
	 * This filter is currently only used for product prices.
	 *
	 * @param float|string      $price The product price.
	 * @param string|false      $currency The currency to convert the price to.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string            $type The option price type.
	 * @return mixed
	 * @since 6.0
	 */
	private function convert_to_currency( $price = '', $currency = false, $currencies = null, $type = '' ) {
		$price = $this->get_price_in_currency( $price, $currency, false, $currencies, $type );
		return $price;
	}

	/**
	 * Alter option prices in cart
	 *
	 * @param float  $price The price to convert.
	 * @param object $cart_item The cart item.
	 * @return mixed
	 * @since 1.0
	 */
	public function wc_epo_option_price_correction( $price, $cart_item ) {
		return apply_filters( 'wc_epo_option_get_price_correction', $price, '', null, null, null, null, null, $cart_item );
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param mixed             $type The option price type.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|false      $currency The currency to get the price.
	 * @param mixed             $product_price The product price (for percent price type).
	 * @param string|false      $tc_added_in_currency The current currency the product was added in.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_get_current_currency_price( $price = '', $type = '', $currencies = null, $currency = false, $product_price = false, $tc_added_in_currency = false ) {
		if ( $currency === $tc_added_in_currency ) {
			return $price;
		}
		if ( is_array( $type ) ) {
			$type = '';
		}
		// Check if the price should be processed only once.
		if ( in_array( (string) $type, [ '', 'fixedcurrenttotal', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) ) {
			$price = $this->convert_to_currency( $price, false, $currencies, $type );
		} elseif ( false !== $product_price && false !== $tc_added_in_currency && (string) 'percent' === $type ) {
			$product_price = $this->convert_to_currency( $product_price, $tc_added_in_currency, $currencies, $type );
			$price         = floatval( $product_price ) * ( floatval( $price ) / 100 );
		}

		return $price;
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param string|false      $currency The currency to get the price.
	 * @param string            $price_type The option price type.
	 * @param string|false      $current_currency The current currency.
	 * @param array<mixed>|null $price_per_currencies Array of price per currency.
	 * @param string|null       $key The option key.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function tm_wc_epo_get_currency_price( $price = '', $currency = false, $price_type = '', $current_currency = false, $price_per_currencies = null, $key = null ) {
		if ( ! $currency ) {
			return $this->wc_epo_get_current_currency_price( $price, $price_type, null, $currency );
		}
		$tc_get_default_currency = apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) );
		if ( $current_currency && $current_currency === $currency && $current_currency === $tc_get_default_currency ) {
			return $price;
		}

		$price = $this->get_price_in_currency( $price, $currency, false, $price_per_currencies, $price_type, $key );

		return $price;
	}

	/**
	 * Remove current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param string            $type The option price type.
	 * @param string            $to_currency The currency to convert to.
	 * @param string            $from_currency The currency to convert from.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|null       $key The option key.
	 * @return mixed
	 * @since 6.0
	 */
	public function wc_epo_remove_current_currency_price( $price = '', $type = '', $to_currency = null, $from_currency = null, $currencies = null, $key = null ) {
		$price = $this->get_price_in_currency( $price, $to_currency, $from_currency, $currencies, $type, $key );

		return $price;
	}

	/**
	 * Convert to currency
	 *
	 * @param string       $price The price to convert.
	 * @param string|false $from_currency The currency to convert from.
	 * @param string|false $to_currency The currency to convert to.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_convert_to_currency( $price = '', $from_currency = false, $to_currency = false ) {
		if ( ! $from_currency || ! $to_currency || $from_currency === $to_currency ) {
			return $price;
		}

		$price = $this->get_price_in_currency( $price, $to_currency, $from_currency );

		return $price;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_from_currency() {
		if ( false === $this->default_from_currency ) {
			$this->default_from_currency = get_option( 'woocommerce_currency' );
		}

		return $this->default_from_currency;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_to_currency() {
		if ( false === $this->default_to_currency ) {
			$this->default_to_currency = themecomplete_get_woocommerce_currency();
		}

		return $this->default_to_currency;
	}

	/**
	 * Return prices converted to the active currency
	 *
	 * @param mixed        $price The source price.
	 * @param string|false $to_currency The target currency. If empty, the active currency
	 *                     will be taken.
	 * @param string|false $from_currency The source currency. If empty, WooCommerce base
	 *                     currency will be taken.
	 * @param array<mixed> $currencies Array of currencies.
	 * @param string       $type The price type.
	 * @param string       $key The option key.
	 *
	 * @return mixed The price converted from source to destination currency.
	 */
	protected function get_price_in_currency( $price, $to_currency = false, $from_currency = false, $currencies = null, $type = null, $key = null ) {

		if ( empty( $from_currency ) ) {
			$from_currency = $this->get_default_from_currency();
		}
		if ( empty( $to_currency ) ) {
			$to_currency = $this->get_default_to_currency();
		}

		if ( $from_currency === $to_currency ) {
			return $price;
		}
		if ( null !== $type && in_array( $type, [ '', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) && is_array( $currencies ) && isset( $currencies[ $to_currency ] ) ) {
			$v = $currencies[ $to_currency ];
			if ( null !== $key && isset( $v[ $key ] ) ) {
				$v = $v[ $key ];
			}
			if ( is_array( $v ) ) {
				$v = array_values( $v );
				$v = $v[0];
				if ( is_array( $v ) ) {
					$v = array_values( $v );
					$v = $v[0];
				}
			}

			if ( '' !== $v ) {
				return $v;
			}
		}

		return apply_filters( 'wc_epo_cs_convert', $price, $from_currency, $to_currency );
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-b2b-code4life.php000064400000005237150755142450023026 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce B2B by Code4Life
 * https://codecanyon.net/item/woocommerce-b2b/21565847
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_CP_B2B_Code4Life {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_B2B_Code4Life|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded
	 *
	 * @return THEMECOMPLETE_EPO_CP_B2B_Code4Life
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'WooCommerceB2B' ) || ! function_exists( 'WCB2B' ) ) {
			return;
		}

		// Add to cart.
		add_filter( 'wc_epo_add_cart_item_original_price', [ $this, 'wc_epo_add_cart_item_original_price' ], PHP_INT_MAX, 2 );
		add_filter( 'woocommerce_get_cart_item_from_session', [ $this, 'get_cart_item_addons_price_from_session' ], PHP_INT_MAX, 1 );
		// Prices.
		add_filter( 'woocommerce_product_variation_get_price', [ $this, 'change_price' ], PHP_INT_MAX, 2 );
	}

	/**
	 * Change the product price
	 *
	 * @param float        $price The product price.
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 */
	public function wc_epo_add_cart_item_original_price( $price, $cart_item ) {
		return $cart_item['data']->get_price();
	}

	/**
	 * Undocumented function
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 */
	public function get_cart_item_addons_price_from_session( $cart_item ) {
		if ( array_key_exists( 'tm_epo_set_product_price_with_options', $cart_item ) ) {
			$cart_item['data']->add_meta_data( 'epo_price', $cart_item['tm_epo_set_product_price_with_options'] );
		}

		return $cart_item;
	}

	/**
	 * Alter the product price
	 *
	 * @param float  $price The product price.
	 * @param object $product The product object.
	 * @return float
	 */
	public function change_price( $price, $product ) {
		if ( $product instanceof WC_Product && $product->get_meta( 'epo_price', true ) !== '' ) {
			$price = $product->get_meta( 'epo_price' );
		}
		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-measurement.php000064400000017471150755142450023055 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Measurement Price Calculator
 * https://woocommerce.com/products/measurement-price-calculator/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Measurement {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Measurement|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Measurement
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility2' ], 2 );
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
		add_action( 'init', [ $this, 'template_redirect' ], 11 );
		add_action( 'template_redirect', [ $this, 'template_redirect' ], 11 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'WC_Measurement_Price_Calculator' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 11 );

		add_filter( 'wc_epo_add_cart_item_original_price', [ $this, 'wc_epo_add_cart_item_original_price' ], 10, 2 );
		add_filter( 'wc_epo_option_price_correction', [ $this, 'wc_epo_option_price_correction' ], 10, 2 );
		add_filter( 'wc_epo_price_on_cart', [ $this, 'wc_epo_price_on_cart' ], 10, 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 4.9.12
	 */
	public function add_compatibility2() {
		if ( class_exists( 'WC_Measurement_Price_Calculator' ) || class_exists( 'WC_Measurement_Price_Calculator_Loader' ) ) {
			add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
			add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
			add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );
		}
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-measurement', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-measurement.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			$args = [
				'wc_measurement_qty_multiplier' => 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_calculate_mode' ) ? 1 : 0,
				'wc_measurement_divide'         => 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_divide' ) ? 1 : 0,
			];
			wp_localize_script( 'themecomplete-comp-measurement', 'TMEPOMEASUREMENTJS', $args );
		}
	}

	/**
	 * Disable EPO price filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function template_redirect() {
		remove_filter( 'woocommerce_get_price_html', [ THEMECOMPLETE_EPO(), 'get_price_html' ], 10 );
		remove_filter( 'woocommerce_product_get_price', [ THEMECOMPLETE_EPO(), 'tm_woocommerce_get_price' ], 1 );
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['measurement'] = [ 'tcfa tcfa-ruler-combined', esc_html__( 'WooCommerce Measurement Calculator', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label                   = esc_html__( 'WooCommerce Measurement Calculator', 'woocommerce-tm-extra-product-options' );
		$settings['measurement'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Multiply options cost by area', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will multiply the options price by the calculated area.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_measurement_calculate_mode',
				'default' => 'no',
				'class'   => 'tcdisplay',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Divide price with measurement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'This will divide the original price with the needed measurement.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_measurement_divide',
				'default' => 'no',
				'class'   => 'tcdisplay',
				'type'    => 'checkbox',
			],

			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];

		return $settings;
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( class_exists( 'WC_Measurement_Price_Calculator' ) ) {
			$settings['tm_epo_measurement_calculate_mode'] = 'no';
			$settings['tm_epo_measurement_divide']         = 'no';
		}

		return $settings;
	}

	/**
	 * Alter price on cart
	 *
	 * @param float|string $price The price to alter.
	 * @param array<mixed> $cart_item The cart item.
	 * @return float|string
	 * @since 1.0
	 */
	public function wc_epo_price_on_cart( $price = '', $cart_item = [] ) {
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_calculate_mode' ) ) {
			if ( is_array( $cart_item ) && isset( $cart_item['pricing_item_meta_data'] ) && ! empty( $cart_item['pricing_item_meta_data']['_quantity'] ) ) {
				$new_quantity   = (float) $cart_item['quantity'] / $cart_item['pricing_item_meta_data']['_quantity'];
				$original_price = (float) $price;
				$original_price = $original_price * $new_quantity;

				$price = $original_price;
			}
		}

		return $price;
	}

	/**
	 * Alter option prices
	 *
	 * @param float|string $price The price to alter.
	 * @param array<mixed> $cart_item The cart item.
	 * @return float|string
	 * @since 1.0
	 */
	public function wc_epo_option_price_correction( $price = '', $cart_item = [] ) {

		if ( isset( $cart_item['pricing_item_meta_data'] ) && ! empty( $cart_item['pricing_item_meta_data']['_measurement_needed'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_divide' ) ) {
			$price = floatval( $price ) / floatval( $cart_item['pricing_item_meta_data']['_measurement_needed'] );
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_calculate_mode' ) ) {

			if ( is_array( $cart_item ) && isset( $cart_item['pricing_item_meta_data'] ) && ! empty( $cart_item['pricing_item_meta_data']['_measurement_needed'] ) ) {
				$price = floatval( $price ) * floatval( $cart_item['pricing_item_meta_data']['_measurement_needed'] );
			}
		}

		return $price;
	}

	/**
	 * Set original price
	 *
	 * @param float|string $price The price to alter.
	 * @param array<mixed> $cart_item The cart item.
	 * @return float|string
	 * @since 1.0
	 */
	public function wc_epo_add_cart_item_original_price( $price = '', $cart_item = [] ) {

		if ( isset( $cart_item['pricing_item_meta_data'] ) && isset( $cart_item['pricing_item_meta_data']['_price'] ) ) {
			$price = floatval( $cart_item['pricing_item_meta_data']['_price'] );
			if ( ! empty( $cart_item['pricing_item_meta_data']['_measurement_needed'] ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_measurement_divide' ) ) {
				$price = floatval( $price ) / floatval( $cart_item['pricing_item_meta_data']['_measurement_needed'] );
			}
		}

		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-plugins.php000064400000003106150755142450022177 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * various plugins
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Plugins {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Plugins|null
	 * @since 6.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Plugins
	 * @since 6.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.0
	 */
	public function __construct() {
		add_action( 'wp', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 6.0
	 */
	public function add_compatibility() {
		if ( defined( 'YITH_WC_Min_Max_Qty' ) ) {
			add_action( 'wp_enqueue_scripts', [ $this, 'yith_wc_min_max_qty_wp_enqueue_scripts' ], 4 );
		}
	}

	/**
	 * Woodmart sticky add to cart
	 *
	 * @return void
	 * @since 6.0
	 */
	public function yith_wc_min_max_qty_wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-yith-wc-min-max-qty', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-yith-wc-min-max-qty.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-wpml-currency.php000064400000032244150755142450023332 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WPML Currency
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_WPML_Currency {

	/**
	 * If WPML is active
	 *
	 * @var boolean
	 */
	public $is_wpml = false;
	/**
	 * Flag to check in WPML Multi Currency is enabled
	 *
	 * @var integer|null|boolean
	 */
	public $is_wpml_multi_currency = false;
	/**
	 * Cache for the default currency
	 *
	 * @var string|false
	 */
	public $default_to_currency = false;
	/**
	 * Cache for the default from currency
	 *
	 * @var string|false
	 */
	public $default_from_currency = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_WPML_Currency|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_WPML_Currency
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1 );
		add_action( 'plugins_loaded', [ $this, 'plugins_loaded_standalone' ], 10001 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! $this->is_wpml_multi_currency ) {
			return;
		}

		add_filter( 'wc_epo_enabled_currencies', [ $this, 'wc_epo_enabled_currencies' ], 10, 1 );
		add_filter( 'wc_epo_convert_to_currency', [ $this, 'wc_epo_convert_to_currency' ], 10, 3 );
		add_filter( 'wc_epo_get_current_currency_price', [ $this, 'wc_epo_get_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_remove_current_currency_price', [ $this, 'wc_epo_remove_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_get_currency_price', [ $this, 'tm_wc_epo_get_currency_price' ], 10, 6 );
	}

	/**
	 * Setup initial variables
	 *
	 * @return void
	 * @since 6.0
	 */
	public function plugins_loaded() {
		$this->is_wpml                = THEMECOMPLETE_EPO_WPML()->is_active();
		$this->is_wpml_multi_currency = THEMECOMPLETE_EPO_WPML()->is_multi_currency();

		$this->add_compatibility();
	}

	/**
	 * Setup initial variables as a standalone plugin
	 *
	 * @return void
	 * @since 6.0
	 */
	public function plugins_loaded_standalone() {
		// Exit if already defined from priority 1.
		if ( $this->is_wpml_multi_currency ) {
			return;
		}

		$this->is_wpml                = THEMECOMPLETE_EPO_WPML()->is_active();
		$this->is_wpml_multi_currency = THEMECOMPLETE_EPO_WPML()->is_multi_currency();

		$this->add_compatibility();
	}

	/**
	 * Alter enabled currencies
	 *
	 * @param array<mixed> $currencies Array of currencies.
	 * @return array<mixed>
	 * @since 6.4
	 */
	public function wc_epo_enabled_currencies( $currencies = [] ) {
		global $woocommerce_wpml;
		if ( $woocommerce_wpml ) {
			if ( $this->is_wpml_multi_currency ) {
				$currencies = array_keys( $woocommerce_wpml->settings['currency_options'] );
			}
		}

		return $currencies;
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param mixed             $type The option price type.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|false      $currency The currency to get the price.
	 * @param mixed             $product_price The product price (for percent price type) in the default currency.
	 * @param string|false      $tc_added_in_currency The current currency the product was added in.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_get_current_currency_price( $price = '', $type = '', $currencies = null, $currency = false, $product_price = false, $tc_added_in_currency = false ) {
		global $woocommerce_wpml;
		if ( $currency === $tc_added_in_currency ) {
			return $price;
		}
		if ( is_array( $type ) ) {
			$type = '';
		}
		// Check if the price should be processed only once.
		if ( 'math' === $type ) {
			// Replaces any number between curly braces with the current currency.
			$price = preg_replace_callback(
				'/\{(\d+)\}/',
				function ( $matches ) use( $currency ) {
					return apply_filters( 'wc_epo_get_currency_price', $matches[1], $currency, '' );
				},
				$price
			);
		} elseif ( in_array( (string) $type, [ '', 'fixedcurrenttotal', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) ) {
			if ( $this->is_wpml_multi_currency && is_object( $woocommerce_wpml ) && property_exists( $woocommerce_wpml, 'multi_currency' ) && is_object( $woocommerce_wpml->multi_currency ) ) {
				if ( is_callable( [ $woocommerce_wpml->multi_currency, 'convert_price_amount' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->convert_price_amount( $price, $currency );
				} elseif ( property_exists( $woocommerce_wpml->multi_currency, 'prices' ) && is_object( $woocommerce_wpml->multi_currency->prices ) && is_callable( [ $woocommerce_wpml->multi_currency->prices, 'convert_price_amount' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->prices->convert_price_amount( $price, $currency );
				}
			} else {
				$price = $this->get_price_in_currency( $price, $currency, false, $currencies, $type );
			}
		} elseif ( false !== $product_price && false !== $tc_added_in_currency && 'percent' === (string) $type ) {
			if ( $this->is_wpml_multi_currency && is_object( $woocommerce_wpml ) && property_exists( $woocommerce_wpml, 'multi_currency' ) && is_object( $woocommerce_wpml->multi_currency ) ) {
				if ( is_callable( [ $woocommerce_wpml->multi_currency, 'convert_price_amount' ] ) ) {
					$product_price = $woocommerce_wpml->multi_currency->convert_price_amount( $product_price, $tc_added_in_currency );
				} elseif ( property_exists( $woocommerce_wpml->multi_currency, 'prices' ) && is_object( $woocommerce_wpml->multi_currency->prices ) && is_callable( [ $woocommerce_wpml->multi_currency->prices, 'convert_price_amount' ] ) ) {
					$product_price = $woocommerce_wpml->multi_currency->prices->convert_price_amount( $product_price, $tc_added_in_currency );
				}
				$price = floatval( $product_price ) * ( floatval( $price ) / 100 );
			} else {
				$product_price = $this->get_price_in_currency( $product_price, $tc_added_in_currency, false, $currencies, '' );
				$price         = floatval( $product_price ) * ( floatval( $price ) / 100 );
			}
		}

		return $price;
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param string|false      $currency The currency to get the price.
	 * @param string            $price_type The option price type.
	 * @param string|false      $current_currency The current currency.
	 * @param array<mixed>|null $price_per_currencies Array of price per currency.
	 * @param string|null       $key The option key.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function tm_wc_epo_get_currency_price( $price = '', $currency = false, $price_type = '', $current_currency = false, $price_per_currencies = null, $key = null ) {
		if ( ! $currency ) {
			return $this->wc_epo_get_current_currency_price( $price, $price_type );
		}
		$tc_get_default_currency = apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) );

		if ( $current_currency && $current_currency === $currency && $current_currency === $tc_get_default_currency ) {
			return $price;
		}
		if ( $this->is_wpml_multi_currency ) {
			// todo:doesn't work at the moment.
			$price = apply_filters( 'wcml_raw_price_amount', $price, $currency );

		} else {

			$price = $this->get_price_in_currency( $price, $currency, false, $price_per_currencies, $price_type, $key );

		}

		return $price;
	}

	/**
	 * Remove current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param string            $type The option price type.
	 * @param string|false      $to_currency The currency to convert to.
	 * @param string|false      $from_currency The currency to convert from.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|null       $key The option key.
	 * @return mixed
	 * @since 6.0
	 */
	public function wc_epo_remove_current_currency_price( $price = '', $type = '', $to_currency = false, $from_currency = false, $currencies = null, $key = null ) {

		if ( $this->is_wpml_multi_currency ) {
			global $woocommerce_wpml;
			if ( is_object( $woocommerce_wpml ) && property_exists( $woocommerce_wpml, 'multi_currency' ) && is_object( $woocommerce_wpml->multi_currency ) ) {
				if ( is_callable( [ $woocommerce_wpml->multi_currency, 'unconvert_price_amount' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->unconvert_price_amount( $price );
				} elseif ( property_exists( $woocommerce_wpml->multi_currency, 'prices' ) && is_object( $woocommerce_wpml->multi_currency->prices ) && is_callable( [ $woocommerce_wpml->multi_currency->prices, 'unconvert_price_amount' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->prices->unconvert_price_amount( $price );
				}
			}
		} else {
			$price = $this->get_price_in_currency( $price, $to_currency, $from_currency, $currencies, $type, $key );
		}

		return $price;
	}

	/**
	 * Convert to currency
	 *
	 * @param string       $price The price to convert.
	 * @param string|false $from_currency The currency to convert from.
	 * @param string|false $to_currency The currency to convert to.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_convert_to_currency( $price = '', $from_currency = false, $to_currency = false ) {
		if ( ! $from_currency || ! $to_currency || $from_currency === $to_currency ) {
			return $price;
		}

		if ( $this->is_wpml_multi_currency ) {
			// todo: find a way to get correct price for any $from_currency as
			// currently it defaults to get_option( 'woocommerce_currency' ).
			global $woocommerce_wpml;
			if ( is_object( $woocommerce_wpml ) && property_exists( $woocommerce_wpml, 'multi_currency' ) && is_object( $woocommerce_wpml->multi_currency ) ) {
				if ( is_callable( [ $woocommerce_wpml->multi_currency, 'convert_price_amount_by_currencies' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->convert_price_amount_by_currencies( $price, $from_currency, $to_currency );
				} elseif ( property_exists( $woocommerce_wpml->multi_currency, 'prices' ) && is_object( $woocommerce_wpml->multi_currency->prices ) && is_callable( [ $woocommerce_wpml->multi_currency->prices, 'convert_price_amount' ] ) ) {
					$price = $woocommerce_wpml->multi_currency->prices->convert_price_amount( $price, $from_currency, $to_currency );
				}
			}
		} else {
			// todo: if needed extend this as the whole method is only used for fixed conversions.
			$price = $this->get_price_in_currency( $price, $to_currency, $from_currency );

		}

		return $price;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_from_currency() {
		if ( false === $this->default_from_currency ) {
			$this->default_from_currency = get_option( 'woocommerce_currency' );
		}

		return $this->default_from_currency;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_to_currency() {
		if ( false === $this->default_to_currency ) {
			$this->default_to_currency = themecomplete_get_woocommerce_currency();
		}

		return $this->default_to_currency;
	}

	/**
	 * Return prices converted to the active currency
	 *
	 * @param mixed        $price The source price.
	 * @param string|false $to_currency The target currency. If empty, the active currency
	 *                     will be taken.
	 * @param string|false $from_currency The source currency. If empty, WooCommerce base
	 *                     currency will be taken.
	 * @param array<mixed> $currencies Array of currencies.
	 * @param string       $type The price type.
	 * @param string       $key The option key.
	 *
	 * @return mixed The price converted from source to destination currency.
	 */
	protected function get_price_in_currency( $price, $to_currency = false, $from_currency = false, $currencies = null, $type = null, $key = null ) {

		if ( empty( $from_currency ) ) {
			$from_currency = $this->get_default_from_currency();
		}
		if ( empty( $to_currency ) ) {
			$to_currency = $this->get_default_to_currency();
		}
		if ( $from_currency === $to_currency ) {
			return $price;
		}
		if ( null !== $type && in_array( (string) $type, [ '', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) && is_array( $currencies ) && isset( $currencies[ $to_currency ] ) ) {
			$v = $currencies[ $to_currency ];
			if ( null !== $key && isset( $v[ $key ] ) ) {
				$v = $v[ $key ];
			}
			if ( is_array( $v ) ) {
				$v = array_values( $v );
				$v = $v[0];
				if ( is_array( $v ) ) {
					$v = array_values( $v );
					$v = $v[0];
				}
			}

			if ( '' !== $v ) {
				return $v;
			}
		}

		return apply_filters( 'wc_epo_cs_convert', $price, $from_currency, $to_currency );
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-woocs.php000064400000066246150755142450021666 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * FOX - WooCommerce Currency Switcher from realmag777
 * https://codecanyon.net/item/woocommerce-currency-switcher/8085217
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_WOOCS {

	/**
	 * Flag to check in WOOCS is enabled
	 *
	 * @var integer|null|boolean
	 */
	public $is_woocs = false;

	/**
	 * Holds the global $WOOCS variable
	 *
	 * @var mixed
	 */
	public $woocs = false;

	/**
	 * Cache for the default currency
	 *
	 * @var string|false
	 */
	public $default_to_currency = false;

	/**
	 * Cache for the default from currency
	 *
	 * @var string|false
	 */
	public $default_from_currency = false;

	/**
	 * Custom help data
	 * This is used in places where we need to add a custom property
	 *
	 * @var array<mixed>
	 */
	public $data_store = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_WOOCS|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_WOOCS
	 * @since 6.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ], 1 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! $this->is_woocs ) {
			return;
		}

		add_filter( 'wc_epo_enabled_currencies', [ $this, 'wc_epo_enabled_currencies' ], 10, 1 );
		add_filter( 'wc_epo_convert_to_currency', [ $this, 'wc_epo_convert_to_currency' ], 10, 5 );
		add_filter( 'wc_epo_product_price', [ $this, 'wc_epo_product_price' ], 10, 2 );
		add_filter( 'wc_epo_option_price_correction', [ $this, 'wc_epo_option_price_correction' ], 10, 1 );
		add_filter( 'woocs_fixed_raw_woocommerce_price', [ $this, 'woocs_fixed_raw_woocommerce_price' ], 10, 3 );
		add_filter( 'wc_epo_get_current_currency_price', [ $this, 'wc_epo_get_current_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_maybe_get_current_currency_price', [ $this, 'wc_epo_maybe_get_current_currency_price' ], 10, 5 );
		add_filter( 'wc_epo_remove_current_currency_price', [ $this, 'wc_epo_remove_current_currency_price' ], 10, 5 );
		add_filter( 'wc_epo_get_currency_price', [ $this, 'tm_wc_epo_get_currency_price' ], 10, 6 );
		add_filter( 'wc_epo_get_price_html', [ $this, 'wc_epo_get_price_html' ], 10, 2 );
		add_action( 'wc_epo_currency_actions', [ $this, 'wc_epo_currency_actions' ], 10, 3 );
		add_filter( 'wc_epo_script_args', [ $this, 'wc_epo_script_args' ], 10, 1 );
		add_filter( 'tc_get_default_currency', [ $this, 'tc_get_default_currency' ], 10, 1 );
		add_action( 'wc_epo_template_tm_totals', [ $this, 'wc_epo_template_tm_totals' ], 10 );
		add_action( 'wc_epo_get_price_in_currency', [ $this, 'get_price_in_currency' ], 10, 6 );
		add_action( 'wc_epo_price_display_mode_price', [ $this, 'wc_epo_price_display_mode_price' ], 10, 4 );
		add_action( 'wc_epo_price_display_mode_from', [ $this, 'wc_epo_price_display_mode_from' ], 10, 4 );
		add_action( 'wc_epo_price_display_mode_range', [ $this, 'wc_epo_price_display_mode_range' ], 10, 4 );
	}

	/**
	 * Setup initial variables
	 *
	 * @return void
	 * @since 6.0
	 */
	public function plugins_loaded() {
		$this->is_woocs = class_exists( 'WOOCS' );

		if ( $this->is_woocs ) {
			global $WOOCS;// phpcs:ignore WordPress.NamingConventions.ValidVariableName
			$this->woocs = $WOOCS;// phpcs:ignore WordPress.NamingConventions.ValidVariableName
		}

		add_action( 'init', [ $this, 'init' ], 100 );
		add_action( 'wc_epo_init_settings', [ $this, 'woocommerce_order_amount_total' ], 1 );

		$this->add_compatibility();
	}

	/**
	 * Add extra html data attributes
	 *
	 * @return void
	 * @since 5.1
	 */
	public function wc_epo_template_tm_totals() {
		echo 'data-tm-epo-is-woocs="' . esc_attr( (string) $this->is_woocs ) . '" ';
	}

	/**
	 * Get default currency
	 *
	 * @param string $currency The currency.
	 * @return string
	 * @since 5.0.12.11
	 */
	public function tc_get_default_currency( $currency = '' ) {
		$currency = $this->woocs->default_currency;
		return $currency;
	}

	/**
	 * Remove filter
	 *
	 * @return void
	 * @since 6.0
	 */
	public function woocommerce_order_amount_total() {
		remove_filter( 'woocommerce_order_amount_total', [ $this->woocs, 'woocommerce_order_amount_total' ], 999 );
	}

	/**
	 * Setup initial variables
	 *
	 * @return void
	 * @since 1.0
	 */
	public function init() {
		if ( $this->is_woocs && function_exists( 'woocs_convert_fix_price' ) ) {
			remove_filter( 'wcml_raw_price_amount', 'woocs_convert_fix_price' );
		}
	}

	/**
	 * Alter enabled currencies
	 *
	 * @param array<mixed> $currencies Array of currencies.
	 * @return array<mixed>
	 *
	 * @since 6.0
	 */
	public function wc_epo_enabled_currencies( $currencies = [] ) {
		$currencies = is_object( $this->woocs ) && is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];

		$enabled_currencies = [];
		if ( $currencies && is_array( $currencies ) ) {
			foreach ( $currencies as $key => $value ) {
				$enabled_currencies[] = $value['name'];
			}
		}

		return $enabled_currencies;
	}

	/**
	 * Add to main JS script arguments
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_script_args( $args ) {
		if ( isset( $args['product_id'] ) ) {
			$customer_price_format = get_option( 'woocs_customer_price_format', '' );

			if ( ! empty( $customer_price_format ) ) {
				$args['customer_price_format']            = $customer_price_format;
				$args['current_currency']                 = $this->woocs->current_currency;
				$args['customer_price_format_wrap_start'] = '<span class="woocs_price_code" data-product-id="' . $args['product_id'] . '">';
				$args['customer_price_format_wrap_end']   = '</span>';
			}
		}

		return $args;
	}

	/**
	 * Alter product variables in cart
	 *
	 * @param float        $price1 Total price.
	 * @param float        $price2 Option price.
	 * @param array<mixed> $cart_item The cart item.
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_currency_actions( $price1, $price2, $cart_item ) {
		$price1     = apply_filters( 'wc_epo_convert_to_currency', $price1, $this->woocs->default_currency, $this->woocs->current_currency );
		$product_id = themecomplete_get_id( $cart_item['data'] );

		$this->data_store[ $product_id ]['tc_price1']                     = floatval( $price1 );// option prices.
		$this->data_store[ $product_id ]['tc_price2']                     = floatval( $price2 );
		$this->data_store[ $product_id ]['tm_epo_product_original_price'] = floatval( $cart_item['tm_epo_product_original_price'] );
	}

	/**
	 * Fixed currency support for WOOCS
	 *
	 * @param float $fixed_price The fixed product price.
	 * @param mixed $product The product object.
	 * @param float $main_price The main price.
	 * @return mixed
	 * @since 1.0
	 */
	public function woocs_fixed_raw_woocommerce_price( $fixed_price = 0, $product = false, $main_price = null ) {
		if ( null === $main_price ) {
			if ( ! defined( 'THEMECOMPLETE_CS_ERROR' ) ) {
				define( 'THEMECOMPLETE_CS_ERROR', 1 );
				wc_add_notice( 'You are using an unsupported version of Currency switcher. Prices will not be correct!', 'error' );
			}

			return $fixed_price;
		}
		$product_id = $product->get_id();

		$flag = false;
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) ) {
			$flag = true;
		} elseif ( '' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) ) {
			$tm_meta_cpf = themecomplete_get_post_meta( $product_id, 'tm_meta_cpf', true );
			if ( ! is_array( $tm_meta_cpf ) ) {
				$tm_meta_cpf = [];
			}

			if ( ! empty( $tm_meta_cpf['price_override'] ) ) {
				$flag = true;
			}
		}
		if ( $flag ) {
			return $this->woocs->woocs_exchange_value( $main_price );
		}

		$type = $this->woocs->fixed->get_price_type( $product, $main_price );

		$main_price = floatval( $main_price );

		$get_value = floatval( themecomplete_get_post_meta( $product_id, '_' . $type . '_price', true ) );

		$get_sale_value = floatval( themecomplete_get_post_meta( $product_id, '_sale_price', true ) );

		if ( $main_price === $get_value ) {
			return $fixed_price;
		}

		$option_prices                      = isset( $this->data_store[ $product_id ] ) ? $this->data_store[ $product_id ]['tc_price1'] : 0;
		$original_price_in_current_currency = isset( $this->data_store[ $product_id ] ) ? $this->data_store[ $product_id ]['tm_epo_product_original_price'] : 0;
		$original_price_in_current_currency = floatval( $this->wc_epo_get_current_currency_price( $original_price_in_current_currency ) );

		$new_price = $original_price_in_current_currency + $option_prices;

		if ( $new_price < 0 ) {
			return $fixed_price;
		}

		$fixed_price = $fixed_price + $option_prices;

		return $fixed_price;
	}

	/**
	 * General price manipulations.
	 *
	 * @param string $price_html The price html code.
	 * @param object $product The product object.
	 * @return string
	 * @since 6.4.2
	 */
	public function woocs_price_html_general( $price_html, $product ) {
		if ( is_object( $this->woocs ) && property_exists( $this->woocs, 'current_currency' ) && property_exists( $this->woocs, 'no_cents' ) ) {
			$currencies            = is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
			$customer_price_format = get_option( 'woocs_customer_price_format', '' );

			if ( ! empty( $customer_price_format ) ) {
				$txt        = '<span class="woocs_price_code" data-product-id="' . themecomplete_get_id( $product ) . '">' . $customer_price_format . '</span>';
				$txt        = str_replace( '__PRICE__', $price_html, $txt );
				$price_html = str_replace( '__CODE__', $this->woocs->current_currency, $txt );
			}

			// Hide cents on front as html element.
			if ( ! in_array( $this->woocs->current_currency, $this->woocs->no_cents ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
				if ( 1 === intval( $currencies[ $this->woocs->current_currency ]['hide_cents'] ) ) {
					$price_html = preg_replace( '/\.[0-9][0-9]/', '', $price_html );
				}
			}
		}

		if ( ! is_string( $price_html ) ) {
			$price_html = '';
		}

		return $price_html;
	}

	/**
	 * Add additional info in price html
	 *
	 * @param string $price_html The price html code.
	 * @param mixed  $from_price The from price in default currency.
	 * @param mixed  $to_price The to price in default currency.
	 * @param object $product The product object.
	 * @return string
	 * @since 6.4.2
	 */
	public function wc_epo_price_display_mode_range( $price_html, $from_price, $to_price, $product ) {
		if ( is_object( $this->woocs ) && method_exists( $this->woocs, 'wc_price' ) && property_exists( $this->woocs, 'current_currency' ) && property_exists( $this->woocs, 'decimal_sep' ) ) {
			$currencies = is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
			$price_html = $this->woocs_price_html_general( $price_html, $product );

			if ( ( get_option( 'woocs_price_info', 0 ) && ! is_admin() ) || isset( $_REQUEST['get_product_price_by_ajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$info             = '<ul>';
				$current_currency = $this->woocs->current_currency;
				foreach ( $currencies as $curr ) {
					if ( ! isset( $curr['name'] ) || $curr['name'] === $current_currency ) {
						continue;
					}
					$this->woocs->current_currency = $curr['name'];

					$min_value  = (float) $from_price;
					$max_value  = (float) $to_price;
					$min_value  = number_format( $min_value, 2, $this->woocs->decimal_sep, '' );
					$max_value  = number_format( $max_value, 2, $this->woocs->decimal_sep, '' );
					$var_price  = $this->woocs->wc_price( $min_value, [ 'currency' => $curr['name'] ] );
					$var_price .= ' - ';
					$var_price .= $this->woocs->wc_price( $max_value, [ 'currency' => $curr['name'] ] );
					$info      .= '<li><b>' . $curr['name'] . '</b>: ' . $var_price . '</li>';
				}
				$this->woocs->current_currency = $current_currency;

				$info       .= '</ul>';
				$info        = '<div class="woocs_price_info"><span class="woocs_price_info_icon"></span>' . $info . '</div>';
				$price_html .= $info;
			}
		}

		return $price_html;
	}

	/**
	 * Add additional info in price html
	 *
	 * @param string $price_html The price html code.
	 * @param mixed  $price The price in default currency.
	 * @param mixed  $sale_price The sale price in default currency.
	 * @param object $product The product object.
	 * @return string
	 * @since 6.4.2
	 */
	public function wc_epo_price_display_mode_from( $price_html, $price, $sale_price, $product ) {
		if ( is_object( $this->woocs ) && method_exists( $this->woocs, 'wc_price' ) && property_exists( $this->woocs, 'current_currency' ) && property_exists( $this->woocs, 'decimal_sep' ) ) {
			$currencies = is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
			$price_html = $this->woocs_price_html_general( $price_html, $product );

			if ( ( get_option( 'woocs_price_info', 0 ) && ! is_admin() ) || isset( $_REQUEST['get_product_price_by_ajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$info             = '<ul>';
				$current_currency = $this->woocs->current_currency;
				foreach ( $currencies as $curr ) {
					if ( ! isset( $curr['name'] ) || $curr['name'] === $current_currency ) {
						continue;
					}
					$this->woocs->current_currency = $curr['name'];

					$value = $price;
					if ( '' !== $sale_price ) {
						$value = $sale_price;
					}
					$value = (float) $value;
					$value = number_format( $value, 2, $this->woocs->decimal_sep, '' );
					$info .= '<li><b>' . $curr['name'] . '</b>: ' . $this->woocs->wc_price( $value, [ 'currency' => $curr['name'] ] ) . '</li>';
				}
				$this->woocs->current_currency = $current_currency;

				$info       .= '</ul>';
				$info        = '<div class="woocs_price_info"><span class="woocs_price_info_icon"></span>' . $info . '</div>';
				$price_html .= $info;
			}
		}

		return $price_html;
	}

	/**
	 * Add additional info in price html
	 *
	 * @param string $price_html The price html code.
	 * @param mixed  $price The price in default currency.
	 * @param mixed  $sale_price The sale price in default currency.
	 * @param object $product The product object.
	 * @return string
	 * @since 6.4.2
	 */
	public function wc_epo_price_display_mode_price( $price_html, $price, $sale_price, $product ) {
		return $this->wc_epo_price_display_mode_from( $price_html, $price, $sale_price, $product );
	}

	/**
	 * Add additional info in price html
	 *
	 * @param string     $price_html The price html code.
	 * @param WC_Product $product The product object.
	 * @return string
	 * @since 1.0
	 */
	public function wc_epo_get_price_html( $price_html, $product ) {
		$price_html = $this->woocs_price_html_general( $price_html, $product );

		if ( ( get_option( 'woocs_price_info', 0 ) && ! is_admin() ) || isset( $_REQUEST['get_product_price_by_ajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$currencies       = is_object( $this->woocs ) && is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
			$info             = '<ul>';
			$current_currency = $this->woocs->current_currency;
			foreach ( $currencies as $curr ) {
				if ( ! isset( $curr['name'] ) || $curr['name'] === $current_currency ) {
					continue;
				}
				$this->woocs->current_currency = $curr['name'];
				$value                         = $product->get_price() * $currencies[ $curr['name'] ]['rate'];
				$value                         = number_format( $value, 2, $this->woocs->decimal_sep, '' );
				if ( 'variable' !== themecomplete_get_product_type( $product ) ) {
					$info .= '<li><b>' . $curr['name'] . '</b>: ' . $this->woocs->wc_price( $value, false, [ 'currency' => $curr['name'] ] ) . '</li>';
				} elseif ( $product instanceof WC_Product_Variable ) {
					$min_value  = $product->get_variation_price( 'min', true ) * $currencies[ $curr['name'] ]['rate'];
					$max_value  = $product->get_variation_price( 'max', true ) * $currencies[ $curr['name'] ]['rate'];
					$min_value  = number_format( $min_value, 2, $this->woocs->decimal_sep, '' );
					$max_value  = number_format( $max_value, 2, $this->woocs->decimal_sep, '' );
					$var_price  = $this->woocs->wc_price( $min_value, [ 'currency' => $curr['name'] ] );
					$var_price .= ' - ';
					$var_price .= $this->woocs->wc_price( $max_value, [ 'currency' => $curr['name'] ] );
					$info      .= '<li><b>' . $curr['name'] . '</b>: ' . $var_price . '</li>';
				}
			}
			$this->woocs->current_currency = $current_currency;

			$info       .= '</ul>';
			$info        = '<div class="woocs_price_info"><span class="woocs_price_info_icon"></span>' . $info . '</div>';
			$price_html .= $info;
		}

		return $price_html;
	}

	/**
	 * Get product price
	 * This filter is currency only used for product prices.
	 *
	 * @param float|string   $price The product price.
	 * @param string|boolean $currency The current to convert the price to.
	 * @since 1.0
	 * @return float|string
	 */
	public function wc_epo_product_price( $price = '', $currency = false ) {

		if ( ! $this->woocs->is_multiple_allowed ) {
			$price = $this->convert_to_currency( $price, $currency );
		}

		return $price;
	}

	/**
	 * Get product price
	 * This filter is currently only used for product prices.
	 *
	 * @param float|string   $price The product price.
	 * @param string|boolean $currency The currency to convert the price to.
	 * @return float|string
	 * @since 6.0
	 */
	private function convert_to_currency( $price = '', $currency = false ) {

		if ( defined( 'WOOCS_VERSION' ) ) {
			if ( is_object( $this->woocs ) && property_exists( $this->woocs, 'current_currency' ) ) {
				$currencies = is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
				if ( ! $currency ) {
					$current_currency = $this->woocs->current_currency;
				} else {
					$current_currency = $currency;
				}
				if ( isset( $currencies[ $current_currency ] ) && isset( $currencies[ $current_currency ]['rate'] ) ) {
					$price = (float) $price * (float) $currencies[ $current_currency ]['rate'];
				}
			}
		}

		return $price;
	}

	/**
	 * Alter option prices in cart
	 *
	 * @param float $price The price to convert.
	 * @return mixed
	 * @since 1.0
	 */
	public function wc_epo_option_price_correction( $price ) {
		return apply_filters( 'wc_epo_remove_current_currency_price', $price, '', null, null, null );
	}

	/**
	 * Get current currency price if multiple price is on
	 *
	 * @param mixed             $price The price to convert.
	 * @param string            $type The option price type.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|false      $currency The currency to get the price.
	 * @param mixed             $product_price The product price (for percent price type).
	 * @param string|false      $tc_added_in_currency The current currency the product was added in.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_maybe_get_current_currency_price( $price = '', $type = '', $currencies = null, $currency = false, $product_price = false, $tc_added_in_currency = false ) {
		if ( ! $this->woocs->is_multiple_allowed ) {
			$price = $this->wc_epo_remove_current_currency_price( $price, $type, $tc_added_in_currency, $tc_added_in_currency, $currencies );
		} else {
			$price = apply_filters( 'wc_epo_get_current_currency_price', $price, $type, $currencies, $currency, $product_price, $tc_added_in_currency );
		}
		return $price;
	}

	/**
	 * Get current currency price
	 *
	 * @param mixed             $price The price to convert.
	 * @param mixed             $type The option price type.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @param string|false      $currency The currency to get the price.
	 * @param mixed             $product_price The product price (for percent price type).
	 * @param string|false      $tc_added_in_currency The current currency the product was added in.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_get_current_currency_price( $price = '', $type = '', $currencies = null, $currency = false, $product_price = false, $tc_added_in_currency = false ) {
		if ( $currency === $tc_added_in_currency ) {
			return $price;
		}
		if ( is_array( $type ) ) {
			$type = '';
		}
		// Check if the price should be processed only once.
		if ( 'math' === $type ) {
			// Replaces any number between curly braces with the current currency.
			$price = preg_replace_callback(
				'/\{(\d+)\}/',
				function ( $matches ) use( $currency ) {
					return apply_filters( 'wc_epo_get_currency_price', $matches[1], $currency, '' );
				},
				$price
			);
		} elseif ( in_array( (string) $type, [ '', 'fixedcurrenttotal', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) ) {
			if ( is_array( $currencies ) && isset( $currencies[ $this->woocs->current_currency ] ) ) {
				$price = $currencies[ $this->woocs->current_currency ];
			} else {
				$price = $this->convert_to_currency( $price );
			}
		} elseif ( false !== $product_price && false !== $tc_added_in_currency && (string) 'percent' === $type ) {
			if ( is_array( $currencies ) && isset( $currencies[ $this->woocs->current_currency ] ) ) {
				$product_price = $currencies[ $this->woocs->current_currency ];
			} else {
				$product_price = $this->convert_to_currency( $product_price, $tc_added_in_currency );
			}
			$price = floatval( $product_price ) * ( floatval( $price ) / 100 );
		}

		return $price;
	}

	/**
	 * Get current currency price
	 *
	 * @param string            $price The price to convert.
	 * @param string|false      $currency The currency to get the price.
	 * @param string            $price_type The option price type.
	 * @param string|false      $current_currency The current currency.
	 * @param array<mixed>|null $price_per_currencies Array of price per currency.
	 * @param string|null       $key The option key.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function tm_wc_epo_get_currency_price( $price = '', $currency = false, $price_type = '', $current_currency = false, $price_per_currencies = null, $key = null ) {
		if ( ! $currency ) {
			return $this->wc_epo_get_current_currency_price( $price, $price_type, null, $currency );
		}
		$tc_get_default_currency = apply_filters( 'tc_get_default_currency', get_option( 'woocommerce_currency' ) );
		if ( $current_currency && $current_currency === $currency && $current_currency === $tc_get_default_currency ) {
			return $price;
		}

		$price = $this->get_price_in_currency( $price, $currency, null, $price_per_currencies, $price_type, $key );

		return $price;
	}

	/**
	 * Remove current currency price
	 *
	 * @param mixed             $price The price to convert.
	 * @param string            $type The option price type.
	 * @param string|false      $to_currency The currency to convert to.
	 * @param string|false      $from_currency The currency to convert from.
	 * @param array<mixed>|null $currencies Array of currencies.
	 * @return mixed
	 * @since 6.0
	 */
	public function wc_epo_remove_current_currency_price( $price = '', $type = '', $to_currency = false, $from_currency = false, $currencies = null ) {
		$currencies       = is_object( $this->woocs ) && is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
		$current_currency = $this->woocs->current_currency;
		if ( $this->woocs->default_currency !== $current_currency && ! empty( $currencies[ $current_currency ]['rate'] ) ) {
			$price = (float) $price / $currencies[ $current_currency ]['rate'];
		}

		return $price;
	}

	/**
	 * Convert to currency
	 *
	 * @param mixed        $price The price to convert.
	 * @param string|false $from_currency The currency to convert from.
	 * @param string|false $to_currency The currency to convert to.
	 * @param boolean      $force If we want to force the conversion.
	 * @return mixed
	 *
	 * @since 6.0
	 */
	public function wc_epo_convert_to_currency( $price = '', $from_currency = false, $to_currency = false, $force = false ) {
		if ( ! $from_currency || ! $to_currency || $from_currency === $to_currency ) {
			return $price;
		}
		if ( is_object( $this->woocs ) && property_exists( $this->woocs, 'is_multiple_allowed' ) ) {
			if ( $this->woocs->is_multiple_allowed && ! $force ) {
				return $price;
			}
			$currencies       = is_callable( [ $this->woocs, 'get_currencies' ] ) ? $this->woocs->get_currencies() : [];
			$current_currency = $from_currency;
			if ( ! empty( $currencies[ $to_currency ]['rate'] ) && ! empty( $currencies[ $from_currency ]['rate'] ) ) {
				$price = (float) $price * ( $currencies[ $to_currency ]['rate'] / $currencies[ $from_currency ]['rate'] );
			}
		}

		return $price;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_from_currency() {
		if ( false === $this->default_from_currency ) {
			$this->default_from_currency = get_option( 'woocommerce_currency' );
		}

		return $this->default_from_currency;
	}

	/**
	 * Helper function
	 *
	 * @return string
	 * @see get_price_in_currency
	 */
	public function get_default_to_currency() {
		if ( false === $this->default_to_currency ) {
			$this->default_to_currency = themecomplete_get_woocommerce_currency();
		}

		return $this->default_to_currency;
	}

	/**
	 * Return prices converted to the active currency
	 *
	 * @param mixed        $price The source price.
	 * @param string       $to_currency The target currency. If empty, the active currency
	 *                     will be taken.
	 * @param string       $from_currency The source currency. If empty, WooCommerce base
	 *                     currency will be taken.
	 * @param array<mixed> $currencies Array of currencies.
	 * @param string       $type The price type.
	 * @param string       $key The option key.
	 *
	 * @return mixed The price converted from source to destination currency.
	 */
	public function get_price_in_currency( $price, $to_currency = null, $from_currency = null, $currencies = null, $type = null, $key = null ) {

		if ( empty( $from_currency ) ) {
			$from_currency = $this->get_default_from_currency();
		}
		if ( empty( $to_currency ) ) {
			$to_currency = $this->get_default_to_currency();
		}
		if ( $from_currency === $to_currency ) {
			return $price;
		}
		if ( null !== $type && in_array( $type, [ '', 'word', 'wordnon', 'char', 'step', 'intervalstep', 'charnofirst', 'charnospaces', 'charnon', 'charnonnospaces', 'fee', 'stepfee', 'subscriptionfee' ], true ) && is_array( $currencies ) && isset( $currencies[ $to_currency ] ) ) {
			$v = $currencies[ $to_currency ];
			if ( null !== $key && isset( $v[ $key ] ) ) {
				$v = $v[ $key ];
			}
			if ( is_array( $v ) ) {
				$v = array_values( $v );
				$v = $v[0];
				if ( is_array( $v ) ) {
					$v = array_values( $v );
					$v = $v[0];
				}
			}

			if ( '' !== $v ) {
				return $v;
			}
		}

		return apply_filters( 'wc_epo_cs_convert', apply_filters( 'woocs_exchange_value', $price ), $from_currency, $to_currency );
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-elasticpress.php000064400000003140150755142450023215 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * ElasticPress
 * https://wordpress.org/plugins/elasticpress/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Elasticpress {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Elasticpress|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Elasticpress
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wc_epo_add_compatibility', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		add_filter( 'ep_skip_query_integration', [ $this, 'ep_skip_query_integration' ], 10, 2 );
	}

	/**
	 * Skip query integration
	 *
	 * @param boolean  $ret if we want to skip query integration.
	 * @param WP_Query $query The query oibject.
	 * @return boolean
	 */
	public function ep_skip_query_integration( $ret, $query ) {
		$post_type = $query->get( 'post_type', false );

		if ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE === $post_type ) {
			return true;
		}

		return $ret;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-subscriptions.php000064400000162367150755142450023444 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce Subscriptions
 * https://woocommerce.com/products/woocommerce-subscriptions/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Subscriptions {

	/**
	 * Replacement name for Subscription sign up fee fields.
	 *
	 * @var string
	 */
	public $subscription_fee_name = 'tmsubfee_';

	/**
	 * Replacement class name for Subscription sign up fee fields.
	 *
	 * @var string
	 */
	public $subscription_fee_name_class = 'tmcp-sub-fee-field';

	/**
	 * Holds the total fee added by Subscription sign up fee fields.
	 *
	 * @var float
	 */
	public $subscription_tmfee = 0;

	/**
	 * Holds the variable subscription periods.
	 *
	 * @var array<mixed>
	 */
	private $variations_subscription_period = [];

	/**
	 * Holds the variable subscription sign up fees.
	 *
	 * @var array<mixed>
	 */
	private $variations_subscription_sign_up_fee = [];

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Subscriptions|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Subscriptions
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'WC_Subscriptions' ) ) {
			return;
		}

		// Enqueue scripts.
		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 11 );

		// Add custom final total data in the JS template file.
		add_filter( 'wc_epo_after_js_final_totals', [ $this, 'wc_epo_after_js_final_totals' ], 10 );

		// Add to main JS script arguments.
		add_filter( 'wc_epo_script_args', [ $this, 'wc_epo_script_args' ], 10, 1 );
		// Add setting in main THEMECOMPLETE_EPO class.
		add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
		add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
		add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );

		// Add extra html data attributes to the totals template.
		add_action( 'wc_epo_template_tm_totals', [ $this, 'wc_epo_template_tm_totals' ], 10, 1 );

		// Add extra arguments to the totals template.
		add_filter( 'wc_epo_template_args_tm_totals', [ $this, 'wc_epo_template_args_tm_totals' ], 10, 2 );

		// Calculate subscription period and sign up fee per variation.
		add_action( 'wc_epo_print_price_fields_in_variation_loop', [ $this, 'wc_epo_print_price_fields_in_variation_loop' ], 10, 2 );

		// Add string setting.
		add_action( 'tm_epo_settings_string', [ $this, 'tm_epo_settings_string' ], 10, 1 );

		// Calculates the extra Subscription sign up fee.
		add_filter( 'woocommerce_subscriptions_product_sign_up_fee', [ $this, 'woocommerce_subscriptions_product_sign_up_fee' ], 10, 2 );

		// Flag subscription renewal.
		add_filter( 'woocommerce_subscriptions_renewal_order_items', [ $this, 'woocommerce_subscriptions_renewal_order_items' ], 10, 5 );
		add_filter( 'wcs_renewal_order_items', [ $this, 'woocommerce_subscriptions_renewal_order_items' ], 10, 1 );
		add_action( 'wcs_before_renewal_setup_cart_subscriptions', [ $this, 'wcs_before_renewal_setup_cart_subscriptions' ] );

		// Skip altering cart.
		add_filter( 'wc_epo_no_add_cart_item', [ $this, 'wc_epo_no_add_cart_item' ], 10, 1 );

		// Skip altering order again data.
		add_filter( 'wc_epo_no_order_again_cart_item_data', [ $this, 'wc_epo_no_order_again_cart_item_data' ], 10, 1 );

		// Skip altering order get_items.
		add_filter( 'wc_epo_no_order_get_items', [ $this, 'wc_epo_no_order_get_items' ], 10, 1 );

		// Add data to main element array in the builder.
		add_filter( 'wc_epo_builder_element_settings', [ $this, 'wc_epo_builder_element_settings' ], 10, 1 );

		// Initial value for the set_elements function.
		add_filter( 'wc_epo_set_elements_options', [ $this, 'wc_epo_set_elements_options' ], 10, 1 );

		// Alter price type.
		add_filter( 'tc_element_settings_override', [ $this, 'tc_element_settings_override' ], 10, 1 );
		add_filter( 'wc_epo_add_element_class', [ $this, 'wc_epo_add_element_class' ], 10, 3 );
		add_filter( 'wc_epo_builder_after_multiple_element_array', [ $this, 'wc_epo_builder_after_multiple_element_array' ], 10, 2 );
		add_filter( 'wc_epo_builder_element_array_in_loop_before', [ $this, 'wc_epo_builder_element_array_in_loop_before' ], 10, 3 );
		add_filter( 'wc_epo_builder_element_array_in_loop_after', [ $this, 'wc_epo_builder_element_array_in_loop_after' ], 10, 5 );
		add_action( 'wc_epo_builder_element_multiple_checkboxes_options', [ $this, 'wc_epo_builder_element_multiple_checkboxes_options' ], 10, 1 );
		add_filter( 'wc_epo_builder_element_multiple_checkboxes_options_js_object', [ $this, 'wc_epo_builder_element_multiple_checkboxes_options_js_object' ], 10, 5 );
		add_filter( 'wc_epo_obvalues', [ $this, 'wc_epo_obvalues' ], 10, 6 );
		add_filter( 'wc_epo_cbvalues', [ $this, 'wc_epo_cbvalues' ], 10, 7 );

		// Skip cart item loop.
		add_filter( 'wc_epo_add_cart_item_loop', [ $this, 'wc_epo_add_cart_item_loop' ], 10, 2 );

		// Alter the cart from session.
		add_filter( 'wc_epo_get_cart_item_from_session', [ $this, 'wc_epo_get_cart_item_from_session' ], 10, 2 );

		// Edit cart link product types.
		add_filter( 'wc_epo_can_be_edited_product_type', [ $this, 'wc_epo_can_be_edited_product_type' ], 10, 1 );

		// Pre-init cart item.
		add_filter( 'wc_epo_add_cart_item_data_helper', [ $this, 'wc_epo_add_cart_item_data_helper' ], 10, 1 );

		// Add field data to cart (subscription fees).
		add_filter( 'wc_epo_add_cart_item_data_loop', [ $this, 'wc_epo_add_cart_item_data_loop' ], 10, 6 );

		// No options in cart check.
		add_filter( 'wc_epo_no_epo_in_cart', [ $this, 'wc_epo_no_epo_in_cart' ], 10, 2 );

		// Field pre validation.
		add_filter( 'wc_epo_validate_field_field_names', [ $this, 'wc_epo_validate_field_field_names' ], 10, 5 );

		// Validate checkbox.
		add_filter( 'wc_epo_validate_checkbox', [ $this, 'wc_epo_validate_checkbox' ], 10, 2 );

		// Validate radio button.
		add_filter( 'wc_epo_validate_radiobutton', [ $this, 'wc_epo_validate_radiobutton' ], 10, 3 );

		// Alternative radio button check.
		add_filter( 'wc_epo_alt_validate_radiobutton', [ $this, 'wc_epo_alt_validate_radiobutton' ], 10, 3 );

		// Alter HTML name.
		add_filter( 'wc_epo_name_inc', [ $this, 'wc_epo_name_inc' ], 10, 6 );

		// Alter fieldtype key of the element in the template arguments.
		add_filter( 'wc_epo_display_template_args', [ $this, 'wc_epo_display_template_args' ], 10, 5 );

		// Gets the stored cart data for the order again functionality.
		add_filter( 'wc_epo_woocommerce_order_again_cart_item_data', [ $this, 'wc_epo_woocommerce_order_again_cart_item_data' ], 10, 2 );

		// Check for if the cart key for subscriptions exists.
		add_filter( 'wc_epo_woocommerce_order_again_cart_item_data_has_epo', [ $this, 'wc_epo_woocommerce_order_again_cart_item_data_has_epo' ], 10, 2 );

		// Adds meta data to the order.
		add_action( 'wc_epo_order_item_meta', [ $this, 'wc_epo_order_item_meta' ], 10, 3 );

		// Alter global epo table.
		add_filter( 'global_epos_fill_builder_display', [ $this, 'global_epos_fill_builder_display' ], 10, 9 );

		// Check for subscription fee type when displaying options on admin Order page.
		add_filter( 'wc_epo_html_tm_epo_order_item_is_other_fee', [ $this, 'wc_epo_html_tm_epo_order_item_is_other_fee' ], 10, 2 );

		// Alter the array of data for a variation. Used in the add to cart form.
		add_filter( 'woocommerce_available_variation', [ $this, 'woocommerce_available_variation' ], 10, 3 );

		// Add the variable subscription product type to plugin checks.
		add_filter( 'wc_epo_variable_product_type', [ $this, 'wc_epo_variable_product_type' ], 10, 1 );

		// Flag renewals.
		add_filter( 'woocommerce_order_again_cart_item_data', [ $this, 'woocommerce_order_again_cart_item_data' ], 50, 1 );
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['subscriptions'] = [ 'tcfa tcfa-arrows-spin', esc_html__( 'WooCommerce Subscriptions', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label                     = esc_html__( 'WooCommerce Subscriptions', 'woocommerce-tm-extra-product-options' );
		$settings['subscriptions'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'   => esc_html__( 'Include addons on order again', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will add the saved addons to the subscription when using the order again functionality manually.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_order_again_include_addons',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'title'   => esc_html__( 'Options subscription fee text replacement', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter a text to replace the Option subscription fee label.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_options_subscription_fee_text',
				'default' => '',
				'class'   => 'tcsgeneral',
				'type'    => 'text',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];

		return $settings;
	}

	/**
	 * Flag renewals
	 *
	 * @param array<mixed> $cart_item_meta The cart item meta.
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function woocommerce_order_again_cart_item_data( $cart_item_meta ) {
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_order_again_include_addons' ) ) {
			if ( ! defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
				define( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL', 1 );
			}
		}
		return $cart_item_meta;
	}

	/**
	 * Add the variable subscription product type to plugin checks
	 *
	 * @param array<mixed> $type Array of product types.
	 * @return array<mixed>
	 * @since 5.0.12.11
	 */
	public function wc_epo_variable_product_type( $type ) {
		$type[] = 'variable-subscription';
		return $type;
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-subscriptions', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-subscriptions.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}

	/**
	 * Add custom final total data in the JS template file
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_after_js_final_totals() {
		?>
		<# if (data.show_sign_up_fee==true){ #><?php do_action( 'wc_epo_template_before_sign_up_fee' ); ?>
		<dt class="tm-subscription-fee">{{{ data.sign_up_fee }}}</dt>
		<dd class="tm-subscription-fee">
			<span class="price amount subscription-fee">{{{ data.formatted_subscription_fee_total }}}</span>
		</dd><?php do_action( 'wc_epo_template_after_sign_up_fee' ); ?>
		<# } #>
		<?php
	}

	/**
	 * Add to main JS script arguments
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_script_args( $args ) {
		$args['i18n_subscription_sign_up_fee'] = ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_subscription_fee_text' ) ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_subscription_fee_text' ) : esc_html__( 'Sign up fee', 'woocommerce-tm-extra-product-options' );
		$args['i18n_sign_up_fee']              = ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_signup_fee_text' ) ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_signup_fee_text' ) : esc_html__( 'sign-up fee', 'woocommerce-tm-extra-product-options' );
		$args['i18n_and_a']                    = esc_html__( 'and a', 'woocommerce-tm-extra-product-options' );

		return $args;
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( class_exists( 'WC_Subscriptions' ) ) {
			$settings['tm_epo_subscription_fee_text']      = '';
			$settings['tm_epo_signup_fee_text']            = '';
			$settings['tm_epo_order_again_include_addons'] = 'yes';
		}

		return $settings;
	}

	/**
	 * Add extra html data attributes to the totals template
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_template_tm_totals( $args ) {
		$data                                  = [];
		$data['data-is-subscription']          = $args['is_subscription'];
		$data['data-subscription-sign-up-fee'] = $args['subscription_sign_up_fee'];
		$data['data-variations-subscription-sign-up-fee'] = esc_html( (string) wp_json_encode( (array) $args['variations_subscription_sign_up_fee'] ) );
		$data['data-subscription-period']                 = esc_html( (string) wp_json_encode( (array) $args['subscription_period'] ) );
		$data['data-variations-subscription-period']      = esc_html( (string) wp_json_encode( (array) $args['variations_subscription_period'] ) );
		$data['data-ln-and-a']                            = __( 'and a', 'woocommerce-tm-extra-product-options' );
		$data['data-ln-signup-fee']                       = __( 'sign-up fee', 'woocommerce-tm-extra-product-options' );

		THEMECOMPLETE_EPO_HTML()->create_attribute_list( $data );
	}

	/**
	 * Add extra arguments to the totals template
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @param object       $product The product object.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_template_args_tm_totals( $args, $product ) {

		$is_subscription     = false;
		$subscription_period = '';

		$subscription_sign_up_fee = 0;
		if ( class_exists( 'WC_Subscriptions_Product' ) ) {
			if ( WC_Subscriptions_Product::is_subscription( $product ) ) {
				$is_subscription = true;

				if ( function_exists( 'wcs_get_subscription_period_strings' ) ) {
					$billing_interval = intval( WC_Subscriptions_Product::get_interval( $product ) );
					$billing_period   = WC_Subscriptions_Product::get_period( $product );
					if ( empty( $billing_period ) ) {
						$billing_period = 'month';
					}
					$subscription_period = sprintf(
						// translators: 1$: recurring amount, 2$: subscription period (e.g. "month" or "3 months") (e.g. "$15 / month" or "$15 every 2nd month").
						_n( '%1$s / %2$s', '%1$s every %2$s', $billing_interval, 'woocommerce-tm-extra-product-options' ),
						'',
						wcs_get_subscription_period_strings( $billing_interval, $billing_period )
					);
				} else {
					$subscription_period = WC_Subscriptions_Product::get_price_string(
						$product,
						[
							'subscription_price' => false,
							'sign_up_fee'        => false,
							'trial_length'       => false,
							'price'              => null,
						]
					);
				}

				$subscription_sign_up_fee = WC_Subscriptions_Product::get_sign_up_fee( $product );
			}
		}

		$args['is_subscription']                     = $is_subscription;
		$args['subscription_sign_up_fee']            = $subscription_sign_up_fee;
		$args['variations_subscription_sign_up_fee'] = $this->variations_subscription_sign_up_fee;
		$args['subscription_period']                 = $subscription_period;
		$args['variations_subscription_period']      = $this->variations_subscription_period;

		return $args;
	}

	/**
	 * Calculate subscription period and sign up fee per variation
	 *
	 * @param object  $variation Variation object.
	 * @param integer $child_id Variation id.
	 * @return void
	 * @since 1.0
	 */
	public function wc_epo_print_price_fields_in_variation_loop( $variation, $child_id ) {
		if ( class_exists( 'WC_Subscriptions_Product' ) ) {
			$this->variations_subscription_period[ $child_id ] = WC_Subscriptions_Product::get_price_string(
				$variation,
				[
					'subscription_price' => false,
					'sign_up_fee'        => false,
					'trial_length'       => false,
					'price'              => null,
				]
			);
			if ( is_callable( [ 'WC_Subscriptions_Product', 'get_sign_up_fee' ] ) ) {
				$this->variations_subscription_sign_up_fee[ $child_id ] = WC_Subscriptions_Product::get_sign_up_fee( $variation );
			} elseif ( property_exists( $variation, 'subscription_sign_up_fee' ) ) {
				$this->variations_subscription_sign_up_fee[ $child_id ] = $variation->subscription_sign_up_fee;
			}
		} else {
			$this->variations_subscription_period[ $child_id ]      = '';
			$this->variations_subscription_sign_up_fee[ $child_id ] = '';
		}
	}

	/**
	 * Add string setting
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_string( $settings ) {
		$inserted = [
			[
				'title'   => esc_html__( 'Subscription sign up fee text', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter the Subscription sign up fee text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_subscription_fee_text',
				'default' => '',
				'type'    => 'text',
				'class'   => 'tcsgeneral',
			],
			[
				'title'   => esc_html__( 'Sign up fee text', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enter the Sign up fee text or leave blank for default.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_signup_fee_text',
				'default' => '',
				'type'    => 'text',
				'class'   => 'tcsgeneral',
			],
		];
		array_splice( $settings, count( $settings ) - 1, 0, $inserted );

		return $settings;
	}

	/**
	 * Flag subscription renewal
	 *
	 * @param array<mixed> $order_items Order items.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function woocommerce_subscriptions_renewal_order_items( $order_items ) {
		if ( ! defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
			define( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL', 1 );
		}

		return $order_items;
	}

	/**
	 * Flag subscription renewal
	 *
	 * @return void
	 * @since 4.9.7
	 */
	public function wcs_before_renewal_setup_cart_subscriptions() {
		if ( ! defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
			define( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL', 1 );
		}
	}

	/**
	 * Calculates the extra Subscription sign up fee
	 *
	 * @param float|string     $subscription_sign_up_fee The value of the sign-up fee,
	 *                         or 0 if the product is not a subscription or the
	 *                         subscription has no sign-up fee.
	 * @param false|WC_Product $product A WC_Product object.
	 * @return float|string
	 * @since 1.0
	 */
	public function woocommerce_subscriptions_product_sign_up_fee( $subscription_sign_up_fee = '', $product = false ) {
		$options_fee = 0;

		if ( ! is_admin() && WC()->cart && false !== $product ) { // @phpstan-ignore-line
			$cart_contents = WC()->cart->cart_contents;
			if ( $cart_contents && ! is_product() ) {
				$product_id = $product->get_id();
				foreach ( $cart_contents as $cart_key => $cart_item ) {
					if ( is_object( $cart_item['data'] ) && is_a( $cart_item['data'], 'WC_Product' ) ) {
						$current_product_id = $cart_item['data']->get_id();
						if ( $current_product_id !== $product_id ) {
							continue;
						}
						foreach ( $cart_item as $key => $data ) {
							if ( 'tmsubscriptionfee' === $key ) {
								$options_fee = $data;
							}
						}
					}
				}
				$subscription_sign_up_fee += $options_fee;
			}
		}

		return $subscription_sign_up_fee;
	}

	/**
	 * Add data to main element array in the builder
	 *
	 * [subscription_fee_type] = can set subscription fees
	 *
	 * @param array<mixed> $data Array of data.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_builder_element_settings( $data = [] ) {
		foreach ( $data as $key => $value ) {
			switch ( $key ) {

				case 'date':
				case 'time':
				case 'range':
				case 'color':
				case 'textarea':
				case 'textfield':
				case 'upload':
					$data[ $key ]->subscription_fee_type = 'single';
					break;

				case 'selectbox':
				case 'radiobuttons':
				case 'checkboxes':
				case 'multiple_file_upload':
					$data[ $key ]->subscription_fee_type = 'multiple';
					break;

				case 'header':
				case 'divider':
				case 'variations':
				default:
					$data[ $key ]->subscription_fee_type = '';
					break;
			}
		}

		return $data;
	}

	/**
	 * Initial value for the set_elements function
	 *
	 * @param array<mixed> $options Array of settings.
	 * @return array<mixed>
	 * @see   THEMECOMPLETE_EPO_BUILDER_Base->set_elements
	 * @since 4.8
	 */
	public function wc_epo_set_elements_options( $options = [] ) {
		if ( ! isset( $options['subscription_fee_type'] ) ) {
			$options['subscription_fee_type'] = '';
		}

		return $options;
	}

	/**
	 * Alter price type
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function tc_element_settings_override( $settings = [] ) {
		$fee = array_search( 'fee', $settings, true );
		if ( false !== $fee && null !== $fee ) {
			array_splice( $settings, intval( $fee ), 0, 'subscriptionfee' );
		}

		return $settings;
	}

	/**
	 * Alter price type
	 *
	 * @param mixed  $class_obj Class to use.
	 * @param string $key Setting key.
	 * @param mixed  $value Setting value.
	 * @return mixed
	 * @since 5.0
	 */
	public function wc_epo_add_element_class( $class_obj, $key, $value ) {
		if ( 'subscriptionfee' === $value ) {
			$class_obj = $this;
		}

		return $class_obj;
	}

	/**
	 * Subscription sign up fee setting
	 *
	 * @param string       $name Element name.
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function add_setting_subscriptionfee( $name = '', $args = [] ) {
		return array_merge(
			[
				'id'          => $name . '_subscriptionfee',
				'wpmldisable' => 1,
				'default'     => '',
				'type'        => 'checkbox',
				'tags'        => [
					'class' => 'c',
					'id'    => 'builder_' . $name . '_subscriptionfee',
					'name'  => 'tm_meta[tmfbuilder][' . $name . '_subscriptionfee][]',
					'value' => '1',
				],
				'label'       => esc_html__( 'Subscription sign up fee', 'woocommerce-tm-extra-product-options' ),
			],
			$args
		);
	}

	/**
	 * Subscription sign up fee setting for checkboxes
	 *
	 * @param array<mixed> $o Array of settings.
	 * @param string       $name Element name.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_builder_after_multiple_element_array( $o = [], $name = '' ) {
		$o['subscriptionfee'] = [
			'id'      => $name . '_subscriptionfee',
			'default' => '',
			'type'    => 'checkbox',
			'nodiv'   => 1,
			'tags'    => [
				'class' => 'c',
				'id'    => $name . '_subscriptionfee',
				'name'  => $name . '_subscriptionfee',
				'value' => '1',
			],
		];

		return $o;
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed>      $options Array of options.
	 * @param array<mixed>|null $o Array of options.
	 * @param integer|null      $ar Option counter.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_builder_element_array_in_loop_before( $options = [], $o = null, $ar = null ) {
		if ( isset( $options['price_type'][ $ar ] ) && 'subscriptionfee' === $options['price_type'][ $ar ] ) {
			$options['price_type'][ $ar ]      = '';
			$options['subscriptionfee'][ $ar ] = '1';
		}

		return $options;
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed>      $o Array of options.
	 * @param array<mixed>|null $options Array of options.
	 * @param integer|null      $ar Option counter.
	 * @param string|null       $name Option name.
	 * @param integer|null      $counter Counter.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_builder_element_array_in_loop_after( $o = [], $options = null, $ar = null, $name = null, $counter = null ) {
		if ( ! isset( $options['subscriptionfee'][ $ar ] ) ) {
			$options['subscriptionfee'][ $ar ] = '';
		}

		$o['subscriptionfee']['default']      = $options['subscriptionfee'][ $ar ];// subscriptionfee.
		$o['subscriptionfee']['tags']['name'] = 'tm_meta[tmfbuilder][' . $name . '_subscriptionfee][' . ( is_null( $counter ) ? 0 : $counter ) . '][]';
		$o['subscriptionfee']['tags']['id']   = str_replace( [ '[', ']' ], '', $o['subscriptionfee']['tags']['name'] ) . '_' . $ar;

		return $o;
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed> $o Array of options.
	 * @return void
	 * @since 5.0
	 */
	public function wc_epo_builder_element_multiple_checkboxes_options( $o = [] ) {
		echo "<div class='tc-cell tc-col-12 tm_cell_subscriptionfee'><span class='tm-inline-label bsbb'>" . esc_html__( 'Subscription sign up fee', 'woocommerce-tm-extra-product-options' ) . '</span>';
		THEMECOMPLETE_EPO_HTML()->create_field( $o['subscriptionfee'], 1 );
		echo '</div>';
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed>      $js_object JS array to of settings.
	 * @param integer|null      $d_counter Counter.
	 * @param array<mixed>|null $o Array of options.
	 * @param string|null       $name Option name.
	 * @param integer|null      $counter Counter.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_builder_element_multiple_checkboxes_options_js_object( $js_object = [], $d_counter = null, $o = null, $name = null, $counter = null ) {
		$js_object[ $d_counter ][] = [
			'id'      => $name . '_subscriptionfee',
			'default' => (string) $o['subscriptionfee']['default'],
			'checked' => (string) $o['subscriptionfee']['default'] === (string) $o['subscriptionfee']['tags']['value'],
			'type'    => 'checkbox',
			'tags'    => [
				'name'  => 'tm_meta[tmfbuilder][' . $name . '_subscriptionfee][' . ( is_null( $counter ) ? 0 : $counter ) . '][]',
				'value' => $o['subscriptionfee']['tags']['value'],
			],
		];

		return $js_object;
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed>      $obvalues Array of arguments.
	 * @param array<mixed>|null $builder The element builder.
	 * @param array<mixed>|null $value Array of settings.
	 * @param array<mixed>|null $current_builder The current element builder.
	 * @param array<mixed>|null $_titles_base The titles of the elements.
	 * @param mixed             $_option_key The index of element id in internal array.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_obvalues( $obvalues = [], $builder = null, $value = null, $current_builder = null, $_titles_base = null, $_option_key = null ) {
		$_subscriptionfee_base = isset( $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ] )
			? $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ]
			: null;

		if ( is_null( $_subscriptionfee_base ) ) {
			$_subscriptionfee_base = array_map( [ $this, 'clear_array_values' ], $_titles_base );
		}

		if ( ! isset( $_subscriptionfee_base[ $_option_key ] ) ) {
			$_subscriptionfee_base[ $_option_key ] = array_map( [ $this, 'clear_array_values' ], $_titles_base[ $_option_key ] );
		}

		$obvalues['subscriptionfee'] = $_subscriptionfee_base[ $_option_key ];

		return $obvalues;
	}

	/**
	 * Clear array values
	 *
	 * @param mixed $val Value to clear.
	 * @return mixed
	 * @since 1.0
	 * @access private
	 */
	private function clear_array_values( $val ) {
		if ( is_array( $val ) ) {
			return array_map( [ $this, 'clear_array_values' ], $val );
		} else {
			return '';
		}
	}

	/**
	 * Setup Subscription sign up fee setting for checkboxes in loop
	 *
	 * @param array<mixed>      $cbvalues Array of arguments.
	 * @param array<mixed>|null $builder The element builder.
	 * @param array<mixed>|null $value Array of settings.
	 * @param array<mixed>|null $current_builder The current element builder.
	 * @param array<mixed>|null $_titles_base The titles of the elements.
	 * @param mixed|null        $_option_key The index of element id in internal array.
	 * @param mixed|null        $option_key The current key for the $_titles_base array.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_cbvalues( $cbvalues = [], $builder = null, $value = null, $current_builder = null, $_titles_base = null, $_option_key = null, $option_key = null ) {
		$_subscriptionfee_base = isset( $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ] )
			? $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ]
			: null;
		$_subscriptionfee      = isset( $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ] )
			? ( isset( $current_builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ] )
				? $current_builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ]
				: $builder[ 'multiple_' . $value['id'] . '_subscriptionfee' ] )
			: null;

		if ( is_null( $_subscriptionfee_base ) ) {
			$_subscriptionfee_base = array_map( [ $this, 'clear_array_values' ], $_titles_base );
		}
		if ( is_null( $_subscriptionfee ) ) {
			$_subscriptionfee = $_subscriptionfee_base;
		}

		if ( ! isset( $_subscriptionfee_base[ $_option_key ] ) ) {
			$_subscriptionfee_base[ $_option_key ] = array_map( [ $this, 'clear_array_values' ], $_titles_base[ $_option_key ] );
		}

		if ( ! isset( $_subscriptionfee[ $_option_key ] ) ) {
			$_subscriptionfee[ $_option_key ] = array_map( [ $this, 'clear_array_values' ], $_titles_base[ $_option_key ] );
		}

		$cbvalues['subscriptionfee'] = THEMECOMPLETE_EPO_HELPER()->build_array( $_subscriptionfee[ $_option_key ], $_subscriptionfee_base[ $option_key ] );

		return $cbvalues;
	}

	/**
	 * Skip altering order get_items
	 *
	 * @param boolean $ret true or false.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_no_order_get_items( $ret = false ) {
		if ( defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
			$ret = true;
		}

		return $ret;
	}

	/**
	 * Skip altering add to cart
	 *
	 * @param boolean $ret true or false.
	 * @return boolean
	 * @since 4.9.7
	 */
	public function wc_epo_no_add_cart_item( $ret = false ) {
		if ( defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
			$ret = true;
		}

		return $ret;
	}

	/**
	 * Skip altering order again
	 *
	 * @param boolean $ret true or false.
	 * @return boolean
	 * @since 4.9.7
	 */
	public function wc_epo_no_order_again_cart_item_data( $ret = false ) {
		if ( defined( 'THEMECOMPLETE_IS_SUBSCRIPTIONS_RENEWAL' ) ) {
			$ret = true;
		}

		return $ret;
	}

	/**
	 * Skip cart item loop
	 *
	 * @param boolean      $ret true or false.
	 * @param array<mixed> $tmcp Element array.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_add_cart_item_loop( $ret = false, $tmcp = [] ) {
		if ( isset( $tmcp['subscription_fees'] ) ) {
			$ret = true;
		}

		return $ret;
	}

	/**
	 * Alter the cart from session
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @param array<mixed> $values Array values.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_get_cart_item_from_session( $cart_item = [], $values = [] ) {
		if ( ! empty( $values['tmsubscriptionfee'] ) ) {
			$cart_item['tmsubscriptionfee'] = $values['tmsubscriptionfee'];
		}

		return $cart_item;
	}

	/**
	 * Edit cart link product types
	 *
	 * @param array<mixed> $types Array of product types.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_can_be_edited_product_type( $types = [] ) {
		$types[] = 'subscription';
		$types[] = 'variable-subscription';

		return $types;
	}

	/**
	 * Pre-init cart item
	 *
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_add_cart_item_data_helper( $cart_item_meta = [] ) {
		if ( empty( $cart_item_meta['tmsubscriptionfee'] ) ) {
			$cart_item_meta['tmsubscriptionfee'] = 0;
		}

		return $cart_item_meta;
	}

	/**
	 * Add field data to cart (subscription fees)
	 *
	 * @param array<mixed>                  $cart_item_meta Cart item meta data.
	 * @param THEMECOMPLETE_EPO_FIELDS|null $field_obj Element field class.
	 * @param array<mixed>                  $tmcp_post_fields Array of posted fields.
	 * @param array<mixed>                  $element The element array.
	 * @param integer                       $field_loop The field loop index.
	 * @param string                        $form_prefix The form prefix.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_add_cart_item_data_loop( $cart_item_meta = [], $field_obj = null, $tmcp_post_fields = [], $element = [], $field_loop = 0, $form_prefix = '' ) {
		$current_tmcp_post_fields = array_intersect_key(
			$tmcp_post_fields,
			array_flip(
				THEMECOMPLETE_EPO()->get_post_names(
					$element['options'],
					$element['type'],
					$field_loop,
					$form_prefix,
					$this->subscription_fee_name,
					$element
				)
			)
		);

		$holder_subscription_fees = THEMECOMPLETE_EPO()->tm_builder_elements[ $field_obj->element['type'] ]->subscription_fee_type;

		foreach ( $current_tmcp_post_fields as $attribute => $key ) {

			if ( ! empty( $holder_subscription_fees ) ) {
				if ( isset( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
					if ( empty( $tmcp_post_fields[ $attribute . '_quantity' ] ) ) {
						continue;
					}
				}
				$meta = false;
				if ( $field_obj->is_setup() ) {
					$field_obj->attribute = $attribute;
					$field_obj->key       = $key;

					// Add field data to cart (subscription fees single).
					if ( 'single' === $holder_subscription_fees ) {
						if ( isset( $field_obj->key ) && '' !== $field_obj->key ) {
							$_price                   = THEMECOMPLETE_EPO()->calculate_price( $field_obj->post_data, $field_obj->element, $field_obj->key, $field_obj->attribute, 1, $field_obj->key_id, $field_obj->keyvalue_id, $field_obj->per_product_pricing, $field_obj->cpf_product_price, $field_obj->variation_id );
							$this->subscription_tmfee = $this->subscription_tmfee + (float) $_price;
							$meta                     = [
								'mode'                   => 'builder',
								'cssclass'               => $field_obj->element['class'],
								'include_tax_for_fee_price_type' => $field_obj->element['include_tax_for_fee_price_type'],
								'tax_class_for_fee_price_type' => $field_obj->element['tax_class_for_fee_price_type'],
								'hidelabelincart'        => $field_obj->element['hide_element_label_in_cart'],
								'hidevalueincart'        => $field_obj->element['hide_element_value_in_cart'],
								'hidelabelinorder'       => $field_obj->element['hide_element_label_in_order'],
								'hidevalueinorder'       => $field_obj->element['hide_element_value_in_order'],
								'shippingmethodsenable'  => $field_obj->element['shipping_methods_enable'],
								'shippingmethodsenablelogicrules' => $field_obj->element['shipping_methods_enable_logicrules'],
								'shippingmethodsdisable' => $field_obj->element['shipping_methods_disable'],
								'shippingmethodsdisablelogicrules' => $field_obj->element['shipping_methods_disable_logicrules'],
								'element'                => $field_obj->order_saved_element,
								'name'                   => $field_obj->element['label'],
								'value'                  => $field_obj->key,
								'post_name'              => $field_obj->attribute,
								'price'                  => 0,
								'section'                => $field_obj->element['uniqid'],
								'section_label'          => $field_obj->element['label'],
								'percentcurrenttotal'    => 0,
								'fixedcurrenttotal'      => 0,
								'currencies'             => isset( $field_obj->element['currencies'] ) ? $field_obj->element['currencies'] : [],
								'price_per_currency'     => $field_obj->fill_currencies( 1 ),
								'quantity'               => 1,

								'subscription_fees'      => 'single',
							];

						}

						// Add field data to cart (subscription fees multiple).
					} elseif ( 'multiple' === $holder_subscription_fees ) {
						// select box placeholder check.
						if ( isset( $field_obj->element['options'][ esc_attr( $field_obj->key ) ] ) ) {
							$_price = THEMECOMPLETE_EPO()->calculate_price( $field_obj->post_data, $field_obj->element, $field_obj->key, $field_obj->attribute, 1, $field_obj->key_id, $field_obj->keyvalue_id, $field_obj->per_product_pricing, $field_obj->cpf_product_price, $field_obj->variation_id );

							$use_images = ( 'image' === $field_obj->element['replacement_mode'] ) ? ( 'center' === $field_obj->element['swatch_position'] ? 'images' : $field_obj->element['swatch_position'] ) : '';

							if ( $use_images ) {
								$_image_key = array_search( $field_obj->key, $field_obj->element['option_values'] ); // phpcs:ignore WordPress.PHP.StrictInArray
								if ( null === $_image_key || false === $_image_key ) {
									$_image_key = false;
								}
							} else {
								$_image_key = false;
							}

							$use_colors = ( 'color' === $field_obj->element['replacement_mode'] ) ? ( 'center' === $field_obj->element['swatch_position'] ? 'color' : $field_obj->element['swatch_position'] ) : '';
							if ( $use_colors ) {
								$_color_key = array_search( $field_obj->key, $field_obj->element['option_values'] ); // phpcs:ignore WordPress.PHP.StrictInArray
								if ( null === $_color_key || false === $_color_key ) {
									$_color_key = false;
								}
							} else {
								$_color_key = false;
							}

							$this->subscription_tmfee = $this->subscription_tmfee + (float) $_price;

							$meta = [
								'mode'                   => 'builder',
								'cssclass'               => $field_obj->element['class'],
								'include_tax_for_fee_price_type' => $field_obj->element['include_tax_for_fee_price_type'],
								'tax_class_for_fee_price_type' => $field_obj->element['tax_class_for_fee_price_type'],
								'hidelabelincart'        => $field_obj->element['hide_element_label_in_cart'],
								'hidevalueincart'        => $field_obj->element['hide_element_value_in_cart'],
								'hidelabelinorder'       => $field_obj->element['hide_element_label_in_order'],
								'hidevalueinorder'       => $field_obj->element['hide_element_value_in_order'],
								'shippingmethodsenable'  => $field_obj->element['shipping_methods_enable'],
								'shippingmethodsenablelogicrules' => $field_obj->element['shipping_methods_enable_logicrules'],
								'shippingmethodsdisable' => $field_obj->element['shipping_methods_disable'],
								'shippingmethodsdisablelogicrules' => $field_obj->element['shipping_methods_disable_logicrules'],
								'element'                => $field_obj->order_saved_element,
								'name'                   => $field_obj->element['label'],
								'value'                  => $field_obj->element['options'][ esc_attr( $field_obj->key ) ],
								'post_name'              => $field_obj->attribute,
								'price'                  => 0,
								'section'                => $field_obj->element['uniqid'],
								'section_label'          => $field_obj->element['label'],
								'percentcurrenttotal'    => 0,
								'fixedcurrenttotal'      => 0,
								'currencies'             => isset( $field_obj->element['currencies'] ) ? $field_obj->element['currencies'] : [],
								'price_per_currency'     => $field_obj->fill_currencies( 1 ),
								'quantity'               => 1,

								'subscription_fees'      => 'multiple',
								'multiple'               => '1',
								'key'                    => esc_attr( $field_obj->key ),
								'use_images'             => $use_images,
								'use_colors'             => $use_colors,
								'color'                  => ( false !== $_color_key && isset( $field_obj->element['color'][ $_color_key ] ) ) ? ( empty( $field_obj->element['color'][ $_color_key ] ) ? 'transparent' : $field_obj->element['color'][ $_color_key ] ) : '',
								'changes_product_image'  => ! empty( $field_obj->element['changes_product_image'] ) ? $field_obj->element['changes_product_image'] : '',
								'images'                 => ( false !== $_image_key && isset( $field_obj->element['images'][ $_image_key ] ) ) ? $field_obj->element['images'][ $_image_key ] : '',
								'imagesc'                => ( false !== $_image_key && isset( $field_obj->element['imagesc'][ $_image_key ] ) && ! empty( $field_obj->element['imagesc'][ $_image_key ] ) ) ? $field_obj->element['imagesc'][ $_image_key ] : '',
								'imagesp'                => ( false !== $_image_key && isset( $field_obj->element['imagesp'][ $_image_key ] ) ) ? $field_obj->element['imagesp'][ $_image_key ] : '',
							];

						}
					}
				}

				if ( is_array( $meta ) ) {
					$cart_item_meta['tmcartepo'][]                = $meta;
					$cart_item_meta['tmdata']['tmcartepo_data'][] = [
						'key'       => $key,
						'attribute' => $attribute,
					];
				}
			}
			$cart_item_meta['tmsubscriptionfee'] = $this->subscription_tmfee;
		}

		return $cart_item_meta;
	}

	/**
	 * No options in cart check
	 *
	 * @param boolean      $ret true or false.
	 * @param array<mixed> $cart_item The cart item.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_no_epo_in_cart( $ret = false, $cart_item = [] ) {
		$ret = $ret && empty( $cart_item['tmsubscriptionfee'] );
		return $ret;
	}

	/**
	 * Field pre validation
	 *
	 * @param array<mixed> $field_names The form prefix.
	 * @param mixed        $element_field_class The element field class.
	 * @param array<mixed> $element The element array.
	 * @param integer      $loop The current loop index.
	 * @param string       $form_prefix The form prefix.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_validate_field_field_names( $field_names, $element_field_class, $element, $loop, $form_prefix ) {
		$subscription_field_names = THEMECOMPLETE_EPO()->get_post_names( $element['options'], $element['type'], $loop, $form_prefix, $this->subscription_fee_name, $element );

		$is_subscription_fee = false;
		if ( is_array( $element['is_subscription_fee'] ) ) {
			$is_subscription_fee = in_array( true, $element['is_subscription_fee'], true );
		} elseif ( ! is_array( $element['is_cart_fee'] ) ) {
			$is_subscription_fee = $element['is_subscription_fee'];
		}

		if ( $is_subscription_fee ) {
			$element_field_class->data_store['tmcp_attributes_subscription_fee'] = $subscription_field_names;
		}

		return $field_names;
	}

	/**
	 * Validate checkbox
	 *
	 * @param boolean $fail true or false.
	 * @param object  $element_field_class Field class.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_validate_checkbox( $fail, $element_field_class ) {
		if ( $element_field_class instanceof THEMECOMPLETE_EPO_FIELDS ) {
			$field_names = isset( $element_field_class->data_store['tmcp_attributes_subscription_fee'] ) ? $element_field_class->data_store['tmcp_attributes_subscription_fee'] : [];
			$check3      = array_intersect( $field_names, array_keys( $element_field_class->epo_post_fields ) );
			$fail3       = empty( $check3 );
			$fail        = $fail && $fail3;
		}

		return $fail;
	}

	/**
	 * Validate radio button
	 *
	 * @param boolean $validate true or false.
	 * @param object  $element_field_class Field class.
	 * @param integer $index Element index.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_validate_radiobutton( $validate, $element_field_class, $index ) {
		if ( $element_field_class instanceof THEMECOMPLETE_EPO_FIELDS ) {
			$is_subscription_fee = $element_field_class->element['is_subscription_fee'][ $index ];

			if ( $is_subscription_fee ) {
				if ( ! isset( $element_field_class->epo_post_fields[ $element_field_class->data_store['tmcp_attributes_subscription_fee'][ $index ] ] ) ) {
					$validate = true;
				}
			}
		}

		return $validate;
	}

	/**
	 * Alternative radio button check
	 *
	 * @param boolean $is_alt true or false.
	 * @param object  $element_field_class Field class.
	 * @param integer $index Element index.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_alt_validate_radiobutton( $is_alt, $element_field_class, $index ) {
		if ( $element_field_class instanceof THEMECOMPLETE_EPO_FIELDS ) {
			$is_subscription_fee = $element_field_class->element['is_subscription_fee'][ $index ];

			if ( $is_subscription_fee ) {
				$is_alt = true;
			}
		}

		return $is_alt;
	}

	/**
	 * Alter HTML name
	 *
	 * @param string       $name_inc The HTML name.
	 * @param string       $base_name_inc The base HTML name.
	 * @param array<mixed> $element The element array.
	 * @param mixed|null   $value The current $element['options'] array key.
	 * @param integer|null $choice_counter The choice counter.
	 * @param integer|null $element_counter The element counter.
	 * @return string
	 * @since 4.8
	 */
	public function wc_epo_name_inc( $name_inc = '', $base_name_inc = '', $element = [], $value = null, $choice_counter = null, $element_counter = null ) {
		$is_subscription_fee = false;
		$element_object      = THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ];

		if ( 'post' === $element_object->is_post ) {

			if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

				if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type ) {

					$key           = $element['type'] . '_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[0] );

				} elseif ( 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

					$key = $element['type'] . '_subscriptionfee';
					if ( 'select' === $element['type'] ) {
						$key = 'selectbox_subscriptionfee';
					}
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ] );
				}
			} elseif ( 'multipleall' === $element_object->type || 'multiple' === $element_object->type ) {

				if ( 'checkbox' === $element['type'] ) {
					$key           = 'multiple_checkboxes_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				} elseif ( 'radio' === $element['type'] ) {
					$key           = 'radiobuttons_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ] );
				} else {
					$key           = 'multiple_' . $element['type'] . '_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				}
			}
		}

		if ( $is_subscription_fee ) {
			$subscription_fee_name = $this->subscription_fee_name;
			$name_inc              = $subscription_fee_name . $name_inc;
		}

		return $name_inc;
	}

	/**
	 * Alter fieldtype key of the element in the template arguments
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @param array<mixed> $element The element array.
	 * @param mixed|null   $value The current $element['options'] array key.
	 * @param integer|null $choice_counter The choice counter.
	 * @param integer|null $element_counter The element counter.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_display_template_args( $args = [], $element = [], $value = null, $choice_counter = null, $element_counter = null ) {
		$is_subscription_fee = false;
		$element_object      = THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ];

		if ( 'post' === $element_object->is_post ) {

			if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

				if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

					$key           = $element['type'] . '_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[0] );

				} elseif ( 'multiplesingle' === $element_object->type ) {

					$key = $element['type'] . '_subscriptionfee';
					if ( 'select' === $element['type'] ) {
						$key = 'selectbox_subscriptionfee';
					}
					$builder_value       = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;
					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ] );
				}
			} elseif ( 'multipleall' === $element_object->type || 'multiple' === $element_object->type ) {

				if ( 'checkbox' === $element['type'] ) {
					$key           = 'multiple_checkboxes_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				} elseif ( 'radio' === $element['type'] ) {
					$key           = 'radiobuttons_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ] );
				} else {
					$key           = 'multiple_' . $element['type'] . '_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				}
			}
		}

		if ( $is_subscription_fee && isset( $args['fieldtype'] ) ) {
			$args['fieldtype']     = $this->subscription_fee_name_class;
			$changes_product_image = empty( $element['changes_product_image'] ) ? '' : $element['changes_product_image'];
			if ( ! empty( $changes_product_image ) ) {
				$args['fieldtype'] = $args['fieldtype'] . ' tm-product-image';
			}
		}

		return $args;
	}

	/**
	 * Gets the stored cart data for the order again functionality
	 *
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @param array<mixed> $item Item data.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function wc_epo_woocommerce_order_again_cart_item_data( $cart_item_meta = [], $item = [] ) {
		$_backup_cart = isset( $item['item_meta']['tmsubscriptionfee_data'] ) ? $item['item_meta']['tmsubscriptionfee_data'] : false;
		if ( ! $_backup_cart ) {
			$_backup_cart = isset( $item['item_meta']['_tmsubscriptionfee_data'] ) ? $item['item_meta']['_tmsubscriptionfee_data'] : false;
		}
		if ( $_backup_cart && is_array( $_backup_cart ) && isset( $_backup_cart[0] ) ) {
			if ( is_string( $_backup_cart[0] ) ) {
				$_backup_cart = themecomplete_maybe_unserialize( $_backup_cart[0] );
			}
			$cart_item_meta['tmsubscriptionfee'] = $_backup_cart[0];
		}

		return $cart_item_meta;
	}

	/**
	 * Check for if the cart key for subscriptions exists
	 *
	 * @param boolean      $has_epo true or false..
	 * @param array<mixed> $cart_item_meta Cart item meta data.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_woocommerce_order_again_cart_item_data_has_epo( $has_epo = false, $cart_item_meta = [] ) {
		return $has_epo || isset( $cart_item_meta['tmsubscriptionfee'] );
	}

	/**
	 * Adds meta data to the order
	 *
	 * @param WC_Order_Item $item The order item.
	 * @param string        $cart_item_key Cart item key.
	 * @param array<mixed>  $values Array of values.
	 * @return void
	 * @since 4.8
	 */
	public function wc_epo_order_item_meta( $item, $cart_item_key, $values = [] ) {
		if ( ! empty( $values['tmsubscriptionfee'] ) ) {
			$order        = THEMECOMPLETE_EPO_HELPER()->tm_get_order_object();
			$currency_arg = [];
			if ( $order ) {
				$currency_arg = [ 'currency' => $order->get_currency() ];
			}
			$item->add_meta_data( '_tmsubscriptionfee_data', [ $values['tmsubscriptionfee'] ] );
			$item->add_meta_data( apply_filters( 'wc_epo_options_subscription_fee_text', ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_subscription_fee_text' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_subscription_fee_text' ) : esc_html__( 'Options Subscription fee', 'woocommerce-tm-extra-product-options' ) ) ), wc_price( $values['tmsubscriptionfee'], $currency_arg ) );
		}
	}

	/**
	 * Alter global epo table
	 * Used inTHEMECOMPLETE_Extra_Product_Options->fill_builder_display
	 * $global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter )
	 *
	 * @param array<mixed> $global_epos Array of EPOs.
	 * @param integer      $priority Priority.
	 * @param integer      $pid id.
	 * @param integer      $_s section id.
	 * @param integer      $arr_element_counter Element counter.
	 * @param array<mixed> $element Element array.
	 * @param integer      $value $element['options'] key.
	 * @param integer      $choice_counter Choice counter.
	 * @param integer      $element_counter Element counter.
	 * @return array<mixed>
	 * @since 4.8
	 */
	public function global_epos_fill_builder_display( $global_epos, $priority, $pid, $_s, $arr_element_counter, $element, $value, $choice_counter, $element_counter ) {
		$is_subscription_fee = false;

		$element_object = THEMECOMPLETE_EPO()->tm_builder_elements[ $element['type'] ];

		if ( 'post' === $element_object->is_post ) {

			if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

				if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {
					$key           = $element['type'] . '_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[0] );
				} elseif ( 'multiplesingle' === $element_object->type ) {
					$key = $element['type'] . '_subscriptionfee';
					if ( 'select' === $element['type'] ) {
						$key = 'selectbox_subscriptionfee';
					}
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[0] );
				}

				$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['is_subscription_fee'] = $is_subscription_fee;

			} elseif ( 'multipleall' === $element_object->type || 'multiple' === $element_object->type ) {

				if ( 'checkbox' === $element['type'] ) {
					$key           = 'multiple_checkboxes_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				} elseif ( 'radio' === $element['type'] ) {
					$key           = 'radiobuttons_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[0] );
				} else {
					$key           = 'multiple_' . $element['type'] . '_options_subscriptionfee';
					$builder_value = isset( $element['builder'][ $key ] ) ? $element['builder'][ $key ] : false;

					$is_subscription_fee = ! empty( $builder_value ) && ! empty( $builder_value[ $element_counter ][ $choice_counter ] );
				}

				$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['is_subscription_fee'][] = $is_subscription_fee;

			}
		}

		return $global_epos;
	}

	/**
	 * Check for subscription fee typewhen displaying options on admin Order page
	 *
	 * @param boolean $ret true or false.
	 * @param string  $type Element price type.
	 * @return boolean
	 * @since 4.8
	 */
	public function wc_epo_html_tm_epo_order_item_is_other_fee( $ret, $type ) {
		if ( 'subscriptionfee' === $type ) {
			$ret = true;
		}

		return $ret;
	}

	/**
	 * Alter the array of data for a variation. Used in the add to cart form.
	 *
	 * @param mixed  $data Array of arguments.
	 * @param string $class_obj The WC_Product_Variable class.
	 * @param mixed  $variation The variation product.
	 * @return mixed
	 * @since 4.8
	 */
	public function woocommerce_available_variation( $data, $class_obj, $variation ) {
		if ( is_array( $data ) ) {

			if ( class_exists( 'WC_Subscriptions_Product' ) ) {

				$subscription_period = WC_Subscriptions_Product::get_price_string(
					$variation,
					[
						'subscription_price' => false,
						'sign_up_fee'        => false,
						'trial_length'       => false,
						'price'              => null,
					]
				);
				if ( is_callable( [ 'WC_Subscriptions_Product', 'get_sign_up_fee' ] ) ) {
					$subscription_sign_up_fee = WC_Subscriptions_Product::get_sign_up_fee( $variation );
				} else {
					$subscription_sign_up_fee = $variation->subscription_sign_up_fee;
				}
			} else {
				$subscription_sign_up_fee = '';
				$subscription_period      = '';
			}

			$data['tc_subscription_period']      = $subscription_period;
			$data['tc_subscription_sign_up_fee'] = $subscription_sign_up_fee;

		}

		return $data;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-easy-bookings.php000064400000031163150755142450023274 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce Easy Booking
 * https://wordpress.org/plugins/woocommerce-easy-booking-system/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Easy_Bookings {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Easy_Bookings|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Easy_Bookings
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'Easy_booking' ) ) {
			return;
		}
		add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
		add_filter( 'wc_epo_cart_options_prices_before', [ $this, 'wc_epo_cart_options_prices_before' ], 10, 2 );
		add_filter( 'easy_booking_set_booking_price', [ $this, 'easy_booking_set_booking_price' ], 10, 2 );
		add_filter( 'wc_epo_adjust_cart_item', [ $this, 'wc_epo_adjust_cart_item' ], 10, 1 );
		add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
		add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );

		add_filter( 'easy_booking_get_new_item_price', [ $this, 'easy_booking_get_new_item_price' ], 10, 4 );
		add_filter( 'easy_booking_one_date_price', [ $this, 'easy_booking_one_two_date_price' ], 10, 4 );
		add_filter( 'easy_booking_two_dates_price', [ $this, 'easy_booking_one_two_date_price' ], 10, 4 );
		add_filter( 'easy_booking_fragments', [ $this, 'easy_booking_fragments' ], 10, 1 );

		// >=2.09
		add_filter( 'easy_booking_booking_price_details', [ $this, 'easy_booking_booking_price_details' ], 10, 3 );
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( class_exists( 'Easy_booking' ) ) {
			$settings['tm_epo_easy_bookings_block'] = 'yes';
		}

		return $settings;
	}

	/**
	 * Alter cart fragments.
	 *
	 * @param array<mixed> $fragments the cart fragments.
	 * @return array<mixed>
	 */
	public function easy_booking_fragments( $fragments ) {
		$epo_price                   = floatval( THEMECOMPLETE_EPO_DATA_STORE()->get( 'easy_bookings_epo_price' ) );
		$booking_price               = $fragments['booking_price'] + $epo_price;
		$fragments['booking_price']  = $booking_price;
		$fragments['epo_price']      = $epo_price;
		$fragments['epo_duration']   = THEMECOMPLETE_EPO_DATA_STORE()->get( 'easy_bookings_duration' );
		$fragments['epo_base_price'] = $booking_price;
		if ( 'disable' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_box' ) ) {
			$fragments['epo_base_price'] = $booking_price - $epo_price;
		}

		return $fragments;
	}

	/**
	 * Alter booking details
	 *
	 * @param string       $details The booking details.
	 * @param object       $product The product object.
	 * @param array<mixed> $booking_data The booking data array.
	 * @return string
	 */
	public function easy_booking_booking_price_details( $details, $product, $booking_data ) {
		$extra_price = 0;
		if ( isset( $_REQUEST['epo_data'] ) && 'disable' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_box' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$posted = [];
			parse_str( wp_unslash( $_REQUEST['epo_data'] ), $posted ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$epos = THEMECOMPLETE_EPO_CART()->tm_add_cart_item_data( [], themecomplete_get_id( $product ), $posted );

			$wc_booking_block_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_easy_bookings_block' ) ) ? 1 : 0;
			if ( ! empty( $epos ) && ! empty( $epos['tmcartepo'] ) ) {
				foreach ( $epos['tmcartepo'] as $key => $value ) {
					if ( ! empty( $value['price'] ) ) {

						$price        = floatval( $value['price'] );
						$option_price = 0;
						$duration     = $booking_data['duration'];

						if ( ! empty( $wc_booking_block_qty_multiplier ) && ! empty( $duration ) ) {
							$option_price += $price * $duration;
						}
						if ( ! $option_price ) {
							$option_price += $price;
						}
						$extra_price += $option_price;
					}
				}
			}
		}

		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_duration', $booking_data['duration'] );
		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_epo_price', $extra_price );

		return $details;
	}

	/**
	 * Save booking data
	 *
	 * @param float        $booking_price The booking price.
	 * @param object       $product The product object.
	 * @param object       $_product The child product object.
	 * @param array<mixed> $data The booking data.
	 * @return float
	 */
	public function easy_booking_one_two_date_price( $booking_price, $product, $_product, $data ) {
		$extra_price = 0;
		$duration    = $data['duration'];
		if ( isset( $_REQUEST['epo_data'] ) && 'disable' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_box' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$posted = [];
			parse_str( wp_unslash( $_REQUEST['epo_data'] ), $posted ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$epos = THEMECOMPLETE_EPO_CART()->tm_add_cart_item_data( [], themecomplete_get_id( $_product ), $posted );

			$wc_booking_block_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_easy_bookings_block' ) ) ? 1 : 0;
			if ( ! empty( $epos ) && ! empty( $epos['tmcartepo'] ) ) {
				foreach ( $epos['tmcartepo'] as $key => $value ) {
					if ( ! empty( $value['price'] ) ) {

						$price        = floatval( $value['price'] );
						$option_price = 0;

						if ( ! empty( $wc_booking_block_qty_multiplier ) && ! empty( $duration ) ) {
							$option_price += $price * $duration;
						}
						if ( ! $option_price ) {
							$option_price += $price;
						}
						$extra_price += $option_price;
					}
				}
			}
		}

		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_duration', $duration );
		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_epo_price', $extra_price );

		return $booking_price;
	}

	/**
	 * Save booking data (deprecated)
	 *
	 * @param float   $booking_price The booking price.
	 * @param object  $product The product object.
	 * @param object  $_product The child product object.
	 * @param integer $duration The booking duration.
	 * @return float
	 */
	public function easy_booking_get_new_item_price( $booking_price, $product, $_product, $duration ) {
		$extra_price = 0;
		if ( isset( $_REQUEST['epo_data'] ) && 'disable' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_final_total_box' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$posted = [];
			parse_str( wp_unslash( $_REQUEST['epo_data'] ), $posted ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			$epos = THEMECOMPLETE_EPO_CART()->tm_add_cart_item_data( [], themecomplete_get_id( $_product ), $posted );

			$wc_booking_block_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_easy_bookings_block' ) ) ? 1 : 0;
			if ( ! empty( $epos ) && ! empty( $epos['tmcartepo'] ) ) {
				foreach ( $epos['tmcartepo'] as $key => $value ) {
					if ( ! empty( $value['price'] ) ) {

						$price        = floatval( $value['price'] );
						$option_price = 0;

						if ( ! empty( $wc_booking_block_qty_multiplier ) && ! empty( $duration ) ) {
							$option_price += $price * $duration;
						}
						if ( ! $option_price ) {
							$option_price += $price;
						}
						$extra_price += $option_price;
					}
				}
			}
		}

		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_duration', $duration );
		THEMECOMPLETE_EPO_DATA_STORE()->set( 'easy_bookings_epo_price', $extra_price );

		return $booking_price;
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-easy-bookings', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-easy-bookings.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			$args = [
				'wc_booking_block_qty_multiplier' => ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_easy_bookings_block' ) ) ? 1 : 0,
			];
			wp_localize_script( 'themecomplete-comp-easy-bookings', 'TMEPOEASYBOOKINGSJS', $args );
		}
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['easybookings'] = [ 'tcfa tcfa-calculator', esc_html__( 'WooCommerce Easy Bookings', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label                    = esc_html__( 'WooCommerce Easy Bookings', 'woocommerce-tm-extra-product-options' );
		$settings['easybookings'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'    => esc_html__( 'Multiply cost by block count', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enabling this will multiply the options price by the block count.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_easy_bookings_block',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'yes',
				'type'     => 'select',
				'options'  => [
					'no'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];

		return $settings;
	}

	/**
	 * Sets custom price to the cart item
	 *
	 * @param float        $booking_price The booking price.
	 * @param array<mixed> $cart_item The cart item.
	 * @return float
	 * @since 1.0
	 */
	public function easy_booking_set_booking_price( $booking_price, $cart_item ) {
		if ( ! empty( $cart_item['tmcartepo'] ) && isset( $cart_item['tm_epo_options_prices'] ) ) {
			$booking_price = $booking_price + $cart_item['tm_epo_options_prices'];
		}

		return $booking_price;
	}

	/**
	 * Set product original price in cart
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_adjust_cart_item( $cart_item ) {
		if (
			isset( $cart_item['data'] )
			&& is_object( $cart_item['data'] )
			&& property_exists( $cart_item['data'], 'id' )
			&& themecomplete_get_id( $cart_item['data'] )
		) {
			if ( isset( $cart_item['_booking_price'] ) && isset( $cart_item['_booking_duration'] ) ) {

				if ( ! empty( $cart_item['tmcartepo'] ) ) {
					$cart_item['tm_epo_product_original_price'] = $cart_item['tm_epo_product_original_price'] - $cart_item['tm_epo_options_prices'];
				}
			}
		}

		return $cart_item;
	}

	/**
	 * Adjust options when adding to cart
	 *
	 * @param mixed        $price The price to adjust.
	 * @param array<mixed> $cart_item The cart item.
	 * @return mixed
	 * @since 1.0
	 */
	public function wc_epo_cart_options_prices_before( $price, $cart_item ) {
		$wc_booking_block_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_easy_bookings_block' ) ) ? 1 : 0;

		if (
			! $wc_booking_block_qty_multiplier
			|| ! ( isset( $cart_item['_booking_price'] ) && isset( $cart_item['_booking_duration'] ) )
			|| ! isset( $cart_item['data'] )
			|| ! is_object( $cart_item['data'] )
			|| ! property_exists( $cart_item['data'], 'id' )
			|| ! themecomplete_get_id( $cart_item['data'] )
		) {
			return $price;
		}

		$duration = ! empty( $cart_item['_booking_duration'] ) ? $cart_item['_booking_duration'] : 0;

		$c = $duration;

		$price = $c * $price;

		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-bookings.php000064400000044664150755142450022347 0ustar00<?php // phpcs:disable WordPress.Security.NonceVerification
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooCommerce Bookings
 * https://woocommerce.com/products/woocommerce-bookings/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Bookings {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Bookings|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded
	 *
	 * @return THEMECOMPLETE_EPO_CP_Bookings
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'WC_Bookings' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 11 );

		add_filter( 'woocommerce_add_cart_item_data', [ $this, 'add_cart_item_data' ], 11, 1 );
		add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
		add_filter( 'wc_epo_cart_options_prices_before', [ $this, 'wc_epo_cart_options_prices_before' ], 10, 2 );
		add_filter( 'wc_epo_adjust_price', [ $this, 'wc_epo_adjust_price' ], 10, 2 );

		add_filter( 'booking_form_calculated_booking_cost', [ $this, 'adjust_booking_cost_old' ], 10, 3 );
		// for 1.15x.
		add_filter( 'woocommerce_bookings_calculated_booking_cost', [ $this, 'adjust_booking_cost' ], 10, 3 );
		add_filter( 'wc_epo_adjust_cart_item_before', [ $this, 'wc_epo_adjust_cart_item_before' ], 10, 1 );
		add_filter( 'wc_epo_adjust_cart_item', [ $this, 'wc_epo_adjust_cart_item' ], 10, 1 );

		add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
		add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );

		add_filter( 'wcml_cart_contents_not_changed', [ $this, 'filter_bundled_product_in_cart_contents' ], 9999, 3 );

		add_filter( 'woocommerce_bookings_calculated_booking_cost_success_output', [ $this, 'filter_output_cost' ], 10, 3 );
		add_action( 'wp_ajax_wc_bookings_calculate_costs', [ $this, 'filter_cost' ], 1 );
		add_action( 'wp_ajax_nopriv_wc_bookings_calculate_costs', [ $this, 'filter_cost' ], 1 );
	}

	/**
	 * Adjust the booking cost display
	 *
	 * @return void
	 */
	public function filter_cost() {
		if ( 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_add_options_display_cost' ) ) {
			if ( ! defined( 'WC_EPO_BOOKINGS_CALCULATED_BOOKING_COST_SUCCESS_OUTPUT' ) ) {
				define( 'WC_EPO_BOOKINGS_CALCULATED_BOOKING_COST_SUCCESS_OUTPUT', true );
			}
		}
	}

	/**
	 * Filter the cost display of bookings after booking selection.
	 * This only filters on success.
	 *
	 * @since 5.1
	 * @param string $output The hml output.
	 * @param string $display_price The displayed price.
	 * @param object $product The product object.
	 * @return void
	 */
	public function filter_output_cost( $output, $display_price, $product ) {
		if ( $product instanceof WC_Product && isset( $_REQUEST['form'] ) && class_exists( 'WC_Bookings_Cost_Calculation' ) && function_exists( 'wc_bookings_get_posted_data' ) ) {
			parse_str( wp_unslash( $_REQUEST['form'] ), $posted ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			if ( ! defined( 'WC_EPO_BOOKINGS_CALCULATED_BOOKING_COST_SUCCESS_OUTPUT' ) ) {
				define( 'WC_EPO_BOOKINGS_CALCULATED_BOOKING_COST_SUCCESS_OUTPUT', true );
			}
			$booking_data = wc_bookings_get_posted_data( $posted, $product );
			$cost         = WC_Bookings_Cost_Calculation::calculate_booking_cost( $booking_data, $product );

			wp_send_json(
				[
					'result'    => 'SUCCESS',
					'html'      => $output,
					'raw_price' => (float) wc_get_price_to_display( $product, [ 'price' => $cost ] ),
				]
			);
		}
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( class_exists( 'WC_Bookings' ) ) {
			$settings['tm_epo_bookings_person']                   = 'yes';
			$settings['tm_epo_bookings_block']                    = 'yes';
			$settings['tm_epo_bookings_add_options_display_cost'] = 'yes';
		}

		return $settings;
	}

	/**
	 * Enqueue booking js
	 *
	 * @return void
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			global $post;
			$product                            = $post ? wc_get_product( $post->ID ) : false;
			$booking_has_person_cost_multiplier = is_callable( [ $product, 'get_has_person_cost_multiplier' ] ) && $product->get_has_person_cost_multiplier() ? 1 : 0;
			$booking_has_person_qty_multiplier  = is_callable( [ $product, 'get_has_person_qty_multiplier' ] ) && $product->get_has_person_qty_multiplier() ? 1 : 0;

			$tm_epo_bookings_person = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' );
			$tm_epo_bookings_block  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' );

			if ( $tm_epo_bookings_person ) {
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' ) ) {
					$tm_epo_bookings_person = 1;
				} elseif ( 'own' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' ) ) {
					$tm_epo_bookings_person = $booking_has_person_cost_multiplier;
				} else {
					$tm_epo_bookings_person = 0;
				}
			} else {
				$tm_epo_bookings_person = 0;
			}
			if ( $tm_epo_bookings_block ) {
				if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' ) ) {
					$tm_epo_bookings_block = 1;
				} elseif ( 'own' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' ) ) {
					$tm_epo_bookings_block = $booking_has_person_qty_multiplier;
				} else {
					$tm_epo_bookings_block = 0;
				}
			} else {
				$tm_epo_bookings_block = 0;
			}

			wp_enqueue_script( 'themecomplete-comp-bookings', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-bookings.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
			$args = [
				'booking_person_qty_multiplier'        => $booking_has_person_cost_multiplier,
				'booking_block_qty_multiplier'         => $booking_has_person_qty_multiplier,
				'wc_booking_person_qty_multiplier'     => $tm_epo_bookings_person,
				'wc_booking_block_qty_multiplier'      => $tm_epo_bookings_block,
				'wc_bookings_add_options_display_cost' => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_add_options_display_cost' ),
			];
			wp_localize_script( 'themecomplete-comp-bookings', 'TMEPOBOOKINGSJS', $args );
		}
	}

	/**
	 * Add to cart item
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 */
	public function add_cart_item_data( $cart_item ) {
		if ( ! isset( $cart_item['tc_booking_original_price'] ) && isset( $cart_item['booking'] ) && isset( $cart_item['booking']['_cost'] ) ) {
			$cart_item['tc_booking_original_price'] = $cart_item['booking']['_cost'];
		}

		return $cart_item;
	}

	/**
	 * Set price for product in cart
	 *
	 * @param array<mixed> $cart_item The cart iterm.
	 * @param string       $key The cart key.
	 * @param string       $current_language Current language.
	 * @return array<mixed>
	 */
	public function filter_bundled_product_in_cart_contents( $cart_item, $key, $current_language ) {
		global $woocommerce_wpml;

		if ( defined( 'WCML_MULTI_CURRENCIES_INDEPENDENT' ) && class_exists( 'WC_Product_Booking' ) && $cart_item['data'] instanceof WC_Product_Booking && isset( $cart_item['booking'] ) ) {

			$current_id      = apply_filters( 'translate_object_id', $cart_item['product_id'], 'product', true, $current_language );
			$cart_product_id = $cart_item['product_id'];

			if ( WCML_MULTI_CURRENCIES_INDEPENDENT === $woocommerce_wpml->settings['enable_multi_currency'] || intval( $current_id ) !== intval( $cart_product_id ) ) {

				$tm_epo_options_prices = floatval( $cart_item['tm_epo_options_prices'] );
				$current_cost          = floatval( $cart_item['data']->get_price() );

				$cart_item['data']->set_price( $current_cost + $tm_epo_options_prices );

			}
		}

		return $cart_item;
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['bookings'] = [ 'tcfa tcfa-calendar-alt', esc_html__( 'WooCommerce Bookings', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label                = esc_html__( 'WooCommerce Bookings', 'woocommerce-tm-extra-product-options' );
		$settings['bookings'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'    => esc_html__( 'Multiply cost by person count', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enabling this will multiply the options price by the person count.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_bookings_person',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'yes',
				'type'     => 'select',
				'options'  => [
					'no'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
					'own' => esc_html__( 'Using booking setting', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Multiply cost by block count', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enabling this will multiply the options price by the block count.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_bookings_block',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'yes',
				'type'     => 'select',
				'options'  => [
					'no'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
					'own' => esc_html__( 'Using booking setting', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'   => esc_html__( 'Add option cost to booking display price', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enabling this will add the option prices to the calculated booking cost.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_bookings_add_options_display_cost',
				'default' => 'yes',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],
		];

		return $settings;
	}

	/**
	 * Set booking flag
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_adjust_cart_item_before( $cart_item ) {
		$cart_item['tc_epo_booking_original_price_adjustment'] = 0;

		return $cart_item;
	}

	/**
	 * Set original product price in cart
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_adjust_cart_item( $cart_item ) {

		if (
			empty( $cart_item['tc_epo_booking_original_price_adjustment'] )
			&& isset( $cart_item['data'] )
			&& is_object( $cart_item['data'] )
			&& property_exists( $cart_item['data'], 'id' )
			&& method_exists( $cart_item['data'], 'is_type' )
			&& themecomplete_get_id( $cart_item['data'] )
		) {
			if ( $cart_item['data']->is_type( 'booking' ) ) {

				if ( ! empty( $cart_item['tmcartepo'] ) ) {
					$cart_item['tm_epo_product_original_price']            = $cart_item['tm_epo_product_original_price'] - $cart_item['tm_epo_options_prices'];
					$cart_item['tc_epo_booking_original_price_adjustment'] = 1;
				}
			}
		}

		return $cart_item;
	}

	/**
	 * Adjust price in cart
	 *
	 * @param boolean      $adjust true or false.
	 * @param array<mixed> $cart_item The cart item.
	 * @return boolean
	 * @since 1.0
	 */
	public function wc_epo_adjust_price( $adjust, $cart_item ) {
		if (
			isset( $cart_item['data'] )
			&& is_object( $cart_item['data'] )
			&& property_exists( $cart_item['data'], 'id' )
			&& method_exists( $cart_item['data'], 'is_type' )
			&& themecomplete_get_id( $cart_item['data'] )
		) {
			if ( $cart_item['data']->is_type( 'booking' ) ) {
				return false;
			}
		}

		return $adjust;
	}

	/**
	 * Adjust options when adding to cart
	 *
	 * @param mixed        $price The price to adjust.
	 * @param array<mixed> $cart_item The cart item.
	 * @return mixed
	 * @since 1.0
	 */
	public function wc_epo_cart_options_prices_before( $price, $cart_item ) {
		$wc_booking_person_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' ) ) ? 1 : 0;
		$wc_booking_block_qty_multiplier  = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' ) ) ? 1 : 0;

		if (
			( ! $wc_booking_person_qty_multiplier && ! $wc_booking_block_qty_multiplier )
			|| ! isset( $cart_item['booking'] )
			|| ! isset( $cart_item['data'] )
			|| ! is_object( $cart_item['data'] )
			|| ! property_exists( $cart_item['data'], 'id' )
			|| ! themecomplete_get_id( $cart_item['data'] )
		) {
			return $price;
		}

		$person   = ( ! empty( $cart_item['booking']['_persons'] ) && array_sum( $cart_item['booking']['_persons'] ) ) ? array_sum( $cart_item['booking']['_persons'] ) : 0;
		$duration = ! empty( $cart_item['booking']['_duration'] ) ? $cart_item['booking']['_duration'] : 0;

		$c = 0;
		if ( $wc_booking_person_qty_multiplier ) {
			$c = $person + $c;
		}
		if ( $wc_booking_block_qty_multiplier ) {
			$c = $duration + $c;
		}
		if ( ! empty( $c ) ) {
			$price = floatval( $c ) * floatval( $price );
		}

		return $price;
	}

	/**
	 * Adjust the final booking cost
	 *
	 * @param mixed        $booking_cost Booking cost.
	 * @param object       $product The product object.
	 * @param array<mixed> $posted Posted data.
	 * @return mixed
	 * @since 4.9.7
	 */
	public function adjust_booking_cost( $booking_cost, $product, $posted ) {

		if ( defined( 'WC_EPO_BOOKINGS_CALCULATED_BOOKING_COST_SUCCESS_OUTPUT' ) ) {
			return $booking_cost;
		}
		if ( isset( $_POST ) ) { // @phpstan-ignore-line
			if ( isset( $_POST['form'] ) ) {
				$posted = [];
				parse_str( wp_unslash( $_POST['form'] ), $posted ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				$posted['cpf_product_price'] = $booking_cost;
			} else {
				$_POST['cpf_product_price'] = $booking_cost;
				$posted                     = $_POST;
			}
		}

		if ( isset( $posted['tc_suppress_filter_booking_cost'] ) ) {
			return $booking_cost;
		}

		$epos         = THEMECOMPLETE_EPO_CART()->tm_add_cart_item_data( [], themecomplete_get_id( $product ), $posted );
		$extra_price  = 0;
		$booking_data = function_exists( 'wc_bookings_get_posted_data' ) ? wc_bookings_get_posted_data( $posted, $product ) : [];

		$wc_booking_person_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' ) ) ? 1 : 0;
		$wc_booking_block_qty_multiplier  = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' ) ) ? 1 : 0;
		if ( ! empty( $epos ) && ! empty( $epos['tmcartepo'] ) ) {
			foreach ( $epos['tmcartepo'] as $key => $value ) {
				if ( ! empty( $value['price'] ) ) {

					$price        = floatval( $value['price'] );
					$option_price = 0;

					if ( ! empty( $wc_booking_person_qty_multiplier ) && ! empty( $booking_data['_persons'] ) && array_sum( $booking_data['_persons'] ) ) {
						$option_price += $price * array_sum( $booking_data['_persons'] );
					}
					if ( ! empty( $wc_booking_block_qty_multiplier ) && ! empty( $booking_data['_duration'] ) ) {
						if ( empty( $option_price ) ) {
							$option_price = $option_price * $booking_data['_duration'];
						} else {
							$option_price += $price * $booking_data['_duration'];
						}
					}
					if ( ! $option_price ) {
						$option_price += $price;
					}
					$extra_price += $option_price;
				}
			}
		}

		$extra_price  = floatval( $extra_price );
		$booking_cost = floatval( $booking_cost );
		$booking_cost = $booking_cost + $extra_price;

		return $booking_cost;
	}

	/**
	 * Adjust the final booking cost
	 *
	 * @param mixed        $booking_cost Booking cost.
	 * @param mixed        $booking_form Booking form object.
	 * @param array<mixed> $posted Posted data.
	 * @return mixed
	 * @since 1.0
	 */
	public function adjust_booking_cost_old( $booking_cost, $booking_form, $posted ) {
		if ( ! is_object( $booking_form ) || isset( $posted['tc_suppress_filter_booking_cost'] ) ) {
			return $booking_cost;
		}
		$product = false;
		if ( property_exists( $booking_form, 'product' ) ) {
			$product = $booking_form->product;
		}
		$epos         = THEMECOMPLETE_EPO_CART()->tm_add_cart_item_data( [], themecomplete_get_id( $product ), $posted );
		$extra_price  = 0;
		$booking_data = [];
		if ( method_exists( $booking_form, 'get_posted_data' ) ) {
			$booking_data = $booking_form->get_posted_data( $posted );
		}

		$wc_booking_person_qty_multiplier = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_person' ) ) ? 1 : 0;
		$wc_booking_block_qty_multiplier  = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_bookings_block' ) ) ? 1 : 0;
		if ( ! empty( $epos ) && ! empty( $epos['tmcartepo'] ) ) {
			foreach ( $epos['tmcartepo'] as $key => $value ) {
				if ( ! empty( $value['price'] ) ) {

					$price        = floatval( $value['price'] );
					$option_price = 0;

					if ( ! empty( $wc_booking_person_qty_multiplier ) && ! empty( $booking_data['_persons'] ) && array_sum( $booking_data['_persons'] ) ) {
						$option_price += $price * array_sum( $booking_data['_persons'] );
					}
					if ( ! empty( $wc_booking_block_qty_multiplier ) && ! empty( $booking_data['_duration'] ) ) {
						$option_price += $price * $booking_data['_duration'];
					}
					if ( ! $option_price ) {
						$option_price += $price;
					}
					$extra_price += $option_price;
				}
			}
		}

		$extra_price  = floatval( $extra_price );
		$booking_cost = floatval( $booking_cost );
		$booking_cost = $booking_cost + $extra_price;

		return $booking_cost;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-qtranslatex.php000064400000004143150755142450023066 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * qTranslate X
 * https://wordpress.org/plugins/qtranslate-x/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Qtranslatex {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Qtranslatex|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Qtranslatex
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 5 );
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( function_exists( 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
			add_filter( 'tm_translate', 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage', 51, 1 ); // @phpstan-ignore-line
		}
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			if ( defined( 'QTRANSLATE_FILE' ) ) {
				global $q_config;
				if ( isset( $q_config['enabled_languages'] ) ) {
					wp_enqueue_script( 'themecomplete-comp-q-translate-x-clogic', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-qtranslatex.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
					$args = [
						'enabled_languages' => $q_config['enabled_languages'],
						'language'          => $q_config['language'],
					];
					wp_localize_script( 'themecomplete-comp-q-translate-x-clogic', 'TMEPOQTRANSLATEXJS', $args );
				}
			}
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-wootours.php000064400000003204150755142450022416 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WooTour - WooCommerce Travel Tour Booking
 * https://codecanyon.net/item/wootour-woocommerce-travel-tour-and-appointment-booking/19404740
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Wootours {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Wootours|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Wootours
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'init', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'EX_WooTour' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-wootours', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-wootours.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-bap.php000064400000003562150755142450021266 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Booking & Appointment Plugin for WooCommerce.
 * https://www.tychesoftwares.com/store/premium-plugins/woocommerce-booking-plugin/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_CP_BAP {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_BAP|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded
	 *
	 * @return THEMECOMPLETE_EPO_CP_BAP
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'woocommerce_booking' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
		add_action( 'bkap_before_booking_form', [ $this, 'bkap_before_booking_form' ], 4 );
	}

	/**
	 * Insert hidden input
	 *
	 * @return void
	 */
	public function bkap_before_booking_form() {
		echo '<input type="hidden" id="product-addons-total">';
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-bap', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-bap.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-wpml.php000064400000030337150755142450021503 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * WPML Multilingual CMS
 * https://wpml.org/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_WPML {

	/**
	 * Section field array
	 *
	 * @var array<mixed>
	 * @since 1.0
	 */
	public $wpml_section_fields;

	/**
	 * Element field array
	 *
	 * @var array<mixed>
	 * @since 1.0
	 */
	public $wpml_element_fields;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_WPML|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_WPML
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wc_epo_add_compatibility', [ $this, 'add_compatibility' ] );
		add_action( 'plugins_loaded', [ $this, 'add_compatibility_plugins_loaded' ], 3 );
		add_action( 'init', [ $this, 'tm_remove_wcml' ], 3 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			add_filter( 'tm_cart_contents', [ $this, 'tm_cart_contents' ], 10, 1 );
			add_filter( 'wcml_exception_duplicate_products_in_cart', [ $this, 'tm_wcml_exception_duplicate_products_in_cart' ], 99999, 2 );
			add_filter( 'wcml_filter_cart_item_data', [ $this, 'wcml_filter_cart_item_data' ], 10, 1 );
			add_filter( 'wc_epo_use_original_builder', [ $this, 'wc_epo_use_original_builder' ], 10, 5 );
			add_filter( 'wcml_multi_currency_ajax_actions', [ $this, 'wcml_multi_currency_ajax_actions' ], 10, 1 );
		}
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 6.4
	 */
	public function add_compatibility_plugins_loaded() {
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {

			$this->wpml_section_fields = [
				'section_header_title',
				'section_header_subtitle',
				'sections_uniqid',
				'sections_class',
				'sections_clogic',
				'sections_logicrules',
				'sections_logic',
				'sections_popupbuttontext',
			];

			// These are the properties that can have a different values in translated products with WPML.
			$this->wpml_element_fields = [];
			$properties1               = [ 'uniqid', 'clogic', 'logicrules', 'logic', 'class' ];
			$properties2               = [ 'header_title', 'header_subtitle', 'container_id', 'text_before_price', 'text_after_price', 'quantity_default_value' ];

			foreach ( THEMECOMPLETE_EPO_BUILDER()->get_elements() as $el => $val ) {
				if ( 'variations' !== $el ) {
					foreach ( $properties1 as $property1 ) {
						if ( 'class' === $property1 && 'product' === $el ) {
							continue;
						}
						$this->wpml_element_fields[] = $el . '_' . $property1;
					}
					if ( 'divider' !== $el && 'header' !== $el && 'product' !== $el ) {
						foreach ( $properties2 as $property2 ) {
							if ( 'quantity_default_value' === $property2 && ( 'upload' === $el || 'multiple_file_upload' === $el ) ) {
								continue;
							}
							$this->wpml_element_fields[] = $el . '_' . $property2;
						}
					}

					if ( 'header' === $el ) {
						$this->wpml_element_fields[] = 'header_title';
						$this->wpml_element_fields[] = 'header_subtitle';
					}

					if ( 'product' === $el ) {
						$this->wpml_element_fields[] = 'product_header_title';
						$this->wpml_element_fields[] = 'product_header_subtitle';
						$this->wpml_element_fields[] = 'product_placeholder';
					}

					if ( 'range' === $el || 'color' === $el || 'textarea' === $el || 'textfield' === $el || 'date' === $el ) {
						$this->wpml_element_fields[] = $el . '_default_value';
					}

					if ( 'selectbox' === $el || 'textarea' === $el || 'textfield' === $el ) {
						$this->wpml_element_fields[] = $el . '_placeholder';
					}

					if ( 'selectbox' === $el || 'radiobuttons' === $el || 'checkboxes' === $el ) {
						$this->wpml_element_fields[] = $el . '_options';
					}
				} else {
					$this->wpml_element_fields[] = 'variations_header_title';
					$this->wpml_element_fields[] = 'variations_header_subtitle';
					$this->wpml_element_fields[] = 'variations_options';
				}
			}

			$this->wpml_element_fields = apply_filters(
				'wc_epo_wpml_element_fields',
				array_merge(
					$this->wpml_element_fields,
					[
						'upload_button_type',
						'date_format',
						'date_disabled_dates',
						'date_enabled_only_dates',
						'date_tranlation_day',
						'date_tranlation_month',
						'date_tranlation_year',
						'time_time_format',
						'time_tranlation_hour',
						'time_tranlation_minute',
						'time_tranlation_second',
					]
				)
			);
		}
	}

	/**
	 * Add our AJAX actions that need to use multi-currency filters.
	 *
	 * @param array<mixed> $ajax_actions Array of ajax actions.
	 * @return array<mixed>
	 * @since 6.2
	 */
	public function wcml_multi_currency_ajax_actions( $ajax_actions = [] ) {
		$ajax_actions[] = 'wc_epo_get_associated_product_html';
		return $ajax_actions;
	}

	/**
	 * Alter enabled currencies
	 *
	 * @param array<mixed> $data Array in the form of [ $use_original_builder, $index ].
	 * @param string       $element The Element name.
	 * @param array<mixed> $builder The element builder.
	 * @param array<mixed> $current_builder The current element builder.
	 * @param string       $identifier 'sections' or the current element.
	 * @return array<mixed>
	 * @since 5.0
	 */
	public function wc_epo_use_original_builder( $data, $element, $builder, $current_builder, $identifier = 'sections' ) {
		$use_original_builder = $data[0];
		$index                = $data[1];

		if ( THEMECOMPLETE_EPO_WPML()->is_active() && false !== $index ) {
			$use_original_builder = false;
			$use_wpml             = false;

			if ( isset( $current_builder[ $identifier . '_uniqid' ] )
				&& isset( $builder[ $identifier . '_uniqid' ] )
				&& isset( $builder[ $identifier . '_uniqid' ][ $index ] )
			) {
				// Get index of element id in internal array.
				$get_current_builder_uniqid_index = array_search( $builder[ $identifier . '_uniqid' ][ $index ], $current_builder[ $identifier . '_uniqid' ], true );
				if ( null !== $get_current_builder_uniqid_index && false !== $get_current_builder_uniqid_index ) {
					$index    = $get_current_builder_uniqid_index;
					$use_wpml = true;
				} else {
					$use_original_builder = true;
				}
			} elseif ( 'variations' === $identifier ) {
				$index    = 0;
				$use_wpml = true;
			}

			$wpml_fields = ( 'sections' === $identifier ) ? $this->wpml_section_fields : $this->wpml_element_fields;

			// always use translated value for multiple_ settings.
			if ( str_starts_with( $element, 'multiple_' ) ) {
				$wpml_fields = true;
			}
			if ( isset( $current_builder[ $element ] ) &&
				! $use_original_builder &&
				$use_wpml &&
				( ( is_array( $wpml_fields ) && in_array( $element, $wpml_fields, true ) ) || true === $wpml_fields ) ) {
				$use_original_builder = false;
			} else {
				$use_original_builder = true;
			}
		}

		return [ $use_original_builder, $index ];
	}

	/**
	 * Remove conflictiong filters used by WooCommerce Multilingual
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_remove_wcml() {
		global $woocommerce_wpml;
		if ( THEMECOMPLETE_EPO_WPML()->is_active()
			&& $woocommerce_wpml
			&& property_exists( $woocommerce_wpml, 'compatibility' )
			&& isset( $woocommerce_wpml->compatibility )
			&& isset( $woocommerce_wpml->compatibility->extra_product_options ) ) {
			remove_filter( 'get_tm_product_terms', [ $woocommerce_wpml->compatibility->extra_product_options, 'filter_product_terms' ] );
			remove_filter( 'get_post_metadata', [ $woocommerce_wpml->compatibility->extra_product_options, 'product_options_filter' ], 100 );
			remove_action( 'updated_post_meta', [ $woocommerce_wpml->compatibility->extra_product_options, 'register_options_strings' ], 10 );
			unset( $woocommerce_wpml->compatibility->extra_product_options );
		}
	}

	/**
	 * Skip wcml_check_on_duplicate_products_in_cart
	 *
	 * @param boolean      $flag true or false.
	 * @param array<mixed> $cart_item The cart item array.
	 * @return boolean
	 */
	public function tm_wcml_exception_duplicate_products_in_cart( $flag, $cart_item ) {
		if ( isset( $cart_item['tmcartepo'] ) ) {
			return true;
		}

		return $flag;
	}

	/**
	 * Unset the Cart edit key
	 *
	 * @param array<mixed> $cart_contents The cart contents.
	 * @return array<mixed>
	 */
	public function wcml_filter_cart_item_data( $cart_contents = [] ) {
		unset( $cart_contents[ THEMECOMPLETE_EPO()->cart_edit_key_var ] );

		return $cart_contents;
	}

	/**
	 * Alter cart contents
	 *
	 * @param array<mixed> $cart_item The cart item.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_cart_contents( $cart_item = [] ) {
		if ( ! THEMECOMPLETE_EPO_WPML()->is_active() ) {
			return $cart_item;
		}

		if ( isset( $cart_item['tmcartepo'] ) && is_array( $cart_item['tmcartepo'] ) ) {
			$current_product_id     = THEMECOMPLETE_EPO_WPML()->get_current_id( $cart_item['product_id'] );
			$wpml_translation_by_id = THEMECOMPLETE_EPO_WPML()->get_wpml_translation_by_id( $current_product_id );

			foreach ( $cart_item['tmcartepo'] as $k => $epo ) {
				if ( isset( $epo['mode'] ) && 'local' === $epo['mode'] ) {
					if ( isset( $epo['is_taxonomy'] ) ) {
						if ( '1' === (string) $epo['is_taxonomy'] ) {
							$term        = get_term_by( 'slug', $epo['key'], $epo['section'] );
							$value_label = '';
							if ( $term instanceof WP_Term ) {
								$wpml_term_id = function_exists( 'icl_object_id' ) ? icl_object_id( $term->term_id, $epo['section'], false ) : false;
								if ( $wpml_term_id ) {
									$wpml_term = get_term( $wpml_term_id, $epo['section'] );
								} else {
									$wpml_term = $term;
								}
								if ( ! $wpml_term instanceof WP_Term ) {
									$wpml_term = $term;
								}
								$value_label = $wpml_term->name;
							}
							$cart_item['tmcartepo'][ $k ]['section_label'] = urldecode( wc_attribute_label( $epo['section'] ) );
							$cart_item['tmcartepo'][ $k ]['value']         = wc_attribute_label( $value_label );
						} elseif ( '0' === (string) $epo['is_taxonomy'] ) {
							$attributes      = themecomplete_get_attributes( absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $cart_item['product_id'] ) ) );
							$wpml_attributes = themecomplete_get_attributes( floatval( THEMECOMPLETE_EPO_WPML()->get_current_id( $cart_item['product_id'] ) ) );

							$options      = array_map( 'trim', explode( WC_DELIMITER, $attributes[ $epo['section'] ]['value'] ) );
							$options      = array_map( 'sanitize_title', explode( WC_DELIMITER, $attributes[ $epo['section'] ]['value'] ) );
							$wpml_options = array_map( 'trim', explode( WC_DELIMITER, $wpml_attributes[ $epo['section'] ]['value'] ) );

							$cart_item['tmcartepo'][ $k ]['section_label'] = urldecode( wc_attribute_label( $epo['section'] ) );
							$cart_item['tmcartepo'][ $k ]['value']         =
								wc_attribute_label(
									array_search( $epo['key'], $options, true ) !== false &&
									isset(
										$wpml_options[ array_search( $epo['key'], $options, true ) ]
									)
										? $wpml_options[ array_search( $epo['key'], $options, true ) ]
										: $epo['value']
								);
						}
					}
				} elseif ( isset( $epo['mode'] ) && 'builder' === $epo['mode'] ) {
					if ( isset( $wpml_translation_by_id[ $epo['section'] ] ) ) {
						$cart_item['tmcartepo'][ $k ]['section_label'] = $wpml_translation_by_id[ $epo['section'] ];
						if ( ! empty( $epo['multiple'] ) && ! empty( $epo['key'] ) ) {
							$pos = strrpos( $epo['key'], '_' );
							if ( false !== $pos && isset( $wpml_translation_by_id[ 'options_' . $epo['section'] ] ) && is_array( $wpml_translation_by_id[ 'options_' . $epo['section'] ] ) ) {
								$av = array_values( $wpml_translation_by_id[ 'options_' . $epo['section'] ] );

								if ( isset( $av[ (int) substr( $epo['key'], $pos + 1 ) ] ) ) {
									$cart_item['tmcartepo'][ $k ]['value'] = $av[ (int) substr( $epo['key'], $pos + 1 ) ];
								}
							}
						}
					}
				}
			}
		}

		return $cart_item;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-atum.php000064400000003523150755142450021467 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * ATUM Inventory Management for WooCommerce
 * https://wordpress.org/plugins/atum-stock-manager-for-woocommerce/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_CP_Atum {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Atum|null
	 * @since 5.0.12.3
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Atum
	 * @since 5.0.12.3
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 5.0.12.3
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 5.0.12.3
	 */
	public function add_compatibility() {
		if ( ! defined( 'ATUM_VERSION' ) ) {
			return;
		}

		add_filter( 'wc_epo_no_order_get_items', [ $this, 'wc_epo_no_order_get_items' ], 10, 1 );
	}

	/**
	 * Skip altering order get_items
	 *
	 * @param boolean $ret if order get_items should be skipped.
	 * @return boolean
	 * @since 5.0.12.3
	 */
	public function wc_epo_no_order_get_items( $ret ) {
		global $post;

		if ( isset( $_REQUEST['action'] ) && str_starts_with( sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ), 'atum_' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$ret = true;
		}

		if ( get_post_type( $post ) === 'atum_purchase_order' ) {
			$ret = true;
		}

		return $ret;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-apd-pro.php000064400000101364150755142450022065 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4.1
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Advanced Dynamic Pricing for WooCommerce Pro (AlogPlus).
 * https://algolplus.com/plugins/downloads/advanced-dynamic-pricing-woocommerce-pro/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_APD_PRO {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_APD_PRO|null
	 * @since 6.4.1
	 */
	protected static $instance = null;

	/**
	 * Flag the order if it has discounts
	 *
	 * @var string
	 * @since 6.4.1
	 */
	private $order_flag = 'tm_has_apd';

	/**
	 * The compatibility class
	 *
	 * @var string
	 * @since 6.4.3
	 */
	private $class_name = '\\ADP\\BaseVersion\\Includes\\Compatibility\\TmExtraOptionsCmp';

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_APD_PRO
	 * @since 6.4.1
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 6.4.1
	 */
	public function __construct() {
		$this->class_name = '\\ADP\\BaseVersion\\Includes\\Compatibility\\TmExtraOptionsCmp';
		add_action( 'init', [ $this, 'add_compatibility' ] );
		add_filter( 'plugins_loaded', [ $this, 'add_compatibility_settings' ], 2, 1 );
	}

	/**
	 * Add compatibility settings
	 *
	 * @return void
	 */
	public function add_compatibility_settings() {
		add_filter( 'wc_epo_get_settings', [ $this, 'wc_epo_get_settings' ], 10, 1 );
	}

	/**
	 * Enqueue Scripts
	 *
	 * @return void
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-apd', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-apd.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}

	/**
	 * Add setting in main THEMECOMPLETE_EPO class
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 6.4.1
	 */
	public function wc_epo_get_settings( $settings = [] ) {
		if ( $this->is_apd_enabled() ) {
			$settings['tm_epo_apd_enable']                      = [ $this->get_apd_enable(), $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_prefix']                      = [ '', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_suffix']                      = [ '', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_enable_pricing_table']        = [ 'no', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_show_option_prices_in_order'] = [ 'no', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_string_placement']            = [ '', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_label_css_selector']          = [ '', $this, 'is_apd_enabled' ];
			$settings['tm_epo_apd_original_price_base']         = [ '', $this, 'is_apd_enabled' ];
		}

		return $settings;
	}

	/**
	 * Check if Dynamic Pricing for WooCommerce is enabled
	 *
	 * @return boolean
	 * @since 6.4.1
	 */
	public function is_apd_enabled() {
		return class_exists( $this->class_name ) && method_exists( $this->class_name, 'calculateRulesForProduct' );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 6.4.1
	 */
	public function add_compatibility() {
		if ( ! $this->is_apd_enabled() ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );

		add_filter( 'wc_epo_adjust_price_before_calculate_totals', [ $this, 'wc_epo_adjust_price_before_calculate_totals' ] );
		add_filter( 'woocommerce_cart_item_price', [ $this, 'woocommerce_cart_item_price' ], 99999, 3 );
		add_action( 'wc_epo_order_item_meta', [ $this, 'wc_epo_order_item_meta' ], 10, 3 );
		add_filter( 'wc_epo_discounted_price', [ $this, 'get_dicounted_price' ], 10, 4 );
		add_filter( 'tm_epo_settings_headers', [ $this, 'tm_epo_settings_headers' ], 10, 1 );
		add_filter( 'tm_epo_settings_settings', [ $this, 'tm_epo_settings_settings' ], 10, 1 );
		add_action( 'woocommerce_admin_settings_sanitize_option_tm_epo_apd_enable', [ $this, 'sanitize_option_tm_epo_apd_enable' ], 10, 1 );
		add_filter( 'wc_epo_product_price_rules', [ $this, 'wc_epo_product_price_rules' ], 10, 2 );
		add_filter( 'wc_epo_template_args_tm_totals', [ $this, 'wc_epo_template_args_tm_totals' ], 10, 2 );
		add_action( 'wc_epo_template_tm_totals', [ $this, 'wc_epo_template_tm_totals' ], 10, 1 );
		add_action( 'woocommerce_tm_epo_price_compatibility', [ $this, 'woocommerce_tm_epo_price_compatibility' ], 10, 1 );
		add_filter( 'epo_can_show_order_price', [ $this, 'epo_can_show_order_price' ], 10, 2 );
		add_filter( 'wc_epo_original_price_type_mode', [ $this, 'wc_epo_original_price_type_mode' ], 1, 4 );
	}

	/**
	 * Select correct original price type mode
	 *
	 * @return false
	 * @since 6.4.1
	 */
	public function wc_epo_adjust_price_before_calculate_totals() {
		return false;
	}

	/**
	 * Replace cart html prices for Dynamic Pricing for WooCommerce
	 *
	 * @access public
	 *
	 * @param string       $item_price The item price.
	 * @param array<mixed> $cart_item The cart item.
	 * @param string       $cart_item_key The cart item key.
	 *
	 * @return string
	 */
	public function woocommerce_cart_item_price( $item_price = '', $cart_item = [], $cart_item_key = '' ) {
		if ( ! isset( $cart_item['tmcartepo'] ) ) {
			return $item_price;
		}
		if ( ! isset( $cart_item['adp'] ) ) {
			return $item_price;
		}

		if ( 'advanced' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) ) {
			// Get price to display.
			$price = THEMECOMPLETE_EPO_CART()->get_price_for_cart( false, $cart_item, '', 1 );

			// Format price to display.
			$price_to_display = $price;

			$product = $cart_item['data'];

			$float_price_to_display = floatval( $product->get_price() );

			$original_price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $cart_item['tm_epo_product_original_price'], $cart_item, '', 1 );
			$float_original_price_to_display = floatval( $cart_item['tm_epo_product_original_price'] );
			if ( 'yes' === $this->get_apd_enable() ) {
				$price                  = $this->get_dicounted_price( $cart_item['tm_epo_product_original_price'], wc_get_product( themecomplete_get_id( $cart_item['data'] ) ), $cart_item_key );
				$price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $price, $cart_item, '', 1 );
				$float_price_to_display = floatval( $price );
			} else {
				$price                  = $cart_item['data']->get_price( 'edit' );
				$price                  = $price - $cart_item['tm_epo_options_prices'];
				$price_to_display       = THEMECOMPLETE_EPO_CART()->get_price_for_cart( $price, $cart_item, '', 1 );
				$float_price_to_display = floatval( $price );
			}

			if ( (string) $float_price_to_display === (string) $float_original_price_to_display ) {
				return $item_price;
			}
			$item_price = '<span class="tc-epo-cart-price"><del>' . themecomplete_price( $float_original_price_to_display ) . '</del> <ins>' . themecomplete_price( $float_price_to_display ) . '</ins></span>';
			return $item_price;
		}
		return $item_price;
	}

	/**
	 * Select correct original price type mode
	 *
	 * @param float|string $price The price to convert.
	 * @param array<mixed> $post_data The posted data.
	 * @return mixed
	 * @since 6.4.1
	 */
	public function wc_epo_original_price_type_mode( $price = '', $post_data = [] ) {
		if ( function_exists( 'adp_functions' ) ) {
			$product            = wc_get_product( $post_data['add-to-cart'] );
			$qty                = $post_data['quantity'];
			$use_empty_cart     = true;
			$calculated_product = adp_functions()->calculateProduct( $product, $qty, $use_empty_cart );
			if ( $calculated_product ) {
				if ( ( ( class_exists( '\ADP\BaseVersion\Includes\PriceDisplay\ProcessedVariableProduct' ) && $calculated_product instanceof \ADP\BaseVersion\Includes\PriceDisplay\ProcessedVariableProduct ) || ( class_exists( '\ADP\BaseVersion\Includes\PriceDisplay\ProcessedGroupedProduct' ) && $calculated_product instanceof \ADP\BaseVersion\Includes\PriceDisplay\ProcessedGroupedProduct ) ) ) {
					if ( method_exists( $calculated_product, 'getLowestPriceProduct' ) ) {
						$processed_product_lowestprice = $calculated_product->getLowestPriceProduct(); // @phpstan-ignore-line
						if ( ! is_null( $processed_product_lowestprice ) ) {
							$calculated_product = $processed_product_lowestprice;
						} else {
							return $price;
						}
					} else {
						return $price;
					}
				}
				if ( 'undiscounted' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_original_price_base' ) && isset( $post_data['tcaddtocart'] ) ) {
					$price = $calculated_product->getOriginalPrice();
				} else {
					$price = $calculated_product->getCalculatedPrice();
				}
			}
		}

		return $price;
	}

	/**
	 * Check if we can show option prices in the order
	 *
	 * @param boolean      $can true or false.
	 * @param array<mixed> $item_meta The item meta.
	 * @return boolean
	 * @since 6.4.1
	 */
	public function epo_can_show_order_price( $can = true, $item_meta = [] ) {
		$order_flag = isset( $item_meta[ $this->order_flag ] ) ? $item_meta[ $this->order_flag ] : ( isset( $item_meta[ '_' . $this->order_flag ] ) ? $item_meta[ '_' . $this->order_flag ] : [] );
		if ( is_array( $order_flag ) && count( $order_flag ) > 0 ) {
			$order_flag = $order_flag[0];
		}
		$order_flag = themecomplete_maybe_unserialize( $order_flag );
		if ( is_array( $order_flag ) && count( $order_flag ) > 0 ) {
			$order_flag = $order_flag[0];
		}
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_show_option_prices_in_order' ) && ! empty( $order_flag ) ) {
			$can = false;
		}

		return $can;
	}

	/**
	 * Alter product price
	 *
	 * @param mixed $price The price to convert.
	 * @return mixed
	 * @since 6.4.1
	 */
	public function woocommerce_tm_epo_price_compatibility( $price ) {
		return $price;
	}

	/**
	 * Add extra html data attributes
	 *
	 * @param array<mixed> $args Array or arguments.
	 * @return void
	 * @since 6.4.1
	 */
	public function wc_epo_template_tm_totals( $args ) {
		$tm_epo_apd_prefix               = $args['tm_epo_apd_prefix'];
		$tm_epo_apd_suffix               = $args['tm_epo_apd_suffix'];
		$tm_epo_apd_enable_pricing_table = $args['tm_epo_apd_enable_pricing_table'];
		$tm_epo_apd_enable               = $args['tm_epo_apd_enable'];
		$tm_epo_apd_string_placement     = $args['tm_epo_apd_string_placement'];
		$tm_epo_apd_label_css_selector   = $args['tm_epo_apd_label_css_selector'];
		$tm_epo_apd_original_price_base  = $args['tm_epo_apd_original_price_base'];

		echo 'data-tm-epo-apd-enable-pricing-table="' . esc_attr( $tm_epo_apd_enable_pricing_table ) . '" data-tm-epo-apd-prefix="' . esc_attr( $tm_epo_apd_prefix ) . '" data-tm-epo-apd-suffix="' . esc_attr( $tm_epo_apd_suffix ) . '" ';

		echo 'data-tm-epo-apd-string-placement="' . esc_attr( $tm_epo_apd_string_placement ) . '" ';
		echo 'data-tm-epo-apd-label-css-selector="' . esc_attr( $tm_epo_apd_label_css_selector ) . '" ';
		echo 'data-tm-epo-apd-original-price-base="' . esc_attr( $tm_epo_apd_original_price_base ) . '" ';

		if ( class_exists( 'RP_WCDPD_Settings' ) && class_exists( 'RP_WCDPD_Promotion_Display_Price_Override' ) && RP_WCDPD_Settings::get( 'promo_display_price_override' ) ) {
			echo 'data-tm-epo-apd-price-override="1" ';
		}

		if ( defined( 'RP_WCDPD_VERSION' ) && version_compare( RP_WCDPD_VERSION, '2.2', '>=' ) ) {
			echo 'data-tm-epo-apd-product-price-discounted="1" ';
		}

		echo 'data-tm-epo-apd-attributes-to-id="' . esc_attr( $args['attributes_to_id'] ) . '" ';
		echo 'data-tm-epo-apd-enable="' . esc_attr( $tm_epo_apd_enable ) . '" ';
		if ( class_exists( 'RP_WCDPD_Settings' ) && RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) {
			echo 'data-tm-epo-apd-change-display-prices="' . esc_attr( RP_WCDPD_Settings::get( 'product_pricing_change_display_prices' ) ) . '" ';
		}
	}

	/**
	 * Add extra arguments to the totals template
	 *
	 * @param array<mixed> $args Array or arguments.
	 * @param object       $product The product object.
	 * @return array<mixed>
	 * @since 6.4.1
	 */
	public function wc_epo_template_args_tm_totals( $args, $product ) {
		$args['tm_epo_apd_suffix']               = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_suffix' );
		$args['tm_epo_apd_prefix']               = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_prefix' );
		$args['tm_epo_apd_enable_pricing_table'] = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_enable_pricing_table' );
		$args['tm_epo_apd_enable']               = $this->get_apd_enable( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_enable' ) );
		$args['tm_epo_apd_string_placement']     = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_string_placement' );
		$args['tm_epo_apd_label_css_selector']   = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_label_css_selector' );
		$args['tm_epo_apd_original_price_base']  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_original_price_base' );

		$args['fields_price_rules'] = ( 'no' === $args['tm_epo_apd_enable'] ) ? $args['fields_price_rules'] : 1;

		if ( '1' === $args['price_override'] ) {
			$args['fields_price_rules'] = 1;
		}

		$attributes_to_id = [];
		if ( $product instanceof WC_Product && 'variable' === themecomplete_get_product_type( $product ) ) {

			$attributes_ids = $product->get_attributes();

			$pid = themecomplete_get_id( $product );

			foreach ( $attributes_ids as $attkey => $attvalue ) {

				$terms = wp_get_post_terms( $pid, $attkey, [ 'fields' => 'all' ] );
				if ( ! is_wp_error( $terms ) ) {
					foreach ( $terms as $term ) {
						$attributes_to_id[ 'attribute_' . $attkey ][ $term->slug ] = $term->term_id;
					}
				}
			}
		}

		$args['attributes_to_id'] = esc_html( (string) wp_json_encode( (array) $attributes_to_id ) );

		return $args;
	}

	/**
	 * Get product price rules
	 *
	 * @param array<mixed> $price Price array.
	 * @param object|null  $product The product object.
	 * @return array<mixed>
	 * @since 6.4.1
	 */
	public function wc_epo_product_price_rules( $price = [], $product = null ) {
		if ( $this->is_apd_enabled() && $product instanceof WC_Product ) {
			$check_price = $this->get_product_price_rules( $product );
			if ( $check_price ) {
				$price['product'] = [];
				if ( $check_price['is_multiprice'] ) {
					foreach ( $check_price['rules'] as $variation_id => $variation_rule ) {
						foreach ( $variation_rule as $rulekey => $pricerule ) {
							$price['product'][ $variation_id ][] = [
								'min'        => $pricerule['min'],
								'max'        => INF !== $pricerule['max'] ? $pricerule['max'] : '',
								'value'      => ( 'percentage' !== $pricerule['type'] ) ? apply_filters( 'wc_epo_product_price', $pricerule['value'] ) : $pricerule['value'],
								'type'       => $pricerule['type'],
								'conditions' => [],
							];
						}
					}
				} else {
					foreach ( $check_price['rules'] as $rulekey => $pricerule ) {
						$price['product'][0][] = [
							'min'        => $pricerule['min'],
							'max'        => INF !== $pricerule['max'] ? $pricerule['max'] : '',
							'value'      => ( 'percentage' !== $pricerule['type'] ) ? apply_filters( 'wc_epo_product_price', $pricerule['value'] ) : $pricerule['value'],
							'type'       => $pricerule['type'],
							'conditions' => [],
						];
					}
				}
			}
			$price['price'] = apply_filters( 'woocommerce_tm_epo_price_compatibility', apply_filters( 'wc_epo_product_price', $product->get_price() ) );
		}

		return $price;
	}

	/**
	 * Add order item meta
	 *
	 * @param WC_Order_Item $item The order item object.
	 * @param string        $cart_item_key The cart item key.
	 * @param array<mixed>  $values Array of value.
	 * @return void
	 * @since 6.4.1
	 */
	public function wc_epo_order_item_meta( $item, $cart_item_key, $values ) {
		if ( ! empty( $values['tmcartepo'] ) ) {
			$item->add_meta_data( '_' . $this->order_flag, [ 1 ] );
		}
	}

	/**
	 * Add plugin setting (header)
	 *
	 * @param array<mixed> $headers Array of settings.
	 * @return array<mixed>
	 * @since 6.4.1
	 */
	public function tm_epo_settings_headers( $headers = [] ) {
		$headers['apd'] = [ 'tcfa tcfa-percentage', esc_html__( 'Advanced Dynamic Pricing', 'woocommerce-tm-extra-product-options' ) ];

		return $headers;
	}

	/**
	 * Get default apd_enable setting
	 *
	 * @param string $default_value The default value.
	 * @return string
	 * @since 6.4.1
	 */
	public function get_apd_enable( $default_value = 'no' ) {
		$default_tm_epo_apd_enable = $default_value;
		if ( function_exists( 'adp_context' ) ) {
			$cnxt        = adp_context();
			$adp_setting = $cnxt->getCompatibilitySettings()->getOption( 'dont_apply_discount_to_addons' );
			if ( ! is_null( $adp_setting ) ) {
				if ( $adp_setting ) {
					$default_tm_epo_apd_enable = 'no';
				} else {
					$default_tm_epo_apd_enable = 'yes';
				}
			}
		}
		return $default_tm_epo_apd_enable;
	}

	/**
	 * Returns the correct apd_enable value.
	 *
	 * @param string $value The value.
	 * @return string
	 * @since 1.0
	 */
	public function sanitize_option_tm_epo_apd_enable( $value ) {
		if ( function_exists( 'adp_context' ) ) {
			$cnxt = adp_context();
			if ( 'yes' === $value ) {
				$default_apd_enable = false;
			} else {
				$default_apd_enable = true;
			}
			$cnxt->getCompatibilitySettings()->set( 'dont_apply_discount_to_addons', $default_apd_enable );
			$cnxt->getCompatibilitySettings()->save();
		}
		return $value;
	}

	/**
	 * Add plugin setting (setting)
	 *
	 * @param array<mixed> $settings Array of settings.
	 * @return array<mixed>
	 * @since 6.4.1
	 */
	public function tm_epo_settings_settings( $settings = [] ) {
		$label = esc_html__( 'Advanced Dynamic Pricing', 'woocommerce-tm-extra-product-options' );

		// Set correct tm_epo_apd_enable.
		$tm_epo_apd_enable = get_option( 'tm_epo_apd_enable' );
		$get_apd_enable    = $this->get_apd_enable( $tm_epo_apd_enable );
		if ( $tm_epo_apd_enable !== $get_apd_enable ) {
			update_option( 'tm_epo_apd_enable', $get_apd_enable );
		}

		$settings['dpd'] = [
			[
				'type'  => 'tm_title',
				'id'    => 'epo_page_options',
				'title' => $label,
			],
			[
				'title'    => esc_html__( 'Enable discounts on extra options', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enabling this will extend product discounts to include extra options. This configuration will automatically synchronize with the setting of the discount plugin.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_enable',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => $get_apd_enable,
				'type'     => 'select',
				'options'  => [
					'no'  => esc_html__( 'Disable', 'woocommerce-tm-extra-product-options' ),
					'yes' => esc_html__( 'Enable', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Base original price type according to', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Set to what price types will base their original price on.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_original_price_base',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => '',
				'type'     => 'select',
				'options'  => [
					''             => esc_html__( 'No change', 'woocommerce-tm-extra-product-options' ),
					'undiscounted' => esc_html__( 'Undiscounted product price', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'   => esc_html__( 'Enable alteration of pricing table', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Check to enable the inclusion of option prices to the pricing table.', 'woocommerce-tm-extra-product-options' ) . '</span>',
				'id'      => 'tm_epo_apd_enable_pricing_table',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'title'    => esc_html__( 'Prefix label', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Display a prefix label on product page.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_prefix',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Suffix label', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Display a suffix label on product page.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_suffix',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Label CSS selector', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Enter a CSS selector to override the default label where the discount string will be displayed.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_label_css_selector',
				'default'  => '',
				'type'     => 'text',
				'desc_tip' => false,
			],
			[
				'title'    => esc_html__( 'Discount string placement', 'woocommerce-tm-extra-product-options' ),
				'desc'     => esc_html__( 'Select the placement of the discounted string compared to the label.', 'woocommerce-tm-extra-product-options' ),
				'id'       => 'tm_epo_apd_string_placement',
				'class'    => 'chosen_select',
				'css'      => 'min-width:300px;',
				'default'  => 'no',
				'type'     => 'select',
				'options'  => [
					'after'  => esc_html__( 'After', 'woocommerce-tm-extra-product-options' ),
					'before' => esc_html__( 'Before', 'woocommerce-tm-extra-product-options' ),
				],
				'desc_tip' => false,
			],
			[
				'title'   => esc_html__( 'Enable showing option prices in the Order', 'woocommerce-tm-extra-product-options' ),
				'desc'    => esc_html__( 'Enable this at your own risk since it is not possible to calculate option discounts on the Order page.', 'woocommerce-tm-extra-product-options' ),
				'id'      => 'tm_epo_apd_show_option_prices_in_order',
				'default' => 'no',
				'type'    => 'checkbox',
			],
			[
				'type' => 'tm_sectionend',
				'id'   => 'epo_page_options',
			],

		];

		return $settings;
	}

	/**
	 * Calculates the new price after applying a discount amount to the original price.
	 *
	 * @param float $price The original price.
	 * @param float $discount_amount The discount amount to be subtracted from the original price.
	 *
	 * @return float
	 */
	protected function make_discount_amount( $price, $discount_amount ) {
		return $this->check_discount( $price, (float) $price - (float) $discount_amount );
	}

	/**
	 * Calculates the new price after adding an overprice amount to the original price.
	 *
	 * @param float $price The original price.
	 * @param float $overprice_amount The overprice amount to be added to the original price.
	 *
	 * @return float
	 */
	protected function make_overprice_amount( $price, $overprice_amount ) {
		return $this->check_overprice( $price, (float) $price + (float) $overprice_amount );
	}

	/**
	 * Calculates the new price after applying a percentage discount or overprice to the original price.
	 *
	 * @param float $price The original price.
	 * @param float $percentage The percentage to be applied (positive for discount, negative for overprice).
	 *
	 * @return float
	 */
	protected function make_discount_percentage( $price, $percentage ) {
		if ( $percentage < 0 ) {
			return $this->check_overprice( $price, (float) $price * ( 1 - (float) $percentage / 100 ) );
		}

		return $this->check_discount( $price, (float) $price * ( 1 - (float) $percentage / 100 ) );
	}

	/**
	 * Ensures that the new price after an overprice is non-negative and not less than the original price.
	 *
	 * @param float $old_price The original price.
	 * @param float $new_price The new price after applying an overprice.
	 *
	 * @return float
	 */
	private function check_overprice( $old_price, $new_price ) {
		$new_price = max( $new_price, 0.0 );
		$new_price = max( $new_price, $old_price );

		return (float) $new_price;
	}

	/**
	 * Determines the final price by choosing between
	 * the original price and a fixed value,
	 * ensuring that it is the maximum of the two.
	 *
	 * @param float $price The original price.
	 * @param float $value The fixed value to compare with the original price.
	 *
	 * @return float
	 */
	protected function make_price_fixed( $price, $value ) {
		$value = floatval( $value );
		if ( $price < $value ) {
			return $this->check_overprice( $price, $value );
		}

		return $this->check_discount( $price, $value );
	}

	/**
	 * Ensures that the new price after a discount is non-negative
	 * and not greater than the original price.
	 *
	 * @param float $old_price The original price.
	 * @param float $new_price The new price after applying a discount.
	 *
	 * @return float
	 */
	private function check_discount( $old_price, $new_price ) {
		$new_price = max( $new_price, 0.0 );
		$new_price = min( $new_price, $old_price );

		return (float) $new_price;
	}

	/**
	 * Get Dynamic Pricing for WooCommerce price for options
	 * modified from get version from Pricing class
	 *
	 * @param float        $field_price The field price.
	 * @param string       $cart_item_key The cart item key.
	 * @param array<mixed> $pricing The pricing object.
	 * @param boolean      $force true or false.
	 * @return mixed
	 * @since 6.4.1
	 */
	private function get_single_dicounted_price( $field_price, $cart_item_key, $pricing = [], $force = false ) {
		if ( empty( $cart_item_key ) || 'no' === $this->get_apd_enable( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_apd_enable' ) ) && ! $force ) {
			return $field_price;
		}

		// ADP does not return correct results for negative prices.
		$is_negative = false;
		if ( $field_price < 0 ) {
			$field_price = abs( $field_price );
			$is_negative = true;
		}

		$price          = $field_price;
		$original_price = $price;

		if ( is_array( $pricing ) ) {
			$cart_item = WC()->cart->cart_contents[ $cart_item_key ];
			$quantity  = isset( $cart_item['quantity'] ) ? (float) $cart_item['quantity'] : 1;
			$discount  = 'ADP\\BaseVersion\\Includes\\Core\\Rule\\Structures\\Discount';
			if ( class_exists( $discount ) ) {
				foreach ( $pricing as $rule ) {
					$operation_type  = $rule['type'];
					$operation_value = $rule['value'];
					if ( $quantity >= (float) $rule['min'] && ( $quantity <= (float) $rule['max'] || '' === $rule['max'] ) ) {
						if ( $discount::TYPE_FREE === $operation_type ) {
							$price = 0.0;
						} elseif ( $discount::TYPE_AMOUNT === $operation_type ) {
							if ( $operation_value > 0 ) {
								$price = $this->make_discount_amount( $price, $operation_value );
							} else {
								$price = $this->make_overprice_amount( $price, ( -1 ) * $operation_value );
							}
						} elseif ( $discount::TYPE_PERCENTAGE === $operation_type ) {
							$price = $this->make_discount_percentage( $price, $operation_value );
						} elseif ( $discount::TYPE_FIXED_VALUE === $operation_type ) {
							$price = $this->make_price_fixed( $price, $operation_value );
						}
					}
				}
			}
		}

		if ( $price !== $original_price ) {
			if ( $is_negative ) {
				$price = -1 * $price;
			}
			return $price;
		}

		if ( $is_negative ) {
			$field_price = -1 * $field_price;
		}
		return $field_price;
	}

	/**
	 * Get Dynamic Pricing for WooCommerce price rules
	 *
	 * @param float|null  $field_price The field price.
	 * @param mixed       $product The product object.
	 * @param string|null $cart_item_key The cart item key.
	 * @param boolean     $force true or false.
	 * @return mixed
	 */
	public function get_dicounted_price( $field_price = null, $product = null, $cart_item_key = null, $force = false ) {
		$price = null;

		if ( $this->is_apd_enabled() ) {
			$table_data = $this->get_product_price_rules( $product );
			if ( is_array( $table_data ) && isset( $table_data['rules'] ) ) {
				$table_data = $table_data['rules'];
				if ( null !== $field_price && null !== $cart_item_key ) {
					return $this->get_single_dicounted_price( $field_price, $cart_item_key, $table_data, $force );
				}
			}
		}
		if ( null !== $field_price ) {
			$price = $field_price;
		}

		return $price;
	}

	/**
	 * Get Dynamic Pricing for WooCommerce price rules
	 *
	 * @param mixed $product The product object.
	 * @return mixed
	 */
	public function get_product_price_rules( $product = null ) {
		$price = null;

		if ( $this->is_apd_enabled() ) {
			$price = [];

			$all_rules  = [];
			$table_data = [];

			if ( ! $product->is_type( 'variable' ) && ! $product->is_type( 'variation' ) ) {
				$price['is_multiprice'] = false;

				$adp_cmp       = new $this->class_name();
				$product_rules = method_exists( $adp_cmp, 'calculateRulesForProduct' ) ? $adp_cmp->calculateRulesForProduct( $product ) : [];
				if ( ! $product_rules ) {
					$product_rules = [];
				}

				$all_rules = [];
				foreach ( $product_rules as $rule ) {
					$all_rules[] = [
						'rule' => $rule,
					];
				}
			} else {
				if ( $product->is_type( 'variation' ) ) {
					$product = wc_get_product( $product->get_parent_id() );
				}
				$variation_rules = [];
				foreach ( $product->get_available_variations() as $variation_data ) {
					$variation = wc_get_product( $variation_data['variation_id'] );

					$adp_cmp       = new $this->class_name();
					$product_rules = method_exists( $adp_cmp, 'calculateRulesForProduct' ) ? $adp_cmp->calculateRulesForProduct( $variation ) : [];
					if ( ! $product_rules ) {
						$product_rules = [];
					}
					foreach ( $product_rules as $k => $rule ) {
						$variation_rules[ $variation_data['variation_id'] ][] = [
							'rule' => $rule,
						];
					}
				}

				$all_rules              = $variation_rules;
				$price['is_multiprice'] = true;
			}

			$keys_to_check = [ 'product_discount', 'bulk_discount', 'role_discounts' ];

			if ( ! $price['is_multiprice'] ) {
				foreach ( $all_rules as $single ) {
					$_rule = $single['rule'];
					if ( ! $_rule ) {
						continue;
					}

					$exclusive = isset( $_rule['rule_type'] ) && 'exclusive' === $_rule['rule_type'];

					if ( $exclusive ) {
						$table_data = [];
					}

					$intersection = array_intersect( $keys_to_check, array_keys( $_rule ) );
					$mode         = reset( $intersection );

					switch ( $mode ) {
						case 'product_discount':
							$table_data[] = [
								'min'        => 1,
								'max'        => '',
								'type'       => $_rule[ $mode ]['discount_type'],
								'value'      => $_rule[ $mode ]['value'],
								'conditions' => [],
							];
							break;
						case 'bulk_discount':
							$pricing_method  = $_rule[ $mode ]['discount_type'];
							$quantity_ranges = $_rule[ $mode ]['ranges'];
							foreach ( $quantity_ranges as $quantity_range ) {
								$table_data[] = [
									'min'        => $quantity_range['from'],
									'max'        => $quantity_range['to'],
									'type'       => $pricing_method,
									'value'      => $quantity_range['value'],
									'conditions' => [],
								];
							}
							break;
						case 'role_discounts':
							$quantity_ranges = $_rule[ $mode ];
							foreach ( $quantity_ranges as $quantity_range ) {
								$table_data[] = [
									'min'        => 1,
									'max'        => '',
									'type'       => $quantity_range['discount_type'],
									'value'      => $quantity_range['value'],
									'conditions' => [],
								];
							}
							break;
					}

					if ( $exclusive ) {
						break;
					}
				}
			} else {
				foreach ( $all_rules as $vid => $vidsingle ) {
					foreach ( $vidsingle as $single ) {
						$_rule = $single['rule'];
						if ( ! $_rule ) {
							continue;
						}

						$exclusive = isset( $_rule['rule_type'] ) && 'exclusive' === $_rule['rule_type'];

						if ( $exclusive ) {
							$table_data[ $vid ] = [];
						}

						$intersection = array_intersect( $keys_to_check, array_keys( $_rule ) );
						$mode         = reset( $intersection );

						switch ( $mode ) {
							case 'product_discount':
								$table_data[ $vid ][] = [
									'min'        => 1,
									'max'        => '',
									'type'       => $_rule[ $mode ]['discount_type'],
									'value'      => $_rule[ $mode ]['value'],
									'conditions' => [],
								];
								break;
							case 'bulk_discount':
								$pricing_method  = $_rule[ $mode ]['discount_type'];
								$quantity_ranges = $_rule[ $mode ]['ranges'];
								foreach ( $quantity_ranges as $quantity_range ) {
									$table_data[ $vid ][] = [
										'min'        => $quantity_range['from'],
										'max'        => $quantity_range['to'],
										'type'       => $pricing_method,
										'value'      => $quantity_range['value'],
										'conditions' => [],
									];
								}
								break;
							case 'role_discounts':
								$quantity_ranges = $_rule[ $mode ];
								foreach ( $quantity_ranges as $quantity_range ) {
									$table_data[ $vid ][] = [
										'min'        => 1,
										'max'        => '',
										'type'       => $quantity_range['discount_type'],
										'value'      => $quantity_range['value'],
										'conditions' => [],
									];
								}
								break;
						}

						if ( $exclusive ) {
							break;
						}
					}
				}
			}
			$price['rules'] = $table_data;
		}

		return $price;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-nyp.php000064400000003070150755142450021324 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Name Your Price
 * https://woocommerce.com/products/name-your-price/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_NYP {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_NYP|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_NYP
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		if ( ! class_exists( 'WC_Name_Your_Price' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-nyp', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-nyp.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-quickview.php000064400000030474150755142450022535 0ustar00<?php // phpcs:disable WordPress.Security.NonceVerification
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility
 * with various quick view plugins
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Quickview {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Quickview|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * WooCommerce Quick View Pro REST route flag
	 *
	 * @var array<mixed>
	 */
	private $routes = [];

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Quickview
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wc_epo_add_compatibility', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 11 );
		add_filter( 'woocommerce_tm_quick_view', [ $this, 'woocommerce_tm_quick_view' ], 10, 3 );
		add_filter( 'wc_epo_get_quickview_array', [ $this, 'get_epo_quickview_array' ] );
		add_filter( 'wc_epo_get_quickview_containers', [ $this, 'wc_epo_get_quickview_containers' ] );
		add_filter( 'rest_request_before_callbacks', [ $this, 'rest_request_before_callbacks' ], 10, 3 );
	}

	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 6.0
	 */
	public function wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-quickview', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-quickview.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}

	/**
	 * Get html containers
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function wc_epo_get_quickview_containers() {
		$quickview_array = $this->get_epo_quickview_array();
		$qv              = [];

		foreach ( $quickview_array as $key => $value ) {
			$qv[ $key ] = $value ['container'];
		}

		return $qv;
	}

	/**
	 * Get supported quickviews
	 *
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_epo_quickview_array() {
		$quickview_array = [
			// WooCommerce Quick View (https://woocommerce.com/products/woocommerce-quick-view/).
			'woothemes_quick_view'        => [
				'container' => '.woocommerce.quick-view',
				'is'        => ( isset( $_GET['wc-api'] ) && 'WC_Quick_View' === $_GET['wc-api'] ),
			],

			// Flatsome theme.
			'theme_flatsome_quick_view'   => [
				'container' => '.product-lightbox',
				'is'        => ( isset( $_POST['action'] ) && ( 'jck_quickview' === $_POST['action'] || 'ux_quickview' === $_POST['action'] || 'flatsome_quickview' === $_POST['action'] ) ),
			],

			// kleo theme.
			'theme_kleo_quick_view'       => [
				'container' => '#productModal',
				'is'        => ( isset( $_POST['action'] ) && ( 'woo_quickview' === $_POST['action'] ) ),
			],

			// YITH WooCommerce Quick View (https://yithemes.com/themes/plugins/yith-woocommerce-quick-view/).
			'yith_quick_view'             => [
				'container' => '#yith-quick-view-modal,.yith-quick-view.yith-modal,.yith-quick-view.yith-inline',
				'is'        => ( ( isset( $_POST['action'] ) && ( 'yith_load_product_quick_view' === $_POST['action'] ) ) || ( isset( $_GET['action'] ) && ( 'yith_load_product_quick_view' === $_GET['action'] ) ) ),
			],

			// Venedor theme.
			'venedor_quick_view'          => [
				'container' => '.quickview-wrap',
				'is'        => ( isset( $_GET['action'] ) && ( 'venedor_product_quickview' === $_GET['action'] ) ),
			],

			// Rubbex theme.
			'rubbez_quick_view'           => [
				'container' => '#quickview-content',
				'is'        => ( isset( $_POST['action'] ) && ( 'product_quickview' === $_POST['action'] ) ),
			],

			// WooCommerce Quickview (https://iconicwp.com/products/woocommerce-quickview/).
			'jckqv_quick_view'            => [
				'container' => '#jckqv',
				'is'        => ( isset( $_POST['action'] ) && ( 'jckqv' === $_POST['action'] ) ),
			],

			// Themify theme quick view.
			'themify_quick_view'          => [
				'container' => '#product_single_wrapper',
				'is'        => ( isset( $_GET['ajax'] ) && 'true' === $_GET['ajax'] ),
			],

			// Porto theme.
			'porto_quick_view'            => [
				'container' => '.quickview-wrap',
				'is'        => ( isset( $_GET['action'] ) && ( 'porto_product_quickview' === $_GET['action'] ) ),
			],

			// DHWCLayout - Woocommerce Products Layouts (http://codecanyon.net/item/woocommerce-products-layouts/7384574?).
			'woocommerce_product_layouts' => [
				'container' => '.dhvc-woo-product-quickview',
				'is'        => ( isset( $_POST['action'] ) && ( 'dhvc_woo_product_quickview' === $_POST['action'] ) ),
			],

			// Woo Product Quick View (http://codecanyon.net/item/woocommerce-product-quick-view/11293528?).
			'nm_getproduct'               => [
				'container' => '#popup',
				'is'        => ( isset( $_POST['action'] ) && ( 'nm_getproduct' === $_POST['action'] ) ),
			],

			// WooCommerce LightBox PRO (http://wpbean.com/).
			'lightboxpro'                 => [
				'container' => '.wpb_wl_quick_view_content',
				'is'        => ( isset( $_POST['action'] ) && ( 'wpb_wl_quickview' === $_POST['action'] ) ),
			],

			// woodmart theme.
			'woodmart_quick_view'         => [
				'container' => '.product-quick-view',
				'is'        => ( isset( $_GET['action'] ) && ( 'woodmart_quick_view' === $_GET['action'] ) ),
			],

			// woodmart theme.
			'woodmart_quick_shop'         => [
				'container' => '.product-grid-item.product.wd-loading-quick-shop',
				'is'        => ( isset( $_GET['action'] ) && ( 'woodmart_quick_shop' === $_GET['action'] ) ),
			],

			// the gem theme.
			'thegem_product_quick_view'   => [
				'container' => '.woo-modal-product',
				'is'        => ( isset( $_POST['action'] ) && ( 'thegem_product_quick_view' === $_POST['action'] ) ),
			],

			// WooCommerce Interactive Product Quick View (https://codecanyon.net/item/woo-quick-view-interactive-product-quick-view-modal-for-woocommerce/19801709).
			'wooqv_quick_view'            => [
				'container' => '.woo-quick-view',
				'is'        => ( isset( $_POST['action'] ) && ( 'wooqv_quick_view' === $_POST['action'] ) ),
			],

			// Ocean WP Theme.
			'oceanwp_product_quick_view'  => [
				'container' => '.owp-qv-content-wrap',
				'is'        => ( isset( $_GET['action'] ) && ( 'oceanwp_product_quick_view' === $_GET['action'] ) ),
			],

			// WPC Smart Quick View for WooCommerce (https://wordpress.org/plugins/woo-smart-quick-view/).
			'woosq_quickview'             => [
				'container' => '#woosq-popup',
				'is'        => ( isset( $_GET['action'] ) && ( 'woosq_quickview' === $_GET['action'] ) ),
			],

			// WooCommerce Quick View (https://wordpress.org/plugins/woo-quick-view/).
			'wcqv_get_product'            => [
				'container' => '#wcqv_contend',
				'is'        => ( isset( $_GET['action'] ) && ( 'wcqv_get_product' === $_GET['action'] ) ),
			],

			// Grace theme (https://demo.themedelights.com/Wordpress/WP001/).
			'quickview_ajax'              => [
				'container' => '#quickview-modal',
				'is'        => ( isset( $_POST['action'] ) && ( 'quickview_ajax' === $_POST['action'] ) ),
			],

			// WP Food ordering and Restaurant Menu (https://exthemes.net/wp-food-lite).
			'wp_food'                     => [
				'container' => '#food_modal',
				'is'        => ( isset( $_POST['action'] ) && ( 'exfood_booking_info' === $_POST['action'] ) ),
			],

			// WooCommerce Quick View Pro (https://barn2.co.uk/wordpress-plugins/woocommerce-quick-view-pro/).
			'quickview_pro'               => [
				'container' => '.wc-quick-view-modal',
				'is'        => ( isset( $this->routes['wc-quick-view-pro'] ) && ( true === $this->routes['wc-quick-view-pro'] ) ),
			],

			// WooFood plugin (https://www.wpslash.com/plugin/woofood/).
			'woofood'                     => [
				'container' => '.wf_product_view',
				'is'        => ( isset( $_POST['action'] ) && ( 'woofood_quickview_ajax' === $_POST['action'] ) ),
			],

			// WooCommerce Food (https://exthemes.net/woocommerce-food/).
			'exwoofood_booking_info'      => [
				'container' => '#food_modal',
				'is'        => ( isset( $_POST['action'] ) && ( 'exwoofood_booking_info' === $_POST['action'] ) ),
			],

			// JetElements For Elementor.
			'jet_popup_get_content'       => [
				'container' => '.jet-popup',
				'is'        => ( isset( $_POST['action'] ) && ( 'jet_popup_get_content' === $_POST['action'] ) ),
			],

			// Salient theme.
			'nectar_woo_get_product'      => [
				'container' => '.nectar-quick-view-box',
				'is'        => ( isset( $_POST['action'] ) && ( 'nectar_woo_get_product' === $_POST['action'] ) ),
			],

			// Avada quick view.
			'fusion_quick_view_load'      => [
				'container' => '.fusion-woocommerce-quick-view-container',
				'is'        => ( isset( $_POST['action'] ) && ( 'fusion_quick_view_load' === $_POST['action'] ) ),
			],

			// CiyaShop quick view.
			'ciyashop_quick_view'         => [
				'container' => '.product-quick-view',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'ciyashop_quick_view' === $_REQUEST['action'] ) ),
			],

			// Quick View for WooCommerce (https://wordpress.org/plugins/woo-quickview/).
			'wqv_popup_content'           => [
				'container' => '#wqv-quick-view-content',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'wqv_popup_content' === $_REQUEST['action'] ) ),
			],

			// xstore theme.
			'etheme_product_quick_view'   => [
				'container' => '.et-popup-content',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'etheme_product_quick_view' === $_REQUEST['action'] ) ),
			],

			// WooCommerce Quick View Builder for Elementor Page Builder.
			'mst_wcqvfepb_load_popup'     => [
				'container' => '.mst-wcqvfepb-popup-container',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'mst_wcqvfepb_load_popup' === $_REQUEST['action'] ) ),
			],

			// Quick View WooCommerce Premium (https://xootix.com/plugins/quick-view-for-woocommerce/).
			'xoo_qv_ajax'                 => [
				'container' => '.xoo-qv-container',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'xoo_qv_ajax' === $_REQUEST['action'] ) ),
			],

			// Quick View for blocksy theme (https://creativethemes.com/blocksy/).
			'blocsky_get_woo_quick_view'  => [
				'container' => '.ct-panel.quick-view-modal',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'blocsky_get_woo_quick_view' === $_REQUEST['action'] ) ),
			],

			// Quick View for Goya theme (https://themeforest.net/item/goya-modern-woocommerce-theme/25175097).
			'goya_product_ajax'           => [
				'container' => '#et-quickview',
				'is'        => ( isset( $_REQUEST['action'] ) && ( 'goya_product_ajax' === $_REQUEST['action'] ) ),
			],

		];

		return apply_filters( 'wc_epo_quickview_array', $quickview_array );
	}

	/**
	 * Check if we are in a supported quickview
	 *
	 * @return boolean
	 * @param boolean $qv if we are in a supported quick view.
	 * @since 1.0
	 */
	public function woocommerce_tm_quick_view( $qv ) {
		$quickview_array = $this->get_epo_quickview_array();

		foreach ( $quickview_array as $key => $value ) {
			if ( ! empty( $value['is'] ) ) {
				$qv = true;
			}
		}

		return apply_filters( 'wc_epo_is_quickview', $qv );
	}

	/**
	 * Filters the response before executing any REST API callbacks
	 *
	 * @param WP_REST_Response|WP_HTTP_Response|WP_Error|mixed $response Result to send to the client.
	 *                                                                   Usually a WP_REST_Response or WP_Error.
	 * @param array<mixed>                                     $handler  Route handler used for the request.
	 * @param mixed                                            $request  Request used to generate the response.
	 * @return mixed
	 * @since 1.0
	 */
	public function rest_request_before_callbacks( $response, $handler, $request ) {
		if ( $request instanceof WP_REST_Request ) {
			$route = $request->get_route();
			$route = explode( '/', $route );
			if ( isset( $route[1] ) && 'wc-quick-view-pro' === $route[1] ) {
				$this->routes['wc-quick-view-pro'] = true;
				THEMECOMPLETE_EPO()->init_settings();
			}
		}

		return $response;
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-fop.php000064400000003100150755142450021274 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * Food Online Premium for WooCommerce
 * https://arosoft.se/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_FOP {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_FOP|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_FOP
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'plugins_loaded', [ $this, 'add_compatibility' ], 2 );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {

		if ( ! class_exists( 'Food_Online' ) ) {
			return;
		}

		add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ], 4 );
	}


	/**
	 * Enqueue scripts
	 *
	 * @return void
	 * @since 1.0
	 */
	public function wp_enqueue_scripts() {
		// Cannot for loading scripts here as this plugin can be laoded anywhere.
		wp_enqueue_script( 'themecomplete-comp-fop', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-fop.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-themes.php000064400000004352150755142450022007 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * various themes
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_Themes {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_Themes|null
	 * @since 5.0.12.4
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_Themes
	 * @since 5.0.12.4
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 5.0.12.4
	 */
	public function __construct() {
		add_action( 'wp', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 5.0.12.4
	 */
	public function add_compatibility() {
		if ( defined( 'WOODMART_SLUG' ) ) {
			add_action( 'woodmart_after_footer', [ $this, 'woodmart_after_footer' ], 998 );
			add_action( 'woodmart_after_footer', [ $this, 'woodmart_after_footer2' ], 1000 );
			add_action( 'woodmart_before_wp_footer', [ $this, 'woodmart_after_footer' ], 998 );
			add_action( 'woodmart_before_wp_footer', [ $this, 'woodmart_after_footer2' ], 1000 );
			add_action( 'wp_enqueue_scripts', [ $this, 'woodmart_wp_enqueue_scripts' ], 11 );
		}
	}

	/**
	 * Woodmart sticky add to cart
	 *
	 * @return void
	 * @since 5.0.12.4
	 */
	public function woodmart_after_footer() {
		THEMECOMPLETE_EPO_DISPLAY()->block_epo = true;
	}

	/**
	 * Woodmart sticky add to cart
	 *
	 * @return void
	 * @since 5.0.12.4
	 */
	public function woodmart_after_footer2() {
		THEMECOMPLETE_EPO_DISPLAY()->block_epo = false;
	}

	/**
	 * Woodmart sticky add to cart
	 *
	 * @return void
	 * @since 5.0.12.4
	 */
	public function woodmart_wp_enqueue_scripts() {
		if ( THEMECOMPLETE_EPO()->can_load_scripts() ) {
			wp_enqueue_script( 'themecomplete-comp-woodmart', THEMECOMPLETE_EPO_COMPATIBILITY_URL . 'assets/js/cp-woodmart.js', [ 'jquery' ], THEMECOMPLETE_EPO_VERSION, true );
		}
	}
}
includes/compatibility/classes/class-themecomplete-epo-cp-theseoframework.php000064400000003245150755142450023727 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for providing compatibility with
 * The SEO Framework
 * https://wordpress.org/plugins/autodescription/
 *
 * @package Extra Product Options/Compatibility
 * @version 6.4
 */
final class THEMECOMPLETE_EPO_CP_TheSeoFramework {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_CP_TheSeoFramework|null
	 * @since 1.0
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_CP_TheSeoFramework
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		add_action( 'wc_epo_add_compatibility', [ $this, 'add_compatibility' ] );
	}

	/**
	 * Add compatibility hooks and filters
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		add_filter( 'the_seo_framework_do_adjust_archive_query', [ $this, 'the_seo_framework_do_adjust_archive_query' ], 10, 2 );
	}

	/**
	 * Alters archive query functionality
	 *
	 * @param boolean  $ret Whether to adjust the query.
	 * @param WP_Query $query The query object.
	 * @return boolean
	 */
	public function the_seo_framework_do_adjust_archive_query( $ret, $query ) {

		$post_type = $query->get( 'post_type', false );

		if ( THEMECOMPLETE_EPO_GLOBAL_POST_TYPE === $post_type ) {
			return false;
		}

		return $ret;
	}
}
includes/compatibility/classes/index.php000064400000000126150755142450014507 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/compatibility/class-themecomplete-epo-compatibility-base.php000064400000006534150755142450022252 0ustar00<?php
/**
 * Compatibility class
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Compatibility class
 *
 * This class is responsible for loading the
 * compatibility classes for the supported plugins.
 *
 * @package Extra Product Options/Compatibility
 * @version 6.0
 */
final class THEMECOMPLETE_EPO_COMPATIBILITY_Base {

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_EPO_COMPATIBILITY_Base|null
	 */
	protected static $instance = null;

	/**
	 * Ensures only one instance of the class is loaded or can be loaded.
	 *
	 * @return THEMECOMPLETE_EPO_COMPATIBILITY_Base
	 * @since 1.0
	 * @static
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		$this->add_compatibility();
		do_action( 'wc_epo_add_compatibility' );
	}

	/**
	 * Add compatibility classes
	 *
	 * @return void
	 * @since 1.0
	 */
	public function add_compatibility() {
		// Aelia Currency Switcher.
		THEMECOMPLETE_EPO_CP_Aelia_Currency_Switcher::instance();
		// WPML Currency.
		THEMECOMPLETE_EPO_CP_WPML_Currency::instance();
		// WooCommerce Currency Switcher (WOOCS).
		THEMECOMPLETE_EPO_CP_WOOCS::instance();
		// WooCommerce Currency 3rd Party plugins.
		THEMECOMPLETE_EPO_CP_Currency_3rd_Party::instance();
		// WooCommerce Subscriptions.
		THEMECOMPLETE_EPO_CP_Subscriptions::instance();
		// WPML Multilingual CMS.
		THEMECOMPLETE_EPO_CP_WPML::instance();
		// WooCommerce Composite Products.
		THEMECOMPLETE_EPO_CP_Composite::instance();
		// WooCommerce Bookings.
		THEMECOMPLETE_EPO_CP_Bookings::instance();
		// Measurement Price Calculator.
		THEMECOMPLETE_EPO_CP_Measurement::instance();
		// WooCommerce Easy Booking.
		THEMECOMPLETE_EPO_CP_Easy_Bookings::instance();
		// Booking & Appointment Plugin for WooCommerce.
		THEMECOMPLETE_EPO_CP_BAP::instance();
		// WooCommerce Dynamic Pricing & Discounts.
		THEMECOMPLETE_EPO_CP_DPD::instance();
		// Advanced Dynamic Pricing for WooCommerce Pro (AlogPlus).
		THEMECOMPLETE_EPO_CP_APD_PRO::instance();
		// Store Exporter Deluxe for WooCommerce.
		THEMECOMPLETE_EPO_CP_Store_Exporter::instance();
		// WooTour - WooCommerce Travel Tour Booking.
		THEMECOMPLETE_EPO_CP_Wootours::instance();
		// ElasticPress.
		THEMECOMPLETE_EPO_CP_Elasticpress::instance();
		// qTranslate X.
		THEMECOMPLETE_EPO_CP_Qtranslatex::instance();
		// Quick view plugins.
		THEMECOMPLETE_EPO_CP_Quickview::instance();
		// The SEO Framework.
		THEMECOMPLETE_EPO_CP_TheSeoFramework::instance();
		// Woocommerce Add to cart Ajax for variable products.
		THEMECOMPLETE_EPO_CP_WATCAFVP::instance();
		// Name Your Price.
		THEMECOMPLETE_EPO_CP_NYP::instance();
		// Fancy Product Designer.
		THEMECOMPLETE_EPO_CP_FPD::instance();
		// Food Online Premium for WooCommerce.
		THEMECOMPLETE_EPO_CP_FOP::instance();
		// ATUM Inventory Management for WooCommerce.
		THEMECOMPLETE_EPO_CP_Atum::instance();
		// Account funds.
		THEMECOMPLETE_EPO_CP_Account_Funds::instance();
		// Booster.
		THEMECOMPLETE_EPO_CP_Booster::instance();
		// Themes.
		THEMECOMPLETE_EPO_CP_Themes::instance();
		// Plugins (various).
		THEMECOMPLETE_EPO_CP_Plugins::instance();
		// WooCommerce B2B by Code4Life.
		THEMECOMPLETE_EPO_CP_B2B_Code4Life::instance();
	}
}
includes/compatibility/index.php000064400000000126150755142450013052 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
includes/class-themecomplete-extra-product-options.php000064400001223445150755142450017334 0ustar00<?php
/**
 * Extra Product Options main class
 *
 * @package Extra Product Options/Classes
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

/**
 * Extra Product Options main class
 *
 * This class is responsible for displaying the Extra Product Options on the frontend.
 *
 * @package Extra Product Options/Classes
 * @author  ThemeComplete
 * @version 6.4
 */
final class THEMECOMPLETE_Extra_Product_Options {

	/**
	 * Holds the current post id
	 *
	 * @var integer|boolean
	 */
	private $postid_pre = false;

	/**
	 * Helper for determining various conditionals
	 *
	 * @var array<bool>
	 */
	public $wc_vars = [
		'is_product'             => false,
		'is_shop'                => false,
		'is_product_category'    => false,
		'is_product_taxonomy'    => false,
		'is_product_tag'         => false,
		'is_cart'                => false,
		'is_checkout'            => false,
		'is_account_page'        => false,
		'is_ajax'                => false,
		'is_page'                => false,
		'is_order_received_page' => false,
	];

	/**
	 * Product custom settings
	 *
	 * @var array<mixed>
	 */
	public $tm_meta_cpf = [];

	/**
	 * Flag for loading scripts
	 *
	 * @var array<mixed>
	 */
	public $hasoptions = [];

	/**
	 * Product custom settings options
	 *
	 * @var array<mixed>
	 */
	public $meta_fields = [
		'exclude'                     => '',
		'price_override'              => '',
		'override_display'            => '',
		'override_final_total_box'    => '',
		'override_show_options_total' => '',
		'override_show_final_total'   => '',
		'override_enabled_roles'      => '',
		'override_disabled_roles'     => '',
	];

	/**
	 * Cache for all the extra options
	 *
	 * @var array<mixed>
	 */
	private $cpf = [];

	/**
	 * Options cache
	 *
	 * @var array<mixed>
	 */
	private $cpf_single = [];
	/**
	 * Options cache for prices
	 *
	 * @var array<mixed>
	 */
	private $cpf_single_epos_prices = [];
	/**
	 * Options cache for the variation element id
	 *
	 * @var array<mixed>
	 */
	private $cpf_single_variation_element_id = [];
	/**
	 * Options cache for the variation section id
	 *
	 * @var array<mixed>
	 */
	private $cpf_single_variation_section_id = [];

	/**
	 * Holds the upload directory for the upload element
	 *
	 * @var string
	 */
	public $upload_dir = '/extra_product_options/';

	/**
	 * Holds the upload files objects
	 *
	 * @var array<mixed>
	 */
	private $upload_object = [];

	/**
	 * Replacement name for cart fee fields
	 *
	 * @var string
	 */
	public $cart_fee_name = 'tmcartfee_';
	/**
	 * Replacement class name for cart fee fields
	 *
	 * @var string
	 */
	public $cart_fee_class = 'tmcp-fee-field';

	/**
	 * Array of element types that get posted
	 *
	 * @var array<string>
	 */
	public $element_post_types = [];

	/**
	 * Holds builder element attributes
	 *
	 * @var array<mixed>
	 */
	private $tm_original_builder_elements = [];

	/**
	 * Holds modified builder element attributes
	 *
	 * @var array<mixed>
	 */
	public $tm_builder_elements = [];

	/**
	 * Holds the cart key when editing a product in the cart
	 * This isn't in our cart class becuase it needed to be initialized
	 * before the plugins_loaded hook.
	 *
	 * @var string
	 */
	public $cart_edit_key = '';

	/**
	 * Containes current option features
	 *
	 * @var array<string>
	 */
	public $current_option_features = [];

	/**
	 * Enable/disable flag for outputing plugin specific classes
	 * to the post_class filter
	 *
	 * @var boolean
	 */
	private $tm_related_products_output = true;

	/**
	 * Enable/disable flag for checking if we are in related/upsells
	 *
	 * @var boolean
	 */
	private $in_related_upsells = false;

	/**
	 * Cart edit key
	 *
	 * @var string
	 */
	public $cart_edit_key_var = 'tm_cart_item_key';

	/**
	 * Cart edit key alternative
	 *
	 * @var string
	 */
	public $cart_edit_key_var_alt = 'tc_cart_edit_key';

	/**
	 * Contains min/max product option infomation
	 *
	 * @var array<mixed>
	 */
	public $product_options_minmax = [];

	/**
	 * Current free text replacement
	 *
	 * @var string
	 */
	public $current_free_text = '';

	/**
	 * Current free text replacement for associated products
	 *
	 * @var string
	 */
	public $assoc_current_free_text = '';

	/**
	 * Flag to check if we are in the product shortcode
	 *
	 * @var boolean
	 */
	public $is_in_product_shortcode;

	/**
	 * Flag to check if we are in a product loop
	 *
	 * @var boolean
	 */
	public $is_in_product_loop;

	/**
	 * Flag to fix several issues when the woocommerce_get_price hook
	 * isn't being used correct by themes or other plugins.
	 *
	 * @var integer
	 */
	private $tm_woocommerce_get_price_flag = 0;

	/**
	 * If the current product is a composite product
	 *
	 * @var boolean
	 */
	public $is_bto = false;

	/**
	 * If we are in the associated product options
	 *
	 * @var boolean
	 */
	public $is_inline_epo = false;

	/**
	 * If we are in an associated product
	 *
	 * @var boolean
	 */
	public $is_associated = false;

	/**
	 * If associated product is priced individually
	 *
	 * @var integer|null
	 */
	public $associated_per_product_pricing = null;

	/**
	 * Associated product type
	 *
	 * @var string|false
	 */
	public $associated_type = false;

	/**
	 * The element id of the associated product
	 *
	 * @var string|false
	 */
	public $associated_element_uniqid = false;

	/**
	 * The associated product counter when adding more than one product
	 * in the same product element.
	 *
	 * @var integer|false
	 */
	public $associated_product_counter = false;

	/**
	 * The associated product form prefix when adding more than one product
	 * in the same product element.
	 *
	 * @var string|false
	 */
	public $associated_product_formprefix = false;

	/**
	 * Holds all of the lookup tables.
	 *
	 * @var false|array<mixed>
	 */
	public $lookup_tables = false;

	/**
	 * The single instance of the class
	 *
	 * @var THEMECOMPLETE_Extra_Product_Options|null
	 */
	protected static $instance = null;

	/**
	 * Main Extra Product Options Instance
	 *
	 * Ensures only one instance of Extra Product Options is loaded or can be loaded
	 *
	 * @since 1.0
	 * @static
	 * @see   THEMECOMPLETE_EPO()
	 * @return THEMECOMPLETE_Extra_Product_Options - Main instance
	 */
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Class Constructor
	 *
	 * @since 1.0
	 */
	public function __construct() {
		$this->wc_vars['is_ajax'] = wp_doing_ajax();

		$this->is_bto = false;

		$this->cart_edit_key_var     = apply_filters( 'wc_epo_cart_edit_key_var', 'tm_cart_item_key' );
		$this->cart_edit_key_var_alt = apply_filters( 'wc_epo_cart_edit_key_var_alt', 'tc_cart_edit_key' );
		$this->cart_edit_key         = '';

		if ( isset( $_REQUEST[ $this->cart_edit_key_var ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$cart_edit_key       = filter_var( wp_unslash( $_REQUEST[ $this->cart_edit_key_var ] ), FILTER_SANITIZE_SPECIAL_CHARS ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->cart_edit_key = false !== $cart_edit_key ? $cart_edit_key : '';
		} elseif ( isset( $_REQUEST[ $this->cart_edit_key_var_alt ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$cart_edit_key       = filter_var( wp_unslash( $_REQUEST[ $this->cart_edit_key_var_alt ] ), FILTER_SANITIZE_SPECIAL_CHARS ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->cart_edit_key = false !== $cart_edit_key ? $cart_edit_key : '';
		} elseif ( isset( $_REQUEST['update-composite'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$cart_edit_key       = filter_var( wp_unslash( $_REQUEST['update-composite'] ), FILTER_SANITIZE_SPECIAL_CHARS ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->cart_edit_key = false !== $cart_edit_key ? $cart_edit_key : '';
		}

		// Add compatibility actions and filters with other plugins and themes.
		THEMECOMPLETE_EPO_COMPATIBILITY();

		add_action( 'plugins_loaded', [ $this, 'plugin_loaded' ], 3 );
		add_action( 'plugins_loaded', [ $this, 'tm_epo_add_elements' ], 12 );
	}

	/**
	 * Conditional logic (checks if an element is visible)
	 * Compatibility with older versions or Extra Checkout Options.
	 *
	 * @param array<mixed> $element The element array.
	 * @param array<mixed> $section The section array.
	 * @param array<mixed> $sections The sections array.
	 * @param string       $form_prefix The form prefix.
	 * @return boolean
	 * @since 1.0
	 */
	public function is_visible( $element = [], $section = [], $sections = [], $form_prefix = '' ) {
		return THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->is_visible( $element, $section, $sections, $form_prefix );
	}

	/**
	 * Handles the display of builder sections
	 *
	 * @param boolean $inline If options are displayed inline (associated product).
	 * @since 5.0
	 * @return void
	 */
	public function set_inline_epo( $inline = false ) {
		$this->is_inline_epo = $inline;
	}

	/**
	 * Adds additional builder elements from 3rd party plugins
	 *
	 * @since 1.0
	 * @return void
	 */
	public function tm_epo_add_elements() {
		do_action( 'tm_epo_register_addons' );

		$this->tm_original_builder_elements = THEMECOMPLETE_EPO_BUILDER()->get_elements();

		if ( is_array( $this->tm_original_builder_elements ) ) {
			foreach ( $this->tm_original_builder_elements as $key => $value ) {
				if ( 'post' === $value->is_post ) {
					$this->element_post_types[] = $value->post_name_prefix;
				}

				if ( 'post' === $value->is_post || 'dynamic' === $value->is_post || 'display' === $value->is_post ) {
					$this->tm_builder_elements[ $value->post_name_prefix ] = $value;
				}
			}
		}
	}

	/**
	 * Setup the plugin
	 *
	 * @since 1.0
	 * @return void
	 */
	public function plugin_loaded() {
		$this->get_plugin_settings();

		THEMECOMPLETE_EPO_ORDER();

		if ( ! wp_doing_ajax() && is_admin() ) {
			return;
		}

		$this->get_override_settings();
		$this->add_plugin_actions();

		THEMECOMPLETE_EPO_SCRIPTS();
		THEMECOMPLETE_EPO_ACTIONS();
		THEMECOMPLETE_EPO_DISPLAY();
		THEMECOMPLETE_EPO_CART();

		THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS();
	}

	/**
	 * Gets all of the plugin settings
	 *
	 * @since 1.0
	 * @return void
	 */
	public function get_plugin_settings() {
		THEMECOMPLETE_EPO_DATA_STORE()->init();
	}

	/**
	 * Gets custom settings for the current product
	 *
	 * @since 1.0
	 * @return void
	 */
	public function get_override_settings() {
		foreach ( $this->meta_fields as $key => $value ) {
			$this->tm_meta_cpf[ $key ] = $value;
		}
	}

	/**
	 * Add required actions and filters
	 *
	 * @since 1.0
	 * @return void
	 */
	public function add_plugin_actions() {
		// Initialize custom product settings.
		if ( $this->is_quick_view() ) {
			add_action( 'init', [ $this, 'init_settings' ] );
		} elseif ( $this->is_enabled_shortcodes() ) {
			add_action( 'init', [ $this, 'init_settings_pre' ] );
		} else {
			add_action( 'template_redirect', [ $this, 'init_settings' ] );
		}

		add_action( 'template_redirect', [ $this, 'init_vars' ], 1 );

		// Force Select Options.
		add_filter( 'woocommerce_product_add_to_cart_url', [ $this, 'add_to_cart_url' ], 50, 1 );
		add_action( 'woocommerce_product_add_to_cart_text', [ $this, 'add_to_cart_text' ], 10, 1 );
		add_filter( 'woocommerce_cart_redirect_after_error', [ $this, 'woocommerce_cart_redirect_after_error' ], 50, 2 );

		// Enable shortcodes for element labels.
		add_filter( 'woocommerce_tm_epo_option_name', [ $this, 'tm_epo_option_name' ], 10, 5 );

		// Add custom class to product div used to initialize the plugin JavaScript.
		add_filter( 'post_class', [ $this, 'tm_post_class' ] );
		add_filter( 'body_class', [ $this, 'tm_body_class' ] );

		// Helper to flag various page positions.
		add_filter( 'woocommerce_related_products_columns', [ $this, 'tm_woocommerce_related_products_args' ], 10, 1 );
		add_action( 'woocommerce_before_single_product', [ $this, 'tm_enable_post_class' ], 1 );
		add_action( 'woocommerce_after_single_product', [ $this, 'tm_enable_post_class' ], 1 );
		add_action( 'woocommerce_upsells_orderby', [ $this, 'tm_woocommerce_related_products_args' ], 10, 1 );
		add_action( 'woocommerce_after_single_product_summary', [ $this, 'tm_woocommerce_after_single_product_summary' ], 99999 );

		// Image filter.
		add_filter( 'tm_image_url', [ $this, 'tm_image_url' ] );

		// Alter the price filter.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_add_product_price_check' ) ) {
			add_filter( 'woocommerce_product_get_price', [ $this, 'woocommerce_product_get_price' ], 1, 2 );
		}

		// Alter product display price to include possible option pricing.
		if ( ! is_admin() && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_include_possible_option_pricing' ) ) {
			add_filter( 'woocommerce_product_get_price', [ $this, 'tm_woocommerce_get_price' ], 2, 2 );
		}
		if ( ! is_admin() && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) ) {
			add_filter( 'woocommerce_show_variation_price', [ $this, 'tm_woocommerce_show_variation_price' ], 50, 3 );
			if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_include_possible_option_pricing' ) ) {
				add_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
				add_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
			}
		}

		// Override the minimum characters of text fields globally.
		add_filter( 'wc_epo_global_min_chars', [ $this, 'wc_epo_global_min_chars' ], 10, 2 );
		// Override the maximum characters of text fields globally.
		add_filter( 'wc_epo_global_max_chars', [ $this, 'wc_epo_global_max_chars' ], 10, 2 );

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_no_upload_to_png' ) ) {
			add_filter( 'wc_epo_no_upload_to_png', '__return_false' );
		}

		// Alter generated Product structured data.
		add_filter( 'woocommerce_structured_data_product_offer', [ $this, 'woocommerce_structured_data_product_offer' ], 10, 2 );

		// Enable shortcodes in options strings.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_data_shortcodes' ) ) {
			add_filter( 'wc_epo_kses', [ $this, 'wc_epo_kses' ], 10, 3 );
			add_filter( 'wc_epo_label_in_cart', [ $this, 'wc_epo_label_in_cart' ], 10, 1 );
		}

		// Enable shortcodes on prices.
		add_filter( 'wc_epo_apply_discount', [ $this, 'enable_shortcodes' ], 10, 1 );
		// Enable shortcodes on various properties.
		add_filter( 'wc_epo_enable_shortocde', [ $this, 'enable_shortcodes' ], 10, 1 );

		// Set the flag for the product loop.
		add_action( 'woocommerce_before_shop_loop_item', [ $this, 'woocommerce_before_shop_loop_item' ], 0 );
		add_action( 'woocommerce_after_shop_loop_item', [ $this, 'woocommerce_after_shop_loop_item' ], 999999 );

		// Change prices in the product loop.
		add_filter( 'woocommerce_get_price_html', [ $this, 'woocommerce_get_price_html' ], 999999, 2 );

		// Trim zeros in prices.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_trim_zeros' ) ) {
			add_filter( 'woocommerce_price_trim_zeros', '__return_true' );
		}

		// Add the extra weight from addons to the product.
		add_action( 'woocommerce_before_calculate_totals', [ $this, 'add_custom_weight' ], 10000, 1 );

		// Force rate recalculation (for extra weight).
		add_action( 'woocommerce_checkout_update_order_review', [ $this, 'weight_woocommerce_checkout_update_order_review' ], 1 );

		// Save the weight setting to cart object.
		add_filter( 'wc_epo_save_cart_item_data', [ $this, 'wc_epo_save_cart_item_data' ], 10, 3 );
	}

	/**
	 * Save the weight setting to cart object.
	 *
	 * @param array<mixed> $data Field data array.
	 * @param string       $type 'normal' or 'fee'.
	 * @param object       $obj The THEMECOMPLETE_EPO_FIELDS_* class object.
	 * @since 6.4.4
	 * @return array<mixed>
	 */
	public function wc_epo_save_cart_item_data( $data, $type, $obj ) {
		if ( ! property_exists( $obj, 'key' ) || ! property_exists( $obj, 'element' ) ) {
			return $data;
		}
		$key = array_search( $obj->key, $obj->element['option_values'], true );
		if ( false === $key ) {
			$key = false;
		}
		$weight = 0;
		if ( isset( $data['weight'] ) ) {
			$weight = floatval( $data['weight'] );
		}
		if ( isset( $obj->element['weight'] ) && '' !== $obj->element['weight'] ) {
			$weight = $weight + floatval( $obj->element['weight'] );
		}
		switch ( $obj->element['type'] ) {
			case 'checkbox':
				if ( false !== $key && isset( $obj->element['extra_multiple_choices'] ) && isset( $obj->element['extra_multiple_choices']['weight'] ) && isset( $obj->element['extra_multiple_choices']['weight'][ $key ] ) ) {
					$weight = $weight + floatval( $obj->element['extra_multiple_choices']['weight'][ $key ] );
				}
				break;
			case 'radio':
				if ( false !== $key && isset( $obj->element['extra_multiple_choices'] ) && isset( $obj->element['extra_multiple_choices']['weight'] ) && isset( $obj->element['extra_multiple_choices']['weight'][ $key ] ) ) {
					$weight = $weight + floatval( $obj->element['extra_multiple_choices']['weight'][ $key ] );
				}
				break;
			case 'select':
				if ( false !== $key && isset( $obj->element['extra_multiple_choices'] ) && isset( $obj->element['extra_multiple_choices']['weight'] ) && isset( $obj->element['extra_multiple_choices']['weight'][ $key ] ) ) {
					$weight = $weight + floatval( $obj->element['extra_multiple_choices']['weight'][ $key ] );
				}
				break;
			default:
				break;
		}

		$data['weight'] = $weight;

		return $data;
	}

	/**
	 * Force rate recalculation
	 *
	 * @since 6.4.4
	 * @return void
	 */
	public function weight_woocommerce_checkout_update_order_review() {
		$packages = apply_filters(
			'woocommerce_cart_shipping_packages',
			[]
		);
		foreach ( $packages as $package_key => $package ) {
			$wc_session_key = 'shipping_for_package_' . $package_key;
			WC()->session->set(
				$wc_session_key,
				false
			);

		}
	}

	/**
	 * Add the extra weight from addons to the product
	 *
	 * @param mixed $cart_object The cart object.
	 * @since 6.4.4
	 * @return void
	 */
	public function add_custom_weight( $cart_object = false ) {
		if ( defined( 'THEMECOMPLETE_DYNAMIC_EXTRA_WEIGHT_DONE' ) ) {
			return;
		}
		if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
			return;
		}
		if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
			return;
		}

		if ( ! did_action( 'wp_loaded' ) ) {
			return;
		}

		if ( ! $cart_object && function_exists( 'WC' ) && WC()->cart ) { // @phpstan-ignore-line
			$cart_object = WC()->cart;
		}

		if ( ! $cart_object ) {
			return;
		}

		$cart_contents = false;
		if ( is_object( $cart_object ) ) {
			if ( method_exists( $cart_object, 'get_cart' ) ) {
				$cart_contents = $cart_object->get_cart();
			} elseif ( property_exists( $cart_object, 'cart_contents' ) ) {
				$cart_contents = $cart_object->cart_contents;
			}
		}
		if ( ! is_array( $cart_contents ) ) {
			return;
		}

		foreach ( $cart_contents as $cart_key => $cart_item ) {
			$extra_weight = 0;
			if ( isset( $cart_item['tmcartepo'] ) ) {
				foreach ( $cart_item['tmcartepo'] as $key => $value ) {
					if ( isset( $value['weight'] ) ) {
						$quantity = 1;
						if ( isset( $value['quantity'] ) ) {
							$quantity = floatval( $value['quantity'] );
						}
						$extra_weight = $extra_weight + ( $quantity * floatval( $value['weight'] ) );
					}
				}
			}
			if ( isset( $cart_item['data'] ) && $cart_item['data'] && $extra_weight ) {
				$weight       = $cart_item['data']->get_weight();
				$weight       = floatval( $weight );
				$extra_weight = floatval( $extra_weight );
				$cart_item['data']->set_weight( $extra_weight + $weight );
				if ( function_exists( 'WC' ) && WC()->cart && WC()->cart->cart_contents && isset( WC()->cart->cart_contents[ $cart_key ] ) && isset( WC()->cart->cart_contents[ $cart_key ]['data'] ) ) { // @phpstan-ignore-line
					WC()->cart->cart_contents[ $cart_key ]['data']->set_weight( $extra_weight + $weight );
				}
			}
		}

		define( 'THEMECOMPLETE_DYNAMIC_EXTRA_WEIGHT_DONE', 1 );
	}

	/**
	 * Flag to check if we are in the product loop
	 *
	 * @since 6.2
	 * @return void
	 */
	public function woocommerce_before_shop_loop_item() {
		$this->is_in_product_loop = true;
	}

	/**
	 * Flag to check if we are in the product loop
	 *
	 * @since 6.2
	 * @return void
	 */
	public function woocommerce_after_shop_loop_item() {
		$this->is_in_product_loop = false;
	}

	/**
	 * Alter product display price to include possible option pricing on the product loop
	 *
	 * @param mixed        $price The product price.
	 * @param object|false $product The product object.
	 * @return mixed
	 * @since 6.2
	 */
	public function woocommerce_get_price_html( $price = '', $product = false ) {
		if ( ! $this->is_in_product_loop || ! $product instanceof WC_Product ) {
			return $price;
		}

		$tm_meta_cpf = themecomplete_get_post_meta( $product, 'tm_meta_cpf', true );
		if ( is_array( $tm_meta_cpf ) ) {
			$tm_price_display_mode          = isset( $tm_meta_cpf['price_display_mode'] ) ? $tm_meta_cpf['price_display_mode'] : 'none';
			$tm_price_display_override      = isset( $tm_meta_cpf['price_display_override'] ) ? $tm_meta_cpf['price_display_override'] : '';
			$tm_price_display_override_sale = isset( $tm_meta_cpf['price_display_override_sale'] ) ? $tm_meta_cpf['price_display_override_sale'] : '';
			$tm_price_display_override_to   = isset( $tm_meta_cpf['price_display_override_to'] ) ? $tm_meta_cpf['price_display_override_to'] : '';

			$f_tm_price_display_override      = apply_filters( 'wc_epo_get_price_in_currency', $tm_price_display_override );
			$f_tm_price_display_override_sale = apply_filters( 'wc_epo_get_price_in_currency', $tm_price_display_override_sale );
			$f_tm_price_display_override_to   = apply_filters( 'wc_epo_get_price_in_currency', $tm_price_display_override_to );

			$taxable    = $product->is_taxable();
			$tax_string = '';
			if ( $taxable ) {
				$tax_string .= ' <small>' . get_option( 'woocommerce_price_display_suffix' ) . '</small>';
			}
			switch ( $tm_price_display_mode ) {
				case 'price':
					if ( '' !== $tm_price_display_override_sale ) {
						$price = ( function_exists( 'wc_get_price_to_display' )
							? wc_format_sale_price( wc_format_decimal( $f_tm_price_display_override ), wc_format_decimal( $f_tm_price_display_override_sale ) )
							: '<del>' . themecomplete_price( wc_format_decimal( $f_tm_price_display_override ) ) . '</del> <ins>' . themecomplete_price( wc_format_decimal( $tm_price_display_override_sale ) ) . '</ins>'
						);
					} else {
						$price = themecomplete_price( wc_format_decimal( $f_tm_price_display_override ) );
					}
					$price = apply_filters( 'wc_epo_price_display_mode_price', $price, $tm_price_display_override, $tm_price_display_override_sale, $product );
					$price = $price . $tax_string;
					break;
				case 'from':
					$price = ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : ( $product->get_price_html_from_text() ) );
					if ( '' !== $tm_price_display_override_sale ) {
						$price .= ( function_exists( 'wc_get_price_to_display' )
							? wc_format_sale_price( wc_format_decimal( $f_tm_price_display_override ), wc_format_decimal( $f_tm_price_display_override_sale ) )
							: '<del>' . themecomplete_price( wc_format_decimal( $f_tm_price_display_override ) ) . '</del> <ins>' . themecomplete_price( wc_format_decimal( $f_tm_price_display_override_sale ) ) . '</ins>'
						);
					} else {
						$price .= themecomplete_price( wc_format_decimal( $f_tm_price_display_override ) );
					}
					$price = apply_filters( 'wc_epo_price_display_mode_from', $price, $tm_price_display_override, $tm_price_display_override_sale, $product );
					$price = $price . $tax_string;
					break;
				case 'range':
					$price = themecomplete_price( wc_format_decimal( $f_tm_price_display_override ) ) . ' - ' . themecomplete_price( wc_format_decimal( $f_tm_price_display_override_to ) );
					$price = apply_filters( 'wc_epo_price_display_mode_range', $price, $tm_price_display_override, $tm_price_display_override_to, $product );
					$price = $price . $tax_string;
					break;
			}
		}

		return apply_filters( 'woocommerce_epo_get_price_html', $price, $product );
	}

	/**
	 * Enable shortcodes on an element property
	 *
	 * @param mixed $property The option property value.
	 * @return mixed
	 * @since 6.0.4
	 */
	public function enable_shortcodes( $property = '' ) {
		if ( '' !== $property ) {
			if ( is_array( $property ) ) {
				foreach ( $property as $key => $value ) {
					$property[ $key ] = themecomplete_do_shortcode( $value );
				}
			} else {
				$property = themecomplete_do_shortcode( $property );
			}
		}
		return $property;
	}

	/**
	 * Enable shortcodes in options strings
	 *
	 * @param string  $text Filtered text.
	 * @param string  $original_text Original text.
	 * @param boolean $shortcode If shortcode should be enabled.
	 * @return string
	 * @since 4.9.2
	 */
	public function wc_epo_kses( $text = '', $original_text = '', $shortcode = true ) {
		$text = $original_text;

		if ( $shortcode ) {
			$text = themecomplete_do_shortcode( $text );
		}

		return $text;
	}

	/**
	 * Enable shortcodes in cart option strings
	 *
	 * @param string $text The element label text.
	 * @return string
	 * @since 4.9.2
	 */
	public function wc_epo_label_in_cart( $text = '' ) {
		return themecomplete_do_shortcode( $text );
	}

	/**
	 * Get product min/max prices
	 *
	 * @param WC_Product $product Product object.
	 * @return array<mixed>
	 * @since 4.8.1
	 */
	public function get_product_min_max_prices( $product ) {
		$id   = themecomplete_get_id( $product );
		$type = themecomplete_get_product_type( $product );

		$has_epo = THEMECOMPLETE_EPO_API()->has_options( $id );
		if ( ! THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) || 'variation' === $type ) {
			return [];
		}

		$override_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $id, 'product' ) );
		$tm_meta_cpf = themecomplete_get_post_meta( $override_id, 'tm_meta_cpf', true );

		$price_override = ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
			? 0
			: ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_override_product_price' ) )
				? 1
				: ( ! empty( $tm_meta_cpf['price_override'] ) ? 1 : 0 ) );

		$minmax = $this->add_product_tc_prices( $id );
		if ( ! is_array( $minmax ) ) {
			$minmax = [
				'tc_min_price'    => 0,
				'tc_max_price'    => 0,
				'tc_min_variable' => 0,
				'tc_max_variable' => 0,
				'tc_min_max'      => false,
			];
		}
		if ( ! isset( $minmax['tc_min_price'] ) ) {
			$minmax['tc_min_price'] = 0;
		}
		if ( ! isset( $minmax['tc_max_price'] ) ) {
			$minmax['tc_max_price'] = 0;
		}

		$min_raw           = 0;
		$max_raw           = 0;
		$min               = 0;
		$max               = 0;
		$min_price         = 0;
		$max_price         = 0;
		$min_regular_price = 0;
		$max_regular_price = 0;

		if ( 'variable' === $type || 'variable-subscription' === $type ) {
			$prices = $product->get_variation_prices( false ); // @phpstan-ignore-line

			// Calculate min price.
			$min_price       = current( $prices['price'] );
			$tc_min_variable = isset( $minmax['tc_min_variable'][ key( $prices['price'] ) ] )
				? $minmax['tc_min_variable'][ key( $prices['price'] ) ]
				: ( isset( $minmax['tc_min_variable'] )
					? $minmax['tc_min_variable']
					: 0
				);

			if ( is_array( $tc_min_variable ) ) {
				$tc_min_variable = min( $tc_min_variable );
			}

			$min_raw = floatval( apply_filters( 'wc_epo_options_min_price', $tc_min_variable, $product, true ) );

			$min_price = $min_price + $min_raw;

			// include taxes.
			$min_price = $this->tc_get_display_price( $product, $min_price );

			if ( $price_override ) {
				if ( ! empty( $min_raw ) ) {
					$min_price = $min_raw;
				}
				$this->product_options_minmax[ $id ]['is_override'] = 1;
			}

			$min = $this->tc_get_display_price( $product, $min_raw );

			// Calculate max price.
			$copy_prices = $prices['price'];
			$added_max   = [];
			foreach ( $copy_prices as $vkey => $vprice ) {
				$added_price_max = is_array( $minmax['tc_max_variable'] )
					? ( isset( $minmax['tc_max_variable'][ $vkey ] )
						? $minmax['tc_max_variable'][ $vkey ]
						: 0 )
					: $minmax['tc_max_variable'];

				$added_price          = floatval( apply_filters( 'wc_epo_options_max_price_raw', $added_price_max, $product, false ) );
				$added_max[]          = $added_price;
				$copy_prices[ $vkey ] = $vprice + $added_price;
			}
			asort( $copy_prices );
			$max_price = end( $copy_prices );

			asort( $added_max );

			$max_raw = floatval( apply_filters( 'wc_epo_options_max_price', end( $added_max ), $product, false ) );

			$max_price = $this->tc_get_display_price( $product, $max_price );

			if ( $price_override && ! ( empty( $minmax['tc_min_variable'] ) && empty( $minmax['tc_max_variable'] ) ) ) {
				$max_price = floatval( $max_price ) - floatval( $this->tc_get_display_price( $product, floatval( $prices['price'][ key( $copy_prices ) ] ) ) );
			}

			$max = $this->tc_get_display_price( $product, $max_raw );

			$min_regular_price = floatval( current( $prices['regular_price'] ) ) + $min_raw;
			$max_regular_price = floatval( end( $prices['regular_price'] ) ) + $max_raw;

			// include taxes.
			$min_regular_price = $this->tc_get_display_price( $product, $min_regular_price );
			$max_regular_price = $this->tc_get_display_price( $product, $max_regular_price );

		} else {

			// Calculate min price.
			$min_raw = floatval( apply_filters( 'wc_epo_options_min_price', $minmax['tc_min_price'], $product, false ) );

			if ( $price_override ) {

				if ( ! empty( $min_raw ) ) {
					$new_min = $min_raw;
				} else {
					$new_min = $product->get_price();
				}

				$min_raw = $new_min;

				$this->product_options_minmax[ $id ]['is_override'] = 1;
			}

			$this->product_options_minmax[ $id ]['tc_min_price'] = $min_raw;

			$display_price         = $this->tc_get_display_price( $product );
			$display_regular_price = $this->tc_get_display_price( $product, $this->tc_get_regular_price( $product ) );

			if ( $price_override && $min_raw <= 0 ) {
				$display_price = $display_regular_price;
			}

			$min       = $this->tc_get_display_price( $product, $min_raw );
			$min_price = $display_price;

			// Calculate max price.
			$max_raw = floatval( apply_filters( 'wc_epo_options_max_price', $minmax['tc_max_price'], $product, false ) );
			$this->product_options_minmax[ $id ]['tc_max_price'] = $max_raw;
			$max = $this->tc_get_display_price( $product, $max_raw );
			if ( $price_override ) {
				$max_price = $max;
			} else {
				$max_price = $this->tc_get_display_price( $product, (float) apply_filters( 'wc_epo_product_price', $product->get_price() ) + $max_raw );
			}
			$min_regular_price = floatval( $display_regular_price );
			if ( $price_override ) {
				$max_regular_price = $max;
			} else {
				$max_regular_price = floatval( $this->tc_get_display_price( $product, $product->get_regular_price() ) ) + floatval( $max );
			}
		}

		return [
			'min_raw'             => $min_raw,
			'max_raw'             => $max_raw,
			'min'                 => $min,
			'max'                 => $max,
			'min_price'           => $min_price,
			'max_price'           => $max_price,

			'min_regular_price'   => $min_regular_price,
			'max_regular_price'   => $max_regular_price,

			'formatted_min'       => wc_format_decimal( $min, wc_get_price_decimals() ),
			'formatted_max'       => wc_format_decimal( $max, wc_get_price_decimals() ),
			'formatted_min_price' => wc_format_decimal( $min_price, wc_get_price_decimals() ),
			'formatted_max_price' => wc_format_decimal( $max_price, wc_get_price_decimals() ),

		];
	}

	/**
	 * Alter generated product structured data
	 *
	 * @param array<mixed> $markup The markup array.
	 * @param object       $product The product object.
	 * @return array<mixed>
	 * @since 4.8.1
	 */
	public function woocommerce_structured_data_product_offer( $markup, $product ) {
		if ( ! $product instanceof WC_Product || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_alter_structured_data' ) ) {
			return $markup;
		}

		$tm_price_display_mode = 'none';

		$tm_meta_cpf = themecomplete_get_post_meta( $product, 'tm_meta_cpf', true );

		if ( is_array( $tm_meta_cpf ) ) {
			$tm_price_display_mode          = isset( $tm_meta_cpf['price_display_mode'] ) ? $tm_meta_cpf['price_display_mode'] : 'none';
			$tm_price_display_override      = isset( $tm_meta_cpf['price_display_override'] ) ? $tm_meta_cpf['price_display_override'] : '';
			$tm_price_display_override_sale = isset( $tm_meta_cpf['price_display_override_sale'] ) ? $tm_meta_cpf['price_display_override_sale'] : '';
			$tm_price_display_override_to   = isset( $tm_meta_cpf['price_display_override_to'] ) ? $tm_meta_cpf['price_display_override_to'] : '';

			switch ( $tm_price_display_mode ) {
				case 'price':
				case 'from':
					if ( '' !== $tm_price_display_override_sale ) {
						$min_price = $tm_price_display_override_sale;
					} else {
						$min_price = $tm_price_display_override;
					}
					break;
				case 'range':
					$min_price = $tm_price_display_override;
					$max_price = $tm_price_display_override_to;

					$markup['lowPrice']  = $min_price;
					$markup['highPrice'] = $max_price;
					break;

				case 'none':
				default:
					$min_max = $this->get_product_min_max_prices( $product );

					if ( empty( $min_max ) ) {
						return $markup;
					}

					$min_price = $min_max['formatted_min_price'];
					$max_price = $min_max['formatted_max_price'];

					break;
			}
		}

		if ( isset( $min_price ) ) {
			if ( isset( $markup['priceSpecification'] ) && is_array( $markup['priceSpecification'] ) && isset( $markup['priceSpecification']['price'] ) ) {
				$markup['priceSpecification']['price'] = $min_price;
				$markup['price']                       = $min_price;
			}
			if ( isset( $max_price ) && isset( $markup['lowPrice'] ) && isset( $markup['highPrice'] ) ) {
				$markup['lowPrice']  = $min_price;
				$markup['highPrice'] = $max_price;
			}
		}

		return $markup;
	}

	/**
	 * Override the minimum characters of text fields globally
	 *
	 * @param string $min The minimum characters.
	 * @param string $element The element type.
	 * @return string
	 * @since 1.0
	 */
	public function wc_epo_global_min_chars( $min = '', $element = '' ) {
		$element = str_replace( '_min_chars', '', $element );

		if ( ( 'textfield' === $element || 'textarea' === $element ) && '' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_min_chars' ) && '' === $min ) {
			$min = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_min_chars' );
		}

		return $min;
	}

	/**
	 * Override the maximum characters of text fields globally
	 *
	 * @param string $max The maximum characters.
	 * @param string $element The element type.
	 * @return string
	 * @since 1.0
	 */
	public function wc_epo_global_max_chars( $max = '', $element = '' ) {
		$element = str_replace( '_min_chars', '', $element );
		if ( ( 'textfield' === $element || 'textarea' === $element ) && '' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_max_chars' ) && '' === $max ) {
			$max = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_max_chars' );
		}

		return $max;
	}

	/**
	 * Initialize custom product settings
	 *
	 * @return void
	 * @since 1.0
	 */
	public function init_settings_pre() {
		$postid = false;
		if ( function_exists( 'ux_builder_is_iframe' ) && ux_builder_is_iframe() ) {
			// phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( isset( $_GET['post_id'] ) ) {
				// phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$postid = absint( wp_unslash( $_GET['post_id'] ) );
			}
		} elseif ( ! isset( $_SERVER['HTTP_HOST'] ) || ! isset( $_SERVER['REQUEST_URI'] ) ) {
			$postid = 0;
		} else {
			$url    = 'http://' . esc_url_raw( wp_unslash( $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) );
			$postid = THEMECOMPLETE_EPO_HELPER()->get_url_to_postid( $url );
		}

		$this->postid_pre = $postid;
		$product          = wc_get_product( $postid );

		$check1 = ( 0 === (int) $postid );
		$check2 = ( $product
					&& is_object( $product )
					&& property_exists( $product, 'post' )
					&& property_exists( $product->post, 'post_type' )
					&& ( in_array( $product->post->post_type, [ 'product', 'product_variation' ], true ) ) );
		$check3 = ( $product
					&& is_object( $product )
					&& property_exists( $product, 'post_type' )
					&& ( in_array( $product->post_type, [ 'product', 'product_variation' ], true ) ) ); // @phpstan-ignore-line

		if ( $check1 || $check2 || $check3 ) {
			add_action( 'template_redirect', [ $this, 'init_settings' ] );
		} else {
			$this->init_settings();
		}
	}

	/**
	 * Initialize variables
	 *
	 * @return void
	 * @since 1.0
	 */
	public function init_vars() {
		$this->wc_vars = [
			'is_product'             => is_product(),
			'is_shop'                => is_shop(),
			'is_product_category'    => is_product_category(),
			'is_product_taxonomy'    => is_product_taxonomy(),
			'is_product_tag'         => is_product_tag(),
			'is_cart'                => is_cart(),
			'is_checkout'            => is_checkout(),
			'is_account_page'        => is_account_page(),
			'is_ajax'                => wp_doing_ajax(),
			'is_page'                => is_page(),
			'is_order_received_page' => is_order_received_page(),
		];

		// Disable floating totals box on non product pages.
		if ( ! $this->wc_vars['is_product'] ) {
			THEMECOMPLETE_EPO_DATA_STORE()->set( 'tm_epo_floating_totals_box', '' );
		}
	}

	/**
	 * Initialize custom product settings
	 *
	 * @return void
	 * @since 1.0
	 */
	public function init_settings() {
		if ( is_admin() && ! $this->is_quick_view() ) {
			return;
		}

		// Re populate options for WPML.
		if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
			// todo:Find another place to re init settings for WPML.
			$this->get_plugin_settings();
		}

		do_action( 'wc_epo_init_settings' );

		$post_max = (float) wc_let_to_num( (string) ini_get( 'post_max_size' ) );

		// post_max_size debug.
		// phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		if ( ( empty( $_FILES ) && empty( $_POST ) && isset( $_SERVER['REQUEST_METHOD'] ) && strtolower( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) === 'post'
			&& isset( $_SERVER['CONTENT_LENGTH'] ) && (float) $_SERVER['CONTENT_LENGTH'] > $post_max )
			// phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			|| ( is_admin() && ( ! isset( $_GET ) || ( isset( $_GET ) && isset( $_GET['post_type'] ) && isset( $_GET['action'] ) && ! str_starts_with( wp_unslash( $_GET['post_type'] ), 'ct_template' ) && ! str_starts_with( wp_unslash( $_GET['action'] ), 'oxy_render_' ) ) ) ) // @phpstan-ignore-line
		) {
			/* translators: %s: post max size */
			wc_add_notice( sprintf( esc_html__( 'Trying to upload files larger than %s is not allowed!', 'woocommerce-tm-extra-product-options' ), $post_max ), 'error' );
		}

		global $post, $product;
		$this->set_tm_meta();
		$this->init_settings_after();
	}

	/**
	 * Initialize custom product settings
	 *
	 * @return void
	 * @since 1.0
	 */
	public function init_settings_after() {
		global $post, $product;
		// Check if the plugin is active for the user.
		if ( $this->check_enable() ) {
			if ( ( $this->is_enabled_shortcodes() || is_product() || $this->is_quick_view() )
				&& ( 'normal' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_display' ) || 'normal' === $this->tm_meta_cpf['override_display'] )
				&& 'action' !== $this->tm_meta_cpf['override_display']
			) {
				// Add options to the page.
				THEMECOMPLETE_EPO_DATA_STORE()->set( 'tm_epo_options_placement_hook_priority', THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement_hook_priority' ) );
				THEMECOMPLETE_EPO_DATA_STORE()->set( 'tm_epo_totals_box_placement_hook_priority', THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement_hook_priority' ) );

				add_action( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ), [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_epo_fields' ], THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement_hook_priority' ) );
				add_action( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement' ), [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_add_inline_style' ], intval( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_placement_hook_priority' ) ) + 99999 );
				add_action( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement' ), [ THEMECOMPLETE_EPO_DISPLAY(), 'tm_epo_totals' ], THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_totals_box_placement_hook_priority' ) );
			}
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) && ( is_shop() || is_product_category() || is_product_tag() || function_exists( 'dokan' ) ) ) {
			add_action( 'woocommerce_after_shop_loop_item', [ $this, 'tm_woocommerce_after_shop_loop_item' ], 9 );
		}

		add_action( 'woocommerce_shortcode_before_product_loop', [ $this, 'woocommerce_shortcode_before_product_loop' ] );
		add_action( 'woocommerce_shortcode_after_product_loop', [ $this, 'woocommerce_shortcode_after_product_loop' ] );
		if ( $this->is_enabled_shortcodes() ) {
			add_action( 'woocommerce_after_shop_loop_item', [ $this, 'tm_enable_options_on_product_shortcode' ], 1 );
		}

		$this->current_free_text       = esc_attr__( 'Free!', 'woocommerce' );
		$this->assoc_current_free_text = $this->current_free_text;
		if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
			$this->assoc_current_free_text = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' );
		}
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_free_price_label' ) ) {
			$this->assoc_current_free_text = '';
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_free_price_label' ) && 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_include_possible_option_pricing' ) ) {

			if ( $post || $this->postid_pre ) {

				if ( $post ) {
					$thiscpf = $this->get_product_tm_epos( $post->ID, '', false, true );
				}

				if ( is_product() && isset( $thiscpf ) && is_array( $thiscpf ) && ( ! empty( $thiscpf['global'] ) || ! empty( $thiscpf['local'] ) ) ) {
					if ( $product &&
						( is_object( $product ) && ! is_callable( [ $product, 'get_price' ] ) ) ||
						( ! is_object( $product ) )
					) {
						$product = wc_get_product( $post->ID );
					}
					if ( $product &&
						is_object( $product ) && is_callable( [ $product, 'get_price' ] )
					) {
						if ( ! (float) $product->get_price() > 0 ) {
							if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
								$this->current_free_text = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' );
								add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
							} elseif ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) ) {
								$this->current_free_text = '';
								remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
							}
						}
						add_filter( 'woocommerce_get_price_html', [ $this, 'related_get_price_html' ], 10, 2 );
					}
				} elseif ( is_shop() || is_product_category() || is_product_tag() ) {
					add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html_shop' ], 10, 2 );
				} elseif ( ! is_product() && $this->is_enabled_shortcodes() ) {
					if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
						$this->current_free_text = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' );
						add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
					} else {
						if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) ) {
							$this->current_free_text = '';
							remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
						}
						add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
					}
				} elseif ( is_product() ) {
					add_filter( 'woocommerce_get_price_html', [ $this, 'related_get_price_html2' ], 10, 2 );
				}
			} elseif ( $this->is_quick_view() ) {
				if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
					$this->current_free_text = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' );
					add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
				} else {
					add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
					if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) ) {
						$this->current_free_text = '';
						remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
					}
				}
			}
		} elseif ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
			$this->current_free_text = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' );
			add_filter( 'woocommerce_get_price_html', [ $this, 'get_price_html' ], 10, 2 );
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) && is_product() && $post ) {
			if ( $product &&
				( is_object( $product ) && ! is_callable( [ $product, 'get_price' ] ) ) ||
				( ! is_object( $product ) )
			) {
				$product = wc_get_product( $post->ID );
			}
			if ( $product && is_object( $product ) && is_callable( [ $product, 'get_price' ] ) ) {
				$this->current_free_text = $this->tm_get_price_html( $product->get_price(), $product );
			}
		}
	}

	/**
	 * Get the theme name
	 *
	 * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.
	 *
	 * @return string|array<mixed>|false
	 */
	public function get_theme( $header = '' ) {
		$out = '';
		if ( function_exists( 'wp_get_theme' ) ) {
			$theme = wp_get_theme();
			$out   = $theme->get( $header );
		}

		return $out;
	}

	/**
	 * Check if we have a support theme quickview
	 *
	 * @return boolean
	 */
	public function is_supported_quick_view() {
		$theme_name = $this->get_theme( 'Name' );
		if ( ! is_string( $theme_name ) ) {
			return false;
		}
		$theme_name = strtolower( $theme_name );
		$theme      = explode( ' ', $theme_name );
		if ( isset( $theme[0] ) && isset( $theme[1] ) ) {
			$theme = $theme[0];
		} else {
			$theme = explode( '-', $theme_name );
			if ( isset( $theme[0] ) && isset( $theme[1] ) ) {
				$theme = $theme[0];
			}
		}

		if ( is_array( $theme ) ) {
			$theme = $theme_name;
		}

		if (
			'flatsome' === $theme
			|| 'kleo' === $theme
			|| 'venedor' === $theme
			|| 'elise' === $theme
			|| 'minshop' === $theme
			|| 'porto' === $theme
			|| 'grace' === $theme
			|| 'woodmart' === $theme
		) {
			return true;
		}

		return false;
	}

	/**
	 * Generate the hasoptions variable
	 *
	 * @since 6.4
	 * @return void
	 */
	public function hasoptions() {
		$post_id = get_the_ID();
		if ( ! isset( $this->hasoptions[ $post_id ] ) ) {
			if ( $post_id && ( $this->wc_vars['is_product'] || 'product' === get_post_type( $post_id ) ) ) {
				$has_epo = THEMECOMPLETE_EPO_API()->has_options( $post_id );

				// Product has extra options.
				if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
					$this->hasoptions[ $post_id ] = true;

					// Product doesn't have extra options but the final total box is enabled for all products.
				} elseif ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' ) ) {

					$this->hasoptions[ $post_id ] = true;

					// Search for composite products extra options.
					// Product has styled variations.
				} elseif ( isset( $has_epo['variations'] ) && ! empty( $has_epo['variations'] ) && isset( $has_epo['variations_disabled'] ) && empty( $has_epo['variations_disabled'] ) ) {
					$this->hasoptions[ $post_id ] = true;
				} else {
					$this->hasoptions[ $post_id ] = false;
				}
			}
		}

		$this->hasoptions[ $post_id ] = apply_filters( 'wc_epo_hasoptions', $this->hasoptions[ $post_id ], $post_id );
	}

	/**
	 * Check if plugin scripts can be loaded
	 *
	 * @since 1.0
	 * @return boolean
	 */
	public function can_load_scripts() {
		$loading_areas = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_loading_areas' );
		if ( ! is_array( $loading_areas ) ) {
			$loading_areas = [ $loading_areas ];
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) ) {
			$loading_areas = array_unique( array_merge( $loading_areas, [ 'shop', 'product_taxonomy' ] ) );
		}

		$can_load_scripts = false;

		foreach ( $loading_areas as $area ) {
			switch ( $area ) {
				case 'everywhere':
					$can_load_scripts = true;
					break;
				case 'shop':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_shop'];
					break;
				case 'product_category':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_product_category'];
					break;
				case 'product_taxonomy':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_product_taxonomy'];
					break;
				case 'product_tag':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_product_tag'];
					break;
				case 'product':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_product'];
					break;
				case 'cart':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_cart'];
					break;
				case 'checkout':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_checkout'];
					break;
				case 'order_received_page':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_order_received_page'];
					break;
				case 'account_page':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_account_page'];
					break;
				case 'woocommerce':
					$can_load_scripts = $can_load_scripts || THEMECOMPLETE_EPO()->wc_vars['is_shop'] || THEMECOMPLETE_EPO()->wc_vars['is_product_taxonomy'] || THEMECOMPLETE_EPO()->wc_vars['is_product'] || THEMECOMPLETE_EPO()->wc_vars['is_cart'] || THEMECOMPLETE_EPO()->wc_vars['is_checkout'] || THEMECOMPLETE_EPO()->wc_vars['is_order_received_page'] || THEMECOMPLETE_EPO()->wc_vars['is_account_page'];
					break;
				case 'quickview':
					$can_load_scripts = $can_load_scripts || ( ( class_exists( 'WC_Quick_View' ) || $this->is_supported_quick_view() ) && ( THEMECOMPLETE_EPO()->wc_vars['is_shop'] || THEMECOMPLETE_EPO()->wc_vars['is_product_category'] || THEMECOMPLETE_EPO()->wc_vars['is_product_tag'] ) );
					break;
			}
		}

		if ( $can_load_scripts && THEMECOMPLETE_EPO()->wc_vars['is_product'] ) {
			$this->hasoptions();

			if ( ! $this->hasoptions[ get_the_ID() ] ) {
				return false;
			}
		}

		$can_load_scripts = apply_filters( 'wc_epo_can_load_scripts', $can_load_scripts );

		return $can_load_scripts;
	}

	/**
	 * Flag to check if we are in the product shortcode
	 *
	 * @since 1.0
	 * @return void
	 */
	public function woocommerce_shortcode_before_product_loop() {
		$this->is_in_product_shortcode = true;
	}

	/**
	 * Flag to check if we are in the product shortcode
	 *
	 * @since 1.0
	 * @return void
	 */
	public function woocommerce_shortcode_after_product_loop() {
		$this->is_in_product_shortcode = false;
	}

	/**
	 * Displays options in [product] shortcode
	 *
	 * @since 1.0
	 * @return void
	 */
	public function tm_enable_options_on_product_shortcode() {
		if ( $this->is_in_product_shortcode ) {
			$this->tm_woocommerce_after_shop_loop_item();
		}
	}

	/**
	 * Displays options in shop page
	 *
	 * @since 1.0
	 * @return void
	 */
	public function tm_woocommerce_after_shop_loop_item() {
		$post_id = get_the_ID();
		$has_epo = THEMECOMPLETE_EPO_API()->has_options( $post_id );
		if ( false !== $post_id && THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
			echo '<div class="tm-has-options tc-after-shop-loop"><form class="cart">';
			THEMECOMPLETE_EPO_DISPLAY()->frontend_display( $post_id, 'tc_' . $post_id, false );
			THEMECOMPLETE_EPO_DISPLAY()->woocommerce_before_add_to_cart_button( $post_id );
			echo '</form></div>';
		}
	}

	/**
	 * Generate min/max prices for the $product
	 *
	 * @param integer|false $id The product id.
	 * @return mixed
	 * @since 1.0
	 */
	public function add_product_tc_prices( $id = false ) {
		if ( false !== $id ) {
			if ( isset( $this->product_options_minmax[ $id ] ) ) {
				return $this->product_options_minmax[ $id ];
			}

			$this->product_options_minmax[ $id ] = [
				'tc_min_price'    => 0,
				'tc_max_price'    => 0,
				'tc_min_variable' => 0,
				'tc_max_variable' => 0,
				'tc_min_max'      => false,
			];

			$epos = $this->get_product_tm_epos( $id, '', false, true );

			if ( is_array( $epos ) && ( ! empty( $epos['global'] ) || ! empty( $epos['local'] ) ) && ! empty( $epos['price'] ) ) {
				$minmax = THEMECOMPLETE_EPO_HELPER()->sum_array_values( $id, true );

				if ( ! isset( $minmax['min'] ) ) {
					$minmax['min'] = 0;
				}
				if ( ! isset( $minmax['max'] ) ) {
					$minmax['max'] = 0;
				}

				$min                    = $minmax['min'];
				$max                    = $minmax['max'];
				$minmax['tc_min_price'] = $min;
				$minmax['tc_max_price'] = $max;

				$minmax['tc_min_variable'] = $min;
				$minmax['tc_max_variable'] = $max;

				$minmax['tc_min_max'] = true;

				$this->product_options_minmax[ $id ] = [
					'tc_min_price'    => $min,
					'tc_max_price'    => $max,
					'tc_min_variable' => $min,
					'tc_max_variable' => $max,
					'tc_min_max'      => true,
				];

				if ( is_array( $min ) && is_array( $max ) ) {
					$this->product_options_minmax[ $id ] = [
						'tc_min_price'    => min( $min ),
						'tc_max_price'    => max( $max ),
						'tc_min_variable' => $min,
						'tc_max_variable' => $max,
						'tc_min_max'      => true,
					];

					$minmax['tc_min_price']    = min( $min );
					$minmax['tc_max_price']    = max( $max );
					$minmax['tc_min_variable'] = $min;
					$minmax['tc_max_variable'] = $max;
				}

				return $minmax;
			}
		}

		return false;
	}

	/**
	 * Alter the price filter
	 *
	 * @param mixed        $price The product price.
	 * @param object|false $product The product object.
	 * @return mixed
	 * @since 4.8.4
	 */
	public function woocommerce_product_get_price( $price = 0, $product = false ) {
		if ( '' === $price ) {
			$minmax = $this->add_product_tc_prices( themecomplete_get_id( $product ) );
			if ( false !== $minmax ) {
				$price = 0;
			}
		}

		return $price;
	}

	/**
	 * Alter product display price to include possible option pricing
	 *
	 * @param float        $price The product price.
	 * @param object|false $product The product object.
	 * @return float
	 * @since 1.0
	 */
	public function tm_woocommerce_get_price( $price = 0, $product = false ) {
		++$this->tm_woocommerce_get_price_flag;

		if ( 1 === $this->tm_woocommerce_get_price_flag ) {
			if ( ! is_admin() && ! $this->wc_vars['is_product'] && 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) ) {
				add_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
				add_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
			} else {
				$minmax = $this->add_product_tc_prices( themecomplete_get_id( $product ) );
				if ( false !== $minmax ) {
					add_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
					add_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
				}
			}
		}

		return $price;
	}

	/**
	 * Alter product display price to include possible option pricing
	 *
	 * @param boolean      $show See if prices should be shown for each variation after selection.
	 * @param object|false $product The product object.
	 * @param object|false $variation The variable product object.
	 * @return boolean
	 * @since 1.0
	 */
	public function tm_woocommerce_show_variation_price( $show = true, $product = false, $variation = false ) {
		if ( $product && $variation ) {
			$minmax = THEMECOMPLETE_EPO_HELPER()->sum_array_values( themecomplete_get_id( $product ) );
			if ( is_array( $minmax ) && ! empty( $minmax['max'] ) ) {
				$show = true;
			}
		}

		return $show;
	}

	/**
	 * Returns the product's active price
	 *
	 * @param object|false $product The product object.
	 * @return mixed
	 * @since 1.0
	 */
	public function tc_get_price( $product = false ) {
		$tc_min_price = 0;
		$price        = $tc_min_price;
		if ( $product instanceof WC_Product ) {
			$id = themecomplete_get_id( $product );
			if ( false !== $id && isset( $this->product_options_minmax[ $id ] ) ) {
				$tc_min_price = $this->product_options_minmax[ $id ]['tc_min_price'];
			}

			if ( empty( $this->product_options_minmax[ $id ]['is_override'] ) ) {
				$price = (float) apply_filters( 'wc_epo_product_price', $product->get_price() ) + (float) $tc_min_price;
			} else {
				$price = (float) $tc_min_price;
			}
		}
		return apply_filters( 'tc_woocommerce_product_get_price', $price, $product );
	}

	/**
	 * Returns the price including or excluding tax, based on the 'woocommerce_tax_display_shop' setting.
	 *
	 * @param object|false $product The product object.
	 * @param mixed        $price The product price.
	 * @param integer      $qty The product quantity.
	 * @return string|float
	 * @since 1.0
	 */
	public function tc_get_display_price( $product = false, $price = '', $qty = 1 ) {
		if ( '' === $price ) {
			$price = $this->tc_get_price( $product );
		}
		$display_price = $price;
		if ( $product instanceof WC_Product ) {
			$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );
			$display_price    = 'incl' === $tax_display_mode ? themecomplete_get_price_including_tax(
				$product,
				[
					'qty'   => $qty,
					'price' => $price,
				]
			) : themecomplete_get_price_excluding_tax(
				$product,
				[
					'qty'   => $qty,
					'price' => $price,
				]
			);
		}

		return $display_price;
	}

	/**
	 * Returns the product's regular price.
	 *
	 * @param object|false $product The product object.
	 * @return float
	 * @since 1.0
	 */
	public function tc_get_regular_price( $product = false ) {
		$tc_min_price = (float) 0;
		$price        = $tc_min_price;
		if ( $product instanceof WC_Product ) {
			$id = themecomplete_get_id( $product );
			if ( false !== $id && isset( $this->product_options_minmax[ $id ] ) ) {
				$tc_min_price = $this->product_options_minmax[ $id ]['tc_min_price'];
			}
			if ( empty( $this->product_options_minmax[ $id ]['is_override'] ) ) {
				$price = (float) apply_filters( 'wc_epo_product_price', $product->get_regular_price() ) + (float) $tc_min_price;
			} else {
				$price = (float) $tc_min_price;
			}
		}
		return apply_filters( 'tc_woocommerce_product_get_regular_price', $price, $product );
	}

	/**
	 * Alter product display price to include possible option pricing
	 *
	 * @param mixed        $price The product price.
	 * @param object|false $product The product object.
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_get_price_html( $price = '', $product = false ) {
		if ( $product instanceof WC_Product ) {
			$original_price = $price;

			$min_max = $this->get_product_min_max_prices( $product );
			$type    = themecomplete_get_product_type( $product );

			if ( empty( $min_max ) || 'variation' === $type ) {
				$check_filter_1 = has_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ] );
				$check_filter_2 = has_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ] );
				if ( $check_filter_1 ) {
					remove_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ], 11 );
				}
				if ( $check_filter_2 ) {
					remove_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ], 11 );
				}
				$price = $product->get_price_html();
				if ( $check_filter_1 ) {
					add_filter( 'woocommerce_get_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
				}
				if ( $check_filter_2 ) {
					add_filter( 'woocommerce_get_variation_price_html', [ $this, 'tm_get_price_html' ], 11, 2 );
				}

				return $price;
			}

			$use_from  = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_use_from_on_price' ) );
			$free_text = ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_free_price_label' ) ) ? ( '' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) : '' ) : esc_attr__( 'Free!', 'woocommerce' );

			$min               = $min_max['min_raw'];
			$max               = $min_max['max_raw'];
			$min_price         = $min_max['min_price'];
			$max_price         = $min_max['max_price'];
			$min_regular_price = $min_max['min_regular_price'];
			$max_regular_price = $min_max['max_regular_price'];

			if ( 'variable' === $type || 'variable-subscription' === $type ) {
				$is_free = (float) 0 === (float) $min_price && (float) 0 === (float) $max_price;

				if ( $product->is_on_sale() ) {

					$displayed_price = ( function_exists( 'wc_get_price_to_display' )
						? wc_format_sale_price( $min_regular_price, $min_price )
						: '<del>' . ( is_numeric( $min_regular_price ) ? wc_price( (float) $min_regular_price ) : $min_regular_price ) . '</del> <ins>' . ( is_numeric( $min_price ) ? wc_price( (float) $min_price ) : $min_price ) . '</ins>'
					);
					$price           = $min_price !== $max_price
						? ( ! $use_from
							/* translators: %1 %2: from price to price  */
							? sprintf( esc_html_x( '%1$s&ndash;%2$s', 'Price range: from-to', 'woocommerce' ), themecomplete_price( $min_price ), themecomplete_price( $max_price ) )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . $displayed_price )
						: $displayed_price;

					$regular_price = $min_regular_price !== $max_regular_price
						? ( ! $use_from
							/* translators: %1 %2: from price to price  */
							? sprintf( esc_html_x( '%1$s&ndash;%2$s', 'Price range: from-to', 'woocommerce' ), themecomplete_price( $min_regular_price ), themecomplete_price( $max_regular_price ) )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( $min_regular_price ) )
						: themecomplete_price( $min_regular_price );
					$regular_price = '<del>' . $regular_price . '</del>';
					if ( $min_price === $max_price && $min_regular_price === $max_regular_price ) {
						$price = themecomplete_price( $max_price );
					}
					$price = ( ! $use_from ? ( $regular_price . ' <ins>' . $price . '</ins>' ) : $price ) . $product->get_price_suffix();

				} elseif ( $is_free ) {
					$price = apply_filters( 'woocommerce_variable_free_price_html', $free_text, $product );
				} else {
					$price = $min_price !== $max_price
						? ( ! $use_from
							/* translators: %1 %2: from price to price  */
							? sprintf( esc_html_x( '%1$s &ndash; %2$s', 'Price range: from-to', 'woocommerce' ), themecomplete_price( $min_price ), themecomplete_price( $max_price ) )
							: ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( $min_price ) )
						: themecomplete_price( $min_price );
					$price = $price . $product->get_price_suffix();
				}
			} else {

				$display_price         = $min_price;
				$display_regular_price = $min_regular_price;

				$price = '';
				if ( $this->tc_get_price( $product ) > 0 ) {

					if ( $product->is_on_sale() && $this->tc_get_regular_price( $product ) ) {
						if ( $use_from && ( $max > 0 || $max > $min ) ) {

							$displayed_price = ( function_exists( 'wc_get_price_to_display' )
								? wc_format_sale_price( $display_regular_price, $display_price )
								: '<del>' . ( is_numeric( $display_regular_price ) ? wc_price( (float) $display_regular_price ) : $display_regular_price ) . '</del> <ins>' . ( is_numeric( $display_price ) ? wc_price( (float) $display_price ) : $display_price ) . '</ins>'
							);
							$price          .= ( function_exists( 'wc_get_price_html_from_text' )
									? wc_get_price_html_from_text()
									: $product->get_price_html_from_text() )
												. $displayed_price;
							$price          .= $product->get_price_suffix();
						} else {
							$price .= $original_price;
						}
					} else {
						if ( $use_from && ( $max > 0 || $max > $min ) ) {
							$price .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() );
						}
						$price .= themecomplete_price( $display_price ) . $product->get_price_suffix();

					}
				} elseif ( $this->tc_get_price( $product ) === '' ) {

					$price = apply_filters( 'woocommerce_empty_price_html', '', $product );

				} elseif ( (float) $this->tc_get_price( $product ) === (float) 0 ) {
					if ( $product->is_on_sale() && $this->tc_get_regular_price( $product ) ) {
						if ( $use_from && ( $max > 0 || $max > $min ) ) {
							$price .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( ( $min > 0 ) ? $min : 0 );
						} else {

							$price .= $original_price;

							$price = apply_filters( 'woocommerce_free_sale_price_html', $price, $product );
						}
					} elseif ( $use_from && ( $max > 0 || $max > $min ) ) {
						$price .= ( function_exists( 'wc_get_price_html_from_text' ) ? wc_get_price_html_from_text() : $product->get_price_html_from_text() ) . themecomplete_price( ( $min > 0 ) ? $min : 0 );
					} else {
						$price = '<span class="amount">' . $free_text . '</span>';
						$price = apply_filters( 'woocommerce_free_price_html', $price, $product );
					}
				}
			}
		}

		return apply_filters( 'wc_epo_get_price_html', $price, $product );
	}

	/**
	 * Image filter
	 *
	 * @param mixed $url The image url.
	 * @return string|array<mixed>
	 * @since 1.0
	 */
	public function tm_image_url( $url = '' ) {
		if ( is_array( $url ) ) {
			foreach ( $url as $url_key => $url_value ) {
				if ( ! is_array( $url_value ) ) {
					$url[ $url_key ] = $this->get_cdn_url( $url_value );
				}
			}
		} else {
			$url = $this->get_cdn_url( $url );
		}

		// SSL support.
		$url = THEMECOMPLETE_EPO_HELPER()->to_ssl( $url );

		return $url;
	}

	/**
	 * Get cdn url
	 *
	 * @param mixed $url The cdn url.
	 * @return string
	 * @since 6.0
	 */
	public function get_cdn_url( $url = '' ) {
		if ( is_admin() || is_array( $url ) ) {
			return $url;
		}

		$ext = strtolower( pathinfo( $url, PATHINFO_EXTENSION ) );

		if ( 'php' === $ext ) {
			return $url;
		}

		// WP Rocket cdn.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_cdn_rocket' ) && defined( 'WP_ROCKET_VERSION' ) && function_exists( 'get_rocket_cdn_cnames' ) && function_exists( 'get_rocket_cdn_url' ) ) {
			$zone   = [ 'all', 'images' ];
			$cnames = get_rocket_cdn_cnames( $zone );
			if ( $cnames ) {
				$url = get_rocket_cdn_url( $url, $zone );
			}
		}

		// Jetpack cdn.
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_cdn_jetpack' ) && function_exists( 'jetpack_photon_url' ) && is_string( $url ) ) {
			$url = jetpack_photon_url( $url );
		}

		return $url;
	}

	/**
	 * Flag related products start
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_enable_post_class() {
		$this->tm_related_products_output = true;
	}

	/**
	 * Flag related products end
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_disable_post_class() {
		$this->tm_related_products_output = false;
	}

	/**
	 * Flag related upsells start
	 *
	 * @param array<mixed> $args Array of arguments.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function tm_woocommerce_related_products_args( $args ) {
		$this->tm_disable_post_class();
		$this->in_related_upsells = true;

		return $args;
	}

	/**
	 * Flag related upsells end
	 *
	 * @return void
	 * @since 1.0
	 */
	public function tm_woocommerce_after_single_product_summary() {
		$this->in_related_upsells = false;
	}

	/**
	 * Add custom class to the body tag
	 *
	 * @param array<string> $classes Array of classes.
	 * @return array<string>
	 * @since 1.0
	 */
	public function tm_body_class( $classes = [] ) {
		$post_id = get_the_ID();

		if (
			// disable in admin interface.
			is_admin() ||

			// disable if not in the product div.
			! $this->tm_related_products_output ||

			// disable if not correct post id.
			false === $post_id ||

			// disable if not in a product page, shop or product archive page.
			! (
				'product' === get_post_type( $post_id ) ||
				$this->wc_vars['is_product'] ||
				$this->wc_vars['is_shop'] ||
				$this->wc_vars['is_cart'] ||
				$this->wc_vars['is_product_category'] ||
				$this->wc_vars['is_product_tag']
			) ||

			// disable if options are not visible in shop/archive pages.
			( (
				$this->wc_vars['is_shop'] ||
				$this->wc_vars['is_product_category'] ||
				$this->wc_vars['is_product_tag']
			)
			&&
			'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' )
			)

		) {
			return $classes;
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_responsive_display' ) ) {
			$classes[] = 'tm-responsive';
		}

		return $classes;
	}

	/**
	 * Add custom class to product div used to initialize the plugin JavaScript
	 *
	 * @param array<string> $classes Array of classes.
	 * @return array<string>
	 * @since 1.0
	 */
	public function tm_post_class( $classes = [] ) {
		$post_id = get_the_ID();

		if (
			// Disable if filter runs for more than one time.
			did_filter( 'post_class' ) > 1 ||

			// disable in admin interface.
			is_admin() ||

			// disable if not correct post id.
			false === $post_id ||

			// disable if not in the product div.
			! $this->tm_related_products_output ||

			// disable if not in a product page, shop or product archive page.
			! (
				'product' === get_post_type( $post_id ) ||
				$this->wc_vars['is_product'] ||
				$this->wc_vars['is_shop'] ||
				$this->wc_vars['is_product_category'] ||
				$this->wc_vars['is_product_tag']
			) ||

			// disable if options are not visible in shop/archive pages.
			( (
				$this->wc_vars['is_shop'] ||
				$this->wc_vars['is_product_category'] ||
				$this->wc_vars['is_product_tag']
			)
			&&
			'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' )
			)

		) {
			return $classes;
		}

		// enabling "global $post;" here will cause issues on certain Visual composer shortcodes.

		if ( $post_id && ( $this->wc_vars['is_product'] || 'product' === get_post_type( $post_id ) ) ) {

			$has_epo = THEMECOMPLETE_EPO_API()->has_options( $post_id );

			// Product has styled variations.
			if ( ! empty( $has_epo['variations'] ) && empty( $has_epo['variations_disabled'] ) ) {
				$classes[] = 'tm-has-styled-variations';
			}

			// Product has extra options.
			if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
				$classes[] = 'tm-has-options';

				// Product doesn't have extra options but the final total box is enabled for all products.
			} elseif ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_final_total_box_all' ) ) {

				$classes[] = 'tm-no-options-pxq';

				// Search for composite products extra options.
			} else {

				$extra_classes = apply_filters( 'wc_epo_tm_post_class_no_options', [], $post_id );

				if ( ! empty( $extra_classes ) ) {
					$classes = array_merge( $classes, $extra_classes );
				} elseif ( isset( $has_epo['variations'] ) && ! empty( $has_epo['variations'] ) && isset( $has_epo['variations_disabled'] ) && empty( $has_epo['variations_disabled'] ) ) {
					$classes[] = 'tm-variations-only';
				} else {
					$classes[] = 'tm-no-options';

					$this->hasoptions[ $post_id ] = false;
				}
			}
		}

		return $classes;
	}

	/**
	 * Check if we are in edit mode
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_edit_mode() {
		return ! empty( $this->cart_edit_key ) && isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), 'tm-edit' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
	}

	/**
	 * Check if the plugin is active for the user
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function check_enable() {
		$enable         = false;
		$enabled_roles  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_roles_enabled' );
		$disabled_roles = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_roles_disabled' );

		if ( isset( $this->tm_meta_cpf['override_enabled_roles'] ) && '' !== $this->tm_meta_cpf['override_enabled_roles'] ) {
			$enabled_roles = $this->tm_meta_cpf['override_enabled_roles'];
		}
		if ( isset( $this->tm_meta_cpf['override_disabled_roles'] ) && '' !== $this->tm_meta_cpf['override_disabled_roles'] ) {
			$disabled_roles = $this->tm_meta_cpf['override_disabled_roles'];
		}
		// Get all roles.
		$current_user = wp_get_current_user();

		if ( ! is_array( $enabled_roles ) ) {
			$enabled_roles = [ $enabled_roles ];
		}
		if ( ! is_array( $disabled_roles ) ) {
			$disabled_roles = [ $disabled_roles ];
		}

		// Check if plugin is enabled for everyone.
		foreach ( $enabled_roles as $key => $value ) {
			if ( '@everyone' === $value ) {
				$enable = true;
			}
			if ( '@loggedin' === $value && is_user_logged_in() ) {
				$enable = true;
			}
		}

		if ( $current_user instanceof WP_User ) {
			$roles = $current_user->roles;
			// Check if plugin is enabled for current user.
			if ( is_array( $roles ) ) {

				foreach ( $roles as $key => $value ) {
					if ( in_array( $value, $enabled_roles, true ) ) {
						$enable = true;
						break;
					}
				}

				foreach ( $roles as $key => $value ) {
					if ( in_array( $value, $disabled_roles, true ) ) {
						$enable = false;
						break;
					}
				}
			}
		}

		return $enable;
	}

	/**
	 * Check if we are on a supported quickview mode
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_quick_view() {
		return apply_filters( 'woocommerce_tm_quick_view', false );
	}

	/**
	 * Check if the setting "Enable plugin for WooCommerce shortcodes" is active
	 *
	 * @return boolean
	 * @since 1.0
	 */
	public function is_enabled_shortcodes() {
		return 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_shortcodes' );
	}

	/**
	 * Apply wc_epo_get_current_currency_price filter to prices
	 *
	 * @param mixed  $price The option price.
	 * @param string $type The option type.
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_epo_price_filtered( $price = '', $type = '' ) {
		return apply_filters( 'wc_epo_get_current_currency_price', $price, $type );
	}

	/**
	 * Enable shortcodes for labels
	 *
	 * @param string            $label The element label.
	 * @param array<mixed>|null $args The element array.
	 * @param integer|null      $counter The choice counter.
	 * @param string|null       $value The choice value.
	 * @param string|null       $vlabel The choice label.
	 * @return mixed
	 * @since 1.0
	 */
	public function tm_epo_option_name( $label = '', $args = null, $counter = null, $value = null, $vlabel = null ) {
		if ( ( null === $this->associated_per_product_pricing || 1 === $this->associated_per_product_pricing ) &&
			'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_price_inside_option' ) &&
			( empty( $args['hide_amount'] ) || 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_show_price_inside_option_hidden_even' ) ) &&
			null !== $value &&
			null !== $vlabel &&
			isset( $args['rules_type'] ) &&
			isset( $args['rules_type'][ $value ] ) &&
			isset( $args['rules_type'][ $value ][0] ) &&
			empty( $args['rules_type'][ $value ][0] )
		) {
			$display_price = ( isset( $args['rules_filtered'][ $value ][0] ) ) ? $args['rules_filtered'][ $value ][0] : '';
			$qty           = 1;

			if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_multiply_price_inside_option' ) ) {
				if ( ! empty( $args['quantity'] ) && ! empty( $args['quantity_default_value'] ) ) {
					$qty = floatval( $args['quantity_default_value'] );
				}
			}
			$display_price = floatval( $display_price ) * $qty;

			if ( ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_auto_hide_price_if_zero' ) && ! empty( $display_price ) ) || ( 'yes' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_auto_hide_price_if_zero' ) && '' !== $display_price ) ) {
				$symbol = '';
				if ( '' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_options_price_sign' ) ) {
					$symbol = apply_filters( 'wc_epo_price_in_dropdown_plus_sign', '+' );
				}

				global $product, $associated_product;
				$current_product = $product;
				if ( ! $product && $associated_product ) {
					$current_product = $associated_product;
				}
				if ( $current_product && wc_tax_enabled() ) {
					$tax_display_mode = get_option( 'woocommerce_tax_display_shop' );

					if ( 'excl' === $tax_display_mode ) {
						$display_price = themecomplete_get_price_excluding_tax( $current_product, [ 'price' => $display_price ] );
					} else {
						$display_price = themecomplete_get_price_including_tax( $current_product, [ 'price' => $display_price ] );
					}
				}

				if ( '0' === (string) $display_price ) {
					$symbol = '';
				} elseif ( floatval( $display_price ) < 0 ) {
					$symbol = apply_filters( 'wc_epo_price_in_dropdown_minus_sign', '-' );
				}
				if ( $display_price ) {
					$display_price = apply_filters( 'wc_epo_price_in_dropdown', ' (' . $symbol . wc_price( (float) $display_price ) . ')', $display_price );
				} else {
					$display_price = '';
				}

				$label .= $display_price;

			}
		}

		return apply_filters( 'wc_epo_label', apply_filters( 'wc_epo_kses', $label, $label ) );
	}

	/**
	 * Alters the Free label html
	 *
	 * @param mixed $price The price html.
	 * @param mixed $product The product instance.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_price_html( $price = '', $product = '' ) {
		if ( $product && is_object( $product ) && is_callable( [ $product, 'get_price' ] ) ) {
			if ( (float) $product->get_price() > 0 ) {
				return $price;
			} else {
				return sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
			}
		} else {
			return sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
		}
	}

	/**
	 * Fix for related products when replacing free label
	 *
	 * @param mixed $price The price html.
	 * @param mixed $product The product instance.
	 * @return mixed
	 * @since 1.0
	 */
	public function related_get_price_html( $price = '', $product = '' ) {
		if ( $product && is_object( $product ) && is_callable( [ $product, 'get_price' ] ) ) {
			if ( (float) $product->get_price() > 0 ) {
				return $price;
			} elseif ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
				return sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
			} else {
				$price = '';
			}
		} elseif ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
			return sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
		} else {
			$price = '';
		}

		return $price;
	}

	/**
	 * Fix for related products when replacing free label
	 *
	 * @param mixed $price The price html.
	 * @param mixed $product The product instance.
	 * @return mixed
	 * @since 1.0
	 */
	public function related_get_price_html2( $price = '', $product = '' ) {
		if ( $product && is_object( $product ) && is_callable( [ $product, 'get_price' ] ) ) {

			if ( (float) $product->get_price() > 0 ) {
				return $price;
			} else {

				$thiscpf = $this->get_product_tm_epos( themecomplete_get_id( $product ), '', false, true );

				if ( is_array( $thiscpf ) && ( ! empty( $thiscpf['global'] ) || ! empty( $thiscpf['local'] ) ) ) {
					if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
						return sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
					} else {
						$price = '';
					}
				}
			}
		}

		return $price;
	}

	/**
	 * Free label text replacement
	 *
	 * @param mixed $price The price html.
	 * @param mixed $product The product instance.
	 * @return mixed
	 * @since 1.0
	 */
	public function get_price_html_shop( $price = '', $product = '' ) {
		if ( $product &&
			is_object( $product ) && is_callable( [ $product, 'get_price' ] )
			&& ! (float) $product->get_price() > 0
		) {

			if ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ) ) {
				$price = sprintf( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_replacement_free_price_text' ), $price );
			} else {
				$price = '';
			}
		}

		return $price;
	}

	/**
	 * Replaces add to cart text when the force select setting is enabled
	 *
	 * @param string $text The add to cart text.
	 * @return string
	 * @since 1.0
	 */
	public function add_to_cart_text( $text = '' ) {
		global $product;

		if ( ( is_product() && ! $this->in_related_upsells ) || $this->is_in_product_shortcode ) {
			return $text;
		}
		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' )
			&& 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_options' )
			&& is_object( $product )
			&& property_exists( $product, 'id' )
		) {
			$has_epo = THEMECOMPLETE_EPO_API()->has_options( themecomplete_get_id( $product ) );
			if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
				$text = ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_text' ) ) : esc_html__( 'Select options', 'woocommerce-tm-extra-product-options' );
			}
		}
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_enable_in_shop' ) && ! $this->in_related_upsells ) {
			$text = esc_html__( 'Add to cart', 'woocommerce' );
		}

		return $text;
	}

	/**
	 * Prevenets ajax add to cart when product has extra options and the force select setting is enabled
	 *
	 * @param string $url The url.
	 * @return string
	 * @since 1.0
	 */
	public function add_to_cart_url( $url = '' ) {
		global $product;

		if ( ! is_product()
			&& 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_options' )
			&& is_object( $product )
			&& property_exists( $product, 'id' )
		) {
			$has_epo = THEMECOMPLETE_EPO_API()->has_options( themecomplete_get_id( $product ) );
			if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
				$product_url = get_permalink( themecomplete_get_id( $product ) );
				if ( false !== $product_url ) {
					$url = $product_url;
				}
			}
		}

		return $url;
	}

	/**
	 * Redirect to product URL
	 * THis is used when using the forced select setting
	 *
	 * @param string  $url The url to redirect to.
	 * @param integer $product_id The product id.
	 * @return string
	 * @since 1.0
	 */
	public function woocommerce_cart_redirect_after_error( $url = '', $product_id = 0 ) {
		$product = wc_get_product( $product_id );

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_force_select_options' )
			&& is_object( $product )
			&& property_exists( $product, 'id' )
		) {
			$has_epo = THEMECOMPLETE_EPO_API()->has_options( themecomplete_get_id( $product ) );
			if ( THEMECOMPLETE_EPO_API()->is_valid_options( $has_epo ) ) {
				$product_url = get_permalink( themecomplete_get_id( $product ) );
				if ( false !== $product_url ) {
					$url = $product_url;
				}
			}
		}

		return $url;
	}

	/**
	 * Sets current product settings
	 *
	 * @param integer $override_id Set meta or not.
	 * @return void
	 * @since 1.0
	 */
	public function set_tm_meta( $override_id = 0 ) {
		if ( empty( $override_id ) ) {
			if ( isset( $_REQUEST['add-to-cart'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$override_id = absint( wp_unslash( $_REQUEST['add-to-cart'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			} else {
				global $post;
				if ( ! is_null( $post ) && property_exists( $post, 'ID' ) && property_exists( $post, 'post_type' ) ) {
					if ( 'product' !== $post->post_type ) {
						return;
					}
					$override_id = $post->ID;
				}
			}
		}
		if ( empty( $override_id ) ) {
			return;
		}

		// Translated products inherit original product meta overrides.
		$override_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $override_id, 'product' ) );

		$this->tm_meta_cpf = themecomplete_get_post_meta( $override_id, 'tm_meta_cpf', true );
		if ( ! is_array( $this->tm_meta_cpf ) ) {
			$this->tm_meta_cpf = [];
		}
		foreach ( $this->meta_fields as $key => $value ) {
			$this->tm_meta_cpf[ $key ] = isset( $this->tm_meta_cpf[ $key ] ) ? $this->tm_meta_cpf[ $key ] : $value;
		}
		$this->tm_meta_cpf['metainit'] = 1;
	}

	/**
	 * Calculates the formula price
	 *
	 * @param string                   $_price The math formula.
	 * @param array<mixed>             $post_data The posted data.
	 * @param array<mixed>             $element The element array.
	 * @param string                   $key The posted element value.
	 * @param string|false             $attribute The posted element name.
	 * @param float|array<mixed>|false $attribute_quantity The option quantity of this element.
	 * @param integer                  $key_id The array key of the posted element values array.
	 * @param integer                  $keyvalue_id The array key for the values of the posted element values array.
	 * @param boolean                  $per_product_pricing If the product has pricing, true or false.
	 * @param mixed                    $cpf_product_price The product price.
	 * @param integer|false            $variation_id The variation id.
	 * @param integer                  $price_default_value The value to return if the formula fails.
	 * @param string|false             $currency The currency to set the result to.
	 * @param string|false             $current_currency The current currency.
	 * @param array<mixed>             $price_per_currencies The price per currencies array.
	 * @param array<mixed>|false       $tmcp Saved element data.
	 * @param array<mixed>|false       $cart_meta_epo_type Saved cart meta epo type data.
	 * @param array<mixed>             $tmdata Saved tmdata array.
	 * @param mixed                    $func_total Current options total if applicable.
	 * @param mixed                    $cumulative_total Current cumulative total if applicable.
	 * @return mixed
	 * @since 1.0
	 */
	public function calculate_math_price( $_price = '', $post_data = [], $element = [], $key = '', $attribute = false, $attribute_quantity = false, $key_id = 0, $keyvalue_id = 0, $per_product_pricing = null, $cpf_product_price = false, $variation_id = 0, $price_default_value = 0, $currency = false, $current_currency = false, $price_per_currencies = null, $tmcp = false, $cart_meta_epo_type = false, $tmdata = [], $func_total = false, $cumulative_total = false ) {
		$formula = $_price;

		// This happens when the user has prevented the totals box from being displayed.
		if ( ! isset( $post_data['tc_form_prefix'] ) ) {
			$post_data['tc_form_prefix'] = '';
		}

		$form_prefix = $post_data['tc_form_prefix'];

		if ( false !== $this->associated_element_uniqid && isset( $post_data['tc_form_prefix_assoc'] ) && isset( $post_data['tc_form_prefix_assoc'][ $this->associated_element_uniqid ] ) ) {
			$form_prefix = $post_data['tc_form_prefix_assoc'][ $this->associated_element_uniqid ];
			if ( is_array( $form_prefix ) ) {
				$form_prefix = THEMECOMPLETE_EPO()->associated_product_formprefix;
			}
		}
		if ( '' !== $form_prefix ) {
			$form_prefix = str_replace( '_', '', $form_prefix );
			$form_prefix = '_' . $form_prefix;
		}

		$current_id         = $element['uniqid'] . $form_prefix;
		$current_attributes = THEMECOMPLETE_EPO_CART()->element_id_array[ $current_id ]['name_inc'];
		if ( $current_attributes ) {
			if ( ! is_array( $current_attributes ) ) {
				$current_attributes = [ $current_attributes ];
			}
		} else {
			$current_attributes = [];
		}

		// constants.
		$constants = json_decode( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_math' ), true );
		if ( is_array( $constants ) ) {
			foreach ( $constants as $constant ) {
				if ( str_starts_with( $constant['name'], '{' ) ) {
					$formula = str_replace( $constant['name'], $constant['value'], $formula );
				} elseif ( '' !== $constant['name'] && '' !== $constant['value'] ) {
					if ( str_starts_with( $constant['value'], '{' ) ) {
						$formula = str_replace( '{' . $constant['name'] . '}', $constant['value'], $formula );
					} else {
						$formula = str_replace( '{' . $constant['name'] . '}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( themecomplete_convert_local_numbers( $constant['value'] ) ), true ), $formula );
					}
				}
			}
		}

		// Replaces any number between curly braces with the current currency.
		$formula = preg_replace_callback(
			'/\{(\d+)\}/',
			function ( $matches ) {
				return apply_filters( 'wc_epo_get_currency_price', $matches[1], false, '' );
			},
			$formula
		);

		// the number of options the user has selected.
		$formula = str_replace( '{this.count}', strval( count( array_intersect_key( $post_data, array_flip( $current_attributes ) ) ) ), $formula );

		// the total option quantity of this element.
		$current_attributes_quantity = array_map(
			function ( $y ) {
				return $y . '_quantity';
			},
			$current_attributes
		);
		$quantity_intersect          = array_intersect_key( $post_data, array_flip( $current_attributes_quantity ) );
		$quantity_intersect          = array_map(
			function ( $y ) {
				if ( is_array( $y ) ) {
					$y = array_sum(
						array_map(
							function ( $x ) {
								if ( is_array( $x ) ) {
									$x = array_sum( $x );
								} return $x;
							},
							$y
						)
					);
				} return $y;
			},
			$quantity_intersect
		);

		$formula = str_replace( '{this.count.quantity}', strval( array_sum( (array) $quantity_intersect ) ), $formula );

		// the option quantity of this element.
		$current_quantity = '';
		if ( false === $attribute_quantity ) {
			if ( isset( $post_data[ $attribute . '_quantity' ] ) ) {
				$attribute_quantity = $post_data[ $attribute . '_quantity' ];
			}
		}
		if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $key_id ] ) ) {
			$attribute_quantity = $attribute_quantity[ $key_id ];
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $keyvalue_id ] ) ) {
				$attribute_quantity = $attribute_quantity[ $keyvalue_id ];
			}
		}
		$current_quantity = $attribute_quantity;

		// the option/element quantity.
		$formula = str_replace( '{this.quantity}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $current_quantity ), true ), $formula );

		if ( isset( $element['options'] ) && isset( $element['options'][ $key ] ) ) {
			// the option/element value to float.
			$formula = str_replace( '{this.value}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $element['options'][ $key ] ), true ), $formula );
			// the option/element value.
			$formula = str_replace( '{this.rawvalue}', $element['options'][ $key ], $formula );
			// the option/element value.
			$formula = str_replace( '{this.text}', $element['options'][ $key ], $formula );
			// the option/element value length.
			$formula = str_replace( '{this.value.length}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( strlen( $element['options'][ $key ] ) ), true ), $formula );
		} else {
			// the option/element value.
			if ( isset( $post_data[ $attribute ] ) ) {
				$attribute_value = $post_data[ $attribute ];
			} elseif ( isset( $tmdata['tmcp_post_fields'][ $attribute ] ) ) {
				$attribute_value = $tmdata['tmcp_post_fields'][ $attribute ];
			} elseif ( isset( $_REQUEST[ $attribute ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$attribute_value = wp_unslash( $_REQUEST[ $attribute ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			} elseif ( isset( $_FILES[ $attribute ] ) && isset( $_FILES[ $attribute ]['name'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
				$attribute_value = wp_unslash( $_FILES[ $attribute ]['name'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
			} else {
				$attribute_value = '';
			}

			if ( is_array( $attribute_value ) && isset( $attribute_value[ $key_id ] ) ) {
				$attribute_value = $attribute_value[ $key_id ];
				if ( is_array( $attribute_value ) && isset( $attribute_value[ $keyvalue_id ] ) ) {
					$attribute_value = $attribute_value[ $keyvalue_id ];
				}
			}
			// the option/element value to float.
			$formula = str_replace( '{this.value}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $attribute_value ), true ), $formula );
			// the option/element value.
			$formula = str_replace( '{this.rawvalue}', $attribute_value, $formula );
			// the option/element value.
			$formula = str_replace( '{this.text}', $attribute_value, $formula );
			// the option/element value length.
			$formula = str_replace( '{this.value.length}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( strlen( $attribute_value ) ), true ), $formula );
		}

		// product quantity.
		if ( isset( $post_data['quantity'] ) ) {
			$formula = str_replace( '{quantity}', THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $post_data['quantity'] ), true ), $formula );
		}

		// original product price.
		$product_price = $cpf_product_price;
		if ( ! $product_price ) {
			$product_price = 0;
		}
		$product_price = THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $product_price ), true );

		$formula = str_replace( '{product_price}', $product_price, $formula );
		if ( isset( $post_data['dynamic_product_price'] ) ) {
			$dynamic_product_price = THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $post_data['dynamic_product_price'] ), true );
			$formula               = str_replace( '{dynamic_product_price}', $dynamic_product_price, $formula );
		}

		if ( ! $func_total ) {
			$func_total = 0;
		}
		$func_total = THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $func_total ), true );

		if ( ! $cumulative_total ) {
			$cumulative_total = 0;
		}
		$cumulative_total = THEMECOMPLETE_EPO_HELPER()->convert_to_number( floatval( $cumulative_total ), true );

		$product_price_plus_func_total       = $product_price + $func_total;
		$product_price_plus_cumulative_total = $product_price + $cumulative_total;

		$formula = str_replace( '{options_total}', $func_total, $formula );
		$formula = str_replace( '{product_price_plus_options_total}', $product_price_plus_func_total, $formula );

		$formula = str_replace( '{cumulative_total}', $cumulative_total, $formula );
		$formula = str_replace( '{product_price_plus_cumulative_total}', $product_price_plus_cumulative_total, $formula );

		preg_match_all( '/\{(\s)*?field\.([^}]*)}/', $formula, $matches );

		if ( is_array( $matches ) && isset( $matches[2] ) && is_array( $matches[2] ) ) {

			foreach ( $matches[2] as $matchkey => $match ) {
				$val  = 0;
				$type = '';
				$pos  = strrpos( $match, '.' );

				if ( false !== $pos ) {

					$id     = substr( $match, 0, $pos );
					$pos_id = strrpos( $id, '.' );
					if ( substr_count( $id, '.' ) > 1 && false !== $pos_id ) {
						$id  = substr( $id, 0, $pos_id );
						$pos = $pos_id;
					}
					$id   = $id . $form_prefix;
					$type = substr( $match, $pos + 1 );
					if ( 'text' === $type || 'rawvalue' === $type ) {
						$val = '';
					}

					$thiselement = isset( THEMECOMPLETE_EPO_CART()->element_id_array[ $id ] ) ? THEMECOMPLETE_EPO_CART()->element_id_array[ $id ] : null;
					if ( $thiselement ) {

						$priority              = $thiselement['priority'];
						$pid                   = $thiselement['pid'];
						$section_id            = $thiselement['section_id'];
						$element_key           = $thiselement['element_key'];
						$thiselement           = THEMECOMPLETE_EPO_CART()->global_price_array[ $priority ][ $pid ]['sections'][ $section_id ]['elements'][ $element_key ];
						$_price_per_currencies = isset( $thiselement['price_per_currencies'] ) ? $thiselement['price_per_currencies'] : [];

						$thisattributes = THEMECOMPLETE_EPO_CART()->element_id_array[ $id ]['name_inc'];
						if ( ! is_array( $thisattributes ) ) {
							$thisattributes = [ $thisattributes ];
						}

						$thisattributes = array_unique( $thisattributes );

						if ( is_array( $thisattributes ) ) {
							foreach ( $thisattributes as $thisattribute ) {
								if ( ! isset( $post_data[ $thisattribute ] ) ) {
									continue;
								}
								$thiskey = $post_data[ $thisattribute ];
								if ( in_array( $type, [ 'price', 'value', 'value.length', 'rawvalue', 'text', 'text.length', 'quantity', 'count.quantity', 'count' ], true ) ) {
									switch ( $type ) {
										case 'price':
											// When a dynamic element is linked to another element that is
											// priced with {dynamic_product_price} a circular dependency is created.
											$_price_type = $this->get_element_price_type( '', $thiselement, $thiskey, $per_product_pricing, $variation_id );
											$__price     = $this->get_element_price( '', $_price_type, $thiselement, $thiskey, $per_product_pricing, $variation_id );
											if ( is_array( $tmcp ) && isset( $tmcp['dynamic'] ) ) {
												if ( 'math' === $_price_type && str_contains( $__price, '{dynamic_product_price}' ) ) {
													continue 2;
												}
											}
											// The price types percentcurrenttotal and fixedcurrenttotal
											// create a circular dependency when used with the math formula.
											if ( 'percentcurrenttotal' !== $_price_type && 'fixedcurrenttotal' !== $_price_type ) {
												if ( is_array( $thiskey ) ) {
													foreach ( $thiskey as $thiskey_id => $thiskey_value ) {
														if ( ! is_array( $thiskey_value ) ) {
															$thiskey_value = [ $thiskey_value ];
														}
														foreach ( $thiskey_value as $thiskeyvalue_id => $thiskeyvalue_value ) {
															$cart_meta_epo_type_key = false;
															if ( is_array( $cart_meta_epo_type ) ) {
																foreach ( $cart_meta_epo_type as $ckey => $cvalue ) {
																	if ( $thiselement['uniqid'] === $cvalue['section'] ) {
																		$cart_meta_epo_type_key = $ckey;
																		break;
																	}
																}
															}
															$val += floatval( $this->calculate_price( $post_data, $thiselement, $thiskey, $thisattribute, false, $thiskey_id, $thiskeyvalue_id, $per_product_pricing, $cpf_product_price, $variation_id, $price_default_value, $currency, $current_currency, $_price_per_currencies, false !== $cart_meta_epo_type_key && is_array( $cart_meta_epo_type ) ? $cart_meta_epo_type[ $cart_meta_epo_type_key ] : false, $cart_meta_epo_type, $tmdata ) );
														}
													}
												} else {
													$cart_meta_epo_type_key = false;
													if ( is_array( $cart_meta_epo_type ) ) {
														foreach ( $cart_meta_epo_type as $ckey => $cvalue ) {
															if ( $thiselement['uniqid'] === $cvalue['section'] ) {
																$cart_meta_epo_type_key = $ckey;
																break;
															}
														}
													}
													$val += floatval( $this->calculate_price( $post_data, $thiselement, $thiskey, $thisattribute, false, 0, 0, $per_product_pricing, $cpf_product_price, $variation_id, $price_default_value, $currency, $current_currency, $_price_per_currencies, false !== $cart_meta_epo_type_key && is_array( $cart_meta_epo_type ) ? $cart_meta_epo_type[ $cart_meta_epo_type_key ] : false, $cart_meta_epo_type, $tmdata ) );
												}
											}
											break;
										case 'value':
										case 'text':
										case 'rawvalue':
											if ( is_array( $thiskey ) ) {
												foreach ( $thiskey as $thiskey_id => $thiskey_value ) {
													if ( ! is_array( $thiskey_value ) ) {
														$thiskey_value = [ $thiskey_value ];
													}
													foreach ( $thiskey_value as $thiskeyvalue_id => $thiskeyvalue_value ) {
														$temp_value = $thiskeyvalue_value;
														if ( isset( $thiselement['options'] ) && isset( $thiselement['options'][ $thiskeyvalue_value ] ) ) {
															$temp_value = $thiselement['options'][ $thiskeyvalue_value ];
														}
														if ( 'text' === $type || 'rawvalue' === $type ) {
															if ( '' === $temp_value ) {
																$temp_value = "''";
															} elseif ( ! is_numeric( $temp_value ) ) {
																$temp_value = "'" . $temp_value . "'";
															}
															$val .= $temp_value;
														} else {
															$val += THEMECOMPLETE_EPO_HELPER()->unformat( $temp_value );
														}
													}
												}
											} else {
												$temp_value = $thiskey;
												if ( isset( $thiselement['options'] ) && isset( $thiselement['options'][ $thiskey ] ) ) {
													$temp_value = $thiselement['options'][ $thiskey ];
												} else {
													if ( 'select' === $thiselement['type'] ) {
														$thiskey = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $thiskey, '_' );
													}
													$temp_value = $thiskey;
												}
												if ( 'text' === $type || 'rawvalue' === $type ) {
													if ( '' === $temp_value ) {
														$temp_value = "''";
													} elseif ( ! is_numeric( $temp_value ) ) {
														$temp_value = "'" . $temp_value . "'";
													}
													$val .= $temp_value;
												} else {
													$val += THEMECOMPLETE_EPO_HELPER()->unformat( $temp_value );
												}
											}
											break;
										case 'value.length':
										case 'text.length':
											if ( is_array( $thiskey ) ) {
												foreach ( $thiskey as $thiskey_id => $thiskey_value ) {
													if ( ! is_array( $thiskey_value ) ) {
														$thiskey_value = [ $thiskey_value ];
													}
													foreach ( $thiskey_value as $thiskeyvalue_id => $thiskeyvalue_value ) {
														if ( isset( $thiselement['options'] ) && isset( $thiselement['options'][ $thiskeyvalue_value ] ) ) {
															$val += strlen( $thiselement['options'][ $thiskeyvalue_value ] );
														} else {
															$val += strlen( $thiskeyvalue_value );
														}
													}
												}
											} elseif ( isset( $thiselement['options'] ) && isset( $thiselement['options'][ $thiskey ] ) ) {
												$val += strlen( $thiselement['options'][ $thiskey ] );
											} else {
												$val += strlen( $thiskey );
											}
											break;
										case 'quantity':
										case 'count.quantity':
											if ( isset( $post_data[ $thisattribute . '_quantity' ] ) ) {
												$thisquantity = array_map(
													function ( $y ) {
														if ( is_array( $y ) ) {
															$y = array_sum(
																array_map(
																	function ( $x ) {
																		if ( is_array( $x ) ) {
																			$x = array_sum( $x );
																		} return $x;
																	},
																	$y
																)
															);
														} return $y;
													},
													(array) $post_data[ $thisattribute . '_quantity' ]
												);
												$val         += floatval( array_sum( $thisquantity ) );
											}
											break;
										case 'count':
											// Only for when radio buttons uses connector.
											if ( isset( $thiselement['connector'] ) && '' !== $thiselement['connector'] ) {
												$ppattern = '/_(\d+)(?:-(\d+))?$/';
												if ( preg_match( $ppattern, $thiskey, $mmatches ) ) {
													if ( isset( $matches[2] ) ) {
														$posted_value = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $thiskey, '-' );
														if ( '' === $posted_value ) {
															$posted_value = $thiskey;
														}
													}
												}
												if ( in_array( $posted_value, array_keys( $thiselement['options'] ), true ) ) {
													++$val;
												}
											}
											break;
									}
								}
							}

							if ( 'count' === $type ) {
								// On all cases except connecting radio buttons.
								if ( ! ( isset( $thiselement['connector'] ) && '' !== $thiselement['connector'] ) ) {
									$val = floatval( count( array_intersect_key( $post_data, array_flip( $thisattributes ) ) ) );
								}
							}
						}
					}
				}
				if ( ! is_numeric( $val ) && ( 'text' === $type || 'rawvalue' === $type ) ) {
					// This can happen if the value of the element is not posted, like a radio button that is not selected.
					if ( '' === $val ) {
						$val = "''";
					}
					$formula = str_replace( $matches[0][ $matchkey ], $val, $formula );
				} else {
					$val     = THEMECOMPLETE_EPO_HELPER()->convert_to_number( $val, true );
					$formula = str_replace( $matches[0][ $matchkey ], $val, $formula );
				}
			}
		}

		$formula = themecomplete_convert_local_numbers( $formula );

		// Do the math.
		if ( version_compare( phpversion(), THEMECOMPLETE_EPO_PHP_VERSION, '<' ) ) {
			return $formula ? THEMECOMPLETE_EPO_MATH_DEPRECATED::evaluate( $formula ) : 0;
		}
		return $formula ? THEMECOMPLETE_EPO_MATH::evaluate( $formula ) : 0;
	}

	/**
	 * Get element's saved price type
	 *
	 * @param array<mixed> $tmcp Saved element data.
	 * @param mixed        $key The posted element value.
	 *
	 * @return string
	 */
	public function get_saved_element_price_type( $tmcp = [], $key = false ) {
		$price_type = '';
		$key        = ( false !== $key ) ? $key : ( isset( $tmcp['key'] ) ? $tmcp['key'] : 0 );
		$key        = esc_attr( $key );

		if ( ! isset( $tmcp['element']['rules_type'][ $key ] ) ) {// field price rule.
			if ( isset( $tmcp['element']['rules_type'][0][0] ) ) {// general rule.
				$price_type = $tmcp['element']['rules_type'][0][0];
			}
		} elseif ( isset( $tmcp['element']['rules_type'][ $key ][0] ) ) {// general field variation rule.
			$price_type = $tmcp['element']['rules_type'][ $key ][0];
		} elseif ( isset( $tmcp['element']['rules_type'][0][0] ) ) {// general rule.
			$price_type = $tmcp['element']['rules_type'][0][0];
		}

		return $price_type;
	}

	/**
	 * Get element's saved price
	 *
	 * @param array<mixed> $tmcp Saved element data.
	 * @param array<mixed> $element The element array.
	 * @param string|false $key The posted element value.
	 *
	 * @return string
	 */
	public function get_saved_element_price( $tmcp = [], $element = [], $key = false ) {
		$price = '';
		$key   = ( false !== $key ) ? $key : ( isset( $tmcp['key'] ) ? $tmcp['key'] : 0 );
		$key   = esc_attr( $key );

		if ( THEMECOMPLETE_EPO_WPML()->is_multi_currency() && isset( $element['price_rules'][ $key ] ) ) {
			if ( isset( $element['price_rules'][ $key ][0] ) ) {// general rule.
				$price = $element['price_rules'][ $key ][0];
			}
		} elseif ( ! isset( $tmcp['element']['rules'][ $key ] ) ) {// field price rule.
			if ( isset( $tmcp['element']['rules'][0][0] ) ) {// general rule.
				$price = $tmcp['element']['rules'][0][0];
			}
		} elseif ( isset( $tmcp['element']['rules'][ $key ][0] ) ) {// general field variation rule.
			$price = $tmcp['element']['rules'][ $key ][0];
		} elseif ( isset( $tmcp['element']['rules'][0][0] ) ) {// general rule.
			$price = $tmcp['element']['rules'][0][0];
		} elseif ( isset( $element['price_rules'][ $key ] ) && isset( $element['price_rules'][ $key ][0] ) && '' !== $element['price_rules'][ $key ][0] ) {
			$price = $element['price_rules'][ $key ][0];
		}

		return $price;
	}

	/**
	 * Get the element price type
	 *
	 * @param string              $price_type_default_value The default price type.
	 * @param array<mixed>        $element The element array.
	 * @param string|array<mixed> $key The posted element value.
	 * @param boolean|null        $per_product_pricing If the product has pricing, true or false.
	 * @param integer|false       $variation_id The variation id.
	 * @return string
	 * @since 5.0.11
	 */
	public function get_element_price_type( $price_type_default_value = '', $element = [], $key = '', $per_product_pricing = null, $variation_id = false ) {
		$_price_type = $price_type_default_value;
		// This currently happens for multiple file uploads.
		if ( is_array( $key ) ) {
			$key = '0';
		}
		$key = esc_attr( THEMECOMPLETE_EPO_HELPER()->clear_key( $key ) );
		if ( $per_product_pricing ) {

			if ( ! isset( $element['price_rules_type'][ $key ] ) ) {// field price rule.
				if ( $variation_id && isset( $element['price_rules_type'][0][ $variation_id ] ) ) {// general variation rule.
					$_price_type = $element['price_rules_type'][0][ $variation_id ];
				} elseif ( isset( $element['price_rules_type'][0][0] ) ) {// general rule.
					$_price_type = $element['price_rules_type'][0][0];
				}
			} elseif ( $variation_id && isset( $element['price_rules_type'][ $key ][ $variation_id ] ) ) {// field price rule.
				$_price_type = $element['price_rules_type'][ $key ][ $variation_id ];
			} elseif ( isset( $element['price_rules_type'][ $key ][0] ) ) {// general field variation rule.
				$_price_type = $element['price_rules_type'][ $key ][0];
			} elseif ( $variation_id && isset( $element['price_rules_type'][0][ $variation_id ] ) ) {// general variation rule.
				$_price_type = $element['price_rules_type'][0][ $variation_id ];
			} elseif ( isset( $element['price_rules_type'][0][0] ) ) {// general rule.
				$_price_type = $element['price_rules_type'][0][0];
			}
		}

		return $_price_type;
	}

	/**
	 * Get the element price
	 *
	 * @param mixed               $price_default_value The default value to return.
	 * @param string              $_price_type The price type.
	 * @param array<mixed>        $element The element array.
	 * @param string|array<mixed> $key The posted element value.
	 * @param boolean|null        $per_product_pricing If the product has pricing, true or false.
	 * @param integer|false       $variation_id The variation id.
	 * @param array<mixed>|null   $price_per_currencies The price per currencies array.
	 * @param string|false        $currency The currency to set the result to.
	 * @return mixed
	 * @since 6.0
	 */
	public function get_element_price( $price_default_value = 0, $_price_type = '', $element = [], $key = '', $per_product_pricing = null, $variation_id = false, $price_per_currencies = null, $currency = false ) {
		$_price = $price_default_value;
		// This currently happens for multiple file uploads.
		if ( is_array( $key ) ) {
			$key = '0';
		}
		$key = esc_attr( THEMECOMPLETE_EPO_HELPER()->clear_key( $key ) );
		if ( $per_product_pricing ) {

			if ( ! isset( $element['price_rules'][ $key ] ) ) {// field price rule.
				if ( $variation_id && isset( $element['price_rules'][0][ $variation_id ] ) ) {// general variation rule.
					$_price = $element['price_rules'][0][ $variation_id ];
				} elseif ( isset( $element['price_rules'][0][0] ) ) {// general rule.
					$_price = $element['price_rules'][0][0];
				}
			} elseif ( $variation_id && isset( $element['price_rules'][ $key ][ $variation_id ] ) ) {// field price rule.
				$_price = $element['price_rules'][ $key ][ $variation_id ];
			} elseif ( isset( $element['price_rules'][ $key ][0] ) ) {// general field variation rule.
				$_price = $element['price_rules'][ $key ][0];
			} elseif ( $variation_id && isset( $element['price_rules'][0][ $variation_id ] ) ) {// general variation rule.
				$_price = $element['price_rules'][0][ $variation_id ];
			} elseif ( isset( $element['price_rules'][0][0] ) ) {// general rule.
				$_price = $element['price_rules'][0][0];
			}

			if ( ( 'percent' === $_price_type || 'percentcurrenttotal' === $_price_type ) && '' === $_price && isset( $element['price_rules_original'] ) ) {
				if ( ! isset( $element['price_rules_original'][ $key ] ) ) {// field price rule.
					if ( $variation_id && isset( $element['price_rules_original'][0][ $variation_id ] ) ) {// general variation rule.
						$_price = $element['price_rules_original'][0][ $variation_id ];
					} elseif ( isset( $element['price_rules_original'][0][0] ) ) {// general rule.
						$_price = $element['price_rules_original'][0][0];
					}
				} elseif ( $variation_id && isset( $element['price_rules_original'][ $key ][ $variation_id ] ) ) {// field price rule.
					$_price = $element['price_rules_original'][ $key ][ $variation_id ];
				} elseif ( isset( $element['price_rules_original'][ $key ][0] ) ) {// general field variation rule.
					$_price = $element['price_rules_original'][ $key ][0];
				} elseif ( $variation_id && isset( $element['price_rules_original'][0][ $variation_id ] ) ) {// general variation rule.
					$_price = $element['price_rules_original'][0][ $variation_id ];
				} elseif ( isset( $element['price_rules_original'][0][0] ) ) {// general rule.
					$_price = $element['price_rules_original'][0][0];
				}
			}

			$currency_price = false;
			if ( $currency && $price_per_currencies && is_array( $price_per_currencies ) && isset( $price_per_currencies[ $currency ] ) ) {
				if ( isset( $price_per_currencies[ $currency ][ $key ] ) ) {
					if ( isset( $price_per_currencies[ $currency ][ $key ][0] ) ) {
						$currency_price = $price_per_currencies[ $currency ][ $key ][0];
						if ( '' !== $currency_price ) {
							$currency = false;
						} else {
							$currency_price = false;
						}
					}
				} elseif ( '' !== $key && isset( $price_per_currencies[ $currency ][0] ) && isset( $price_per_currencies[ $currency ][0][0] ) ) {
					$currency_price = $price_per_currencies[ $currency ][0][0];
					if ( '' !== $currency_price ) {
						$currency = false;
					} else {
						$currency_price = false;
					}
				}
			}

			if ( false !== $currency_price ) {
				$_price = $currency_price;
			}

			if ( 'math' !== $_price_type && '' !== $_price ) {
				$_price = floatval( wc_format_decimal( $_price, false, true ) );
			}
		}

		if ( is_array( $_price ) ) {
			$_price = $price_default_value;
		}

		if ( null !== $price_per_currencies ) {
			$_price = [
				'price'    => $_price,
				'currency' => $currency,
			];
		}

		return $_price;
	}

	/**
	 * Check for the presence of mathematical special variables in a given string.
	 *
	 * @param mixed  $price_string The input string to be checked for mathematical special variables.
	 * @param string $type The type of the special variable to check.
	 *                     Possible values: '' (all types), 'special', 'cumulative'.
	 *
	 * @return bool True if any special variable is found, false otherwise.
	 */
	public function has_math_special_variable( $price_string = '', $type = '' ) {
		if ( ! is_string( $price_string ) ) {
			return false;
		}
		$math_special_variables = [
			'{product_price_plus_options_total}',
			'{options_total}',
		];

		$math_cumulative_special_variables = [
			'{cumulative_total}',
			'{product_price_plus_cumulative_total}',
		];

		if ( empty( $type ) || 'special' === $type ) {
			foreach ( $math_special_variables as $variable ) {
				if ( str_contains( $price_string, $variable ) ) {
					return true;
				}
			}
		}

		if ( empty( $type ) || 'cumulative' === $type ) {
			foreach ( $math_cumulative_special_variables as $variable ) {
				if ( str_contains( $price_string, $variable ) ) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Calculates the correct option price
	 *
	 * @param array<mixed>|null        $post_data The posted data.
	 * @param array<mixed>             $element The element array.
	 * @param mixed                    $key The posted element value.
	 * @param string|false             $attribute The posted element name.
	 * @param float|array<mixed>|false $attribute_quantity The option quantity of this element.
	 * @param integer                  $key_id The array key of the posted element values array.
	 * @param integer                  $keyvalue_id The array key for the values of the posted element values array.
	 * @param boolean|null             $per_product_pricing If the product has pricing, true or false.
	 * @param mixed                    $cpf_product_price The product price.
	 * @param integer|false            $variation_id The variation id.
	 * @param mixed                    $price_default_value The value to return if the formula fails.
	 * @param string|false             $currency The currency to set the result to.
	 * @param string|false             $current_currency The current currency.
	 * @param array<mixed>|null        $price_per_currencies The price per currencies array.
	 * @param array<mixed>|false       $tmcp Saved element data.
	 * @param array<mixed>|false       $cart_meta_epo_type Saved cart meta epo type data.
	 * @param array<mixed>             $tmdata Saved tmdata array.
	 * @param mixed                    $func_total Current options total if applicable.
	 * @param mixed                    $cumulative_total Current cumulative total if applicable.
	 * @return mixed
	 * @since 1.0
	 */
	public function calculate_price( $post_data = null, $element = [], $key = null, $attribute = false, $attribute_quantity = false, $key_id = 0, $keyvalue_id = 0, $per_product_pricing = null, $cpf_product_price = false, $variation_id = false, $price_default_value = false, $currency = false, $current_currency = false, $price_per_currencies = null, $tmcp = false, $cart_meta_epo_type = false, $tmdata = [], $func_total = false, $cumulative_total = false ) {
		$element = apply_filters( 'wc_epo_get_element_for_display', $element );
		// @phpstan-ignore-next-line
		if ( is_null( $post_data ) && isset( $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$post_data = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification
		}
		if ( empty( $post_data ) && isset( $_REQUEST['tcajax'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$post_data = wp_unslash( $_REQUEST ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		}

		/**
		 * Post data
		 *
		 * @var array<mixed> $post_data
		 */
		$post_data = wp_unslash( $post_data );

		if ( false === $attribute_quantity ) {
			if ( isset( $post_data[ $attribute . '_quantity' ] ) ) {
				$attribute_quantity = $post_data[ $attribute . '_quantity' ];
			}
		}
		if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $key_id ] ) ) {
			$attribute_quantity = $attribute_quantity[ $key_id ];
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $keyvalue_id ] ) ) {
				$attribute_quantity = $attribute_quantity[ $keyvalue_id ];
			}
		}

		// This should only trigger manually for internal calculation in math price.
		if ( false === $attribute_quantity ) {
			$attribute_quantity = 1;
		}

		$posted_attribute = '';
		if ( isset( $post_data[ $attribute ] ) ) {
			$posted_attribute = $post_data[ $attribute ];
		} elseif ( isset( $_FILES[ $attribute ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$posted_attribute = wp_unslash( $_FILES[ $attribute ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
		}

		if ( is_array( $posted_attribute ) && isset( $posted_attribute[ $key_id ] ) ) {
			$posted_attribute = $posted_attribute[ $key_id ];
			if ( is_array( $posted_attribute ) && isset( $posted_attribute[ $keyvalue_id ] ) ) {
				$posted_attribute = $posted_attribute[ $keyvalue_id ];
			}
		}

		// This currently happens for multiple file uploads and repeaters.
		if ( is_array( $key ) ) {
			if ( 'multiple_file_upload' === $element['type'] ) {
				$key = [ 0 ];
			}
		}

		if ( ! is_array( $key ) ) {
			$key = [ $key ];
		}

		$price = 0;

		foreach ( $key as $thiskey ) {

			$_price = $this->calculate_key_price( $posted_attribute, $post_data, $element, $thiskey, $attribute, $attribute_quantity, $key_id, $keyvalue_id, $per_product_pricing, $cpf_product_price, $variation_id, $price_default_value, $currency, $current_currency, $price_per_currencies, $tmcp, $cart_meta_epo_type, $tmdata, $func_total, $cumulative_total );
			if ( '' === $price_default_value && '' === $_price ) {
				$price = $_price;
			} else {
				if ( false === $price_default_value || '' === $price_default_value ) {
					$price_default_value = 0;
				}
				$price = floatval( $_price ) + floatval( $price );
			}
		}

		return $price;
	}

	/**
	 * Calculates the correct option price for the $key
	 *
	 * @param string                   $posted_attribute The posted attribute.
	 * @param array<mixed>|null        $post_data The posted data.
	 * @param array<mixed>             $element The element array.
	 * @param string                   $key The posted element value.
	 * @param string|false             $attribute The posted element name.
	 * @param float|array<mixed>|false $attribute_quantity The option quantity of this element.
	 * @param integer                  $key_id The array key of the posted element values array.
	 * @param integer                  $keyvalue_id The array key for the values of the posted element values array.
	 * @param boolean|null             $per_product_pricing If the product has pricing, true or false.
	 * @param mixed                    $cpf_product_price The product price.
	 * @param integer|false            $variation_id The variation id.
	 * @param mixed                    $price_default_value The value to return if the formula fails.
	 * @param string|false             $currency The currency to set the result to.
	 * @param string|false             $current_currency The current currency.
	 * @param array<mixed>|null        $price_per_currencies The price per currencies array.
	 * @param array<mixed>|false       $tmcp Saved element data.
	 * @param array<mixed>|false       $cart_meta_epo_type Saved cart meta epo type data.
	 * @param array<mixed>             $tmdata Saved tmdata array.
	 * @param mixed                    $func_total Current options total if applicable.
	 * @param mixed                    $cumulative_total Current cumulative total if applicable.
	 * @return mixed
	 * @since 6.0
	 */
	public function calculate_key_price( $posted_attribute = '', $post_data = null, $element = [], $key = '', $attribute = false, $attribute_quantity = false, $key_id = 0, $keyvalue_id = 0, $per_product_pricing = null, $cpf_product_price = false, $variation_id = false, $price_default_value = 0, $currency = false, $current_currency = false, $price_per_currencies = null, $tmcp = false, $cart_meta_epo_type = false, $tmdata = [], $func_total = false, $cumulative_total = false ) {
		if ( false === $price_default_value ) {
			$price_default_value = 0;
		}

		$key = esc_attr( $key );

		$original_currency = $currency;

		$_price_type = $this->get_element_price_type( '', $element, $key, $per_product_pricing, $variation_id );
		$_price      = $this->get_element_price( $price_default_value, $_price_type, $element, $key, $per_product_pricing, $variation_id, $price_per_currencies, $currency );
		if ( is_array( $_price ) ) {
			if ( false === $_price['currency'] ) {
				$currency = false;
			}
			$_price = $_price['price'];
		}

		if ( $per_product_pricing && '' !== $key ) {

			if ( false !== $cpf_product_price ) {
				$cpf_product_price = apply_filters( 'wc_epo_original_price_type_mode', $cpf_product_price, $post_data );
			}
			switch ( $_price_type ) {
				case 'percent_cart_total':
					$_price = ( floatval( $_price ) / 100 ) * floatval( WC()->cart->get_cart_contents_total() );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;

				case 'percent':
					if ( false !== $cpf_product_price ) {
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_convert_to_currency', $cpf_product_price, $current_currency, $currency );
						}
						$_price = ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price );
					}
					break;
				case 'percentcurrenttotal':
					$_original_price = $_price;
					if ( false !== $cpf_product_price ) {
						if ( '' !== $_price ) {
							if ( isset( $post_data[ $attribute . '_hidden' ] ) ) {
								$_price = floatval( $post_data[ $attribute . '_hidden' ] );
							}
							if ( isset( $post_data['tm_epo_options_static_prices'] ) ) {
								$_price = ( floatval( $post_data['tm_epo_options_static_prices'] ) + floatval( $cpf_product_price ) ) * ( floatval( $_original_price ) / 100 );
								if ( $attribute_quantity > 0 ) {
									$_price = $_price * floatval( $attribute_quantity );
								}
							}

							if ( $attribute_quantity > 0 ) {
								$_price = $_price / floatval( $attribute_quantity );
							}
						}
					}
					break;
				case 'fixedcurrenttotal':
					$_original_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, '', $current_currency, $price_per_currencies, $key, $attribute );

					if ( '' !== $_price && isset( $post_data[ $attribute . '_hiddenfixed' ] ) ) {
						$_price = floatval( $post_data[ $attribute . '_hiddenfixed' ] );

						if ( isset( $post_data['tm_epo_options_static_prices'] ) ) {
							$_price = ( floatval( $post_data['tm_epo_options_static_prices'] ) + floatval( $_original_price ) );
							if ( $attribute_quantity > 0 ) {
								$_price = $_price * floatval( $attribute_quantity );
							}
						}

						if ( $attribute_quantity > 0 ) {
							$_price = $_price / floatval( $attribute_quantity );
						}
					}
					break;
				case 'word':
					$_price = floatval( floatval( $_price ) * floatval( THEMECOMPLETE_EPO_HELPER()->count_words( $posted_attribute ) ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'wordpercent':
					if ( false !== $cpf_product_price ) {
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_price = floatval( THEMECOMPLETE_EPO_HELPER()->count_words( $posted_attribute ) ) * ( floatval( $_price / 100 ) * floatval( $cpf_product_price ) );
					}
					break;
				case 'wordnon':
					$freechars   = absint( $element['freechars'] );
					$_textlength = floatval( THEMECOMPLETE_EPO_HELPER()->count_words( $posted_attribute ) ) - $freechars;
					if ( $_textlength < 0 ) {
						$_textlength = 0;
					}
					$_price = floatval( floatval( $_price ) * $_textlength );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'wordpercentnon':
					if ( false !== $cpf_product_price ) {
						$freechars = absint( $element['freechars'] );
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_textlength = floatval( THEMECOMPLETE_EPO_HELPER()->count_words( $posted_attribute ) ) - $freechars;
						if ( $_textlength < 0 ) {
							$_textlength = 0;
						}
						$_price = floatval( $_textlength ) * ( ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price ) );
					}
					break;

				case 'char':
					$_price = floatval( floatval( $_price ) * floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'charpercent':
					if ( false !== $cpf_product_price ) {
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_price = floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) * ( ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price ) );
					}
					break;
				case 'charnofirst':
					$_textlength = floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) - 1;
					if ( $_textlength < 0 ) {
						$_textlength = 0;
					}
					$_price = floatval( floatval( $_price ) * $_textlength );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;

				case 'charnon':
					$freechars   = absint( $element['freechars'] );
					$_textlength = floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) - $freechars;
					if ( $_textlength < 0 ) {
						$_textlength = 0;
					}
					$_price = floatval( floatval( $_price ) * $_textlength );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'charpercentnon':
					if ( false !== $cpf_product_price ) {
						$freechars = absint( $element['freechars'] );
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_textlength = floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) - $freechars;
						if ( $_textlength < 0 ) {
							$_textlength = 0;
						}
						$_price = floatval( $_textlength ) * ( ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price ) );
					}
					break;
				case 'charnonnospaces':
					$freechars   = absint( $element['freechars'] );
					$_textlength = floatval( strlen( preg_replace( '/\s+/', '', stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) ) - $freechars;
					if ( $_textlength < 0 ) {
						$_textlength = 0;
					}
					$_price = floatval( floatval( $_price ) * $_textlength );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'charpercentnonnospaces':
					if ( false !== $cpf_product_price ) {
						$freechars = absint( $element['freechars'] );
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_textlength = floatval( strlen( preg_replace( '/\s+/', '', stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) ) - $freechars;
						if ( $_textlength < 0 ) {
							$_textlength = 0;
						}
						$_price = floatval( $_textlength ) * ( ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price ) );
					}
					break;

				case 'charnospaces':
					$_price = floatval( floatval( $_price ) * strlen( preg_replace( '/\s+/', '', stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'charpercentnofirst':
					if ( false !== $cpf_product_price ) {
						if ( $currency ) {
							$cpf_product_price = apply_filters( 'wc_epo_get_currency_price', $cpf_product_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
						$_textlength = floatval( strlen( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ) ) ) - 1;
						if ( $_textlength < 0 ) {
							$_textlength = 0;
						}
						$_price = floatval( $_textlength ) * ( ( floatval( $_price ) / 100 ) * floatval( $cpf_product_price ) );
					}
					break;
				case 'step':
					$_price = floatval( floatval( $_price ) * floatval( stripcslashes( $posted_attribute ) ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'currentstep':
					$_price = floatval( stripcslashes( $posted_attribute ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'intervalstep':
					if ( isset( $element['min'] ) ) {
						$_min   = floatval( $element['min'] );
						$_price = floatval( floatval( $_price ) * ( floatval( stripcslashes( $posted_attribute ) ) - $_min ) );
						if ( $currency ) {
							$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
						}
					}
					break;
				case 'row':
					$_price = floatval( floatval( $_price ) * ( substr_count( stripcslashes( THEMECOMPLETE_EPO_HELPER()->utf8_decode( $posted_attribute ) ), "\r\n" ) + 1 ) );
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
				case 'math':
					$_price = $this->calculate_math_price( $_price, $post_data, $element, $key, $attribute, $attribute_quantity, $key_id, $keyvalue_id, $per_product_pricing, $cpf_product_price, $variation_id, $price_default_value, $original_currency, $current_currency, $price_per_currencies, $tmcp, $cart_meta_epo_type, $tmdata, $func_total, $cumulative_total );
					break;
				default:
					// fixed price.
					if ( $currency ) {
						$_price = apply_filters( 'wc_epo_get_currency_price', $_price, $currency, $_price_type, $current_currency, $price_per_currencies, $key, $attribute );
					}
					break;
			}

			$_price = floatval( $_price ) * floatval( $attribute_quantity );

			if ( '' === $price_default_value && (float) 0 === $_price ) {
				$_price = '';
			}
		} else {
			$_price = $price_default_value;
		}

		return $_price;
	}

	/**
	 * Get all lookup tables
	 *
	 * @return array<mixed>
	 * @since 6.1
	 */
	public function fetch_all_lookuptables() {
		$meta_array = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'OR', 'lookuptable_meta', '', '!=', 'NOT EXISTS' );

		$meta_query_args = [
			'relation' => 'AND',
			$meta_array,
			[
				[
					'key'     => 'lookuptable_meta',
					'compare' => 'EXISTS',
				],
			],
		];

		$args = [
			'post_type'        => THEMECOMPLETE_EPO_LOOKUPTABLE_POST_TYPE,
			'post_status'      => [ 'publish' ],
			'numberposts'      => -1,
			'orderby'          => 'ID',
			'order'            => 'asc',
			'meta_query'       => $meta_query_args, // phpcs:ignore WordPress.DB.SlowDBQuery
			'suppress_filters' => false,
		];

		$lookuptables = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

		return $lookuptables;
	}

	/**
	 * Fetches all lookup tables
	 *
	 * @return false|array<mixed>
	 * @since 6.4
	 */
	public function fetch_lookuptables() {
		if ( false === $this->lookup_tables ) {
			$this->lookup_tables = [];
			$this->generate_lookuptables();
		}
		return $this->lookup_tables;
	}

	/**
	 * Generate all lookup tables
	 * and save them in $this->lookup_tables
	 *
	 * @return void
	 * @since 6.1
	 */
	public function generate_lookuptables() {
		$lookuptables = $this->fetch_all_lookuptables();
		if ( $lookuptables && is_array( $this->lookup_tables ) ) {
			foreach ( $lookuptables as $table ) {
				$meta = themecomplete_get_post_meta( $table->ID, 'lookuptable_meta', true );

				if ( ! is_array( $meta ) ) {
					$meta = [];
				}

				foreach ( $meta as $table_name => $table_data ) {
					$index = 0;
					if ( isset( $this->lookup_tables[ $table_name ] ) ) {
						$index = count( $this->lookup_tables[ $table_name ] );
					}
					$this->lookup_tables[ $table_name ][ $index ]['data'] = $table_data;
				}
			}
		}
	}

	/**
	 * Upload file
	 *
	 * @param array<mixed> $file The file array.
	 * @param integer      $key_id The array key of the posted element values array.
	 * @param integer      $keyvalue_id The array key for the values of the posted element values array.
	 *
	 * @return array<mixed>|mixed
	 */
	public function upload_file( $file, $key_id = 0, $keyvalue_id = 0 ) {
		$tmp_name = $file['tmp_name'];
		if ( is_array( $tmp_name ) && isset( $tmp_name[ $key_id ] ) ) {
			$tmp_name = $tmp_name[ $key_id ];
			if ( is_array( $tmp_name ) && isset( $tmp_name[ $keyvalue_id ] ) ) {
				$tmp_name = $tmp_name[ $keyvalue_id ];
			}
		}

		if ( is_array( $file ) ) {
			foreach ( $file as $key => $value ) {
				if ( is_array( $value ) && isset( $value[ $key_id ] ) ) {
					$value = $value[ $key_id ];
					if ( is_array( $value ) && isset( $value[ $keyvalue_id ] ) ) {
						$value = $value[ $keyvalue_id ];
					}
				}
				$file[ $key ] = $value;
			}
		}
		$tmp_name = $file['tmp_name'];

		if ( '' === $tmp_name ) {
			return false;
		}

		if ( is_array( $file ) && ! empty( $tmp_name ) && isset( $this->upload_object[ $tmp_name ] ) ) {
			$this->upload_object[ $tmp_name ]['tc'] = true;

			return $this->upload_object[ $tmp_name ];
		}
		if ( ! defined( 'ALLOW_UNFILTERED_UPLOADS' ) ) {
			define( 'ALLOW_UNFILTERED_UPLOADS', true );
		}
		include_once ABSPATH . 'wp-admin/includes/file.php';
		include_once ABSPATH . 'wp-admin/includes/media.php';
		add_filter( 'upload_dir', [ $this, 'upload_dir_trick' ] );
		add_filter( 'upload_mimes', [ $this, 'upload_mimes_trick' ] );
		$upload = wp_handle_upload(
			$file,
			[
				'test_form' => false,
				'test_type' => false,
			]
		);
		remove_filter( 'upload_dir', [ $this, 'upload_dir_trick' ] );
		remove_filter( 'upload_mimes', [ $this, 'upload_mimes_trick' ] );

		if ( is_array( $file ) && ! empty( $tmp_name ) ) {
			$this->upload_object[ $tmp_name ] = $upload;
		}

		return $upload;
	}

	/**
	 * Alter allowed file mime and type
	 *
	 * @return mixed|void
	 */
	public function get_allowed_mimes() {
		$mimes = [];

		$tm_epo_custom_file_types  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_custom_file_types' );
		$tm_epo_allowed_file_types = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_allowed_file_types' );

		$tm_epo_custom_file_types = explode( ',', $tm_epo_custom_file_types );
		if ( ! is_array( $tm_epo_custom_file_types ) ) {
			$tm_epo_custom_file_types = [];
		}
		if ( ! is_array( $tm_epo_allowed_file_types ) ) {
			$tm_epo_allowed_file_types = [ '@' ];
		}
		$tm_epo_allowed_file_types = array_merge( $tm_epo_allowed_file_types, $tm_epo_custom_file_types );
		$tm_epo_allowed_file_types = array_unique( $tm_epo_allowed_file_types );

		$wp_get_ext_types  = wp_get_ext_types();
		$wp_get_mime_types = wp_get_mime_types();

		foreach ( $tm_epo_allowed_file_types as $key => $value ) {
			if ( ! $value ) {
				continue;
			}
			if ( '@' === $value ) {
				$mimes = $wp_get_mime_types;
			} else {
				$value = ltrim( $value, '@' );
				switch ( $value ) {
					case 'image':
					case 'audio':
					case 'video':
					case 'document':
					case 'spreadsheet':
					case 'interactive':
					case 'text':
					case 'archive':
					case 'code':
						if ( isset( $wp_get_ext_types[ $value ] ) && is_array( $wp_get_ext_types[ $value ] ) ) { // @phpstan-ignore-line
							foreach ( $wp_get_ext_types[ $value ] as $k => $extension ) {
								$type = false;
								foreach ( $wp_get_mime_types as $exts => $_mime ) {
									if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
										$type = $_mime;
										break;
									}
								}
								if ( $type ) {
									$mimes[ $extension ] = $type;
								}
							}
						}
						break;

					default:
						$type = false;
						foreach ( $wp_get_mime_types as $exts => $_mime ) {
							if ( preg_match( '!^(' . $exts . ')$!i', $value ) ) {
								$type = $_mime;
								break;
							}
						}
						if ( $type ) {
							$mimes[ $value ] = $type;
						} else {
							$mimes[ $value ] = 'application/octet-stream';
						}
						break;
				}
			}
		}

		$allowed_mimes = [];
		foreach ( $mimes as $key => $value ) {
			$value = explode( '|', $key );

			foreach ( $value as $k => $v ) {
				$v               = str_replace( '.', '', trim( $v ) );
				$v               = '.' . $v;
				$allowed_mimes[] = $v;
			}
		}

		return apply_filters( 'wc_epo_get_allowed_mimes', $allowed_mimes );
	}

	/**
	 * Alter allowed file mime and type
	 *
	 * @param array<mixed> $existing_mimes The existing mimes array.
	 *
	 * @return mixed|void
	 */
	public function upload_mimes_trick( $existing_mimes = [] ) {
		$mimes = [];

		$tm_epo_custom_file_types  = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_custom_file_types' );
		$tm_epo_allowed_file_types = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_allowed_file_types' );

		$tm_epo_custom_file_types = explode( ',', $tm_epo_custom_file_types );
		if ( ! is_array( $tm_epo_custom_file_types ) ) {
			$tm_epo_custom_file_types = [];
		}
		if ( ! is_array( $tm_epo_allowed_file_types ) ) {
			$tm_epo_allowed_file_types = [ '@' ];
		}
		$tm_epo_allowed_file_types = array_merge( $tm_epo_allowed_file_types, $tm_epo_custom_file_types );
		$tm_epo_allowed_file_types = array_unique( $tm_epo_allowed_file_types );

		$wp_get_ext_types  = wp_get_ext_types();
		$wp_get_mime_types = wp_get_mime_types();

		foreach ( $tm_epo_allowed_file_types as $key => $value ) {
			if ( ! $value ) {
				continue;
			}
			if ( '@' === $value ) {
				$mimes = $existing_mimes;
			} else {
				$value = ltrim( $value, '@' );
				switch ( $value ) {
					case 'image':
					case 'audio':
					case 'video':
					case 'document':
					case 'spreadsheet':
					case 'interactive':
					case 'text':
					case 'archive':
					case 'code':
						if ( isset( $wp_get_ext_types[ $value ] ) && is_array( $wp_get_ext_types[ $value ] ) ) { // @phpstan-ignore-line
							foreach ( $wp_get_ext_types[ $value ] as $k => $extension ) {
								$type = false;
								foreach ( $wp_get_mime_types as $exts => $_mime ) {
									if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
										$type = $_mime;
										break;
									}
								}
								if ( $type ) {
									$mimes[ $extension ] = $type;
								}
							}
						}
						break;

					default:
						$type = false;
						foreach ( $wp_get_mime_types as $exts => $_mime ) {
							if ( preg_match( '!^(' . $exts . ')$!i', $value ) ) {
								$type = $_mime;
								break;
							}
						}
						if ( $type ) {
							$mimes[ $value ] = $type;
						} else {
							$mimes[ $value ] = 'application/octet-stream';
						}
						break;
				}
			}
		}

		return apply_filters( 'wc_epo_upload_mimes', $mimes );
	}

	/**
	 * Alter upload directory
	 *
	 * @param array<mixed> $param Array of information about the uplaod directory.
	 *
	 * @return mixed
	 */
	public function upload_dir_trick( $param ) {
		global $woocommerce;
		$unique_dir = apply_filters( 'wc_epo_upload_unique_dir', md5( $woocommerce->session->get_customer_id() ) );
		$subdir     = $this->upload_dir . $unique_dir;
		if ( empty( $param['subdir'] ) ) {
			$param['path']   = $param['path'] . $subdir;
			$param['url']    = $param['url'] . $subdir;
			$param['subdir'] = $subdir;
		} else {
			$param['path']   = str_replace( $param['subdir'], $subdir, $param['path'] );
			$param['url']    = str_replace( $param['subdir'], $subdir, $param['url'] );
			$param['subdir'] = str_replace( $param['subdir'], $subdir, $param['subdir'] );
		}

		return $param;
	}

	/**
	 * Apply custom filter
	 *
	 * @param mixed  $value The value to apply the filter.
	 * @param string $filter The filter to apply.
	 * @param string $element The Element name.
	 * @param string $element_uniqueid The Element unique ID.
	 *
	 * @return mixed|string|void
	 */
	private function tm_apply_filter( $value = '', $filter = '', $element = '', $element_uniqueid = '' ) {
		// Normalize posted strings.
		$value = THEMECOMPLETE_EPO_HELPER()->normalize_data( $value );

		if ( ! empty( $filter ) ) {
			$value = apply_filters( $filter, $value, $element, $element_uniqueid );
		}

		return apply_filters( 'wc_epo_setting', apply_filters( 'tm_translate', $value ), $element, $element_uniqueid );
	}

	/**
	 * Get builder element
	 *
	 * @param string        $element The Element name.
	 * @param array<mixed>  $builder The builder array.
	 * @param array<mixed>  $current_builder The current builder array.
	 * @param integer|false $index The element index in the builder array.
	 * @param mixed         $alt Alternative value.
	 * @param string        $identifier Identifier 'sections' or the current element.
	 * @param string        $apply_filters Filter name to apply to the returned value.
	 * @param string        $element_uniqueid The Element unique ID.
	 *
	 * @return mixed|string|void
	 */
	public function get_builder_element( $element, $builder, $current_builder, $index = false, $alt = '', $identifier = 'sections', $apply_filters = '', $element_uniqueid = '' ) {
		$original_index = $index;

		list( $use_original_builder, $index ) = apply_filters( 'wc_epo_use_original_builder', [ true, $index ], $element, $builder, $current_builder, $identifier );

		if ( isset( $builder[ $element ] ) ) {
			if ( ! $use_original_builder ) {
				if ( false !== $index ) {
					if ( isset( $current_builder[ $element ][ $index ] ) ) {
						if ( is_object( $current_builder[ $element ][ $index ] ) ) {
							$current_builder[ $element ][ $index ] = wp_json_encode( $current_builder[ $element ][ $index ] );
						}
						if ( is_object( $builder[ $element ][ $original_index ] ) ) {
							$builder[ $element ][ $original_index ] = wp_json_encode( $builder[ $element ][ $original_index ] );
						}
						return $this->tm_apply_filter( THEMECOMPLETE_EPO_HELPER()->build_array( $current_builder[ $element ][ $index ], $builder[ $element ][ $original_index ] ), $apply_filters, $element, $element_uniqueid );
					} else {
						return $this->tm_apply_filter( $alt, $apply_filters, $element, $element_uniqueid );
					}
				} else {
					if ( is_object( $current_builder[ $element ] ) ) {
						$current_builder[ $element ] = wp_json_encode( $current_builder[ $element ] );
					}
					if ( is_object( $builder[ $element ][ $original_index ] ) ) {
						$builder[ $element ] = wp_json_encode( $builder[ $element ] );
					}
					return $this->tm_apply_filter( THEMECOMPLETE_EPO_HELPER()->build_array( $current_builder[ $element ], $builder[ $element ] ), $apply_filters, $element, $element_uniqueid );
				}
			}
			if ( false !== $index ) {
				if ( isset( $builder[ $element ][ $index ] ) ) {
					if ( is_object( $builder[ $element ][ $index ] ) ) {
						$builder[ $element ][ $index ] = wp_json_encode( $builder[ $element ][ $index ] );
					}
					return $this->tm_apply_filter( $builder[ $element ][ $index ], $apply_filters, $element, $element_uniqueid );
				} else {
					return $this->tm_apply_filter( $alt, $apply_filters, $element, $element_uniqueid );
				}
			} else {
				if ( is_object( $builder[ $element ][ $original_index ] ) ) {
					$builder[ $element ] = wp_json_encode( $builder[ $element ] );
				}
				return $this->tm_apply_filter( $builder[ $element ], $apply_filters, $element, $element_uniqueid );
			}
		} else {
			return $this->tm_apply_filter( $alt, $apply_filters, $element, $element_uniqueid );
		}
	}

	/**
	 * Gets a list of all the Extra Product Options (normal and global)
	 * for the specific $post_id.
	 *
	 * @param integer $post_id The product id.
	 * @param string  $form_prefix The form prefix.
	 * @param boolean $no_cache If we should use cached results.
	 * @param boolean $no_disabled If disabled elements should be skipped.
	 * @return array<mixed>
	 * @since 1.0
	 */
	public function get_product_tm_epos( $post_id = 0, $form_prefix = '', $no_cache = false, $no_disabled = false ) {
		if ( empty( $post_id ) || apply_filters( 'wc_epo_disable', false, $post_id ) || ! $this->check_enable() ) {
			return [];
		}

		$post_type = get_post_type( $post_id );

		// Support for variable products in product element.
		if ( ! in_array( $post_type, [ 'product', 'product_variation' ], true ) ) {
			return [];
		}

		$product = wc_get_product( $post_id );
		if ( ! $product instanceof WC_Product ) {
			return [];
		}

		$product_type = themecomplete_get_product_type( $product );

		// Yith gift cards are not supported.
		if ( 'gift-card' === $product_type ) {
			return [];
		}

		// disable cache for associated products
		// as they may have discounts which will not
		// show up on the product page if the product
		// is already in the cart.
		if ( ! $this->is_inline_epo && isset( $this->cpf[ $post_id ][ "{$no_disabled}" ][ "f{$form_prefix}" ] ) ) {
			return $this->cpf[ $post_id ][ "{$no_disabled}" ][ "f{$form_prefix}" ];
		}

		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_enable_validation' ) ) {
			$this->current_option_features[] = 'validation';
		}

		if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' ) ) {
			$this->current_option_features[] = 'lazyload';
		}

		$this->set_tm_meta( $post_id );

		$in_cat = [];
		$in_tax = [];

		$tmglobalprices                   = [];
		$variations_for_conditional_logic = [];

		$terms = get_the_terms( $post_id, 'product_cat' );
		if ( is_array( $terms ) ) {
			foreach ( $terms as $term ) {
				$in_cat[] = $term->term_id;
			}
		}

		$custom_product_taxonomies = get_object_taxonomies( 'product' );
		if ( is_array( $custom_product_taxonomies ) && count( $custom_product_taxonomies ) > 0 ) {
			foreach ( $custom_product_taxonomies as $tax ) {
				if ( 'product_cat' === $tax || 'translation_priority' === $tax ) {
					continue;
				}
				$terms = get_the_terms( $post_id, $tax );
				if ( is_array( $terms ) ) {
					$in_tax[ $tax ] = [];
					foreach ( $terms as $term ) {
						$in_tax[ $tax ][] = $term->slug;
					}
				}
			}
		}

		// Get Normal (Local) options.
		$args = [
			'post_type'        => THEMECOMPLETE_EPO_LOCAL_POST_TYPE,
			'post_status'      => [ 'publish' ], // get only enabled extra options.
			'numberposts'      => -1,
			'orderby'          => 'menu_order',
			'order'            => 'asc',
			'suppress_filters' => true,
			'post_parent'      => absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) ),
		];
		THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
		$tmlocalprices = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
		THEMECOMPLETE_EPO_WPML()->restore_sql_filter();

		$tm_meta_cpf_global_forms = ( isset( $this->tm_meta_cpf['global_forms'] ) && is_array( $this->tm_meta_cpf['global_forms'] ) ) ? $this->tm_meta_cpf['global_forms'] : [];
		foreach ( $tm_meta_cpf_global_forms as $key => $value ) {
			$tm_meta_cpf_global_forms[ $key ] = absint( $value );
		}
		$tm_meta_cpf_global_forms_added = [];

		$post_original_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) );

		if ( ! $this->tm_meta_cpf['exclude'] ) {

			/**
			 * Procedure to get global forms
			 * that apply to all products or
			 * specific product categories.
			 */
			$meta_array_mode_custom = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', 'tm_meta_apply_mode', 'customize-selection', '==', 'EXISTS' );
			$meta_array_mode_all    = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', 'tm_meta_apply_mode', 'apply-to-all-products', '==', 'EXISTS' );

			$meta_array  = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'OR', 'tm_meta_disable_categories', '1', '!=', 'NOT EXISTS' );
			$meta_array2 = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'OR', 'tm_meta_product_exclude_ids', $post_id, 'NOT LIKE', 'NOT EXISTS', true );

			$meta_query_args = [
				'relation' => 'AND',
				$meta_array,
				[
					'key'     => 'tm_meta_apply_mode',
					'compare' => 'NOT EXISTS',
				],
				$meta_array2,
			];

			$args = [
				'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
				'post_status' => [ 'publish' ], // get only enabled global extra options.
				'numberposts' => -1,
				'orderby'     => 'date',
				'order'       => 'asc',
				'meta_query'  => $meta_query_args, // phpcs:ignore WordPress.DB.SlowDBQuery
			];

			// phpcs:ignore WordPress.DB.SlowDBQuery
			$args['tax_query'] = [
				'relation' => 'OR',
				// Get Global options that belong to the product categories.
				[
					'taxonomy'         => 'product_cat',
					'field'            => 'term_id',
					'terms'            => $in_cat,
					'operator'         => 'IN',
					'include_children' => false,
				],
				// Get Global options that have no catergory set (they apply to all products).
				[
					'taxonomy' => 'product_cat',
					'operator' => 'NOT EXISTS',
				],
			];

			THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
			THEMECOMPLETE_EPO_WPML()->remove_term_filters();

			// Get global forms that use the old format.
			$tmp_tmglobalprices = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

			// Get global forms (new format) that are applied to all products.
			$meta_query_args    = [
				'relation' => 'AND',
				$meta_array_mode_all,
				$meta_array2,
			];
			$args['meta_query'] = $meta_query_args; // phpcs:ignore WordPress.DB.SlowDBQuery

			$tmp_tmglobalprices_all = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
			$tmp_tmglobalprices     = array_merge( $tmp_tmglobalprices, $tmp_tmglobalprices_all );
			$tmp_tmglobalprices     = array_unique( $tmp_tmglobalprices, SORT_REGULAR );

			// Get global forms (new format) that are custom applied.
			$meta_query_args    = [
				'relation' => 'AND',
				$meta_array_mode_custom,
				$meta_array2,
			];
			$args['meta_query'] = $meta_query_args; // phpcs:ignore WordPress.DB.SlowDBQuery

			// phpcs:ignore WordPress.DB.SlowDBQuery
			$args['tax_query'] = [
				'relation' => 'OR',
				// Get Global options that belong to the product categories.
				[
					'taxonomy'         => 'product_cat',
					'field'            => 'term_id',
					'terms'            => $in_cat,
					'operator'         => 'IN',
					'include_children' => false,
				],
			];

			$tmp_tmglobalprices_custom = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
			$tmp_tmglobalprices        = array_merge( $tmp_tmglobalprices, $tmp_tmglobalprices_custom );
			$tmp_tmglobalprices        = array_unique( $tmp_tmglobalprices, SORT_REGULAR );

			foreach ( $in_tax as $tax => $tax_temrs ) {
				$args_tax = $args;
				// phpcs:ignore WordPress.DB.SlowDBQuery
				$args_tax['tax_query']  = [
					// Get Global options that belong to the product tag.
					[
						'taxonomy'         => $tax,
						'field'            => 'slug',
						'terms'            => $tax_temrs,
						'operator'         => 'IN',
						'include_children' => false,
					],
				];
				$tmp_tmglobalprices_tax = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args_tax );
				$tmp_tmglobalprices     = array_merge( $tmp_tmglobalprices, $tmp_tmglobalprices_tax );
				$tmp_tmglobalprices     = array_unique( $tmp_tmglobalprices, SORT_REGULAR );
			}

			THEMECOMPLETE_EPO_WPML()->restore_term_filters();
			THEMECOMPLETE_EPO_WPML()->restore_sql_filter();

			if ( $tmp_tmglobalprices ) {
				$wpml_tmp_tmglobalprices       = [];
				$wpml_tmp_tmglobalprices_added = [];
				foreach ( $tmp_tmglobalprices as $price ) {

					if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
						$price_meta_lang                 = themecomplete_get_post_meta( $price->ID, THEMECOMPLETE_EPO_WPML_LANG_META, true );
						$original_product_id             = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $price->ID, $price->post_type ) );
						$double_check_disable_categories = themecomplete_get_post_meta( $original_product_id, 'tm_meta_disable_categories', true );
						$double_check_apply_mode         = themecomplete_get_post_meta( $original_product_id, 'tm_meta_apply_mode', true );
						if ( $double_check_apply_mode ) {
							$double_check_disable_categories = 'disable-form' === $double_check_apply_mode;
						}
						THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
						THEMECOMPLETE_EPO_WPML()->remove_term_filters();

						$double_check_terms = false;
						foreach ( $in_tax as $tax => $tax_temrs ) {
							$double_check_terms = get_terms(
								[
									'taxonomy'   => $tax,
									'object_ids' => $price->ID,
								]
							);

							if ( $double_check_terms ) {
								break;
							}
						}

						THEMECOMPLETE_EPO_WPML()->restore_term_filters();
						THEMECOMPLETE_EPO_WPML()->restore_sql_filter();
						if ( ! $double_check_disable_categories || $double_check_terms ) {

							if ( THEMECOMPLETE_EPO_WPML()->get_lang() === $price_meta_lang
								|| ( '' === $price_meta_lang && THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() )
							) {
								$tmglobalprices[]                 = $price;
								$tm_meta_cpf_global_forms_added[] = $price->ID;
								if ( THEMECOMPLETE_EPO_WPML()->get_default_lang() !== $price_meta_lang && '' !== $price_meta_lang ) {
									$wpml_tmp_tmglobalprices_added[ $original_product_id ] = $price;
								}
							} elseif ( THEMECOMPLETE_EPO_WPML()->get_default_lang() === $price_meta_lang || '' === $price_meta_lang ) {
								$wpml_tmp_tmglobalprices[ $original_product_id ] = $price;
							}
						}
					} else {
						$tmglobalprices[]                 = $price;
						$tm_meta_cpf_global_forms_added[] = $price->ID;
					}
				}
				// Replace missing translation with original.
				if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
					$wpml_gp_keys = array_keys( $wpml_tmp_tmglobalprices );
					foreach ( $wpml_gp_keys as $key => $value ) {
						if ( ! isset( $wpml_tmp_tmglobalprices_added[ $value ] ) ) {
							$price                            = $wpml_tmp_tmglobalprices[ $value ];
							$tmglobalprices[]                 = $price;
							$tm_meta_cpf_global_forms_added[] = $price->ID;
						}
					}
				}
			}

			$original_post_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id, 'product' ) );

			/**
			 * Get Global options that apply to the product
			 */
			$args = [
				'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
				'post_status' => [ 'publish' ], // get only enabled global extra options.
				'numberposts' => -1,
				'orderby'     => 'date',
				'order'       => 'asc',
				// phpcs:ignore WordPress.DB.SlowDBQuery
				'meta_query'  => [
					'relation' => 'OR',
					[
						'key'     => 'tm_meta_product_ids',
						'value'   => ':"' . $original_post_id . '";',
						'compare' => 'LIKE',

					],
					[
						'key'     => 'tm_meta_product_ids',
						'value'   => ':' . $original_post_id . ';',
						'compare' => 'LIKE',

					],
				],
			];

			$available_variations = apply_filters( 'wc_epo_global_forms_available_variations', $product->get_children(), $product );
			$glue                 = [];

			if ( is_array( $available_variations ) ) {
				foreach ( $available_variations as $variation_id ) {
					$variations_for_conditional_logic[] = $variation_id;
					$glue[]                             = [
						'key'     => 'tm_meta_product_ids',
						'value'   => ':"' . $variation_id . '";',
						'compare' => 'LIKE',
					];
					$glue[]                             = [
						'key'     => 'tm_meta_product_ids',
						'value'   => ':' . $variation_id . ';',
						'compare' => 'LIKE',
					];
				}
				if ( $glue ) {
					$args['meta_query'] = array_merge( $args['meta_query'], $glue ); // phpcs:ignore WordPress.DB.SlowDBQuery
				}
			}

			$tmglobalprices_products = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

			if ( $tmglobalprices_products ) {

				$global_id_array = [];
				foreach ( $tmglobalprices as $price ) {
					$global_id_array[] = $price->ID;
				}

				$wpml_tmglobalprices_products       = [];
				$wpml_tmglobalprices_products_added = [];
				foreach ( $tmglobalprices_products as $price ) {
					if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
						$price_meta_lang     = themecomplete_get_post_meta( $price->ID, THEMECOMPLETE_EPO_WPML_LANG_META, true );
						$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $price->ID, $price->post_type ) );

						if ( THEMECOMPLETE_EPO_WPML()->get_lang() === $price_meta_lang
							|| ( '' === $price_meta_lang && THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() )
						) {
							if ( ! in_array( $price->ID, $global_id_array, true ) ) {
								$global_id_array[]                = $price->ID;
								$tmglobalprices[]                 = $price;
								$tm_meta_cpf_global_forms_added[] = $price->ID;
								if ( THEMECOMPLETE_EPO_WPML()->get_default_lang() !== $price_meta_lang && '' !== $price_meta_lang ) {
									$wpml_tmglobalprices_products_added[ $original_product_id ] = $price;
								}
							}
						} elseif ( THEMECOMPLETE_EPO_WPML()->get_default_lang() === $price_meta_lang || '' === $price_meta_lang ) {
							$wpml_tmglobalprices_products[ $original_product_id ] = $price;
						}
					} elseif ( ! in_array( $price->ID, $global_id_array, true ) ) {
						$global_id_array[]                = $price->ID;
						$tmglobalprices[]                 = $price;
						$tm_meta_cpf_global_forms_added[] = $price->ID;
					}
				}
				// Replace missing translation with original.
				if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
					$wpml_gp_keys = array_keys( $wpml_tmglobalprices_products );
					foreach ( $wpml_gp_keys as $key => $value ) {
						if ( ! isset( $wpml_tmglobalprices_products_added[ $value ] ) ) {
							$price = $wpml_tmglobalprices_products[ $value ];
							if ( ! in_array( $price->ID, $global_id_array, true ) ) {
								$global_id_array[]                = $price->ID;
								$tmglobalprices[]                 = $price;
								$tm_meta_cpf_global_forms_added[] = $price->ID;
							}
						}
					}
				}
			}

			/**
			 * Get Global options that apply to the product
			 * only for translated products
			 */
			if ( floatval( $post_id ) !== $post_original_id ) {
				// Get Global options that apply to the product.
				$args = [
					'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
					'post_status' => [ 'publish' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'date',
					'order'       => 'asc',
					// phpcs:ignore WordPress.DB.SlowDBQuery
					'meta_query'  => [
						'relation' => 'OR',
						[
							'key'     => 'tm_meta_product_ids',
							'value'   => ':"' . $post_original_id . '";',
							'compare' => 'LIKE',

						],
						[
							'key'     => 'tm_meta_product_ids',
							'value'   => ':' . $post_original_id . ';',
							'compare' => 'LIKE',

						],
					],

				];

				THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
				THEMECOMPLETE_EPO_WPML()->remove_term_filters();
				$tmglobalprices_products = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );
				THEMECOMPLETE_EPO_WPML()->restore_term_filters();
				THEMECOMPLETE_EPO_WPML()->restore_sql_filter();

				if ( $tmglobalprices_products ) {

					$global_id_array = [];
					foreach ( $tmglobalprices as $price ) {
						$global_id_array[] = $price->ID;
					}

					$wpml_tmglobalprices_products       = [];
					$wpml_tmglobalprices_products_added = [];
					foreach ( $tmglobalprices_products as $price ) {

						if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
							$price_meta_lang     = themecomplete_get_post_meta( $price->ID, THEMECOMPLETE_EPO_WPML_LANG_META, true );
							$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $price->ID, $price->post_type ) );

							if ( THEMECOMPLETE_EPO_WPML()->get_lang() === $price_meta_lang
								|| ( '' === $price_meta_lang && THEMECOMPLETE_EPO_WPML()->get_lang() === THEMECOMPLETE_EPO_WPML()->get_default_lang() )
							) {
								if ( ! in_array( $price->ID, $global_id_array, true ) ) {
									$global_id_array[]                = $price->ID;
									$tmglobalprices[]                 = $price;
									$tm_meta_cpf_global_forms_added[] = $price->ID;
									if ( THEMECOMPLETE_EPO_WPML()->get_default_lang() !== $price_meta_lang && '' !== $price_meta_lang ) {
										$wpml_tmglobalprices_products_added[ $original_product_id ] = $price;
									}
								}
							} elseif ( THEMECOMPLETE_EPO_WPML()->get_default_lang() === $price_meta_lang || '' === $price_meta_lang ) {
								$wpml_tmglobalprices_products[ $original_product_id ] = $price;
							}
						} elseif ( ! in_array( $price->ID, $global_id_array, true ) ) {
							$global_id_array[]                = $price->ID;
							$tmglobalprices[]                 = $price;
							$tm_meta_cpf_global_forms_added[] = $price->ID;
						}
					}
					// Replace missing translation with original.
					if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
						$wpml_gp_keys = array_keys( $wpml_tmglobalprices_products );
						foreach ( $wpml_gp_keys as $key => $value ) {
							if ( ! isset( $wpml_tmglobalprices_products_added[ $value ] ) ) {
								$price = $wpml_tmglobalprices_products[ $value ];
								if ( ! in_array( $price->ID, $global_id_array, true ) ) {
									$query = new WP_Query(
										[
											'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
											'post_status' => [ 'publish' ],
											'numberposts' => -1,
											'posts_per_page' => -1,
											'orderby'     => 'date',
											'order'       => 'asc',
											'no_found_rows' => true,
											// phpcs:ignore WordPress.DB.SlowDBQuery
											'meta_query'  => [
												'relation' => 'AND',
												[
													'key' => THEMECOMPLETE_EPO_WPML_LANG_META,
													'value' => THEMECOMPLETE_EPO_WPML()->get_default_lang(),
													'compare' => '!=',
												],
												[
													'key' => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
													'value' => $price->ID,
													'compare' => '=',
												],
											],
										]
									);
									if ( ! empty( $query->posts ) ) {
										foreach ( $query->posts as $qpost ) {
											if ( ! $qpost instanceof WP_Post ) {
												continue;
											}
											$qmetalang = themecomplete_get_post_meta( $qpost->ID, THEMECOMPLETE_EPO_WPML_LANG_META, true );
											if ( THEMECOMPLETE_EPO_WPML()->get_lang() !== $qmetalang ) {
												continue;
											}
											if ( ! in_array( $qpost->ID, $global_id_array, true ) ) {
												$global_id_array[]                = $qpost->ID;
												$tmglobalprices[]                 = $qpost;
												$tm_meta_cpf_global_forms_added[] = $qpost->ID;
											}
											break;
										}
									} else {
										$global_id_array[]                = $price->ID;
										$tmglobalprices[]                 = $price;
										$tm_meta_cpf_global_forms_added[] = $price->ID;
									}
								}
							}
						}
					}
				}
			}

			/**
			 * Support for conditional logic based on variations
			 * on translated products
			 */
			if ( floatval( $post_id ) !== $post_original_id ) {
				// Get Global options that apply to the product.
				$args = [
					'post_type'   => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
					'post_status' => [ 'publish' ], // get only enabled global extra options.
					'numberposts' => -1,
					'orderby'     => 'date',
					'order'       => 'asc',
					// phpcs:ignore WordPress.DB.SlowDBQuery
					'meta_query'  => [
						'relation' => 'OR',
						[
							'key'     => 'tm_meta_product_ids',
							'value'   => ':"' . $post_original_id . '";',
							'compare' => 'LIKE',
						],
						[
							'key'     => 'tm_meta_product_ids',
							'value'   => ':' . $post_original_id . ';',
							'compare' => 'LIKE',
						],
					],
				];

				$original_product     = wc_get_product( $post_original_id );
				$available_variations = [];
				if ( $original_product instanceof WC_Product ) {
					$available_variations = apply_filters( 'wc_epo_global_forms_available_variations', $original_product->get_children() );
				}
				$glue = [];

				if ( is_array( $available_variations ) ) {
					foreach ( $available_variations as $variation_id ) {
						$variations_for_conditional_logic[] = $variation_id;
						$glue[]                             = [
							'key'     => 'tm_meta_product_ids',
							'value'   => ':"' . absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $variation_id ) ) . '";',
							'compare' => 'LIKE',
						];
						$glue[]                             = [
							'key'     => 'tm_meta_product_ids',
							'value'   => ':' . absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $variation_id ) ) . ';',
							'compare' => 'LIKE',
						];
					}

					if ( $glue ) {
						$args['meta_query']['relation'] = 'OR'; // phpcs:ignore WordPress.DB.SlowDBQuery
						$args['meta_query']             = array_merge( $args['meta_query'], $glue ); // phpcs:ignore WordPress.DB.SlowDBQuery

						$tmglobalprices_products = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

						// Merge Global options.
						if ( $tmglobalprices_products ) {
							$global_id_array = [];
							foreach ( $tmglobalprices as $price ) {
								$global_id_array[] = $price->ID;
							}
							foreach ( $tmglobalprices_products as $price ) {
								if ( ! in_array( $price->ID, $global_id_array, true ) ) {
									$tmglobalprices[]                 = $price;
									$tm_meta_cpf_global_forms_added[] = $price->ID;
								}
							}
						}
					}
				}
			}
		}

		$tm_meta_cpf_global_forms_added = array_unique( $tm_meta_cpf_global_forms_added );

		$tm_meta_cpf_global_forms = apply_filters( 'wc_epo_additional_global_forms', $tm_meta_cpf_global_forms, $post_id, $form_prefix, $this );
		$tm_meta_cpf_global_forms = array_unique( $tm_meta_cpf_global_forms );

		foreach ( $tm_meta_cpf_global_forms as $key => $value ) {
			if ( ! in_array( $value, $tm_meta_cpf_global_forms_added, true ) ) {
				if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {

					$tm_meta_lang = themecomplete_get_post_meta( $value, THEMECOMPLETE_EPO_WPML_LANG_META, true );
					if ( empty( $tm_meta_lang ) ) {
						$tm_meta_lang = THEMECOMPLETE_EPO_WPML()->get_default_lang();
					}
					$meta_query   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, THEMECOMPLETE_EPO_WPML()->get_lang(), '=', 'EXISTS' );
					$meta_query[] = [
						'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
						'value'   => $value,
						'compare' => '=',
					];

					$query = new WP_Query(
						[
							'post_type'      => THEMECOMPLETE_EPO_GLOBAL_POST_TYPE,
							'post_status'    => [ 'publish' ],
							'numberposts'    => -1,
							'posts_per_page' => -1,
							'orderby'        => 'date',
							'order'          => 'asc',
							'no_found_rows'  => true,
							'meta_query'     => $meta_query, // phpcs:ignore WordPress.DB.SlowDBQuery
						]
					);

					if ( ! empty( $query->posts ) ) {
						if ( $query->post_count > 1 ) {

							foreach ( $query->posts as $current_post ) {
								if ( $current_post instanceof WP_Post ) {
									$metalang = themecomplete_get_post_meta( $current_post->ID, THEMECOMPLETE_EPO_WPML_LANG_META, true );

									if ( THEMECOMPLETE_EPO_WPML()->get_lang() === $metalang ) {
										$tmglobalprices[] = get_post( $current_post->ID );
										break;
									}
								}
							}
						} else {
							$tmglobalprices[] = get_post( $query->post->ID );
						}
					} elseif ( empty( $query->posts ) ) {
						$tmglobalprices[] = get_post( $value );
					}
				} else {
					$ispostactive = get_post( $value );
					if ( $ispostactive && 'publish' === $ispostactive->post_status ) {
						$tmglobalprices[] = get_post( $value );
					}
				}
			}
		}

		// Add current product to Global options array (has to be last to not conflict).
		$tmglobalprices[] = THEMECOMPLETE_EPO_HELPER()->get_cached_post( $post_id );

		$tmglobalprices = apply_filters( 'wc_epo_global_forms', $tmglobalprices, $post_id, $this, $variations_for_conditional_logic, $no_cache, $no_disabled );

		// End of DB init.

		$epos                        = $this->generate_global_epos( $tmglobalprices, $post_id, $this->tm_original_builder_elements, $variations_for_conditional_logic, $no_cache, $no_disabled );
		$global_epos                 = $epos['global'];
		$raw_epos                    = $epos['raw_epos'];
		$epos_prices                 = $epos['price'];
		$variation_element_id        = $epos['variation_element_id'];
		$variation_section_id        = $epos['variation_section_id'];
		$variations_disabled         = $epos['variations_disabled'];
		$global_product_epos_uniqids = $epos['product_epos_uniqids'];
		$product_epos_choices        = $epos['product_epos_choices'];

		if ( is_array( $global_epos ) ) {
			ksort( $global_epos );
		}

		$product_epos = $this->generate_local_epos( $tmlocalprices, $post_id );

		$global_epos = $this->tm_fill_element_names( $post_id, $global_epos, $product_epos, $form_prefix, 'epo' );

		$epos = [
			'global'               => $global_epos,
			'raw_epos'             => $raw_epos,
			'global_ids'           => $tmglobalprices,
			'local'                => $product_epos['product_epos'],
			'price'                => $epos_prices,
			'variation_element_id' => $variation_element_id,
			'variation_section_id' => $variation_section_id,
			'variations_disabled'  => $variations_disabled,
			'epos_uniqids'         => array_merge( $product_epos['product_epos_uniqids'], $global_product_epos_uniqids ),
			'product_epos_choices' => $product_epos_choices,
		];

		$this->cpf[ $post_id ][ "{$no_disabled}" ][ "f{$form_prefix}" ] = $epos;

		return $epos;
	}

	/**
	 * Generate normal (local) option array
	 *
	 * @param array<mixed> $tmlocalprices Array of posts for normal options.
	 * @param integer      $post_id The product id.
	 *
	 * @return array<mixed>
	 */
	public function generate_local_epos( $tmlocalprices, $post_id ) {
		$product_epos         = [];
		$product_epos_uniqids = [];
		if ( $tmlocalprices ) {
			THEMECOMPLETE_EPO_WPML()->remove_sql_filter();
			$attributes      = themecomplete_get_attributes( absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) ) );
			$wpml_attributes = themecomplete_get_attributes( $post_id );

			foreach ( $tmlocalprices as $price ) {

				$tmcp_id = absint( $price->ID );

				$n = themecomplete_get_post_meta( $tmcp_id, 'tmcp_attribute', true );
				if ( ! isset( $attributes[ $n ] ) ) {
					continue;
				}
				$att = $attributes[ $n ];
				if ( $att['is_variation'] || sanitize_title( $att['name'] ) !== $n ) {
					continue;
				}

				$tmcp_required                           = themecomplete_get_post_meta( $tmcp_id, 'tmcp_required', true );
				$tmcp_hide_price                         = themecomplete_get_post_meta( $tmcp_id, 'tmcp_hide_price', true );
				$tmcp_limit                              = themecomplete_get_post_meta( $tmcp_id, 'tmcp_limit', true );
				$product_epos[ $tmcp_id ]['is_form']     = 0;
				$product_epos[ $tmcp_id ]['required']    = empty( $tmcp_required ) ? 0 : 1;
				$product_epos[ $tmcp_id ]['hide_price']  = empty( $tmcp_hide_price ) ? 0 : 1;
				$product_epos[ $tmcp_id ]['limit']       = empty( $tmcp_limit ) ? '' : $tmcp_limit;
				$product_epos[ $tmcp_id ]['name']        = themecomplete_get_post_meta( $tmcp_id, 'tmcp_attribute', true );
				$product_epos[ $tmcp_id ]['is_taxonomy'] = themecomplete_get_post_meta( $tmcp_id, 'tmcp_attribute_is_taxonomy', true );
				$product_epos[ $tmcp_id ]['label']       = wc_attribute_label( $product_epos[ $tmcp_id ]['name'] );
				$product_epos[ $tmcp_id ]['type']        = themecomplete_get_post_meta( $tmcp_id, 'tmcp_type', true );
				$product_epos_uniqids[]                  = $product_epos[ $tmcp_id ]['name'];

				// Retrieve attributes.
				$product_epos[ $tmcp_id ]['attributes']      = [];
				$product_epos[ $tmcp_id ]['attributes_wpml'] = [];
				if ( $product_epos[ $tmcp_id ]['is_taxonomy'] ) {
					if ( ! ( $attributes[ $product_epos[ $tmcp_id ]['name'] ]['is_variation'] ) ) {
						$orderby = wc_attribute_orderby( $attributes[ $product_epos[ $tmcp_id ]['name'] ]['name'] );
						$args    = [
							'orderby'    => 'name',
							'hide_empty' => false,
						];
						switch ( $orderby ) {
							case 'name':
								$args = [
									'orderby'    => 'name',
									'hide_empty' => false,
									'menu_order' => false,
								];
								break;
							case 'id':
								$args = [
									'orderby'    => 'id',
									'order'      => 'ASC',
									'menu_order' => false,
									'hide_empty' => false,
								];
								break;
							case 'menu_order':
								$args = [
									'menu_order' => 'ASC',
									'hide_empty' => false,
								];
								break;
						}

						$all_terms = THEMECOMPLETE_EPO_WPML()->get_terms( null, $attributes[ $product_epos[ $tmcp_id ]['name'] ]['name'], $args );

						if ( $all_terms ) {
							foreach ( $all_terms as $term ) {
								if ( $term instanceof WP_Term ) {
									$has_term     = has_term( (int) $term->term_id, $attributes[ $product_epos[ $tmcp_id ]['name'] ]['name'], absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) ) ) ? 1 : 0;
									$wpml_term_id = THEMECOMPLETE_EPO_WPML()->is_active() && function_exists( 'icl_object_id' ) ? icl_object_id( $term->term_id, $attributes[ $product_epos[ $tmcp_id ]['name'] ]['name'], false ) : false;
									if ( $has_term ) {
										$product_epos[ $tmcp_id ]['attributes'][ esc_attr( $term->slug ) ] = apply_filters( 'woocommerce_tm_epo_option_name', esc_html( $term->name ), null, null );
										if ( $wpml_term_id ) {
											$wpml_term = get_term( $wpml_term_id, $attributes[ $product_epos[ $tmcp_id ]['name'] ]['name'] );
											if ( $wpml_term instanceof WP_Term ) {
												$product_epos[ $tmcp_id ]['attributes_wpml'][ esc_attr( $term->slug ) ] = apply_filters( 'woocommerce_tm_epo_option_name', esc_html( $wpml_term->name ), null, null );
											}
										} else {
											$product_epos[ $tmcp_id ]['attributes_wpml'][ esc_attr( $term->slug ) ] = $product_epos[ $tmcp_id ]['attributes'][ esc_attr( $term->slug ) ];
										}
									}
								}
							}
						}
					}
				} elseif ( isset( $attributes[ $product_epos[ $tmcp_id ]['name'] ] ) ) {
					$options      = array_map( 'trim', explode( WC_DELIMITER, $attributes[ $product_epos[ $tmcp_id ]['name'] ]['value'] ) );
					$wpml_options = isset( $wpml_attributes[ $product_epos[ $tmcp_id ]['name'] ]['value'] ) ? array_map( 'trim', explode( WC_DELIMITER, $wpml_attributes[ $product_epos[ $tmcp_id ]['name'] ]['value'] ) ) : $options;
					foreach ( $options as $k => $option ) {
						$product_epos[ $tmcp_id ]['attributes'][ esc_attr( sanitize_title( $option ) ) ]      = esc_html( apply_filters( 'woocommerce_tm_epo_option_name', $option, null, null ) );
						$product_epos[ $tmcp_id ]['attributes_wpml'][ esc_attr( sanitize_title( $option ) ) ] = esc_html( apply_filters( 'woocommerce_tm_epo_option_name', isset( $wpml_options[ $k ] ) ? $wpml_options[ $k ] : $option, null, null ) );
					}
				}

				// Retrieve price rules.
				$_regular_price                    = themecomplete_get_post_meta( $tmcp_id, '_regular_price', true );
				$_regular_price_type               = themecomplete_get_post_meta( $tmcp_id, '_regular_price_type', true );
				$product_epos[ $tmcp_id ]['rules'] = $_regular_price;

				$_regular_price_filtered                    = THEMECOMPLETE_EPO_HELPER()->array_map_deep( $_regular_price, $_regular_price_type, [ $this, 'tm_epo_price_filtered' ] );
				$product_epos[ $tmcp_id ]['rules_filtered'] = $_regular_price_filtered;

				$product_epos[ $tmcp_id ]['rules_type'] = $_regular_price_type;
				if ( ! is_array( $_regular_price ) ) {
					$_regular_price = [];
				}
				if ( ! is_array( $_regular_price_type ) ) {
					$_regular_price_type = [];
				}
				foreach ( $_regular_price as $key => $value ) {
					foreach ( $value as $k => $v ) {
						$_regular_price[ $key ][ $k ] = wc_format_localized_price( $v );
					}
				}
				foreach ( $_regular_price_type as $key => $value ) {
					foreach ( $value as $k => $v ) {
						$_regular_price_type[ $key ][ $k ] = $v;
					}
				}
				$product_epos[ $tmcp_id ]['price_rules']          = $_regular_price;
				$product_epos[ $tmcp_id ]['price_rules_filtered'] = $_regular_price_filtered;
				$product_epos[ $tmcp_id ]['price_rules_type']     = $_regular_price_type;
			}
			THEMECOMPLETE_EPO_WPML()->restore_sql_filter();
		}

		return [
			'product_epos'         => $product_epos,
			'product_epos_uniqids' => $product_epos_uniqids,
		];
	}

	/**
	 * Generate global (builder) option array
	 *
	 * @param array<mixed> $tmglobalprices Array of posts (global or directly on the product) that have saved options.
	 * @param integer      $post_id The product id.
	 * @param array<mixed> $tm_original_builder_elements Builder element attributes.
	 * @param array<mixed> $variations_for_conditional_logic The variations used in conditiona logic.
	 * @param boolean      $no_cache If we should use cached results.
	 * @param boolean      $no_disabled If disabled elements should be skipped.
	 * @param boolean      $add_templates_to_builder If the template element should be added to the internal builder array.
	 * @return array<mixed>
	 */
	public function generate_global_epos( $tmglobalprices, $post_id, $tm_original_builder_elements, $variations_for_conditional_logic = [], $no_cache = false, $no_disabled = false, $add_templates_to_builder = true ) {
		$global_epos              = [];
		$product_epos_uniqids     = [];
		$product_epos_choices     = [];
		$epos_prices              = [];
		$extra_section_logic      = [];
		$extra_section_hide_logic = [];
		$raw_epos                 = [];
		$builder_element_order    = [];

		$not_isset_global_post     = false;
		$not_isset_request_post_id = false;
		if ( ! isset( $GLOBALS['post'] ) ) {
			$not_isset_global_post = true;
			$GLOBALS['post']       = get_post( $post_id ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride
			if ( wp_doing_ajax() && ! isset( $_REQUEST['post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$not_isset_request_post_id = true;
				$_REQUEST['post_id']       = $post_id;
			}
		}

		$post_original_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $post_id ) );

		$variation_element_id = false;
		$variation_section_id = false;

		$enable_sales = 'sale' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_options_price_mode' );

		if ( $tmglobalprices ) {

			foreach ( $tmglobalprices as $price ) {
				$templates = [];
				if ( ! $price instanceof WP_Post ) {
					continue;
				}

				$original_product_id = $price->ID;
				$object              = $price;
				if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
					$wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $price->ID, $price->post_type );
					if ( ! $wpml_is_original_product ) {
						$original_product_id = absint( THEMECOMPLETE_EPO_WPML()->get_original_id( $price->ID, $price->post_type ) );
						if ( 'product' === $price->post_type ) {
							$object = wc_get_product( $original_product_id );
						} else {
							$object = get_post( $original_product_id );
						}
					}
				}

				$tmcp_id                     = absint( $original_product_id );
				$tmcp_meta                   = themecomplete_get_post_meta( $object, 'tm_meta', true );
				$enabled_roles               = themecomplete_get_post_meta( $object, 'tm_meta_enabled_roles', true );
				$disabled_roles              = themecomplete_get_post_meta( $object, 'tm_meta_disabled_roles', true );
				$tm_meta_product_ids         = themecomplete_get_post_meta( $object, 'tm_meta_product_ids', true );
				$tm_meta_product_exclude_ids = themecomplete_get_post_meta( $object, 'tm_meta_product_exclude_ids', true );

				if ( ! empty( $enabled_roles ) || ! empty( $disabled_roles ) ) {
					$enable = false;
					if ( ! is_array( $enabled_roles ) ) {
						$enabled_roles = [ $enabled_roles ];
					}
					if ( ! is_array( $disabled_roles ) ) {
						$disabled_roles = [ $disabled_roles ];
					}
					if ( isset( $enabled_roles[0] ) && '' === $enabled_roles[0] ) {
						$enabled_roles = [];
					}

					if ( isset( $disabled_roles[0] ) && '' === $disabled_roles[0] ) {
						$disabled_roles = [];
					}

					if ( empty( $enabled_roles ) && ! empty( $disabled_roles ) ) {
						$enable = true;
					}

					// Get all roles.
					$current_user = wp_get_current_user();

					foreach ( $enabled_roles as $key => $value ) {
						if ( '@everyone' === $value ) {
							$enable = true;
						}
						if ( '@loggedin' === $value && is_user_logged_in() ) {
							$enable = true;
						}
					}

					foreach ( $disabled_roles as $key => $value ) {
						if ( '@everyone' === $value ) {
							$enable = false;
						}
						if ( '@loggedin' === $value && is_user_logged_in() ) {
							$enable = false;
						}
					}

					if ( $current_user instanceof WP_User ) {
						$roles = $current_user->roles;

						if ( is_array( $roles ) ) {

							foreach ( $roles as $key => $value ) {
								if ( in_array( $value, $enabled_roles, true ) ) {
									$enable = true;
									break;
								}
							}

							foreach ( $roles as $key => $value ) {
								if ( in_array( $value, $disabled_roles, true ) ) {
									$enable = false;
									break;
								}
							}
						}
					}

					if ( ! $enable ) {
						continue;
					}
				}

				$current_builder = THEMECOMPLETE_EPO_WPML()->is_active() ? themecomplete_get_post_meta( $price, 'tm_meta_wpml', true ) : [];

				if ( ! $current_builder ) {
					$current_builder = [];
				} else {
					if ( ! isset( $current_builder['tmfbuilder'] ) ) {
						$current_builder['tmfbuilder'] = [];
					}
					$current_builder = $current_builder['tmfbuilder'];
				}

				$priority = isset( $tmcp_meta['priority'] ) ? absint( $tmcp_meta['priority'] ) : 1000;

				// This check is required in case the translated product loads before the original in $tmglobalprices.
				if ( isset( $global_epos[ $priority ][ $tmcp_id ] ) ) {
					if ( THEMECOMPLETE_EPO_WPML()->is_active() ) {
						if ( empty( $global_epos[ $priority ][ $tmcp_id ]['wpml_is_original_product'] ) ) {
							continue;
						}
					}
				}
				if ( THEMECOMPLETE_EPO_WPML()->is_active() && isset( $wpml_is_original_product ) ) {
					$global_epos[ $priority ][ $tmcp_id ]['original_product_id']      = $original_product_id;
					$global_epos[ $priority ][ $tmcp_id ]['wpml_is_original_product'] = $wpml_is_original_product;
				}

				if ( isset( $tmcp_meta['tmfbuilder'] ) ) {

					$global_epos[ $priority ][ $tmcp_id ]['is_form']     = 1;
					$global_epos[ $priority ][ $tmcp_id ]['is_taxonomy'] = 0;
					$global_epos[ $priority ][ $tmcp_id ]['name']        = $price->post_title;
					$global_epos[ $priority ][ $tmcp_id ]['description'] = $price->post_excerpt;
					$global_epos[ $priority ][ $tmcp_id ]['sections']    = [];

					$builder = $tmcp_meta['tmfbuilder'];
					if ( is_array( $builder ) && count( $builder ) > 0 && isset( $builder['element_type'] ) && is_array( $builder['element_type'] ) && count( $builder['element_type'] ) > 0 ) {
						// All the elements.
						$_elements = $builder['element_type'];
						// All element sizes.
						$_div_size = $builder['div_size'];

						// All sections (holds element count for each section).
						$_sections = $builder['sections'];
						// All section sizes.
						$_sections_size = $builder['sections_size'];
						// All section styles.
						$_sections_style = $builder['sections_style'];
						// All section placements.
						$_sections_placement = $builder['sections_placement'];

						$_sections_slides = isset( $builder['sections_slides'] ) ? $builder['sections_slides'] : '';

						if ( ! is_array( $_sections ) ) {
							$_sections = [ count( $_elements ) ];
						}
						if ( ! is_array( $_sections_size ) ) {
							$_sections_size = array_fill( 0, count( $_sections ), 'w100' );
						}
						if ( ! is_array( $_sections_style ) ) {
							$_sections_style = array_fill( 0, count( $_sections ), '' );
						}
						if ( ! is_array( $_sections_placement ) ) {
							$_sections_placement = array_fill( 0, count( $_sections ), 'before' );
						}

						if ( ! is_array( $_sections_slides ) ) {
							$_sections_slides = array_fill( 0, count( $_sections ), '' );
						}

						$_helper_counter = 0;
						$_counter        = [];
						$_sectionscount  = count( $_sections );

						for ( $_s = 0; $_s < $_sectionscount; $_s++ ) {
							$_sections_uniqid = $this->get_builder_element( 'sections_uniqid', $builder, $current_builder, $_s, THEMECOMPLETE_EPO_HELPER()->tm_temp_uniqid( count( $_sections ) ) );
							$_sections[ $_s ] = (int) $_sections[ $_s ];

							$sections_clogic     = $this->get_builder_element( 'sections_clogic', $builder, $current_builder, $_s, false, 'sections', '', $_sections_uniqid );
							$sections_logicrules = $this->get_builder_element( 'sections_logicrules', $builder, $current_builder, $_s, false, 'sections', '', $_sections_uniqid );
							if ( false === $sections_logicrules || 'false' === $sections_logicrules ) {
								$sections_logicrules = $sections_clogic;
							}

							$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ] = [
								'total_elements'           => $_sections[ $_s ],
								'sections_size'            => $_sections_size[ $_s ],
								'sections_slides'          => isset( $_sections_slides[ $_s ] ) ? $_sections_slides[ $_s ] : '',
								'sections_tabs_labels'     => $this->get_builder_element( 'sections_tabs_labels', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_style'           => $_sections_style[ $_s ],
								'sections_placement'       => $_sections_placement[ $_s ],
								'sections_uniqid'          => $_sections_uniqid,
								'sections_logicrules'      => $sections_logicrules,
								'sections_logic'           => $this->get_builder_element( 'sections_logic', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_class'           => $this->get_builder_element( 'sections_class', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_type'            => $this->get_builder_element( 'sections_type', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_popupbutton'     => $this->get_builder_element( 'sections_popupbutton', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_popupbuttontext' => $this->get_builder_element( 'sections_popupbuttontext', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'sections_background_color' => $this->get_builder_element( 'sections_background_color', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'label_background_color'   => $this->get_builder_element( 'sections_label_background_color', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'description_background_color' => $this->get_builder_element( 'sections_subtitle_background_color', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'label_size'               => $this->get_builder_element( 'section_header_size', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'label'                    => $this->get_builder_element( 'section_header_title', $builder, $current_builder, $_s, '', 'sections', 'wc_epo_label', $_sections_uniqid ),
								'label_color'              => $this->get_builder_element( 'section_header_title_color', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'label_position'           => $this->get_builder_element( 'section_header_title_position', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'description'              => $this->get_builder_element( 'section_header_subtitle', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'description_position'     => $this->get_builder_element( 'section_header_subtitle_position', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'description_color'        => $this->get_builder_element( 'section_header_subtitle_color', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
								'divider_type'             => $this->get_builder_element( 'section_divider_type', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid ),
							];

							$this->current_option_features[] = 'section' . $this->get_builder_element( 'sections_type', $builder, $current_builder, $_s, '', 'sections', '', $_sections_uniqid );

							$element_no_in_section      = -1;
							$element_real_no_in_section = -1;
							$section_slides             = $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_slides'];
							if ( '' !== $section_slides && ( 'slider' === $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_type'] || 'tabs' === $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_type'] ) ) {
								$section_slides = explode( ',', $section_slides );

							}
							$section_slides_copy = $section_slides;
							for ( $k0 = $_helper_counter; $k0 < $_helper_counter + $_sections[ $_s ]; $k0++ ) {
								if ( ! isset( $_elements[ $k0 ] ) ) {
									continue;
								}

								++$element_no_in_section;
								$current_element = $_elements[ $k0 ];

								$is_override_element      = false;
								$original_current_element = $current_element;
								if ( ( $this->is_bto || $this->is_associated ) && 'product' === $current_element ) {
									$current_element     = 'header';
									$is_override_element = true;
								}
								$element_object = isset( $tm_original_builder_elements[ $current_element ] ) ? $tm_original_builder_elements[ $current_element ] : false;

								$raw_epos[] = $current_element;

								// Delete logic for variations section - not applicable.
								if ( 'variations' === $current_element ) {
									$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic']      = '';
									$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'] = '';
								}

								if ( $element_object ) {
									if ( ! isset( $_counter[ $original_current_element ] ) ) {
										$_counter[ $original_current_element ] = 0;
									} else {
										++$_counter[ $original_current_element ];
									}
									$current_counter = $_counter[ $original_current_element ];

									if ( $is_override_element ) {
										if ( current_user_can( 'manage_options' ) ) {
											if ( $this->is_bto ) {
												$builder['header_title'][ $current_counter ]         = esc_html__( 'Product element is not supported for components!', 'woocommerce-tm-extra-product-options' );
												$current_builder['header_title'][ $current_counter ] = esc_html__( 'Product element is not supported for components!', 'woocommerce-tm-extra-product-options' );
											}
											if ( $this->is_associated ) {
												$builder['header_title'][ $current_counter ] = esc_html__( 'Product element is not supported within another product element!', 'woocommerce-tm-extra-product-options' );
											}
										}
									}

									$_options                         = [];
									$_options_all                     = []; // even disabled ones - currently used for WPML translation at get_wpml_translation_by_id.
									$_regular_price                   = [];
									$_regular_price_filtered          = [];
									$_original_regular_price_filtered = [];
									$_regular_price_type              = [];
									$_new_type                        = $current_element;
									$_prefix                          = '';
									$_min_price0                      = '';
									$_min_price10                     = '';
									$_min_price                       = '';
									$_max_price                       = '';
									$_regular_currencies              = [];
									$price_per_currencies_original    = [];
									$price_per_currencies             = [];
									$_description                     = false;
									$_extra_multiple_choices          = [];
									$_use_lightbox                    = '';
									$_current_deleted_choices         = [];
									$_is_price_fee                    = '';

									if (
										'dynamic' === $element_object->is_post ||
										( true === $element_object->is_addon && 'display' === $element_object->is_post ) ||
										( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type ) ||
										( 'multiple' === $element_object->type || 'multipleall' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) ||
										'template' === $element_object->type
										) {
										$_prefix = $original_current_element . '_';
									}

									$is_override_element_prefix = $is_override_element ? $original_current_element . '_' : $_prefix;

									$element_uniqueid = $this->get_builder_element( $is_override_element_prefix . 'uniqid', $builder, $current_builder, $current_counter, THEMECOMPLETE_EPO_HELPER()->tm_uniqid(), $original_current_element );

									$logic_prefix = ( 'header' === $original_current_element || 'divider' === $original_current_element ) ? $original_current_element . '_' : $_prefix;
									$clogic       = $this->get_builder_element( $logic_prefix . 'clogic', $builder, $current_builder, $current_counter, false, $current_element, '', $element_uniqueid );
									$logicrules   = $this->get_builder_element( $logic_prefix . 'logicrules', $builder, $current_builder, $current_counter, false, $current_element, '', $element_uniqueid );
									if ( false === $logicrules || 'false' === $logicrules ) {
										$logicrules = $clogic;
									}

									$is_enabled  = $this->get_builder_element( $is_override_element_prefix . 'enabled', $builder, $current_builder, $current_counter, '2', $original_current_element, '', $element_uniqueid );
									$is_required = $this->get_builder_element( $_prefix . 'required', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									// Currently $no_disabled is disabled by default
									// to allow the conditional logic
									// to work correctly when there is a disabled element.
									if ( $no_disabled ) {
										if ( '' === $is_enabled || '0' === $is_enabled ) {

											if ( is_array( $section_slides ) ) {
												$elements_done = 0;
												foreach ( $section_slides as $section_slides_key => $section_slides_value ) {
													$section_slides_value = (int) $section_slides_value;
													$elements_done        = $elements_done + $section_slides_value;
													$previous_done        = $elements_done - $section_slides_value;

													if ( $element_no_in_section >= $previous_done && $element_no_in_section < $elements_done ) {
														$section_slides_copy[ $section_slides_key ]                                 = (string) ( (int) ( $section_slides_copy[ $section_slides_key ] ) - 1 );
														$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_slides'] = implode( ',', $section_slides_copy );
														break;
													}
												}
											}

											continue;
										}
									}

									++$element_real_no_in_section;

									$tm_epo_options_cache = ( ! $no_cache && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_options_cache' ) ) ? true : false;

									if ( isset( $wpml_is_original_product ) && ! empty( $wpml_is_original_product ) && apply_filters( 'wc_epo_use_elements_cache', $tm_epo_options_cache ) && isset( $this->cpf_single[ $element_uniqueid ] ) ) {
										$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][] = $this->cpf_single[ $element_uniqueid ];
										if ( isset( $this->cpf_single_epos_prices[ $element_uniqueid ] ) ) {
											$epos_prices[] = $this->cpf_single_epos_prices[ $element_uniqueid ];
										}
										if ( isset( $this->cpf_single_variation_element_id[ $element_uniqueid ] ) ) {
											$variation_element_id = $this->cpf_single_variation_element_id[ $element_uniqueid ];
										}
										if ( isset( $this->cpf_single_variation_section_id[ $element_uniqueid ] ) ) {
											$variation_section_id = $this->cpf_single_variation_section_id[ $element_uniqueid ];
										}

										continue;
									}

									if ( $is_enabled && 'template' === $current_element ) {
										$templateids = $this->get_builder_element( $_prefix . 'templateids', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										if ( empty( $templateids ) ) {
											continue;
										}
										$templateglobalprices = get_post( $templateids );
										if ( $templateglobalprices ) {
											if ( 'publish' !== $templateglobalprices->post_status ) {
												continue;
											}
										} else {
											continue;
										}
										$templateglobalprices = [ $templateglobalprices ];
										$template_elements    = $this->generate_global_epos( $templateglobalprices, $post_id, $tm_original_builder_elements, $variations_for_conditional_logic, $no_cache, $no_disabled, false );

										// Add template elements
										// Each foreach loop should produce only 1 result!
										if ( isset( $template_elements['global'] ) ) {
											$added_element_uniqid = false;
											foreach ( $template_elements['global'] as $pid_element ) {
												foreach ( $pid_element as $id_element ) {
													foreach ( $id_element['sections'] as $id_sections ) {
														if ( isset( $id_sections['elements'] ) ) {
															foreach ( $id_sections['elements'] as $added_element ) {
																$added_element_uniqid        = $added_element['uniqid'];
																$added_element['size']       = $_div_size[ $k0 ];
																$added_element['enabled']    = $is_enabled; // Always true.
																$added_element['uniqid']     = $element_uniqueid;
																$added_element['logicrules'] = $logicrules;
																$added_element['logic']      = $this->get_builder_element( $_prefix . 'logic', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
																$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][] = $added_element;
																$this->cpf_single[ $element_uniqueid ]                                 = $added_element;
																if ( ! isset( $builder_element_order[ $added_element['type'] ] ) ) {
																	$builder_element_order[ $added_element['type'] ] = 0;
																} else {
																	$builder_element_order[ $added_element['type'] ] = $builder_element_order[ $added_element['type'] ] + 1;
																}
																if ( $add_templates_to_builder && isset( $added_element['builder'] ) ) {
																	$templates[ $builder_element_order[ $added_element['type'] ] ] = $added_element;
																	$template_builder = $added_element['builder'];
																	$placement        = $builder_element_order[ $added_element['type'] ];
																	foreach ( $template_builder as $key => $value ) {
																		if ( str_ends_with( $key, '_subscriptionfee' ) && isset( $builder[ $key ] ) ) {
																			array_splice( $builder[ $key ], $placement, 0, $value );
																		}
																	}
																}
															}
														}
													}
												}
											}
											$product_epos_uniqids[]                    = $element_uniqueid;
											$product_epos_choices[ $element_uniqueid ] = $template_elements['product_epos_choices'];
											// This should always be true!
											if ( $added_element_uniqid ) {
												if ( isset( $product_epos_choices[ $element_uniqueid ][ $added_element_uniqid ] ) ) {
													$product_epos_choices[ $element_uniqueid ] = $product_epos_choices[ $element_uniqueid ][ $added_element_uniqid ];
												}
											}
										}
										continue;
									}

									if ( isset( $builder[ $current_element . '_fee' ] ) && isset( $builder[ $current_element . '_fee' ][ $current_counter ] ) ) {
										$_is_price_fee = $builder[ $current_element . '_fee' ][ $current_counter ];
									}

									// Backwards compatibility.
									$swatchmode   = $this->get_builder_element( $_prefix . 'swatchmode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									$show_tooltip = $this->get_builder_element( $_prefix . 'show_tooltip', $builder, $current_builder, $current_counter, '0', $current_element, '', $element_uniqueid );
									if ( '0' === $show_tooltip ) {
										$show_tooltip = $swatchmode;
									}

									if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type ) {
										$_prefix = $current_element . '_';

										$_is_field_required     = $this->get_builder_element( $_prefix . 'required', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_changes_product_image = $this->get_builder_element( $_prefix . 'changes_product_image', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_replacement_mode      = $this->get_builder_element( $_prefix . 'replacement_mode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_swatch_position       = $this->get_builder_element( $_prefix . 'swatch_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_use_images            = $this->get_builder_element( $_prefix . 'use_images', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_use_colors            = $this->get_builder_element( $_prefix . 'use_colors', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_price                 = isset( $builder[ $current_element . '_price' ] ) ? $builder[ $current_element . '_price' ][ $current_counter ] : '';
										$_price                 = $this->get_builder_element( $_prefix . 'price', $builder, $current_builder, $current_counter, $_price, $current_element, 'wc_epo_option_regular_price', $element_uniqueid );

										$_original_regular_price_filtered = $_price;
										if ( $enable_sales && isset( $builder[ $current_element . '_sale_price' ][ $current_counter ] ) && '' !== $builder[ $current_element . '_sale_price' ][ $current_counter ] ) {
											$_price = $builder[ $current_element . '_sale_price' ][ $current_counter ];
											$_price = $this->get_builder_element( $_prefix . 'sale_price', $builder, $current_builder, $current_counter, $_price, $current_element, 'wc_epo_option_sale_price', $element_uniqueid );
										}

										$_price                           = apply_filters( 'wc_epo_apply_discount', $_price, $_price, $post_id );
										$_original_regular_price_filtered = apply_filters( 'wc_epo_enable_shortocde', $_original_regular_price_filtered, $_original_regular_price_filtered, $post_id );

										$this_price_type   = '';
										$this_price_type_o = '';

										$_regular_price_type    = [ [ '' ] ];
										$_for_filter_price_type = '';

										// backwards compatiiblity.
										if ( isset( $builder[ $current_element . '_price_type' ][ $current_counter ] ) ) {
											$_regular_price_type = $builder[ $current_element . '_price_type' ][ $current_counter ];
											$this_price_type     = $_regular_price_type;
											$this_price_type_o   = $_regular_price_type;

											switch ( $_regular_price_type ) {
												case 'fee':
													$_regular_price_type = '';
													$_is_price_fee       = '1';
													break;
												case 'stepfee':
													$_regular_price_type = 'step';
													$_is_price_fee       = '1';
													break;
												case 'currentstepfee':
													$_regular_price_type = 'currentstep';
													$_is_price_fee       = '1';
													break;
											}
											$_for_filter_price_type = $_regular_price_type;
											$_regular_price_type    = [ [ $_regular_price_type ] ];
										}

										if ( 'math' === $this_price_type || 'lookuptable' === $this_price_type ) {
											$_regular_price = [ [ $_price ] ];
										} else {
											$_regular_price = [ [ wc_format_decimal( $_price, false, true ) ] ];
										}

										$lookuptable   = $this->get_builder_element( $_prefix . 'lookuptable', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$lookuptable_x = $this->get_builder_element( $_prefix . 'lookuptable_x', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$lookuptable_y = $this->get_builder_element( $_prefix . 'lookuptable_y', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										if ( 'lookuptable' === $this_price_type ) {
											$table = THEMECOMPLETE_EPO_HELPER()->reverse_strrchr( $lookuptable, '|' );
											if ( is_string( $table ) ) {
												$table = trim( $table );
											} else {
												$table = '';
											}
											$table_name = strrchr( $lookuptable, '|' );
											if ( false !== $table_name ) {
												$table_num = trim( substr( $lookuptable, ( 0 - ( strlen( $table_name ) - 1 ) ) ) );
											} else {
												$table_num = '0';
											}

											$xy            = '0';
											$lookuptable_x = trim( $lookuptable_x );
											$lookuptable_y = trim( $lookuptable_y );
											if ( ! empty( $lookuptable_x ) ) {
												if ( ! str_starts_with( $lookuptable_x, '{' ) ) {
													$lookuptable_x = '{field.' . $lookuptable_x . '.text}';
												}
											}
											if ( ! empty( $lookuptable_y ) ) {
												if ( ! str_starts_with( $lookuptable_y, '{' ) ) {
													$lookuptable_y = '{field.' . $lookuptable_y . '.text}';
												}
											}
											if ( ! empty( $lookuptable_x ) && ! empty( $lookuptable_y ) ) {
												$xy = '[' . $lookuptable_x . ', ' . $lookuptable_y . ']';
											} elseif ( ! empty( $lookuptable_x ) ) {
												$xy = $lookuptable_x;
											} elseif ( ! empty( $lookuptable_y ) ) {
												$xy = $lookuptable_y;
											}
											$this_price_type                  = 'math';
											$_regular_price_type              = [ [ $this_price_type ] ];
											$_price                           = 'lookuptable(' . $xy . ', ["' . $table . '", ' . $table_num . '])';
											$_original_regular_price_filtered = $_price;
											$_regular_price                   = [ [ $_price ] ];
										}

										if ( THEMECOMPLETE_EPO_WPML()->is_active() && THEMECOMPLETE_EPO_WPML()->is_multi_currency() ) {
											global $woocommerce_wpml;
											global $sitepress;
											if ( $woocommerce_wpml && isset( $wpml_is_original_product ) ) {

												$basetype     = $price->post_type;
												$translations = THEMECOMPLETE_EPO_WPML()->sitepress_instance()->get_element_translations( THEMECOMPLETE_EPO_WPML()->sitepress_instance()->get_element_trid( $original_product_id, 'post_product' ), 'product' );

												$woocommerce_wpml_currencies = $woocommerce_wpml->settings['currency_options'];

												foreach ( $woocommerce_wpml_currencies as $currency => $currency_data ) {

													$thisbuilder = [];

													if ( ! isset( $currency_data['languages'] ) ) {
														continue;
													}

													foreach ( $currency_data['languages'] as $lang => $is_lang_enabled ) {
														if ( $is_lang_enabled && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {
															if ( 'product' === $basetype ) {
																if ( isset( $translations[ $lang ] ) ) {
																	$this_wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $translations[ $lang ]->element_id, 'product' );
																	if ( $this_wpml_is_original_product && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {
																		$thisbuilder = $builder;
																	} else {
																		$thisbuilder = themecomplete_get_post_meta( $translations[ $lang ]->element_id, ( $this_wpml_is_original_product ? 'tm_meta' : 'tm_meta_wpml' ), true );
																		if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																			$thisbuilder = $thisbuilder['tmfbuilder'];
																		} else {
																			$thisbuilder = themecomplete_get_post_meta( $original_product_id, 'tm_meta', true );
																			if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																				$thisbuilder = $thisbuilder['tmfbuilder'];
																			} else {
																				$thisbuilder = [];
																			}
																		}
																	}
																}
															} elseif ( $wpml_is_original_product && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {
																$thisbuilder = $builder;
															} else {
																$args                 = [
																	'post_type'   => $basetype,
																	'post_status' => [ 'publish', 'draft' ], // get only enabled global extra options.
																	'numberposts' => -1,
																	'orderby'     => 'date',
																	'order'       => 'asc',
																];
																$args['meta_query']   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $lang, '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
																$args['meta_query'][] = [
																	'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
																	'value'   => $original_product_id,
																	'compare' => '=',
																];
																$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

																if ( ! empty( $other_translations ) && isset( $other_translations[0] ) && is_object( $other_translations[0] ) && property_exists( $other_translations[0], 'ID' ) ) {
																	$this_wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $other_translations[0]->ID, $basetype );
																	$thisbuilder                   = themecomplete_get_post_meta( $other_translations[0]->ID, ( $this_wpml_is_original_product ? 'tm_meta' : 'tm_meta_wpml' ), true );
																	if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																		$thisbuilder = $thisbuilder['tmfbuilder'];
																	} else {
																		$thisbuilder = themecomplete_get_post_meta( $original_product_id, 'tm_meta', true );
																		if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																			$thisbuilder = $thisbuilder['tmfbuilder'];
																		} else {
																			$thisbuilder = [];
																		}
																	}
																}
															}

															break;
														}
													}
													if ( empty( $thisbuilder ) ) {
														$thisbuilder = $builder;
													}
													if ( $currency !== $woocommerce_wpml->multi_currency->get_default_currency() ) {
														$_current_currency_price = ( isset( $thisbuilder[ $current_element . '_price_' . $currency ] ) && isset( $thisbuilder[ $current_element . '_price_' . $currency ][ $current_counter ] ) && '' !== $thisbuilder[ $current_element . '_price_' . $currency ][ $current_counter ] ) ? $thisbuilder[ $current_element . '_price_' . $currency ][ $current_counter ] : '';
														if ( '' === $_current_currency_price ) {
															if ( isset( $builder[ $current_element . '_price_' . $currency ] ) && isset( $builder[ $current_element . '_price_' . $currency ][ $current_counter ] ) && '' !== $builder[ $current_element . '_price_' . $currency ][ $current_counter ] ) {
																$_current_currency_price = $builder[ $current_element . '_price_' . $currency ][ $current_counter ];
															}
														}
														$_current_currency_sale_price = ( isset( $thisbuilder[ $current_element . '_sale_price_' . $currency ] ) && isset( $thisbuilder[ $current_element . '_sale_price_' . $currency ][ $current_counter ] ) && '' !== $thisbuilder[ $current_element . '_sale_price_' . $currency ][ $current_counter ] ) ? $thisbuilder[ $current_element . '_sale_price_' . $currency ][ $current_counter ] : '';
														if ( '' === $_current_currency_sale_price ) {
															if ( isset( $builder[ $current_element . '_sale_price_' . $currency ] ) && isset( $builder[ $current_element . '_sale_price_' . $currency ][ $current_counter ] ) && '' !== $builder[ $current_element . '_sale_price_' . $currency ][ $current_counter ] ) {
																$_current_currency_sale_price = $builder[ $current_element . '_sale_price_' . $currency ][ $current_counter ];
															}
														}
													} else {
														$_current_currency_price = isset( $thisbuilder[ $current_element . '_price' ][ $current_counter ] ) ? $thisbuilder[ $current_element . '_price' ][ $current_counter ] : '';
														if ( '' === $_current_currency_price ) {
															if ( isset( $builder[ $current_element . '_price' ][ $current_counter ] ) && '' !== $builder[ $current_element . '_price' ][ $current_counter ] ) {
																$_current_currency_price = $builder[ $current_element . '_price' ][ $current_counter ];
															}
														}
														$_current_currency_sale_price = isset( $thisbuilder[ $current_element . '_sale_price' ][ $current_counter ] ) ? $thisbuilder[ $current_element . '_sale_price' ][ $current_counter ] : '';
														if ( '' === $_current_currency_sale_price ) {
															if ( isset( $builder[ $current_element . '_sale_price' ][ $current_counter ] ) && '' !== $builder[ $current_element . '_sale_price' ][ $current_counter ] ) {
																$_current_currency_sale_price = $builder[ $current_element . '_sale_price' ][ $current_counter ];
															}
														}
													}
													if ( ! ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) ) && ! ( isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) ) ) {
														if ( is_array( $_current_currency_price ) ) {
															foreach ( $_current_currency_price as $_k => $_v ) {
																if ( isset( $_prices_type[ $_k ] ) && 'math' === $_prices_type[ $_k ] ) {
																	$_current_currency_price[ $_k ] = $_v;
																} elseif ( '' !== $_v ) {
																	$_current_currency_price[ $_k ] = THEMECOMPLETE_EPO_WPML()->get_price_in_currency( $_v, $currency );
																}
															}
														}
													}
													if ( ! ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) ) && ! ( isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) ) ) {
														if ( is_array( $_current_currency_sale_price ) ) {
															foreach ( $_current_currency_sale_price as $_k => $_v ) {
																if ( isset( $_prices_type[ $_k ] ) && 'math' === $_prices_type[ $_k ] ) {
																	$_current_currency_sale_price[ $_k ] = $_v;
																} elseif ( '' !== $_v ) {
																	$_current_currency_sale_price[ $_k ] = THEMECOMPLETE_EPO_WPML()->get_price_in_currency( $_v, $currency );
																}
															}
														}
													}

													if ( 'math' === $this_price_type || 'lookuptable' === $this_price_type_o ) {
														$price_per_currencies_original[ $currency ] = [ [ $_current_currency_price ] ];
													} else {
														$price_per_currencies_original[ $currency ] = [ [ wc_format_decimal( $_current_currency_price, false, true ) ] ];
													}

													$_current_currency_price          = apply_filters( 'wc_epo_option_regular_price' . $currency, $_current_currency_price, $_prefix . 'price' . $currency, $element_uniqueid );
													$_current_currency_sale_price     = apply_filters( 'wc_epo_option_sale_price' . $currency, $_current_currency_price, $_prefix . 'sale_price' . $currency, $element_uniqueid );
													$_original_current_currency_price = $_current_currency_price;

													if ( $enable_sales && $_current_currency_sale_price && '' !== $_current_currency_sale_price ) {
														$_current_currency_price = $_current_currency_sale_price;
													}
													$_current_currency_price = apply_filters( 'wc_epo_apply_discount', $_current_currency_price, $_original_current_currency_price, $post_id );

													if ( 'math' === $this_price_type || 'lookuptable' === $this_price_type_o ) {
														$price_per_currencies[ $currency ] = [ [ $_current_currency_price ] ];
													} else {
														$price_per_currencies[ $currency ] = [ [ wc_format_decimal( $_current_currency_price, false, true ) ] ];
													}
												}
											}
										} else {
											foreach ( THEMECOMPLETE_EPO_HELPER()->get_currencies() as $currency ) {
												$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $currency );

												if ( '' === $mt_prefix ) {
													$_current_currency_price          = $_price;
													$_original_current_currency_price = $_current_currency_price;
												} else {
													$_current_currency_price          = isset( $builder[ $current_element . '_price' . $mt_prefix ][ $current_counter ] ) ? $builder[ $current_element . '_price' . $mt_prefix ][ $current_counter ] : '';
													$_current_currency_sale_price     = isset( $builder[ $current_element . '_sale_price' . $mt_prefix ][ $current_counter ] ) ? $builder[ $current_element . '_sale_price' . $mt_prefix ][ $current_counter ] : '';
													$_current_currency_price          = $this->get_builder_element( $_prefix . 'price' . $mt_prefix, $builder, $current_builder, $current_counter, $_current_currency_price, $current_element, 'wc_epo_option_regular_price' . $mt_prefix, $element_uniqueid );
													$_current_currency_sale_price     = $this->get_builder_element( $_prefix . 'sale_price' . $mt_prefix, $builder, $current_builder, $current_counter, $_current_currency_sale_price, $current_element, 'wc_epo_option_sale_price' . $mt_prefix, $element_uniqueid );
													$_original_current_currency_price = $_current_currency_price;
													if ( $enable_sales && $_current_currency_sale_price && '' !== $_current_currency_sale_price ) {
														$_current_currency_price = $_current_currency_sale_price;
													}
													$_current_currency_price = apply_filters( 'wc_epo_apply_discount', $_current_currency_price, $_original_current_currency_price, $post_id );
												}

												if ( '' !== $_original_current_currency_price ) {
													if ( 'math' === $this_price_type || 'lookuptable' === $this_price_type_o ) {
														$price_per_currencies_original[ $currency ] = [ [ $_original_current_currency_price ] ];
													} else {
														$price_per_currencies_original[ $currency ] = [ [ wc_format_decimal( $_original_current_currency_price, false, true ) ] ];
													}
												}

												if ( '' !== $_current_currency_price ) {
													if ( 'math' === $this_price_type || 'lookuptable' === $this_price_type_o ) {
														$price_per_currencies[ $currency ] = [ [ $_current_currency_price ] ];
													} else {
														$price_per_currencies[ $currency ] = [ [ wc_format_decimal( $_current_currency_price, false, true ) ] ];
													}
												}
											}
										}

										$new_currency = false;
										$mt_prefix    = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( null, '' );

										$_current_currency_original_price = isset( $price_per_currencies_original[ $mt_prefix ] ) ? $price_per_currencies_original[ $mt_prefix ][0][0] : '';
										$_current_currency_price          = isset( $price_per_currencies[ $mt_prefix ] ) ? $price_per_currencies[ $mt_prefix ][0][0] : '';

										if ( THEMECOMPLETE_EPO_WPML()->is_active() && THEMECOMPLETE_EPO_WPML()->is_multi_currency() ) {
											global $woocommerce_wpml;
											if ( '' === $_current_currency_original_price && $mt_prefix !== $woocommerce_wpml->multi_currency->get_default_currency() ) {
												$_current_currency_original_price = isset( $price_per_currencies_original[ $woocommerce_wpml->multi_currency->get_client_currency() ] ) ? $price_per_currencies_original[ $woocommerce_wpml->multi_currency->get_client_currency() ][0][0] : '';
												if ( '' !== $_current_currency_original_price && 'math' !== $this_price_type && 'lookuptable' !== $this_price_type ) {
													$_current_currency_original_price = apply_filters( 'wc_epo_get_current_currency_price', $_current_currency_original_price, $this_price_type, null, $woocommerce_wpml->multi_currency->get_client_currency() );
												}
											}
											if ( '' === $_current_currency_price && $mt_prefix !== $woocommerce_wpml->multi_currency->get_default_currency() ) {
												$_current_currency_price = isset( $price_per_currencies[ $woocommerce_wpml->multi_currency->get_client_currency() ] ) ? $price_per_currencies[ $woocommerce_wpml->multi_currency->get_client_currency() ][0][0] : '';
												if ( '' !== $_current_currency_price && 'math' !== $this_price_type && 'lookuptable' !== $this_price_type ) {
													$_current_currency_price = apply_filters( 'wc_epo_get_current_currency_price', $_current_currency_price, $this_price_type, null, $woocommerce_wpml->multi_currency->get_client_currency() );
												}
											}
										}

										if ( '' !== $mt_prefix && '' !== $_current_currency_price ) {
											$_price                           = $_current_currency_price;
											$_original_regular_price_filtered = $_current_currency_original_price;

											$_regular_currencies = [ themecomplete_get_woocommerce_currency() ];
											$new_currency        = true;
										}

										if ( ! $new_currency ) {
											$_price                           = apply_filters( 'wc_epo_get_current_currency_price', $_price, $_for_filter_price_type, null, $mt_prefix );
											$_original_regular_price_filtered = apply_filters( 'wc_epo_get_current_currency_price', $_original_regular_price_filtered, $_for_filter_price_type, null, $mt_prefix );
										}

										$_price                           = apply_filters( 'wc_epo_price', $_price, $_for_filter_price_type, $post_id );
										$_original_regular_price_filtered = apply_filters( 'wc_epo_price', $_original_regular_price_filtered, $_for_filter_price_type, $post_id );

										if ( '' === $_is_price_fee && '' !== $_price && isset( $builder[ $current_element . '_price_type' ][ $current_counter ] ) && '' === $builder[ $current_element . '_price_type' ][ $current_counter ] ) {
											$_min_price = wc_format_decimal( $_price, false, true );
											$_max_price = $_min_price;
											if ( $_is_field_required ) {
												$_min_price0 = $_min_price;
											} else {
												$_min_price0  = 0;
												$_min_price10 = $_min_price;
											}
										} else {
											$_min_price  = false;
											$_max_price  = $_min_price;
											$_min_price0 = 0;
										}

										if ( 'math' === $this_price_type ) {
											$_regular_price_filtered          = [ [ $_price ] ];
											$_original_regular_price_filtered = [ [ $_original_regular_price_filtered ] ];
										} else {
											$_regular_price_filtered          = [ [ wc_format_decimal( $_price, false, true ) ] ];
											$_original_regular_price_filtered = [ [ wc_format_decimal( $_original_regular_price_filtered, false, true ) ] ];
										}
									} elseif ( 'multiple' === $element_object->type || 'multipleall' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {
										$_prefix = $current_element . '_';

										$_is_field_required = $this->get_builder_element( $_prefix . 'required', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );

										$_changes_product_image = $this->get_builder_element( $_prefix . 'changes_product_image', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_replacement_mode      = $this->get_builder_element( $_prefix . 'replacement_mode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_swatch_position       = $this->get_builder_element( $_prefix . 'swatch_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_use_images            = $this->get_builder_element( $_prefix . 'use_images', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_use_colors            = $this->get_builder_element( $_prefix . 'use_colors', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$_use_lightbox          = $this->get_builder_element( $_prefix . 'use_lightbox', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );

										if ( isset( $builder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ] ) ) {

											$_prices = $builder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ];
											$_prices = $this->get_builder_element( 'multiple_' . $current_element . '_options_price', $builder, $current_builder, $current_counter, $_prices, $current_element, 'wc_epo_multiple_prices', $element_uniqueid );

											$_original_prices = $_prices;
											$_sale_prices     = $_prices;
											if ( $enable_sales && isset( $builder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ] ) ) {
												$_sale_prices = $builder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ];
												$_sale_prices = $this->get_builder_element( 'multiple_' . $current_element . '_sale_prices', $builder, $current_builder, $current_counter, $_sale_prices, $current_element, 'wc_epo_multiple_sale_prices', $element_uniqueid );
											}
											$_prices = THEMECOMPLETE_EPO_HELPER()->merge_price_array( $_prices, $_sale_prices );
											$_prices = apply_filters( 'wc_epo_apply_discount', $_prices, $_original_prices, $post_id );

											$_original_prices = apply_filters( 'wc_epo_enable_shortocde', $_original_prices, $_original_prices, $post_id );

											$_values      = $this->get_builder_element( 'multiple_' . $current_element . '_options_value', $builder, $current_builder, $current_counter, [], $current_element, 'wc_epo_multiple_values', $element_uniqueid );
											$_titles      = $this->get_builder_element( 'multiple_' . $current_element . '_options_title', $builder, $current_builder, $current_counter, [], $current_element, 'wc_epo_multiple_titles', $element_uniqueid );
											$_images      = $this->get_builder_element( 'multiple_' . $current_element . '_options_image', $builder, $current_builder, $current_counter, [], $current_element, 'tm_image_url', $element_uniqueid );
											$_imagesc     = $this->get_builder_element( 'multiple_' . $current_element . '_options_imagec', $builder, $current_builder, $current_counter, [], $current_element, 'tm_image_url', $element_uniqueid );
											$_imagesp     = $this->get_builder_element( 'multiple_' . $current_element . '_options_imagep', $builder, $current_builder, $current_counter, [], $current_element, 'tm_image_url', $element_uniqueid );
											$_imagesl     = $this->get_builder_element( 'multiple_' . $current_element . '_options_imagel', $builder, $current_builder, $current_counter, [], $current_element, 'tm_image_url', $element_uniqueid );
											$_color       = $this->get_builder_element( 'multiple_' . $current_element . '_options_color', $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );
											$_prices_type = $this->get_builder_element( 'multiple_' . $current_element . '_options_price_type', $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );

											if ( ! is_array( $_values ) ) {
												$_values = [ $_values ];
											}
											if ( ! is_array( $_titles ) ) {
												$_titles = [ $_titles ];
											}
											// Check values in case they are empty and set them to title.
											foreach ( $_titles as $i => $_title ) {
												if ( '' === $_values[ $i ] ) {
													$_values[ $i ] = $_titles[ $i ];
												}
											}
											if ( ! is_array( $_images ) ) {
												$_images = [ $_images ];
											}
											if ( ! is_array( $_imagesc ) ) {
												$_imagesc = [ $_imagesc ];
											}
											if ( ! is_array( $_imagesp ) ) {
												$_imagesp = [ $_imagesp ];
											}
											if ( ! is_array( $_imagesl ) ) {
												$_imagesl = [ $_imagesl ];
											}
											if ( ! is_array( $_color ) ) {
												$_color = [ $_color ];
											}
											if ( ! is_array( $_prices_type ) ) {
												$_prices_type = [ $_prices_type ];
											}

											if ( THEMECOMPLETE_EPO_WPML()->is_active() && THEMECOMPLETE_EPO_WPML()->is_multi_currency() ) {
												global $woocommerce_wpml;
												global $sitepress;
												if ( $woocommerce_wpml && isset( $wpml_is_original_product ) ) {

													$basetype     = $price->post_type;
													$translations = THEMECOMPLETE_EPO_WPML()->sitepress_instance()->get_element_translations( THEMECOMPLETE_EPO_WPML()->sitepress_instance()->get_element_trid( $original_product_id, 'post_product' ), 'product' );

													$woocommerce_wpml_currencies = $woocommerce_wpml->settings['currency_options'];

													foreach ( $woocommerce_wpml_currencies as $currency => $currency_data ) {

														$thisbuilder = [];

														if ( ! isset( $currency_data['languages'] ) ) {
															continue;
														}

														foreach ( $currency_data['languages'] as $lang => $is_lang_enabled ) {

															if ( $is_lang_enabled && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {

																if ( 'product' === $basetype ) {

																	if ( isset( $translations[ $lang ] ) ) {

																		$this_wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $translations[ $lang ]->element_id, 'product' );

																		if ( $this_wpml_is_original_product && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {
																			$thisbuilder = $builder;
																		} else {
																			$thisbuilder = themecomplete_get_post_meta( $translations[ $lang ]->element_id, ( $this_wpml_is_original_product ? 'tm_meta' : 'tm_meta_wpml' ), true );
																			if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																				$thisbuilder = $thisbuilder['tmfbuilder'];
																			} else {
																				$thisbuilder = themecomplete_get_post_meta( $original_product_id, 'tm_meta', true );
																				if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																					$thisbuilder = $thisbuilder['tmfbuilder'];
																				} else {
																					$thisbuilder = [];
																				}
																			}
																		}
																	}
																} elseif ( $wpml_is_original_product && THEMECOMPLETE_EPO_WPML()->get_lang() === $lang ) {
																	$thisbuilder = $builder;
																} else {
																	$args                 = [
																		'post_type'   => $basetype,
																		'post_status' => [ 'publish', 'draft' ], // get only enabled global extra options.
																		'numberposts' => -1,
																		'orderby'     => 'date',
																		'order'       => 'asc',
																	];
																	$args['meta_query']   = THEMECOMPLETE_EPO_HELPER()->build_meta_query( 'AND', THEMECOMPLETE_EPO_WPML_LANG_META, $lang, '=', 'EXISTS' ); // phpcs:ignore WordPress.DB.SlowDBQuery
																	$args['meta_query'][] = [
																		'key'     => THEMECOMPLETE_EPO_WPML_PARENT_POSTID,
																		'value'   => $original_product_id,
																		'compare' => '=',
																	];
																	$other_translations   = THEMECOMPLETE_EPO_HELPER()->get_cached_posts( $args );

																	if ( ! empty( $other_translations ) && isset( $other_translations[0] ) && is_object( $other_translations[0] ) && property_exists( $other_translations[0], 'ID' ) ) {
																		$this_wpml_is_original_product = THEMECOMPLETE_EPO_WPML()->is_original_product( $other_translations[0]->ID, $basetype );
																		$thisbuilder                   = themecomplete_get_post_meta( $other_translations[0]->ID, ( $this_wpml_is_original_product ? 'tm_meta' : 'tm_meta_wpml' ), true );
																		if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																			$thisbuilder = $thisbuilder['tmfbuilder'];
																		} else {
																			$thisbuilder = themecomplete_get_post_meta( $original_product_id, 'tm_meta', true );
																			if ( isset( $thisbuilder['tmfbuilder'] ) ) {
																				$thisbuilder = $thisbuilder['tmfbuilder'];
																			} else {
																				$thisbuilder = [];
																			}
																		}
																	}
																}

																break;
															}
														}

														if ( empty( $thisbuilder ) ) {
															$thisbuilder = $builder;
														}

														if ( $currency !== $woocommerce_wpml->multi_currency->get_default_currency() ) {
															$_current_currency_price = ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) && '' !== $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) ? $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] : '';
															if ( '' === $_current_currency_price ) {
																if ( isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) && '' !== $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) {
																	$_current_currency_price = $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ];
																}
															}
															$_current_currency_sale_price = ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) && '' !== $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) ? $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] : '';
															if ( '' === $_current_currency_price ) {
																if ( isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) && '' !== $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) {
																	$_current_currency_sale_price = $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ];
																}
															}
														} else {
															$_current_currency_price = isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ] ) ? $thisbuilder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ] : '';
															if ( '' === $_current_currency_price ) {
																if ( isset( $builder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ] ) && '' !== $builder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ] ) {
																	$_current_currency_price = $builder[ 'multiple_' . $current_element . '_options_price' ][ $current_counter ];
																}
															}
															$_current_currency_sale_price = isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ] ) ? $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ] : '';
															if ( '' === $_current_currency_price ) {
																if ( isset( $builder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ] ) && '' !== $builder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ] ) {
																	$_current_currency_sale_price = $builder[ 'multiple_' . $current_element . '_options_sale_price' ][ $current_counter ];
																}
															}
														}

														if ( ! ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) ) && ! ( isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_price_' . $currency ][ $current_counter ] ) ) ) {
															if ( is_array( $_current_currency_price ) ) {
																foreach ( $_current_currency_price as $_k => $_v ) {
																	if ( isset( $_prices_type[ $_k ] ) && 'math' === $_prices_type[ $_k ] ) {
																		$_current_currency_price[ $_k ] = $_v;
																	} elseif ( '' !== $_v ) {
																		$_current_currency_price[ $_k ] = THEMECOMPLETE_EPO_WPML()->get_price_in_currency( $_v, $currency );
																	}
																}
															}
														}
														if ( ! ( isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $thisbuilder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) ) && ! ( isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ] ) && isset( $builder[ 'multiple_' . $current_element . '_options_sale_price_' . $currency ][ $current_counter ] ) ) ) {
															if ( is_array( $_current_currency_sale_price ) ) {
																foreach ( $_current_currency_sale_price as $_k => $_v ) {
																	if ( isset( $_prices_type[ $_k ] ) && 'math' === $_prices_type[ $_k ] ) {
																		$_current_currency_sale_price[ $_k ] = $_v;
																	} elseif ( '' !== $_v ) {
																		$_current_currency_sale_price[ $_k ] = THEMECOMPLETE_EPO_WPML()->get_price_in_currency( $_v, $currency );
																	}
																}
															}
														}

														$_current_currency_price          = apply_filters( 'wc_epo_multiple_prices' . $currency, $_current_currency_price, 'multiple_' . $current_element . '_options_price' . $currency, $element_uniqueid );
														$_current_currency_sale_price     = apply_filters( 'wc_epo_multiple_sale_prices' . $currency, $_current_currency_sale_price, 'multiple_' . $current_element . '_options_sale_price' . $currency, $element_uniqueid );
														$_original_current_currency_price = $_current_currency_price;

														if ( $enable_sales ) {
															$_current_currency_price = THEMECOMPLETE_EPO_HELPER()->merge_price_array( $_current_currency_price, $_current_currency_sale_price );
														}
														$_current_currency_price = apply_filters( 'wc_epo_apply_discount', $_current_currency_price, $_original_current_currency_price, $post_id );

														$price_per_currencies_original[ $currency ] = $_original_current_currency_price;
														if ( ! is_array( $price_per_currencies_original[ $currency ] ) ) {
															$price_per_currencies_original[ $currency ] = [];
														}

														$price_per_currencies[ $currency ] = $_current_currency_price;
														if ( ! is_array( $price_per_currencies[ $currency ] ) ) {
															$price_per_currencies[ $currency ] = [];
														}

														foreach ( $_prices as $_n => $_price ) {
															if ( ! isset( $_prices_type[ $_n ] ) ) {
																continue;
															}

															$to_price = '';
															if ( is_array( $_original_current_currency_price ) && isset( $_original_current_currency_price[ $_n ] ) ) {
																$to_price = $_original_current_currency_price[ $_n ];
															}
															if ( 'math' === $_prices_type[ $_n ] ) {
																$price_per_currencies_original[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $to_price ];
															} else {
																$price_per_currencies_original[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ wc_format_decimal( $to_price, false, true ) ];
															}

															$to_price = '';
															if ( is_array( $_current_currency_price ) && isset( $_current_currency_price[ $_n ] ) ) {
																$to_price = $_current_currency_price[ $_n ];
															}
															if ( 'math' === $_prices_type[ $_n ] ) {
																$price_per_currencies[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $to_price ];
															} else {
																$price_per_currencies[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ wc_format_decimal( $to_price, false, true ) ];
															}
														}
													}
												}
											} else {
												foreach ( THEMECOMPLETE_EPO_HELPER()->get_currencies() as $currency ) {
													$mt_prefix = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( $currency );

													if ( '' === $mt_prefix ) {
														$_current_currency_price          = $_original_prices;
														$_original_current_currency_price = $_original_prices;
														if ( $enable_sales ) {
															$_current_currency_price = THEMECOMPLETE_EPO_HELPER()->merge_price_array( $_current_currency_price, $_prices );
														}
													} else {
														$_current_currency_price          = $this->get_builder_element( 'multiple_' . $current_element . '_options_price' . $mt_prefix, $builder, $current_builder, $current_counter, [], $current_element, 'wc_epo_multiple_prices' . $mt_prefix, $element_uniqueid );
														$_current_currency_sale_price     = $this->get_builder_element( 'multiple_' . $current_element . '_options_sale_price' . $mt_prefix, $builder, $current_builder, $current_counter, [], $current_element, 'wc_epo_multiple_sale_prices' . $mt_prefix, $element_uniqueid );
														$_original_current_currency_price = $_current_currency_price;
														if ( $enable_sales ) {
															$_current_currency_price = THEMECOMPLETE_EPO_HELPER()->merge_price_array( $_current_currency_price, $_current_currency_sale_price );
														}
														$_current_currency_price = apply_filters( 'wc_epo_apply_discount', $_current_currency_price, $_original_current_currency_price, $post_id );
													}

													$price_per_currencies_original[ $currency ] = $_original_current_currency_price;
													if ( ! is_array( $price_per_currencies_original[ $currency ] ) ) {
														$price_per_currencies_original[ $currency ] = [];
													}
													$price_per_currencies[ $currency ] = $_current_currency_price;
													if ( ! is_array( $price_per_currencies[ $currency ] ) ) {
														$price_per_currencies[ $currency ] = [];
													}
													foreach ( $_prices as $_n => $_price ) {
														if ( ! isset( $_prices_type[ $_n ] ) ) {
															continue;
														}
														$to_price = '';
														if ( is_array( $_original_current_currency_price ) && isset( $_original_current_currency_price[ $_n ] ) ) {
															$to_price = $_original_current_currency_price[ $_n ];
														}
														if ( 'math' === $_prices_type[ $_n ] ) {
															$price_per_currencies_original[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $to_price ];
														} else {
															$price_per_currencies_original[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ wc_format_decimal( $to_price, false, true ) ];
														}
														$to_price = '';
														if ( is_array( $_current_currency_price ) && isset( $_current_currency_price[ $_n ] ) ) {
															$to_price = $_current_currency_price[ $_n ];
														}
														if ( 'math' === $_prices_type[ $_n ] ) {
															$price_per_currencies[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $to_price ];
														} else {
															$price_per_currencies[ $currency ][ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ wc_format_decimal( $to_price, false, true ) ];
														}
													}
												}
											}

											$mt_prefix                         = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( true, '' );
											$_original_current_currency_prices = isset( $price_per_currencies_original[ $mt_prefix ] ) ? $price_per_currencies_original[ $mt_prefix ] : '';
											$_current_currency_prices          = isset( $price_per_currencies[ $mt_prefix ] ) ? $price_per_currencies[ $mt_prefix ] : '';

											// Backwards compatibility.
											if ( '' === $_replacement_mode ) {
												if ( '' !== $_use_images ) {
													$_replacement_mode = 'image';
												} elseif ( '' !== $_use_colors ) {
													$_replacement_mode = 'color';
												} else {
													$_replacement_mode = 'none';
												}
											}
											if ( '' === $_swatch_position ) {
												switch ( $_replacement_mode ) {
													case 'none':
														$_swatch_position = 'center';
														break;
													case 'image':
														if ( ! empty( $_use_images ) ) {
															switch ( $_use_images ) {
																case 'images':
																	$_swatch_position = 'center';
																	break;
																default:
																	$_swatch_position = $_use_images;
																	break;
															}
														}
														break;
													case 'color':
														if ( ! empty( $_use_colors ) ) {
															switch ( $_use_colors ) {
																case 'color':
																	$_swatch_position = 'center';
																	break;
																default:
																	$_swatch_position = $_use_colors;
																	break;
															}
														}
														break;
												}
												if ( '' === $_swatch_position ) {
													$_swatch_position = 'center';
												}
											}

											if ( 'images' === $_changes_product_image && 'image' !== $_replacement_mode ) {
												$_imagesp               = $_images;
												$_images                = [];
												$_imagesc               = [];
												$_changes_product_image = 'custom';
											}
											if ( 'image' !== $_replacement_mode ) {
												$_use_lightbox = '';
											}

											$_url         = $this->get_builder_element( 'multiple_' . $current_element . '_options_url', $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );
											$_description = $this->get_builder_element( 'multiple_' . $current_element . '_options_description', $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );
											$_enabled     = $this->get_builder_element( 'multiple_' . $current_element . '_options_enabled', $builder, $current_builder, $current_counter, [], $current_element, '1', $element_uniqueid );
											$_fee         = $this->get_builder_element( 'multiple_' . $current_element . '_options_fee', $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );

											foreach ( THEMECOMPLETE_EPO_BUILDER()->extra_multiple_options as $__key => $__name ) {
												$_extra_name                             = $__name['name'];
												$_extra_multiple_choices[ $_extra_name ] = $this->get_builder_element( 'multiple_' . $current_element . '_options_' . $_extra_name, $builder, $current_builder, $current_counter, [], $current_element, '', $element_uniqueid );
											}

											$_values_c  = $_values;
											$_values_ce = $_values;
											$mt_prefix  = THEMECOMPLETE_EPO_HELPER()->get_currency_price_prefix( null, '' );
											$_nn        = 0;
											foreach ( $_prices as $_n => $_price ) {

												if ( isset( $_enabled[ $_n ] ) && ( '0' === $_enabled[ $_n ] || '' === $_enabled[ $_n ] ) ) {
													$_options_all[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = $_titles[ $_n ];
													unset( $_images[ $_n ] );
													unset( $_imagesc[ $_n ] );
													unset( $_imagesp[ $_n ] );
													unset( $_imagesl[ $_n ] );
													unset( $_color[ $_n ] );
													unset( $_url[ $_n ] );
													unset( $_description[ $_n ] );
													unset( $_titles[ $_n ] );
													unset( $_values[ $_n ] );
													unset( $_original_prices[ $_n ] );
													unset( $_prices_type[ $_n ] );
													unset( $_values_ce[ $_n ] );
													if ( is_array( $_current_currency_prices ) ) {
														unset( $_current_currency_prices[ $_n ] );
													}
													if ( is_array( $_original_current_currency_prices ) ) {
														unset( $_original_current_currency_prices[ $_n ] );
													}
													if ( isset( $_fee ) && is_array( $_fee ) ) {
														unset( $_fee[ $_n ] );
													}
													unset( $_sale_prices[ $_n ] );

													do_action( 'wc_epo_admin_option_is_disable', $_n );
													$_current_deleted_choices[] = $_n;
													continue;
												}

												if ( ! isset( $_prices_type[ $_n ] ) ) {
													continue;
												}

												// backwards compatibility.
												if ( isset( $_prices_type[ $_n ] ) ) {
													if ( 'fee' === $_prices_type[ $_n ] ) {
														if ( 'checkboxes' === $current_element ) {
															$_fee[ $_n ] = '1';
														} else {
															$_is_price_fee = '1';
														}
														$_prices_type[ $_n ] = '';
													}
												}

												$new_currency = false;
												if ( '' !== $mt_prefix
													&& '' !== $_current_currency_prices
													&& is_array( $_current_currency_prices )
													&& isset( $_current_currency_prices[ $_n ] )
													&& '' !== $_current_currency_prices[ $_n ]
												) {
													$new_currency            = true;
													$_price                  = $_current_currency_prices[ $_n ];
													$_original_prices[ $_n ] = $_original_current_currency_prices[ $_n ];
													$_regular_currencies[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ themecomplete_get_woocommerce_currency() ];
												}

												if ( 'math' === $_prices_type[ $_n ] ) {
													$_f_price = $_price;
												} else {
													$_f_price = wc_format_decimal( $_price, false, true );
												}

												$_regular_price[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $_f_price ];
												$_for_filter_price_type                                        = isset( $_prices_type[ $_n ] ) ? $_prices_type[ $_n ] : '';

												if ( ! $new_currency ) {
													$_price                  = apply_filters( 'wc_epo_get_current_currency_price', $_price, $_for_filter_price_type, null, $mt_prefix );
													$_original_prices[ $_n ] = apply_filters( 'wc_epo_get_current_currency_price', $_original_prices[ $_n ], $_for_filter_price_type, null, $mt_prefix );
												}
												$_price                  = apply_filters( 'wc_epo_price', $_price, $_for_filter_price_type, $post_id );
												$_original_prices[ $_n ] = apply_filters( 'wc_epo_price', $_original_prices[ $_n ], $_for_filter_price_type, $post_id );

												if ( 'math' === $_prices_type[ $_n ] ) {
													$_f_price = $_price;
													$_regular_price_filtered[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ]           = [ $_price ];
													$_original_regular_price_filtered [ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ $_original_prices[ $_n ] ];
												} else {
													$_f_price = wc_format_decimal( $_price, false, true );
													$_regular_price_filtered[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ]           = [ $_f_price ];
													$_original_regular_price_filtered [ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = [ wc_format_decimal( $_original_prices[ $_n ], false, true ) ];
												}

												$_regular_price_type[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ] = isset( $_prices_type[ $_n ] ) ? [ ( $_prices_type[ $_n ] ) ] : [ '' ];
												$_options_all[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ]        = $_titles[ $_n ];
												$_options[ esc_attr( ( $_values[ $_n ] ) ) . '_' . $_n ]            = $_titles[ $_n ];
												$_values_c[ $_n ]  = $_values[ $_n ] . '_' . $_n;
												$_values_ce[ $_n ] = $_values_c[ $_n ];
												if ( ( ( isset( $_fee[ $_n ] ) && '1' !== $_fee[ $_n ] ) || ! isset( $_fee[ $_n ] ) ) && isset( $_prices_type[ $_n ] ) && '' === $_prices_type[ $_n ] && ( ( isset( $builder[ $current_element . '_price_type' ][ $current_counter ] ) && '' === $builder[ $current_element . '_price_type' ][ $current_counter ] ) || ! isset( $builder[ $current_element . '_price_type' ][ $current_counter ] ) ) ) {
													if ( false !== $_min_price && '' !== $_price ) {
														if ( '' === $_min_price ) {
															$_min_price = $_f_price;
														} elseif ( $_min_price > $_f_price ) {
															$_min_price = $_f_price;
														}
														if ( '' === $_min_price0 ) {
															if ( $_is_field_required ) {
																$_min_price0 = floatval( $_min_price );
															} else {
																$_min_price0 = 0;
															}
														} elseif ( $_is_field_required && $_min_price0 > floatval( $_min_price ) ) {
															$_min_price0 = floatval( $_min_price );
														}
														if ( '' === $_min_price10 ) {
															$_min_price10 = floatval( $_min_price );
														} elseif ( $_min_price10 > floatval( $_min_price ) ) {
															$_min_price10 = floatval( $_min_price );
														}
														if ( '' === $_max_price ) {
															$_max_price = $_f_price;
														} elseif ( 'checkboxes' === $current_element ) {
															// needs work for Limit selection/Exact selection/Minimum selection.
															$_max_price = floatval( $_max_price ) + floatval( $_f_price );
														} elseif ( $_max_price < $_f_price ) {
															$_max_price = $_f_price;
														}
													} elseif ( '' === $_price ) {
														$_min_price0  = 0;
														$_min_price10 = 0;
													}
												} else {
													$_min_price = false;
													$_max_price = $_min_price;
													if ( '' === $_min_price0 ) {
														$_min_price0 = 0;
													} elseif ( $_min_price0 > floatval( $_min_price ) ) {
														$_min_price0 = floatval( $_min_price );
													}
													if ( '' === $_min_price10 ) {
														$_min_price10 = 0;
													} elseif ( $_min_price10 > floatval( $_min_price ) ) {
														$_min_price10 = floatval( $_min_price );
													}
												}
												++$_nn;
											}

											$_images          = array_values( $_images );
											$_imagesc         = array_values( $_imagesc );
											$_imagesp         = array_values( $_imagesp );
											$_imagesl         = array_values( $_imagesl );
											$_color           = array_values( $_color );
											$_url             = array_values( $_url );
											$_description     = array_values( $_description );
											$_titles          = array_values( $_titles );
											$_values          = array_values( $_values );
											$_original_prices = array_values( $_original_prices );
											$_prices_type     = array_values( $_prices_type );
											if ( is_array( $_current_currency_prices ) ) {
												$_current_currency_prices = array_values( $_current_currency_prices );
											}
											if ( is_array( $_original_current_currency_prices ) ) {
												$_original_current_currency_prices = array_values( $_original_current_currency_prices );
											}
											if ( isset( $_fee ) && is_array( $_fee ) ) {
												$_fee = array_values( $_fee );
											}
											$_sale_prices = array_values( $_sale_prices );
											$_values_c    = array_values( $_values_c );
											$_values_ce   = array_values( $_values_ce );
											$_prices      = array_values( $_prices );

											do_action( 'wc_epo_admin_option_reindex' );
										}
									}

									$default_value = '';
									if ( isset( $builder[ 'multiple_' . $current_element . '_options_default_value' ][ $current_counter ] ) ) {
										$default_value = $builder[ 'multiple_' . $current_element . '_options_default_value' ][ $current_counter ];

										$disabled_count = count(
											array_filter(
												$_current_deleted_choices,
												function ( $n ) use ( $default_value ) {
													return $n <= $default_value;
												}
											)
										);

										if ( is_array( $default_value ) ) {
											foreach ( $default_value as $key => $value ) {
												if ( '' !== $value ) {
													$this_disabled_count   = count(
														array_filter(
															$_current_deleted_choices,
															function ( $n ) use ( $default_value, $value ) {
																return (int) $n < (int) $value && $n <= $default_value;
															}
														)
													);
													$default_value[ $key ] = (string) ( (int) $value - (int) $this_disabled_count );
												}
											}
											if ( 'selectbox' === $current_element && isset( $default_value[ $current_counter ] ) ) {
												$default_value = (string) $default_value[ $current_counter ];
											}
										} elseif ( '' !== $default_value ) {
											$default_value = (string) ( (int) $default_value - (int) $disabled_count );
										}
									} elseif ( isset( $builder[ $_prefix . 'default_value' ] ) && isset( $builder[ $_prefix . 'default_value' ][ $current_counter ] ) ) {
										$default_value = (string) $builder[ $_prefix . 'default_value' ][ $current_counter ];
									}
									$default_value = apply_filters( 'wc_epo_enable_shortocde', $default_value, $default_value, $post_id );

									switch ( $current_element ) {
										case 'selectbox':
											$_new_type = 'select';
											if ( isset( $builder[ $current_element . '_price_type' ][ $current_counter ] ) ) {
												// backwards compatibility.
												$selectbox_fee = $builder[ $current_element . '_price_type' ][ $current_counter ];
												$_is_price_fee = ( 'fee' === $selectbox_fee ) ? '1' : '';

											}
											break;

										case 'selectboxmultiple':
											$_new_type = 'selectmultiple';
											break;

										case 'radiobuttons':
											$_new_type = 'radio';
											break;

										case 'checkboxes':
											$_new_type = 'checkbox';
											break;

									}

									$_rules_type = $_regular_price_type;
									foreach ( $_regular_price_type as $key => $value ) {
										foreach ( $value as $k => $v ) {
											$_regular_price_type[ $key ][ $k ] = $v;
										}
									}

									$has_feature_lookuptable = false;

									$_rules          = $_regular_price;
									$_rules_filtered = $_regular_price_filtered;
									foreach ( $_regular_price as $key => $value ) {
										foreach ( $value as $k => $v ) {
											if ( 'math' !== $_regular_price_type[ $key ][ $k ] ) {
												$_regular_price[ $key ][ $k ]          = wc_format_localized_price( $v );
												$_regular_price_filtered[ $key ][ $k ] = wc_format_localized_price( $v );
											} elseif ( ! $has_feature_lookuptable ) {
												if ( str_contains( $v, 'lookuptable(' ) ) {
													$this->current_option_features[] = 'lookuptable';
													$has_feature_lookuptable         = true;
												}
											}
										}
									}

									if ( 'variations' !== $current_element ) {
										$this->cpf_single_epos_prices[ $element_uniqueid ] = [
											'type'       => $_new_type,
											'options'    => $_options,
											'prices'     => $_rules_filtered,
											'price_type' => $_rules_type,
											'uniqueid'   => $element_uniqueid,
											'required'   => $is_required,
											'element'    => $element_real_no_in_section,
											'section_uniqueid' => $_sections_uniqid,
											'minall'     => floatval( $_min_price10 ),
											'min'        => floatval( $_min_price0 ),
											'max'        => floatval( $_max_price ),
											'logicrules' => $logicrules,
											'section_logicrules' => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'],
											'logic'      => $this->get_builder_element( $_prefix . 'logic', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'section_logic' => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic'],
										];

										$epos_prices[] = $this->cpf_single_epos_prices[ $element_uniqueid ];
									}
									if ( false !== $_min_price ) {
										$_min_price = wc_format_localized_price( $_min_price );
									}
									if ( false !== $_max_price ) {
										$_max_price = wc_format_localized_price( $_max_price );
									}

									// Fix for getting right results for dates even if the user enters wrong format.
									$format         = $this->get_builder_element( $_prefix . 'format', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									$data           = $this->get_date_format( $format );
									$date_format    = $data['date_format'];
									$sep            = $data['sep'];
									$disabled_dates = $this->get_builder_element( $_prefix . 'disabled_dates', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									if ( $disabled_dates ) {
										$disabled_dates = explode( ',', $disabled_dates );
										foreach ( $disabled_dates as $key => $value ) {
											if ( ! $value ) {
												continue;
											}
											$value = str_replace( '.', '-', $value );
											$value = str_replace( '/', '-', $value );
											$value = explode( '-', $value );
											if ( count( $value ) !== 3 ) {
												continue;
											}
											switch ( $format ) {
												case '0':
												case '2':
												case '4':
													$value = $value[2] . '-' . $value[1] . '-' . $value[0];
													break;
												case '1':
												case '3':
												case '5':
													$value = $value[2] . '-' . $value[0] . '-' . $value[1];
													break;
											}
											if ( is_array( $value ) ) {
												continue;
											}
											$value_to_date = date_create( $value );
											if ( ! $value_to_date ) {
												continue;
											}
											$value                  = date_format( $value_to_date, $date_format );
											$disabled_dates[ $key ] = $value;
										}
										$disabled_dates = implode( ',', $disabled_dates );

									}
									$enabled_only_dates = $this->get_builder_element( $_prefix . 'enabled_only_dates', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									if ( $enabled_only_dates ) {
										$enabled_only_dates = explode( ',', $enabled_only_dates );
										foreach ( $enabled_only_dates as $key => $value ) {
											if ( ! $value ) {
												continue;
											}
											$value = str_replace( '.', '-', $value );
											$value = str_replace( '/', '-', $value );
											$value = explode( '-', $value );
											if ( count( $value ) !== 3 ) {
												continue;
											}
											switch ( $format ) {
												case '0':
												case '2':
												case '4':
													$value = $value[2] . '-' . $value[1] . '-' . $value[0];
													break;
												case '1':
												case '3':
												case '5':
													$value = $value[2] . '-' . $value[0] . '-' . $value[1];
													break;
											}
											if ( is_array( $value ) ) {
												continue;
											}
											$value_to_date = date_create( $value );
											if ( ! $value_to_date ) {
												continue;
											}
											$value                      = date_format( $value_to_date, $date_format );
											$enabled_only_dates[ $key ] = $value;
										}
										$enabled_only_dates = implode( ',', $enabled_only_dates );
									}

									if ( $is_enabled ) {
										$this->current_option_features[] = $current_element;
									}

									$repeater  = $this->get_builder_element( $_prefix . 'repeater', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									$connector = $this->get_builder_element( $_prefix . 'connector', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
									if ( '' !== $connector ) {
										$repeater = '';
									}

									if ( ! isset( $builder_element_order[ $_new_type ] ) ) {
										$builder_element_order[ $_new_type ] = 0;
									} else {
										$builder_element_order[ $_new_type ] = $builder_element_order[ $_new_type ] + 1;
									}

									if ( 'header' !== $current_element && 'divider' !== $current_element ) {
										if ( 'variations' === $current_element ) {
											$this->cpf_single_variation_element_id[ $element_uniqueid ] = $this->get_builder_element( $_prefix . 'uniqid', $builder, $current_builder, $current_counter, THEMECOMPLETE_EPO_HELPER()->tm_uniqid(), $current_element, '', $element_uniqueid );
											$variation_element_id                                       = $this->cpf_single_variation_element_id[ $element_uniqueid ];
											$this->cpf_single_variation_section_id[ $element_uniqueid ] = $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_uniqid'];
											$variation_section_id                                       = $this->cpf_single_variation_section_id[ $element_uniqueid ];
										}
										$product_epos_uniqids[] = $element_uniqueid;
										if ( in_array( $_new_type, [ 'select', 'radio', 'checkbox' ], true ) ) {
											$product_epos_choices[ $element_uniqueid ] = array_keys( $_rules_type );
										}

										$shipping_methods_enable             = $this->get_builder_element( $_prefix . 'shipping_methods_enable', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$shipping_methods_enable_logicrules  = $this->get_builder_element( $_prefix . 'shipping_methods_enable_logicrules', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$shipping_methods_disable            = $this->get_builder_element( $_prefix . 'shipping_methods_disable', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										$shipping_methods_disable_logicrules = $this->get_builder_element( $_prefix . 'shipping_methods_disable_logicrules', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid );
										if ( empty( $shipping_methods_enable ) ) {
											$shipping_methods_enable = '';
										}
										if ( empty( $shipping_methods_disable ) ) {
											$shipping_methods_disable = '';
										}
										if ( empty( $shipping_methods_enable_logicrules ) || is_array( $shipping_methods_enable_logicrules ) ) {
											$shipping_methods_enable_logicrules = '';
										} else {
											$shipping_methods_enable_logicrules = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( json_decode( wp_unslash( $shipping_methods_enable_logicrules ) ) );
										}
										if ( empty( $shipping_methods_disable_logicrules ) || is_array( $shipping_methods_disable_logicrules ) ) {
											$shipping_methods_disable_logicrules = '';
										} else {
											$shipping_methods_disable_logicrules = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( json_decode( wp_unslash( $shipping_methods_disable_logicrules ) ) );
										}

										$this->cpf_single[ $element_uniqueid ] =
											array_merge(
												THEMECOMPLETE_EPO_BUILDER()->get_custom_properties( $builder, $_prefix, $_counter, $_elements, $k0, $current_builder, $current_counter, $current_element ),
												$_extra_multiple_choices,
												[
													'internal_name' => $this->get_builder_element( $_prefix . 'internal_name', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'builder' => ( isset( $wpml_is_original_product ) && empty( $wpml_is_original_product ) ) ? $current_builder : $builder,
													'original_builder' => $builder,
													'section' => $_sections_uniqid,
													'type' => $_new_type,
													'size' => $_div_size[ $k0 ],

													'include_tax_for_fee_price_type' => $this->get_builder_element( $_prefix . 'include_tax_for_fee_price_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'tax_class_for_fee_price_type' => $this->get_builder_element( $_prefix . 'tax_class_for_fee_price_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'hide_element_label_in_cart' => $this->get_builder_element( $_prefix . 'hide_element_label_in_cart', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hide_element_value_in_cart' => $this->get_builder_element( $_prefix . 'hide_element_value_in_cart', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hide_element_label_in_order' => $this->get_builder_element( $_prefix . 'hide_element_label_in_order', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hide_element_value_in_order' => $this->get_builder_element( $_prefix . 'hide_element_value_in_order', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hide_element_label_in_floatbox' => $this->get_builder_element( $_prefix . 'hide_element_label_in_floatbox', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hide_element_value_in_floatbox' => $this->get_builder_element( $_prefix . 'hide_element_value_in_floatbox', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'enabled' => $is_enabled,
													'required' => $is_required,
													'replacement_mode' => isset( $_replacement_mode ) ? $_replacement_mode : 'none',
													'swatch_position' => isset( $_swatch_position ) ? $_swatch_position : 'center',
													'use_images' => isset( $_use_images ) ? $_use_images : '',
													'use_colors' => isset( $_use_colors ) ? $_use_colors : '',
													'use_lightbox' => $_use_lightbox,
													'use_url' => $this->get_builder_element( $_prefix . 'use_url', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'items_per_row' => $this->get_builder_element( $_prefix . 'items_per_row', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'items_per_row_r' => [
														'desktop'        => $this->get_builder_element( $_prefix . 'items_per_row', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'tablets_galaxy' => $this->get_builder_element( $_prefix . 'items_per_row_tablets_galaxy', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'tablets'        => $this->get_builder_element( $_prefix . 'items_per_row_tablets', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'tablets_small'  => $this->get_builder_element( $_prefix . 'items_per_row_tablets_small', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'iphone6_plus'   => $this->get_builder_element( $_prefix . 'items_per_row_iphone6_plus', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'iphone6'        => $this->get_builder_element( $_prefix . 'items_per_row_iphone6', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'galaxy'         => $this->get_builder_element( $_prefix . 'items_per_row_samsung_galaxy', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'iphone5'        => $this->get_builder_element( $_prefix . 'items_per_row_iphone5', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
														'smartphones'    => $this->get_builder_element( $_prefix . 'items_per_row_smartphones', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													],

													'label_size' => $this->get_builder_element( $_prefix . 'header_size', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'label' => $this->get_builder_element( $_prefix . 'header_title', $builder, $current_builder, $current_counter, '', $current_element, 'wc_epo_label', $element_uniqueid ),
													'label_position' => $this->get_builder_element( $_prefix . 'header_title_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'label_mode' => $this->get_builder_element( $_prefix . 'header_title_mode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'label_color' => $this->get_builder_element( $_prefix . 'header_title_color', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'description' => $this->get_builder_element( $_prefix . 'header_subtitle', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'description_position' => $this->get_builder_element( $_prefix . 'header_subtitle_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'description_color' => $this->get_builder_element( $_prefix . 'header_subtitle_color', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'divider_type' => $this->get_builder_element( $_prefix . 'divider_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'placeholder' => $this->get_builder_element( $_prefix . 'placeholder', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'min_chars' => $this->get_builder_element( $_prefix . 'min_chars', $builder, $current_builder, $current_counter, false, $current_element, 'wc_epo_global_min_chars', $element_uniqueid ),
													'max_chars' => $this->get_builder_element( $_prefix . 'max_chars', $builder, $current_builder, $current_counter, false, $current_element, 'wc_epo_global_max_chars', $element_uniqueid ),
													'hide_amount' => $this->get_builder_element( $_prefix . 'hide_amount', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'text_before_price' => $this->get_builder_element( $_prefix . 'text_before_price', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'text_after_price' => $this->get_builder_element( $_prefix . 'text_after_price', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'options' => $_options,
													'options_all' => $_options_all,
													'min_price' => $_min_price,
													'max_price' => $_max_price,
													'rules' => $_rules,
													'price_rules' => $_regular_price,
													'rules_filtered' => $_rules_filtered,
													'price_rules_filtered' => $_regular_price_filtered,
													'original_rules_filtered' => $_original_regular_price_filtered,
													'price_rules_type' => $_regular_price_type,
													'rules_type' => $_rules_type,
													'currencies' => $_regular_currencies,
													'price_per_currencies' => $price_per_currencies,
													'lookuptable' => $this->get_builder_element( $_prefix . 'lookuptable', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'lookuptable_x' => $this->get_builder_element( $_prefix . 'lookuptable_x', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'lookuptable_y' => $this->get_builder_element( $_prefix . 'lookuptable_y', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'images' => isset( $_images ) ? $_images : '',
													'imagesc' => isset( $_imagesc ) ? $_imagesc : '',
													'imagesp' => isset( $_imagesp ) ? $_imagesp : '',
													'imagesl' => isset( $_imagesl ) ? $_imagesl : '',
													'color' => isset( $_color ) ? $_color : '',
													'url'  => isset( $_url ) ? $_url : '',

													'cdescription' => ( false !== $_description ) ? $_description : '',
													'extra_multiple_choices' => $_extra_multiple_choices,
													'weight' => $this->get_builder_element( $_prefix . 'weight', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'limit' => $this->get_builder_element( $_prefix . 'limit_choices', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'exactlimit' => $this->get_builder_element( $_prefix . 'exactlimit_choices', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'minimumlimit' => $this->get_builder_element( $_prefix . 'minimumlimit_choices', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'clear_options' => $this->get_builder_element( $_prefix . 'clear_options', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'option_values_all' => isset( $_values_c ) ? $_values_c : [],
													'option_values' => isset( $_values_ce ) ? $_values_ce : [],
													'button_type' => $this->get_builder_element( $_prefix . 'button_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'uniqid' => $element_uniqueid,
													'logicrules' => $logicrules,
													'logic' => $this->get_builder_element( $_prefix . 'logic', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'format' => $format,
													'start_year' => $this->get_builder_element( $_prefix . 'start_year', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'end_year' => $this->get_builder_element( $_prefix . 'end_year', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'min_date' => $this->get_builder_element( $_prefix . 'min_date', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'max_date' => $this->get_builder_element( $_prefix . 'max_date', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'disabled_dates' => $disabled_dates,
													'enabled_only_dates' => $enabled_only_dates,
													'exlude_disabled' => $this->get_builder_element( $_prefix . 'exlude_disabled', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'disabled_weekdays' => $this->get_builder_element( $_prefix . 'disabled_weekdays', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'disabled_months' => $this->get_builder_element( $_prefix . 'disabled_months', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'time_format' => $this->get_builder_element( $_prefix . 'time_format', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'custom_time_format' => $this->get_builder_element( $_prefix . 'custom_time_format', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'min_time' => $this->get_builder_element( $_prefix . 'min_time', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'max_time' => $this->get_builder_element( $_prefix . 'max_time', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'showhour' => $this->get_builder_element( $_prefix . 'showhour', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'showminute' => $this->get_builder_element( $_prefix . 'showminute', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'showsecond' => $this->get_builder_element( $_prefix . 'showsecond', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'translation_hour' => $this->get_builder_element( $_prefix . 'tranlation_hour', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'translation_minute' => $this->get_builder_element( $_prefix . 'tranlation_minute', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'translation_second' => $this->get_builder_element( $_prefix . 'tranlation_second', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'theme' => $this->get_builder_element( $_prefix . 'theme', $builder, $current_builder, $current_counter, 'epo', $current_element, '', $element_uniqueid ),
													'theme_size' => $this->get_builder_element( $_prefix . 'theme_size', $builder, $current_builder, $current_counter, 'medium', $current_element, '', $element_uniqueid ),
													'theme_position' => $this->get_builder_element( $_prefix . 'theme_position', $builder, $current_builder, $current_counter, 'normal', $current_element, '', $element_uniqueid ),

													'translation_day' => $this->get_builder_element( $_prefix . 'tranlation_day', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'translation_month' => $this->get_builder_element( $_prefix . 'tranlation_month', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'translation_year' => $this->get_builder_element( $_prefix . 'tranlation_year', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'default_value' => $default_value,

													'is_cart_fee' => '1' === $_is_price_fee,
													'is_cart_fee_multiple' => isset( $_fee ) ? $_fee : [],
													'class' => $this->get_builder_element( $_prefix . 'class', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'container_id' => $this->get_builder_element( $_prefix . 'container_id', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'show_tooltip' => $show_tooltip,
													'changes_product_image' => isset( $_changes_product_image ) ? $_changes_product_image : '',
													'min'  => $this->get_builder_element( $_prefix . 'min', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'max'  => $this->get_builder_element( $_prefix . 'max', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'freechars' => $this->get_builder_element( $_prefix . 'freechars', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'step' => $this->get_builder_element( $_prefix . 'step', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'pips' => $this->get_builder_element( $_prefix . 'pips', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'noofpips' => $this->get_builder_element( $_prefix . 'noofpips', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'show_picker_value' => $this->get_builder_element( $_prefix . 'show_picker_value', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'quantity' => $this->get_builder_element( $_prefix . 'quantity', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'quantity_min' => $this->get_builder_element( $_prefix . 'quantity_min', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'quantity_max' => $this->get_builder_element( $_prefix . 'quantity_max', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'quantity_step' => $this->get_builder_element( $_prefix . 'quantity_step', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'quantity_default_value' => $this->get_builder_element( $_prefix . 'quantity_default_value', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'mode' => $this->get_builder_element( $_prefix . 'mode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'layout_mode' => $this->get_builder_element( $_prefix . 'layout_mode', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'categoryids' => $this->get_builder_element( $_prefix . 'categoryids', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'productids' => $this->get_builder_element( $_prefix . 'productids', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'priced_individually' => $this->get_builder_element( $_prefix . 'priced_individually', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'order' => $this->get_builder_element( $_prefix . 'order', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'orderby' => $this->get_builder_element( $_prefix . 'orderby', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'disable_epo' => $this->get_builder_element( $_prefix . 'disable_epo', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'shipped_individually' => $this->get_builder_element( $_prefix . 'shipped_individually', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'maintain_weight' => $this->get_builder_element( $_prefix . 'maintain_weight', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'discount' => $this->get_builder_element( $_prefix . 'discount', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'discount_type' => $this->get_builder_element( $_prefix . 'discount_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'discount_exclude_addons' => $this->get_builder_element( $_prefix . 'discount_exclude_addons', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'hiddenin' => $this->get_builder_element( $_prefix . 'hiddenin', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'show_title' => $this->get_builder_element( $_prefix . 'show_title', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),
													'show_title_link' => $this->get_builder_element( $_prefix . 'show_title_link', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),
													'show_price' => $this->get_builder_element( $_prefix . 'show_price', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),
													'show_description' => $this->get_builder_element( $_prefix . 'show_description', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),
													'show_meta' => $this->get_builder_element( $_prefix . 'show_meta', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),
													'show_image' => $this->get_builder_element( $_prefix . 'show_image', $builder, $current_builder, $current_counter, '1', $current_element, '', $element_uniqueid ),

													'repeater' => $repeater,
													'repeater_quantity' => $this->get_builder_element( $_prefix . 'repeater_quantity', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'repeater_min_rows' => $this->get_builder_element( $_prefix . 'repeater_min_rows', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'repeater_max_rows' => $this->get_builder_element( $_prefix . 'repeater_max_rows', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'repeater_button_label' => $this->get_builder_element( $_prefix . 'repeater_button_label', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'connector' => $connector,

													'shipping_methods_enable' => $shipping_methods_enable,
													'shipping_methods_enable_logicrules' => $shipping_methods_enable_logicrules,
													'shipping_methods_disable' => $shipping_methods_disable,
													'shipping_methods_disable_logicrules' => $shipping_methods_disable_logicrules,

													'hide' => $this->get_builder_element( $_prefix . 'hide', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'result_as_price' => $this->get_builder_element( $_prefix . 'result_as_price', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
													'result_label' => $this->get_builder_element( $_prefix . 'result_label', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),

													'validation1' => $this->get_builder_element( $_prefix . 'validation1', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
												]
											);
										$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][] = $this->cpf_single[ $element_uniqueid ];

									} elseif ( 'header' === $current_element ) {
										$product_epos_uniqids[] = $element_uniqueid;

										$this->cpf_single[ $element_uniqueid ] = [
											'internal_name' => $this->get_builder_element( $_prefix . 'internal_name', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'section'      => $_sections_uniqid,
											'type'         => $_new_type,
											'size'         => $_div_size[ $k0 ],
											'required'     => '',
											'enabled'      => $is_enabled,
											'replacement_mode' => 'none',
											'swatch_position' => 'center',
											'use_images'   => '',
											'use_colors'   => '',
											'use_url'      => '',
											'items_per_row' => '',
											'label_size'   => $this->get_builder_element( $_prefix . 'header_size', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'label'        => $this->get_builder_element( $_prefix . 'header_title', $builder, $current_builder, $current_counter, '', $current_element, 'wc_epo_label', $element_uniqueid ),
											'label_position' => $this->get_builder_element( $_prefix . 'header_title_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'label_color'  => $this->get_builder_element( $_prefix . 'header_title_color', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'description'  => $this->get_builder_element( $_prefix . 'header_subtitle', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'description_color' => $this->get_builder_element( $_prefix . 'header_subtitle_color', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'description_position' => $this->get_builder_element( $_prefix . 'header_subtitle_position', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'divider_type' => '',
											'placeholder'  => '',
											'max_chars'    => '',
											'hide_amount'  => '',
											'options'      => $_options,
											'options_all'  => $_options_all,
											'min_price'    => $_min_price,
											'max_price'    => $_max_price,
											'rules'        => $_rules,
											'price_rules'  => $_regular_price,
											'rules_filtered' => $_rules_filtered,
											'price_rules_filtered' => $_regular_price_filtered,
											'price_rules_type' => $_regular_price_type,
											'rules_type'   => $_rules_type,
											'images'       => '',
											'limit'        => '',
											'exactlimit'   => '',
											'minimumlimit' => '',
											'option_values' => [],
											'button_type'  => '',
											'class'        => $this->get_builder_element( 'header_class', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'uniqid'       => $this->get_builder_element( 'header_uniqid', $builder, $current_builder, $current_counter, THEMECOMPLETE_EPO_HELPER()->tm_uniqid(), $current_element, '', $element_uniqueid ),
											'logicrules'   => $logicrules,
											'logic'        => $this->get_builder_element( 'header_logic', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'format'       => '',
											'start_year'   => '',
											'end_year'     => '',
											'translation_day' => '',
											'translation_month' => '',
											'translation_year' => '',
											'show_tooltip' => '',
											'changes_product_image' => '',
											'min'          => '',
											'max'          => '',
											'step'         => '',
											'pips'         => '',

										];

										$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][] = $this->cpf_single[ $element_uniqueid ];

									} elseif ( 'divider' === $current_element ) {
										$product_epos_uniqids[] = $element_uniqueid;

										$this->cpf_single[ $element_uniqueid ] = [
											'internal_name' => $this->get_builder_element( $_prefix . 'internal_name', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'section'      => $_sections_uniqid,
											'type'         => $_new_type,
											'size'         => $_div_size[ $k0 ],
											'required'     => '',
											'enabled'      => $is_enabled,
											'replacement_mode' => 'none',
											'swatch_position' => 'center',
											'use_images'   => '',
											'use_colors'   => '',
											'use_url'      => '',
											'items_per_row' => '',
											'label_size'   => '',
											'label'        => '',
											'label_color'  => '',
											'label_position' => '',
											'description'  => '',
											'description_color' => '',
											'divider_type' => $this->get_builder_element( $_prefix . 'divider_type', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'placeholder'  => '',
											'max_chars'    => '',
											'hide_amount'  => '',
											'options'      => $_options,
											'options_all'  => $_options_all,
											'min_price'    => $_min_price,
											'max_price'    => $_max_price,
											'rules'        => $_rules,
											'price_rules'  => $_regular_price,
											'rules_filtered' => $_rules_filtered,
											'price_rules_filtered' => $_regular_price_filtered,
											'price_rules_type' => $_regular_price_type,
											'rules_type'   => $_rules_type,
											'images'       => '',
											'limit'        => '',
											'exactlimit'   => '',
											'minimumlimit' => '',
											'option_values' => [],
											'button_type'  => '',
											'class'        => $this->get_builder_element( 'divider_class', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'uniqid'       => $this->get_builder_element( 'divider_uniqid', $builder, $current_builder, $current_counter, THEMECOMPLETE_EPO_HELPER()->tm_uniqid(), $current_element, '', $element_uniqueid ),
											'logicrules'   => $logicrules,
											'logic'        => $this->get_builder_element( 'divider_logic', $builder, $current_builder, $current_counter, '', $current_element, '', $element_uniqueid ),
											'format'       => '',
											'start_year'   => '',
											'end_year'     => '',
											'translation_day' => '',
											'translation_month' => '',
											'trasnlation_year' => '',
											'show_tooltip' => '',
											'changes_product_image' => '',
											'min'          => '',
											'max'          => '',
											'step'         => '',
											'pips'         => '',
										];

										$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][] = $this->cpf_single[ $element_uniqueid ];
									}
								}
							}

							$_helper_counter = $_helper_counter + $_sections[ $_s ];

							if ( $post_id !== $original_product_id ) {

								if ( is_array( $tm_meta_product_ids ) ) {
									foreach ( $variations_for_conditional_logic as $variation_id ) {
										if ( in_array( $variation_id, $tm_meta_product_ids ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
											$rule             = [];
											$rule['section']  = $variation_section_id; // this will be addeed correctly later.
											$rule['element']  = 0;
											$rule['operator'] = 'is';
											$rule['value']    = floatval( THEMECOMPLETE_EPO_WPML()->get_current_id( $variation_id, 'product', null, 'product_variation' ) );
											if ( ! isset( $extra_section_logic[ $priority ] ) ) {
												$extra_section_logic[ $priority ] = [];
											}
											if ( ! isset( $extra_section_logic[ $priority ][ $tmcp_id ] ) ) {
												$extra_section_logic[ $priority ][ $tmcp_id ] = [];
											}
											if ( ! isset( $extra_section_logic[ $priority ][ $tmcp_id ][ $_s ] ) ) {
												$extra_section_logic[ $priority ][ $tmcp_id ][ $_s ] = [
													'section'         => $_sections_uniqid,
													'toggle'          => 'show',
													'sections_logic'  => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic'],
													'sections_logicrules' => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'],
													'rules_to_add'    => [],
												];
											}
											$extra_section_logic[ $priority ][ $tmcp_id ][ $_s ]['rules_to_add'][] = $rule;
										}
									}
								}

								if ( is_array( $tm_meta_product_exclude_ids ) ) {
									foreach ( $variations_for_conditional_logic as $variation_id ) {
										if ( in_array( $variation_id, $tm_meta_product_exclude_ids ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
											$rule             = [];
											$rule['section']  = $variation_section_id; // this will be addeed correctly later.
											$rule['element']  = 0;
											$rule['operator'] = 'is';
											$rule['value']    = floatval( THEMECOMPLETE_EPO_WPML()->get_current_id( $variation_id, 'product', null, 'product_variation' ) );
											if ( ! isset( $extra_section_hide_logic[ $priority ] ) ) {
												$extra_section_hide_logic[ $priority ] = [];
											}
											if ( ! isset( $extra_section_hide_logic[ $priority ][ $tmcp_id ] ) ) {
												$extra_section_hide_logic[ $priority ][ $tmcp_id ] = [];
											}
											if ( ! isset( $extra_section_hide_logic[ $priority ][ $tmcp_id ][ $_s ] ) ) {
												$extra_section_hide_logic[ $priority ][ $tmcp_id ][ $_s ] = [
													'section'         => $_sections_uniqid,
													'toggle'          => 'hide',
													'sections_logic'  => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic'],
													'sections_logicrules' => $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'],
													'rules_to_add'    => [],
												];
											}
											$extra_section_hide_logic[ $priority ][ $tmcp_id ][ $_s ]['rules_to_add'][] = $rule;

										}
									}
								}
							}
						}
					}

					if ( ! empty( $templates ) ) {
						foreach ( $global_epos[ $priority ][ $tmcp_id ]['sections'] as $_s => $sections_data ) {
							if ( isset( $sections_data['elements'] ) ) {
								foreach ( $sections_data['elements'] as $element_key_index => $element_data ) {
									if ( ! isset( $element_data['builder'] ) || ! isset( $element_data['uniqid'] ) ) {
										continue;
									}
									$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][ $element_key_index ]['builder'] = $builder;
									$this->cpf_single[ $element_data['uniqid'] ] = $global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['elements'][ $element_key_index ];
								}
							}
						}
					}
				}
			}
		}

		if ( $variation_section_id ) {
			foreach ( $extra_section_logic as $priority => $priority_data ) {
				foreach ( $priority_data as $tmcp_id => $_s_data ) {
					foreach ( $_s_data as $_s => $logic_data ) {
						$has_logic    = $logic_data['sections_logic'];
						$rules_to_add = array_map(
							function ( $element ) use ( $variation_section_id ) {
								$element['section'] = $variation_section_id;
								return $element;
							},
							$logic_data['rules_to_add']
						);

						if ( $has_logic ) {
							$current_section_logic = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( json_decode( wp_unslash( $logic_data['sections_logicrules'] ) ) );
							$current_section_logic = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( $current_section_logic );
							if ( is_array( $current_section_logic ) ) {
								$current_toggle = $current_section_logic['toggle'];
								if ( 'show' === $current_toggle ) {
									// For each of the rules to add
									// create a new set of the original rules
									// and add the current rule to the start.
									$combinations = [];
									foreach ( $rules_to_add as $rule ) {
										foreach ( $current_section_logic['rules'] as $original_rule ) {
											$combinations[] = array_merge( [ $rule ], $original_rule );
										}
									}
									$current_section_logic['rules'] = array_reduce(
										$combinations,
										function ( $carry, $item ) {
											return array_merge( $carry, [ $item ] );
										},
										[]
									);
								} elseif ( 'hide' === $current_toggle ) {
									$rules_to_add = array_map(
										function ( $element ) {
											$element['operator'] = 'isnot';
											return $element;
										},
										$rules_to_add
									);

									$current_section_logic['rules'] = array_merge( $current_section_logic['rules'], [ $rules_to_add ] );
								}
							}

							$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'] = wp_json_encode( $current_section_logic );

						} else {
							$section   = $logic_data['section'];
							$toggle    = $logic_data['toggle'];
							$new_logic = [
								'section' => $section,
								'toggle'  => $toggle,
								'rules'   => array_map(
									function ( $element ) {
										return [ $element ];
									},
									$rules_to_add
								),
							];
							$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'] = wp_json_encode( $new_logic );
						}

						$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic'] = '1';
					}
				}
			}
			foreach ( $extra_section_hide_logic as $priority => $priority_data ) {
				foreach ( $priority_data as $tmcp_id => $_s_data ) {
					foreach ( $_s_data as $_s => $logic_data ) {
						$has_logic    = $logic_data['sections_logic'];
						$rules_to_add = array_map(
							function ( $element ) use ( $variation_section_id ) {
								$element['section'] = $variation_section_id;
								return $element;
							},
							$logic_data['rules_to_add']
						);

						if ( $has_logic ) {
							$current_section_logic = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( json_decode( wp_unslash( $logic_data['sections_logicrules'] ) ) );
							$current_section_logic = THEMECOMPLETE_EPO_CONDITIONAL_LOGIC()->convert_rules( $current_section_logic );
							if ( is_array( $current_section_logic ) ) {
								$current_toggle = $current_section_logic['toggle'];
								if ( 'show' === $current_toggle ) {
									$rules_to_add = array_map(
										function ( $element ) {
											$element['operator'] = 'isnot';
											return $element;
										},
										$rules_to_add
									);
									// For each of the rules to add
									// create a new set of the original rules
									// and add the current rule to the start.
									$combinations = [];
									foreach ( $rules_to_add as $rule ) {
										foreach ( $current_section_logic['rules'] as $original_rule ) {
											$combinations[] = array_merge( [ $rule ], $original_rule );
										}
									}
									$current_section_logic['rules'] = array_reduce(
										$combinations,
										function ( $carry, $item ) {
											return array_merge( $carry, [ $item ] );
										},
										[]
									);
								} elseif ( 'hide' === $current_toggle ) {
									$current_section_logic['rules'] = array_merge( $current_section_logic['rules'], [ $rules_to_add ] );
								}
							}

							$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'] = wp_json_encode( $current_section_logic );

						} else {
							$section   = $logic_data['section'];
							$toggle    = $logic_data['toggle'];
							$new_logic = [
								'section' => $section,
								'toggle'  => $toggle,
								'rules'   => array_map(
									function ( $element ) {
										return [ $element ];
									},
									$rules_to_add
								),
							];
							$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logicrules'] = wp_json_encode( $new_logic );
						}

						$global_epos[ $priority ][ $tmcp_id ]['sections'][ $_s ]['sections_logic'] = '1';
					}
				}
			}

			if ( empty( $extra_section_logic )
				&& 1 === count( $global_epos )
				&& isset( $global_epos[1000] )
				&& isset( $global_epos[1000][ $post_id ] )
				&& isset( $global_epos[1000][ $post_id ]['sections'] )
				&& 1 === count( $global_epos[1000][ $post_id ]['sections'] )
				&& isset( $global_epos[1000][ $post_id ]['sections'][0] )
				&& (int) 1 === (int) $global_epos[1000][ $post_id ]['sections'][0]['total_elements']
				&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'] )
				&& 1 === count( $global_epos[1000][ $post_id ]['sections'][0]['elements'] )
				&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0] )
				&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['type'] )
				&& 'variations' === $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['type']
				&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder'] )
				&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder']['variations_disabled'] )
				&& (int) 1 === (int) $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder']['variations_disabled']
			) {
				$global_epos = [];
			}

			if ( ( isset( $wpml_is_original_product ) && empty( $wpml_is_original_product ) ) ) {
				if ( empty( $extra_section_logic )
					&& 1 === count( $global_epos )
					&& isset( $global_epos[1000] )
					&& isset( $global_epos[1000][ $post_original_id ] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'] )
					&& 1 === count( $global_epos[1000][ $post_original_id ]['sections'] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'] )
					&& (int) 1 === (int) $global_epos[1000][ $post_original_id ]['sections'][0]['total_elements']
					&& 1 === count( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['type'] )
					&& 'variations' === $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['type']
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder'] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder']['variations_disabled'] )
					&& (int) 1 === (int) $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder']['variations_disabled']
				) {
					$global_epos = [];
				}
			}
		}

		$variations_disabled       = false;
		$isset_variations_disabled = ( isset( $global_epos[1000] )
									&& isset( $global_epos[1000][ $post_id ] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder'] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder']['variations_disabled'] ) );

		if ( ( isset( $wpml_is_original_product ) && empty( $wpml_is_original_product ) ) ) {
			$isset_variations_disabled = ( isset( $global_epos[1000] )
				&& isset( $global_epos[1000][ $post_original_id ] )
				&& isset( $global_epos[1000][ $post_original_id ]['sections'][0] )
				&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'] )
				&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0] )
				&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder'] )
				&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder']['variations_disabled'] ) );
		}
		if ( $isset_variations_disabled ) {
			$variations_disabled = ( isset( $global_epos[1000][ $post_id ] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder'] )
									&& isset( $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder']['variations_disabled'] )
									&& (int) 1 === (int) $global_epos[1000][ $post_id ]['sections'][0]['elements'][0]['builder']['variations_disabled'] );

			if ( ( isset( $wpml_is_original_product ) && empty( $wpml_is_original_product ) ) ) {
				$variations_disabled = ( isset( $global_epos[1000] )
					&& isset( $global_epos[1000][ $post_original_id ] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder'] )
					&& isset( $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder']['variations_disabled'] )
					&& (int) 1 === (int) $global_epos[1000][ $post_original_id ]['sections'][0]['elements'][0]['original_builder']['variations_disabled'] );
			}
		}

		if ( $not_isset_global_post ) {
			unset( $GLOBALS['post'] );
			if ( wp_doing_ajax() && $not_isset_request_post_id ) {
				unset( $_REQUEST['post_id'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}
		}
		return [
			'global'               => $global_epos,
			'price'                => $epos_prices,
			'variation_element_id' => $variation_element_id,
			'variation_section_id' => $variation_section_id,
			'variations_disabled'  => $variations_disabled,
			'raw_epos'             => $raw_epos,
			'product_epos_uniqids' => $product_epos_uniqids,
			'product_epos_choices' => $product_epos_choices,
		];
	}

	/**
	 * Return date format data for the date element
	 *
	 * @param string $format The format code.
	 *
	 * @since 6.1
	 * @return array<string>
	 */
	public function get_date_format( $format = '0' ) {
		$date_format         = 'd/m/Y';
		$sep                 = '/';
		$element_date_format = 'dd/mm/yy';
		$date_placeholder    = 'dd/mm/yyyy';
		$date_mask           = '00/00/0000';

		switch ( $format ) {
			case '0':
				$date_format         = 'd/m/Y';
				$sep                 = '/';
				$element_date_format = 'dd/mm/yy';
				$date_placeholder    = 'dd/mm/yyyy';
				$date_mask           = '00/00/0000';
				break;
			case '1':
				$date_format         = 'm/d/Y';
				$sep                 = '/';
				$element_date_format = 'mm/dd/yy';
				$date_placeholder    = 'mm/dd/yyyy';
				$date_mask           = '00/00/0000';
				break;
			case '2':
				$date_format         = 'd.m.Y';
				$sep                 = '.';
				$element_date_format = 'dd.mm.yy';
				$date_placeholder    = 'dd.mm.yyyy';
				$date_mask           = '00.00.0000';
				break;
			case '3':
				$date_format         = 'm.d.Y';
				$sep                 = '.';
				$element_date_format = 'mm.dd.yy';
				$date_placeholder    = 'mm.dd.yyyy';
				$date_mask           = '00.00.0000';
				break;
			case '4':
				$date_format         = 'd-m-Y';
				$sep                 = '-';
				$element_date_format = 'dd-mm-yy';
				$date_placeholder    = 'dd-mm-yyyy';
				$date_mask           = '00-00-0000';
				break;
			case '5':
				$date_format         = 'm-d-Y';
				$sep                 = '-';
				$element_date_format = 'mm-dd-yy';
				$date_placeholder    = 'mm-dd-yyyy';
				$date_mask           = '00-00-0000';
				break;

			case '6':
				$date_format         = 'Y/m/d';
				$sep                 = '/';
				$element_date_format = 'yy/mm/dd';
				$date_placeholder    = 'yyyy/mm/dd';
				$date_mask           = '0000/00/00';
				break;
			case '7':
				$date_format         = 'Y/d/m';
				$sep                 = '/';
				$element_date_format = 'yy/dd/mm';
				$date_placeholder    = 'yyyy/dd/mm';
				$date_mask           = '0000/00/00';
				break;
			case '8':
				$date_format         = 'Y.m.d';
				$sep                 = '.';
				$element_date_format = 'yy.mm.dd';
				$date_placeholder    = 'yyyy.mm.dd';
				$date_mask           = '0000.00.00';
				break;
			case '9':
				$date_format         = 'Y.d.m';
				$sep                 = '.';
				$element_date_format = 'yy.dd.mm';
				$date_placeholder    = 'yyyy.dd.mm';
				$date_mask           = '0000.00.00';
				break;
			case '10':
				$date_format         = 'Y-m-d';
				$sep                 = '-';
				$element_date_format = 'yy-mm-dd';
				$date_placeholder    = 'yyyyy-mm-dd';
				$date_mask           = '0000-00-00';
				break;
			case '11':
				$date_format         = 'Y-d-m';
				$sep                 = '-';
				$element_date_format = 'yy-dd-mm';
				$date_placeholder    = 'yyyy-dd-mm';
				$date_mask           = '0000-00-00';
				break;
		}

		$data = [
			'date_format'         => $date_format,
			'sep'                 => $sep,
			'element_date_format' => $element_date_format,
			'date_placeholder'    => $date_placeholder,
			'date_mask'           => $date_mask,
		];

		return $data;
	}

	/**
	 * Translate $attributes to post names
	 *
	 * @param array<mixed> $attributes Element option choices.
	 * @param string       $type element type.
	 * @param mixed        $field_loop Field loop.
	 * @param string       $form_prefix should be passed with _ if not empty.
	 * @param string       $name_prefix Name prefix.
	 * @param array<mixed> $element The element array.
	 *
	 * @return array<mixed>
	 */
	public function get_post_names( $attributes, $type, $field_loop = '', $form_prefix = '', $name_prefix = '', $element = [] ) {
		$fields = [];
		$loop   = 0;

		$element_object = $this->tm_builder_elements[ $type ];
		if ( ! empty( $attributes ) ) {
			foreach ( $attributes as $key => $attribute ) {
				$name_inc = '';
				if ( ! empty( $element_object->post_name_prefix ) && ! empty( $element_object->type ) ) {
					if ( 'multiple' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {
						$name_inc = 'tmcp_' . $name_prefix . $element_object->post_name_prefix . '_' . $field_loop . $form_prefix;
					} elseif ( 'multipleall' === $element_object->type ) {
						$name_inc = 'tmcp_' . $name_prefix . $element_object->post_name_prefix . '_' . $field_loop . '_' . $loop . $form_prefix;
					}
				}
				$fields[] = $name_inc;
				++$loop;
			}
		} else {
			if ( ! empty( $element_object->type ) && ! empty( $element_object->post_name_prefix ) ) {
				$name_inc = 'tmcp_' . $name_prefix . $element_object->post_name_prefix . '_' . $field_loop . $form_prefix;
				if ( is_array( $element ) && isset( $element['mode'] ) && 'product' !== $element['mode'] && isset( $element['type'] ) && 'product' === $element['type'] && isset( $element['layout_mode'] ) && ( 'checkbox' === $element['layout_mode'] || 'thumbnailmultiple' === $element['layout_mode'] ) ) {
					$name_inc = $name_inc . '_*';
				}
			}

			if ( ! empty( $name_inc ) ) {
				$fields[] = $name_inc;
			}
		}

		return $fields;
	}

	/**
	 * Append name_inc functions (required for condition logic to check if an element is visible)
	 *
	 * @param integer      $post_id The product id.
	 * @param array<mixed> $global_epos The global options array.
	 * @param array<mixed> $product_epos The normal options array.
	 * @param string       $form_prefix The form prefix.
	 * @param string       $add_identifier The identifier (currently not used).
	 *
	 * @return array<mixed>
	 */
	public function tm_fill_element_names( $post_id = 0, $global_epos = [], $product_epos = [], $form_prefix = '', $add_identifier = '' ) {
		$global_price_array = $global_epos;
		$local_price_array  = $product_epos;

		$global_prices = [
			'before' => [],
			'after'  => [],
		];
		foreach ( $global_price_array as $priority => $priorities ) {
			foreach ( $priorities as $pid => $field ) {
				if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {
					foreach ( $field['sections'] as $section_id => $section ) {
						if ( isset( $section['sections_placement'] ) ) {
							$global_prices[ $section['sections_placement'] ][ $priority ][ $pid ]['sections'][ $section_id ] = $section;
						}
					}
				}
			}
		}
		$unit_counter         = 0;
		$field_counter        = 0;
		$element_counter      = 0;
		$connectors           = [];
		$element_type_counter = [];

		// global options before local.
		foreach ( $global_prices['before'] as $priority => $priorities ) {
			foreach ( $priorities as $pid => $field ) {
				$args    = [
					'priority'             => $priority,
					'pid'                  => $pid,
					'unit_counter'         => $unit_counter,
					'field_counter'        => $field_counter,
					'element_counter'      => $element_counter,
					'connectors'           => $connectors,
					'element_type_counter' => $element_type_counter,
				];
				$_return = $this->fill_builder_display( $global_epos, $field, 'before', $args, $form_prefix, $add_identifier );

				$global_epos          = $_return['global_epos'];
				$unit_counter         = $_return['unit_counter'];
				$field_counter        = $_return['field_counter'];
				$element_counter      = $_return['element_counter'];
				$connectors           = $_return['connectors'];
				$element_type_counter = $_return['element_type_counter'];

			}
		}

		// normal (local) options.
		if ( is_array( $local_price_array ) && count( $local_price_array ) > 0 ) {
			$attributes = themecomplete_get_attributes( $post_id );
			if ( is_array( $attributes ) && count( $attributes ) > 0 ) {
				foreach ( $local_price_array['product_epos'] as $field ) {
					if ( isset( $field['name'] ) && isset( $attributes[ $field['name'] ] ) && ! $attributes[ $field['name'] ]['is_variation'] ) {
						$attribute     = $attributes[ $field['name'] ];
						$field_counter = 0;
						if ( $attribute['is_taxonomy'] ) {
							switch ( $field['type'] ) {
								case 'select':
									++$element_counter;
									break;
								case 'radio':
								case 'checkbox':
									++$element_counter;
									break;
							}
						} else {
							switch ( $field['type'] ) {
								case 'select':
									++$element_counter;
									break;
								case 'radio':
								case 'checkbox':
									++$element_counter;
									break;
							}
						}
						++$unit_counter;
					}
				}
			}
		}

		// global options after normal (local).
		foreach ( $global_prices['after'] as $priority => $priorities ) {
			foreach ( $priorities as $pid => $field ) {
				$args    = [
					'priority'             => $priority,
					'pid'                  => $pid,
					'unit_counter'         => $unit_counter,
					'field_counter'        => $field_counter,
					'element_counter'      => $element_counter,
					'connectors'           => $connectors,
					'element_type_counter' => $element_type_counter,
				];
				$_return = $this->fill_builder_display( $global_epos, $field, 'after', $args, $form_prefix, $add_identifier );

				$global_epos          = $_return['global_epos'];
				$unit_counter         = $_return['unit_counter'];
				$field_counter        = $_return['field_counter'];
				$element_counter      = $_return['element_counter'];
				$connectors           = $_return['connectors'];
				$element_type_counter = $_return['element_type_counter'];

			}
		}

		return $global_epos;
	}

	/**
	 * Generates correct html names for the builder fields
	 *
	 * @param array<mixed> $global_epos The global options array.
	 * @param array<mixed> $field The element field array.
	 * @param string       $where Placement of the section 'before' or 'after'.
	 * @param array<mixed> $args Array of arguments.
	 * @param string       $form_prefix The form prefix (shoud be passed with _ if not empty).
	 * @param string       $add_identifier The identifier (currently not used).
	 *
	 * @return array<mixed>
	 */
	public function fill_builder_display( $global_epos, $field, $where, $args, $form_prefix = '', $add_identifier = '' ) {
		$priority             = $args['priority'];
		$pid                  = $args['pid'];
		$unit_counter         = $args['unit_counter'];
		$field_counter        = $args['field_counter'];
		$element_counter      = $args['element_counter'];
		$connectors           = $args['connectors'];
		$element_type_counter = $args['element_type_counter'];

		$cart_fee_name = $this->cart_fee_name;

		if ( isset( $field['sections'] ) && is_array( $field['sections'] ) ) {
			foreach ( $field['sections'] as $_s => $section ) {
				if ( ! isset( $section['sections_placement'] ) || $section['sections_placement'] !== $where ) {
					continue;
				}
				if ( isset( $section['elements'] ) && is_array( $section['elements'] ) ) {
					foreach ( $section['elements'] as $arr_element_counter => $element ) {

						$is_enabled = isset( $element['enabled'] ) ? $element['enabled'] : 2;
						// Currently $no_disabled is disabled by default
						// to allow the conditional logic
						// to work correctly when there is a disabled element.
						if ( '' === $is_enabled || '0' === $is_enabled ) {

							// It is required to increment the counter because
							// it is use on the builder variable which includes disabled elements.
							if ( ! isset( $element_type_counter[ $element['type'] ] ) ) {
								$element_type_counter[ $element['type'] ] = 0;
							}
							++$element_type_counter[ $element['type'] ];

							continue;
						}
						$field_counter = 0;

						if ( ! empty( $add_identifier ) ) {
							$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['add_identifier'] = $add_identifier;
						}
						if ( isset( $this->tm_builder_elements[ $element['type'] ] ) && 'post' === $this->tm_builder_elements[ $element['type'] ]->is_post ) {

							$element_object = $this->tm_builder_elements[ $element['type'] ];

							$c_element_counter = $element_counter;
							if ( isset( $element['connector'] ) && isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
								$c_element_counter = $connectors[ 'c-' . sanitize_key( $element['connector'] ) ];
							}

							if ( 'single' === $element_object->type || 'multipleallsingle' === $element_object->type || 'multiplesingle' === $element_object->type || 'singlemultiple' === $element_object->type ) {

								if ( ! isset( $element_type_counter[ $element['type'] ] ) ) {
									$element_type_counter[ $element['type'] ] = 0;
								}

								$name_inc      = $element_object->post_name_prefix . '_' . $c_element_counter;
								$base_name_inc = $name_inc;

								$is_cart_fee = ! empty( $element['is_cart_fee'] );
								if ( $is_cart_fee ) {
									$name_inc = $cart_fee_name . $name_inc;
								}

								$name_inc = apply_filters( 'wc_epo_name_inc', $name_inc, $base_name_inc, $element, false, false, $element_type_counter[ $element['type'] ] );

								$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['raw_name_inc']        = $name_inc;
								$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['raw_name_inc_prefix'] = ( '' !== $form_prefix ) ? '_' . str_replace( '_', '', $form_prefix ) : '';

								$name_inc = 'tmcp_' . $name_inc . ( ( '' !== $form_prefix ) ? '_' . str_replace( '_', '', $form_prefix ) : '' );
								$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['name_inc']    = $name_inc;
								$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['is_cart_fee'] = $is_cart_fee;

								$global_epos = apply_filters( 'global_epos_fill_builder_display', $global_epos, $priority, $pid, $_s, $arr_element_counter, $element, false, false, false );

								++$element_type_counter[ $element['type'] ];
							} elseif ( 'multipleall' === $element_object->type || 'multiple' === $element_object->type ) {

								$choice_counter = 0;

								if ( ! isset( $element_type_counter[ $element['type'] ] ) ) {
									$element_type_counter[ $element['type'] ] = 0;
								}

								foreach ( $element['options'] as $value => $label ) {

									if ( 'multipleall' === $element_object->type ) {
										$name_inc = $element_object->post_name_prefix . '_' . $c_element_counter . '_' . $field_counter;
									} else {
										$name_inc = $element_object->post_name_prefix . '_' . $c_element_counter;
									}

									$base_name_inc = $name_inc;

									if ( 'checkbox' === $element['type'] ) {
										$is_cart_fee = ! empty( $element['is_cart_fee_multiple'][ $field_counter ] );
									} else {
										$is_cart_fee = ! empty( $element['is_cart_fee'] );
									}
									if ( $is_cart_fee ) {
										$name_inc = $cart_fee_name . $name_inc;
									}

									$name_inc = apply_filters( 'wc_epo_name_inc', $name_inc, $base_name_inc, $element, $value, $choice_counter, $element_type_counter[ $element['type'] ] );

									$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['raw_name_inc'][ $field_counter ]        = $name_inc;
									$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['raw_name_inc_prefix'][ $field_counter ] = ( '' !== $form_prefix ) ? '_' . str_replace( '_', '', $form_prefix ) : '';

									$name_inc = 'tmcp_' . $name_inc . ( ( '' !== $form_prefix ) ? '_' . str_replace( '_', '', $form_prefix ) : '' );
									$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['name_inc'][] = $name_inc;

									$global_epos[ $priority ][ $pid ]['sections'][ $_s ]['elements'][ $arr_element_counter ]['is_cart_fee_multiple'][ $field_counter ] = $is_cart_fee;

									$global_epos = apply_filters( 'global_epos_fill_builder_display', $global_epos, $priority, $pid, $_s, $arr_element_counter, $element, $value, $choice_counter, $element_type_counter[ $element['type'] ] );

									++$choice_counter;

									++$field_counter;

								}

								++$element_type_counter[ $element['type'] ];

							}
							if ( isset( $element['connector'] ) && '' !== $element['connector'] ) {
								if ( ! isset( $connectors[ 'c-' . sanitize_key( $element['connector'] ) ] ) ) {
									++$element_counter;
								}
								$connectors[ 'c-' . sanitize_key( $element['connector'] ) ] = $c_element_counter;
							} else {
								++$element_counter;
							}
						}
					}
				}
			}
			++$unit_counter;
		}

		return [
			'global_epos'          => $global_epos,
			'unit_counter'         => $unit_counter,
			'field_counter'        => $field_counter,
			'element_counter'      => $element_counter,
			'connectors'           => $connectors,
			'element_type_counter' => $element_type_counter,
		];
	}
}

define( 'THEMECOMPLETE_EPO_INCLUDED', 1 );
templates/tm-upload.php000064400000005422150755142450011170 0ustar00<?php
/**
 * The template for displaying the upload element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-upload.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $element_id, $class_label, $style, $name, $fieldtype, $rules, $original_rules, $rules_type, $saved_value, $allowed_mimes, $max_file_size_text ) ) :
	$element_id     = (string) $element_id;
	$class_label    = (string) $class_label;
	$style          = (string) $style;
	$name           = (string) $name;
	$fieldtype      = (string) $fieldtype;
	$rules          = (string) $rules;
	$original_rules = (string) $original_rules;
	$rules_type     = (string) $rules_type;
	$saved_value    = (string) $saved_value;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $style ); ?><?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<span class="cpf-upload-wrap">
		<?php
		if ( ! empty( $upload_text ) ) {
			echo '<span class="cpf-upload-text">' . esc_html( $upload_text ) . '</span>';
		}
		$input_args = [
			'nodiv'   => 1,
			'default' => '',
			'type'    => 'file',
			'tags'    => [
				'id'                  => $element_id,
				'name'                => $name,
				'class'               => $fieldtype . ' tm-epo-field tmcp-upload',
				'data-price'          => '',
				'data-rules'          => $rules,
				'data-original-rules' => $original_rules,
				'data-rulestype'      => $rules_type,
				'data-file'           => $saved_value,
				'accept'              => $allowed_mimes,
			],
		];
		if ( isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);

		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		?>
		</span>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<small class="tc-max-file-size"><?php echo esc_html( $max_file_size_text ); ?></small>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/index.php000064400000000126150755142450010371 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
templates/products/template-hidden.php000064400000011265150755142450014177 0ustar00<?php
/**
 * The template for displaying the product element when the mode is single product
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-hidden.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $layout_mode, $class_label, $element_id, $name, $fieldtype, $placeholder, $priced_individually, $options, $quantity_min ) ) :
	$layout_mode         = (string) $layout_mode;
	$class_label         = (string) $class_label;
	$element_id          = (string) $element_id;
	$name                = (string) $name;
	$fieldtype           = (string) $fieldtype;
	$placeholder         = (string) $placeholder;
	$quantity_min        = (string) $quantity_min;
	$priced_individually = (bool) $priced_individually;

	$checked_option = [];
	?>
<li class="tmcp-field-wrap tc-product-hidden"><div class="tmcp-field-wrap-inner">
	<div class="tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?>">
		<label class="tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<?php
		$input_args = [
			'nodiv'      => 1,
			'type'       => 'input',
			'input_type' => 'checkbox',
			'tags'       => [
				'id'                   => $element_id,
				'name'                 => $name,
				'class'                => $fieldtype . ' tc-epo-field-product tc-epo-field-product-hidden tm-epo-field tmcp-checkbox',
				'data-price'           => '',
				'data-rules'           => '',
				'data-original-rules'  => '',
				'data-placeholder'     => $placeholder,
				'data-no-price-change' => '1',
				'data-no-price'        => ( ! $priced_individually ),
			],
		];

		if ( apply_filters( 'wc_epo_checkbox_print_required_attribute', true ) && isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}

		if ( is_array( $options ) ) {
			foreach ( $options as $option ) {

				$input_args['default'] = $option['value_to_show'];
				if ( ! empty( $option['tax_obj'] ) ) {
					$input_args['tags']['data-tax-obj'] = $option['tax_obj'];
				}

				$checked = false;
				if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
					if ( $option['selected'] === $option['current'] || $quantity_min > 0 ) {
						$checked = true;
						if ( ! isset( $_REQUEST[ $name . '_quantity' ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
							if ( '' === $quantity_min ) {
								$_REQUEST[ $name . '_quantity' ] = 1;
							} else {
								$_REQUEST[ $name . '_quantity' ] = $quantity_min;
							}
						}
					}
				}
				if ( $checked ) {
					$checked_option = $option;
				}
				if ( true === $checked ) {
					$input_args['tags']['checked'] = 'checked';
				}

				if ( isset( $option['data_price'] ) ) {
					$input_args['tags']['data-price'] = $option['data_price'];
				}
				if ( isset( $option['tm_tooltip_html'] ) && ! empty( $option['tm_tooltip_html'] ) ) {
					$input_args['tags']['data-tm-tooltip-html'] = $option['tm_tooltip_html'];
				}
				if ( isset( $option['data_rules'] ) ) {
					$input_args['tags']['data-rules'] = $option['data_rules'];
				}
				if ( isset( $option['data_original_rules'] ) ) {
					$input_args['tags']['data-original-rules'] = $option['data_original_rules'];
				}
				if ( isset( $option['data_rulestype'] ) ) {
					$input_args['tags']['data-rulestype'] = $option['data_rulestype'];
				}
				if ( isset( $option['data_text'] ) ) {
					$input_args['tags']['data-text'] = $option['data_text'];
				}
				if ( isset( $option['data_type'] ) ) {
					$input_args['tags']['data-type'] = $option['data_type'];
				}
				if ( isset( $option['data_hide_amount'] ) ) {
					$input_args['tags']['data-hide-amount'] = $option['data_hide_amount'];
				}
			}
			if ( ! empty( $checked_option ) ) {
				$option = $checked_option;
			}
		}
		if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
			$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
		}
		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		?>
		</label>
		<?php
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php';
		?>
	</div>
</div></li>
<li class="tc-epo-element-product-li-container tm-hidden">
	<?php
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
	?>
</li>
	<?php
endif;
templates/products/template-item.php000064400000011515150755142450013700 0ustar00<?php
/**
 * The template for displaying the product element item alt
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $current_product, $product_id, $product_list_available_variations, $show_image, $priced_individually, $show_title, $show_title_link, $show_price, $args, $show_description, $option, $tm_element_settings, $show_meta ) ) :

	$product_id          = (string) $product_id;
	$show_image          = (string) $show_image;
	$priced_individually = (string) $priced_individually;
	$show_title          = (string) $show_title;
	$show_title_link     = (string) $show_title_link;
	$show_price          = (string) $show_price;
	$show_description    = (string) $show_description;
	$show_meta           = (string) $show_meta;

	$option                            = (array) $option;
	$tm_element_settings               = (array) $tm_element_settings;
	$args                              = (array) $args;
	$product_list_available_variations = (array) $product_list_available_variations;

	do_action( 'wc_epo_before_product_item_container', $current_product );
	$product_permalink = $current_product->is_visible() ? $current_product->get_permalink() : '';

	$product_name = apply_filters( 'wc_epo_associated_product_name', $current_product->get_name(), $current_product, $product_id );

	?>
<div class="tc-epo-element-product-container tm-hidden" data-product_variations="<?php echo esc_attr( $product_list_available_variations[ $product_id ] ); ?>" data-product_id="<?php echo esc_attr( $product_id ); ?>">
	<?php
	if ( $show_image ) {
		echo '<div class="tc-epo-element-product-container-left tcwidth tcwidth-30">';
		wc_get_template(
			'products/template-image.php',
			[
				'product_id'    => $product_id,
				'product_title' => $product_name,
			],
			THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
			THEMECOMPLETE_EPO_DISPLAY()->get_default_path()
		);
		echo '</div>';
	}
	?>
	<div class="<?php echo esc_attr( ( $show_image ) ? 'tc-epo-element-product-container-right tcwidth tcwidth-70' : 'tc-epo-element-product-container-full tcwidth tcwidth-100' ); ?>">
		<div class="tc-epo-element-product-container-cart" data-per_product_pricing="<?php echo esc_attr( $priced_individually ); ?>">
			<?php
			if ( $show_title ) {
				echo '<h4 class="product-title">';
				if ( ! $product_permalink || empty( $show_title_link ) ) {
					echo wp_kses_post( $product_name );
				} else {
					echo wp_kses_post( sprintf( '<a target="_blank" href="%s">%s</a>', esc_url( $product_permalink ), $product_name ) );
				}
				echo '</h4>';
			}
			if ( $show_price && $priced_individually ) {
				echo '<div class="product-price">';
				$discount_applied = isset( $discount_applied ) ? $discount_applied : false;
				$discounted_price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_associated_price_html( $current_product, $args['discount'], $args['discount_type'], $discount_applied );
				echo '<span class="associated-price">' . apply_filters( 'wc_epo_kses', wp_kses_post( $discounted_price ), $discounted_price, false ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
				echo '</div>';
			}
			if ( $show_description ) {
				if ( $current_product->is_type( 'variation' ) ) {
					$description = $current_product->get_description();
				} else {
					$description = $current_product->get_short_description();
				}

				$description = themecomplete_do_shortcode( $description );
				if ( ! empty( $description ) ) {
					echo '<div class="product-description">' . wpautop( apply_filters( 'wc_epo_kses', wp_kses_post( $description ), $description, false ) ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput
				}
			}
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variable.php';
			do_action( 'wc_epo_associated_product_display', $current_product, $tm_element_settings['uniqid'], isset( $tm_element_settings['disable_epo'] ) ? $tm_element_settings['disable_epo'] : '', $priced_individually, $args['discount'], $args['discount_type'], $args['discount_exclude_addons'], $option['counter'], $tm_element_settings['uniqid'] );
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-availability.php';
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity.php';

			if ( $show_meta ) {
				echo '<div class="product-meta">';
				if ( $current_product->get_sku() || $current_product->is_type( 'variable' ) ) {
					$sku = $current_product->get_sku();
					if ( ! $sku ) {
						$sku = esc_html__( 'N/A', 'woocommerce-tm-extra-product-options' );
					}
					echo '<span class="tc-product-sku-wrapper">' . esc_html__( 'SKU:', 'woocommerce-tm-extra-product-options' ) . ' <span class="tc-product-sku">' . esc_html( $sku ) . '</span></span>';
				}
				echo '</div>';
			}
			?>
		</div>
	</div>
</div>
	<?php
	do_action( 'wc_epo_after_product_item_container', $current_product );
	endif;
templates/products/template-container.php000064400000004305150755142450014723 0ustar00<?php
/**
 * The template for displaying the product element container
 *
 * Used by the Thumbnail, Radio and Dropdown layout mode
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $layout_mode, $product_list, $args ) ) :
	$layout_mode  = (string) $layout_mode;
	$product_list = (array) $product_list;
	$args         = (array) $args;
	$can_show     = true;
	if ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
		if ( isset( $product_id ) ) {
			$product_id = absint( $product_id );
			if ( ! isset( $product_list[ $product_id ] ) ) {
				$can_show = false;
			}
		}{}
	}
	?>
<div class="tc-epo-element-product-container-wrap">
	<?php
	if ( $can_show ) {
		foreach ( $product_list as $product_id => $attributes ) {
			add_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );
			$current_product = wc_get_product( $product_id );
			remove_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );

			if ( $args['discount'] && $current_product instanceof WC_Product ) {
				// this is for simple products only
				// variable products discounts are in the files
				// /includes/fields/class-tm-epo-fields-product.php
				// /includes/classes/class-tm-epo-associated-products.php
				// depending on the situation.
				$current_price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $current_product->get_price(), $args['discount'], $args['discount_type'] );
				$current_price = apply_filters( 'wc_epo_remove_current_currency_price', $current_price );
				$current_product->set_sale_price( $current_price );
				$current_product->set_price( $current_price );
				$discount_applied = true;
			}

			if ( ! isset( $option ) || ! isset( $option['_default_value_counter'] ) ) {
				$option['_default_value_counter'] = '0';
				$option['counter']                = '0';
			}

			include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-item.php';
		}
	}

	?>
</div>
	<?php
endif;
templates/products/template-quantity-hidden.php000064400000003734150755142450016055 0ustar00<?php
/**
 * The template for displaying the product element hidden quantity for the builder mode
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $name ) && isset( $quantity_min ) && isset( $quantity_max ) ) {
	$input_id   = uniqid( 'quantity_' );
	$input_name = $name . '_quantity';
	if ( isset( $option ) ) {
		if ( '' !== $option['_default_value_counter'] ) {
			$input_name = $name . '_' . $option['_default_value_counter'] . '_quantity';
		}
		$input_value  = isset( $_REQUEST[ $name . '_quantity' ] ) ? absint( wp_unslash( $_REQUEST[ $name . '_quantity' ] ) ) : $quantity_min; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$input_value  = floatval( $input_value );
		$classes      = [ 'tm-qty', 'tm-bsbb', 'tm-hidden' ];
		$max_value    = floatval( $quantity_max );
		$min_value    = floatval( $quantity_min );
		$step         = 1;
		$inputmode    = apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' );
		$product_name = '';

		$input_args = [
			'nodiv'   => 1,
			'default' => $input_value,
			'type'    => 'hidden',
			'tags'    => [
				'id'       => $input_id,
				'name'     => $input_name,
				'class'    => join( ' ', (array) $classes ),
				'data-min' => $min_value,
				'data-max' => ( 0 < $max_value ) ? $max_value : '',
			],
		];

		if ( ! ( $max_value && $min_value === $max_value ) ) {
			$input_args['type']              = 'number';
			$input_args['tags']['step']      = $step;
			$input_args['tags']['min']       = $min_value;
			$input_args['tags']['max']       = ( 0 < $max_value ) ? $max_value : '';
			$input_args['tags']['title']     = esc_attr__( 'Qty', 'woocommerce-tm-extra-product-options' );
			$input_args['tags']['inputmode'] = $inputmode;
		}
		?>
		<div class="tm-quantity tm-hidden">
		<?php
		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		?>
		</div>
		<?php

	}
}
templates/products/template-quantity-button.php000064400000002173150755142450016131 0ustar00<?php
/**
 * The template for displaying the product element add button
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
$button_class = ' alt';
$text_add     = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_add_button_text_associated_products' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_add_button_text_associated_products' ) : esc_html__( 'Add', 'woocommerce-tm-extra-product-options' );
$text_remove  = ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_button_text_associated_products' ) ) ? THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_remove_button_text_associated_products' ) : esc_html__( 'Remove', 'woocommerce-tm-extra-product-options' );
$button_text  = $text_add;
if ( isset( $input_value ) && $input_value > 0 ) {
	$button_class = '';
	$button_text  = $text_remove;
}
?><button data-add="<?php echo esc_attr( $text_add ); ?>" data-remove="<?php echo esc_attr( $text_remove ); ?>" type="button" class="single_add_to_cart_product button<?php echo esc_attr( $button_class ); ?>"><?php echo esc_html( $button_text ); ?></button>
templates/products/template-thumbnailmultiple.php000064400000011666150755142450016510 0ustar00<?php
/**
 * The template for displaying the product element thumbnails (multiple) for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-thumbnailmultiple.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $options ) && is_array( $options ) && isset( $element_id ) && isset( $layout_mode ) && isset( $name ) && isset( $fieldtype ) && isset( $priced_individually ) ) :
	foreach ( $options as $option_key => $option ) :

		$product_id = $option['value_to_show'];

		$forid   = uniqid( $element_id . '_' );
		$checked = false;
		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			if ( $option['selected'] === $option['current'] ) {
				$checked = true;
			}
		}
		$li_class = isset( $option['li_class'] ) ? ' ' . $option['li_class'] : '';
		?>
		<li class="tmcp-field-wrap tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?><?php echo esc_attr( $li_class ); ?>">
			<div class="tmcp-field-wrap-inner">
				<label class="tm-epo-field-label" for="<?php echo esc_attr( $forid ); ?>">
				<?php
				$input_args = [
					'nodiv'   => 1,
					'default' => $option['_default_value_counter'],
					'type'    => 'hidden',
					'tags'    => [
						'name'  => $name . '_' . $option['_default_value_counter'] . '_counter',
						'class' => 'tc-epo-field-product-counter',
					],
				];
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

				if ( ! empty( $labelclass_start ) ) {
					echo '<span class="tc-epo-style-wrapper ' . esc_attr( $labelclass_start ) . '">';
				}
				$input_args = [
					'nodiv'      => 1,
					'type'       => 'input',
					'default'    => $product_id,
					'input_type' => 'checkbox',
					'tags'       => [
						'id'                   => $forid,
						'name'                 => $name . '_' . $option['_default_value_counter'],
						'class'                => $fieldtype . ' tc-epo-field-product tc-epo-field-product-checkbox tm-epo-field tmcp-checkbox',
						'data-price'           => $option['data_price'],
						'data-price-html'      => $option['data_price_html'],
						'data-rules'           => $option['data_rules'],
						'data-original-rules'  => $option['data_original_rules'],
						'data-rulestype'       => $option['data_rulestype'],
						'data-no-price-change' => '1',
						'data-no-price'        => ( ! $priced_individually ),
					],
				];
				if ( ! empty( $option['tax_obj'] ) ) {
					$input_args['tags']['data-tax-obj'] = $option['tax_obj'];
				}
				if ( apply_filters( 'wc_epo_checkbox_print_required_attribute', true ) && isset( $required ) && ! empty( $required ) ) {
					$input_args['tags']['required'] = true;
				}
				if ( isset( $option['data_type'] ) && isset( $option['_default_value_counter'] ) ) {
					$input_args['tags']['data-counter'] = $option['_default_value_counter'];
					$input_args['tags']['data-type']    = $option['data_type'];
				}
				if ( true === $checked ) {
					$input_args['tags']['checked'] = 'checked';
				}
				if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
					$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
				}
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

				if ( ! empty( $labelclass ) ) {
					echo '<span';
					echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
					echo ' data-for="' . esc_attr( $forid ) . '"></span>';
				}
				if ( ! empty( $labelclass_end ) ) {
					echo '</span>';
				}

				$product_title = $option['text'];

				wc_get_template(
					'products/template-image.php',
					[
						'product_id'    => $product_id,
						'product_title' => $product_title,
					],
					THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
					THEMECOMPLETE_EPO_DISPLAY()->get_default_path()
				);

				echo '<span class="tc-label-wrap">';
				echo '<span class="tc-label tm-label">';
				echo '<span class="tc-label-inner tcwidth tcwidth-100">';
				if ( '' !== $product_title ) {
					echo '<span class="tc-label-text">';
					echo apply_filters( 'wc_epo_kses', wp_kses_post( $product_title ), $product_title, false ); // phpcs:ignore WordPress.Security.EscapeOutput
					echo '</span>';
				}
				echo '</span>';
				echo '</span>';
				echo '</span>';
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php';
				?>
				</label>
				<div class="tc-epo-element-product-li-container tm-hidden">
				<?php
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
				?>
				</div>
			</div>
		</li>
		<?php
	endforeach;
endif;
templates/products/template-thumbnail.php000064400000011443150755142450014725 0ustar00<?php
/**
 * The template for displaying the product element thumbnails for the builder mode
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $options ) && is_array( $options ) && isset( $element_id ) && isset( $layout_mode ) && isset( $name ) && isset( $fieldtype ) && isset( $priced_individually ) ) :
	$checked_option = [];
	?>
	<li class="tc-epo-element-product-li-container tm-hidden">
	<?php
	foreach ( $options as $option_key => $option ) {
		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			if ( $option['selected'] === $option['current'] ) {
				$checked_option = $option;
				break;
			}
		}
	}
	if ( ! empty( $checked_option ) ) {
		$option = $checked_option;
	}
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
	?>
	</li>
	<?php
	foreach ( $options as $option_key => $option ) :
		$product_id = $option['value_to_show'];

		$forid   = uniqid( $element_id . '_' );
		$checked = false;
		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			if ( $option['selected'] === $option['current'] ) {
				$checked = true;
			}
		}
		$li_class = isset( $option['li_class'] ) ? ' ' . $option['li_class'] : '';
		?>
		<li class="tmcp-field-wrap tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?><?php echo esc_attr( $li_class ); ?>">
			<div class="tmcp-field-wrap-inner">
				<label class="tm-epo-field-label" for="<?php echo esc_attr( $forid ); ?>">
				<?php
				if ( ! empty( $labelclass_start ) ) {
					echo '<span class="tc-epo-style-wrapper ' . esc_attr( $labelclass_start ) . '">';
				}
				$input_args = [
					'nodiv'      => 1,
					'type'       => 'input',
					'default'    => $product_id,
					'input_type' => 'radio',
					'tags'       => [
						'id'                   => $forid,
						'name'                 => $name,
						'class'                => $fieldtype . ' tc-epo-field-product tm-epo-field tmcp-radio',
						'data-price'           => $option['data_price'],
						'data-price-html'      => $option['data_price_html'],
						'data-rules'           => $option['data_rules'],
						'data-original-rules'  => $option['data_original_rules'],
						'data-rulestype'       => $option['data_rulestype'],
						'data-no-price-change' => '1',
						'data-no-price'        => ( ! $priced_individually ),
					],
				];
				if ( ! empty( $option['tax_obj'] ) ) {
					$input_args['tags']['data-tax-obj'] = $option['tax_obj'];
				}
				if ( isset( $option['counter'] ) && isset( $option['data_type'] ) ) {
					$input_args['tags']['data-counter'] = $option['counter'];
					$input_args['tags']['data-type']    = $option['data_type'];
				}
				if ( apply_filters( 'wc_epo_radio_print_required_attribute', true ) && isset( $required ) && ! empty( $required ) ) {
					$input_args['tags']['required'] = true;
				}
				if ( true === $checked ) {
					$input_args['tags']['checked'] = 'checked';
				}
				if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
					$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
				}
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

				if ( ! empty( $labelclass ) ) {
					echo '<span';
					echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
					echo ' data-for="' . esc_attr( $forid ) . '"></span>';
				}
				if ( ! empty( $labelclass_end ) ) {
					echo '</span>';
				}

				$product_title = $option['text'];

				wc_get_template(
					'products/template-image.php',
					[
						'product_id'    => $product_id,
						'product_title' => $product_title,
					],
					THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
					THEMECOMPLETE_EPO_DISPLAY()->get_default_path()
				);

				echo '<span class="tc-label-wrap">';
				echo '<span class="tc-label tm-label">';
				echo '<span class="tc-label-inner tcwidth tcwidth-100">';
				if ( '' !== $option['text'] ) {
					echo '<span class="tc-label-text">';
					echo apply_filters( 'wc_epo_kses', wp_kses_post( $option['text'] ), $option['text'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
					echo '</span>';
				}
				echo '</span>';
				echo '</span>';
				echo '</span>';

				$_product = wc_get_product( $product_id );
				do_action( 'wc_epo_product_thumbnail_before_price', $_product, $product_id );
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
				do_action( 'wc_epo_product_thumbnail_before_quantity', $_product, $product_id );
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php';
				do_action( 'wc_epo_product_thumbnail_after_quantity', $_product, $product_id );
				unset( $_product );
				?>
				</label>
			</div>
		</li>
		<?php
	endforeach;
endif;
templates/products/template-image.php000064400000003473150755142450014030 0ustar00<?php
/**
 * The template for displaying the product element image
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-image
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $product_id ) ) {
	$image_data    = false;
	$image_post_id = '';
	$image_title   = '';
	$image_link    = '';
	if ( has_post_thumbnail( $product_id ) ) {
		$image_post_id = get_post_thumbnail_id( $product_id );
		if ( false !== $image_post_id ) {
			if ( isset( $product_title ) ) {
				$image_title = $product_title;
			} else {
				$image_title = get_the_title( $image_post_id );
			}
			$image_data = wp_get_attachment_image_src( $image_post_id, 'full' );

			if ( ! $image_data ) {
				$image_data = false;
			} else {
				$image_link = $image_data[0];
			}
		}
	}
	if ( false !== $image_data ) {
		?>
		<figure class="tc-product-image">
		<?php
		echo get_the_post_thumbnail(
			$product_id,
			'shop_catalog',
			[
				'title'                   => $image_title,
				'data-caption'            => get_post_field( 'post_excerpt', (int) $image_post_id ),
				'data-large_image'        => $image_link,
				'data-large_image_width'  => $image_data[1],
				'data-large_image_height' => $image_data[2],
			]
		);
		?>
		</figure>
		<?php
	} else {
		?>
		<figure class="tc-product-image woocommerce-product-gallery__image--placeholder">
		<img class="wp-post-image" src="<?php echo esc_url( wc_placeholder_img_src() ); ?>" alt="<?php esc_attr_e( 'Awaiting product image', 'woocommerce-tm-extra-product-options' ); ?>"/>
		</figure>
		<?php
	}
}
templates/products/template-variable.php000064400000005703150755142450014531 0ustar00<?php
/**
 * The template for displaying the product element variation table for the builder mode
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;
if ( ! isset( $attributes ) ) {
	$attributes = [];
}
$attribute_keys = array_keys( $attributes );

if ( count( $attributes ) > 0 && isset( $name ) && isset( $option ) && isset( $current_product ) ) :

	$this_name = $name;
	if ( isset( $layout_mode ) ) {
		if ( 'checkbox' === $layout_mode || 'thumbnailmultiple' === $layout_mode ) {
			$this_name = $name . '_' . $option['_default_value_counter'];
		}
	}

	?>
	<div class="tc-epo-element-variable-product">
		<table class="tc-epo-element-variations" cellspacing="0">
			<tbody>
			<?php
			foreach ( $attributes as $attribute_name => $attribute_options ) :
				$uniqid = uniqid( sanitize_title( $this_name . '_' . $attribute_name ) . '_' );
				?>
				<tr class="tc-epo-element-variable-product-attribute">
					<td class="label">
					<label class="tc-epo-element-variable-product-attribute-label" for="<?php echo esc_attr( $uniqid ); ?>"><?php echo wc_attribute_label( $attribute_name ); // phpcs:ignore WordPress.Security.EscapeOutput ?></label>
					</td>
					<td class="value">
						<?php

						$_REQUEST['asscociated_name']                      = $this_name;
						$_REQUEST[ 'asscociated_cart_data_' . $this_name ] = isset( $cart_data ) ? $cart_data : [];

						$attribute_selected =
							isset( $cart_data ) && isset( $cart_data[ $this_name . '_attribute_' . sanitize_title( $attribute_name ) ] )
								? $cart_data[ $this_name . '_attribute_' . sanitize_title( $attribute_name ) ]
								: ( isset( $_REQUEST[ $this_name . '_attribute_' . sanitize_title( $attribute_name ) ] ) // phpcs:ignore WordPress.Security.NonceVerification.Recommended
								? wp_unslash( $_REQUEST[ $this_name . '_attribute_' . sanitize_title( $attribute_name ) ] ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
								: false );
						wc_dropdown_variation_attribute_options(
							[
								'class'     => 'tc-epo-variable-product-selector tc-epo-element-variable-product-attribute-dropdown',
								'options'   => $attribute_options,
								'attribute' => $attribute_name,
								'product'   => $current_product,
								'selected'  => $attribute_selected,
								'name'      => $this_name . '_attribute_' . sanitize_title( $attribute_name ),
								'id'        => $uniqid,
							]
						);
						echo end( $attribute_keys ) === $attribute_name ? wp_kses_post( '<a class="tc-epo-element-variable-reset-variations" href="#">' . esc_html__( 'Clear', 'woocommerce-tm-extra-product-options' ) . '</a>' ) : '';
						?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>
		<div class="tc-epo-element-single-variation-wrap">
			<div class="woocommerce-variation tc-epo-element-single-variation"></div>
		</div>
	</div>
	<?php
endif;
templates/products/index.php000064400000000126150755142450012234 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
templates/products/template-variation.php000064400000001434150755142450014735 0ustar00<?php
/**
 * The template for displaying the product element variation id
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $name, $variation_id ) ) :
	$name         = (string) $name;
	$variation_id = (string) $variation_id;

	$input_name = $name;
	if ( isset( $option ) && isset( $option['_default_value_counter'] ) && '' !== $option['_default_value_counter'] ) {
		$input_name .= '_' . $option['_default_value_counter'];
	}
	$input_name .= '_variation_id';
	?>
<div class="tc-epo-element-product-container-variation-id tm-hidden">
	<input type="hidden" class="product-variation-id" name="<?php echo esc_attr( $input_name ); ?>" value="<?php echo esc_attr( $variation_id ); ?>">
</div>
	<?php
endif;
templates/products/template-container-ajax.php000064400000003775150755142450015656 0ustar00<?php
/**
 * The template for displaying the product html via ajax
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $product_id, $product_list, $template ) ) :
	$product_id   = absint( $product_id );
	$product_list = (array) $product_list;
	$template     = (string) $template;


	$attributes = $product_list[ $product_id ];
	add_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );
	$current_product = wc_get_product( $product_id );
	remove_filter( 'woocommerce_product_variation_title_include_attributes', [ THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS(), 'woocommerce_product_variation_title_include_attributes' ] );

	if ( $current_product instanceof WC_Product && isset( $_REQUEST['discount'] ) && isset( $_REQUEST['discount_type'] ) && ! empty( $_REQUEST['discount'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		/**
		 * This is for simple products only
		 * variable products discounts are in the files
		 * /includes/fields/class-tm-epo-fields-product.php
		 * /includes/classes/class-tm-epo-associated-products.php
		 * depending on the situation.
		 */
		$current_price = THEMECOMPLETE_EPO_ASSOCIATED_PRODUCTS()->get_discounted_price( $current_product->get_price(), wp_unslash( $_REQUEST['discount'] ), wp_unslash( $_REQUEST['discount_type'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Recommended
		$current_price = apply_filters( 'wc_epo_remove_current_currency_price', $current_price );
		$current_product->set_sale_price( $current_price );
		$current_product->set_price( $current_price );
		$discount_applied = true;
	}

	require apply_filters( 'wc_epo_template_path_product_element', THEMECOMPLETE_EPO_TEMPLATE_PATH ) . apply_filters( 'wc_epo_template_element', 'products/' . $template . '.php', 'product', [] );
endif;
templates/products/template-radio.php000064400000010455150755142450014042 0ustar00<?php
/**
 * The template for displaying the product element radio buttons for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-radio.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
$saved_option = [];
if ( isset( $options ) && is_array( $options ) && isset( $element_id ) && isset( $layout_mode ) && isset( $name ) && isset( $fieldtype ) && isset( $priced_individually ) ) :
	foreach ( $options as $option_key => $option ) :

		$product_id = $option['value_to_show'];

		$forid   = uniqid( $element_id . '_' );
		$checked = false;
		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			if ( $option['selected'] === $option['current'] ) {
				$checked      = true;
				$saved_option = $option;
			}
		}
		?>
		<li class="tmcp-field-wrap tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?>">
			<div class="tmcp-field-wrap-inner">
				<div class="tc-col tc-field-label-wrap">
				<label class="tc-col tm-epo-field-label" for="<?php echo esc_attr( $forid ); ?>">
				<?php
				echo '<span class="tc-label-wrap">';
				if ( ! empty( $labelclass_start ) ) {
					echo '<span class="tc-epo-style-wrapper tc-first ' . esc_attr( $labelclass_start ) . ' tc-radio">';
				}

				$input_args = [
					'nodiv'      => 1,
					'type'       => 'input',
					'default'    => $product_id,
					'input_type' => 'radio',
					'tags'       => [
						'id'                   => $forid,
						'name'                 => $name,
						'class'                => $fieldtype . ' tc-epo-field-product tm-epo-field tmcp-radio',
						'data-price'           => $option['data_price'],
						'data-price-html'      => $option['data_price_html'],
						'data-rules'           => $option['data_rules'],
						'data-original-rules'  => $option['data_original_rules'],
						'data-rulestype'       => $option['data_rulestype'],
						'data-no-price-change' => '1',
						'data-no-price'        => ( ! $priced_individually ),
					],
				];
				if ( ! empty( $option['tax_obj'] ) ) {
					$input_args['tags']['data-tax-obj'] = $option['tax_obj'];
				}
				if ( apply_filters( 'wc_epo_radio_print_required_attribute', true ) && isset( $required ) && ! empty( $required ) ) {
					$input_args['tags']['required'] = true;
				}
				if ( isset( $option['counter'] ) && isset( $option['data_type'] ) ) {
					$input_args['tags']['data-counter'] = $option['counter'];
					$input_args['tags']['data-type']    = $option['data_type'];
				}
				if ( true === $checked ) {
					$input_args['tags']['checked'] = 'checked';
				}
				if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
					$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
				}
				echo '<span class="tc-input-wrap tc-epo-style-space">';
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
				echo '</span>';
				if ( ! empty( $labelclass ) ) {
					echo '<span';
					echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
					echo ' data-for="' . esc_attr( $forid ) . '"></span>';
				}
				if ( ! empty( $labelclass_end ) ) {
					echo '</span>';
				}
				echo '<span class="tc-col tc-label radio-image-label">';
				echo '<span class="tc-label-inner tcwidth tcwidth-100">';
				if ( '' !== $option['text'] ) {
					echo '<span class="tc-label-text">';
					echo apply_filters( 'wc_epo_kses', wp_kses_post( $option['text'] ), $option['text'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
					echo '</span>';
				}
				echo '</span>';
				echo '</span>';
				echo '</span>';
				?>
				</label>
				<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
				</div>
				<?php include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php'; ?>
			</div>
		</li>
		<?php
	endforeach;
endif;
?>
<li class="tc-epo-element-product-li-container tm-hidden">
<?php
$option = $saved_option;
require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
?>
</li>
templates/products/template-availability.php000064400000001151150755142450015407 0ustar00<?php
/**
 * The template for displaying the product availability
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

if ( ! isset( $current_product ) || ! $current_product || $current_product->is_type( 'variable' ) ) {
	return;
}

$availability = $current_product->get_availability();

if ( ! empty( $availability['availability'] ) ) {
	wc_get_template(
		'single-product/stock.php',
		[
			'product'      => $current_product,
			'class'        => $availability['class'],
			'availability' => $availability['availability'],
		]
	);
}
templates/products/template-quantity.php000064400000010446150755142450014622 0ustar00<?php
/**
 * The template for displaying the product element quantity alt for the builder mode
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $option ) && isset( $name ) && isset( $quantity_min ) && isset( $quantity_max ) && isset( $current_product ) && isset( $operation_mode ) ) {
	$input_id = uniqid( 'quantity_' );
	if ( isset( $_REQUEST['name'] ) || '' === $option['_default_value_counter'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		$input_name = $name . '_quantity';
	} else {
		$input_name = $name . '_' . $option['_default_value_counter'] . '_quantity';
	}
	$input_value    = isset( $_REQUEST[ $input_name ] ) ? absint( wp_unslash( $_REQUEST[ $input_name ] ) ) : $quantity_min; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$input_value    = floatval( $input_value );
	$input_value_o  = $input_value;
	$classes        = [ 'tm-qty-alt', 'tm-bsbb' ];
	$max_value      = floatval( $quantity_max );
	$max_value_o    = $max_value;
	$min_value      = floatval( $quantity_min );
	$min_value_o    = $min_value;
	$step           = 1;
	$inputmode      = apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' );
	$product_name   = '';
	$total_stock    = $current_product->is_type( 'variable' ) ? null : $current_product->get_stock_quantity();
	$allow_quantity = true;
	if ( ! $current_product->is_type( 'variable' ) ) {
		if ( ! $current_product->is_in_stock() || ( $current_product->managing_stock() && $total_stock < $min_value ) ) {
			if ( $total_stock > 0 ) {
				$min_value   = $min_value - $total_stock;
				$input_value = $min_value;
			} else {
				$min_value      = $total_stock;
				$input_value    = $total_stock;
				$allow_quantity = false;
			}
		}

		if ( $current_product->managing_stock() && ( $total_stock < $max_value || '' === $quantity_max ) ) {
			$max_value = $total_stock;
		}

		if ( $current_product->managing_stock() && $current_product->backorders_allowed() ) {
			$allow_quantity = true;
			$max_value      = $max_value_o;
			$min_value      = $min_value_o;
			$input_value    = $input_value_o;
			if ( $input_value < 0 ) {
				$input_value = $min_value;
			}
		}
	}

	if ( $allow_quantity ) {
		if ( $max_value && $min_value === $max_value && $input_value === $max_value ) {

			echo '<div class="tm-quantity-alt tm-hidden">';
			echo '<div class="quantity">';

			$input_args = [
				'nodiv'   => 1,
				'default' => $min_value,
				'type'    => 'hidden',
				'tags'    => [
					'id'       => $input_id,
					'name'     => $input_name,
					'class'    => join( ' ', (array) $classes ),
					'data-min' => $min_value,
					'data-max' => $max_value,
				],
			];
			if ( '' !== $min_value ) {
				$input_args['tags']['min'] = $min_value;
			}
			if ( $max_value ) {
				$input_args['tags']['max'] = ( 0 < $max_value ) ? $max_value : '';
			}
			THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
			echo '</div>';

			if ( 'product' === $operation_mode ) {
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-button.php';
			}

			echo '</div>';

		} else {

			echo '<div class="tm-quantity-alt">';
			echo '<div class="quantity">';

				do_action( 'wc_epo_before_product_quantity_input_field' );

				$input_args = [
					'nodiv'   => 1,
					'default' => $input_value,
					'type'    => 'number',
					'tags'    => [
						'id'        => $input_id,
						'name'      => $input_name,
						'class'     => join( ' ', (array) $classes ),
						'step'      => $step,
						'inputmode' => $inputmode,
						'data-min'  => $min_value,
						'data-max'  => ( 0 < $max_value ) ? $max_value : '',
						'size'      => '4',
						'title'     => esc_html__( 'Qty', 'woocommerce-tm-extra-product-options' ),
					],
				];
				if ( '' !== $min_value ) {
					$input_args['tags']['min'] = $min_value;
				}
				if ( $max_value ) {
					$input_args['tags']['max'] = ( 0 < $max_value ) ? $max_value : '';
				}
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

				do_action( 'wc_epo_after_product_quantity_input_field' );
				echo '</div>';

				if ( 'product' === $operation_mode ) {
					include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-button.php';
				}
				echo '</div>';

		}
	}
}
templates/products/template-checkbox.php000064400000011346150755142450014532 0ustar00<?php
/**
 * The template for displaying the product element checkboxes for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-checkbox.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( ! isset( $options ) ) {
	$options = [];
}
if ( is_array( $options ) && isset( $element_id ) && isset( $layout_mode ) && isset( $name ) && isset( $fieldtype ) && isset( $priced_individually ) ) :
	foreach ( $options as $option_key => $option ) :

		$product_id = $option['value_to_show'];

		$forid   = uniqid( $element_id . '_' );
		$checked = false;
		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			if ( $option['selected'] === $option['current'] ) {
				$checked = true;
			}
		}
		?>
		<li class="tmcp-field-wrap tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?>">
			<div class="tmcp-field-wrap-inner">
				<div class="tc-col tc-field-label-wrap">
				<label class="tc-col tm-epo-field-label" for="<?php echo esc_attr( $forid ); ?>">
				<?php
				echo '<span class="tc-label-wrap">';

				$input_args = [
					'nodiv'   => 1,
					'default' => $option['_default_value_counter'],
					'type'    => 'hidden',
					'tags'    => [
						'name'  => $name . '_' . $option['_default_value_counter'] . '_counter',
						'class' => 'tc-epo-field-product-counter',
					],
				];
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

				if ( ! empty( $labelclass_start ) ) {
					echo '<span class="tc-epo-style-wrapper tc-first ' . esc_attr( $labelclass_start ) . ' tc-checkbox">';
				}
				$input_args = [
					'nodiv'      => 1,
					'type'       => 'input',
					'default'    => $product_id,
					'input_type' => 'checkbox',
					'tags'       => [
						'id'                   => $forid,
						'name'                 => $name . '_' . $option['_default_value_counter'],
						'class'                => $fieldtype . ' tc-epo-field-product tc-epo-field-product-checkbox tm-epo-field tmcp-checkbox',
						'data-price'           => $option['data_price'],
						'data-price-html'      => $option['data_price_html'],
						'data-rules'           => $option['data_rules'],
						'data-original-rules'  => $option['data_original_rules'],
						'data-rulestype'       => $option['data_rulestype'],
						'data-no-price-change' => '1',
						'data-no-price'        => ( ! $priced_individually ),
					],
				];
				if ( ! empty( $option['tax_obj'] ) ) {
					$input_args['tags']['data-tax-obj'] = $option['tax_obj'];
				}
				if ( apply_filters( 'wc_epo_checkbox_print_required_attribute', true ) && isset( $required ) && ! empty( $required ) ) {
					$input_args['tags']['required'] = true;
				}
				if ( isset( $option['data_type'] ) && isset( $option['_default_value_counter'] ) ) {
					$input_args['tags']['data-counter'] = $option['_default_value_counter'];
					$input_args['tags']['data-type']    = $option['data_type'];
				}
				if ( true === $checked ) {
					$input_args['tags']['checked'] = 'checked';
				}
				if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
					$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
				}
				echo '<span class="tc-input-wrap tc-epo-style-space">';
				THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
				echo '</span>';
				if ( ! empty( $labelclass ) ) {
					echo '<span';
					echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
					echo ' data-for="' . esc_attr( $forid ) . '"></span>';
				}
				if ( ! empty( $labelclass_end ) ) {
					echo '</span>';
				}
				echo '<span class="tc-col tc-label checkbox-image-label">';
				echo '<span class="tc-label-inner tcwidth tcwidth-100">';
				if ( '' !== $option['text'] ) {
					echo '<span class="tc-label-text">';
					echo apply_filters( 'wc_epo_kses', wp_kses_post( $option['text'] ), $option['text'], false ); // phpcs:ignore WordPress.Security.EscapeOutput
					echo '</span>';
				}
				echo '</span>';
				echo '</span>';
				echo '</span>';
				?>
				</label>
				<?php
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php';
				?>
				<div class="tc-epo-element-product-li-container tm-hidden">
				<?php
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
				include THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
				?>
				</div>
				</div>
			</div>
		</li>
		<?php
	endforeach;
endif;
?>
templates/products/template-dropdown.php000064400000010260150755142450014572 0ustar00<?php
/**
 * The template for displaying the product element dropdown for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/products/template-dropdown.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates/Products
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $layout_mode, $class_label, $element_id, $name, $fieldtype, $placeholder, $priced_individually, $options ) ) :
	$layout_mode         = (string) $layout_mode;
	$class_label         = (string) $class_label;
	$element_id          = (string) $element_id;
	$name                = (string) $name;
	$fieldtype           = (string) $fieldtype;
	$placeholder         = (string) $placeholder;
	$priced_individually = (bool) $priced_individually;


	$checked_option = [];
	?>
<li class="tmcp-field-wrap tc-epo-element-product-holder tc-epo-element-product-<?php echo esc_attr( $layout_mode ); ?>"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
	<?php
	$select_array = [
		'class' => $fieldtype . ' tc-epo-field-product tm-epo-field tmcp-select',
		'id'    => $element_id,
		'name'  => $name,
		'atts'  => [
			'data-price'           => '',
			'data-rules'           => '',
			'data-original-rules'  => '',
			'data-placeholder'     => $placeholder,
			'data-no-price-change' => '1',
			'data-no-price'        => ( ! $priced_individually ),
		],
	];

	if ( isset( $required ) && ! empty( $required ) ) {
		$select_array['required'] = true;
	}
	if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
		$select_array['atts'] = array_merge( $select_array['atts'], $element_data_attr );
	}

	$select_options = [];
	if ( is_array( $options ) ) {
		foreach ( $options as $option ) {
			$current_option = [
				'text'  => $option['text'],
				'value' => $option['value_to_show'],
				'attS'  => [],
			];

			if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
				$current_option['selected'] = $option['selected'];
				if ( $option['selected'] === $option['current'] ) {
					$checked_option = $option;
				}
			}
			if ( isset( $option['css_class'] ) ) {
				$current_option['class'] = 'tc-multiple-option tc-select-option' . $option['css_class'];
			}
			if ( isset( $option['data_price'] ) ) {
				$current_option['atts']['data-price'] = $option['data_price'];
			}
			if ( isset( $option['tm_tooltip_html'] ) && ! empty( $option['tm_tooltip_html'] ) ) {
				$current_option['atts']['data-tm-tooltip-html'] = $option['tm_tooltip_html'];
			}
			if ( isset( $option['data_rules'] ) ) {
				$current_option['atts']['data-rules'] = $option['data_rules'];
			}
			if ( isset( $option['data_original_rules'] ) ) {
				$current_option['atts']['data-original-rules'] = $option['data_original_rules'];
			}
			if ( isset( $option['data_rulestype'] ) ) {
				$current_option['atts']['data-rulestype'] = $option['data_rulestype'];
			}
			if ( isset( $option['data_text'] ) ) {
				$current_option['atts']['data-text'] = $option['data_text'];
			}
			if ( isset( $option['data_type'] ) ) {
				$current_option['atts']['data-type'] = $option['data_type'];
			}
			if ( isset( $option['data_hide_amount'] ) ) {
				$current_option['atts']['data-hide-amount'] = $option['data_hide_amount'];
			}
			$current_option['atts']['data-no-price'] = ( ! $priced_individually );

			$select_options[] = $current_option;
		}
		if ( ! empty( $checked_option ) ) {
			$option = $checked_option;
		}
	}

	THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, '/n', false, true );
	?>
	</label>
	<?php
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-quantity-hidden.php';
	?>
</div></li>
<li class="tc-epo-element-product-li-container tm-hidden">
	<?php
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-variation.php';
	require THEMECOMPLETE_EPO_TEMPLATE_PATH . 'products/template-container.php';
	?>
</li>
	<?php
endif;
templates/tm-element-quantity.php000064400000006725150755142450013220 0ustar00<?php
/**
 * The template for displaying the quantity selector of an option
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-element-quantity.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $tm_element_settings ) && ! empty( $quantity ) && isset( $posted_name ) && isset( $get_posted_key ) && isset( $quantity_name ) ) {

	$__min_value     = $tm_element_settings['quantity_min'];
	$__max_value     = $tm_element_settings['quantity_max'];
	$__step          = floatval( $tm_element_settings['quantity_step'] );
	$__default_value = $tm_element_settings['quantity_default_value'];

	if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_reset_options_after_add' ) ) {
		if ( isset( $_REQUEST[ $posted_name . '_quantity' ] ) && ( ! isset( $checked ) || ! empty( $checked ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$attribute_quantity = map_deep( wp_unslash( $_REQUEST[ $posted_name . '_quantity' ] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( is_array( $attribute_quantity ) && isset( $attribute_quantity[ $get_posted_key ] ) ) {
				$attribute_quantity = $attribute_quantity[ $get_posted_key ];
			}
			$__default_value = $attribute_quantity;
		}
	}

	$__default_value = apply_filters( 'wc_epo_quantity_default_value', $__default_value, $tm_element_settings, isset( $value ) ? $value : null, isset( $choice_counter ) ? $choice_counter : null );

	if ( '' === $__default_value || ! is_numeric( $__default_value ) ) {
		$__default_value = 1;
	}

	if ( '' !== $__min_value ) {
		$__min_value = floatval( $__min_value );
	} else {
		$__min_value = 0;
	}
	if ( '' !== $__max_value ) {
		$__max_value = floatval( $__max_value );
	}

	if ( empty( $__step ) ) {
		$__step = 'any';
	}

	if ( is_numeric( $__max_value ) && $__min_value > $__max_value ) {
		if ( 'any' === $__step ) {
			$__max_value = $__min_value + 1;
		} else {
			$__max_value = $__min_value + $__step;
		}
	}
	if ( is_numeric( $__max_value ) && $__default_value > $__max_value ) {
		$__default_value = $__max_value;
	}
	if ( $__default_value < $__min_value ) {
		$__default_value = $__min_value;
	}

	$quantity_class = 'tm-quantity tc-' . $quantity;
	switch ( $quantity ) {
		case 'left':
		case 'right':
			$quantity_class .= ' tc-col-auto';
			break;
		case 'top':
		case 'bottom':
			$quantity_class .= ' tcwidth tcwidth-100';
			break;
	}
	?>
	<span class="<?php echo esc_attr( $quantity_class ); ?>">
		<?php do_action( 'wc_epo_quantity_selector_before_input', $tm_element_settings ); ?>
		<input type="number" step="<?php echo esc_attr( (string) $__step ); ?>" 
		<?php
		if ( is_numeric( $__min_value ) ) {
			echo ' min="' . esc_attr( (string) $__min_value ) . '"';
		}
		if ( is_numeric( $__max_value ) ) {
			echo ' max="' . esc_attr( (string) $__max_value ) . '"';
		}
		?>
		name="<?php echo esc_attr( $quantity_name ); ?>" value="<?php echo esc_attr( (string) $__default_value ); ?>" 
		title="<?php echo esc_attr_x( 'Qty', 'element quantity input tooltip', 'woocommerce-tm-extra-product-options' ); ?>" 
		class="tm-qty tc-element-qty tm-bsbb"> 
		<?php do_action( 'wc_epo_quantity_selector_after_input', $tm_element_settings ); ?>
	</span>
	<?php
}
templates/tm-dynamic.php000064400000007754150755142450011342 0ustar00<?php
/**
 * The template for displaying the dynamic calculations element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-dynamic.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4.3
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $name, $fieldtype, $rules, $original_rules, $rules_type, $operation_mode, $hide, $result_label, $formula, $calculation_type ) ) :
	$class_label      = (string) $class_label;
	$element_id       = (string) $element_id;
	$name             = (string) $name;
	$fieldtype        = (string) $fieldtype;
	$rules            = (string) $rules;
	$original_rules   = (string) $original_rules;
	$rules_type       = (string) $rules_type;
	$operation_mode   = (string) $operation_mode;
	$hide             = (string) $hide;
	$result_label     = (string) $result_label;
	$formula          = (string) $formula;
	$calculation_type = (string) $calculation_type;

	if ( ! isset( $textbeforeprice ) ) {
		$textbeforeprice = '';
	}
	if ( ! isset( $textafterprice ) ) {
		$textafterprice = '';
	}
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<?php
		$input_args = [
			'nodiv'      => 1,
			'default'    => 1,
			'type'       => 'input',
			'input_type' => 'hidden',
			'tags'       => [
				'id'                    => $element_id,
				'name'                  => $name,
				'value'                 => '1',
				'class'                 => $fieldtype . ' tm-epo-field tmcp-dynamic tmcp-textfield ' . str_replace( '_', '-', $operation_mode ),
				'data-price'            => '',
				'data-rules'            => $rules,
				'data-original-rules'   => $original_rules,
				'data-rulestype'        => $rules_type,
				'data-formula'          => $formula,
				'data-calculation-type' => $calculation_type,
			],
		];
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		if ( 'dynamic_product_price' !== $operation_mode && 'override_product_price' !== $operation_mode ) {
			$input_args['tags']['disabled'] = 'disabled';
		}

		if ( ! empty( $tm_element_settings['result_as_price'] ) ) {
			$input_args['tags']['class'] .= ' result-as-price';
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);

		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );

		if ( empty( $hide ) && '' !== $result_label ) {
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $result_label ), $result_label, false ); // phpcs:ignore WordPress.Security.EscapeOutput
		}
		?>
		</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php if ( empty( $hide ) && ( 'calculation' === $operation_mode || 'change_product_weight' === $operation_mode ) ) : ?>
	<span class="tc-col-auto tc-result-wrap">
		<?php if ( '' !== $textbeforeprice ) : ?>
		<span class="before-amount"><?php echo apply_filters( 'wc_epo_kses', esc_html( $textbeforeprice ), $textbeforeprice ); // phpcs:ignore WordPress.Security.EscapeOutput ?></span>
		<?php endif; ?>
		<span class="tc-result"></span>
		<?php if ( '' !== $textafterprice ) : ?>
			<span class="after-amount"><?php echo apply_filters( 'wc_epo_kses', esc_html( $textafterprice ), $textafterprice ); // phpcs:ignore WordPress.Security.EscapeOutput ?></span>
		<?php endif; ?>
		</span>
	</span>
	<?php endif; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-builder-element-end.php000064400000005133150755142450013524 0ustar00<?php
/**
 * The template for displaying the end of an element in the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-element-end.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $repeater_quantity, $element_type, $repeater, $repeater_button_label ) ) :
	$repeater_quantity     = (string) $repeater_quantity;
	$element_type          = (string) $element_type;
	$repeater              = (string) $repeater;
	$repeater_button_label = (string) $repeater_button_label;

	$do_end      = true;
	$do_repeater = true;
	if ( $repeater_quantity ) {
		$do_repeater = false;
	}
	if ( isset( $get_posted_key_count ) && isset( $get_posted_key ) && $get_posted_key_count > 1 ) {
		if ( $get_posted_key_count !== $get_posted_key + 1 ) {
			$do_end = false;
		}
		if ( $get_posted_key_count !== $get_posted_key + 1 ) {
			$do_repeater = false;
		}
	}
	?>
	<?php if ( ! in_array( $element_type, [ 'header', 'divider' ], true ) && isset( $tm_element_settings ) && empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $tm_element_settings['type'] ]->no_frontend_display ) ) : ?>
	</ul>
		<?php
		do_action( 'tm_after_builder_ul', $tm_element_settings );
		?>
		<?php if ( $repeater && ! $repeater_quantity ) : ?>
	<div class="tc-repeater-delete tc-hidden"><button type="button" class="tmicon tcfa tcfa-times delete"></button></div>
		<?php endif; ?>
		<?php if ( $repeater ) : ?>
	</div>
		<?php endif; ?>
		<?php if ( $do_end ) : ?>
	</div>
		<?php endif; ?>
		<?php if ( $do_repeater && isset( $tm_element_settings['repeater'] ) && ! empty( $tm_element_settings['repeater'] ) ) : ?>
	<div class="tc-cell tcwidth tcwidth-100 tc-repeater-wrap">
		<button type="button" class="tc-repeater-add button">
			<?php
			echo ( '' !== $repeater_button_label ) ? wp_kses_post( $repeater_button_label ) : ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_add_button_text_repeater' ) ) ? wp_kses_post( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_add_button_text_repeater' ) ) : esc_html__( 'Add', 'woocommerce-tm-extra-product-options' ) ); // phpcs:ignore WordPress.Security.EscapeOutput
			?>
		</button>
	</div>
		<?php endif; ?>
	<?php endif; ?>
	<?php if ( $do_end ) : ?>
	</div>
	</div>
</div>
	<?php endif; ?>
	<?php
	do_action( 'tm_after_builder_element', isset( $tm_element_settings ) ? $tm_element_settings : [] );
endif;
templates/tm-color.php000064400000005456150755142450011031 0ustar00<?php
/**
 * The template for displaying the color picker element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-color.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $element_id, $class_label, $get_default_value, $name, $fieldtype, $rules, $original_rules, $rules_type ) ) :
	$element_id        = (string) $element_id;
	$class_label       = (string) $class_label;
	$get_default_value = (string) $get_default_value;
	$name              = (string) $name;
	$fieldtype         = (string) $fieldtype;
	$rules             = (string) $rules;
	$original_rules    = (string) $original_rules;
	$rules_type        = (string) $rules_type;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
	<?php
	$input_args = [
		'nodiv'   => 1,
		'default' => $get_default_value,
		'type'    => 'text',
		'tags'    => [
			'id'                         => $element_id,
			'name'                       => $name,
			'class'                      => $fieldtype . ' tm-color-picker tm-epo-field tmcp-textfield',
			'data-price'                 => '',
			'data-rules'                 => $rules,
			'data-original-rules'        => $original_rules,
			'data-rulestype'             => $rules_type,
			'data-show-input'            => 'true',
			'data-show-initial'          => 'true',
			'data-allow-empty'           => 'true',
			'data-show-alpha'            => 'false',
			'data-show-palette'          => 'false',
			'data-clickout-fires-change' => 'false',
			'data-show-buttons'          => 'true',
			'data-preferred-format'      => 'hex',
		],
	];
	if ( isset( $required ) && ! empty( $required ) ) {
		$input_args['tags']['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$input_args['tags']['data-tax-obj'] = $tax_obj;
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$input_args['tags']['data-no-price'] = true;
	}

	$input_args = apply_filters(
		'wc_element_input_args',
		$input_args,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
	endif;
templates/_price.php000064400000001370150755142450010525 0ustar00<?php
/**
 * The template for displaying the price of an option
 * (Internal use only)
 *
 * This template is NOT meant to be overridden
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 * phpcs:disable WordPress.Files.FileName
 */

defined( 'ABSPATH' ) || exit;

$located = wc_locate_template( 'tm-element-price.php', THEMECOMPLETE_EPO_DISPLAY()->get_template_path(), apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_DISPLAY()->get_default_path(), null, null ) );

if ( ! file_exists( $located ) ) {
	/* translators: %s: file name */
	wc_doing_it_wrong( __FUNCTION__, sprintf( esc_html__( '%s does not exist.', 'woocommerce' ), '<code>' . $located . '</code>' ), '2.1' );

	return;
}

require $located;
templates/tm-element-choice-description.php000064400000003246150755142450015110 0ustar00<?php
/**
 * The template for displaying the description of the option choice
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-element-choice-description.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
?>
<?php
if ( isset( $tm_element_settings ) && isset( $tm_element_settings['cdescription'] ) && isset( $field_counter ) && isset( $tm_element_settings['cdescription'][ $field_counter ] ) ) {
	if ( ! empty( $tm_element_settings['cdescription'][ $field_counter ] ) || ( ( isset( $tm_element_settings['cdescription'] ) && is_array( $tm_element_settings['cdescription'] ) && count( $tm_element_settings['cdescription'] ) > 1 ) && ( isset( $tm_element_settings['type'] ) && 'select' === $tm_element_settings['type'] ) ) ) {
		if ( 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_description_inline' ) ) {
			echo '<div class="tcwidth tcwidth-100 tc-inline-description">' . apply_filters( 'wc_epo_kses', wp_kses_post( $tm_element_settings['cdescription'][ $field_counter ] ), $tm_element_settings['cdescription'][ $field_counter ] ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput
		} else {
			echo '<i data-tm-tooltip-html="' . esc_attr( apply_filters( 'wc_epo_kses', $tm_element_settings['cdescription'][ $field_counter ], $tm_element_settings['cdescription'][ $field_counter ] ) ) . '" class="tm-tooltip tc-tooltip tcfa tcfa-question-circle tc-epo-style-space"></i>';
		}
	}
}
templates/_choice_description.php000064400000001423150755142450013257 0ustar00<?php
/**
 * The template for displaying the description of the option choice
 * (Internal use only)
 *
 * This template is NOT meant to be overridden
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 * phpcs:disable WordPress.Files.FileName
 */

defined( 'ABSPATH' ) || exit;

$located = wc_locate_template( 'tm-element-choice-description.php', THEMECOMPLETE_EPO_DISPLAY()->get_template_path(), apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_DISPLAY()->get_default_path(), null, null ) );

if ( ! file_exists( $located ) ) {
	/* translators: %s: file name */
	wc_doing_it_wrong( __FUNCTION__, sprintf( esc_html__( '%s does not exist.', 'woocommerce' ), '<code>' . $located . '</code>' ), '2.1' );

	return;
}

require $located;
templates/cart/cart-item-data.php000064400000005373150755142450013020 0ustar00<?php
/**
 * Cart item data (when outputting non-flat)
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/cart/cart-item-data.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @author  WooThemes
 * @package WooCommerce/Templates
 * @version 2.4.0
 *
 * Modified for Extra Product Options
 */

defined( 'ABSPATH' ) || exit;

$separator = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_separator_cart_text' );
?>
<dl class="tc-epo-metadata variation">
	<?php
	if ( isset( $item_data ) ) :
		foreach ( $item_data as $data ) :
			$is_epo      = false;
			$show_dt     = true;
			$show_dd     = true;
			$class_name  = '';
			$class_value = '';
			if ( isset( $data['tm_label'] ) ) {
				$is_epo      = true;
				$class_name  = 'tc-name ';
				$class_value = 'tc-value ';
			}

			if ( ! isset( $data['display'] ) && isset( $data['value'] ) ) {
				$data['display'] = $data['value'];
			}
			if ( $is_epo && '' === $data['key'] ) {
				$show_dt = false;
			}
			if ( $is_epo && '' === $data['display'] ) {
				$show_dd = false;
			}
			if ( ( 'link' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_cart_field_display' ) && isset( $data['popuplink'] ) ) || ! $show_dd ) {
				$separator = '';
			}

			// $data['key'] and $data['display'] contians HTML code
			// thus the use of wp_kses_post and not esc_html
			?>
			<?php if ( $show_dt ) : ?>
			<dt class="<?php echo esc_attr( sanitize_html_class( $class_name ) ); ?> variation-<?php echo esc_attr( sanitize_html_class( $data['key'] ) ); ?>"><?php echo apply_filters( 'wc_epo_kses', wp_kses_post( $data['key'] ), $data['key'], false ); // phpcs:ignore WordPress.Security.EscapeOutput ?><?php echo esc_html( $separator ); ?></dt>
			<?php else : ?>
			<dt class="<?php echo esc_attr( sanitize_html_class( $class_name ) ); ?> tc-hidden-variation">&nbsp;</dt>
			<?php endif; ?>
			<?php if ( $show_dd ) : ?>
			<dd class="<?php echo esc_attr( sanitize_html_class( $class_value ) ); ?> variation-<?php echo esc_attr( sanitize_html_class( $data['key'] ) ); ?>"><?php echo apply_filters( 'wc_epo_kses', wp_kses_post( wpautop( $data['display'] ) ), wpautop( $data['display'] ), false ); // phpcs:ignore WordPress.Security.EscapeOutput ?></dd>
			<?php else : ?>
			<dd class="<?php echo esc_attr( sanitize_html_class( $class_value ) ); ?> tc-hidden-variation">&nbsp;</dd>
			<?php endif; ?>
		<?php endforeach; ?>
	<?php endif; ?>
</dl>
templates/cart/index.php000064400000000126150755142450011322 0ustar00<?php
/**
 * Direct access security.
 *
 * @package Extra Product Options
 */

die();
templates/tm-builder-start.php000064400000001271150755142450012463 0ustar00<?php
/**
 * The template for displaying the start of the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-start.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $field_id ) ) :

	$field_id = (string) $field_id;
	?>
<li id="<?php echo esc_attr( $field_id ); ?>" class="tm-extra-product-options-field tc-row tc-cell tcwidth tcwidth-100">
	<?php
endif;
templates/tm-builder-section-end.php000064400000001442150755142450013536 0ustar00<?php
/**
 * The template for displaying the end of a section in the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-section-end.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( ! isset( $style ) ) {
	$style = '';
}
echo '</div>';

if ( 'collapse' === $style || 'collapseclosed' === $style || 'accordion' === $style ) {
	echo '</div>';
}
if ( isset( $sections_type ) && 'popup' === $sections_type ) {
	echo '</div>';
}
echo '</div>';
echo '</div></div></div>';
templates/tm-element-price.php000064400000003013150755142450012427 0ustar00<?php
/**
 * The template for displaying the price of an option
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-element-price.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( ! isset( $hide_amount ) || ! isset( $amount ) || ! isset( $original_amount ) ) {
	return;
}

if ( ! isset( $textbeforeprice ) ) {
	$textbeforeprice = '';
}
if ( ! isset( $textafterprice ) ) {
	$textafterprice = '';
}
?>
<?php if ( empty( $hide_amount ) || 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_hide_price_html' ) ) : ?>
<span class="tc-col-auto tc-epo-style-space tc-price-wrap<?php echo ( ! empty( $hide_amount ) ) ? ' tc-hidden' : ''; ?>">
	<?php if ( '' !== $textbeforeprice ) : ?>
	<span class="before-amount"><?php echo apply_filters( 'wc_epo_kses', esc_html( $textbeforeprice ), $textbeforeprice ); // phpcs:ignore WordPress.Security.EscapeOutput ?></span>
	<?php endif; ?>
	<span class="price tc-price">
		<span class="amount"><?php echo esc_html( $amount ); ?></span>
	</span>
	<?php if ( '' !== $textafterprice ) : ?>
		<span class="after-amount"><?php echo apply_filters( 'wc_epo_kses', esc_html( $textafterprice ), $textafterprice ); // phpcs:ignore WordPress.Security.EscapeOutput ?></span>
	<?php endif; ?>
</span>
<?php endif; ?>
templates/_quantity.php000064400000001407150755142450011302 0ustar00<?php
/**
 * The template for displaying the quantity selector of an option
 * (Internal use only)
 *
 * This template is NOT meant to be overridden
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 * phpcs:disable WordPress.Files.FileName
 */

defined( 'ABSPATH' ) || exit;

$located = wc_locate_template( 'tm-element-quantity.php', THEMECOMPLETE_EPO_DISPLAY()->get_template_path(), apply_filters( 'wc_epo_template_path_element', THEMECOMPLETE_EPO_DISPLAY()->get_default_path(), null, null ) );

if ( ! file_exists( $located ) ) {
	/* translators: %s: file name */
	wc_doing_it_wrong( __FUNCTION__, sprintf( esc_html__( '%s does not exist.', 'woocommerce' ), '<code>' . $located . '</code>' ), '2.1' );

	return;
}

require $located;
templates/tm-range.php000064400000006571150755142450011006 0ustar00<?php
/**
 * The template for displaying the range picker element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-range.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $min, $max, $step, $pips, $noofpips, $show_picker_value, $element_id, $get_default_value, $name, $fieldtype, $rules, $original_rules, $rules_type ) ) :
	$min               = (string) $min;
	$max               = (string) $max;
	$step              = (string) $step;
	$pips              = (string) $pips;
	$noofpips          = (string) $noofpips;
	$show_picker_value = (string) $show_picker_value;
	$element_id        = (string) $element_id;
	$get_default_value = (string) $get_default_value;
	$name              = (string) $name;
	$fieldtype         = (string) $fieldtype;
	$rules             = (string) $rules;
	$original_rules    = (string) $original_rules;
	$rules_type        = (string) $rules_type;
	$liclass           = 'tmcp-field-wrap' . ( ( ! empty( $show_picker_value ) ) ? ' tm-show-picker-' . $show_picker_value : '' );
	?>
<li class="<?php echo esc_attr( $liclass ); ?>"><div class="tmcp-field-wrap-inner">
	<?php
	$input_args = [
		'nodiv' => 1,
		'type'  => 'div',
		'tags'  => [
			'class'                  => 'tc-col tm-range-picker',
			'data-min'               => $min,
			'data-max'               => $max,
			'data-step'              => $step,
			'data-pips'              => $pips,
			'data-noofpips'          => $noofpips,
			'data-show-picker-value' => $show_picker_value,
			'data-field-id'          => $element_id,
			'data-start'             => $get_default_value,
		],
	];
	if ( 'yes' === $pips ) {
		$input_args['tags']['class'] .= ' pips';
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$input_args['tags']['data-no-price'] = true;
	}

	$input_args = apply_filters(
		'wc_element_input_args',
		$input_args,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	<label class="tc-col tm-epo-field-label tm-show-picker-value" for="<?php echo esc_attr( $element_id ); ?>"></label>
	<?php
	$input_args = [
		'nodiv'   => 1,
		'default' => $get_default_value,
		'type'    => 'hidden',
		'tags'    => [
			'id'                  => $element_id,
			'name'                => $name,
			'class'               => $fieldtype . ' tm-epo-field tmcp-textfield tmcp-range',
			'data-price'          => '',
			'data-rules'          => $rules,
			'data-original-rules' => $original_rules,
			'data-rulestype'      => $rules_type,
		],
	];
	if ( isset( $required ) && ! empty( $required ) ) {
		$input_args['tags']['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$input_args['tags']['data-tax-obj'] = $tax_obj;
	}
	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-textarea.php000064400000005557150755142450011532 0ustar00<?php
/**
 * The template for displaying the textarea element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-textarea.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $get_default_value, $name, $fieldtype, $rules, $original_rules, $rules_type, $freechars ) ) :
	$class_label       = (string) $class_label;
	$element_id        = (string) $element_id;
	$get_default_value = (string) $get_default_value;
	$name              = (string) $name;
	$fieldtype         = (string) $fieldtype;
	$rules             = (string) $rules;
	$original_rules    = (string) $original_rules;
	$rules_type        = (string) $rules_type;
	$freechars         = (string) $freechars;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
	<?php
	$input_args = [
		'nodiv'   => 1,
		'default' => $get_default_value,
		'type'    => 'textarea',
		'tags'    => [
			'id'                  => $element_id,
			'name'                => $name,
			'class'               => $fieldtype . ' tm-epo-field tmcp-textarea',
			'data-price'          => '',
			'data-rules'          => $rules,
			'data-original-rules' => $original_rules,
			'data-rulestype'      => $rules_type,
			'data-freechars'      => $freechars,
			'rows'                => 5,
			'cols'                => 20,
		],
	];
	if ( isset( $placeholder ) && '' !== $placeholder ) {
		$input_args['tags']['placeholder'] = $placeholder;
	}
	if ( isset( $min_chars ) && '' !== $min_chars ) {
		$input_args['tags']['minlength'] = $min_chars;
	}
	if ( isset( $max_chars ) && '' !== $max_chars ) {
		$input_args['tags']['maxlength'] = $max_chars;
	}
	if ( isset( $required ) && ! empty( $required ) ) {
		$input_args['tags']['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$input_args['tags']['data-tax-obj'] = $tax_obj;
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$input_args['tags']['data-no-price'] = true;
	}

	$input_args = apply_filters(
		'wc_element_input_args',
		$input_args,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-totals.php000064400000013564150755142450011220 0ustar00<?php
/**
 * The template for displaying the final totals box
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-totals.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $classtotalform, $epo_internal_counter, $product_id, $form_prefix, $price, $tc_form_prefix_class, $tc_form_prefix_name, $classcart, $hidden, $tm_epo_final_total_box, $tm_epo_show_final_total, $tm_epo_show_options_total, $forcart, $is_sold_individually, $product_type, $regular_price, $is_on_sale, $product_price_rules, $fields_price_rules, $force_quantity, $price_override, $is_vat_exempt, $non_base_location_prices, $taxable, $tax_rate, $base_tax_rate, $taxes_of_one, $base_taxes_of_one, $modded_taxes_of_one, $tax_string, $tax_display_mode, $prices_include_tax, $args, $variations ) ) :
	$classtotalform            = (string) $classtotalform;
	$epo_internal_counter      = (string) $epo_internal_counter;
	$product_id                = (string) $product_id;
	$form_prefix               = (string) $form_prefix;
	$price                     = (string) $price;
	$tc_form_prefix_class      = (string) $tc_form_prefix_class;
	$tc_form_prefix_name       = (string) $tc_form_prefix_name;
	$classcart                 = (string) $classcart;
	$hidden                    = (string) $hidden;
	$tm_epo_final_total_box    = (string) $tm_epo_final_total_box;
	$tm_epo_show_final_total   = (string) $tm_epo_show_final_total;
	$tm_epo_show_options_total = (string) $tm_epo_show_options_total;
	$forcart                   = (string) $forcart;
	$is_sold_individually      = (string) $is_sold_individually;
	$product_type              = (string) $product_type;
	$regular_price             = (string) $regular_price;
	$is_on_sale                = (string) $is_on_sale;
	$product_price_rules       = (string) $product_price_rules;
	$fields_price_rules        = (string) $fields_price_rules;
	$force_quantity            = (string) $force_quantity;
	$price_override            = (string) $price_override;
	$is_vat_exempt             = (string) $is_vat_exempt;
	$non_base_location_prices  = (string) $non_base_location_prices;
	$taxable                   = (string) $taxable;
	$tax_rate                  = (string) $tax_rate;
	$base_tax_rate             = (string) $base_tax_rate;
	$taxes_of_one              = (string) $taxes_of_one;
	$base_taxes_of_one         = (string) $base_taxes_of_one;
	$modded_taxes_of_one       = (string) $modded_taxes_of_one;
	$tax_string                = (string) $tax_string;
	$tax_display_mode          = (string) $tax_display_mode;
	$variations                = (string) $variations;
	$prices_include_tax        = (string) $prices_include_tax;
	$args                      = (array) $args;
	?>
<div class="tc-totals-form tm-product-id-<?php echo esc_attr( $product_id ); ?> <?php echo esc_attr( $classtotalform ); ?>" data-epo-id="<?php echo esc_attr( $epo_internal_counter ); ?>" data-product-id="<?php echo esc_attr( $product_id ); ?>">
	<input type="hidden" value="<?php echo esc_attr( $price ); ?>" name="cpf_product_price<?php echo esc_attr( $form_prefix ); ?>" class="cpf-product-price">
	<input type="hidden" value="" name="dynamic_product_price<?php echo esc_attr( $form_prefix ); ?>" class="cpf-dynamic-product-price">
	<input type="hidden" value="" name="override_product_price<?php echo esc_attr( $form_prefix ); ?>" class="cpf-override-product-price">
	<input type="hidden" value="<?php echo esc_attr( $form_prefix ); ?>" name="<?php echo esc_attr( $tc_form_prefix_name ); ?>" class="<?php echo esc_attr( $tc_form_prefix_class ); ?>">
	<?php do_action( 'wc_epo_totals_form', $product_id ); ?>
	<div id="tm-epo-totals<?php echo esc_attr( $form_prefix ); ?>"
		class="tc-epo-totals tm-product-id-<?php echo esc_attr( $product_id ); ?> tm-epo-totals tm-custom-prices-total<?php echo esc_attr( $hidden ); ?> <?php echo esc_attr( $classcart ); ?>"
		data-epo-id="<?php echo esc_attr( $epo_internal_counter ); ?>"
		data-tm-epo-final-total-box="<?php echo esc_attr( $tm_epo_final_total_box ); ?>"
		data-tm-epo-show-final-total="<?php echo esc_attr( $tm_epo_show_final_total ); ?>"
		data-tm-epo-show-options-total="<?php echo esc_attr( $tm_epo_show_options_total ); ?>"
		data-cart-id="<?php echo esc_attr( $forcart ); ?>"
		data-is-sold-individually="<?php echo esc_attr( $is_sold_individually ); ?>"
		data-type="<?php echo esc_attr( $product_type ); ?>"
		data-price="<?php echo esc_attr( $price ); ?>"
		data-regular-price="<?php echo esc_attr( $regular_price ); ?>"
		data-is-on-sale="<?php echo esc_attr( $is_on_sale ); ?>"
		data-product-price-rules="<?php echo esc_attr( $product_price_rules ); ?>"
		data-fields-price-rules="<?php echo esc_attr( $fields_price_rules ); ?>"
		data-force-quantity="<?php echo esc_attr( $force_quantity ); ?>"
		data-price-override="<?php echo esc_attr( $price_override ); ?>"
		data-is-vat-exempt="<?php echo esc_attr( $is_vat_exempt ); ?>"
		data-non-base-location-prices="<?php echo esc_attr( $non_base_location_prices ); ?>"
		data-taxable="<?php echo esc_attr( $taxable ); ?>"
		data-tax-rate="<?php echo esc_attr( $tax_rate ); ?>"
		data-base-tax-rate="<?php echo esc_attr( $base_tax_rate ); ?>"
		data-taxes-of-one="<?php echo esc_attr( $taxes_of_one ); ?>"
		data-base-taxes-of-one="<?php echo esc_attr( $base_taxes_of_one ); ?>"
		data-modded-taxes-of-one="<?php echo esc_attr( $modded_taxes_of_one ); ?>"
		data-tax-string="<?php echo esc_attr( $tax_string ); ?>"
		data-tax-display-mode="<?php echo esc_attr( $tax_display_mode ); ?>"
		data-prices-include-tax="<?php echo esc_attr( $prices_include_tax ); ?>"
		data-variations="<?php echo esc_attr( $variations ); ?>" <?php do_action( 'wc_epo_template_tm_totals', $args ); ?> ></div>
</div>
	<?php
endif;
templates/tm-variations.php000064400000070106150755142450012064 0ustar00<?php
/**
 * The template for displaying the styled variations
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-variations.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( ! isset( $tm_product_id ) ) {
	$tm_product_id = 0;
}
$tm_product = false;
// Ensure product is valid and that variations are customized.
if ( ! empty( $tm_product_id ) ) {
	$tm_product = wc_get_product( $tm_product_id );
}

if (
	! empty( $tm_product ) &&
	is_object( $tm_product ) &&
	is_callable( [ $tm_product, 'get_available_variations' ] )
	&& ! empty( $builder )
	&& isset( $builder['variations_options'], $form_prefix, $args, $field_counter, $epo_template_path, $epo_default_path, $variations_builder_element_end_args )
) {
	$variations_options = $builder['variations_options'];
	$parse              = false;
	if ( isset( $variations_builder_element_start_args ) && isset( $variations_builder_element_start_args['tm_element_settings'] ) && isset( $variations_builder_element_start_args['tm_element_settings']['builder'] ) && isset( $variations_builder_element_start_args['tm_element_settings']['builder']['variations_disabled'] ) && $variations_builder_element_start_args['tm_element_settings']['builder']['variations_disabled'] ) {
		$get_variations       = count( $tm_product->get_children() ) <= apply_filters( 'woocommerce_ajax_variation_threshold', 30, $tm_product );
		$available_variations = $get_variations ? $tm_product->get_available_variations() : false;
		$parse                = true;
	} else {
		$available_variations = $tm_product->get_available_variations();
		$parse                = ! empty( $available_variations );
	}

	$attributes     = $tm_product->get_variation_attributes(); // @phpstan-ignore-line
	$all_attributes = $tm_product->get_attributes();
	if ( $attributes ) {
		foreach ( $attributes as $key => $value ) {
			if ( ! $value ) {
				$attributes[ $key ] = array_map( 'trim', explode( '|', $all_attributes[ $key ]['value'] ) );
			}
		}
	}
	$selected_attributes = $tm_product->get_default_attributes();

	$variations_builder_element_start_args_class = '';
	if ( isset( $variations_builder_element_start_args['class'] ) ) {
		$variations_builder_element_start_args_class = $variations_builder_element_start_args['class'];
	}
	if ( $parse ) {

		$loop = 0;

		foreach ( $attributes as $name => $options ) {

			++$loop;
			// name - wc_attribute_label( $name )
			// id - sanitize_title($name)
			// select box name 'attribute_'.sanitize_title( $name )
			// select box id sanitize_title( $name ).

			$att_id = sanitize_title( $name );
			if ( is_array( $options ) ) {

				$variations_display_as = 'select';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_display_as'] ) ) {
					$variations_display_as = $variations_options[ $att_id ]['variations_display_as'];
				}

				$options_array          = [];
				$original_options_array = [];
				$default_value          = '';
				$imagesp                = [];
				$images                 = [];
				$color                  = [];
				$changes_product_image  = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_changes_product_image'] ) ) {
					$changes_product_image = $variations_options[ $att_id ]['variations_changes_product_image'];
				}

				$variations_label = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_label'] ) ) {
					$variations_label = $variations_options[ $att_id ]['variations_label'];
				}
				$variations_class = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_class'] ) ) {
					$variations_class = $variations_options[ $att_id ]['variations_class'];
				}
				$variations_items_per_row = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row'] ) ) {
					$variations_items_per_row = $variations_options[ $att_id ]['variations_items_per_row'];
				}

				$variations_items_per_row_tablets = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_tablets'] ) ) {
					$variations_items_per_row_tablets = $variations_options[ $att_id ]['variations_items_per_row_tablets'];
				}
				$variations_items_per_row_tablets_small = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_tablets_small'] ) ) {
					$variations_items_per_row_tablets_small = $variations_options[ $att_id ]['variations_items_per_row_tablets_small'];
				}
				$variations_items_per_row_smartphones = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_smartphones'] ) ) {
					$variations_items_per_row_smartphones = $variations_options[ $att_id ]['variations_items_per_row_smartphones'];
				}
				$variations_items_per_row_iphone5 = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_iphone5'] ) ) {
					$variations_items_per_row_iphone5 = $variations_options[ $att_id ]['variations_items_per_row_iphone5'];
				}
				$variations_items_per_row_iphone6 = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_iphone6'] ) ) {
					$variations_items_per_row_iphone6 = $variations_options[ $att_id ]['variations_items_per_row_iphone6'];
				}
				$variations_items_per_row_iphone6_plus = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_iphone6_plus'] ) ) {
					$variations_items_per_row_iphone6_plus = $variations_options[ $att_id ]['variations_items_per_row_iphone6_plus'];
				}
				$variations_items_per_row_samsung_galaxy = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_samsung_galaxy'] ) ) {
					$variations_items_per_row_samsung_galaxy = $variations_options[ $att_id ]['variations_items_per_row_samsung_galaxy'];
				}
				$variations_items_per_row_tablets_galaxy = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_items_per_row_tablets_galaxy'] ) ) {
					$variations_items_per_row_tablets_galaxy = $variations_options[ $att_id ]['variations_items_per_row_tablets_galaxy'];
				}

				$variations_item_width = '';
				if ( ( 'color' === $variations_display_as || 'image' === $variations_display_as ) && isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_item_width'] ) ) {
					$variations_item_width = $variations_options[ $att_id ]['variations_item_width'];
				}
				$variations_item_height = '';
				if ( ( 'color' === $variations_display_as || 'image' === $variations_display_as ) && isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_item_height'] ) ) {
					$variations_item_height = $variations_options[ $att_id ]['variations_item_height'];
				}
				$variations_show_name = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_show_name'] ) ) {
					$variations_show_name = $variations_options[ $att_id ]['variations_show_name'];
				}
				$variations_show_reset_button = '';
				if ( isset( $variations_options[ $att_id ] ) && ! empty( $variations_options[ $att_id ]['variations_show_reset_button'] ) ) {
					$variations_show_reset_button = $variations_options[ $att_id ]['variations_show_reset_button'];
				}

				if ( isset( $_REQUEST[ 'attribute_' . $att_id ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$selected_value = wp_unslash( $_REQUEST[ 'attribute_' . $att_id ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				} elseif ( isset( $selected_attributes[ $att_id ] ) ) {
					$selected_value = $selected_attributes[ $att_id ];
				} else {
					$selected_value = '';
				}

				if ( isset( $_REQUEST['asscociated_name'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$asscociated_name = wp_unslash( $_REQUEST['asscociated_name'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					if ( isset( $_REQUEST[ 'asscociated_cart_data_' . $asscociated_name ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$asscociated_cart_data = wp_unslash( $_REQUEST[ 'asscociated_cart_data_' . $asscociated_name ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
						$selected_value        =
								is_array( $asscociated_cart_data ) && isset( $asscociated_cart_data[ $asscociated_name . '_attribute_' . sanitize_title( $name ) ] ) // @phpstan-ignore-line
									? $asscociated_cart_data[ $asscociated_name . '_attribute_' . sanitize_title( $name ) ]
									: $selected_value;
					}
					if ( '' === $selected_value && isset( $_REQUEST[ 'tm_attribute_' . $att_id . $form_prefix ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
						$selected_value = wp_unslash( $_REQUEST[ 'tm_attribute_' . $att_id . $form_prefix ] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
					}
				}

				$taxonomy_name = rawurldecode( sanitize_title( $name ) );
				// Get terms if this is a taxonomy - ordered.
				if ( taxonomy_exists( $taxonomy_name ) ) {

					if ( function_exists( 'wc_get_product_terms' ) ) {
						$terms = wc_get_product_terms( $tm_product_id, $name, [ 'fields' => 'all' ] );
					} else {
						$taxorderby = wc_attribute_orderby( $taxonomy_name );
						$term_args  = [
							'taxonomy'   => $name,
							'hide_empty' => false,
						];
						switch ( $taxorderby ) {
							case 'name':
								$term_args['orderby']    = 'name';
								$term_args['menu_order'] = false;
								break;
							case 'id':
								$term_args['orderby']    = 'id';
								$term_args['order']      = 'ASC';
								$term_args['menu_order'] = false;
								break;
							case 'menu_order':
								$term_args['menu_order'] = 'ASC';
								break;
						}

						$terms = get_terms( $term_args );
					}

					$flipped_haystack = array_flip( $options );
					$_index           = 0;
					if ( is_array( $terms ) ) {
						foreach ( $terms as $_term ) {
							$option = THEMECOMPLETE_EPO_HELPER()->sanitize_key( $_term->slug );
							if ( ! isset( $flipped_haystack[ $option ] ) ) {
								continue;
							}

							$original_options_array[ esc_attr( $option ) ] = $option;
							$options_array[ esc_attr( $option ) ]          = apply_filters( 'woocommerce_variation_option_name', $_term->name );
							if ( sanitize_title( $selected_value ) === sanitize_title( $option ) ) {
								$default_value = $_index;
							}
							if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_imagep'] ) ) {
								if ( ! empty( $variations_options[ $att_id ]['variations_imagep'][ $option ] ) ) {
									$imagesp[ $_index ] = $variations_options[ $att_id ]['variations_imagep'][ $option ];
								} else {
									$ov = '';
									if ( is_array( $variations_options[ $att_id ]['variations_imagep'] ) ) {
										$ak = array_keys( $variations_options[ $att_id ]['variations_imagep'] );
										if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_imagep'][ $ak[ $_index ] ] ) ) {
											$ov = $variations_options[ $att_id ]['variations_imagep'][ $ak[ $_index ] ];
										}
									}
									$imagesp[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_product_image', $ov, $option, $options, $available_variations );
								}
							}
							if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_image'] ) ) {
								if ( ! empty( $variations_options[ $att_id ]['variations_image'][ $option ] ) ) {
									$images[ $_index ] = $variations_options[ $att_id ]['variations_image'][ $option ];
								} else {
									$ov = '';
									if ( is_array( $variations_options[ $att_id ]['variations_image'] ) ) {
										$ak = array_keys( $variations_options[ $att_id ]['variations_image'] );
										if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_image'][ $ak[ $_index ] ] ) ) {
											$ov = $variations_options[ $att_id ]['variations_image'][ $ak[ $_index ] ];
										}
									}
									$images[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_image', $ov, $option, $options, $available_variations );
								}
							}
							if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_color'] ) ) {
								if ( ! empty( $variations_options[ $att_id ]['variations_color'][ $option ] ) ) {
									$color[ $_index ] = $variations_options[ $att_id ]['variations_color'][ $option ];
								} else {
									$ov = '';
									if ( is_array( $variations_options[ $att_id ]['variations_color'] ) ) {
										$ak = array_keys( $variations_options[ $att_id ]['variations_color'] );
										if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_color'][ $ak[ $_index ] ] ) ) {
											$ov = $variations_options[ $att_id ]['variations_color'][ $ak[ $_index ] ];
										}
									}
									$color[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_color', $ov, $option, $options, $available_variations );
								}
							}

							++$_index;
						}
					}
				} else {

					$_index = 0;
					foreach ( $options as $option ) {
						$original_option = $option;
						$option          = THEMECOMPLETE_EPO_HELPER()->entity_decode( THEMECOMPLETE_EPO_HELPER()->sanitize_key( $option ) );
						if ( version_compare( WC()->version, '2.4', '<' ) ) {
							$options_array[ sanitize_title( $option ) ]          = apply_filters( 'woocommerce_variation_option_name', $original_option );
							$original_options_array[ sanitize_title( $option ) ] = $original_option;
						} else {
							$options_array[ $option ]          = apply_filters( 'woocommerce_variation_option_name', $original_option );
							$original_options_array[ $option ] = $original_option;
						}

						if ( sanitize_title( $selected_value ) === sanitize_title( $option ) ) {
							$default_value = $_index;
						}
						if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_imagep'] ) ) {
							if ( ! empty( $variations_options[ $att_id ]['variations_imagep'][ $option ] ) ) {
								$imagesp[ $_index ] = $variations_options[ $att_id ]['variations_imagep'][ $option ];
							} else {
								$ov = '';
								if ( is_array( $variations_options[ $att_id ]['variations_imagep'] ) ) {
									$ak = array_keys( $variations_options[ $att_id ]['variations_imagep'] );
									if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_imagep'][ $ak[ $_index ] ] ) ) {
										$ov = $variations_options[ $att_id ]['variations_imagep'][ $ak[ $_index ] ];
									}
								}
								$imagesp[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_product_image', $ov, $option, $options, $available_variations );
							}
						}
						if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_image'] ) ) {
							if ( ! empty( $variations_options[ $att_id ]['variations_image'][ $option ] ) ) {
								$images[ $_index ] = $variations_options[ $att_id ]['variations_image'][ $option ];
							} else {
								$ov = '';
								if ( is_array( $variations_options[ $att_id ]['variations_image'] ) ) {
									$ak = array_keys( $variations_options[ $att_id ]['variations_image'] );
									if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_image'][ $ak[ $_index ] ] ) ) {
										$ov = $variations_options[ $att_id ]['variations_image'][ $ak[ $_index ] ];
									}
								}
								$images[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_image', $ov, $option, $options, $available_variations );
							}
						}
						if ( isset( $variations_options[ $att_id ] ) && isset( $variations_options[ $att_id ]['variations_color'] ) ) {
							if ( ! empty( $variations_options[ $att_id ]['variations_color'][ $option ] ) ) {
								$color[ $_index ] = $variations_options[ $att_id ]['variations_color'][ $option ];
							} else {
								$ov = '';
								if ( is_array( $variations_options[ $att_id ]['variations_color'] ) ) {
									$ak = array_keys( $variations_options[ $att_id ]['variations_color'] );
									if ( isset( $ak[ $_index ] ) && ! empty( $variations_options[ $att_id ]['variations_color'][ $ak[ $_index ] ] ) ) {
										$ov = $variations_options[ $att_id ]['variations_color'][ $ak[ $_index ] ];
									}
								}
								$color[ $_index ] = apply_filters( 'woocommerce_tm_epo_variation_color', $ov, $option, $options, $available_variations );
							}
						}

						++$_index;
					}
				}

				switch ( $variations_display_as ) {
					case 'select':
						if ( class_exists( 'THEMECOMPLETE_EPO_FIELDS_select' ) ) {

							$element_display = new THEMECOMPLETE_EPO_FIELDS_select();

							$selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $name ) ] ) ? urldecode( sanitize_text_field( wp_unslash( $_REQUEST[ 'attribute_' . sanitize_title( $name ) ] ) ) ) : $selected_value; // phpcs:ignore WordPress.Security.NonceVerification.Recommended

							$fake_element = [
								'use_url'                => '',
								'textbeforeprice'        => '',
								'textafterprice'         => '',
								'hide_amount'            => 'hidden',
								'changes_product_image'  => $changes_product_image,
								'placeholder'            => esc_attr(
									apply_filters(
										'wc_epo_dropdown_variation_attribute_placeholder',
										esc_html__( 'Choose an option', 'woocommerce' ),
										[
											'options'   => $options,
											'attribute' => $name,
											'product'   => $tm_product,
											'selected'  => $selected,
										]
									)
								),
								'default_value'          => $default_value,
								'default_value_override' => true,
								'imagesp'                => $imagesp,
								'container_css_id'       => 'variation-element-',
								'options'                => $options_array,
								'original_options'       => $original_options_array,
							];

							$display = $element_display->display_field(
								$fake_element,
								[
									'name_inc'          => 'tm_attribute_' . $att_id . $form_prefix,
									'element_counter'   => '',
									'tabindex'          => '',
									'form_prefix'       => $form_prefix,
									'field_counter'     => $field_counter,
									'element_data_attr' => [ 'data-tm-for-variation' => $att_id ],
									'fieldtype'         => 'tmcp-field ' . $variations_class . ' tm-epo-variation-element',
								]
							);

							if ( is_array( $display ) ) {

								$field_args = [
									'name'       => 'tm_attribute_' . $att_id . $form_prefix,
									'element_id' => 'tm_attribute_id_' . $att_id . $form_prefix,
									'class'      => $variations_class . ' tm-epo-variation-element',
									'tabindex'   => '',
									'amount'     => '',
									'fieldtype'  => 'tmcp-field ' . $variations_class . ' tm-epo-variation-element',
								];

								$field_args = array_merge( $field_args, $display );

								if ( ! empty( $variations_class ) ) {
									$variations_builder_element_start_args['class'] = $variations_builder_element_start_args_class . ' ' . $variations_class;
								}
								$variations_builder_element_start_args['required']                 = 1;
								$variations_builder_element_start_args['label']                    = ! empty( $variations_label ) ? $variations_label : wc_attribute_label( $name );
								$variations_builder_element_start_args['class_id']                 = 'tm-variation-ul-' . $variations_display_as . ' variation-element-' . $loop . $form_prefix;
								$variations_builder_element_start_args['tm_variation_undo_button'] = '';
								$variations_builder_element_start_args['tm_product_id']            = $tm_product_id;
								wc_get_template(
									'tm-builder-element-start.php',
									$variations_builder_element_start_args,
									$epo_template_path,
									$epo_default_path
								);

								wc_get_template(
									'tm-select.php',
									$field_args,
									$epo_template_path,
									$epo_default_path
								);

								wc_get_template(
									'tm-builder-element-end.php',
									$variations_builder_element_end_args,
									$epo_template_path,
									$epo_default_path
								);
							}
						}
						break;

					case 'radio':
					case 'radiostart':
					case 'radioend':
					case 'image':
					case 'color':
					case 'text':
						if ( 'color' === $variations_display_as ) {
							$images = [];
						}
						if ( class_exists( 'THEMECOMPLETE_EPO_FIELDS_radio' ) && ! empty( $options_array ) ) {

							$element_display = new THEMECOMPLETE_EPO_FIELDS_radio();

							if ( ! empty( $variations_class ) ) {
								$variations_builder_element_start_args['class'] = $variations_builder_element_start_args_class . ' ' . $variations_class;
							}
							$variations_builder_element_start_args['required'] = 1;
							$variations_builder_element_start_args['label']    = ! empty( $variations_label ) ? $variations_label : wc_attribute_label( $name );

							$variations_builder_element_start_args['class_id'] = 'tm-variation-ul-' . $variations_display_as . ' variation-element-' . $loop . $form_prefix;
							if ( ! empty( $variations_show_reset_button ) ) {
								$variations_builder_element_start_args['tm_variation_undo_button'] = $att_id;
							} else {
								$variations_builder_element_start_args['tm_variation_undo_button'] = '';
							}
							$variations_builder_element_start_args['tm_product_id'] = $tm_product_id;

							$v_field_counter  = 0;
							$replacement_mode = 'none';
							$swatch_position  = 'center';
							switch ( $variations_display_as ) {
								case 'image':
									$replacement_mode = 'image';
									break;
								case 'color':
									$replacement_mode = 'color';
									break;
								case 'text':
									$replacement_mode = 'text';
									break;
								case 'radiostart':
									$replacement_mode = 'image';
									$swatch_position  = 'start';
									break;
								case 'radioend':
									$replacement_mode = 'image';
									$swatch_position  = 'end';
									break;
								default:
									// code...
									break;
							}
							$fake_element = [
								'default_value'          => $default_value,
								'default_value_override' => true,
								'class'                  => $variations_class,
								'textbeforeprice'        => '',
								'textafterprice'         => '',
								'hide_amount'            => 'hidden',
								'replacement_mode'       => $replacement_mode,
								'swatch_position'        => $swatch_position,
								'use_url'                => '',
								'images'                 => $images,
								'imagesp'                => $imagesp,
								'url'                    => [],
								'items_per_row'          => $variations_items_per_row,
								'items_per_row_r'        => [
									'desktop'        => $variations_items_per_row,
									'tablets_galaxy' => $variations_items_per_row_tablets_galaxy,
									'tablets'        => $variations_items_per_row_tablets,
									'tablets_small'  => $variations_items_per_row_tablets_small,
									'iphone6_plus'   => $variations_items_per_row_iphone6_plus,
									'iphone6'        => $variations_items_per_row_iphone6,
									'galaxy'         => $variations_items_per_row_samsung_galaxy,
									'iphone5'        => $variations_items_per_row_iphone5,
									'smartphones'    => $variations_items_per_row_smartphones,
								],
								'item_width'             => $variations_item_width,
								'item_height'            => $variations_item_height,
								'show_label'             => $variations_show_name,
								'limit'                  => '',
								'exactlimit'             => '',
								'minimumlimit'           => '',
								'show_tooltip'           => '',
								'changes_product_image'  => $changes_product_image,
								'container_css_id'       => 'variation-element-',
							];

							$element_display->display_field_pre(
								$fake_element,
								[
									'element_counter' => $loop,
									'tabindex'        => $v_field_counter,
									'form_prefix'     => $form_prefix,
									'field_counter'   => $v_field_counter,
									'product_id'      => $tm_product_id,
								]
							);

							$variations_builder_element_start_args['field_obj'] = $element_display;

							wc_get_template(
								'tm-builder-element-start.php',
								$variations_builder_element_start_args,
								$epo_template_path,
								$epo_default_path
							);

							foreach ( $options_array as $value => $label ) {

								if ( isset( $color[ $v_field_counter ] ) ) {
									$fake_element['color'] = $color[ $v_field_counter ];
								} else {
									unset( $fake_element['color'] );
								}

								$display = $element_display->display_field(
									$fake_element,
									[
										'element_id'      => 'tm_attribute_id_' . $att_id . '_' . $loop . '_' . $v_field_counter . '_' . intval( $v_field_counter + $loop ) . $form_prefix, // doesn't actually gets that value.
										'name'            => 'tm_attribute_' . $att_id . '_' . $loop . $form_prefix,
										'name_inc'        => 'tm_attribute_' . $att_id . '_' . $loop . $form_prefix,
										'value'           => isset( $original_options_array[ $value ] ) ? $original_options_array[ $value ] : $value,
										'label'           => $label,
										'element_counter' => $loop,
										'tabindex'        => $v_field_counter,
										'form_prefix'     => $form_prefix,
										'element_data_attr' => [ 'data-tm-for-variation' => $att_id ],
										'fieldtype'       => 'tmcp-field ' . $variations_class . ' tm-epo-variation-element',
										'field_counter'   => $v_field_counter,
										'border_type'     => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_selected_border' ),
									]
								);

								if ( is_array( $display ) ) {

									$field_args = [
										'tm_element_settings' => $fake_element,
										'element_id'     => 'tm_attribute_id_' . $att_id . '_' . $loop . '_' . $v_field_counter . '_' . intval( $v_field_counter + $loop ) . $form_prefix, // doesn't actually gets that value.
										'name'           => 'tm_attribute_' . $att_id . '_' . $loop . $form_prefix,
										'class'          => $variations_class . ' tm-epo-variation-element',
										'tabindex'       => $v_field_counter,
										'rules'          => '',
										'original_rules' => '',
										'rules_type'     => '',
										'price_type'     => '',
										'amount'         => '',
										'fieldtype'      => 'tmcp-field ' . $variations_class . ' tm-epo-variation-element',
										'border_type'    => THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_css_selected_border' ),
									];

									$field_args = array_merge( $field_args, $display );

									wc_get_template(
										'tm-radio.php',
										$field_args,
										$epo_template_path,
										$epo_default_path
									);
								}

								++$v_field_counter;
							}

							wc_get_template(
								'tm-builder-element-end.php',
								$variations_builder_element_end_args,
								$epo_template_path,
								$epo_default_path
							);
						}
						break;
				}
			}

			if ( count( $attributes ) === intval( $loop ) ) {
				echo '<a class="reset_variations tc-cell tcwidth tcwidth-100" href="#reset">' . ( ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_reset_variation_text' ) ) ) ? esc_html( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_reset_variation_text' ) ) : esc_html__( 'Reset options', 'woocommerce-tm-extra-product-options' ) ) . '</a>';
			}
		}
	}
}

do_action( 'tm_after_styled_variations', $tm_product );
templates/tm-field-start.php000064400000004254150755142450012124 0ustar00<?php
/**
 * The template for displaying the start of an element for the local mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-field-start.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $required, $field_id, $label, $original_rules, $rules, $rules_type, $field_type ) ) :
	$required       = (string) $required;
	$field_id       = (string) $field_id;
	$label          = (string) $label;
	$original_rules = (string) $original_rules;
	$rules          = (string) $rules;
	$rules_type     = (string) $rules_type;
	$field_type     = (string) $field_type;

	$extraliclass = '';
	if ( $required ) {
		$extraliclass .= ' tm-epo-has-required';
	}
	if ( isset( $li_class ) ) {
		$extraliclass .= ' ' . $li_class;
	}
	?>
<li id="<?php echo esc_attr( $field_id ); ?>" class="cpf-element tm-extra-product-options-field tc-row tc-cell<?php echo esc_attr( $extraliclass ); ?>">
	<span class="tc-epo-label tm-epo-element-label">
	<?php
	echo esc_html( $label );
	if ( $required && ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ) && 'left' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator_position' ) ) {
		// THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) may contain HTML code.
		echo '<span class="tm-epo-required">' . apply_filters( 'wc_epo_kses', wp_kses_post( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ), THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
	}
	?>
	</span>
	<div class="tc-element-container">
		<ul data-original-rules="<?php echo esc_attr( $original_rules ); ?>" data-rules="<?php echo esc_attr( $rules ); ?>" data-rulestype="<?php echo esc_attr( $rules_type ); ?>" class="tmcp-ul-wrap tmcp-attributes tm-extra-product-options-<?php echo esc_attr( $field_type ); ?>">
		<?php
endif;
templates/tm-builder-section-start.php000064400000021164150755142450014130 0ustar00<?php
/**
 * The template for displaying the start of a section in the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-section-start.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $sections_class, $haslogic, $column, $uniqid, $logic, $sections_popupbutton, $style, $description_position, $label_position, $label_size, $divider, $labelbgclass, $descriptionclass, $sectionbgcolorclass ) ) :
	$sections_class       = (string) $sections_class;
	$haslogic             = (string) $haslogic;
	$column               = (string) $column;
	$uniqid               = (string) $uniqid;
	$logic                = (string) $logic;
	$sections_popupbutton = (string) $sections_popupbutton;
	$style                = (string) $style;
	$description_position = (string) $description_position;
	$label_position       = (string) $label_position;
	$label_size           = (string) $label_size;
	$divider              = (string) $divider;
	$labelbgclass         = (string) $labelbgclass;
	$descriptionclass     = (string) $descriptionclass;
	$sectionbgcolorclass  = (string) $sectionbgcolorclass;

	if ( ! isset( $label ) ) {
		$label = '';
	}
	if ( ! isset( $sections_type ) ) {
		$sections_type = '';
	}
	if ( 'popup' === $sections_type ) {
		$sections_class .= ' section_popup';
	}
	if ( ! $haslogic ) {
		$logic = '';
	}
	$tm_product_id_class = '';
	if ( ! empty( $tm_product_id ) ) {
		$tm_product_id_class = ' tm-product-id-' . $tm_product_id;
	}
	if ( 'slider' === $sections_type ) {
		$column .= ' tm-owl-slider-section';
	}
	if ( 'tabs' === $sections_type ) {
		$column .= ' tc-tabs-section';
	}
	?>
<div data-uniqid="<?php echo esc_attr( $uniqid ); ?>"
	data-logic="<?php echo esc_attr( $logic ); ?>"
	data-haslogic="<?php echo esc_attr( $haslogic ); ?>"
	class="cpf-section tc-cell <?php echo esc_attr( $column ); ?> <?php echo esc_attr( $sections_class . $tm_product_id_class ); ?>">
	<div class="tc-section-inner-wrap">
	<?php

	$row_classes = [];
	$icon        = false;
	$toggler     = '';

	if ( 'box' === $style ) {
		$row_classes[] = 'tm-box';
		$row_classes[] = $sectionbgcolorclass;
	}
	if ( 'collapse' === $style || 'collapseclosed' === $style || 'accordion' === $style ) {
		$row_classes[] = 'tm-collapse';
		$row_classes[] = $sectionbgcolorclass;
		if ( 'accordion' === $style ) {
			$row_classes[] = 'tmaccordion';
		}
		$icon    = true;
		$toggler = ' tm-toggle';
		if ( '' === $label ) {
			$label = '&nbsp;';
		}
	}

	$_label = apply_filters( 'wc_epo_kses', wp_kses_post( $label ), $label );

	$row_classes = trim( join( ' ', $row_classes ) );
	if ( ! empty( $row_classes ) ) {
		$row_classes = ' ' . $row_classes;
	}

	echo '<div class="tc-row' . esc_attr( $row_classes ) . '">';

	if ( 'popup' === $sections_type ) {
		$_popuplinkitle = esc_html__( 'Open', 'woocommerce-tm-extra-product-options' );
		if ( ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_popup_section_button_text' ) ) ) {
			if ( '%auto%' !== THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_popup_section_button_text' ) ) {
				$_popuplinkitle = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_popup_section_button_text' );
			} elseif ( '%auto%' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_popup_section_button_text' ) && '' !== $_label ) {
				$_popuplinkitle = $_label;
			}
		}
		if ( isset( $sections_popupbuttontext ) && '' !== $sections_popupbuttontext ) {
			$_popuplinkitle = $sections_popupbuttontext;
		}
		switch ( $sections_popupbutton ) {
			case 'button':
				// $_popuplinkitle may contain HTML code
				echo '<div class="tc-cell tc-col-auto">';
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => $_popuplinkitle,
						'tags' => [
							'data-title'     => $_label,
							'data-sectionid' => $uniqid,
							'class'          => 'button tm-section-link',
						],
					],
					true
				);
				echo '</div>';
				break;

			case 'buttonalt':
				// $_popuplinkitle may contain HTML code
				echo '<div class="tc-cell tc-col-auto">';
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => $_popuplinkitle,
						'tags' => [
							'data-title'     => $_label,
							'data-sectionid' => $uniqid,
							'class'          => 'button alt tm-section-link',
						],
					],
					true
				);
				echo '</div>';
				break;

			case '':
			default:
				// $_popuplinkitle may contain HTML code
				THEMECOMPLETE_EPO_HTML()->create_button(
					[
						'text' => $_popuplinkitle,
						'tags' => [
							'type'           => 'a',
							'href'           => '#',
							'data-title'     => $_label,
							'data-sectionid' => $uniqid,
							'class'          => 'tc-cell tcwidth tcwidth-100 tm-section-link',
						],
					],
					true
				);
				break;
		}

		echo '<div class="tm-section-pop tc-cell tcwidth tcwidth-100">';
	}

	if ( ( ! empty( $label ) && 'disable' !== $label_position ) || ( ! empty( $description ) && ( 'icontooltipright' === $description_position || 'icontooltipleft' === $description_position ) ) ) {
		echo '<' . esc_attr( $label_size );

		$class = '';
		if ( ( ! empty( $label_position ) && 'disable' !== $label_position ) || 'tooltip' === $description_position ) {
			$class .= ' tc-col-auto';
			if ( ! empty( $label_position ) ) {
				$class .= ' tc-' . $label_position;
			}
		} else {
			$class .= ' tcwidth tcwidth-100';
		}
		if ( ! empty( $label_color ) ) {
			$class .= ' color-' . themecomplete_sanitize_hex_color_no_hash( $label_color );
		}
		if ( ! empty( $labelbgclass ) ) {
			$class .= $labelbgclass;
		}
		echo ' class="tc-cell tc-epo-label tm-section-label' . esc_attr( $toggler . $class ) . '">';

		// Icon tooltip.
		if ( 'icontooltipleft' === $description_position || 'icontooltipright' === $description_position ) {
			echo '<i data-tm-tooltip-swatch="on" class="tc-' . esc_attr( $description_position ) . ' tm-tooltip tc-tooltip tcfa tcfa-question-circle tc-epo-style-space"></i>';
		}

		// Label text.
		$section_label_text_class = 'tc-section-label-text';
		if ( ! empty( $description ) && 'tooltip' === $description_position ) {
			$section_label_text_class .= ' tm-tooltip';
		}
		echo '<span class="' . esc_attr( $section_label_text_class ) . '"';
		if ( ! empty( $description ) && ! empty( $description_position ) && 'tooltip' === $description_position ) {
			echo ' data-tm-tooltip-swatch="on"';
		}
		echo '>';
		if ( ! empty( $label ) && 'disable' !== $label_position ) {
			// $label may contain HTML code
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $label ), $label ); // phpcs:ignore WordPress.Security.EscapeOutput
		} else {
			echo '&nbsp;';
		}
		echo '</span>';

		if ( $icon ) {
			echo '<span class="tcfa tcfa-angle-down tm-arrow"></span>';
		}

		echo '</' . esc_attr( $label_size ) . '>';
	}

	if ( ! empty( $description ) ) {
		$descriptionclass = 'tc-cell tm-section-description tm-description' . $descriptionclass;
		if ( ! empty( $label_position ) && ! empty( $description_position ) && 'below' !== $description_position ) {
			$descriptionclass .= ' tc-col';
		} else {
			$descriptionclass .= ' tcwidth tcwidth-100';
			if ( 'below' !== $description_position && ( 'left' === $label_position || 'right' === $label_position ) ) {
				$descriptionclass .= ' tc-first';
			}
		}
		if ( 'tooltip' === $description_position || 'icontooltipright' === $description_position || 'icontooltipleft' === $description_position ) {
			$descriptionclass .= ' tm-tip-html';
		}
		if ( ! empty( $description_position ) && 'tooltip' !== $description_position ) {
			$descriptionclass .= ' tc-' . $description_position;
		}
		echo '<div class="' . esc_attr( $descriptionclass ) . '">';
		// $description contains HTML code
		echo apply_filters( 'wc_epo_kses', wp_kses_post( $description ), $description ); // phpcs:ignore WordPress.Security.EscapeOutput
		echo '</div>';
	}

	if ( ! empty( $label_position ) && 'disable' !== $label_position ) {
		$fields_class = 'tc-cell tc-col';
	} else {
		$fields_class = 'tc-cell tcwidth tcwidth-100';
	}
	echo '<div class="' . esc_attr( $fields_class ) . '">';

	switch ( $divider ) {
		case 'hr':
			echo '<hr>';
			break;
		case 'divider':
			echo '<div class="tm_divider"></div>';
			break;
		case 'padding':
			echo '<div class="tm_padding"></div>';
			break;
	}

	if ( 'collapse' === $style ) {
		echo '<div class="tm-collapse-wrap">';
	}
	if ( 'collapseclosed' === $style ) {
		echo '<div class="tm-collapse-wrap closed">';
	}
	if ( 'accordion' === $style ) {
		echo '<div class="tm-collapse-wrap closed">';
	}

	echo '<div class="tc-row">';

endif;
templates/tm-template.php000064400000001106150755142450011512 0ustar00<?php
/**
 * The template for displaying the template element
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-template.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;

$tm_product = false;
if ( ! empty( $tm_product_id ) ) {
	$tm_product = wc_get_product( $tm_product_id );
}
templates/tc-js-templates.php000064400000021214150755142450012277 0ustar00<?php
/**
 * The javascript-based template for displayed javascript generated html code
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tc-js-templates.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @see     https://codex.wordpress.org/Javascript_Reference/wp.template
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( ! isset( $formatted_price ) ) {
	$formatted_price = '';
}
if ( ! isset( $formatted_sale_price ) ) {
	$formatted_sale_price = '';
}
?>
<script class="tm-hidden" type="text/template" id="tmpl-tc-cart-options-popup">
	<div class='header'>
		<h3>{{{ data.title }}}</h3>
	</div>
	<div id='{{{ data.id }}}' class='float-editbox'>{{{ data.html }}}</div>
	<div class='footer'>
		<div class='inner'>
			<span class='tm-button button button-secondary button-large floatbox-cancel'>{{{ data.close }}}</span>
		</div>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-lightbox">
	<div class="tc-lightbox-wrap">
		<span class="tc-lightbox-button tcfa tcfa-search tc-transition tcinit"></span>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-lightbox-zoom">
	<span class="tc-lightbox-button-close tcfa tcfa-times"></span>
	{{{ data.img }}}
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-final-totals">
	<dl class="tm-extra-product-options-totals tm-custom-price-totals">
		<# if (data.show_unit_price==true){ #><?php do_action( 'wc_epo_template_before_unit_price' ); ?>
		<dt class="tm-unit-price">{{{ data.unit_price }}}</dt>
		<dd class="tm-unit-price">
		{{{ data.totals_box_before_unit_price }}}<span class="price amount options">{{{ data.formatted_unit_price }}}</span>{{{ data.totals_box_after_unit_price }}}
		</dd><?php do_action( 'wc_epo_template_after_unit_price' ); ?>
		<# } #>
		<# if (data.show_options_vat==true){ #><?php do_action( 'wc_epo_template_before_vat_options_total' ); ?>
		<dt class="tm-vat-options-totals">{{{ data.options_vat_total }}}</dt>
		<dd class="tm-vat-options-totals">
		{{{ data.totals_box_before_vat_options_totals_price }}}<span class="price amount options">{{{ data.formatted_vat_options_total }}}</span>{{{ data.totals_box_after_vat_options_totals_price }}}
		</dd><?php do_action( 'wc_epo_template_after_vat_options_total' ); ?>
		<# } #>
		<# if (data.show_options_total==true){ #><?php do_action( 'wc_epo_template_before_option_total' ); ?>
		<dt class="tm-options-totals">{{{ data.options_total }}}</dt>
		<dd class="tm-options-totals">
		{{{ data.totals_box_before_options_totals_price }}}<span class="price amount options">{{{ data.formatted_options_total }}}</span>{{{ data.totals_box_after_options_totals_price }}}
		</dd><?php do_action( 'wc_epo_template_after_option_total' ); ?>
		<# } #>
		<# if (data.show_fees_total==true){ #><?php do_action( 'wc_epo_template_before_fee_total' ); ?>
		<dt class="tm-fee-totals">{{{ data.fees_total }}}</dt>
		<dd class="tm-fee-totals">
		{{{ data.totals_box_before_fee_totals_price }}}<span class="price amount fees">{{{ data.formatted_fees_total }}}</span>{{{ data.totals_box_after_fee_totals_price }}}
		</dd><?php do_action( 'wc_epo_template_after_fee_total' ); ?>
		<# } #>
		<# if (data.show_extra_fee==true){ #><?php do_action( 'wc_epo_template_before_extra_fee' ); ?>
		<dt class="tm-extra-fee">{{{ data.extra_fee }}}</dt>
		<dd class="tm-extra-fee">
		{{{ data.totals_box_before_extra_fee_price }}}<span class="price amount options extra-fee">{{{ data.formatted_extra_fee }}}</span>{{{ data.totals_box_after_extra_fee_price }}}
		</dd><?php do_action( 'wc_epo_template_after_extra_fee' ); ?>
		<# } #>
		<# if (data.show_final_total==true){ #><?php do_action( 'wc_epo_template_before_final_total' ); ?>
		<dt class="tm-final-totals">{{{ data.final_total }}}</dt>
		<dd class="tm-final-totals">
		{{{ data.totals_box_before_final_totals_price }}}<span class="price amount final">{{{ data.formatted_final_total }}}</span>{{{ data.totals_box_after_final_totals_price }}}
		</dd><?php do_action( 'wc_epo_template_after_final_total' ); ?>
		<# } #>
		<?php do_action( 'wc_epo_after_js_final_totals' ); ?>
	</dl>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-price">
	<span class="amount">{{{ data.price.price }}}</span>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-sale-price">
	<del>
		<span class="tc-original-price amount">{{{ data.price.original_price }}}</span>
	</del>
	<ins>
		<span class="amount">{{{ data.price.price }}}</span>
	</ins>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-section-pop-link">
	<div id="tm-section-pop-up" class="tm-extra-product-options flasho tc-wrapper tm-section-pop-up single tm-animated appear">
		<div class='header'><h3>{{{ data.title }}}</h3></div>
		<div class="float-editbox" id="tc-floatbox-content"></div>
		<div class='footer'>
			<div class='inner'>
				<span class='tm-button button button-secondary button-large floatbox-cancel'>{{{ data.close }}}</span>
			</div>
		</div>
	</div>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-floating-box-nks"><# if (data.values.length) {#>
	{{{ data.html_before }}}
	<div class="tc-row tm-fb-labels">
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-title">{{{ data.option_label }}}</span>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-value">{{{ data.option_value }}}</span>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-quantity">{{{ data.option_qty }}}</span>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-price">{{{ data.option_price }}}</span>
	</div>
	<# for (var i = 0; i < data.values.length; i++) { #>
		<# if (data.values[i].label_show=='' || data.values[i].value_show=='') {#>
	<div class="tc-row tm-fb-data">
			<# if (data.values[i].label_show=='') {#>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-title">{{{ data.values[i].title }}}</span>
			<# } #>
			<# if (data.values[i].value_show=='') {#>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-value">{{{ data.values[i].value }}}</span>
			<# } #>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-quantity">{{{ data.values[i].quantity }}}</span>
		<span class="tc-cell tcwidth tcwidth-25 tm-fb-price">{{{ data.values[i].price }}}</span>
	</div>
		<# } #>
	<# } #>
	{{{ data.html_after }}}
	<# }#>
	{{{ data.totals }}}</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-floating-box"><# if (data.values.length) {#>
	{{{ data.html_before }}}
	<dl class="tm-fb">
		<# for (var i = 0; i < data.values.length; i++) { #>
			<# if (data.values[i].label_show=='') {#>
		<dt class="tm-fb-title">{{{ data.values[i].title }}}</dt>
			<# } #>
			<# if (data.values[i].value_show=='') {#>
		<dd class="tm-fb-value">{{{ data.values[i].value }}}<# if (data.values[i].quantity > 1) {#><span class="tm-fb-quantity"> &times; {{{ data.values[i].quantity }}}</span><#}#></dd>
			<# } #>
		<# } #>
	</dl>
	{{{ data.html_after }}}
	<# }#>{{{ data.totals }}}</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-chars-remanining">
	<span class="tc-chars">
		<span class="tc-chars-remanining">{{{ data.maxlength }}}</span>
		<span class="tc-remaining"> {{{ data.characters_remaining }}}</span>
	</span>
</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-formatted-price">{{{ data.before_price_text }}}<# if (data.customer_price_format_wrap_start) {#>
	{{{ data.customer_price_format_wrap_start }}}
	<# } #><?php echo esc_html( $formatted_price ); ?><# if (data.customer_price_format_wrap_end) {#>
	{{{ data.customer_price_format_wrap_end }}}
	<# } #>{{{ data.after_price_text }}}</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-formatted-sale-price">{{{ data.before_price_text }}}<# if (data.customer_price_format_wrap_start) {#>
	{{{ data.customer_price_format_wrap_start }}}
	<# } #><?php echo esc_html( $formatted_sale_price ); ?><# if (data.customer_price_format_wrap_end) {#>
	{{{ data.customer_price_format_wrap_end }}}
	<# } #>{{{ data.after_price_text }}}</script>
<script class="tm-hidden" type="text/template" id="tmpl-tc-upload-messages">
	<div class="header">
		<h3>{{{ data.title }}}</h3>
	</div>
	<div class="float-editbox" id="tc-floatbox-content">
		<div class="tc-upload-messages">
			<div class="tc-upload-message">{{{ data.message }}}</div>
			<# for (var id in data.files) {
				if (data.files.hasOwnProperty(id)) {#>
					<# for (var i in id) {
						if (data.files[id].hasOwnProperty(i)) {#>
						<div class="tc-upload-files">{{{ data.files[id][i] }}}</div>
						<# }
					}#>
				<# }
			}#>
		</div>
	</div>
	<div class="footer">
		<div class="inner">&nbsp;</div>
	</div>
</script>
templates/tm-start.php000064400000003220150755142450011033 0ustar00<?php
/**
 * The template for displaying the start of the local mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-start.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $classcart, $epo_internal_counter, $forcart, $form_prefix, $isfromshortcode, $product_id ) ) :
	$classcart            = (string) $classcart;
	$epo_internal_counter = (string) $epo_internal_counter;
	$forcart              = (string) $forcart;
	$form_prefix          = (string) $form_prefix;
	$isfromshortcode      = (string) $isfromshortcode;
	$product_id           = (string) $product_id;

	$showoptionsoverride = '';
	if ( 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_progressive_display' ) ) {
		$showoptionsoverride = ' tc-show-override';
	}
	?>
<div data-epo-id="<?php echo esc_attr( $epo_internal_counter ); ?>" data-cart-id="<?php echo esc_attr( $forcart ); ?>" data-product-id="<?php echo esc_attr( $product_id ); ?>" class="tc-extra-product-options tm-extra-product-options tm-custom-prices tc-clearfix tm-product-id-<?php echo esc_attr( $product_id ); ?> <?php echo esc_attr( $classcart ); ?><?php echo esc_attr( $isfromshortcode ); ?><?php echo esc_attr( $showoptionsoverride ); ?>" id="tm-extra-product-options<?php echo esc_attr( $form_prefix ); ?>">
	<ul id="tm-extra-product-options-fields" class="tm-extra-product-options-fields tc-row tc-container">
	<?php
endif;
templates/tm-time.php000064400000010117150755142450010637 0ustar00<?php
/**
 * The template for displaying the time element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-time.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $get_default_value, $input_type, $name, $button_style, $fieldtype, $rules, $original_rules, $time_mask, $time_placeholder, $min_time, $max_time, $time_format, $custom_time_format, $time_theme, $time_theme_size, $time_theme_position, $translation_hour, $translation_minute, $translation_second ) ) :
	$class_label         = (string) $class_label;
	$element_id          = (string) $element_id;
	$get_default_value   = (string) $get_default_value;
	$input_type          = (string) $input_type;
	$name                = (string) $name;
	$button_style        = (string) $button_style;
	$fieldtype           = (string) $fieldtype;
	$rules               = (string) $rules;
	$original_rules      = (string) $original_rules;
	$time_mask           = (string) $time_mask;
	$time_placeholder    = (string) $time_placeholder;
	$min_time            = (string) $min_time;
	$max_time            = (string) $max_time;
	$time_format         = (string) $time_format;
	$custom_time_format  = (string) $custom_time_format;
	$time_theme          = (string) $time_theme;
	$time_theme_size     = (string) $time_theme_size;
	$time_theme_position = (string) $time_theme_position;
	$translation_hour    = (string) $translation_hour;
	$translation_minute  = (string) $translation_minute;
	$translation_second  = (string) $translation_second;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label for="<?php echo esc_attr( $element_id ); ?>" class="tc-col tm-epo-field-label tm-epo-timepicker-label-container<?php echo esc_attr( $class_label ); ?>">
	<?php
	$input_args = [
		'nodiv'      => 1,
		'default'    => $get_default_value,
		'type'       => 'input',
		'input_type' => $input_type,
		'tags'       => [
			'id'                       => $element_id,
			'name'                     => $name,
			'class'                    => $fieldtype . $button_style . ' tm-epo-field tmcp-time',
			'data-price'               => '',
			'data-rules'               => $rules,
			'data-original-rules'      => $original_rules,
			'data-mask'                => $time_mask,
			'data-mask-placeholder'    => $time_placeholder,
			'data-min-time'            => $min_time,
			'data-max-time'            => $max_time,
			'data-time-format'         => $time_format,
			'data-custom-time-format'  => $custom_time_format,
			'data-time-theme'          => $time_theme,
			'data-time-theme-size'     => $time_theme_size,
			'data-time-theme-position' => $time_theme_position,
			'data-tranlation-hour'     => $translation_hour,
			'data-tranlation-minute'   => $translation_minute,
			'data-tranlation-second'   => $translation_second,
			'inputmode'                => 'none',
		],
	];
	if ( 'time' === $input_type ) {
		unset( $input_args['tags']['data-mask'] );
		unset( $input_args['tags']['data-mask-placeholder'] );
	}
	if ( isset( $required ) && ! empty( $required ) ) {
		$input_args['tags']['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$input_args['tags']['data-tax-obj'] = $tax_obj;
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$input_args['tags']['data-no-price'] = true;
	}

	$input_args = apply_filters(
		'wc_element_input_args',
		$input_args,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-radio.php000064400000022715150755142450011006 0ustar00<?php
/**
 * The template for displaying the radio button element for the builder/local modes
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-radio.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $li_class, $label_to_display, $element_id, $replacement_mode, $border_type, $value, $name, $fieldtype, $use, $rules, $original_rules, $rules_type, $url, $image, $imagec, $imagep, $imagel, $image_variations, $checked, $swatch_position, $swatch_class ) ) :
	$li_class         = (string) $li_class;
	$label_to_display = (string) $label_to_display;
	$element_id       = (string) $element_id;
	$replacement_mode = (string) $replacement_mode;
	$border_type      = (string) $border_type;
	$value            = (string) $value;
	$name             = (string) $name;
	$fieldtype        = (string) $fieldtype;
	$use              = (string) $use;
	$rules            = (string) $rules;
	$original_rules   = (string) $original_rules;
	$rules_type       = (string) $rules_type;
	$url              = (string) $url;
	$image            = (string) $image;
	$imagec           = (string) $imagec;
	$imagep           = (string) $imagep;
	$imagel           = (string) $imagel;
	$image_variations = (string) $image_variations;
	$swatch_position  = (string) $swatch_position;
	$swatch_class     = (string) $swatch_class;
	$class_label      = ! empty( $class_label ) ? (string) $class_label : '';
	if ( ! isset( $is_separator ) ) {
		$is_separator = false;
	}
	$liclass = 'tmcp-field-wrap' . $li_class . ( ! empty( $label_mode ) ? ' tc-mode-' . $label_mode : ' tc-mode-normal' );

	$liclass .= ' ' . $border_type;

	if ( 'text' === $replacement_mode ) {
		$liclass .= ' tc-epo-text-wrapper';
	}
	?>
<li class="<?php echo esc_attr( $liclass ); ?>"><div class="tmcp-field-wrap-inner">
	<?php if ( $is_separator ) : ?>
		<?php
		echo '<span class="tc-label-wrap tc-separator"><span class="tc-col tc-label tc-separator-label">';
		$separator_html = '-1' === $label_to_display || '' === $label_to_display ? '<hr>' : $label_to_display;
		$separator_html = apply_filters( 'wc_epo_choice_separator_html', $separator_html );
		echo '<span class="tc-label-text">';
		echo apply_filters( 'wc_epo_kses', wp_kses_post( $separator_html ), $separator_html ); // phpcs:ignore WordPress.Security.EscapeOutput
		echo '</span>';
		echo '</span></span>';
		?>
	<?php else : ?>
		<div class="tc-col tc-field-label-wrap">
		<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<?php
		if ( 'text' === $replacement_mode ) {
			echo '<div class="tc-epo-text-label-wrapper">';
		}

		echo '<span class="tc-label-wrap' . ( empty( $hexclass ) ? '' : ' ' . esc_attr( sanitize_html_class( $hexclass ) ) ) . '">';

		if ( ! empty( $labelclass_start ) ) {
			echo '<span class="tc-epo-style-wrapper tc-first ' . esc_attr( $labelclass_start ) . ' tc-radio">';
		}
		$input_args = [
			'nodiv'      => 1,
			'type'       => 'input',
			'default'    => $value,
			'input_type' => 'radio',
			'tags'       => [
				'id'                    => $element_id,
				'name'                  => $name,
				'class'                 => $fieldtype . ' tm-epo-field tmcp-radio' . $use,
				'data-price'            => '',
				'data-rules'            => $rules,
				'data-original-rules'   => $original_rules,
				'data-rulestype'        => $rules_type,
				'data-url'              => $url,
				'data-image'            => $image,
				'data-imagec'           => $imagec,
				'data-imagep'           => $imagep,
				'data-imagel'           => $imagel,
				'data-image-variations' => $image_variations,
			],
		];
		if ( apply_filters( 'wc_epo_radio_print_required_attribute', true ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_enable_validation' ) && isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( ! empty( $changes_product_image ) ) {
			$input_args['tags']['data-changes-product-image'] = $changes_product_image;
		}
		if ( true === $checked ) {
			$input_args['tags']['checked'] = 'checked';
		}
		if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
			$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);
		echo '<span class="tc-input-wrap tc-epo-style-space">';
		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		echo '</span>';
		if ( ! in_array( $replacement_mode, [ 'image', 'color' ], true ) || ( in_array( $replacement_mode, [ 'image', 'color' ], true ) && 'center' !== $swatch_position ) ) {
			if ( ! empty( $labelclass ) ) {
				echo '<span';
				echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
				echo ' data-for="' . esc_attr( $element_id ) . '"></span>';
			}
			if ( ! empty( $labelclass_end ) ) {
				echo '</span>';
			}
		}

		$text_label_class = 'tm-label';

		if ( isset( $label_mode ) && ! empty( $label_mode ) && 'text' !== $label_mode ) {

			$src = '';
			if ( isset( $altsrc ) && is_array( $altsrc ) ) {
				foreach ( $altsrc as $k => $v ) {
					$src .= esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '" ';
				}
			}

			$swatch_html = '';
			if ( isset( $swatch ) && is_array( $swatch ) ) {
				foreach ( $swatch as $_swatch ) {
					foreach ( $_swatch as $k => $v ) {
						$swatch_html .= esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '"';
					}
				}
			}

			$tmlazy = THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' ) === 'no' ? 'tmlazy ' : '';

			$text_label_class = 'radio-image-label' . ( ( str_starts_with( $label_mode, 'start' ) || str_starts_with( $label_mode, 'end' ) ) ? '-inline' : '' );
			switch ( $label_mode ) {
				case 'images':
				case 'startimages':
				case 'endimages':
					if ( ! empty( $src ) ) {
						$img_classes = [ 'tc-image', 'radio-image' ];
						if ( 'images' === $label_mode ) {
							$img_classes[] = 'tc-center';
						} else {
							$img_classes[] = 'tc-image-inline';
						}
						if ( 'startimages' === $label_mode ) {
							$img_classes[] = 'tc-left';
						}
						if ( 'endimages' === $label_mode ) {
							$img_classes[] = 'tc-right';
						}
						$img_classes = array_merge( $img_classes, array_filter( [ $border_type, $tmlazy, $swatch_class ] ) );
						$img_classes = implode( ' ', $img_classes );
						echo '<img class="' . esc_attr( $img_classes ) . '" '
						. 'alt="' . esc_attr( wp_strip_all_tags( $label_to_display ) ) . '" ';
						echo wp_kses_post( $src );
						echo wp_kses_post( $swatch_html );
						echo '>';
					}
					break;
				case 'color':
				case 'startcolor':
				case 'endcolor':
					$img_classes = [ 'tmhexcolorimage', 'radio-image' ];
					if ( 'color' === $label_mode ) {
						$img_classes[] = 'tc-center';
					} else {
						$img_classes[] = 'tmhexcolorimage-inline';
					}
					if ( 'startcolor' === $label_mode ) {
						$img_classes[] = 'tc-left';
					}
					if ( 'endcolor' === $label_mode ) {
						$img_classes[] = 'tc-right';
					}
					$img_classes = array_merge( $img_classes, array_filter( [ $border_type, $swatch_class ] ) );
					$img_classes = implode( ' ', $img_classes );
					echo '<span class="' . esc_attr( $img_classes ) . '" ' .
					'alt="' . esc_attr( wp_strip_all_tags( $label_to_display ) ) . '" ' .
					wp_kses_post( $swatch_html ) .
					'><span class="tc-image' . ( 'color' !== $label_mode ? ' tc-image-inline' : '' ) . '"></span></span>';
					break;
			}
		}
		$desc_inline          = 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_description_inline' );
		$tc_label_inner_class = 'tc-label-inner tcwidth tcwidth-100';
		if ( $desc_inline ) {
			$tc_label_inner_class .= ' desc-inline';
		} else {
			$has_desc = isset( $tm_element_settings ) && isset( $tm_element_settings['cdescription'] ) && isset( $field_counter ) && ! empty( $tm_element_settings['cdescription'][ $field_counter ] );
			if ( ! $has_desc ) {
				$tc_label_inner_class .= ' no-desc';
			}
		}
		echo '<span class="tc-col tc-label ' . esc_attr( $text_label_class ) . '">';
		echo '<span class="' . esc_attr( $tc_label_inner_class ) . '">';
		if ( '' !== $label_to_display ) {
			echo '<span class="tc-label-text">';
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $label_to_display ), $label_to_display ); // phpcs:ignore WordPress.Security.EscapeOutput
			echo '</span>';
		}
		if ( ! $desc_inline ) {
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
		}
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
		echo '</span>';
		if ( $desc_inline ) {
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
		}
		echo '</span>';

		echo '</span>';
		?>
		</label>
		<?php
		if ( 'text' === $replacement_mode ) {
			echo '</div>';
		}
		?>
		</div>
		<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
		<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
	<?php endif; ?>
</div></li>
	<?php
endif;
templates/tm-date.php000064400000012044150755142450010617 0ustar00<?php
/**
 * The template for displaying the date element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-date.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $picker_html, $class_label, $element_id, $get_default_value, $input_type, $name, $fieldtype, $rules, $original_rules, $showon, $defaultdate, $start_year, $end_year, $min_date, $max_date, $disabled_dates, $enabled_only_dates, $exlude_disabled, $disabled_weekdays, $disabled_months, $date_format, $date_theme, $date_theme_size, $date_theme_position ) ) :
	$picker_html         = (string) $picker_html;
	$class_label         = (string) $class_label;
	$element_id          = (string) $element_id;
	$get_default_value   = (string) $get_default_value;
	$input_type          = (string) $input_type;
	$name                = (string) $name;
	$fieldtype           = (string) $fieldtype;
	$rules               = (string) $rules;
	$original_rules      = (string) $original_rules;
	$showon              = (string) $showon;
	$defaultdate         = (string) $defaultdate;
	$start_year          = (string) $start_year;
	$end_year            = (string) $end_year;
	$min_date            = (string) $min_date;
	$max_date            = (string) $max_date;
	$disabled_dates      = (string) $disabled_dates;
	$enabled_only_dates  = (string) $enabled_only_dates;
	$exlude_disabled     = (string) $exlude_disabled;
	$disabled_weekdays   = (string) $disabled_weekdays;
	$disabled_months     = (string) $disabled_months;
	$date_format         = (string) $date_format;
	$date_theme          = (string) $date_theme;
	$date_theme_size     = (string) $date_theme_size;
	$date_theme_position = (string) $date_theme_position;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<?php
	// $picker_html contains internal generated HTML code
	// that is already escaped where needed
	// see: /woocommerce-tm-extra-product-options/includes/fields/class-themecomplete-epo-fields-date.php
	// phpcs:ignore WordPress.Security.EscapeOutput
	echo apply_filters(
		'wc_epo_kses',
		wp_kses(
			$picker_html,
			[
				'label'  => [
					'for' => true,
				],
				'select' => [
					'id'           => true,
					'class'        => true,
					'name'         => true,
					'data-tm-date' => true,
				],
				'option' => [
					'selected' => true,
					'value'    => true,
				],
			]
		),
		$picker_html,
		false
	);
	?>
	<label for="<?php echo esc_attr( $element_id ); ?>" class="tc-col tm-epo-field-label tm-epo-datepicker-label-container<?php echo esc_attr( $class_label ); ?>">
	<?php
	$input_args = [
		'nodiv'   => 1,
		'default' => $get_default_value,
		'type'    => $input_type,
		'tags'    => [
			'id'                       => $element_id,
			'name'                     => $name,
			'class'                    => $fieldtype . ' tm-epo-field tmcp-date tm-epo-datepicker',
			'data-price'               => '',
			'data-rules'               => $rules,
			'data-original-rules'      => $original_rules,
			'data-date-showon'         => $showon,
			'data-date-defaultdate'    => $defaultdate,
			'data-start-year'          => $start_year,
			'data-end-year'            => $end_year,
			'data-min-date'            => $min_date,
			'data-max-date'            => $max_date,
			'data-disabled-dates'      => $disabled_dates,
			'data-enabled-only-dates'  => $enabled_only_dates,
			'data-exlude-disabled'     => $exlude_disabled,
			'data-disabled-weekdays'   => $disabled_weekdays,
			'data-disabled-months'     => $disabled_months,
			'data-date-format'         => $date_format,
			'data-date-theme'          => $date_theme,
			'data-date-theme-size'     => $date_theme_size,
			'data-date-theme-position' => $date_theme_position,
			'inputmode'                => 'none',
		],
	];
	if ( isset( $required ) && ! empty( $required ) ) {
		$input_args['tags']['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$input_args['tags']['data-tax-obj'] = $tax_obj;
	}
	if ( isset( $date_mask ) && ! empty( $date_mask ) ) {
		$input_args['tags']['data-mask'] = $date_mask;
	}
	if ( isset( $date_placeholder ) && ! empty( $date_placeholder ) ) {
		$input_args['tags']['data-mask-placeholder'] = $date_placeholder;
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$input_args['tags']['data-no-price'] = true;
	}

	$input_args = apply_filters(
		'wc_element_input_args',
		$input_args,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-end.php000064400000000751150755142450010452 0ustar00<?php
/**
 * The template for displaying the end of the local mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-end.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;
?>
</ul></div>
templates/tm-select.php000064400000012647150755142450011172 0ustar00<?php
/**
 * The template for displaying the select element for the builder/local modes
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-select.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $fieldtype, $name, $placeholder, $options ) ) :
	$class_label = (string) $class_label;
	$element_id  = (string) $element_id;
	$fieldtype   = (string) $fieldtype;
	$name        = (string) $name;
	$placeholder = (string) $placeholder;

	$desc_inline = 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_description_inline' );

	$is_price_hidden = isset( $hide_amount ) && ! empty( $hide_amount );

	$tc_field_label_wrap_class = 'tc-col tc-field-label-wrap';
	if ( $desc_inline ) {
		$tc_field_label_wrap_class .= ' desc-inline';
	} else {
		$has_desc = isset( $tm_element_settings ) && ! empty(
			array_filter(
				$tm_element_settings['cdescription'],
				function ( $value ) {
					return '' !== $value;
				}
			)
		);
		if ( ! $has_desc ) {
			$tc_field_label_wrap_class .= ' no-desc';
		}
	}
	if ( $is_price_hidden ) {
		$tc_field_label_wrap_class .= ' no-price';
	}
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<div class="<?php echo esc_attr( $tc_field_label_wrap_class ); ?>">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
	<?php
	$select_array = [
		'class' => $fieldtype . ' tm-epo-field tmcp-select',
		'id'    => $element_id,
		'name'  => $name,
		'atts'  => [
			'data-price'          => '',
			'data-rules'          => '',
			'data-original-rules' => '',
			'data-placeholder'    => $placeholder,
		],
	];

	if ( isset( $required ) && ! empty( $required ) ) {
		$select_array['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$select_array['atts']['data-tax-obj'] = $tax_obj;
	}
	if ( ! empty( $changes_product_image ) ) {
		$select_array['atts']['data-changes-product-image'] = $changes_product_image;
	}
	if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
		$select_array['atts'] = array_merge( $select_array['atts'], $element_data_attr );
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$select_array['atts']['data-no-price'] = true;
	}

	$select_options = [];
	if ( is_array( $options ) ) {
		foreach ( $options as $option ) {
			$current_option = [
				'text'  => $option['text'],
				'value' => $option['value_to_show'],
				'attS'  => [],
			];

			if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
				$current_option['selected'] = $option['selected'];
			}
			if ( isset( $option['css_class'] ) ) {
				$current_option['class'] = 'tc-multiple-option tc-select-option' . $option['css_class'];
			}
			if ( isset( $option['data_url'] ) && ! empty( $option['data_url'] ) ) {
				$current_option['atts']['data-url'] = $option['data_url'];
			}
			if ( isset( $option['data_imagep'] ) ) {
				$current_option['atts']['data-imagep'] = $option['data_imagep'];
			}
			if ( isset( $option['data_price'] ) ) {
				$current_option['atts']['data-price'] = $option['data_price'];
			}
			if ( isset( $option['tm_tooltip_html'] ) && ! empty( $option['tm_tooltip_html'] ) ) {
				$current_option['atts']['data-tm-tooltip-html'] = $option['tm_tooltip_html'];
			}
			if ( isset( $option['image_variations'] ) ) {
				$current_option['atts']['data-image-variations'] = $option['image_variations'];
			}
			if ( isset( $option['data_rules'] ) ) {
				$current_option['atts']['data-rules'] = $option['data_rules'];
			}
			if ( isset( $option['data_original_rules'] ) ) {
				$current_option['atts']['data-original-rules'] = $option['data_original_rules'];
			}
			if ( isset( $option['data_rulestype'] ) ) {
				$current_option['atts']['data-rulestype'] = $option['data_rulestype'];
			}
			if ( isset( $option['data_text'] ) ) {
				$current_option['atts']['data-text'] = $option['data_text'];
			}
			if ( isset( $option['data_hide_amount'] ) ) {
				$current_option['atts']['data-hide-amount'] = $option['data_hide_amount'];
			}
			if ( ! empty( $tax_obj ) ) {
				$current_option['atts']['data-tax-obj'] = $tax_obj;
			}

			$select_options[] = $current_option;
		}
	}

	$select_array = apply_filters(
		'wc_element_select_args',
		$select_array,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	$select_options = apply_filters(
		'wc_element_select_option_args',
		$select_options,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, '/n', false, true );

	if ( ! $desc_inline ) {
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
	}
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	</div>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div>
	<?php
	if ( $desc_inline ) {
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
	}
	?>
</li>
	<?php
endif;
templates/tm-textfield.php000064400000007123150755142450011674 0ustar00<?php
/**
 * The template for displaying the textfield element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-textfield.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $get_default_value, $input_type, $name, $fieldtype, $rules, $original_rules, $rules_type, $freechars, $step ) ) :
	$class_label       = (string) $class_label;
	$element_id        = (string) $element_id;
	$get_default_value = (string) $get_default_value;
	$input_type        = (string) $input_type;
	$name              = (string) $name;
	$fieldtype         = (string) $fieldtype;
	$rules             = (string) $rules;
	$original_rules    = (string) $original_rules;
	$rules_type        = (string) $rules_type;
	$freechars         = (string) $freechars;
	$step              = (string) $step;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<?php
		$input_args = [
			'nodiv'   => 1,
			'default' => $get_default_value,
			'type'    => 'decimal' === $input_type ? 'number' : $input_type,
			'tags'    => [
				'id'                  => $element_id,
				'name'                => $name,
				'class'               => $fieldtype . ' tm-epo-field tmcp-textfield',
				'data-price'          => '',
				'data-rules'          => $rules,
				'data-original-rules' => $original_rules,
				'data-rulestype'      => $rules_type,
				'data-freechars'      => $freechars,
			],
		];
		if ( isset( $placeholder ) && '' !== $placeholder ) {
			$input_args['tags']['placeholder'] = $placeholder;
		}
		if ( isset( $min_chars ) && '' !== $min_chars ) {
			$input_args['tags']['minlength'] = $min_chars;
		}
		if ( isset( $max_chars ) && '' !== $max_chars ) {
			$input_args['tags']['maxlength'] = $max_chars;
		}
		if ( isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( 'number' === $input_type || 'decimal' === $input_type ) {
			$input_args['tags']['step'] = 'any';
			if ( 'decimal' === $input_type ) {
				$input_args['tags']['step'] = $step;
			}
			if ( 'decimal' === $input_type ) {
				$input_args['tags']['pattern']   = '[0-9]*';
				$input_args['tags']['inputmode'] = 'decimal';
			} else {
				$input_args['tags']['pattern']   = '[0-9]';
				$input_args['tags']['inputmode'] = 'numeric';
			}
			if ( isset( $min ) && '' !== $min ) {
				$input_args['tags']['min'] = $min;
			}
			if ( isset( $max ) && '' !== $max ) {
				$input_args['tags']['max'] = $max;
			}
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);

		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		?>
		</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-builder-element-start.php000064400000032562150755142450014121 0ustar00<?php
/**
 * The template for displaying the start of an element in the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-element-start.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $repeater, $repeater_quantity, $repeater_min_rows, $repeater_max_rows, $haslogic, $logic, $description, $class_id, $required, $uniqid, $column, $element_type, $description_position, $label, $label_position, $label_size, $divider, $divider_class, $rules, $original_rules, $rules_type ) ) :
	$repeater             = (string) $repeater;
	$repeater_quantity    = (string) $repeater_quantity;
	$repeater_min_rows    = (string) $repeater_min_rows;
	$repeater_max_rows    = (string) $repeater_max_rows;
	$haslogic             = (string) $haslogic;
	$logic                = (string) $logic;
	$description          = (string) $description;
	$class_id             = (string) $class_id;
	$required             = (string) $required;
	$uniqid               = (string) $uniqid;
	$column               = (string) $column;
	$element_type         = (string) $element_type;
	$description_position = (string) $description_position;
	$label                = (string) $label;
	$label_position       = (string) $label_position;
	$label_size           = (string) $label_size;
	$divider              = (string) $divider;
	$divider_class        = (string) $divider_class;
	$rules                = (string) $rules;
	$original_rules       = (string) $original_rules;
	$rules_type           = (string) $rules_type;

	if ( 'dynamic' === $element_type ) {
		$rules          = '';
		$original_rules = '';
		$rules_type     = '';
	}

	do_action( 'tm_before_builder_element', isset( $tm_element_settings ) ? $tm_element_settings : [] );

	$do_start = true;
	if ( isset( $get_posted_key_count ) && isset( $get_posted_key ) && $get_posted_key_count > 1 ) {
		if ( 0 !== $get_posted_key ) {
			$do_start = false;
		}
	}

	$extra_class = ( ! empty( $extra_class ) ) ? ' ' . $extra_class : '';
	$class       = ( ! empty( $class ) ) ? ' ' . $class : '';
	$array_class = explode( ' ', $class );
	$ul_class    = explode( ' ', $class );
	foreach ( $array_class as $array_class_key => $array_class_value ) {
		if ( '' !== $array_class_value ) {
			$array_class [ $array_class_key ] = $array_class_value . '-div';
			$ul_class [ $array_class_key ]    = $array_class_value . '-ul';
		}
	}
	if ( isset( $field_obj ) ) {
		if ( empty( $field_obj->items_per_row ) ) {
			$ul_class[] = 'ul-auto-row';
		}
	}
	if ( $repeater ) {
		$array_class[] = 'tc-repeater';
		if ( $repeater_quantity ) {
			$array_class[] = 'tc-repeater-quantity';
		}
		if ( ! isset( $element_data_attr ) ) {
			$element_data_attr = [];
		}
		if ( $repeater_min_rows ) {
			$element_data_attr['data-repeater-min-rows'] = $repeater_min_rows;
		}
		if ( $repeater_max_rows ) {
			$element_data_attr['data-repeater-max-rows'] = $repeater_max_rows;
		}
	}

	$tm_product_id_class = ( ! empty( $tm_product_id ) ) ? 'tm-product-id-' . $tm_product_id : '';

	$divclass = [ 'tc-container', 'cpf-element', 'tc-cell', 'cpf-type-' . $element_type, $column, $tm_product_id_class, $extra_class ];
	$divclass = array_merge( $divclass, array_filter( $array_class ) );
	if ( isset( $tm_element_settings ) && ! empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $tm_element_settings['type'] ]->no_frontend_display ) ) {
		$divclass[] = 'tm-hidden';
	}

	$class = '';

	$logic = ( ! $haslogic ) ? '' : $logic;

	$fb_label_show = isset( $tm_element_settings ) && isset( $tm_element_settings['hide_element_label_in_floatbox'] ) ? $tm_element_settings['hide_element_label_in_floatbox'] : '';
	$fb_value_show = isset( $tm_element_settings ) && isset( $tm_element_settings['hide_element_value_in_floatbox'] ) ? $tm_element_settings['hide_element_value_in_floatbox'] : '';

	$description = apply_filters( 'wc_epo_content', $description );
	$description = apply_filters( 'wc_epo_subtitle', $description );

	$use = [ $class_id ];
	if ( ! empty( $replacement_mode ) ) {
		switch ( $replacement_mode ) {
			case 'image':
				$use[] = 'tc-images-container';
				break;
			case 'color':
				$use[] = 'tc-colors-container';
				break;
			case 'text':
				$use[] = 'tc-text-container';
				break;
			default:
				$use[] = 'tc-list-container';
				break;
		}
	}

	if ( ! empty( $use_url ) ) {
		switch ( $use_url ) {
			case 'url':
				$use[] = 'tc-url-container';
				break;
		}
	}

	$ulclass = [ 'tmcp-ul-wrap', 'tmcp-elements', 'tm-extra-product-options-' . $element_type ];
	$ulclass = array_merge( $ulclass, array_filter( $ul_class ) );
	$ulclass = array_merge( $ulclass, array_filter( $use ) );

	if ( isset( $limit ) ) {
		$ulclass[] = $limit;
	}
	if ( isset( $exactlimit ) ) {
		$ulclass[] = $exactlimit;
	}
	if ( isset( $minimumlimit ) ) {
		$ulclass[] = $minimumlimit;
	}
	$ulclass = implode( ' ', array_filter( $ulclass ) );

	if ( isset( $tm_element_settings ) && 'radio' === $tm_element_settings['type'] ) {
		switch ( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_radio_undo_button' ) ) {
			case 'enable':
				$clear_options = '1';
				break;
			case 'disable':
				$clear_options = '';
				break;
		}
	}

	if ( ! empty( $clear_options ) ) {
		$divclass[] = 'tm-has-clearbutton';
	}

	if ( ! empty( $tm_variation_undo_button ) || ! empty( $clear_options ) ) {
		$class .= ' tm-has-undo-button';
	}
	if ( $required ) {
		$class     .= ' tm-has-required';
		$divclass[] = 'tc-is-required';
	}

	if ( empty( $label ) && ! empty( $required ) ) {
		$label = '&nbsp;';
	}

	$element_container_class = 'tc-cell tc-element-container';
	if ( 'left' === $label_position || 'right' === $label_position ) {
		$element_container_class .= ' tc-col';
	} else {
		$element_container_class .= ' tcwidth tcwidth-100';
	}

	if ( isset( $operation_mode ) ) {
		if ( ( 'dynamic_product_price' === $operation_mode && '' === $label && '' === $description ) || ( ! empty( $hide ) && '' === $label && '' === $description ) ) {
			$divclass[] = 'tc-hidden';
		}
	}

	$divclass = implode( ' ', array_filter( $divclass ) );

	if ( $do_start ) {
		?>
<div data-uniqid="<?php echo esc_attr( $uniqid ); ?>"
	data-logic="<?php echo esc_attr( $logic ); ?>"
	data-haslogic="<?php echo esc_attr( $haslogic ); ?>"
	data-fblabelshow="<?php echo esc_attr( $fb_label_show ); ?>"
	data-fbvalueshow="<?php echo esc_attr( $fb_value_show ); ?>"
		<?php
		if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
			THEMECOMPLETE_EPO_HTML()->create_attribute_list( $element_data_attr );
		}
		if ( ! empty( $container_id ) ) {
			echo ' id="' . esc_attr( $container_id ) . '"';
		}
		?>
	class="<?php echo esc_attr( $divclass ); ?>">
	<div class="tc-element-inner-wrap">
	<div class="tc-row">
		<?php
		if ( 'divider' !== $element_type ) {
			$css              = '';
			$descriptionclass = 'tc-cell tm-element-description tm-description';
			if ( ! empty( $label_color ) ) {
				$css              .= '.tm-epo-element-label.color-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $label_color ) ) . '{color:' . esc_attr( themecomplete_sanitize_hex_color( $label_color ) ) . ';}';
				$descriptionclass .= ' color-' . themecomplete_sanitize_hex_color_no_hash( $label_color );
			}
			if ( ! empty( $description_color ) ) {
				$css              .= '.tm-element-description.color-' . esc_attr( themecomplete_sanitize_hex_color_no_hash( $description_color ) ) . '{color:' . esc_attr( themecomplete_sanitize_hex_color( $description_color ) ) . ';}';
				$descriptionclass .= ' color-' . themecomplete_sanitize_hex_color_no_hash( $description_color );
			}
			THEMECOMPLETE_EPO_DISPLAY()->add_inline_style( $css );

			if ( 'disable' !== $label_position ) {
				if ( ! empty( $label ) || ! empty( $required ) || ( ! empty( $description ) && ( 'icontooltipright' === $description_position || 'icontooltipleft' === $description_position ) ) ) {
					echo '<' . esc_attr( $label_size );
					if ( 'header' === $element_type && ! empty( $class ) ) {
						$class = ' ' . $class;
					}
					if ( ! empty( $description ) && 'tooltip' === $description_position ) {
						$class = ' tm-tooltip';
					}
					if ( ! empty( $label_position ) || 'tooltip' === $description_position ) {
						$class .= ' tc-col-auto tc-' . $label_position;
					} else {
						$class .= ' tcwidth tcwidth-100';
					}
					if ( ! empty( $label_color ) ) {
						$class .= ' color-' . themecomplete_sanitize_hex_color_no_hash( $label_color );
					}
					if ( ! empty( $description ) && ! empty( $description_position ) && 'tooltip' === $description_position ) {
						echo ' data-tm-tooltip-swatch="on"';
					}
					echo ' class="tc-cell tc-epo-label tm-epo-element-label' . esc_attr( $class ) . '">';

					// Required indicator.
					if ( $required && ! empty( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ) ) {
						// THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) may contain HTML code.
						echo '<span class="tm-epo-required tc-' . esc_attr( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator_position' ) ) . '">' . apply_filters( 'wc_epo_kses', wp_kses_post( THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ), THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_required_indicator' ) ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
					}

					// Icon tooltip.
					if ( 'icontooltipleft' === $description_position || 'icontooltipright' === $description_position ) {
						echo '<i data-tm-tooltip-swatch="on" class="tc-' . esc_attr( $description_position ) . ' tm-tooltip tc-tooltip tcfa tcfa-question-circle tc-epo-style-space"></i>';
					}

					// Label text.
					if ( ! empty( $label ) && 'disable' !== $label_position ) {
						// $label contains HTML code.
						echo '<span class="tc-epo-element-label-text">' . apply_filters( 'wc_epo_kses', wp_kses_post( $label ), $label ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
					} else {
						echo '&nbsp;';
					}

					// Variation undo button.
					if ( ! empty( $tm_variation_undo_button ) ) {
						echo '<span data-tm-for-variation="' . esc_attr( $tm_variation_undo_button ) . '" class="tm-epo-reset-variation"><i class="tcfa tcfa-undo"></i></span>';
					}
					echo '</' . esc_attr( $label_size ) . '>';
				}
			}

			if ( ! empty( $clear_options ) ) {
				echo '<span class="tm-epo-reset-radio tm-hidden">' . apply_filters( 'tm_undo_radio_text', '<i class="tcfa tcfa-times"></i>' ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput
			}

			if ( ! empty( $description ) ) {
				if ( 'header' === $element_type ) {
					if ( 'left' === $label_position || 'right' === $label_position ) {
						$descriptionclass .= ' tc-col';
					} else {
						$descriptionclass .= ' tcwidth tcwidth-100';
					}
				} elseif ( ! empty( $label_position ) && ! empty( $description_position ) && 'below' !== $description_position ) {
						$descriptionclass .= ' tc-col';
				} else {
					$descriptionclass .= ' tcwidth tcwidth-100';
					if ( 'below' !== $description_position && ( 'left' === $label_position || 'right' === $label_position ) ) {
						$descriptionclass .= ' tc-first';
					}
				}
				if ( 'tooltip' === $description_position || 'icontooltipright' === $description_position || 'icontooltipleft' === $description_position ) {
					$descriptionclass .= ' tm-tip-html';
				}
				if ( ! empty( $description_position ) && 'tooltip' !== $description_position ) {
					$descriptionclass .= ' tc-' . $description_position;
				}
				echo '<div class="' . esc_attr( $descriptionclass ) . '">';
				// $description contains HTML code
				echo apply_filters( 'wc_epo_kses', wp_kses_post( $description ), $description ); // phpcs:ignore WordPress.Security.EscapeOutput
				echo '</div>';
			}
		}

		if ( ( 'divider' !== $element_type && ( '' === $label_position || 'disable' === $label_position ) ) || 'divider' === $element_type ) {
			switch ( $divider ) {
				case 'hr':
					echo '<hr class="hr_divider tc-cell tcwidth tcwidth-100' . esc_attr( $divider_class ) . '">';
					break;
				case 'divider':
					echo '<div class="tm_divider tc-cell tcwidth tcwidth-100' . esc_attr( $divider_class ) . '"></div>';
					break;
				case 'padding':
					echo '<div class="tm_padding tc-cell tcwidth tcwidth-100' . esc_attr( $divider_class ) . '"></div>';
					break;
			}
		}
	}
	?>
	<?php if ( isset( $tm_element_settings ) && ! in_array( $element_type, [ 'header', 'divider' ], true ) && empty( THEMECOMPLETE_EPO()->tm_builder_elements[ $tm_element_settings['type'] ]->no_frontend_display ) ) : ?>
		<?php if ( $do_start ) : ?>
	<div class="<?php echo esc_attr( $element_container_class ); ?>">
		<?php endif; ?>
		<?php if ( $repeater ) : ?>
	<div class="tc-repeater-element">
		<?php endif; ?>
	<ul data-rules="<?php echo esc_attr( $rules ); ?>"
		data-original-rules="<?php echo esc_attr( $original_rules ); ?>"
		data-rulestype="<?php echo esc_attr( $rules_type ); ?>"
		<?php if ( ! empty( $tm_validation ) ) : ?>
		data-tm-validation="<?php echo esc_attr( $tm_validation ); ?>" 
		<?php endif; ?>
		<?php if ( isset( $tm_element_settings['connector'] ) && '' !== $tm_element_settings['connector'] ) : ?>
		data-tm-connector="<?php echo esc_attr( $tm_element_settings['connector'] ); ?>" 
		<?php endif; ?>
		class="<?php echo esc_attr( $ulclass ); ?>">
<?php endif; ?>
	<?php
endif;
templates/tm-product.php000064400000002464150755142450011367 0ustar00<?php
/**
 * The template for displaying the product element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-product.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;

if ( isset( $args ) ) {
	$args['args'] = $args;
	if ( isset( $layout_mode ) && ! empty( $layout_mode ) ) {

		do_action( 'wc_epo_before_product_element' );

		if ( is_readable( apply_filters( 'wc_epo_template_path_product_element', THEMECOMPLETE_EPO_TEMPLATE_PATH ) . apply_filters( 'wc_epo_template_element', 'products/template-' . $layout_mode . '.php', 'product', [] ) ) ) {
			wc_get_template(
				apply_filters( 'wc_epo_template_element', 'products/template-' . $layout_mode . '.php', 'product', [] ),
				$args,
				THEMECOMPLETE_EPO_DISPLAY()->get_template_path(),
				apply_filters( 'wc_epo_template_path_product_element', THEMECOMPLETE_EPO_DISPLAY()->get_default_path() )
			);
		}

		do_action( 'wc_epo_after_product_element' );

	}
}

do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] );
templates/tm-field-end.php000064400000001010150755142450011520 0ustar00<?php
/**
 * The template for displaying the end of an element for the local mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-field-end.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;
?>
		</ul>
	</div>
</li>
templates/tm-builder-end.php000064400000000765150755142450012103 0ustar00<?php
/**
 * The template for displaying the end of the builder mode options
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-builder-end.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.0
 */

defined( 'ABSPATH' ) || exit;
?>
</li>
templates/tm-selectmultiple.php000064400000010325150755142450012735 0ustar00<?php
/**
 * The template for displaying the select element for the builder/local modes
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-select.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $class_label, $element_id, $fieldtype, $name, $options ) ) :
	$class_label = (string) $class_label;
	$element_id  = (string) $element_id;
	$fieldtype   = (string) $fieldtype;
	$name        = (string) $name;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
	<?php
	$select_array = [
		'class'    => $fieldtype . ' tm-epo-field tmcp-selectmultiple',
		'id'       => $element_id,
		'name'     => $name,
		'multiple' => 'multiple',
		'atts'     => [
			'data-price'          => '',
			'data-rules'          => '',
			'data-original-rules' => '',
		],
	];

	if ( isset( $required ) && ! empty( $required ) ) {
		$select_array['required'] = true;
	}
	if ( ! empty( $tax_obj ) ) {
		$select_array['atts']['data-tax-obj'] = $tax_obj;
	}
	if ( ! empty( $changes_product_image ) ) {
		$select_array['atts']['data-changes-product-image'] = $changes_product_image;
	}
	if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
		$select_array['atts'] = array_merge( $select_array['atts'], $element_data_attr );
	}
	if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
		$select_array['atts']['data-no-price'] = true;
	}

	$select_options = [];
	foreach ( $options as $option ) {
		$current_option = [
			'text'  => $option['text'],
			'value' => $option['value_to_show'],
			'atta'  => [],
		];

		if ( isset( $option['selected'] ) && isset( $option['current'] ) ) {
			$current_option['selected'] = $option['selected'];
		}
		if ( isset( $option['css_class'] ) ) {
			$current_option['class'] = 'tc-multiple-option tc-select-option' . $option['css_class'];
		}
		if ( isset( $option['data_price'] ) ) {
			$current_option['atts']['data-price'] = $option['data_price'];
		}
		if ( isset( $option['tm_tooltip_html'] ) && ! empty( $option['tm_tooltip_html'] ) ) {
			$current_option['atts']['data-tm-tooltip-html'] = $option['tm_tooltip_html'];
		}
		if ( isset( $option['image_variations'] ) ) {
			$current_option['atts']['data-image-variations'] = $option['image_variations'];
		}
		if ( isset( $option['data_rules'] ) ) {
			$current_option['atts']['data-rules'] = $option['data_rules'];
		}
		if ( isset( $option['data_original_rules'] ) ) {
			$current_option['atts']['data-original-rules'] = $option['data_original_rules'];
		}
		if ( isset( $option['data_rulestype'] ) ) {
			$current_option['atts']['data-rulestype'] = $option['data_rulestype'];
		}
		if ( isset( $option['data_text'] ) ) {
			$current_option['atts']['data-text'] = $option['data_text'];
		}
		if ( isset( $option['data_hide_amount'] ) ) {
			$current_option['atts']['data-hide-amount'] = $option['data_hide_amount'];
		}
		if ( ! empty( $tax_obj ) ) {
			$current_option['atts']['data-tax-obj'] = $tax_obj;
		}

		$select_options[] = $current_option;
	}

	$select_array = apply_filters(
		'wc_element_select_args',
		$select_array,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	$select_options = apply_filters(
		'wc_element_select_option_args',
		$select_options,
		isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
		isset( $args ) ? $args : [],
	);

	THEMECOMPLETE_EPO_HTML()->create_dropdown( $select_array, $select_options, '/n', false, true );
	?>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div><?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php'; ?></li>
	<?php
endif;
templates/tm-multiple-file-upload.php000064400000005563150755142450013744 0ustar00<?php
/**
 * The template for displaying the multiple upload element for the builder mode
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-multiple-file-upload.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4.2
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $element_id, $class_label, $style, $name, $fieldtype, $rules, $original_rules, $rules_type, $saved_value, $allowed_mimes, $max_file_size_text ) ) :
	$element_id     = (string) $element_id;
	$class_label    = (string) $class_label;
	$style          = (string) $style;
	$name           = (string) $name;
	$fieldtype      = (string) $fieldtype;
	$rules          = (string) $rules;
	$original_rules = (string) $original_rules;
	$rules_type     = (string) $rules_type;
	$saved_value    = (string) $saved_value;
	?>
<li class="tmcp-field-wrap"><div class="tmcp-field-wrap-inner">
	<label class="tc-col tm-epo-field-label<?php echo esc_attr( $style ); ?><?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<span class="cpf-upload-wrap">
		<?php
		if ( ! empty( $upload_text ) ) {
			echo '<span class="cpf-upload-text">' . esc_html( $upload_text ) . '</span>';
		}
		$input_args = [
			'nodiv'   => 1,
			'default' => '',
			'type'    => 'file',
			'tags'    => [
				'id'                  => $element_id,
				'name'                => $name . '[]',
				'class'               => $fieldtype . ' tm-multiple-file-upload tm-epo-field tmcp-upload',
				'data-price'          => '',
				'data-rules'          => $rules,
				'data-original-rules' => $original_rules,
				'data-rulestype'      => $rules_type,
				'data-file'           => $saved_value,
				'accept'              => $allowed_mimes,
				'multiple'            => 'multiple',
			],
		];
		if ( isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);

		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		?>
		</span>
	</label>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php'; ?>
	<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
	<small class="tc-max-file-size"><?php echo esc_html( $max_file_size_text ); ?></small>
	<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
</div></li>
	<?php
endif;
templates/tm-checkbox.php000064400000023333150755142450011473 0ustar00<?php
/**
 * The template for displaying the checkbox element for the builder/local modes
 *
 * This template can be overridden by copying it to yourtheme/tm-extra-product-options/tm-checkbox.php
 *
 * NOTE that we may need to update template files and you
 * (the plugin or theme developer) will need to copy the new files
 * to your theme or plugin to maintain compatibility.
 *
 * @author  ThemeComplete
 * @package Extra Product Options/Templates
 * @version 6.4
 */

defined( 'ABSPATH' ) || exit;
if ( isset( $li_class, $label_to_display, $element_id, $replacement_mode, $border_type, $value, $name, $fieldtype, $use, $rules, $original_rules, $rules_type, $limit, $exactlimit, $minimumlimit, $image, $imagec, $imagep, $imagel, $image_variations, $checked, $swatch_position, $swatch_class ) ) :
	$li_class         = (string) $li_class;
	$label_to_display = (string) $label_to_display;
	$element_id       = (string) $element_id;
	$replacement_mode = (string) $replacement_mode;
	$border_type      = (string) $border_type;
	$value            = (string) $value;
	$name             = (string) $name;
	$fieldtype        = (string) $fieldtype;
	$use              = (string) $use;
	$rules            = (string) $rules;
	$original_rules   = (string) $original_rules;
	$rules_type       = (string) $rules_type;
	$limit            = (string) $limit;
	$exactlimit       = (string) $exactlimit;
	$minimumlimit     = (string) $minimumlimit;
	$image            = (string) $image;
	$imagec           = (string) $imagec;
	$imagep           = (string) $imagep;
	$imagel           = (string) $imagel;
	$image_variations = (string) $image_variations;
	$swatch_position  = (string) $swatch_position;
	$swatch_class     = (string) $swatch_class;
	$checked          = (bool) $checked;
	$class_label      = ! empty( $class_label ) ? (string) $class_label : '';
	if ( ! isset( $is_separator ) ) {
		$is_separator = false;
	}
	$liclass = 'tmcp-field-wrap' . $li_class . ( ! empty( $label_mode ) ? ' tc-mode-' . $label_mode : ' tc-mode-normal' );

	$liclass .= ' ' . $border_type;

	if ( 'text' === $replacement_mode ) {
		$liclass .= ' tc-epo-text-wrapper';
	}
	?>
<li class="<?php echo esc_attr( $liclass ); ?>"><div class="tmcp-field-wrap-inner">
	<?php if ( $is_separator ) : ?>
		<?php
		echo '<span class="tc-label-wrap tc-separator"><span class="tc-col tc-label tc-separator-label">';
		$separator_html = '-1' === $label_to_display || '' === $label_to_display ? '<hr>' : $label_to_display;
		$separator_html = apply_filters( 'wc_epo_choice_separator_html', $separator_html );
		echo '<span class="tc-label-text">';
		echo apply_filters( 'wc_epo_kses', wp_kses_post( $separator_html ), $separator_html ); // phpcs:ignore WordPress.Security.EscapeOutput
		echo '</span>';
		echo '</span></span>';
		?>
	<?php else : ?>
		<div class="tc-col tc-field-label-wrap">
		<label class="tc-col tm-epo-field-label<?php echo esc_attr( $class_label ); ?>" for="<?php echo esc_attr( $element_id ); ?>">
		<?php
		if ( 'text' === $replacement_mode ) {
			echo '<div class="tc-epo-text-label-wrapper">';
		}

		echo '<span class="tc-label-wrap' . ( empty( $hexclass ) ? '' : ' ' . esc_attr( sanitize_html_class( $hexclass ) ) ) . '">';

		if ( ! empty( $labelclass_start ) ) {
			echo '<span class="tc-epo-style-wrapper tc-first ' . esc_attr( $labelclass_start ) . ' tc-checkbox">';
		}
		$input_args = [
			'nodiv'      => 1,
			'type'       => 'input',
			'default'    => $value,
			'input_type' => 'checkbox',
			'tags'       => [
				'id'                    => $element_id,
				'name'                  => $name,
				'class'                 => $fieldtype . ' tm-epo-field tmcp-checkbox' . $use,
				'data-price'            => '',
				'data-rules'            => $rules,
				'data-original-rules'   => $original_rules,
				'data-rulestype'        => $rules_type,
				'data-limit'            => $limit,
				'data-exactlimit'       => $exactlimit,
				'data-minimumlimit'     => $minimumlimit,
				'data-image'            => $image,
				'data-imagec'           => $imagec,
				'data-imagep'           => $imagep,
				'data-imagel'           => $imagel,
				'data-image-variations' => $image_variations,
			],
		];
		if ( apply_filters( 'wc_epo_checkbox_print_required_attribute', true ) && 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_global_enable_validation' ) && isset( $required ) && ! empty( $required ) ) {
			$input_args['tags']['required'] = true;
		}
		if ( ! empty( $tax_obj ) ) {
			$input_args['tags']['data-tax-obj'] = $tax_obj;
		}
		if ( ! empty( $changes_product_image ) ) {
			$input_args['tags']['data-changes-product-image'] = $changes_product_image;
		}
		if ( true === $checked ) {
			$input_args['tags']['checked'] = 'checked';
		}
		if ( isset( $element_data_attr ) && is_array( $element_data_attr ) ) {
			$input_args['tags'] = array_merge( $input_args['tags'], $element_data_attr );
		}
		if ( THEMECOMPLETE_EPO()->associated_per_product_pricing === 0 ) {
			$input_args['tags']['data-no-price'] = true;
		}

		$input_args = apply_filters(
			'wc_element_input_args',
			$input_args,
			isset( $tm_element_settings ) && isset( $tm_element_settings['type'] ) ? $tm_element_settings['type'] : '',
			isset( $args ) ? $args : [],
		);
		echo '<span class="tc-input-wrap tc-epo-style-space">';
		THEMECOMPLETE_EPO_HTML()->create_field( $input_args, true );
		echo '</span>';
		if ( ! in_array( $replacement_mode, [ 'image', 'color' ], true ) || ( in_array( $replacement_mode, [ 'image', 'color' ], true ) && 'center' !== $swatch_position ) ) {
			if ( ! empty( $labelclass ) ) {
				echo '<span';
				echo ' class="tc-label tm-epo-style ' . esc_attr( $labelclass ) . '"';
				echo ' data-for="' . esc_attr( $element_id ) . '"></span>';
			}
			if ( ! empty( $labelclass_end ) ) {
				echo '</span>';
			}
		}

		$text_label_class = 'tm-label';

		if ( isset( $label_mode ) && ! empty( $label_mode ) && 'text' !== $label_mode ) {

			$src = '';
			if ( isset( $altsrc ) && is_array( $altsrc ) ) {
				foreach ( $altsrc as $k => $v ) {
					$src .= esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '" ';
				}
			}

			$swatch_html = '';
			if ( isset( $swatch ) && is_array( $swatch ) ) {
				foreach ( $swatch as $_swatch ) {
					foreach ( $_swatch as $k => $v ) {
						$swatch_html .= esc_html( sanitize_key( $k ) ) . '="' . esc_attr( $v ) . '"';
					}
				}
			}

			$tmlazy = 'no' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_no_lazy_load' ) ? 'tmlazy ' : '';

			$text_label_class = 'checkbox-image-label' . ( ( str_starts_with( $label_mode, 'start' ) || str_starts_with( $label_mode, 'end' ) ) ? '-inline' : '' );
			switch ( $label_mode ) {
				case 'images':
				case 'startimages':
				case 'endimages':
					if ( ! empty( $src ) ) {
						$img_classes = [ 'tc-image', 'checkbox-image' ];
						if ( 'images' === $label_mode ) {
							$img_classes[] = 'tc-center';
						} else {
							$img_classes[] = 'tc-image-inline';
						}
						if ( 'startimages' === $label_mode ) {
							$img_classes[] = 'tc-left';
						}
						if ( 'endimages' === $label_mode ) {
							$img_classes[] = 'tc-right';
						}
						$img_classes = array_merge( $img_classes, array_filter( [ $border_type, $tmlazy, $swatch_class ] ) );
						$img_classes = implode( ' ', $img_classes );
						echo '<img class="' . esc_attr( $img_classes ) . '" '
						. 'alt="' . esc_attr( wp_strip_all_tags( $label_to_display ) ) . '" ';
						echo wp_kses_post( $src );
						echo wp_kses_post( $swatch_html );
						echo '>';
					}
					break;
				case 'color':
				case 'startcolor':
				case 'endcolor':
					$img_classes = [ 'tmhexcolorimage', 'checkbox-image' ];
					if ( 'color' === $label_mode ) {
						$img_classes[] = 'tc-center';
					} else {
						$img_classes[] = 'tmhexcolorimage-inline';
					}
					if ( 'startcolor' === $label_mode ) {
						$img_classes[] = 'tc-left';
					}
					if ( 'endcolor' === $label_mode ) {
						$img_classes[] = 'tc-right';
					}
					$img_classes = array_merge( $img_classes, array_filter( [ $border_type, $swatch_class ] ) );
					$img_classes = implode( ' ', $img_classes );
					echo '<span class="' . esc_attr( $img_classes ) . '" ' .
					'alt="' . esc_attr( wp_strip_all_tags( $label_to_display ) ) . '" ' .
					wp_kses_post( $swatch_html ) .
					'><span class="tc-image' . ( 'color' !== $label_mode ? ' tc-image-inline' : '' ) . '"></span></span>';
					break;
			}
		}
		$desc_inline          = 'yes' === THEMECOMPLETE_EPO_DATA_STORE()->get( 'tm_epo_description_inline' );
		$tc_label_inner_class = 'tc-label-inner tcwidth tcwidth-100';
		if ( $desc_inline ) {
			$tc_label_inner_class .= ' desc-inline';
		} else {
			$has_desc = isset( $tm_element_settings ) && isset( $tm_element_settings['cdescription'] ) && isset( $field_counter ) && ! empty( $tm_element_settings['cdescription'][ $field_counter ] );
			if ( ! $has_desc ) {
				$tc_label_inner_class .= ' no-desc';
			}
		}
		echo '<span class="tc-col tc-label ' . esc_attr( $text_label_class ) . '">';
		echo '<span class="' . esc_attr( $tc_label_inner_class ) . '">';
		if ( '' !== $label_to_display ) {
			echo '<span class="tc-label-text">';
			echo apply_filters( 'wc_epo_kses', wp_kses_post( $label_to_display ), $label_to_display ); // phpcs:ignore WordPress.Security.EscapeOutput
			echo '</span>';
		}
		if ( ! $desc_inline ) {
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
		}
		require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_price.php';
		echo '</span>';
		if ( $desc_inline ) {
			require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_choice_description.php';
		}
		echo '</span>';

		echo '</span>';
		?>
		</label>
		<?php
		if ( 'text' === $replacement_mode ) {
			echo '</div>';
		}
		?>
		</div>
		<?php require THEMECOMPLETE_EPO_TEMPLATE_PATH . '_quantity.php'; ?>
		<?php do_action( 'tm_after_element', isset( $tm_element_settings ) ? $tm_element_settings : [] ); ?>
	<?php endif; ?>
</div></li>
	<?php
endif;

Youez - 2016 - github.com/yon3zu
LinuXploit